@tutti-os/workspace-file-manager 0.0.2 → 0.0.3
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/{chunk-2AG4ND4D.js → chunk-P2UOYMTS.js} +7 -3
- package/dist/chunk-P2UOYMTS.js.map +1 -0
- package/dist/{fileKinds-MpDaZhVB.d.ts → fileKinds-DQHup7UY.d.ts} +1 -1
- package/dist/i18n/index.d.ts +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/{index-6L2biT8M.d.ts → index-CwydAjYx.d.ts} +2 -0
- package/dist/index.d.ts +6 -5
- package/dist/index.js +786 -200
- package/dist/index.js.map +1 -1
- package/dist/services/index.d.ts +2 -2
- package/dist/services/index.js +1 -1
- package/package.json +4 -4
- package/dist/chunk-2AG4ND4D.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/WorkspaceFileManager.tsx","../src/ui/WorkspaceFileManagerMenus.tsx","../src/ui/contextMenuPlacement.ts","../src/ui/WorkspaceFileManagerPanels.tsx","../src/ui/WorkspaceFileManagerToolbar.tsx","../src/ui/workspaceFileManagerAnalytics.ts","../src/ui/useWorkspaceFileManagerService.ts","../src/services/internal/workspaceFileManagerViewModel.ts"],"sourcesContent":["import type {\n CSSProperties,\n DragEvent as ReactDragEvent,\n MouseEvent as ReactMouseEvent,\n ReactElement,\n RefObject\n} from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"@tutti-os/ui-system\";\nimport type { NextopDateLocale } from \"@tutti-os/ui-system/date-format\";\nimport type { WorkspaceFileManagerSession } from \"../services/workspaceFileManagerService.interface.ts\";\nimport {\n resolveRevealInFolderLabel,\n type WorkspaceFileManagerI18nRuntime\n} from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileOpenWithApplication\n} from \"../services/workspaceFileManagerTypes.ts\";\nimport { isWorkspaceFileBrowserOpenable } from \"../services/index.ts\";\nimport {\n WorkspaceFileManagerContextMenu,\n WorkspaceFileManagerCreateDialog,\n WorkspaceFileManagerDeleteDialog,\n WorkspaceFileManagerUnsupportedDialog,\n WorkspaceFileManagerImportConflictDialog\n} from \"./WorkspaceFileManagerMenus.tsx\";\nimport {\n hasFileDragPayload,\n type WorkspaceFileManagerEntryDragMode,\n WorkspaceFileManagerPanels\n} from \"./WorkspaceFileManagerPanels.tsx\";\nimport { WorkspaceFileManagerToolbar } from \"./WorkspaceFileManagerToolbar.tsx\";\nimport { shouldTrackDirectoryExpanded } from \"./workspaceFileManagerAnalytics.ts\";\nimport {\n useWorkspaceFileManagerContextMenuView,\n useWorkspaceFileManagerDialogsView,\n useWorkspaceFileManagerPanelsView,\n useWorkspaceFileManagerRootView,\n useWorkspaceFileManagerToolbarView\n} from \"./useWorkspaceFileManagerService.ts\";\n\nexport interface WorkspaceFileManagerProps {\n className?: string;\n dateLocale?: NextopDateLocale;\n entryDragMode?: WorkspaceFileManagerEntryDragMode;\n openInAppBrowserIcon?: ReactElement;\n resolveOpenWithApplicationIcon?: (\n application: WorkspaceFileOpenWithApplication\n ) => ReactElement | null;\n onCopyEntry?: () => Promise<void> | void;\n onCopyPath?: (path: string) => Promise<void> | void;\n onDirectoryExpanded?: (path: string) => void;\n onEntryDragStart?: (\n entry: WorkspaceFileEntry,\n dataTransfer: DataTransfer\n ) => void;\n hostOs?: NodeJS.Platform;\n i18n: WorkspaceFileManagerI18nRuntime;\n session: WorkspaceFileManagerSession;\n surface?: \"card\" | \"embedded\";\n}\n\nexport function WorkspaceFileManager({\n className,\n dateLocale,\n entryDragMode,\n i18n,\n onCopyEntry,\n onCopyPath,\n onDirectoryExpanded,\n onEntryDragStart,\n openInAppBrowserIcon,\n resolveOpenWithApplicationIcon,\n hostOs = \"linux\",\n session,\n surface = \"card\"\n}: WorkspaceFileManagerProps): ReactElement {\n const rootRef = useRef<HTMLElement | null>(null);\n const rootView = useWorkspaceFileManagerRootView(session);\n const { state: panelsState, view: panelsView } =\n useWorkspaceFileManagerPanelsView(session);\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 (\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 }, [onCopyEntry, panelsState, panelsView.selectedEntry, session]);\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 (\n !panelsState.capabilities.canRename ||\n panelsState.busyAction !== null ||\n panelsState.isLoading ||\n panelsState.isMutating ||\n panelsState.inlineRenameEntryPath !== null\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 }, [panelsState, panelsView.selectedEntry, session]);\n\n useEffect(() => {\n function resetDropOverlay(): void {\n session.resetDragDepth();\n }\n\n function handleDocumentDragOver(event: DragEvent): void {\n if (isPointInsideElement(rootRef.current, event.clientX, event.clientY)) {\n return;\n }\n session.resetDragDepth();\n }\n\n window.addEventListener(\"blur\", resetDropOverlay);\n window.addEventListener(\"dragend\", resetDropOverlay);\n window.addEventListener(\"drop\", resetDropOverlay);\n document.addEventListener(\"dragover\", handleDocumentDragOver, true);\n\n return () => {\n window.removeEventListener(\"blur\", resetDropOverlay);\n window.removeEventListener(\"dragend\", resetDropOverlay);\n window.removeEventListener(\"drop\", resetDropOverlay);\n document.removeEventListener(\"dragover\", handleDocumentDragOver, true);\n };\n }, [session]);\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 function handleDragEnter(event: ReactDragEvent<HTMLElement>): void {\n if (\n !rootView.canImportFromDrop ||\n rootView.isBusy ||\n !hasFileDragPayload(event.dataTransfer)\n ) {\n return;\n }\n\n event.preventDefault();\n session.incrementDragDepth();\n }\n\n function handleDragOver(event: ReactDragEvent<HTMLElement>): void {\n if (\n !rootView.canImportFromDrop ||\n rootView.isBusy ||\n !hasFileDragPayload(event.dataTransfer)\n ) {\n return;\n }\n\n event.preventDefault();\n event.dataTransfer.dropEffect = \"copy\";\n }\n\n function handleDragLeave(event: ReactDragEvent<HTMLElement>): void {\n if (\n !rootView.canImportFromDrop ||\n !hasFileDragPayload(event.dataTransfer)\n ) {\n return;\n }\n\n event.preventDefault();\n const nextTarget = event.relatedTarget;\n if (nextTarget instanceof Node && rootRef.current?.contains(nextTarget)) {\n return;\n }\n session.resetDragDepth();\n }\n\n function handleDrop(event: ReactDragEvent<HTMLElement>): void {\n if (\n !rootView.canImportFromDrop ||\n rootView.isBusy ||\n !hasFileDragPayload(event.dataTransfer)\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n session.resetDragDepth();\n void session.importDroppedFiles(\n event.dataTransfer,\n rootView.currentDirectoryPath\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 onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n ref={rootRef}\n >\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n <WorkspaceFileManagerToolbarContainer\n i18n={i18n}\n onDirectoryExpanded={onDirectoryExpanded}\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 i18n={i18n}\n onDirectoryExpanded={onDirectoryExpanded}\n onEntryDragStart={onEntryDragStart}\n onOpenContextMenu={openContextMenu}\n session={session}\n />\n </div>\n </div>\n <WorkspaceFileManagerDialogsContainer i18n={i18n} session={session} />\n <WorkspaceFileManagerContextMenuContainer\n hostOs={hostOs}\n i18n={i18n}\n onCopyEntry={onCopyEntry}\n onCopyPath={onCopyPath}\n openInAppBrowserIcon={openInAppBrowserIcon}\n resolveOpenWithApplicationIcon={resolveOpenWithApplicationIcon}\n session={session}\n />\n </section>\n );\n}\n\nfunction WorkspaceFileManagerToolbarContainer({\n i18n,\n onDirectoryExpanded,\n session\n}: {\n i18n: WorkspaceFileManagerI18nRuntime;\n onDirectoryExpanded?: (path: string) => void;\n session: WorkspaceFileManagerSession;\n}): ReactElement {\n const { view } = useWorkspaceFileManagerToolbarView(session, i18n);\n\n return (\n <WorkspaceFileManagerToolbar\n breadcrumbs={view.breadcrumbs}\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 onGoBack={() => {\n void session.goBack();\n }}\n onGoForward={() => {\n void session.goForward();\n }}\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 />\n );\n}\n\nfunction WorkspaceFileManagerPanelsContainer({\n dateLocale,\n entryDragMode,\n i18n,\n onDirectoryExpanded,\n onEntryDragStart,\n onOpenContextMenu,\n session\n}: {\n dateLocale?: NextopDateLocale;\n entryDragMode?: WorkspaceFileManagerEntryDragMode;\n i18n: WorkspaceFileManagerI18nRuntime;\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 session: WorkspaceFileManagerSession;\n}): ReactElement {\n const { state, view } = useWorkspaceFileManagerPanelsView(session);\n\n return (\n <WorkspaceFileManagerPanels\n canMove={view.canMove}\n contextMenuEntryPath={view.contextMenuEntryPath}\n copy={i18n}\n dateLocale={dateLocale}\n entryDragMode={entryDragMode}\n inlineRenameEntryPath={view.inlineRenameEntryPath}\n inlineRenameValidation={view.inlineRenameValidation}\n isRenaming={view.isRenaming}\n pendingDirectoryPath={view.pendingDirectoryPath}\n previewState={view.previewState}\n selectedEntry={view.selectedEntry}\n selectedPath={view.selectedPath}\n showDropOverlay={view.showDropOverlay}\n state={{\n entries: state.entries,\n error: state.error,\n isLoading: state.isLoading\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 />\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 <WorkspaceFileManagerImportConflictDialog\n busy={view.isImporting}\n copy={i18n}\n dialog={view.importConflictDialog}\n onClose={() => {\n session.closeImportConflictDialog();\n }}\n onConfirm={() => {\n void session.confirmImportConflict();\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 WorkspaceFileManagerContextMenuContainer({\n hostOs,\n i18n,\n onCopyEntry,\n onCopyPath,\n openInAppBrowserIcon,\n resolveOpenWithApplicationIcon,\n session\n}: {\n hostOs: NodeJS.Platform;\n i18n: WorkspaceFileManagerI18nRuntime;\n onCopyEntry?: () => Promise<void> | void;\n onCopyPath?: (path: string) => Promise<void> | void;\n openInAppBrowserIcon?: ReactElement;\n resolveOpenWithApplicationIcon?: (\n application: WorkspaceFileOpenWithApplication\n ) => ReactElement | null;\n session: WorkspaceFileManagerSession;\n}): ReactElement | null {\n const contextMenuRef = useRef<HTMLDivElement | null>(null);\n const { view } = useWorkspaceFileManagerContextMenuView(session);\n const [openWithApplications, setOpenWithApplications] = useState<\n WorkspaceFileOpenWithApplication[]\n >([]);\n const [openWithLoading, setOpenWithLoading] = useState(false);\n\n useEffect(() => {\n const entry = view.contextMenu?.entry;\n if (!entry || !view.showOpenWithAction) {\n return;\n }\n\n const cachedApplications = session.getCachedOpenWithApplications(entry);\n if (cachedApplications) {\n setOpenWithApplications(cachedApplications);\n setOpenWithLoading(false);\n return;\n }\n\n let cancelled = false;\n setOpenWithLoading(true);\n void session\n .listOpenWithApplications(entry)\n .then((applications) => {\n if (cancelled) {\n return;\n }\n setOpenWithApplications(applications);\n setOpenWithLoading(false);\n })\n .catch(() => {\n if (cancelled) {\n return;\n }\n setOpenWithApplications([]);\n setOpenWithLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [session, view.contextMenu?.entry?.path, view.showOpenWithAction]);\n\n useCloseContextMenuOnOutsideInteraction({\n contextMenuRef,\n isOpen: view.contextMenu !== null,\n session\n });\n\n return (\n <WorkspaceFileManagerContextMenu\n busy={view.isBusy || view.isLoading || view.isMutating}\n copy={i18n}\n contextMenu={view.contextMenu}\n contextMenuRef={contextMenuRef}\n showCopyAction={view.showCopyAction}\n showImportAction={view.showImportAction}\n showExportAction={view.showExportAction}\n showOpenInAppBrowserAction={\n view.showOpenInAppBrowserAction &&\n !!view.contextMenu?.entry &&\n isWorkspaceFileBrowserOpenable(view.contextMenu.entry)\n }\n showOpenInDefaultBrowserAction={\n view.showOpenInDefaultBrowserAction &&\n !!view.contextMenu?.entry &&\n isWorkspaceFileBrowserOpenable(view.contextMenu.entry)\n }\n showOpenWithAction={view.showOpenWithAction}\n showOpenWithOtherAction={view.showOpenWithOtherAction}\n showRevealInFolderAction={view.showRevealInFolderAction}\n showRenameAction={view.showRenameAction}\n revealInFolderLabel={resolveRevealInFolderLabel(i18n, hostOs)}\n openInAppBrowserIcon={openInAppBrowserIcon}\n openWithApplications={openWithApplications}\n openWithLoading={openWithLoading}\n resolveOpenWithApplicationIcon={resolveOpenWithApplicationIcon}\n onClose={() => {\n session.closeContextMenu();\n }}\n onCreateDirectory={() => {\n session.openCreateDirectoryDialog();\n }}\n onCreateFile={() => {\n session.openCreateFileDialog();\n }}\n onCopy={async () => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n session.closeContextMenu();\n await session.copyToClipboard(entry);\n if (onCopyEntry) {\n await onCopyEntry();\n }\n }}\n onCopyPath={async () => {\n const path = view.contextMenu?.entry?.path;\n if (!path) {\n return;\n }\n session.closeContextMenu();\n if (onCopyPath) {\n await onCopyPath(path);\n return;\n }\n await navigator.clipboard.writeText(path);\n }}\n onDelete={() => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n session.openDeleteDialog(entry);\n }}\n onRename={() => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n session.startInlineRename(entry);\n }}\n onExport={async () => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n await session.exportEntry(entry);\n }}\n onOpen={async () => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n await session.openEntry(entry);\n }}\n onOpenInAppBrowser={async () => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n await session.openFileInAppBrowser(entry);\n }}\n onOpenInDefaultBrowser={async () => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n await session.openFileInDefaultBrowser(entry);\n }}\n onOpenWithApplication={async (applicationPath) => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n await session.openFileWithApplication(entry, applicationPath);\n }}\n onOpenWithOtherApplication={async () => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n await session.openFileWithOtherApplication(entry);\n }}\n onRevealInFolder={async () => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n await session.revealEntry(entry);\n }}\n onImport={async () => {\n session.closeContextMenu();\n await session.importFiles(\n view.contextMenu?.entry?.kind === \"directory\"\n ? view.contextMenu.entry.path\n : view.currentDirectoryPath\n );\n }}\n />\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\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\nfunction isPointInsideElement(\n element: HTMLElement | null,\n clientX: number,\n clientY: number\n): boolean {\n if (!element) {\n return false;\n }\n\n const bounds = element.getBoundingClientRect();\n return (\n clientX >= bounds.left &&\n clientX <= bounds.right &&\n clientY >= bounds.top &&\n clientY <= bounds.bottom\n );\n}\n","import {\n ArrowRightIcon,\n Button,\n ConfirmationDialog,\n CopyIcon,\n DeleteIcon,\n DownloadIcon,\n EditIcon,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n EyeIcon,\n FileLinedIcon,\n Input,\n LaunchIcon,\n LocateFolderIcon,\n MenuSurface,\n NewWorkspaceLinedIcon,\n UploadIcon as ImportIcon,\n ViewportMenuSurface,\n WebIcon,\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 CONTEXT_MENU_SUBMENU_GAP_PX,\n clampContextMenuPosition,\n estimateOpenWithSubmenuHeight\n} from \"./contextMenuPlacement.ts\";\nimport type {\n WorkspaceFileManagerI18nKey,\n WorkspaceFileManagerI18nRuntime\n} from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileImportSummaryReason,\n WorkspaceFileOpenWithApplication\n} from \"../services/workspaceFileManagerTypes.ts\";\nimport type {\n WorkspaceFileManagerHostFallbackAction,\n WorkspaceFileManagerHostImportConflict\n} from \"./workspaceFileManagerHostTypes.ts\";\n\nexport function WorkspaceFileManagerContextMenu({\n busy,\n copy,\n contextMenu,\n contextMenuRef,\n openInAppBrowserIcon,\n showCopyAction,\n showImportAction,\n showExportAction,\n showOpenInAppBrowserAction,\n showOpenInDefaultBrowserAction,\n showOpenWithAction,\n showOpenWithOtherAction,\n showRevealInFolderAction,\n showRenameAction,\n revealInFolderLabel,\n openWithApplications,\n openWithLoading,\n resolveOpenWithApplicationIcon,\n onClose,\n onCreateDirectory,\n onCreateFile,\n onCopy,\n onCopyPath,\n onDelete,\n onExport,\n onOpen,\n onOpenInAppBrowser,\n onOpenInDefaultBrowser,\n onOpenWithApplication,\n onOpenWithOtherApplication,\n onImport,\n onRevealInFolder,\n onRename\n}: {\n busy: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n contextMenu: {\n entry: WorkspaceFileEntry | null;\n x: number;\n y: number;\n } | null;\n contextMenuRef: RefObject<HTMLDivElement | null>;\n openInAppBrowserIcon?: ReactElement;\n resolveOpenWithApplicationIcon?: (\n application: WorkspaceFileOpenWithApplication\n ) => ReactElement | null;\n showCopyAction: boolean;\n showImportAction: boolean;\n showExportAction: boolean;\n showOpenInAppBrowserAction: boolean;\n showOpenInDefaultBrowserAction: boolean;\n showOpenWithAction: boolean;\n showOpenWithOtherAction: boolean;\n showRevealInFolderAction: boolean;\n showRenameAction: boolean;\n revealInFolderLabel: string;\n openWithApplications: readonly WorkspaceFileOpenWithApplication[];\n openWithLoading: boolean;\n onClose: () => void;\n onCreateDirectory: () => void;\n onCreateFile: () => void;\n onCopy: () => Promise<void>;\n onCopyPath: () => Promise<void>;\n onDelete: () => void;\n onExport: () => Promise<void>;\n onOpen: () => Promise<void>;\n onOpenInAppBrowser: () => Promise<void>;\n onOpenInDefaultBrowser: () => Promise<void>;\n onOpenWithApplication: (applicationPath: string) => Promise<void>;\n onOpenWithOtherApplication: () => Promise<void>;\n onImport: () => Promise<void>;\n onRevealInFolder: () => Promise<void>;\n onRename: () => void;\n}): 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\n setPosition({ x: contextMenu.x, y: contextMenu.y });\n }, [contextMenu?.x, contextMenu?.y]);\n\n useLayoutEffect(() => {\n if (!contextMenu) {\n return;\n }\n\n const menu = contextMenuRef.current;\n const boundary = menu?.closest(\"[data-workspace-file-manager]\");\n if (!menu || !boundary) {\n return;\n }\n\n const boundaryRect = boundary.getBoundingClientRect();\n const menuRect = menu.getBoundingClientRect();\n setPosition(\n clampContextMenuPosition({\n boundaryHeight: boundaryRect.height,\n boundaryWidth: boundaryRect.width,\n menuHeight: menuRect.height,\n menuWidth: menuRect.width,\n x: contextMenu.x,\n y: contextMenu.y\n })\n );\n }, [\n contextMenu,\n contextMenuRef,\n openWithApplications.length,\n openWithLoading,\n showCopyAction,\n showExportAction,\n showImportAction,\n showOpenInAppBrowserAction,\n showOpenInDefaultBrowserAction,\n showOpenWithAction,\n showOpenWithOtherAction,\n showRevealInFolderAction,\n showRenameAction\n ]);\n\n if (!contextMenu) {\n return null;\n }\n\n const entry = contextMenu.entry;\n const isDirectory = entry?.kind === \"directory\";\n const editItems: ContextMenuActionItem[] = [];\n const transferItems: ContextMenuActionItem[] = [];\n const dangerItems: ContextMenuActionItem[] = [];\n const createItems: ContextMenuActionItem[] = [];\n\n if (entry) {\n if (showRenameAction) {\n editItems.push({\n action: onRename,\n disabled: busy,\n icon: <EditIcon className=\"size-4\" />,\n key: \"rename\",\n label: copy.t(\"renameLabel\")\n });\n }\n if (showCopyAction) {\n editItems.push({\n action: onCopy,\n disabled: busy,\n icon: <CopyIcon className=\"size-4\" />,\n key: \"copy\",\n label: copy.t(\"copyLabel\")\n });\n }\n editItems.push({\n action: onCopyPath,\n disabled: busy,\n icon: <CopyIcon className=\"size-4\" />,\n key: \"copy-path\",\n label: copy.t(\"copyPathLabel\")\n });\n if (showRevealInFolderAction) {\n editItems.push({\n action: onRevealInFolder,\n disabled: busy,\n icon: <LocateFolderIcon className=\"size-4\" />,\n key: \"reveal-in-folder\",\n label: revealInFolderLabel\n });\n }\n if (isDirectory && showImportAction) {\n transferItems.push({\n action: onImport,\n disabled: busy,\n icon: <ImportIcon className=\"size-4\" />,\n key: \"import\",\n label: copy.t(\"importLabel\")\n });\n }\n if (showExportAction) {\n transferItems.push({\n action: onExport,\n disabled: busy,\n icon: <DownloadIcon className=\"size-4\" />,\n key: \"export\",\n label: copy.t(\"downloadLabel\")\n });\n }\n dangerItems.push({\n action: onDelete,\n disabled: busy,\n danger: true,\n icon: <DeleteIcon className=\"size-4\" />,\n key: \"delete\",\n label: copy.t(\"deleteLabel\")\n });\n } else {\n createItems.push({\n action: onCreateFile,\n disabled: busy,\n icon: <NewWorkspaceLinedIcon className=\"size-4\" />,\n key: \"create-file\",\n label: copy.t(\"createFileLabel\")\n });\n createItems.push({\n action: onCreateDirectory,\n disabled: busy,\n icon: <FileLinedIcon className=\"size-4\" />,\n key: \"create-directory\",\n label: copy.t(\"createDirectoryLabel\")\n });\n if (showImportAction) {\n transferItems.push({\n action: onImport,\n disabled: busy,\n icon: <ImportIcon className=\"size-4\" />,\n key: \"import\",\n label: copy.t(\"importLabel\")\n });\n }\n }\n const menuGroups: Array<{\n items: readonly ContextMenuActionItem[];\n key: string;\n }> = entry\n ? [\n { items: editItems, key: \"edit\" },\n { items: transferItems, key: \"transfer\" },\n { items: dangerItems, key: \"danger\" }\n ]\n : [\n { items: createItems, key: \"create\" },\n { items: transferItems, key: \"transfer\" }\n ];\n const visibleMenuGroups = menuGroups.filter(\n (group) => group.items.length > 0\n );\n\n return (\n <MenuSurface\n ref={contextMenuRef}\n className=\"absolute w-[220px] overflow-visible p-1\"\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 {entry ? (\n <ContextMenuActionButton\n disabled={busy}\n icon={<EyeIcon className=\"size-4\" />}\n label={copy.t(\"openLabel\")}\n onClick={() => {\n onClose();\n void onOpen();\n }}\n />\n ) : null}\n {entry && showOpenWithAction ? (\n <OpenWithMenuItem\n applications={openWithApplications}\n busy={busy}\n copy={copy}\n isLoading={openWithLoading}\n openInAppBrowserIcon={openInAppBrowserIcon}\n resolveOpenWithApplicationIcon={resolveOpenWithApplicationIcon}\n showOpenInAppBrowser={showOpenInAppBrowserAction}\n showOpenInDefaultBrowser={showOpenInDefaultBrowserAction}\n showOpenWithOther={showOpenWithOtherAction}\n onClose={onClose}\n onOpenInAppBrowser={onOpenInAppBrowser}\n onOpenInDefaultBrowser={onOpenInDefaultBrowser}\n onOpenWithApplication={onOpenWithApplication}\n onOpenWithOtherApplication={onOpenWithOtherApplication}\n />\n ) : null}\n {visibleMenuGroups.map((group, groupIndex) => (\n <ContextMenuActionGroup\n key={group.key}\n items={group.items}\n showDivider={entry !== null || groupIndex > 0}\n onClose={onClose}\n />\n ))}\n </MenuSurface>\n );\n}\n\ninterface ContextMenuActionItem {\n action: () => Promise<void> | void;\n disabled?: boolean;\n danger?: boolean;\n icon: ReactElement;\n key: string;\n label: string;\n}\n\nfunction ContextMenuActionGroup({\n items,\n onClose,\n showDivider\n}: {\n items: readonly ContextMenuActionItem[];\n onClose: () => void;\n showDivider: boolean;\n}): ReactElement {\n return (\n <>\n {showDivider ? <ContextMenuDivider /> : null}\n {items.map((item) => (\n <ContextMenuActionButton\n key={item.key}\n danger={item.danger}\n disabled={item.disabled}\n icon={item.icon}\n label={item.label}\n onClick={() => {\n onClose();\n void item.action();\n }}\n />\n ))}\n </>\n );\n}\n\nfunction ContextMenuActionButton({\n danger = false,\n disabled = false,\n icon,\n label,\n onClick\n}: {\n danger?: boolean;\n disabled?: boolean;\n icon: ReactElement;\n label: string;\n onClick: () => void;\n}): ReactElement {\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-sm 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={onClick}\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 OpenWithMenuItem({\n applications,\n busy,\n copy,\n isLoading,\n openInAppBrowserIcon,\n resolveOpenWithApplicationIcon,\n showOpenInAppBrowser,\n showOpenInDefaultBrowser,\n showOpenWithOther,\n onClose,\n onOpenInAppBrowser,\n onOpenInDefaultBrowser,\n onOpenWithApplication,\n onOpenWithOtherApplication\n}: {\n applications: readonly WorkspaceFileOpenWithApplication[];\n busy: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n isLoading: boolean;\n openInAppBrowserIcon?: ReactElement;\n resolveOpenWithApplicationIcon?: (\n application: WorkspaceFileOpenWithApplication\n ) => ReactElement | null;\n showOpenInAppBrowser: boolean;\n showOpenInDefaultBrowser: boolean;\n showOpenWithOther: boolean;\n onClose: () => void;\n onOpenInAppBrowser: () => Promise<void>;\n onOpenInDefaultBrowser: () => Promise<void>;\n onOpenWithApplication: (applicationPath: string) => Promise<void>;\n onOpenWithOtherApplication: () => Promise<void>;\n}): ReactElement {\n const triggerRef = useRef<HTMLDivElement | null>(null);\n const [open, setOpen] = useState(false);\n const [placementPoint, setPlacementPoint] = useState({ x: 0, y: 0 });\n const closeTimerRef = useRef<number | null>(null);\n const showExternalSection =\n showOpenInDefaultBrowser ||\n showOpenWithOther ||\n isLoading ||\n applications.length > 0;\n const estimatedSubmenuHeight = estimateOpenWithSubmenuHeight({\n applicationCount: applications.length,\n isLoading,\n showExternalSection,\n showOpenInAppBrowser,\n showOpenInDefaultBrowser,\n showOpenWithOther\n });\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 openSubmenu = useCallback(() => {\n cancelClose();\n setOpen(true);\n }, [cancelClose]);\n\n useEffect(() => {\n return () => {\n cancelClose();\n };\n }, [cancelClose]);\n\n useLayoutEffect(() => {\n if (!open) {\n return;\n }\n\n const trigger = triggerRef.current;\n if (!trigger) {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n setPlacementPoint({\n x: rect.right + CONTEXT_MENU_SUBMENU_GAP_PX,\n y: rect.top\n });\n }, [open, estimatedSubmenuHeight]);\n\n return (\n <div\n ref={triggerRef}\n className=\"relative\"\n onPointerEnter={openSubmenu}\n onPointerLeave={scheduleClose}\n >\n <button\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-sm text-[var(--text-primary)] transition-colors hover:bg-transparency-block disabled:cursor-default disabled:opacity-50\",\n open && \"bg-transparency-block\"\n )}\n disabled={busy}\n role=\"menuitem\"\n type=\"button\"\n onClick={() => {\n setOpen((current) => {\n const next = !current;\n if (next) {\n cancelClose();\n }\n return next;\n });\n }}\n >\n <span className=\"grid size-4 flex-none place-items-center text-[var(--text-secondary)]\">\n <LaunchIcon className=\"size-4\" />\n </span>\n <span className=\"min-w-0 flex-1 truncate\">\n {copy.t(\"openWithLabel\")}\n </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 data-workspace-file-manager-submenu=\"\"\n open={open}\n className=\"w-[220px] max-h-[min(480px,calc(100vh-24px))] overflow-y-auto p-1\"\n dismissOnEscape={false}\n dismissOnPointerDownOutside={false}\n dismissOnScroll={false}\n placement={{\n type: \"point\",\n point: placementPoint,\n alignX: \"start\",\n alignY: \"auto\",\n estimatedSize: {\n width: 220,\n height: estimatedSubmenuHeight\n }\n }}\n role=\"menu\"\n onPointerEnter={openSubmenu}\n onPointerLeave={scheduleClose}\n >\n {showOpenInAppBrowser ? (\n <ContextMenuActionButton\n disabled={busy}\n icon={openInAppBrowserIcon ?? <WebIcon className=\"size-4\" />}\n label={copy.t(\"openInAppBrowserLabel\")}\n onClick={() => {\n onClose();\n void onOpenInAppBrowser();\n }}\n />\n ) : null}\n {showExternalSection ? <ContextMenuDivider /> : null}\n {isLoading ? (\n <div className=\"px-2 py-1.5 text-xs text-[var(--text-tertiary)]\">\n {copy.t(\"openWithLoadingLabel\")}\n </div>\n ) : null}\n {applications.map((application) => {\n const resolvedIcon = resolveOpenWithApplicationIcon?.(application);\n\n return (\n <ContextMenuActionButton\n key={application.applicationPath}\n disabled={busy}\n icon={\n resolvedIcon ??\n (application.iconDataUrl ? (\n <img\n alt=\"\"\n className=\"size-4 rounded-[4px] object-contain\"\n src={application.iconDataUrl}\n />\n ) : (\n <EyeIcon className=\"size-4\" />\n ))\n }\n label={application.name}\n onClick={() => {\n onClose();\n void onOpenWithApplication(application.applicationPath);\n }}\n />\n );\n })}\n {showOpenInDefaultBrowser ? (\n <ContextMenuActionButton\n disabled={busy}\n icon={<WebIcon className=\"size-4\" />}\n label={copy.t(\"openInDefaultBrowserLabel\")}\n onClick={() => {\n onClose();\n void onOpenInDefaultBrowser();\n }}\n />\n ) : null}\n {showOpenWithOther ? (\n <ContextMenuActionButton\n disabled={busy}\n icon={<LaunchIcon className=\"size-4\" />}\n label={copy.t(\"openWithOtherLabel\")}\n onClick={() => {\n onClose();\n void onOpenWithOtherApplication();\n }}\n />\n ) : null}\n </ViewportMenuSurface>\n </div>\n );\n}\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-sm 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 kind: \"import\" | \"view\";\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 =\n dialog.title ??\n (dialog.kind === \"import\"\n ? copy.t(\"unsupportedImportTitle\")\n : copy.t(\"unsupportedViewTitle\"));\n const body =\n dialog.message ??\n (dialog.kind === \"import\"\n ? copy.t(\"unsupportedImportBody\")\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\nexport function WorkspaceFileManagerImportConflictDialog({\n busy,\n copy,\n dialog,\n onClose,\n onConfirm\n}: {\n busy: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n dialog: WorkspaceFileManagerHostImportConflict | null;\n onClose: () => void;\n onConfirm: () => void;\n}): ReactElement | null {\n if (!dialog) {\n return null;\n }\n\n const hasBlockedConflict = dialog.conflicts.some(\n (conflict) => conflict.conflictKind === \"type_mismatch\"\n );\n\n return (\n <ConfirmationDialog\n cancelLabel={\n hasBlockedConflict ? copy.t(\"closeLabel\") : copy.t(\"cancelLabel\")\n }\n className=\"max-w-lg\"\n confirmBusy={busy}\n confirmLabel={\n hasBlockedConflict\n ? copy.t(\"closeLabel\")\n : copy.t(\"importConflictReplaceLabel\")\n }\n description={\n hasBlockedConflict\n ? copy.t(\"importTypeConflictDescription\", {\n count: dialog.conflicts.length\n })\n : copy.t(\"importConflictDescription\", {\n count: dialog.conflicts.length\n })\n }\n hideConfirmButton={hasBlockedConflict}\n open\n title={\n hasBlockedConflict\n ? copy.t(\"importTypeConflictTitle\")\n : copy.t(\"importConflictTitle\")\n }\n tone={hasBlockedConflict ? \"default\" : \"destructive\"}\n onConfirm={hasBlockedConflict ? onClose : onConfirm}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n >\n <ImportConflictSummary copy={copy} dialog={dialog} />\n <div className=\"max-h-60 overflow-auto rounded-lg border border-[var(--border-1)] bg-transparency-block\">\n <div className=\"divide-y divide-[var(--border-1)]\">\n {dialog.conflicts.map((conflict) => (\n <div\n key={`${conflict.destinationPath}:${conflict.sourcePath}`}\n className=\"flex flex-col gap-1 px-4 py-3 text-sm\"\n >\n <span className=\"font-medium text-[var(--text-primary)]\">\n {conflict.name}\n </span>\n <span className=\"text-xs text-[var(--text-secondary)]\">\n {copy.t(\"importConflictReviewLabel\")}:{\" \"}\n {conflict.destinationPath}\n </span>\n </div>\n ))}\n </div>\n </div>\n </ConfirmationDialog>\n );\n}\n\nfunction ImportConflictSummary({\n copy,\n dialog\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n dialog: WorkspaceFileManagerHostImportConflict;\n}): ReactElement | null {\n const summaryItems: string[] = [];\n const hasReasonBreakdown =\n dialog.summary?.reasonBreakdown?.some((reason) => reason.count > 0) ??\n false;\n if (\n typeof dialog.summary?.selectedCount === \"number\" &&\n dialog.summary.selectedCount > 0\n ) {\n summaryItems.push(\n copy.t(\"importConflictSummarySelected\", {\n count: dialog.summary.selectedCount\n })\n );\n }\n if (\n !hasReasonBreakdown &&\n typeof dialog.summary?.filteredCount === \"number\" &&\n dialog.summary.filteredCount > 0\n ) {\n summaryItems.push(\n copy.t(\"importConflictSummaryFiltered\", {\n count: dialog.summary.filteredCount\n })\n );\n }\n if (\n !hasReasonBreakdown &&\n typeof dialog.summary?.ignoredCount === \"number\" &&\n dialog.summary.ignoredCount > 0\n ) {\n summaryItems.push(\n copy.t(\"importConflictSummaryIgnored\", {\n count: dialog.summary.ignoredCount\n })\n );\n }\n for (const reason of dialog.summary?.reasonBreakdown ?? []) {\n if (reason.count <= 0) {\n continue;\n }\n const copyKey = importSummaryReasonCopyKey(reason.reason);\n if (!copyKey) {\n continue;\n }\n summaryItems.push(copy.t(copyKey, { count: reason.count }));\n }\n\n if (summaryItems.length === 0) {\n return null;\n }\n\n return (\n <div className=\"flex flex-wrap gap-2 text-xs text-[var(--text-secondary)]\">\n {summaryItems.map((item) => (\n <span\n key={item}\n className=\"rounded-md border border-[var(--border-1)] px-2 py-1\"\n >\n {item}\n </span>\n ))}\n </div>\n );\n}\n\nfunction importSummaryReasonCopyKey(\n reason: WorkspaceFileImportSummaryReason\n): WorkspaceFileManagerI18nKey | null {\n switch (reason) {\n case \"ignored\":\n return \"importConflictSummaryReasonIgnored\";\n case \"symlink\":\n return \"importConflictSummaryReasonSymlink\";\n case \"system_metadata\":\n return \"importConflictSummaryReasonSystemMetadata\";\n }\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;\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 showOpenWithOther: boolean;\n}): number {\n let itemCount = 0;\n\n if (input.showOpenInAppBrowser) {\n itemCount += 1;\n }\n if (input.showExternalSection) {\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","import {\n FileCodeIcon,\n FileTextIcon,\n FolderFilledIcon,\n ImageFileIcon,\n LoadingIcon,\n ScrollArea,\n VideoFileIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { NextopDateLocale } from \"@tutti-os/ui-system/date-format\";\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 MouseEvent as ReactMouseEvent,\n PointerEvent as ReactPointerEvent,\n ReactElement,\n RefObject\n} from \"react\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState\n} from \"react\";\nimport {\n formatWorkspaceFileBytes,\n formatWorkspaceFileModifiedTime,\n resolveWorkspaceFileVisualKind,\n splitWorkspaceFileName\n} from \"../services/workspaceFileManagerModel.ts\";\nimport type {\n WorkspaceFileActivationTarget,\n WorkspaceFileEntry,\n WorkspaceFileManagerInlineRenameValidation,\n WorkspaceFilePreviewState\n} from \"../services/workspaceFileManagerTypes.ts\";\n\nconst workspaceFileManagerTableGridClassName =\n \"grid-cols-[minmax(0,_1fr)_148px_96px]\";\nconst workspaceFileManagerTableGridStyle: CSSProperties = {\n gridTemplateColumns: \"minmax(0, 1fr) 148px 96px\"\n};\nconst workspaceFileManagerCompactTableGridClassName =\n \"grid-cols-[minmax(0,_1fr)_96px_72px]\";\nconst workspaceFileManagerCompactTableGridStyle: CSSProperties = {\n gridTemplateColumns: \"minmax(0, 1fr) 96px 72px\"\n};\nconst workspaceFileManagerPreviewDetailGridStyle: CSSProperties = {\n gridTemplateColumns: \"minmax(82px, 0.8fr) minmax(0, 1.2fr)\"\n};\nconst workspaceFileManagerStackedBreakpoint = 600;\nconst workspaceFileManagerPreviewDefaultWidth = 280;\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 canMove,\n contextMenuEntryPath,\n dateLocale,\n entryDragMode,\n entrySelectionEnabled = true,\n copy,\n inlineRenameEntryPath,\n inlineRenameValidation,\n isRenaming,\n pendingDirectoryPath,\n previewState,\n selectedEntry,\n selectedPath,\n state,\n showDropOverlay,\n onBlankContextMenu,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename,\n onEntryContextMenu,\n onEntryDragStart,\n onMoveEntry,\n onOpenEntry,\n onSelect\n}: {\n canMove: boolean;\n contextMenuEntryPath: string | null;\n dateLocale?: NextopDateLocale;\n entryDragMode?: WorkspaceFileManagerEntryDragMode;\n entrySelectionEnabled?: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n inlineRenameEntryPath: string | null;\n inlineRenameValidation: WorkspaceFileManagerInlineRenameValidation | null;\n isRenaming: boolean;\n pendingDirectoryPath: string | null;\n previewState: WorkspaceFilePreviewState;\n selectedEntry: WorkspaceFileEntry | null;\n selectedPath: string | null;\n state: {\n entries: readonly WorkspaceFileEntry[];\n error: string | null;\n isLoading: boolean;\n };\n showDropOverlay: boolean;\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}): ReactElement {\n const { isStacked, rootRef } = useWorkspaceFileManagerStackedLayout(\n workspaceFileManagerStackedBreakpoint\n );\n const previewResizeRef = useRef<{\n pointerId: number;\n startX: number;\n startWidth: number;\n maxWidth: number;\n } | null>(null);\n const [previewPaneWidth, setPreviewPaneWidth] = 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 entriesRef = useRef<readonly WorkspaceFileEntry[]>(state.entries);\n const nativeEntryDragEnabled =\n onEntryDragStart !== undefined &&\n (entryDragMode === \"external\" || (entryDragMode === undefined && !canMove));\n const internalMoveEnabled = canMove && !nativeEntryDragEnabled;\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 = state.entries;\n }, [state.entries]);\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 previewPaneClassName = isStacked\n ? \"min-w-0 border-t border-[var(--border-1)]\"\n : \"min-w-[220px] border-l border-[var(--border-1)]\";\n const tableGridClassName = isStacked\n ? workspaceFileManagerCompactTableGridClassName\n : workspaceFileManagerTableGridClassName;\n const tableGridStyle = isStacked\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\n useLayoutEffect(() => {\n const element = rootRef.current;\n if (!element || isStacked) {\n return;\n }\n\n const publishLayout = () => {\n const containerWidth = Math.round(element.getBoundingClientRect().width);\n const maxWidth = Math.max(\n workspaceFileManagerPreviewMinWidth,\n containerWidth - workspaceFileManagerTableMinWidth\n );\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 }, [clampPreviewPaneWidth, isStacked, rootRef]);\n\n const handlePreviewResizePointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>): void => {\n if (event.button !== 0) {\n return;\n }\n\n const containerWidth =\n rootRef.current?.getBoundingClientRect().width ?? 0;\n const maxWidth = Math.max(\n workspaceFileManagerPreviewMinWidth,\n containerWidth - workspaceFileManagerTableMinWidth\n );\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n previewResizeRef.current = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startWidth: previewPaneWidth,\n maxWidth\n };\n },\n [previewPaneWidth, rootRef]\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 setPreviewPaneWidth(\n clampPreviewPaneWidth(resize.startWidth - deltaX, resize.maxWidth)\n );\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 event.currentTarget.releasePointerCapture(event.pointerId);\n },\n []\n );\n\n const tablePanel = (\n <div\n className={cn(\n \"flex min-h-0 min-w-0 flex-col overflow-hidden\",\n isStacked ? \"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 message={copy.t(\"emptyDirectory\")} />\n ) : (\n <ScrollArea className=\"min-h-0 flex-1 [&_[data-orientation=vertical][data-slot=scroll-area-scrollbar]]:opacity-100\">\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 className={tableCellPaddingClassName}>\n {copy.t(\"nameLabel\")}\n </span>\n <span\n className={cn(\"whitespace-nowrap\", tableCellPaddingClassName)}\n >\n {copy.t(\"modifiedLabel\")}\n </span>\n <span\n className={cn(\"whitespace-nowrap\", tableCellPaddingClassName)}\n >\n {copy.t(\"sizeLabel\")}\n </span>\n </div>\n {state.entries.map((entry) => (\n <EntryRow\n key={entry.path}\n contextMenuActive={contextMenuEntryPath === entry.path}\n copy={copy}\n dateLocale={dateLocale}\n entry={entry}\n canMove={internalMoveEnabled}\n draggable={nativeEntryDragEnabled}\n gridClassName={tableGridClassName}\n gridStyle={tableGridStyle}\n inlineRenameValidation={\n inlineRenameEntryPath === entry.path\n ? inlineRenameValidation\n : null\n }\n isEnteringDirectory={pendingDirectoryPath === entry.path}\n isInlineRenaming={inlineRenameEntryPath === entry.path}\n isRenaming={isRenaming}\n moveDragActive={moveDragPreview !== null}\n moveDragSource={moveDragPreview?.entry.path === entry.path}\n moveDragTarget={\n moveDragPreview?.targetDirectoryPath === entry.path\n }\n tableCellPaddingClassName={tableCellPaddingClassName}\n selected={selectedPath === entry.path}\n onCancelInlineRename={onCancelInlineRename}\n onClearInlineRenameValidation={onClearInlineRenameValidation}\n onConfirmInlineRename={onConfirmInlineRename}\n onContextMenu={onEntryContextMenu}\n onDragStart={onEntryDragStart}\n onClick={handleEntryClick}\n onPointerDown={handleEntryPointerDown}\n />\n ))}\n </div>\n </ScrollArea>\n )}\n </div>\n );\n\n const previewPanel = (\n <aside\n className={cn(\n \"relative flex h-full min-h-0 flex-col gap-[14px] overflow-auto p-4\",\n isStacked ? \"max-h-[44%] flex-none\" : \"flex-none\",\n previewPaneClassName\n )}\n style={\n isStacked\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 );\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 isStacked ? \"flex flex-col gap-3\" : \"flex\"\n )}\n >\n {tablePanel}\n {isStacked ? null : (\n <div\n aria-orientation=\"vertical\"\n className=\"nodrag absolute top-0 bottom-0 z-[1] w-2 cursor-col-resize touch-none\"\n role=\"separator\"\n style={\n {\n right: previewPaneWidth - 4\n } satisfies CSSProperties\n }\n onPointerCancel={handlePreviewResizePointerEnd}\n onPointerDown={handlePreviewResizePointerDown}\n onPointerMove={handlePreviewResizePointerMove}\n onPointerUp={handlePreviewResizePointerEnd}\n />\n )}\n {previewPanel}\n </div>\n <div\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 grid place-items-center rounded-[var(--workbench-window-radius,8px)] border border-dashed border-[var(--border-focus)] bg-[var(--accent-bg)] opacity-0 transition-opacity duration-150 ease-out\",\n showDropOverlay && \"opacity-100\"\n )}\n >\n <div className=\"rounded-lg border border-[var(--border-1)] bg-[var(--background-fronted)] px-5 py-3 text-sm font-normal text-[var(--text-primary)] shadow-panel\">\n {copy.t(\"dropToImportLabel\")}\n </div>\n </div>\n {moveDragPreview ? <MoveDragPreview preview={moveDragPreview} /> : 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 EntryRow({\n canMove,\n contextMenuActive,\n copy,\n dateLocale,\n draggable,\n entry,\n gridClassName,\n gridStyle,\n inlineRenameValidation,\n isEnteringDirectory,\n isInlineRenaming,\n isRenaming,\n moveDragActive,\n moveDragSource,\n moveDragTarget,\n selected,\n tableCellPaddingClassName,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename,\n onContextMenu,\n onDragStart,\n onClick,\n onPointerDown\n}: {\n canMove: boolean;\n contextMenuActive: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n dateLocale?: NextopDateLocale;\n draggable: boolean;\n entry: WorkspaceFileEntry;\n gridClassName: string;\n gridStyle: CSSProperties;\n inlineRenameValidation: WorkspaceFileManagerInlineRenameValidation | null;\n isEnteringDirectory: boolean;\n isInlineRenaming: boolean;\n isRenaming: boolean;\n moveDragActive: boolean;\n moveDragSource: boolean;\n moveDragTarget: 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 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-block\",\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={tableCellPaddingClassName}>\n <EntryNameCell\n copy={copy}\n entry={entry}\n inlineRenameValidation={inlineRenameValidation}\n isEnteringDirectory={isEnteringDirectory}\n isInlineRenaming={isInlineRenaming}\n isRenaming={isRenaming}\n onCancelInlineRename={onCancelInlineRename}\n onClearInlineRenameValidation={onClearInlineRenameValidation}\n onConfirmInlineRename={onConfirmInlineRename}\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(entry.mtimeMs, dateLocale)}\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 preview\n}: {\n preview: WorkspaceFileManagerMoveDragPreview;\n}): ReactElement {\n const visualKind = resolveWorkspaceFileVisualKind(preview.entry);\n\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 <span\n className={cn(\n \"grid size-[18px] flex-none place-items-center\",\n entryIconColorClassName(visualKind)\n )}\n >\n <EntryIcon visualKind={visualKind} />\n </span>\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 EntryNameCell({\n copy,\n entry,\n inlineRenameValidation = null,\n isEnteringDirectory = false,\n isInlineRenaming = false,\n isRenaming = false,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n entry: WorkspaceFileEntry;\n inlineRenameValidation?: WorkspaceFileManagerInlineRenameValidation | null;\n isEnteringDirectory?: boolean;\n isInlineRenaming?: boolean;\n isRenaming?: boolean;\n onCancelInlineRename: () => void;\n onClearInlineRenameValidation: () => void;\n onConfirmInlineRename: (newName: string) => Promise<boolean>;\n}): ReactElement {\n const visualKind = resolveWorkspaceFileVisualKind(entry);\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 className=\"flex min-w-0 items-center gap-2\">\n <span\n className={cn(\n \"grid size-[18px] flex-none place-items-center\",\n entryIconColorClassName(visualKind)\n )}\n >\n <EntryIcon visualKind={visualKind} />\n </span>\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 className=\"flex min-w-0 items-center gap-2\">\n <span\n className={cn(\n \"grid size-[18px] flex-none place-items-center\",\n isEnteringDirectory\n ? \"text-[var(--text-tertiary)]\"\n : entryIconColorClassName(visualKind)\n )}\n >\n {isEnteringDirectory ? (\n <LoadingIcon className=\"size-4 animate-spin\" />\n ) : (\n <EntryIcon visualKind={visualKind} />\n )}\n </span>\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 </span>\n );\n}\n\nfunction entryIconColorClassName(\n visualKind: ReturnType<typeof resolveWorkspaceFileVisualKind>\n): string {\n return visualKind === \"directory\"\n ? \"text-[var(--rich-text-mention-file)]\"\n : \"text-[var(--text-tertiary)]\";\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 <FolderFilledIcon className={className} />;\n case \"image\":\n return <ImageFileIcon 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?: NextopDateLocale;\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 frameClassName=\"flex h-60 min-h-60 max-h-60 items-center justify-center overflow-hidden rounded-lg border border-[var(--border-1)] bg-[var(--transparency-block)]\"\n imageAlt={(entry) => entry.name}\n imageFrameClassName=\"p-4\"\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 messageClassName=\"max-w-[24ch] [overflow-wrap:anywhere]\"\n renderIcon={(entry) => (\n <EntryIcon\n className=\"mx-auto size-7\"\n visualKind={resolveWorkspaceFilePreviewIconKind(entry)}\n />\n )}\n state={previewState}\n textFrameClassName=\"items-stretch justify-stretch\"\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.fileKind === \"image\" ? \"image\" : \"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\nexport function hasFileDragPayload(dataTransfer: DataTransfer): boolean {\n return Array.from(dataTransfer.types).includes(\"Files\");\n}\n","import {\n ArrowLeftIcon,\n ArrowRightIcon,\n Button,\n LoadingIcon,\n RefreshIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport { useState, type ReactElement } from \"react\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\n\nexport function WorkspaceFileManagerToolbar({\n breadcrumbs,\n canGoBack,\n canGoForward,\n copy,\n currentDirectoryPath,\n isBusy,\n isLoading,\n isMutating,\n onGoBack,\n onGoForward,\n onLoadDirectory,\n onRefresh\n}: {\n breadcrumbs: Array<{ label: string; path: string }>;\n canGoBack: boolean;\n canGoForward: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n currentDirectoryPath: string;\n isBusy: boolean;\n isLoading: boolean;\n isMutating: boolean;\n onGoBack: () => void;\n onGoForward: () => void;\n onLoadDirectory: (path: string) => void;\n onRefresh: () => 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 <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 </div>\n </header>\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","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 { 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 type { WorkspaceFileManagerI18nRuntime } from \"../../i18n/workspaceFileManagerI18n.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileManagerState\n} from \"../workspaceFileManagerTypes.ts\";\n\nexport interface WorkspaceFileManagerRootViewState {\n canImportFromDrop: boolean;\n currentDirectoryPath: string;\n isBusy: boolean;\n}\n\nexport interface WorkspaceFileManagerToolbarViewState {\n breadcrumbs: Array<{ label: string; path: string }>;\n canGoBack: boolean;\n canGoForward: boolean;\n currentDirectoryPath: string;\n isBusy: boolean;\n isLoading: boolean;\n isMutating: boolean;\n isImporting: boolean;\n showImportAction: boolean;\n}\n\nexport interface WorkspaceFileManagerPanelsViewState {\n canMove: boolean;\n contextMenuEntryPath: string | null;\n entries: readonly WorkspaceFileEntry[];\n error: string | null;\n inlineRenameEntryPath: string | null;\n inlineRenameValidation: WorkspaceFileManagerState[\"inlineRenameValidation\"];\n isLoading: boolean;\n isRenaming: boolean;\n pendingDirectoryPath: string | null;\n previewState: WorkspaceFileManagerState[\"previewState\"];\n selectedEntry: WorkspaceFileEntry | null;\n selectedPath: string | null;\n showDropOverlay: boolean;\n}\n\nexport interface WorkspaceFileManagerDialogsViewState {\n createDialog: WorkspaceFileManagerState[\"createDialog\"];\n deleteDialogEntry: WorkspaceFileEntry | null;\n isBusy: boolean;\n isDeleting: boolean;\n isImporting: 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: \"import\" | \"view\";\n message?: string | null;\n title?: string | null;\n } | null;\n importConflictDialog: WorkspaceFileManagerState[\"importConflictDialog\"];\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 showCopyAction: boolean;\n showExportAction: boolean;\n showImportAction: boolean;\n showMoveAction: boolean;\n showOpenInAppBrowserAction: boolean;\n showOpenInDefaultBrowserAction: boolean;\n showOpenWithAction: boolean;\n showOpenWithOtherAction: boolean;\n showRevealInFolderAction: boolean;\n showRenameAction: boolean;\n}\n\nexport function resolveWorkspaceFileManagerRootViewState(input: {\n state: WorkspaceFileManagerState;\n}): WorkspaceFileManagerRootViewState {\n const { state } = input;\n return {\n canImportFromDrop: state.capabilities.canImportFromDrop,\n currentDirectoryPath: state.currentDirectoryPath,\n isBusy: state.busyAction !== null\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 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 isImporting: state.busyAction === \"import\",\n showImportAction: state.capabilities.canImportFromPicker\n };\n}\n\nexport function resolveWorkspaceFileManagerPanelsViewState(input: {\n state: WorkspaceFileManagerState;\n}): WorkspaceFileManagerPanelsViewState {\n const { state } = input;\n return {\n canMove: state.capabilities.canMove,\n contextMenuEntryPath: state.contextMenuEntryPath,\n entries: state.entries,\n error: state.error,\n inlineRenameEntryPath: state.inlineRenameEntryPath,\n inlineRenameValidation: state.inlineRenameValidation,\n isLoading: state.isLoading,\n isRenaming: state.busyAction === \"rename\",\n pendingDirectoryPath: state.pendingDirectoryPath,\n previewState: state.previewState,\n selectedEntry: findSelectedEntry(state),\n selectedPath: state.selectedPath,\n showDropOverlay:\n state.capabilities.canImportFromDrop &&\n state.dragDepth > 0 &&\n state.busyAction === null\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 isImporting: state.busyAction === \"import\",\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 importConflictDialog: state.importConflictDialog\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 const isContextMenuFile = contextMenuEntry?.kind === \"file\";\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 showCopyAction: state.capabilities.canCopy,\n showExportAction: state.capabilities.canExport,\n showImportAction: state.capabilities.canImportFromPicker,\n showMoveAction: state.capabilities.canMove,\n showOpenInAppBrowserAction: state.capabilities.canOpenInAppBrowser,\n showOpenInDefaultBrowserAction: state.capabilities.canOpenInDefaultBrowser,\n showOpenWithAction: state.capabilities.canOpenWith && isContextMenuFile,\n showOpenWithOtherAction:\n state.capabilities.canPickOtherOpenWithApplication && isContextMenuFile,\n showRevealInFolderAction: state.capabilities.canRevealInFolder,\n showRenameAction: state.capabilities.canRename\n };\n}\n\nfunction findSelectedEntry(\n state: WorkspaceFileManagerState\n): WorkspaceFileEntry | null {\n return (\n state.entries.find((entry) => entry.path === state.selectedPath) ?? null\n );\n}\n\nfunction findEntry(\n state: WorkspaceFileManagerState,\n entryPath: string\n): WorkspaceFileEntry | null {\n return state.entries.find((entry) => entry.path === entryPath) ?? null;\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","cn","cn","useCallback","useEffect","useLayoutEffect","useRef","useState","Fragment","jsx","jsxs","useRef","useState","useCallback","useEffect","useLayoutEffect","cn","ArrowRightIcon","Button","LoadingIcon","cn","useState","jsx","jsxs","Fragment","jsx","jsxs","useRef","useEffect","cn","useState"]}
|
|
1
|
+
{"version":3,"sources":["../src/ui/WorkspaceFileManager.tsx","../src/ui/WorkspaceFileManagerMenus.tsx","../src/ui/contextMenuPlacement.ts","../src/ui/WorkspaceFileManagerPanels.tsx","../src/ui/WorkspaceFileManagerIconGrid.tsx","../src/ui/WorkspaceFileEntryIcon.tsx","../src/ui/workspaceFileEntryIconPolicy.ts","../src/ui/workspaceFileManagerIconGridLayout.ts","../src/ui/WorkspaceFileManagerToolbar.tsx","../src/ui/useWorkspaceFileManagerLayoutMode.ts","../src/ui/workspaceFileManagerLayoutMode.ts","../src/ui/useWorkspaceFileEntryIconUrls.ts","../src/ui/workspaceFileManagerAnalytics.ts","../src/ui/useWorkspaceFileManagerService.ts","../src/services/internal/workspaceFileManagerViewModel.ts"],"sourcesContent":["import type {\n CSSProperties,\n DragEvent as ReactDragEvent,\n MouseEvent as ReactMouseEvent,\n ReactElement,\n RefObject\n} from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"@tutti-os/ui-system\";\nimport type { NextopDateLocale } from \"@tutti-os/ui-system/date-format\";\nimport type { WorkspaceFileManagerSession } from \"../services/workspaceFileManagerService.interface.ts\";\nimport {\n resolveRevealInFolderLabel,\n type WorkspaceFileManagerI18nRuntime\n} from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileOpenWithApplication\n} from \"../services/workspaceFileManagerTypes.ts\";\nimport { isWorkspaceFileBrowserOpenable } from \"../services/index.ts\";\nimport {\n WorkspaceFileManagerContextMenu,\n WorkspaceFileManagerCreateDialog,\n WorkspaceFileManagerDeleteDialog,\n WorkspaceFileManagerUnsupportedDialog,\n WorkspaceFileManagerImportConflictDialog\n} from \"./WorkspaceFileManagerMenus.tsx\";\nimport {\n hasFileDragPayload,\n type WorkspaceFileManagerEntryDragMode,\n WorkspaceFileManagerPanels\n} from \"./WorkspaceFileManagerPanels.tsx\";\nimport { WorkspaceFileManagerToolbar } from \"./WorkspaceFileManagerToolbar.tsx\";\nimport type { WorkspaceFileManagerLayoutMode } from \"./workspaceFileManagerLayoutMode.ts\";\nimport { useWorkspaceFileManagerLayoutMode } from \"./useWorkspaceFileManagerLayoutMode.ts\";\nimport { useWorkspaceFileEntryIconUrls } from \"./useWorkspaceFileEntryIconUrls.ts\";\nimport { shouldTrackDirectoryExpanded } from \"./workspaceFileManagerAnalytics.ts\";\nimport {\n useWorkspaceFileManagerContextMenuView,\n useWorkspaceFileManagerDialogsView,\n useWorkspaceFileManagerPanelsView,\n useWorkspaceFileManagerRootView,\n useWorkspaceFileManagerToolbarView\n} from \"./useWorkspaceFileManagerService.ts\";\n\nexport interface WorkspaceFileManagerProps {\n className?: string;\n dateLocale?: NextopDateLocale;\n entryDragMode?: WorkspaceFileManagerEntryDragMode;\n openInAppBrowserIcon?: ReactElement;\n resolveOpenWithApplicationIcon?: (\n application: WorkspaceFileOpenWithApplication\n ) => ReactElement | null;\n onCopyEntry?: () => Promise<void> | void;\n onCopyPath?: (path: string) => Promise<void> | void;\n onDirectoryExpanded?: (path: string) => void;\n onEntryDragStart?: (\n entry: WorkspaceFileEntry,\n dataTransfer: DataTransfer\n ) => void;\n resolveEntryIconUrl?: (\n entry: WorkspaceFileEntry\n ) => Promise<string | null | undefined>;\n hostOs?: NodeJS.Platform;\n i18n: WorkspaceFileManagerI18nRuntime;\n session: WorkspaceFileManagerSession;\n surface?: \"card\" | \"embedded\";\n}\n\nexport function WorkspaceFileManager({\n className,\n dateLocale,\n entryDragMode,\n i18n,\n onCopyEntry,\n onCopyPath,\n onDirectoryExpanded,\n onEntryDragStart,\n openInAppBrowserIcon,\n resolveOpenWithApplicationIcon,\n resolveEntryIconUrl,\n hostOs = \"linux\",\n session,\n surface = \"card\"\n}: WorkspaceFileManagerProps): ReactElement {\n const rootRef = useRef<HTMLElement | null>(null);\n const { layoutMode, setLayoutMode } = useWorkspaceFileManagerLayoutMode();\n const rootView = useWorkspaceFileManagerRootView(session);\n const { state: panelsState, view: panelsView } =\n useWorkspaceFileManagerPanelsView(session);\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 (\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 }, [onCopyEntry, panelsState, panelsView.selectedEntry, session]);\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 (\n !panelsState.capabilities.canRename ||\n panelsState.busyAction !== null ||\n panelsState.isLoading ||\n panelsState.isMutating ||\n panelsState.inlineRenameEntryPath !== null\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 }, [panelsState, panelsView.selectedEntry, session]);\n\n useEffect(() => {\n function resetDropOverlay(): void {\n session.resetDragDepth();\n }\n\n function handleDocumentDragOver(event: DragEvent): void {\n if (isPointInsideElement(rootRef.current, event.clientX, event.clientY)) {\n return;\n }\n session.resetDragDepth();\n }\n\n window.addEventListener(\"blur\", resetDropOverlay);\n window.addEventListener(\"dragend\", resetDropOverlay);\n window.addEventListener(\"drop\", resetDropOverlay);\n document.addEventListener(\"dragover\", handleDocumentDragOver, true);\n\n return () => {\n window.removeEventListener(\"blur\", resetDropOverlay);\n window.removeEventListener(\"dragend\", resetDropOverlay);\n window.removeEventListener(\"drop\", resetDropOverlay);\n document.removeEventListener(\"dragover\", handleDocumentDragOver, true);\n };\n }, [session]);\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 function handleDragEnter(event: ReactDragEvent<HTMLElement>): void {\n if (\n !rootView.canImportFromDrop ||\n rootView.isBusy ||\n !hasFileDragPayload(event.dataTransfer)\n ) {\n return;\n }\n\n event.preventDefault();\n session.incrementDragDepth();\n }\n\n function handleDragOver(event: ReactDragEvent<HTMLElement>): void {\n if (\n !rootView.canImportFromDrop ||\n rootView.isBusy ||\n !hasFileDragPayload(event.dataTransfer)\n ) {\n return;\n }\n\n event.preventDefault();\n event.dataTransfer.dropEffect = \"copy\";\n }\n\n function handleDragLeave(event: ReactDragEvent<HTMLElement>): void {\n if (\n !rootView.canImportFromDrop ||\n !hasFileDragPayload(event.dataTransfer)\n ) {\n return;\n }\n\n event.preventDefault();\n const nextTarget = event.relatedTarget;\n if (nextTarget instanceof Node && rootRef.current?.contains(nextTarget)) {\n return;\n }\n session.resetDragDepth();\n }\n\n function handleDrop(event: ReactDragEvent<HTMLElement>): void {\n if (\n !rootView.canImportFromDrop ||\n rootView.isBusy ||\n !hasFileDragPayload(event.dataTransfer)\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n session.resetDragDepth();\n void session.importDroppedFiles(\n event.dataTransfer,\n rootView.currentDirectoryPath\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 onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n ref={rootRef}\n >\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n <WorkspaceFileManagerToolbarContainer\n i18n={i18n}\n layoutMode={layoutMode}\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 i18n={i18n}\n layoutMode={layoutMode}\n onDirectoryExpanded={onDirectoryExpanded}\n onEntryDragStart={onEntryDragStart}\n onOpenContextMenu={openContextMenu}\n resolveEntryIconUrl={resolveEntryIconUrl}\n session={session}\n />\n </div>\n </div>\n <WorkspaceFileManagerDialogsContainer i18n={i18n} session={session} />\n <WorkspaceFileManagerContextMenuContainer\n hostOs={hostOs}\n i18n={i18n}\n onCopyEntry={onCopyEntry}\n onCopyPath={onCopyPath}\n openInAppBrowserIcon={openInAppBrowserIcon}\n resolveOpenWithApplicationIcon={resolveOpenWithApplicationIcon}\n session={session}\n />\n </section>\n );\n}\n\nfunction WorkspaceFileManagerToolbarContainer({\n i18n,\n layoutMode,\n onDirectoryExpanded,\n onLayoutModeChange,\n session\n}: {\n i18n: WorkspaceFileManagerI18nRuntime;\n layoutMode: WorkspaceFileManagerLayoutMode;\n onDirectoryExpanded?: (path: string) => void;\n onLayoutModeChange: (layoutMode: WorkspaceFileManagerLayoutMode) => void;\n session: WorkspaceFileManagerSession;\n}): ReactElement {\n const { view } = useWorkspaceFileManagerToolbarView(session, i18n);\n\n return (\n <WorkspaceFileManagerToolbar\n breadcrumbs={view.breadcrumbs}\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 layoutMode={layoutMode}\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 />\n );\n}\n\nfunction WorkspaceFileManagerPanelsContainer({\n dateLocale,\n entryDragMode,\n i18n,\n layoutMode,\n onDirectoryExpanded,\n onEntryDragStart,\n onOpenContextMenu,\n resolveEntryIconUrl,\n session\n}: {\n dateLocale?: NextopDateLocale;\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}): ReactElement {\n const { state, view } = useWorkspaceFileManagerPanelsView(session);\n const iconUrlByCacheKey = useWorkspaceFileEntryIconUrls({\n entries: state.entries,\n resolveEntryIconUrl\n });\n\n return (\n <WorkspaceFileManagerPanels\n canMove={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 selectedEntry={view.selectedEntry}\n selectedPath={view.selectedPath}\n showDropOverlay={view.showDropOverlay}\n state={{\n entries: state.entries,\n error: state.error,\n isLoading: state.isLoading\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 />\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 <WorkspaceFileManagerImportConflictDialog\n busy={view.isImporting}\n copy={i18n}\n dialog={view.importConflictDialog}\n onClose={() => {\n session.closeImportConflictDialog();\n }}\n onConfirm={() => {\n void session.confirmImportConflict();\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 WorkspaceFileManagerContextMenuContainer({\n hostOs,\n i18n,\n onCopyEntry,\n onCopyPath,\n openInAppBrowserIcon,\n resolveOpenWithApplicationIcon,\n session\n}: {\n hostOs: NodeJS.Platform;\n i18n: WorkspaceFileManagerI18nRuntime;\n onCopyEntry?: () => Promise<void> | void;\n onCopyPath?: (path: string) => Promise<void> | void;\n openInAppBrowserIcon?: ReactElement;\n resolveOpenWithApplicationIcon?: (\n application: WorkspaceFileOpenWithApplication\n ) => ReactElement | null;\n session: WorkspaceFileManagerSession;\n}): ReactElement | null {\n const contextMenuRef = useRef<HTMLDivElement | null>(null);\n const { view } = useWorkspaceFileManagerContextMenuView(session);\n const [openWithApplications, setOpenWithApplications] = useState<\n WorkspaceFileOpenWithApplication[]\n >([]);\n const [openWithLoading, setOpenWithLoading] = useState(false);\n\n useEffect(() => {\n const entry = view.contextMenu?.entry;\n if (!entry || !view.showOpenWithAction) {\n return;\n }\n\n const cachedApplications = session.getCachedOpenWithApplications(entry);\n if (cachedApplications) {\n setOpenWithApplications(cachedApplications);\n setOpenWithLoading(false);\n return;\n }\n\n let cancelled = false;\n setOpenWithLoading(true);\n void session\n .listOpenWithApplications(entry)\n .then((applications) => {\n if (cancelled) {\n return;\n }\n setOpenWithApplications(applications);\n setOpenWithLoading(false);\n })\n .catch(() => {\n if (cancelled) {\n return;\n }\n setOpenWithApplications([]);\n setOpenWithLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [session, view.contextMenu?.entry?.path, view.showOpenWithAction]);\n\n useCloseContextMenuOnOutsideInteraction({\n contextMenuRef,\n isOpen: view.contextMenu !== null,\n session\n });\n\n return (\n <WorkspaceFileManagerContextMenu\n busy={view.isBusy || view.isLoading || view.isMutating}\n copy={i18n}\n contextMenu={view.contextMenu}\n contextMenuRef={contextMenuRef}\n showCopyAction={view.showCopyAction}\n showImportAction={view.showImportAction}\n showExportAction={view.showExportAction}\n showOpenInAppBrowserAction={\n view.showOpenInAppBrowserAction &&\n !!view.contextMenu?.entry &&\n isWorkspaceFileBrowserOpenable(view.contextMenu.entry)\n }\n showOpenInDefaultBrowserAction={\n view.showOpenInDefaultBrowserAction &&\n !!view.contextMenu?.entry &&\n isWorkspaceFileBrowserOpenable(view.contextMenu.entry)\n }\n showOpenWithAction={view.showOpenWithAction}\n showOpenWithOtherAction={view.showOpenWithOtherAction}\n showRevealInFolderAction={view.showRevealInFolderAction}\n showRenameAction={view.showRenameAction}\n revealInFolderLabel={resolveRevealInFolderLabel(i18n, hostOs)}\n openInAppBrowserIcon={openInAppBrowserIcon}\n openWithApplications={openWithApplications}\n openWithLoading={openWithLoading}\n resolveOpenWithApplicationIcon={resolveOpenWithApplicationIcon}\n onClose={() => {\n session.closeContextMenu();\n }}\n onCreateDirectory={() => {\n session.openCreateDirectoryDialog();\n }}\n onCreateFile={() => {\n session.openCreateFileDialog();\n }}\n onCopy={async () => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n session.closeContextMenu();\n await session.copyToClipboard(entry);\n if (onCopyEntry) {\n await onCopyEntry();\n }\n }}\n onCopyPath={async () => {\n const path = view.contextMenu?.entry?.path;\n if (!path) {\n return;\n }\n session.closeContextMenu();\n if (onCopyPath) {\n await onCopyPath(path);\n return;\n }\n await navigator.clipboard.writeText(path);\n }}\n onDelete={() => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n session.openDeleteDialog(entry);\n }}\n onRename={() => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n session.startInlineRename(entry);\n }}\n onExport={async () => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n await session.exportEntry(entry);\n }}\n onOpen={async () => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n await session.openEntry(entry);\n }}\n onOpenInAppBrowser={async () => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n await session.openFileInAppBrowser(entry);\n }}\n onOpenInDefaultBrowser={async () => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n await session.openFileInDefaultBrowser(entry);\n }}\n onOpenWithApplication={async (applicationPath) => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n await session.openFileWithApplication(entry, applicationPath);\n }}\n onOpenWithOtherApplication={async () => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n await session.openFileWithOtherApplication(entry);\n }}\n onRevealInFolder={async () => {\n const entry = view.contextMenu?.entry;\n if (!entry) {\n return;\n }\n await session.revealEntry(entry);\n }}\n onImport={async () => {\n session.closeContextMenu();\n await session.importFiles(\n view.contextMenu?.entry?.kind === \"directory\"\n ? view.contextMenu.entry.path\n : view.currentDirectoryPath\n );\n }}\n />\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\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\nfunction isPointInsideElement(\n element: HTMLElement | null,\n clientX: number,\n clientY: number\n): boolean {\n if (!element) {\n return false;\n }\n\n const bounds = element.getBoundingClientRect();\n return (\n clientX >= bounds.left &&\n clientX <= bounds.right &&\n clientY >= bounds.top &&\n clientY <= bounds.bottom\n );\n}\n","import {\n ArrowRightIcon,\n Button,\n ConfirmationDialog,\n CopyIcon,\n DeleteIcon,\n DownloadIcon,\n EditIcon,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n EyeIcon,\n FileLinedIcon,\n Input,\n LaunchIcon,\n LocateFolderIcon,\n MenuSurface,\n NewWorkspaceLinedIcon,\n UploadIcon as ImportIcon,\n ViewportMenuSurface,\n WebIcon,\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 CONTEXT_MENU_SUBMENU_GAP_PX,\n clampContextMenuPosition,\n estimateOpenWithSubmenuHeight\n} from \"./contextMenuPlacement.ts\";\nimport type {\n WorkspaceFileManagerI18nKey,\n WorkspaceFileManagerI18nRuntime\n} from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileImportSummaryReason,\n WorkspaceFileOpenWithApplication\n} from \"../services/workspaceFileManagerTypes.ts\";\nimport type {\n WorkspaceFileManagerHostFallbackAction,\n WorkspaceFileManagerHostImportConflict\n} from \"./workspaceFileManagerHostTypes.ts\";\n\nexport function WorkspaceFileManagerContextMenu({\n busy,\n copy,\n contextMenu,\n contextMenuRef,\n openInAppBrowserIcon,\n showCopyAction,\n showImportAction,\n showExportAction,\n showOpenInAppBrowserAction,\n showOpenInDefaultBrowserAction,\n showOpenWithAction,\n showOpenWithOtherAction,\n showRevealInFolderAction,\n showRenameAction,\n revealInFolderLabel,\n openWithApplications,\n openWithLoading,\n resolveOpenWithApplicationIcon,\n onClose,\n onCreateDirectory,\n onCreateFile,\n onCopy,\n onCopyPath,\n onDelete,\n onExport,\n onOpen,\n onOpenInAppBrowser,\n onOpenInDefaultBrowser,\n onOpenWithApplication,\n onOpenWithOtherApplication,\n onImport,\n onRevealInFolder,\n onRename\n}: {\n busy: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n contextMenu: {\n entry: WorkspaceFileEntry | null;\n x: number;\n y: number;\n } | null;\n contextMenuRef: RefObject<HTMLDivElement | null>;\n openInAppBrowserIcon?: ReactElement;\n resolveOpenWithApplicationIcon?: (\n application: WorkspaceFileOpenWithApplication\n ) => ReactElement | null;\n showCopyAction: boolean;\n showImportAction: boolean;\n showExportAction: boolean;\n showOpenInAppBrowserAction: boolean;\n showOpenInDefaultBrowserAction: boolean;\n showOpenWithAction: boolean;\n showOpenWithOtherAction: boolean;\n showRevealInFolderAction: boolean;\n showRenameAction: boolean;\n revealInFolderLabel: string;\n openWithApplications: readonly WorkspaceFileOpenWithApplication[];\n openWithLoading: boolean;\n onClose: () => void;\n onCreateDirectory: () => void;\n onCreateFile: () => void;\n onCopy: () => Promise<void>;\n onCopyPath: () => Promise<void>;\n onDelete: () => void;\n onExport: () => Promise<void>;\n onOpen: () => Promise<void>;\n onOpenInAppBrowser: () => Promise<void>;\n onOpenInDefaultBrowser: () => Promise<void>;\n onOpenWithApplication: (applicationPath: string) => Promise<void>;\n onOpenWithOtherApplication: () => Promise<void>;\n onImport: () => Promise<void>;\n onRevealInFolder: () => Promise<void>;\n onRename: () => void;\n}): 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\n setPosition({ x: contextMenu.x, y: contextMenu.y });\n }, [contextMenu?.x, contextMenu?.y]);\n\n useLayoutEffect(() => {\n if (!contextMenu) {\n return;\n }\n\n const menu = contextMenuRef.current;\n const boundary = menu?.closest(\"[data-workspace-file-manager]\");\n if (!menu || !boundary) {\n return;\n }\n\n const boundaryRect = boundary.getBoundingClientRect();\n const menuRect = menu.getBoundingClientRect();\n setPosition(\n clampContextMenuPosition({\n boundaryHeight: boundaryRect.height,\n boundaryWidth: boundaryRect.width,\n menuHeight: menuRect.height,\n menuWidth: menuRect.width,\n x: contextMenu.x,\n y: contextMenu.y\n })\n );\n }, [\n contextMenu,\n contextMenuRef,\n openWithApplications.length,\n openWithLoading,\n showCopyAction,\n showExportAction,\n showImportAction,\n showOpenInAppBrowserAction,\n showOpenInDefaultBrowserAction,\n showOpenWithAction,\n showOpenWithOtherAction,\n showRevealInFolderAction,\n showRenameAction\n ]);\n\n if (!contextMenu) {\n return null;\n }\n\n const entry = contextMenu.entry;\n const isDirectory = entry?.kind === \"directory\";\n const editItems: ContextMenuActionItem[] = [];\n const transferItems: ContextMenuActionItem[] = [];\n const dangerItems: ContextMenuActionItem[] = [];\n const createItems: ContextMenuActionItem[] = [];\n\n if (entry) {\n if (showRenameAction) {\n editItems.push({\n action: onRename,\n disabled: busy,\n icon: <EditIcon className=\"size-4\" />,\n key: \"rename\",\n label: copy.t(\"renameLabel\")\n });\n }\n if (showCopyAction) {\n editItems.push({\n action: onCopy,\n disabled: busy,\n icon: <CopyIcon className=\"size-4\" />,\n key: \"copy\",\n label: copy.t(\"copyLabel\")\n });\n }\n editItems.push({\n action: onCopyPath,\n disabled: busy,\n icon: <CopyIcon className=\"size-4\" />,\n key: \"copy-path\",\n label: copy.t(\"copyPathLabel\")\n });\n if (showRevealInFolderAction) {\n editItems.push({\n action: onRevealInFolder,\n disabled: busy,\n icon: <LocateFolderIcon className=\"size-4\" />,\n key: \"reveal-in-folder\",\n label: revealInFolderLabel\n });\n }\n if (isDirectory && showImportAction) {\n transferItems.push({\n action: onImport,\n disabled: busy,\n icon: <ImportIcon className=\"size-4\" />,\n key: \"import\",\n label: copy.t(\"importLabel\")\n });\n }\n if (showExportAction) {\n transferItems.push({\n action: onExport,\n disabled: busy,\n icon: <DownloadIcon className=\"size-4\" />,\n key: \"export\",\n label: copy.t(\"downloadLabel\")\n });\n }\n dangerItems.push({\n action: onDelete,\n disabled: busy,\n danger: true,\n icon: <DeleteIcon className=\"size-4\" />,\n key: \"delete\",\n label: copy.t(\"deleteLabel\")\n });\n } else {\n createItems.push({\n action: onCreateFile,\n disabled: busy,\n icon: <NewWorkspaceLinedIcon className=\"size-4\" />,\n key: \"create-file\",\n label: copy.t(\"createFileLabel\")\n });\n createItems.push({\n action: onCreateDirectory,\n disabled: busy,\n icon: <FileLinedIcon className=\"size-4\" />,\n key: \"create-directory\",\n label: copy.t(\"createDirectoryLabel\")\n });\n if (showImportAction) {\n transferItems.push({\n action: onImport,\n disabled: busy,\n icon: <ImportIcon className=\"size-4\" />,\n key: \"import\",\n label: copy.t(\"importLabel\")\n });\n }\n }\n const menuGroups: Array<{\n items: readonly ContextMenuActionItem[];\n key: string;\n }> = entry\n ? [\n { items: editItems, key: \"edit\" },\n { items: transferItems, key: \"transfer\" },\n { items: dangerItems, key: \"danger\" }\n ]\n : [\n { items: createItems, key: \"create\" },\n { items: transferItems, key: \"transfer\" }\n ];\n const visibleMenuGroups = menuGroups.filter(\n (group) => group.items.length > 0\n );\n\n return (\n <MenuSurface\n ref={contextMenuRef}\n className=\"absolute w-[220px] overflow-visible p-1\"\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 {entry ? (\n <ContextMenuActionButton\n disabled={busy}\n icon={<EyeIcon className=\"size-4\" />}\n label={copy.t(\"openLabel\")}\n onClick={() => {\n onClose();\n void onOpen();\n }}\n />\n ) : null}\n {entry && showOpenWithAction ? (\n <OpenWithMenuItem\n applications={openWithApplications}\n busy={busy}\n copy={copy}\n isLoading={openWithLoading}\n openInAppBrowserIcon={openInAppBrowserIcon}\n resolveOpenWithApplicationIcon={resolveOpenWithApplicationIcon}\n showOpenInAppBrowser={showOpenInAppBrowserAction}\n showOpenInDefaultBrowser={showOpenInDefaultBrowserAction}\n showOpenWithOther={showOpenWithOtherAction}\n onClose={onClose}\n onOpenInAppBrowser={onOpenInAppBrowser}\n onOpenInDefaultBrowser={onOpenInDefaultBrowser}\n onOpenWithApplication={onOpenWithApplication}\n onOpenWithOtherApplication={onOpenWithOtherApplication}\n />\n ) : null}\n {visibleMenuGroups.map((group, groupIndex) => (\n <ContextMenuActionGroup\n key={group.key}\n items={group.items}\n showDivider={entry !== null || groupIndex > 0}\n onClose={onClose}\n />\n ))}\n </MenuSurface>\n );\n}\n\ninterface ContextMenuActionItem {\n action: () => Promise<void> | void;\n disabled?: boolean;\n danger?: boolean;\n icon: ReactElement;\n key: string;\n label: string;\n}\n\nfunction ContextMenuActionGroup({\n items,\n onClose,\n showDivider\n}: {\n items: readonly ContextMenuActionItem[];\n onClose: () => void;\n showDivider: boolean;\n}): ReactElement {\n return (\n <>\n {showDivider ? <ContextMenuDivider /> : null}\n {items.map((item) => (\n <ContextMenuActionButton\n key={item.key}\n danger={item.danger}\n disabled={item.disabled}\n icon={item.icon}\n label={item.label}\n onClick={() => {\n onClose();\n void item.action();\n }}\n />\n ))}\n </>\n );\n}\n\nfunction ContextMenuActionButton({\n danger = false,\n disabled = false,\n icon,\n label,\n onClick\n}: {\n danger?: boolean;\n disabled?: boolean;\n icon: ReactElement;\n label: string;\n onClick: () => void;\n}): ReactElement {\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={onClick}\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 OpenWithMenuItem({\n applications,\n busy,\n copy,\n isLoading,\n openInAppBrowserIcon,\n resolveOpenWithApplicationIcon,\n showOpenInAppBrowser,\n showOpenInDefaultBrowser,\n showOpenWithOther,\n onClose,\n onOpenInAppBrowser,\n onOpenInDefaultBrowser,\n onOpenWithApplication,\n onOpenWithOtherApplication\n}: {\n applications: readonly WorkspaceFileOpenWithApplication[];\n busy: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n isLoading: boolean;\n openInAppBrowserIcon?: ReactElement;\n resolveOpenWithApplicationIcon?: (\n application: WorkspaceFileOpenWithApplication\n ) => ReactElement | null;\n showOpenInAppBrowser: boolean;\n showOpenInDefaultBrowser: boolean;\n showOpenWithOther: boolean;\n onClose: () => void;\n onOpenInAppBrowser: () => Promise<void>;\n onOpenInDefaultBrowser: () => Promise<void>;\n onOpenWithApplication: (applicationPath: string) => Promise<void>;\n onOpenWithOtherApplication: () => Promise<void>;\n}): ReactElement {\n const triggerRef = useRef<HTMLDivElement | null>(null);\n const [open, setOpen] = useState(false);\n const [placementPoint, setPlacementPoint] = useState({ x: 0, y: 0 });\n const closeTimerRef = useRef<number | null>(null);\n const showExternalSection =\n showOpenInDefaultBrowser ||\n showOpenWithOther ||\n isLoading ||\n applications.length > 0;\n const estimatedSubmenuHeight = estimateOpenWithSubmenuHeight({\n applicationCount: applications.length,\n isLoading,\n showExternalSection,\n showOpenInAppBrowser,\n showOpenInDefaultBrowser,\n showOpenWithOther\n });\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 openSubmenu = useCallback(() => {\n cancelClose();\n setOpen(true);\n }, [cancelClose]);\n\n useEffect(() => {\n return () => {\n cancelClose();\n };\n }, [cancelClose]);\n\n useLayoutEffect(() => {\n if (!open) {\n return;\n }\n\n const trigger = triggerRef.current;\n if (!trigger) {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n setPlacementPoint({\n x: rect.right + CONTEXT_MENU_SUBMENU_GAP_PX,\n y: rect.top\n });\n }, [open, estimatedSubmenuHeight]);\n\n return (\n <div\n ref={triggerRef}\n className=\"relative\"\n onPointerEnter={openSubmenu}\n onPointerLeave={scheduleClose}\n >\n <button\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={busy}\n role=\"menuitem\"\n type=\"button\"\n onClick={() => {\n setOpen((current) => {\n const next = !current;\n if (next) {\n cancelClose();\n }\n return next;\n });\n }}\n >\n <span className=\"grid size-4 flex-none place-items-center text-[var(--text-secondary)]\">\n <LaunchIcon className=\"size-4\" />\n </span>\n <span className=\"min-w-0 flex-1 truncate\">\n {copy.t(\"openWithLabel\")}\n </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 data-workspace-file-manager-submenu=\"\"\n open={open}\n className=\"w-[220px] max-h-[min(480px,calc(100vh-24px))] overflow-y-auto p-1\"\n dismissOnEscape={false}\n dismissOnPointerDownOutside={false}\n dismissOnScroll={false}\n placement={{\n type: \"point\",\n point: placementPoint,\n alignX: \"start\",\n alignY: \"auto\",\n estimatedSize: {\n width: 220,\n height: estimatedSubmenuHeight\n }\n }}\n role=\"menu\"\n onPointerEnter={openSubmenu}\n onPointerLeave={scheduleClose}\n >\n {showOpenInAppBrowser ? (\n <ContextMenuActionButton\n disabled={busy}\n icon={openInAppBrowserIcon ?? <WebIcon className=\"size-4\" />}\n label={copy.t(\"openInAppBrowserLabel\")}\n onClick={() => {\n onClose();\n void onOpenInAppBrowser();\n }}\n />\n ) : null}\n {showExternalSection ? <ContextMenuDivider /> : null}\n {isLoading ? (\n <div className=\"px-2 py-1.5 text-[11px] text-[var(--text-tertiary)]\">\n {copy.t(\"openWithLoadingLabel\")}\n </div>\n ) : null}\n {applications.map((application) => {\n const resolvedIcon = resolveOpenWithApplicationIcon?.(application);\n\n return (\n <ContextMenuActionButton\n key={application.applicationPath}\n disabled={busy}\n icon={\n resolvedIcon ??\n (application.iconDataUrl ? (\n <img\n alt=\"\"\n className=\"size-4 rounded-[4px] object-contain\"\n src={application.iconDataUrl}\n />\n ) : (\n <EyeIcon className=\"size-4\" />\n ))\n }\n label={application.name}\n onClick={() => {\n onClose();\n void onOpenWithApplication(application.applicationPath);\n }}\n />\n );\n })}\n {showOpenInDefaultBrowser ? (\n <ContextMenuActionButton\n disabled={busy}\n icon={<WebIcon className=\"size-4\" />}\n label={copy.t(\"openInDefaultBrowserLabel\")}\n onClick={() => {\n onClose();\n void onOpenInDefaultBrowser();\n }}\n />\n ) : null}\n {showOpenWithOther ? (\n <ContextMenuActionButton\n disabled={busy}\n icon={<LaunchIcon className=\"size-4\" />}\n label={copy.t(\"openWithOtherLabel\")}\n onClick={() => {\n onClose();\n void onOpenWithOtherApplication();\n }}\n />\n ) : null}\n </ViewportMenuSurface>\n </div>\n );\n}\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 kind: \"import\" | \"view\";\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 =\n dialog.title ??\n (dialog.kind === \"import\"\n ? copy.t(\"unsupportedImportTitle\")\n : copy.t(\"unsupportedViewTitle\"));\n const body =\n dialog.message ??\n (dialog.kind === \"import\"\n ? copy.t(\"unsupportedImportBody\")\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\nexport function WorkspaceFileManagerImportConflictDialog({\n busy,\n copy,\n dialog,\n onClose,\n onConfirm\n}: {\n busy: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n dialog: WorkspaceFileManagerHostImportConflict | null;\n onClose: () => void;\n onConfirm: () => void;\n}): ReactElement | null {\n if (!dialog) {\n return null;\n }\n\n const hasBlockedConflict = dialog.conflicts.some(\n (conflict) => conflict.conflictKind === \"type_mismatch\"\n );\n\n return (\n <ConfirmationDialog\n cancelLabel={\n hasBlockedConflict ? copy.t(\"closeLabel\") : copy.t(\"cancelLabel\")\n }\n className=\"max-w-lg\"\n confirmBusy={busy}\n confirmLabel={\n hasBlockedConflict\n ? copy.t(\"closeLabel\")\n : copy.t(\"importConflictReplaceLabel\")\n }\n description={\n hasBlockedConflict\n ? copy.t(\"importTypeConflictDescription\", {\n count: dialog.conflicts.length\n })\n : copy.t(\"importConflictDescription\", {\n count: dialog.conflicts.length\n })\n }\n hideConfirmButton={hasBlockedConflict}\n open\n title={\n hasBlockedConflict\n ? copy.t(\"importTypeConflictTitle\")\n : copy.t(\"importConflictTitle\")\n }\n tone={hasBlockedConflict ? \"default\" : \"destructive\"}\n onConfirm={hasBlockedConflict ? onClose : onConfirm}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n >\n <ImportConflictSummary copy={copy} dialog={dialog} />\n <div className=\"max-h-60 overflow-auto rounded-lg border border-[var(--border-1)] bg-transparency-block\">\n <div className=\"divide-y divide-[var(--border-1)]\">\n {dialog.conflicts.map((conflict) => (\n <div\n key={`${conflict.destinationPath}:${conflict.sourcePath}`}\n className=\"flex flex-col gap-1 px-4 py-3 text-[13px]\"\n >\n <span className=\"font-medium text-[var(--text-primary)]\">\n {conflict.name}\n </span>\n <span className=\"text-[11px] text-[var(--text-secondary)]\">\n {copy.t(\"importConflictReviewLabel\")}:{\" \"}\n {conflict.destinationPath}\n </span>\n </div>\n ))}\n </div>\n </div>\n </ConfirmationDialog>\n );\n}\n\nfunction ImportConflictSummary({\n copy,\n dialog\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n dialog: WorkspaceFileManagerHostImportConflict;\n}): ReactElement | null {\n const summaryItems: string[] = [];\n const hasReasonBreakdown =\n dialog.summary?.reasonBreakdown?.some((reason) => reason.count > 0) ??\n false;\n if (\n typeof dialog.summary?.selectedCount === \"number\" &&\n dialog.summary.selectedCount > 0\n ) {\n summaryItems.push(\n copy.t(\"importConflictSummarySelected\", {\n count: dialog.summary.selectedCount\n })\n );\n }\n if (\n !hasReasonBreakdown &&\n typeof dialog.summary?.filteredCount === \"number\" &&\n dialog.summary.filteredCount > 0\n ) {\n summaryItems.push(\n copy.t(\"importConflictSummaryFiltered\", {\n count: dialog.summary.filteredCount\n })\n );\n }\n if (\n !hasReasonBreakdown &&\n typeof dialog.summary?.ignoredCount === \"number\" &&\n dialog.summary.ignoredCount > 0\n ) {\n summaryItems.push(\n copy.t(\"importConflictSummaryIgnored\", {\n count: dialog.summary.ignoredCount\n })\n );\n }\n for (const reason of dialog.summary?.reasonBreakdown ?? []) {\n if (reason.count <= 0) {\n continue;\n }\n const copyKey = importSummaryReasonCopyKey(reason.reason);\n if (!copyKey) {\n continue;\n }\n summaryItems.push(copy.t(copyKey, { count: reason.count }));\n }\n\n if (summaryItems.length === 0) {\n return null;\n }\n\n return (\n <div className=\"flex flex-wrap gap-2 text-[11px] text-[var(--text-secondary)]\">\n {summaryItems.map((item) => (\n <span\n key={item}\n className=\"rounded-md border border-[var(--border-1)] px-2 py-1\"\n >\n {item}\n </span>\n ))}\n </div>\n );\n}\n\nfunction importSummaryReasonCopyKey(\n reason: WorkspaceFileImportSummaryReason\n): WorkspaceFileManagerI18nKey | null {\n switch (reason) {\n case \"ignored\":\n return \"importConflictSummaryReasonIgnored\";\n case \"symlink\":\n return \"importConflictSummaryReasonSymlink\";\n case \"system_metadata\":\n return \"importConflictSummaryReasonSystemMetadata\";\n }\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;\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 showOpenWithOther: boolean;\n}): number {\n let itemCount = 0;\n\n if (input.showOpenInAppBrowser) {\n itemCount += 1;\n }\n if (input.showExternalSection) {\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","import {\n FileCodeIcon,\n FileTextIcon,\n FolderFilledIcon,\n ImageFileIcon,\n LoadingIcon,\n ScrollArea,\n VideoFileIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { NextopDateLocale } from \"@tutti-os/ui-system/date-format\";\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 MouseEvent as ReactMouseEvent,\n PointerEvent as ReactPointerEvent,\n ReactElement,\n RefObject\n} from \"react\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState\n} from \"react\";\nimport {\n formatWorkspaceFileBytes,\n formatWorkspaceFileModifiedTime,\n resolveWorkspaceFileVisualKind,\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 { WorkspaceFileEntryIcon } from \"./WorkspaceFileEntryIcon.tsx\";\nimport type { WorkspaceFileManagerLayoutMode } from \"./workspaceFileManagerLayoutMode.ts\";\n\nconst workspaceFileManagerTableGridClassName =\n \"grid-cols-[minmax(0,_1fr)_148px_96px]\";\nconst workspaceFileManagerTableGridStyle: CSSProperties = {\n gridTemplateColumns: \"minmax(0, 1fr) 148px 96px\"\n};\nconst workspaceFileManagerCompactTableGridClassName =\n \"grid-cols-[minmax(0,_1fr)_96px_72px]\";\nconst workspaceFileManagerCompactTableGridStyle: CSSProperties = {\n gridTemplateColumns: \"minmax(0, 1fr) 96px 72px\"\n};\nconst workspaceFileManagerPreviewDetailGridStyle: CSSProperties = {\n gridTemplateColumns: \"minmax(82px, 0.8fr) minmax(0, 1.2fr)\"\n};\nconst workspaceFileManagerStackedBreakpoint = 600;\nconst workspaceFileManagerPreviewDefaultWidth = 280;\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 canMove,\n contextMenuEntryPath,\n dateLocale,\n entryDragMode,\n entrySelectionEnabled = true,\n copy,\n iconUrlByCacheKey,\n inlineRenameEntryPath,\n inlineRenameValidation,\n isRenaming,\n layoutMode,\n pendingDirectoryPath,\n previewState,\n selectedEntry,\n selectedPath,\n state,\n showDropOverlay,\n onBlankContextMenu,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename,\n onEntryContextMenu,\n onEntryDragStart,\n onMoveEntry,\n onOpenEntry,\n onSelect\n}: {\n canMove: boolean;\n contextMenuEntryPath: string | null;\n dateLocale?: NextopDateLocale;\n entryDragMode?: WorkspaceFileManagerEntryDragMode;\n entrySelectionEnabled?: boolean;\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 selectedEntry: WorkspaceFileEntry | null;\n selectedPath: string | null;\n state: {\n entries: readonly WorkspaceFileEntry[];\n error: string | null;\n isLoading: boolean;\n };\n showDropOverlay: boolean;\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}): ReactElement {\n const { rootRef } = useWorkspaceFileManagerStackedLayout(\n workspaceFileManagerStackedBreakpoint\n );\n const previewResizeRef = useRef<{\n pointerId: number;\n startX: number;\n startWidth: number;\n maxWidth: number;\n } | null>(null);\n const [previewPaneWidth, setPreviewPaneWidth] = 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 entriesRef = useRef<readonly WorkspaceFileEntry[]>(state.entries);\n const nativeEntryDragEnabled =\n onEntryDragStart !== undefined &&\n (entryDragMode === \"external\" || (entryDragMode === undefined && !canMove));\n const internalMoveEnabled = canMove && !nativeEntryDragEnabled;\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 = state.entries;\n }, [state.entries]);\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 = false;\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\n useLayoutEffect(() => {\n const element = rootRef.current;\n if (!element || useStackedPreview || !showPreviewPanel) {\n return;\n }\n\n const publishLayout = () => {\n const containerWidth = Math.round(element.getBoundingClientRect().width);\n const maxWidth = Math.max(\n workspaceFileManagerPreviewMinWidth,\n containerWidth - workspaceFileManagerTableMinWidth\n );\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 }, [clampPreviewPaneWidth, rootRef, showPreviewPanel, useStackedPreview]);\n\n const handlePreviewResizePointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>): void => {\n if (event.button !== 0) {\n return;\n }\n\n const containerWidth =\n rootRef.current?.getBoundingClientRect().width ?? 0;\n const maxWidth = Math.max(\n workspaceFileManagerPreviewMinWidth,\n containerWidth - workspaceFileManagerTableMinWidth\n );\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n previewResizeRef.current = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startWidth: previewPaneWidth,\n maxWidth\n };\n },\n [previewPaneWidth, rootRef]\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 setPreviewPaneWidth(\n clampPreviewPaneWidth(resize.startWidth - deltaX, resize.maxWidth)\n );\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 event.currentTarget.releasePointerCapture(event.pointerId);\n },\n []\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 message={copy.t(\"emptyDirectory\")} />\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 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 className={tableCellPaddingClassName}>\n {copy.t(\"nameLabel\")}\n </span>\n <span\n className={cn(\"whitespace-nowrap\", tableCellPaddingClassName)}\n >\n {copy.t(\"modifiedLabel\")}\n </span>\n <span\n className={cn(\"whitespace-nowrap\", tableCellPaddingClassName)}\n >\n {copy.t(\"sizeLabel\")}\n </span>\n </div>\n {state.entries.map((entry) => (\n <EntryRow\n key={entry.path}\n contextMenuActive={contextMenuEntryPath === entry.path}\n copy={copy}\n dateLocale={dateLocale}\n entry={entry}\n iconUrlByCacheKey={iconUrlByCacheKey}\n canMove={internalMoveEnabled}\n draggable={nativeEntryDragEnabled}\n gridClassName={tableGridClassName}\n gridStyle={tableGridStyle}\n inlineRenameValidation={\n inlineRenameEntryPath === entry.path\n ? inlineRenameValidation\n : null\n }\n isEnteringDirectory={pendingDirectoryPath === entry.path}\n isInlineRenaming={inlineRenameEntryPath === entry.path}\n isRenaming={isRenaming}\n moveDragActive={moveDragPreview !== null}\n moveDragSource={moveDragPreview?.entry.path === entry.path}\n moveDragTarget={\n moveDragPreview?.targetDirectoryPath === entry.path\n }\n tableCellPaddingClassName={tableCellPaddingClassName}\n selected={selectedPath === entry.path}\n onCancelInlineRename={onCancelInlineRename}\n onClearInlineRenameValidation={onClearInlineRenameValidation}\n onConfirmInlineRename={onConfirmInlineRename}\n onContextMenu={onEntryContextMenu}\n onDragStart={onEntryDragStart}\n onClick={handleEntryClick}\n onPointerDown={handleEntryPointerDown}\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-orientation=\"vertical\"\n className=\"nodrag absolute top-0 bottom-0 z-[1] w-2 cursor-col-resize touch-none\"\n role=\"separator\"\n style={\n {\n right: previewPaneWidth - 4\n } satisfies CSSProperties\n }\n onPointerCancel={handlePreviewResizePointerEnd}\n onPointerDown={handlePreviewResizePointerDown}\n onPointerMove={handlePreviewResizePointerMove}\n onPointerUp={handlePreviewResizePointerEnd}\n />\n ) : null}\n {previewPanel}\n </div>\n <div\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 grid place-items-center rounded-[var(--workbench-window-radius,8px)] border border-dashed border-[var(--border-focus)] bg-[var(--accent-bg)] opacity-0 transition-opacity duration-150 ease-out\",\n showDropOverlay && \"opacity-100\"\n )}\n >\n <div className=\"rounded-lg border border-[var(--border-1)] bg-[var(--background-fronted)] px-5 py-3 text-sm font-normal text-[var(--text-primary)] shadow-panel\">\n {copy.t(\"dropToImportLabel\")}\n </div>\n </div>\n {moveDragPreview ? (\n <MoveDragPreview\n iconUrlByCacheKey={iconUrlByCacheKey}\n preview={moveDragPreview}\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 EntryRow({\n canMove,\n contextMenuActive,\n copy,\n dateLocale,\n draggable,\n entry,\n gridClassName,\n gridStyle,\n iconUrlByCacheKey,\n inlineRenameValidation,\n isEnteringDirectory,\n isInlineRenaming,\n isRenaming,\n moveDragActive,\n moveDragSource,\n moveDragTarget,\n selected,\n tableCellPaddingClassName,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename,\n onContextMenu,\n onDragStart,\n onClick,\n onPointerDown\n}: {\n canMove: boolean;\n contextMenuActive: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n dateLocale?: NextopDateLocale;\n draggable: boolean;\n entry: WorkspaceFileEntry;\n gridClassName: string;\n gridStyle: CSSProperties;\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 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 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-block\",\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={tableCellPaddingClassName}>\n <EntryNameCell\n copy={copy}\n entry={entry}\n iconUrlByCacheKey={iconUrlByCacheKey}\n inlineRenameValidation={inlineRenameValidation}\n isEnteringDirectory={isEnteringDirectory}\n isInlineRenaming={isInlineRenaming}\n isRenaming={isRenaming}\n onCancelInlineRename={onCancelInlineRename}\n onClearInlineRenameValidation={onClearInlineRenameValidation}\n onConfirmInlineRename={onConfirmInlineRename}\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(entry.mtimeMs, dateLocale)}\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}: {\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n preview: WorkspaceFileManagerMoveDragPreview;\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-[18px]\"\n iconClassName=\"size-4\"\n iconUrlByCacheKey={iconUrlByCacheKey}\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 EntryNameCell({\n copy,\n entry,\n iconUrlByCacheKey,\n inlineRenameValidation = null,\n isEnteringDirectory = false,\n isInlineRenaming = false,\n isRenaming = false,\n onCancelInlineRename,\n onClearInlineRenameValidation,\n onConfirmInlineRename\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n entry: WorkspaceFileEntry;\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n inlineRenameValidation?: WorkspaceFileManagerInlineRenameValidation | null;\n isEnteringDirectory?: boolean;\n isInlineRenaming?: boolean;\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 [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 className=\"flex min-w-0 items-center gap-2\">\n <WorkspaceFileEntryIcon\n entry={entry}\n frameClassName=\"size-[18px]\"\n iconClassName=\"size-4\"\n iconUrlByCacheKey={iconUrlByCacheKey}\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 className=\"flex min-w-0 items-center gap-2\">\n <WorkspaceFileEntryIcon\n entry={entry}\n frameClassName=\"size-[18px]\"\n iconClassName=\"size-4\"\n iconUrlByCacheKey={iconUrlByCacheKey}\n isEnteringDirectory={isEnteringDirectory}\n />\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 </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 <FolderFilledIcon className={className} />;\n case \"image\":\n return <ImageFileIcon 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?: NextopDateLocale;\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 frameClassName=\"flex h-60 min-h-60 max-h-60 items-center justify-center overflow-hidden rounded-lg border border-[var(--border-1)] bg-[var(--transparency-block)]\"\n imageAlt={(entry) => entry.name}\n imageFrameClassName=\"p-4\"\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 messageClassName=\"max-w-[24ch] [overflow-wrap:anywhere]\"\n renderIcon={(entry) => (\n <EntryIcon\n className=\"mx-auto size-7\"\n visualKind={resolveWorkspaceFilePreviewIconKind(entry)}\n />\n )}\n state={previewState}\n textFrameClassName=\"items-stretch justify-stretch\"\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.fileKind === \"image\" ? \"image\" : \"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\nexport function hasFileDragPayload(dataTransfer: DataTransfer): boolean {\n return Array.from(dataTransfer.types).includes(\"Files\");\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 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 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 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 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 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-[120px] 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-block\",\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 />\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-md 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 FolderFilledIcon,\n ImageFileIcon,\n LoadingIcon,\n VideoFileIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { ReactElement } from \"react\";\nimport { resolveWorkspaceFileVisualKind } from \"../services/workspaceFileManagerModel.ts\";\nimport type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\nimport {\n resolveWorkspaceFileEntryIconCacheKey,\n isWorkspaceApplicationBundle\n} from \"./workspaceFileEntryIconPolicy.ts\";\n\nexport function WorkspaceFileEntryIcon({\n entry,\n frameClassName,\n iconClassName = \"size-4\",\n iconUrlByCacheKey,\n isEnteringDirectory = false\n}: {\n entry: WorkspaceFileEntry;\n frameClassName?: string;\n iconClassName?: string;\n iconUrlByCacheKey?: ReadonlyMap<string, string | null>;\n isEnteringDirectory?: boolean;\n}): ReactElement {\n const visualKind = resolveWorkspaceFileVisualKind(entry);\n const isAppBundle = isWorkspaceApplicationBundle(entry);\n const iconUrl =\n iconUrlByCacheKey?.get(resolveWorkspaceFileEntryIconCacheKey(entry)) ??\n null;\n\n return (\n <span\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 className={iconClassName + \" animate-spin\"} />\n ) : iconUrl ? (\n <img\n alt=\"\"\n className={cn(iconClassName, \"rounded-[4px] object-contain\")}\n draggable={false}\n src={iconUrl}\n />\n ) : (\n <DefaultEntryIcon\n entry={entry}\n iconClassName={iconClassName}\n visualKind={visualKind}\n />\n )}\n </span>\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 if (isWorkspaceApplicationBundle(entry)) {\n return <FileTextIcon className={iconClassName} />;\n }\n\n switch (visualKind) {\n case \"directory\":\n return <FolderFilledIcon className={iconClassName} />;\n case \"image\":\n return <ImageFileIcon className={iconClassName} />;\n case \"video\":\n return <VideoFileIcon className={iconClassName} />;\n case \"markdown\":\n case \"document\":\n return <FileTextIcon className={iconClassName} />;\n case \"code\":\n return <FileCodeIcon className={iconClassName} />;\n case \"binary\":\n return <FileTextIcon className={iconClassName} />;\n default:\n return <FileTextIcon className={iconClassName} />;\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 type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\nimport { resolveWorkspaceFileVisualKind } from \"../services/workspaceFileManagerModel.ts\";\n\nexport function shouldResolveWorkspaceFileEntryIcon(\n entry: WorkspaceFileEntry\n): boolean {\n if (isWorkspaceApplicationBundle(entry)) {\n return true;\n }\n return (\n entry.kind === \"file\" && resolveWorkspaceFileVisualKind(entry) === \"image\"\n );\n}\n\nexport function isWorkspaceApplicationBundle(\n entry: Pick<WorkspaceFileEntry, \"name\">\n): boolean {\n return entry.name.trim().toLowerCase().endsWith(\".app\");\n}\n\nexport function resolveWorkspaceFileEntryIconCacheKey(\n entry: WorkspaceFileEntry\n): string {\n return `${entry.path}:${entry.mtimeMs ?? 0}`;\n}\n","// macOS Finder icon view uses 64pt icons; render at ~80% (52px) of that baseline.\nconst workspaceFileManagerIconGridIconSizePx = 52;\nconst workspaceFileManagerIconGridTileMinWidthPx = 108;\nconst workspaceFileManagerIconGridTileMaxWidthPx = 120;\n\nexport const workspaceFileManagerIconGridLayout = {\n iconSizePx: workspaceFileManagerIconGridIconSizePx,\n tileMaxWidthPx: workspaceFileManagerIconGridTileMaxWidthPx,\n tileMinWidthPx: workspaceFileManagerIconGridTileMinWidthPx\n} as const;\n\nexport function workspaceFileManagerIconGridIconClassName(): string {\n return \"size-[52px]\";\n}\n\nexport function workspaceFileManagerIconGridFrameClassName(): string {\n return \"size-[60px]\";\n}\n","import {\n ArrowLeftIcon,\n ArrowRightIcon,\n Button,\n GridHorizontalLinedIcon,\n LayoutMenuIcon,\n LoadingIcon,\n RefreshIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport { useState, type ReactElement } from \"react\";\nimport type { WorkspaceFileManagerI18nRuntime } from \"../i18n/workspaceFileManagerI18n.ts\";\nimport type { WorkspaceFileManagerLayoutMode } from \"./workspaceFileManagerLayoutMode.ts\";\n\nexport function WorkspaceFileManagerToolbar({\n breadcrumbs,\n canGoBack,\n canGoForward,\n copy,\n currentDirectoryPath,\n isBusy,\n isLoading,\n isMutating,\n layoutMode,\n onGoBack,\n onGoForward,\n onLayoutModeChange,\n onLoadDirectory,\n onRefresh\n}: {\n breadcrumbs: Array<{ label: string; path: string }>;\n canGoBack: boolean;\n canGoForward: boolean;\n copy: WorkspaceFileManagerI18nRuntime;\n currentDirectoryPath: string;\n isBusy: boolean;\n isLoading: boolean;\n isMutating: boolean;\n layoutMode: WorkspaceFileManagerLayoutMode;\n onGoBack: () => void;\n onGoForward: () => void;\n onLayoutModeChange: (layoutMode: WorkspaceFileManagerLayoutMode) => void;\n onLoadDirectory: (path: string) => void;\n onRefresh: () => 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 copy={copy}\n layoutMode={layoutMode}\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 </div>\n </header>\n );\n}\n\nfunction LayoutModeToggle({\n copy,\n layoutMode,\n onLayoutModeChange\n}: {\n copy: WorkspaceFileManagerI18nRuntime;\n layoutMode: WorkspaceFileManagerLayoutMode;\n onLayoutModeChange: (layoutMode: WorkspaceFileManagerLayoutMode) => void;\n}): ReactElement {\n return (\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 onClick={() => {\n onLayoutModeChange(\"icon\");\n }}\n >\n <LayoutMenuIcon className=\"size-3.5\" />\n </LayoutModeButton>\n <LayoutModeButton\n active={layoutMode === \"list\"}\n ariaLabel={copy.t(\"layoutListViewLabel\")}\n onClick={() => {\n onLayoutModeChange(\"list\");\n }}\n >\n <GridHorizontalLinedIcon className=\"size-3.5\" />\n </LayoutModeButton>\n </div>\n );\n}\n\nfunction LayoutModeButton({\n active,\n ariaLabel,\n children,\n onClick\n}: {\n active: boolean;\n ariaLabel: string;\n children: ReactElement;\n onClick: () => void;\n}): ReactElement {\n return (\n <Button\n aria-label={ariaLabel}\n aria-pressed={active}\n className={cn(\n \"size-6 min-w-6 rounded-[4px] p-0 text-[var(--text-secondary)]\",\n active &&\n \"bg-[var(--background-fronted)] text-[var(--text-primary)] shadow-sm\"\n )}\n size=\"icon-sm\"\n title={ariaLabel}\n type=\"button\"\n variant=\"ghost\"\n onClick={onClick}\n >\n {children}\n </Button>\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 { 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 \"nextop.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 { useEffect, useMemo, useState } from \"react\";\nimport type { WorkspaceFileEntry } from \"../services/workspaceFileManagerTypes.ts\";\nimport {\n resolveWorkspaceFileEntryIconCacheKey,\n shouldResolveWorkspaceFileEntryIcon\n} from \"./workspaceFileEntryIconPolicy.ts\";\n\nfunction buildIconTargetSignature(\n entries: readonly WorkspaceFileEntry[]\n): string {\n return entries\n .filter(shouldResolveWorkspaceFileEntryIcon)\n .map((entry) => resolveWorkspaceFileEntryIconCacheKey(entry))\n .join(\"\\0\");\n}\n\nexport function useWorkspaceFileEntryIconUrls(input: {\n entries: readonly WorkspaceFileEntry[];\n resolveEntryIconUrl?: (\n entry: WorkspaceFileEntry\n ) => Promise<string | null | undefined>;\n}): ReadonlyMap<string, string | null> {\n const { entries, resolveEntryIconUrl } = input;\n const [iconUrlByCacheKey, setIconUrlByCacheKey] = useState<\n ReadonlyMap<string, string | null>\n >(() => new Map());\n const iconTargetSignature = useMemo(\n () => buildIconTargetSignature(entries),\n [entries]\n );\n\n useEffect(() => {\n if (!resolveEntryIconUrl) {\n setIconUrlByCacheKey((current) =>\n current.size === 0 ? current : new Map()\n );\n return;\n }\n\n const targets = entries.filter(shouldResolveWorkspaceFileEntryIcon);\n if (targets.length === 0) {\n setIconUrlByCacheKey((current) =>\n current.size === 0 ? current : new Map()\n );\n return;\n }\n\n let cancelled = false;\n\n void Promise.all(\n targets.map(async (entry) => {\n const cacheKey = resolveWorkspaceFileEntryIconCacheKey(entry);\n try {\n const iconUrl = await resolveEntryIconUrl(entry);\n return [cacheKey, iconUrl?.trim() || null] as const;\n } catch {\n return [cacheKey, null] as const;\n }\n })\n ).then((results) => {\n if (cancelled) {\n return;\n }\n\n setIconUrlByCacheKey((current) => {\n const nextCacheKeys = new Set(results.map(([cacheKey]) => cacheKey));\n let changed = false;\n const next = new Map<string, string | null>();\n\n for (const [cacheKey, iconUrl] of results) {\n next.set(cacheKey, iconUrl);\n if (current.get(cacheKey) !== iconUrl) {\n changed = true;\n }\n }\n\n if (current.size !== next.size) {\n changed = true;\n } else if (!changed) {\n for (const cacheKey of current.keys()) {\n if (!nextCacheKeys.has(cacheKey)) {\n changed = true;\n break;\n }\n }\n }\n\n return changed ? next : current;\n });\n });\n\n return () => {\n cancelled = true;\n };\n }, [entries, iconTargetSignature, resolveEntryIconUrl]);\n\n return iconUrlByCacheKey;\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 { 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 type { WorkspaceFileManagerI18nRuntime } from \"../../i18n/workspaceFileManagerI18n.ts\";\nimport type {\n WorkspaceFileEntry,\n WorkspaceFileManagerState\n} from \"../workspaceFileManagerTypes.ts\";\n\nexport interface WorkspaceFileManagerRootViewState {\n canImportFromDrop: boolean;\n currentDirectoryPath: string;\n isBusy: boolean;\n}\n\nexport interface WorkspaceFileManagerToolbarViewState {\n breadcrumbs: Array<{ label: string; path: string }>;\n canGoBack: boolean;\n canGoForward: boolean;\n currentDirectoryPath: string;\n isBusy: boolean;\n isLoading: boolean;\n isMutating: boolean;\n isImporting: boolean;\n showImportAction: boolean;\n}\n\nexport interface WorkspaceFileManagerPanelsViewState {\n canMove: boolean;\n contextMenuEntryPath: string | null;\n entries: readonly WorkspaceFileEntry[];\n error: string | null;\n inlineRenameEntryPath: string | null;\n inlineRenameValidation: WorkspaceFileManagerState[\"inlineRenameValidation\"];\n isLoading: boolean;\n isRenaming: boolean;\n pendingDirectoryPath: string | null;\n previewState: WorkspaceFileManagerState[\"previewState\"];\n selectedEntry: WorkspaceFileEntry | null;\n selectedPath: string | null;\n showDropOverlay: boolean;\n}\n\nexport interface WorkspaceFileManagerDialogsViewState {\n createDialog: WorkspaceFileManagerState[\"createDialog\"];\n deleteDialogEntry: WorkspaceFileEntry | null;\n isBusy: boolean;\n isDeleting: boolean;\n isImporting: 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: \"import\" | \"view\";\n message?: string | null;\n title?: string | null;\n } | null;\n importConflictDialog: WorkspaceFileManagerState[\"importConflictDialog\"];\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 showCopyAction: boolean;\n showExportAction: boolean;\n showImportAction: boolean;\n showMoveAction: boolean;\n showOpenInAppBrowserAction: boolean;\n showOpenInDefaultBrowserAction: boolean;\n showOpenWithAction: boolean;\n showOpenWithOtherAction: boolean;\n showRevealInFolderAction: boolean;\n showRenameAction: boolean;\n}\n\nexport function resolveWorkspaceFileManagerRootViewState(input: {\n state: WorkspaceFileManagerState;\n}): WorkspaceFileManagerRootViewState {\n const { state } = input;\n return {\n canImportFromDrop: state.capabilities.canImportFromDrop,\n currentDirectoryPath: state.currentDirectoryPath,\n isBusy: state.busyAction !== null\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 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 isImporting: state.busyAction === \"import\",\n showImportAction: state.capabilities.canImportFromPicker\n };\n}\n\nexport function resolveWorkspaceFileManagerPanelsViewState(input: {\n state: WorkspaceFileManagerState;\n}): WorkspaceFileManagerPanelsViewState {\n const { state } = input;\n return {\n canMove: state.capabilities.canMove,\n contextMenuEntryPath: state.contextMenuEntryPath,\n entries: state.entries,\n error: state.error,\n inlineRenameEntryPath: state.inlineRenameEntryPath,\n inlineRenameValidation: state.inlineRenameValidation,\n isLoading: state.isLoading,\n isRenaming: state.busyAction === \"rename\",\n pendingDirectoryPath: state.pendingDirectoryPath,\n previewState: state.previewState,\n selectedEntry: findSelectedEntry(state),\n selectedPath: state.selectedPath,\n showDropOverlay:\n state.capabilities.canImportFromDrop &&\n state.dragDepth > 0 &&\n state.busyAction === null\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 isImporting: state.busyAction === \"import\",\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 importConflictDialog: state.importConflictDialog\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 const isContextMenuFile = contextMenuEntry?.kind === \"file\";\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 showCopyAction: state.capabilities.canCopy,\n showExportAction: state.capabilities.canExport,\n showImportAction: state.capabilities.canImportFromPicker,\n showMoveAction: state.capabilities.canMove,\n showOpenInAppBrowserAction: state.capabilities.canOpenInAppBrowser,\n showOpenInDefaultBrowserAction: state.capabilities.canOpenInDefaultBrowser,\n showOpenWithAction: state.capabilities.canOpenWith && isContextMenuFile,\n showOpenWithOtherAction:\n state.capabilities.canPickOtherOpenWithApplication && isContextMenuFile,\n showRevealInFolderAction: state.capabilities.canRevealInFolder,\n showRenameAction: state.capabilities.canRename\n };\n}\n\nfunction findSelectedEntry(\n state: WorkspaceFileManagerState\n): WorkspaceFileEntry | null {\n return (\n state.entries.find((entry) => entry.path === state.selectedPath) ?? null\n );\n}\n\nfunction findEntry(\n state: WorkspaceFileManagerState,\n entryPath: string\n): WorkspaceFileEntry | null {\n return state.entries.find((entry) => entry.path === entryPath) ?? null;\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","cn","FileCodeIcon","FileTextIcon","FolderFilledIcon","ImageFileIcon","LoadingIcon","VideoFileIcon","cn","useCallback","useEffect","useLayoutEffect","useRef","useState","cn","useLayoutEffect","useRef","cn","jsx","cn","jsx","jsxs","useRef","useLayoutEffect","cn","Fragment","jsx","jsxs","useRef","useState","useCallback","useEffect","useLayoutEffect","cn","FolderFilledIcon","ImageFileIcon","VideoFileIcon","FileTextIcon","FileCodeIcon","LoadingIcon","ArrowRightIcon","Button","LoadingIcon","cn","useState","jsx","jsxs","useCallback","useState","useState","useCallback","useEffect","useState","useState","useEffect","Fragment","jsx","jsxs","useRef","useEffect","cn","useState"]}
|