@tutti-os/workspace-file-manager 0.0.231 → 0.0.232

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/WorkspaceFileManager.tsx","../src/ui/WorkspaceFileManagerContextMenuContainer.tsx","../src/ui/WorkspaceFileManagerContextMenu.tsx","../src/ui/contextMenuPlacement.ts","../src/ui/useWorkspaceFileManagerService.ts","../src/services/internal/workspaceFileManagerViewModel.ts","../src/ui/workspaceFileManagerContextMenuTypes.ts","../src/ui/WorkspaceFileManagerMenus.tsx","../src/ui/WorkspaceFileManagerPanelsContainer.tsx","../src/ui/WorkspaceFileManagerPanels.tsx","../src/ui/WorkspaceFileManagerIconGrid.tsx","../src/ui/WorkspaceFileEntryIcon.tsx","../src/ui/workspaceFileManagerIconGridLayout.ts","../src/ui/workspaceFileManagerPaneSizing.ts","../src/ui/workspaceFileManagerTableSizing.ts","../src/ui/useWorkspaceFileEntryIconUrls.ts","../src/ui/workspaceFileEntryIconUrlQueue.ts","../src/ui/workspaceFileManagerVisibleTree.ts","../src/ui/WorkspaceFileManagerToolbar.tsx","../src/ui/WorkspaceFileManagerSidebar.tsx","../src/ui/useWorkspaceFileManagerArrangeMode.ts","../src/ui/useWorkspaceFileManagerLayoutMode.ts","../src/ui/workspaceFileManagerLayoutMode.ts","../src/ui/workspaceFileManagerAnalytics.ts"],"sourcesContent":["import type {\n CSSProperties,\n KeyboardEvent as ReactKeyboardEvent,\n MouseEvent as ReactMouseEvent,\n PointerEvent as ReactPointerEvent,\n ReactElement\n} from \"react\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState\n} from \"react\";\nimport { cn } from \"@tutti-os/ui-system\";\nimport type { TuttiDateLocale } from \"@tutti-os/ui-system/date-format\";\nimport type { WorkspaceFileManagerSession } from \"../services/workspaceFileManagerService.interface.ts\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileLocation\n} from \"../services/workspaceFileManagerTypes.ts\";\nimport { WorkspaceFileManagerContextMenuContainer } from \"./WorkspaceFileManagerContextMenuContainer.tsx\";\nimport {\n WorkspaceFileManagerCreateDialog,\n WorkspaceFileManagerDeleteDialog,\n WorkspaceFileManagerUnsupportedDialog\n} from \"./WorkspaceFileManagerMenus.tsx\";\nimport { type WorkspaceFileManagerEntryDragMode } from \"./WorkspaceFileManagerPanels.tsx\";\nimport { WorkspaceFileManagerPanelsContainer } from \"./WorkspaceFileManagerPanelsContainer.tsx\";\nimport type { ResolveWorkspaceFileManagerContextMenu } from \"./workspaceFileManagerContextMenuTypes.ts\";\nimport { WorkspaceFileManagerToolbar } from \"./WorkspaceFileManagerToolbar.tsx\";\nimport type { RenderWorkspaceFileManagerToolbarTrailingActions } from \"./workspaceFileManagerToolbarTypes.ts\";\nimport { WorkspaceFileManagerSidebar } from \"./WorkspaceFileManagerSidebar.tsx\";\nimport {\n clampWorkspaceFileManagerSidebarWidth,\n readWorkspaceFileManagerSidebarWidth,\n resolveWorkspaceFileManagerSidebarMaxWidth,\n workspaceFileManagerContentMinWidth,\n workspaceFileManagerContentWithoutPreviewMinWidth,\n workspaceFileManagerPaneResizeStep,\n workspaceFileManagerSidebarDefaultWidth,\n workspaceFileManagerSidebarMinWidth,\n writeWorkspaceFileManagerSidebarWidth\n} from \"./workspaceFileManagerPaneSizing.ts\";\nimport type { WorkspaceFileManagerArrangeMode } from \"./workspaceFileManagerArrangeMode.ts\";\nimport { useWorkspaceFileManagerArrangeMode } from \"./useWorkspaceFileManagerArrangeMode.ts\";\nimport type { WorkspaceFileManagerLayoutMode } from \"./workspaceFileManagerLayoutMode.ts\";\nimport { useWorkspaceFileManagerLayoutMode } from \"./useWorkspaceFileManagerLayoutMode.ts\";\nimport { shouldTrackDirectoryExpanded } from \"./workspaceFileManagerAnalytics.ts\";\nimport {\n resolveWorkspaceFileManagerPreservedNameColumnWidth,\n workspaceFileManagerTableNameColumnSelector,\n workspaceFileManagerTableNameMinWidthProperty\n} from \"./workspaceFileManagerTableSizing.ts\";\nimport { findWorkspaceFileLocationById } from \"../services/workspaceFileManagerLocations.ts\";\nimport {\n useWorkspaceFileManagerDialogsView,\n useWorkspaceFileManagerPanelsView,\n useWorkspaceFileManagerRootView,\n useWorkspaceFileManagerToolbarView\n} from \"./useWorkspaceFileManagerService.ts\";\n\nconst workspaceFileManagerSearchDebounceMs = 180;\n\nexport type {\n RenderWorkspaceFileManagerToolbarTrailingActions,\n WorkspaceFileManagerToolbarTrailingActionsContext\n} from \"./workspaceFileManagerToolbarTypes.ts\";\n\nexport interface WorkspaceFileManagerProps {\n className?: string;\n dateLocale?: TuttiDateLocale;\n entryDragMode?: WorkspaceFileManagerEntryDragMode;\n onCopyEntry?: () => Promise<void> | void;\n onDirectoryExpanded?: (path: string) => void;\n onEntryDragStart?: (\n entry: WorkspaceFileEntry,\n dataTransfer: DataTransfer\n ) => void;\n resolveContextMenu: ResolveWorkspaceFileManagerContextMenu;\n resolveEntryIconUrl?: (\n entry: WorkspaceFileEntry\n ) => Promise<string | null | undefined>;\n renderExternalLocationContent?: (\n location: Extract<WorkspaceFileLocation, { kind: \"external\" }>\n ) => ReactElement | null;\n /**\n * Optional host actions rendered in the toolbar trailing cluster, after\n * Refresh and before Search. Use for product-owned primary affordances such\n * as upload; keep multi-step transfer UX outside this package.\n */\n renderToolbarTrailingActions?: RenderWorkspaceFileManagerToolbarTrailingActions;\n i18n: WorkspaceFileManagerI18nRuntime;\n session: WorkspaceFileManagerSession;\n /**\n * When false, hide the locations sidebar even if the session has location\n * sections. Hosts with a single workspace root (for example TSH embedded\n * Files) can turn this off. Defaults to true.\n */\n showLocationSidebar?: boolean;\n showPreviewPanel?: boolean;\n surface?: \"card\" | \"embedded\";\n}\n\nexport function WorkspaceFileManager({\n className,\n dateLocale,\n entryDragMode,\n i18n,\n onCopyEntry,\n onDirectoryExpanded,\n onEntryDragStart,\n resolveContextMenu,\n resolveEntryIconUrl,\n renderExternalLocationContent,\n renderToolbarTrailingActions,\n session,\n showLocationSidebar = true,\n showPreviewPanel = true,\n surface = \"card\"\n}: WorkspaceFileManagerProps): ReactElement {\n const rootRef = useRef<HTMLElement | null>(null);\n const sidebarResizeRef = useRef<{\n currentWidth: number;\n pointerId: number;\n startWidth: number;\n startX: number;\n } | null>(null);\n const [sidebarWidth, setSidebarWidth] = useState(\n readWorkspaceFileManagerSidebarWidth\n );\n const [containerWidth, setContainerWidth] = useState(0);\n const { arrangeMode, setArrangeMode } = useWorkspaceFileManagerArrangeMode();\n const { layoutMode, setLayoutMode } = useWorkspaceFileManagerLayoutMode();\n const rootView = useWorkspaceFileManagerRootView(session);\n const { state: panelsState, view: panelsView } =\n useWorkspaceFileManagerPanelsView(session);\n const selectedExternalLocation = useMemo(() => {\n const location = findWorkspaceFileLocationById(\n rootView.locationSections,\n rootView.selectedLocationId\n );\n return location?.kind === \"external\" ? location : null;\n }, [rootView.locationSections, rootView.selectedLocationId]);\n const hasLocationSidebar =\n showLocationSidebar &&\n rootView.locationSections.some((section) => section.locations.length > 0);\n const sidebarContentMinWidth = showPreviewPanel\n ? workspaceFileManagerContentMinWidth\n : workspaceFileManagerContentWithoutPreviewMinWidth;\n const sidebarMaxWidth =\n containerWidth > 0\n ? resolveWorkspaceFileManagerSidebarMaxWidth(\n containerWidth,\n sidebarContentMinWidth\n )\n : workspaceFileManagerSidebarDefaultWidth;\n\n const updateSidebarWidth = useCallback(\n (width: number): number => {\n const nextWidth = clampWorkspaceFileManagerSidebarWidth({\n containerWidth: rootRef.current?.getBoundingClientRect().width ?? 0,\n contentMinWidth: sidebarContentMinWidth,\n width\n });\n setSidebarWidth(nextWidth);\n return nextWidth;\n },\n [sidebarContentMinWidth]\n );\n\n useLayoutEffect(() => {\n const element = rootRef.current;\n if (!element || !hasLocationSidebar) {\n return;\n }\n\n const publishLayout = () => {\n const nextContainerWidth = Math.round(\n element.getBoundingClientRect().width\n );\n setContainerWidth(nextContainerWidth);\n setSidebarWidth((currentWidth) =>\n clampWorkspaceFileManagerSidebarWidth({\n containerWidth: nextContainerWidth,\n contentMinWidth: sidebarContentMinWidth,\n width: currentWidth\n })\n );\n };\n\n publishLayout();\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", publishLayout);\n return () => {\n window.removeEventListener(\"resize\", publishLayout);\n };\n }\n\n const observer = new ResizeObserver(publishLayout);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [hasLocationSidebar, sidebarContentMinWidth]);\n\n const handleSidebarResizePointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>): void => {\n if (event.button !== 0) {\n return;\n }\n const root = rootRef.current;\n const nameColumn = root?.querySelector<HTMLElement>(\n workspaceFileManagerTableNameColumnSelector\n );\n if (root && nameColumn) {\n const preservedWidth =\n resolveWorkspaceFileManagerPreservedNameColumnWidth(\n nameColumn.getBoundingClientRect().width\n );\n root.style.setProperty(\n workspaceFileManagerTableNameMinWidthProperty,\n `${preservedWidth}px`\n );\n }\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n sidebarResizeRef.current = {\n currentWidth: sidebarWidth,\n pointerId: event.pointerId,\n startWidth: sidebarWidth,\n startX: event.clientX\n };\n },\n [sidebarWidth]\n );\n\n const handleSidebarResizePointerMove = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>): void => {\n const resize = sidebarResizeRef.current;\n if (!resize || resize.pointerId !== event.pointerId) {\n return;\n }\n resize.currentWidth = updateSidebarWidth(\n resize.startWidth + event.clientX - resize.startX\n );\n },\n [updateSidebarWidth]\n );\n\n const handleSidebarResizePointerEnd = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>): void => {\n const resize = sidebarResizeRef.current;\n if (!resize || resize.pointerId !== event.pointerId) {\n return;\n }\n sidebarResizeRef.current = null;\n writeWorkspaceFileManagerSidebarWidth(resize.currentWidth);\n event.currentTarget.releasePointerCapture(event.pointerId);\n },\n []\n );\n\n const handleSidebarResizeKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>): void => {\n let nextWidth: number | null = null;\n if (event.key === \"Home\") {\n event.preventDefault();\n nextWidth = updateSidebarWidth(workspaceFileManagerSidebarMinWidth);\n } else if (event.key === \"End\") {\n event.preventDefault();\n nextWidth = updateSidebarWidth(sidebarMaxWidth);\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n nextWidth = updateSidebarWidth(\n sidebarWidth +\n (event.key === \"ArrowLeft\"\n ? -workspaceFileManagerPaneResizeStep\n : workspaceFileManagerPaneResizeStep)\n );\n }\n if (nextWidth !== null) {\n writeWorkspaceFileManagerSidebarWidth(nextWidth);\n }\n },\n [sidebarMaxWidth, sidebarWidth, updateSidebarWidth]\n );\n\n useEffect(() => {\n function handleCopyShortcut(event: KeyboardEvent): void {\n if (\n !(event.metaKey || event.ctrlKey) ||\n event.key !== \"c\" ||\n event.shiftKey\n ) {\n return;\n }\n if (isEditableKeyboardTarget(event.target)) {\n return;\n }\n if (!rootRef.current?.contains(event.target as Node)) {\n return;\n }\n if (selectedExternalLocation) {\n return;\n }\n if (\n !panelsState.capabilities.canCopy ||\n panelsState.busyAction !== null ||\n panelsState.isLoading ||\n panelsState.isMutating\n ) {\n return;\n }\n\n const entry = panelsView.selectedEntry;\n if (!entry) {\n return;\n }\n\n event.preventDefault();\n void (async () => {\n await session.copyToClipboard(entry);\n await onCopyEntry?.();\n })();\n }\n\n window.addEventListener(\"keydown\", handleCopyShortcut);\n return () => {\n window.removeEventListener(\"keydown\", handleCopyShortcut);\n };\n }, [\n onCopyEntry,\n panelsState,\n panelsView.selectedEntry,\n selectedExternalLocation,\n session\n ]);\n\n useEffect(() => {\n function handleRenameShortcut(event: KeyboardEvent): void {\n if (\n event.key !== \"Enter\" ||\n event.metaKey ||\n event.ctrlKey ||\n event.altKey\n ) {\n return;\n }\n if (isEditableKeyboardTarget(event.target)) {\n return;\n }\n if (!rootRef.current?.contains(event.target as Node)) {\n return;\n }\n if (selectedExternalLocation) {\n return;\n }\n if (\n !panelsState.capabilities.canRename ||\n panelsState.busyAction !== null ||\n panelsState.isLoading ||\n panelsState.isMutating ||\n panelsState.inlineRenameEntryPath !== null ||\n panelsState.searchQuery.trim().length > 0\n ) {\n return;\n }\n\n const entry = panelsView.selectedEntry;\n if (!entry) {\n return;\n }\n\n event.preventDefault();\n session.startInlineRename(entry);\n }\n\n window.addEventListener(\"keydown\", handleRenameShortcut);\n return () => {\n window.removeEventListener(\"keydown\", handleRenameShortcut);\n };\n }, [\n panelsState,\n panelsView.selectedEntry,\n selectedExternalLocation,\n session\n ]);\n\n const openContextMenu = useCallback(\n (\n event: ReactMouseEvent<HTMLElement>,\n entry: WorkspaceFileEntry | null\n ): void => {\n event.preventDefault();\n event.stopPropagation();\n\n // Store viewport (client) coordinates. The menu renders with\n // positionMode=\"viewport\" / fixed so overflow:hidden ancestors in host\n // shells (e.g. TSH workbench nodes) cannot clip or mis-stack it.\n const menuWidth = 220;\n const menuHeight = 280;\n const x = clampContextMenuCoordinate(\n event.clientX,\n window.innerWidth,\n menuWidth\n );\n const y = clampContextMenuCoordinate(\n event.clientY,\n window.innerHeight,\n menuHeight\n );\n\n session.openContextMenu({\n entryPath: entry?.path ?? null,\n x,\n y\n });\n },\n [session]\n );\n\n return (\n <section\n className={cn(\n \"@container/workspace-file-manager relative flex h-full min-h-0 w-full overflow-hidden text-[14px] text-[var(--text-primary)]\",\n surface === \"card\"\n ? \"rounded-lg border border-[var(--border-1)] bg-[var(--background-panel)]\"\n : \"rounded-none border-0 bg-transparent\",\n className\n )}\n data-slot=\"viewport-menu-boundary\"\n data-workspace-file-manager=\"\"\n ref={rootRef}\n style={\n {\n // Owned by the root so context menus (siblings of the panels pane)\n // can resolve overlay stacking instead of falling back to invalid\n // `calc(var(--undefined) - 1)`.\n \"--workspace-file-manager-dialog-overlay-z-index\": \"20\"\n } as CSSProperties\n }\n >\n {hasLocationSidebar ? (\n <WorkspaceFileManagerSidebar\n disabled={rootView.isBusy || panelsState.isLoading}\n locationSections={rootView.locationSections}\n selectedLocationId={rootView.selectedLocationId}\n width={sidebarWidth}\n onSelectLocation={(location) => {\n if (location.kind === \"directory\") {\n onDirectoryExpanded?.(location.path);\n }\n void session.selectLocation(location.id);\n }}\n />\n ) : null}\n {hasLocationSidebar ? (\n <div\n aria-label={i18n.t(\"resizeLocationsSidebar\")}\n aria-orientation=\"vertical\"\n aria-valuemax={sidebarMaxWidth}\n aria-valuemin={workspaceFileManagerSidebarMinWidth}\n aria-valuenow={sidebarWidth}\n className=\"nodrag @max-[600px]/workspace-file-manager:hidden relative z-[1] -ml-1 -mr-1 h-full w-2 shrink-0 cursor-col-resize touch-none outline-none before:absolute before:left-1/2 before:h-full before:w-px before:-translate-x-1/2 before:bg-transparent hover:before:bg-[var(--border-focus)] focus-visible:before:bg-[var(--border-focus)]\"\n role=\"separator\"\n tabIndex={0}\n onKeyDown={handleSidebarResizeKeyDown}\n onPointerCancel={handleSidebarResizePointerEnd}\n onPointerDown={handleSidebarResizePointerDown}\n onPointerMove={handleSidebarResizePointerMove}\n onPointerUp={handleSidebarResizePointerEnd}\n />\n ) : null}\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n {selectedExternalLocation ? (\n (renderExternalLocationContent?.(selectedExternalLocation) ?? null)\n ) : (\n <>\n <WorkspaceFileManagerToolbarContainer\n i18n={i18n}\n arrangeMode={arrangeMode}\n layoutMode={layoutMode}\n onArrangeModeChange={setArrangeMode}\n onDirectoryExpanded={onDirectoryExpanded}\n onLayoutModeChange={setLayoutMode}\n renderToolbarTrailingActions={renderToolbarTrailingActions}\n session={session}\n />\n <div className=\"@max-[600px]/workspace-file-manager:flex-col @max-[600px]/workspace-file-manager:gap-3 flex min-h-0 min-w-0 flex-1 overflow-hidden\">\n <WorkspaceFileManagerPanelsContainer\n dateLocale={dateLocale}\n entryDragMode={entryDragMode}\n arrangeMode={arrangeMode}\n i18n={i18n}\n layoutMode={layoutMode}\n onDirectoryExpanded={onDirectoryExpanded}\n onEntryDragStart={onEntryDragStart}\n onOpenContextMenu={openContextMenu}\n resolveEntryIconUrl={resolveEntryIconUrl}\n session={session}\n showPreviewPanel={showPreviewPanel}\n />\n </div>\n </>\n )}\n </div>\n {!selectedExternalLocation ? (\n <>\n <WorkspaceFileManagerDialogsContainer i18n={i18n} session={session} />\n <WorkspaceFileManagerContextMenuContainer\n resolveContextMenu={resolveContextMenu}\n session={session}\n />\n </>\n ) : null}\n </section>\n );\n}\n\nfunction WorkspaceFileManagerToolbarContainer({\n arrangeMode,\n i18n,\n layoutMode,\n onArrangeModeChange,\n onDirectoryExpanded,\n onLayoutModeChange,\n renderToolbarTrailingActions,\n session\n}: {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n i18n: WorkspaceFileManagerI18nRuntime;\n layoutMode: WorkspaceFileManagerLayoutMode;\n onArrangeModeChange: (arrangeMode: WorkspaceFileManagerArrangeMode) => void;\n onDirectoryExpanded?: (path: string) => void;\n onLayoutModeChange: (layoutMode: WorkspaceFileManagerLayoutMode) => void;\n renderToolbarTrailingActions?: RenderWorkspaceFileManagerToolbarTrailingActions;\n session: WorkspaceFileManagerSession;\n}): ReactElement {\n const { view } = useWorkspaceFileManagerToolbarView(session, i18n);\n const [searchQuery, setSearchQuery] = useState(view.searchQuery);\n const submittedSearchQueryRef = useRef(view.searchQuery);\n const submitSearchQuery = useCallback(\n (query: string): void => {\n submittedSearchQueryRef.current = query;\n void session.search(query);\n },\n [session]\n );\n\n useEffect(() => {\n if (view.searchQuery === submittedSearchQueryRef.current) {\n return;\n }\n submittedSearchQueryRef.current = view.searchQuery;\n setSearchQuery(view.searchQuery);\n }, [view.searchQuery]);\n\n useEffect(() => {\n if (!view.canSearch || searchQuery === submittedSearchQueryRef.current) {\n return;\n }\n const timer = setTimeout(() => {\n submitSearchQuery(searchQuery);\n }, workspaceFileManagerSearchDebounceMs);\n return () => {\n clearTimeout(timer);\n };\n }, [searchQuery, submitSearchQuery, view.canSearch]);\n\n const handleSearchClear = useCallback((): void => {\n setSearchQuery(\"\");\n submitSearchQuery(\"\");\n }, [submitSearchQuery]);\n\n return (\n <WorkspaceFileManagerToolbar\n breadcrumbs={view.breadcrumbs}\n canSearch={view.canSearch}\n canGoBack={view.canGoBack}\n canGoForward={view.canGoForward}\n copy={i18n}\n currentDirectoryPath={view.currentDirectoryPath}\n isBusy={view.isBusy}\n isLoading={view.isLoading}\n isMutating={view.isMutating}\n isSearching={view.isSearching}\n arrangeMode={arrangeMode}\n layoutMode={layoutMode}\n renderToolbarTrailingActions={renderToolbarTrailingActions}\n searchQuery={searchQuery}\n onArrangeModeChange={onArrangeModeChange}\n onGoBack={() => {\n void session.goBack();\n }}\n onGoForward={() => {\n void session.goForward();\n }}\n onLayoutModeChange={onLayoutModeChange}\n onLoadDirectory={(path) => {\n if (\n shouldTrackDirectoryExpanded({\n currentDirectoryPath: view.currentDirectoryPath,\n nextDirectoryPath: path\n })\n ) {\n onDirectoryExpanded?.(path);\n }\n void session.loadDirectory(path);\n }}\n onRefresh={() => {\n void session.refresh();\n }}\n onSearchClear={handleSearchClear}\n onSearchQueryChange={setSearchQuery}\n />\n );\n}\n\nfunction WorkspaceFileManagerDialogsContainer({\n i18n,\n session\n}: {\n i18n: WorkspaceFileManagerI18nRuntime;\n session: WorkspaceFileManagerSession;\n}): ReactElement {\n const { state, view } = useWorkspaceFileManagerDialogsView(session);\n\n return (\n <>\n <WorkspaceFileManagerCreateDialog\n busy={view.isBusy && state.busyAction === \"create\"}\n copy={i18n}\n dialog={view.createDialog}\n onClose={() => {\n session.closeCreateDialog();\n }}\n onConfirm={() => {\n void session.confirmCreateDialog();\n }}\n onNameChange={(name) => {\n session.updateCreateDialogName(name);\n }}\n />\n <WorkspaceFileManagerDeleteDialog\n busy={view.isDeleting}\n copy={i18n}\n entry={view.deleteDialogEntry}\n onClose={() => {\n session.closeDeleteDialog();\n }}\n onConfirm={() => {\n void session.confirmDeleteDialog();\n }}\n />\n <WorkspaceFileManagerUnsupportedDialog\n copy={i18n}\n dialog={view.unsupportedDialog}\n isViewing={view.isViewing}\n onAction={(action) => {\n void session.handleActivationFallbackAction(action);\n }}\n onClose={() => {\n session.closeUnsupportedDialog();\n }}\n />\n </>\n );\n}\n\nfunction isEditableKeyboardTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n if (target.isContentEditable) {\n return true;\n }\n\n const tagName = target.tagName;\n return tagName === \"INPUT\" || tagName === \"TEXTAREA\" || tagName === \"SELECT\";\n}\n\nfunction clampContextMenuCoordinate(\n coordinate: number,\n boundarySize: number,\n menuSize: number\n): number {\n const max = Math.max(8, boundarySize - menuSize - 8);\n return Math.min(Math.max(coordinate, 8), max);\n}\n","import type { ReactElement, RefObject } from \"react\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type { WorkspaceFileManagerSession } from \"../services/workspaceFileManagerService.interface.ts\";\nimport {\n findWorkspaceFileLocationById,\n isWorkspaceFileExternalLocation,\n isWorkspaceFileRecentLocation\n} from \"../services/workspaceFileManagerLocations.ts\";\nimport { WorkspaceFileManagerContextMenu } from \"./WorkspaceFileManagerContextMenu.tsx\";\nimport { useWorkspaceFileManagerContextMenuView } from \"./useWorkspaceFileManagerService.ts\";\nimport type {\n ResolveWorkspaceFileManagerContextMenu,\n WorkspaceFileManagerContextMenuItem,\n WorkspaceFileManagerContextMenuRequest\n} from \"./workspaceFileManagerContextMenuTypes.ts\";\nimport { resolveWorkspaceFileManagerContextMenuTarget } from \"./workspaceFileManagerContextMenuTypes.ts\";\n\nexport function WorkspaceFileManagerContextMenuContainer({\n resolveContextMenu,\n session\n}: {\n resolveContextMenu: ResolveWorkspaceFileManagerContextMenu;\n session: WorkspaceFileManagerSession;\n}): ReactElement | null {\n const contextMenuRef = useRef<HTMLDivElement | null>(null);\n const { view } = useWorkspaceFileManagerContextMenuView(session);\n const [items, setItems] = useState<\n readonly WorkspaceFileManagerContextMenuItem[]\n >([]);\n\n const contextMenuX = view.contextMenu?.x;\n const contextMenuY = view.contextMenu?.y;\n const contextMenuEntryPath = view.contextMenu?.entry?.path ?? null;\n\n useLayoutEffect(() => {\n if (contextMenuX === undefined || contextMenuY === undefined) {\n setItems((current) => (current.length === 0 ? current : []));\n return;\n }\n\n const request = buildContextMenuRequest({\n session,\n view\n });\n const resolved = resolveContextMenu(request);\n if (!isPromiseLike(resolved)) {\n setItems((current) =>\n areContextMenuItemsEquivalent(current, resolved) ? current : resolved\n );\n return;\n }\n\n let cancelled = false;\n setItems((current) => (current.length === 0 ? current : []));\n void resolved.then((nextItems) => {\n if (!cancelled) {\n setItems((current) =>\n areContextMenuItemsEquivalent(current, nextItems)\n ? current\n : nextItems\n );\n }\n });\n return () => {\n cancelled = true;\n };\n // Depend on stable primitives from the view — `view.contextMenu` is a new\n // object every render and would retrigger setItems forever.\n }, [\n contextMenuEntryPath,\n contextMenuX,\n contextMenuY,\n resolveContextMenu,\n session,\n view.currentDirectoryPath,\n view.isBusy,\n view.isLoading,\n view.isMutating\n ]);\n\n useCloseContextMenuOnOutsideInteraction({\n contextMenuRef,\n isOpen: view.contextMenu !== null,\n session\n });\n\n if (!view.contextMenu) {\n return null;\n }\n\n return (\n <WorkspaceFileManagerContextMenu\n contextMenu={{ x: view.contextMenu.x, y: view.contextMenu.y }}\n contextMenuRef={contextMenuRef}\n items={items}\n positionMode=\"viewport\"\n onClose={() => {\n session.closeContextMenu();\n }}\n />\n );\n}\n\nfunction buildContextMenuRequest(input: {\n session: WorkspaceFileManagerSession;\n view: {\n contextMenu: {\n entry: Parameters<\n typeof resolveWorkspaceFileManagerContextMenuTarget\n >[0][\"entry\"];\n x: number;\n y: number;\n } | null;\n currentDirectoryPath: string;\n isBusy: boolean;\n isLoading: boolean;\n isMutating: boolean;\n };\n}): WorkspaceFileManagerContextMenuRequest {\n const { session, view } = input;\n const location = findWorkspaceFileLocationById(\n session.store.locationSections,\n session.store.selectedLocationId\n );\n return {\n currentDirectoryPath: view.currentDirectoryPath,\n isBusy: view.isBusy || view.isLoading || view.isMutating,\n isExternalLocation: isWorkspaceFileExternalLocation(location),\n isRecentLocation: isWorkspaceFileRecentLocation(location),\n isSearchMode: session.store.searchQuery.trim().length > 0,\n selectedLocationId: session.store.selectedLocationId,\n target: resolveWorkspaceFileManagerContextMenuTarget({\n currentDirectoryPath: view.currentDirectoryPath,\n entry: view.contextMenu?.entry ?? null\n })\n };\n}\n\nfunction isPromiseLike<T>(value: T | Promise<T>): value is Promise<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof value.then === \"function\"\n );\n}\n\nfunction areContextMenuItemsEquivalent(\n left: readonly WorkspaceFileManagerContextMenuItem[],\n right: readonly WorkspaceFileManagerContextMenuItem[]\n): boolean {\n if (left === right) {\n return true;\n }\n if (left.length !== right.length) {\n return false;\n }\n for (let index = 0; index < left.length; index += 1) {\n const leftItem = left[index];\n const rightItem = right[index];\n if (!leftItem || !rightItem || leftItem.id !== rightItem.id) {\n return false;\n }\n if (leftItem.type !== rightItem.type) {\n return false;\n }\n if (leftItem.type === \"item\" && rightItem.type === \"item\") {\n if (\n leftItem.label !== rightItem.label ||\n leftItem.disabled !== rightItem.disabled ||\n leftItem.danger !== rightItem.danger\n ) {\n return false;\n }\n }\n if (leftItem.type === \"submenu\" && rightItem.type === \"submenu\") {\n if (\n leftItem.label !== rightItem.label ||\n leftItem.disabled !== rightItem.disabled ||\n leftItem.loading !== rightItem.loading\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\nfunction useCloseContextMenuOnOutsideInteraction(input: {\n contextMenuRef: RefObject<HTMLDivElement | null>;\n isOpen: boolean;\n session: WorkspaceFileManagerSession;\n}): void {\n const { contextMenuRef, isOpen, session } = input;\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n function handlePointerDown(event: PointerEvent): void {\n const target = event.target;\n if (target instanceof Node && contextMenuRef.current?.contains(target)) {\n return;\n }\n if (\n target instanceof Element &&\n target.closest(\"[data-workspace-file-manager-submenu]\")\n ) {\n return;\n }\n session.closeContextMenu();\n }\n\n function handleKeyDown(event: KeyboardEvent): void {\n if (event.key === \"Escape\") {\n session.closeContextMenu();\n }\n }\n\n window.addEventListener(\"pointerdown\", handlePointerDown);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [contextMenuRef, isOpen, session]);\n}\n","import {\n ArrowLeftIcon,\n ArrowRightIcon,\n LaunchIcon,\n MenuSurface,\n ViewportMenuSurface,\n cn\n} from \"@tutti-os/ui-system\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactElement,\n type RefObject\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n OPEN_WITH_SUBMENU_WIDTH_PX,\n clampContextMenuPosition,\n estimateOpenWithSubmenuHeight,\n resolveOpenWithSubmenuPlacement,\n type OpenWithSubmenuPlacement\n} from \"./contextMenuPlacement.ts\";\nimport type {\n WorkspaceFileManagerContextMenuItem,\n WorkspaceFileManagerContextMenuSubmenuItem\n} from \"./workspaceFileManagerContextMenuTypes.ts\";\n\nexport interface WorkspaceFileManagerContextMenuProps {\n contextMenu: {\n x: number;\n y: number;\n } | null;\n contextMenuRef: RefObject<HTMLDivElement | null>;\n items: readonly WorkspaceFileManagerContextMenuItem[];\n positionMode?: \"local\" | \"viewport\";\n onClose: () => void;\n}\n\nexport function WorkspaceFileManagerContextMenu({\n contextMenu,\n contextMenuRef,\n items,\n positionMode = \"local\",\n onClose\n}: WorkspaceFileManagerContextMenuProps): ReactElement | null {\n const [position, setPosition] = useState({\n x: contextMenu?.x ?? 0,\n y: contextMenu?.y ?? 0\n });\n\n useLayoutEffect(() => {\n if (!contextMenu) {\n return;\n }\n setPosition((current) =>\n current.x === contextMenu.x && current.y === contextMenu.y\n ? current\n : { x: contextMenu.x, y: contextMenu.y }\n );\n }, [contextMenu?.x, contextMenu?.y]);\n\n useLayoutEffect(() => {\n if (!contextMenu) {\n return;\n }\n const menu = contextMenuRef.current;\n if (!menu) {\n return;\n }\n const menuRect = menu.getBoundingClientRect();\n const boundary =\n positionMode === \"local\"\n ? menu.closest(\n \"[data-workspace-file-menu-boundary], [data-workspace-file-manager]\"\n )\n : null;\n if (positionMode === \"local\" && !boundary) {\n return;\n }\n const boundaryRect = boundary?.getBoundingClientRect();\n const next = clampContextMenuPosition({\n boundaryHeight: boundaryRect?.height ?? window.innerHeight,\n boundaryWidth: boundaryRect?.width ?? window.innerWidth,\n menuHeight: menuRect.height,\n menuWidth: menuRect.width,\n x: contextMenu.x,\n y: contextMenu.y\n });\n // Bail out on identical coordinates — a fresh object every layout pass\n // retriggers render and can exceed React's maximum update depth.\n setPosition((current) =>\n current.x === next.x && current.y === next.y ? current : next\n );\n }, [contextMenu?.x, contextMenu?.y, contextMenuRef, items, positionMode]);\n\n if (!contextMenu || items.length === 0) {\n return null;\n }\n\n const menu = (\n <MenuSurface\n ref={contextMenuRef}\n data-workspace-file-manager-context-menu=\"\"\n className={cn(\n // `is-open` keeps host CSS that keys off the class (not only data-state)\n // from leaving the surface at opacity:0.\n \"is-open w-[220px] overflow-visible p-1\",\n positionMode === \"viewport\" ? \"fixed\" : \"absolute\"\n )}\n role=\"menu\"\n style={{\n left: `${position.x}px`,\n top: `${position.y}px`,\n // Prefer the host CSS var when present; fall back to a stable stacking\n // value so an unset var cannot invalidate the entire z-index declaration.\n // Viewport menus need to clear typical workbench chrome (≈ z-10..50).\n zIndex:\n positionMode === \"viewport\"\n ? \"var(--workspace-file-manager-dialog-overlay-z-index, 10050)\"\n : \"var(--workspace-file-manager-dialog-overlay-z-index, 20)\"\n }}\n onContextMenu={(event) => {\n event.preventDefault();\n }}\n >\n {items.map((item) => (\n <ContextMenuItemRenderer key={item.id} item={item} onClose={onClose} />\n ))}\n </MenuSurface>\n );\n\n // Viewport menus must leave overflow/contain ancestors (e.g. Agent tool\n // sidebar `[contain:layout_paint]`) or fixed coords are clipped off-screen.\n if (positionMode === \"viewport\" && typeof document !== \"undefined\") {\n return createPortal(menu, document.body);\n }\n\n return menu;\n}\n\nfunction ContextMenuItemRenderer({\n item,\n onClose,\n activateOnPointerDown = false\n}: {\n activateOnPointerDown?: boolean;\n item: WorkspaceFileManagerContextMenuItem;\n onClose: () => void;\n}): ReactElement | null {\n switch (item.type) {\n case \"separator\":\n return <ContextMenuDivider />;\n case \"submenu\":\n return <ContextMenuSubmenu item={item} onClose={onClose} />;\n case \"item\":\n return (\n <ContextMenuActionButton\n activateOnPointerDown={activateOnPointerDown}\n danger={item.danger}\n disabled={item.disabled}\n icon={item.icon ?? <LaunchIcon className=\"size-4\" />}\n label={item.label}\n onClick={() => {\n onClose();\n void item.onSelect();\n }}\n />\n );\n default:\n return null;\n }\n}\n\nfunction ContextMenuActionButton({\n activateOnPointerDown = false,\n danger = false,\n disabled = false,\n icon,\n label,\n onClick\n}: {\n activateOnPointerDown?: boolean;\n danger?: boolean;\n disabled?: boolean;\n icon: ReactElement;\n label: string;\n onClick: () => void;\n}): ReactElement {\n const pointerActivatedRef = useRef(false);\n const pointerActivationResetTimerRef = useRef<number | null>(null);\n\n useEffect(() => {\n return () => {\n if (pointerActivationResetTimerRef.current !== null) {\n window.clearTimeout(pointerActivationResetTimerRef.current);\n }\n };\n }, []);\n\n return (\n <button\n className={cn(\n \"flex h-8 w-full items-center gap-2 rounded-md border-0 bg-transparent px-2 text-left text-[13px] transition-colors disabled:cursor-default disabled:opacity-50\",\n danger\n ? \"text-[var(--state-danger)] hover:bg-[var(--on-danger)]\"\n : \"text-[var(--text-primary)] hover:bg-transparency-block\"\n )}\n disabled={disabled}\n role=\"menuitem\"\n type=\"button\"\n onClick={() => {\n if (pointerActivatedRef.current) {\n pointerActivatedRef.current = false;\n if (pointerActivationResetTimerRef.current !== null) {\n window.clearTimeout(pointerActivationResetTimerRef.current);\n pointerActivationResetTimerRef.current = null;\n }\n return;\n }\n onClick();\n }}\n onPointerDown={(event) => {\n if (!activateOnPointerDown || disabled || event.button !== 0) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n pointerActivatedRef.current = true;\n if (pointerActivationResetTimerRef.current !== null) {\n window.clearTimeout(pointerActivationResetTimerRef.current);\n }\n pointerActivationResetTimerRef.current = window.setTimeout(() => {\n pointerActivatedRef.current = false;\n pointerActivationResetTimerRef.current = null;\n }, 750);\n onClick();\n }}\n >\n <span\n className={cn(\n \"grid size-4 flex-none place-items-center\",\n danger ? \"text-[var(--state-danger)]\" : \"text-[var(--text-secondary)]\"\n )}\n >\n {icon}\n </span>\n {label}\n </button>\n );\n}\n\nfunction ContextMenuDivider(): ReactElement {\n return (\n <div className=\"mx-2 my-0.5 h-px bg-[var(--border-1)]\" role=\"separator\" />\n );\n}\n\nfunction ContextMenuSubmenu({\n item,\n onClose\n}: {\n item: WorkspaceFileManagerContextMenuSubmenuItem;\n onClose: () => void;\n}): ReactElement {\n const triggerRef = useRef<HTMLDivElement | null>(null);\n const triggerButtonRef = useRef<HTMLButtonElement | null>(null);\n const submenuRef = useRef<HTMLDivElement | null>(null);\n const focusSubmenuOnOpenRef = useRef(false);\n const [open, setOpen] = useState(false);\n const controlledChildren = item.children;\n const [asyncChildren, setAsyncChildren] = useState<\n readonly WorkspaceFileManagerContextMenuItem[] | null\n >(null);\n const [asyncLoading, setAsyncLoading] = useState(false);\n const [submenuPosition, setSubmenuPosition] =\n useState<OpenWithSubmenuPlacement>({\n left: 0,\n mode: \"right\",\n top: 0,\n width: OPEN_WITH_SUBMENU_WIDTH_PX\n });\n const closeTimerRef = useRef<number | null>(null);\n const children = controlledChildren ?? asyncChildren ?? [];\n const isLoading = Boolean(item.loading) || asyncLoading;\n const childActionCount = countRenderableMenuActions(children);\n const estimatedSubmenuHeight = estimateOpenWithSubmenuHeight({\n applicationCount: Math.max(0, childActionCount - 2),\n isLoading,\n showExternalSection: childActionCount > 0 || isLoading,\n showOpenInAppBrowser: false,\n showOpenInDefaultBrowser: false,\n showOpenInFileViewer: false,\n showOpenWithOther: false\n });\n\n useEffect(() => {\n if (controlledChildren !== undefined) {\n setAsyncChildren(null);\n setAsyncLoading(false);\n }\n }, [controlledChildren]);\n\n const cancelClose = useCallback(() => {\n if (closeTimerRef.current !== null) {\n window.clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n const scheduleClose = useCallback(() => {\n cancelClose();\n closeTimerRef.current = window.setTimeout(() => {\n setOpen(false);\n closeTimerRef.current = null;\n }, 120);\n }, [cancelClose]);\n\n const ensureChildrenLoaded = useCallback(() => {\n if (\n controlledChildren !== undefined ||\n asyncChildren !== null ||\n !item.loadChildren ||\n asyncLoading\n ) {\n return;\n }\n setAsyncLoading(true);\n void item\n .loadChildren()\n .then((next) => {\n setAsyncChildren(next);\n })\n .catch(() => {\n setAsyncChildren([]);\n })\n .finally(() => {\n setAsyncLoading(false);\n });\n }, [asyncChildren, asyncLoading, controlledChildren, item]);\n\n const openSubmenu = useCallback(() => {\n focusSubmenuOnOpenRef.current = false;\n cancelClose();\n ensureChildrenLoaded();\n setOpen(true);\n }, [cancelClose, ensureChildrenLoaded]);\n\n const closeSubmenuToTrigger = useCallback(() => {\n cancelClose();\n setOpen(false);\n triggerButtonRef.current?.focus();\n }, [cancelClose]);\n\n const updateSubmenuPosition = useCallback(() => {\n const trigger = triggerRef.current;\n if (!trigger) {\n return;\n }\n const triggerRect = trigger.getBoundingClientRect();\n const parentMenuRect =\n trigger\n .closest<HTMLElement>(\"[data-workspace-file-manager-context-menu]\")\n ?.getBoundingClientRect() ?? triggerRect;\n const maxHeight = Math.min(\n estimatedSubmenuHeight,\n 480,\n Math.max(0, window.innerHeight - 24)\n );\n setSubmenuPosition(\n resolveOpenWithSubmenuPlacement({\n parentMenuLeft: parentMenuRect.left,\n parentMenuTop: parentMenuRect.top,\n submenuHeight: maxHeight,\n triggerLeft: triggerRect.left,\n triggerRight: triggerRect.right,\n triggerTop: triggerRect.top,\n viewportHeight: window.innerHeight,\n viewportWidth: window.innerWidth\n })\n );\n }, [estimatedSubmenuHeight]);\n\n useEffect(() => {\n return () => {\n cancelClose();\n };\n }, [cancelClose]);\n\n useLayoutEffect(() => {\n if (!open) {\n return;\n }\n updateSubmenuPosition();\n }, [open, updateSubmenuPosition, children.length, isLoading]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n window.addEventListener(\"resize\", updateSubmenuPosition);\n window.addEventListener(\"scroll\", updateSubmenuPosition, true);\n return () => {\n window.removeEventListener(\"resize\", updateSubmenuPosition);\n window.removeEventListener(\"scroll\", updateSubmenuPosition, true);\n };\n }, [open, updateSubmenuPosition]);\n\n useEffect(() => {\n if (!open || !focusSubmenuOnOpenRef.current) {\n return;\n }\n focusSubmenuOnOpenRef.current = false;\n const frame = window.requestAnimationFrame(() => {\n submenuRef.current\n ?.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")\n ?.focus();\n });\n return () => {\n window.cancelAnimationFrame(frame);\n };\n }, [open, submenuPosition.mode]);\n\n return (\n <div\n ref={triggerRef}\n className=\"relative\"\n onPointerEnter={openSubmenu}\n onPointerLeave={scheduleClose}\n >\n <button\n ref={triggerButtonRef}\n aria-expanded={open}\n aria-haspopup=\"menu\"\n className={cn(\n \"flex h-8 w-full items-center gap-2 rounded-md border-0 bg-transparent px-2 text-left text-[13px] text-[var(--text-primary)] transition-colors hover:bg-transparency-block disabled:cursor-default disabled:opacity-50\",\n open && \"bg-transparency-block\"\n )}\n disabled={item.disabled}\n role=\"menuitem\"\n type=\"button\"\n onClick={(event) => {\n focusSubmenuOnOpenRef.current = event.detail === 0;\n setOpen((current) => {\n const next = !current;\n if (next) {\n cancelClose();\n ensureChildrenLoaded();\n } else {\n focusSubmenuOnOpenRef.current = false;\n }\n return next;\n });\n }}\n onKeyDown={(event) => {\n if (event.key !== \"ArrowRight\") {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n focusSubmenuOnOpenRef.current = true;\n cancelClose();\n ensureChildrenLoaded();\n setOpen(true);\n }}\n >\n <span className=\"grid size-4 flex-none place-items-center text-[var(--text-secondary)]\">\n {item.icon ?? <LaunchIcon className=\"size-4\" />}\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n <span\n aria-hidden=\"true\"\n className=\"grid size-4 flex-none place-items-center text-[var(--text-tertiary)]\"\n >\n <ArrowRightIcon className=\"size-4\" />\n </span>\n </button>\n <ViewportMenuSurface\n ref={submenuRef}\n aria-label={item.label}\n data-workspace-file-manager-submenu=\"\"\n data-workspace-file-manager-submenu-mode={submenuPosition.mode}\n open={open}\n className=\"max-h-[min(480px,calc(100vh-24px))] max-w-[calc(100vw-24px)] overflow-y-auto p-1\"\n dismissOnEscape={false}\n dismissOnPointerDownOutside={false}\n dismissOnScroll={false}\n placement={{\n type: \"absolute\",\n left: submenuPosition.left,\n top: submenuPosition.top,\n boundaryPoint: { x: -1, y: -1 }\n }}\n role=\"menu\"\n style={{\n width: submenuPosition.width,\n zIndex: \"calc(var(--z-panel-popover) + 200)\"\n }}\n onPointerEnter={openSubmenu}\n onPointerLeave={scheduleClose}\n onKeyDown={(event) => {\n if (event.key === \"ArrowLeft\" || event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n closeSubmenuToTrigger();\n return;\n }\n if (event.key !== \"ArrowDown\" && event.key !== \"ArrowUp\") {\n return;\n }\n const buttons = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>(\n \"button:not(:disabled)\"\n )\n );\n if (buttons.length === 0) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const currentIndex = buttons.indexOf(\n document.activeElement as HTMLButtonElement\n );\n const offset = event.key === \"ArrowDown\" ? 1 : -1;\n const nextIndex =\n currentIndex < 0\n ? offset > 0\n ? 0\n : buttons.length - 1\n : (currentIndex + offset + buttons.length) % buttons.length;\n buttons[nextIndex]?.focus();\n }}\n >\n {submenuPosition.mode === \"overlay\" ? (\n <>\n <ContextMenuActionButton\n activateOnPointerDown\n icon={<ArrowLeftIcon className=\"size-4\" />}\n label={item.label}\n onClick={closeSubmenuToTrigger}\n />\n <ContextMenuDivider />\n </>\n ) : null}\n {isLoading ? (\n <div className=\"px-2 py-1.5 text-[11px] text-[var(--text-tertiary)]\">\n {item.loadingLabel ?? \"…\"}\n </div>\n ) : null}\n {children.map((child) => (\n <ContextMenuItemRenderer\n key={child.id}\n activateOnPointerDown\n item={child}\n onClose={onClose}\n />\n ))}\n </ViewportMenuSurface>\n </div>\n );\n}\n\nfunction countRenderableMenuActions(\n items: readonly WorkspaceFileManagerContextMenuItem[]\n): number {\n let count = 0;\n for (const item of items) {\n if (item.type === \"item\") {\n count += 1;\n } else if (item.type === \"submenu\") {\n count += 1 + countRenderableMenuActions(item.children ?? []);\n }\n }\n return count;\n}\n","export const CONTEXT_MENU_ITEM_HEIGHT_PX = 32;\nexport const CONTEXT_MENU_PADDING_PX = 8;\nexport const CONTEXT_MENU_SUBMENU_GAP_PX = 4;\nexport const CONTEXT_MENU_VIEWPORT_PADDING_PX = 12;\nexport const OPEN_WITH_SUBMENU_WIDTH_PX = 220;\n\nexport type OpenWithSubmenuPlacementMode = \"right\" | \"left\" | \"overlay\";\n\nexport interface OpenWithSubmenuPlacement {\n left: number;\n mode: OpenWithSubmenuPlacementMode;\n top: number;\n width: number;\n}\n\nexport function resolveOpenWithSubmenuPlacement(input: {\n gap?: number;\n overlayHeaderHeight?: number;\n padding?: number;\n parentMenuLeft: number;\n parentMenuTop: number;\n submenuHeight: number;\n submenuWidth?: number;\n triggerLeft: number;\n triggerRight: number;\n triggerTop: number;\n viewportHeight: number;\n viewportWidth: number;\n}): OpenWithSubmenuPlacement {\n const gap = input.gap ?? CONTEXT_MENU_SUBMENU_GAP_PX;\n const padding = input.padding ?? CONTEXT_MENU_VIEWPORT_PADDING_PX;\n const availableWidth = Math.max(0, input.viewportWidth - padding * 2);\n const width = Math.min(\n input.submenuWidth ?? OPEN_WITH_SUBMENU_WIDTH_PX,\n availableWidth\n );\n const rightLeft = input.triggerRight + gap;\n const leftLeft = input.triggerLeft - gap - width;\n const rightFits = rightLeft + width <= input.viewportWidth - padding;\n const leftFits = leftLeft >= padding;\n const mode: OpenWithSubmenuPlacementMode = rightFits\n ? \"right\"\n : leftFits\n ? \"left\"\n : \"overlay\";\n const rawLeft =\n mode === \"right\"\n ? rightLeft\n : mode === \"left\"\n ? leftLeft\n : input.parentMenuLeft;\n const rawTop = mode === \"overlay\" ? input.parentMenuTop : input.triggerTop;\n const overlayHeaderHeight =\n mode === \"overlay\"\n ? (input.overlayHeaderHeight ?? CONTEXT_MENU_ITEM_HEIGHT_PX)\n : 0;\n const availableHeight = Math.max(0, input.viewportHeight - padding * 2);\n const height = Math.min(\n Math.max(0, input.submenuHeight + overlayHeaderHeight),\n availableHeight\n );\n const maxLeft = Math.max(padding, input.viewportWidth - padding - width);\n const maxTop = Math.max(padding, input.viewportHeight - padding - height);\n\n return {\n left: Math.max(padding, Math.min(rawLeft, maxLeft)),\n mode,\n top: Math.max(padding, Math.min(rawTop, maxTop)),\n width\n };\n}\n\nexport function clampContextMenuPosition(input: {\n boundaryHeight: number;\n boundaryWidth: number;\n menuHeight: number;\n menuWidth: number;\n padding?: number;\n x: number;\n y: number;\n}): { x: number; y: number } {\n const padding = input.padding ?? CONTEXT_MENU_PADDING_PX;\n const maxX = Math.max(\n padding,\n input.boundaryWidth - input.menuWidth - padding\n );\n const maxY = Math.max(\n padding,\n input.boundaryHeight - input.menuHeight - padding\n );\n\n return {\n x: Math.min(Math.max(input.x, padding), maxX),\n y: Math.min(Math.max(input.y, padding), maxY)\n };\n}\n\nexport function estimateOpenWithSubmenuHeight(input: {\n applicationCount: number;\n isLoading: boolean;\n showExternalSection: boolean;\n showOpenInAppBrowser: boolean;\n showOpenInDefaultBrowser: boolean;\n showOpenInFileViewer?: boolean;\n showOpenWithOther: boolean;\n}): number {\n let itemCount = 0;\n\n if (input.showOpenInFileViewer) {\n itemCount += 1;\n }\n if (input.showOpenInAppBrowser) {\n itemCount += 1;\n }\n if (shouldShowOpenWithSectionDivider(input)) {\n itemCount += 1;\n }\n if (input.isLoading) {\n itemCount += 1;\n }\n itemCount += input.applicationCount;\n if (input.showOpenInDefaultBrowser) {\n itemCount += 1;\n }\n if (input.showOpenWithOther) {\n itemCount += 2;\n }\n\n return itemCount * CONTEXT_MENU_ITEM_HEIGHT_PX + CONTEXT_MENU_PADDING_PX * 2;\n}\n\nexport function shouldShowOpenWithSectionDivider(input: {\n showExternalSection: boolean;\n showOpenInAppBrowser: boolean;\n showOpenInFileViewer?: boolean;\n}): boolean {\n return (\n input.showExternalSection &&\n (input.showOpenInFileViewer === true || input.showOpenInAppBrowser)\n );\n}\n","import { useSnapshot } from \"valtio\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport {\n resolveWorkspaceFileManagerContextMenuViewState,\n resolveWorkspaceFileManagerDialogsViewState,\n resolveWorkspaceFileManagerPanelsViewState,\n resolveWorkspaceFileManagerRootViewState,\n resolveWorkspaceFileManagerToolbarViewState\n} from \"../services/internal/workspaceFileManagerViewModel.ts\";\nimport type { WorkspaceFileManagerSession } from \"../services/workspaceFileManagerService.interface.ts\";\n\nexport function useWorkspaceFileManagerRootView(\n session: WorkspaceFileManagerSession\n): ReturnType<typeof resolveWorkspaceFileManagerRootViewState> {\n const state = useSnapshot(\n session.store\n ) as WorkspaceFileManagerSession[\"store\"];\n\n return resolveWorkspaceFileManagerRootViewState({ state });\n}\n\nexport function useWorkspaceFileManagerToolbarView(\n session: WorkspaceFileManagerSession,\n i18n: WorkspaceFileManagerI18nRuntime\n) {\n const state = useSnapshot(\n session.store\n ) as WorkspaceFileManagerSession[\"store\"];\n\n return {\n view: resolveWorkspaceFileManagerToolbarViewState({\n copy: i18n,\n state\n })\n };\n}\n\nexport function useWorkspaceFileManagerPanelsView(\n session: WorkspaceFileManagerSession\n) {\n const state = useSnapshot(\n session.store\n ) as WorkspaceFileManagerSession[\"store\"];\n\n return {\n state,\n view: resolveWorkspaceFileManagerPanelsViewState({\n state\n })\n };\n}\n\nexport function useWorkspaceFileManagerDialogsView(\n session: WorkspaceFileManagerSession\n) {\n const state = useSnapshot(\n session.store\n ) as WorkspaceFileManagerSession[\"store\"];\n\n return {\n state,\n view: resolveWorkspaceFileManagerDialogsViewState({\n state\n })\n };\n}\n\nexport function useWorkspaceFileManagerContextMenuView(\n session: WorkspaceFileManagerSession\n) {\n const state = useSnapshot(\n session.store\n ) as WorkspaceFileManagerSession[\"store\"];\n\n return {\n state,\n view: resolveWorkspaceFileManagerContextMenuViewState({\n state\n })\n };\n}\n","import {\n buildWorkspaceFileBreadcrumbs,\n normalizeWorkspaceFilePath\n} from \"../workspaceFileManagerModel.ts\";\nimport {\n findWorkspaceFileLocationById,\n isWorkspaceFileExternalLocation,\n isWorkspaceFileRecentLocation\n} from \"../workspaceFileManagerLocations.ts\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../../i18n/workspaceFileManagerI18n.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileSearchEntry,\n WorkspaceFileManagerState\n} from \"../workspaceFileManagerTypes.ts\";\nimport { findWorkspaceFileEntry } from \"./model/entryLookup.ts\";\n\nexport interface WorkspaceFileManagerRootViewState {\n currentDirectoryPath: string;\n isBusy: boolean;\n locationSections: WorkspaceFileManagerState[\"locationSections\"];\n selectedLocationId: string | null;\n}\n\nexport interface WorkspaceFileManagerToolbarViewState {\n breadcrumbs: Array<{ label: string; path: string }>;\n canSearch: boolean;\n canGoBack: boolean;\n canGoForward: boolean;\n currentDirectoryPath: string;\n isBusy: boolean;\n isLoading: boolean;\n isMutating: boolean;\n isSearching: boolean;\n searchQuery: string;\n}\n\nexport interface WorkspaceFileManagerPanelsViewState {\n canMove: boolean;\n contextMenuEntryPath: string | null;\n entries: readonly WorkspaceFileEntry[];\n error: string | null;\n isSearchMode: boolean;\n inlineRenameEntryPath: string | null;\n inlineRenameValidation: WorkspaceFileManagerState[\"inlineRenameValidation\"];\n isLoading: boolean;\n isRenaming: boolean;\n isSearching: boolean;\n pendingDirectoryPath: string | null;\n previewState: WorkspaceFileManagerState[\"previewState\"];\n searchEntries: readonly WorkspaceFileSearchEntry[];\n searchError: string | null;\n searchQuery: string;\n selectedEntry: WorkspaceFileEntry | null;\n selectedPath: string | null;\n}\n\nexport interface WorkspaceFileManagerDialogsViewState {\n createDialog: WorkspaceFileManagerState[\"createDialog\"];\n deleteDialogEntry: WorkspaceFileEntry | null;\n isBusy: boolean;\n isDeleting: boolean;\n isRenaming: boolean;\n isViewing: boolean;\n unsupportedDialog: {\n actions?: WorkspaceFileManagerState[\"unsupportedDialog\"] extends infer T\n ? T extends { actions?: infer A }\n ? A\n : never\n : never;\n entry?: WorkspaceFileEntry;\n kind: \"view\";\n message?: string | null;\n title?: string | null;\n } | null;\n}\n\nexport interface WorkspaceFileManagerContextMenuViewState {\n contextMenu: {\n entry: WorkspaceFileEntry | null;\n x: number;\n y: number;\n } | null;\n currentDirectoryPath: string;\n isBusy: boolean;\n isLoading: boolean;\n isMutating: boolean;\n}\n\nexport function resolveWorkspaceFileManagerRootViewState(input: {\n state: WorkspaceFileManagerState;\n}): WorkspaceFileManagerRootViewState {\n const { state } = input;\n return {\n currentDirectoryPath: state.currentDirectoryPath,\n isBusy: state.busyAction !== null,\n locationSections: state.locationSections,\n selectedLocationId: state.selectedLocationId\n };\n}\n\nexport function resolveWorkspaceFileManagerToolbarViewState(input: {\n copy: WorkspaceFileManagerI18nRuntime;\n state: WorkspaceFileManagerState;\n}): WorkspaceFileManagerToolbarViewState {\n const { copy, state } = input;\n const currentDirectoryPath = normalizeWorkspaceFilePath(\n state.currentDirectoryPath,\n state.root\n );\n return {\n breadcrumbs: buildWorkspaceFileBreadcrumbs(\n currentDirectoryPath,\n copy.t(\"breadcrumbRootLabel\"),\n state.root\n ),\n canSearch: state.capabilities.canSearch,\n canGoBack:\n currentDirectoryPath !== normalizeWorkspaceFilePath(state.root) &&\n state.navigationBackStack.length > 0,\n canGoForward: state.navigationForwardStack.length > 0,\n currentDirectoryPath,\n isBusy: state.busyAction !== null,\n isLoading: state.isLoading,\n isMutating: state.isMutating,\n isSearching: state.isSearching,\n searchQuery: state.searchQuery\n };\n}\n\nexport function resolveWorkspaceFileManagerPanelsViewState(input: {\n state: WorkspaceFileManagerState;\n}): WorkspaceFileManagerPanelsViewState {\n const { state } = input;\n const isRecentLocation = isWorkspaceFileRecentLocation(\n findWorkspaceFileLocationById(\n state.locationSections,\n state.selectedLocationId\n )\n );\n const isExternalLocation = isWorkspaceFileExternalLocation(\n findWorkspaceFileLocationById(\n state.locationSections,\n state.selectedLocationId\n )\n );\n return {\n canMove:\n state.capabilities.canMove && !isRecentLocation && !isExternalLocation,\n contextMenuEntryPath: state.contextMenuEntryPath,\n entries: state.entries,\n error: state.error,\n isSearchMode: state.searchQuery.trim().length > 0,\n inlineRenameEntryPath: state.inlineRenameEntryPath,\n inlineRenameValidation: state.inlineRenameValidation,\n isLoading: state.isLoading,\n isRenaming: state.busyAction === \"rename\",\n isSearching: state.isSearching,\n pendingDirectoryPath: state.pendingDirectoryPath,\n previewState: state.previewState,\n searchEntries: state.searchEntries,\n searchError: state.searchError,\n searchQuery: state.searchQuery,\n selectedEntry: findSelectedEntry(state),\n selectedPath: state.selectedPath\n };\n}\n\nexport function resolveWorkspaceFileManagerDialogsViewState(input: {\n state: WorkspaceFileManagerState;\n}): WorkspaceFileManagerDialogsViewState {\n const { state } = input;\n const unsupportedDialogEntry = state.unsupportedDialog?.entryPath\n ? findEntry(state, state.unsupportedDialog.entryPath)\n : null;\n\n return {\n createDialog: state.createDialog,\n deleteDialogEntry: state.deleteDialog\n ? findEntry(state, state.deleteDialog.entryPath)\n : null,\n isBusy: state.busyAction !== null,\n isDeleting: state.busyAction === \"delete\",\n isRenaming: state.busyAction === \"rename\",\n isViewing: state.busyAction === \"view\",\n unsupportedDialog: state.unsupportedDialog\n ? {\n actions: state.unsupportedDialog.actions,\n entry: unsupportedDialogEntry ?? undefined,\n kind: state.unsupportedDialog.kind,\n message: state.unsupportedDialog.message,\n title: state.unsupportedDialog.title\n }\n : null\n };\n}\n\nexport function resolveWorkspaceFileManagerContextMenuViewState(input: {\n state: WorkspaceFileManagerState;\n}): WorkspaceFileManagerContextMenuViewState {\n const { state } = input;\n const contextMenuEntry = state.contextMenu?.entryPath\n ? findEntry(state, state.contextMenu.entryPath)\n : null;\n\n return {\n contextMenu: state.contextMenu\n ? {\n entry: contextMenuEntry,\n x: state.contextMenu.x,\n y: state.contextMenu.y\n }\n : null,\n currentDirectoryPath: state.currentDirectoryPath,\n isBusy: state.busyAction !== null,\n isLoading: state.isLoading,\n isMutating: state.isMutating\n };\n}\n\nfunction findSelectedEntry(\n state: WorkspaceFileManagerState\n): WorkspaceFileEntry | null {\n return findWorkspaceFileEntry(state, state.selectedPath);\n}\n\nfunction findEntry(\n state: WorkspaceFileManagerState,\n entryPath: string\n): WorkspaceFileEntry | null {\n return findWorkspaceFileEntry(state, entryPath);\n}\n","import type { ReactElement } from \"react\";\nimport type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\n\n/**\n * Right-click target classification. Hosts resolve menus for each kind via\n * `resolveContextMenu`.\n */\nexport type WorkspaceFileManagerContextMenuTarget =\n | {\n kind: \"blank\";\n directoryPath: string;\n }\n | {\n kind: \"directory\";\n directoryPath: string;\n entry: WorkspaceFileEntry;\n }\n | {\n kind: \"file\";\n directoryPath: string;\n entry: WorkspaceFileEntry;\n };\n\nexport interface WorkspaceFileManagerContextMenuRequest {\n currentDirectoryPath: string;\n isBusy: boolean;\n isExternalLocation: boolean;\n isRecentLocation: boolean;\n isSearchMode: boolean;\n selectedLocationId: string | null;\n target: WorkspaceFileManagerContextMenuTarget;\n}\n\nexport type WorkspaceFileManagerContextMenuItem =\n | WorkspaceFileManagerContextMenuActionItem\n | WorkspaceFileManagerContextMenuSeparatorItem\n | WorkspaceFileManagerContextMenuSubmenuItem;\n\nexport interface WorkspaceFileManagerContextMenuActionItem {\n type: \"item\";\n id: string;\n label: string;\n icon?: ReactElement | null;\n disabled?: boolean;\n danger?: boolean;\n onSelect: () => void | Promise<void>;\n}\n\nexport interface WorkspaceFileManagerContextMenuSeparatorItem {\n type: \"separator\";\n id: string;\n}\n\nexport interface WorkspaceFileManagerContextMenuSubmenuItem {\n type: \"submenu\";\n id: string;\n label: string;\n icon?: ReactElement | null;\n disabled?: boolean;\n /**\n * Host-driven loading indicator for controlled `children` (for example while\n * open-with applications are being fetched outside `loadChildren`).\n */\n loading?: boolean;\n loadingLabel?: string;\n children?: readonly WorkspaceFileManagerContextMenuItem[];\n loadChildren?: () => Promise<readonly WorkspaceFileManagerContextMenuItem[]>;\n}\n\nexport type ResolveWorkspaceFileManagerContextMenu = (\n request: WorkspaceFileManagerContextMenuRequest\n) =>\n | readonly WorkspaceFileManagerContextMenuItem[]\n | Promise<readonly WorkspaceFileManagerContextMenuItem[]>;\n\nexport function resolveWorkspaceFileManagerContextMenuTarget(input: {\n currentDirectoryPath: string;\n entry: WorkspaceFileEntry | null;\n}): WorkspaceFileManagerContextMenuTarget {\n if (!input.entry) {\n return {\n kind: \"blank\",\n directoryPath: input.currentDirectoryPath\n };\n }\n if (input.entry.kind === \"directory\") {\n return {\n kind: \"directory\",\n directoryPath: input.currentDirectoryPath,\n entry: input.entry\n };\n }\n return {\n kind: \"file\",\n directoryPath: input.currentDirectoryPath,\n entry: input.entry\n };\n}\n","import {\n Button,\n ConfirmationDialog,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input\n} from \"@tutti-os/ui-system\";\nimport type { ReactElement } from \"react\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\nimport type { WorkspaceFileManagerHostFallbackAction } from \"./workspaceFileManagerHostTypes.ts\";\n\nexport function WorkspaceFileManagerCreateDialog({\n busy,\n copy,\n dialog,\n onClose,\n onConfirm,\n onNameChange\n}: {\n busy: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n dialog: {\n errorMessage: string | null;\n kind: \"directory\" | \"file\";\n name: string;\n } | null;\n onClose: () => void;\n onConfirm: () => void;\n onNameChange: (name: string) => void;\n}): ReactElement | null {\n if (!dialog) {\n return null;\n }\n\n return (\n <Dialog\n open\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n >\n <DialogContent aria-busy={busy} showCloseButton={false}>\n <form\n className=\"grid gap-3\"\n onSubmit={(event) => {\n event.preventDefault();\n onConfirm();\n }}\n >\n <DialogHeader>\n <DialogTitle>\n {dialog.kind === \"directory\"\n ? copy.t(\"createDirectoryLabel\")\n : copy.t(\"createFileLabel\")}\n </DialogTitle>\n </DialogHeader>\n <Input\n autoFocus\n placeholder={\n dialog.kind === \"directory\"\n ? copy.t(\"createDirectoryPlaceholder\")\n : copy.t(\"createFilePlaceholder\")\n }\n value={dialog.name}\n onChange={(event) => {\n onNameChange(event.currentTarget.value);\n }}\n />\n {dialog.errorMessage ? (\n <p className=\"text-[13px] text-[var(--state-danger)]\">\n {dialog.errorMessage}\n </p>\n ) : null}\n <DialogFooter>\n <Button\n disabled={busy}\n size=\"dialog\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onClose}\n >\n {copy.t(\"cancelLabel\")}\n </Button>\n <Button disabled={busy} size=\"dialog\" type=\"submit\">\n {copy.t(\"createActionLabel\")}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport function WorkspaceFileManagerDeleteDialog({\n busy,\n copy,\n entry,\n onClose,\n onConfirm\n}: {\n busy: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n entry: WorkspaceFileEntry | null;\n onClose: () => void;\n onConfirm: () => void;\n}): ReactElement | null {\n if (!entry) {\n return null;\n }\n\n return (\n <ConfirmationDialog\n cancelLabel={copy.t(\"cancelLabel\")}\n confirmBusy={busy}\n confirmLabel={busy ? copy.t(\"deletingLabel\") : copy.t(\"deleteLabel\")}\n description={copy.t(\"deleteConfirmDescription\", { name: entry.name })}\n open\n title={copy.t(\"deleteLabel\")}\n tone=\"destructive\"\n onConfirm={onConfirm}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n />\n );\n}\n\nexport function WorkspaceFileManagerUnsupportedDialog({\n copy,\n dialog,\n isViewing,\n onAction,\n onClose\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n dialog: {\n actions?: WorkspaceFileManagerHostFallbackAction[] | null;\n message?: string | null;\n title?: string | null;\n entry?: WorkspaceFileEntry;\n } | null;\n isViewing: boolean;\n onAction: (action: WorkspaceFileManagerHostFallbackAction) => void;\n onClose: () => void;\n}): ReactElement | null {\n if (!dialog) {\n return null;\n }\n\n const title = dialog.title ?? copy.t(\"unsupportedViewTitle\");\n const body =\n dialog.message ??\n copy.t(\"unsupportedViewBody\", { name: dialog.entry?.name ?? \"\" });\n const actions =\n dialog.actions?.filter((action) => action.kind !== \"none\") ?? [];\n\n return (\n <Dialog\n open\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n >\n <DialogContent\n showCloseButton={false}\n onEscapeKeyDown={(event) => {\n if (isViewing) {\n event.preventDefault();\n }\n }}\n onInteractOutside={(event) => {\n if (isViewing) {\n event.preventDefault();\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{body}</DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button\n disabled={isViewing}\n size=\"dialog\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onClose}\n >\n {copy.t(\"closeLabel\")}\n </Button>\n {actions.map((action) => (\n <Button\n key={action.kind}\n disabled={isViewing}\n size=\"dialog\"\n type=\"button\"\n className=\"shadow-none\"\n onClick={() => {\n onAction(action);\n }}\n >\n {action.label ??\n (action.kind === \"download\"\n ? copy.t(\"downloadLabel\")\n : copy.t(\"openLabel\"))}\n </Button>\n ))}\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import {\n useCallback,\n useMemo,\n type MouseEvent as ReactMouseEvent,\n type ReactElement\n} from \"react\";\nimport type { TuttiDateLocale } from \"@tutti-os/ui-system/date-format\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type { WorkspaceFileManagerSession } from \"../services/workspaceFileManagerService.interface.ts\";\nimport { workspaceFileSearchEntryToEntry } from \"../services/workspaceFileManagerModel.ts\";\nimport type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\nimport {\n type WorkspaceFileManagerEntryDragMode,\n WorkspaceFileManagerPanels\n} from \"./WorkspaceFileManagerPanels.tsx\";\nimport {\n sortWorkspaceFileEntriesForArrangeMode,\n type WorkspaceFileManagerArrangeMode\n} from \"./workspaceFileManagerArrangeMode.ts\";\nimport type { WorkspaceFileManagerLayoutMode } from \"./workspaceFileManagerLayoutMode.ts\";\nimport { useWorkspaceFileEntryIconUrls } from \"./useWorkspaceFileEntryIconUrls.ts\";\nimport {\n buildWorkspaceFileManagerVisibleTreeRows,\n collectWorkspaceFileManagerVisibleTreeEntries,\n type WorkspaceFileManagerVisibleTreeRow\n} from \"./workspaceFileManagerVisibleTree.ts\";\nimport { useWorkspaceFileManagerPanelsView } from \"./useWorkspaceFileManagerService.ts\";\n\nexport function WorkspaceFileManagerPanelsContainer({\n arrangeMode,\n dateLocale,\n entryDragMode,\n i18n,\n layoutMode,\n onDirectoryExpanded,\n onEntryDragStart,\n onOpenContextMenu,\n resolveEntryIconUrl,\n session,\n showPreviewPanel\n}: {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n dateLocale?: TuttiDateLocale;\n entryDragMode?: WorkspaceFileManagerEntryDragMode;\n i18n: WorkspaceFileManagerI18nRuntime;\n layoutMode: WorkspaceFileManagerLayoutMode;\n onDirectoryExpanded?: (path: string) => void;\n onEntryDragStart?: (\n entry: WorkspaceFileEntry,\n dataTransfer: DataTransfer\n ) => void;\n onOpenContextMenu: (\n event: ReactMouseEvent<HTMLElement>,\n entry: WorkspaceFileEntry | null\n ) => void;\n resolveEntryIconUrl?: (\n entry: WorkspaceFileEntry\n ) => Promise<string | null | undefined>;\n session: WorkspaceFileManagerSession;\n showPreviewPanel: boolean;\n}): ReactElement {\n const { state, view } = useWorkspaceFileManagerPanelsView(session);\n const arrangedEntries = useMemo(\n () => sortWorkspaceFileEntriesForArrangeMode(state.entries, arrangeMode),\n [arrangeMode, state.entries]\n );\n const searchEntries = useMemo(\n () => view.searchEntries.map(workspaceFileSearchEntryToEntry),\n [view.searchEntries]\n );\n const searchEntryContextByPath = useMemo(() => {\n const contextByPath = new Map<string, string>();\n for (const entry of view.searchEntries) {\n contextByPath.set(entry.path, entry.directoryPath);\n }\n return contextByPath;\n }, [view.searchEntries]);\n const treeRows = useMemo(\n () =>\n buildWorkspaceFileManagerVisibleTreeRows({\n arrangeMode,\n directoryExpansionByPath: state.directoryExpansionByPath,\n entries: arrangedEntries,\n expandedDirectoryPaths: state.expandedDirectoryPaths\n }),\n [\n arrangeMode,\n arrangedEntries,\n state.directoryExpansionByPath,\n state.expandedDirectoryPaths\n ]\n );\n const searchTreeRows = useMemo<WorkspaceFileManagerVisibleTreeRow[]>(\n () =>\n searchEntries.map((entry) => ({\n depth: 0,\n entry,\n expanded: false,\n expandable: false,\n kind: \"entry\",\n loadingChildren: false\n })),\n [searchEntries]\n );\n const displayedEntries = view.isSearchMode ? searchEntries : arrangedEntries;\n const displayedTreeRows = view.isSearchMode ? searchTreeRows : treeRows;\n const visibleTreeEntries = useMemo(\n () => collectWorkspaceFileManagerVisibleTreeEntries(displayedTreeRows),\n [displayedTreeRows]\n );\n const panelState = useMemo(\n () => ({\n entries: displayedEntries,\n error: view.isSearchMode ? view.searchError : state.error,\n isLoading: view.isSearchMode ? view.isSearching : state.isLoading,\n isSearchMode: view.isSearchMode\n }),\n [\n displayedEntries,\n state.error,\n state.isLoading,\n view.isSearchMode,\n view.isSearching,\n view.searchError\n ]\n );\n const {\n iconUrlByCacheKey,\n reportEntryIconViewportEnter,\n reportEntryIconViewportLeave\n } = useWorkspaceFileEntryIconUrls({\n entries: layoutMode === \"list\" ? visibleTreeEntries : displayedEntries,\n includeImageThumbnails: true,\n resolveEntryIconUrl\n });\n const handleBlankContextMenu = useCallback(\n (event: ReactMouseEvent<HTMLElement>) => {\n onOpenContextMenu(event, null);\n },\n [onOpenContextMenu]\n );\n const handleCancelInlineRename = useCallback(() => {\n session.cancelInlineRename();\n }, [session]);\n const handleClearInlineRenameValidation = useCallback(() => {\n session.clearInlineRenameValidation();\n }, [session]);\n const handleConfirmInlineRename = useCallback(\n (newName: string) => session.confirmInlineRename(newName),\n [session]\n );\n const handleMoveEntry = useCallback(\n (entry: WorkspaceFileEntry, targetDirectoryPath: string) => {\n void session.moveEntry(entry, targetDirectoryPath);\n },\n [session]\n );\n const handleOpenEntry = useCallback(\n (entry: WorkspaceFileEntry) => {\n if (entry.kind === \"directory\") {\n onDirectoryExpanded?.(entry.path);\n }\n void session.openEntry(entry);\n },\n [onDirectoryExpanded, session]\n );\n const handleSelect = useCallback(\n (path: string) => {\n session.select(path);\n },\n [session]\n );\n const handleToggleDirectoryExpanded = useCallback(\n (entry: WorkspaceFileEntry, expanded: boolean) => {\n if (!expanded) {\n onDirectoryExpanded?.(entry.path);\n }\n void session.toggleDirectoryExpanded(entry);\n },\n [onDirectoryExpanded, session]\n );\n\n return (\n <WorkspaceFileManagerPanels\n arrangeMode={arrangeMode}\n canMove={view.isSearchMode ? false : view.canMove}\n contextMenuEntryPath={view.contextMenuEntryPath}\n copy={i18n}\n dateLocale={dateLocale}\n entryContextByPath={view.isSearchMode ? searchEntryContextByPath : null}\n entryDragMode={entryDragMode}\n iconUrlByCacheKey={iconUrlByCacheKey}\n inlineRenameEntryPath={view.inlineRenameEntryPath}\n inlineRenameValidation={view.inlineRenameValidation}\n isRenaming={view.isRenaming}\n layoutMode={layoutMode}\n pendingDirectoryPath={view.pendingDirectoryPath}\n previewState={view.previewState}\n selectedEntry={view.selectedEntry}\n selectedPath={view.selectedPath}\n showPreviewPanel={showPreviewPanel}\n state={panelState}\n treeRows={displayedTreeRows}\n onBlankContextMenu={handleBlankContextMenu}\n onCancelInlineRename={handleCancelInlineRename}\n onClearInlineRenameValidation={handleClearInlineRenameValidation}\n onConfirmInlineRename={handleConfirmInlineRename}\n onEntryContextMenu={onOpenContextMenu}\n onEntryDragStart={onEntryDragStart}\n onEntryIconViewportEnter={reportEntryIconViewportEnter}\n onEntryIconViewportLeave={reportEntryIconViewportLeave}\n onMoveEntry={handleMoveEntry}\n onOpenEntry={handleOpenEntry}\n onSelect={handleSelect}\n onToggleDirectoryExpanded={handleToggleDirectoryExpanded}\n />\n );\n}\n","import {\n ArrowRightIcon,\n FileCodeIcon,\n FileTextIcon,\n LoadingIcon,\n ScrollArea,\n VideoFileIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { TuttiDateLocale } from \"@tutti-os/ui-system/date-format\";\nimport { resolveWorkspaceFileVisualKind } from \"@tutti-os/workspace-file-preview\";\nimport { WorkspaceFilePreviewSurface as SharedWorkspaceFilePreviewSurface } from \"@tutti-os/workspace-file-preview/react\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type {\n CSSProperties,\n DragEvent as ReactDragEvent,\n KeyboardEvent as ReactKeyboardEvent,\n MouseEvent as ReactMouseEvent,\n PointerEvent as ReactPointerEvent,\n ReactElement,\n RefObject\n} from \"react\";\nimport {\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState\n} from \"react\";\nimport {\n formatWorkspaceFileBytes,\n formatWorkspaceFileModifiedTime,\n splitWorkspaceFileName\n} from \"../services/workspaceFileManagerModel.ts\";\nimport type {\n WorkspaceFileActivationTarget,\n WorkspaceFileEntry,\n WorkspaceFileManagerInlineRenameValidation,\n WorkspaceFilePreviewState\n} from \"../services/workspaceFileManagerTypes.ts\";\nimport { WorkspaceFileManagerIconGrid } from \"./WorkspaceFileManagerIconGrid.tsx\";\nimport {\n WorkspaceFileEntryIcon,\n WorkspaceFolderFallbackIcon,\n WorkspaceImageFallbackIcon\n} from \"./WorkspaceFileEntryIcon.tsx\";\nimport {\n resolveWorkspaceFileEntryArrangeDateMs,\n type WorkspaceFileManagerArrangeMode\n} from \"./workspaceFileManagerArrangeMode.ts\";\nimport type { WorkspaceFileManagerLayoutMode } from \"./workspaceFileManagerLayoutMode.ts\";\nimport {\n readWorkspaceFileManagerPreviewWidth,\n workspaceFileManagerPaneResizeStep,\n workspaceFileManagerPreviewDefaultWidth,\n writeWorkspaceFileManagerPreviewWidth\n} from \"./workspaceFileManagerPaneSizing.ts\";\nimport type { WorkspaceFileManagerVisibleTreeRow } from \"./workspaceFileManagerVisibleTree.ts\";\nimport {\n workspaceFileManagerCompactTableGridClassName,\n workspaceFileManagerCompactTableGridTemplate,\n workspaceFileManagerTableGridClassName,\n workspaceFileManagerTableGridTemplate\n} from \"./workspaceFileManagerTableSizing.ts\";\n\nconst workspaceFileManagerTableGridStyle: CSSProperties = {\n gridTemplateColumns: workspaceFileManagerTableGridTemplate\n};\nconst workspaceFileManagerCompactTableGridStyle: CSSProperties = {\n gridTemplateColumns: workspaceFileManagerCompactTableGridTemplate\n};\nconst workspaceFileManagerPreviewDetailGridStyle: CSSProperties = {\n gridTemplateColumns: \"minmax(82px, 0.8fr) minmax(0, 1.2fr)\"\n};\nconst workspaceFileManagerStackedBreakpoint = 600;\nconst workspaceFileManagerPreviewMinWidth = 220;\nconst workspaceFileManagerTableMinWidth = 360;\nconst workspaceFileManagerMoveDragThreshold = 4;\nconst workspaceFileManagerMoveDragAutoScrollDelayMs = 500;\nconst workspaceFileManagerMoveDragAutoScrollEdgePx = 48;\nconst workspaceFileManagerMoveDragAutoScrollStepPx = 12;\nconst workspaceFileManagerEntryOpenClickIntervalMs = 500;\n\nexport type WorkspaceFileManagerEntryDragMode = \"external\" | \"internal-move\";\n\nexport function WorkspaceFileManagerPanels({\n arrangeMode,\n canMove,\n contextMenuEntryPath,\n dateLocale,\n entryDragMode,\n entrySelectionEnabled = true,\n entryContextByPath = null,\n copy,\n iconUrlByCacheKey,\n inlineRenameEntryPath,\n inlineRenameValidation,\n isRenaming,\n layoutMode,\n pendingDirectoryPath,\n previewState,\n onEntryIconViewportLeave,\n onEntryIconViewportEnter,\n selectedEntry,\n selectedPath,\n showPreviewPanel: showPreviewPanelEnabled = true,\n state,\n treeRows,\n onBlankContextMenu,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename,\n onEntryContextMenu,\n onEntryDragStart,\n onMoveEntry,\n onOpenEntry,\n onSelect,\n onToggleDirectoryExpanded\n}: {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n canMove: boolean;\n contextMenuEntryPath: string | null;\n dateLocale?: TuttiDateLocale;\n entryDragMode?: WorkspaceFileManagerEntryDragMode;\n entrySelectionEnabled?: boolean;\n entryContextByPath?: ReadonlyMap<string, string> | null;\n copy: WorkspaceFileManagerI18nRuntime;\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n inlineRenameEntryPath: string | null;\n inlineRenameValidation: WorkspaceFileManagerInlineRenameValidation | null;\n isRenaming: boolean;\n layoutMode: WorkspaceFileManagerLayoutMode;\n pendingDirectoryPath: string | null;\n previewState: WorkspaceFilePreviewState;\n onEntryIconViewportLeave?: (entry: WorkspaceFileEntry) => void;\n onEntryIconViewportEnter?: (entry: WorkspaceFileEntry) => void;\n selectedEntry: WorkspaceFileEntry | null;\n selectedPath: string | null;\n showPreviewPanel?: boolean;\n state: {\n entries: readonly WorkspaceFileEntry[];\n error: string | null;\n isLoading: boolean;\n isSearchMode: boolean;\n };\n treeRows: readonly WorkspaceFileManagerVisibleTreeRow[];\n onBlankContextMenu: (event: ReactMouseEvent<HTMLElement>) => void;\n onCancelInlineRename: () => void;\n onClearInlineRenameValidation: () => void;\n onConfirmInlineRename: (newName: string) => Promise<boolean>;\n onEntryContextMenu: (\n event: ReactMouseEvent<HTMLElement>,\n entry: WorkspaceFileEntry\n ) => void;\n onEntryDragStart?: (\n entry: WorkspaceFileEntry,\n dataTransfer: DataTransfer\n ) => void;\n onMoveEntry: (entry: WorkspaceFileEntry, targetDirectoryPath: string) => void;\n onOpenEntry: (entry: WorkspaceFileEntry) => void;\n onSelect: (path: string) => void;\n onToggleDirectoryExpanded: (\n entry: WorkspaceFileEntry,\n expanded: boolean\n ) => void;\n}): ReactElement {\n const { rootRef } = useWorkspaceFileManagerStackedLayout(\n workspaceFileManagerStackedBreakpoint\n );\n const previewResizeRef = useRef<{\n currentWidth: number;\n pointerId: number;\n startX: number;\n startWidth: number;\n maxWidth: number;\n } | null>(null);\n const [previewPaneWidth, setPreviewPaneWidth] = useState(\n readWorkspaceFileManagerPreviewWidth\n );\n const [previewPaneMaxWidth, setPreviewPaneMaxWidth] = useState(\n workspaceFileManagerPreviewDefaultWidth\n );\n const [moveDragPreview, setMoveDragPreview] =\n useState<WorkspaceFileManagerMoveDragPreview | null>(null);\n const lastEntryClickRef = useRef<{ path: string; timeMs: number } | null>(\n null\n );\n const moveDragAutoScrollRef =\n useRef<WorkspaceFileManagerMoveDragAutoScroll | null>(null);\n const moveDragRef = useRef<WorkspaceFileManagerMoveDrag | null>(null);\n const suppressNextClickRef = useRef(false);\n const moveTargetEntries = useMemo(\n () =>\n layoutMode === \"list\"\n ? treeRows.flatMap((row) => (row.kind === \"entry\" ? [row.entry] : []))\n : state.entries,\n [layoutMode, state.entries, treeRows]\n );\n const entriesRef = useRef<readonly WorkspaceFileEntry[]>(moveTargetEntries);\n const nativeEntryDragEnabled =\n onEntryDragStart !== undefined &&\n (entryDragMode === \"external\" || (entryDragMode === undefined && !canMove));\n const internalMoveEnabled = canMove && !nativeEntryDragEnabled;\n const dateColumnLabel = resolveWorkspaceFileManagerDateColumnLabel(\n copy,\n arrangeMode\n );\n const stopMoveDragAutoScroll = useCallback((): void => {\n const autoScroll = moveDragAutoScrollRef.current;\n if (autoScroll?.frameId !== null && autoScroll?.frameId !== undefined) {\n window.cancelAnimationFrame(autoScroll.frameId);\n }\n moveDragAutoScrollRef.current = null;\n }, []);\n const updateMoveDragAutoScroll = useCallback(\n (clientY: number): void => {\n const scrollViewport = resolveWorkspaceFileManagerTableScrollViewport(\n rootRef.current\n );\n const direction = resolveWorkspaceFileManagerMoveDragAutoScrollDirection(\n scrollViewport,\n clientY\n );\n if (!scrollViewport || direction === null) {\n stopMoveDragAutoScroll();\n return;\n }\n\n const current = moveDragAutoScrollRef.current;\n if (\n current?.scrollViewport === scrollViewport &&\n current.direction === direction\n ) {\n current.lastClientY = clientY;\n return;\n }\n\n stopMoveDragAutoScroll();\n\n const nextAutoScroll: WorkspaceFileManagerMoveDragAutoScroll = {\n direction,\n enteredAtMs: window.performance.now(),\n frameId: null,\n lastClientY: clientY,\n scrollViewport\n };\n\n const step = (timestamp: number) => {\n if (moveDragAutoScrollRef.current !== nextAutoScroll) {\n return;\n }\n\n const nextDirection =\n resolveWorkspaceFileManagerMoveDragAutoScrollDirection(\n nextAutoScroll.scrollViewport,\n nextAutoScroll.lastClientY\n );\n if (nextDirection !== nextAutoScroll.direction) {\n stopMoveDragAutoScroll();\n return;\n }\n\n if (\n timestamp - nextAutoScroll.enteredAtMs >=\n workspaceFileManagerMoveDragAutoScrollDelayMs\n ) {\n nextAutoScroll.scrollViewport.scrollTop +=\n nextAutoScroll.direction *\n workspaceFileManagerMoveDragAutoScrollStepPx;\n }\n\n nextAutoScroll.frameId = window.requestAnimationFrame(step);\n };\n\n moveDragAutoScrollRef.current = nextAutoScroll;\n nextAutoScroll.frameId = window.requestAnimationFrame(step);\n },\n [rootRef, stopMoveDragAutoScroll]\n );\n const handleEntryPointerDown = useCallback(\n (entry: WorkspaceFileEntry, event: ReactPointerEvent<HTMLElement>) => {\n if (!internalMoveEnabled || event.button !== 0) {\n return;\n }\n\n moveDragRef.current = {\n active: false,\n entry,\n startX: event.clientX,\n startY: event.clientY\n };\n },\n [internalMoveEnabled]\n );\n const shouldSuppressEntryClick = useCallback((): boolean => {\n if (!suppressNextClickRef.current) {\n return false;\n }\n suppressNextClickRef.current = false;\n return true;\n }, []);\n const handleTablePanelContextMenu = useCallback(\n (event: ReactMouseEvent<HTMLElement>): void => {\n const target = event.target;\n if (\n target instanceof Element &&\n target.closest(\"[data-workspace-file-entry-path]\")\n ) {\n return;\n }\n onBlankContextMenu(event);\n },\n [onBlankContextMenu]\n );\n const handleEntryClick = useCallback(\n (entry: WorkspaceFileEntry): void => {\n if (shouldSuppressEntryClick()) {\n lastEntryClickRef.current = null;\n return;\n }\n\n const now = Date.now();\n const lastClick = lastEntryClickRef.current;\n if (\n lastClick?.path === entry.path &&\n now - lastClick.timeMs <= workspaceFileManagerEntryOpenClickIntervalMs\n ) {\n lastEntryClickRef.current = null;\n onOpenEntry(entry);\n return;\n }\n\n lastEntryClickRef.current = { path: entry.path, timeMs: now };\n if (!entrySelectionEnabled) {\n return;\n }\n onSelect(entry.path);\n },\n [entrySelectionEnabled, onOpenEntry, onSelect, shouldSuppressEntryClick]\n );\n useEffect(() => {\n lastEntryClickRef.current = null;\n entriesRef.current = moveTargetEntries;\n }, [moveTargetEntries]);\n useEffect(() => {\n function handleDocumentPointerMove(event: PointerEvent | MouseEvent): void {\n const drag = moveDragRef.current;\n if (!drag) {\n return;\n }\n\n const deltaX = event.clientX - drag.startX;\n const deltaY = event.clientY - drag.startY;\n if (\n !drag.active &&\n Math.hypot(deltaX, deltaY) >= workspaceFileManagerMoveDragThreshold\n ) {\n drag.active = true;\n }\n if (drag.active) {\n const targetEntry = resolveMoveDragTargetEntry(\n entriesRef.current,\n drag.entry,\n event.clientX,\n event.clientY\n );\n setMoveDragPreview({\n entry: drag.entry,\n targetDirectoryPath: targetEntry?.path ?? null,\n x: event.clientX,\n y: event.clientY\n });\n updateMoveDragAutoScroll(event.clientY);\n event.preventDefault();\n }\n }\n\n function handleDocumentPointerUp(event: PointerEvent | MouseEvent): void {\n const drag = moveDragRef.current;\n moveDragRef.current = null;\n stopMoveDragAutoScroll();\n setMoveDragPreview(null);\n if (!drag?.active) {\n return;\n }\n\n suppressNextClickRef.current = true;\n event.preventDefault();\n if (!internalMoveEnabled) {\n return;\n }\n\n const targetEntry = resolveMoveDragTargetEntry(\n entriesRef.current,\n drag.entry,\n event.clientX,\n event.clientY\n );\n if (targetEntry) {\n onMoveEntry(drag.entry, targetEntry.path);\n }\n }\n\n document.addEventListener(\"pointermove\", handleDocumentPointerMove, true);\n document.addEventListener(\"mousemove\", handleDocumentPointerMove, true);\n document.addEventListener(\"pointerup\", handleDocumentPointerUp, true);\n document.addEventListener(\"mouseup\", handleDocumentPointerUp, true);\n return () => {\n document.removeEventListener(\n \"pointermove\",\n handleDocumentPointerMove,\n true\n );\n document.removeEventListener(\n \"mousemove\",\n handleDocumentPointerMove,\n true\n );\n document.removeEventListener(\"pointerup\", handleDocumentPointerUp, true);\n document.removeEventListener(\"mouseup\", handleDocumentPointerUp, true);\n stopMoveDragAutoScroll();\n };\n }, [\n internalMoveEnabled,\n onMoveEntry,\n stopMoveDragAutoScroll,\n updateMoveDragAutoScroll\n ]);\n const showPreviewPanel = showPreviewPanelEnabled && layoutMode === \"list\";\n const useStackedPreview = false;\n const previewPaneClassName = useStackedPreview\n ? \"min-w-0 border-t border-[var(--border-1)]\"\n : \"min-w-[220px] border-l border-[var(--border-1)]\";\n const tableGridClassName = useStackedPreview\n ? workspaceFileManagerCompactTableGridClassName\n : workspaceFileManagerTableGridClassName;\n const tableGridStyle = useStackedPreview\n ? workspaceFileManagerCompactTableGridStyle\n : workspaceFileManagerTableGridStyle;\n const tableCellPaddingClassName = \"px-4\";\n const clampPreviewPaneWidth = useCallback(\n (width: number, maxWidth?: number): number => {\n const resolvedMaxWidth =\n typeof maxWidth === \"number\"\n ? Math.max(workspaceFileManagerPreviewMinWidth, maxWidth)\n : Number.POSITIVE_INFINITY;\n return Math.min(\n Math.max(width, workspaceFileManagerPreviewMinWidth),\n resolvedMaxWidth\n );\n },\n []\n );\n const resolvePreviewPaneMaxWidth = useCallback((): number => {\n const containerWidth =\n rootRef.current?.getBoundingClientRect().width ??\n workspaceFileManagerTableMinWidth + workspaceFileManagerPreviewMinWidth;\n return Math.max(\n workspaceFileManagerPreviewMinWidth,\n containerWidth - workspaceFileManagerTableMinWidth\n );\n }, [rootRef]);\n\n useLayoutEffect(() => {\n const element = rootRef.current;\n if (!element || useStackedPreview || !showPreviewPanel) {\n return;\n }\n\n const publishLayout = () => {\n const maxWidth = resolvePreviewPaneMaxWidth();\n setPreviewPaneMaxWidth(maxWidth);\n setPreviewPaneWidth((currentWidth) =>\n clampPreviewPaneWidth(currentWidth, maxWidth)\n );\n };\n\n publishLayout();\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", publishLayout);\n return () => {\n window.removeEventListener(\"resize\", publishLayout);\n };\n }\n\n const observer = new ResizeObserver(publishLayout);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [\n clampPreviewPaneWidth,\n resolvePreviewPaneMaxWidth,\n rootRef,\n showPreviewPanel,\n useStackedPreview\n ]);\n\n const handlePreviewResizePointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>): void => {\n if (event.button !== 0) {\n return;\n }\n\n const maxWidth = resolvePreviewPaneMaxWidth();\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n previewResizeRef.current = {\n currentWidth: previewPaneWidth,\n pointerId: event.pointerId,\n startX: event.clientX,\n startWidth: previewPaneWidth,\n maxWidth\n };\n },\n [previewPaneWidth, resolvePreviewPaneMaxWidth]\n );\n\n const handlePreviewResizePointerMove = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>): void => {\n const resize = previewResizeRef.current;\n if (!resize || resize.pointerId !== event.pointerId) {\n return;\n }\n\n const deltaX = event.clientX - resize.startX;\n resize.currentWidth = clampPreviewPaneWidth(\n resize.startWidth - deltaX,\n resize.maxWidth\n );\n setPreviewPaneWidth(resize.currentWidth);\n },\n [clampPreviewPaneWidth]\n );\n\n const handlePreviewResizePointerEnd = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>): void => {\n const resize = previewResizeRef.current;\n if (!resize || resize.pointerId !== event.pointerId) {\n return;\n }\n\n previewResizeRef.current = null;\n writeWorkspaceFileManagerPreviewWidth(resize.currentWidth);\n event.currentTarget.releasePointerCapture(event.pointerId);\n },\n []\n );\n const handlePreviewResizeKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>): void => {\n let nextWidth: number | null = null;\n if (event.key === \"Home\") {\n event.preventDefault();\n nextWidth = workspaceFileManagerPreviewMinWidth;\n } else if (event.key === \"End\") {\n event.preventDefault();\n nextWidth = previewPaneMaxWidth;\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n nextWidth = clampPreviewPaneWidth(\n previewPaneWidth +\n (event.key === \"ArrowLeft\"\n ? workspaceFileManagerPaneResizeStep\n : -workspaceFileManagerPaneResizeStep),\n previewPaneMaxWidth\n );\n }\n if (nextWidth !== null) {\n setPreviewPaneWidth(nextWidth);\n writeWorkspaceFileManagerPreviewWidth(nextWidth);\n }\n },\n [clampPreviewPaneWidth, previewPaneMaxWidth, previewPaneWidth]\n );\n\n const tablePanel = (\n <div\n className={cn(\n \"flex min-h-0 min-w-0 flex-col overflow-hidden\",\n useStackedPreview ? \"h-[44%] max-h-[48%] flex-none\" : \"flex-1\"\n )}\n onContextMenu={handleTablePanelContextMenu}\n >\n {state.error ? (\n <FeedbackState message={state.error} />\n ) : state.isLoading && state.entries.length === 0 ? (\n <FeedbackState message={copy.t(\"loading\")} />\n ) : state.entries.length === 0 ? (\n <FeedbackState\n message={copy.t(\n state.isSearchMode ? \"noSearchResults\" : \"emptyDirectory\"\n )}\n />\n ) : (\n <ScrollArea className=\"min-h-0 flex-1 [&_[data-orientation=vertical][data-slot=scroll-area-scrollbar]]:opacity-100\">\n {layoutMode === \"icon\" ? (\n <WorkspaceFileManagerIconGrid\n contextMenuEntryPath={contextMenuEntryPath}\n copy={copy}\n draggable={nativeEntryDragEnabled}\n entries={state.entries}\n iconUrlByCacheKey={iconUrlByCacheKey}\n inlineRenameEntryPath={inlineRenameEntryPath}\n inlineRenameValidation={inlineRenameValidation}\n isRenaming={isRenaming}\n moveDragActive={moveDragPreview !== null}\n moveDragPreviewEntryPath={moveDragPreview?.entry.path ?? null}\n moveDragTargetEntryPath={\n moveDragPreview?.targetDirectoryPath ?? null\n }\n pendingDirectoryPath={pendingDirectoryPath}\n onEntryIconViewportLeave={onEntryIconViewportLeave}\n onEntryIconViewportEnter={onEntryIconViewportEnter}\n selectedPath={selectedPath}\n onCancelInlineRename={onCancelInlineRename}\n onClearInlineRenameValidation={onClearInlineRenameValidation}\n onConfirmInlineRename={onConfirmInlineRename}\n onContextMenu={onEntryContextMenu}\n onDragStart={onEntryDragStart}\n onEntryClick={handleEntryClick}\n onEntryPointerDown={handleEntryPointerDown}\n />\n ) : (\n <div className=\"flex flex-col\">\n <div\n className={cn(\n \"grid h-9 min-h-9 items-center gap-x-6 border-b border-[var(--border-1)] text-xs font-normal text-[var(--text-secondary)]\",\n tableGridClassName\n )}\n style={tableGridStyle}\n >\n <span\n className={cn(\n \"min-w-0 overflow-hidden\",\n tableCellPaddingClassName\n )}\n data-workspace-file-manager-name-column=\"\"\n >\n {copy.t(\"nameLabel\")}\n </span>\n <span\n className={cn(\"min-w-0 truncate\", tableCellPaddingClassName)}\n >\n {dateColumnLabel}\n </span>\n <span\n className={cn(\"min-w-0 truncate\", tableCellPaddingClassName)}\n >\n {copy.t(\"sizeLabel\")}\n </span>\n </div>\n {treeRows.map((row) =>\n row.kind === \"feedback\" ? (\n <TreeFeedbackRow\n key={row.key}\n copy={copy}\n depth={row.depth}\n gridClassName={tableGridClassName}\n gridStyle={tableGridStyle}\n message={row.message}\n status={row.status}\n tableCellPaddingClassName={tableCellPaddingClassName}\n />\n ) : (\n <EntryRow\n key={row.entry.path}\n contextMenuActive={contextMenuEntryPath === row.entry.path}\n copy={copy}\n arrangeMode={arrangeMode}\n dateLocale={dateLocale}\n depth={row.depth}\n entry={row.entry}\n contextLabel={entryContextByPath?.get(row.entry.path)}\n expanded={row.expanded}\n expandable={row.expandable}\n iconUrlByCacheKey={iconUrlByCacheKey}\n canMove={internalMoveEnabled}\n draggable={nativeEntryDragEnabled}\n gridClassName={tableGridClassName}\n gridStyle={tableGridStyle}\n inlineRenameValidation={\n inlineRenameEntryPath === row.entry.path\n ? inlineRenameValidation\n : null\n }\n isEnteringDirectory={\n pendingDirectoryPath === row.entry.path\n }\n isInlineRenaming={inlineRenameEntryPath === row.entry.path}\n isLoadingChildren={row.loadingChildren}\n isRenaming={isRenaming}\n moveDragActive={moveDragPreview !== null}\n moveDragSource={\n moveDragPreview?.entry.path === row.entry.path\n }\n moveDragTarget={\n moveDragPreview?.targetDirectoryPath === row.entry.path\n }\n tableCellPaddingClassName={tableCellPaddingClassName}\n selected={selectedPath === row.entry.path}\n onEntryIconViewportLeave={onEntryIconViewportLeave}\n onEntryIconViewportEnter={onEntryIconViewportEnter}\n onCancelInlineRename={onCancelInlineRename}\n onClearInlineRenameValidation={\n onClearInlineRenameValidation\n }\n onConfirmInlineRename={onConfirmInlineRename}\n onContextMenu={onEntryContextMenu}\n onDragStart={onEntryDragStart}\n onClick={handleEntryClick}\n onPointerDown={handleEntryPointerDown}\n onToggleDirectoryExpanded={onToggleDirectoryExpanded}\n />\n )\n )}\n </div>\n )}\n </ScrollArea>\n )}\n </div>\n );\n\n const previewPanel = showPreviewPanel ? (\n <aside\n className={cn(\n \"relative flex h-full min-h-0 flex-col gap-[14px] overflow-auto p-4\",\n useStackedPreview ? \"max-h-[44%] flex-none\" : \"flex-none\",\n previewPaneClassName\n )}\n style={\n useStackedPreview\n ? undefined\n : ({ width: previewPaneWidth } satisfies CSSProperties)\n }\n >\n <PreviewPane\n copy={copy}\n dateLocale={dateLocale}\n entry={selectedEntry}\n previewState={previewState}\n />\n </aside>\n ) : null;\n\n return (\n <div\n className=\"relative min-h-0 min-w-0 flex-1 overflow-hidden\"\n ref={rootRef}\n >\n <div\n className={cn(\n \"h-full min-h-0 min-w-0 bg-transparent\",\n useStackedPreview ? \"flex flex-col gap-3\" : \"flex\"\n )}\n >\n {tablePanel}\n {showPreviewPanel && !useStackedPreview ? (\n <div\n aria-label={copy.t(\"resizePreviewPanel\")}\n aria-orientation=\"vertical\"\n aria-valuemax={previewPaneMaxWidth}\n aria-valuemin={workspaceFileManagerPreviewMinWidth}\n aria-valuenow={previewPaneWidth}\n className=\"nodrag absolute top-0 bottom-0 z-[1] w-2 cursor-col-resize touch-none\"\n role=\"separator\"\n tabIndex={0}\n style={\n {\n right: previewPaneWidth - 4\n } satisfies CSSProperties\n }\n onPointerCancel={handlePreviewResizePointerEnd}\n onPointerDown={handlePreviewResizePointerDown}\n onPointerMove={handlePreviewResizePointerMove}\n onPointerUp={handlePreviewResizePointerEnd}\n onKeyDown={handlePreviewResizeKeyDown}\n />\n ) : null}\n {previewPanel}\n </div>\n {moveDragPreview ? (\n <MoveDragPreview\n iconUrlByCacheKey={iconUrlByCacheKey}\n preview={moveDragPreview}\n onEntryIconViewportLeave={onEntryIconViewportLeave}\n onEntryIconViewportEnter={onEntryIconViewportEnter}\n />\n ) : null}\n </div>\n );\n}\n\nfunction useWorkspaceFileManagerStackedLayout(breakpoint: number): {\n isStacked: boolean;\n rootRef: RefObject<HTMLDivElement | null>;\n} {\n const rootRef = useRef<HTMLDivElement | null>(null);\n const [isStacked, setIsStacked] = useState(false);\n\n useLayoutEffect(() => {\n const element = rootRef.current;\n if (!element) {\n return;\n }\n\n const publishLayout = () => {\n const nextIsStacked =\n Math.round(element.getBoundingClientRect().width) <= breakpoint;\n setIsStacked((current) =>\n current === nextIsStacked ? current : nextIsStacked\n );\n };\n\n publishLayout();\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", publishLayout);\n return () => {\n window.removeEventListener(\"resize\", publishLayout);\n };\n }\n\n const observer = new ResizeObserver(publishLayout);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [breakpoint]);\n\n return { isStacked, rootRef };\n}\n\nfunction resolveWorkspaceFileManagerDateColumnLabel(\n copy: WorkspaceFileManagerI18nRuntime,\n arrangeMode: WorkspaceFileManagerArrangeMode\n): string {\n switch (arrangeMode) {\n case \"lastOpened\":\n return copy.t(\"arrangeLastOpenedLabel\");\n case \"dateAdded\":\n return copy.t(\"arrangeDateAddedLabel\");\n case \"created\":\n return copy.t(\"arrangeCreatedLabel\");\n case \"modified\":\n default:\n return copy.t(\"modifiedLabel\");\n }\n}\n\nconst EntryRow = memo(function EntryRow({\n arrangeMode,\n canMove,\n contextMenuActive,\n contextLabel,\n copy,\n dateLocale,\n depth,\n draggable,\n entry,\n expanded,\n expandable,\n gridClassName,\n gridStyle,\n iconUrlByCacheKey,\n inlineRenameValidation,\n isEnteringDirectory,\n isInlineRenaming,\n isLoadingChildren,\n isRenaming,\n moveDragActive,\n moveDragSource,\n moveDragTarget,\n onEntryIconViewportLeave,\n onEntryIconViewportEnter,\n selected,\n tableCellPaddingClassName,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename,\n onContextMenu,\n onDragStart,\n onClick,\n onPointerDown,\n onToggleDirectoryExpanded\n}: {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n canMove: boolean;\n contextMenuActive: boolean;\n contextLabel?: string | null;\n copy: WorkspaceFileManagerI18nRuntime;\n dateLocale?: TuttiDateLocale;\n depth: number;\n draggable: boolean;\n entry: WorkspaceFileEntry;\n expanded: boolean;\n expandable: boolean;\n gridClassName: string;\n gridStyle: CSSProperties;\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n inlineRenameValidation: WorkspaceFileManagerInlineRenameValidation | null;\n isEnteringDirectory: boolean;\n isInlineRenaming: boolean;\n isLoadingChildren: boolean;\n isRenaming: boolean;\n moveDragActive: boolean;\n moveDragSource: boolean;\n moveDragTarget: boolean;\n onEntryIconViewportLeave?: (entry: WorkspaceFileEntry) => void;\n onEntryIconViewportEnter?: (entry: WorkspaceFileEntry) => void;\n onCancelInlineRename: () => void;\n onClearInlineRenameValidation: () => void;\n onConfirmInlineRename: (newName: string) => Promise<boolean>;\n onContextMenu: (\n event: ReactMouseEvent<HTMLElement>,\n entry: WorkspaceFileEntry\n ) => void;\n onDragStart?: (entry: WorkspaceFileEntry, dataTransfer: DataTransfer) => void;\n onClick: (entry: WorkspaceFileEntry) => void;\n onPointerDown: (\n entry: WorkspaceFileEntry,\n event: ReactPointerEvent<HTMLElement>\n ) => void;\n onToggleDirectoryExpanded: (\n entry: WorkspaceFileEntry,\n expanded: boolean\n ) => void;\n selected: boolean;\n tableCellPaddingClassName: string;\n}): ReactElement {\n const buttonRowRef = useRef<HTMLButtonElement | null>(null);\n const divRowRef = useRef<HTMLDivElement | null>(null);\n\n useLayoutEffect(() => {\n if (!selected) {\n return;\n }\n (buttonRowRef.current ?? divRowRef.current)?.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\"\n });\n }, [selected]);\n\n const rowClassName = cn(\n \"relative grid min-h-10 w-full items-center gap-x-6 border-b border-[var(--border-1)] px-0 text-left transition-colors\",\n gridClassName,\n isInlineRenaming\n ? \"cursor-default\"\n : \"cursor-pointer hover:bg-transparency-hover active:bg-[var(--transparency-active)]\",\n canMove && moveDragActive && \"cursor-grabbing\",\n selected || contextMenuActive || isInlineRenaming\n ? \"bg-transparency-block text-[var(--text-primary)]\"\n : \"text-[var(--text-secondary)]\",\n moveDragSource && \"opacity-55\",\n moveDragTarget &&\n \"bg-[var(--accent-bg)] text-[var(--text-primary)] outline outline-1 -outline-offset-1 outline-[var(--border-focus)]\",\n moveDragActive && !moveDragSource && !moveDragTarget && \"opacity-90\"\n );\n const rowProps = {\n className: rowClassName,\n \"data-workspace-file-entry-path\": entry.path,\n style: gridStyle,\n onContextMenu: (event: ReactMouseEvent<HTMLElement>) => {\n onContextMenu(event, entry);\n }\n };\n const nameCell = (\n <span\n className={cn(\n \"min-w-0 overflow-hidden\",\n !isInlineRenaming && \"pointer-events-none relative z-[1]\",\n tableCellPaddingClassName\n )}\n >\n <EntryNameCell\n copy={copy}\n contextLabel={contextLabel}\n entry={entry}\n iconUrlByCacheKey={iconUrlByCacheKey}\n inlineRenameValidation={inlineRenameValidation}\n isEnteringDirectory={isEnteringDirectory}\n isExpanded={expanded}\n isExpandable={expandable}\n isInlineRenaming={isInlineRenaming}\n isLoadingChildren={isLoadingChildren}\n isRenaming={isRenaming}\n treeDepth={depth}\n onEntryIconViewportLeave={onEntryIconViewportLeave}\n onEntryIconViewportEnter={onEntryIconViewportEnter}\n onCancelInlineRename={onCancelInlineRename}\n onClearInlineRenameValidation={onClearInlineRenameValidation}\n onConfirmInlineRename={onConfirmInlineRename}\n onToggleDirectoryExpanded={onToggleDirectoryExpanded}\n />\n </span>\n );\n const modifiedCell = (\n <span\n className={cn(\n \"truncate text-xs text-[var(--text-secondary)]\",\n !isInlineRenaming && \"pointer-events-none relative z-[1]\",\n tableCellPaddingClassName\n )}\n >\n {formatWorkspaceFileModifiedTime(\n resolveWorkspaceFileEntryArrangeDateMs(entry, arrangeMode),\n dateLocale\n )}\n </span>\n );\n const sizeCell = (\n <span\n className={cn(\n \"truncate text-xs text-[var(--text-secondary)]\",\n !isInlineRenaming && \"pointer-events-none relative z-[1]\",\n tableCellPaddingClassName\n )}\n >\n {entry.kind === \"directory\"\n ? \"--\"\n : formatWorkspaceFileBytes(entry.sizeBytes)}\n </span>\n );\n\n if (isInlineRenaming) {\n return (\n <div\n {...rowProps}\n aria-label={entry.name}\n draggable={false}\n ref={divRowRef}\n >\n {nameCell}\n {modifiedCell}\n {sizeCell}\n </div>\n );\n }\n\n return (\n <div\n {...rowProps}\n draggable={draggable}\n ref={divRowRef}\n onDragStart={(event: ReactDragEvent<HTMLElement>) => {\n if (!draggable) {\n event.preventDefault();\n return;\n }\n onDragStart?.(entry, event.dataTransfer);\n }}\n >\n <button\n aria-label={entry.name}\n className=\"absolute inset-0 z-0\"\n ref={buttonRowRef}\n type=\"button\"\n onPointerDown={(event) => {\n onPointerDown(entry, event);\n }}\n onClick={() => {\n onClick(entry);\n }}\n />\n {nameCell}\n {modifiedCell}\n {sizeCell}\n </div>\n );\n});\n\nfunction MoveDragPreview({\n iconUrlByCacheKey,\n preview,\n onEntryIconViewportLeave,\n onEntryIconViewportEnter\n}: {\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n preview: WorkspaceFileManagerMoveDragPreview;\n onEntryIconViewportLeave?: (entry: WorkspaceFileEntry) => void;\n onEntryIconViewportEnter?: (entry: WorkspaceFileEntry) => void;\n}): ReactElement {\n return (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed z-[60] flex max-w-[280px] items-center gap-2 rounded-md border border-[var(--line-1)] bg-[var(--background-fronted)] px-3 py-2 text-sm font-normal text-[var(--text-primary)] shadow-panel\"\n style={\n {\n left: preview.x,\n top: preview.y,\n transform: \"translate(12px, 12px)\"\n } satisfies CSSProperties\n }\n >\n <WorkspaceFileEntryIcon\n entry={preview.entry}\n frameClassName=\"size-7\"\n iconClassName=\"size-6\"\n iconUrlByCacheKey={iconUrlByCacheKey}\n onViewportLeave={onEntryIconViewportLeave}\n onViewportEnter={onEntryIconViewportEnter}\n />\n <span className=\"min-w-0 truncate\">{preview.entry.name}</span>\n </div>\n );\n}\n\ninterface WorkspaceFileManagerMoveDrag {\n active: boolean;\n entry: WorkspaceFileEntry;\n startX: number;\n startY: number;\n}\n\ninterface WorkspaceFileManagerMoveDragPreview {\n entry: WorkspaceFileEntry;\n targetDirectoryPath: string | null;\n x: number;\n y: number;\n}\n\ninterface WorkspaceFileManagerMoveDragAutoScroll {\n direction: -1 | 1;\n enteredAtMs: number;\n frameId: number | null;\n lastClientY: number;\n scrollViewport: HTMLElement;\n}\n\nfunction resolveWorkspaceFileManagerTableScrollViewport(\n rootElement: HTMLElement | null\n): HTMLElement | null {\n return (\n rootElement?.querySelector<HTMLElement>(\n '[data-slot=\"scroll-area-viewport\"]'\n ) ?? null\n );\n}\n\nfunction resolveWorkspaceFileManagerMoveDragAutoScrollDirection(\n scrollViewport: HTMLElement | null,\n clientY: number\n): -1 | 1 | null {\n if (!scrollViewport) {\n return null;\n }\n\n const { bottom, top } = scrollViewport.getBoundingClientRect();\n const canScrollUp = scrollViewport.scrollTop > 0;\n const canScrollDown =\n scrollViewport.scrollTop + scrollViewport.clientHeight <\n scrollViewport.scrollHeight;\n\n if (\n canScrollUp &&\n clientY <= top + workspaceFileManagerMoveDragAutoScrollEdgePx\n ) {\n return -1;\n }\n\n if (\n canScrollDown &&\n clientY >= bottom - workspaceFileManagerMoveDragAutoScrollEdgePx\n ) {\n return 1;\n }\n\n return null;\n}\n\nfunction resolveMoveDragTargetEntry(\n entries: readonly WorkspaceFileEntry[],\n movedEntry: WorkspaceFileEntry,\n x: number,\n y: number\n): WorkspaceFileEntry | null {\n const targetElement = document.elementFromPoint(x, y);\n const rowElement = targetElement?.closest<HTMLElement>(\n \"[data-workspace-file-entry-path]\"\n );\n const targetPath = rowElement?.dataset.workspaceFileEntryPath;\n const targetEntry = targetPath\n ? entries.find((entry) => entry.path === targetPath)\n : null;\n if (!targetEntry || !canMoveEntryToDirectory(movedEntry, targetEntry)) {\n return null;\n }\n return targetEntry;\n}\n\nfunction canMoveEntryToDirectory(\n movedEntry: WorkspaceFileEntry,\n targetEntry: WorkspaceFileEntry\n): boolean {\n return (\n movedEntry.kind !== \"unknown\" &&\n targetEntry.kind === \"directory\" &&\n movedEntry.path !== targetEntry.path &&\n !targetEntry.path.startsWith(`${movedEntry.path}/`)\n );\n}\n\nfunction TreeFeedbackRow({\n copy,\n depth,\n gridClassName,\n gridStyle,\n message,\n status,\n tableCellPaddingClassName\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n depth: number;\n gridClassName: string;\n gridStyle: CSSProperties;\n message?: string;\n status: \"empty\" | \"error\" | \"loading\";\n tableCellPaddingClassName: string;\n}): ReactElement {\n const resolvedMessage =\n status === \"loading\"\n ? copy.t(\"loading\")\n : status === \"empty\"\n ? copy.t(\"emptyDirectory\")\n : (message ?? copy.t(\"unknownErrorMessage\"));\n\n return (\n <div\n className={cn(\n \"grid min-h-9 w-full items-center gap-x-6 border-b border-[var(--border-1)] text-left text-xs text-[var(--text-tertiary)]\",\n gridClassName\n )}\n style={gridStyle}\n >\n <span className={tableCellPaddingClassName}>\n <span\n className=\"flex min-w-0 items-center gap-2\"\n style={workspaceFileManagerTreeIndentStyle(depth)}\n >\n <span className=\"size-5 shrink-0\" />\n {status === \"loading\" ? (\n <LoadingIcon className=\"size-3.5 shrink-0 animate-spin\" />\n ) : null}\n <span className=\"min-w-0 truncate\">{resolvedMessage}</span>\n </span>\n </span>\n <span aria-hidden=\"true\" />\n <span aria-hidden=\"true\" />\n </div>\n );\n}\n\nfunction DirectoryDisclosureButton({\n copy,\n entry,\n expanded,\n isLoading,\n show,\n onToggle\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n entry: WorkspaceFileEntry;\n expanded: boolean;\n isLoading: boolean;\n show: boolean;\n onToggle: (entry: WorkspaceFileEntry, expanded: boolean) => void;\n}): ReactElement {\n if (!show) {\n return <span aria-hidden=\"true\" className=\"size-5 shrink-0\" />;\n }\n\n return (\n <button\n aria-label={copy.t(\n expanded ? \"collapseFolderLabel\" : \"expandFolderLabel\"\n )}\n aria-expanded={expanded}\n className=\"pointer-events-auto grid size-5 shrink-0 place-items-center rounded text-[var(--text-tertiary)] transition-colors hover:bg-transparency-block hover:text-[var(--text-primary)]\"\n disabled={isLoading}\n type=\"button\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onToggle(entry, expanded);\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n >\n {isLoading ? (\n <LoadingIcon className=\"size-3 animate-spin\" />\n ) : (\n <ArrowRightIcon\n className={cn(\n \"size-3.5 transition-transform\",\n expanded && \"rotate-90\"\n )}\n />\n )}\n </button>\n );\n}\n\nfunction workspaceFileManagerTreeIndentStyle(depth: number): CSSProperties {\n return {\n paddingLeft: `${Math.max(0, depth) * 20}px`\n };\n}\n\nfunction EntryNameCell({\n contextLabel = null,\n copy,\n entry,\n iconUrlByCacheKey,\n inlineRenameValidation = null,\n isEnteringDirectory = false,\n isExpanded = false,\n isExpandable = false,\n isInlineRenaming = false,\n isLoadingChildren = false,\n isRenaming = false,\n treeDepth = 0,\n onEntryIconViewportLeave,\n onEntryIconViewportEnter,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename,\n onToggleDirectoryExpanded\n}: {\n contextLabel?: string | null;\n copy: WorkspaceFileManagerI18nRuntime;\n entry: WorkspaceFileEntry;\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n inlineRenameValidation?: WorkspaceFileManagerInlineRenameValidation | null;\n isEnteringDirectory?: boolean;\n isExpanded?: boolean;\n isExpandable?: boolean;\n isInlineRenaming?: boolean;\n isLoadingChildren?: boolean;\n isRenaming?: boolean;\n treeDepth?: number;\n onEntryIconViewportLeave?: (entry: WorkspaceFileEntry) => void;\n onEntryIconViewportEnter?: (entry: WorkspaceFileEntry) => void;\n onCancelInlineRename: () => void;\n onClearInlineRenameValidation: () => void;\n onConfirmInlineRename: (newName: string) => Promise<boolean>;\n onToggleDirectoryExpanded: (\n entry: WorkspaceFileEntry,\n expanded: boolean\n ) => void;\n}): ReactElement {\n const nameParts = splitWorkspaceFileName(entry.name);\n const hasFileExtension =\n nameParts.end.length > 0 && nameParts.end.startsWith(\".\");\n const [name, setName] = useState(entry.name);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const skipBlurRef = useRef(false);\n\n useEffect(() => {\n if (!isInlineRenaming) {\n return;\n }\n setName(entry.name);\n skipBlurRef.current = false;\n }, [entry.name, entry.path, isInlineRenaming]);\n\n useLayoutEffect(() => {\n if (!isInlineRenaming) {\n return;\n }\n const input = inputRef.current;\n if (!input) {\n return;\n }\n input.focus();\n if (hasFileExtension) {\n input.setSelectionRange(0, nameParts.start.length);\n } else {\n input.select();\n }\n }, [hasFileExtension, isInlineRenaming, nameParts.start.length]);\n\n const validationMessage =\n inlineRenameValidation === \"required\"\n ? copy.t(\"createNameRequired\")\n : inlineRenameValidation === \"invalid\"\n ? copy.t(\"createNameInvalid\")\n : null;\n\n const handleConfirm = useCallback(async (): Promise<void> => {\n const confirmed = await onConfirmInlineRename(name);\n if (!confirmed) {\n inputRef.current?.focus();\n }\n }, [name, onConfirmInlineRename]);\n\n if (isInlineRenaming) {\n return (\n <span\n className=\"flex min-w-0 items-center gap-1.5\"\n style={workspaceFileManagerTreeIndentStyle(treeDepth)}\n >\n <DirectoryDisclosureButton\n copy={copy}\n entry={entry}\n expanded={isExpanded}\n isLoading={isLoadingChildren}\n show={isExpandable}\n onToggle={onToggleDirectoryExpanded}\n />\n <WorkspaceFileEntryIcon\n entry={entry}\n frameClassName=\"size-7\"\n iconClassName=\"size-6\"\n iconUrlByCacheKey={iconUrlByCacheKey}\n onViewportLeave={onEntryIconViewportLeave}\n onViewportEnter={onEntryIconViewportEnter}\n />\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <input\n aria-invalid={inlineRenameValidation !== null}\n aria-label={copy.t(\"renameLabel\")}\n className={cn(\n \"min-w-0 max-w-full rounded-md border border-transparent bg-[var(--transparency-block)] px-1.5 py-0.5 text-sm text-[var(--text-primary)] outline-none transition-colors duration-200 selection:bg-[var(--transparency-active)] selection:text-[var(--text-primary)] hover:bg-[var(--transparency-hover)] focus:bg-[var(--transparency-hover)] focus-visible:border-transparent focus-visible:bg-[var(--transparency-hover)] disabled:bg-[var(--transparency-block)] disabled:text-[var(--text-disabled)] disabled:opacity-100\",\n inlineRenameValidation !== null && \"border-[var(--state-danger)]\"\n )}\n disabled={isRenaming}\n ref={inputRef}\n value={name}\n onBlur={() => {\n if (skipBlurRef.current) {\n skipBlurRef.current = false;\n return;\n }\n void handleConfirm();\n }}\n onChange={(event) => {\n setName(event.currentTarget.value);\n onClearInlineRenameValidation();\n }}\n onFocus={(event) => {\n if (hasFileExtension) {\n event.currentTarget.setSelectionRange(\n 0,\n nameParts.start.length\n );\n } else {\n event.currentTarget.select();\n }\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n void handleConfirm();\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n skipBlurRef.current = true;\n onCancelInlineRename();\n }\n }}\n />\n {validationMessage ? (\n <span className=\"text-xs text-[var(--state-danger)]\">\n {validationMessage}\n </span>\n ) : null}\n </span>\n </span>\n );\n }\n\n return (\n <span\n className=\"flex min-w-0 items-center gap-1.5\"\n style={workspaceFileManagerTreeIndentStyle(treeDepth)}\n >\n <DirectoryDisclosureButton\n copy={copy}\n entry={entry}\n expanded={isExpanded}\n isLoading={isLoadingChildren}\n show={isExpandable}\n onToggle={onToggleDirectoryExpanded}\n />\n <WorkspaceFileEntryIcon\n entry={entry}\n frameClassName=\"size-7\"\n iconClassName=\"size-6\"\n iconUrlByCacheKey={iconUrlByCacheKey}\n isEnteringDirectory={isEnteringDirectory}\n onViewportLeave={onEntryIconViewportLeave}\n onViewportEnter={onEntryIconViewportEnter}\n />\n <span className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"flex min-w-0 max-w-full overflow-hidden whitespace-nowrap text-sm\">\n <span className=\"min-w-0 overflow-hidden text-ellipsis\">\n {nameParts.start}\n </span>\n {nameParts.end ? (\n <span className=\"flex-none overflow-hidden text-ellipsis\">\n {nameParts.end}\n </span>\n ) : null}\n </span>\n {contextLabel ? (\n <span className=\"block max-w-full truncate text-[11px] leading-3 text-[var(--text-tertiary)]\">\n {contextLabel}\n </span>\n ) : null}\n </span>\n </span>\n );\n}\n\nfunction EntryIcon({\n className = \"size-4\",\n visualKind\n}: {\n className?: string;\n visualKind: ReturnType<typeof resolveWorkspaceFileVisualKind>;\n}): ReactElement {\n switch (visualKind) {\n case \"directory\":\n return <WorkspaceFolderFallbackIcon className={className} />;\n case \"image\":\n return <WorkspaceImageFallbackIcon className={className} />;\n case \"video\":\n return <VideoFileIcon className={className} />;\n case \"markdown\":\n case \"document\":\n return <FileTextIcon className={className} />;\n case \"code\":\n return <FileCodeIcon className={className} />;\n case \"binary\":\n return <FileTextIcon className={className} />;\n default:\n return <FileTextIcon className={className} />;\n }\n}\n\nfunction PreviewPane({\n copy,\n dateLocale,\n entry,\n previewState\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n dateLocale?: TuttiDateLocale;\n entry: WorkspaceFileEntry | null;\n previewState: WorkspaceFilePreviewState;\n}): ReactElement {\n if (!entry || previewState.status === \"empty\") {\n return (\n <div className=\"grid h-full min-h-[180px] place-items-center overflow-hidden p-8 text-center text-sm leading-5 text-[var(--text-tertiary)]\">\n <span className=\"max-w-[24ch] [overflow-wrap:anywhere]\">\n {copy.t(\"previewEmptyLabel\")}\n </span>\n </div>\n );\n }\n\n return (\n <>\n <PreviewSurface copy={copy} previewState={previewState} />\n <div className=\"flex min-w-0 flex-col gap-[14px]\">\n <div className=\"flex min-w-0 flex-col gap-[3px]\">\n <strong className=\"min-w-0 truncate text-[15px] font-semibold text-[var(--text-primary)]\">\n {entry.name}\n </strong>\n <p className=\"min-w-0 truncate text-xs text-[var(--text-secondary)]\">\n {entry.path}\n </p>\n </div>\n <dl className=\"border-t border-[var(--border-1)]\">\n <PreviewDetail\n label={copy.t(\"modifiedLabel\")}\n value={formatWorkspaceFileModifiedTime(entry.mtimeMs, dateLocale)}\n />\n <PreviewDetail\n label={copy.t(\"sizeLabel\")}\n value={\n entry.kind === \"directory\"\n ? \"--\"\n : formatWorkspaceFileBytes(entry.sizeBytes)\n }\n />\n </dl>\n </div>\n </>\n );\n}\n\nfunction PreviewSurface({\n copy,\n previewState\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n previewState: WorkspaceFilePreviewState;\n}): ReactElement {\n return (\n <SharedWorkspaceFilePreviewSurface<\n WorkspaceFileActivationTarget | WorkspaceFileEntry\n >\n directoryMessage={copy.t(\"previewDirectoryLabel\")}\n emptyMessage={copy.t(\"previewEmptyLabel\")}\n imageAlt={(entry) => entry.name}\n loadingIndicator={\n <span className=\"mx-auto grid size-11 place-items-center rounded-lg bg-[var(--transparency-block)]\">\n <LoadingIcon className=\"size-4 animate-spin\" />\n </span>\n }\n loadingMessage={copy.t(\"previewLoadingLabel\")}\n renderIcon={(entry) => (\n <EntryIcon\n className=\"mx-auto size-7\"\n visualKind={resolveWorkspaceFilePreviewIconKind(entry)}\n />\n )}\n state={previewState}\n variant=\"detail\"\n />\n );\n}\n\nfunction resolveWorkspaceFilePreviewIconKind(\n entry: WorkspaceFileActivationTarget | WorkspaceFileEntry\n): ReturnType<typeof resolveWorkspaceFileVisualKind> {\n if (\"kind\" in entry) {\n return resolveWorkspaceFileVisualKind(entry);\n }\n return entry.previewKind === \"image\"\n ? \"image\"\n : entry.previewKind === \"video\"\n ? \"video\"\n : \"document\";\n}\n\nfunction PreviewDetail({\n label,\n value\n}: {\n label: string;\n value: string;\n}): ReactElement {\n return (\n <div\n className=\"@max-[600px]/workspace-file-manager:grid-cols-1 @max-[600px]/workspace-file-manager:gap-0.5 grid gap-2.5 border-b border-[var(--border-1)] py-2.5 text-xs\"\n style={workspaceFileManagerPreviewDetailGridStyle}\n >\n <dt className=\"truncate text-[var(--text-secondary)]\">{label}</dt>\n <dd className=\"@max-[600px]/workspace-file-manager:text-left truncate text-right text-[var(--text-primary)]\">\n {value}\n </dd>\n </div>\n );\n}\n\nfunction FeedbackState({ message }: { message: string }): ReactElement {\n return (\n <div className=\"grid min-h-0 flex-1 place-items-center p-6 text-center text-sm text-[var(--text-tertiary)]\">\n <span className=\"max-w-[34ch] [overflow-wrap:anywhere]\">{message}</span>\n </div>\n );\n}\n","import { cn } from \"@tutti-os/ui-system\";\nimport type {\n DragEvent as ReactDragEvent,\n MouseEvent as ReactMouseEvent,\n PointerEvent as ReactPointerEvent,\n ReactElement\n} from \"react\";\nimport { useLayoutEffect, useRef } from \"react\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport { splitWorkspaceFileName } from \"../services/workspaceFileManagerModel.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileManagerInlineRenameValidation\n} from \"../services/workspaceFileManagerTypes.ts\";\nimport { WorkspaceFileEntryIcon } from \"./WorkspaceFileEntryIcon.tsx\";\nimport {\n workspaceFileManagerIconGridFrameClassName,\n workspaceFileManagerIconGridIconClassName,\n workspaceFileManagerIconGridLayout\n} from \"./workspaceFileManagerIconGridLayout.ts\";\n\nexport function WorkspaceFileManagerIconGrid({\n contextMenuEntryPath,\n copy,\n draggable,\n entries,\n iconUrlByCacheKey,\n inlineRenameEntryPath,\n inlineRenameValidation,\n isRenaming,\n moveDragActive,\n moveDragPreviewEntryPath,\n moveDragTargetEntryPath,\n pendingDirectoryPath,\n onEntryIconViewportLeave,\n onEntryIconViewportEnter,\n selectedPath,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename,\n onContextMenu,\n onDragStart,\n onEntryClick,\n onEntryPointerDown\n}: {\n contextMenuEntryPath: string | null;\n copy: WorkspaceFileManagerI18nRuntime;\n draggable: boolean;\n entries: readonly WorkspaceFileEntry[];\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n inlineRenameEntryPath: string | null;\n inlineRenameValidation: WorkspaceFileManagerInlineRenameValidation | null;\n isRenaming: boolean;\n moveDragActive: boolean;\n moveDragPreviewEntryPath: string | null;\n moveDragTargetEntryPath: string | null;\n pendingDirectoryPath: string | null;\n onEntryIconViewportLeave?: (entry: WorkspaceFileEntry) => void;\n onEntryIconViewportEnter?: (entry: WorkspaceFileEntry) => void;\n selectedPath: string | null;\n onCancelInlineRename: () => void;\n onClearInlineRenameValidation: () => void;\n onConfirmInlineRename: (newName: string) => Promise<boolean>;\n onContextMenu: (\n event: ReactMouseEvent<HTMLElement>,\n entry: WorkspaceFileEntry\n ) => void;\n onDragStart?: (entry: WorkspaceFileEntry, dataTransfer: DataTransfer) => void;\n onEntryClick: (entry: WorkspaceFileEntry) => void;\n onEntryPointerDown: (\n entry: WorkspaceFileEntry,\n event: ReactPointerEvent<HTMLElement>\n ) => void;\n}): ReactElement {\n return (\n <div\n className=\"grid auto-rows-min content-start items-start gap-x-2 gap-y-6 px-4 py-4\"\n style={{\n gridTemplateColumns: `repeat(auto-fill, minmax(${workspaceFileManagerIconGridLayout.tileMinWidthPx}px, 1fr))`\n }}\n >\n {entries.map((entry) => (\n <WorkspaceFileManagerIconTile\n key={entry.path}\n contextMenuActive={contextMenuEntryPath === entry.path}\n copy={copy}\n draggable={draggable}\n entry={entry}\n iconUrlByCacheKey={iconUrlByCacheKey}\n inlineRenameValidation={\n inlineRenameEntryPath === entry.path ? inlineRenameValidation : null\n }\n isEnteringDirectory={pendingDirectoryPath === entry.path}\n isInlineRenaming={inlineRenameEntryPath === entry.path}\n isRenaming={isRenaming}\n moveDragActive={moveDragActive}\n moveDragSource={moveDragPreviewEntryPath === entry.path}\n moveDragTarget={moveDragTargetEntryPath === entry.path}\n onEntryIconViewportLeave={onEntryIconViewportLeave}\n onEntryIconViewportEnter={onEntryIconViewportEnter}\n selected={selectedPath === entry.path}\n onCancelInlineRename={onCancelInlineRename}\n onClearInlineRenameValidation={onClearInlineRenameValidation}\n onConfirmInlineRename={onConfirmInlineRename}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onClick={onEntryClick}\n onPointerDown={onEntryPointerDown}\n />\n ))}\n </div>\n );\n}\n\nfunction WorkspaceFileManagerIconTile({\n contextMenuActive,\n copy,\n draggable,\n entry,\n iconUrlByCacheKey,\n inlineRenameValidation,\n isEnteringDirectory,\n isInlineRenaming,\n isRenaming,\n moveDragActive,\n moveDragSource,\n moveDragTarget,\n onEntryIconViewportLeave,\n onEntryIconViewportEnter,\n selected,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename,\n onContextMenu,\n onDragStart,\n onClick,\n onPointerDown\n}: {\n contextMenuActive: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n draggable: boolean;\n entry: WorkspaceFileEntry;\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n inlineRenameValidation: WorkspaceFileManagerInlineRenameValidation | null;\n isEnteringDirectory: boolean;\n isInlineRenaming: boolean;\n isRenaming: boolean;\n moveDragActive: boolean;\n moveDragSource: boolean;\n moveDragTarget: boolean;\n onEntryIconViewportLeave?: (entry: WorkspaceFileEntry) => void;\n onEntryIconViewportEnter?: (entry: WorkspaceFileEntry) => void;\n selected: boolean;\n onCancelInlineRename: () => void;\n onClearInlineRenameValidation: () => void;\n onConfirmInlineRename: (newName: string) => Promise<boolean>;\n onContextMenu: (\n event: ReactMouseEvent<HTMLElement>,\n entry: WorkspaceFileEntry\n ) => void;\n onDragStart?: (entry: WorkspaceFileEntry, dataTransfer: DataTransfer) => void;\n onClick: (entry: WorkspaceFileEntry) => void;\n onPointerDown: (\n entry: WorkspaceFileEntry,\n event: ReactPointerEvent<HTMLElement>\n ) => void;\n}): ReactElement {\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const nameParts = splitWorkspaceFileName(entry.name);\n\n useLayoutEffect(() => {\n if (!selected) {\n return;\n }\n buttonRef.current?.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\"\n });\n }, [selected]);\n\n const tileClassName = cn(\n \"flex min-w-0 max-w-[148px] flex-col items-center gap-1.5 rounded-md border border-transparent px-2 py-2 text-center transition-colors\",\n isInlineRenaming\n ? \"cursor-default\"\n : \"cursor-pointer hover:bg-transparency-hover active:bg-[var(--transparency-active)]\",\n moveDragActive && \"cursor-grabbing\",\n selected || contextMenuActive || isInlineRenaming\n ? \"border-[var(--border-focus)] bg-transparency-block text-[var(--text-primary)]\"\n : \"text-[var(--text-secondary)]\",\n moveDragSource && \"opacity-55\",\n moveDragTarget &&\n \"bg-[var(--accent-bg)] text-[var(--text-primary)] outline outline-1 -outline-offset-1 outline-[var(--border-focus)]\"\n );\n\n const iconGraphic = (\n <WorkspaceFileEntryIcon\n entry={entry}\n frameClassName={workspaceFileManagerIconGridFrameClassName()}\n iconClassName={workspaceFileManagerIconGridIconClassName()}\n iconUrlByCacheKey={iconUrlByCacheKey}\n isEnteringDirectory={isEnteringDirectory}\n loadingIconClassName=\"size-7\"\n onViewportLeave={onEntryIconViewportLeave}\n onViewportEnter={onEntryIconViewportEnter}\n />\n );\n\n if (isInlineRenaming) {\n return (\n <div\n aria-label={entry.name}\n className={tileClassName}\n data-workspace-file-entry-path={entry.path}\n >\n {iconGraphic}\n <IconTileRenameInput\n copy={copy}\n entry={entry}\n inlineRenameValidation={inlineRenameValidation}\n isRenaming={isRenaming}\n onCancelInlineRename={onCancelInlineRename}\n onClearInlineRenameValidation={onClearInlineRenameValidation}\n onConfirmInlineRename={onConfirmInlineRename}\n />\n </div>\n );\n }\n\n return (\n <button\n aria-label={entry.name}\n className={tileClassName}\n data-workspace-file-entry-path={entry.path}\n draggable={draggable}\n ref={buttonRef}\n type=\"button\"\n onClick={() => {\n onClick(entry);\n }}\n onContextMenu={(event) => {\n onContextMenu(event, entry);\n }}\n onDragStart={(event: ReactDragEvent<HTMLElement>) => {\n if (!draggable) {\n event.preventDefault();\n return;\n }\n onDragStart?.(entry, event.dataTransfer);\n }}\n onPointerDown={(event) => {\n onPointerDown(entry, event);\n }}\n >\n {iconGraphic}\n <span className=\"line-clamp-2 w-full break-all text-[13px] leading-[18px] text-[var(--text-primary)]\">\n <span>{nameParts.start}</span>\n {nameParts.end ? <span>{nameParts.end}</span> : null}\n </span>\n </button>\n );\n}\n\nfunction IconTileRenameInput({\n copy,\n entry,\n inlineRenameValidation,\n isRenaming,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n entry: WorkspaceFileEntry;\n inlineRenameValidation: WorkspaceFileManagerInlineRenameValidation | null;\n isRenaming: boolean;\n onCancelInlineRename: () => void;\n onClearInlineRenameValidation: () => void;\n onConfirmInlineRename: (newName: string) => Promise<boolean>;\n}): ReactElement {\n const nameParts = splitWorkspaceFileName(entry.name);\n const hasFileExtension =\n nameParts.end.length > 0 && nameParts.end.startsWith(\".\");\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n useLayoutEffect(() => {\n const input = inputRef.current;\n if (!input) {\n return;\n }\n input.focus();\n if (hasFileExtension) {\n input.setSelectionRange(0, nameParts.start.length);\n } else {\n input.select();\n }\n }, [hasFileExtension, nameParts.start.length]);\n\n const validationMessage =\n inlineRenameValidation === \"required\"\n ? copy.t(\"createNameRequired\")\n : inlineRenameValidation === \"invalid\"\n ? copy.t(\"createNameInvalid\")\n : null;\n\n return (\n <span className=\"flex w-full min-w-0 flex-col gap-0.5\">\n <input\n aria-invalid={inlineRenameValidation !== null}\n aria-label={copy.t(\"renameLabel\")}\n className={cn(\n \"w-full min-w-0 rounded-[4px] border border-transparent bg-[var(--transparency-block)] px-1 py-0.5 text-center text-xs text-[var(--text-primary)] outline-none\",\n inlineRenameValidation !== null && \"border-[var(--state-danger)]\"\n )}\n defaultValue={entry.name}\n disabled={isRenaming}\n ref={inputRef}\n onBlur={(event) => {\n void onConfirmInlineRename(event.currentTarget.value);\n }}\n onChange={() => {\n onClearInlineRenameValidation();\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n void onConfirmInlineRename(event.currentTarget.value);\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n onCancelInlineRename();\n }\n }}\n />\n {validationMessage ? (\n <span className=\"text-[10px] leading-3 text-[var(--state-danger)]\">\n {validationMessage}\n </span>\n ) : null}\n </span>\n );\n}\n","import {\n FileArchiveIcon,\n FileCodeIcon,\n FileTextIcon,\n FolderFilledIcon,\n ImageFileIcon,\n LoadingIcon,\n VideoFileIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { ReactElement } from \"react\";\nimport { useEffect, useRef } from \"react\";\nimport {\n resolveWorkspaceFileExtension,\n resolveWorkspaceFileVisualKind\n} from \"@tutti-os/workspace-file-preview\";\nimport type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\nimport {\n resolveWorkspaceFileEntryIconCacheKey,\n isWorkspaceApplicationBundle,\n shouldUseWorkspaceFileArchiveIcon,\n shouldUseWorkspaceFileExtensionDocumentIcon\n} from \"./workspaceFileEntryIconPolicy.ts\";\n\nexport function WorkspaceFileEntryIcon({\n entry,\n frameClassName,\n iconClassName = \"size-4\",\n iconUrlByCacheKey,\n isEnteringDirectory = false,\n loadingIconClassName,\n onViewportLeave,\n onViewportEnter\n}: {\n entry: WorkspaceFileEntry;\n frameClassName?: string;\n iconClassName?: string;\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n isEnteringDirectory?: boolean;\n loadingIconClassName?: string;\n onViewportLeave?: (entry: WorkspaceFileEntry) => void;\n onViewportEnter?: (entry: WorkspaceFileEntry) => void;\n}): ReactElement {\n const visualKind = resolveWorkspaceFileVisualKind(entry);\n const isAppBundle = isWorkspaceApplicationBundle(entry);\n const cacheKey = resolveWorkspaceFileEntryIconCacheKey(entry);\n const iconUrl = iconUrlByCacheKey?.get(cacheKey) ?? null;\n const frameRef = useRef<HTMLSpanElement | null>(null);\n const visibleEntryRef = useRef<WorkspaceFileEntry | null>(null);\n const visibleEntryCacheKeyRef = useRef<string | null>(null);\n\n useEffect(() => {\n function reportViewportLeave(): void {\n const visibleEntry = visibleEntryRef.current;\n if (!visibleEntry) {\n return;\n }\n visibleEntryRef.current = null;\n visibleEntryCacheKeyRef.current = null;\n onViewportLeave?.(visibleEntry);\n }\n\n function reportViewportEnter(): void {\n if (visibleEntryCacheKeyRef.current === cacheKey) {\n return;\n }\n reportViewportLeave();\n visibleEntryRef.current = entry;\n visibleEntryCacheKeyRef.current = cacheKey;\n onViewportEnter?.(entry);\n }\n\n if (!onViewportEnter || isEnteringDirectory) {\n reportViewportLeave();\n return;\n }\n\n const element = frameRef.current;\n if (!element || typeof IntersectionObserver === \"undefined\") {\n reportViewportEnter();\n return () => {\n reportViewportLeave();\n };\n }\n\n const viewportRoot = resolveWorkspaceFileEntryIconViewport(element);\n const observer = new IntersectionObserver(\n (records) => {\n const intersecting = records.some(\n (record) => record.isIntersecting && record.intersectionRatio > 0\n );\n if (intersecting) {\n reportViewportEnter();\n return;\n }\n reportViewportLeave();\n },\n { root: viewportRoot, rootMargin: \"0px\", threshold: 0 }\n );\n observer.observe(element);\n const initiallyVisible = isWorkspaceFileEntryIconVisible(\n element,\n viewportRoot\n );\n if (initiallyVisible) {\n reportViewportEnter();\n } else {\n reportViewportLeave();\n }\n return () => {\n observer.disconnect();\n reportViewportLeave();\n };\n }, [cacheKey, entry, isEnteringDirectory, onViewportLeave, onViewportEnter]);\n\n return (\n <span\n ref={frameRef}\n className={cn(\n \"grid flex-none place-items-center overflow-hidden\",\n frameClassName,\n isEnteringDirectory\n ? \"text-[var(--text-tertiary)]\"\n : entryIconColorClassName(visualKind, isAppBundle)\n )}\n >\n {isEnteringDirectory ? (\n <LoadingIcon\n className={cn(loadingIconClassName ?? iconClassName, \"animate-spin\")}\n />\n ) : iconUrl ? (\n <img\n alt=\"\"\n className={cn(\n iconClassName,\n visualKind === \"image\"\n ? \"rounded-[6px] border border-[var(--border-1)] bg-[var(--transparency-block)] object-contain\"\n : \"rounded-[4px] object-contain\"\n )}\n decoding=\"async\"\n draggable={false}\n loading=\"lazy\"\n src={iconUrl}\n />\n ) : (\n <DefaultEntryIcon\n entry={entry}\n iconClassName={iconClassName}\n visualKind={visualKind}\n />\n )}\n </span>\n );\n}\n\nfunction resolveWorkspaceFileEntryIconViewport(\n element: HTMLElement\n): HTMLElement | null {\n return element.closest<HTMLElement>('[data-slot=\"scroll-area-viewport\"]');\n}\n\nfunction isWorkspaceFileEntryIconVisible(\n element: HTMLElement,\n viewportRoot: HTMLElement | null\n): boolean {\n const elementRect = element.getBoundingClientRect();\n const viewportRect =\n viewportRoot?.getBoundingClientRect() ??\n ({\n bottom: window.innerHeight,\n left: 0,\n right: window.innerWidth,\n top: 0\n } satisfies Pick<DOMRect, \"bottom\" | \"left\" | \"right\" | \"top\">);\n\n return (\n elementRect.bottom > viewportRect.top &&\n elementRect.top < viewportRect.bottom &&\n elementRect.right > viewportRect.left &&\n elementRect.left < viewportRect.right\n );\n}\n\nfunction DefaultEntryIcon({\n entry,\n iconClassName,\n visualKind\n}: {\n entry: WorkspaceFileEntry;\n iconClassName: string;\n visualKind: ReturnType<typeof resolveWorkspaceFileVisualKind>;\n}): ReactElement {\n const vectorIconClassName = vectorFallbackIconClassName(iconClassName);\n if (isWorkspaceApplicationBundle(entry)) {\n return <FileTextIcon className={vectorIconClassName} />;\n }\n if (shouldUseWorkspaceFileArchiveIcon(entry)) {\n return <WorkspaceArchiveFallbackIcon className={iconClassName} />;\n }\n if (shouldUseWorkspaceFileExtensionDocumentIcon(entry)) {\n return (\n <ExtensionDocumentIcon\n entry={entry}\n iconClassName={vectorIconClassName}\n />\n );\n }\n\n switch (visualKind) {\n case \"directory\":\n return <WorkspaceFolderFallbackIcon className={iconClassName} />;\n case \"image\":\n return <WorkspaceImageFallbackIcon className={iconClassName} />;\n case \"video\":\n return <VideoFileIcon className={vectorIconClassName} />;\n case \"markdown\":\n case \"document\":\n return <FileTextIcon className={vectorIconClassName} />;\n case \"code\":\n return <FileCodeIcon className={vectorIconClassName} />;\n case \"binary\":\n return <FileTextIcon className={vectorIconClassName} />;\n default:\n return <FileTextIcon className={vectorIconClassName} />;\n }\n}\n\nfunction vectorFallbackIconClassName(iconClassName: string): string {\n return iconClassName.includes(\"size-[84px]\") ? \"size-[64px]\" : iconClassName;\n}\n\nexport function WorkspaceFolderFallbackIcon({\n className\n}: {\n className: string;\n}): ReactElement {\n return (\n <FolderFilledIcon className={vectorFallbackIconClassName(className)} />\n );\n}\n\nexport function WorkspaceArchiveFallbackIcon({\n className\n}: {\n className: string;\n}): ReactElement {\n return <FileArchiveIcon className={vectorFallbackIconClassName(className)} />;\n}\n\nexport function WorkspaceImageFallbackIcon({\n className\n}: {\n className: string;\n}): ReactElement {\n return <ImageFileIcon className={vectorFallbackIconClassName(className)} />;\n}\n\nfunction ExtensionDocumentIcon({\n entry,\n iconClassName\n}: {\n entry: WorkspaceFileEntry;\n iconClassName: string;\n}): ReactElement {\n const extension = resolveWorkspaceFileExtension(entry.name)\n .slice(0, 5)\n .toUpperCase();\n const showExtension =\n extension.length > 0 && !iconClassName.includes(\"size-4\");\n\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\"relative inline-block overflow-visible\", iconClassName)}\n >\n <span className=\"absolute inset-[5%] rounded-[6px] border border-black/10 bg-linear-to-br from-white via-[#f8f8f8] to-[#ececec]\" />\n <span className=\"absolute top-[5%] right-[5%] h-[28%] w-[28%] overflow-hidden rounded-tr-[6px]\">\n <span className=\"absolute top-0 right-0 h-full w-full origin-top-right -skew-x-3 rounded-bl-[4px] border-b border-l border-black/10 bg-linear-to-br from-white to-[#d9d9d9]\" />\n </span>\n {showExtension ? (\n <span className=\"absolute right-[12%] bottom-[14%] left-[12%] truncate text-center text-[10px] leading-none font-semibold tracking-wide text-[#7a7a7a]\">\n {extension}\n </span>\n ) : null}\n </span>\n );\n}\n\nfunction entryIconColorClassName(\n visualKind: ReturnType<typeof resolveWorkspaceFileVisualKind>,\n isAppBundle: boolean\n): string {\n if (isAppBundle) {\n return \"text-[var(--text-tertiary)]\";\n }\n return visualKind === \"directory\"\n ? \"text-[var(--rich-text-mention-file)]\"\n : \"text-[var(--text-tertiary)]\";\n}\n","// Give image thumbnails enough room to be recognizable while keeping dense rows.\nconst workspaceFileManagerIconGridIconSizePx = 84;\nconst workspaceFileManagerIconGridTileMinWidthPx = 136;\nconst workspaceFileManagerIconGridTileMaxWidthPx = 148;\n\nexport const workspaceFileManagerIconGridLayout = {\n iconSizePx: workspaceFileManagerIconGridIconSizePx,\n tileMaxWidthPx: workspaceFileManagerIconGridTileMaxWidthPx,\n tileMinWidthPx: workspaceFileManagerIconGridTileMinWidthPx\n} as const;\n\nexport function workspaceFileManagerIconGridIconClassName(): string {\n return \"size-[84px]\";\n}\n\nexport function workspaceFileManagerIconGridFrameClassName(): string {\n return \"size-[92px]\";\n}\n","export const workspaceFileManagerSidebarDefaultWidth = 460;\nexport const workspaceFileManagerSidebarMinWidth = 180;\nexport const workspaceFileManagerContentMinWidth = 580;\nexport const workspaceFileManagerContentWithoutPreviewMinWidth = 320;\nexport const workspaceFileManagerPaneResizeStep = 24;\nexport const workspaceFileManagerPreviewDefaultWidth = 348;\nexport const workspaceFileManagerSidebarWidthStorageKey =\n \"tutti.workspace-file-manager.sidebar-width\";\nexport const workspaceFileManagerPreviewWidthStorageKey =\n \"tutti.workspace-file-manager.preview-width\";\n\nexport function readWorkspaceFileManagerSidebarWidth(): number {\n return readWorkspaceFileManagerPaneWidth(\n workspaceFileManagerSidebarWidthStorageKey,\n workspaceFileManagerSidebarDefaultWidth\n );\n}\n\nexport function writeWorkspaceFileManagerSidebarWidth(width: number): void {\n writeWorkspaceFileManagerPaneWidth(\n workspaceFileManagerSidebarWidthStorageKey,\n width\n );\n}\n\nexport function readWorkspaceFileManagerPreviewWidth(): number {\n return readWorkspaceFileManagerPaneWidth(\n workspaceFileManagerPreviewWidthStorageKey,\n workspaceFileManagerPreviewDefaultWidth\n );\n}\n\nexport function writeWorkspaceFileManagerPreviewWidth(width: number): void {\n writeWorkspaceFileManagerPaneWidth(\n workspaceFileManagerPreviewWidthStorageKey,\n width\n );\n}\n\nexport function clampWorkspaceFileManagerSidebarWidth(input: {\n containerWidth: number;\n contentMinWidth?: number;\n width: number;\n}): number {\n const contentMinWidth = resolveWorkspaceFileManagerContentMinWidth(\n input.contentMinWidth\n );\n const containerWidth = Number.isFinite(input.containerWidth)\n ? input.containerWidth\n : workspaceFileManagerSidebarMinWidth + contentMinWidth;\n const maxWidth = Math.max(\n workspaceFileManagerSidebarMinWidth,\n containerWidth - contentMinWidth\n );\n const width = Number.isFinite(input.width)\n ? input.width\n : workspaceFileManagerSidebarDefaultWidth;\n\n return Math.round(\n Math.min(maxWidth, Math.max(workspaceFileManagerSidebarMinWidth, width))\n );\n}\n\nexport function resolveWorkspaceFileManagerSidebarMaxWidth(\n containerWidth: number,\n contentMinWidth?: number\n): number {\n const resolvedContentMinWidth =\n resolveWorkspaceFileManagerContentMinWidth(contentMinWidth);\n const resolvedContainerWidth = Number.isFinite(containerWidth)\n ? containerWidth\n : workspaceFileManagerSidebarMinWidth + resolvedContentMinWidth;\n return Math.round(\n Math.max(\n workspaceFileManagerSidebarMinWidth,\n resolvedContainerWidth - resolvedContentMinWidth\n )\n );\n}\n\nfunction resolveWorkspaceFileManagerContentMinWidth(\n contentMinWidth: number | undefined\n): number {\n return typeof contentMinWidth === \"number\" &&\n Number.isFinite(contentMinWidth) &&\n contentMinWidth > 0\n ? contentMinWidth\n : workspaceFileManagerContentMinWidth;\n}\n\nfunction readWorkspaceFileManagerPaneWidth(\n storageKey: string,\n defaultWidth: number\n): number {\n if (typeof window === \"undefined\") {\n return defaultWidth;\n }\n\n const storedWidth = Number(window.localStorage.getItem(storageKey));\n return Number.isFinite(storedWidth) && storedWidth > 0\n ? storedWidth\n : defaultWidth;\n}\n\nfunction writeWorkspaceFileManagerPaneWidth(\n storageKey: string,\n width: number\n): void {\n if (typeof window === \"undefined\" || !Number.isFinite(width) || width <= 0) {\n return;\n }\n\n window.localStorage.setItem(storageKey, String(width));\n}\n","export const workspaceFileManagerTableNameMinWidth = 240;\nexport const workspaceFileManagerTableNameMinWidthProperty =\n \"--workspace-file-manager-table-name-min-width\";\nexport const workspaceFileManagerTableNameColumnSelector =\n \"[data-workspace-file-manager-name-column]\";\n\nconst workspaceFileManagerTableNameMinWidthExpression = `var(${workspaceFileManagerTableNameMinWidthProperty}, ${workspaceFileManagerTableNameMinWidth}px)`;\n\nexport const workspaceFileManagerTableGridClassName =\n \"grid-cols-[minmax(240px,_1fr)_minmax(0,_148px)_minmax(0,_96px)]\";\nexport const workspaceFileManagerTableGridTemplate = `minmax(${workspaceFileManagerTableNameMinWidthExpression}, 1fr) minmax(0, 148px) minmax(0, 96px)`;\n\nexport const workspaceFileManagerCompactTableGridClassName =\n \"grid-cols-[minmax(240px,_1fr)_minmax(0,_96px)_minmax(0,_72px)]\";\nexport const workspaceFileManagerCompactTableGridTemplate = `minmax(${workspaceFileManagerTableNameMinWidthExpression}, 1fr) minmax(0, 96px) minmax(0, 72px)`;\n\nexport function resolveWorkspaceFileManagerPreservedNameColumnWidth(\n width: number\n): number {\n const resolvedWidth = Number.isFinite(width)\n ? Math.round(width)\n : workspaceFileManagerTableNameMinWidth;\n return Math.max(workspaceFileManagerTableNameMinWidth, resolvedWidth);\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\nimport {\n resolveWorkspaceFileEntryIconCacheKey,\n shouldResolveWorkspaceFileEntryIcon\n} from \"./workspaceFileEntryIconPolicy.ts\";\nimport {\n createWorkspaceFileEntryIconUrlQueue,\n type WorkspaceFileEntryIconUrlResolver\n} from \"./workspaceFileEntryIconUrlQueue.ts\";\n\nfunction buildIconTargetSignature(\n entries: readonly WorkspaceFileEntry[],\n options: { includeImageThumbnails?: boolean }\n): string {\n return entries\n .filter((entry) => shouldResolveWorkspaceFileEntryIcon(entry, options))\n .map((entry) => resolveWorkspaceFileEntryIconCacheKey(entry))\n .join(\"\\0\");\n}\n\nexport function useWorkspaceFileEntryIconUrls(input: {\n entries: readonly WorkspaceFileEntry[];\n includeImageThumbnails?: boolean;\n resolveEntryIconUrl?: WorkspaceFileEntryIconUrlResolver;\n}): {\n iconUrlByCacheKey: ReadonlyMap<string, string | null>;\n reportEntryIconViewportEnter: (entry: WorkspaceFileEntry) => void;\n reportEntryIconViewportLeave: (entry: WorkspaceFileEntry) => void;\n} {\n const { entries, includeImageThumbnails, resolveEntryIconUrl } = input;\n const queue = useMemo(\n () =>\n createWorkspaceFileEntryIconUrlQueue({\n includeImageThumbnails,\n resolveEntryIconUrl\n }),\n [includeImageThumbnails, resolveEntryIconUrl]\n );\n const [iconUrlByCacheKey, setIconUrlByCacheKey] = useState<\n ReadonlyMap<string, string | null>\n >(() => queue.snapshot());\n const iconTargetSignature = useMemo(\n () => buildIconTargetSignature(entries, { includeImageThumbnails }),\n [entries, includeImageThumbnails]\n );\n\n useEffect(() => {\n queue.activate();\n return () => {\n queue.dispose();\n };\n }, [queue]);\n\n useEffect(() => {\n queue.retainEntries(entries);\n }, [entries, iconTargetSignature, queue]);\n\n useEffect(() => {\n setIconUrlByCacheKey(queue.snapshot());\n return queue.subscribe(() => {\n setIconUrlByCacheKey(queue.snapshot());\n });\n }, [queue]);\n\n const reportEntryIconViewportEnter = useCallback(\n (entry: WorkspaceFileEntry) => {\n queue.enterViewport(entry);\n },\n [queue]\n );\n\n const reportEntryIconViewportLeave = useCallback(\n (entry: WorkspaceFileEntry) => {\n queue.leaveViewport(entry);\n },\n [queue]\n );\n\n return {\n iconUrlByCacheKey,\n reportEntryIconViewportEnter,\n reportEntryIconViewportLeave\n };\n}\n","import type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\nimport {\n resolveWorkspaceFileEntryIconCacheKey,\n shouldResolveWorkspaceFileEntryIcon\n} from \"./workspaceFileEntryIconPolicy.ts\";\n\nexport type WorkspaceFileEntryIconUrlResolver = (\n entry: WorkspaceFileEntry\n) => Promise<string | null | undefined>;\n\nexport interface WorkspaceFileEntryIconUrlQueueOptions {\n includeImageThumbnails?: boolean;\n maxConcurrent?: number;\n resolveEntryIconUrl?: WorkspaceFileEntryIconUrlResolver;\n}\n\nexport interface WorkspaceFileEntryIconUrlQueue {\n activate(): void;\n dispose(): void;\n enterViewport(entry: WorkspaceFileEntry): void;\n leaveViewport(entry: WorkspaceFileEntry): void;\n retainEntries(entries: readonly WorkspaceFileEntry[]): void;\n snapshot(): ReadonlyMap<string, string | null>;\n subscribe(listener: () => void): () => void;\n}\n\nconst defaultMaxConcurrentIconRequests = 3;\nconst imageThumbnailCacheKeyPrefix = \"image-thumbnail:\";\n\nfunction shouldKeepResolvedIconAfterViewportLeave(cacheKey: string): boolean {\n return cacheKey.startsWith(imageThumbnailCacheKeyPrefix);\n}\n\nexport function createWorkspaceFileEntryIconUrlQueue(\n options: WorkspaceFileEntryIconUrlQueueOptions\n): WorkspaceFileEntryIconUrlQueue {\n const maxConcurrent = Math.max(\n 1,\n Math.floor(options.maxConcurrent ?? defaultMaxConcurrentIconRequests)\n );\n const iconUrlByCacheKey = new Map<string, string | null>();\n const inFlightCacheKeys = new Set<string>();\n const listeners = new Set<() => void>();\n const queuedEntries = new Map<string, WorkspaceFileEntry>();\n const visibleReferenceCountByCacheKey = new Map<string, number>();\n let activeCount = 0;\n let disposed = false;\n let retainedCacheKeys: ReadonlySet<string> | null = null;\n const policyOptions = {\n includeImageThumbnails: options.includeImageThumbnails\n };\n\n function publish(): void {\n for (const listener of listeners) {\n listener();\n }\n }\n\n function isRetained(cacheKey: string): boolean {\n return retainedCacheKeys === null || retainedCacheKeys.has(cacheKey);\n }\n\n function isVisible(cacheKey: string): boolean {\n return (visibleReferenceCountByCacheKey.get(cacheKey) ?? 0) > 0;\n }\n\n function shouldResolveCacheKey(cacheKey: string): boolean {\n return (\n isVisible(cacheKey) || shouldKeepResolvedIconAfterViewportLeave(cacheKey)\n );\n }\n\n function retainVisibleReference(cacheKey: string): void {\n visibleReferenceCountByCacheKey.set(\n cacheKey,\n (visibleReferenceCountByCacheKey.get(cacheKey) ?? 0) + 1\n );\n }\n\n function releaseVisibleReference(cacheKey: string): void {\n const nextCount = (visibleReferenceCountByCacheKey.get(cacheKey) ?? 0) - 1;\n if (nextCount > 0) {\n visibleReferenceCountByCacheKey.set(cacheKey, nextCount);\n return;\n }\n\n visibleReferenceCountByCacheKey.delete(cacheKey);\n if (shouldKeepResolvedIconAfterViewportLeave(cacheKey)) {\n return;\n }\n\n queuedEntries.delete(cacheKey);\n const hadCachedIcon = iconUrlByCacheKey.delete(cacheKey);\n if (hadCachedIcon) {\n publish();\n }\n }\n\n function drain(): void {\n if (disposed || !options.resolveEntryIconUrl) {\n return;\n }\n\n while (activeCount < maxConcurrent && queuedEntries.size > 0) {\n const next = queuedEntries.entries().next().value;\n if (!next) {\n return;\n }\n\n const [cacheKey, entry] = next;\n queuedEntries.delete(cacheKey);\n if (\n !shouldResolveCacheKey(cacheKey) ||\n iconUrlByCacheKey.has(cacheKey) ||\n inFlightCacheKeys.has(cacheKey)\n ) {\n continue;\n }\n\n activeCount += 1;\n inFlightCacheKeys.add(cacheKey);\n\n void options\n .resolveEntryIconUrl(entry)\n .then((iconUrl) => {\n const shouldStore =\n !disposed &&\n isRetained(cacheKey) &&\n shouldResolveCacheKey(cacheKey);\n if (shouldStore) {\n iconUrlByCacheKey.set(cacheKey, iconUrl?.trim() || null);\n publish();\n }\n })\n .catch(() => {\n const shouldStore =\n !disposed &&\n isRetained(cacheKey) &&\n shouldResolveCacheKey(cacheKey);\n if (shouldStore) {\n iconUrlByCacheKey.set(cacheKey, null);\n publish();\n }\n })\n .finally(() => {\n activeCount -= 1;\n inFlightCacheKeys.delete(cacheKey);\n drain();\n });\n }\n }\n\n return {\n activate(): void {\n disposed = false;\n },\n dispose(): void {\n disposed = true;\n queuedEntries.clear();\n visibleReferenceCountByCacheKey.clear();\n listeners.clear();\n },\n leaveViewport(entry): void {\n if (\n disposed ||\n !shouldResolveWorkspaceFileEntryIcon(entry, policyOptions)\n ) {\n return;\n }\n\n const cacheKey = resolveWorkspaceFileEntryIconCacheKey(entry);\n releaseVisibleReference(cacheKey);\n },\n enterViewport(entry): void {\n if (\n disposed ||\n !options.resolveEntryIconUrl ||\n !shouldResolveWorkspaceFileEntryIcon(entry, policyOptions)\n ) {\n return;\n }\n\n const cacheKey = resolveWorkspaceFileEntryIconCacheKey(entry);\n retainVisibleReference(cacheKey);\n if (\n iconUrlByCacheKey.has(cacheKey) ||\n inFlightCacheKeys.has(cacheKey) ||\n queuedEntries.has(cacheKey)\n ) {\n return;\n }\n\n queuedEntries.set(cacheKey, entry);\n drain();\n },\n retainEntries(entries): void {\n retainedCacheKeys = new Set(\n entries\n .filter((entry) =>\n shouldResolveWorkspaceFileEntryIcon(entry, policyOptions)\n )\n .map((entry) => resolveWorkspaceFileEntryIconCacheKey(entry))\n );\n let changed = false;\n for (const cacheKey of iconUrlByCacheKey.keys()) {\n if (!isRetained(cacheKey)) {\n iconUrlByCacheKey.delete(cacheKey);\n changed = true;\n continue;\n }\n if (iconUrlByCacheKey.get(cacheKey) === null) {\n iconUrlByCacheKey.delete(cacheKey);\n changed = true;\n }\n }\n for (const cacheKey of queuedEntries.keys()) {\n if (!isRetained(cacheKey)) {\n queuedEntries.delete(cacheKey);\n }\n }\n for (const cacheKey of visibleReferenceCountByCacheKey.keys()) {\n if (!isRetained(cacheKey)) {\n visibleReferenceCountByCacheKey.delete(cacheKey);\n }\n }\n if (changed) {\n publish();\n }\n },\n snapshot(): ReadonlyMap<string, string | null> {\n return new Map(iconUrlByCacheKey);\n },\n subscribe(listener): () => void {\n if (disposed) {\n return () => {};\n }\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n };\n}\n","import type {\n WorkspaceFileDirectoryExpansionState,\n WorkspaceFileEntry\n} from \"../services/workspaceFileManagerTypes.ts\";\nimport {\n sortWorkspaceFileEntriesForArrangeMode,\n type WorkspaceFileManagerArrangeMode\n} from \"./workspaceFileManagerArrangeMode.ts\";\n\nexport type WorkspaceFileManagerVisibleTreeRow =\n | {\n depth: number;\n entry: WorkspaceFileEntry;\n expanded: boolean;\n expandable: boolean;\n kind: \"entry\";\n loadingChildren: boolean;\n }\n | {\n depth: number;\n key: string;\n kind: \"feedback\";\n parentPath: string;\n status: \"empty\" | \"error\" | \"loading\";\n message?: string;\n };\n\nexport function buildWorkspaceFileManagerVisibleTreeRows(input: {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n directoryExpansionByPath: Record<\n string,\n WorkspaceFileDirectoryExpansionState\n >;\n entries: readonly WorkspaceFileEntry[];\n expandedDirectoryPaths: Record<string, boolean>;\n}): WorkspaceFileManagerVisibleTreeRow[] {\n return appendWorkspaceFileManagerVisibleTreeRows({\n ...input,\n depth: 0\n });\n}\n\nexport function collectWorkspaceFileManagerVisibleTreeEntries(\n rows: readonly WorkspaceFileManagerVisibleTreeRow[]\n): WorkspaceFileEntry[] {\n return rows.flatMap((row) => (row.kind === \"entry\" ? [row.entry] : []));\n}\n\nfunction appendWorkspaceFileManagerVisibleTreeRows(input: {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n depth: number;\n directoryExpansionByPath: Record<\n string,\n WorkspaceFileDirectoryExpansionState\n >;\n entries: readonly WorkspaceFileEntry[];\n expandedDirectoryPaths: Record<string, boolean>;\n}): WorkspaceFileManagerVisibleTreeRow[] {\n const sortedEntries = sortWorkspaceFileEntriesForArrangeMode(\n input.entries,\n input.arrangeMode\n );\n const rows: WorkspaceFileManagerVisibleTreeRow[] = [];\n\n for (const entry of sortedEntries) {\n const expandable = entry.kind === \"directory\" && entry.hasChildren;\n const expanded = expandable\n ? input.expandedDirectoryPaths[entry.path] === true\n : false;\n const childState = input.directoryExpansionByPath[entry.path];\n rows.push({\n depth: input.depth,\n entry,\n expanded,\n expandable,\n kind: \"entry\",\n loadingChildren: childState?.isLoading ?? false\n });\n\n if (!expanded) {\n continue;\n }\n\n if (!childState || childState.isLoading) {\n rows.push({\n depth: input.depth + 1,\n key: `${entry.path}:loading`,\n kind: \"feedback\",\n parentPath: entry.path,\n status: \"loading\"\n });\n continue;\n }\n\n if (childState.error) {\n rows.push({\n depth: input.depth + 1,\n key: `${entry.path}:error`,\n kind: \"feedback\",\n message: childState.error,\n parentPath: entry.path,\n status: \"error\"\n });\n continue;\n }\n\n if (childState.loaded && childState.entries.length === 0) {\n rows.push({\n depth: input.depth + 1,\n key: `${entry.path}:empty`,\n kind: \"feedback\",\n parentPath: entry.path,\n status: \"empty\"\n });\n continue;\n }\n\n rows.push(\n ...appendWorkspaceFileManagerVisibleTreeRows({\n ...input,\n depth: input.depth + 1,\n entries: childState.entries\n })\n );\n }\n\n return rows;\n}\n","import {\n ArrowLeftIcon,\n ArrowRightIcon,\n Button,\n ChevronDownIcon,\n CloseIcon,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n LoadingIcon,\n RefreshIcon,\n SearchIcon,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n ViewGridLinedIcon,\n ViewListLinedIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport { useEffect, useRef, useState, type ReactElement } from \"react\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type { WorkspaceFileManagerArrangeMode } from \"./workspaceFileManagerArrangeMode.ts\";\nimport type { WorkspaceFileManagerLayoutMode } from \"./workspaceFileManagerLayoutMode.ts\";\nimport type { RenderWorkspaceFileManagerToolbarTrailingActions } from \"./workspaceFileManagerToolbarTypes.ts\";\n\nexport function WorkspaceFileManagerToolbar({\n breadcrumbs,\n canSearch,\n canGoBack,\n canGoForward,\n copy,\n currentDirectoryPath,\n isBusy,\n isLoading,\n isMutating,\n isSearching,\n arrangeMode,\n layoutMode,\n renderToolbarTrailingActions,\n searchQuery,\n onGoBack,\n onGoForward,\n onArrangeModeChange,\n onLayoutModeChange,\n onLoadDirectory,\n onRefresh,\n onSearchClear,\n onSearchQueryChange\n}: {\n breadcrumbs: Array<{ label: string; path: string }>;\n canSearch: boolean;\n canGoBack: boolean;\n canGoForward: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n currentDirectoryPath: string;\n isBusy: boolean;\n isLoading: boolean;\n isMutating: boolean;\n isSearching: boolean;\n arrangeMode: WorkspaceFileManagerArrangeMode;\n layoutMode: WorkspaceFileManagerLayoutMode;\n renderToolbarTrailingActions?: RenderWorkspaceFileManagerToolbarTrailingActions;\n searchQuery: string;\n onGoBack: () => void;\n onGoForward: () => void;\n onArrangeModeChange: (arrangeMode: WorkspaceFileManagerArrangeMode) => void;\n onLayoutModeChange: (layoutMode: WorkspaceFileManagerLayoutMode) => void;\n onLoadDirectory: (path: string) => void;\n onRefresh: () => void;\n onSearchClear: () => void;\n onSearchQueryChange: (query: string) => void;\n}): ReactElement {\n const [refreshAnimationKey, setRefreshAnimationKey] = useState(0);\n\n const handleRefresh = (): void => {\n setRefreshAnimationKey((currentKey) => currentKey + 1);\n onRefresh();\n };\n\n return (\n <header className=\"@max-[600px]/workspace-file-manager:flex-nowrap flex h-10 min-h-10 w-full min-w-0 items-center gap-2 border-b border-[var(--border-1)] px-2 py-1\">\n <ToolbarIconButton\n ariaLabel={copy.t(\"backLabel\")}\n disabled={!canGoBack || isLoading || isBusy}\n title={copy.t(\"backLabel\")}\n onClick={onGoBack}\n >\n <ArrowLeftIcon className=\"size-4\" />\n </ToolbarIconButton>\n <ToolbarIconButton\n ariaLabel={copy.t(\"forwardLabel\")}\n disabled={!canGoForward || isLoading || isBusy}\n title={copy.t(\"forwardLabel\")}\n onClick={onGoForward}\n >\n <ArrowRightIcon className=\"size-4\" />\n </ToolbarIconButton>\n <nav\n aria-label={currentDirectoryPath}\n className=\"@max-[600px]/workspace-file-manager:flex-auto flex min-w-0 flex-1 overflow-hidden pr-2\"\n data-workspace-file-manager-path=\"\"\n >\n <ol className=\"flex min-w-0 max-w-full flex-1 items-center gap-2 overflow-hidden\">\n {breadcrumbs.map((crumb, index) => (\n <BreadcrumbButton\n key={crumb.path}\n active={index === breadcrumbs.length - 1}\n label={crumb.label}\n showSeparator={index > 0}\n onClick={() => {\n onLoadDirectory(crumb.path);\n }}\n />\n ))}\n </ol>\n </nav>\n <div className=\"@max-[600px]/workspace-file-manager:justify-end flex flex-none items-center gap-1.5\">\n <LayoutModeToggle\n arrangeMode={arrangeMode}\n copy={copy}\n layoutMode={layoutMode}\n onArrangeModeChange={onArrangeModeChange}\n onLayoutModeChange={onLayoutModeChange}\n />\n <ToolbarActionButton\n disabled={isLoading || isMutating || isBusy}\n onClick={handleRefresh}\n >\n {isLoading ? (\n <LoadingIcon className=\"size-4 animate-spin\" />\n ) : (\n <RefreshIcon\n key={refreshAnimationKey}\n className={cn(\n \"size-4\",\n refreshAnimationKey > 0 &&\n \"motion-safe:animate-[spin_520ms_cubic-bezier(0.4,0,0.2,1)_1_reverse]\"\n )}\n />\n )}\n <span className=\"@max-[600px]/workspace-file-manager:hidden\">\n {copy.t(\"refreshLabel\")}\n </span>\n </ToolbarActionButton>\n {renderToolbarTrailingActions?.({\n currentDirectoryPath,\n isBusy,\n isLoading,\n isMutating\n }) ?? null}\n <WorkspaceFileManagerToolbarSearch\n canSearch={canSearch}\n copy={copy}\n isSearching={isSearching}\n searchQuery={searchQuery}\n onClear={onSearchClear}\n onSearchQueryChange={onSearchQueryChange}\n />\n </div>\n </header>\n );\n}\n\nfunction WorkspaceFileManagerToolbarSearch({\n canSearch,\n copy,\n isSearching,\n searchQuery,\n onClear,\n onSearchQueryChange\n}: {\n canSearch: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n isSearching: boolean;\n searchQuery: string;\n onClear: () => void;\n onSearchQueryChange: (query: string) => void;\n}): ReactElement {\n const [expanded, setExpanded] = useState(searchQuery.trim().length > 0);\n const [inputValue, setInputValue] = useState(searchQuery);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const isComposingRef = useRef(false);\n const active = expanded || searchQuery.trim().length > 0;\n\n useEffect(() => {\n if (searchQuery.trim().length > 0) {\n setExpanded(true);\n }\n }, [searchQuery]);\n\n useEffect(() => {\n if (!expanded) {\n return;\n }\n inputRef.current?.focus();\n }, [expanded]);\n\n useEffect(() => {\n if (isComposingRef.current) {\n return;\n }\n setInputValue(searchQuery);\n }, [searchQuery]);\n\n const commitInputValue = (value: string): void => {\n setInputValue(value);\n onSearchQueryChange(value);\n };\n\n const handleClear = (): void => {\n isComposingRef.current = false;\n setInputValue(\"\");\n onClear();\n setExpanded(false);\n };\n\n if (!active) {\n return (\n <ToolbarIconButton\n ariaLabel={copy.t(\"searchPlaceholder\")}\n disabled={!canSearch}\n title={copy.t(\"searchPlaceholder\")}\n onClick={() => {\n setExpanded(true);\n }}\n >\n <SearchIcon className=\"size-4\" />\n </ToolbarIconButton>\n );\n }\n\n return (\n <div\n className={cn(\n \"relative h-7 w-[min(220px,34vw)] flex-none overflow-hidden rounded-md bg-[var(--transparency-block)] transition-[width,opacity,background-color] duration-200 ease-out\",\n \"@max-[600px]/workspace-file-manager:w-[min(170px,42vw)]\",\n !canSearch && \"opacity-60\"\n )}\n >\n <SearchIcon className=\"pointer-events-none absolute top-1/2 left-2 size-4 -translate-y-1/2 text-[var(--text-tertiary)]\" />\n <Input\n aria-label={copy.t(\"searchPlaceholder\")}\n className=\"h-full border-0 bg-transparent pr-8 pl-8 text-sm shadow-none focus-visible:ring-0\"\n disabled={!canSearch}\n placeholder={copy.t(\"searchPlaceholder\")}\n ref={inputRef}\n value={inputValue}\n onBlur={(event) => {\n commitInputValue(event.currentTarget.value);\n }}\n onChange={(event) => {\n const nextValue = event.currentTarget.value;\n if (isComposingRef.current) {\n setInputValue(nextValue);\n return;\n }\n commitInputValue(nextValue);\n }}\n onCompositionEnd={(event) => {\n isComposingRef.current = false;\n commitInputValue(event.currentTarget.value);\n }}\n onCompositionStart={() => {\n isComposingRef.current = true;\n }}\n onKeyDown={(event) => {\n if (event.key !== \"Escape\") {\n return;\n }\n if (isComposingRef.current || event.nativeEvent.isComposing) {\n return;\n }\n event.preventDefault();\n handleClear();\n }}\n />\n <button\n aria-label={copy.t(\"clearSearchLabel\")}\n className=\"absolute top-1/2 right-1 grid size-5 -translate-y-1/2 place-items-center rounded-[4px] text-[var(--text-tertiary)] transition-colors hover:bg-[var(--transparency-hover)] hover:text-[var(--text-primary)]\"\n type=\"button\"\n onClick={handleClear}\n >\n {isSearching ? (\n <LoadingIcon className=\"size-3 animate-spin\" />\n ) : (\n <CloseIcon className=\"size-3\" />\n )}\n </button>\n </div>\n );\n}\n\nfunction LayoutModeToggle({\n arrangeMode,\n copy,\n layoutMode,\n onArrangeModeChange,\n onLayoutModeChange\n}: {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n copy: WorkspaceFileManagerI18nRuntime;\n layoutMode: WorkspaceFileManagerLayoutMode;\n onArrangeModeChange: (arrangeMode: WorkspaceFileManagerArrangeMode) => void;\n onLayoutModeChange: (layoutMode: WorkspaceFileManagerLayoutMode) => void;\n}): ReactElement {\n const arrangeOptions: Array<{\n label: string;\n mode: WorkspaceFileManagerArrangeMode;\n }> = [\n { label: copy.t(\"arrangeNoneLabel\"), mode: \"none\" },\n { label: copy.t(\"nameLabel\"), mode: \"name\" },\n { label: copy.t(\"arrangeKindLabel\"), mode: \"kind\" },\n { label: copy.t(\"arrangeApplicationLabel\"), mode: \"application\" },\n { label: copy.t(\"arrangeLastOpenedLabel\"), mode: \"lastOpened\" },\n { label: copy.t(\"arrangeDateAddedLabel\"), mode: \"dateAdded\" },\n { label: copy.t(\"modifiedLabel\"), mode: \"modified\" },\n { label: copy.t(\"arrangeCreatedLabel\"), mode: \"created\" },\n { label: copy.t(\"sizeLabel\"), mode: \"size\" }\n ];\n\n return (\n <TooltipProvider delayDuration={300}>\n <div\n className=\"flex items-center rounded-md border border-[var(--border-1)] bg-[var(--transparency-block)] p-0.5\"\n role=\"group\"\n >\n <LayoutModeButton\n active={layoutMode === \"icon\"}\n ariaLabel={copy.t(\"layoutIconViewLabel\")}\n tooltipLabel={copy.t(\"layoutIconViewTooltipLabel\")}\n onClick={() => {\n onLayoutModeChange(\"icon\");\n }}\n >\n <ViewGridLinedIcon className=\"size-4\" />\n </LayoutModeButton>\n <LayoutModeButton\n active={layoutMode === \"list\"}\n ariaLabel={copy.t(\"layoutListViewLabel\")}\n tooltipLabel={copy.t(\"layoutListViewTooltipLabel\")}\n onClick={() => {\n onLayoutModeChange(\"list\");\n }}\n >\n <ViewListLinedIcon className=\"size-4\" />\n </LayoutModeButton>\n <span className=\"mx-0.5 h-4 w-px bg-[var(--border-1)]\" aria-hidden />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={copy.t(\"arrangeMenuLabel\")}\n className=\"size-6 min-w-6 rounded-[4px] p-0 text-[var(--text-secondary)] data-[state=open]:bg-[var(--background-fronted)] data-[state=open]:text-[var(--text-primary)] data-[state=open]:shadow-sm\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n <ChevronDownIcon className=\"size-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"min-w-[236px] px-1 py-1\"\n sideOffset={7}\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n >\n <DropdownMenuRadioGroup\n value={arrangeMode}\n onValueChange={(nextMode) => {\n onArrangeModeChange(\n nextMode as WorkspaceFileManagerArrangeMode\n );\n }}\n >\n {arrangeOptions.map((option, index) => (\n <div key={option.mode}>\n {index === 1 ? <DropdownMenuSeparator /> : null}\n <DropdownMenuRadioItem\n className=\"h-8 text-sm font-normal\"\n value={option.mode}\n >\n {option.label}\n </DropdownMenuRadioItem>\n </div>\n ))}\n </DropdownMenuRadioGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </TooltipProvider>\n );\n}\n\nfunction LayoutModeButton({\n active,\n ariaLabel,\n children,\n onClick,\n tooltipLabel\n}: {\n active: boolean;\n ariaLabel: string;\n children: ReactElement;\n onClick: () => void;\n tooltipLabel: string;\n}): ReactElement {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={ariaLabel}\n aria-pressed={active}\n className={cn(\n \"size-6 min-w-6 rounded-[4px] p-0 text-text-secondary\",\n active &&\n \"!bg-background-fronted text-foreground hover:!bg-background-fronted\"\n )}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onClick}\n >\n {children}\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{tooltipLabel}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction ToolbarIconButton({\n ariaLabel,\n children,\n disabled,\n onClick,\n title\n}: {\n ariaLabel: string;\n children: ReactElement;\n disabled: boolean;\n onClick: () => void;\n title: string;\n}): ReactElement {\n return (\n <Button\n aria-label={ariaLabel}\n className=\"size-7 min-w-7 rounded-sm p-0 text-[var(--text-primary)]\"\n disabled={disabled}\n size=\"icon-sm\"\n title={title}\n type=\"button\"\n variant=\"ghost\"\n onClick={onClick}\n >\n {children}\n </Button>\n );\n}\n\nfunction ToolbarActionButton({\n children,\n disabled,\n onClick\n}: {\n children: ReactElement | ReactElement[] | string;\n disabled: boolean;\n onClick: () => void;\n}): ReactElement {\n return (\n <Button\n className=\"@max-[600px]/workspace-file-manager:size-7 @max-[600px]/workspace-file-manager:min-w-7 @max-[600px]/workspace-file-manager:px-0 cursor-pointer\"\n disabled={disabled}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onClick}\n >\n {children}\n </Button>\n );\n}\n\nfunction BreadcrumbButton({\n active,\n label,\n onClick,\n showSeparator\n}: {\n active: boolean;\n label: string;\n onClick: () => void;\n showSeparator: boolean;\n}): ReactElement {\n return (\n <li className=\"flex min-w-0 items-center gap-2\">\n {showSeparator ? (\n <span className=\"flex-none text-[var(--text-tertiary)]\">/</span>\n ) : null}\n <button\n className={cn(\n \"min-w-0 overflow-hidden text-ellipsis whitespace-nowrap border-0 bg-transparent text-sm font-normal transition-colors\",\n active\n ? \"font-semibold text-[var(--text-primary)]\"\n : \"text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\n )}\n type=\"button\"\n onClick={onClick}\n >\n {label}\n </button>\n </li>\n );\n}\n","import {\n FolderIcon,\n RecentLinedIcon,\n ScrollArea,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { CSSProperties, ReactElement } from \"react\";\nimport type {\n WorkspaceFileLocation,\n WorkspaceFileExternalLocation,\n WorkspaceFileLocationSection\n} from \"../services/workspaceFileManagerTypes.ts\";\n\nexport function WorkspaceFileManagerSidebar({\n disabled,\n locationSections,\n selectedLocationId,\n width,\n onSelectLocation\n}: {\n disabled: boolean;\n locationSections: readonly WorkspaceFileLocationSection[];\n selectedLocationId: string | null;\n width: number;\n onSelectLocation: (location: WorkspaceFileLocation) => void;\n}): ReactElement | null {\n const visibleSections = locationSections.filter(\n (section) => section.locations.length > 0\n );\n if (visibleSections.length === 0) {\n return null;\n }\n\n return (\n <aside\n className=\"@max-[600px]/workspace-file-manager:hidden flex shrink-0 flex-col border-r border-[var(--border-1)] bg-[var(--background-panel)]\"\n style={{ minWidth: width, width } satisfies CSSProperties}\n >\n <ScrollArea className=\"min-h-0 flex-1\">\n <TooltipProvider delayDuration={350}>\n <div className=\"flex flex-col gap-3 px-2 py-3\">\n {visibleSections.map((section) => (\n <section key={section.id} className=\"min-w-0\">\n <h2 className=\"mb-1 px-2 text-[11px] font-medium uppercase tracking-normal text-[var(--text-tertiary)]\">\n {section.label}\n </h2>\n <div className=\"flex flex-col gap-0.5\">\n {section.locations.map((location) => (\n <WorkspaceFileManagerSidebarLocation\n key={location.id}\n active={location.id === selectedLocationId}\n disabled={disabled}\n location={location}\n onSelectLocation={onSelectLocation}\n />\n ))}\n </div>\n </section>\n ))}\n </div>\n </TooltipProvider>\n </ScrollArea>\n </aside>\n );\n}\n\nfunction WorkspaceFileManagerSidebarLocation({\n active,\n disabled,\n location,\n onSelectLocation\n}: {\n active: boolean;\n disabled: boolean;\n location: WorkspaceFileLocation;\n onSelectLocation: (location: WorkspaceFileLocation) => void;\n}): ReactElement {\n const Icon = location.kind === \"recent\" ? RecentLinedIcon : FolderIcon;\n const content = (\n <button\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex h-8 min-w-0 items-center gap-2 rounded-md border border-transparent px-2 text-left text-sm text-[var(--text-secondary)] transition-colors\",\n active\n ? \"border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-primary)] shadow-none\"\n : \"hover:bg-[var(--transparency-block)] hover:text-[var(--text-primary)]\",\n disabled && \"pointer-events-none opacity-60\"\n )}\n disabled={disabled}\n type=\"button\"\n onClick={() => {\n onSelectLocation(location);\n }}\n >\n {location.kind === \"external\" && location.iconUrl ? (\n <ExternalLocationIcon location={location} />\n ) : (\n <Icon className=\"size-4 flex-none\" />\n )}\n <span className=\"min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap\">\n {location.label}\n </span>\n </button>\n );\n\n if (!location.contextLabel) {\n return content;\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent side=\"right\">{location.contextLabel}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction ExternalLocationIcon({\n location\n}: {\n location: WorkspaceFileExternalLocation;\n}): ReactElement {\n return (\n <img\n alt=\"\"\n className=\"size-4 flex-none rounded-[3px] object-cover\"\n src={location.iconUrl ?? undefined}\n />\n );\n}\n","import { useCallback, useState } from \"react\";\nimport {\n readWorkspaceFileManagerArrangeMode,\n writeWorkspaceFileManagerArrangeMode,\n type WorkspaceFileManagerArrangeMode\n} from \"./workspaceFileManagerArrangeMode.ts\";\n\nexport function useWorkspaceFileManagerArrangeMode(): {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n setArrangeMode: (arrangeMode: WorkspaceFileManagerArrangeMode) => void;\n} {\n const [arrangeMode, setArrangeModeState] = useState(\n readWorkspaceFileManagerArrangeMode\n );\n\n const setArrangeMode = useCallback(\n (nextArrangeMode: WorkspaceFileManagerArrangeMode) => {\n setArrangeModeState(nextArrangeMode);\n writeWorkspaceFileManagerArrangeMode(nextArrangeMode);\n },\n []\n );\n\n return { arrangeMode, setArrangeMode };\n}\n","import { useCallback, useState } from \"react\";\nimport {\n readWorkspaceFileManagerLayoutMode,\n writeWorkspaceFileManagerLayoutMode,\n type WorkspaceFileManagerLayoutMode\n} from \"./workspaceFileManagerLayoutMode.ts\";\n\nexport function useWorkspaceFileManagerLayoutMode(): {\n layoutMode: WorkspaceFileManagerLayoutMode;\n setLayoutMode: (layoutMode: WorkspaceFileManagerLayoutMode) => void;\n} {\n const [layoutMode, setLayoutModeState] = useState(\n readWorkspaceFileManagerLayoutMode\n );\n\n const setLayoutMode = useCallback(\n (nextLayoutMode: WorkspaceFileManagerLayoutMode) => {\n setLayoutModeState(nextLayoutMode);\n writeWorkspaceFileManagerLayoutMode(nextLayoutMode);\n },\n []\n );\n\n return { layoutMode, setLayoutMode };\n}\n","export type WorkspaceFileManagerLayoutMode = \"icon\" | \"list\";\n\nexport const workspaceFileManagerLayoutModeStorageKey =\n \"tutti.workspace-file-manager.layout-mode\";\n\nexport function readWorkspaceFileManagerLayoutMode(): WorkspaceFileManagerLayoutMode {\n if (typeof window === \"undefined\") {\n return \"list\";\n }\n\n const stored = window.localStorage.getItem(\n workspaceFileManagerLayoutModeStorageKey\n );\n return stored === \"icon\" ? \"icon\" : \"list\";\n}\n\nexport function writeWorkspaceFileManagerLayoutMode(\n layoutMode: WorkspaceFileManagerLayoutMode\n): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n window.localStorage.setItem(\n workspaceFileManagerLayoutModeStorageKey,\n layoutMode\n );\n}\n","export function shouldTrackDirectoryExpanded(input: {\n currentDirectoryPath: string;\n nextDirectoryPath: string;\n}): boolean {\n return (\n normalizeDirectoryPath(input.currentDirectoryPath) !==\n normalizeDirectoryPath(input.nextDirectoryPath)\n );\n}\n\nfunction normalizeDirectoryPath(path: string): string {\n return path.trim().replaceAll(\"\\\\\", \"/\").replace(/\\/+$/u, \"\");\n}\n"],"mappings":"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","names":["useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","cn","useEffect","useLayoutEffect","useRef","useState","menu","jsx","useRef","useState","useLayoutEffect","useEffect","jsx","jsxs","useCallback","useMemo","ArrowRightIcon","FileCodeIcon","FileTextIcon","LoadingIcon","VideoFileIcon","cn","resolveWorkspaceFileVisualKind","useCallback","useEffect","useLayoutEffect","useRef","useState","cn","useLayoutEffect","useRef","cn","useEffect","useRef","jsx","jsxs","useRef","useEffect","cn","jsx","jsxs","useRef","useLayoutEffect","cn","Fragment","jsx","jsxs","useRef","useState","useCallback","useEffect","useLayoutEffect","cn","EntryRow","LoadingIcon","ArrowRightIcon","VideoFileIcon","FileTextIcon","FileCodeIcon","resolveWorkspaceFileVisualKind","useCallback","useEffect","useMemo","useState","useMemo","useState","useEffect","useCallback","jsx","useMemo","useCallback","ArrowLeftIcon","ArrowRightIcon","Button","Input","LoadingIcon","cn","useEffect","useRef","useState","jsx","jsxs","ScrollArea","Tooltip","TooltipContent","TooltipProvider","TooltipTrigger","cn","jsx","jsxs","useCallback","useState","useState","useCallback","useCallback","useState","useState","useCallback","Fragment","jsx","jsxs","useRef","useState","useMemo","useCallback","useLayoutEffect","useEffect","cn"]}
1
+ {"version":3,"sources":["../src/ui/WorkspaceFileManager.tsx","../src/ui/WorkspaceFileManagerContextMenuContainer.tsx","../src/ui/WorkspaceFileManagerContextMenu.tsx","../src/ui/contextMenuPlacement.ts","../src/ui/useWorkspaceFileManagerService.ts","../src/services/internal/workspaceFileManagerViewModel.ts","../src/ui/workspaceFileManagerContextMenuTypes.ts","../src/ui/WorkspaceFileManagerMenus.tsx","../src/ui/WorkspaceFileManagerPanelsContainer.tsx","../src/ui/WorkspaceFileManagerPanels.tsx","../src/ui/WorkspaceFileManagerPreviewActionBar.tsx","../src/ui/WorkspaceFileManagerIconGrid.tsx","../src/ui/WorkspaceFileEntryIcon.tsx","../src/ui/workspaceFileManagerIconGridLayout.ts","../src/ui/workspaceFileManagerPaneSizing.ts","../src/ui/workspaceFileManagerTableSizing.ts","../src/ui/useWorkspaceFileEntryIconUrls.ts","../src/ui/workspaceFileEntryIconUrlQueue.ts","../src/ui/useWorkspaceFileManagerPreviewActions.tsx","../src/ui/workspaceFileManagerPreviewActionTypes.ts","../src/ui/workspaceFileManagerVisibleTree.ts","../src/ui/WorkspaceFileManagerToolbar.tsx","../src/ui/WorkspaceFileManagerSidebar.tsx","../src/ui/useWorkspaceFileManagerArrangeMode.ts","../src/ui/useWorkspaceFileManagerLayoutMode.ts","../src/ui/workspaceFileManagerLayoutMode.ts","../src/ui/workspaceFileManagerAnalytics.ts"],"sourcesContent":["import type {\n CSSProperties,\n KeyboardEvent as ReactKeyboardEvent,\n MouseEvent as ReactMouseEvent,\n PointerEvent as ReactPointerEvent,\n ReactElement\n} from \"react\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState\n} from \"react\";\nimport { cn } from \"@tutti-os/ui-system\";\nimport type { TuttiDateLocale } from \"@tutti-os/ui-system/date-format\";\nimport type { WorkspaceFileManagerSession } from \"../services/workspaceFileManagerService.interface.ts\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileLocation\n} from \"../services/workspaceFileManagerTypes.ts\";\nimport { WorkspaceFileManagerContextMenuContainer } from \"./WorkspaceFileManagerContextMenuContainer.tsx\";\nimport {\n WorkspaceFileManagerCreateDialog,\n WorkspaceFileManagerDeleteDialog,\n WorkspaceFileManagerUnsupportedDialog\n} from \"./WorkspaceFileManagerMenus.tsx\";\nimport { type WorkspaceFileManagerEntryDragMode } from \"./WorkspaceFileManagerPanels.tsx\";\nimport { WorkspaceFileManagerPanelsContainer } from \"./WorkspaceFileManagerPanelsContainer.tsx\";\nimport type { ResolveWorkspaceFileManagerContextMenu } from \"./workspaceFileManagerContextMenuTypes.ts\";\nimport { WorkspaceFileManagerToolbar } from \"./WorkspaceFileManagerToolbar.tsx\";\nimport type { RenderWorkspaceFileManagerToolbarTrailingActions } from \"./workspaceFileManagerToolbarTypes.ts\";\nimport type { WorkspaceFileManagerPreviewActionsConfig } from \"./workspaceFileManagerPreviewActionTypes.ts\";\nimport { WorkspaceFileManagerSidebar } from \"./WorkspaceFileManagerSidebar.tsx\";\nimport {\n clampWorkspaceFileManagerSidebarWidth,\n readWorkspaceFileManagerSidebarWidth,\n resolveWorkspaceFileManagerSidebarMaxWidth,\n workspaceFileManagerContentMinWidth,\n workspaceFileManagerContentWithoutPreviewMinWidth,\n workspaceFileManagerPaneResizeStep,\n workspaceFileManagerSidebarDefaultWidth,\n workspaceFileManagerSidebarMinWidth,\n writeWorkspaceFileManagerSidebarWidth\n} from \"./workspaceFileManagerPaneSizing.ts\";\nimport type { WorkspaceFileManagerArrangeMode } from \"./workspaceFileManagerArrangeMode.ts\";\nimport { useWorkspaceFileManagerArrangeMode } from \"./useWorkspaceFileManagerArrangeMode.ts\";\nimport type { WorkspaceFileManagerLayoutMode } from \"./workspaceFileManagerLayoutMode.ts\";\nimport { useWorkspaceFileManagerLayoutMode } from \"./useWorkspaceFileManagerLayoutMode.ts\";\nimport { shouldTrackDirectoryExpanded } from \"./workspaceFileManagerAnalytics.ts\";\nimport {\n resolveWorkspaceFileManagerPreservedNameColumnWidth,\n workspaceFileManagerTableNameColumnSelector,\n workspaceFileManagerTableNameMinWidthProperty\n} from \"./workspaceFileManagerTableSizing.ts\";\nimport { findWorkspaceFileLocationById } from \"../services/workspaceFileManagerLocations.ts\";\nimport {\n useWorkspaceFileManagerDialogsView,\n useWorkspaceFileManagerPanelsView,\n useWorkspaceFileManagerRootView,\n useWorkspaceFileManagerToolbarView\n} from \"./useWorkspaceFileManagerService.ts\";\n\nconst workspaceFileManagerSearchDebounceMs = 180;\n\nexport type {\n RenderWorkspaceFileManagerToolbarTrailingActions,\n WorkspaceFileManagerToolbarTrailingActionsContext\n} from \"./workspaceFileManagerToolbarTypes.ts\";\nexport type {\n WorkspaceFileManagerPreviewActionId,\n WorkspaceFileManagerPreviewActionsConfig\n} from \"./workspaceFileManagerPreviewActionTypes.ts\";\n\nexport interface WorkspaceFileManagerProps {\n className?: string;\n dateLocale?: TuttiDateLocale;\n entryDragMode?: WorkspaceFileManagerEntryDragMode;\n onCopyEntry?: () => Promise<void> | void;\n onDirectoryExpanded?: (path: string) => void;\n onEntryDragStart?: (\n entry: WorkspaceFileEntry,\n dataTransfer: DataTransfer\n ) => void;\n resolveContextMenu: ResolveWorkspaceFileManagerContextMenu;\n resolveEntryIconUrl?: (\n entry: WorkspaceFileEntry\n ) => Promise<string | null | undefined>;\n renderExternalLocationContent?: (\n location: Extract<WorkspaceFileLocation, { kind: \"external\" }>\n ) => ReactElement | null;\n /**\n * Declares the action row rendered at the bottom of the preview panel. Copy\n * and open opt in with a boolean and reuse the package's session commands;\n * download and share are enabled by passing a host handler. Omit the prop to\n * keep the preview panel action-free.\n */\n previewActions?: WorkspaceFileManagerPreviewActionsConfig;\n /**\n * Optional host actions rendered in the toolbar trailing cluster, after\n * Refresh and before Search. Use for product-owned primary affordances such\n * as upload; keep multi-step transfer UX outside this package.\n */\n renderToolbarTrailingActions?: RenderWorkspaceFileManagerToolbarTrailingActions;\n i18n: WorkspaceFileManagerI18nRuntime;\n session: WorkspaceFileManagerSession;\n /**\n * When false, hide the locations sidebar even if the session has location\n * sections. Hosts with a single workspace root (for example TSH embedded\n * Files) can turn this off. Defaults to true.\n */\n showLocationSidebar?: boolean;\n showPreviewPanel?: boolean;\n surface?: \"card\" | \"embedded\";\n}\n\nexport function WorkspaceFileManager({\n className,\n dateLocale,\n entryDragMode,\n i18n,\n onCopyEntry,\n onDirectoryExpanded,\n onEntryDragStart,\n previewActions,\n resolveContextMenu,\n resolveEntryIconUrl,\n renderExternalLocationContent,\n renderToolbarTrailingActions,\n session,\n showLocationSidebar = true,\n showPreviewPanel = true,\n surface = \"card\"\n}: WorkspaceFileManagerProps): ReactElement {\n const rootRef = useRef<HTMLElement | null>(null);\n const sidebarResizeRef = useRef<{\n currentWidth: number;\n pointerId: number;\n startWidth: number;\n startX: number;\n } | null>(null);\n const [sidebarWidth, setSidebarWidth] = useState(\n readWorkspaceFileManagerSidebarWidth\n );\n const [containerWidth, setContainerWidth] = useState(0);\n const { arrangeMode, setArrangeMode } = useWorkspaceFileManagerArrangeMode();\n const { layoutMode, setLayoutMode } = useWorkspaceFileManagerLayoutMode();\n const rootView = useWorkspaceFileManagerRootView(session);\n const { state: panelsState, view: panelsView } =\n useWorkspaceFileManagerPanelsView(session);\n const selectedExternalLocation = useMemo(() => {\n const location = findWorkspaceFileLocationById(\n rootView.locationSections,\n rootView.selectedLocationId\n );\n return location?.kind === \"external\" ? location : null;\n }, [rootView.locationSections, rootView.selectedLocationId]);\n const hasLocationSidebar =\n showLocationSidebar &&\n rootView.locationSections.some((section) => section.locations.length > 0);\n const sidebarContentMinWidth = showPreviewPanel\n ? workspaceFileManagerContentMinWidth\n : workspaceFileManagerContentWithoutPreviewMinWidth;\n const sidebarMaxWidth =\n containerWidth > 0\n ? resolveWorkspaceFileManagerSidebarMaxWidth(\n containerWidth,\n sidebarContentMinWidth\n )\n : workspaceFileManagerSidebarDefaultWidth;\n\n const updateSidebarWidth = useCallback(\n (width: number): number => {\n const nextWidth = clampWorkspaceFileManagerSidebarWidth({\n containerWidth: rootRef.current?.getBoundingClientRect().width ?? 0,\n contentMinWidth: sidebarContentMinWidth,\n width\n });\n setSidebarWidth(nextWidth);\n return nextWidth;\n },\n [sidebarContentMinWidth]\n );\n\n useLayoutEffect(() => {\n const element = rootRef.current;\n if (!element || !hasLocationSidebar) {\n return;\n }\n\n const publishLayout = () => {\n const nextContainerWidth = Math.round(\n element.getBoundingClientRect().width\n );\n setContainerWidth(nextContainerWidth);\n setSidebarWidth((currentWidth) =>\n clampWorkspaceFileManagerSidebarWidth({\n containerWidth: nextContainerWidth,\n contentMinWidth: sidebarContentMinWidth,\n width: currentWidth\n })\n );\n };\n\n publishLayout();\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", publishLayout);\n return () => {\n window.removeEventListener(\"resize\", publishLayout);\n };\n }\n\n const observer = new ResizeObserver(publishLayout);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [hasLocationSidebar, sidebarContentMinWidth]);\n\n const handleSidebarResizePointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>): void => {\n if (event.button !== 0) {\n return;\n }\n const root = rootRef.current;\n const nameColumn = root?.querySelector<HTMLElement>(\n workspaceFileManagerTableNameColumnSelector\n );\n if (root && nameColumn) {\n const preservedWidth =\n resolveWorkspaceFileManagerPreservedNameColumnWidth(\n nameColumn.getBoundingClientRect().width\n );\n root.style.setProperty(\n workspaceFileManagerTableNameMinWidthProperty,\n `${preservedWidth}px`\n );\n }\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n sidebarResizeRef.current = {\n currentWidth: sidebarWidth,\n pointerId: event.pointerId,\n startWidth: sidebarWidth,\n startX: event.clientX\n };\n },\n [sidebarWidth]\n );\n\n const handleSidebarResizePointerMove = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>): void => {\n const resize = sidebarResizeRef.current;\n if (!resize || resize.pointerId !== event.pointerId) {\n return;\n }\n resize.currentWidth = updateSidebarWidth(\n resize.startWidth + event.clientX - resize.startX\n );\n },\n [updateSidebarWidth]\n );\n\n const handleSidebarResizePointerEnd = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>): void => {\n const resize = sidebarResizeRef.current;\n if (!resize || resize.pointerId !== event.pointerId) {\n return;\n }\n sidebarResizeRef.current = null;\n writeWorkspaceFileManagerSidebarWidth(resize.currentWidth);\n event.currentTarget.releasePointerCapture(event.pointerId);\n },\n []\n );\n\n const handleSidebarResizeKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>): void => {\n let nextWidth: number | null = null;\n if (event.key === \"Home\") {\n event.preventDefault();\n nextWidth = updateSidebarWidth(workspaceFileManagerSidebarMinWidth);\n } else if (event.key === \"End\") {\n event.preventDefault();\n nextWidth = updateSidebarWidth(sidebarMaxWidth);\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n nextWidth = updateSidebarWidth(\n sidebarWidth +\n (event.key === \"ArrowLeft\"\n ? -workspaceFileManagerPaneResizeStep\n : workspaceFileManagerPaneResizeStep)\n );\n }\n if (nextWidth !== null) {\n writeWorkspaceFileManagerSidebarWidth(nextWidth);\n }\n },\n [sidebarMaxWidth, sidebarWidth, updateSidebarWidth]\n );\n\n useEffect(() => {\n function handleCopyShortcut(event: KeyboardEvent): void {\n if (\n !(event.metaKey || event.ctrlKey) ||\n event.key !== \"c\" ||\n event.shiftKey\n ) {\n return;\n }\n if (isEditableKeyboardTarget(event.target)) {\n return;\n }\n if (!rootRef.current?.contains(event.target as Node)) {\n return;\n }\n if (selectedExternalLocation) {\n return;\n }\n if (\n !panelsState.capabilities.canCopy ||\n panelsState.busyAction !== null ||\n panelsState.isLoading ||\n panelsState.isMutating\n ) {\n return;\n }\n\n const entry = panelsView.selectedEntry;\n if (!entry) {\n return;\n }\n\n event.preventDefault();\n void (async () => {\n if (await session.copyToClipboard(entry)) {\n await onCopyEntry?.();\n }\n })();\n }\n\n window.addEventListener(\"keydown\", handleCopyShortcut);\n return () => {\n window.removeEventListener(\"keydown\", handleCopyShortcut);\n };\n }, [\n onCopyEntry,\n panelsState,\n panelsView.selectedEntry,\n selectedExternalLocation,\n session\n ]);\n\n useEffect(() => {\n function handleRenameShortcut(event: KeyboardEvent): void {\n if (\n event.key !== \"Enter\" ||\n event.metaKey ||\n event.ctrlKey ||\n event.altKey\n ) {\n return;\n }\n if (isEditableKeyboardTarget(event.target)) {\n return;\n }\n if (!rootRef.current?.contains(event.target as Node)) {\n return;\n }\n if (selectedExternalLocation) {\n return;\n }\n if (\n !panelsState.capabilities.canRename ||\n panelsState.busyAction !== null ||\n panelsState.isLoading ||\n panelsState.isMutating ||\n panelsState.inlineRenameEntryPath !== null ||\n panelsState.searchQuery.trim().length > 0\n ) {\n return;\n }\n\n const entry = panelsView.selectedEntry;\n if (!entry) {\n return;\n }\n\n event.preventDefault();\n session.startInlineRename(entry);\n }\n\n window.addEventListener(\"keydown\", handleRenameShortcut);\n return () => {\n window.removeEventListener(\"keydown\", handleRenameShortcut);\n };\n }, [\n panelsState,\n panelsView.selectedEntry,\n selectedExternalLocation,\n session\n ]);\n\n const openContextMenu = useCallback(\n (\n event: ReactMouseEvent<HTMLElement>,\n entry: WorkspaceFileEntry | null\n ): void => {\n event.preventDefault();\n event.stopPropagation();\n\n // Store viewport (client) coordinates. The menu renders with\n // positionMode=\"viewport\" / fixed so overflow:hidden ancestors in host\n // shells (e.g. TSH workbench nodes) cannot clip or mis-stack it.\n const menuWidth = 220;\n const menuHeight = 280;\n const x = clampContextMenuCoordinate(\n event.clientX,\n window.innerWidth,\n menuWidth\n );\n const y = clampContextMenuCoordinate(\n event.clientY,\n window.innerHeight,\n menuHeight\n );\n\n session.openContextMenu({\n entryPath: entry?.path ?? null,\n x,\n y\n });\n },\n [session]\n );\n\n return (\n <section\n className={cn(\n \"@container/workspace-file-manager relative flex h-full min-h-0 w-full overflow-hidden text-[14px] text-[var(--text-primary)]\",\n surface === \"card\"\n ? \"rounded-lg border border-[var(--border-1)] bg-[var(--background-panel)]\"\n : \"rounded-none border-0 bg-transparent\",\n className\n )}\n data-slot=\"viewport-menu-boundary\"\n data-workspace-file-manager=\"\"\n ref={rootRef}\n style={\n {\n // Owned by the root so context menus (siblings of the panels pane)\n // can resolve overlay stacking instead of falling back to invalid\n // `calc(var(--undefined) - 1)`.\n \"--workspace-file-manager-dialog-overlay-z-index\": \"20\"\n } as CSSProperties\n }\n >\n {hasLocationSidebar ? (\n <WorkspaceFileManagerSidebar\n disabled={rootView.isBusy || panelsState.isLoading}\n locationSections={rootView.locationSections}\n selectedLocationId={rootView.selectedLocationId}\n width={sidebarWidth}\n onSelectLocation={(location) => {\n if (location.kind === \"directory\") {\n onDirectoryExpanded?.(location.path);\n }\n void session.selectLocation(location.id);\n }}\n />\n ) : null}\n {hasLocationSidebar ? (\n <div\n aria-label={i18n.t(\"resizeLocationsSidebar\")}\n aria-orientation=\"vertical\"\n aria-valuemax={sidebarMaxWidth}\n aria-valuemin={workspaceFileManagerSidebarMinWidth}\n aria-valuenow={sidebarWidth}\n className=\"nodrag @max-[600px]/workspace-file-manager:hidden relative z-[1] -ml-1 -mr-1 h-full w-2 shrink-0 cursor-col-resize touch-none outline-none before:absolute before:left-1/2 before:h-full before:w-px before:-translate-x-1/2 before:bg-transparent hover:before:bg-[var(--border-focus)] focus-visible:before:bg-[var(--border-focus)]\"\n role=\"separator\"\n tabIndex={0}\n onKeyDown={handleSidebarResizeKeyDown}\n onPointerCancel={handleSidebarResizePointerEnd}\n onPointerDown={handleSidebarResizePointerDown}\n onPointerMove={handleSidebarResizePointerMove}\n onPointerUp={handleSidebarResizePointerEnd}\n />\n ) : null}\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n {selectedExternalLocation ? (\n (renderExternalLocationContent?.(selectedExternalLocation) ?? null)\n ) : (\n <>\n <WorkspaceFileManagerToolbarContainer\n i18n={i18n}\n arrangeMode={arrangeMode}\n layoutMode={layoutMode}\n onArrangeModeChange={setArrangeMode}\n onDirectoryExpanded={onDirectoryExpanded}\n onLayoutModeChange={setLayoutMode}\n renderToolbarTrailingActions={renderToolbarTrailingActions}\n session={session}\n />\n <div className=\"@max-[600px]/workspace-file-manager:flex-col @max-[600px]/workspace-file-manager:gap-3 flex min-h-0 min-w-0 flex-1 overflow-hidden\">\n <WorkspaceFileManagerPanelsContainer\n dateLocale={dateLocale}\n entryDragMode={entryDragMode}\n arrangeMode={arrangeMode}\n i18n={i18n}\n layoutMode={layoutMode}\n onCopyEntry={onCopyEntry}\n onDirectoryExpanded={onDirectoryExpanded}\n onEntryDragStart={onEntryDragStart}\n onOpenContextMenu={openContextMenu}\n previewActions={previewActions}\n resolveEntryIconUrl={resolveEntryIconUrl}\n session={session}\n showPreviewPanel={showPreviewPanel}\n />\n </div>\n </>\n )}\n </div>\n {!selectedExternalLocation ? (\n <>\n <WorkspaceFileManagerDialogsContainer i18n={i18n} session={session} />\n <WorkspaceFileManagerContextMenuContainer\n resolveContextMenu={resolveContextMenu}\n session={session}\n />\n </>\n ) : null}\n </section>\n );\n}\n\nfunction WorkspaceFileManagerToolbarContainer({\n arrangeMode,\n i18n,\n layoutMode,\n onArrangeModeChange,\n onDirectoryExpanded,\n onLayoutModeChange,\n renderToolbarTrailingActions,\n session\n}: {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n i18n: WorkspaceFileManagerI18nRuntime;\n layoutMode: WorkspaceFileManagerLayoutMode;\n onArrangeModeChange: (arrangeMode: WorkspaceFileManagerArrangeMode) => void;\n onDirectoryExpanded?: (path: string) => void;\n onLayoutModeChange: (layoutMode: WorkspaceFileManagerLayoutMode) => void;\n renderToolbarTrailingActions?: RenderWorkspaceFileManagerToolbarTrailingActions;\n session: WorkspaceFileManagerSession;\n}): ReactElement {\n const { view } = useWorkspaceFileManagerToolbarView(session, i18n);\n const [searchQuery, setSearchQuery] = useState(view.searchQuery);\n const submittedSearchQueryRef = useRef(view.searchQuery);\n const submitSearchQuery = useCallback(\n (query: string): void => {\n submittedSearchQueryRef.current = query;\n void session.search(query);\n },\n [session]\n );\n\n useEffect(() => {\n if (view.searchQuery === submittedSearchQueryRef.current) {\n return;\n }\n submittedSearchQueryRef.current = view.searchQuery;\n setSearchQuery(view.searchQuery);\n }, [view.searchQuery]);\n\n useEffect(() => {\n if (!view.canSearch || searchQuery === submittedSearchQueryRef.current) {\n return;\n }\n const timer = setTimeout(() => {\n submitSearchQuery(searchQuery);\n }, workspaceFileManagerSearchDebounceMs);\n return () => {\n clearTimeout(timer);\n };\n }, [searchQuery, submitSearchQuery, view.canSearch]);\n\n const handleSearchClear = useCallback((): void => {\n setSearchQuery(\"\");\n submitSearchQuery(\"\");\n }, [submitSearchQuery]);\n\n return (\n <WorkspaceFileManagerToolbar\n breadcrumbs={view.breadcrumbs}\n canSearch={view.canSearch}\n canGoBack={view.canGoBack}\n canGoForward={view.canGoForward}\n copy={i18n}\n currentDirectoryPath={view.currentDirectoryPath}\n isBusy={view.isBusy}\n isLoading={view.isLoading}\n isMutating={view.isMutating}\n isSearching={view.isSearching}\n arrangeMode={arrangeMode}\n layoutMode={layoutMode}\n renderToolbarTrailingActions={renderToolbarTrailingActions}\n searchQuery={searchQuery}\n onArrangeModeChange={onArrangeModeChange}\n onGoBack={() => {\n void session.goBack();\n }}\n onGoForward={() => {\n void session.goForward();\n }}\n onLayoutModeChange={onLayoutModeChange}\n onLoadDirectory={(path) => {\n if (\n shouldTrackDirectoryExpanded({\n currentDirectoryPath: view.currentDirectoryPath,\n nextDirectoryPath: path\n })\n ) {\n onDirectoryExpanded?.(path);\n }\n void session.loadDirectory(path);\n }}\n onRefresh={() => {\n void session.refresh();\n }}\n onSearchClear={handleSearchClear}\n onSearchQueryChange={setSearchQuery}\n />\n );\n}\n\nfunction WorkspaceFileManagerDialogsContainer({\n i18n,\n session\n}: {\n i18n: WorkspaceFileManagerI18nRuntime;\n session: WorkspaceFileManagerSession;\n}): ReactElement {\n const { state, view } = useWorkspaceFileManagerDialogsView(session);\n\n return (\n <>\n <WorkspaceFileManagerCreateDialog\n busy={view.isBusy && state.busyAction === \"create\"}\n copy={i18n}\n dialog={view.createDialog}\n onClose={() => {\n session.closeCreateDialog();\n }}\n onConfirm={() => {\n void session.confirmCreateDialog();\n }}\n onNameChange={(name) => {\n session.updateCreateDialogName(name);\n }}\n />\n <WorkspaceFileManagerDeleteDialog\n busy={view.isDeleting}\n copy={i18n}\n entry={view.deleteDialogEntry}\n onClose={() => {\n session.closeDeleteDialog();\n }}\n onConfirm={() => {\n void session.confirmDeleteDialog();\n }}\n />\n <WorkspaceFileManagerUnsupportedDialog\n copy={i18n}\n dialog={view.unsupportedDialog}\n isViewing={view.isViewing}\n onAction={(action) => {\n void session.handleActivationFallbackAction(action);\n }}\n onClose={() => {\n session.closeUnsupportedDialog();\n }}\n />\n </>\n );\n}\n\nfunction isEditableKeyboardTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n if (target.isContentEditable) {\n return true;\n }\n\n const tagName = target.tagName;\n return tagName === \"INPUT\" || tagName === \"TEXTAREA\" || tagName === \"SELECT\";\n}\n\nfunction clampContextMenuCoordinate(\n coordinate: number,\n boundarySize: number,\n menuSize: number\n): number {\n const max = Math.max(8, boundarySize - menuSize - 8);\n return Math.min(Math.max(coordinate, 8), max);\n}\n","import type { ReactElement, RefObject } from \"react\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type { WorkspaceFileManagerSession } from \"../services/workspaceFileManagerService.interface.ts\";\nimport {\n findWorkspaceFileLocationById,\n isWorkspaceFileExternalLocation,\n isWorkspaceFileRecentLocation\n} from \"../services/workspaceFileManagerLocations.ts\";\nimport { WorkspaceFileManagerContextMenu } from \"./WorkspaceFileManagerContextMenu.tsx\";\nimport { useWorkspaceFileManagerContextMenuView } from \"./useWorkspaceFileManagerService.ts\";\nimport type {\n ResolveWorkspaceFileManagerContextMenu,\n WorkspaceFileManagerContextMenuItem,\n WorkspaceFileManagerContextMenuRequest\n} from \"./workspaceFileManagerContextMenuTypes.ts\";\nimport { resolveWorkspaceFileManagerContextMenuTarget } from \"./workspaceFileManagerContextMenuTypes.ts\";\n\nexport function WorkspaceFileManagerContextMenuContainer({\n resolveContextMenu,\n session\n}: {\n resolveContextMenu: ResolveWorkspaceFileManagerContextMenu;\n session: WorkspaceFileManagerSession;\n}): ReactElement | null {\n const contextMenuRef = useRef<HTMLDivElement | null>(null);\n const { view } = useWorkspaceFileManagerContextMenuView(session);\n const [items, setItems] = useState<\n readonly WorkspaceFileManagerContextMenuItem[]\n >([]);\n\n const contextMenuX = view.contextMenu?.x;\n const contextMenuY = view.contextMenu?.y;\n const contextMenuEntryPath = view.contextMenu?.entry?.path ?? null;\n\n useLayoutEffect(() => {\n if (contextMenuX === undefined || contextMenuY === undefined) {\n setItems((current) => (current.length === 0 ? current : []));\n return;\n }\n\n const request = buildContextMenuRequest({\n session,\n view\n });\n const resolved = resolveContextMenu(request);\n if (!isPromiseLike(resolved)) {\n setItems((current) =>\n areContextMenuItemsEquivalent(current, resolved) ? current : resolved\n );\n return;\n }\n\n let cancelled = false;\n setItems((current) => (current.length === 0 ? current : []));\n void resolved.then((nextItems) => {\n if (!cancelled) {\n setItems((current) =>\n areContextMenuItemsEquivalent(current, nextItems)\n ? current\n : nextItems\n );\n }\n });\n return () => {\n cancelled = true;\n };\n // Depend on stable primitives from the view — `view.contextMenu` is a new\n // object every render and would retrigger setItems forever.\n }, [\n contextMenuEntryPath,\n contextMenuX,\n contextMenuY,\n resolveContextMenu,\n session,\n view.currentDirectoryPath,\n view.isBusy,\n view.isLoading,\n view.isMutating\n ]);\n\n useCloseContextMenuOnOutsideInteraction({\n contextMenuRef,\n isOpen: view.contextMenu !== null,\n session\n });\n\n if (!view.contextMenu) {\n return null;\n }\n\n return (\n <WorkspaceFileManagerContextMenu\n contextMenu={{ x: view.contextMenu.x, y: view.contextMenu.y }}\n contextMenuRef={contextMenuRef}\n items={items}\n positionMode=\"viewport\"\n onClose={() => {\n session.closeContextMenu();\n }}\n />\n );\n}\n\nfunction buildContextMenuRequest(input: {\n session: WorkspaceFileManagerSession;\n view: {\n contextMenu: {\n entry: Parameters<\n typeof resolveWorkspaceFileManagerContextMenuTarget\n >[0][\"entry\"];\n x: number;\n y: number;\n } | null;\n currentDirectoryPath: string;\n isBusy: boolean;\n isLoading: boolean;\n isMutating: boolean;\n };\n}): WorkspaceFileManagerContextMenuRequest {\n const { session, view } = input;\n const location = findWorkspaceFileLocationById(\n session.store.locationSections,\n session.store.selectedLocationId\n );\n return {\n currentDirectoryPath: view.currentDirectoryPath,\n isBusy: view.isBusy || view.isLoading || view.isMutating,\n isExternalLocation: isWorkspaceFileExternalLocation(location),\n isRecentLocation: isWorkspaceFileRecentLocation(location),\n isSearchMode: session.store.searchQuery.trim().length > 0,\n selectedLocationId: session.store.selectedLocationId,\n target: resolveWorkspaceFileManagerContextMenuTarget({\n currentDirectoryPath: view.currentDirectoryPath,\n entry: view.contextMenu?.entry ?? null\n })\n };\n}\n\nfunction isPromiseLike<T>(value: T | Promise<T>): value is Promise<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof value.then === \"function\"\n );\n}\n\nfunction areContextMenuItemsEquivalent(\n left: readonly WorkspaceFileManagerContextMenuItem[],\n right: readonly WorkspaceFileManagerContextMenuItem[]\n): boolean {\n if (left === right) {\n return true;\n }\n if (left.length !== right.length) {\n return false;\n }\n for (let index = 0; index < left.length; index += 1) {\n const leftItem = left[index];\n const rightItem = right[index];\n if (!leftItem || !rightItem || leftItem.id !== rightItem.id) {\n return false;\n }\n if (leftItem.type !== rightItem.type) {\n return false;\n }\n if (leftItem.type === \"item\" && rightItem.type === \"item\") {\n if (\n leftItem.label !== rightItem.label ||\n leftItem.disabled !== rightItem.disabled ||\n leftItem.danger !== rightItem.danger\n ) {\n return false;\n }\n }\n if (leftItem.type === \"submenu\" && rightItem.type === \"submenu\") {\n if (\n leftItem.label !== rightItem.label ||\n leftItem.disabled !== rightItem.disabled ||\n leftItem.loading !== rightItem.loading\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\nfunction useCloseContextMenuOnOutsideInteraction(input: {\n contextMenuRef: RefObject<HTMLDivElement | null>;\n isOpen: boolean;\n session: WorkspaceFileManagerSession;\n}): void {\n const { contextMenuRef, isOpen, session } = input;\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n function handlePointerDown(event: PointerEvent): void {\n const target = event.target;\n if (target instanceof Node && contextMenuRef.current?.contains(target)) {\n return;\n }\n if (\n target instanceof Element &&\n target.closest(\"[data-workspace-file-manager-submenu]\")\n ) {\n return;\n }\n session.closeContextMenu();\n }\n\n function handleKeyDown(event: KeyboardEvent): void {\n if (event.key === \"Escape\") {\n session.closeContextMenu();\n }\n }\n\n window.addEventListener(\"pointerdown\", handlePointerDown);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [contextMenuRef, isOpen, session]);\n}\n","import {\n ArrowLeftIcon,\n ArrowRightIcon,\n LaunchIcon,\n MenuSurface,\n ViewportMenuSurface,\n cn\n} from \"@tutti-os/ui-system\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactElement,\n type RefObject\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n OPEN_WITH_SUBMENU_WIDTH_PX,\n clampContextMenuPosition,\n estimateOpenWithSubmenuHeight,\n resolveOpenWithSubmenuPlacement,\n type OpenWithSubmenuPlacement\n} from \"./contextMenuPlacement.ts\";\nimport type {\n WorkspaceFileManagerContextMenuItem,\n WorkspaceFileManagerContextMenuSubmenuItem\n} from \"./workspaceFileManagerContextMenuTypes.ts\";\n\nexport interface WorkspaceFileManagerContextMenuProps {\n contextMenu: {\n x: number;\n y: number;\n } | null;\n contextMenuRef: RefObject<HTMLDivElement | null>;\n items: readonly WorkspaceFileManagerContextMenuItem[];\n positionMode?: \"local\" | \"viewport\";\n onClose: () => void;\n}\n\nexport function WorkspaceFileManagerContextMenu({\n contextMenu,\n contextMenuRef,\n items,\n positionMode = \"local\",\n onClose\n}: WorkspaceFileManagerContextMenuProps): ReactElement | null {\n const [position, setPosition] = useState({\n x: contextMenu?.x ?? 0,\n y: contextMenu?.y ?? 0\n });\n\n useLayoutEffect(() => {\n if (!contextMenu) {\n return;\n }\n setPosition((current) =>\n current.x === contextMenu.x && current.y === contextMenu.y\n ? current\n : { x: contextMenu.x, y: contextMenu.y }\n );\n }, [contextMenu?.x, contextMenu?.y]);\n\n useLayoutEffect(() => {\n if (!contextMenu) {\n return;\n }\n const menu = contextMenuRef.current;\n if (!menu) {\n return;\n }\n const menuRect = menu.getBoundingClientRect();\n const boundary =\n positionMode === \"local\"\n ? menu.closest(\n \"[data-workspace-file-menu-boundary], [data-workspace-file-manager]\"\n )\n : null;\n if (positionMode === \"local\" && !boundary) {\n return;\n }\n const boundaryRect = boundary?.getBoundingClientRect();\n const next = clampContextMenuPosition({\n boundaryHeight: boundaryRect?.height ?? window.innerHeight,\n boundaryWidth: boundaryRect?.width ?? window.innerWidth,\n menuHeight: menuRect.height,\n menuWidth: menuRect.width,\n x: contextMenu.x,\n y: contextMenu.y\n });\n // Bail out on identical coordinates — a fresh object every layout pass\n // retriggers render and can exceed React's maximum update depth.\n setPosition((current) =>\n current.x === next.x && current.y === next.y ? current : next\n );\n }, [contextMenu?.x, contextMenu?.y, contextMenuRef, items, positionMode]);\n\n if (!contextMenu || items.length === 0) {\n return null;\n }\n\n const menu = (\n <MenuSurface\n ref={contextMenuRef}\n data-workspace-file-manager-context-menu=\"\"\n className={cn(\n // `is-open` keeps host CSS that keys off the class (not only data-state)\n // from leaving the surface at opacity:0.\n \"is-open w-[220px] overflow-visible p-1\",\n positionMode === \"viewport\" ? \"fixed\" : \"absolute\"\n )}\n role=\"menu\"\n style={{\n left: `${position.x}px`,\n top: `${position.y}px`,\n // Prefer the host CSS var when present; fall back to a stable stacking\n // value so an unset var cannot invalidate the entire z-index declaration.\n // Viewport menus need to clear typical workbench chrome (≈ z-10..50).\n zIndex:\n positionMode === \"viewport\"\n ? \"var(--workspace-file-manager-dialog-overlay-z-index, 10050)\"\n : \"var(--workspace-file-manager-dialog-overlay-z-index, 20)\"\n }}\n onContextMenu={(event) => {\n event.preventDefault();\n }}\n >\n {items.map((item) => (\n <ContextMenuItemRenderer key={item.id} item={item} onClose={onClose} />\n ))}\n </MenuSurface>\n );\n\n // Viewport menus must leave overflow/contain ancestors (e.g. Agent tool\n // sidebar `[contain:layout_paint]`) or fixed coords are clipped off-screen.\n if (positionMode === \"viewport\" && typeof document !== \"undefined\") {\n return createPortal(menu, document.body);\n }\n\n return menu;\n}\n\nfunction ContextMenuItemRenderer({\n item,\n onClose,\n activateOnPointerDown = false\n}: {\n activateOnPointerDown?: boolean;\n item: WorkspaceFileManagerContextMenuItem;\n onClose: () => void;\n}): ReactElement | null {\n switch (item.type) {\n case \"separator\":\n return <ContextMenuDivider />;\n case \"submenu\":\n return <ContextMenuSubmenu item={item} onClose={onClose} />;\n case \"item\":\n return (\n <ContextMenuActionButton\n activateOnPointerDown={activateOnPointerDown}\n danger={item.danger}\n disabled={item.disabled}\n icon={item.icon ?? <LaunchIcon className=\"size-4\" />}\n label={item.label}\n onClick={() => {\n onClose();\n void item.onSelect();\n }}\n />\n );\n default:\n return null;\n }\n}\n\nfunction ContextMenuActionButton({\n activateOnPointerDown = false,\n danger = false,\n disabled = false,\n icon,\n label,\n onClick\n}: {\n activateOnPointerDown?: boolean;\n danger?: boolean;\n disabled?: boolean;\n icon: ReactElement;\n label: string;\n onClick: () => void;\n}): ReactElement {\n const pointerActivatedRef = useRef(false);\n const pointerActivationResetTimerRef = useRef<number | null>(null);\n\n useEffect(() => {\n return () => {\n if (pointerActivationResetTimerRef.current !== null) {\n window.clearTimeout(pointerActivationResetTimerRef.current);\n }\n };\n }, []);\n\n return (\n <button\n className={cn(\n \"flex h-8 w-full items-center gap-2 rounded-md border-0 bg-transparent px-2 text-left text-[13px] transition-colors disabled:cursor-default disabled:opacity-50\",\n danger\n ? \"text-[var(--state-danger)] hover:bg-[var(--on-danger)]\"\n : \"text-[var(--text-primary)] hover:bg-transparency-block\"\n )}\n disabled={disabled}\n role=\"menuitem\"\n type=\"button\"\n onClick={() => {\n if (pointerActivatedRef.current) {\n pointerActivatedRef.current = false;\n if (pointerActivationResetTimerRef.current !== null) {\n window.clearTimeout(pointerActivationResetTimerRef.current);\n pointerActivationResetTimerRef.current = null;\n }\n return;\n }\n onClick();\n }}\n onPointerDown={(event) => {\n if (!activateOnPointerDown || disabled || event.button !== 0) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n pointerActivatedRef.current = true;\n if (pointerActivationResetTimerRef.current !== null) {\n window.clearTimeout(pointerActivationResetTimerRef.current);\n }\n pointerActivationResetTimerRef.current = window.setTimeout(() => {\n pointerActivatedRef.current = false;\n pointerActivationResetTimerRef.current = null;\n }, 750);\n onClick();\n }}\n >\n <span\n className={cn(\n \"grid size-4 flex-none place-items-center\",\n danger ? \"text-[var(--state-danger)]\" : \"text-[var(--text-secondary)]\"\n )}\n >\n {icon}\n </span>\n {label}\n </button>\n );\n}\n\nfunction ContextMenuDivider(): ReactElement {\n return (\n <div className=\"mx-2 my-0.5 h-px bg-[var(--border-1)]\" role=\"separator\" />\n );\n}\n\nfunction ContextMenuSubmenu({\n item,\n onClose\n}: {\n item: WorkspaceFileManagerContextMenuSubmenuItem;\n onClose: () => void;\n}): ReactElement {\n const triggerRef = useRef<HTMLDivElement | null>(null);\n const triggerButtonRef = useRef<HTMLButtonElement | null>(null);\n const submenuRef = useRef<HTMLDivElement | null>(null);\n const focusSubmenuOnOpenRef = useRef(false);\n const [open, setOpen] = useState(false);\n const controlledChildren = item.children;\n const [asyncChildren, setAsyncChildren] = useState<\n readonly WorkspaceFileManagerContextMenuItem[] | null\n >(null);\n const [asyncLoading, setAsyncLoading] = useState(false);\n const [submenuPosition, setSubmenuPosition] =\n useState<OpenWithSubmenuPlacement>({\n left: 0,\n mode: \"right\",\n top: 0,\n width: OPEN_WITH_SUBMENU_WIDTH_PX\n });\n const closeTimerRef = useRef<number | null>(null);\n const children = controlledChildren ?? asyncChildren ?? [];\n const isLoading = Boolean(item.loading) || asyncLoading;\n const childActionCount = countRenderableMenuActions(children);\n const estimatedSubmenuHeight = estimateOpenWithSubmenuHeight({\n applicationCount: Math.max(0, childActionCount - 2),\n isLoading,\n showExternalSection: childActionCount > 0 || isLoading,\n showOpenInAppBrowser: false,\n showOpenInDefaultBrowser: false,\n showOpenInFileViewer: false,\n showOpenWithOther: false\n });\n\n useEffect(() => {\n if (controlledChildren !== undefined) {\n setAsyncChildren(null);\n setAsyncLoading(false);\n }\n }, [controlledChildren]);\n\n const cancelClose = useCallback(() => {\n if (closeTimerRef.current !== null) {\n window.clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n const scheduleClose = useCallback(() => {\n cancelClose();\n closeTimerRef.current = window.setTimeout(() => {\n setOpen(false);\n closeTimerRef.current = null;\n }, 120);\n }, [cancelClose]);\n\n const ensureChildrenLoaded = useCallback(() => {\n if (\n controlledChildren !== undefined ||\n asyncChildren !== null ||\n !item.loadChildren ||\n asyncLoading\n ) {\n return;\n }\n setAsyncLoading(true);\n void item\n .loadChildren()\n .then((next) => {\n setAsyncChildren(next);\n })\n .catch(() => {\n setAsyncChildren([]);\n })\n .finally(() => {\n setAsyncLoading(false);\n });\n }, [asyncChildren, asyncLoading, controlledChildren, item]);\n\n const openSubmenu = useCallback(() => {\n focusSubmenuOnOpenRef.current = false;\n cancelClose();\n ensureChildrenLoaded();\n setOpen(true);\n }, [cancelClose, ensureChildrenLoaded]);\n\n const closeSubmenuToTrigger = useCallback(() => {\n cancelClose();\n setOpen(false);\n triggerButtonRef.current?.focus();\n }, [cancelClose]);\n\n const updateSubmenuPosition = useCallback(() => {\n const trigger = triggerRef.current;\n if (!trigger) {\n return;\n }\n const triggerRect = trigger.getBoundingClientRect();\n const parentMenuRect =\n trigger\n .closest<HTMLElement>(\"[data-workspace-file-manager-context-menu]\")\n ?.getBoundingClientRect() ?? triggerRect;\n const maxHeight = Math.min(\n estimatedSubmenuHeight,\n 480,\n Math.max(0, window.innerHeight - 24)\n );\n setSubmenuPosition(\n resolveOpenWithSubmenuPlacement({\n parentMenuLeft: parentMenuRect.left,\n parentMenuTop: parentMenuRect.top,\n submenuHeight: maxHeight,\n triggerLeft: triggerRect.left,\n triggerRight: triggerRect.right,\n triggerTop: triggerRect.top,\n viewportHeight: window.innerHeight,\n viewportWidth: window.innerWidth\n })\n );\n }, [estimatedSubmenuHeight]);\n\n useEffect(() => {\n return () => {\n cancelClose();\n };\n }, [cancelClose]);\n\n useLayoutEffect(() => {\n if (!open) {\n return;\n }\n updateSubmenuPosition();\n }, [open, updateSubmenuPosition, children.length, isLoading]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n window.addEventListener(\"resize\", updateSubmenuPosition);\n window.addEventListener(\"scroll\", updateSubmenuPosition, true);\n return () => {\n window.removeEventListener(\"resize\", updateSubmenuPosition);\n window.removeEventListener(\"scroll\", updateSubmenuPosition, true);\n };\n }, [open, updateSubmenuPosition]);\n\n useEffect(() => {\n if (!open || !focusSubmenuOnOpenRef.current) {\n return;\n }\n focusSubmenuOnOpenRef.current = false;\n const frame = window.requestAnimationFrame(() => {\n submenuRef.current\n ?.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")\n ?.focus();\n });\n return () => {\n window.cancelAnimationFrame(frame);\n };\n }, [open, submenuPosition.mode]);\n\n return (\n <div\n ref={triggerRef}\n className=\"relative\"\n onPointerEnter={openSubmenu}\n onPointerLeave={scheduleClose}\n >\n <button\n ref={triggerButtonRef}\n aria-expanded={open}\n aria-haspopup=\"menu\"\n className={cn(\n \"flex h-8 w-full items-center gap-2 rounded-md border-0 bg-transparent px-2 text-left text-[13px] text-[var(--text-primary)] transition-colors hover:bg-transparency-block disabled:cursor-default disabled:opacity-50\",\n open && \"bg-transparency-block\"\n )}\n disabled={item.disabled}\n role=\"menuitem\"\n type=\"button\"\n onClick={(event) => {\n focusSubmenuOnOpenRef.current = event.detail === 0;\n setOpen((current) => {\n const next = !current;\n if (next) {\n cancelClose();\n ensureChildrenLoaded();\n } else {\n focusSubmenuOnOpenRef.current = false;\n }\n return next;\n });\n }}\n onKeyDown={(event) => {\n if (event.key !== \"ArrowRight\") {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n focusSubmenuOnOpenRef.current = true;\n cancelClose();\n ensureChildrenLoaded();\n setOpen(true);\n }}\n >\n <span className=\"grid size-4 flex-none place-items-center text-[var(--text-secondary)]\">\n {item.icon ?? <LaunchIcon className=\"size-4\" />}\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n <span\n aria-hidden=\"true\"\n className=\"grid size-4 flex-none place-items-center text-[var(--text-tertiary)]\"\n >\n <ArrowRightIcon className=\"size-4\" />\n </span>\n </button>\n <ViewportMenuSurface\n ref={submenuRef}\n aria-label={item.label}\n data-workspace-file-manager-submenu=\"\"\n data-workspace-file-manager-submenu-mode={submenuPosition.mode}\n open={open}\n className=\"max-h-[min(480px,calc(100vh-24px))] max-w-[calc(100vw-24px)] overflow-y-auto p-1\"\n dismissOnEscape={false}\n dismissOnPointerDownOutside={false}\n dismissOnScroll={false}\n placement={{\n type: \"absolute\",\n left: submenuPosition.left,\n top: submenuPosition.top,\n boundaryPoint: { x: -1, y: -1 }\n }}\n role=\"menu\"\n style={{\n width: submenuPosition.width,\n zIndex: \"calc(var(--z-panel-popover) + 200)\"\n }}\n onPointerEnter={openSubmenu}\n onPointerLeave={scheduleClose}\n onKeyDown={(event) => {\n if (event.key === \"ArrowLeft\" || event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n closeSubmenuToTrigger();\n return;\n }\n if (event.key !== \"ArrowDown\" && event.key !== \"ArrowUp\") {\n return;\n }\n const buttons = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>(\n \"button:not(:disabled)\"\n )\n );\n if (buttons.length === 0) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const currentIndex = buttons.indexOf(\n document.activeElement as HTMLButtonElement\n );\n const offset = event.key === \"ArrowDown\" ? 1 : -1;\n const nextIndex =\n currentIndex < 0\n ? offset > 0\n ? 0\n : buttons.length - 1\n : (currentIndex + offset + buttons.length) % buttons.length;\n buttons[nextIndex]?.focus();\n }}\n >\n {submenuPosition.mode === \"overlay\" ? (\n <>\n <ContextMenuActionButton\n activateOnPointerDown\n icon={<ArrowLeftIcon className=\"size-4\" />}\n label={item.label}\n onClick={closeSubmenuToTrigger}\n />\n <ContextMenuDivider />\n </>\n ) : null}\n {isLoading ? (\n <div className=\"px-2 py-1.5 text-[11px] text-[var(--text-tertiary)]\">\n {item.loadingLabel ?? \"…\"}\n </div>\n ) : null}\n {children.map((child) => (\n <ContextMenuItemRenderer\n key={child.id}\n activateOnPointerDown\n item={child}\n onClose={onClose}\n />\n ))}\n </ViewportMenuSurface>\n </div>\n );\n}\n\nfunction countRenderableMenuActions(\n items: readonly WorkspaceFileManagerContextMenuItem[]\n): number {\n let count = 0;\n for (const item of items) {\n if (item.type === \"item\") {\n count += 1;\n } else if (item.type === \"submenu\") {\n count += 1 + countRenderableMenuActions(item.children ?? []);\n }\n }\n return count;\n}\n","export const CONTEXT_MENU_ITEM_HEIGHT_PX = 32;\nexport const CONTEXT_MENU_PADDING_PX = 8;\nexport const CONTEXT_MENU_SUBMENU_GAP_PX = 4;\nexport const CONTEXT_MENU_VIEWPORT_PADDING_PX = 12;\nexport const OPEN_WITH_SUBMENU_WIDTH_PX = 220;\n\nexport type OpenWithSubmenuPlacementMode = \"right\" | \"left\" | \"overlay\";\n\nexport interface OpenWithSubmenuPlacement {\n left: number;\n mode: OpenWithSubmenuPlacementMode;\n top: number;\n width: number;\n}\n\nexport function resolveOpenWithSubmenuPlacement(input: {\n gap?: number;\n overlayHeaderHeight?: number;\n padding?: number;\n parentMenuLeft: number;\n parentMenuTop: number;\n submenuHeight: number;\n submenuWidth?: number;\n triggerLeft: number;\n triggerRight: number;\n triggerTop: number;\n viewportHeight: number;\n viewportWidth: number;\n}): OpenWithSubmenuPlacement {\n const gap = input.gap ?? CONTEXT_MENU_SUBMENU_GAP_PX;\n const padding = input.padding ?? CONTEXT_MENU_VIEWPORT_PADDING_PX;\n const availableWidth = Math.max(0, input.viewportWidth - padding * 2);\n const width = Math.min(\n input.submenuWidth ?? OPEN_WITH_SUBMENU_WIDTH_PX,\n availableWidth\n );\n const rightLeft = input.triggerRight + gap;\n const leftLeft = input.triggerLeft - gap - width;\n const rightFits = rightLeft + width <= input.viewportWidth - padding;\n const leftFits = leftLeft >= padding;\n const mode: OpenWithSubmenuPlacementMode = rightFits\n ? \"right\"\n : leftFits\n ? \"left\"\n : \"overlay\";\n const rawLeft =\n mode === \"right\"\n ? rightLeft\n : mode === \"left\"\n ? leftLeft\n : input.parentMenuLeft;\n const rawTop = mode === \"overlay\" ? input.parentMenuTop : input.triggerTop;\n const overlayHeaderHeight =\n mode === \"overlay\"\n ? (input.overlayHeaderHeight ?? CONTEXT_MENU_ITEM_HEIGHT_PX)\n : 0;\n const availableHeight = Math.max(0, input.viewportHeight - padding * 2);\n const height = Math.min(\n Math.max(0, input.submenuHeight + overlayHeaderHeight),\n availableHeight\n );\n const maxLeft = Math.max(padding, input.viewportWidth - padding - width);\n const maxTop = Math.max(padding, input.viewportHeight - padding - height);\n\n return {\n left: Math.max(padding, Math.min(rawLeft, maxLeft)),\n mode,\n top: Math.max(padding, Math.min(rawTop, maxTop)),\n width\n };\n}\n\nexport function clampContextMenuPosition(input: {\n boundaryHeight: number;\n boundaryWidth: number;\n menuHeight: number;\n menuWidth: number;\n padding?: number;\n x: number;\n y: number;\n}): { x: number; y: number } {\n const padding = input.padding ?? CONTEXT_MENU_PADDING_PX;\n const maxX = Math.max(\n padding,\n input.boundaryWidth - input.menuWidth - padding\n );\n const maxY = Math.max(\n padding,\n input.boundaryHeight - input.menuHeight - padding\n );\n\n return {\n x: Math.min(Math.max(input.x, padding), maxX),\n y: Math.min(Math.max(input.y, padding), maxY)\n };\n}\n\nexport function estimateOpenWithSubmenuHeight(input: {\n applicationCount: number;\n isLoading: boolean;\n showExternalSection: boolean;\n showOpenInAppBrowser: boolean;\n showOpenInDefaultBrowser: boolean;\n showOpenInFileViewer?: boolean;\n showOpenWithOther: boolean;\n}): number {\n let itemCount = 0;\n\n if (input.showOpenInFileViewer) {\n itemCount += 1;\n }\n if (input.showOpenInAppBrowser) {\n itemCount += 1;\n }\n if (shouldShowOpenWithSectionDivider(input)) {\n itemCount += 1;\n }\n if (input.isLoading) {\n itemCount += 1;\n }\n itemCount += input.applicationCount;\n if (input.showOpenInDefaultBrowser) {\n itemCount += 1;\n }\n if (input.showOpenWithOther) {\n itemCount += 2;\n }\n\n return itemCount * CONTEXT_MENU_ITEM_HEIGHT_PX + CONTEXT_MENU_PADDING_PX * 2;\n}\n\nexport function shouldShowOpenWithSectionDivider(input: {\n showExternalSection: boolean;\n showOpenInAppBrowser: boolean;\n showOpenInFileViewer?: boolean;\n}): boolean {\n return (\n input.showExternalSection &&\n (input.showOpenInFileViewer === true || input.showOpenInAppBrowser)\n );\n}\n","import { useSnapshot } from \"valtio\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport {\n resolveWorkspaceFileManagerContextMenuViewState,\n resolveWorkspaceFileManagerDialogsViewState,\n resolveWorkspaceFileManagerPanelsViewState,\n resolveWorkspaceFileManagerRootViewState,\n resolveWorkspaceFileManagerToolbarViewState\n} from \"../services/internal/workspaceFileManagerViewModel.ts\";\nimport type { WorkspaceFileManagerSession } from \"../services/workspaceFileManagerService.interface.ts\";\n\nexport function useWorkspaceFileManagerRootView(\n session: WorkspaceFileManagerSession\n): ReturnType<typeof resolveWorkspaceFileManagerRootViewState> {\n const state = useSnapshot(\n session.store\n ) as WorkspaceFileManagerSession[\"store\"];\n\n return resolveWorkspaceFileManagerRootViewState({ state });\n}\n\nexport function useWorkspaceFileManagerToolbarView(\n session: WorkspaceFileManagerSession,\n i18n: WorkspaceFileManagerI18nRuntime\n) {\n const state = useSnapshot(\n session.store\n ) as WorkspaceFileManagerSession[\"store\"];\n\n return {\n view: resolveWorkspaceFileManagerToolbarViewState({\n copy: i18n,\n state\n })\n };\n}\n\nexport function useWorkspaceFileManagerPanelsView(\n session: WorkspaceFileManagerSession\n) {\n const state = useSnapshot(\n session.store\n ) as WorkspaceFileManagerSession[\"store\"];\n\n return {\n state,\n view: resolveWorkspaceFileManagerPanelsViewState({\n state\n })\n };\n}\n\nexport function useWorkspaceFileManagerDialogsView(\n session: WorkspaceFileManagerSession\n) {\n const state = useSnapshot(\n session.store\n ) as WorkspaceFileManagerSession[\"store\"];\n\n return {\n state,\n view: resolveWorkspaceFileManagerDialogsViewState({\n state\n })\n };\n}\n\nexport function useWorkspaceFileManagerContextMenuView(\n session: WorkspaceFileManagerSession\n) {\n const state = useSnapshot(\n session.store\n ) as WorkspaceFileManagerSession[\"store\"];\n\n return {\n state,\n view: resolveWorkspaceFileManagerContextMenuViewState({\n state\n })\n };\n}\n","import {\n buildWorkspaceFileBreadcrumbs,\n normalizeWorkspaceFilePath\n} from \"../workspaceFileManagerModel.ts\";\nimport {\n findWorkspaceFileLocationById,\n isWorkspaceFileExternalLocation,\n isWorkspaceFileRecentLocation\n} from \"../workspaceFileManagerLocations.ts\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../../i18n/workspaceFileManagerI18n.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileSearchEntry,\n WorkspaceFileManagerState\n} from \"../workspaceFileManagerTypes.ts\";\nimport { findWorkspaceFileEntry } from \"./model/entryLookup.ts\";\n\nexport interface WorkspaceFileManagerRootViewState {\n currentDirectoryPath: string;\n isBusy: boolean;\n locationSections: WorkspaceFileManagerState[\"locationSections\"];\n selectedLocationId: string | null;\n}\n\nexport interface WorkspaceFileManagerToolbarViewState {\n breadcrumbs: Array<{ label: string; path: string }>;\n canSearch: boolean;\n canGoBack: boolean;\n canGoForward: boolean;\n currentDirectoryPath: string;\n isBusy: boolean;\n isLoading: boolean;\n isMutating: boolean;\n isSearching: boolean;\n searchQuery: string;\n}\n\nexport interface WorkspaceFileManagerPanelsViewState {\n canMove: boolean;\n contextMenuEntryPath: string | null;\n entries: readonly WorkspaceFileEntry[];\n error: string | null;\n isSearchMode: boolean;\n inlineRenameEntryPath: string | null;\n inlineRenameValidation: WorkspaceFileManagerState[\"inlineRenameValidation\"];\n isLoading: boolean;\n isRenaming: boolean;\n isSearching: boolean;\n pendingDirectoryPath: string | null;\n previewState: WorkspaceFileManagerState[\"previewState\"];\n searchEntries: readonly WorkspaceFileSearchEntry[];\n searchError: string | null;\n searchQuery: string;\n selectedEntry: WorkspaceFileEntry | null;\n selectedPath: string | null;\n}\n\nexport interface WorkspaceFileManagerDialogsViewState {\n createDialog: WorkspaceFileManagerState[\"createDialog\"];\n deleteDialogEntry: WorkspaceFileEntry | null;\n isBusy: boolean;\n isDeleting: boolean;\n isRenaming: boolean;\n isViewing: boolean;\n unsupportedDialog: {\n actions?: WorkspaceFileManagerState[\"unsupportedDialog\"] extends infer T\n ? T extends { actions?: infer A }\n ? A\n : never\n : never;\n entry?: WorkspaceFileEntry;\n kind: \"view\";\n message?: string | null;\n title?: string | null;\n } | null;\n}\n\nexport interface WorkspaceFileManagerContextMenuViewState {\n contextMenu: {\n entry: WorkspaceFileEntry | null;\n x: number;\n y: number;\n } | null;\n currentDirectoryPath: string;\n isBusy: boolean;\n isLoading: boolean;\n isMutating: boolean;\n}\n\nexport function resolveWorkspaceFileManagerRootViewState(input: {\n state: WorkspaceFileManagerState;\n}): WorkspaceFileManagerRootViewState {\n const { state } = input;\n return {\n currentDirectoryPath: state.currentDirectoryPath,\n isBusy: state.busyAction !== null,\n locationSections: state.locationSections,\n selectedLocationId: state.selectedLocationId\n };\n}\n\nexport function resolveWorkspaceFileManagerToolbarViewState(input: {\n copy: WorkspaceFileManagerI18nRuntime;\n state: WorkspaceFileManagerState;\n}): WorkspaceFileManagerToolbarViewState {\n const { copy, state } = input;\n const currentDirectoryPath = normalizeWorkspaceFilePath(\n state.currentDirectoryPath,\n state.root\n );\n return {\n breadcrumbs: buildWorkspaceFileBreadcrumbs(\n currentDirectoryPath,\n copy.t(\"breadcrumbRootLabel\"),\n state.root\n ),\n canSearch: state.capabilities.canSearch,\n canGoBack:\n currentDirectoryPath !== normalizeWorkspaceFilePath(state.root) &&\n state.navigationBackStack.length > 0,\n canGoForward: state.navigationForwardStack.length > 0,\n currentDirectoryPath,\n isBusy: state.busyAction !== null,\n isLoading: state.isLoading,\n isMutating: state.isMutating,\n isSearching: state.isSearching,\n searchQuery: state.searchQuery\n };\n}\n\nexport function resolveWorkspaceFileManagerPanelsViewState(input: {\n state: WorkspaceFileManagerState;\n}): WorkspaceFileManagerPanelsViewState {\n const { state } = input;\n const isRecentLocation = isWorkspaceFileRecentLocation(\n findWorkspaceFileLocationById(\n state.locationSections,\n state.selectedLocationId\n )\n );\n const isExternalLocation = isWorkspaceFileExternalLocation(\n findWorkspaceFileLocationById(\n state.locationSections,\n state.selectedLocationId\n )\n );\n return {\n canMove:\n state.capabilities.canMove && !isRecentLocation && !isExternalLocation,\n contextMenuEntryPath: state.contextMenuEntryPath,\n entries: state.entries,\n error: state.error,\n isSearchMode: state.searchQuery.trim().length > 0,\n inlineRenameEntryPath: state.inlineRenameEntryPath,\n inlineRenameValidation: state.inlineRenameValidation,\n isLoading: state.isLoading,\n isRenaming: state.busyAction === \"rename\",\n isSearching: state.isSearching,\n pendingDirectoryPath: state.pendingDirectoryPath,\n previewState: state.previewState,\n searchEntries: state.searchEntries,\n searchError: state.searchError,\n searchQuery: state.searchQuery,\n selectedEntry: findSelectedEntry(state),\n selectedPath: state.selectedPath\n };\n}\n\nexport function resolveWorkspaceFileManagerDialogsViewState(input: {\n state: WorkspaceFileManagerState;\n}): WorkspaceFileManagerDialogsViewState {\n const { state } = input;\n const unsupportedDialogEntry = state.unsupportedDialog?.entryPath\n ? findEntry(state, state.unsupportedDialog.entryPath)\n : null;\n\n return {\n createDialog: state.createDialog,\n deleteDialogEntry: state.deleteDialog\n ? findEntry(state, state.deleteDialog.entryPath)\n : null,\n isBusy: state.busyAction !== null,\n isDeleting: state.busyAction === \"delete\",\n isRenaming: state.busyAction === \"rename\",\n isViewing: state.busyAction === \"view\",\n unsupportedDialog: state.unsupportedDialog\n ? {\n actions: state.unsupportedDialog.actions,\n entry: unsupportedDialogEntry ?? undefined,\n kind: state.unsupportedDialog.kind,\n message: state.unsupportedDialog.message,\n title: state.unsupportedDialog.title\n }\n : null\n };\n}\n\nexport function resolveWorkspaceFileManagerContextMenuViewState(input: {\n state: WorkspaceFileManagerState;\n}): WorkspaceFileManagerContextMenuViewState {\n const { state } = input;\n const contextMenuEntry = state.contextMenu?.entryPath\n ? findEntry(state, state.contextMenu.entryPath)\n : null;\n\n return {\n contextMenu: state.contextMenu\n ? {\n entry: contextMenuEntry,\n x: state.contextMenu.x,\n y: state.contextMenu.y\n }\n : null,\n currentDirectoryPath: state.currentDirectoryPath,\n isBusy: state.busyAction !== null,\n isLoading: state.isLoading,\n isMutating: state.isMutating\n };\n}\n\nfunction findSelectedEntry(\n state: WorkspaceFileManagerState\n): WorkspaceFileEntry | null {\n return findWorkspaceFileEntry(state, state.selectedPath);\n}\n\nfunction findEntry(\n state: WorkspaceFileManagerState,\n entryPath: string\n): WorkspaceFileEntry | null {\n return findWorkspaceFileEntry(state, entryPath);\n}\n","import type { ReactElement } from \"react\";\nimport type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\n\n/**\n * Right-click target classification. Hosts resolve menus for each kind via\n * `resolveContextMenu`.\n */\nexport type WorkspaceFileManagerContextMenuTarget =\n | {\n kind: \"blank\";\n directoryPath: string;\n }\n | {\n kind: \"directory\";\n directoryPath: string;\n entry: WorkspaceFileEntry;\n }\n | {\n kind: \"file\";\n directoryPath: string;\n entry: WorkspaceFileEntry;\n };\n\nexport interface WorkspaceFileManagerContextMenuRequest {\n currentDirectoryPath: string;\n isBusy: boolean;\n isExternalLocation: boolean;\n isRecentLocation: boolean;\n isSearchMode: boolean;\n selectedLocationId: string | null;\n target: WorkspaceFileManagerContextMenuTarget;\n}\n\nexport type WorkspaceFileManagerContextMenuItem =\n | WorkspaceFileManagerContextMenuActionItem\n | WorkspaceFileManagerContextMenuSeparatorItem\n | WorkspaceFileManagerContextMenuSubmenuItem;\n\nexport interface WorkspaceFileManagerContextMenuActionItem {\n type: \"item\";\n id: string;\n label: string;\n icon?: ReactElement | null;\n disabled?: boolean;\n danger?: boolean;\n onSelect: () => void | Promise<void>;\n}\n\nexport interface WorkspaceFileManagerContextMenuSeparatorItem {\n type: \"separator\";\n id: string;\n}\n\nexport interface WorkspaceFileManagerContextMenuSubmenuItem {\n type: \"submenu\";\n id: string;\n label: string;\n icon?: ReactElement | null;\n disabled?: boolean;\n /**\n * Host-driven loading indicator for controlled `children` (for example while\n * open-with applications are being fetched outside `loadChildren`).\n */\n loading?: boolean;\n loadingLabel?: string;\n children?: readonly WorkspaceFileManagerContextMenuItem[];\n loadChildren?: () => Promise<readonly WorkspaceFileManagerContextMenuItem[]>;\n}\n\nexport type ResolveWorkspaceFileManagerContextMenu = (\n request: WorkspaceFileManagerContextMenuRequest\n) =>\n | readonly WorkspaceFileManagerContextMenuItem[]\n | Promise<readonly WorkspaceFileManagerContextMenuItem[]>;\n\nexport function resolveWorkspaceFileManagerContextMenuTarget(input: {\n currentDirectoryPath: string;\n entry: WorkspaceFileEntry | null;\n}): WorkspaceFileManagerContextMenuTarget {\n if (!input.entry) {\n return {\n kind: \"blank\",\n directoryPath: input.currentDirectoryPath\n };\n }\n if (input.entry.kind === \"directory\") {\n return {\n kind: \"directory\",\n directoryPath: input.currentDirectoryPath,\n entry: input.entry\n };\n }\n return {\n kind: \"file\",\n directoryPath: input.currentDirectoryPath,\n entry: input.entry\n };\n}\n","import {\n Button,\n ConfirmationDialog,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input\n} from \"@tutti-os/ui-system\";\nimport type { ReactElement } from \"react\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\nimport type { WorkspaceFileManagerHostFallbackAction } from \"./workspaceFileManagerHostTypes.ts\";\n\nexport function WorkspaceFileManagerCreateDialog({\n busy,\n copy,\n dialog,\n onClose,\n onConfirm,\n onNameChange\n}: {\n busy: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n dialog: {\n errorMessage: string | null;\n kind: \"directory\" | \"file\";\n name: string;\n } | null;\n onClose: () => void;\n onConfirm: () => void;\n onNameChange: (name: string) => void;\n}): ReactElement | null {\n if (!dialog) {\n return null;\n }\n\n return (\n <Dialog\n open\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n >\n <DialogContent aria-busy={busy} showCloseButton={false}>\n <form\n className=\"grid gap-3\"\n onSubmit={(event) => {\n event.preventDefault();\n onConfirm();\n }}\n >\n <DialogHeader>\n <DialogTitle>\n {dialog.kind === \"directory\"\n ? copy.t(\"createDirectoryLabel\")\n : copy.t(\"createFileLabel\")}\n </DialogTitle>\n </DialogHeader>\n <Input\n autoFocus\n placeholder={\n dialog.kind === \"directory\"\n ? copy.t(\"createDirectoryPlaceholder\")\n : copy.t(\"createFilePlaceholder\")\n }\n value={dialog.name}\n onChange={(event) => {\n onNameChange(event.currentTarget.value);\n }}\n />\n {dialog.errorMessage ? (\n <p className=\"text-[13px] text-[var(--state-danger)]\">\n {dialog.errorMessage}\n </p>\n ) : null}\n <DialogFooter>\n <Button\n disabled={busy}\n size=\"dialog\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onClose}\n >\n {copy.t(\"cancelLabel\")}\n </Button>\n <Button disabled={busy} size=\"dialog\" type=\"submit\">\n {copy.t(\"createActionLabel\")}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport function WorkspaceFileManagerDeleteDialog({\n busy,\n copy,\n entry,\n onClose,\n onConfirm\n}: {\n busy: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n entry: WorkspaceFileEntry | null;\n onClose: () => void;\n onConfirm: () => void;\n}): ReactElement | null {\n if (!entry) {\n return null;\n }\n\n return (\n <ConfirmationDialog\n cancelLabel={copy.t(\"cancelLabel\")}\n confirmBusy={busy}\n confirmLabel={busy ? copy.t(\"deletingLabel\") : copy.t(\"deleteLabel\")}\n description={copy.t(\"deleteConfirmDescription\", { name: entry.name })}\n open\n title={copy.t(\"deleteLabel\")}\n tone=\"destructive\"\n onConfirm={onConfirm}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n />\n );\n}\n\nexport function WorkspaceFileManagerUnsupportedDialog({\n copy,\n dialog,\n isViewing,\n onAction,\n onClose\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n dialog: {\n actions?: WorkspaceFileManagerHostFallbackAction[] | null;\n message?: string | null;\n title?: string | null;\n entry?: WorkspaceFileEntry;\n } | null;\n isViewing: boolean;\n onAction: (action: WorkspaceFileManagerHostFallbackAction) => void;\n onClose: () => void;\n}): ReactElement | null {\n if (!dialog) {\n return null;\n }\n\n const title = dialog.title ?? copy.t(\"unsupportedViewTitle\");\n const body =\n dialog.message ??\n copy.t(\"unsupportedViewBody\", { name: dialog.entry?.name ?? \"\" });\n const actions =\n dialog.actions?.filter((action) => action.kind !== \"none\") ?? [];\n\n return (\n <Dialog\n open\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n >\n <DialogContent\n showCloseButton={false}\n onEscapeKeyDown={(event) => {\n if (isViewing) {\n event.preventDefault();\n }\n }}\n onInteractOutside={(event) => {\n if (isViewing) {\n event.preventDefault();\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{body}</DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button\n disabled={isViewing}\n size=\"dialog\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onClose}\n >\n {copy.t(\"closeLabel\")}\n </Button>\n {actions.map((action) => (\n <Button\n key={action.kind}\n disabled={isViewing}\n size=\"dialog\"\n type=\"button\"\n className=\"shadow-none\"\n onClick={() => {\n onAction(action);\n }}\n >\n {action.label ??\n (action.kind === \"download\"\n ? copy.t(\"downloadLabel\")\n : copy.t(\"openLabel\"))}\n </Button>\n ))}\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import {\n useCallback,\n useMemo,\n type MouseEvent as ReactMouseEvent,\n type ReactElement\n} from \"react\";\nimport type { TuttiDateLocale } from \"@tutti-os/ui-system/date-format\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type { WorkspaceFileManagerSession } from \"../services/workspaceFileManagerService.interface.ts\";\nimport { workspaceFileSearchEntryToEntry } from \"../services/workspaceFileManagerModel.ts\";\nimport type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\nimport {\n type WorkspaceFileManagerEntryDragMode,\n WorkspaceFileManagerPanels\n} from \"./WorkspaceFileManagerPanels.tsx\";\nimport {\n sortWorkspaceFileEntriesForArrangeMode,\n type WorkspaceFileManagerArrangeMode\n} from \"./workspaceFileManagerArrangeMode.ts\";\nimport type { WorkspaceFileManagerLayoutMode } from \"./workspaceFileManagerLayoutMode.ts\";\nimport { useWorkspaceFileEntryIconUrls } from \"./useWorkspaceFileEntryIconUrls.ts\";\nimport { useWorkspaceFileManagerPreviewActions } from \"./useWorkspaceFileManagerPreviewActions.tsx\";\nimport {\n buildWorkspaceFileManagerVisibleTreeRows,\n collectWorkspaceFileManagerVisibleTreeEntries,\n type WorkspaceFileManagerVisibleTreeRow\n} from \"./workspaceFileManagerVisibleTree.ts\";\nimport type { WorkspaceFileManagerPreviewActionsConfig } from \"./workspaceFileManagerPreviewActionTypes.ts\";\nimport { useWorkspaceFileManagerPanelsView } from \"./useWorkspaceFileManagerService.ts\";\n\nexport function WorkspaceFileManagerPanelsContainer({\n arrangeMode,\n dateLocale,\n entryDragMode,\n i18n,\n layoutMode,\n onCopyEntry,\n onDirectoryExpanded,\n onEntryDragStart,\n onOpenContextMenu,\n previewActions,\n resolveEntryIconUrl,\n session,\n showPreviewPanel\n}: {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n dateLocale?: TuttiDateLocale;\n entryDragMode?: WorkspaceFileManagerEntryDragMode;\n i18n: WorkspaceFileManagerI18nRuntime;\n layoutMode: WorkspaceFileManagerLayoutMode;\n onCopyEntry?: () => Promise<void> | void;\n onDirectoryExpanded?: (path: string) => void;\n onEntryDragStart?: (\n entry: WorkspaceFileEntry,\n dataTransfer: DataTransfer\n ) => void;\n onOpenContextMenu: (\n event: ReactMouseEvent<HTMLElement>,\n entry: WorkspaceFileEntry | null\n ) => void;\n previewActions?: WorkspaceFileManagerPreviewActionsConfig;\n resolveEntryIconUrl?: (\n entry: WorkspaceFileEntry\n ) => Promise<string | null | undefined>;\n session: WorkspaceFileManagerSession;\n showPreviewPanel: boolean;\n}): ReactElement {\n const { state, view } = useWorkspaceFileManagerPanelsView(session);\n const arrangedEntries = useMemo(\n () => sortWorkspaceFileEntriesForArrangeMode(state.entries, arrangeMode),\n [arrangeMode, state.entries]\n );\n const searchEntries = useMemo(\n () => view.searchEntries.map(workspaceFileSearchEntryToEntry),\n [view.searchEntries]\n );\n const searchEntryContextByPath = useMemo(() => {\n const contextByPath = new Map<string, string>();\n for (const entry of view.searchEntries) {\n contextByPath.set(entry.path, entry.directoryPath);\n }\n return contextByPath;\n }, [view.searchEntries]);\n const treeRows = useMemo(\n () =>\n buildWorkspaceFileManagerVisibleTreeRows({\n arrangeMode,\n directoryExpansionByPath: state.directoryExpansionByPath,\n entries: arrangedEntries,\n expandedDirectoryPaths: state.expandedDirectoryPaths\n }),\n [\n arrangeMode,\n arrangedEntries,\n state.directoryExpansionByPath,\n state.expandedDirectoryPaths\n ]\n );\n const searchTreeRows = useMemo<WorkspaceFileManagerVisibleTreeRow[]>(\n () =>\n searchEntries.map((entry) => ({\n depth: 0,\n entry,\n expanded: false,\n expandable: false,\n kind: \"entry\",\n loadingChildren: false\n })),\n [searchEntries]\n );\n const displayedEntries = view.isSearchMode ? searchEntries : arrangedEntries;\n const displayedTreeRows = view.isSearchMode ? searchTreeRows : treeRows;\n const visibleTreeEntries = useMemo(\n () => collectWorkspaceFileManagerVisibleTreeEntries(displayedTreeRows),\n [displayedTreeRows]\n );\n const panelState = useMemo(\n () => ({\n entries: displayedEntries,\n error: view.isSearchMode ? view.searchError : state.error,\n isLoading: view.isSearchMode ? view.isSearching : state.isLoading,\n isSearchMode: view.isSearchMode\n }),\n [\n displayedEntries,\n state.error,\n state.isLoading,\n view.isSearchMode,\n view.isSearching,\n view.searchError\n ]\n );\n const {\n iconUrlByCacheKey,\n reportEntryIconViewportEnter,\n reportEntryIconViewportLeave\n } = useWorkspaceFileEntryIconUrls({\n entries: layoutMode === \"list\" ? visibleTreeEntries : displayedEntries,\n includeImageThumbnails: true,\n resolveEntryIconUrl\n });\n const resolvedPreviewActions = useWorkspaceFileManagerPreviewActions({\n config: previewActions,\n copy: i18n,\n entry: view.selectedEntry,\n onCopyEntry,\n session,\n state\n });\n const handleBlankContextMenu = useCallback(\n (event: ReactMouseEvent<HTMLElement>) => {\n onOpenContextMenu(event, null);\n },\n [onOpenContextMenu]\n );\n const handleCancelInlineRename = useCallback(() => {\n session.cancelInlineRename();\n }, [session]);\n const handleClearInlineRenameValidation = useCallback(() => {\n session.clearInlineRenameValidation();\n }, [session]);\n const handleConfirmInlineRename = useCallback(\n (newName: string) => session.confirmInlineRename(newName),\n [session]\n );\n const handleMoveEntry = useCallback(\n (entry: WorkspaceFileEntry, targetDirectoryPath: string) => {\n void session.moveEntry(entry, targetDirectoryPath);\n },\n [session]\n );\n const handleOpenEntry = useCallback(\n (entry: WorkspaceFileEntry) => {\n if (entry.kind === \"directory\") {\n onDirectoryExpanded?.(entry.path);\n }\n void session.openEntry(entry);\n },\n [onDirectoryExpanded, session]\n );\n const handleSelect = useCallback(\n (path: string) => {\n session.select(path);\n },\n [session]\n );\n const handleToggleDirectoryExpanded = useCallback(\n (entry: WorkspaceFileEntry, expanded: boolean) => {\n if (!expanded) {\n onDirectoryExpanded?.(entry.path);\n }\n void session.toggleDirectoryExpanded(entry);\n },\n [onDirectoryExpanded, session]\n );\n\n return (\n <WorkspaceFileManagerPanels\n arrangeMode={arrangeMode}\n canMove={view.isSearchMode ? false : view.canMove}\n contextMenuEntryPath={view.contextMenuEntryPath}\n copy={i18n}\n dateLocale={dateLocale}\n entryContextByPath={view.isSearchMode ? searchEntryContextByPath : null}\n entryDragMode={entryDragMode}\n iconUrlByCacheKey={iconUrlByCacheKey}\n inlineRenameEntryPath={view.inlineRenameEntryPath}\n inlineRenameValidation={view.inlineRenameValidation}\n isRenaming={view.isRenaming}\n layoutMode={layoutMode}\n pendingDirectoryPath={view.pendingDirectoryPath}\n previewActions={resolvedPreviewActions}\n previewState={view.previewState}\n selectedEntry={view.selectedEntry}\n selectedPath={view.selectedPath}\n showPreviewPanel={showPreviewPanel}\n state={panelState}\n treeRows={displayedTreeRows}\n onBlankContextMenu={handleBlankContextMenu}\n onCancelInlineRename={handleCancelInlineRename}\n onClearInlineRenameValidation={handleClearInlineRenameValidation}\n onConfirmInlineRename={handleConfirmInlineRename}\n onEntryContextMenu={onOpenContextMenu}\n onEntryDragStart={onEntryDragStart}\n onEntryIconViewportEnter={reportEntryIconViewportEnter}\n onEntryIconViewportLeave={reportEntryIconViewportLeave}\n onMoveEntry={handleMoveEntry}\n onOpenEntry={handleOpenEntry}\n onSelect={handleSelect}\n onToggleDirectoryExpanded={handleToggleDirectoryExpanded}\n />\n );\n}\n","import {\n ArrowRightIcon,\n FileCodeIcon,\n FileTextIcon,\n LoadingIcon,\n ScrollArea,\n VideoFileIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { TuttiDateLocale } from \"@tutti-os/ui-system/date-format\";\nimport { resolveWorkspaceFileVisualKind } from \"@tutti-os/workspace-file-preview\";\nimport { WorkspaceFilePreviewSurface as SharedWorkspaceFilePreviewSurface } from \"@tutti-os/workspace-file-preview/react\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport { WorkspaceFileManagerPreviewActionBar } from \"./WorkspaceFileManagerPreviewActionBar.tsx\";\nimport type { WorkspaceFileManagerPreviewAction } from \"./workspaceFileManagerPreviewActionTypes.ts\";\nimport type {\n CSSProperties,\n DragEvent as ReactDragEvent,\n KeyboardEvent as ReactKeyboardEvent,\n MouseEvent as ReactMouseEvent,\n PointerEvent as ReactPointerEvent,\n ReactElement,\n RefObject\n} from \"react\";\nimport {\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState\n} from \"react\";\nimport {\n formatWorkspaceFileBytes,\n formatWorkspaceFileModifiedTime,\n splitWorkspaceFileName\n} from \"../services/workspaceFileManagerModel.ts\";\nimport type {\n WorkspaceFileActivationTarget,\n WorkspaceFileEntry,\n WorkspaceFileManagerInlineRenameValidation,\n WorkspaceFilePreviewState\n} from \"../services/workspaceFileManagerTypes.ts\";\nimport { WorkspaceFileManagerIconGrid } from \"./WorkspaceFileManagerIconGrid.tsx\";\nimport {\n WorkspaceFileEntryIcon,\n WorkspaceFolderFallbackIcon,\n WorkspaceImageFallbackIcon\n} from \"./WorkspaceFileEntryIcon.tsx\";\nimport {\n resolveWorkspaceFileEntryArrangeDateMs,\n type WorkspaceFileManagerArrangeMode\n} from \"./workspaceFileManagerArrangeMode.ts\";\nimport type { WorkspaceFileManagerLayoutMode } from \"./workspaceFileManagerLayoutMode.ts\";\nimport {\n readWorkspaceFileManagerPreviewWidth,\n workspaceFileManagerPaneResizeStep,\n workspaceFileManagerPreviewDefaultWidth,\n writeWorkspaceFileManagerPreviewWidth\n} from \"./workspaceFileManagerPaneSizing.ts\";\nimport type { WorkspaceFileManagerVisibleTreeRow } from \"./workspaceFileManagerVisibleTree.ts\";\nimport {\n workspaceFileManagerCompactTableGridClassName,\n workspaceFileManagerCompactTableGridTemplate,\n workspaceFileManagerTableGridClassName,\n workspaceFileManagerTableGridTemplate\n} from \"./workspaceFileManagerTableSizing.ts\";\n\nconst workspaceFileManagerTableGridStyle: CSSProperties = {\n gridTemplateColumns: workspaceFileManagerTableGridTemplate\n};\nconst workspaceFileManagerCompactTableGridStyle: CSSProperties = {\n gridTemplateColumns: workspaceFileManagerCompactTableGridTemplate\n};\nconst workspaceFileManagerPreviewDetailGridStyle: CSSProperties = {\n gridTemplateColumns: \"minmax(82px, 0.8fr) minmax(0, 1.2fr)\"\n};\nconst workspaceFileManagerStackedBreakpoint = 600;\nconst workspaceFileManagerPreviewMinWidth = 220;\nconst workspaceFileManagerTableMinWidth = 360;\nconst workspaceFileManagerMoveDragThreshold = 4;\nconst workspaceFileManagerMoveDragAutoScrollDelayMs = 500;\nconst workspaceFileManagerMoveDragAutoScrollEdgePx = 48;\nconst workspaceFileManagerMoveDragAutoScrollStepPx = 12;\nconst workspaceFileManagerEntryOpenClickIntervalMs = 500;\n\nexport type WorkspaceFileManagerEntryDragMode = \"external\" | \"internal-move\";\n\nexport function WorkspaceFileManagerPanels({\n arrangeMode,\n canMove,\n contextMenuEntryPath,\n dateLocale,\n entryDragMode,\n entrySelectionEnabled = true,\n entryContextByPath = null,\n copy,\n iconUrlByCacheKey,\n inlineRenameEntryPath,\n inlineRenameValidation,\n isRenaming,\n layoutMode,\n pendingDirectoryPath,\n previewActions,\n previewState,\n onEntryIconViewportLeave,\n onEntryIconViewportEnter,\n selectedEntry,\n selectedPath,\n showPreviewPanel: showPreviewPanelEnabled = true,\n state,\n treeRows,\n onBlankContextMenu,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename,\n onEntryContextMenu,\n onEntryDragStart,\n onMoveEntry,\n onOpenEntry,\n onSelect,\n onToggleDirectoryExpanded\n}: {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n canMove: boolean;\n contextMenuEntryPath: string | null;\n dateLocale?: TuttiDateLocale;\n entryDragMode?: WorkspaceFileManagerEntryDragMode;\n entrySelectionEnabled?: boolean;\n entryContextByPath?: ReadonlyMap<string, string> | null;\n copy: WorkspaceFileManagerI18nRuntime;\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n inlineRenameEntryPath: string | null;\n inlineRenameValidation: WorkspaceFileManagerInlineRenameValidation | null;\n isRenaming: boolean;\n layoutMode: WorkspaceFileManagerLayoutMode;\n pendingDirectoryPath: string | null;\n previewActions?: readonly WorkspaceFileManagerPreviewAction[];\n previewState: WorkspaceFilePreviewState;\n onEntryIconViewportLeave?: (entry: WorkspaceFileEntry) => void;\n onEntryIconViewportEnter?: (entry: WorkspaceFileEntry) => void;\n selectedEntry: WorkspaceFileEntry | null;\n selectedPath: string | null;\n showPreviewPanel?: boolean;\n state: {\n entries: readonly WorkspaceFileEntry[];\n error: string | null;\n isLoading: boolean;\n isSearchMode: boolean;\n };\n treeRows: readonly WorkspaceFileManagerVisibleTreeRow[];\n onBlankContextMenu: (event: ReactMouseEvent<HTMLElement>) => void;\n onCancelInlineRename: () => void;\n onClearInlineRenameValidation: () => void;\n onConfirmInlineRename: (newName: string) => Promise<boolean>;\n onEntryContextMenu: (\n event: ReactMouseEvent<HTMLElement>,\n entry: WorkspaceFileEntry\n ) => void;\n onEntryDragStart?: (\n entry: WorkspaceFileEntry,\n dataTransfer: DataTransfer\n ) => void;\n onMoveEntry: (entry: WorkspaceFileEntry, targetDirectoryPath: string) => void;\n onOpenEntry: (entry: WorkspaceFileEntry) => void;\n onSelect: (path: string) => void;\n onToggleDirectoryExpanded: (\n entry: WorkspaceFileEntry,\n expanded: boolean\n ) => void;\n}): ReactElement {\n const { rootRef } = useWorkspaceFileManagerStackedLayout(\n workspaceFileManagerStackedBreakpoint\n );\n const previewResizeRef = useRef<{\n currentWidth: number;\n pointerId: number;\n startX: number;\n startWidth: number;\n maxWidth: number;\n } | null>(null);\n const [previewPaneWidth, setPreviewPaneWidth] = useState(\n readWorkspaceFileManagerPreviewWidth\n );\n const [previewPaneMaxWidth, setPreviewPaneMaxWidth] = useState(\n workspaceFileManagerPreviewDefaultWidth\n );\n const [moveDragPreview, setMoveDragPreview] =\n useState<WorkspaceFileManagerMoveDragPreview | null>(null);\n const lastEntryClickRef = useRef<{ path: string; timeMs: number } | null>(\n null\n );\n const moveDragAutoScrollRef =\n useRef<WorkspaceFileManagerMoveDragAutoScroll | null>(null);\n const moveDragRef = useRef<WorkspaceFileManagerMoveDrag | null>(null);\n const suppressNextClickRef = useRef(false);\n const moveTargetEntries = useMemo(\n () =>\n layoutMode === \"list\"\n ? treeRows.flatMap((row) => (row.kind === \"entry\" ? [row.entry] : []))\n : state.entries,\n [layoutMode, state.entries, treeRows]\n );\n const entriesRef = useRef<readonly WorkspaceFileEntry[]>(moveTargetEntries);\n const nativeEntryDragEnabled =\n onEntryDragStart !== undefined &&\n (entryDragMode === \"external\" || (entryDragMode === undefined && !canMove));\n const internalMoveEnabled = canMove && !nativeEntryDragEnabled;\n const dateColumnLabel = resolveWorkspaceFileManagerDateColumnLabel(\n copy,\n arrangeMode\n );\n const stopMoveDragAutoScroll = useCallback((): void => {\n const autoScroll = moveDragAutoScrollRef.current;\n if (autoScroll?.frameId !== null && autoScroll?.frameId !== undefined) {\n window.cancelAnimationFrame(autoScroll.frameId);\n }\n moveDragAutoScrollRef.current = null;\n }, []);\n const updateMoveDragAutoScroll = useCallback(\n (clientY: number): void => {\n const scrollViewport = resolveWorkspaceFileManagerTableScrollViewport(\n rootRef.current\n );\n const direction = resolveWorkspaceFileManagerMoveDragAutoScrollDirection(\n scrollViewport,\n clientY\n );\n if (!scrollViewport || direction === null) {\n stopMoveDragAutoScroll();\n return;\n }\n\n const current = moveDragAutoScrollRef.current;\n if (\n current?.scrollViewport === scrollViewport &&\n current.direction === direction\n ) {\n current.lastClientY = clientY;\n return;\n }\n\n stopMoveDragAutoScroll();\n\n const nextAutoScroll: WorkspaceFileManagerMoveDragAutoScroll = {\n direction,\n enteredAtMs: window.performance.now(),\n frameId: null,\n lastClientY: clientY,\n scrollViewport\n };\n\n const step = (timestamp: number) => {\n if (moveDragAutoScrollRef.current !== nextAutoScroll) {\n return;\n }\n\n const nextDirection =\n resolveWorkspaceFileManagerMoveDragAutoScrollDirection(\n nextAutoScroll.scrollViewport,\n nextAutoScroll.lastClientY\n );\n if (nextDirection !== nextAutoScroll.direction) {\n stopMoveDragAutoScroll();\n return;\n }\n\n if (\n timestamp - nextAutoScroll.enteredAtMs >=\n workspaceFileManagerMoveDragAutoScrollDelayMs\n ) {\n nextAutoScroll.scrollViewport.scrollTop +=\n nextAutoScroll.direction *\n workspaceFileManagerMoveDragAutoScrollStepPx;\n }\n\n nextAutoScroll.frameId = window.requestAnimationFrame(step);\n };\n\n moveDragAutoScrollRef.current = nextAutoScroll;\n nextAutoScroll.frameId = window.requestAnimationFrame(step);\n },\n [rootRef, stopMoveDragAutoScroll]\n );\n const handleEntryPointerDown = useCallback(\n (entry: WorkspaceFileEntry, event: ReactPointerEvent<HTMLElement>) => {\n if (!internalMoveEnabled || event.button !== 0) {\n return;\n }\n\n moveDragRef.current = {\n active: false,\n entry,\n startX: event.clientX,\n startY: event.clientY\n };\n },\n [internalMoveEnabled]\n );\n const shouldSuppressEntryClick = useCallback((): boolean => {\n if (!suppressNextClickRef.current) {\n return false;\n }\n suppressNextClickRef.current = false;\n return true;\n }, []);\n const handleTablePanelContextMenu = useCallback(\n (event: ReactMouseEvent<HTMLElement>): void => {\n const target = event.target;\n if (\n target instanceof Element &&\n target.closest(\"[data-workspace-file-entry-path]\")\n ) {\n return;\n }\n onBlankContextMenu(event);\n },\n [onBlankContextMenu]\n );\n const handleEntryClick = useCallback(\n (entry: WorkspaceFileEntry): void => {\n if (shouldSuppressEntryClick()) {\n lastEntryClickRef.current = null;\n return;\n }\n\n const now = Date.now();\n const lastClick = lastEntryClickRef.current;\n if (\n lastClick?.path === entry.path &&\n now - lastClick.timeMs <= workspaceFileManagerEntryOpenClickIntervalMs\n ) {\n lastEntryClickRef.current = null;\n onOpenEntry(entry);\n return;\n }\n\n lastEntryClickRef.current = { path: entry.path, timeMs: now };\n if (!entrySelectionEnabled) {\n return;\n }\n onSelect(entry.path);\n },\n [entrySelectionEnabled, onOpenEntry, onSelect, shouldSuppressEntryClick]\n );\n useEffect(() => {\n lastEntryClickRef.current = null;\n entriesRef.current = moveTargetEntries;\n }, [moveTargetEntries]);\n useEffect(() => {\n function handleDocumentPointerMove(event: PointerEvent | MouseEvent): void {\n const drag = moveDragRef.current;\n if (!drag) {\n return;\n }\n\n const deltaX = event.clientX - drag.startX;\n const deltaY = event.clientY - drag.startY;\n if (\n !drag.active &&\n Math.hypot(deltaX, deltaY) >= workspaceFileManagerMoveDragThreshold\n ) {\n drag.active = true;\n }\n if (drag.active) {\n const targetEntry = resolveMoveDragTargetEntry(\n entriesRef.current,\n drag.entry,\n event.clientX,\n event.clientY\n );\n setMoveDragPreview({\n entry: drag.entry,\n targetDirectoryPath: targetEntry?.path ?? null,\n x: event.clientX,\n y: event.clientY\n });\n updateMoveDragAutoScroll(event.clientY);\n event.preventDefault();\n }\n }\n\n function handleDocumentPointerUp(event: PointerEvent | MouseEvent): void {\n const drag = moveDragRef.current;\n moveDragRef.current = null;\n stopMoveDragAutoScroll();\n setMoveDragPreview(null);\n if (!drag?.active) {\n return;\n }\n\n suppressNextClickRef.current = true;\n event.preventDefault();\n if (!internalMoveEnabled) {\n return;\n }\n\n const targetEntry = resolveMoveDragTargetEntry(\n entriesRef.current,\n drag.entry,\n event.clientX,\n event.clientY\n );\n if (targetEntry) {\n onMoveEntry(drag.entry, targetEntry.path);\n }\n }\n\n document.addEventListener(\"pointermove\", handleDocumentPointerMove, true);\n document.addEventListener(\"mousemove\", handleDocumentPointerMove, true);\n document.addEventListener(\"pointerup\", handleDocumentPointerUp, true);\n document.addEventListener(\"mouseup\", handleDocumentPointerUp, true);\n return () => {\n document.removeEventListener(\n \"pointermove\",\n handleDocumentPointerMove,\n true\n );\n document.removeEventListener(\n \"mousemove\",\n handleDocumentPointerMove,\n true\n );\n document.removeEventListener(\"pointerup\", handleDocumentPointerUp, true);\n document.removeEventListener(\"mouseup\", handleDocumentPointerUp, true);\n stopMoveDragAutoScroll();\n };\n }, [\n internalMoveEnabled,\n onMoveEntry,\n stopMoveDragAutoScroll,\n updateMoveDragAutoScroll\n ]);\n const showPreviewPanel = showPreviewPanelEnabled && layoutMode === \"list\";\n const useStackedPreview = false;\n const previewPaneClassName = useStackedPreview\n ? \"min-w-0 border-t border-[var(--border-1)]\"\n : \"min-w-[220px] border-l border-[var(--border-1)]\";\n const tableGridClassName = useStackedPreview\n ? workspaceFileManagerCompactTableGridClassName\n : workspaceFileManagerTableGridClassName;\n const tableGridStyle = useStackedPreview\n ? workspaceFileManagerCompactTableGridStyle\n : workspaceFileManagerTableGridStyle;\n const tableCellPaddingClassName = \"px-4\";\n const clampPreviewPaneWidth = useCallback(\n (width: number, maxWidth?: number): number => {\n const resolvedMaxWidth =\n typeof maxWidth === \"number\"\n ? Math.max(workspaceFileManagerPreviewMinWidth, maxWidth)\n : Number.POSITIVE_INFINITY;\n return Math.min(\n Math.max(width, workspaceFileManagerPreviewMinWidth),\n resolvedMaxWidth\n );\n },\n []\n );\n const resolvePreviewPaneMaxWidth = useCallback((): number => {\n const containerWidth =\n rootRef.current?.getBoundingClientRect().width ??\n workspaceFileManagerTableMinWidth + workspaceFileManagerPreviewMinWidth;\n return Math.max(\n workspaceFileManagerPreviewMinWidth,\n containerWidth - workspaceFileManagerTableMinWidth\n );\n }, [rootRef]);\n\n useLayoutEffect(() => {\n const element = rootRef.current;\n if (!element || useStackedPreview || !showPreviewPanel) {\n return;\n }\n\n const publishLayout = () => {\n const maxWidth = resolvePreviewPaneMaxWidth();\n setPreviewPaneMaxWidth(maxWidth);\n setPreviewPaneWidth((currentWidth) =>\n clampPreviewPaneWidth(currentWidth, maxWidth)\n );\n };\n\n publishLayout();\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", publishLayout);\n return () => {\n window.removeEventListener(\"resize\", publishLayout);\n };\n }\n\n const observer = new ResizeObserver(publishLayout);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [\n clampPreviewPaneWidth,\n resolvePreviewPaneMaxWidth,\n rootRef,\n showPreviewPanel,\n useStackedPreview\n ]);\n\n const handlePreviewResizePointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>): void => {\n if (event.button !== 0) {\n return;\n }\n\n const maxWidth = resolvePreviewPaneMaxWidth();\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n previewResizeRef.current = {\n currentWidth: previewPaneWidth,\n pointerId: event.pointerId,\n startX: event.clientX,\n startWidth: previewPaneWidth,\n maxWidth\n };\n },\n [previewPaneWidth, resolvePreviewPaneMaxWidth]\n );\n\n const handlePreviewResizePointerMove = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>): void => {\n const resize = previewResizeRef.current;\n if (!resize || resize.pointerId !== event.pointerId) {\n return;\n }\n\n const deltaX = event.clientX - resize.startX;\n resize.currentWidth = clampPreviewPaneWidth(\n resize.startWidth - deltaX,\n resize.maxWidth\n );\n setPreviewPaneWidth(resize.currentWidth);\n },\n [clampPreviewPaneWidth]\n );\n\n const handlePreviewResizePointerEnd = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>): void => {\n const resize = previewResizeRef.current;\n if (!resize || resize.pointerId !== event.pointerId) {\n return;\n }\n\n previewResizeRef.current = null;\n writeWorkspaceFileManagerPreviewWidth(resize.currentWidth);\n event.currentTarget.releasePointerCapture(event.pointerId);\n },\n []\n );\n const handlePreviewResizeKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>): void => {\n let nextWidth: number | null = null;\n if (event.key === \"Home\") {\n event.preventDefault();\n nextWidth = workspaceFileManagerPreviewMinWidth;\n } else if (event.key === \"End\") {\n event.preventDefault();\n nextWidth = previewPaneMaxWidth;\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n nextWidth = clampPreviewPaneWidth(\n previewPaneWidth +\n (event.key === \"ArrowLeft\"\n ? workspaceFileManagerPaneResizeStep\n : -workspaceFileManagerPaneResizeStep),\n previewPaneMaxWidth\n );\n }\n if (nextWidth !== null) {\n setPreviewPaneWidth(nextWidth);\n writeWorkspaceFileManagerPreviewWidth(nextWidth);\n }\n },\n [clampPreviewPaneWidth, previewPaneMaxWidth, previewPaneWidth]\n );\n\n const tablePanel = (\n <div\n className={cn(\n \"flex min-h-0 min-w-0 flex-col overflow-hidden\",\n useStackedPreview ? \"h-[44%] max-h-[48%] flex-none\" : \"flex-1\"\n )}\n onContextMenu={handleTablePanelContextMenu}\n >\n {state.error ? (\n <FeedbackState message={state.error} />\n ) : state.isLoading && state.entries.length === 0 ? (\n <FeedbackState message={copy.t(\"loading\")} />\n ) : state.entries.length === 0 ? (\n <FeedbackState\n message={copy.t(\n state.isSearchMode ? \"noSearchResults\" : \"emptyDirectory\"\n )}\n />\n ) : (\n <ScrollArea className=\"min-h-0 flex-1 [&_[data-orientation=vertical][data-slot=scroll-area-scrollbar]]:opacity-100\">\n {layoutMode === \"icon\" ? (\n <WorkspaceFileManagerIconGrid\n contextMenuEntryPath={contextMenuEntryPath}\n copy={copy}\n draggable={nativeEntryDragEnabled}\n entries={state.entries}\n iconUrlByCacheKey={iconUrlByCacheKey}\n inlineRenameEntryPath={inlineRenameEntryPath}\n inlineRenameValidation={inlineRenameValidation}\n isRenaming={isRenaming}\n moveDragActive={moveDragPreview !== null}\n moveDragPreviewEntryPath={moveDragPreview?.entry.path ?? null}\n moveDragTargetEntryPath={\n moveDragPreview?.targetDirectoryPath ?? null\n }\n pendingDirectoryPath={pendingDirectoryPath}\n onEntryIconViewportLeave={onEntryIconViewportLeave}\n onEntryIconViewportEnter={onEntryIconViewportEnter}\n selectedPath={selectedPath}\n onCancelInlineRename={onCancelInlineRename}\n onClearInlineRenameValidation={onClearInlineRenameValidation}\n onConfirmInlineRename={onConfirmInlineRename}\n onContextMenu={onEntryContextMenu}\n onDragStart={onEntryDragStart}\n onEntryClick={handleEntryClick}\n onEntryPointerDown={handleEntryPointerDown}\n />\n ) : (\n <div className=\"flex flex-col\">\n <div\n className={cn(\n \"grid h-9 min-h-9 items-center gap-x-6 border-b border-[var(--border-1)] text-xs font-normal text-[var(--text-secondary)]\",\n tableGridClassName\n )}\n style={tableGridStyle}\n >\n <span\n className={cn(\n \"min-w-0 overflow-hidden\",\n tableCellPaddingClassName\n )}\n data-workspace-file-manager-name-column=\"\"\n >\n {copy.t(\"nameLabel\")}\n </span>\n <span\n className={cn(\"min-w-0 truncate\", tableCellPaddingClassName)}\n >\n {dateColumnLabel}\n </span>\n <span\n className={cn(\"min-w-0 truncate\", tableCellPaddingClassName)}\n >\n {copy.t(\"sizeLabel\")}\n </span>\n </div>\n {treeRows.map((row) =>\n row.kind === \"feedback\" ? (\n <TreeFeedbackRow\n key={row.key}\n copy={copy}\n depth={row.depth}\n gridClassName={tableGridClassName}\n gridStyle={tableGridStyle}\n message={row.message}\n status={row.status}\n tableCellPaddingClassName={tableCellPaddingClassName}\n />\n ) : (\n <EntryRow\n key={row.entry.path}\n contextMenuActive={contextMenuEntryPath === row.entry.path}\n copy={copy}\n arrangeMode={arrangeMode}\n dateLocale={dateLocale}\n depth={row.depth}\n entry={row.entry}\n contextLabel={entryContextByPath?.get(row.entry.path)}\n expanded={row.expanded}\n expandable={row.expandable}\n iconUrlByCacheKey={iconUrlByCacheKey}\n canMove={internalMoveEnabled}\n draggable={nativeEntryDragEnabled}\n gridClassName={tableGridClassName}\n gridStyle={tableGridStyle}\n inlineRenameValidation={\n inlineRenameEntryPath === row.entry.path\n ? inlineRenameValidation\n : null\n }\n isEnteringDirectory={\n pendingDirectoryPath === row.entry.path\n }\n isInlineRenaming={inlineRenameEntryPath === row.entry.path}\n isLoadingChildren={row.loadingChildren}\n isRenaming={isRenaming}\n moveDragActive={moveDragPreview !== null}\n moveDragSource={\n moveDragPreview?.entry.path === row.entry.path\n }\n moveDragTarget={\n moveDragPreview?.targetDirectoryPath === row.entry.path\n }\n tableCellPaddingClassName={tableCellPaddingClassName}\n selected={selectedPath === row.entry.path}\n onEntryIconViewportLeave={onEntryIconViewportLeave}\n onEntryIconViewportEnter={onEntryIconViewportEnter}\n onCancelInlineRename={onCancelInlineRename}\n onClearInlineRenameValidation={\n onClearInlineRenameValidation\n }\n onConfirmInlineRename={onConfirmInlineRename}\n onContextMenu={onEntryContextMenu}\n onDragStart={onEntryDragStart}\n onClick={handleEntryClick}\n onPointerDown={handleEntryPointerDown}\n onToggleDirectoryExpanded={onToggleDirectoryExpanded}\n />\n )\n )}\n </div>\n )}\n </ScrollArea>\n )}\n </div>\n );\n\n const previewPanel = showPreviewPanel ? (\n <aside\n className={cn(\n \"relative flex h-full min-h-0 flex-col gap-[14px] overflow-auto p-4\",\n useStackedPreview ? \"max-h-[44%] flex-none\" : \"flex-none\",\n previewPaneClassName\n )}\n style={\n useStackedPreview\n ? undefined\n : ({ width: previewPaneWidth } satisfies CSSProperties)\n }\n >\n <PreviewPane\n copy={copy}\n dateLocale={dateLocale}\n entry={selectedEntry}\n previewActions={previewActions}\n previewState={previewState}\n />\n </aside>\n ) : null;\n\n return (\n <div\n className=\"relative min-h-0 min-w-0 flex-1 overflow-hidden\"\n ref={rootRef}\n >\n <div\n className={cn(\n \"h-full min-h-0 min-w-0 bg-transparent\",\n useStackedPreview ? \"flex flex-col gap-3\" : \"flex\"\n )}\n >\n {tablePanel}\n {showPreviewPanel && !useStackedPreview ? (\n <div\n aria-label={copy.t(\"resizePreviewPanel\")}\n aria-orientation=\"vertical\"\n aria-valuemax={previewPaneMaxWidth}\n aria-valuemin={workspaceFileManagerPreviewMinWidth}\n aria-valuenow={previewPaneWidth}\n className=\"nodrag absolute top-0 bottom-0 z-[1] w-2 cursor-col-resize touch-none\"\n role=\"separator\"\n tabIndex={0}\n style={\n {\n right: previewPaneWidth - 4\n } satisfies CSSProperties\n }\n onPointerCancel={handlePreviewResizePointerEnd}\n onPointerDown={handlePreviewResizePointerDown}\n onPointerMove={handlePreviewResizePointerMove}\n onPointerUp={handlePreviewResizePointerEnd}\n onKeyDown={handlePreviewResizeKeyDown}\n />\n ) : null}\n {previewPanel}\n </div>\n {moveDragPreview ? (\n <MoveDragPreview\n iconUrlByCacheKey={iconUrlByCacheKey}\n preview={moveDragPreview}\n onEntryIconViewportLeave={onEntryIconViewportLeave}\n onEntryIconViewportEnter={onEntryIconViewportEnter}\n />\n ) : null}\n </div>\n );\n}\n\nfunction useWorkspaceFileManagerStackedLayout(breakpoint: number): {\n isStacked: boolean;\n rootRef: RefObject<HTMLDivElement | null>;\n} {\n const rootRef = useRef<HTMLDivElement | null>(null);\n const [isStacked, setIsStacked] = useState(false);\n\n useLayoutEffect(() => {\n const element = rootRef.current;\n if (!element) {\n return;\n }\n\n const publishLayout = () => {\n const nextIsStacked =\n Math.round(element.getBoundingClientRect().width) <= breakpoint;\n setIsStacked((current) =>\n current === nextIsStacked ? current : nextIsStacked\n );\n };\n\n publishLayout();\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", publishLayout);\n return () => {\n window.removeEventListener(\"resize\", publishLayout);\n };\n }\n\n const observer = new ResizeObserver(publishLayout);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [breakpoint]);\n\n return { isStacked, rootRef };\n}\n\nfunction resolveWorkspaceFileManagerDateColumnLabel(\n copy: WorkspaceFileManagerI18nRuntime,\n arrangeMode: WorkspaceFileManagerArrangeMode\n): string {\n switch (arrangeMode) {\n case \"lastOpened\":\n return copy.t(\"arrangeLastOpenedLabel\");\n case \"dateAdded\":\n return copy.t(\"arrangeDateAddedLabel\");\n case \"created\":\n return copy.t(\"arrangeCreatedLabel\");\n case \"modified\":\n default:\n return copy.t(\"modifiedLabel\");\n }\n}\n\nconst EntryRow = memo(function EntryRow({\n arrangeMode,\n canMove,\n contextMenuActive,\n contextLabel,\n copy,\n dateLocale,\n depth,\n draggable,\n entry,\n expanded,\n expandable,\n gridClassName,\n gridStyle,\n iconUrlByCacheKey,\n inlineRenameValidation,\n isEnteringDirectory,\n isInlineRenaming,\n isLoadingChildren,\n isRenaming,\n moveDragActive,\n moveDragSource,\n moveDragTarget,\n onEntryIconViewportLeave,\n onEntryIconViewportEnter,\n selected,\n tableCellPaddingClassName,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename,\n onContextMenu,\n onDragStart,\n onClick,\n onPointerDown,\n onToggleDirectoryExpanded\n}: {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n canMove: boolean;\n contextMenuActive: boolean;\n contextLabel?: string | null;\n copy: WorkspaceFileManagerI18nRuntime;\n dateLocale?: TuttiDateLocale;\n depth: number;\n draggable: boolean;\n entry: WorkspaceFileEntry;\n expanded: boolean;\n expandable: boolean;\n gridClassName: string;\n gridStyle: CSSProperties;\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n inlineRenameValidation: WorkspaceFileManagerInlineRenameValidation | null;\n isEnteringDirectory: boolean;\n isInlineRenaming: boolean;\n isLoadingChildren: boolean;\n isRenaming: boolean;\n moveDragActive: boolean;\n moveDragSource: boolean;\n moveDragTarget: boolean;\n onEntryIconViewportLeave?: (entry: WorkspaceFileEntry) => void;\n onEntryIconViewportEnter?: (entry: WorkspaceFileEntry) => void;\n onCancelInlineRename: () => void;\n onClearInlineRenameValidation: () => void;\n onConfirmInlineRename: (newName: string) => Promise<boolean>;\n onContextMenu: (\n event: ReactMouseEvent<HTMLElement>,\n entry: WorkspaceFileEntry\n ) => void;\n onDragStart?: (entry: WorkspaceFileEntry, dataTransfer: DataTransfer) => void;\n onClick: (entry: WorkspaceFileEntry) => void;\n onPointerDown: (\n entry: WorkspaceFileEntry,\n event: ReactPointerEvent<HTMLElement>\n ) => void;\n onToggleDirectoryExpanded: (\n entry: WorkspaceFileEntry,\n expanded: boolean\n ) => void;\n selected: boolean;\n tableCellPaddingClassName: string;\n}): ReactElement {\n const buttonRowRef = useRef<HTMLButtonElement | null>(null);\n const divRowRef = useRef<HTMLDivElement | null>(null);\n\n useLayoutEffect(() => {\n if (!selected) {\n return;\n }\n (buttonRowRef.current ?? divRowRef.current)?.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\"\n });\n }, [selected]);\n\n const rowClassName = cn(\n \"relative grid min-h-10 w-full items-center gap-x-6 border-b border-[var(--border-1)] px-0 text-left transition-colors\",\n gridClassName,\n isInlineRenaming\n ? \"cursor-default\"\n : \"cursor-pointer hover:bg-transparency-hover active:bg-[var(--transparency-active)]\",\n canMove && moveDragActive && \"cursor-grabbing\",\n selected || contextMenuActive || isInlineRenaming\n ? \"bg-transparency-block text-[var(--text-primary)]\"\n : \"text-[var(--text-secondary)]\",\n moveDragSource && \"opacity-55\",\n moveDragTarget &&\n \"bg-[var(--accent-bg)] text-[var(--text-primary)] outline outline-1 -outline-offset-1 outline-[var(--border-focus)]\",\n moveDragActive && !moveDragSource && !moveDragTarget && \"opacity-90\"\n );\n const rowProps = {\n className: rowClassName,\n \"data-workspace-file-entry-path\": entry.path,\n style: gridStyle,\n onContextMenu: (event: ReactMouseEvent<HTMLElement>) => {\n onContextMenu(event, entry);\n }\n };\n const nameCell = (\n <span\n className={cn(\n \"min-w-0 overflow-hidden\",\n !isInlineRenaming && \"pointer-events-none relative z-[1]\",\n tableCellPaddingClassName\n )}\n >\n <EntryNameCell\n copy={copy}\n contextLabel={contextLabel}\n entry={entry}\n iconUrlByCacheKey={iconUrlByCacheKey}\n inlineRenameValidation={inlineRenameValidation}\n isEnteringDirectory={isEnteringDirectory}\n isExpanded={expanded}\n isExpandable={expandable}\n isInlineRenaming={isInlineRenaming}\n isLoadingChildren={isLoadingChildren}\n isRenaming={isRenaming}\n treeDepth={depth}\n onEntryIconViewportLeave={onEntryIconViewportLeave}\n onEntryIconViewportEnter={onEntryIconViewportEnter}\n onCancelInlineRename={onCancelInlineRename}\n onClearInlineRenameValidation={onClearInlineRenameValidation}\n onConfirmInlineRename={onConfirmInlineRename}\n onToggleDirectoryExpanded={onToggleDirectoryExpanded}\n />\n </span>\n );\n const modifiedCell = (\n <span\n className={cn(\n \"truncate text-xs text-[var(--text-secondary)]\",\n !isInlineRenaming && \"pointer-events-none relative z-[1]\",\n tableCellPaddingClassName\n )}\n >\n {formatWorkspaceFileModifiedTime(\n resolveWorkspaceFileEntryArrangeDateMs(entry, arrangeMode),\n dateLocale\n )}\n </span>\n );\n const sizeCell = (\n <span\n className={cn(\n \"truncate text-xs text-[var(--text-secondary)]\",\n !isInlineRenaming && \"pointer-events-none relative z-[1]\",\n tableCellPaddingClassName\n )}\n >\n {entry.kind === \"directory\"\n ? \"--\"\n : formatWorkspaceFileBytes(entry.sizeBytes)}\n </span>\n );\n\n if (isInlineRenaming) {\n return (\n <div\n {...rowProps}\n aria-label={entry.name}\n draggable={false}\n ref={divRowRef}\n >\n {nameCell}\n {modifiedCell}\n {sizeCell}\n </div>\n );\n }\n\n return (\n <div\n {...rowProps}\n draggable={draggable}\n ref={divRowRef}\n onDragStart={(event: ReactDragEvent<HTMLElement>) => {\n if (!draggable) {\n event.preventDefault();\n return;\n }\n onDragStart?.(entry, event.dataTransfer);\n }}\n >\n <button\n aria-label={entry.name}\n className=\"absolute inset-0 z-0\"\n ref={buttonRowRef}\n type=\"button\"\n onPointerDown={(event) => {\n onPointerDown(entry, event);\n }}\n onClick={() => {\n onClick(entry);\n }}\n />\n {nameCell}\n {modifiedCell}\n {sizeCell}\n </div>\n );\n});\n\nfunction MoveDragPreview({\n iconUrlByCacheKey,\n preview,\n onEntryIconViewportLeave,\n onEntryIconViewportEnter\n}: {\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n preview: WorkspaceFileManagerMoveDragPreview;\n onEntryIconViewportLeave?: (entry: WorkspaceFileEntry) => void;\n onEntryIconViewportEnter?: (entry: WorkspaceFileEntry) => void;\n}): ReactElement {\n return (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed z-[60] flex max-w-[280px] items-center gap-2 rounded-md border border-[var(--line-1)] bg-[var(--background-fronted)] px-3 py-2 text-sm font-normal text-[var(--text-primary)] shadow-panel\"\n style={\n {\n left: preview.x,\n top: preview.y,\n transform: \"translate(12px, 12px)\"\n } satisfies CSSProperties\n }\n >\n <WorkspaceFileEntryIcon\n entry={preview.entry}\n frameClassName=\"size-7\"\n iconClassName=\"size-6\"\n iconUrlByCacheKey={iconUrlByCacheKey}\n onViewportLeave={onEntryIconViewportLeave}\n onViewportEnter={onEntryIconViewportEnter}\n />\n <span className=\"min-w-0 truncate\">{preview.entry.name}</span>\n </div>\n );\n}\n\ninterface WorkspaceFileManagerMoveDrag {\n active: boolean;\n entry: WorkspaceFileEntry;\n startX: number;\n startY: number;\n}\n\ninterface WorkspaceFileManagerMoveDragPreview {\n entry: WorkspaceFileEntry;\n targetDirectoryPath: string | null;\n x: number;\n y: number;\n}\n\ninterface WorkspaceFileManagerMoveDragAutoScroll {\n direction: -1 | 1;\n enteredAtMs: number;\n frameId: number | null;\n lastClientY: number;\n scrollViewport: HTMLElement;\n}\n\nfunction resolveWorkspaceFileManagerTableScrollViewport(\n rootElement: HTMLElement | null\n): HTMLElement | null {\n return (\n rootElement?.querySelector<HTMLElement>(\n '[data-slot=\"scroll-area-viewport\"]'\n ) ?? null\n );\n}\n\nfunction resolveWorkspaceFileManagerMoveDragAutoScrollDirection(\n scrollViewport: HTMLElement | null,\n clientY: number\n): -1 | 1 | null {\n if (!scrollViewport) {\n return null;\n }\n\n const { bottom, top } = scrollViewport.getBoundingClientRect();\n const canScrollUp = scrollViewport.scrollTop > 0;\n const canScrollDown =\n scrollViewport.scrollTop + scrollViewport.clientHeight <\n scrollViewport.scrollHeight;\n\n if (\n canScrollUp &&\n clientY <= top + workspaceFileManagerMoveDragAutoScrollEdgePx\n ) {\n return -1;\n }\n\n if (\n canScrollDown &&\n clientY >= bottom - workspaceFileManagerMoveDragAutoScrollEdgePx\n ) {\n return 1;\n }\n\n return null;\n}\n\nfunction resolveMoveDragTargetEntry(\n entries: readonly WorkspaceFileEntry[],\n movedEntry: WorkspaceFileEntry,\n x: number,\n y: number\n): WorkspaceFileEntry | null {\n const targetElement = document.elementFromPoint(x, y);\n const rowElement = targetElement?.closest<HTMLElement>(\n \"[data-workspace-file-entry-path]\"\n );\n const targetPath = rowElement?.dataset.workspaceFileEntryPath;\n const targetEntry = targetPath\n ? entries.find((entry) => entry.path === targetPath)\n : null;\n if (!targetEntry || !canMoveEntryToDirectory(movedEntry, targetEntry)) {\n return null;\n }\n return targetEntry;\n}\n\nfunction canMoveEntryToDirectory(\n movedEntry: WorkspaceFileEntry,\n targetEntry: WorkspaceFileEntry\n): boolean {\n return (\n movedEntry.kind !== \"unknown\" &&\n targetEntry.kind === \"directory\" &&\n movedEntry.path !== targetEntry.path &&\n !targetEntry.path.startsWith(`${movedEntry.path}/`)\n );\n}\n\nfunction TreeFeedbackRow({\n copy,\n depth,\n gridClassName,\n gridStyle,\n message,\n status,\n tableCellPaddingClassName\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n depth: number;\n gridClassName: string;\n gridStyle: CSSProperties;\n message?: string;\n status: \"empty\" | \"error\" | \"loading\";\n tableCellPaddingClassName: string;\n}): ReactElement {\n const resolvedMessage =\n status === \"loading\"\n ? copy.t(\"loading\")\n : status === \"empty\"\n ? copy.t(\"emptyDirectory\")\n : (message ?? copy.t(\"unknownErrorMessage\"));\n\n return (\n <div\n className={cn(\n \"grid min-h-9 w-full items-center gap-x-6 border-b border-[var(--border-1)] text-left text-xs text-[var(--text-tertiary)]\",\n gridClassName\n )}\n style={gridStyle}\n >\n <span className={tableCellPaddingClassName}>\n <span\n className=\"flex min-w-0 items-center gap-2\"\n style={workspaceFileManagerTreeIndentStyle(depth)}\n >\n <span className=\"size-5 shrink-0\" />\n {status === \"loading\" ? (\n <LoadingIcon className=\"size-3.5 shrink-0 animate-spin\" />\n ) : null}\n <span className=\"min-w-0 truncate\">{resolvedMessage}</span>\n </span>\n </span>\n <span aria-hidden=\"true\" />\n <span aria-hidden=\"true\" />\n </div>\n );\n}\n\nfunction DirectoryDisclosureButton({\n copy,\n entry,\n expanded,\n isLoading,\n show,\n onToggle\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n entry: WorkspaceFileEntry;\n expanded: boolean;\n isLoading: boolean;\n show: boolean;\n onToggle: (entry: WorkspaceFileEntry, expanded: boolean) => void;\n}): ReactElement {\n if (!show) {\n return <span aria-hidden=\"true\" className=\"size-5 shrink-0\" />;\n }\n\n return (\n <button\n aria-label={copy.t(\n expanded ? \"collapseFolderLabel\" : \"expandFolderLabel\"\n )}\n aria-expanded={expanded}\n className=\"pointer-events-auto grid size-5 shrink-0 place-items-center rounded text-[var(--text-tertiary)] transition-colors hover:bg-transparency-block hover:text-[var(--text-primary)]\"\n disabled={isLoading}\n type=\"button\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onToggle(entry, expanded);\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n >\n {isLoading ? (\n <LoadingIcon className=\"size-3 animate-spin\" />\n ) : (\n <ArrowRightIcon\n className={cn(\n \"size-3.5 transition-transform\",\n expanded && \"rotate-90\"\n )}\n />\n )}\n </button>\n );\n}\n\nfunction workspaceFileManagerTreeIndentStyle(depth: number): CSSProperties {\n return {\n paddingLeft: `${Math.max(0, depth) * 20}px`\n };\n}\n\nfunction EntryNameCell({\n contextLabel = null,\n copy,\n entry,\n iconUrlByCacheKey,\n inlineRenameValidation = null,\n isEnteringDirectory = false,\n isExpanded = false,\n isExpandable = false,\n isInlineRenaming = false,\n isLoadingChildren = false,\n isRenaming = false,\n treeDepth = 0,\n onEntryIconViewportLeave,\n onEntryIconViewportEnter,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename,\n onToggleDirectoryExpanded\n}: {\n contextLabel?: string | null;\n copy: WorkspaceFileManagerI18nRuntime;\n entry: WorkspaceFileEntry;\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n inlineRenameValidation?: WorkspaceFileManagerInlineRenameValidation | null;\n isEnteringDirectory?: boolean;\n isExpanded?: boolean;\n isExpandable?: boolean;\n isInlineRenaming?: boolean;\n isLoadingChildren?: boolean;\n isRenaming?: boolean;\n treeDepth?: number;\n onEntryIconViewportLeave?: (entry: WorkspaceFileEntry) => void;\n onEntryIconViewportEnter?: (entry: WorkspaceFileEntry) => void;\n onCancelInlineRename: () => void;\n onClearInlineRenameValidation: () => void;\n onConfirmInlineRename: (newName: string) => Promise<boolean>;\n onToggleDirectoryExpanded: (\n entry: WorkspaceFileEntry,\n expanded: boolean\n ) => void;\n}): ReactElement {\n const nameParts = splitWorkspaceFileName(entry.name);\n const hasFileExtension =\n nameParts.end.length > 0 && nameParts.end.startsWith(\".\");\n const [name, setName] = useState(entry.name);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const skipBlurRef = useRef(false);\n\n useEffect(() => {\n if (!isInlineRenaming) {\n return;\n }\n setName(entry.name);\n skipBlurRef.current = false;\n }, [entry.name, entry.path, isInlineRenaming]);\n\n useLayoutEffect(() => {\n if (!isInlineRenaming) {\n return;\n }\n const input = inputRef.current;\n if (!input) {\n return;\n }\n input.focus();\n if (hasFileExtension) {\n input.setSelectionRange(0, nameParts.start.length);\n } else {\n input.select();\n }\n }, [hasFileExtension, isInlineRenaming, nameParts.start.length]);\n\n const validationMessage =\n inlineRenameValidation === \"required\"\n ? copy.t(\"createNameRequired\")\n : inlineRenameValidation === \"invalid\"\n ? copy.t(\"createNameInvalid\")\n : null;\n\n const handleConfirm = useCallback(async (): Promise<void> => {\n const confirmed = await onConfirmInlineRename(name);\n if (!confirmed) {\n inputRef.current?.focus();\n }\n }, [name, onConfirmInlineRename]);\n\n if (isInlineRenaming) {\n return (\n <span\n className=\"flex min-w-0 items-center gap-1.5\"\n style={workspaceFileManagerTreeIndentStyle(treeDepth)}\n >\n <DirectoryDisclosureButton\n copy={copy}\n entry={entry}\n expanded={isExpanded}\n isLoading={isLoadingChildren}\n show={isExpandable}\n onToggle={onToggleDirectoryExpanded}\n />\n <WorkspaceFileEntryIcon\n entry={entry}\n frameClassName=\"size-7\"\n iconClassName=\"size-6\"\n iconUrlByCacheKey={iconUrlByCacheKey}\n onViewportLeave={onEntryIconViewportLeave}\n onViewportEnter={onEntryIconViewportEnter}\n />\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <input\n aria-invalid={inlineRenameValidation !== null}\n aria-label={copy.t(\"renameLabel\")}\n className={cn(\n \"min-w-0 max-w-full rounded-md border border-transparent bg-[var(--transparency-block)] px-1.5 py-0.5 text-sm text-[var(--text-primary)] outline-none transition-colors duration-200 selection:bg-[var(--transparency-active)] selection:text-[var(--text-primary)] hover:bg-[var(--transparency-hover)] focus:bg-[var(--transparency-hover)] focus-visible:border-transparent focus-visible:bg-[var(--transparency-hover)] disabled:bg-[var(--transparency-block)] disabled:text-[var(--text-disabled)] disabled:opacity-100\",\n inlineRenameValidation !== null && \"border-[var(--state-danger)]\"\n )}\n disabled={isRenaming}\n ref={inputRef}\n value={name}\n onBlur={() => {\n if (skipBlurRef.current) {\n skipBlurRef.current = false;\n return;\n }\n void handleConfirm();\n }}\n onChange={(event) => {\n setName(event.currentTarget.value);\n onClearInlineRenameValidation();\n }}\n onFocus={(event) => {\n if (hasFileExtension) {\n event.currentTarget.setSelectionRange(\n 0,\n nameParts.start.length\n );\n } else {\n event.currentTarget.select();\n }\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n void handleConfirm();\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n skipBlurRef.current = true;\n onCancelInlineRename();\n }\n }}\n />\n {validationMessage ? (\n <span className=\"text-xs text-[var(--state-danger)]\">\n {validationMessage}\n </span>\n ) : null}\n </span>\n </span>\n );\n }\n\n return (\n <span\n className=\"flex min-w-0 items-center gap-1.5\"\n style={workspaceFileManagerTreeIndentStyle(treeDepth)}\n >\n <DirectoryDisclosureButton\n copy={copy}\n entry={entry}\n expanded={isExpanded}\n isLoading={isLoadingChildren}\n show={isExpandable}\n onToggle={onToggleDirectoryExpanded}\n />\n <WorkspaceFileEntryIcon\n entry={entry}\n frameClassName=\"size-7\"\n iconClassName=\"size-6\"\n iconUrlByCacheKey={iconUrlByCacheKey}\n isEnteringDirectory={isEnteringDirectory}\n onViewportLeave={onEntryIconViewportLeave}\n onViewportEnter={onEntryIconViewportEnter}\n />\n <span className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"flex min-w-0 max-w-full overflow-hidden whitespace-nowrap text-sm\">\n <span className=\"min-w-0 overflow-hidden text-ellipsis\">\n {nameParts.start}\n </span>\n {nameParts.end ? (\n <span className=\"flex-none overflow-hidden text-ellipsis\">\n {nameParts.end}\n </span>\n ) : null}\n </span>\n {contextLabel ? (\n <span className=\"block max-w-full truncate text-[11px] leading-3 text-[var(--text-tertiary)]\">\n {contextLabel}\n </span>\n ) : null}\n </span>\n </span>\n );\n}\n\nfunction EntryIcon({\n className = \"size-4\",\n visualKind\n}: {\n className?: string;\n visualKind: ReturnType<typeof resolveWorkspaceFileVisualKind>;\n}): ReactElement {\n switch (visualKind) {\n case \"directory\":\n return <WorkspaceFolderFallbackIcon className={className} />;\n case \"image\":\n return <WorkspaceImageFallbackIcon className={className} />;\n case \"video\":\n return <VideoFileIcon className={className} />;\n case \"markdown\":\n case \"document\":\n return <FileTextIcon className={className} />;\n case \"code\":\n return <FileCodeIcon className={className} />;\n case \"binary\":\n return <FileTextIcon className={className} />;\n default:\n return <FileTextIcon className={className} />;\n }\n}\n\nfunction PreviewPane({\n copy,\n dateLocale,\n entry,\n previewActions,\n previewState\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n dateLocale?: TuttiDateLocale;\n entry: WorkspaceFileEntry | null;\n previewActions?: readonly WorkspaceFileManagerPreviewAction[];\n previewState: WorkspaceFilePreviewState;\n}): ReactElement {\n if (!entry || previewState.status === \"empty\") {\n return (\n <div className=\"grid h-full min-h-[180px] place-items-center overflow-hidden p-8 text-center text-sm leading-5 text-[var(--text-tertiary)]\">\n <span className=\"max-w-[24ch] [overflow-wrap:anywhere]\">\n {copy.t(\"previewEmptyLabel\")}\n </span>\n </div>\n );\n }\n\n return (\n <>\n <PreviewSurface copy={copy} previewState={previewState} />\n <WorkspaceFileManagerPreviewActionBar\n actions={previewActions ?? []}\n label={copy.t(\"previewActionsLabel\")}\n />\n <div className=\"flex min-w-0 flex-col gap-[14px]\">\n <div className=\"flex min-w-0 flex-col gap-[3px]\">\n <strong className=\"min-w-0 truncate text-[15px] font-semibold text-[var(--text-primary)]\">\n {entry.name}\n </strong>\n <p className=\"min-w-0 truncate text-xs text-[var(--text-secondary)]\">\n {entry.path}\n </p>\n </div>\n <dl className=\"border-t border-[var(--border-1)]\">\n <PreviewDetail\n label={copy.t(\"modifiedLabel\")}\n value={formatWorkspaceFileModifiedTime(entry.mtimeMs, dateLocale)}\n />\n <PreviewDetail\n label={copy.t(\"sizeLabel\")}\n value={\n entry.kind === \"directory\"\n ? \"--\"\n : formatWorkspaceFileBytes(entry.sizeBytes)\n }\n />\n </dl>\n </div>\n </>\n );\n}\n\nfunction PreviewSurface({\n copy,\n previewState\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n previewState: WorkspaceFilePreviewState;\n}): ReactElement {\n return (\n <SharedWorkspaceFilePreviewSurface<\n WorkspaceFileActivationTarget | WorkspaceFileEntry\n >\n directoryMessage={copy.t(\"previewDirectoryLabel\")}\n emptyMessage={copy.t(\"previewEmptyLabel\")}\n imageAlt={(entry) => entry.name}\n loadingIndicator={\n <span className=\"mx-auto grid size-11 place-items-center rounded-lg bg-[var(--transparency-block)]\">\n <LoadingIcon className=\"size-4 animate-spin\" />\n </span>\n }\n loadingMessage={copy.t(\"previewLoadingLabel\")}\n renderIcon={(entry) => (\n <EntryIcon\n className=\"mx-auto size-7\"\n visualKind={resolveWorkspaceFilePreviewIconKind(entry)}\n />\n )}\n state={previewState}\n variant=\"detail\"\n />\n );\n}\n\nfunction resolveWorkspaceFilePreviewIconKind(\n entry: WorkspaceFileActivationTarget | WorkspaceFileEntry\n): ReturnType<typeof resolveWorkspaceFileVisualKind> {\n if (\"kind\" in entry) {\n return resolveWorkspaceFileVisualKind(entry);\n }\n return entry.previewKind === \"image\"\n ? \"image\"\n : entry.previewKind === \"video\"\n ? \"video\"\n : \"document\";\n}\n\nfunction PreviewDetail({\n label,\n value\n}: {\n label: string;\n value: string;\n}): ReactElement {\n return (\n <div\n className=\"@max-[600px]/workspace-file-manager:grid-cols-1 @max-[600px]/workspace-file-manager:gap-0.5 grid gap-2.5 border-b border-[var(--border-1)] py-2.5 text-xs\"\n style={workspaceFileManagerPreviewDetailGridStyle}\n >\n <dt className=\"truncate text-[var(--text-secondary)]\">{label}</dt>\n <dd className=\"@max-[600px]/workspace-file-manager:text-left truncate text-right text-[var(--text-primary)]\">\n {value}\n </dd>\n </div>\n );\n}\n\nfunction FeedbackState({ message }: { message: string }): ReactElement {\n return (\n <div className=\"grid min-h-0 flex-1 place-items-center p-6 text-center text-sm text-[var(--text-tertiary)]\">\n <span className=\"max-w-[34ch] [overflow-wrap:anywhere]\">{message}</span>\n </div>\n );\n}\n","import type { ReactElement } from \"react\";\n\nimport { Button, cn } from \"@tutti-os/ui-system\";\n\nimport type { WorkspaceFileManagerPreviewAction } from \"./workspaceFileManagerPreviewActionTypes.ts\";\n\nexport function WorkspaceFileManagerPreviewActionBar({\n actions,\n className,\n label\n}: {\n actions: readonly WorkspaceFileManagerPreviewAction[];\n className?: string;\n label: string;\n}): ReactElement | null {\n if (actions.length === 0) {\n return null;\n }\n\n return (\n <div\n aria-label={label}\n className={cn(\"flex flex-none items-center gap-1\", className)}\n role=\"group\"\n >\n {actions.map((action) => (\n <Button\n aria-label={action.label}\n className=\"size-7 min-w-7 rounded-sm p-0 text-[var(--text-primary)]\"\n data-testid={`workspace-file-manager-preview-action-${action.id}`}\n disabled={action.disabled}\n key={action.id}\n size=\"icon-sm\"\n title={action.label}\n type=\"button\"\n variant=\"ghost\"\n onClick={action.onSelect}\n >\n {action.icon}\n </Button>\n ))}\n </div>\n );\n}\n","import { cn } from \"@tutti-os/ui-system\";\nimport type {\n DragEvent as ReactDragEvent,\n MouseEvent as ReactMouseEvent,\n PointerEvent as ReactPointerEvent,\n ReactElement\n} from \"react\";\nimport { useLayoutEffect, useRef } from \"react\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport { splitWorkspaceFileName } from \"../services/workspaceFileManagerModel.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileManagerInlineRenameValidation\n} from \"../services/workspaceFileManagerTypes.ts\";\nimport { WorkspaceFileEntryIcon } from \"./WorkspaceFileEntryIcon.tsx\";\nimport {\n workspaceFileManagerIconGridFrameClassName,\n workspaceFileManagerIconGridIconClassName,\n workspaceFileManagerIconGridLayout\n} from \"./workspaceFileManagerIconGridLayout.ts\";\n\nexport function WorkspaceFileManagerIconGrid({\n contextMenuEntryPath,\n copy,\n draggable,\n entries,\n iconUrlByCacheKey,\n inlineRenameEntryPath,\n inlineRenameValidation,\n isRenaming,\n moveDragActive,\n moveDragPreviewEntryPath,\n moveDragTargetEntryPath,\n pendingDirectoryPath,\n onEntryIconViewportLeave,\n onEntryIconViewportEnter,\n selectedPath,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename,\n onContextMenu,\n onDragStart,\n onEntryClick,\n onEntryPointerDown\n}: {\n contextMenuEntryPath: string | null;\n copy: WorkspaceFileManagerI18nRuntime;\n draggable: boolean;\n entries: readonly WorkspaceFileEntry[];\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n inlineRenameEntryPath: string | null;\n inlineRenameValidation: WorkspaceFileManagerInlineRenameValidation | null;\n isRenaming: boolean;\n moveDragActive: boolean;\n moveDragPreviewEntryPath: string | null;\n moveDragTargetEntryPath: string | null;\n pendingDirectoryPath: string | null;\n onEntryIconViewportLeave?: (entry: WorkspaceFileEntry) => void;\n onEntryIconViewportEnter?: (entry: WorkspaceFileEntry) => void;\n selectedPath: string | null;\n onCancelInlineRename: () => void;\n onClearInlineRenameValidation: () => void;\n onConfirmInlineRename: (newName: string) => Promise<boolean>;\n onContextMenu: (\n event: ReactMouseEvent<HTMLElement>,\n entry: WorkspaceFileEntry\n ) => void;\n onDragStart?: (entry: WorkspaceFileEntry, dataTransfer: DataTransfer) => void;\n onEntryClick: (entry: WorkspaceFileEntry) => void;\n onEntryPointerDown: (\n entry: WorkspaceFileEntry,\n event: ReactPointerEvent<HTMLElement>\n ) => void;\n}): ReactElement {\n return (\n <div\n className=\"grid auto-rows-min content-start items-start gap-x-2 gap-y-6 px-4 py-4\"\n style={{\n gridTemplateColumns: `repeat(auto-fill, minmax(${workspaceFileManagerIconGridLayout.tileMinWidthPx}px, 1fr))`\n }}\n >\n {entries.map((entry) => (\n <WorkspaceFileManagerIconTile\n key={entry.path}\n contextMenuActive={contextMenuEntryPath === entry.path}\n copy={copy}\n draggable={draggable}\n entry={entry}\n iconUrlByCacheKey={iconUrlByCacheKey}\n inlineRenameValidation={\n inlineRenameEntryPath === entry.path ? inlineRenameValidation : null\n }\n isEnteringDirectory={pendingDirectoryPath === entry.path}\n isInlineRenaming={inlineRenameEntryPath === entry.path}\n isRenaming={isRenaming}\n moveDragActive={moveDragActive}\n moveDragSource={moveDragPreviewEntryPath === entry.path}\n moveDragTarget={moveDragTargetEntryPath === entry.path}\n onEntryIconViewportLeave={onEntryIconViewportLeave}\n onEntryIconViewportEnter={onEntryIconViewportEnter}\n selected={selectedPath === entry.path}\n onCancelInlineRename={onCancelInlineRename}\n onClearInlineRenameValidation={onClearInlineRenameValidation}\n onConfirmInlineRename={onConfirmInlineRename}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onClick={onEntryClick}\n onPointerDown={onEntryPointerDown}\n />\n ))}\n </div>\n );\n}\n\nfunction WorkspaceFileManagerIconTile({\n contextMenuActive,\n copy,\n draggable,\n entry,\n iconUrlByCacheKey,\n inlineRenameValidation,\n isEnteringDirectory,\n isInlineRenaming,\n isRenaming,\n moveDragActive,\n moveDragSource,\n moveDragTarget,\n onEntryIconViewportLeave,\n onEntryIconViewportEnter,\n selected,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename,\n onContextMenu,\n onDragStart,\n onClick,\n onPointerDown\n}: {\n contextMenuActive: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n draggable: boolean;\n entry: WorkspaceFileEntry;\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n inlineRenameValidation: WorkspaceFileManagerInlineRenameValidation | null;\n isEnteringDirectory: boolean;\n isInlineRenaming: boolean;\n isRenaming: boolean;\n moveDragActive: boolean;\n moveDragSource: boolean;\n moveDragTarget: boolean;\n onEntryIconViewportLeave?: (entry: WorkspaceFileEntry) => void;\n onEntryIconViewportEnter?: (entry: WorkspaceFileEntry) => void;\n selected: boolean;\n onCancelInlineRename: () => void;\n onClearInlineRenameValidation: () => void;\n onConfirmInlineRename: (newName: string) => Promise<boolean>;\n onContextMenu: (\n event: ReactMouseEvent<HTMLElement>,\n entry: WorkspaceFileEntry\n ) => void;\n onDragStart?: (entry: WorkspaceFileEntry, dataTransfer: DataTransfer) => void;\n onClick: (entry: WorkspaceFileEntry) => void;\n onPointerDown: (\n entry: WorkspaceFileEntry,\n event: ReactPointerEvent<HTMLElement>\n ) => void;\n}): ReactElement {\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const nameParts = splitWorkspaceFileName(entry.name);\n\n useLayoutEffect(() => {\n if (!selected) {\n return;\n }\n buttonRef.current?.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\"\n });\n }, [selected]);\n\n const tileClassName = cn(\n \"flex min-w-0 max-w-[148px] flex-col items-center gap-1.5 rounded-md border border-transparent px-2 py-2 text-center transition-colors\",\n isInlineRenaming\n ? \"cursor-default\"\n : \"cursor-pointer hover:bg-transparency-hover active:bg-[var(--transparency-active)]\",\n moveDragActive && \"cursor-grabbing\",\n selected || contextMenuActive || isInlineRenaming\n ? \"border-[var(--border-focus)] bg-transparency-block text-[var(--text-primary)]\"\n : \"text-[var(--text-secondary)]\",\n moveDragSource && \"opacity-55\",\n moveDragTarget &&\n \"bg-[var(--accent-bg)] text-[var(--text-primary)] outline outline-1 -outline-offset-1 outline-[var(--border-focus)]\"\n );\n\n const iconGraphic = (\n <WorkspaceFileEntryIcon\n entry={entry}\n frameClassName={workspaceFileManagerIconGridFrameClassName()}\n iconClassName={workspaceFileManagerIconGridIconClassName()}\n iconUrlByCacheKey={iconUrlByCacheKey}\n isEnteringDirectory={isEnteringDirectory}\n loadingIconClassName=\"size-7\"\n onViewportLeave={onEntryIconViewportLeave}\n onViewportEnter={onEntryIconViewportEnter}\n />\n );\n\n if (isInlineRenaming) {\n return (\n <div\n aria-label={entry.name}\n className={tileClassName}\n data-workspace-file-entry-path={entry.path}\n >\n {iconGraphic}\n <IconTileRenameInput\n copy={copy}\n entry={entry}\n inlineRenameValidation={inlineRenameValidation}\n isRenaming={isRenaming}\n onCancelInlineRename={onCancelInlineRename}\n onClearInlineRenameValidation={onClearInlineRenameValidation}\n onConfirmInlineRename={onConfirmInlineRename}\n />\n </div>\n );\n }\n\n return (\n <button\n aria-label={entry.name}\n className={tileClassName}\n data-workspace-file-entry-path={entry.path}\n draggable={draggable}\n ref={buttonRef}\n type=\"button\"\n onClick={() => {\n onClick(entry);\n }}\n onContextMenu={(event) => {\n onContextMenu(event, entry);\n }}\n onDragStart={(event: ReactDragEvent<HTMLElement>) => {\n if (!draggable) {\n event.preventDefault();\n return;\n }\n onDragStart?.(entry, event.dataTransfer);\n }}\n onPointerDown={(event) => {\n onPointerDown(entry, event);\n }}\n >\n {iconGraphic}\n <span className=\"line-clamp-2 w-full break-all text-[13px] leading-[18px] text-[var(--text-primary)]\">\n <span>{nameParts.start}</span>\n {nameParts.end ? <span>{nameParts.end}</span> : null}\n </span>\n </button>\n );\n}\n\nfunction IconTileRenameInput({\n copy,\n entry,\n inlineRenameValidation,\n isRenaming,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n entry: WorkspaceFileEntry;\n inlineRenameValidation: WorkspaceFileManagerInlineRenameValidation | null;\n isRenaming: boolean;\n onCancelInlineRename: () => void;\n onClearInlineRenameValidation: () => void;\n onConfirmInlineRename: (newName: string) => Promise<boolean>;\n}): ReactElement {\n const nameParts = splitWorkspaceFileName(entry.name);\n const hasFileExtension =\n nameParts.end.length > 0 && nameParts.end.startsWith(\".\");\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n useLayoutEffect(() => {\n const input = inputRef.current;\n if (!input) {\n return;\n }\n input.focus();\n if (hasFileExtension) {\n input.setSelectionRange(0, nameParts.start.length);\n } else {\n input.select();\n }\n }, [hasFileExtension, nameParts.start.length]);\n\n const validationMessage =\n inlineRenameValidation === \"required\"\n ? copy.t(\"createNameRequired\")\n : inlineRenameValidation === \"invalid\"\n ? copy.t(\"createNameInvalid\")\n : null;\n\n return (\n <span className=\"flex w-full min-w-0 flex-col gap-0.5\">\n <input\n aria-invalid={inlineRenameValidation !== null}\n aria-label={copy.t(\"renameLabel\")}\n className={cn(\n \"w-full min-w-0 rounded-[4px] border border-transparent bg-[var(--transparency-block)] px-1 py-0.5 text-center text-xs text-[var(--text-primary)] outline-none\",\n inlineRenameValidation !== null && \"border-[var(--state-danger)]\"\n )}\n defaultValue={entry.name}\n disabled={isRenaming}\n ref={inputRef}\n onBlur={(event) => {\n void onConfirmInlineRename(event.currentTarget.value);\n }}\n onChange={() => {\n onClearInlineRenameValidation();\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n void onConfirmInlineRename(event.currentTarget.value);\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n onCancelInlineRename();\n }\n }}\n />\n {validationMessage ? (\n <span className=\"text-[10px] leading-3 text-[var(--state-danger)]\">\n {validationMessage}\n </span>\n ) : null}\n </span>\n );\n}\n","import {\n FileArchiveIcon,\n FileCodeIcon,\n FileTextIcon,\n FolderFilledIcon,\n ImageFileIcon,\n LoadingIcon,\n VideoFileIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { ReactElement } from \"react\";\nimport { useEffect, useRef } from \"react\";\nimport {\n resolveWorkspaceFileExtension,\n resolveWorkspaceFileVisualKind\n} from \"@tutti-os/workspace-file-preview\";\nimport type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\nimport {\n resolveWorkspaceFileEntryIconCacheKey,\n isWorkspaceApplicationBundle,\n shouldUseWorkspaceFileArchiveIcon,\n shouldUseWorkspaceFileExtensionDocumentIcon\n} from \"./workspaceFileEntryIconPolicy.ts\";\n\nexport function WorkspaceFileEntryIcon({\n entry,\n frameClassName,\n iconClassName = \"size-4\",\n iconUrlByCacheKey,\n isEnteringDirectory = false,\n loadingIconClassName,\n onViewportLeave,\n onViewportEnter\n}: {\n entry: WorkspaceFileEntry;\n frameClassName?: string;\n iconClassName?: string;\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n isEnteringDirectory?: boolean;\n loadingIconClassName?: string;\n onViewportLeave?: (entry: WorkspaceFileEntry) => void;\n onViewportEnter?: (entry: WorkspaceFileEntry) => void;\n}): ReactElement {\n const visualKind = resolveWorkspaceFileVisualKind(entry);\n const isAppBundle = isWorkspaceApplicationBundle(entry);\n const cacheKey = resolveWorkspaceFileEntryIconCacheKey(entry);\n const iconUrl = iconUrlByCacheKey?.get(cacheKey) ?? null;\n const frameRef = useRef<HTMLSpanElement | null>(null);\n const visibleEntryRef = useRef<WorkspaceFileEntry | null>(null);\n const visibleEntryCacheKeyRef = useRef<string | null>(null);\n\n useEffect(() => {\n function reportViewportLeave(): void {\n const visibleEntry = visibleEntryRef.current;\n if (!visibleEntry) {\n return;\n }\n visibleEntryRef.current = null;\n visibleEntryCacheKeyRef.current = null;\n onViewportLeave?.(visibleEntry);\n }\n\n function reportViewportEnter(): void {\n if (visibleEntryCacheKeyRef.current === cacheKey) {\n return;\n }\n reportViewportLeave();\n visibleEntryRef.current = entry;\n visibleEntryCacheKeyRef.current = cacheKey;\n onViewportEnter?.(entry);\n }\n\n if (!onViewportEnter || isEnteringDirectory) {\n reportViewportLeave();\n return;\n }\n\n const element = frameRef.current;\n if (!element || typeof IntersectionObserver === \"undefined\") {\n reportViewportEnter();\n return () => {\n reportViewportLeave();\n };\n }\n\n const viewportRoot = resolveWorkspaceFileEntryIconViewport(element);\n const observer = new IntersectionObserver(\n (records) => {\n const intersecting = records.some(\n (record) => record.isIntersecting && record.intersectionRatio > 0\n );\n if (intersecting) {\n reportViewportEnter();\n return;\n }\n reportViewportLeave();\n },\n { root: viewportRoot, rootMargin: \"0px\", threshold: 0 }\n );\n observer.observe(element);\n const initiallyVisible = isWorkspaceFileEntryIconVisible(\n element,\n viewportRoot\n );\n if (initiallyVisible) {\n reportViewportEnter();\n } else {\n reportViewportLeave();\n }\n return () => {\n observer.disconnect();\n reportViewportLeave();\n };\n }, [cacheKey, entry, isEnteringDirectory, onViewportLeave, onViewportEnter]);\n\n return (\n <span\n ref={frameRef}\n className={cn(\n \"grid flex-none place-items-center overflow-hidden\",\n frameClassName,\n isEnteringDirectory\n ? \"text-[var(--text-tertiary)]\"\n : entryIconColorClassName(visualKind, isAppBundle)\n )}\n >\n {isEnteringDirectory ? (\n <LoadingIcon\n className={cn(loadingIconClassName ?? iconClassName, \"animate-spin\")}\n />\n ) : iconUrl ? (\n <img\n alt=\"\"\n className={cn(\n iconClassName,\n visualKind === \"image\"\n ? \"rounded-[6px] border border-[var(--border-1)] bg-[var(--transparency-block)] object-contain\"\n : \"rounded-[4px] object-contain\"\n )}\n decoding=\"async\"\n draggable={false}\n loading=\"lazy\"\n src={iconUrl}\n />\n ) : (\n <DefaultEntryIcon\n entry={entry}\n iconClassName={iconClassName}\n visualKind={visualKind}\n />\n )}\n </span>\n );\n}\n\nfunction resolveWorkspaceFileEntryIconViewport(\n element: HTMLElement\n): HTMLElement | null {\n return element.closest<HTMLElement>('[data-slot=\"scroll-area-viewport\"]');\n}\n\nfunction isWorkspaceFileEntryIconVisible(\n element: HTMLElement,\n viewportRoot: HTMLElement | null\n): boolean {\n const elementRect = element.getBoundingClientRect();\n const viewportRect =\n viewportRoot?.getBoundingClientRect() ??\n ({\n bottom: window.innerHeight,\n left: 0,\n right: window.innerWidth,\n top: 0\n } satisfies Pick<DOMRect, \"bottom\" | \"left\" | \"right\" | \"top\">);\n\n return (\n elementRect.bottom > viewportRect.top &&\n elementRect.top < viewportRect.bottom &&\n elementRect.right > viewportRect.left &&\n elementRect.left < viewportRect.right\n );\n}\n\nfunction DefaultEntryIcon({\n entry,\n iconClassName,\n visualKind\n}: {\n entry: WorkspaceFileEntry;\n iconClassName: string;\n visualKind: ReturnType<typeof resolveWorkspaceFileVisualKind>;\n}): ReactElement {\n const vectorIconClassName = vectorFallbackIconClassName(iconClassName);\n if (isWorkspaceApplicationBundle(entry)) {\n return <FileTextIcon className={vectorIconClassName} />;\n }\n if (shouldUseWorkspaceFileArchiveIcon(entry)) {\n return <WorkspaceArchiveFallbackIcon className={iconClassName} />;\n }\n if (shouldUseWorkspaceFileExtensionDocumentIcon(entry)) {\n return (\n <ExtensionDocumentIcon\n entry={entry}\n iconClassName={vectorIconClassName}\n />\n );\n }\n\n switch (visualKind) {\n case \"directory\":\n return <WorkspaceFolderFallbackIcon className={iconClassName} />;\n case \"image\":\n return <WorkspaceImageFallbackIcon className={iconClassName} />;\n case \"video\":\n return <VideoFileIcon className={vectorIconClassName} />;\n case \"markdown\":\n case \"document\":\n return <FileTextIcon className={vectorIconClassName} />;\n case \"code\":\n return <FileCodeIcon className={vectorIconClassName} />;\n case \"binary\":\n return <FileTextIcon className={vectorIconClassName} />;\n default:\n return <FileTextIcon className={vectorIconClassName} />;\n }\n}\n\nfunction vectorFallbackIconClassName(iconClassName: string): string {\n return iconClassName.includes(\"size-[84px]\") ? \"size-[64px]\" : iconClassName;\n}\n\nexport function WorkspaceFolderFallbackIcon({\n className\n}: {\n className: string;\n}): ReactElement {\n return (\n <FolderFilledIcon className={vectorFallbackIconClassName(className)} />\n );\n}\n\nexport function WorkspaceArchiveFallbackIcon({\n className\n}: {\n className: string;\n}): ReactElement {\n return <FileArchiveIcon className={vectorFallbackIconClassName(className)} />;\n}\n\nexport function WorkspaceImageFallbackIcon({\n className\n}: {\n className: string;\n}): ReactElement {\n return <ImageFileIcon className={vectorFallbackIconClassName(className)} />;\n}\n\nfunction ExtensionDocumentIcon({\n entry,\n iconClassName\n}: {\n entry: WorkspaceFileEntry;\n iconClassName: string;\n}): ReactElement {\n const extension = resolveWorkspaceFileExtension(entry.name)\n .slice(0, 5)\n .toUpperCase();\n const showExtension =\n extension.length > 0 && !iconClassName.includes(\"size-4\");\n\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\"relative inline-block overflow-visible\", iconClassName)}\n >\n <span className=\"absolute inset-[5%] rounded-[6px] border border-black/10 bg-linear-to-br from-white via-[#f8f8f8] to-[#ececec]\" />\n <span className=\"absolute top-[5%] right-[5%] h-[28%] w-[28%] overflow-hidden rounded-tr-[6px]\">\n <span className=\"absolute top-0 right-0 h-full w-full origin-top-right -skew-x-3 rounded-bl-[4px] border-b border-l border-black/10 bg-linear-to-br from-white to-[#d9d9d9]\" />\n </span>\n {showExtension ? (\n <span className=\"absolute right-[12%] bottom-[14%] left-[12%] truncate text-center text-[10px] leading-none font-semibold tracking-wide text-[#7a7a7a]\">\n {extension}\n </span>\n ) : null}\n </span>\n );\n}\n\nfunction entryIconColorClassName(\n visualKind: ReturnType<typeof resolveWorkspaceFileVisualKind>,\n isAppBundle: boolean\n): string {\n if (isAppBundle) {\n return \"text-[var(--text-tertiary)]\";\n }\n return visualKind === \"directory\"\n ? \"text-[var(--rich-text-mention-file)]\"\n : \"text-[var(--text-tertiary)]\";\n}\n","// Give image thumbnails enough room to be recognizable while keeping dense rows.\nconst workspaceFileManagerIconGridIconSizePx = 84;\nconst workspaceFileManagerIconGridTileMinWidthPx = 136;\nconst workspaceFileManagerIconGridTileMaxWidthPx = 148;\n\nexport const workspaceFileManagerIconGridLayout = {\n iconSizePx: workspaceFileManagerIconGridIconSizePx,\n tileMaxWidthPx: workspaceFileManagerIconGridTileMaxWidthPx,\n tileMinWidthPx: workspaceFileManagerIconGridTileMinWidthPx\n} as const;\n\nexport function workspaceFileManagerIconGridIconClassName(): string {\n return \"size-[84px]\";\n}\n\nexport function workspaceFileManagerIconGridFrameClassName(): string {\n return \"size-[92px]\";\n}\n","export const workspaceFileManagerSidebarDefaultWidth = 460;\nexport const workspaceFileManagerSidebarMinWidth = 180;\nexport const workspaceFileManagerContentMinWidth = 580;\nexport const workspaceFileManagerContentWithoutPreviewMinWidth = 320;\nexport const workspaceFileManagerPaneResizeStep = 24;\nexport const workspaceFileManagerPreviewDefaultWidth = 348;\nexport const workspaceFileManagerSidebarWidthStorageKey =\n \"tutti.workspace-file-manager.sidebar-width\";\nexport const workspaceFileManagerPreviewWidthStorageKey =\n \"tutti.workspace-file-manager.preview-width\";\n\nexport function readWorkspaceFileManagerSidebarWidth(): number {\n return readWorkspaceFileManagerPaneWidth(\n workspaceFileManagerSidebarWidthStorageKey,\n workspaceFileManagerSidebarDefaultWidth\n );\n}\n\nexport function writeWorkspaceFileManagerSidebarWidth(width: number): void {\n writeWorkspaceFileManagerPaneWidth(\n workspaceFileManagerSidebarWidthStorageKey,\n width\n );\n}\n\nexport function readWorkspaceFileManagerPreviewWidth(): number {\n return readWorkspaceFileManagerPaneWidth(\n workspaceFileManagerPreviewWidthStorageKey,\n workspaceFileManagerPreviewDefaultWidth\n );\n}\n\nexport function writeWorkspaceFileManagerPreviewWidth(width: number): void {\n writeWorkspaceFileManagerPaneWidth(\n workspaceFileManagerPreviewWidthStorageKey,\n width\n );\n}\n\nexport function clampWorkspaceFileManagerSidebarWidth(input: {\n containerWidth: number;\n contentMinWidth?: number;\n width: number;\n}): number {\n const contentMinWidth = resolveWorkspaceFileManagerContentMinWidth(\n input.contentMinWidth\n );\n const containerWidth = Number.isFinite(input.containerWidth)\n ? input.containerWidth\n : workspaceFileManagerSidebarMinWidth + contentMinWidth;\n const maxWidth = Math.max(\n workspaceFileManagerSidebarMinWidth,\n containerWidth - contentMinWidth\n );\n const width = Number.isFinite(input.width)\n ? input.width\n : workspaceFileManagerSidebarDefaultWidth;\n\n return Math.round(\n Math.min(maxWidth, Math.max(workspaceFileManagerSidebarMinWidth, width))\n );\n}\n\nexport function resolveWorkspaceFileManagerSidebarMaxWidth(\n containerWidth: number,\n contentMinWidth?: number\n): number {\n const resolvedContentMinWidth =\n resolveWorkspaceFileManagerContentMinWidth(contentMinWidth);\n const resolvedContainerWidth = Number.isFinite(containerWidth)\n ? containerWidth\n : workspaceFileManagerSidebarMinWidth + resolvedContentMinWidth;\n return Math.round(\n Math.max(\n workspaceFileManagerSidebarMinWidth,\n resolvedContainerWidth - resolvedContentMinWidth\n )\n );\n}\n\nfunction resolveWorkspaceFileManagerContentMinWidth(\n contentMinWidth: number | undefined\n): number {\n return typeof contentMinWidth === \"number\" &&\n Number.isFinite(contentMinWidth) &&\n contentMinWidth > 0\n ? contentMinWidth\n : workspaceFileManagerContentMinWidth;\n}\n\nfunction readWorkspaceFileManagerPaneWidth(\n storageKey: string,\n defaultWidth: number\n): number {\n if (typeof window === \"undefined\") {\n return defaultWidth;\n }\n\n const storedWidth = Number(window.localStorage.getItem(storageKey));\n return Number.isFinite(storedWidth) && storedWidth > 0\n ? storedWidth\n : defaultWidth;\n}\n\nfunction writeWorkspaceFileManagerPaneWidth(\n storageKey: string,\n width: number\n): void {\n if (typeof window === \"undefined\" || !Number.isFinite(width) || width <= 0) {\n return;\n }\n\n window.localStorage.setItem(storageKey, String(width));\n}\n","export const workspaceFileManagerTableNameMinWidth = 240;\nexport const workspaceFileManagerTableNameMinWidthProperty =\n \"--workspace-file-manager-table-name-min-width\";\nexport const workspaceFileManagerTableNameColumnSelector =\n \"[data-workspace-file-manager-name-column]\";\n\nconst workspaceFileManagerTableNameMinWidthExpression = `var(${workspaceFileManagerTableNameMinWidthProperty}, ${workspaceFileManagerTableNameMinWidth}px)`;\n\nexport const workspaceFileManagerTableGridClassName =\n \"grid-cols-[minmax(240px,_1fr)_minmax(0,_148px)_minmax(0,_96px)]\";\nexport const workspaceFileManagerTableGridTemplate = `minmax(${workspaceFileManagerTableNameMinWidthExpression}, 1fr) minmax(0, 148px) minmax(0, 96px)`;\n\nexport const workspaceFileManagerCompactTableGridClassName =\n \"grid-cols-[minmax(240px,_1fr)_minmax(0,_96px)_minmax(0,_72px)]\";\nexport const workspaceFileManagerCompactTableGridTemplate = `minmax(${workspaceFileManagerTableNameMinWidthExpression}, 1fr) minmax(0, 96px) minmax(0, 72px)`;\n\nexport function resolveWorkspaceFileManagerPreservedNameColumnWidth(\n width: number\n): number {\n const resolvedWidth = Number.isFinite(width)\n ? Math.round(width)\n : workspaceFileManagerTableNameMinWidth;\n return Math.max(workspaceFileManagerTableNameMinWidth, resolvedWidth);\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\nimport {\n resolveWorkspaceFileEntryIconCacheKey,\n shouldResolveWorkspaceFileEntryIcon\n} from \"./workspaceFileEntryIconPolicy.ts\";\nimport {\n createWorkspaceFileEntryIconUrlQueue,\n type WorkspaceFileEntryIconUrlResolver\n} from \"./workspaceFileEntryIconUrlQueue.ts\";\n\nfunction buildIconTargetSignature(\n entries: readonly WorkspaceFileEntry[],\n options: { includeImageThumbnails?: boolean }\n): string {\n return entries\n .filter((entry) => shouldResolveWorkspaceFileEntryIcon(entry, options))\n .map((entry) => resolveWorkspaceFileEntryIconCacheKey(entry))\n .join(\"\\0\");\n}\n\nexport function useWorkspaceFileEntryIconUrls(input: {\n entries: readonly WorkspaceFileEntry[];\n includeImageThumbnails?: boolean;\n resolveEntryIconUrl?: WorkspaceFileEntryIconUrlResolver;\n}): {\n iconUrlByCacheKey: ReadonlyMap<string, string | null>;\n reportEntryIconViewportEnter: (entry: WorkspaceFileEntry) => void;\n reportEntryIconViewportLeave: (entry: WorkspaceFileEntry) => void;\n} {\n const { entries, includeImageThumbnails, resolveEntryIconUrl } = input;\n const queue = useMemo(\n () =>\n createWorkspaceFileEntryIconUrlQueue({\n includeImageThumbnails,\n resolveEntryIconUrl\n }),\n [includeImageThumbnails, resolveEntryIconUrl]\n );\n const [iconUrlByCacheKey, setIconUrlByCacheKey] = useState<\n ReadonlyMap<string, string | null>\n >(() => queue.snapshot());\n const iconTargetSignature = useMemo(\n () => buildIconTargetSignature(entries, { includeImageThumbnails }),\n [entries, includeImageThumbnails]\n );\n\n useEffect(() => {\n queue.activate();\n return () => {\n queue.dispose();\n };\n }, [queue]);\n\n useEffect(() => {\n queue.retainEntries(entries);\n }, [entries, iconTargetSignature, queue]);\n\n useEffect(() => {\n setIconUrlByCacheKey(queue.snapshot());\n return queue.subscribe(() => {\n setIconUrlByCacheKey(queue.snapshot());\n });\n }, [queue]);\n\n const reportEntryIconViewportEnter = useCallback(\n (entry: WorkspaceFileEntry) => {\n queue.enterViewport(entry);\n },\n [queue]\n );\n\n const reportEntryIconViewportLeave = useCallback(\n (entry: WorkspaceFileEntry) => {\n queue.leaveViewport(entry);\n },\n [queue]\n );\n\n return {\n iconUrlByCacheKey,\n reportEntryIconViewportEnter,\n reportEntryIconViewportLeave\n };\n}\n","import type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\nimport {\n resolveWorkspaceFileEntryIconCacheKey,\n shouldResolveWorkspaceFileEntryIcon\n} from \"./workspaceFileEntryIconPolicy.ts\";\n\nexport type WorkspaceFileEntryIconUrlResolver = (\n entry: WorkspaceFileEntry\n) => Promise<string | null | undefined>;\n\nexport interface WorkspaceFileEntryIconUrlQueueOptions {\n includeImageThumbnails?: boolean;\n maxConcurrent?: number;\n resolveEntryIconUrl?: WorkspaceFileEntryIconUrlResolver;\n}\n\nexport interface WorkspaceFileEntryIconUrlQueue {\n activate(): void;\n dispose(): void;\n enterViewport(entry: WorkspaceFileEntry): void;\n leaveViewport(entry: WorkspaceFileEntry): void;\n retainEntries(entries: readonly WorkspaceFileEntry[]): void;\n snapshot(): ReadonlyMap<string, string | null>;\n subscribe(listener: () => void): () => void;\n}\n\nconst defaultMaxConcurrentIconRequests = 3;\nconst imageThumbnailCacheKeyPrefix = \"image-thumbnail:\";\n\nfunction shouldKeepResolvedIconAfterViewportLeave(cacheKey: string): boolean {\n return cacheKey.startsWith(imageThumbnailCacheKeyPrefix);\n}\n\nexport function createWorkspaceFileEntryIconUrlQueue(\n options: WorkspaceFileEntryIconUrlQueueOptions\n): WorkspaceFileEntryIconUrlQueue {\n const maxConcurrent = Math.max(\n 1,\n Math.floor(options.maxConcurrent ?? defaultMaxConcurrentIconRequests)\n );\n const iconUrlByCacheKey = new Map<string, string | null>();\n const inFlightCacheKeys = new Set<string>();\n const listeners = new Set<() => void>();\n const queuedEntries = new Map<string, WorkspaceFileEntry>();\n const visibleReferenceCountByCacheKey = new Map<string, number>();\n let activeCount = 0;\n let disposed = false;\n let retainedCacheKeys: ReadonlySet<string> | null = null;\n const policyOptions = {\n includeImageThumbnails: options.includeImageThumbnails\n };\n\n function publish(): void {\n for (const listener of listeners) {\n listener();\n }\n }\n\n function isRetained(cacheKey: string): boolean {\n return retainedCacheKeys === null || retainedCacheKeys.has(cacheKey);\n }\n\n function isVisible(cacheKey: string): boolean {\n return (visibleReferenceCountByCacheKey.get(cacheKey) ?? 0) > 0;\n }\n\n function shouldResolveCacheKey(cacheKey: string): boolean {\n return (\n isVisible(cacheKey) || shouldKeepResolvedIconAfterViewportLeave(cacheKey)\n );\n }\n\n function retainVisibleReference(cacheKey: string): void {\n visibleReferenceCountByCacheKey.set(\n cacheKey,\n (visibleReferenceCountByCacheKey.get(cacheKey) ?? 0) + 1\n );\n }\n\n function releaseVisibleReference(cacheKey: string): void {\n const nextCount = (visibleReferenceCountByCacheKey.get(cacheKey) ?? 0) - 1;\n if (nextCount > 0) {\n visibleReferenceCountByCacheKey.set(cacheKey, nextCount);\n return;\n }\n\n visibleReferenceCountByCacheKey.delete(cacheKey);\n if (shouldKeepResolvedIconAfterViewportLeave(cacheKey)) {\n return;\n }\n\n queuedEntries.delete(cacheKey);\n const hadCachedIcon = iconUrlByCacheKey.delete(cacheKey);\n if (hadCachedIcon) {\n publish();\n }\n }\n\n function drain(): void {\n if (disposed || !options.resolveEntryIconUrl) {\n return;\n }\n\n while (activeCount < maxConcurrent && queuedEntries.size > 0) {\n const next = queuedEntries.entries().next().value;\n if (!next) {\n return;\n }\n\n const [cacheKey, entry] = next;\n queuedEntries.delete(cacheKey);\n if (\n !shouldResolveCacheKey(cacheKey) ||\n iconUrlByCacheKey.has(cacheKey) ||\n inFlightCacheKeys.has(cacheKey)\n ) {\n continue;\n }\n\n activeCount += 1;\n inFlightCacheKeys.add(cacheKey);\n\n void options\n .resolveEntryIconUrl(entry)\n .then((iconUrl) => {\n const shouldStore =\n !disposed &&\n isRetained(cacheKey) &&\n shouldResolveCacheKey(cacheKey);\n if (shouldStore) {\n iconUrlByCacheKey.set(cacheKey, iconUrl?.trim() || null);\n publish();\n }\n })\n .catch(() => {\n const shouldStore =\n !disposed &&\n isRetained(cacheKey) &&\n shouldResolveCacheKey(cacheKey);\n if (shouldStore) {\n iconUrlByCacheKey.set(cacheKey, null);\n publish();\n }\n })\n .finally(() => {\n activeCount -= 1;\n inFlightCacheKeys.delete(cacheKey);\n drain();\n });\n }\n }\n\n return {\n activate(): void {\n disposed = false;\n },\n dispose(): void {\n disposed = true;\n queuedEntries.clear();\n visibleReferenceCountByCacheKey.clear();\n listeners.clear();\n },\n leaveViewport(entry): void {\n if (\n disposed ||\n !shouldResolveWorkspaceFileEntryIcon(entry, policyOptions)\n ) {\n return;\n }\n\n const cacheKey = resolveWorkspaceFileEntryIconCacheKey(entry);\n releaseVisibleReference(cacheKey);\n },\n enterViewport(entry): void {\n if (\n disposed ||\n !options.resolveEntryIconUrl ||\n !shouldResolveWorkspaceFileEntryIcon(entry, policyOptions)\n ) {\n return;\n }\n\n const cacheKey = resolveWorkspaceFileEntryIconCacheKey(entry);\n retainVisibleReference(cacheKey);\n if (\n iconUrlByCacheKey.has(cacheKey) ||\n inFlightCacheKeys.has(cacheKey) ||\n queuedEntries.has(cacheKey)\n ) {\n return;\n }\n\n queuedEntries.set(cacheKey, entry);\n drain();\n },\n retainEntries(entries): void {\n retainedCacheKeys = new Set(\n entries\n .filter((entry) =>\n shouldResolveWorkspaceFileEntryIcon(entry, policyOptions)\n )\n .map((entry) => resolveWorkspaceFileEntryIconCacheKey(entry))\n );\n let changed = false;\n for (const cacheKey of iconUrlByCacheKey.keys()) {\n if (!isRetained(cacheKey)) {\n iconUrlByCacheKey.delete(cacheKey);\n changed = true;\n continue;\n }\n if (iconUrlByCacheKey.get(cacheKey) === null) {\n iconUrlByCacheKey.delete(cacheKey);\n changed = true;\n }\n }\n for (const cacheKey of queuedEntries.keys()) {\n if (!isRetained(cacheKey)) {\n queuedEntries.delete(cacheKey);\n }\n }\n for (const cacheKey of visibleReferenceCountByCacheKey.keys()) {\n if (!isRetained(cacheKey)) {\n visibleReferenceCountByCacheKey.delete(cacheKey);\n }\n }\n if (changed) {\n publish();\n }\n },\n snapshot(): ReadonlyMap<string, string | null> {\n return new Map(iconUrlByCacheKey);\n },\n subscribe(listener): () => void {\n if (disposed) {\n return () => {};\n }\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n };\n}\n","import { useMemo } from \"react\";\n\nimport {\n CopyIcon,\n DownloadIcon,\n EyeIcon,\n ShareLinedIcon\n} from \"@tutti-os/ui-system/icons\";\n\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type { WorkspaceFileManagerSession } from \"../services/workspaceFileManagerService.interface.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileManagerState\n} from \"../services/workspaceFileManagerTypes.ts\";\nimport {\n findWorkspaceFileLocationById,\n isWorkspaceFileExternalLocation\n} from \"../services/workspaceFileManagerLocations.ts\";\nimport {\n workspaceFileManagerPreviewActionOrder,\n type WorkspaceFileManagerPreviewAction,\n type WorkspaceFileManagerPreviewActionId,\n type WorkspaceFileManagerPreviewActionsConfig\n} from \"./workspaceFileManagerPreviewActionTypes.ts\";\n\nconst previewActionIconClassName = \"size-4\";\n\n/**\n * Resolves the declarative preview-action config against session state. Copy\n * and open dispatch the package's own session commands; download and share\n * forward to host handlers.\n */\nexport function useWorkspaceFileManagerPreviewActions({\n config,\n copy,\n entry,\n onCopyEntry,\n session,\n state\n}: {\n config: WorkspaceFileManagerPreviewActionsConfig | undefined;\n copy: WorkspaceFileManagerI18nRuntime;\n entry: WorkspaceFileEntry | null;\n onCopyEntry?: () => Promise<void> | void;\n session: WorkspaceFileManagerSession;\n state: WorkspaceFileManagerState;\n}): readonly WorkspaceFileManagerPreviewAction[] {\n const { busyAction, capabilities, isLoading, isMutating } = state;\n const isExternalLocation = isWorkspaceFileExternalLocation(\n findWorkspaceFileLocationById(\n state.locationSections,\n state.selectedLocationId\n )\n );\n\n return useMemo(() => {\n if (!config || !entry) {\n return [];\n }\n\n const disabled = busyAction !== null || isLoading || isMutating;\n const order = config.order ?? workspaceFileManagerPreviewActionOrder;\n const actions: WorkspaceFileManagerPreviewAction[] = [];\n\n for (const id of order) {\n const action = buildPreviewAction({\n config,\n copy,\n disabled,\n entry,\n id,\n isExternalLocation,\n onCopyEntry,\n session,\n canCopy: capabilities.canCopy\n });\n\n if (action) {\n actions.push(action);\n }\n }\n\n return actions;\n }, [\n busyAction,\n capabilities.canCopy,\n config,\n copy,\n entry,\n isExternalLocation,\n isLoading,\n isMutating,\n onCopyEntry,\n session\n ]);\n}\n\nfunction buildPreviewAction({\n canCopy,\n config,\n copy,\n disabled,\n entry,\n id,\n isExternalLocation,\n onCopyEntry,\n session\n}: {\n canCopy: boolean;\n config: WorkspaceFileManagerPreviewActionsConfig;\n copy: WorkspaceFileManagerI18nRuntime;\n disabled: boolean;\n entry: WorkspaceFileEntry;\n id: WorkspaceFileManagerPreviewActionId;\n isExternalLocation: boolean;\n onCopyEntry?: () => Promise<void> | void;\n session: WorkspaceFileManagerSession;\n}): WorkspaceFileManagerPreviewAction | null {\n switch (id) {\n case \"copy\": {\n // Mirrors the Cmd/Ctrl+C shortcut: external locations have no clipboard\n // path, and the host opts out entirely by omitting copyEntriesToClipboard.\n if (config.copy !== true || !canCopy || isExternalLocation) {\n return null;\n }\n\n return {\n disabled,\n icon: <CopyIcon className={previewActionIconClassName} />,\n id,\n label: copy.t(\"copyLabel\"),\n onSelect: () => {\n void (async () => {\n if (await session.copyToClipboard(entry)) {\n await onCopyEntry?.();\n }\n })();\n }\n };\n }\n case \"open\": {\n if (config.open !== true) {\n return null;\n }\n\n return {\n disabled,\n icon: <EyeIcon className={previewActionIconClassName} />,\n id,\n label: copy.t(\"openLabel\"),\n onSelect: () => {\n void session.openEntry(entry);\n }\n };\n }\n case \"download\": {\n const onDownload = config.onDownload;\n\n if (!onDownload) {\n return null;\n }\n\n return {\n disabled,\n icon: <DownloadIcon className={previewActionIconClassName} />,\n id,\n label: copy.t(\"downloadLabel\"),\n onSelect: () => {\n void onDownload(entry);\n }\n };\n }\n case \"share\": {\n const onShare = config.onShare;\n\n if (!onShare) {\n return null;\n }\n\n return {\n disabled,\n icon: <ShareLinedIcon className={previewActionIconClassName} />,\n id,\n label: copy.t(\"shareLabel\"),\n onSelect: () => {\n void onShare(entry);\n }\n };\n }\n default:\n return null;\n }\n}\n","import type { ReactElement } from \"react\";\n\nimport type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\n\nexport type WorkspaceFileManagerPreviewActionId =\n | \"copy\"\n | \"download\"\n | \"open\"\n | \"share\";\n\nexport const workspaceFileManagerPreviewActionOrder = [\n \"copy\",\n \"open\",\n \"download\",\n \"share\"\n] as const satisfies readonly WorkspaceFileManagerPreviewActionId[];\n\n/**\n * Declares which actions the preview panel renders in its bottom action row.\n *\n * Copy and open are backed by session commands the package already owns, so\n * hosts only opt in with a boolean. Download and share have no package-side\n * implementation, so passing a handler is what enables them — the same\n * \"capability exists when the method exists\" convention the host contract uses.\n */\nexport interface WorkspaceFileManagerPreviewActionsConfig {\n /** Enables copy. Still requires `capabilities.canCopy`. */\n copy?: boolean;\n /** Enables open. */\n open?: boolean;\n onDownload?: (entry: WorkspaceFileEntry) => Promise<void> | void;\n onShare?: (entry: WorkspaceFileEntry) => Promise<void> | void;\n /** Overrides button order. Defaults to copy, open, download, share. */\n order?: readonly WorkspaceFileManagerPreviewActionId[];\n}\n\n/** Internal descriptor produced once the config is resolved against session state. */\nexport interface WorkspaceFileManagerPreviewAction {\n disabled: boolean;\n icon: ReactElement;\n id: WorkspaceFileManagerPreviewActionId;\n label: string;\n onSelect: () => void;\n}\n","import type {\n WorkspaceFileDirectoryExpansionState,\n WorkspaceFileEntry\n} from \"../services/workspaceFileManagerTypes.ts\";\nimport {\n sortWorkspaceFileEntriesForArrangeMode,\n type WorkspaceFileManagerArrangeMode\n} from \"./workspaceFileManagerArrangeMode.ts\";\n\nexport type WorkspaceFileManagerVisibleTreeRow =\n | {\n depth: number;\n entry: WorkspaceFileEntry;\n expanded: boolean;\n expandable: boolean;\n kind: \"entry\";\n loadingChildren: boolean;\n }\n | {\n depth: number;\n key: string;\n kind: \"feedback\";\n parentPath: string;\n status: \"empty\" | \"error\" | \"loading\";\n message?: string;\n };\n\nexport function buildWorkspaceFileManagerVisibleTreeRows(input: {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n directoryExpansionByPath: Record<\n string,\n WorkspaceFileDirectoryExpansionState\n >;\n entries: readonly WorkspaceFileEntry[];\n expandedDirectoryPaths: Record<string, boolean>;\n}): WorkspaceFileManagerVisibleTreeRow[] {\n return appendWorkspaceFileManagerVisibleTreeRows({\n ...input,\n depth: 0\n });\n}\n\nexport function collectWorkspaceFileManagerVisibleTreeEntries(\n rows: readonly WorkspaceFileManagerVisibleTreeRow[]\n): WorkspaceFileEntry[] {\n return rows.flatMap((row) => (row.kind === \"entry\" ? [row.entry] : []));\n}\n\nfunction appendWorkspaceFileManagerVisibleTreeRows(input: {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n depth: number;\n directoryExpansionByPath: Record<\n string,\n WorkspaceFileDirectoryExpansionState\n >;\n entries: readonly WorkspaceFileEntry[];\n expandedDirectoryPaths: Record<string, boolean>;\n}): WorkspaceFileManagerVisibleTreeRow[] {\n const sortedEntries = sortWorkspaceFileEntriesForArrangeMode(\n input.entries,\n input.arrangeMode\n );\n const rows: WorkspaceFileManagerVisibleTreeRow[] = [];\n\n for (const entry of sortedEntries) {\n const expandable = entry.kind === \"directory\" && entry.hasChildren;\n const expanded = expandable\n ? input.expandedDirectoryPaths[entry.path] === true\n : false;\n const childState = input.directoryExpansionByPath[entry.path];\n rows.push({\n depth: input.depth,\n entry,\n expanded,\n expandable,\n kind: \"entry\",\n loadingChildren: childState?.isLoading ?? false\n });\n\n if (!expanded) {\n continue;\n }\n\n if (!childState || childState.isLoading) {\n rows.push({\n depth: input.depth + 1,\n key: `${entry.path}:loading`,\n kind: \"feedback\",\n parentPath: entry.path,\n status: \"loading\"\n });\n continue;\n }\n\n if (childState.error) {\n rows.push({\n depth: input.depth + 1,\n key: `${entry.path}:error`,\n kind: \"feedback\",\n message: childState.error,\n parentPath: entry.path,\n status: \"error\"\n });\n continue;\n }\n\n if (childState.loaded && childState.entries.length === 0) {\n rows.push({\n depth: input.depth + 1,\n key: `${entry.path}:empty`,\n kind: \"feedback\",\n parentPath: entry.path,\n status: \"empty\"\n });\n continue;\n }\n\n rows.push(\n ...appendWorkspaceFileManagerVisibleTreeRows({\n ...input,\n depth: input.depth + 1,\n entries: childState.entries\n })\n );\n }\n\n return rows;\n}\n","import {\n ArrowLeftIcon,\n ArrowRightIcon,\n Button,\n ChevronDownIcon,\n CloseIcon,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n LoadingIcon,\n RefreshIcon,\n SearchIcon,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n ViewGridLinedIcon,\n ViewListLinedIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport { useEffect, useRef, useState, type ReactElement } from \"react\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type { WorkspaceFileManagerArrangeMode } from \"./workspaceFileManagerArrangeMode.ts\";\nimport type { WorkspaceFileManagerLayoutMode } from \"./workspaceFileManagerLayoutMode.ts\";\nimport type { RenderWorkspaceFileManagerToolbarTrailingActions } from \"./workspaceFileManagerToolbarTypes.ts\";\n\nexport function WorkspaceFileManagerToolbar({\n breadcrumbs,\n canSearch,\n canGoBack,\n canGoForward,\n copy,\n currentDirectoryPath,\n isBusy,\n isLoading,\n isMutating,\n isSearching,\n arrangeMode,\n layoutMode,\n renderToolbarTrailingActions,\n searchQuery,\n onGoBack,\n onGoForward,\n onArrangeModeChange,\n onLayoutModeChange,\n onLoadDirectory,\n onRefresh,\n onSearchClear,\n onSearchQueryChange\n}: {\n breadcrumbs: Array<{ label: string; path: string }>;\n canSearch: boolean;\n canGoBack: boolean;\n canGoForward: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n currentDirectoryPath: string;\n isBusy: boolean;\n isLoading: boolean;\n isMutating: boolean;\n isSearching: boolean;\n arrangeMode: WorkspaceFileManagerArrangeMode;\n layoutMode: WorkspaceFileManagerLayoutMode;\n renderToolbarTrailingActions?: RenderWorkspaceFileManagerToolbarTrailingActions;\n searchQuery: string;\n onGoBack: () => void;\n onGoForward: () => void;\n onArrangeModeChange: (arrangeMode: WorkspaceFileManagerArrangeMode) => void;\n onLayoutModeChange: (layoutMode: WorkspaceFileManagerLayoutMode) => void;\n onLoadDirectory: (path: string) => void;\n onRefresh: () => void;\n onSearchClear: () => void;\n onSearchQueryChange: (query: string) => void;\n}): ReactElement {\n const [refreshAnimationKey, setRefreshAnimationKey] = useState(0);\n\n const handleRefresh = (): void => {\n setRefreshAnimationKey((currentKey) => currentKey + 1);\n onRefresh();\n };\n\n return (\n <header className=\"@max-[600px]/workspace-file-manager:flex-nowrap flex h-10 min-h-10 w-full min-w-0 items-center gap-2 border-b border-[var(--border-1)] px-2 py-1\">\n <ToolbarIconButton\n ariaLabel={copy.t(\"backLabel\")}\n disabled={!canGoBack || isLoading || isBusy}\n title={copy.t(\"backLabel\")}\n onClick={onGoBack}\n >\n <ArrowLeftIcon className=\"size-4\" />\n </ToolbarIconButton>\n <ToolbarIconButton\n ariaLabel={copy.t(\"forwardLabel\")}\n disabled={!canGoForward || isLoading || isBusy}\n title={copy.t(\"forwardLabel\")}\n onClick={onGoForward}\n >\n <ArrowRightIcon className=\"size-4\" />\n </ToolbarIconButton>\n <nav\n aria-label={currentDirectoryPath}\n className=\"@max-[600px]/workspace-file-manager:flex-auto flex min-w-0 flex-1 overflow-hidden pr-2\"\n data-workspace-file-manager-path=\"\"\n >\n <ol className=\"flex min-w-0 max-w-full flex-1 items-center gap-2 overflow-hidden\">\n {breadcrumbs.map((crumb, index) => (\n <BreadcrumbButton\n key={crumb.path}\n active={index === breadcrumbs.length - 1}\n label={crumb.label}\n showSeparator={index > 0}\n onClick={() => {\n onLoadDirectory(crumb.path);\n }}\n />\n ))}\n </ol>\n </nav>\n <div className=\"@max-[600px]/workspace-file-manager:justify-end flex flex-none items-center gap-1.5\">\n <LayoutModeToggle\n arrangeMode={arrangeMode}\n copy={copy}\n layoutMode={layoutMode}\n onArrangeModeChange={onArrangeModeChange}\n onLayoutModeChange={onLayoutModeChange}\n />\n <ToolbarActionButton\n disabled={isLoading || isMutating || isBusy}\n onClick={handleRefresh}\n >\n {isLoading ? (\n <LoadingIcon className=\"size-4 animate-spin\" />\n ) : (\n <RefreshIcon\n key={refreshAnimationKey}\n className={cn(\n \"size-4\",\n refreshAnimationKey > 0 &&\n \"motion-safe:animate-[spin_520ms_cubic-bezier(0.4,0,0.2,1)_1_reverse]\"\n )}\n />\n )}\n <span className=\"@max-[600px]/workspace-file-manager:hidden\">\n {copy.t(\"refreshLabel\")}\n </span>\n </ToolbarActionButton>\n {renderToolbarTrailingActions?.({\n currentDirectoryPath,\n isBusy,\n isLoading,\n isMutating\n }) ?? null}\n <WorkspaceFileManagerToolbarSearch\n canSearch={canSearch}\n copy={copy}\n isSearching={isSearching}\n searchQuery={searchQuery}\n onClear={onSearchClear}\n onSearchQueryChange={onSearchQueryChange}\n />\n </div>\n </header>\n );\n}\n\nfunction WorkspaceFileManagerToolbarSearch({\n canSearch,\n copy,\n isSearching,\n searchQuery,\n onClear,\n onSearchQueryChange\n}: {\n canSearch: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n isSearching: boolean;\n searchQuery: string;\n onClear: () => void;\n onSearchQueryChange: (query: string) => void;\n}): ReactElement {\n const [expanded, setExpanded] = useState(searchQuery.trim().length > 0);\n const [inputValue, setInputValue] = useState(searchQuery);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const isComposingRef = useRef(false);\n const active = expanded || searchQuery.trim().length > 0;\n\n useEffect(() => {\n if (searchQuery.trim().length > 0) {\n setExpanded(true);\n }\n }, [searchQuery]);\n\n useEffect(() => {\n if (!expanded) {\n return;\n }\n inputRef.current?.focus();\n }, [expanded]);\n\n useEffect(() => {\n if (isComposingRef.current) {\n return;\n }\n setInputValue(searchQuery);\n }, [searchQuery]);\n\n const commitInputValue = (value: string): void => {\n setInputValue(value);\n onSearchQueryChange(value);\n };\n\n const handleClear = (): void => {\n isComposingRef.current = false;\n setInputValue(\"\");\n onClear();\n setExpanded(false);\n };\n\n if (!active) {\n return (\n <ToolbarIconButton\n ariaLabel={copy.t(\"searchPlaceholder\")}\n disabled={!canSearch}\n title={copy.t(\"searchPlaceholder\")}\n onClick={() => {\n setExpanded(true);\n }}\n >\n <SearchIcon className=\"size-4\" />\n </ToolbarIconButton>\n );\n }\n\n return (\n <div\n className={cn(\n \"relative h-7 w-[min(220px,34vw)] flex-none overflow-hidden rounded-md bg-[var(--transparency-block)] transition-[width,opacity,background-color] duration-200 ease-out\",\n \"@max-[600px]/workspace-file-manager:w-[min(170px,42vw)]\",\n !canSearch && \"opacity-60\"\n )}\n >\n <SearchIcon className=\"pointer-events-none absolute top-1/2 left-2 size-4 -translate-y-1/2 text-[var(--text-tertiary)]\" />\n <Input\n aria-label={copy.t(\"searchPlaceholder\")}\n className=\"h-full border-0 bg-transparent pr-8 pl-8 text-sm shadow-none focus-visible:ring-0\"\n disabled={!canSearch}\n placeholder={copy.t(\"searchPlaceholder\")}\n ref={inputRef}\n value={inputValue}\n onBlur={(event) => {\n commitInputValue(event.currentTarget.value);\n }}\n onChange={(event) => {\n const nextValue = event.currentTarget.value;\n if (isComposingRef.current) {\n setInputValue(nextValue);\n return;\n }\n commitInputValue(nextValue);\n }}\n onCompositionEnd={(event) => {\n isComposingRef.current = false;\n commitInputValue(event.currentTarget.value);\n }}\n onCompositionStart={() => {\n isComposingRef.current = true;\n }}\n onKeyDown={(event) => {\n if (event.key !== \"Escape\") {\n return;\n }\n if (isComposingRef.current || event.nativeEvent.isComposing) {\n return;\n }\n event.preventDefault();\n handleClear();\n }}\n />\n <button\n aria-label={copy.t(\"clearSearchLabel\")}\n className=\"absolute top-1/2 right-1 grid size-5 -translate-y-1/2 place-items-center rounded-[4px] text-[var(--text-tertiary)] transition-colors hover:bg-[var(--transparency-hover)] hover:text-[var(--text-primary)]\"\n type=\"button\"\n onClick={handleClear}\n >\n {isSearching ? (\n <LoadingIcon className=\"size-3 animate-spin\" />\n ) : (\n <CloseIcon className=\"size-3\" />\n )}\n </button>\n </div>\n );\n}\n\nfunction LayoutModeToggle({\n arrangeMode,\n copy,\n layoutMode,\n onArrangeModeChange,\n onLayoutModeChange\n}: {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n copy: WorkspaceFileManagerI18nRuntime;\n layoutMode: WorkspaceFileManagerLayoutMode;\n onArrangeModeChange: (arrangeMode: WorkspaceFileManagerArrangeMode) => void;\n onLayoutModeChange: (layoutMode: WorkspaceFileManagerLayoutMode) => void;\n}): ReactElement {\n const arrangeOptions: Array<{\n label: string;\n mode: WorkspaceFileManagerArrangeMode;\n }> = [\n { label: copy.t(\"arrangeNoneLabel\"), mode: \"none\" },\n { label: copy.t(\"nameLabel\"), mode: \"name\" },\n { label: copy.t(\"arrangeKindLabel\"), mode: \"kind\" },\n { label: copy.t(\"arrangeApplicationLabel\"), mode: \"application\" },\n { label: copy.t(\"arrangeLastOpenedLabel\"), mode: \"lastOpened\" },\n { label: copy.t(\"arrangeDateAddedLabel\"), mode: \"dateAdded\" },\n { label: copy.t(\"modifiedLabel\"), mode: \"modified\" },\n { label: copy.t(\"arrangeCreatedLabel\"), mode: \"created\" },\n { label: copy.t(\"sizeLabel\"), mode: \"size\" }\n ];\n\n return (\n <TooltipProvider delayDuration={300}>\n <div\n className=\"flex items-center rounded-md border border-[var(--border-1)] bg-[var(--transparency-block)] p-0.5\"\n role=\"group\"\n >\n <LayoutModeButton\n active={layoutMode === \"icon\"}\n ariaLabel={copy.t(\"layoutIconViewLabel\")}\n tooltipLabel={copy.t(\"layoutIconViewTooltipLabel\")}\n onClick={() => {\n onLayoutModeChange(\"icon\");\n }}\n >\n <ViewGridLinedIcon className=\"size-4\" />\n </LayoutModeButton>\n <LayoutModeButton\n active={layoutMode === \"list\"}\n ariaLabel={copy.t(\"layoutListViewLabel\")}\n tooltipLabel={copy.t(\"layoutListViewTooltipLabel\")}\n onClick={() => {\n onLayoutModeChange(\"list\");\n }}\n >\n <ViewListLinedIcon className=\"size-4\" />\n </LayoutModeButton>\n <span className=\"mx-0.5 h-4 w-px bg-[var(--border-1)]\" aria-hidden />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={copy.t(\"arrangeMenuLabel\")}\n className=\"size-6 min-w-6 rounded-[4px] p-0 text-[var(--text-secondary)] data-[state=open]:bg-[var(--background-fronted)] data-[state=open]:text-[var(--text-primary)] data-[state=open]:shadow-sm\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n <ChevronDownIcon className=\"size-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"min-w-[236px] px-1 py-1\"\n sideOffset={7}\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n >\n <DropdownMenuRadioGroup\n value={arrangeMode}\n onValueChange={(nextMode) => {\n onArrangeModeChange(\n nextMode as WorkspaceFileManagerArrangeMode\n );\n }}\n >\n {arrangeOptions.map((option, index) => (\n <div key={option.mode}>\n {index === 1 ? <DropdownMenuSeparator /> : null}\n <DropdownMenuRadioItem\n className=\"h-8 text-sm font-normal\"\n value={option.mode}\n >\n {option.label}\n </DropdownMenuRadioItem>\n </div>\n ))}\n </DropdownMenuRadioGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </TooltipProvider>\n );\n}\n\nfunction LayoutModeButton({\n active,\n ariaLabel,\n children,\n onClick,\n tooltipLabel\n}: {\n active: boolean;\n ariaLabel: string;\n children: ReactElement;\n onClick: () => void;\n tooltipLabel: string;\n}): ReactElement {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={ariaLabel}\n aria-pressed={active}\n className={cn(\n \"size-6 min-w-6 rounded-[4px] p-0 text-text-secondary\",\n active &&\n \"!bg-background-fronted text-foreground hover:!bg-background-fronted\"\n )}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onClick}\n >\n {children}\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{tooltipLabel}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction ToolbarIconButton({\n ariaLabel,\n children,\n disabled,\n onClick,\n title\n}: {\n ariaLabel: string;\n children: ReactElement;\n disabled: boolean;\n onClick: () => void;\n title: string;\n}): ReactElement {\n return (\n <Button\n aria-label={ariaLabel}\n className=\"size-7 min-w-7 rounded-sm p-0 text-[var(--text-primary)]\"\n disabled={disabled}\n size=\"icon-sm\"\n title={title}\n type=\"button\"\n variant=\"ghost\"\n onClick={onClick}\n >\n {children}\n </Button>\n );\n}\n\nfunction ToolbarActionButton({\n children,\n disabled,\n onClick\n}: {\n children: ReactElement | ReactElement[] | string;\n disabled: boolean;\n onClick: () => void;\n}): ReactElement {\n return (\n <Button\n className=\"@max-[600px]/workspace-file-manager:size-7 @max-[600px]/workspace-file-manager:min-w-7 @max-[600px]/workspace-file-manager:px-0 cursor-pointer\"\n disabled={disabled}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onClick}\n >\n {children}\n </Button>\n );\n}\n\nfunction BreadcrumbButton({\n active,\n label,\n onClick,\n showSeparator\n}: {\n active: boolean;\n label: string;\n onClick: () => void;\n showSeparator: boolean;\n}): ReactElement {\n return (\n <li className=\"flex min-w-0 items-center gap-2\">\n {showSeparator ? (\n <span className=\"flex-none text-[var(--text-tertiary)]\">/</span>\n ) : null}\n <button\n className={cn(\n \"min-w-0 overflow-hidden text-ellipsis whitespace-nowrap border-0 bg-transparent text-sm font-normal transition-colors\",\n active\n ? \"font-semibold text-[var(--text-primary)]\"\n : \"text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\n )}\n type=\"button\"\n onClick={onClick}\n >\n {label}\n </button>\n </li>\n );\n}\n","import {\n FolderIcon,\n RecentLinedIcon,\n ScrollArea,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { CSSProperties, ReactElement } from \"react\";\nimport type {\n WorkspaceFileLocation,\n WorkspaceFileExternalLocation,\n WorkspaceFileLocationSection\n} from \"../services/workspaceFileManagerTypes.ts\";\n\nexport function WorkspaceFileManagerSidebar({\n disabled,\n locationSections,\n selectedLocationId,\n width,\n onSelectLocation\n}: {\n disabled: boolean;\n locationSections: readonly WorkspaceFileLocationSection[];\n selectedLocationId: string | null;\n width: number;\n onSelectLocation: (location: WorkspaceFileLocation) => void;\n}): ReactElement | null {\n const visibleSections = locationSections.filter(\n (section) => section.locations.length > 0\n );\n if (visibleSections.length === 0) {\n return null;\n }\n\n return (\n <aside\n className=\"@max-[600px]/workspace-file-manager:hidden flex shrink-0 flex-col border-r border-[var(--border-1)] bg-[var(--background-panel)]\"\n style={{ minWidth: width, width } satisfies CSSProperties}\n >\n <ScrollArea className=\"min-h-0 flex-1\">\n <TooltipProvider delayDuration={350}>\n <div className=\"flex flex-col gap-3 px-2 py-3\">\n {visibleSections.map((section) => (\n <section key={section.id} className=\"min-w-0\">\n <h2 className=\"mb-1 px-2 text-[11px] font-medium uppercase tracking-normal text-[var(--text-tertiary)]\">\n {section.label}\n </h2>\n <div className=\"flex flex-col gap-0.5\">\n {section.locations.map((location) => (\n <WorkspaceFileManagerSidebarLocation\n key={location.id}\n active={location.id === selectedLocationId}\n disabled={disabled}\n location={location}\n onSelectLocation={onSelectLocation}\n />\n ))}\n </div>\n </section>\n ))}\n </div>\n </TooltipProvider>\n </ScrollArea>\n </aside>\n );\n}\n\nfunction WorkspaceFileManagerSidebarLocation({\n active,\n disabled,\n location,\n onSelectLocation\n}: {\n active: boolean;\n disabled: boolean;\n location: WorkspaceFileLocation;\n onSelectLocation: (location: WorkspaceFileLocation) => void;\n}): ReactElement {\n const Icon = location.kind === \"recent\" ? RecentLinedIcon : FolderIcon;\n const content = (\n <button\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex h-8 min-w-0 items-center gap-2 rounded-md border border-transparent px-2 text-left text-sm text-[var(--text-secondary)] transition-colors\",\n active\n ? \"border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-primary)] shadow-none\"\n : \"hover:bg-[var(--transparency-block)] hover:text-[var(--text-primary)]\",\n disabled && \"pointer-events-none opacity-60\"\n )}\n disabled={disabled}\n type=\"button\"\n onClick={() => {\n onSelectLocation(location);\n }}\n >\n {location.kind === \"external\" && location.iconUrl ? (\n <ExternalLocationIcon location={location} />\n ) : (\n <Icon className=\"size-4 flex-none\" />\n )}\n <span className=\"min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap\">\n {location.label}\n </span>\n </button>\n );\n\n if (!location.contextLabel) {\n return content;\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent side=\"right\">{location.contextLabel}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction ExternalLocationIcon({\n location\n}: {\n location: WorkspaceFileExternalLocation;\n}): ReactElement {\n return (\n <img\n alt=\"\"\n className=\"size-4 flex-none rounded-[3px] object-cover\"\n src={location.iconUrl ?? undefined}\n />\n );\n}\n","import { useCallback, useState } from \"react\";\nimport {\n readWorkspaceFileManagerArrangeMode,\n writeWorkspaceFileManagerArrangeMode,\n type WorkspaceFileManagerArrangeMode\n} from \"./workspaceFileManagerArrangeMode.ts\";\n\nexport function useWorkspaceFileManagerArrangeMode(): {\n arrangeMode: WorkspaceFileManagerArrangeMode;\n setArrangeMode: (arrangeMode: WorkspaceFileManagerArrangeMode) => void;\n} {\n const [arrangeMode, setArrangeModeState] = useState(\n readWorkspaceFileManagerArrangeMode\n );\n\n const setArrangeMode = useCallback(\n (nextArrangeMode: WorkspaceFileManagerArrangeMode) => {\n setArrangeModeState(nextArrangeMode);\n writeWorkspaceFileManagerArrangeMode(nextArrangeMode);\n },\n []\n );\n\n return { arrangeMode, setArrangeMode };\n}\n","import { useCallback, useState } from \"react\";\nimport {\n readWorkspaceFileManagerLayoutMode,\n writeWorkspaceFileManagerLayoutMode,\n type WorkspaceFileManagerLayoutMode\n} from \"./workspaceFileManagerLayoutMode.ts\";\n\nexport function useWorkspaceFileManagerLayoutMode(): {\n layoutMode: WorkspaceFileManagerLayoutMode;\n setLayoutMode: (layoutMode: WorkspaceFileManagerLayoutMode) => void;\n} {\n const [layoutMode, setLayoutModeState] = useState(\n readWorkspaceFileManagerLayoutMode\n );\n\n const setLayoutMode = useCallback(\n (nextLayoutMode: WorkspaceFileManagerLayoutMode) => {\n setLayoutModeState(nextLayoutMode);\n writeWorkspaceFileManagerLayoutMode(nextLayoutMode);\n },\n []\n );\n\n return { layoutMode, setLayoutMode };\n}\n","export type WorkspaceFileManagerLayoutMode = \"icon\" | \"list\";\n\nexport const workspaceFileManagerLayoutModeStorageKey =\n \"tutti.workspace-file-manager.layout-mode\";\n\nexport function readWorkspaceFileManagerLayoutMode(): WorkspaceFileManagerLayoutMode {\n if (typeof window === \"undefined\") {\n return \"list\";\n }\n\n const stored = window.localStorage.getItem(\n workspaceFileManagerLayoutModeStorageKey\n );\n return stored === \"icon\" ? \"icon\" : \"list\";\n}\n\nexport function writeWorkspaceFileManagerLayoutMode(\n layoutMode: WorkspaceFileManagerLayoutMode\n): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n window.localStorage.setItem(\n workspaceFileManagerLayoutModeStorageKey,\n layoutMode\n );\n}\n","export function shouldTrackDirectoryExpanded(input: {\n currentDirectoryPath: string;\n nextDirectoryPath: string;\n}): boolean {\n return (\n normalizeDirectoryPath(input.currentDirectoryPath) !==\n normalizeDirectoryPath(input.nextDirectoryPath)\n );\n}\n\nfunction normalizeDirectoryPath(path: string): string {\n return path.trim().replaceAll(\"\\\\\", \"/\").replace(/\\/+$/u, \"\");\n}\n"],"mappings":"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","names":["useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","cn","useEffect","useLayoutEffect","useRef","useState","menu","jsx","useRef","useState","useLayoutEffect","useEffect","jsx","jsxs","useCallback","useMemo","ArrowRightIcon","FileCodeIcon","FileTextIcon","LoadingIcon","VideoFileIcon","cn","resolveWorkspaceFileVisualKind","Button","cn","jsx","useCallback","useEffect","useLayoutEffect","useRef","useState","cn","useLayoutEffect","useRef","cn","useEffect","useRef","jsx","jsxs","useRef","useEffect","cn","jsx","jsxs","useRef","useLayoutEffect","cn","Fragment","jsx","jsxs","useRef","useState","useCallback","useEffect","useLayoutEffect","cn","EntryRow","LoadingIcon","ArrowRightIcon","VideoFileIcon","FileTextIcon","FileCodeIcon","resolveWorkspaceFileVisualKind","useCallback","useEffect","useMemo","useState","useMemo","useState","useEffect","useCallback","useMemo","jsx","useMemo","jsx","useMemo","useCallback","ArrowLeftIcon","ArrowRightIcon","Button","Input","LoadingIcon","cn","useEffect","useRef","useState","jsx","jsxs","ScrollArea","Tooltip","TooltipContent","TooltipProvider","TooltipTrigger","cn","jsx","jsxs","useCallback","useState","useState","useCallback","useCallback","useState","useState","useCallback","Fragment","jsx","jsxs","useRef","useState","useMemo","useCallback","useLayoutEffect","useEffect","cn"]}