@tutti-os/workspace-file-manager 0.0.201 → 0.0.202

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/WorkspaceFileManagerPanels.tsx","../src/ui/WorkspaceFileManagerIconGrid.tsx","../src/ui/WorkspaceFileEntryIcon.tsx","../src/workspaceFileFallbackAssets.ts","../src/ui/workspaceFileManagerIconGridLayout.ts","../src/ui/workspaceFileManagerPaneSizing.ts","../src/ui/workspaceFileManagerTableSizing.ts","../src/ui/WorkspaceFileManagerToolbar.tsx","../src/ui/WorkspaceFileManagerSidebar.tsx","../src/ui/useWorkspaceFileManagerArrangeMode.ts","../src/ui/useWorkspaceFileManagerLayoutMode.ts","../src/ui/workspaceFileManagerLayoutMode.ts","../src/ui/useWorkspaceFileEntryIconUrls.ts","../src/ui/workspaceFileEntryIconUrlQueue.ts","../src/ui/workspaceFileManagerAnalytics.ts","../src/ui/workspaceFileManagerVisibleTree.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 {\n type WorkspaceFileManagerEntryDragMode,\n WorkspaceFileManagerPanels\n} from \"./WorkspaceFileManagerPanels.tsx\";\nimport type { ResolveWorkspaceFileManagerContextMenu } from \"./workspaceFileManagerContextMenuTypes.ts\";\nimport { WorkspaceFileManagerToolbar } from \"./WorkspaceFileManagerToolbar.tsx\";\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 {\n sortWorkspaceFileEntriesForArrangeMode,\n type WorkspaceFileManagerArrangeMode\n} from \"./workspaceFileManagerArrangeMode.ts\";\nimport { useWorkspaceFileManagerArrangeMode } from \"./useWorkspaceFileManagerArrangeMode.ts\";\nimport type { WorkspaceFileManagerLayoutMode } from \"./workspaceFileManagerLayoutMode.ts\";\nimport { useWorkspaceFileManagerLayoutMode } from \"./useWorkspaceFileManagerLayoutMode.ts\";\nimport { useWorkspaceFileEntryIconUrls } from \"./useWorkspaceFileEntryIconUrls.ts\";\nimport { shouldTrackDirectoryExpanded } from \"./workspaceFileManagerAnalytics.ts\";\nimport {\n buildWorkspaceFileManagerVisibleTreeRows,\n collectWorkspaceFileManagerVisibleTreeEntries,\n type WorkspaceFileManagerVisibleTreeRow\n} from \"./workspaceFileManagerVisibleTree.ts\";\nimport {\n resolveWorkspaceFileManagerPreservedNameColumnWidth,\n workspaceFileManagerTableNameColumnSelector,\n workspaceFileManagerTableNameMinWidthProperty\n} from \"./workspaceFileManagerTableSizing.ts\";\nimport { workspaceFileSearchEntryToEntry } from \"../services/workspaceFileManagerModel.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 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 i18n: WorkspaceFileManagerI18nRuntime;\n session: WorkspaceFileManagerSession;\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 session,\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 = rootView.locationSections.some(\n (section) => section.locations.length > 0\n );\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 function openContextMenu(\n event: ReactMouseEvent<HTMLElement>,\n entry: WorkspaceFileEntry | null\n ): void {\n event.preventDefault();\n event.stopPropagation();\n\n const rootBounds = rootRef.current?.getBoundingClientRect();\n if (!rootBounds) {\n return;\n }\n\n const menuWidth = 220;\n const menuHeight = 280;\n const x = clampContextMenuCoordinate(\n event.clientX - rootBounds.left,\n rootBounds.width,\n menuWidth\n );\n const y = clampContextMenuCoordinate(\n event.clientY - rootBounds.top,\n rootBounds.height,\n menuHeight\n );\n\n session.openContextMenu({\n entryPath: entry?.path ?? null,\n x,\n y\n });\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 >\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 {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 session={session}\n />\n <div\n 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 style={\n {\n \"--workspace-file-manager-dialog-overlay-z-index\": \"20\"\n } as CSSProperties\n }\n >\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 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 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 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 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 {\n iconUrlByCacheKey,\n reportEntryIconViewportEnter,\n reportEntryIconViewportLeave\n } = useWorkspaceFileEntryIconUrls({\n entries: layoutMode === \"list\" ? visibleTreeEntries : displayedEntries,\n includeImageThumbnails: true,\n resolveEntryIconUrl\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 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 entryContextByPath={view.isSearchMode ? searchEntryContextByPath : null}\n treeRows={displayedTreeRows}\n onEntryIconViewportEnter={reportEntryIconViewportEnter}\n onEntryIconViewportLeave={reportEntryIconViewportLeave}\n selectedEntry={view.selectedEntry}\n selectedPath={view.selectedPath}\n showPreviewPanel={showPreviewPanel}\n state={{\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 onBlankContextMenu={(event) => {\n onOpenContextMenu(event, null);\n }}\n onCancelInlineRename={() => {\n session.cancelInlineRename();\n }}\n onClearInlineRenameValidation={() => {\n session.clearInlineRenameValidation();\n }}\n onConfirmInlineRename={(newName) => {\n return session.confirmInlineRename(newName);\n }}\n onEntryContextMenu={onOpenContextMenu}\n onEntryDragStart={onEntryDragStart}\n onMoveEntry={(entry, targetDirectoryPath) => {\n void session.moveEntry(entry, targetDirectoryPath);\n }}\n onOpenEntry={(entry) => {\n if (entry.kind === \"directory\") {\n onDirectoryExpanded?.(entry.path);\n }\n void session.openEntry(entry);\n }}\n onSelect={(path) => {\n session.select(path);\n }}\n onToggleDirectoryExpanded={(entry, expanded) => {\n if (!expanded) {\n onDirectoryExpanded?.(entry.path);\n }\n void session.toggleDirectoryExpanded(entry);\n }}\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 useLayoutEffect(() => {\n if (!view.contextMenu) {\n setItems([]);\n return;\n }\n\n const request = buildContextMenuRequest({\n session,\n view\n });\n const resolved = resolveContextMenu(request);\n if (!isPromiseLike(resolved)) {\n setItems(resolved);\n return;\n }\n\n let cancelled = false;\n setItems([]);\n void resolved.then((nextItems) => {\n if (!cancelled) {\n setItems(nextItems);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [\n resolveContextMenu,\n session,\n view.contextMenu,\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 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 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 {\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({ x: contextMenu.x, y: contextMenu.y });\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 setPosition(\n 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 );\n }, [contextMenu, contextMenuRef, items, positionMode]);\n\n if (!contextMenu || items.length === 0) {\n return null;\n }\n\n return (\n <MenuSurface\n ref={contextMenuRef}\n data-workspace-file-manager-context-menu=\"\"\n className={cn(\n \"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 zIndex: \"calc(var(--workspace-file-manager-dialog-overlay-z-index) - 1)\"\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\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 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 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\nfunction 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 \"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 \"aria-label\": entry.name,\n className: rowClassName,\n \"data-workspace-file-entry-path\": entry.path,\n draggable: isInlineRenaming ? false : draggable,\n style: gridStyle,\n onContextMenu: (event: ReactMouseEvent<HTMLElement>) => {\n onContextMenu(event, entry);\n }\n };\n const nameCell = (\n <span className={cn(\"min-w-0 overflow-hidden\", tableCellPaddingClassName)}>\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 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 tableCellPaddingClassName\n )}\n >\n {entry.kind === \"directory\"\n ? \"--\"\n : formatWorkspaceFileBytes(entry.sizeBytes)}\n </span>\n );\n\n if (isInlineRenaming) {\n return (\n <div {...rowProps} ref={divRowRef}>\n {nameCell}\n {modifiedCell}\n {sizeCell}\n </div>\n );\n }\n\n return (\n <button\n {...rowProps}\n ref={buttonRowRef}\n type=\"button\"\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 onClick={() => {\n onClick(entry);\n }}\n >\n {nameCell}\n {modifiedCell}\n {sizeCell}\n </button>\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=\"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 FileCodeIcon,\n FileTextIcon,\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 workspaceArchiveFallbackIconUrl,\n workspaceFolderFallbackIconUrl\n} from \"../workspaceFileFallbackAssets.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 <img\n alt=\"\"\n aria-hidden=\"true\"\n className={cn(\"object-contain\", className)}\n decoding=\"async\"\n draggable={false}\n src={workspaceFolderFallbackIconUrl}\n />\n );\n}\n\nexport function WorkspaceArchiveFallbackIcon({\n className\n}: {\n className: string;\n}): ReactElement {\n return (\n <img\n alt=\"\"\n aria-hidden=\"true\"\n className={cn(\"object-contain\", className)}\n decoding=\"async\"\n draggable={false}\n src={workspaceArchiveFallbackIconUrl}\n />\n );\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","export const workspaceArchiveFallbackIconUrl = new URL(\n \"./assets/workspace-archive-fallback.png\",\n import.meta.url\n).toString();\n\nexport const workspaceFolderFallbackIconUrl = new URL(\n \"./assets/workspace-folder-fallback.png\",\n import.meta.url\n).toString();\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 {\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\";\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 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 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 <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","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","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","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"],"mappings":"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","names":["useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","cn","useEffect","useLayoutEffect","useRef","useState","jsx","useRef","useState","useLayoutEffect","useEffect","jsx","jsxs","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","LoadingIcon","ArrowRightIcon","VideoFileIcon","FileTextIcon","FileCodeIcon","resolveWorkspaceFileVisualKind","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","useCallback","useEffect","useMemo","useState","useMemo","useState","useEffect","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/WorkspaceFileManagerPanels.tsx","../src/ui/WorkspaceFileManagerIconGrid.tsx","../src/ui/WorkspaceFileEntryIcon.tsx","../src/workspaceFileFallbackAssets.ts","../src/ui/workspaceFileManagerIconGridLayout.ts","../src/ui/workspaceFileManagerPaneSizing.ts","../src/ui/workspaceFileManagerTableSizing.ts","../src/ui/WorkspaceFileManagerToolbar.tsx","../src/ui/WorkspaceFileManagerSidebar.tsx","../src/ui/useWorkspaceFileManagerArrangeMode.ts","../src/ui/useWorkspaceFileManagerLayoutMode.ts","../src/ui/workspaceFileManagerLayoutMode.ts","../src/ui/useWorkspaceFileEntryIconUrls.ts","../src/ui/workspaceFileEntryIconUrlQueue.ts","../src/ui/workspaceFileManagerAnalytics.ts","../src/ui/workspaceFileManagerVisibleTree.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 {\n type WorkspaceFileManagerEntryDragMode,\n WorkspaceFileManagerPanels\n} from \"./WorkspaceFileManagerPanels.tsx\";\nimport type { ResolveWorkspaceFileManagerContextMenu } from \"./workspaceFileManagerContextMenuTypes.ts\";\nimport { WorkspaceFileManagerToolbar } from \"./WorkspaceFileManagerToolbar.tsx\";\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 {\n sortWorkspaceFileEntriesForArrangeMode,\n type WorkspaceFileManagerArrangeMode\n} from \"./workspaceFileManagerArrangeMode.ts\";\nimport { useWorkspaceFileManagerArrangeMode } from \"./useWorkspaceFileManagerArrangeMode.ts\";\nimport type { WorkspaceFileManagerLayoutMode } from \"./workspaceFileManagerLayoutMode.ts\";\nimport { useWorkspaceFileManagerLayoutMode } from \"./useWorkspaceFileManagerLayoutMode.ts\";\nimport { useWorkspaceFileEntryIconUrls } from \"./useWorkspaceFileEntryIconUrls.ts\";\nimport { shouldTrackDirectoryExpanded } from \"./workspaceFileManagerAnalytics.ts\";\nimport {\n buildWorkspaceFileManagerVisibleTreeRows,\n collectWorkspaceFileManagerVisibleTreeEntries,\n type WorkspaceFileManagerVisibleTreeRow\n} from \"./workspaceFileManagerVisibleTree.ts\";\nimport {\n resolveWorkspaceFileManagerPreservedNameColumnWidth,\n workspaceFileManagerTableNameColumnSelector,\n workspaceFileManagerTableNameMinWidthProperty\n} from \"./workspaceFileManagerTableSizing.ts\";\nimport { workspaceFileSearchEntryToEntry } from \"../services/workspaceFileManagerModel.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 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 i18n: WorkspaceFileManagerI18nRuntime;\n session: WorkspaceFileManagerSession;\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 session,\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 = rootView.locationSections.some(\n (section) => section.locations.length > 0\n );\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 function openContextMenu(\n event: ReactMouseEvent<HTMLElement>,\n entry: WorkspaceFileEntry | null\n ): void {\n event.preventDefault();\n event.stopPropagation();\n\n const rootBounds = rootRef.current?.getBoundingClientRect();\n if (!rootBounds) {\n return;\n }\n\n const menuWidth = 220;\n const menuHeight = 280;\n const x = clampContextMenuCoordinate(\n event.clientX - rootBounds.left,\n rootBounds.width,\n menuWidth\n );\n const y = clampContextMenuCoordinate(\n event.clientY - rootBounds.top,\n rootBounds.height,\n menuHeight\n );\n\n session.openContextMenu({\n entryPath: entry?.path ?? null,\n x,\n y\n });\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 >\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 {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 session={session}\n />\n <div\n 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 style={\n {\n \"--workspace-file-manager-dialog-overlay-z-index\": \"20\"\n } as CSSProperties\n }\n >\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 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 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 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 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 {\n iconUrlByCacheKey,\n reportEntryIconViewportEnter,\n reportEntryIconViewportLeave\n } = useWorkspaceFileEntryIconUrls({\n entries: layoutMode === \"list\" ? visibleTreeEntries : displayedEntries,\n includeImageThumbnails: true,\n resolveEntryIconUrl\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 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 entryContextByPath={view.isSearchMode ? searchEntryContextByPath : null}\n treeRows={displayedTreeRows}\n onEntryIconViewportEnter={reportEntryIconViewportEnter}\n onEntryIconViewportLeave={reportEntryIconViewportLeave}\n selectedEntry={view.selectedEntry}\n selectedPath={view.selectedPath}\n showPreviewPanel={showPreviewPanel}\n state={{\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 onBlankContextMenu={(event) => {\n onOpenContextMenu(event, null);\n }}\n onCancelInlineRename={() => {\n session.cancelInlineRename();\n }}\n onClearInlineRenameValidation={() => {\n session.clearInlineRenameValidation();\n }}\n onConfirmInlineRename={(newName) => {\n return session.confirmInlineRename(newName);\n }}\n onEntryContextMenu={onOpenContextMenu}\n onEntryDragStart={onEntryDragStart}\n onMoveEntry={(entry, targetDirectoryPath) => {\n void session.moveEntry(entry, targetDirectoryPath);\n }}\n onOpenEntry={(entry) => {\n if (entry.kind === \"directory\") {\n onDirectoryExpanded?.(entry.path);\n }\n void session.openEntry(entry);\n }}\n onSelect={(path) => {\n session.select(path);\n }}\n onToggleDirectoryExpanded={(entry, expanded) => {\n if (!expanded) {\n onDirectoryExpanded?.(entry.path);\n }\n void session.toggleDirectoryExpanded(entry);\n }}\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 useLayoutEffect(() => {\n if (!view.contextMenu) {\n setItems([]);\n return;\n }\n\n const request = buildContextMenuRequest({\n session,\n view\n });\n const resolved = resolveContextMenu(request);\n if (!isPromiseLike(resolved)) {\n setItems(resolved);\n return;\n }\n\n let cancelled = false;\n setItems([]);\n void resolved.then((nextItems) => {\n if (!cancelled) {\n setItems(nextItems);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [\n resolveContextMenu,\n session,\n view.contextMenu,\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 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 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 {\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({ x: contextMenu.x, y: contextMenu.y });\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 setPosition(\n 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 );\n }, [contextMenu, contextMenuRef, items, positionMode]);\n\n if (!contextMenu || items.length === 0) {\n return null;\n }\n\n return (\n <MenuSurface\n ref={contextMenuRef}\n data-workspace-file-manager-context-menu=\"\"\n className={cn(\n \"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 zIndex: \"calc(var(--workspace-file-manager-dialog-overlay-z-index) - 1)\"\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\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 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 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\nfunction 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 FileCodeIcon,\n FileTextIcon,\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 workspaceArchiveFallbackIconUrl,\n workspaceFolderFallbackIconUrl\n} from \"../workspaceFileFallbackAssets.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 <img\n alt=\"\"\n aria-hidden=\"true\"\n className={cn(\"object-contain\", className)}\n decoding=\"async\"\n draggable={false}\n src={workspaceFolderFallbackIconUrl}\n />\n );\n}\n\nexport function WorkspaceArchiveFallbackIcon({\n className\n}: {\n className: string;\n}): ReactElement {\n return (\n <img\n alt=\"\"\n aria-hidden=\"true\"\n className={cn(\"object-contain\", className)}\n decoding=\"async\"\n draggable={false}\n src={workspaceArchiveFallbackIconUrl}\n />\n );\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","import workspaceArchiveFallbackIconUrl from \"@tutti-os/workspace-file-manager/assets/workspace-archive-fallback.png\";\nimport workspaceFolderFallbackIconUrl from \"@tutti-os/workspace-file-manager/assets/workspace-folder-fallback.png\";\n\nexport { workspaceArchiveFallbackIconUrl, workspaceFolderFallbackIconUrl };\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 {\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\";\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 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 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 <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","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","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","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"],"mappings":"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","names":["useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","cn","useEffect","useLayoutEffect","useRef","useState","jsx","useRef","useState","useLayoutEffect","useEffect","jsx","jsxs","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","LoadingIcon","ArrowRightIcon","VideoFileIcon","FileTextIcon","FileCodeIcon","resolveWorkspaceFileVisualKind","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","useCallback","useEffect","useMemo","useState","useMemo","useState","useEffect","useCallback","Fragment","jsx","jsxs","useRef","useState","useMemo","useCallback","useLayoutEffect","useEffect","cn"]}