@k2b/ui 0.28.0 → 0.30.0
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/README.md +1 -1
- package/dist/base.css +2 -2
- package/dist/browser/actions/ContextMenu.js +5 -0
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/DragAndDrop.js +89 -0
- package/dist/browser/actions/DragAndDrop.js.map +1 -0
- package/dist/browser/actions/Dropdown.js +6 -3
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/FilterChip.js +137 -7
- package/dist/browser/actions/FilterChip.js.map +1 -1
- package/dist/browser/actions/GestureMenu.js +26 -3
- package/dist/browser/actions/GestureMenu.js.map +1 -1
- package/dist/browser/actions/SegmentedControl.js +5 -9
- package/dist/browser/actions/SegmentedControl.js.map +1 -1
- package/dist/browser/actions/SpotlightSearch.js +6 -3
- package/dist/browser/actions/SpotlightSearch.js.map +1 -1
- package/dist/browser/actions/Tabs.js +5 -2
- package/dist/browser/actions/Tabs.js.map +1 -1
- package/dist/browser/actions/ViewTabs.js +294 -0
- package/dist/browser/actions/ViewTabs.js.map +1 -0
- package/dist/browser/actions/drag-and-drop-messages.js +75 -0
- package/dist/browser/actions/drag-and-drop-messages.js.map +1 -0
- package/dist/browser/actions/drag-and-drop.js +692 -0
- package/dist/browser/actions/drag-and-drop.js.map +1 -0
- package/dist/browser/actions/filter-messages.js +6 -2
- package/dist/browser/actions/filter-messages.js.map +1 -1
- package/dist/browser/actions/index.js +3 -1
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/chat/ChatComposer.js +1229 -605
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatDecision.js +814 -0
- package/dist/browser/chat/ChatDecision.js.map +1 -0
- package/dist/browser/chat/ChatPrimitives.js +292 -153
- package/dist/browser/chat/ChatPrimitives.js.map +1 -1
- package/dist/browser/chat/ChatTimeline.js.map +1 -1
- package/dist/browser/chat/chat-messages.js +14 -0
- package/dist/browser/chat/chat-messages.js.map +1 -1
- package/dist/browser/chat/command-search.js +35 -17
- package/dist/browser/chat/command-search.js.map +1 -1
- package/dist/browser/chat/index.js +10 -3
- package/dist/browser/chat/index.js.map +1 -1
- package/dist/browser/chat/types.js.map +1 -1
- package/dist/browser/content/Calendar.js +146 -119
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/CalendarWeekView.js +291 -266
- package/dist/browser/content/CalendarWeekView.js.map +1 -1
- package/dist/browser/content/Chart.js +54 -71
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/DataTable.js +224 -155
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/FileBrowser.js +2 -2
- package/dist/browser/content/FileBrowser.js.map +1 -1
- package/dist/browser/content/FileTree.js +42 -36
- package/dist/browser/content/FileTree.js.map +1 -1
- package/dist/browser/content/FileTypeIcon.js +72 -0
- package/dist/browser/content/FileTypeIcon.js.map +1 -0
- package/dist/browser/content/FileView.js +2 -2
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/ReferenceChip.js +162 -0
- package/dist/browser/content/ReferenceChip.js.map +1 -0
- package/dist/browser/content/calendar-pointer.js +9 -0
- package/dist/browser/content/calendar-pointer.js.map +1 -1
- package/dist/browser/content/calendar-time-view.js +6 -3
- package/dist/browser/content/calendar-time-view.js.map +1 -1
- package/dist/browser/content/data-table-messages.js +4 -2
- package/dist/browser/content/data-table-messages.js.map +1 -1
- package/dist/browser/content/index.js +2 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/feedback/MovedHint.js +197 -0
- package/dist/browser/feedback/MovedHint.js.map +1 -0
- package/dist/browser/feedback/dialog-core.js +66 -9
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/feedback/index.js +1 -0
- package/dist/browser/feedback/index.js.map +1 -1
- package/dist/browser/feedback/prompts.js +6 -1
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +337 -212
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/date-picker.js +59 -5
- package/dist/browser/inputs/date-picker.js.map +1 -1
- package/dist/browser/intl/messages.js +12 -0
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/intl/weekend.js +39 -0
- package/dist/browser/intl/weekend.js.map +1 -0
- package/dist/browser/layout/AppOverview.js +1 -2
- package/dist/browser/layout/AppOverview.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +947 -531
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/PageTitle.js +3 -2
- package/dist/browser/layout/PageTitle.js.map +1 -1
- package/dist/browser/layout/PanelDialog.js +88 -86
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/ResizeSeparator.js +81 -0
- package/dist/browser/layout/ResizeSeparator.js.map +1 -0
- package/dist/browser/layout/SettingsModal.js +2 -2
- package/dist/browser/layout/SettingsModal.js.map +1 -1
- package/dist/browser/layout/SidebarSwitcher.js +19 -11
- package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
- package/dist/browser/layout/TabBar.js +16 -13
- package/dist/browser/layout/TabBar.js.map +1 -1
- package/dist/browser/layout/app-host-width.js +44 -0
- package/dist/browser/layout/app-host-width.js.map +1 -0
- package/dist/browser/layout/app-workspace-controller.js +337 -44
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/index.js +4 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/resize-separator.js +90 -0
- package/dist/browser/layout/resize-separator.js.map +1 -0
- package/dist/browser/layout/workspace-messages.js +12 -2
- package/dist/browser/layout/workspace-messages.js.map +1 -1
- package/dist/browser/surfaces/LinkCard.js +1 -1
- package/dist/browser/surfaces/LinkCard.js.map +1 -1
- package/dist/browser/surfaces/Placeholder.js +45 -11
- package/dist/browser/surfaces/Placeholder.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +23 -0
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/browser/widgets/Widget.js +1 -1
- package/dist/browser/widgets/Widget.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js +5 -0
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/DragAndDrop.js +63 -0
- package/dist/ssr/actions/DragAndDrop.js.map +1 -0
- package/dist/ssr/actions/Dropdown.js +5 -2
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/FilterChip.js +59 -7
- package/dist/ssr/actions/FilterChip.js.map +1 -1
- package/dist/ssr/actions/GestureMenu.js +26 -3
- package/dist/ssr/actions/GestureMenu.js.map +1 -1
- package/dist/ssr/actions/SegmentedControl.js +1 -2
- package/dist/ssr/actions/SegmentedControl.js.map +1 -1
- package/dist/ssr/actions/SpotlightSearch.js +2 -2
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
- package/dist/ssr/actions/Tabs.js +2 -2
- package/dist/ssr/actions/Tabs.js.map +1 -1
- package/dist/ssr/actions/ViewTabs.js +211 -0
- package/dist/ssr/actions/ViewTabs.js.map +1 -0
- package/dist/ssr/actions/drag-and-drop-messages.js +75 -0
- package/dist/ssr/actions/drag-and-drop-messages.js.map +1 -0
- package/dist/ssr/actions/drag-and-drop.js +692 -0
- package/dist/ssr/actions/drag-and-drop.js.map +1 -0
- package/dist/ssr/actions/filter-messages.js +6 -2
- package/dist/ssr/actions/filter-messages.js.map +1 -1
- package/dist/ssr/actions/index.js +3 -1
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/chat/ChatComposer.js +668 -136
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatDecision.js +479 -0
- package/dist/ssr/chat/ChatDecision.js.map +1 -0
- package/dist/ssr/chat/ChatPrimitives.js +95 -24
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
- package/dist/ssr/chat/ChatTimeline.js.map +1 -1
- package/dist/ssr/chat/chat-messages.js +14 -0
- package/dist/ssr/chat/chat-messages.js.map +1 -1
- package/dist/ssr/chat/command-search.js +35 -17
- package/dist/ssr/chat/command-search.js.map +1 -1
- package/dist/ssr/chat/index.js +10 -3
- package/dist/ssr/chat/index.js.map +1 -1
- package/dist/ssr/chat/types.js.map +1 -1
- package/dist/ssr/content/Calendar.js +112 -103
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/CalendarWeekView.js +42 -28
- package/dist/ssr/content/CalendarWeekView.js.map +1 -1
- package/dist/ssr/content/Chart.js +19 -23
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/DataTable.js +78 -31
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/FileBrowser.js +2 -2
- package/dist/ssr/content/FileBrowser.js.map +1 -1
- package/dist/ssr/content/FileTree.js +21 -14
- package/dist/ssr/content/FileTree.js.map +1 -1
- package/dist/ssr/content/FileTypeIcon.js +50 -0
- package/dist/ssr/content/FileTypeIcon.js.map +1 -0
- package/dist/ssr/content/FileView.js +2 -2
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/ReferenceChip.js +121 -0
- package/dist/ssr/content/ReferenceChip.js.map +1 -0
- package/dist/ssr/content/calendar-pointer.js +9 -0
- package/dist/ssr/content/calendar-pointer.js.map +1 -1
- package/dist/ssr/content/calendar-time-view.js +6 -3
- package/dist/ssr/content/calendar-time-view.js.map +1 -1
- package/dist/ssr/content/data-table-messages.js +4 -2
- package/dist/ssr/content/data-table-messages.js.map +1 -1
- package/dist/ssr/content/index.js +2 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/feedback/MovedHint.js +166 -0
- package/dist/ssr/feedback/MovedHint.js.map +1 -0
- package/dist/ssr/feedback/dialog-core.js +66 -9
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/feedback/index.js +1 -0
- package/dist/ssr/feedback/index.js.map +1 -1
- package/dist/ssr/feedback/prompts.js +6 -1
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +138 -69
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/date-picker.js +59 -5
- package/dist/ssr/inputs/date-picker.js.map +1 -1
- package/dist/ssr/intl/messages.js +12 -0
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/intl/weekend.js +39 -0
- package/dist/ssr/intl/weekend.js.map +1 -0
- package/dist/ssr/layout/AppOverview.js +1 -2
- package/dist/ssr/layout/AppOverview.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +457 -116
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/PageTitle.js +3 -2
- package/dist/ssr/layout/PageTitle.js.map +1 -1
- package/dist/ssr/layout/PanelDialog.js +7 -6
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/ResizeSeparator.js +45 -0
- package/dist/ssr/layout/ResizeSeparator.js.map +1 -0
- package/dist/ssr/layout/SettingsModal.js +2 -2
- package/dist/ssr/layout/SettingsModal.js.map +1 -1
- package/dist/ssr/layout/SidebarSwitcher.js +19 -11
- package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
- package/dist/ssr/layout/TabBar.js +2 -2
- package/dist/ssr/layout/TabBar.js.map +1 -1
- package/dist/ssr/layout/app-host-width.js +44 -0
- package/dist/ssr/layout/app-host-width.js.map +1 -0
- package/dist/ssr/layout/app-workspace-controller.js +337 -44
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/index.js +4 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/resize-separator.js +90 -0
- package/dist/ssr/layout/resize-separator.js.map +1 -0
- package/dist/ssr/layout/workspace-messages.js +12 -2
- package/dist/ssr/layout/workspace-messages.js.map +1 -1
- package/dist/ssr/surfaces/LinkCard.js +1 -1
- package/dist/ssr/surfaces/LinkCard.js.map +1 -1
- package/dist/ssr/surfaces/Placeholder.js +25 -6
- package/dist/ssr/surfaces/Placeholder.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +23 -0
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/widgets/Widget.js +1 -1
- package/dist/ssr/widgets/Widget.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/ContextMenu.d.ts +1 -0
- package/dist/types/actions/DragAndDrop.d.ts +29 -0
- package/dist/types/actions/Dropdown.d.ts +4 -0
- package/dist/types/actions/FilterChip.d.ts +22 -0
- package/dist/types/actions/ViewTabs.d.ts +30 -0
- package/dist/types/actions/drag-and-drop-messages.d.ts +35 -0
- package/dist/types/actions/drag-and-drop.d.ts +36 -0
- package/dist/types/actions/filter-messages.d.ts +2 -0
- package/dist/types/actions/index.d.ts +6 -2
- package/dist/types/chat/ChatComposer.d.ts +71 -1
- package/dist/types/chat/ChatDecision.d.ts +149 -0
- package/dist/types/chat/ChatPrimitives.d.ts +14 -1
- package/dist/types/chat/ChatTimeline.d.ts +2 -1
- package/dist/types/chat/chat-messages.d.ts +7 -0
- package/dist/types/chat/command-search.d.ts +5 -0
- package/dist/types/chat/index.d.ts +28 -5
- package/dist/types/chat/types.d.ts +54 -1
- package/dist/types/content/Chart.d.ts +9 -3
- package/dist/types/content/DataTable.d.ts +3 -0
- package/dist/types/content/FileTypeIcon.d.ts +27 -0
- package/dist/types/content/ReferenceChip.d.ts +49 -0
- package/dist/types/content/calendar-pointer.d.ts +6 -0
- package/dist/types/content/data-table-messages.d.ts +1 -0
- package/dist/types/content/index.d.ts +3 -0
- package/dist/types/feedback/MovedHint.d.ts +25 -0
- package/dist/types/feedback/dialog-core.d.ts +5 -2
- package/dist/types/feedback/index.d.ts +2 -0
- package/dist/types/feedback/prompts.d.ts +2 -0
- package/dist/types/inputs/DatePicker.d.ts +7 -0
- package/dist/types/inputs/date-picker.d.ts +25 -1
- package/dist/types/intl/messages.d.ts +6 -0
- package/dist/types/intl/weekend.d.ts +12 -0
- package/dist/types/layout/AppWorkspace.d.ts +48 -10
- package/dist/types/layout/ResizeSeparator.d.ts +9 -0
- package/dist/types/layout/TabBar.d.ts +7 -0
- package/dist/types/layout/app-host-width.d.ts +6 -0
- package/dist/types/layout/app-workspace-controller.d.ts +2 -0
- package/dist/types/layout/index.d.ts +5 -2
- package/dist/types/layout/resize-separator.d.ts +18 -0
- package/dist/types/layout/workspace-messages.d.ts +5 -0
- package/dist/types/surfaces/Placeholder.d.ts +2 -1
- package/dist/types/surfaces/StatCell.d.ts +6 -0
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/FileTree.tsx"],"sourcesContent":["/**\n * FileTree — path-first tree over a flat entry list (folders derived from\n * paths, explicit folder entries allowed for empty dirs). Capabilities are\n * enabled by the presence of action callbacks; without them the tree is a\n * pure read-only browser. Context menus render through the platform\n * ContextMenu. Minimal look: text rows, bevel on selection, no hover motion.\n */\nimport { fileIcons } from \"@k2b/stdlib\";\nimport { createEffect, createMemo, createSignal, For, Show } from \"solid-js\";\nimport ContextMenu from \"../actions/ContextMenu\";\nimport Dropdown, { type DropdownItem } from \"../actions/Dropdown\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { useFileBrowserMessages } from \"./file-browser-messages\";\nimport { allFolderPaths, buildTree, type FileTreeEntry, flattenVisible, parentOf, type TreeNode } from \"./file-tree\";\n\nexport type { FileTreeEntry } from \"./file-tree\";\n\n/**\n * `fileIcons` (and app-supplied entry icons) may carry Tailwind colour classes.\n * @k2b/ui ships no Tailwind utilities, so only the `ti-*` glyph is kept — the\n * row owns the icon colour.\n */\nconst glyphOnly = (icon: string): string =>\n icon\n .split(/\\s+/)\n .filter((token) => token.startsWith(\"ti-\"))\n .join(\" \");\n\n/** Presence of a callback enables the matching UI affordance. */\nexport type FileTreeActions = {\n rename?: (path: string, nextName: string) => void | Promise<void>;\n remove?: (path: string) => void | Promise<void>;\n createFile?: (dirPath: string) => void | Promise<void>;\n createFolder?: (dirPath: string) => void | Promise<void>;\n /** Enables drag & drop of files and folders onto folders (and the tree root). */\n move?: (path: string, targetDir: string) => void | Promise<void>;\n /** Download menu entry — folders arrive as \"Download as ZIP\". */\n download?: (path: string, isFolder: boolean) => void | Promise<void>;\n};\n\nexport type FileTreeProps = {\n entries: FileTreeEntry[];\n selectedPath?: string | null;\n onSelect?: (entry: FileTreeEntry) => void;\n /** Controlled expansion; omit for internal state (folders start expanded). */\n expandedPaths?: Set<string>;\n onExpandedChange?: (expanded: Set<string>) => void;\n /** Extra context-menu items per entry, merged above the built-in actions. */\n contextMenu?: (entry: FileTreeEntry) => DropdownItem[];\n actions?: FileTreeActions;\n /** Accessible name for the tree. */\n label?: string;\n class?: string;\n};\n\nexport default function FileTree(props: FileTreeProps) {\n const messages = useUiMessages();\n const fileBrowserMessages = useFileBrowserMessages();\n let previousTree: TreeNode[] = [];\n const tree = createMemo(() => (previousTree = buildTree(props.entries, previousTree)));\n\n const [internalExpanded, setInternalExpanded] = createSignal<Set<string>>(new Set(allFolderPaths(tree())), { equals: false });\n // Newly appearing folders start expanded in uncontrolled mode.\n createEffect((previous: Set<string>) => {\n const current = new Set(allFolderPaths(tree()));\n const added = [...current].filter((path) => !previous.has(path));\n if (added.length > 0 && !props.expandedPaths) setInternalExpanded((expanded) => new Set([...expanded, ...added]));\n return current;\n }, new Set<string>());\n\n const expanded = () => props.expandedPaths ?? internalExpanded();\n const setExpanded = (next: Set<string>) => {\n if (props.onExpandedChange) props.onExpandedChange(next);\n if (!props.expandedPaths) setInternalExpanded(next);\n };\n const toggleFolder = (path: string) => {\n const next = new Set(expanded());\n if (next.has(path)) next.delete(path);\n else next.add(path);\n setExpanded(next);\n };\n\n const visible = createMemo(() => flattenVisible(tree(), expanded()));\n const [renamingPath, setRenamingPath] = createSignal<string | null>(null);\n const [renameDraft, setRenameDraft] = createSignal(\"\");\n const [focusedPath, setFocusedPath] = createSignal(props.selectedPath ?? \"\");\n const [pendingFocusPath, setPendingFocusPath] = createSignal<string | null>(null);\n const [contextPath, setContextPath] = createSignal<string | null>(props.selectedPath ?? null);\n const [contextMenuOpen, setContextMenuOpen] = createSignal(false);\n const rowRefs = new Map<string, HTMLLIElement>();\n /** Folder currently hovered by a drag (\"/\" = tree root). */\n const [dropTarget, setDropTarget] = createSignal<string | null>(null);\n\n const focusRow = (path: string, restoreDomFocus = true) => {\n setFocusedPath(path);\n if (!restoreDomFocus) return;\n const row = rowRefs.get(path);\n if (row?.isConnected) row.focus();\n else queueMicrotask(() => rowRefs.get(path)?.focus());\n };\n\n createEffect(() => {\n const rows = visible();\n const paths = new Set(rows.map((node) => node.entry.path));\n for (const path of rowRefs.keys()) if (!paths.has(path)) rowRefs.delete(path);\n const pending = pendingFocusPath();\n if (pending && rows.some((node) => node.entry.path === pending)) {\n setPendingFocusPath(null);\n focusRow(pending);\n return;\n }\n if (rows.some((node) => node.entry.path === focusedPath())) return;\n const selected = rows.find((node) => node.entry.path === props.selectedPath);\n setFocusedPath(selected?.entry.path ?? rows[0]?.entry.path ?? \"\");\n });\n\n const DRAG_MIME = \"application/x-filetree-path\";\n const canDrop = (event: DragEvent) => props.actions?.move && event.dataTransfer?.types.includes(DRAG_MIME);\n const handleDrop = (event: DragEvent, targetDir: string) => {\n event.preventDefault();\n event.stopPropagation();\n setDropTarget(null);\n const path = event.dataTransfer?.getData(DRAG_MIME);\n if (!path || parentOf(path) === targetDir || path === targetDir || targetDir.startsWith(`${path}/`)) return;\n void props.actions?.move?.(path, targetDir);\n };\n\n const select = (node: TreeNode) => {\n if (node.isFolder) toggleFolder(node.entry.path);\n else props.onSelect?.(node.entry);\n };\n\n const commitRename = async (node: TreeNode, value: string) => {\n if (renamingPath() !== node.entry.path) return;\n setRenamingPath(null);\n const nextName = value.trim();\n focusRow(node.entry.path);\n if (!nextName || nextName === node.name || nextName.includes(\"/\")) return;\n const parent = parentOf(node.entry.path);\n setPendingFocusPath(`${parent === \"/\" ? \"\" : parent}/${nextName}`);\n await props.actions?.rename?.(node.entry.path, nextName);\n };\n\n const cancelRename = (node: TreeNode) => {\n setRenamingPath(null);\n focusRow(node.entry.path);\n };\n\n const beginRename = (node: TreeNode) => {\n setRenameDraft(node.name);\n setRenamingPath(node.entry.path);\n };\n\n const menuItems = (node: TreeNode): DropdownItem[] => {\n tree();\n const items: DropdownItem[] = [...(props.contextMenu?.(node.entry) ?? [])];\n if (node.isFolder && props.actions?.createFile) {\n items.push({\n icon: \"ti ti-file-plus\",\n label: fileBrowserMessages().newFile,\n action: () => void props.actions?.createFile?.(node.entry.path),\n });\n }\n if (node.isFolder && props.actions?.createFolder) {\n items.push({\n icon: \"ti ti-folder-plus\",\n label: fileBrowserMessages().newFolder,\n action: () => void props.actions?.createFolder?.(node.entry.path),\n });\n }\n if (props.actions?.download) {\n items.push({\n icon: node.isFolder ? \"ti ti-file-zip\" : \"ti ti-download\",\n label: node.isFolder ? fileBrowserMessages().downloadAsZip : messages().download,\n action: () => void props.actions?.download?.(node.entry.path, node.isFolder),\n });\n }\n if (!node.isFolder && props.actions?.rename) {\n items.push({ icon: \"ti ti-cursor-text\", label: fileBrowserMessages().rename, action: () => beginRename(node) });\n }\n if (props.actions?.remove) {\n items.push({\n icon: \"ti ti-trash\",\n label: messages().delete,\n variant: \"danger\",\n action: () => void props.actions?.remove?.(node.entry.path),\n });\n }\n return items;\n };\n\n const contextNode = createMemo(() => visible().find((node) => node.entry.path === contextPath()));\n const contextItems = createMemo(() => {\n const node = contextNode();\n return node ? menuItems(node) : [];\n });\n\n const onKeyDown = (event: KeyboardEvent, node: TreeNode) => {\n if (renamingPath()) return;\n const target = event.target;\n if (target instanceof Element && target !== rowRefs.get(node.entry.path)) return;\n const rows = visible();\n const index = rows.findIndex((row) => row.entry.path === node.entry.path);\n const focus = (next: TreeNode | undefined) => {\n if (!next) return;\n focusRow(next.entry.path);\n };\n if (event.key === \"ContextMenu\" || (event.shiftKey && event.key === \"F10\")) {\n setContextPath(node.entry.path);\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n focus(rows[Math.min(index + 1, rows.length - 1)] ?? rows[0]);\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n focus(rows[Math.max(index - 1, 0)] ?? rows[0]);\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focus(rows[event.key === \"Home\" ? 0 : rows.length - 1]);\n } else if (event.key === \"ArrowRight\" && node.isFolder) {\n event.preventDefault();\n if (!expanded().has(node.entry.path)) toggleFolder(node.entry.path);\n else focus(rows[index + 1]?.depth === node.depth + 1 ? rows[index + 1] : undefined);\n } else if (event.key === \"ArrowLeft\" && node.isFolder && expanded().has(node.entry.path)) {\n event.preventDefault();\n toggleFolder(node.entry.path);\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n const parent = parentOf(node.entry.path);\n focus(rows.find((row) => row.entry.path === parent));\n } else if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n select(node);\n } else if (event.key === \"F2\" && !node.isFolder && props.actions?.rename) {\n event.preventDefault();\n beginRename(node);\n }\n };\n\n return (\n <ContextMenu\n class=\"k2b-content-file-tree__context-host\"\n tabIndex={-1}\n label={contextNode() ? fileBrowserMessages().actionsFor({ name: contextNode()!.name }) : fileBrowserMessages().fileActions}\n items={contextItems()}\n disabled={contextItems().length === 0}\n onOpen={() => setContextMenuOpen(true)}\n onClose={() => {\n setContextMenuOpen(false);\n const path = contextPath();\n if (path) focusRow(path);\n }}\n >\n <ul\n class={`k2b-content-file-tree ${props.class ?? \"\"}`}\n data-drop-root={dropTarget() === \"/\" ? \"true\" : undefined}\n role=\"tree\"\n aria-label={props.label ?? fileBrowserMessages().files}\n onDragOver={(event) => {\n if (!canDrop(event)) return;\n event.preventDefault();\n if (dropTarget() === null) setDropTarget(\"/\");\n }}\n onDragLeave={(event) => {\n if (event.currentTarget === event.target) setDropTarget(null);\n }}\n onDrop={(event) => handleDrop(event, \"/\")}\n >\n <For each={visible()}>\n {(node) => {\n const currentNode = () => {\n tree();\n return node;\n };\n const isSelected = () => props.selectedPath === currentNode().entry.path;\n const isDropTarget = () => currentNode().isFolder && dropTarget() === currentNode().entry.path;\n const icon = () =>\n currentNode().isFolder\n ? expanded().has(currentNode().entry.path)\n ? \"ti-folder-open\"\n : \"ti-folder\"\n : glyphOnly(\n currentNode().entry.icon ??\n fileIcons.getFileIcon({\n name: currentNode().name,\n type: \"file\",\n mimeType: currentNode().entry.mediaType ?? \"text/plain\",\n }),\n );\n const hasItems = () => menuItems(node).length > 0;\n return (\n <li\n ref={(element) => {\n rowRefs.set(node.entry.path, element);\n }}\n class=\"k2b-content-file-tree__item\"\n role=\"treeitem\"\n tabIndex={renamingPath() === node.entry.path ? -1 : focusedPath() === node.entry.path ? 0 : -1}\n aria-label={currentNode().entry.displayName ?? currentNode().name}\n aria-level={currentNode().depth + 1}\n aria-selected={isSelected()}\n aria-expanded={currentNode().isFolder ? expanded().has(currentNode().entry.path) : undefined}\n aria-haspopup={hasItems() ? \"menu\" : undefined}\n data-context-open={contextMenuOpen() && contextPath() === node.entry.path ? \"true\" : undefined}\n onFocus={() => {\n setFocusedPath(node.entry.path);\n setContextPath(node.entry.path);\n }}\n onKeyDown={(event) => onKeyDown(event, node)}\n onContextMenu={() => setContextPath(node.entry.path)}\n >\n <Show\n when={renamingPath() === node.entry.path}\n fallback={\n <div\n data-state={isSelected() ? \"selected\" : isDropTarget() ? \"drop-target\" : \"idle\"}\n class=\"k2b-content-file-tree__row\"\n >\n <button\n type=\"button\"\n tabIndex={-1}\n class=\"k2b-content-file-tree__select\"\n style={{ \"padding-left\": `${6 + currentNode().depth * 14}px` }}\n title={currentNode().entry.path}\n draggable={Boolean(props.actions?.move)}\n onDragStart={(event) => event.dataTransfer?.setData(DRAG_MIME, node.entry.path)}\n onDragOver={(event) => {\n if (!node.isFolder || !canDrop(event)) return;\n event.preventDefault();\n event.stopPropagation();\n setDropTarget(node.entry.path);\n }}\n onDragLeave={() => {\n if (isDropTarget()) setDropTarget(null);\n }}\n onDrop={(event) => node.isFolder && handleDrop(event, node.entry.path)}\n onClick={(event) => {\n event.currentTarget.closest<HTMLElement>('[role=\"treeitem\"]')?.focus();\n select(node);\n }}\n >\n <i class={`ti ${icon()} k2b-content-file-tree__icon`} aria-hidden=\"true\" />\n <span class=\"k2b-content-file-tree__name\">{currentNode().entry.displayName ?? currentNode().name}</span>\n <Show when={currentNode().entry.badge}>\n <span class=\"k2b-content-file-tree__badge\">{currentNode().entry.badge}</span>\n </Show>\n </button>\n <Show when={hasItems()}>\n <Dropdown.Root position=\"bottom-left\" items={menuItems(node)} label={`Actions for ${currentNode().name}`}>\n <Dropdown.Trigger\n appearance=\"plain\"\n tabIndex={-1}\n class=\"k2b-content-file-tree__actions\"\n label={`Actions for ${currentNode().name}`}\n tooltip={messages().actions}\n >\n <i class=\"ti ti-dots\" aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">Actions for {currentNode().name}</span>\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </div>\n }\n >\n <input\n class=\"k2b-content-file-tree__rename\"\n style={{\n \"margin-left\": `${6 + currentNode().depth * 14}px`,\n width: `calc(100% - ${6 + currentNode().depth * 14}px)`,\n }}\n value={renameDraft()}\n ref={(element) =>\n requestAnimationFrame(() => {\n element.focus();\n element.select();\n })\n }\n onInput={(event) => setRenameDraft(event.currentTarget.value)}\n onKeyDown={(event) => {\n event.stopPropagation();\n if (event.key === \"Enter\") void commitRename(node, event.currentTarget.value);\n if (event.key === \"Escape\") cancelRename(node);\n }}\n onBlur={(event) => void commitRename(node, event.currentTarget.value)}\n />\n </Show>\n </li>\n );\n }}\n </For>\n </ul>\n </ContextMenu>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/FileTree.tsx"],"sourcesContent":["/**\n * FileTree — path-first tree over a flat entry list (folders derived from\n * paths, explicit folder entries allowed for empty dirs). Capabilities are\n * enabled by the presence of action callbacks; without them the tree is a\n * pure read-only browser. Context menus render through the platform\n * ContextMenu. Minimal look: text rows, bevel on selection, no hover motion.\n */\nimport { createEffect, createMemo, createSignal, For, Show } from \"solid-js\";\nimport ContextMenu from \"../actions/ContextMenu\";\nimport Dropdown, { type DropdownItem } from \"../actions/Dropdown\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { FileTypeIcon } from \"./FileTypeIcon\";\nimport { useFileBrowserMessages } from \"./file-browser-messages\";\nimport { allFolderPaths, buildTree, type FileTreeEntry, flattenVisible, parentOf, type TreeNode } from \"./file-tree\";\n\nexport type { FileTreeEntry } from \"./file-tree\";\n\n/** Presence of a callback enables the matching UI affordance. */\nexport type FileTreeActions = {\n rename?: (path: string, nextName: string) => void | Promise<void>;\n remove?: (path: string) => void | Promise<void>;\n createFile?: (dirPath: string) => void | Promise<void>;\n createFolder?: (dirPath: string) => void | Promise<void>;\n /** Enables drag & drop of files and folders onto folders (and the tree root). */\n move?: (path: string, targetDir: string) => void | Promise<void>;\n /** Download menu entry — folders arrive as \"Download as ZIP\". */\n download?: (path: string, isFolder: boolean) => void | Promise<void>;\n};\n\nexport type FileTreeProps = {\n entries: FileTreeEntry[];\n selectedPath?: string | null;\n onSelect?: (entry: FileTreeEntry) => void;\n /** Controlled expansion; omit for internal state (folders start expanded). */\n expandedPaths?: Set<string>;\n onExpandedChange?: (expanded: Set<string>) => void;\n /** Extra context-menu items per entry, merged above the built-in actions. */\n contextMenu?: (entry: FileTreeEntry) => DropdownItem[];\n actions?: FileTreeActions;\n /** Accessible name for the tree. */\n label?: string;\n class?: string;\n};\n\nexport default function FileTree(props: FileTreeProps) {\n const messages = useUiMessages();\n const fileBrowserMessages = useFileBrowserMessages();\n let previousTree: TreeNode[] = [];\n const tree = createMemo(() => (previousTree = buildTree(props.entries, previousTree)));\n\n const [internalExpanded, setInternalExpanded] = createSignal<Set<string>>(new Set(allFolderPaths(tree())), { equals: false });\n // Newly appearing folders start expanded in uncontrolled mode.\n createEffect((previous: Set<string>) => {\n const current = new Set(allFolderPaths(tree()));\n const added = [...current].filter((path) => !previous.has(path));\n if (added.length > 0 && !props.expandedPaths) setInternalExpanded((expanded) => new Set([...expanded, ...added]));\n return current;\n }, new Set<string>());\n\n const expanded = () => props.expandedPaths ?? internalExpanded();\n const setExpanded = (next: Set<string>) => {\n if (props.onExpandedChange) props.onExpandedChange(next);\n if (!props.expandedPaths) setInternalExpanded(next);\n };\n const toggleFolder = (path: string) => {\n const next = new Set(expanded());\n if (next.has(path)) next.delete(path);\n else next.add(path);\n setExpanded(next);\n };\n\n const visible = createMemo(() => flattenVisible(tree(), expanded()));\n const [renamingPath, setRenamingPath] = createSignal<string | null>(null);\n const [renameDraft, setRenameDraft] = createSignal(\"\");\n const [focusedPath, setFocusedPath] = createSignal(props.selectedPath ?? \"\");\n const [pendingFocusPath, setPendingFocusPath] = createSignal<string | null>(null);\n const [contextPath, setContextPath] = createSignal<string | null>(props.selectedPath ?? null);\n const [contextMenuOpen, setContextMenuOpen] = createSignal(false);\n const rowRefs = new Map<string, HTMLLIElement>();\n /** Folder currently hovered by a drag (\"/\" = tree root). */\n const [dropTarget, setDropTarget] = createSignal<string | null>(null);\n\n const focusRow = (path: string, restoreDomFocus = true) => {\n setFocusedPath(path);\n if (!restoreDomFocus) return;\n const row = rowRefs.get(path);\n if (row?.isConnected) row.focus();\n else queueMicrotask(() => rowRefs.get(path)?.focus());\n };\n\n createEffect(() => {\n const rows = visible();\n const paths = new Set(rows.map((node) => node.entry.path));\n for (const path of rowRefs.keys()) if (!paths.has(path)) rowRefs.delete(path);\n const pending = pendingFocusPath();\n if (pending && rows.some((node) => node.entry.path === pending)) {\n setPendingFocusPath(null);\n focusRow(pending);\n return;\n }\n if (rows.some((node) => node.entry.path === focusedPath())) return;\n const selected = rows.find((node) => node.entry.path === props.selectedPath);\n setFocusedPath(selected?.entry.path ?? rows[0]?.entry.path ?? \"\");\n });\n\n const DRAG_MIME = \"application/x-filetree-path\";\n const canDrop = (event: DragEvent) => props.actions?.move && event.dataTransfer?.types.includes(DRAG_MIME);\n const handleDrop = (event: DragEvent, targetDir: string) => {\n event.preventDefault();\n event.stopPropagation();\n setDropTarget(null);\n const path = event.dataTransfer?.getData(DRAG_MIME);\n if (!path || parentOf(path) === targetDir || path === targetDir || targetDir.startsWith(`${path}/`)) return;\n void props.actions?.move?.(path, targetDir);\n };\n\n const select = (node: TreeNode) => {\n if (node.isFolder) toggleFolder(node.entry.path);\n else props.onSelect?.(node.entry);\n };\n\n const commitRename = async (node: TreeNode, value: string) => {\n if (renamingPath() !== node.entry.path) return;\n setRenamingPath(null);\n const nextName = value.trim();\n focusRow(node.entry.path);\n if (!nextName || nextName === node.name || nextName.includes(\"/\")) return;\n const parent = parentOf(node.entry.path);\n setPendingFocusPath(`${parent === \"/\" ? \"\" : parent}/${nextName}`);\n await props.actions?.rename?.(node.entry.path, nextName);\n };\n\n const cancelRename = (node: TreeNode) => {\n setRenamingPath(null);\n focusRow(node.entry.path);\n };\n\n const beginRename = (node: TreeNode) => {\n setRenameDraft(node.name);\n setRenamingPath(node.entry.path);\n };\n\n const menuItems = (node: TreeNode): DropdownItem[] => {\n tree();\n const items: DropdownItem[] = [...(props.contextMenu?.(node.entry) ?? [])];\n if (node.isFolder && props.actions?.createFile) {\n items.push({\n icon: \"ti ti-file-plus\",\n label: fileBrowserMessages().newFile,\n action: () => void props.actions?.createFile?.(node.entry.path),\n });\n }\n if (node.isFolder && props.actions?.createFolder) {\n items.push({\n icon: \"ti ti-folder-plus\",\n label: fileBrowserMessages().newFolder,\n action: () => void props.actions?.createFolder?.(node.entry.path),\n });\n }\n if (props.actions?.download) {\n items.push({\n icon: node.isFolder ? \"ti ti-file-zip\" : \"ti ti-download\",\n label: node.isFolder ? fileBrowserMessages().downloadAsZip : messages().download,\n action: () => void props.actions?.download?.(node.entry.path, node.isFolder),\n });\n }\n if (!node.isFolder && props.actions?.rename) {\n items.push({ icon: \"ti ti-cursor-text\", label: fileBrowserMessages().rename, action: () => beginRename(node) });\n }\n if (props.actions?.remove) {\n items.push({\n icon: \"ti ti-trash\",\n label: messages().delete,\n variant: \"danger\",\n action: () => void props.actions?.remove?.(node.entry.path),\n });\n }\n return items;\n };\n\n const contextNode = createMemo(() => visible().find((node) => node.entry.path === contextPath()));\n const contextItems = createMemo(() => {\n const node = contextNode();\n return node ? menuItems(node) : [];\n });\n\n const onKeyDown = (event: KeyboardEvent, node: TreeNode) => {\n if (renamingPath()) return;\n const target = event.target;\n if (target instanceof Element && target !== rowRefs.get(node.entry.path)) return;\n const rows = visible();\n const index = rows.findIndex((row) => row.entry.path === node.entry.path);\n const focus = (next: TreeNode | undefined) => {\n if (!next) return;\n focusRow(next.entry.path);\n };\n if (event.key === \"ContextMenu\" || (event.shiftKey && event.key === \"F10\")) {\n setContextPath(node.entry.path);\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n focus(rows[Math.min(index + 1, rows.length - 1)] ?? rows[0]);\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n focus(rows[Math.max(index - 1, 0)] ?? rows[0]);\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focus(rows[event.key === \"Home\" ? 0 : rows.length - 1]);\n } else if (event.key === \"ArrowRight\" && node.isFolder) {\n event.preventDefault();\n if (!expanded().has(node.entry.path)) toggleFolder(node.entry.path);\n else focus(rows[index + 1]?.depth === node.depth + 1 ? rows[index + 1] : undefined);\n } else if (event.key === \"ArrowLeft\" && node.isFolder && expanded().has(node.entry.path)) {\n event.preventDefault();\n toggleFolder(node.entry.path);\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n const parent = parentOf(node.entry.path);\n focus(rows.find((row) => row.entry.path === parent));\n } else if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n select(node);\n } else if (event.key === \"F2\" && !node.isFolder && props.actions?.rename) {\n event.preventDefault();\n beginRename(node);\n }\n };\n\n return (\n <ContextMenu\n class=\"k2b-content-file-tree__context-host\"\n tabIndex={-1}\n label={contextNode() ? fileBrowserMessages().actionsFor({ name: contextNode()!.name }) : fileBrowserMessages().fileActions}\n items={contextItems()}\n disabled={contextItems().length === 0}\n onOpen={() => setContextMenuOpen(true)}\n onClose={() => {\n setContextMenuOpen(false);\n const path = contextPath();\n if (path) focusRow(path);\n }}\n >\n <ul\n class={`k2b-content-file-tree ${props.class ?? \"\"}`}\n data-drop-root={dropTarget() === \"/\" ? \"true\" : undefined}\n role=\"tree\"\n aria-label={props.label ?? fileBrowserMessages().files}\n onDragOver={(event) => {\n if (!canDrop(event)) return;\n event.preventDefault();\n if (dropTarget() === null) setDropTarget(\"/\");\n }}\n onDragLeave={(event) => {\n if (event.currentTarget === event.target) setDropTarget(null);\n }}\n onDrop={(event) => handleDrop(event, \"/\")}\n >\n <For each={visible()}>\n {(node) => {\n const currentNode = () => {\n tree();\n return node;\n };\n const isSelected = () => props.selectedPath === currentNode().entry.path;\n const isDropTarget = () => currentNode().isFolder && dropTarget() === currentNode().entry.path;\n const hasItems = () => menuItems(node).length > 0;\n return (\n <li\n ref={(element) => {\n rowRefs.set(node.entry.path, element);\n }}\n class=\"k2b-content-file-tree__item\"\n role=\"treeitem\"\n tabIndex={renamingPath() === node.entry.path ? -1 : focusedPath() === node.entry.path ? 0 : -1}\n aria-label={currentNode().entry.displayName ?? currentNode().name}\n aria-level={currentNode().depth + 1}\n aria-selected={isSelected()}\n aria-expanded={currentNode().isFolder ? expanded().has(currentNode().entry.path) : undefined}\n aria-haspopup={hasItems() ? \"menu\" : undefined}\n data-context-open={contextMenuOpen() && contextPath() === node.entry.path ? \"true\" : undefined}\n onFocus={() => {\n setFocusedPath(node.entry.path);\n setContextPath(node.entry.path);\n }}\n onKeyDown={(event) => onKeyDown(event, node)}\n onContextMenu={() => setContextPath(node.entry.path)}\n >\n <Show\n when={renamingPath() === node.entry.path}\n fallback={\n <div\n data-state={isSelected() ? \"selected\" : isDropTarget() ? \"drop-target\" : \"idle\"}\n class=\"k2b-content-file-tree__row\"\n >\n <button\n type=\"button\"\n tabIndex={-1}\n class=\"k2b-content-file-tree__select\"\n style={{ \"padding-left\": `${6 + currentNode().depth * 14}px` }}\n title={currentNode().entry.path}\n draggable={Boolean(props.actions?.move)}\n onDragStart={(event) => event.dataTransfer?.setData(DRAG_MIME, node.entry.path)}\n onDragOver={(event) => {\n if (!node.isFolder || !canDrop(event)) return;\n event.preventDefault();\n event.stopPropagation();\n setDropTarget(node.entry.path);\n }}\n onDragLeave={() => {\n if (isDropTarget()) setDropTarget(null);\n }}\n onDrop={(event) => node.isFolder && handleDrop(event, node.entry.path)}\n onClick={(event) => {\n event.currentTarget.closest<HTMLElement>('[role=\"treeitem\"]')?.focus();\n select(node);\n }}\n >\n <FileTypeIcon\n size=\"sm\"\n class=\"k2b-content-file-tree__icon\"\n name={currentNode().name}\n folder={currentNode().isFolder}\n open={currentNode().isFolder && expanded().has(currentNode().entry.path)}\n icon={currentNode().isFolder ? undefined : currentNode().entry.icon}\n mediaType={currentNode().entry.mediaType ?? \"text/plain\"}\n />\n <span class=\"k2b-content-file-tree__name\">{currentNode().entry.displayName ?? currentNode().name}</span>\n <Show when={currentNode().entry.badge}>\n <span class=\"k2b-content-file-tree__badge\">{currentNode().entry.badge}</span>\n </Show>\n </button>\n <Show when={hasItems()}>\n <Dropdown.Root position=\"bottom-left\" items={menuItems(node)} label={`Actions for ${currentNode().name}`}>\n <Dropdown.Trigger\n appearance=\"plain\"\n tabIndex={-1}\n class=\"k2b-content-file-tree__actions\"\n label={`Actions for ${currentNode().name}`}\n tooltip={messages().actions}\n >\n <i class=\"ti ti-dots\" aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">Actions for {currentNode().name}</span>\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </div>\n }\n >\n <input\n class=\"k2b-content-file-tree__rename\"\n style={{\n \"margin-left\": `${6 + currentNode().depth * 14}px`,\n width: `calc(100% - ${6 + currentNode().depth * 14}px)`,\n }}\n value={renameDraft()}\n ref={(element) =>\n requestAnimationFrame(() => {\n element.focus();\n element.select();\n })\n }\n onInput={(event) => setRenameDraft(event.currentTarget.value)}\n onKeyDown={(event) => {\n event.stopPropagation();\n if (event.key === \"Enter\") void commitRename(node, event.currentTarget.value);\n if (event.key === \"Escape\") cancelRename(node);\n }}\n onBlur={(event) => void commitRename(node, event.currentTarget.value)}\n />\n </Show>\n </li>\n );\n }}\n </For>\n </ul>\n </ContextMenu>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { template as _$template } from "solid-js/web";
|
|
2
|
+
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
3
|
+
import { className as _$className } from "solid-js/web";
|
|
4
|
+
import { effect as _$effect } from "solid-js/web";
|
|
5
|
+
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
6
|
+
var _tmpl$ = /*#__PURE__*/_$template(`<span aria-hidden=true><i>`);
|
|
7
|
+
import { fileIcons } from "@k2b/stdlib";
|
|
8
|
+
|
|
9
|
+
/** The colour family a file's icon tile uses. `other` covers code, text, and unknown files. */
|
|
10
|
+
|
|
11
|
+
// Known extensions decide first: a generic media type such as `text/plain` or `text/csv` must not hide a sheet,
|
|
12
|
+
// a slide deck, a document, or an archive behind the neutral family.
|
|
13
|
+
const BY_EXTENSION = new Map([["sheet", ["xls", "xlsx", "ods", "csv"]], ["slides", ["ppt", "pptx", "odp"]], ["document", ["doc", "docx", "odt", "rtf"]], ["archive", ["zip", "tar", "gz", "tgz", "bz2", "xz", "7z", "rar"]]].flatMap(([type, extensions]) => extensions.map(extension => [extension, type])));
|
|
14
|
+
|
|
15
|
+
/** Resolve the colour family for a file or folder from its name and media type. */
|
|
16
|
+
export const fileTypeOf = file => {
|
|
17
|
+
if (file.folder) return "folder";
|
|
18
|
+
const known = BY_EXTENSION.get(file.name.split(".").pop()?.toLowerCase() ?? "");
|
|
19
|
+
if (known) return known;
|
|
20
|
+
const category = fileIcons.getFileCategory({
|
|
21
|
+
name: file.name,
|
|
22
|
+
type: "file",
|
|
23
|
+
mimeType: file.mediaType
|
|
24
|
+
});
|
|
25
|
+
return category === "pdf" || category === "image" || category === "video" || category === "audio" || category === "archive" ? category : "other";
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/** `fileIcons` adds Tailwind colour utilities that @k2b/ui does not ship; only the `ti-*` glyph is kept. */
|
|
29
|
+
const glyph = props => {
|
|
30
|
+
// `fileIcons` looks names up in plain objects, so a name such as `constructor` returns an inherited member
|
|
31
|
+
// instead of a class string; such names fall back to the generic glyph.
|
|
32
|
+
const found = props.icon ?? fileIcons.getFileIcon({
|
|
33
|
+
name: props.name,
|
|
34
|
+
type: props.folder ? "directory" : "file",
|
|
35
|
+
mimeType: props.mediaType
|
|
36
|
+
});
|
|
37
|
+
const icon = (typeof found === "string" ? found : "").split(/\s+/).filter(token => token.startsWith("ti-")).join(" ") || (props.folder ? "ti-folder" : "ti-file");
|
|
38
|
+
return props.folder && props.open ? icon.replace(/\bti-folder$/, "ti-folder-open") : icon;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* A file or folder glyph in a soft chip of its type colour. Folders take the app accent hook
|
|
43
|
+
* `--k2b-app-workspace-active`; code, text, and unknown files a neutral ink. The box size is fixed per `size`.
|
|
44
|
+
*/
|
|
45
|
+
export function FileTypeIcon(props) {
|
|
46
|
+
return (() => {
|
|
47
|
+
var _el$ = _$getNextElement(_tmpl$),
|
|
48
|
+
_el$2 = _el$.firstChild;
|
|
49
|
+
_$effect(_p$ => {
|
|
50
|
+
var _v$ = `k2b-icon-tile k2b-file-type-icon ${props.class ?? ""}`,
|
|
51
|
+
_v$2 = fileTypeOf({
|
|
52
|
+
name: props.name,
|
|
53
|
+
mediaType: props.mediaType,
|
|
54
|
+
folder: props.folder
|
|
55
|
+
}),
|
|
56
|
+
_v$3 = props.size ?? "md",
|
|
57
|
+
_v$4 = `ti ${glyph(props)}`;
|
|
58
|
+
_v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
|
|
59
|
+
_v$2 !== _p$.t && _$setAttribute(_el$, "data-file-type", _p$.t = _v$2);
|
|
60
|
+
_v$3 !== _p$.a && _$setAttribute(_el$, "data-size", _p$.a = _v$3);
|
|
61
|
+
_v$4 !== _p$.o && _$className(_el$2, _p$.o = _v$4);
|
|
62
|
+
return _p$;
|
|
63
|
+
}, {
|
|
64
|
+
e: undefined,
|
|
65
|
+
t: undefined,
|
|
66
|
+
a: undefined,
|
|
67
|
+
o: undefined
|
|
68
|
+
});
|
|
69
|
+
return _el$;
|
|
70
|
+
})();
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=FileTypeIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/FileTypeIcon.tsx"],"sourcesContent":["import { fileIcons } from \"@k2b/stdlib\";\nimport type { JSX } from \"solid-js\";\n\n/** The colour family a file's icon tile uses. `other` covers code, text, and unknown files. */\nexport type FileType = \"folder\" | \"pdf\" | \"image\" | \"sheet\" | \"document\" | \"slides\" | \"video\" | \"audio\" | \"archive\" | \"other\";\n\nexport type FileTypeIconProps = {\n /** The file or folder name; its extension picks the glyph and the type colour. */\n name: string;\n mediaType?: string;\n folder?: boolean;\n /** Shows an open folder, for example the folder a list is showing. */\n open?: boolean;\n /** A Tabler icon class that replaces the glyph the name picks; the type colour still follows the name. */\n icon?: string;\n /** `sm` for tree rows, `md` for list rows, `lg` for grid previews. Defaults to `md`. */\n size?: \"sm\" | \"md\" | \"lg\";\n class?: string;\n};\n\n// Known extensions decide first: a generic media type such as `text/plain` or `text/csv` must not hide a sheet,\n// a slide deck, a document, or an archive behind the neutral family.\nconst BY_EXTENSION = new Map<string, FileType>(\n (\n [\n [\"sheet\", [\"xls\", \"xlsx\", \"ods\", \"csv\"]],\n [\"slides\", [\"ppt\", \"pptx\", \"odp\"]],\n [\"document\", [\"doc\", \"docx\", \"odt\", \"rtf\"]],\n [\"archive\", [\"zip\", \"tar\", \"gz\", \"tgz\", \"bz2\", \"xz\", \"7z\", \"rar\"]],\n ] as const\n ).flatMap(([type, extensions]) => extensions.map((extension) => [extension, type] as const)),\n);\n\n/** Resolve the colour family for a file or folder from its name and media type. */\nexport const fileTypeOf = (file: { name: string; mediaType?: string; folder?: boolean }): FileType => {\n if (file.folder) return \"folder\";\n const known = BY_EXTENSION.get(file.name.split(\".\").pop()?.toLowerCase() ?? \"\");\n if (known) return known;\n const category = fileIcons.getFileCategory({ name: file.name, type: \"file\", mimeType: file.mediaType });\n return category === \"pdf\" || category === \"image\" || category === \"video\" || category === \"audio\" || category === \"archive\"\n ? category\n : \"other\";\n};\n\n/** `fileIcons` adds Tailwind colour utilities that @k2b/ui does not ship; only the `ti-*` glyph is kept. */\nconst glyph = (props: FileTypeIconProps): string => {\n // `fileIcons` looks names up in plain objects, so a name such as `constructor` returns an inherited member\n // instead of a class string; such names fall back to the generic glyph.\n const found: unknown =\n props.icon ?? fileIcons.getFileIcon({ name: props.name, type: props.folder ? \"directory\" : \"file\", mimeType: props.mediaType });\n const icon =\n (typeof found === \"string\" ? found : \"\")\n .split(/\\s+/)\n .filter((token) => token.startsWith(\"ti-\"))\n .join(\" \") || (props.folder ? \"ti-folder\" : \"ti-file\");\n return props.folder && props.open ? icon.replace(/\\bti-folder$/, \"ti-folder-open\") : icon;\n};\n\n/**\n * A file or folder glyph in a soft chip of its type colour. Folders take the app accent hook\n * `--k2b-app-workspace-active`; code, text, and unknown files a neutral ink. The box size is fixed per `size`.\n */\nexport function FileTypeIcon(props: FileTypeIconProps): JSX.Element {\n return (\n <span\n class={`k2b-icon-tile k2b-file-type-icon ${props.class ?? \"\"}`}\n data-file-type={fileTypeOf({ name: props.name, mediaType: props.mediaType, folder: props.folder })}\n data-size={props.size ?? \"md\"}\n aria-hidden=\"true\"\n >\n <i class={`ti ${glyph(props)}`} />\n </span>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1261,7 +1261,7 @@ export default function FileView(props) {
|
|
|
1261
1261
|
},
|
|
1262
1262
|
get children() {
|
|
1263
1263
|
return _$createComponent(Placeholder, {
|
|
1264
|
-
|
|
1264
|
+
state: "loading",
|
|
1265
1265
|
get title() {
|
|
1266
1266
|
return messages().loading;
|
|
1267
1267
|
}
|
|
@@ -1273,7 +1273,7 @@ export default function FileView(props) {
|
|
|
1273
1273
|
},
|
|
1274
1274
|
get children() {
|
|
1275
1275
|
return _$createComponent(Placeholder, {
|
|
1276
|
-
|
|
1276
|
+
state: "error",
|
|
1277
1277
|
get title() {
|
|
1278
1278
|
return fileViewMessages().failedLoadFile;
|
|
1279
1279
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/FileView.tsx"],"sourcesContent":["import { useMarkdownEditorMessages } from \"../inputs/markdown/editor-messages\";\nimport { useDataTableMessages } from \"./data-table-messages\";\nimport { useFileViewMessages } from \"./file-view-messages\";\n/**\n * FileView — renders one file through a small renderer registry keyed by\n * media type / path. Editing is enabled purely by the presence of `save`;\n * without it every renderer is read-only. IDE-style chrome: editors reuse\n * the markdown editor's surface (toolbar with an in-toolbar save, Ctrl/Cmd+S),\n * previews are quiet paper panels with icon-only actions overlaid top-right.\n * A plain preview drops the panel and sits on its host's surface instead.\n * Custom renderers are passed per instance, which keeps SSR requests and\n * independently mounted applications isolated.\n */\n\nimport { mutation } from \"@k2b/stdlib/solid\";\nimport {\n type Component,\n createContext,\n createEffect,\n createMemo,\n createResource,\n createSignal,\n For,\n type JSX,\n Match,\n onCleanup,\n onMount,\n Show,\n Switch,\n untrack,\n useContext,\n} from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { prompts } from \"../feedback/prompts\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { toast } from \"../feedback/toast\";\nimport { MarkdownEditor } from \"../inputs/markdown/MarkdownEditor\";\nimport { Select } from \"../inputs/Select\";\nimport { useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport CodeDisplay, { type CodeDisplayLanguage } from \"./CodeDisplay\";\nimport { type DelimitedPreferences, decodeDelimitedContent, readDelimitedPreferences } from \"./delimited-preferences\";\nimport { type FileViewFile, fileViewExtension, getFileViewPreviewKind, parseDelimitedText } from \"./file-view-preview\";\nimport MarkdownView from \"./MarkdownView\";\nimport { leadingMarkdownTitle } from \"./markdown-title\";\nimport PdfPreview from \"./PdfPreview\";\nimport StructuredDataPreview, { type StructuredDataValue } from \"./StructuredDataPreview\";\nimport VideoPlayer from \"./VideoPlayer\";\n\nexport type { FileViewFile, FileViewPreviewKind } from \"./file-view-preview\";\nexport { canPreviewFile, getFileViewPreviewKind } from \"./file-view-preview\";\nexport type FileViewContent = { encoding: \"utf8\" | \"base64\"; content: string; mediaType: string };\n\nexport type FileViewProps = {\n /**\n * Plain previews inherit the surrounding surface without a frame or inset padding. They keep their natural height,\n * so the host scrolls them and owns the actions around them; a host that stretches one gets its scrolling back.\n */\n variant?: \"default\" | \"plain\";\n /**\n * Lifts a leading Markdown level-one heading into the host, for example a dialog title. Reports its plain text and\n * leaves that heading out of the preview, or reports null when the shown file has none, the heading holds a link or\n * image or is the whole document, or the file fails to load.\n */\n onDocumentTitle?: (title: string | null) => void;\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n load: () => Promise<FileViewContent>;\n /** Refetch the current path when this host-owned revision changes. */\n revision?: unknown;\n /** Register an awaitable refresh for the currently visible preview. */\n registerRefresh?: (refresh: () => Promise<void>) => void | (() => void);\n /** Presence enables editing for text-based renderers. */\n save?: (content: string) => Promise<void>;\n /** Authenticated inline URL used by browser-native image, PDF, audio, and video previews. */\n previewHref?: string | null;\n /** CORS mode for native image/audio/video previews. Omit to preserve browser defaults. */\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n /** Native media failed to load; the host can renew a signed URL and offer retry. */\n onPreviewError?: () => void;\n /** Download actions only; never a preview source, because an attachment response does not render inline. */\n downloadHref?: string | null;\n /** App-specific renderers matched before the built-ins for this instance. */\n renderers?: readonly FileViewRenderer[];\n /** Reports local edit state so a parent browser can guard navigation. */\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\nexport type FileViewRendererProps = {\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n content: FileViewContent;\n previewHref: string | null;\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n onPreviewError?: () => void;\n downloadHref: string | null;\n /** Null when the file is read-only. */\n editor: {\n draft: () => string;\n setDraft: (value: string) => void;\n dirty: () => boolean;\n saving: () => boolean;\n save: () => Promise<void>;\n } | null;\n};\n\nexport type FileViewRenderer = {\n id: string;\n match: (file: FileViewFile, content: FileViewContent) => boolean;\n component: Component<FileViewRendererProps>;\n /** Text renderers that support the edit affordance when `save` is present. */\n editable?: boolean;\n};\n\n/** Instance options that reach the built-in renderers without widening the public renderer props. */\nconst FileViewHost = createContext({ plain: false, liftTitle: false });\n\nconst codeLanguage = (path: string): CodeDisplayLanguage => {\n const extension = fileViewExtension(path);\n if (extension === \"ts\" || extension === \"mts\" || extension === \"cts\") return \"ts\";\n if (extension === \"tsx\") return \"tsx\";\n if (extension === \"js\" || extension === \"mjs\" || extension === \"cjs\") return \"js\";\n if (extension === \"jsx\") return \"jsx\";\n if (extension === \"md\" || extension === \"markdown\") return \"md\";\n return \"text\";\n};\n\nconst isMarkdown = (file: FileViewFile, content: FileViewContent) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"markdown\";\n\n/** Rendered previews hide a leading YAML frontmatter block — it's metadata, not content. */\nconst stripFrontmatter = (text: string): string => {\n const match = /^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/.exec(text.trimStart());\n return match ? text.trimStart().slice(match[0].length) : text;\n};\n\n/** Icon-only download link with the shared tooltip, for toolbars that style their own controls. */\nfunction DownloadLink(props: { class: string; href: string; download: string; label: string; icon: string }) {\n let link: HTMLAnchorElement | undefined;\n return (\n <>\n <a ref={link} class={props.class} href={props.href} download={props.download} aria-label={props.label}>\n <i class={props.icon} aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{props.label}</span>\n </a>\n <Tooltip content={props.label} target={() => link} />\n </>\n );\n}\n\n/** Icon-only action, IDE style — sits in the floating top-right cluster of previews. */\nfunction OverlayAction(props: { icon: string; title: string; onClick?: () => void; href?: string; download?: string }) {\n const classes = \"k2b-content-file-view__action\";\n return (\n <Show\n when={props.href}\n fallback={\n <Tooltip.Trigger type=\"button\" class={classes} content={props.title} aria-label={props.title} onClick={props.onClick}>\n <i class={`ti ${props.icon}`} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n }\n >\n {(href) => (\n <DownloadLink class={classes} href={href()} download={props.download ?? \"\"} label={props.title} icon={`ti ${props.icon}`} />\n )}\n </Show>\n );\n}\n\n/** Scrollable preview panel with the floating action cluster overlaid top-right. */\nfunction OverlayPanel(props: { actions?: JSX.Element; children: JSX.Element }) {\n return (\n <div class=\"k2b-content-file-view__panel\">\n <div class=\"k2b-content-file-view__preview\">{props.children}</div>\n <Show when={props.actions}>\n <div class=\"k2b-content-file-view__overlay\">{props.actions}</div>\n </Show>\n </div>\n );\n}\n\nconst DownloadAction = (props: FileViewRendererProps): JSX.Element => {\n const messages = useUiMessages();\n return (\n <Show when={props.downloadHref}>\n {(href) => (\n <OverlayAction\n icon=\"ti-download\"\n title={messages().download}\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n />\n )}\n </Show>\n );\n};\n\n/** Toolbar-styled icon button — reuses the package markdown-editor tool primitive. */\nfunction EditorToolButton(props: { icon: string; title: string; onClick: () => void; disabled?: boolean }) {\n return (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-markdown-editor__tool\"\n content={props.title}\n aria-label={props.title}\n tabIndex={-1}\n disabled={props.disabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={props.onClick}\n >\n <i class={props.icon} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n );\n}\n\n// ── Built-in renderers ──────────────────────────────────────────────────────\n\nfunction MoreLines(props: { count: number; onClick?: () => void }) {\n const fileViewMessages = useFileViewMessages();\n return (\n <Show when={props.count > 0}>\n <div class=\"k2b-content-file-view__truncated\">\n <Show when={props.onClick} fallback={<span>{fileViewMessages().previewMoreLines(props.count)}</span>}>\n <Button size=\"sm\" variant=\"ghost\" onClick={props.onClick}>\n {fileViewMessages().previewMoreLines(props.count)}\n </Button>\n </Show>\n </div>\n </Show>\n );\n}\nfunction TextExcerpt(props: { renderer: FileViewRendererProps; text: string; markdown?: boolean }) {\n const lines = createMemo(() => props.text.replace(/\\r\\n?/g, \"\\n\").replace(/\\n$/, \"\").split(\"\\n\"));\n const limit = () => (props.renderer.previewLines === undefined ? lines().length : Math.max(1, props.renderer.previewLines));\n const text = () => lines().slice(0, limit()).join(\"\\n\");\n const host = useContext(FileViewHost);\n // A plain preview has no code box: the host frames the file and owns its copy action.\n const content = () => (\n <Show\n when={props.markdown}\n fallback={<CodeDisplay code={text()} language={codeLanguage(props.renderer.file.path)} copy={host.plain ? false : undefined} />}\n >\n <MarkdownView markdown={text()} headingScale={props.renderer.headingScale ?? \"compact\"} />\n </Show>\n );\n // Only an excerpt needs a clipping box; a complete preview keeps its content\n // a direct child of the preview frame, which the frame's styles expect.\n return (\n <>\n <Show when={props.renderer.previewLines !== undefined} fallback={content()}>\n <div class=\"k2b-content-file-view__excerpt\">{content()}</div>\n </Show>\n <MoreLines count={lines().length - limit()} onClick={props.renderer.onExpandPreview} />\n </>\n );\n}\n\nfunction MarkdownRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const host = useContext(FileViewHost);\n const [editing, setEditing] = createSignal(false);\n const markdown = () => {\n const text = stripFrontmatter(props.editor?.draft() ?? props.content.content);\n return host.liftTitle ? (leadingMarkdownTitle(text)?.body ?? text) : text;\n };\n return (\n <Show\n when={props.editor && editing()}\n fallback={\n <OverlayPanel\n actions={\n <>\n <Show when={props.editor}>\n <OverlayAction icon=\"ti-pencil\" title={messages().edit} onClick={() => setEditing(true)} />\n </Show>\n <DownloadAction {...props} />\n </>\n }\n >\n <div class=\"k2b-content-file-view__document\">\n <TextExcerpt renderer={props} text={markdown()} markdown />\n </div>\n </OverlayPanel>\n }\n >\n {(_) => {\n const editor = props.editor!;\n return (\n <div class=\"k2b-content-file-view__editor\">\n <MarkdownEditor\n class=\"k2b-content-file-view__markdown-field\"\n aria-label={`Edit ${props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}`}\n fill\n value={editor.draft()}\n onValueChange={editor.setDraft}\n showStats={false}\n onSave={() => void editor.save()}\n saveDisabled={!editor.dirty()}\n saving={editor.saving()}\n toolbarTrailing={<EditorToolButton icon=\"ti ti-eye\" title={messages().preview} onClick={() => setEditing(false)} />}\n />\n </div>\n );\n }}\n </Show>\n );\n}\n\nfunction TextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const markdownEditorMessages = useMarkdownEditorMessages();\n return (\n <Show\n when={props.editor}\n fallback={\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <TextExcerpt renderer={props} text={props.content.content} />\n </OverlayPanel>\n }\n >\n {(editor) => (\n // Same chrome as the markdown editor — literally the same classes, so\n // border, radius, focus ring, toolbar height and text metrics cannot drift.\n <div class=\"k2b-content-file-view__editor\">\n <div\n class=\"k2b-markdown-editor\"\n data-fill=\"true\"\n role=\"group\"\n aria-label={fileViewMessages().textEditor}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"s\") {\n event.preventDefault();\n if (editor().dirty() && !editor().saving()) void editor().save();\n }\n }}\n >\n {/* No formatting tools here — the divider under an actions-only bar reads lost. */}\n <div class=\"k2b-markdown-editor__toolbar k2b-content-file-view__code-toolbar\">\n <span class=\"k2b-content-file-view__code-language\">{codeLanguage(props.file.path)}</span>\n <span class=\"k2b-markdown-editor__trailing\">\n <Show when={props.downloadHref}>\n {(href) => (\n <DownloadLink\n class=\"k2b-markdown-editor__tool\"\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n label={messages().download}\n icon=\"ti ti-download\"\n />\n )}\n </Show>\n <EditorToolButton\n icon={editor().saving() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-device-floppy\"}\n title={markdownEditorMessages().saveShortcut}\n disabled={!editor().dirty() || editor().saving()}\n onClick={() => void editor().save()}\n />\n </span>\n </div>\n <div class=\"k2b-markdown-editor__surface\">\n <textarea\n class=\"k2b-content-file-view__code-input\"\n value={editor().draft()}\n spellcheck={false}\n onInput={(event) => editor().setDraft(event.currentTarget.value)}\n />\n </div>\n </div>\n </div>\n )}\n </Show>\n );\n}\n\nfunction JsonRenderer(props: FileViewRendererProps) {\n const parsed = createMemo(() => {\n try {\n return { ok: true as const, value: JSON.parse(props.content.content) as StructuredDataValue };\n } catch {\n return { ok: false as const };\n }\n });\n const parsedValue = (): StructuredDataValue => {\n const result = parsed();\n return result.ok ? result.value : null;\n };\n\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__document\">\n <Show when={parsed().ok} fallback={<TextExcerpt renderer={props} text={props.content.content} />}>\n <Show\n when={props.previewLines === undefined}\n fallback={<TextExcerpt renderer={props} text={JSON.stringify(parsedValue(), null, 2)} />}\n >\n <StructuredDataPreview data={parsedValue()} maxRows={200} />\n </Show>\n </Show>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction DelimitedTextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const dataTableMessages = useDataTableMessages();\n const [preferences, setPreferences] = createSignal<DelimitedPreferences>({ encoding: \"utf-8\", delimiter: \"auto\", view: \"table\" });\n onMount(() => {\n if (!props.previewPreferencesKey) return;\n try {\n setPreferences(readDelimitedPreferences(localStorage.getItem(props.previewPreferencesKey)));\n } catch {\n /* Storage may be disabled. */\n }\n });\n const update = (patch: Partial<DelimitedPreferences>) => {\n const next = { ...preferences(), ...patch };\n setPreferences(next);\n if (props.previewPreferencesKey) {\n try {\n localStorage.setItem(props.previewPreferencesKey, JSON.stringify(next));\n } catch {\n /* Keep the local selection. */\n }\n }\n };\n const text = createMemo(() => decodeDelimitedContent(props.content, preferences().encoding));\n const delimiter = () =>\n preferences().delimiter === \"auto\"\n ? fileViewExtension(props.file.path) === \"tsv\" || props.content.mediaType === \"text/tab-separated-values\"\n ? \"\\t\"\n : \",\"\n : preferences().delimiter;\n const [page, setPage] = createSignal(0);\n createEffect(() => {\n text();\n delimiter();\n props.previewLines;\n setPage(0);\n });\n const pageSize = () => (props.previewLines === undefined ? 200 : Math.max(1, props.previewLines));\n const preview = createMemo(() => parseDelimitedText(text(), delimiter(), { rows: pageSize() + 1, offset: page() * pageSize() }));\n const settings = () =>\n prompts.dialog(\n () => (\n <div class=\"k2b-content-file-view__settings\">\n <Select\n label={fileViewMessages().csvEncoding}\n value={preferences().encoding}\n disabled={props.content.encoding !== \"base64\"}\n options={[\"utf-8\", \"windows-1252\", \"utf-16le\", \"utf-16be\"]}\n onValueChange={(value) => {\n if (value) update({ encoding: value });\n }}\n />\n <Select\n label={fileViewMessages().csvSeparator}\n value={preferences().delimiter}\n options={[\n { value: \"auto\", label: fileViewMessages().csvDefaultSeparator },\n { value: \",\", label: fileViewMessages().csvComma },\n { value: \";\", label: fileViewMessages().csvSemicolon },\n { value: \"\\t\", label: fileViewMessages().csvTab },\n { value: \"|\", label: \"|\" },\n ]}\n onValueChange={(value) => {\n if (value) update({ delimiter: value });\n }}\n />\n <Select\n label={fileViewMessages().csvView}\n value={preferences().view}\n options={[\n { value: \"table\", label: dataTableMessages().dataTable },\n { value: \"raw\", label: fileViewMessages().csvRaw },\n ]}\n onValueChange={(value) => {\n if (value === \"table\" || value === \"raw\") update({ view: value });\n }}\n />\n </div>\n ),\n { title: fileViewMessages().csvSettings },\n );\n const headers = createMemo(() => preview().rows[0] ?? []);\n const rows = createMemo(() => preview().rows.slice(1));\n\n return (\n <OverlayPanel\n actions={\n <>\n <OverlayAction icon=\"ti-adjustments-horizontal\" title={fileViewMessages().csvSettings} onClick={() => void settings()} />\n <DownloadAction {...props} />\n </>\n }\n >\n <Show when={preferences().view === \"table\"} fallback={<TextExcerpt renderer={props} text={text()} />}>\n <Show\n when={headers().length > 0}\n fallback={\n <Placeholder icon=\"ti ti-table\" title={fileViewMessages().emptyFile} description={fileViewMessages().delimitedFileEmpty} />\n }\n >\n <div class=\"k2b-content-file-view__sheet\">\n <table class=\"k2b-content-file-view__table\">\n <thead>\n <tr>\n <For each={headers()}>\n {(header, index) => (\n <th scope=\"col\">\n <span>{header || fileViewMessages().column({ number: index() + 1 })}</span>\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={rows()}>\n {(row) => (\n <tr>\n <For each={headers()}>{(_, index) => <td>{row[index()] ?? \"\"}</td>}</For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n <Show when={preview().columnsTruncated}>\n <div class=\"k2b-content-file-view__truncated\">{fileViewMessages().previewColumnsLimited}</div>\n </Show>\n <Show\n when={props.previewLines !== undefined}\n fallback={\n <Show when={preview().totalRows > 201}>\n <div class=\"k2b-content-file-view__pagination\">\n <Button size=\"sm\" variant=\"ghost\" disabled={page() === 0} onClick={() => setPage(page() - 1)}>\n {messages().previous}\n </Button>\n <span>\n {page() * pageSize() + 1}–{Math.min((page() + 1) * pageSize(), preview().totalRows - 1)} / {preview().totalRows - 1}\n </span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={(page() + 1) * pageSize() >= preview().totalRows - 1}\n onClick={() => setPage(page() + 1)}\n >\n {messages().next}\n </Button>\n </div>\n </Show>\n }\n >\n <MoreLines count={preview().totalRows - rows().length - 1} onClick={props.onExpandPreview} />\n </Show>\n </div>\n </Show>\n </Show>\n </OverlayPanel>\n );\n}\n\nconst mediaSource = (props: FileViewRendererProps): string =>\n props.previewHref ?? `data:${props.content.mediaType};base64,${props.content.content}`;\n\nfunction ImageRenderer(props: FileViewRendererProps) {\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\">\n <img crossOrigin={props.crossOrigin} onError={props.onPreviewError} src={mediaSource(props)} alt={props.file.path} />\n </div>\n </OverlayPanel>\n );\n}\n\nconst pdfBlob = (content: FileViewContent): Blob => {\n if (content.encoding === \"utf8\") return new Blob([content.content], { type: \"application/pdf\" });\n const binary = atob(content.content);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);\n return new Blob([bytes], { type: \"application/pdf\" });\n};\n\n/**\n * A host inline URL goes to the browser's native viewer. Without one, the\n * loaded bytes become a local PDF Blob: a download URL is an attachment and\n * would leave a native viewer empty.\n */\nfunction PdfRenderer(props: FileViewRendererProps) {\n const fileViewMessages = useFileViewMessages();\n // A new Blob remounts the preview, so changed bytes show the new file. A revision refetch\n // often returns the same bytes (the Assistant refetches on every tool step); keeping the\n // Blob then keeps the reader's page instead of reloading the viewer.\n const bytes = createMemo(() => props.content, undefined, {\n equals: (previous, next) => previous.encoding === next.encoding && previous.content === next.content,\n });\n const blob = createMemo(() => (props.previewHref || !bytes().content ? null : pdfBlob(bytes())));\n return (\n <Show\n when={props.previewHref}\n fallback={\n <Show\n keyed\n when={blob()}\n fallback={<Placeholder icon=\"ti ti-file-type-pdf\" title=\"PDF\" description={fileViewMessages().noInlinePreview} />}\n >\n {(pdf) => (\n // Composed without the standalone heading: the host already names the file, and the frame keeps the\n // file name as its accessible title.\n <PdfPreview autoLoad title={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)} request={async () => pdf}>\n {(parts) => (\n <div class=\"k2b-content-file-view__pdf-viewer\">\n {parts.actions}\n {parts.content}\n </div>\n )}\n </PdfPreview>\n )}\n </Show>\n }\n >\n {(href) => <object data={href()} type=\"application/pdf\" class=\"k2b-content-file-view__pdf\" aria-label={props.file.path} />}\n </Show>\n );\n}\n\nfunction AudioRenderer(props: FileViewRendererProps) {\n const fileViewMessages = useFileViewMessages();\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"audio\">\n <audio\n crossOrigin={props.crossOrigin}\n onError={props.onPreviewError}\n controls\n preload=\"metadata\"\n src={mediaSource(props)}\n aria-label={props.file.path}\n >\n {fileViewMessages().audioUnsupported}\n </audio>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction VideoRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const name = () => props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1);\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"video\">\n <VideoPlayer\n src={mediaSource(props)}\n label={name()}\n crossOrigin={props.crossOrigin}\n onFallback={props.onPreviewError}\n fallbackAction={\n <Show when={props.downloadHref}>\n {(href) => (\n <a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\" href={href()} download={name()}>\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </a>\n )}\n </Show>\n }\n />\n </div>\n </OverlayPanel>\n );\n}\n\nfunction BinaryRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n return (\n <Placeholder\n icon=\"ti ti-file-unknown\"\n title={fileViewMessages().noPreview}\n description={props.content.mediaType || fileViewMessages().binaryFile}\n action={\n <Show when={props.downloadHref}>\n {(href) => (\n <a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\" href={href()} download=\"\">\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </a>\n )}\n </Show>\n }\n />\n );\n}\n\nconst BUILTIN_RENDERERS: FileViewRenderer[] = [\n { id: \"markdown\", match: isMarkdown, component: MarkdownRenderer, editable: true },\n {\n id: \"image\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"image\",\n component: ImageRenderer,\n },\n {\n id: \"pdf\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"pdf\",\n component: PdfRenderer,\n },\n {\n id: \"json\",\n match: (file, content) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"json\",\n component: JsonRenderer,\n },\n {\n id: \"delimited-text\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"delimited-text\",\n component: DelimitedTextRenderer,\n },\n {\n id: \"audio\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"audio\",\n component: AudioRenderer,\n },\n {\n id: \"video\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"video\",\n component: VideoRenderer,\n },\n { id: \"text\", match: (_file, content) => content.encoding === \"utf8\", component: TextRenderer, editable: true },\n { id: \"binary\", match: () => true, component: BinaryRenderer },\n];\n\n// ── Component ───────────────────────────────────────────────────────────────\n\nexport const formatFileViewSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\nexport default function FileView(props: FileViewProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const [draft, setDraft] = createSignal(\"\");\n const [savedDraft, setSavedDraft] = createSignal(\"\");\n const [nativeRevision, setNativeRevision] = createSignal(0);\n const dirty = createMemo(() => draft() !== savedDraft());\n const instanceRenderers = () => props.renderers ?? [];\n const saveMutation = mutation.create<{ path: string; content: string }, { path: string; content: string }>({\n mutation: async (input) => {\n await props.save!(input.content);\n return input;\n },\n onSuccess: (saved) => {\n if (props.file.path === saved.path) setSavedDraft(saved.content);\n toast.success(fileViewMessages().fileSaved);\n },\n onError: (error) => toast.error(error.message),\n });\n const nativePreviewHref = createMemo(() => {\n const href = props.previewHref;\n if (!href) return null;\n const separator = href.includes(\"?\") ? \"&\" : \"?\";\n return `${href}${separator}preview-revision=${nativeRevision()}`;\n });\n const browserPreviewContent = createMemo<FileViewContent | null>(() => {\n const kind = getFileViewPreviewKind(props.file);\n if (kind !== \"image\" && kind !== \"pdf\" && kind !== \"audio\" && kind !== \"video\") return null;\n const href = nativePreviewHref();\n if (!href) return null;\n\n const candidate: FileViewContent = {\n encoding: \"base64\",\n content: \"\",\n mediaType: props.file.mediaType ?? \"application/octet-stream\",\n };\n return instanceRenderers().some((renderer) => renderer.match(props.file, candidate)) ? null : candidate;\n });\n const [content, { refetch }] = createResource(\n () => (browserPreviewContent() ? null : { path: props.file.path, revision: props.revision }),\n async () => {\n saveMutation.abort();\n // `load` is an imperative source adapter. Host signal reads inside it\n // must not turn this resource into a hidden reactive feedback loop.\n const loaded = await untrack(() => props.load());\n const loadedDraft = loaded.encoding === \"utf8\" ? loaded.content : \"\";\n setDraft(loadedDraft);\n setSavedDraft(loadedDraft);\n return loaded;\n },\n );\n createEffect(() => {\n if (!props.registerRefresh) return;\n const unregister = props.registerRefresh(async () => {\n if (browserPreviewContent()) setNativeRevision((value) => value + 1);\n else await refetch();\n });\n if (unregister) onCleanup(unregister);\n });\n // An errored resource throws when read; the error state below shows it instead.\n const resolvedContent = createMemo(() => browserPreviewContent() ?? (content.error ? undefined : content()));\n\n const renderer = createMemo(() => {\n const loaded = resolvedContent();\n if (!loaded) return null;\n return [...instanceRenderers(), ...BUILTIN_RENDERERS].find((candidate) => candidate.match(props.file, loaded)) ?? null;\n });\n\n createEffect(() => {\n props.onDirtyChange?.(dirty());\n });\n\n const save = async () => {\n if (!props.save || saveMutation.loading()) return;\n await saveMutation.mutate({ path: props.file.path, content: draft() });\n };\n\n const editor = () =>\n props.save && renderer()?.editable && resolvedContent()?.encoding === \"utf8\"\n ? {\n draft,\n setDraft,\n dirty,\n saving: saveMutation.loading,\n save,\n }\n : null;\n\n // Undefined while loading; the host keeps its own placeholder until the shown file decides.\n const documentTitle = createMemo<string | null | undefined>(() => {\n if (!props.onDocumentTitle) return undefined;\n if (content.error) return null;\n const loaded = resolvedContent();\n if (!loaded) return undefined;\n if (renderer()?.component !== MarkdownRenderer) return null;\n return leadingMarkdownTitle(stripFrontmatter(editor()?.draft() ?? loaded.content))?.title ?? null;\n });\n createEffect(() => {\n const title = documentTitle();\n if (title !== undefined) props.onDocumentTitle?.(title);\n });\n\n return (\n <div\n class={`k2b-content-file-view ${props.class ?? \"\"}`}\n data-variant={props.variant}\n data-excerpt={props.previewLines !== undefined ? \"true\" : undefined}\n >\n <FileViewHost.Provider\n value={{\n get plain() {\n return props.variant === \"plain\";\n },\n get liftTitle() {\n return Boolean(props.onDocumentTitle);\n },\n }}\n >\n <Switch>\n <Match when={content.loading && content() === undefined}>\n <Placeholder icon=\"ti ti-loader-2\" title={messages().loading} />\n </Match>\n <Match when={content.error}>\n <Placeholder\n icon=\"ti ti-alert-circle\"\n title={fileViewMessages().failedLoadFile}\n description={String(content.error?.message ?? \"\")}\n />\n </Match>\n <Match when={resolvedContent() && renderer()}>\n {(active) => {\n const Renderer = active().component;\n return (\n <Renderer\n previewLines={props.previewLines}\n onExpandPreview={props.onExpandPreview}\n headingScale={props.headingScale}\n previewPreferencesKey={props.previewPreferencesKey}\n file={props.file}\n content={resolvedContent()!}\n previewHref={nativePreviewHref()}\n crossOrigin={props.crossOrigin}\n onPreviewError={props.onPreviewError}\n downloadHref={props.downloadHref ?? null}\n editor={editor()}\n />\n );\n }}\n </Match>\n </Switch>\n </FileViewHost.Provider>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/FileView.tsx"],"sourcesContent":["import { useMarkdownEditorMessages } from \"../inputs/markdown/editor-messages\";\nimport { useDataTableMessages } from \"./data-table-messages\";\nimport { useFileViewMessages } from \"./file-view-messages\";\n/**\n * FileView — renders one file through a small renderer registry keyed by\n * media type / path. Editing is enabled purely by the presence of `save`;\n * without it every renderer is read-only. IDE-style chrome: editors reuse\n * the markdown editor's surface (toolbar with an in-toolbar save, Ctrl/Cmd+S),\n * previews are quiet paper panels with icon-only actions overlaid top-right.\n * A plain preview drops the panel and sits on its host's surface instead.\n * Custom renderers are passed per instance, which keeps SSR requests and\n * independently mounted applications isolated.\n */\n\nimport { mutation } from \"@k2b/stdlib/solid\";\nimport {\n type Component,\n createContext,\n createEffect,\n createMemo,\n createResource,\n createSignal,\n For,\n type JSX,\n Match,\n onCleanup,\n onMount,\n Show,\n Switch,\n untrack,\n useContext,\n} from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { prompts } from \"../feedback/prompts\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { toast } from \"../feedback/toast\";\nimport { MarkdownEditor } from \"../inputs/markdown/MarkdownEditor\";\nimport { Select } from \"../inputs/Select\";\nimport { useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport CodeDisplay, { type CodeDisplayLanguage } from \"./CodeDisplay\";\nimport { type DelimitedPreferences, decodeDelimitedContent, readDelimitedPreferences } from \"./delimited-preferences\";\nimport { type FileViewFile, fileViewExtension, getFileViewPreviewKind, parseDelimitedText } from \"./file-view-preview\";\nimport MarkdownView from \"./MarkdownView\";\nimport { leadingMarkdownTitle } from \"./markdown-title\";\nimport PdfPreview from \"./PdfPreview\";\nimport StructuredDataPreview, { type StructuredDataValue } from \"./StructuredDataPreview\";\nimport VideoPlayer from \"./VideoPlayer\";\n\nexport type { FileViewFile, FileViewPreviewKind } from \"./file-view-preview\";\nexport { canPreviewFile, getFileViewPreviewKind } from \"./file-view-preview\";\nexport type FileViewContent = { encoding: \"utf8\" | \"base64\"; content: string; mediaType: string };\n\nexport type FileViewProps = {\n /**\n * Plain previews inherit the surrounding surface without a frame or inset padding. They keep their natural height,\n * so the host scrolls them and owns the actions around them; a host that stretches one gets its scrolling back.\n */\n variant?: \"default\" | \"plain\";\n /**\n * Lifts a leading Markdown level-one heading into the host, for example a dialog title. Reports its plain text and\n * leaves that heading out of the preview, or reports null when the shown file has none, the heading holds a link or\n * image or is the whole document, or the file fails to load.\n */\n onDocumentTitle?: (title: string | null) => void;\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n load: () => Promise<FileViewContent>;\n /** Refetch the current path when this host-owned revision changes. */\n revision?: unknown;\n /** Register an awaitable refresh for the currently visible preview. */\n registerRefresh?: (refresh: () => Promise<void>) => void | (() => void);\n /** Presence enables editing for text-based renderers. */\n save?: (content: string) => Promise<void>;\n /** Authenticated inline URL used by browser-native image, PDF, audio, and video previews. */\n previewHref?: string | null;\n /** CORS mode for native image/audio/video previews. Omit to preserve browser defaults. */\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n /** Native media failed to load; the host can renew a signed URL and offer retry. */\n onPreviewError?: () => void;\n /** Download actions only; never a preview source, because an attachment response does not render inline. */\n downloadHref?: string | null;\n /** App-specific renderers matched before the built-ins for this instance. */\n renderers?: readonly FileViewRenderer[];\n /** Reports local edit state so a parent browser can guard navigation. */\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\nexport type FileViewRendererProps = {\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n content: FileViewContent;\n previewHref: string | null;\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n onPreviewError?: () => void;\n downloadHref: string | null;\n /** Null when the file is read-only. */\n editor: {\n draft: () => string;\n setDraft: (value: string) => void;\n dirty: () => boolean;\n saving: () => boolean;\n save: () => Promise<void>;\n } | null;\n};\n\nexport type FileViewRenderer = {\n id: string;\n match: (file: FileViewFile, content: FileViewContent) => boolean;\n component: Component<FileViewRendererProps>;\n /** Text renderers that support the edit affordance when `save` is present. */\n editable?: boolean;\n};\n\n/** Instance options that reach the built-in renderers without widening the public renderer props. */\nconst FileViewHost = createContext({ plain: false, liftTitle: false });\n\nconst codeLanguage = (path: string): CodeDisplayLanguage => {\n const extension = fileViewExtension(path);\n if (extension === \"ts\" || extension === \"mts\" || extension === \"cts\") return \"ts\";\n if (extension === \"tsx\") return \"tsx\";\n if (extension === \"js\" || extension === \"mjs\" || extension === \"cjs\") return \"js\";\n if (extension === \"jsx\") return \"jsx\";\n if (extension === \"md\" || extension === \"markdown\") return \"md\";\n return \"text\";\n};\n\nconst isMarkdown = (file: FileViewFile, content: FileViewContent) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"markdown\";\n\n/** Rendered previews hide a leading YAML frontmatter block — it's metadata, not content. */\nconst stripFrontmatter = (text: string): string => {\n const match = /^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/.exec(text.trimStart());\n return match ? text.trimStart().slice(match[0].length) : text;\n};\n\n/** Icon-only download link with the shared tooltip, for toolbars that style their own controls. */\nfunction DownloadLink(props: { class: string; href: string; download: string; label: string; icon: string }) {\n let link: HTMLAnchorElement | undefined;\n return (\n <>\n <a ref={link} class={props.class} href={props.href} download={props.download} aria-label={props.label}>\n <i class={props.icon} aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{props.label}</span>\n </a>\n <Tooltip content={props.label} target={() => link} />\n </>\n );\n}\n\n/** Icon-only action, IDE style — sits in the floating top-right cluster of previews. */\nfunction OverlayAction(props: { icon: string; title: string; onClick?: () => void; href?: string; download?: string }) {\n const classes = \"k2b-content-file-view__action\";\n return (\n <Show\n when={props.href}\n fallback={\n <Tooltip.Trigger type=\"button\" class={classes} content={props.title} aria-label={props.title} onClick={props.onClick}>\n <i class={`ti ${props.icon}`} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n }\n >\n {(href) => (\n <DownloadLink class={classes} href={href()} download={props.download ?? \"\"} label={props.title} icon={`ti ${props.icon}`} />\n )}\n </Show>\n );\n}\n\n/** Scrollable preview panel with the floating action cluster overlaid top-right. */\nfunction OverlayPanel(props: { actions?: JSX.Element; children: JSX.Element }) {\n return (\n <div class=\"k2b-content-file-view__panel\">\n <div class=\"k2b-content-file-view__preview\">{props.children}</div>\n <Show when={props.actions}>\n <div class=\"k2b-content-file-view__overlay\">{props.actions}</div>\n </Show>\n </div>\n );\n}\n\nconst DownloadAction = (props: FileViewRendererProps): JSX.Element => {\n const messages = useUiMessages();\n return (\n <Show when={props.downloadHref}>\n {(href) => (\n <OverlayAction\n icon=\"ti-download\"\n title={messages().download}\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n />\n )}\n </Show>\n );\n};\n\n/** Toolbar-styled icon button — reuses the package markdown-editor tool primitive. */\nfunction EditorToolButton(props: { icon: string; title: string; onClick: () => void; disabled?: boolean }) {\n return (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-markdown-editor__tool\"\n content={props.title}\n aria-label={props.title}\n tabIndex={-1}\n disabled={props.disabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={props.onClick}\n >\n <i class={props.icon} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n );\n}\n\n// ── Built-in renderers ──────────────────────────────────────────────────────\n\nfunction MoreLines(props: { count: number; onClick?: () => void }) {\n const fileViewMessages = useFileViewMessages();\n return (\n <Show when={props.count > 0}>\n <div class=\"k2b-content-file-view__truncated\">\n <Show when={props.onClick} fallback={<span>{fileViewMessages().previewMoreLines(props.count)}</span>}>\n <Button size=\"sm\" variant=\"ghost\" onClick={props.onClick}>\n {fileViewMessages().previewMoreLines(props.count)}\n </Button>\n </Show>\n </div>\n </Show>\n );\n}\nfunction TextExcerpt(props: { renderer: FileViewRendererProps; text: string; markdown?: boolean }) {\n const lines = createMemo(() => props.text.replace(/\\r\\n?/g, \"\\n\").replace(/\\n$/, \"\").split(\"\\n\"));\n const limit = () => (props.renderer.previewLines === undefined ? lines().length : Math.max(1, props.renderer.previewLines));\n const text = () => lines().slice(0, limit()).join(\"\\n\");\n const host = useContext(FileViewHost);\n // A plain preview has no code box: the host frames the file and owns its copy action.\n const content = () => (\n <Show\n when={props.markdown}\n fallback={<CodeDisplay code={text()} language={codeLanguage(props.renderer.file.path)} copy={host.plain ? false : undefined} />}\n >\n <MarkdownView markdown={text()} headingScale={props.renderer.headingScale ?? \"compact\"} />\n </Show>\n );\n // Only an excerpt needs a clipping box; a complete preview keeps its content\n // a direct child of the preview frame, which the frame's styles expect.\n return (\n <>\n <Show when={props.renderer.previewLines !== undefined} fallback={content()}>\n <div class=\"k2b-content-file-view__excerpt\">{content()}</div>\n </Show>\n <MoreLines count={lines().length - limit()} onClick={props.renderer.onExpandPreview} />\n </>\n );\n}\n\nfunction MarkdownRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const host = useContext(FileViewHost);\n const [editing, setEditing] = createSignal(false);\n const markdown = () => {\n const text = stripFrontmatter(props.editor?.draft() ?? props.content.content);\n return host.liftTitle ? (leadingMarkdownTitle(text)?.body ?? text) : text;\n };\n return (\n <Show\n when={props.editor && editing()}\n fallback={\n <OverlayPanel\n actions={\n <>\n <Show when={props.editor}>\n <OverlayAction icon=\"ti-pencil\" title={messages().edit} onClick={() => setEditing(true)} />\n </Show>\n <DownloadAction {...props} />\n </>\n }\n >\n <div class=\"k2b-content-file-view__document\">\n <TextExcerpt renderer={props} text={markdown()} markdown />\n </div>\n </OverlayPanel>\n }\n >\n {(_) => {\n const editor = props.editor!;\n return (\n <div class=\"k2b-content-file-view__editor\">\n <MarkdownEditor\n class=\"k2b-content-file-view__markdown-field\"\n aria-label={`Edit ${props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}`}\n fill\n value={editor.draft()}\n onValueChange={editor.setDraft}\n showStats={false}\n onSave={() => void editor.save()}\n saveDisabled={!editor.dirty()}\n saving={editor.saving()}\n toolbarTrailing={<EditorToolButton icon=\"ti ti-eye\" title={messages().preview} onClick={() => setEditing(false)} />}\n />\n </div>\n );\n }}\n </Show>\n );\n}\n\nfunction TextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const markdownEditorMessages = useMarkdownEditorMessages();\n return (\n <Show\n when={props.editor}\n fallback={\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <TextExcerpt renderer={props} text={props.content.content} />\n </OverlayPanel>\n }\n >\n {(editor) => (\n // Same chrome as the markdown editor — literally the same classes, so\n // border, radius, focus ring, toolbar height and text metrics cannot drift.\n <div class=\"k2b-content-file-view__editor\">\n <div\n class=\"k2b-markdown-editor\"\n data-fill=\"true\"\n role=\"group\"\n aria-label={fileViewMessages().textEditor}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"s\") {\n event.preventDefault();\n if (editor().dirty() && !editor().saving()) void editor().save();\n }\n }}\n >\n {/* No formatting tools here — the divider under an actions-only bar reads lost. */}\n <div class=\"k2b-markdown-editor__toolbar k2b-content-file-view__code-toolbar\">\n <span class=\"k2b-content-file-view__code-language\">{codeLanguage(props.file.path)}</span>\n <span class=\"k2b-markdown-editor__trailing\">\n <Show when={props.downloadHref}>\n {(href) => (\n <DownloadLink\n class=\"k2b-markdown-editor__tool\"\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n label={messages().download}\n icon=\"ti ti-download\"\n />\n )}\n </Show>\n <EditorToolButton\n icon={editor().saving() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-device-floppy\"}\n title={markdownEditorMessages().saveShortcut}\n disabled={!editor().dirty() || editor().saving()}\n onClick={() => void editor().save()}\n />\n </span>\n </div>\n <div class=\"k2b-markdown-editor__surface\">\n <textarea\n class=\"k2b-content-file-view__code-input\"\n value={editor().draft()}\n spellcheck={false}\n onInput={(event) => editor().setDraft(event.currentTarget.value)}\n />\n </div>\n </div>\n </div>\n )}\n </Show>\n );\n}\n\nfunction JsonRenderer(props: FileViewRendererProps) {\n const parsed = createMemo(() => {\n try {\n return { ok: true as const, value: JSON.parse(props.content.content) as StructuredDataValue };\n } catch {\n return { ok: false as const };\n }\n });\n const parsedValue = (): StructuredDataValue => {\n const result = parsed();\n return result.ok ? result.value : null;\n };\n\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__document\">\n <Show when={parsed().ok} fallback={<TextExcerpt renderer={props} text={props.content.content} />}>\n <Show\n when={props.previewLines === undefined}\n fallback={<TextExcerpt renderer={props} text={JSON.stringify(parsedValue(), null, 2)} />}\n >\n <StructuredDataPreview data={parsedValue()} maxRows={200} />\n </Show>\n </Show>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction DelimitedTextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const dataTableMessages = useDataTableMessages();\n const [preferences, setPreferences] = createSignal<DelimitedPreferences>({ encoding: \"utf-8\", delimiter: \"auto\", view: \"table\" });\n onMount(() => {\n if (!props.previewPreferencesKey) return;\n try {\n setPreferences(readDelimitedPreferences(localStorage.getItem(props.previewPreferencesKey)));\n } catch {\n /* Storage may be disabled. */\n }\n });\n const update = (patch: Partial<DelimitedPreferences>) => {\n const next = { ...preferences(), ...patch };\n setPreferences(next);\n if (props.previewPreferencesKey) {\n try {\n localStorage.setItem(props.previewPreferencesKey, JSON.stringify(next));\n } catch {\n /* Keep the local selection. */\n }\n }\n };\n const text = createMemo(() => decodeDelimitedContent(props.content, preferences().encoding));\n const delimiter = () =>\n preferences().delimiter === \"auto\"\n ? fileViewExtension(props.file.path) === \"tsv\" || props.content.mediaType === \"text/tab-separated-values\"\n ? \"\\t\"\n : \",\"\n : preferences().delimiter;\n const [page, setPage] = createSignal(0);\n createEffect(() => {\n text();\n delimiter();\n props.previewLines;\n setPage(0);\n });\n const pageSize = () => (props.previewLines === undefined ? 200 : Math.max(1, props.previewLines));\n const preview = createMemo(() => parseDelimitedText(text(), delimiter(), { rows: pageSize() + 1, offset: page() * pageSize() }));\n const settings = () =>\n prompts.dialog(\n () => (\n <div class=\"k2b-content-file-view__settings\">\n <Select\n label={fileViewMessages().csvEncoding}\n value={preferences().encoding}\n disabled={props.content.encoding !== \"base64\"}\n options={[\"utf-8\", \"windows-1252\", \"utf-16le\", \"utf-16be\"]}\n onValueChange={(value) => {\n if (value) update({ encoding: value });\n }}\n />\n <Select\n label={fileViewMessages().csvSeparator}\n value={preferences().delimiter}\n options={[\n { value: \"auto\", label: fileViewMessages().csvDefaultSeparator },\n { value: \",\", label: fileViewMessages().csvComma },\n { value: \";\", label: fileViewMessages().csvSemicolon },\n { value: \"\\t\", label: fileViewMessages().csvTab },\n { value: \"|\", label: \"|\" },\n ]}\n onValueChange={(value) => {\n if (value) update({ delimiter: value });\n }}\n />\n <Select\n label={fileViewMessages().csvView}\n value={preferences().view}\n options={[\n { value: \"table\", label: dataTableMessages().dataTable },\n { value: \"raw\", label: fileViewMessages().csvRaw },\n ]}\n onValueChange={(value) => {\n if (value === \"table\" || value === \"raw\") update({ view: value });\n }}\n />\n </div>\n ),\n { title: fileViewMessages().csvSettings },\n );\n const headers = createMemo(() => preview().rows[0] ?? []);\n const rows = createMemo(() => preview().rows.slice(1));\n\n return (\n <OverlayPanel\n actions={\n <>\n <OverlayAction icon=\"ti-adjustments-horizontal\" title={fileViewMessages().csvSettings} onClick={() => void settings()} />\n <DownloadAction {...props} />\n </>\n }\n >\n <Show when={preferences().view === \"table\"} fallback={<TextExcerpt renderer={props} text={text()} />}>\n <Show\n when={headers().length > 0}\n fallback={\n <Placeholder icon=\"ti ti-table\" title={fileViewMessages().emptyFile} description={fileViewMessages().delimitedFileEmpty} />\n }\n >\n <div class=\"k2b-content-file-view__sheet\">\n <table class=\"k2b-content-file-view__table\">\n <thead>\n <tr>\n <For each={headers()}>\n {(header, index) => (\n <th scope=\"col\">\n <span>{header || fileViewMessages().column({ number: index() + 1 })}</span>\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={rows()}>\n {(row) => (\n <tr>\n <For each={headers()}>{(_, index) => <td>{row[index()] ?? \"\"}</td>}</For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n <Show when={preview().columnsTruncated}>\n <div class=\"k2b-content-file-view__truncated\">{fileViewMessages().previewColumnsLimited}</div>\n </Show>\n <Show\n when={props.previewLines !== undefined}\n fallback={\n <Show when={preview().totalRows > 201}>\n <div class=\"k2b-content-file-view__pagination\">\n <Button size=\"sm\" variant=\"ghost\" disabled={page() === 0} onClick={() => setPage(page() - 1)}>\n {messages().previous}\n </Button>\n <span>\n {page() * pageSize() + 1}–{Math.min((page() + 1) * pageSize(), preview().totalRows - 1)} / {preview().totalRows - 1}\n </span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={(page() + 1) * pageSize() >= preview().totalRows - 1}\n onClick={() => setPage(page() + 1)}\n >\n {messages().next}\n </Button>\n </div>\n </Show>\n }\n >\n <MoreLines count={preview().totalRows - rows().length - 1} onClick={props.onExpandPreview} />\n </Show>\n </div>\n </Show>\n </Show>\n </OverlayPanel>\n );\n}\n\nconst mediaSource = (props: FileViewRendererProps): string =>\n props.previewHref ?? `data:${props.content.mediaType};base64,${props.content.content}`;\n\nfunction ImageRenderer(props: FileViewRendererProps) {\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\">\n <img crossOrigin={props.crossOrigin} onError={props.onPreviewError} src={mediaSource(props)} alt={props.file.path} />\n </div>\n </OverlayPanel>\n );\n}\n\nconst pdfBlob = (content: FileViewContent): Blob => {\n if (content.encoding === \"utf8\") return new Blob([content.content], { type: \"application/pdf\" });\n const binary = atob(content.content);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);\n return new Blob([bytes], { type: \"application/pdf\" });\n};\n\n/**\n * A host inline URL goes to the browser's native viewer. Without one, the\n * loaded bytes become a local PDF Blob: a download URL is an attachment and\n * would leave a native viewer empty.\n */\nfunction PdfRenderer(props: FileViewRendererProps) {\n const fileViewMessages = useFileViewMessages();\n // A new Blob remounts the preview, so changed bytes show the new file. A revision refetch\n // often returns the same bytes (the Assistant refetches on every tool step); keeping the\n // Blob then keeps the reader's page instead of reloading the viewer.\n const bytes = createMemo(() => props.content, undefined, {\n equals: (previous, next) => previous.encoding === next.encoding && previous.content === next.content,\n });\n const blob = createMemo(() => (props.previewHref || !bytes().content ? null : pdfBlob(bytes())));\n return (\n <Show\n when={props.previewHref}\n fallback={\n <Show\n keyed\n when={blob()}\n fallback={<Placeholder icon=\"ti ti-file-type-pdf\" title=\"PDF\" description={fileViewMessages().noInlinePreview} />}\n >\n {(pdf) => (\n // Composed without the standalone heading: the host already names the file, and the frame keeps the\n // file name as its accessible title.\n <PdfPreview autoLoad title={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)} request={async () => pdf}>\n {(parts) => (\n <div class=\"k2b-content-file-view__pdf-viewer\">\n {parts.actions}\n {parts.content}\n </div>\n )}\n </PdfPreview>\n )}\n </Show>\n }\n >\n {(href) => <object data={href()} type=\"application/pdf\" class=\"k2b-content-file-view__pdf\" aria-label={props.file.path} />}\n </Show>\n );\n}\n\nfunction AudioRenderer(props: FileViewRendererProps) {\n const fileViewMessages = useFileViewMessages();\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"audio\">\n <audio\n crossOrigin={props.crossOrigin}\n onError={props.onPreviewError}\n controls\n preload=\"metadata\"\n src={mediaSource(props)}\n aria-label={props.file.path}\n >\n {fileViewMessages().audioUnsupported}\n </audio>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction VideoRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const name = () => props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1);\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"video\">\n <VideoPlayer\n src={mediaSource(props)}\n label={name()}\n crossOrigin={props.crossOrigin}\n onFallback={props.onPreviewError}\n fallbackAction={\n <Show when={props.downloadHref}>\n {(href) => (\n <a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\" href={href()} download={name()}>\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </a>\n )}\n </Show>\n }\n />\n </div>\n </OverlayPanel>\n );\n}\n\nfunction BinaryRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n return (\n <Placeholder\n icon=\"ti ti-file-unknown\"\n title={fileViewMessages().noPreview}\n description={props.content.mediaType || fileViewMessages().binaryFile}\n action={\n <Show when={props.downloadHref}>\n {(href) => (\n <a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\" href={href()} download=\"\">\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </a>\n )}\n </Show>\n }\n />\n );\n}\n\nconst BUILTIN_RENDERERS: FileViewRenderer[] = [\n { id: \"markdown\", match: isMarkdown, component: MarkdownRenderer, editable: true },\n {\n id: \"image\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"image\",\n component: ImageRenderer,\n },\n {\n id: \"pdf\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"pdf\",\n component: PdfRenderer,\n },\n {\n id: \"json\",\n match: (file, content) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"json\",\n component: JsonRenderer,\n },\n {\n id: \"delimited-text\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"delimited-text\",\n component: DelimitedTextRenderer,\n },\n {\n id: \"audio\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"audio\",\n component: AudioRenderer,\n },\n {\n id: \"video\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"video\",\n component: VideoRenderer,\n },\n { id: \"text\", match: (_file, content) => content.encoding === \"utf8\", component: TextRenderer, editable: true },\n { id: \"binary\", match: () => true, component: BinaryRenderer },\n];\n\n// ── Component ───────────────────────────────────────────────────────────────\n\nexport const formatFileViewSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\nexport default function FileView(props: FileViewProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const [draft, setDraft] = createSignal(\"\");\n const [savedDraft, setSavedDraft] = createSignal(\"\");\n const [nativeRevision, setNativeRevision] = createSignal(0);\n const dirty = createMemo(() => draft() !== savedDraft());\n const instanceRenderers = () => props.renderers ?? [];\n const saveMutation = mutation.create<{ path: string; content: string }, { path: string; content: string }>({\n mutation: async (input) => {\n await props.save!(input.content);\n return input;\n },\n onSuccess: (saved) => {\n if (props.file.path === saved.path) setSavedDraft(saved.content);\n toast.success(fileViewMessages().fileSaved);\n },\n onError: (error) => toast.error(error.message),\n });\n const nativePreviewHref = createMemo(() => {\n const href = props.previewHref;\n if (!href) return null;\n const separator = href.includes(\"?\") ? \"&\" : \"?\";\n return `${href}${separator}preview-revision=${nativeRevision()}`;\n });\n const browserPreviewContent = createMemo<FileViewContent | null>(() => {\n const kind = getFileViewPreviewKind(props.file);\n if (kind !== \"image\" && kind !== \"pdf\" && kind !== \"audio\" && kind !== \"video\") return null;\n const href = nativePreviewHref();\n if (!href) return null;\n\n const candidate: FileViewContent = {\n encoding: \"base64\",\n content: \"\",\n mediaType: props.file.mediaType ?? \"application/octet-stream\",\n };\n return instanceRenderers().some((renderer) => renderer.match(props.file, candidate)) ? null : candidate;\n });\n const [content, { refetch }] = createResource(\n () => (browserPreviewContent() ? null : { path: props.file.path, revision: props.revision }),\n async () => {\n saveMutation.abort();\n // `load` is an imperative source adapter. Host signal reads inside it\n // must not turn this resource into a hidden reactive feedback loop.\n const loaded = await untrack(() => props.load());\n const loadedDraft = loaded.encoding === \"utf8\" ? loaded.content : \"\";\n setDraft(loadedDraft);\n setSavedDraft(loadedDraft);\n return loaded;\n },\n );\n createEffect(() => {\n if (!props.registerRefresh) return;\n const unregister = props.registerRefresh(async () => {\n if (browserPreviewContent()) setNativeRevision((value) => value + 1);\n else await refetch();\n });\n if (unregister) onCleanup(unregister);\n });\n // An errored resource throws when read; the error state below shows it instead.\n const resolvedContent = createMemo(() => browserPreviewContent() ?? (content.error ? undefined : content()));\n\n const renderer = createMemo(() => {\n const loaded = resolvedContent();\n if (!loaded) return null;\n return [...instanceRenderers(), ...BUILTIN_RENDERERS].find((candidate) => candidate.match(props.file, loaded)) ?? null;\n });\n\n createEffect(() => {\n props.onDirtyChange?.(dirty());\n });\n\n const save = async () => {\n if (!props.save || saveMutation.loading()) return;\n await saveMutation.mutate({ path: props.file.path, content: draft() });\n };\n\n const editor = () =>\n props.save && renderer()?.editable && resolvedContent()?.encoding === \"utf8\"\n ? {\n draft,\n setDraft,\n dirty,\n saving: saveMutation.loading,\n save,\n }\n : null;\n\n // Undefined while loading; the host keeps its own placeholder until the shown file decides.\n const documentTitle = createMemo<string | null | undefined>(() => {\n if (!props.onDocumentTitle) return undefined;\n if (content.error) return null;\n const loaded = resolvedContent();\n if (!loaded) return undefined;\n if (renderer()?.component !== MarkdownRenderer) return null;\n return leadingMarkdownTitle(stripFrontmatter(editor()?.draft() ?? loaded.content))?.title ?? null;\n });\n createEffect(() => {\n const title = documentTitle();\n if (title !== undefined) props.onDocumentTitle?.(title);\n });\n\n return (\n <div\n class={`k2b-content-file-view ${props.class ?? \"\"}`}\n data-variant={props.variant}\n data-excerpt={props.previewLines !== undefined ? \"true\" : undefined}\n >\n <FileViewHost.Provider\n value={{\n get plain() {\n return props.variant === \"plain\";\n },\n get liftTitle() {\n return Boolean(props.onDocumentTitle);\n },\n }}\n >\n <Switch>\n <Match when={content.loading && content() === undefined}>\n <Placeholder state=\"loading\" title={messages().loading} />\n </Match>\n <Match when={content.error}>\n <Placeholder state=\"error\" title={fileViewMessages().failedLoadFile} description={String(content.error?.message ?? \"\")} />\n </Match>\n <Match when={resolvedContent() && renderer()}>\n {(active) => {\n const Renderer = active().component;\n return (\n <Renderer\n previewLines={props.previewLines}\n onExpandPreview={props.onExpandPreview}\n headingScale={props.headingScale}\n previewPreferencesKey={props.previewPreferencesKey}\n file={props.file}\n content={resolvedContent()!}\n previewHref={nativePreviewHref()}\n crossOrigin={props.crossOrigin}\n onPreviewError={props.onPreviewError}\n downloadHref={props.downloadHref ?? null}\n editor={editor()}\n />\n );\n }}\n </Match>\n </Switch>\n </FileViewHost.Provider>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|