@dirwell/theme-ledger 0.0.1 → 0.0.2
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 +3 -1
- package/dist/client.js +25 -25
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +8 -2
- package/dist/index.mjs.map +1 -1
- package/dist/{model-B0qQsjRT.d.mts → model-BgCmoksr.d.mts} +3 -1
- package/dist/model.d.mts +1 -1
- package/dist/source/Ledger.svelte +73 -6
- package/dist/source/shared/live-search.mjs +28 -0
- package/dist/source/shared/navigation.mjs +1 -0
- package/package.json +2 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["App"],"sources":["../../shared-theme/src/page.ts","../../shared-theme/src/view-state.ts","../../shared-theme/src/icons.ts","../../shared-theme/src/customization.ts","../../shared-theme/src/navigation.ts","../../shared-theme/src/records.ts","../.generated/App-server.mjs","../render-generated.mjs","../src/index.ts"],"sourcesContent":["import path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { projectListingEntry, copyJsonObject } from \"@dirwell/core\";\nimport type {\n ListingEntry,\n ThemeContext,\n ListingPage,\n SortOptions,\n ExplorerTheme,\n} from \"@dirwell/core\";\nimport type { ThemeCustomization } from \"./customization.ts\";\nexport interface ThemePage {\n readonly ui?: ThemeCustomization;\n readonly version: 1;\n readonly theme: string;\n readonly title: string;\n readonly metadataHead?: string;\n readonly path: string;\n readonly rootHref: string;\n readonly parentHref: string | null;\n readonly parentDataHref: string | null;\n readonly rootDataHref: string | null;\n readonly dataHref: string;\n readonly manifestHref: string | null;\n readonly listingRevision?: string;\n readonly updatesHref: string | null;\n readonly total: number;\n readonly entries: readonly ListingEntry[];\n readonly sort: Required<SortOptions>;\n readonly page: ListingPage | null;\n readonly breadcrumbs: readonly {\n readonly name: string;\n readonly href: string;\n readonly dataHref: string | null;\n }[];\n}\nexport const pageAsset = (theme: string, directory: string, page = 1) =>\n `${theme}-page-${createHash(\"sha256\").update(directory).digest(\"hex\").slice(0, 24)}-${page}.json`;\nexport function folderDataHref(\n entry: ListingEntry,\n context: Parameters<NonNullable<ExplorerTheme[\"entryData\"]>>[1],\n theme: string,\n): string | null {\n if (\n entry.exitsExplorer ||\n entry.href === null ||\n !(entry.kind === \"directory\" || entry.link?.targetKind === \"directory\")\n )\n return null;\n const fake = \"https://dirwell.invalid/\";\n const base = new URL(\n context.documentBaseHref ?? `${context.directoryPath ? context.directoryPath + \"/\" : \"\"}`,\n fake,\n );\n const root = new URL(context.hrefForDirectory(\"\"), base);\n const target = new URL(entry.href, base);\n const rootPath = root.pathname.endsWith(\"/\")\n ? root.pathname\n : root.pathname.slice(0, root.pathname.lastIndexOf(\"/\") + 1);\n const directoryPath = target.pathname.endsWith(\"/\")\n ? target.pathname\n : target.pathname.slice(0, target.pathname.lastIndexOf(\"/\") + 1);\n const logical = directoryPath\n .slice(rootPath.length)\n .split(\"/\")\n .filter(Boolean)\n .map(decodeURIComponent)\n .join(\"/\");\n const filename = pageAsset(theme, logical);\n if (context.pageDataHref !== undefined) return context.pageDataHref(theme, logical, 1);\n if (context.mode === \"mpa\") return context.assetHref(filename);\n const href = new URL(filename, new URL(directoryPath, target));\n if (href.origin !== new URL(fake).origin) return href.href;\n if (context.documentBaseHref === null && !entry.href.startsWith(\"/\")) {\n return path.posix\n .relative(context.directoryPath || \".\", path.posix.join(logical, filename))\n .split(\"/\")\n .map((segment) =>\n segment === \"..\" || segment === \".\" ? segment : encodeURIComponent(segment),\n )\n .join(\"/\");\n }\n return href.pathname;\n}\nexport function createThemePage(\n context: ThemeContext,\n theme: ExplorerTheme,\n title: string,\n): ThemePage {\n const directoryPath = context.directory.current.relativePath;\n const safeContext = {\n ...(context.pageDataHref === undefined ? {} : { pageDataHref: context.pageDataHref }),\n mode: context.mode,\n outputName: context.outputName,\n assetHref: context.assetHref,\n hrefForDirectory: context.hrefForDirectory,\n documentBaseHref: context.documentBaseHref,\n directoryPath,\n };\n const dataForDirectory = (logicalPath: string) =>\n context.hasPageForDirectory?.(logicalPath) === false\n ? null\n : folderDataHref(\n {\n id: logicalPath,\n name: logicalPath,\n kind: \"directory\",\n href: context.hrefForDirectory(logicalPath),\n exitsExplorer: false,\n size: 0,\n modifiedAt: \"\",\n link: null,\n },\n safeContext,\n theme.name,\n )!;\n const entries = context.directory.entries.map((entry) => {\n const record = projectListingEntry(entry, context);\n return theme.entryData === undefined\n ? record\n : { ...record, presentation: copyJsonObject(theme.entryData(record, safeContext)) };\n });\n return {\n version: 1,\n ...(context.metadata === undefined ? {} : { metadataHead: context.metadata.head }),\n theme: theme.name,\n title: context.metadata?.title ?? (directoryPath ? `${directoryPath} · ${title}` : title),\n path: directoryPath,\n rootHref: context.hrefForDirectory(\"\"),\n parentHref:\n context.directory.parent === null\n ? null\n : context.hrefForDirectory(context.directory.parent.relativePath),\n rootDataHref: dataForDirectory(\"\"),\n parentDataHref:\n context.directory.parent === null\n ? null\n : dataForDirectory(context.directory.parent.relativePath),\n dataHref:\n context.pageDataHref?.(theme.name, directoryPath, context.listing?.page.number ?? 1) ??\n context.assetHref(pageAsset(theme.name, directoryPath, context.listing?.page.number ?? 1)),\n manifestHref: context.listing?.manifestHref ?? null,\n ...(context.listing ? { listingRevision: context.listing.revision } : {}),\n updatesHref: context.updatesHref ?? null,\n total: context.listing?.page.total ?? entries.length,\n entries,\n sort: context.sort,\n page: context.listing?.page ?? null,\n breadcrumbs: directoryPath\n .split(\"/\")\n .filter(Boolean)\n .map((name, index) => ({\n name,\n dataHref: dataForDirectory(\n directoryPath\n .split(\"/\")\n .slice(0, index + 1)\n .join(\"/\"),\n ),\n href: context.hrefForDirectory(\n directoryPath\n .split(\"/\")\n .slice(0, index + 1)\n .join(\"/\"),\n ),\n })),\n };\n}\n","import type { SortOptions } from \"@dirwell/core\";\n\nexport interface ViewState {\n readonly query: string;\n readonly sort?: Required<SortOptions>;\n readonly types?: readonly string[];\n readonly category?: string | null;\n readonly selected?: string | null;\n readonly windowY?: number;\n readonly listTop?: number;\n}\nconst supportedTypes = [\"directory\", \"file\", \"link\"];\nfunction validSort(value: unknown): value is Required<SortOptions> {\n if (typeof value !== \"object\" || value === null) return false;\n const sort = value as Record<string, unknown>;\n return (\n [\"name\", \"size\", \"modified\"].includes(String(sort.field)) &&\n [\"asc\", \"desc\"].includes(String(sort.direction)) &&\n [\"natural\", \"locale\", \"unicode\"].includes(String(sort.nameMode)) &&\n typeof sort.directoriesFirst === \"boolean\"\n );\n}\nfunction position(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value)\n ? Math.max(0, Math.min(value, 1e9))\n : 0;\n}\n/** URL controls are shareable; selection and scroll belong only to one history entry. */\nexport function readView(\n href: string,\n theme: \"ledger\" | \"crosswave\",\n path: string,\n defaults: ViewState,\n categories: readonly string[] = [],\n historyState: unknown = null,\n): ViewState {\n const params = new URL(href).searchParams;\n const result: { -readonly [K in keyof ViewState]: ViewState[K] } = {\n ...defaults,\n query: (params.get(\"dw.q\") ?? \"\").slice(0, 4096),\n selected: null,\n windowY: 0,\n listTop: 0,\n };\n if (theme === \"ledger\") {\n const parts = params.get(\"dw.sort\")?.split(\":\");\n if (parts?.length === 4) {\n const sort = {\n field: parts[0],\n direction: parts[1],\n nameMode: parts[2],\n directoriesFirst: parts[3] === \"folders\",\n };\n if ([\"folders\", \"mixed\"].includes(parts[3]!) && validSort(sort)) result.sort = sort;\n }\n if (params.has(\"dw.types\")) {\n const types = params.get(\"dw.types\")!.split(\",\").filter(Boolean);\n if (types.every((type) => supportedTypes.includes(type))) result.types = [...new Set(types)];\n }\n } else {\n const category = params.get(\"dw.category\");\n if (category !== null && categories.includes(category)) result.category = category;\n }\n if (typeof historyState === \"object\" && historyState !== null && \"dirwell\" in historyState) {\n const state = historyState.dirwell;\n if (\n typeof state === \"object\" &&\n state !== null &&\n \"version\" in state &&\n state.version === 1 &&\n \"theme\" in state &&\n state.theme === theme &&\n \"path\" in state &&\n state.path === path &&\n \"view\" in state &&\n typeof state.view === \"object\" &&\n state.view !== null\n ) {\n const view = state.view as Record<string, unknown>;\n result.selected =\n typeof view.selected === \"string\" && view.selected.length <= 4096 ? view.selected : null;\n result.windowY = position(view.windowY);\n result.listTop = position(view.listTop);\n }\n }\n return result;\n}\nexport function viewHref(\n href: string,\n theme: \"ledger\" | \"crosswave\",\n view: ViewState,\n defaults: ViewState,\n): string {\n const url = new URL(href);\n for (const key of [\"dw.q\", \"dw.sort\", \"dw.types\", \"dw.category\"]) url.searchParams.delete(key);\n if (view.query) url.searchParams.set(\"dw.q\", view.query.slice(0, 4096));\n if (theme === \"ledger\") {\n if (\n view.sort &&\n [\"field\", \"direction\", \"nameMode\", \"directoriesFirst\"].some(\n (key) => view.sort![key as keyof SortOptions] !== defaults.sort?.[key as keyof SortOptions],\n )\n ) {\n const sort = view.sort;\n url.searchParams.set(\n \"dw.sort\",\n `${sort.field}:${sort.direction}:${sort.nameMode}:${sort.directoriesFirst ? \"folders\" : \"mixed\"}`,\n );\n }\n if (\n view.types &&\n supportedTypes.some(\n (type) => view.types!.includes(type) !== (defaults.types ?? supportedTypes).includes(type),\n )\n )\n url.searchParams.set(\"dw.types\", view.types.join(\",\"));\n } else if (view.category && view.category !== defaults.category)\n url.searchParams.set(\"dw.category\", view.category);\n return url.href;\n}\n/** History failures never require discarding a successfully loaded view. */\nexport function createViewHistory(theme: \"ledger\" | \"crosswave\") {\n let committedHref = location.href;\n let committedState = history.state;\n const stateFor = (dataHref: string, path: string, view?: ViewState) => ({\n ...(typeof history.state === \"object\" && history.state !== null ? history.state : {}),\n dataHref,\n dirwell: {\n version: 1,\n theme,\n path,\n ...(view === undefined\n ? {}\n : {\n view: {\n query: view.query,\n ...(view.sort === undefined ? {} : { sort: { ...view.sort } }),\n ...(view.types === undefined ? {} : { types: [...view.types] }),\n category: view.category ?? null,\n selected: view.selected ?? null,\n windowY: view.windowY ?? 0,\n listTop: view.listTop ?? 0,\n },\n }),\n },\n });\n return {\n save(dataHref: string, path: string, view: ViewState, defaults: ViewState): void {\n // A popstate load changes location before it has a usable matching model.\n if (location.href !== committedHref) return;\n const href = viewHref(committedHref, theme, view, defaults);\n const state = stateFor(dataHref, path, view);\n try {\n history.replaceState(state, \"\", href);\n committedHref = href;\n committedState = state;\n } catch {\n /* Native links remain available if the host denies History. */\n }\n },\n commit(dataHref: string, path: string, href: string, push: boolean): void {\n const state = stateFor(dataHref, path);\n if (push) history.pushState(state, \"\", href);\n else history.replaceState(state, \"\", href);\n committedHref = href;\n committedState = state;\n },\n rollback(): void {\n if (location.href !== committedHref) {\n try {\n history.replaceState(committedState, \"\", committedHref);\n } catch {\n /* Host owns the restriction. */\n }\n }\n },\n };\n}\n","const paths = {\n directory: '<path d=\"M3 7V5h6l2 3h10v12H3Z\"/><path d=\"M3 10h18\"/>',\n file: '<path d=\"M5 3h9l5 5v13H5ZM14 3v5h5M8 12h8M8 16h6\"/>',\n link: '<path d=\"m9 15 6-6M8 10l-3 3a4 4 0 0 0 6 6l3-3M10 8l3-3a4 4 0 0 1 6 6l-3 3\"/>',\n};\n/** Fixed authored geometry; source names and paths never enter SVG markup. */\nexport function entryIcon(kind: keyof typeof paths): string {\n return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.45\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${paths[kind]}</svg>`;\n}\n","/** Small serializable inputs shared by official themes; layout stays theme-owned. */\nexport const defaultLabels = {\n other: \"other\",\n crosswaveKeyboardHelp: \"Arrow keys navigate · Enter confirms · Backspace returns\",\n brokenLink: \"broken link\",\n unavailableLink: \"unavailable link\",\n cycleLink: \"cycle link\",\n azure: \"azure\",\n violet: \"violet\",\n amber: \"amber\",\n rose: \"rose\",\n jade: \"jade\",\n graphite: \"graphite\",\n allFiles: \"All files\",\n categoryFolders: \"Folders\",\n categoryPhotos: \"Photos\",\n categoryMusic: \"Music\",\n categoryVideos: \"Videos\",\n categoryDocuments: \"Documents\",\n categoryOther: \"Other\",\n indexOf: \"Index of {path}\",\n home: \"Home\",\n breadcrumb: \"Breadcrumb\",\n archive: \"File archive\",\n searchDirectory: \"Search this directory\",\n searchFiles: \"Search files\",\n search: \"Search\",\n types: \"Types\",\n directory: \"directory\",\n file: \"file\",\n link: \"link\",\n folder: \"Folder\",\n sort: \"Sort\",\n name: \"Name\",\n size: \"Size\",\n modified: \"Modified\",\n names: \"Names\",\n natural: \"Natural\",\n locale: \"Locale\",\n unicode: \"Unicode\",\n order: \"Order\",\n ascending: \"Ascending\",\n descending: \"Descending\",\n directoriesFirst: \"Folders first\",\n appearance: \"Appearance\",\n system: \"System\",\n light: \"Light\",\n dark: \"Dark\",\n searchArchive: \"Search archive\",\n archiveSearchInput: \"Search archive files\",\n entries: \"{count} entries\",\n pageEntries: \"{total} entries · {count} on this page\",\n loading: \"Loading…\",\n noMatches: \"No matching entries.\",\n empty: \"This directory is empty.\",\n pagination: \"Pagination\",\n previous: \"Previous\",\n next: \"Next\",\n page: \"Page {page} of {pages}\",\n keyboardHelp: \"Arrow keys select files · Home / End jump · / searches · Backspace opens parent\",\n modifiedTime: \"Modified time\",\n close: \"Close\",\n unknown: \"Unknown\",\n unavailable: \"Target unavailable\",\n beginArchive: \"Enter a search to begin.\",\n searchingArchive: \"Searching archive…\",\n archiveResults: \"{count} results\",\n truncatedResults: \"Showing {shown} of {count} results\",\n archiveError: \"Could not load archive search. Try again.\",\n listingError: \"Could not load complete directory data. Native page links remain available.\",\n folderError: \"Could not open the folder. Its native link remains available.\",\n updatesError: \"Live updates disconnected. Refresh to retry.\",\n retry: \"Retry\",\n openNative: \"Open folder directly\",\n categories: \"File categories\",\n items: \"{count} items\",\n filesIn: \"Files in {path}\",\n controller: \"Controller · Confirm / Back\",\n color: \"Color\",\n pauseMotion: \"Pause motion\",\n resumeMotion: \"Resume motion\",\n copyLink: \"Copy link\",\n copyPath: \"Copy path\",\n download: \"Download\",\n copied: \"Copied.\",\n copyError: \"Could not copy. Use the native link or select the path.\",\n repository: \"Repository\",\n author: \"by\",\n target: \"Target\",\n newTab: \"opens in a new tab\",\n};\nexport type ThemeLabels = Readonly<typeof defaultLabels>;\nexport type ThemeColumn =\n | \"name\"\n | \"size\"\n | \"modified\"\n | { readonly dataKey: string; readonly label: string };\nexport type ThemeAction = \"copy-link\" | \"copy-path\" | \"download\";\nexport interface ThemeCustomization {\n readonly language?: string;\n readonly direction?: \"ltr\" | \"rtl\";\n readonly locale?: string;\n readonly timeZone?: string;\n readonly labels?: Partial<ThemeLabels>;\n readonly brand?: {\n readonly name?: string;\n readonly logoUrl?: string;\n readonly logoAlt?: string;\n readonly footerText?: string;\n readonly footerUrl?: string;\n readonly faviconUrl?: string;\n };\n readonly columns?: readonly ThemeColumn[];\n readonly actions?: readonly ThemeAction[];\n /** Theme-specific CSS variable names; declarations and markup are rejected. */\n readonly cssVariables?: Readonly<Record<`--${string}`, string>>;\n}\nexport interface ResolvedThemeCustomization {\n readonly language: string;\n readonly dateOptions: { readonly locale?: string; readonly timeZone?: string };\n readonly direction: \"ltr\" | \"rtl\";\n readonly locale: string;\n readonly timeZone: string;\n readonly labels: ThemeLabels;\n readonly brand: NonNullable<ThemeCustomization[\"brand\"]>;\n readonly columns: readonly ThemeColumn[];\n readonly actions: readonly ThemeAction[];\n readonly cssVariables: Readonly<Record<string, string>>;\n}\nexport function resolveCustomization(options: ThemeCustomization = {}): ResolvedThemeCustomization {\n const language = options.language === undefined ? \"en\" : options.language,\n locale = options.locale === undefined ? \"en-US\" : options.locale,\n timeZone = options.timeZone === undefined ? \"UTC\" : options.timeZone;\n for (const [key, value] of Object.entries({ language, locale, timeZone }))\n if (typeof value !== \"string\" || !value)\n throw new TypeError(`${key} must be a non-empty string`);\n new Intl.DateTimeFormat(locale, { timeZone });\n const direction = options.direction ?? \"ltr\";\n if (direction !== \"ltr\" && direction !== \"rtl\")\n throw new TypeError(\"direction must be ltr or rtl\");\n const labels = { ...defaultLabels };\n if (options.labels !== undefined) {\n if (\n typeof options.labels !== \"object\" ||\n options.labels === null ||\n Array.isArray(options.labels)\n )\n throw new TypeError(\"labels must be an object\");\n for (const [key, value] of Object.entries(options.labels)) {\n if (!Object.hasOwn(labels, key) || typeof value !== \"string\")\n throw new TypeError(`Unsupported label or value: ${key}`);\n Object.assign(labels, { [key]: value });\n }\n }\n const brand = options.brand ?? {};\n if (typeof brand !== \"object\" || brand === null || Array.isArray(brand))\n throw new TypeError(\"brand must be an object\");\n for (const [key, value] of Object.entries(brand)) {\n if (\n ![\"name\", \"logoUrl\", \"logoAlt\", \"footerText\", \"footerUrl\", \"faviconUrl\"].includes(key) ||\n typeof value !== \"string\"\n )\n throw new TypeError(`Unsupported brand option or value: ${key}`);\n if (\n key.endsWith(\"Url\") &&\n !/^https?:\\/\\//i.test(value) &&\n !(value.startsWith(\"/\") && !value.startsWith(\"//\"))\n )\n throw new TypeError(`brand.${key} must be an HTTP(S) or root-relative URL`);\n }\n const columns = options.columns ?? [\"name\", \"size\", \"modified\"];\n if (!Array.isArray(columns) || !columns.includes(\"name\"))\n throw new TypeError(\"columns must contain name and unique supported columns\");\n const columnIds = new Set<string>();\n for (const column of columns) {\n let id: string;\n if (typeof column === \"string\") {\n if (![\"name\", \"size\", \"modified\"].includes(column)) throw new TypeError(\"Unsupported column\");\n id = column;\n } else {\n if (\n typeof column !== \"object\" ||\n column === null ||\n Object.keys(column).some((key) => ![\"dataKey\", \"label\"].includes(key)) ||\n typeof column.dataKey !== \"string\" ||\n !column.dataKey ||\n typeof column.label !== \"string\" ||\n !column.label\n )\n throw new TypeError(\"Data columns require dataKey and label\");\n id = \"data:\" + column.dataKey;\n }\n if (columnIds.has(id)) throw new TypeError(\"columns must contain unique supported columns\");\n columnIds.add(id);\n }\n const actions = options.actions ?? [];\n if (\n !Array.isArray(actions) ||\n new Set(actions).size !== actions.length ||\n actions.some((key) => ![\"copy-link\", \"copy-path\", \"download\"].includes(key))\n )\n throw new TypeError(\"actions must contain unique supported actions\");\n const cssVariables = options.cssVariables ?? {};\n if (typeof cssVariables !== \"object\" || cssVariables === null || Array.isArray(cssVariables))\n throw new TypeError(\"cssVariables must be an object\");\n for (const [key, value] of Object.entries(cssVariables))\n if (\n !/^--[a-zA-Z][a-zA-Z0-9_-]*$/.test(key) ||\n typeof value !== \"string\" ||\n /[{};<>]/.test(value)\n )\n throw new TypeError(`Invalid CSS variable: ${key}`);\n return {\n language,\n dateOptions: {\n ...(options.locale === undefined ? {} : { locale: options.locale }),\n ...(options.timeZone === undefined ? {} : { timeZone: options.timeZone }),\n },\n direction,\n locale,\n timeZone,\n labels,\n brand: { ...brand },\n columns: columns.map((column) => (typeof column === \"string\" ? column : { ...column })),\n actions: [...actions],\n cssVariables: { ...cssVariables },\n };\n}\nexport const defaultCustomization = resolveCustomization();\nexport function label(\n ui: ResolvedThemeCustomization,\n key: keyof ThemeLabels,\n values: Readonly<Record<string, string | number>> = {},\n): string {\n return ui.labels[key].replace(/\\{([a-zA-Z]+)\\}/g, (match, name) =>\n Object.hasOwn(values, name) ? String(values[name]) : match,\n );\n}\nconst dateFormats = new Map<string, Intl.DateTimeFormat>();\nexport function formattedDate(\n value: string,\n ui: ResolvedThemeCustomization,\n local = false,\n): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return ui.labels.unknown;\n if (ui.dateOptions.locale === undefined && ui.dateOptions.timeZone === undefined)\n return local\n ? date.toLocaleString(undefined, { dateStyle: \"short\", timeStyle: \"short\" })\n : date.toISOString().slice(0, 16).replace(\"T\", \" \") + \" UTC\";\n const locale = ui.dateOptions.locale,\n timeZone = ui.dateOptions.timeZone ?? (local ? undefined : \"UTC\");\n const key = String(locale) + \"\\0\" + String(timeZone);\n let formatter = dateFormats.get(key);\n if (formatter === undefined) {\n formatter = new Intl.DateTimeFormat(locale, {\n timeZone,\n dateStyle: \"short\",\n timeStyle: \"short\",\n });\n if (dateFormats.size >= 32) dateFormats.delete(dateFormats.keys().next().value!);\n dateFormats.set(key, formatter);\n }\n return formatter.format(date);\n}\nexport function customizationCss(ui: ResolvedThemeCustomization): string {\n const declarations = Object.entries(ui.cssVariables)\n .map(([key, value]) => `${key}:${value}`)\n .join(\";\");\n return declarations\n ? `:root:root{${declarations}}${ui.cssVariables[\"--dw-font-family\"] ? \"body{font-family:var(--dw-font-family)}\" : \"\"}`\n : \"\";\n}\nexport async function copyEntryAction(\n action: ThemeAction,\n entry: { id: string; href: string | null },\n): Promise<void> {\n const value =\n action === \"copy-link\" && entry.href ? new URL(entry.href, document.baseURI).href : entry.id;\n if (!navigator.clipboard?.writeText) throw new Error(\"Clipboard unavailable\");\n await navigator.clipboard.writeText(value);\n}\n\n/** Publish only supplied customization instead of repeating defaults in every page. */\nexport function pickCustomization(options: ThemeCustomization): ThemeCustomization | undefined {\n const result: ThemeCustomization = {};\n for (const key of [\n \"language\",\n \"direction\",\n \"locale\",\n \"timeZone\",\n \"labels\",\n \"brand\",\n \"columns\",\n \"actions\",\n \"cssVariables\",\n ] as const)\n if (options[key] !== undefined) {\n const value = options[key];\n Object.assign(result, {\n [key]: Array.isArray(value)\n ? value.map((item) => (typeof item === \"object\" ? { ...item } : item))\n : typeof value === \"object\" && value !== null\n ? { ...value }\n : value,\n });\n }\n return Object.keys(result).length ? result : undefined;\n}\n\n/** Built-in factories fail on typos instead of silently ignoring configuration. */\nexport function assertThemeOptions(value: unknown, extraKeys: readonly string[]): void {\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n throw new TypeError(\"Theme options must be an object\");\n const allowed = [\n \"language\",\n \"direction\",\n \"locale\",\n \"timeZone\",\n \"labels\",\n \"brand\",\n \"columns\",\n \"actions\",\n \"cssVariables\",\n ...extraKeys,\n ];\n for (const key of Object.keys(value))\n if (!allowed.includes(key)) throw new TypeError(`Unsupported theme option: ${key}`);\n}\n\nexport function columnLabel(column: ThemeColumn, ui: ResolvedThemeCustomization): string {\n return typeof column === \"string\" ? ui.labels[column] : column.label;\n}\nexport function publicDataValue(value: unknown): string {\n return value === undefined || value === null\n ? \"\"\n : typeof value === \"object\"\n ? JSON.stringify(value)\n : String(value);\n}\n","import { loadListing, parseListingEntries, ListingDataError } from \"@dirwell/core/client\";\nimport { resolveCustomization } from \"./customization.ts\";\n\n/** Folder snapshots resolve relative URLs before History changes the document URL. */\nexport async function fetchThemePage(\n dataHref: string,\n pageHref: string,\n theme: string,\n signal: AbortSignal,\n fresh = false,\n attempt = 0,\n): Promise<Record<string, unknown>> {\n const source = new URL(dataHref, document.baseURI);\n if (source.origin !== location.origin)\n throw new ListingDataError(\"Folder leaves the theme origin\");\n const response = await fetch(source, { signal, cache: fresh ? \"no-store\" : \"default\" });\n if (!response.ok) throw new ListingDataError(\"Unavailable folder\");\n const value: unknown = await response.json();\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n throw new ListingDataError(\"Invalid folder snapshot\");\n const data = value as Record<string, unknown>;\n if (\n data.version !== 1 ||\n data.theme !== theme ||\n typeof data.title !== \"string\" ||\n typeof data.path !== \"string\" ||\n !Number.isSafeInteger(data.total) ||\n Number(data.total) < 0 ||\n !Array.isArray(data.breadcrumbs)\n )\n throw new ListingDataError(\"Unsupported folder snapshot\");\n if (data.metadataHead !== undefined && typeof data.metadataHead !== \"string\")\n throw new ListingDataError(\"Invalid folder metadata\");\n const sort = data.sort as Record<string, unknown> | null;\n if (\n !sort ||\n typeof sort !== \"object\" ||\n ![\"name\", \"size\", \"modified\"].includes(String(sort.field)) ||\n ![\"asc\", \"desc\"].includes(String(sort.direction)) ||\n ![\"natural\", \"locale\", \"unicode\"].includes(String(sort.nameMode)) ||\n typeof sort.directoriesFirst !== \"boolean\"\n )\n throw new ListingDataError(\"Invalid folder order\");\n if (theme === \"crosswave\") {\n const categories = data.categories;\n const ids = new Set<string>();\n if (\n !Array.isArray(categories) ||\n categories.length === 0 ||\n categories.some((category) => {\n if (\n typeof category !== \"object\" ||\n category === null ||\n typeof category.id !== \"string\" ||\n !category.id ||\n ids.has(category.id) ||\n typeof category.label !== \"string\" ||\n typeof category.svg !== \"string\"\n )\n return true;\n ids.add(category.id);\n return false;\n })\n )\n throw new ListingDataError(\"Invalid folder categories\");\n }\n const base = document.querySelector(\"base\")?.href ?? pageHref;\n const link = (raw: unknown): string | null => {\n if (raw === null) return null;\n if (typeof raw !== \"string\") throw new ListingDataError(\"Invalid folder link\");\n const url = new URL(raw, base);\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.origin !== location.origin)\n throw new ListingDataError(\"Unsupported folder link\");\n return url.href;\n };\n const entries = parseListingEntries(data.entries, base).map((entry) => ({\n ...entry,\n ...(entry.presentation\n ? {\n presentation: {\n ...entry.presentation,\n folderDataHref: link(entry.presentation.folderDataHref ?? null),\n },\n }\n : {}),\n }));\n if (entries.length > Number(data.total)) throw new ListingDataError(\"Invalid folder count\");\n if (data.page !== null) {\n const page = data.page as Record<string, unknown> | null;\n if (\n !page ||\n typeof page !== \"object\" ||\n !Number.isSafeInteger(page.number) ||\n Number(page.number) < 1 ||\n !Number.isSafeInteger(page.count) ||\n Number(page.count) < Number(page.number) ||\n !Number.isSafeInteger(page.offset) ||\n Number(page.offset) < 0 ||\n Number(page.offset) > Number(data.total) ||\n page.total !== data.total\n )\n throw new ListingDataError(\"Invalid folder pagination\");\n data.page = {\n ...page,\n href: link(page.href),\n previousHref: link(page.previousHref),\n nextHref: link(page.nextHref),\n };\n }\n if (data.ui !== undefined)\n resolveCustomization(data.ui as Parameters<typeof resolveCustomization>[0]);\n const result = {\n ...data,\n updatesHref: link(data.updatesHref ?? null),\n entries,\n dataHref: source.href,\n manifestHref: link(data.manifestHref),\n rootHref: link(data.rootHref),\n rootDataHref: link(data.rootDataHref),\n parentHref: link(data.parentHref),\n parentDataHref: link(data.parentDataHref),\n breadcrumbs: data.breadcrumbs.map((raw) => {\n if (\n typeof raw !== \"object\" ||\n raw === null ||\n !(\"name\" in raw) ||\n !(\"href\" in raw) ||\n !(\"dataHref\" in raw) ||\n typeof raw.name !== \"string\"\n )\n throw new ListingDataError(\"Invalid breadcrumb\");\n return { name: raw.name, href: link(raw.href), dataHref: link(raw.dataHref) };\n }),\n };\n // Keep the current UI until the complete target listing and page revision agree.\n if (result.manifestHref) {\n const loaded = await loadListing(result.manifestHref, {\n signal,\n cache: fresh ? \"no-store\" : \"default\",\n });\n if (\n loaded.manifest.total !== data.total ||\n (data.listingRevision !== undefined && loaded.manifest.revision !== data.listingRevision)\n ) {\n if (attempt < 2) return fetchThemePage(dataHref, pageHref, theme, signal, true, attempt + 1);\n throw new ListingDataError(\"Folder changed while refreshing\");\n }\n result.entries = [...loaded.entries];\n }\n return result;\n}\n\n// HMR can remount a wrapper while the outer explorer root stays mounted.\n// Keep only its current public model; production imports never register roots.\nconst hotModels = new WeakMap<Element, Record<string, unknown>>();\nexport function restoreThemePage(\n initial: Record<string, unknown>,\n hot: boolean,\n): Record<string, unknown> {\n if (!hot || typeof document === \"undefined\") return initial;\n const root = document.querySelector(\"[data-dirwell-theme]\");\n if (!root) return initial;\n const snapshot = hotModels.get(root) ?? initial;\n hotModels.set(root, snapshot);\n return snapshot;\n}\n\n/** Copy only inert metadata elements; never insert snapshot HTML or event attributes. */\nexport function applyThemeMetadata(page: Record<string, unknown>, pageHref: string): void {\n const root = document.querySelector(\"[data-dirwell-theme]\");\n if (root && hotModels.has(root)) hotModels.set(root, page);\n document.title = typeof page.title === \"string\" ? page.title : \"\";\n const template = document.createElement(\"template\");\n template.innerHTML = typeof page.metadataHead === \"string\" ? page.metadataHead : \"\";\n document.head.querySelectorAll(\"[data-dirwell-metadata]\").forEach((element) => element.remove());\n const base = document.querySelector(\"base\")?.href ?? pageHref;\n const url = (value: string): string | null => {\n try {\n const target = new URL(value, base);\n return [\"http:\", \"https:\"].includes(target.protocol) ? target.href : null;\n } catch {\n return null;\n }\n };\n for (const element of template.content.children) {\n if (!element.hasAttribute(\"data-dirwell-metadata\")) continue;\n let next: HTMLElement;\n if (element.tagName === \"META\") {\n const attribute = element.hasAttribute(\"property\") ? \"property\" : \"name\";\n const key = element.getAttribute(attribute) ?? \"\";\n if (!/^(?:description|og:[a-z_:]+|twitter:[a-z_:]+)$/i.test(key)) continue;\n let content = element.getAttribute(\"content\") ?? \"\";\n if ([\"og:image\", \"og:url\", \"twitter:image\"].includes(key)) {\n const resolved = url(content);\n if (resolved === null) continue;\n content = resolved;\n }\n next = document.createElement(\"meta\");\n next.setAttribute(attribute, key);\n next.setAttribute(\"content\", content);\n } else if (element.tagName === \"LINK\" && element.getAttribute(\"rel\") === \"canonical\") {\n const href = url(element.getAttribute(\"href\") ?? \"\");\n if (href === null) continue;\n next = document.createElement(\"link\");\n next.setAttribute(\"rel\", \"canonical\");\n next.setAttribute(\"href\", href);\n } else continue;\n next.setAttribute(\"data-dirwell-metadata\", \"\");\n document.head.append(next);\n }\n}\n","import type { ListingEntry, SortOptions } from \"@dirwell/core\";\nexport const directoryLike = (entry: ListingEntry) =>\n entry.kind === \"directory\" || entry.link?.targetKind === \"directory\";\nexport const entryType = (entry: ListingEntry) =>\n entry.kind === \"symlink\" ? \"link\" : directoryLike(entry) ? \"directory\" : \"file\";\nexport function fuzzy(query: string, value: string): number | null {\n let score = 0,\n start = 0,\n last = -2;\n for (const character of query.trim().toLocaleLowerCase()) {\n const index = value.toLocaleLowerCase().indexOf(character, start);\n if (index < 0) return null;\n if (index === last + 1) score += 8;\n if (index === 0 || /[\\s/_.-]/.test(value[index - 1] ?? \"\")) score += 5;\n score += Math.max(0, 4 - index * 0.05);\n last = index;\n start = index + 1;\n }\n return score - value.length * 0.01;\n}\nexport function visibleRecords(\n entries: readonly ListingEntry[],\n query: string,\n types: readonly string[],\n sort: Required<SortOptions>,\n): ListingEntry[] {\n return entries\n .map((entry) => ({ entry, score: fuzzy(query, `${entry.name} ${entry.link?.target ?? \"\"}`) }))\n .filter((item) => types.includes(entryType(item.entry)) && item.score !== null)\n .sort((left, right) => {\n if (query.trim() && left.score !== right.score) return (right.score ?? 0) - (left.score ?? 0);\n const a = left.entry,\n b = right.entry;\n if (sort.directoriesFirst && directoryLike(a) !== directoryLike(b))\n return directoryLike(a) ? -1 : 1;\n const name = () =>\n sort.nameMode === \"unicode\"\n ? compareUnicode(a.name, b.name)\n : a.name.localeCompare(b.name, undefined, {\n numeric: sort.nameMode === \"natural\",\n sensitivity: \"base\",\n });\n const primary =\n (sort.field === \"name\"\n ? name()\n : sort.field === \"size\"\n ? (a.kind === \"directory\" ? 0 : a.size) - (b.kind === \"directory\" ? 0 : b.size)\n : a.modifiedAt.localeCompare(b.modifiedAt)) || name();\n return (sort.direction === \"asc\" ? primary : -primary) || compareUnicode(a.id, b.id);\n })\n .map((item) => item.entry);\n}\nfunction compareUnicode(left: string, right: string): number {\n const a = [...left],\n b = [...right];\n for (let i = 0; i < Math.min(a.length, b.length); i++) {\n const delta = (a[i]?.codePointAt(0) ?? 0) - (b[i]?.codePointAt(0) ?? 0);\n if (delta) return delta;\n }\n return a.length - b.length;\n}\nexport function size(bytes: number): string {\n const units = [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\"];\n let value = bytes,\n index = 0;\n while (value >= 1024 && index < 4) {\n value /= 1024;\n index++;\n }\n return `${value.toFixed(index === 0 || value >= 100 ? 0 : 1)} ${units[index]}`;\n}\nexport function modified(value: string, local = false): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"Unknown\";\n return local\n ? date.toLocaleString(undefined, { dateStyle: \"short\", timeStyle: \"short\" })\n : `${date.toISOString().slice(0, 16).replace(\"T\", \" \")} UTC`;\n}\n","import * as $ from 'svelte/internal/server';\nimport { onMount, tick, untrack } from \"svelte\";\nimport { readView, createViewHistory } from \"../../shared-theme/src/view-state.ts\";\nimport { entryIcon } from \"../../shared-theme/src/icons.ts\";\nimport { loadListing } from \"@dirwell/core/client\";\nimport { fetchThemePage, applyThemeMetadata, restoreThemePage } from \"../../shared-theme/src/navigation.ts\";\nimport { visibleRecords, directoryLike, entryType, size, fuzzy } from \"../../shared-theme/src/records.ts\";\n\nimport {\n\tresolveCustomization,\n\tlabel,\n\tformattedDate,\n\tcopyEntryAction,\n\tcolumnLabel,\n\tpublicDataValue\n} from \"../../shared-theme/src/customization.ts\";\n\nexport default function Ledger($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\tlet { model: initialModel, header, row, actions, footer } = $$props;\n\t\tconst snapshot = untrack(() => restoreThemePage(initialModel, Boolean(import.meta.hot)));\n\t\tlet model = snapshot;\n\t\tlet entries = snapshot.entries;\n\t\tlet query = \"\";\n\t\tlet types = [\"directory\", \"file\", \"link\"];\n\t\tlet sort = snapshot.sort;\n\t\tlet scheme = \"system\";\n\t\tlet selected = null;\n\t\tlet ready = false;\n\t\tlet busy = false;\n\t\tlet error = \"\";\n\t\tlet failure = null;\n\t\tlet timestamp = null;\n\t\tlet composing = false;\n\t\tlet scrollTop = 0;\n\t\tlet viewportHeight = 800;\n\t\tlet globalOpen = false;\n\t\tlet globalQuery = \"\";\n\t\tlet globalRows = [];\n\t\tlet globalStatus = resolveCustomization(snapshot.ui).labels.beginArchive;\n\t\tlet pendingUpdates = null;\n\t\tlet ui = $.derived(() => resolveCustomization(model.ui));\n\t\tlet archiveFailed = false;\n\t\tlet countParts = $.derived(() => label(ui(), complete() ? \"entries\" : \"pageEntries\", { count: \"__COUNT__\", total: model.total }).split(\"__COUNT__\"));\n\t\tlet heights = new Map();\n\n\t\tlet updatesHref = $.derived(() => ready && model.updatesHref\n\t\t\t? new URL(model.updatesHref, document.baseURI).href\n\t\t\t: null);\n\n\t\tlet complete = $.derived(() => entries.length === model.total);\n\t\tlet rows = $.derived(() => visibleRecords(entries, composing ? \"\" : query, types, sort));\n\t\tlet virtual = $.derived(() => ready && rows().length > 500);\n\n\t\tlet offsets = $.derived(() => {\n\t\t\tconst values = [0];\n\n\t\t\tfor (const entry of rows()) values.push(values.at(-1) + (heights.get(entry.id) ?? 76));\n\n\t\t\treturn values;\n\t\t});\n\n\t\tlet start = $.derived(() => {\n\t\t\tif (!virtual()) return 0;\n\n\t\t\tlet low = 0, high = rows().length;\n\n\t\t\twhile (low < high) {\n\t\t\t\tconst mid = low + high >> 1;\n\n\t\t\t\tif (offsets()[mid + 1] <= scrollTop) low = mid + 1; else high = mid;\n\t\t\t}\n\n\t\t\treturn Math.max(0, low - 5);\n\t\t});\n\n\t\tlet end = $.derived(() => {\n\t\t\tif (!virtual()) return rows().length;\n\n\t\t\tlet low = 0, high = rows().length;\n\n\t\t\twhile (low < high) {\n\t\t\t\tconst middle = low + high >> 1;\n\n\t\t\t\tif (offsets()[middle + 1] <= scrollTop + viewportHeight) low = middle + 1; else high = middle;\n\t\t\t}\n\n\t\t\treturn Math.min(rows().length, Math.max(start() + 35, low + 5));\n\t\t});\n\n\t\tfunction measure(node, id) {\n\t\t\tif (typeof ResizeObserver === \"undefined\") return;\n\n\t\t\tconst observer = new ResizeObserver(() => {\n\t\t\t\tconst value = node.getBoundingClientRect().height;\n\n\t\t\t\tif (value > 0 && heights.get(id) !== value) {\n\t\t\t\t\tconst next = new Map(heights);\n\n\t\t\t\t\tnext.set(id, value);\n\t\t\t\t\theights = next;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tobserver.observe(node);\n\n\t\t\treturn { destroy: () => observer.disconnect() };\n\t\t}\n\n\t\tlet list = void 0;\n\t\tlet searchInput = void 0;\n\t\tlet globalInput = void 0;\n\t\tlet timeDialog = void 0;\n\t\tlet globalDialog = void 0;\n\t\tlet navigation = 0;\n\t\tlet abort;\n\t\tlet archiveAbort;\n\t\tlet archiveRequest = 0;\n\t\tlet archiveCache = null;\n\t\tlet archiveCacheHref = \"\";\n\t\tlet archiveCacheAt = 0;\n\t\tlet viewHistory;\n\t\tlet retryRequest = null;\n\n\t\tconst viewDefaults = (page) => ({\n\t\t\tquery: \"\",\n\t\t\tsort: page.sort,\n\t\t\ttypes: [\"directory\", \"file\", \"link\"]\n\t\t});\n\n\t\tfunction saveView() {\n\t\t\tif (!viewHistory) return;\n\n\t\t\tviewHistory.save(\n\t\t\t\tnew URL(model.dataHref, document.baseURI).href,\n\t\t\t\tmodel.path,\n\t\t\t\t{\n\t\t\t\t\tquery,\n\t\t\t\t\ttypes,\n\t\t\t\t\tsort,\n\t\t\t\t\tselected,\n\t\t\t\t\twindowY: window.scrollY,\n\t\t\t\t\tlistTop: scrollTop\n\t\t\t\t},\n\t\t\t\tviewDefaults(model)\n\t\t\t);\n\t\t}\n\n\t\tfunction retry() {\n\t\t\tif (failure === \"folder\" && retryRequest) openFolder(...retryRequest, true); else openFolder(model.dataHref, location.href, false, true);\n\t\t}\n\n\t\tconst isDirectory = directoryLike;\n\n\t\tfunction safeHref(record) {\n\t\t\tif (typeof location !== \"undefined\" && location.protocol === \"file:\" && isDirectory(record) && !record.exitsExplorer && record.href?.endsWith(\"/\")) return record.href + \"index.html\";\n\n\t\t\treturn record.href;\n\t\t}\n\n\t\tasync function hydrateData() {\n\t\t\tif (complete() || !model.manifestHref || location.protocol === \"file:\") return;\n\n\t\t\tconst local = abort, token = navigation;\n\n\t\t\tbusy = true;\n\n\t\t\ttry {\n\t\t\t\tconst loaded = await loadListing(new URL(model.manifestHref, document.baseURI).href, {\n\t\t\t\t\tsignal: local.signal,\n\t\t\t\t\tcache: model.updatesHref ? \"no-store\" : \"default\"\n\t\t\t\t});\n\n\t\t\t\tif (token === navigation && !local.signal.aborted) entries = loaded.entries;\n\t\t\t} catch(cause) {\n\t\t\t\tif (token === navigation && !local.signal.aborted) {\n\t\t\t\t\terror = ui().labels.listingError;\n\t\t\t\t\tfailure = \"listing\";\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (token === navigation) busy = false;\n\t\t\t}\n\t\t}\n\n\t\tasync function navigate(event, record) {\n\t\t\tsaveView();\n\n\t\t\tconst dataHref = record.presentation?.folderDataHref;\n\n\t\t\tif (record.exitsExplorer || event?.altKey || event?.ctrlKey || event?.metaKey || event?.shiftKey || event?.button > 0 || typeof dataHref !== \"string\" || location.protocol === \"file:\") return;\n\n\t\t\tevent?.preventDefault();\n\t\t\tawait openFolder(dataHref, new URL(record.href, document.baseURI).href, true);\n\t\t}\n\n\t\tasync function openFolder(\n\t\t\tdataHref,\n\t\t\turl,\n\t\t\tpush,\n\t\t\trefresh = false,\n\t\t\trestoreState = null,\n\t\t\tfresh = false\n\t\t) {\n\t\t\tif (push) saveView();\n\n\t\t\tconst token = ++navigation;\n\n\t\t\tabort?.abort();\n\n\t\t\tconst local = abort = new AbortController();\n\n\t\t\tbusy = true;\n\t\t\terror = \"\";\n\t\t\tfailure = null;\n\n\t\t\ttry {\n\t\t\t\tconst next = await fetchThemePage(dataHref, url, \"ledger\", local.signal, refresh || fresh);\n\t\t\t\tlet nextEntries = next.entries;\n\n\t\t\t\tif (refresh && next.manifestHref && nextEntries.length !== next.total) {\n\t\t\t\t\tnextEntries = (await loadListing(next.manifestHref, { signal: local.signal, cache: \"no-store\" })).entries;\n\t\t\t\t}\n\n\t\t\t\tif (token !== navigation || local.signal.aborted) return;\n\t\t\t\tif (!refresh) viewHistory.commit(next.dataHref, next.path, url, push);\n\n\t\t\t\tmodel = next;\n\t\t\t\tentries = nextEntries;\n\t\t\t\tretryRequest = null;\n\n\t\t\t\tif (!refresh) {\n\t\t\t\t\tconst view = readView(url, \"ledger\", next.path, viewDefaults(next), [], restoreState);\n\n\t\t\t\t\tquery = view.query;\n\t\t\t\t\ttypes = view.types;\n\t\t\t\t\tsort = view.sort;\n\t\t\t\t\tselected = view.selected;\n\t\t\t\t\tscrollTop = view.listTop;\n\t\t\t\t}\n\n\t\t\t\tapplyThemeMetadata(next, url);\n\t\t\t\tawait hydrateData();\n\n\t\t\t\tif (!refresh) {\n\t\t\t\t\tconst view = readView(url, \"ledger\", next.path, viewDefaults(next), [], restoreState);\n\n\t\t\t\t\tawait tick();\n\n\t\t\t\t\tif (selected && !rows().some((entry) => entry.id === selected)) selected = null;\n\n\t\t\t\t\twindow.scrollTo({ top: view.windowY });\n\n\t\t\t\t\tif (restoreState && selected) list?.querySelector(`[data-id=\"${CSS.escape(selected)}\"] a`)?.focus({ preventScroll: true });\n\t\t\t\t}\n\t\t\t} catch(cause) {\n\t\t\t\tif (token === navigation && !local.signal.aborted) {\n\t\t\t\t\terror = ui().labels.folderError;\n\t\t\t\t\tfailure = \"folder\";\n\t\t\t\t\tretryRequest = [dataHref, url, push, refresh, restoreState];\n\t\t\t\t\tviewHistory?.rollback();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (token === navigation) busy = false;\n\t\t\t}\n\t\t}\n\n\t\tfunction navigateLink(event, href, dataHref) {\n\t\t\tif (typeof href !== \"string\" || typeof dataHref !== \"string\" || event?.altKey || event?.ctrlKey || event?.metaKey || event?.shiftKey || event?.button > 0 || location.protocol === \"file:\") return;\n\n\t\t\tevent?.preventDefault();\n\t\t\topenFolder(dataHref, new URL(href, document.baseURI).href, true);\n\t\t}\n\n\t\tasync function move(index) {\n\t\t\tconst target = Math.max(0, Math.min(rows().length - 1, index));\n\t\t\tconst row = rows()[target];\n\n\t\t\tif (!row) return;\n\n\t\t\tselected = row.id;\n\n\t\t\tif (virtual()) {\n\t\t\t\tscrollTop = Math.max(0, offsets()[target] - 100);\n\n\t\t\t\tif (list) window.scrollTo({\n\t\t\t\t\ttop: list.getBoundingClientRect().top + window.scrollY + scrollTop\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tawait tick();\n\t\t\tlist?.querySelector(`[data-order=\"${index}\"] a`)?.focus({ preventScroll: true });\n\t\t}\n\n\t\tfunction keyboard(event) {\n\t\t\tif (event.isComposing || event.altKey || event.ctrlKey || event.metaKey) return;\n\n\t\t\tif (globalOpen) {\n\t\t\t\tif (event.key === \"Escape\") {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tglobalOpen = false;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (timestamp) {\n\t\t\t\tif (event.key === \"Escape\") timestamp = null;\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (event.target?.closest?.(\"[data-dirwell-actions]\")) return;\n\n\t\t\tconst editable = (/INPUT|TEXTAREA|SELECT/).test(event.target?.tagName ?? \"\");\n\n\t\t\tif (event.key === \"/\" && !editable) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tsearchInput?.focus();\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (editable) {\n\t\t\t\tif (event.key === \"Escape\") {\n\t\t\t\t\tquery = \"\";\n\t\t\t\t\tsearchInput?.blur();\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (event.key === \"Backspace\" && model.parentHref) {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif (location.protocol === \"file:\" || typeof model.parentDataHref !== \"string\") location.href = model.parentHref; else openFolder(model.parentDataHref, new URL(model.parentHref, document.baseURI).href, true);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst index = rows().findIndex((row) => row.id === selected);\n\n\t\t\tif ([\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tmove(event.key === \"Home\"\n\t\t\t\t\t? 0\n\t\t\t\t\t: event.key === \"End\"\n\t\t\t\t\t\t? rows().length - 1\n\t\t\t\t\t\t: index + (event.key === \"ArrowDown\" ? 1 : -1));\n\t\t\t}\n\t\t}\n\n\t\tfunction updateScheme(value) {\n\t\t\tscheme = value;\n\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(\"dirwell-color-scheme\", value);\n\t\t\t} catch {}\n\t\t}\n\n\t\tasync function searchArchive() {\n\t\t\tconst token = ++archiveRequest;\n\n\t\t\tarchiveAbort?.abort();\n\n\t\t\tconst local = archiveAbort = new AbortController();\n\n\t\t\tglobalRows = [];\n\t\t\tarchiveFailed = false;\n\n\t\t\tconst query = globalQuery.trim();\n\n\t\t\tif (!query) {\n\t\t\t\tglobalStatus = ui().labels.beginArchive;\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tglobalStatus = ui().labels.searchingArchive;\n\n\t\t\ttry {\n\t\t\t\tconst url = new URL(model.searchIndexHref, document.baseURI);\n\t\t\t\tlet all = archiveCacheHref === url.href && Date.now() - archiveCacheAt < 60000 ? archiveCache : null;\n\n\t\t\t\tif (all === null) {\n\t\t\t\t\tconst response = await fetch(url, { signal: local.signal });\n\n\t\t\t\t\tif (!response.ok) throw new Error(\"Unavailable archive\");\n\n\t\t\t\t\tconst index = await response.json();\n\n\t\t\t\t\tif (index.version !== 3 || !Array.isArray(index.shards) || !Number.isSafeInteger(index.count) || index.count > 100000) throw new Error(\"Unsupported archive\");\n\n\t\t\t\t\tall = [];\n\n\t\t\t\t\tfor (const shard of index.shards) {\n\t\t\t\t\t\tif (typeof shard !== \"string\") throw new Error(\"Invalid shard\");\n\n\t\t\t\t\t\tconst shardUrl = new URL(shard, url);\n\n\t\t\t\t\t\tif (shardUrl.origin !== url.origin) throw new Error(\"Unsafe shard\");\n\n\t\t\t\t\t\tconst chunk = await fetch(shardUrl, { signal: local.signal });\n\n\t\t\t\t\t\tif (!chunk.ok) throw new Error(\"Unavailable shard\");\n\n\t\t\t\t\t\tconst data = await chunk.json();\n\n\t\t\t\t\t\tif (!Array.isArray(data.entries) || all.length + data.entries.length > 100000) throw new Error(\"Invalid archive\");\n\n\t\t\t\t\t\tfor (const record of data.entries) {\n\t\t\t\t\t\t\tif (typeof record.name !== \"string\" || typeof record.path !== \"string\" || typeof record.exitsExplorer !== \"boolean\") throw new Error(\"Invalid archive record\");\n\n\t\t\t\t\t\t\tconst href = record.href === null ? null : new URL(record.href, url);\n\n\t\t\t\t\t\t\tif (href && ![\"http:\", \"https:\"].includes(href.protocol)) throw new Error(\"Unsupported archive link\");\n\n\t\t\t\t\t\t\tall.push({\n\t\t\t\t\t\t\t\tname: record.name,\n\t\t\t\t\t\t\t\tpath: record.path,\n\t\t\t\t\t\t\t\thref: href?.href ?? null,\n\t\t\t\t\t\t\t\texitsExplorer: record.exitsExplorer\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (token !== archiveRequest || local.signal.aborted) return;\n\n\t\t\t\t\tarchiveCache = all;\n\t\t\t\t\tarchiveCacheHref = url.href;\n\t\t\t\t\tarchiveCacheAt = Date.now();\n\t\t\t\t}\n\n\t\t\t\tconst matches = all.map((record) => ({ record, score: fuzzy(query, record.name + \" \" + record.path) })).filter((item) => item.score !== null).sort((a, b) => b.score - a.score || a.record.path.localeCompare(b.record.path));\n\n\t\t\t\tif (token !== archiveRequest || local.signal.aborted) return;\n\n\t\t\t\tglobalRows = matches.slice(0, 100).map((item) => item.record);\n\n\t\t\t\tglobalStatus = matches.length > 100\n\t\t\t\t\t? label(ui(), \"truncatedResults\", { shown: 100, count: matches.length })\n\t\t\t\t\t: label(ui(), \"archiveResults\", { count: matches.length });\n\t\t\t} catch {\n\t\t\t\tif (token === archiveRequest && !local.signal.aborted) {\n\t\t\t\t\tglobalStatus = ui().labels.archiveError;\n\t\t\t\t\tarchiveFailed = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tonMount(() => {\n\t\t\tviewportHeight = innerHeight;\n\t\t\tready = true;\n\t\t\tabort = new AbortController();\n\n\t\t\ttry {\n\t\t\t\tconst stored = localStorage.getItem(\"dirwell-color-scheme\");\n\n\t\t\t\tif ([\"system\", \"light\", \"dark\"].includes(stored)) scheme = stored;\n\t\t\t} catch {}\n\n\t\t\tviewHistory = createViewHistory(\"ledger\");\n\n\t\t\tconst view = readView(location.href, \"ledger\", model.path, viewDefaults(model), [], history.state);\n\n\t\t\tquery = view.query;\n\t\t\ttypes = view.types;\n\t\t\tsort = view.sort;\n\t\t\tselected = view.selected;\n\t\t\tscrollTop = view.listTop;\n\t\t\tsaveView();\n\n\t\t\tconst onPop = (event) => {\n\t\t\t\tif (event.state?.dataHref) openFolder(event.state.dataHref, location.href, false, false, event.state); else location.reload();\n\t\t\t};\n\n\t\t\twindow.addEventListener(\"popstate\", onPop);\n\t\t\thydrateData();\n\n\t\t\treturn () => {\n\t\t\t\tabort?.abort();\n\t\t\t\tarchiveAbort?.abort();\n\t\t\t\twindow.removeEventListener(\"popstate\", onPop);\n\t\t\t};\n\t\t});\n\n\t\t$$renderer.push(`<header class=\"page-header\"><div class=\"wordmark\">`);\n\n\t\tif (header) {\n\t\t\t$$renderer.push('<!--[0-->');\n\t\t\theader($$renderer, { model });\n\t\t\t$$renderer.push(`<!---->`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\n\t\t\tif (ui().brand.logoUrl) {\n\t\t\t\t$$renderer.push(`<!--[0--><img${$.attr('src', ui().brand.logoUrl)}${$.attr('alt', ui().brand.logoAlt ?? \"\")} width=\"40\" height=\"40\"/>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--> <h1>${$.escape(ui().brand.name ?? model.title)}</h1> <span>${$.escape(ui().labels.archive)}</span>`);\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></div> <nav${$.attr('aria-label', ui().labels.breadcrumb)}><a${$.attr('href', model.rootHref)}>${$.escape(ui().labels.home)}</a><!--[-->`);\n\n\t\tconst each_array = $.ensure_array_like(model.breadcrumbs);\n\n\t\tfor (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {\n\t\t\tlet crumb = each_array[$$index];\n\n\t\t\t$$renderer.push(`<!---->/ <a${$.attr('href', crumb.href)}>${$.escape(crumb.name)}</a>`);\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></nav></header> <main data-explorer=\"\" data-framework=\"svelte\"${$.attr('aria-busy', busy)}><div class=\"toolbar\"><label class=\"search-field\">${$.escape(ui().labels.searchDirectory)}<input type=\"search\"${$.attr('placeholder', ui().labels.searchFiles)}${$.attr('value', query)}${$.attr('disabled', !ready || !complete(), true)}/></label> <fieldset${$.attr('disabled', !ready || !complete(), true)}><legend>${$.escape(ui().labels.types)}</legend><!--[-->`);\n\n\t\tconst each_array_1 = $.ensure_array_like([\"directory\", \"file\", \"link\"]);\n\n\t\tfor (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {\n\t\t\tlet type = each_array_1[$$index_1];\n\n\t\t\t$$renderer.push(`<label><input type=\"checkbox\"${$.attr('checked', types.includes(type), true)}/>${$.escape(ui().labels[type])}</label>`);\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></fieldset> <label>${$.escape(ui().labels.sort)}`);\n\n\t\t$$renderer.select(\n\t\t\t{\n\t\t\t\tvalue: sort.field,\n\t\t\t\tdisabled: !ready || !complete(),\n\t\t\t\tonchange: (event) => sort = { ...sort, field: event.currentTarget.value }\n\t\t\t},\n\t\t\t($$renderer) => {\n\t\t\t\t$$renderer.option({ value: 'name' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.name)}`);\n\t\t\t\t});\n\n\t\t\t\t$$renderer.option({ value: 'size' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.size)}`);\n\t\t\t\t});\n\n\t\t\t\t$$renderer.option({ value: 'modified' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.modified)}`);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\t$$renderer.push(`</label> <label>${$.escape(ui().labels.names)}`);\n\n\t\t$$renderer.select(\n\t\t\t{\n\t\t\t\tvalue: sort.nameMode,\n\t\t\t\tdisabled: !ready || !complete(),\n\t\t\t\tonchange: (event) => sort = { ...sort, nameMode: event.currentTarget.value }\n\t\t\t},\n\t\t\t($$renderer) => {\n\t\t\t\t$$renderer.option({ value: 'natural' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.natural)}`);\n\t\t\t\t});\n\n\t\t\t\t$$renderer.option({ value: 'locale' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.locale)}`);\n\t\t\t\t});\n\n\t\t\t\t$$renderer.option({ value: 'unicode' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.unicode)}`);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\t$$renderer.push(`</label> <label>${$.escape(ui().labels.order)}`);\n\n\t\t$$renderer.select(\n\t\t\t{\n\t\t\t\tvalue: sort.direction,\n\t\t\t\tdisabled: !ready || !complete(),\n\t\t\t\tonchange: (event) => sort = { ...sort, direction: event.currentTarget.value }\n\t\t\t},\n\t\t\t($$renderer) => {\n\t\t\t\t$$renderer.option({ value: 'asc' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.ascending)}`);\n\t\t\t\t});\n\n\t\t\t\t$$renderer.option({ value: 'desc' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.descending)}`);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\t$$renderer.push(`</label> <label><input type=\"checkbox\"${$.attr('checked', sort.directoriesFirst, true)}${$.attr('disabled', !ready || !complete(), true)}/>${$.escape(ui().labels.directoriesFirst)}</label> <label>${$.escape(ui().labels.appearance)}`);\n\n\t\t$$renderer.select(\n\t\t\t{\n\t\t\t\tvalue: scheme,\n\t\t\t\tdisabled: !ready,\n\t\t\t\tonchange: (event) => updateScheme(event.currentTarget.value)\n\t\t\t},\n\t\t\t($$renderer) => {\n\t\t\t\t$$renderer.option({ value: 'system' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.system)}`);\n\t\t\t\t});\n\n\t\t\t\t$$renderer.option({ value: 'light' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.light)}`);\n\t\t\t\t});\n\n\t\t\t\t$$renderer.option({ value: 'dark' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.dark)}`);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\t$$renderer.push(`</label> `);\n\n\t\tif (model.searchIndexHref) {\n\t\t\t$$renderer.push(`<!--[0--><button${$.attr('disabled', !ready || !model.searchIndexHref, true)}>${$.escape(ui().labels.searchArchive)}</button>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></div> <section class=\"listing-card\"><div class=\"listing-summary\">${$.escape(countParts()[0])}<span data-visible-count=\"\">${$.escape(complete() ? rows().length : entries.length)}</span>${$.escape(countParts().slice(1).join(\"__COUNT__\"))}<span role=\"status\" aria-live=\"polite\">${$.escape(busy ? ui().labels.loading : error)}</span></div> `);\n\n\t\tif (failure && failure !== \"copy\") {\n\t\t\t$$renderer.push(`<!--[0--><button${$.attr('disabled', busy, true)}>${$.escape(ui().labels.retry)}</button>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--> `);\n\n\t\tif (failure === \"folder\" && retryRequest) {\n\t\t\t$$renderer.push(`<!--[0--><a${$.attr('href', retryRequest[1])}>${$.escape(ui().labels.openNative)}</a>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--> <div class=\"entry-head\"${$.attr('data-custom-columns', Boolean(model.ui?.columns))}${$.attr_style('', {\n\t\t\t'grid-template-columns': model.ui?.columns\n\t\t\t\t? ui().columns.map((column) => column === \"name\"\n\t\t\t\t\t? \"minmax(0,1fr)\"\n\t\t\t\t\t: typeof column === \"object\" ? \"minmax(0,12rem)\" : \"minmax(6rem,max-content)\").join(\" \")\n\t\t\t\t: undefined\n\t\t})}><!--[-->`);\n\n\t\tconst each_array_2 = $.ensure_array_like(ui().columns);\n\n\t\tfor (let $$index_2 = 0, $$length = each_array_2.length; $$index_2 < $$length; $$index_2++) {\n\t\t\tlet column = each_array_2[$$index_2];\n\n\t\t\t$$renderer.push(`<span>${$.escape(columnLabel(column, ui()))}</span>`);\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></div> <ul class=\"entry-list\">`);\n\n\t\tif (model.parentHref) {\n\t\t\t$$renderer.push(`<!--[0--><li class=\"entry\"><a${$.attr('href', model.parentHref)}>../</a></li>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--> `);\n\n\t\tif (start()) {\n\t\t\t$$renderer.push(`<!--[0--><li aria-hidden=\"true\"${$.attr_style('', { height: offsets()[start()] + \"px\" })}></li>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--> <!--[-->`);\n\n\t\tconst each_array_3 = $.ensure_array_like(rows().slice(start(), end()));\n\n\t\tfor (let index = 0, $$length = each_array_3.length; index < $$length; index++) {\n\t\t\tlet entry = each_array_3[index];\n\n\t\t\t$$renderer.push(`<li class=\"entry\" data-entry=\"\"${$.attr('data-custom-columns', Boolean(model.ui?.columns))}${$.attr('data-id', entry.id)}${$.attr('data-order', start() + index)}${$.attr('data-active', selected === entry.id)}${$.attr_style('', {\n\t\t\t\t'grid-template-columns': model.ui?.columns\n\t\t\t\t\t? ui().columns.map((column) => column === \"name\" ? \"minmax(0,1fr)\" : \"minmax(6rem,max-content)\").join(\" \")\n\t\t\t\t\t: undefined\n\t\t\t})}><!--[-->`);\n\n\t\t\tconst each_array_4 = $.ensure_array_like(ui().columns);\n\n\t\t\tfor (let $$index_3 = 0, $$length = each_array_4.length; $$index_3 < $$length; $$index_3++) {\n\t\t\t\tlet column = each_array_4[$$index_3];\n\n\t\t\t\tif (column === \"name\") {\n\t\t\t\t\t$$renderer.push(`<!--[0--><span class=\"identity\">`);\n\n\t\t\t\t\tif (entry.href) {\n\t\t\t\t\t\t$$renderer.push(`<!--[0--><a class=\"name\"${$.attr('href', safeHref(entry))}${$.attr('target', entry.exitsExplorer ? \"_blank\" : undefined)}${$.attr('rel', entry.exitsExplorer ? \"noopener\" : undefined)}>`);\n\n\t\t\t\t\t\tif (row) {\n\t\t\t\t\t\t\t$$renderer.push('<!--[0-->');\n\t\t\t\t\t\t\trow($$renderer, { model, entry, selected: selected === entry.id });\n\t\t\t\t\t\t\t$$renderer.push(`<!---->`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$$renderer.push(`<!--[-1--><span class=\"file-icon\" aria-hidden=\"true\">${$.html(entryIcon(entryType(entry)))}</span> ${$.escape(entry.name)}${$.escape(isDirectory(entry) ? \"/\" : \"\")}`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$$renderer.push(`<!--]--></a>`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$$renderer.push(`<!--[-1--><span>`);\n\n\t\t\t\t\t\tif (row) {\n\t\t\t\t\t\t\t$$renderer.push('<!--[0-->');\n\t\t\t\t\t\t\trow($$renderer, { model, entry, selected: selected === entry.id });\n\t\t\t\t\t\t\t$$renderer.push(`<!---->`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$$renderer.push(`<!--[-1-->${$.escape(entry.name)}`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$$renderer.push(`<!--]--></span>`);\n\t\t\t\t\t}\n\n\t\t\t\t\t$$renderer.push(`<!--]-->`);\n\n\t\t\t\t\tif (entry.link) {\n\t\t\t\t\t\t$$renderer.push(`<!--[0--><small class=\"target\">${$.escape(entry.link.unavailable ? ui().labels.unavailable + \" · \" : \"→ \")}${$.escape(entry.link.target)}</small>`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t\t\t}\n\n\t\t\t\t\t$$renderer.push(`<!--]--></span>`);\n\t\t\t\t} else if (column === \"size\") {\n\t\t\t\t\t$$renderer.push(`<!--[1--><span class=\"kind\">${$.escape(isDirectory(entry) ? ui().labels.folder : size(entry.size))}</span>`);\n\t\t\t\t} else if (column === \"modified\") {\n\t\t\t\t\t$$renderer.push(`<!--[2--><button class=\"timestamp-button\"${$.attr('disabled', !ready, true)}><time${$.attr('datetime', entry.modifiedAt)}>${$.escape(formattedDate(entry.modifiedAt, ui(), ready))}</time></button>`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push(`<!--[-1--><span class=\"entry-data\">${$.escape(publicDataValue(entry.data?.[column.dataKey]))}</span>`);\n\t\t\t\t}\n\n\t\t\t\t$$renderer.push(`<!--]-->`);\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--> `);\n\n\t\t\tif (actions || ui().actions.length) {\n\t\t\t\t$$renderer.push(`<!--[0--><span data-dirwell-actions=\"\" style=\"grid-column:1/-1;display:flex;flex-wrap:wrap;gap:.5rem\">`);\n\n\t\t\t\tif (actions) {\n\t\t\t\t\t$$renderer.push('<!--[0-->');\n\t\t\t\t\tactions($$renderer, { model, entry, selected: selected === entry.id });\n\t\t\t\t\t$$renderer.push(`<!---->`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t\t}\n\n\t\t\t\t$$renderer.push(`<!--]--> <!--[-->`);\n\n\t\t\t\tconst each_array_5 = $.ensure_array_like(ui().actions);\n\n\t\t\t\tfor (let $$index_4 = 0, $$length = each_array_5.length; $$index_4 < $$length; $$index_4++) {\n\t\t\t\t\tlet action = each_array_5[$$index_4];\n\n\t\t\t\t\tif (action === \"download\" && entry.href && !isDirectory(entry) && !entry.link?.unavailable) {\n\t\t\t\t\t\t$$renderer.push(`<!--[0--><a${$.attr('href', safeHref(entry))} download=\"\">${$.escape(ui().labels.download)}</a>`);\n\t\t\t\t\t} else if (action !== \"download\") {\n\t\t\t\t\t\t$$renderer.push(`<!--[1--><button${$.attr('disabled', !ready || action === \"copy-link\" && !entry.href, true)}${$.attr('aria-label', (action === \"copy-link\" ? ui().labels.copyLink : ui().labels.copyPath) + \": \" + entry.name)}>${$.escape(action === \"copy-link\" ? ui().labels.copyLink : ui().labels.copyPath)}</button>`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t\t\t}\n\n\t\t\t\t\t$$renderer.push(`<!--]-->`);\n\t\t\t\t}\n\n\t\t\t\t$$renderer.push(`<!--]--></span>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--></li>`);\n\t\t}\n\n\t\t$$renderer.push(`<!--]--> `);\n\n\t\tif (end() < rows().length) {\n\t\t\t$$renderer.push(`<!--[0--><li aria-hidden=\"true\"${$.attr_style('', { height: offsets()[rows().length] - offsets()[end()] + \"px\" })}></li>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></ul> `);\n\n\t\tif (rows().length === 0 && !busy) {\n\t\t\t$$renderer.push(`<!--[0--><p>${$.escape(model.total === 0 ? ui().labels.empty : ui().labels.noMatches)}</p>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></section> `);\n\n\t\tif (model.page?.count > 1 && !complete()) {\n\t\t\t$$renderer.push(`<!--[0--><nav${$.attr('aria-label', ui().labels.pagination)}>`);\n\n\t\t\tif (model.page.previousHref) {\n\t\t\t\t$$renderer.push(`<!--[0--><a rel=\"prev\"${$.attr('href', model.page.previousHref)}>${$.escape(ui().labels.previous)}</a>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--> ${$.escape(label(ui(), \"page\", { page: model.page.number, pages: model.page.count }))} `);\n\n\t\t\tif (model.page.nextHref) {\n\t\t\t\t$$renderer.push(`<!--[0--><a rel=\"next\"${$.attr('href', model.page.nextHref)}>${$.escape(ui().labels.next)}</a>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--></nav>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--> `);\n\n\t\tif (footer) {\n\t\t\t$$renderer.push('<!--[0-->');\n\t\t\tfooter($$renderer, { model });\n\t\t\t$$renderer.push(`<!---->`);\n\t\t} else if (ui().brand.footerText) {\n\t\t\t$$renderer.push(`<!--[1--><p class=\"brand-footer\">`);\n\n\t\t\tif (ui().brand.footerUrl) {\n\t\t\t\t$$renderer.push(`<!--[0--><a${$.attr('href', ui().brand.footerUrl)}>${$.escape(ui().brand.footerText)}</a>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push(`<!--[-1-->${$.escape(ui().brand.footerText)}`);\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--></p>`);\n\t\t} else {\n\t\t\t$$renderer.push(`<!--[-1--><p class=\"keyboard-help\">${$.escape(ui().labels.keyboardHelp)}</p>`);\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></main> `);\n\n\t\tif (timestamp) {\n\t\t\t$$renderer.push(`<!--[0--><dialog><h2>${$.escape(ui().labels.modifiedTime)}</h2> <p>${$.escape(timestamp)}</p> <p>${$.escape(ui().dateOptions.locale !== undefined || ui().dateOptions.timeZone !== undefined\n\t\t\t\t? formattedDate(timestamp, ui(), true)\n\t\t\t\t: new Date(timestamp).toLocaleString())}</p> <button>${$.escape(ui().labels.close)}</button></dialog>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--> `);\n\n\t\tif (globalOpen) {\n\t\t\t$$renderer.push(`<!--[0--><dialog><h2>${$.escape(ui().labels.searchArchive)}</h2> <input${$.attr('aria-label', ui().labels.archiveSearchInput)} type=\"search\"${$.attr('value', globalQuery)}/> <p role=\"status\">${$.escape(globalStatus)}</p> `);\n\n\t\t\tif (archiveFailed) {\n\t\t\t\t$$renderer.push(`<!--[0--><button>${$.escape(ui().labels.retry)}</button>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--> <ul><!--[-->`);\n\n\t\t\tconst each_array_6 = $.ensure_array_like(globalRows);\n\n\t\t\tfor (let $$index_6 = 0, $$length = each_array_6.length; $$index_6 < $$length; $$index_6++) {\n\t\t\t\tlet record = each_array_6[$$index_6];\n\n\t\t\t\t$$renderer.push(`<li>`);\n\n\t\t\t\tif (record.href) {\n\t\t\t\t\t$$renderer.push(`<!--[0--><a${$.attr('href', record.href)}${$.attr('target', record.exitsExplorer ? \"_blank\" : undefined)}${$.attr('rel', record.exitsExplorer ? \"noopener\" : undefined)}>${$.escape(record.path)}</a>`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push(`<!--[-1-->${$.escape(record.path)}`);\n\t\t\t\t}\n\n\t\t\t\t$$renderer.push(`<!--]--></li>`);\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--></ul> <button>${$.escape(ui().labels.close)}</button></dialog>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]-->`);\n\t});\n}","import {render} from 'svelte/server';import App from './.generated/App-server.mjs';export const renderBody=model=>render(App,{props:{model}}).body;","import { readFile } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { escapeHtml } from \"@dirwell/core\";\nimport type { ExplorerTheme } from \"@dirwell/core\";\nimport { createThemePage, folderDataHref, pageAsset } from \"../../shared-theme/src/page.ts\";\n// Generated server component is paired with the separately compiled browser component.\nimport type { FrameworkRenderer } from \"./model.ts\";\nexport type { FrameworkRenderer, ThemePage } from \"./model.ts\";\nimport { renderBody } from \"../render-generated.mjs\";\nimport {\n assertThemeOptions,\n resolveCustomization,\n customizationCss,\n pickCustomization,\n type ThemeCustomization,\n} from \"../../shared-theme/src/customization.ts\";\nexport type {\n ThemeCustomization,\n ThemeLabels,\n ThemeColumn,\n ThemeAction,\n} from \"../../shared-theme/src/customization.ts\";\nexport interface LedgerThemeOptions extends ThemeCustomization {\n readonly title?: string;\n readonly archiveSearch?: boolean;\n}\nexport function createLedgerTheme(\n options: LedgerThemeOptions = {},\n renderer?: FrameworkRenderer,\n): ExplorerTheme {\n assertThemeOptions(options, [\"title\", \"archiveSearch\"]);\n if (options.title !== undefined && (typeof options.title !== \"string\" || !options.title))\n throw new TypeError(\"title must be a non-empty string\");\n if (options.archiveSearch !== undefined && typeof options.archiveSearch !== \"boolean\")\n throw new TypeError(\"archiveSearch must be a boolean\");\n const ui = resolveCustomization(options);\n const publishedUi = pickCustomization(options);\n // Bundled resources are immutable for this theme instance; source rebuilds use a new instance.\n let resources: Promise<{ script: string; scriptName: string; styles: string }> | undefined;\n const loadResources = () =>\n (resources ??= Promise.all([\n renderer?.clientScript ?? readFile(new URL(\"./client.js\", import.meta.url), \"utf8\"),\n readFile(new URL(\"./styles.css\", import.meta.url), \"utf8\"),\n ]).then(([script, styles]) => ({\n script,\n styles,\n scriptName: `ledger-client-${createHash(\"sha256\").update(script).digest(\"hex\").slice(0, 16)}.js`,\n })));\n const theme: ExplorerTheme = {\n name: \"ledger\",\n searchIndex: options.archiveSearch ?? true,\n listing: { pagination: true },\n entryData: (entry, context) => ({ folderDataHref: folderDataHref(entry, context, \"ledger\") }),\n async render(context) {\n const model = {\n ...createThemePage(context, theme, options.title ?? ui.brand.name ?? \"Dirwell\"),\n ...(publishedUi === undefined ? {} : { ui: publishedUi }),\n searchIndexHref: theme.searchIndex === false ? null : context.searchIndexHref,\n };\n const { script, scriptName, styles } = await loadResources();\n const json = JSON.stringify(model).replaceAll(\"<\", \"\\\\u003c\");\n return {\n html: `<!doctype html><html lang=\"${escapeHtml(ui.language)}\" dir=\"${ui.direction}\" data-theme=\"system\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">${context.documentBaseHref === null ? \"\" : `<base href=\"${escapeHtml(context.documentBaseHref)}\">`}${context.metadata?.head ?? `<title>${escapeHtml(model.title)}</title>`}${ui.brand.faviconUrl ? `<link rel=\"icon\" href=\"${escapeHtml(ui.brand.faviconUrl)}\">` : \"\"}<style>${styles}${renderer?.styles ?? \"\"}${customizationCss(ui)}</style></head><body><div data-dirwell-theme=\"ledger\">${await (renderer?.renderBody ?? renderBody)(model)}</div><script type=\"application/json\" id=\"dirwell-page-data\">${json}</script><script ${renderer?.clientType === \"module\" ? 'type=\"module\"' : \"defer\"} src=\"${escapeHtml(context.assetHref(scriptName))}\"></script></body></html>`,\n assets: {\n [scriptName]: script,\n [pageAsset(\"ledger\", model.path, model.page?.number ?? 1)]: JSON.stringify(model),\n },\n };\n },\n };\n return theme;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["App"],"sources":["../../shared-theme/src/page.ts","../../shared-theme/src/view-state.ts","../../shared-theme/src/icons.ts","../../shared-theme/src/customization.ts","../../shared-theme/src/navigation.ts","../../shared-theme/src/records.ts","../.generated/App-server.mjs","../render-generated.mjs","../src/index.ts"],"sourcesContent":["import path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { projectListingEntry, copyJsonObject } from \"@dirwell/core\";\nimport type {\n ListingEntry,\n ThemeContext,\n ListingPage,\n SortOptions,\n ExplorerTheme,\n} from \"@dirwell/core\";\nimport type { ThemeCustomization } from \"./customization.ts\";\nexport interface ThemePage {\n readonly ui?: ThemeCustomization;\n readonly version: 1;\n readonly theme: string;\n readonly title: string;\n readonly metadataHead?: string;\n readonly path: string;\n readonly rootHref: string;\n readonly parentHref: string | null;\n readonly parentDataHref: string | null;\n readonly rootDataHref: string | null;\n readonly dataHref: string;\n readonly manifestHref: string | null;\n readonly listingRevision?: string;\n readonly updatesHref: string | null;\n readonly searchQueryHref?: string | null;\n readonly searchRefreshIntervalMs?: number;\n readonly total: number;\n readonly entries: readonly ListingEntry[];\n readonly sort: Required<SortOptions>;\n readonly page: ListingPage | null;\n readonly breadcrumbs: readonly {\n readonly name: string;\n readonly href: string;\n readonly dataHref: string | null;\n }[];\n}\nexport const pageAsset = (theme: string, directory: string, page = 1) =>\n `${theme}-page-${createHash(\"sha256\").update(directory).digest(\"hex\").slice(0, 24)}-${page}.json`;\nexport function folderDataHref(\n entry: ListingEntry,\n context: Parameters<NonNullable<ExplorerTheme[\"entryData\"]>>[1],\n theme: string,\n): string | null {\n if (\n entry.exitsExplorer ||\n entry.href === null ||\n !(entry.kind === \"directory\" || entry.link?.targetKind === \"directory\")\n )\n return null;\n const fake = \"https://dirwell.invalid/\";\n const base = new URL(\n context.documentBaseHref ?? `${context.directoryPath ? context.directoryPath + \"/\" : \"\"}`,\n fake,\n );\n const root = new URL(context.hrefForDirectory(\"\"), base);\n const target = new URL(entry.href, base);\n const rootPath = root.pathname.endsWith(\"/\")\n ? root.pathname\n : root.pathname.slice(0, root.pathname.lastIndexOf(\"/\") + 1);\n const directoryPath = target.pathname.endsWith(\"/\")\n ? target.pathname\n : target.pathname.slice(0, target.pathname.lastIndexOf(\"/\") + 1);\n const logical = directoryPath\n .slice(rootPath.length)\n .split(\"/\")\n .filter(Boolean)\n .map(decodeURIComponent)\n .join(\"/\");\n const filename = pageAsset(theme, logical);\n if (context.pageDataHref !== undefined) return context.pageDataHref(theme, logical, 1);\n if (context.mode === \"mpa\") return context.assetHref(filename);\n const href = new URL(filename, new URL(directoryPath, target));\n if (href.origin !== new URL(fake).origin) return href.href;\n if (context.documentBaseHref === null && !entry.href.startsWith(\"/\")) {\n return path.posix\n .relative(context.directoryPath || \".\", path.posix.join(logical, filename))\n .split(\"/\")\n .map((segment) =>\n segment === \"..\" || segment === \".\" ? segment : encodeURIComponent(segment),\n )\n .join(\"/\");\n }\n return href.pathname;\n}\nexport function createThemePage(\n context: ThemeContext,\n theme: ExplorerTheme,\n title: string,\n): ThemePage {\n const directoryPath = context.directory.current.relativePath;\n const safeContext = {\n ...(context.pageDataHref === undefined ? {} : { pageDataHref: context.pageDataHref }),\n mode: context.mode,\n outputName: context.outputName,\n assetHref: context.assetHref,\n hrefForDirectory: context.hrefForDirectory,\n documentBaseHref: context.documentBaseHref,\n directoryPath,\n };\n const dataForDirectory = (logicalPath: string) =>\n context.hasPageForDirectory?.(logicalPath) === false\n ? null\n : folderDataHref(\n {\n id: logicalPath,\n name: logicalPath,\n kind: \"directory\",\n href: context.hrefForDirectory(logicalPath),\n exitsExplorer: false,\n size: 0,\n modifiedAt: \"\",\n link: null,\n },\n safeContext,\n theme.name,\n )!;\n const entries = context.directory.entries.map((entry) => {\n const record = projectListingEntry(entry, context);\n return theme.entryData === undefined\n ? record\n : { ...record, presentation: copyJsonObject(theme.entryData(record, safeContext)) };\n });\n return {\n version: 1,\n ...(context.metadata === undefined ? {} : { metadataHead: context.metadata.head }),\n theme: theme.name,\n title: context.metadata?.title ?? (directoryPath ? `${directoryPath} · ${title}` : title),\n path: directoryPath,\n rootHref: context.hrefForDirectory(\"\"),\n parentHref:\n context.directory.parent === null\n ? null\n : context.hrefForDirectory(context.directory.parent.relativePath),\n rootDataHref: dataForDirectory(\"\"),\n parentDataHref:\n context.directory.parent === null\n ? null\n : dataForDirectory(context.directory.parent.relativePath),\n dataHref:\n context.pageDataHref?.(theme.name, directoryPath, context.listing?.page.number ?? 1) ??\n context.assetHref(pageAsset(theme.name, directoryPath, context.listing?.page.number ?? 1)),\n manifestHref: context.listing?.manifestHref ?? null,\n ...(context.listing ? { listingRevision: context.listing.revision } : {}),\n updatesHref: context.updatesHref ?? null,\n ...(context.searchQueryHref\n ? {\n searchQueryHref: context.searchQueryHref,\n searchRefreshIntervalMs: context.searchRefreshIntervalMs,\n }\n : {}),\n total: context.listing?.page.total ?? entries.length,\n entries,\n sort: context.sort,\n page: context.listing?.page ?? null,\n breadcrumbs: directoryPath\n .split(\"/\")\n .filter(Boolean)\n .map((name, index) => ({\n name,\n dataHref: dataForDirectory(\n directoryPath\n .split(\"/\")\n .slice(0, index + 1)\n .join(\"/\"),\n ),\n href: context.hrefForDirectory(\n directoryPath\n .split(\"/\")\n .slice(0, index + 1)\n .join(\"/\"),\n ),\n })),\n };\n}\n","import type { SortOptions } from \"@dirwell/core\";\n\nexport interface ViewState {\n readonly query: string;\n readonly sort?: Required<SortOptions>;\n readonly types?: readonly string[];\n readonly category?: string | null;\n readonly selected?: string | null;\n readonly windowY?: number;\n readonly listTop?: number;\n}\nconst supportedTypes = [\"directory\", \"file\", \"link\"];\nfunction validSort(value: unknown): value is Required<SortOptions> {\n if (typeof value !== \"object\" || value === null) return false;\n const sort = value as Record<string, unknown>;\n return (\n [\"name\", \"size\", \"modified\"].includes(String(sort.field)) &&\n [\"asc\", \"desc\"].includes(String(sort.direction)) &&\n [\"natural\", \"locale\", \"unicode\"].includes(String(sort.nameMode)) &&\n typeof sort.directoriesFirst === \"boolean\"\n );\n}\nfunction position(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value)\n ? Math.max(0, Math.min(value, 1e9))\n : 0;\n}\n/** URL controls are shareable; selection and scroll belong only to one history entry. */\nexport function readView(\n href: string,\n theme: \"ledger\" | \"crosswave\",\n path: string,\n defaults: ViewState,\n categories: readonly string[] = [],\n historyState: unknown = null,\n): ViewState {\n const params = new URL(href).searchParams;\n const result: { -readonly [K in keyof ViewState]: ViewState[K] } = {\n ...defaults,\n query: (params.get(\"dw.q\") ?? \"\").slice(0, 4096),\n selected: null,\n windowY: 0,\n listTop: 0,\n };\n if (theme === \"ledger\") {\n const parts = params.get(\"dw.sort\")?.split(\":\");\n if (parts?.length === 4) {\n const sort = {\n field: parts[0],\n direction: parts[1],\n nameMode: parts[2],\n directoriesFirst: parts[3] === \"folders\",\n };\n if ([\"folders\", \"mixed\"].includes(parts[3]!) && validSort(sort)) result.sort = sort;\n }\n if (params.has(\"dw.types\")) {\n const types = params.get(\"dw.types\")!.split(\",\").filter(Boolean);\n if (types.every((type) => supportedTypes.includes(type))) result.types = [...new Set(types)];\n }\n } else {\n const category = params.get(\"dw.category\");\n if (category !== null && categories.includes(category)) result.category = category;\n }\n if (typeof historyState === \"object\" && historyState !== null && \"dirwell\" in historyState) {\n const state = historyState.dirwell;\n if (\n typeof state === \"object\" &&\n state !== null &&\n \"version\" in state &&\n state.version === 1 &&\n \"theme\" in state &&\n state.theme === theme &&\n \"path\" in state &&\n state.path === path &&\n \"view\" in state &&\n typeof state.view === \"object\" &&\n state.view !== null\n ) {\n const view = state.view as Record<string, unknown>;\n result.selected =\n typeof view.selected === \"string\" && view.selected.length <= 4096 ? view.selected : null;\n result.windowY = position(view.windowY);\n result.listTop = position(view.listTop);\n }\n }\n return result;\n}\nexport function viewHref(\n href: string,\n theme: \"ledger\" | \"crosswave\",\n view: ViewState,\n defaults: ViewState,\n): string {\n const url = new URL(href);\n for (const key of [\"dw.q\", \"dw.sort\", \"dw.types\", \"dw.category\"]) url.searchParams.delete(key);\n if (view.query) url.searchParams.set(\"dw.q\", view.query.slice(0, 4096));\n if (theme === \"ledger\") {\n if (\n view.sort &&\n [\"field\", \"direction\", \"nameMode\", \"directoriesFirst\"].some(\n (key) => view.sort![key as keyof SortOptions] !== defaults.sort?.[key as keyof SortOptions],\n )\n ) {\n const sort = view.sort;\n url.searchParams.set(\n \"dw.sort\",\n `${sort.field}:${sort.direction}:${sort.nameMode}:${sort.directoriesFirst ? \"folders\" : \"mixed\"}`,\n );\n }\n if (\n view.types &&\n supportedTypes.some(\n (type) => view.types!.includes(type) !== (defaults.types ?? supportedTypes).includes(type),\n )\n )\n url.searchParams.set(\"dw.types\", view.types.join(\",\"));\n } else if (view.category && view.category !== defaults.category)\n url.searchParams.set(\"dw.category\", view.category);\n return url.href;\n}\n/** History failures never require discarding a successfully loaded view. */\nexport function createViewHistory(theme: \"ledger\" | \"crosswave\") {\n let committedHref = location.href;\n let committedState = history.state;\n const stateFor = (dataHref: string, path: string, view?: ViewState) => ({\n ...(typeof history.state === \"object\" && history.state !== null ? history.state : {}),\n dataHref,\n dirwell: {\n version: 1,\n theme,\n path,\n ...(view === undefined\n ? {}\n : {\n view: {\n query: view.query,\n ...(view.sort === undefined ? {} : { sort: { ...view.sort } }),\n ...(view.types === undefined ? {} : { types: [...view.types] }),\n category: view.category ?? null,\n selected: view.selected ?? null,\n windowY: view.windowY ?? 0,\n listTop: view.listTop ?? 0,\n },\n }),\n },\n });\n return {\n save(dataHref: string, path: string, view: ViewState, defaults: ViewState): void {\n // A popstate load changes location before it has a usable matching model.\n if (location.href !== committedHref) return;\n const href = viewHref(committedHref, theme, view, defaults);\n const state = stateFor(dataHref, path, view);\n try {\n history.replaceState(state, \"\", href);\n committedHref = href;\n committedState = state;\n } catch {\n /* Native links remain available if the host denies History. */\n }\n },\n commit(dataHref: string, path: string, href: string, push: boolean): void {\n const state = stateFor(dataHref, path);\n if (push) history.pushState(state, \"\", href);\n else history.replaceState(state, \"\", href);\n committedHref = href;\n committedState = state;\n },\n rollback(): void {\n if (location.href !== committedHref) {\n try {\n history.replaceState(committedState, \"\", committedHref);\n } catch {\n /* Host owns the restriction. */\n }\n }\n },\n };\n}\n","const paths = {\n directory: '<path d=\"M3 7V5h6l2 3h10v12H3Z\"/><path d=\"M3 10h18\"/>',\n file: '<path d=\"M5 3h9l5 5v13H5ZM14 3v5h5M8 12h8M8 16h6\"/>',\n link: '<path d=\"m9 15 6-6M8 10l-3 3a4 4 0 0 0 6 6l3-3M10 8l3-3a4 4 0 0 1 6 6l-3 3\"/>',\n};\n/** Fixed authored geometry; source names and paths never enter SVG markup. */\nexport function entryIcon(kind: keyof typeof paths): string {\n return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.45\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${paths[kind]}</svg>`;\n}\n","/** Small serializable inputs shared by official themes; layout stays theme-owned. */\nexport const defaultLabels = {\n other: \"other\",\n crosswaveKeyboardHelp: \"Arrow keys navigate · Enter confirms · Backspace returns\",\n brokenLink: \"broken link\",\n unavailableLink: \"unavailable link\",\n cycleLink: \"cycle link\",\n azure: \"azure\",\n violet: \"violet\",\n amber: \"amber\",\n rose: \"rose\",\n jade: \"jade\",\n graphite: \"graphite\",\n allFiles: \"All files\",\n categoryFolders: \"Folders\",\n categoryPhotos: \"Photos\",\n categoryMusic: \"Music\",\n categoryVideos: \"Videos\",\n categoryDocuments: \"Documents\",\n categoryOther: \"Other\",\n indexOf: \"Index of {path}\",\n home: \"Home\",\n breadcrumb: \"Breadcrumb\",\n archive: \"File archive\",\n searchDirectory: \"Search this directory\",\n searchFiles: \"Search files\",\n search: \"Search\",\n types: \"Types\",\n directory: \"directory\",\n file: \"file\",\n link: \"link\",\n folder: \"Folder\",\n sort: \"Sort\",\n name: \"Name\",\n size: \"Size\",\n modified: \"Modified\",\n names: \"Names\",\n natural: \"Natural\",\n locale: \"Locale\",\n unicode: \"Unicode\",\n order: \"Order\",\n ascending: \"Ascending\",\n descending: \"Descending\",\n directoriesFirst: \"Folders first\",\n appearance: \"Appearance\",\n system: \"System\",\n light: \"Light\",\n dark: \"Dark\",\n searchArchive: \"Search archive\",\n archiveSearchInput: \"Search archive files\",\n entries: \"{count} entries\",\n pageEntries: \"{total} entries · {count} on this page\",\n loading: \"Loading…\",\n noMatches: \"No matching entries.\",\n empty: \"This directory is empty.\",\n pagination: \"Pagination\",\n previous: \"Previous\",\n next: \"Next\",\n page: \"Page {page} of {pages}\",\n keyboardHelp: \"Arrow keys select files · Home / End jump · / searches · Backspace opens parent\",\n modifiedTime: \"Modified time\",\n close: \"Close\",\n unknown: \"Unknown\",\n unavailable: \"Target unavailable\",\n beginArchive: \"Enter a search to begin.\",\n searchingArchive: \"Searching archive…\",\n archiveResults: \"{count} results\",\n truncatedResults: \"Showing {shown} of {count} results\",\n archiveError: \"Could not load archive search. Try again.\",\n listingError: \"Could not load complete directory data. Native page links remain available.\",\n folderError: \"Could not open the folder. Its native link remains available.\",\n updatesError: \"Live updates disconnected. Refresh to retry.\",\n retry: \"Retry\",\n openNative: \"Open folder directly\",\n categories: \"File categories\",\n items: \"{count} items\",\n filesIn: \"Files in {path}\",\n controller: \"Controller · Confirm / Back\",\n color: \"Color\",\n pauseMotion: \"Pause motion\",\n resumeMotion: \"Resume motion\",\n copyLink: \"Copy link\",\n copyPath: \"Copy path\",\n download: \"Download\",\n copied: \"Copied.\",\n copyError: \"Could not copy. Use the native link or select the path.\",\n repository: \"Repository\",\n author: \"by\",\n target: \"Target\",\n newTab: \"opens in a new tab\",\n};\nexport type ThemeLabels = Readonly<typeof defaultLabels>;\nexport type ThemeColumn =\n | \"name\"\n | \"size\"\n | \"modified\"\n | { readonly dataKey: string; readonly label: string };\nexport type ThemeAction = \"copy-link\" | \"copy-path\" | \"download\";\nexport interface ThemeCustomization {\n readonly language?: string;\n readonly direction?: \"ltr\" | \"rtl\";\n readonly locale?: string;\n readonly timeZone?: string;\n readonly labels?: Partial<ThemeLabels>;\n readonly brand?: {\n readonly name?: string;\n readonly logoUrl?: string;\n readonly logoAlt?: string;\n readonly footerText?: string;\n readonly footerUrl?: string;\n readonly faviconUrl?: string;\n };\n readonly columns?: readonly ThemeColumn[];\n readonly actions?: readonly ThemeAction[];\n /** Theme-specific CSS variable names; declarations and markup are rejected. */\n readonly cssVariables?: Readonly<Record<`--${string}`, string>>;\n}\nexport interface ResolvedThemeCustomization {\n readonly language: string;\n readonly dateOptions: { readonly locale?: string; readonly timeZone?: string };\n readonly direction: \"ltr\" | \"rtl\";\n readonly locale: string;\n readonly timeZone: string;\n readonly labels: ThemeLabels;\n readonly brand: NonNullable<ThemeCustomization[\"brand\"]>;\n readonly columns: readonly ThemeColumn[];\n readonly actions: readonly ThemeAction[];\n readonly cssVariables: Readonly<Record<string, string>>;\n}\nexport function resolveCustomization(options: ThemeCustomization = {}): ResolvedThemeCustomization {\n const language = options.language === undefined ? \"en\" : options.language,\n locale = options.locale === undefined ? \"en-US\" : options.locale,\n timeZone = options.timeZone === undefined ? \"UTC\" : options.timeZone;\n for (const [key, value] of Object.entries({ language, locale, timeZone }))\n if (typeof value !== \"string\" || !value)\n throw new TypeError(`${key} must be a non-empty string`);\n new Intl.DateTimeFormat(locale, { timeZone });\n const direction = options.direction ?? \"ltr\";\n if (direction !== \"ltr\" && direction !== \"rtl\")\n throw new TypeError(\"direction must be ltr or rtl\");\n const labels = { ...defaultLabels };\n if (options.labels !== undefined) {\n if (\n typeof options.labels !== \"object\" ||\n options.labels === null ||\n Array.isArray(options.labels)\n )\n throw new TypeError(\"labels must be an object\");\n for (const [key, value] of Object.entries(options.labels)) {\n if (!Object.hasOwn(labels, key) || typeof value !== \"string\")\n throw new TypeError(`Unsupported label or value: ${key}`);\n Object.assign(labels, { [key]: value });\n }\n }\n const brand = options.brand ?? {};\n if (typeof brand !== \"object\" || brand === null || Array.isArray(brand))\n throw new TypeError(\"brand must be an object\");\n for (const [key, value] of Object.entries(brand)) {\n if (\n ![\"name\", \"logoUrl\", \"logoAlt\", \"footerText\", \"footerUrl\", \"faviconUrl\"].includes(key) ||\n typeof value !== \"string\"\n )\n throw new TypeError(`Unsupported brand option or value: ${key}`);\n if (\n key.endsWith(\"Url\") &&\n !/^https?:\\/\\//i.test(value) &&\n !(value.startsWith(\"/\") && !value.startsWith(\"//\"))\n )\n throw new TypeError(`brand.${key} must be an HTTP(S) or root-relative URL`);\n }\n const columns = options.columns ?? [\"name\", \"size\", \"modified\"];\n if (!Array.isArray(columns) || !columns.includes(\"name\"))\n throw new TypeError(\"columns must contain name and unique supported columns\");\n const columnIds = new Set<string>();\n for (const column of columns) {\n let id: string;\n if (typeof column === \"string\") {\n if (![\"name\", \"size\", \"modified\"].includes(column)) throw new TypeError(\"Unsupported column\");\n id = column;\n } else {\n if (\n typeof column !== \"object\" ||\n column === null ||\n Object.keys(column).some((key) => ![\"dataKey\", \"label\"].includes(key)) ||\n typeof column.dataKey !== \"string\" ||\n !column.dataKey ||\n typeof column.label !== \"string\" ||\n !column.label\n )\n throw new TypeError(\"Data columns require dataKey and label\");\n id = \"data:\" + column.dataKey;\n }\n if (columnIds.has(id)) throw new TypeError(\"columns must contain unique supported columns\");\n columnIds.add(id);\n }\n const actions = options.actions ?? [];\n if (\n !Array.isArray(actions) ||\n new Set(actions).size !== actions.length ||\n actions.some((key) => ![\"copy-link\", \"copy-path\", \"download\"].includes(key))\n )\n throw new TypeError(\"actions must contain unique supported actions\");\n const cssVariables = options.cssVariables ?? {};\n if (typeof cssVariables !== \"object\" || cssVariables === null || Array.isArray(cssVariables))\n throw new TypeError(\"cssVariables must be an object\");\n for (const [key, value] of Object.entries(cssVariables))\n if (\n !/^--[a-zA-Z][a-zA-Z0-9_-]*$/.test(key) ||\n typeof value !== \"string\" ||\n /[{};<>]/.test(value)\n )\n throw new TypeError(`Invalid CSS variable: ${key}`);\n return {\n language,\n dateOptions: {\n ...(options.locale === undefined ? {} : { locale: options.locale }),\n ...(options.timeZone === undefined ? {} : { timeZone: options.timeZone }),\n },\n direction,\n locale,\n timeZone,\n labels,\n brand: { ...brand },\n columns: columns.map((column) => (typeof column === \"string\" ? column : { ...column })),\n actions: [...actions],\n cssVariables: { ...cssVariables },\n };\n}\nexport const defaultCustomization = resolveCustomization();\nexport function label(\n ui: ResolvedThemeCustomization,\n key: keyof ThemeLabels,\n values: Readonly<Record<string, string | number>> = {},\n): string {\n return ui.labels[key].replace(/\\{([a-zA-Z]+)\\}/g, (match, name) =>\n Object.hasOwn(values, name) ? String(values[name]) : match,\n );\n}\nconst dateFormats = new Map<string, Intl.DateTimeFormat>();\nexport function formattedDate(\n value: string,\n ui: ResolvedThemeCustomization,\n local = false,\n): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return ui.labels.unknown;\n if (ui.dateOptions.locale === undefined && ui.dateOptions.timeZone === undefined)\n return local\n ? date.toLocaleString(undefined, { dateStyle: \"short\", timeStyle: \"short\" })\n : date.toISOString().slice(0, 16).replace(\"T\", \" \") + \" UTC\";\n const locale = ui.dateOptions.locale,\n timeZone = ui.dateOptions.timeZone ?? (local ? undefined : \"UTC\");\n const key = String(locale) + \"\\0\" + String(timeZone);\n let formatter = dateFormats.get(key);\n if (formatter === undefined) {\n formatter = new Intl.DateTimeFormat(locale, {\n timeZone,\n dateStyle: \"short\",\n timeStyle: \"short\",\n });\n if (dateFormats.size >= 32) dateFormats.delete(dateFormats.keys().next().value!);\n dateFormats.set(key, formatter);\n }\n return formatter.format(date);\n}\nexport function customizationCss(ui: ResolvedThemeCustomization): string {\n const declarations = Object.entries(ui.cssVariables)\n .map(([key, value]) => `${key}:${value}`)\n .join(\";\");\n return declarations\n ? `:root:root{${declarations}}${ui.cssVariables[\"--dw-font-family\"] ? \"body{font-family:var(--dw-font-family)}\" : \"\"}`\n : \"\";\n}\nexport async function copyEntryAction(\n action: ThemeAction,\n entry: { id: string; href: string | null },\n): Promise<void> {\n const value =\n action === \"copy-link\" && entry.href ? new URL(entry.href, document.baseURI).href : entry.id;\n if (!navigator.clipboard?.writeText) throw new Error(\"Clipboard unavailable\");\n await navigator.clipboard.writeText(value);\n}\n\n/** Publish only supplied customization instead of repeating defaults in every page. */\nexport function pickCustomization(options: ThemeCustomization): ThemeCustomization | undefined {\n const result: ThemeCustomization = {};\n for (const key of [\n \"language\",\n \"direction\",\n \"locale\",\n \"timeZone\",\n \"labels\",\n \"brand\",\n \"columns\",\n \"actions\",\n \"cssVariables\",\n ] as const)\n if (options[key] !== undefined) {\n const value = options[key];\n Object.assign(result, {\n [key]: Array.isArray(value)\n ? value.map((item) => (typeof item === \"object\" ? { ...item } : item))\n : typeof value === \"object\" && value !== null\n ? { ...value }\n : value,\n });\n }\n return Object.keys(result).length ? result : undefined;\n}\n\n/** Built-in factories fail on typos instead of silently ignoring configuration. */\nexport function assertThemeOptions(value: unknown, extraKeys: readonly string[]): void {\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n throw new TypeError(\"Theme options must be an object\");\n const allowed = [\n \"language\",\n \"direction\",\n \"locale\",\n \"timeZone\",\n \"labels\",\n \"brand\",\n \"columns\",\n \"actions\",\n \"cssVariables\",\n ...extraKeys,\n ];\n for (const key of Object.keys(value))\n if (!allowed.includes(key)) throw new TypeError(`Unsupported theme option: ${key}`);\n}\n\nexport function columnLabel(column: ThemeColumn, ui: ResolvedThemeCustomization): string {\n return typeof column === \"string\" ? ui.labels[column] : column.label;\n}\nexport function publicDataValue(value: unknown): string {\n return value === undefined || value === null\n ? \"\"\n : typeof value === \"object\"\n ? JSON.stringify(value)\n : String(value);\n}\n","import { loadListing, parseListingEntries, ListingDataError } from \"@dirwell/core/client\";\nimport { resolveCustomization } from \"./customization.ts\";\n\n/** Folder snapshots resolve relative URLs before History changes the document URL. */\nexport async function fetchThemePage(\n dataHref: string,\n pageHref: string,\n theme: string,\n signal: AbortSignal,\n fresh = false,\n attempt = 0,\n): Promise<Record<string, unknown>> {\n const source = new URL(dataHref, document.baseURI);\n if (source.origin !== location.origin)\n throw new ListingDataError(\"Folder leaves the theme origin\");\n const response = await fetch(source, { signal, cache: fresh ? \"no-store\" : \"default\" });\n if (!response.ok) throw new ListingDataError(\"Unavailable folder\");\n const value: unknown = await response.json();\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n throw new ListingDataError(\"Invalid folder snapshot\");\n const data = value as Record<string, unknown>;\n if (\n data.version !== 1 ||\n data.theme !== theme ||\n typeof data.title !== \"string\" ||\n typeof data.path !== \"string\" ||\n !Number.isSafeInteger(data.total) ||\n Number(data.total) < 0 ||\n !Array.isArray(data.breadcrumbs)\n )\n throw new ListingDataError(\"Unsupported folder snapshot\");\n if (data.metadataHead !== undefined && typeof data.metadataHead !== \"string\")\n throw new ListingDataError(\"Invalid folder metadata\");\n const sort = data.sort as Record<string, unknown> | null;\n if (\n !sort ||\n typeof sort !== \"object\" ||\n ![\"name\", \"size\", \"modified\"].includes(String(sort.field)) ||\n ![\"asc\", \"desc\"].includes(String(sort.direction)) ||\n ![\"natural\", \"locale\", \"unicode\"].includes(String(sort.nameMode)) ||\n typeof sort.directoriesFirst !== \"boolean\"\n )\n throw new ListingDataError(\"Invalid folder order\");\n if (theme === \"crosswave\") {\n const categories = data.categories;\n const ids = new Set<string>();\n if (\n !Array.isArray(categories) ||\n categories.length === 0 ||\n categories.some((category) => {\n if (\n typeof category !== \"object\" ||\n category === null ||\n typeof category.id !== \"string\" ||\n !category.id ||\n ids.has(category.id) ||\n typeof category.label !== \"string\" ||\n typeof category.svg !== \"string\"\n )\n return true;\n ids.add(category.id);\n return false;\n })\n )\n throw new ListingDataError(\"Invalid folder categories\");\n }\n const base = document.querySelector(\"base\")?.href ?? pageHref;\n const link = (raw: unknown): string | null => {\n if (raw === null) return null;\n if (typeof raw !== \"string\") throw new ListingDataError(\"Invalid folder link\");\n const url = new URL(raw, base);\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.origin !== location.origin)\n throw new ListingDataError(\"Unsupported folder link\");\n return url.href;\n };\n const entries = parseListingEntries(data.entries, base).map((entry) => ({\n ...entry,\n ...(entry.presentation\n ? {\n presentation: {\n ...entry.presentation,\n folderDataHref: link(entry.presentation.folderDataHref ?? null),\n },\n }\n : {}),\n }));\n if (entries.length > Number(data.total)) throw new ListingDataError(\"Invalid folder count\");\n if (data.page !== null) {\n const page = data.page as Record<string, unknown> | null;\n if (\n !page ||\n typeof page !== \"object\" ||\n !Number.isSafeInteger(page.number) ||\n Number(page.number) < 1 ||\n !Number.isSafeInteger(page.count) ||\n Number(page.count) < Number(page.number) ||\n !Number.isSafeInteger(page.offset) ||\n Number(page.offset) < 0 ||\n Number(page.offset) > Number(data.total) ||\n page.total !== data.total\n )\n throw new ListingDataError(\"Invalid folder pagination\");\n data.page = {\n ...page,\n href: link(page.href),\n previousHref: link(page.previousHref),\n nextHref: link(page.nextHref),\n };\n }\n if (data.ui !== undefined)\n resolveCustomization(data.ui as Parameters<typeof resolveCustomization>[0]);\n const result = {\n ...data,\n searchQueryHref: link(data.searchQueryHref ?? null),\n updatesHref: link(data.updatesHref ?? null),\n entries,\n dataHref: source.href,\n manifestHref: link(data.manifestHref),\n rootHref: link(data.rootHref),\n rootDataHref: link(data.rootDataHref),\n parentHref: link(data.parentHref),\n parentDataHref: link(data.parentDataHref),\n breadcrumbs: data.breadcrumbs.map((raw) => {\n if (\n typeof raw !== \"object\" ||\n raw === null ||\n !(\"name\" in raw) ||\n !(\"href\" in raw) ||\n !(\"dataHref\" in raw) ||\n typeof raw.name !== \"string\"\n )\n throw new ListingDataError(\"Invalid breadcrumb\");\n return { name: raw.name, href: link(raw.href), dataHref: link(raw.dataHref) };\n }),\n };\n // Keep the current UI until the complete target listing and page revision agree.\n if (result.manifestHref) {\n const loaded = await loadListing(result.manifestHref, {\n signal,\n cache: fresh ? \"no-store\" : \"default\",\n });\n if (\n loaded.manifest.total !== data.total ||\n (data.listingRevision !== undefined && loaded.manifest.revision !== data.listingRevision)\n ) {\n if (attempt < 2) return fetchThemePage(dataHref, pageHref, theme, signal, true, attempt + 1);\n throw new ListingDataError(\"Folder changed while refreshing\");\n }\n result.entries = [...loaded.entries];\n }\n return result;\n}\n\n// HMR can remount a wrapper while the outer explorer root stays mounted.\n// Keep only its current public model; production imports never register roots.\nconst hotModels = new WeakMap<Element, Record<string, unknown>>();\nexport function restoreThemePage(\n initial: Record<string, unknown>,\n hot: boolean,\n): Record<string, unknown> {\n if (!hot || typeof document === \"undefined\") return initial;\n const root = document.querySelector(\"[data-dirwell-theme]\");\n if (!root) return initial;\n const snapshot = hotModels.get(root) ?? initial;\n hotModels.set(root, snapshot);\n return snapshot;\n}\n\n/** Copy only inert metadata elements; never insert snapshot HTML or event attributes. */\nexport function applyThemeMetadata(page: Record<string, unknown>, pageHref: string): void {\n const root = document.querySelector(\"[data-dirwell-theme]\");\n if (root && hotModels.has(root)) hotModels.set(root, page);\n document.title = typeof page.title === \"string\" ? page.title : \"\";\n const template = document.createElement(\"template\");\n template.innerHTML = typeof page.metadataHead === \"string\" ? page.metadataHead : \"\";\n document.head.querySelectorAll(\"[data-dirwell-metadata]\").forEach((element) => element.remove());\n const base = document.querySelector(\"base\")?.href ?? pageHref;\n const url = (value: string): string | null => {\n try {\n const target = new URL(value, base);\n return [\"http:\", \"https:\"].includes(target.protocol) ? target.href : null;\n } catch {\n return null;\n }\n };\n for (const element of template.content.children) {\n if (!element.hasAttribute(\"data-dirwell-metadata\")) continue;\n let next: HTMLElement;\n if (element.tagName === \"META\") {\n const attribute = element.hasAttribute(\"property\") ? \"property\" : \"name\";\n const key = element.getAttribute(attribute) ?? \"\";\n if (!/^(?:description|og:[a-z_:]+|twitter:[a-z_:]+)$/i.test(key)) continue;\n let content = element.getAttribute(\"content\") ?? \"\";\n if ([\"og:image\", \"og:url\", \"twitter:image\"].includes(key)) {\n const resolved = url(content);\n if (resolved === null) continue;\n content = resolved;\n }\n next = document.createElement(\"meta\");\n next.setAttribute(attribute, key);\n next.setAttribute(\"content\", content);\n } else if (element.tagName === \"LINK\" && element.getAttribute(\"rel\") === \"canonical\") {\n const href = url(element.getAttribute(\"href\") ?? \"\");\n if (href === null) continue;\n next = document.createElement(\"link\");\n next.setAttribute(\"rel\", \"canonical\");\n next.setAttribute(\"href\", href);\n } else continue;\n next.setAttribute(\"data-dirwell-metadata\", \"\");\n document.head.append(next);\n }\n}\n","import type { ListingEntry, SortOptions } from \"@dirwell/core\";\nexport const directoryLike = (entry: ListingEntry) =>\n entry.kind === \"directory\" || entry.link?.targetKind === \"directory\";\nexport const entryType = (entry: ListingEntry) =>\n entry.kind === \"symlink\" ? \"link\" : directoryLike(entry) ? \"directory\" : \"file\";\nexport function fuzzy(query: string, value: string): number | null {\n let score = 0,\n start = 0,\n last = -2;\n for (const character of query.trim().toLocaleLowerCase()) {\n const index = value.toLocaleLowerCase().indexOf(character, start);\n if (index < 0) return null;\n if (index === last + 1) score += 8;\n if (index === 0 || /[\\s/_.-]/.test(value[index - 1] ?? \"\")) score += 5;\n score += Math.max(0, 4 - index * 0.05);\n last = index;\n start = index + 1;\n }\n return score - value.length * 0.01;\n}\nexport function visibleRecords(\n entries: readonly ListingEntry[],\n query: string,\n types: readonly string[],\n sort: Required<SortOptions>,\n): ListingEntry[] {\n return entries\n .map((entry) => ({ entry, score: fuzzy(query, `${entry.name} ${entry.link?.target ?? \"\"}`) }))\n .filter((item) => types.includes(entryType(item.entry)) && item.score !== null)\n .sort((left, right) => {\n if (query.trim() && left.score !== right.score) return (right.score ?? 0) - (left.score ?? 0);\n const a = left.entry,\n b = right.entry;\n if (sort.directoriesFirst && directoryLike(a) !== directoryLike(b))\n return directoryLike(a) ? -1 : 1;\n const name = () =>\n sort.nameMode === \"unicode\"\n ? compareUnicode(a.name, b.name)\n : a.name.localeCompare(b.name, undefined, {\n numeric: sort.nameMode === \"natural\",\n sensitivity: \"base\",\n });\n const primary =\n (sort.field === \"name\"\n ? name()\n : sort.field === \"size\"\n ? (a.kind === \"directory\" ? 0 : a.size) - (b.kind === \"directory\" ? 0 : b.size)\n : a.modifiedAt.localeCompare(b.modifiedAt)) || name();\n return (sort.direction === \"asc\" ? primary : -primary) || compareUnicode(a.id, b.id);\n })\n .map((item) => item.entry);\n}\nfunction compareUnicode(left: string, right: string): number {\n const a = [...left],\n b = [...right];\n for (let i = 0; i < Math.min(a.length, b.length); i++) {\n const delta = (a[i]?.codePointAt(0) ?? 0) - (b[i]?.codePointAt(0) ?? 0);\n if (delta) return delta;\n }\n return a.length - b.length;\n}\nexport function size(bytes: number): string {\n const units = [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\"];\n let value = bytes,\n index = 0;\n while (value >= 1024 && index < 4) {\n value /= 1024;\n index++;\n }\n return `${value.toFixed(index === 0 || value >= 100 ? 0 : 1)} ${units[index]}`;\n}\nexport function modified(value: string, local = false): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"Unknown\";\n return local\n ? date.toLocaleString(undefined, { dateStyle: \"short\", timeStyle: \"short\" })\n : `${date.toISOString().slice(0, 16).replace(\"T\", \" \")} UTC`;\n}\n","import * as $ from 'svelte/internal/server';\nimport { onMount, tick, untrack } from \"svelte\";\nimport { queryLiveArchive } from \"../../shared-theme/src/live-search.ts\";\nimport { readView, createViewHistory } from \"../../shared-theme/src/view-state.ts\";\nimport { entryIcon } from \"../../shared-theme/src/icons.ts\";\nimport { loadListing } from \"@dirwell/core/client\";\nimport { fetchThemePage, applyThemeMetadata, restoreThemePage } from \"../../shared-theme/src/navigation.ts\";\nimport { visibleRecords, directoryLike, entryType, size, fuzzy } from \"../../shared-theme/src/records.ts\";\n\nimport {\n\tresolveCustomization,\n\tlabel,\n\tformattedDate,\n\tcopyEntryAction,\n\tcolumnLabel,\n\tpublicDataValue\n} from \"../../shared-theme/src/customization.ts\";\n\nexport default function Ledger($$renderer, $$props) {\n\t$$renderer.component(($$renderer) => {\n\t\tlet { model: initialModel, header, row, actions, footer } = $$props;\n\t\tconst snapshot = untrack(() => restoreThemePage(initialModel, Boolean(import.meta.hot)));\n\t\tlet model = snapshot;\n\t\tlet entries = snapshot.entries;\n\t\tlet query = \"\";\n\t\tlet types = [\"directory\", \"file\", \"link\"];\n\t\tlet sort = snapshot.sort;\n\t\tlet scheme = \"system\";\n\t\tlet selected = null;\n\t\tlet ready = false;\n\t\tlet busy = false;\n\t\tlet error = \"\";\n\t\tlet failure = null;\n\t\tlet timestamp = null;\n\t\tlet composing = false;\n\t\tlet scrollTop = 0;\n\t\tlet viewportHeight = 800;\n\t\tlet globalOpen = false;\n\t\tlet globalQuery = \"\";\n\t\tlet globalRows = [];\n\t\tlet globalStatus = resolveCustomization(snapshot.ui).labels.beginArchive;\n\t\tlet pendingUpdates = null;\n\t\tlet ui = $.derived(() => resolveCustomization(model.ui));\n\t\tlet archiveFailed = false;\n\t\tlet countParts = $.derived(() => label(ui(), complete() ? \"entries\" : \"pageEntries\", { count: \"__COUNT__\", total: model.total }).split(\"__COUNT__\"));\n\t\tlet heights = new Map();\n\n\t\tlet updatesHref = $.derived(() => ready && model.updatesHref\n\t\t\t? new URL(model.updatesHref, document.baseURI).href\n\t\t\t: null);\n\n\t\tlet complete = $.derived(() => entries.length === model.total);\n\t\tlet rows = $.derived(() => visibleRecords(entries, composing ? \"\" : query, types, sort));\n\t\tlet virtual = $.derived(() => ready && rows().length > 500);\n\n\t\tlet offsets = $.derived(() => {\n\t\t\tconst values = [0];\n\n\t\t\tfor (const entry of rows()) values.push(values.at(-1) + (heights.get(entry.id) ?? 76));\n\n\t\t\treturn values;\n\t\t});\n\n\t\tlet start = $.derived(() => {\n\t\t\tif (!virtual()) return 0;\n\n\t\t\tlet low = 0, high = rows().length;\n\n\t\t\twhile (low < high) {\n\t\t\t\tconst mid = low + high >> 1;\n\n\t\t\t\tif (offsets()[mid + 1] <= scrollTop) low = mid + 1; else high = mid;\n\t\t\t}\n\n\t\t\treturn Math.max(0, low - 5);\n\t\t});\n\n\t\tlet end = $.derived(() => {\n\t\t\tif (!virtual()) return rows().length;\n\n\t\t\tlet low = 0, high = rows().length;\n\n\t\t\twhile (low < high) {\n\t\t\t\tconst middle = low + high >> 1;\n\n\t\t\t\tif (offsets()[middle + 1] <= scrollTop + viewportHeight) low = middle + 1; else high = middle;\n\t\t\t}\n\n\t\t\treturn Math.min(rows().length, Math.max(start() + 35, low + 5));\n\t\t});\n\n\t\tfunction measure(node, id) {\n\t\t\tif (typeof ResizeObserver === \"undefined\") return;\n\n\t\t\tconst observer = new ResizeObserver(() => {\n\t\t\t\tconst value = node.getBoundingClientRect().height;\n\n\t\t\t\tif (value > 0 && heights.get(id) !== value) {\n\t\t\t\t\tconst next = new Map(heights);\n\n\t\t\t\t\tnext.set(id, value);\n\t\t\t\t\theights = next;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tobserver.observe(node);\n\n\t\t\treturn { destroy: () => observer.disconnect() };\n\t\t}\n\n\t\tlet list = void 0;\n\t\tlet searchInput = void 0;\n\t\tlet globalInput = void 0;\n\t\tlet timeDialog = void 0;\n\t\tlet globalDialog = void 0;\n\t\tlet navigation = 0;\n\t\tlet abort;\n\t\tlet archiveAbort;\n\t\tlet archiveRequest = 0;\n\t\tlet archiveCache = null;\n\t\tlet archiveCacheHref = \"\";\n\t\tlet archiveCacheAt = 0;\n\t\tlet viewHistory;\n\t\tlet retryRequest = null;\n\n\t\tconst viewDefaults = (page) => ({\n\t\t\tquery: \"\",\n\t\t\tsort: page.sort,\n\t\t\ttypes: [\"directory\", \"file\", \"link\"]\n\t\t});\n\n\t\tfunction saveView() {\n\t\t\tif (!viewHistory) return;\n\n\t\t\tviewHistory.save(\n\t\t\t\tnew URL(model.dataHref, document.baseURI).href,\n\t\t\t\tmodel.path,\n\t\t\t\t{\n\t\t\t\t\tquery,\n\t\t\t\t\ttypes,\n\t\t\t\t\tsort,\n\t\t\t\t\tselected,\n\t\t\t\t\twindowY: window.scrollY,\n\t\t\t\t\tlistTop: scrollTop\n\t\t\t\t},\n\t\t\t\tviewDefaults(model)\n\t\t\t);\n\t\t}\n\n\t\tfunction retry() {\n\t\t\tif (failure === \"folder\" && retryRequest) openFolder(...retryRequest, true); else openFolder(model.dataHref, location.href, false, true);\n\t\t}\n\n\t\tconst isDirectory = directoryLike;\n\n\t\tfunction safeHref(record) {\n\t\t\tif (typeof location !== \"undefined\" && location.protocol === \"file:\" && isDirectory(record) && !record.exitsExplorer && record.href?.endsWith(\"/\")) return record.href + \"index.html\";\n\n\t\t\treturn record.href;\n\t\t}\n\n\t\tasync function hydrateData() {\n\t\t\tif (complete() || !model.manifestHref || location.protocol === \"file:\") return;\n\n\t\t\tconst local = abort, token = navigation;\n\n\t\t\tbusy = true;\n\n\t\t\ttry {\n\t\t\t\tconst loaded = await loadListing(new URL(model.manifestHref, document.baseURI).href, {\n\t\t\t\t\tsignal: local.signal,\n\t\t\t\t\tcache: model.updatesHref ? \"no-store\" : \"default\"\n\t\t\t\t});\n\n\t\t\t\tif (token === navigation && !local.signal.aborted) entries = loaded.entries;\n\t\t\t} catch(cause) {\n\t\t\t\tif (token === navigation && !local.signal.aborted) {\n\t\t\t\t\terror = ui().labels.listingError;\n\t\t\t\t\tfailure = \"listing\";\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (token === navigation) busy = false;\n\t\t\t}\n\t\t}\n\n\t\tasync function navigate(event, record) {\n\t\t\tsaveView();\n\n\t\t\tconst dataHref = record.presentation?.folderDataHref;\n\n\t\t\tif (record.exitsExplorer || event?.altKey || event?.ctrlKey || event?.metaKey || event?.shiftKey || event?.button > 0 || typeof dataHref !== \"string\" || location.protocol === \"file:\") return;\n\n\t\t\tevent?.preventDefault();\n\t\t\tawait openFolder(dataHref, new URL(record.href, document.baseURI).href, true);\n\t\t}\n\n\t\tasync function openFolder(\n\t\t\tdataHref,\n\t\t\turl,\n\t\t\tpush,\n\t\t\trefresh = false,\n\t\t\trestoreState = null,\n\t\t\tfresh = false\n\t\t) {\n\t\t\tif (push) saveView();\n\n\t\t\tconst token = ++navigation;\n\n\t\t\tabort?.abort();\n\n\t\t\tconst local = abort = new AbortController();\n\n\t\t\tbusy = true;\n\t\t\terror = \"\";\n\t\t\tfailure = null;\n\n\t\t\ttry {\n\t\t\t\tconst next = await fetchThemePage(dataHref, url, \"ledger\", local.signal, refresh || fresh);\n\t\t\t\tlet nextEntries = next.entries;\n\n\t\t\t\tif (refresh && next.manifestHref && nextEntries.length !== next.total) {\n\t\t\t\t\tnextEntries = (await loadListing(next.manifestHref, { signal: local.signal, cache: \"no-store\" })).entries;\n\t\t\t\t}\n\n\t\t\t\tif (token !== navigation || local.signal.aborted) return;\n\t\t\t\tif (!refresh) viewHistory.commit(next.dataHref, next.path, url, push);\n\n\t\t\t\tmodel = next;\n\t\t\t\tentries = nextEntries;\n\t\t\t\tretryRequest = null;\n\n\t\t\t\tif (!refresh) {\n\t\t\t\t\tconst view = readView(url, \"ledger\", next.path, viewDefaults(next), [], restoreState);\n\n\t\t\t\t\tquery = view.query;\n\t\t\t\t\ttypes = view.types;\n\t\t\t\t\tsort = view.sort;\n\t\t\t\t\tselected = view.selected;\n\t\t\t\t\tscrollTop = view.listTop;\n\t\t\t\t}\n\n\t\t\t\tapplyThemeMetadata(next, url);\n\t\t\t\tawait hydrateData();\n\n\t\t\t\tif (!refresh) {\n\t\t\t\t\tconst view = readView(url, \"ledger\", next.path, viewDefaults(next), [], restoreState);\n\n\t\t\t\t\tawait tick();\n\n\t\t\t\t\tif (selected && !rows().some((entry) => entry.id === selected)) selected = null;\n\n\t\t\t\t\twindow.scrollTo({ top: view.windowY });\n\n\t\t\t\t\tif (restoreState && selected) list?.querySelector(`[data-id=\"${CSS.escape(selected)}\"] a`)?.focus({ preventScroll: true });\n\t\t\t\t}\n\t\t\t} catch(cause) {\n\t\t\t\tif (token === navigation && !local.signal.aborted) {\n\t\t\t\t\terror = ui().labels.folderError;\n\t\t\t\t\tfailure = \"folder\";\n\t\t\t\t\tretryRequest = [dataHref, url, push, refresh, restoreState];\n\t\t\t\t\tviewHistory?.rollback();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (token === navigation) busy = false;\n\t\t\t}\n\t\t}\n\n\t\tfunction navigateLink(event, href, dataHref) {\n\t\t\tif (typeof href !== \"string\" || typeof dataHref !== \"string\" || event?.altKey || event?.ctrlKey || event?.metaKey || event?.shiftKey || event?.button > 0 || location.protocol === \"file:\") return;\n\n\t\t\tevent?.preventDefault();\n\t\t\topenFolder(dataHref, new URL(href, document.baseURI).href, true);\n\t\t}\n\n\t\tasync function move(index) {\n\t\t\tconst target = Math.max(0, Math.min(rows().length - 1, index));\n\t\t\tconst row = rows()[target];\n\n\t\t\tif (!row) return;\n\n\t\t\tselected = row.id;\n\n\t\t\tif (virtual()) {\n\t\t\t\tscrollTop = Math.max(0, offsets()[target] - 100);\n\n\t\t\t\tif (list) window.scrollTo({\n\t\t\t\t\ttop: list.getBoundingClientRect().top + window.scrollY + scrollTop\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tawait tick();\n\t\t\tlist?.querySelector(`[data-order=\"${index}\"] a`)?.focus({ preventScroll: true });\n\t\t}\n\n\t\tfunction keyboard(event) {\n\t\t\tif (event.isComposing || event.altKey || event.ctrlKey || event.metaKey) return;\n\n\t\t\tif (globalOpen) {\n\t\t\t\tif (event.key === \"Escape\") {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tcloseArchive();\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (timestamp) {\n\t\t\t\tif (event.key === \"Escape\") timestamp = null;\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (event.target?.closest?.(\"[data-dirwell-actions]\")) return;\n\n\t\t\tconst editable = (/INPUT|TEXTAREA|SELECT/).test(event.target?.tagName ?? \"\");\n\n\t\t\tif (event.key === \"/\" && !editable) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tsearchInput?.focus();\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (editable) {\n\t\t\t\tif (event.key === \"Escape\") {\n\t\t\t\t\tquery = \"\";\n\t\t\t\t\tsearchInput?.blur();\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (event.key === \"Backspace\" && model.parentHref) {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif (location.protocol === \"file:\" || typeof model.parentDataHref !== \"string\") location.href = model.parentHref; else openFolder(model.parentDataHref, new URL(model.parentHref, document.baseURI).href, true);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst index = rows().findIndex((row) => row.id === selected);\n\n\t\t\tif ([\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tmove(event.key === \"Home\"\n\t\t\t\t\t? 0\n\t\t\t\t\t: event.key === \"End\"\n\t\t\t\t\t\t? rows().length - 1\n\t\t\t\t\t\t: index + (event.key === \"ArrowDown\" ? 1 : -1));\n\t\t\t}\n\t\t}\n\n\t\tfunction updateScheme(value) {\n\t\t\tscheme = value;\n\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(\"dirwell-color-scheme\", value);\n\t\t\t} catch {}\n\t\t}\n\n\t\tlet archiveDebounce;\n\t\tlet archiveTrigger;\n\t\tlet archivePending = false;\n\n\t\tasync function closeArchive() {\n\t\t\tglobalOpen = false;\n\t\t\tawait tick();\n\t\t\tarchiveTrigger?.focus();\n\t\t}\n\n\t\tfunction scheduleArchiveSearch() {\n\t\t\tarchiveAbort?.abort();\n\t\t\tarchiveRequest++;\n\t\t\tarchivePending = false;\n\t\t\tclearTimeout(archiveDebounce);\n\n\t\t\tarchiveDebounce = setTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tarchiveDebounce = undefined;\n\t\t\t\t\tsearchArchive();\n\t\t\t\t},\n\t\t\t\t300\n\t\t\t);\n\t\t}\n\n\t\tasync function searchArchive() {\n\t\t\tconst token = ++archiveRequest;\n\n\t\t\tarchiveAbort?.abort();\n\n\t\t\tconst local = archiveAbort = new AbortController();\n\n\t\t\tglobalRows = [];\n\t\t\tarchiveFailed = false;\n\n\t\t\tconst query = globalQuery.trim();\n\n\t\t\tif (!query) {\n\t\t\t\tglobalStatus = ui().labels.beginArchive;\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tglobalStatus = ui().labels.searchingArchive;\n\t\t\tarchivePending = true;\n\n\t\t\ttry {\n\t\t\t\tif (model.searchQueryHref) {\n\t\t\t\t\tconst result = await queryLiveArchive(model.searchQueryHref, query, local.signal);\n\n\t\t\t\t\tif (token !== archiveRequest || local.signal.aborted) return;\n\n\t\t\t\t\tglobalRows = result.records;\n\n\t\t\t\t\tglobalStatus = result.truncated\n\t\t\t\t\t\t? label(ui(), \"truncatedResults\", {\n\t\t\t\t\t\t\tshown: result.records.length,\n\t\t\t\t\t\t\tcount: result.records.length + \"+\"\n\t\t\t\t\t\t})\n\t\t\t\t\t\t: label(ui(), \"archiveResults\", { count: result.records.length });\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst url = new URL(model.searchIndexHref, document.baseURI);\n\t\t\t\tlet all = archiveCacheHref === url.href && Date.now() - archiveCacheAt < 60000 ? archiveCache : null;\n\n\t\t\t\tif (all === null) {\n\t\t\t\t\tconst response = await fetch(url, { signal: local.signal });\n\n\t\t\t\t\tif (!response.ok) throw new Error(\"Unavailable archive\");\n\n\t\t\t\t\tconst index = await response.json();\n\n\t\t\t\t\tif (index.version !== 3 || !Array.isArray(index.shards) || !Number.isSafeInteger(index.count) || index.count > 100000) throw new Error(\"Unsupported archive\");\n\n\t\t\t\t\tall = [];\n\n\t\t\t\t\tfor (const shard of index.shards) {\n\t\t\t\t\t\tif (typeof shard !== \"string\") throw new Error(\"Invalid shard\");\n\n\t\t\t\t\t\tconst shardUrl = new URL(shard, url);\n\n\t\t\t\t\t\tif (shardUrl.origin !== url.origin) throw new Error(\"Unsafe shard\");\n\n\t\t\t\t\t\tconst chunk = await fetch(shardUrl, { signal: local.signal });\n\n\t\t\t\t\t\tif (!chunk.ok) throw new Error(\"Unavailable shard\");\n\n\t\t\t\t\t\tconst data = await chunk.json();\n\n\t\t\t\t\t\tif (!Array.isArray(data.entries) || all.length + data.entries.length > 100000) throw new Error(\"Invalid archive\");\n\n\t\t\t\t\t\tfor (const record of data.entries) {\n\t\t\t\t\t\t\tif (typeof record.name !== \"string\" || typeof record.path !== \"string\" || typeof record.exitsExplorer !== \"boolean\") throw new Error(\"Invalid archive record\");\n\n\t\t\t\t\t\t\tconst href = record.href === null ? null : new URL(record.href, url);\n\n\t\t\t\t\t\t\tif (href && ![\"http:\", \"https:\"].includes(href.protocol)) throw new Error(\"Unsupported archive link\");\n\n\t\t\t\t\t\t\tall.push({\n\t\t\t\t\t\t\t\tname: record.name,\n\t\t\t\t\t\t\t\tpath: record.path,\n\t\t\t\t\t\t\t\thref: href?.href ?? null,\n\t\t\t\t\t\t\t\texitsExplorer: record.exitsExplorer\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (token !== archiveRequest || local.signal.aborted) return;\n\n\t\t\t\t\tarchiveCache = all;\n\t\t\t\t\tarchiveCacheHref = url.href;\n\t\t\t\t\tarchiveCacheAt = Date.now();\n\t\t\t\t}\n\n\t\t\t\tconst matches = all.map((record) => ({ record, score: fuzzy(query, record.name + \" \" + record.path) })).filter((item) => item.score !== null).sort((a, b) => b.score - a.score || a.record.path.localeCompare(b.record.path));\n\n\t\t\t\tif (token !== archiveRequest || local.signal.aborted) return;\n\n\t\t\t\tglobalRows = matches.slice(0, 100).map((item) => item.record);\n\n\t\t\t\tglobalStatus = matches.length > 100\n\t\t\t\t\t? label(ui(), \"truncatedResults\", { shown: 100, count: matches.length })\n\t\t\t\t\t: label(ui(), \"archiveResults\", { count: matches.length });\n\t\t\t} catch {\n\t\t\t\tif (token === archiveRequest && !local.signal.aborted) {\n\t\t\t\t\tglobalStatus = ui().labels.archiveError;\n\t\t\t\t\tarchiveFailed = true;\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (token === archiveRequest) archivePending = false;\n\t\t\t}\n\t\t}\n\n\t\tonMount(() => {\n\t\t\tviewportHeight = innerHeight;\n\t\t\tready = true;\n\t\t\tabort = new AbortController();\n\n\t\t\ttry {\n\t\t\t\tconst stored = localStorage.getItem(\"dirwell-color-scheme\");\n\n\t\t\t\tif ([\"system\", \"light\", \"dark\"].includes(stored)) scheme = stored;\n\t\t\t} catch {}\n\n\t\t\tviewHistory = createViewHistory(\"ledger\");\n\n\t\t\tconst view = readView(location.href, \"ledger\", model.path, viewDefaults(model), [], history.state);\n\n\t\t\tquery = view.query;\n\t\t\ttypes = view.types;\n\t\t\tsort = view.sort;\n\t\t\tselected = view.selected;\n\t\t\tscrollTop = view.listTop;\n\t\t\tsaveView();\n\n\t\t\tconst onPop = (event) => {\n\t\t\t\tif (event.state?.dataHref) openFolder(event.state.dataHref, location.href, false, false, event.state); else location.reload();\n\t\t\t};\n\n\t\t\twindow.addEventListener(\"popstate\", onPop);\n\t\t\thydrateData();\n\n\t\t\treturn () => {\n\t\t\t\tabort?.abort();\n\t\t\t\tarchiveAbort?.abort();\n\t\t\t\twindow.removeEventListener(\"popstate\", onPop);\n\t\t\t};\n\t\t});\n\n\t\t$$renderer.push(`<header class=\"page-header\"><div class=\"wordmark\">`);\n\n\t\tif (header) {\n\t\t\t$$renderer.push('<!--[0-->');\n\t\t\theader($$renderer, { model });\n\t\t\t$$renderer.push(`<!---->`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\n\t\t\tif (ui().brand.logoUrl) {\n\t\t\t\t$$renderer.push(`<!--[0--><img${$.attr('src', ui().brand.logoUrl)}${$.attr('alt', ui().brand.logoAlt ?? \"\")} width=\"40\" height=\"40\"/>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--> <h1>${$.escape(ui().brand.name ?? model.title)}</h1> <span>${$.escape(ui().labels.archive)}</span>`);\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></div> <nav${$.attr('aria-label', ui().labels.breadcrumb)}><a${$.attr('href', model.rootHref)}>${$.escape(ui().labels.home)}</a><!--[-->`);\n\n\t\tconst each_array = $.ensure_array_like(model.breadcrumbs);\n\n\t\tfor (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {\n\t\t\tlet crumb = each_array[$$index];\n\n\t\t\t$$renderer.push(`<!---->/ <a${$.attr('href', crumb.href)}>${$.escape(crumb.name)}</a>`);\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></nav></header> <main data-explorer=\"\" data-framework=\"svelte\"${$.attr('aria-busy', busy)}><div class=\"toolbar\"><label class=\"search-field\">${$.escape(ui().labels.searchDirectory)}<input type=\"search\"${$.attr('placeholder', ui().labels.searchFiles)}${$.attr('value', query)}${$.attr('disabled', !ready || !complete(), true)}/></label> <fieldset${$.attr('disabled', !ready || !complete(), true)}><legend>${$.escape(ui().labels.types)}</legend><!--[-->`);\n\n\t\tconst each_array_1 = $.ensure_array_like([\"directory\", \"file\", \"link\"]);\n\n\t\tfor (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {\n\t\t\tlet type = each_array_1[$$index_1];\n\n\t\t\t$$renderer.push(`<label><input type=\"checkbox\"${$.attr('checked', types.includes(type), true)}/>${$.escape(ui().labels[type])}</label>`);\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></fieldset> <label>${$.escape(ui().labels.sort)}`);\n\n\t\t$$renderer.select(\n\t\t\t{\n\t\t\t\tvalue: sort.field,\n\t\t\t\tdisabled: !ready || !complete(),\n\t\t\t\tonchange: (event) => sort = { ...sort, field: event.currentTarget.value }\n\t\t\t},\n\t\t\t($$renderer) => {\n\t\t\t\t$$renderer.option({ value: 'name' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.name)}`);\n\t\t\t\t});\n\n\t\t\t\t$$renderer.option({ value: 'size' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.size)}`);\n\t\t\t\t});\n\n\t\t\t\t$$renderer.option({ value: 'modified' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.modified)}`);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\t$$renderer.push(`</label> <label>${$.escape(ui().labels.names)}`);\n\n\t\t$$renderer.select(\n\t\t\t{\n\t\t\t\tvalue: sort.nameMode,\n\t\t\t\tdisabled: !ready || !complete(),\n\t\t\t\tonchange: (event) => sort = { ...sort, nameMode: event.currentTarget.value }\n\t\t\t},\n\t\t\t($$renderer) => {\n\t\t\t\t$$renderer.option({ value: 'natural' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.natural)}`);\n\t\t\t\t});\n\n\t\t\t\t$$renderer.option({ value: 'locale' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.locale)}`);\n\t\t\t\t});\n\n\t\t\t\t$$renderer.option({ value: 'unicode' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.unicode)}`);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\t$$renderer.push(`</label> <label>${$.escape(ui().labels.order)}`);\n\n\t\t$$renderer.select(\n\t\t\t{\n\t\t\t\tvalue: sort.direction,\n\t\t\t\tdisabled: !ready || !complete(),\n\t\t\t\tonchange: (event) => sort = { ...sort, direction: event.currentTarget.value }\n\t\t\t},\n\t\t\t($$renderer) => {\n\t\t\t\t$$renderer.option({ value: 'asc' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.ascending)}`);\n\t\t\t\t});\n\n\t\t\t\t$$renderer.option({ value: 'desc' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.descending)}`);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\t$$renderer.push(`</label> <label><input type=\"checkbox\"${$.attr('checked', sort.directoriesFirst, true)}${$.attr('disabled', !ready || !complete(), true)}/>${$.escape(ui().labels.directoriesFirst)}</label> <label>${$.escape(ui().labels.appearance)}`);\n\n\t\t$$renderer.select(\n\t\t\t{\n\t\t\t\tvalue: scheme,\n\t\t\t\tdisabled: !ready,\n\t\t\t\tonchange: (event) => updateScheme(event.currentTarget.value)\n\t\t\t},\n\t\t\t($$renderer) => {\n\t\t\t\t$$renderer.option({ value: 'system' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.system)}`);\n\t\t\t\t});\n\n\t\t\t\t$$renderer.option({ value: 'light' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.light)}`);\n\t\t\t\t});\n\n\t\t\t\t$$renderer.option({ value: 'dark' }, ($$renderer) => {\n\t\t\t\t\t$$renderer.push(`${$.escape(ui().labels.dark)}`);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\t$$renderer.push(`</label> `);\n\n\t\tif (model.searchIndexHref || model.searchQueryHref) {\n\t\t\t$$renderer.push(`<!--[0--><button${$.attr('disabled', !ready, true)}>${$.escape(ui().labels.searchArchive)}</button>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></div> <section class=\"listing-card\"><div class=\"listing-summary\">${$.escape(countParts()[0])}<span data-visible-count=\"\">${$.escape(complete() ? rows().length : entries.length)}</span>${$.escape(countParts().slice(1).join(\"__COUNT__\"))}<span role=\"status\" aria-live=\"polite\">${$.escape(busy ? ui().labels.loading : error)}</span></div> `);\n\n\t\tif (failure && failure !== \"copy\") {\n\t\t\t$$renderer.push(`<!--[0--><button${$.attr('disabled', busy, true)}>${$.escape(ui().labels.retry)}</button>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--> `);\n\n\t\tif (failure === \"folder\" && retryRequest) {\n\t\t\t$$renderer.push(`<!--[0--><a${$.attr('href', retryRequest[1])}>${$.escape(ui().labels.openNative)}</a>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--> <div class=\"entry-head\"${$.attr('data-custom-columns', Boolean(model.ui?.columns))}${$.attr_style('', {\n\t\t\t'grid-template-columns': model.ui?.columns\n\t\t\t\t? ui().columns.map((column) => column === \"name\"\n\t\t\t\t\t? \"minmax(0,1fr)\"\n\t\t\t\t\t: typeof column === \"object\" ? \"minmax(0,12rem)\" : \"minmax(6rem,max-content)\").join(\" \")\n\t\t\t\t: undefined\n\t\t})}><!--[-->`);\n\n\t\tconst each_array_2 = $.ensure_array_like(ui().columns);\n\n\t\tfor (let $$index_2 = 0, $$length = each_array_2.length; $$index_2 < $$length; $$index_2++) {\n\t\t\tlet column = each_array_2[$$index_2];\n\n\t\t\t$$renderer.push(`<span>${$.escape(columnLabel(column, ui()))}</span>`);\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></div> <ul class=\"entry-list\">`);\n\n\t\tif (model.parentHref) {\n\t\t\t$$renderer.push(`<!--[0--><li class=\"entry\"><a${$.attr('href', model.parentHref)}>../</a></li>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--> `);\n\n\t\tif (start()) {\n\t\t\t$$renderer.push(`<!--[0--><li aria-hidden=\"true\"${$.attr_style('', { height: offsets()[start()] + \"px\" })}></li>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--> <!--[-->`);\n\n\t\tconst each_array_3 = $.ensure_array_like(rows().slice(start(), end()));\n\n\t\tfor (let index = 0, $$length = each_array_3.length; index < $$length; index++) {\n\t\t\tlet entry = each_array_3[index];\n\n\t\t\t$$renderer.push(`<li class=\"entry\" data-entry=\"\"${$.attr('data-custom-columns', Boolean(model.ui?.columns))}${$.attr('data-id', entry.id)}${$.attr('data-order', start() + index)}${$.attr('data-active', selected === entry.id)}${$.attr_style('', {\n\t\t\t\t'grid-template-columns': model.ui?.columns\n\t\t\t\t\t? ui().columns.map((column) => column === \"name\" ? \"minmax(0,1fr)\" : \"minmax(6rem,max-content)\").join(\" \")\n\t\t\t\t\t: undefined\n\t\t\t})}><!--[-->`);\n\n\t\t\tconst each_array_4 = $.ensure_array_like(ui().columns);\n\n\t\t\tfor (let $$index_3 = 0, $$length = each_array_4.length; $$index_3 < $$length; $$index_3++) {\n\t\t\t\tlet column = each_array_4[$$index_3];\n\n\t\t\t\tif (column === \"name\") {\n\t\t\t\t\t$$renderer.push(`<!--[0--><span class=\"identity\">`);\n\n\t\t\t\t\tif (entry.href) {\n\t\t\t\t\t\t$$renderer.push(`<!--[0--><a class=\"name\"${$.attr('href', safeHref(entry))}${$.attr('target', entry.exitsExplorer ? \"_blank\" : undefined)}${$.attr('rel', entry.exitsExplorer ? \"noopener\" : undefined)}>`);\n\n\t\t\t\t\t\tif (row) {\n\t\t\t\t\t\t\t$$renderer.push('<!--[0-->');\n\t\t\t\t\t\t\trow($$renderer, { model, entry, selected: selected === entry.id });\n\t\t\t\t\t\t\t$$renderer.push(`<!---->`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$$renderer.push(`<!--[-1--><span class=\"file-icon\" aria-hidden=\"true\">${$.html(entryIcon(entryType(entry)))}</span> ${$.escape(entry.name)}${$.escape(isDirectory(entry) ? \"/\" : \"\")}`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$$renderer.push(`<!--]--></a>`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$$renderer.push(`<!--[-1--><span>`);\n\n\t\t\t\t\t\tif (row) {\n\t\t\t\t\t\t\t$$renderer.push('<!--[0-->');\n\t\t\t\t\t\t\trow($$renderer, { model, entry, selected: selected === entry.id });\n\t\t\t\t\t\t\t$$renderer.push(`<!---->`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$$renderer.push(`<!--[-1-->${$.escape(entry.name)}`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$$renderer.push(`<!--]--></span>`);\n\t\t\t\t\t}\n\n\t\t\t\t\t$$renderer.push(`<!--]-->`);\n\n\t\t\t\t\tif (entry.link) {\n\t\t\t\t\t\t$$renderer.push(`<!--[0--><small class=\"target\">${$.escape(entry.link.unavailable ? ui().labels.unavailable + \" · \" : \"→ \")}${$.escape(entry.link.target)}</small>`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t\t\t}\n\n\t\t\t\t\t$$renderer.push(`<!--]--></span>`);\n\t\t\t\t} else if (column === \"size\") {\n\t\t\t\t\t$$renderer.push(`<!--[1--><span class=\"kind\">${$.escape(isDirectory(entry) ? ui().labels.folder : size(entry.size))}</span>`);\n\t\t\t\t} else if (column === \"modified\") {\n\t\t\t\t\t$$renderer.push(`<!--[2--><button class=\"timestamp-button\"${$.attr('disabled', !ready, true)}><time${$.attr('datetime', entry.modifiedAt)}>${$.escape(formattedDate(entry.modifiedAt, ui(), ready))}</time></button>`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push(`<!--[-1--><span class=\"entry-data\">${$.escape(publicDataValue(entry.data?.[column.dataKey]))}</span>`);\n\t\t\t\t}\n\n\t\t\t\t$$renderer.push(`<!--]-->`);\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--> `);\n\n\t\t\tif (actions || ui().actions.length) {\n\t\t\t\t$$renderer.push(`<!--[0--><span data-dirwell-actions=\"\" style=\"grid-column:1/-1;display:flex;flex-wrap:wrap;gap:.5rem\">`);\n\n\t\t\t\tif (actions) {\n\t\t\t\t\t$$renderer.push('<!--[0-->');\n\t\t\t\t\tactions($$renderer, { model, entry, selected: selected === entry.id });\n\t\t\t\t\t$$renderer.push(`<!---->`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t\t}\n\n\t\t\t\t$$renderer.push(`<!--]--> <!--[-->`);\n\n\t\t\t\tconst each_array_5 = $.ensure_array_like(ui().actions);\n\n\t\t\t\tfor (let $$index_4 = 0, $$length = each_array_5.length; $$index_4 < $$length; $$index_4++) {\n\t\t\t\t\tlet action = each_array_5[$$index_4];\n\n\t\t\t\t\tif (action === \"download\" && entry.href && !isDirectory(entry) && !entry.link?.unavailable) {\n\t\t\t\t\t\t$$renderer.push(`<!--[0--><a${$.attr('href', safeHref(entry))} download=\"\">${$.escape(ui().labels.download)}</a>`);\n\t\t\t\t\t} else if (action !== \"download\") {\n\t\t\t\t\t\t$$renderer.push(`<!--[1--><button${$.attr('disabled', !ready || action === \"copy-link\" && !entry.href, true)}${$.attr('aria-label', (action === \"copy-link\" ? ui().labels.copyLink : ui().labels.copyPath) + \": \" + entry.name)}>${$.escape(action === \"copy-link\" ? ui().labels.copyLink : ui().labels.copyPath)}</button>`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t\t\t}\n\n\t\t\t\t\t$$renderer.push(`<!--]-->`);\n\t\t\t\t}\n\n\t\t\t\t$$renderer.push(`<!--]--></span>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--></li>`);\n\t\t}\n\n\t\t$$renderer.push(`<!--]--> `);\n\n\t\tif (end() < rows().length) {\n\t\t\t$$renderer.push(`<!--[0--><li aria-hidden=\"true\"${$.attr_style('', { height: offsets()[rows().length] - offsets()[end()] + \"px\" })}></li>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></ul> `);\n\n\t\tif (rows().length === 0 && !busy) {\n\t\t\t$$renderer.push(`<!--[0--><p>${$.escape(model.total === 0 ? ui().labels.empty : ui().labels.noMatches)}</p>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></section> `);\n\n\t\tif (model.page?.count > 1 && !complete()) {\n\t\t\t$$renderer.push(`<!--[0--><nav${$.attr('aria-label', ui().labels.pagination)}>`);\n\n\t\t\tif (model.page.previousHref) {\n\t\t\t\t$$renderer.push(`<!--[0--><a rel=\"prev\"${$.attr('href', model.page.previousHref)}>${$.escape(ui().labels.previous)}</a>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--> ${$.escape(label(ui(), \"page\", { page: model.page.number, pages: model.page.count }))} `);\n\n\t\t\tif (model.page.nextHref) {\n\t\t\t\t$$renderer.push(`<!--[0--><a rel=\"next\"${$.attr('href', model.page.nextHref)}>${$.escape(ui().labels.next)}</a>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--></nav>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--> `);\n\n\t\tif (footer) {\n\t\t\t$$renderer.push('<!--[0-->');\n\t\t\tfooter($$renderer, { model });\n\t\t\t$$renderer.push(`<!---->`);\n\t\t} else if (ui().brand.footerText) {\n\t\t\t$$renderer.push(`<!--[1--><p class=\"brand-footer\">`);\n\n\t\t\tif (ui().brand.footerUrl) {\n\t\t\t\t$$renderer.push(`<!--[0--><a${$.attr('href', ui().brand.footerUrl)}>${$.escape(ui().brand.footerText)}</a>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push(`<!--[-1-->${$.escape(ui().brand.footerText)}`);\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--></p>`);\n\t\t} else {\n\t\t\t$$renderer.push(`<!--[-1--><p class=\"keyboard-help\">${$.escape(ui().labels.keyboardHelp)}</p>`);\n\t\t}\n\n\t\t$$renderer.push(`<!--]--></main> `);\n\n\t\tif (timestamp) {\n\t\t\t$$renderer.push(`<!--[0--><dialog><h2>${$.escape(ui().labels.modifiedTime)}</h2> <p>${$.escape(timestamp)}</p> <p>${$.escape(ui().dateOptions.locale !== undefined || ui().dateOptions.timeZone !== undefined\n\t\t\t\t? formattedDate(timestamp, ui(), true)\n\t\t\t\t: new Date(timestamp).toLocaleString())}</p> <button>${$.escape(ui().labels.close)}</button></dialog>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]--> `);\n\n\t\tif (globalOpen) {\n\t\t\t$$renderer.push(`<!--[0--><dialog${$.attr('aria-label', ui().labels.searchArchive)}><h2>${$.escape(ui().labels.searchArchive)}</h2> <input${$.attr('aria-label', ui().labels.archiveSearchInput)} type=\"search\"${$.attr('value', globalQuery)}/> <p role=\"status\">${$.escape(globalStatus)}</p> `);\n\n\t\t\tif (archiveFailed) {\n\t\t\t\t$$renderer.push(`<!--[0--><button>${$.escape(ui().labels.retry)}</button>`);\n\t\t\t} else {\n\t\t\t\t$$renderer.push('<!--[-1-->');\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--> <ul><!--[-->`);\n\n\t\t\tconst each_array_6 = $.ensure_array_like(globalRows);\n\n\t\t\tfor (let $$index_6 = 0, $$length = each_array_6.length; $$index_6 < $$length; $$index_6++) {\n\t\t\t\tlet record = each_array_6[$$index_6];\n\n\t\t\t\t$$renderer.push(`<li>`);\n\n\t\t\t\tif (record.href) {\n\t\t\t\t\t$$renderer.push(`<!--[0--><a${$.attr('href', record.href)}${$.attr('target', record.exitsExplorer ? \"_blank\" : undefined)}${$.attr('rel', record.exitsExplorer ? \"noopener\" : undefined)}>${$.escape(record.path)}</a>`);\n\t\t\t\t} else {\n\t\t\t\t\t$$renderer.push(`<!--[-1-->${$.escape(record.path)}`);\n\t\t\t\t}\n\n\t\t\t\t$$renderer.push(`<!--]--></li>`);\n\t\t\t}\n\n\t\t\t$$renderer.push(`<!--]--></ul> <button>${$.escape(ui().labels.close)}</button></dialog>`);\n\t\t} else {\n\t\t\t$$renderer.push('<!--[-1-->');\n\t\t}\n\n\t\t$$renderer.push(`<!--]-->`);\n\t});\n}","import {render} from 'svelte/server';import App from './.generated/App-server.mjs';export const renderBody=model=>render(App,{props:{model}}).body;","import { readFile } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { escapeHtml } from \"@dirwell/core\";\nimport type { ExplorerTheme } from \"@dirwell/core\";\nimport { createThemePage, folderDataHref, pageAsset } from \"../../shared-theme/src/page.ts\";\n// Generated server component is paired with the separately compiled browser component.\nimport type { FrameworkRenderer } from \"./model.ts\";\nexport type { FrameworkRenderer, ThemePage } from \"./model.ts\";\nimport { renderBody } from \"../render-generated.mjs\";\nimport {\n assertThemeOptions,\n resolveCustomization,\n customizationCss,\n pickCustomization,\n type ThemeCustomization,\n} from \"../../shared-theme/src/customization.ts\";\nexport type {\n ThemeCustomization,\n ThemeLabels,\n ThemeColumn,\n ThemeAction,\n} from \"../../shared-theme/src/customization.ts\";\nexport interface LedgerThemeOptions extends ThemeCustomization {\n readonly title?: string;\n readonly archiveSearch?: boolean;\n}\nexport function createLedgerTheme(\n options: LedgerThemeOptions = {},\n renderer?: FrameworkRenderer,\n): ExplorerTheme {\n assertThemeOptions(options, [\"title\", \"archiveSearch\"]);\n if (options.title !== undefined && (typeof options.title !== \"string\" || !options.title))\n throw new TypeError(\"title must be a non-empty string\");\n if (options.archiveSearch !== undefined && typeof options.archiveSearch !== \"boolean\")\n throw new TypeError(\"archiveSearch must be a boolean\");\n const ui = resolveCustomization(options);\n const publishedUi = pickCustomization(options);\n // Bundled resources are immutable for this theme instance; source rebuilds use a new instance.\n let resources: Promise<{ script: string; scriptName: string; styles: string }> | undefined;\n const loadResources = () =>\n (resources ??= Promise.all([\n renderer?.clientScript ?? readFile(new URL(\"./client.js\", import.meta.url), \"utf8\"),\n readFile(new URL(\"./styles.css\", import.meta.url), \"utf8\"),\n ]).then(([script, styles]) => ({\n script,\n styles,\n scriptName: `ledger-client-${createHash(\"sha256\").update(script).digest(\"hex\").slice(0, 16)}.js`,\n })));\n const theme: ExplorerTheme = {\n name: \"ledger\",\n searchIndex: options.archiveSearch ?? true,\n listing: { pagination: true },\n entryData: (entry, context) => ({ folderDataHref: folderDataHref(entry, context, \"ledger\") }),\n async render(context) {\n const model = {\n ...createThemePage(context, theme, options.title ?? ui.brand.name ?? \"Dirwell\"),\n ...(publishedUi === undefined ? {} : { ui: publishedUi }),\n searchIndexHref: theme.searchIndex === false ? null : context.searchIndexHref,\n searchQueryHref: theme.searchIndex === false ? null : (context.searchQueryHref ?? null),\n };\n const { script, scriptName, styles } = await loadResources();\n const json = JSON.stringify(model).replaceAll(\"<\", \"\\\\u003c\");\n return {\n html: `<!doctype html><html lang=\"${escapeHtml(ui.language)}\" dir=\"${ui.direction}\" data-theme=\"system\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">${context.documentBaseHref === null ? \"\" : `<base href=\"${escapeHtml(context.documentBaseHref)}\">`}${context.metadata?.head ?? `<title>${escapeHtml(model.title)}</title>`}${ui.brand.faviconUrl ? `<link rel=\"icon\" href=\"${escapeHtml(ui.brand.faviconUrl)}\">` : \"\"}<style>${styles}${renderer?.styles ?? \"\"}${customizationCss(ui)}</style></head><body><div data-dirwell-theme=\"ledger\">${await (renderer?.renderBody ?? renderBody)(model)}</div><script type=\"application/json\" id=\"dirwell-page-data\">${json}</script><script ${renderer?.clientType === \"module\" ? 'type=\"module\"' : \"defer\"} src=\"${escapeHtml(context.assetHref(scriptName))}\"></script></body></html>`,\n assets: {\n [scriptName]: script,\n [pageAsset(\"ledger\", model.path, model.page?.number ?? 1)]: JSON.stringify(model),\n },\n };\n },\n };\n return theme;\n}\n"],"mappings":"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"}
|
|
@@ -133,6 +133,8 @@ interface ThemePage$1 {
|
|
|
133
133
|
readonly manifestHref: string | null;
|
|
134
134
|
readonly listingRevision?: string;
|
|
135
135
|
readonly updatesHref: string | null;
|
|
136
|
+
readonly searchQueryHref?: string | null;
|
|
137
|
+
readonly searchRefreshIntervalMs?: number;
|
|
136
138
|
readonly total: number;
|
|
137
139
|
readonly entries: readonly ListingEntry[];
|
|
138
140
|
readonly sort: Required<SortOptions>;
|
|
@@ -162,4 +164,4 @@ interface RowContext {
|
|
|
162
164
|
}
|
|
163
165
|
//#endregion
|
|
164
166
|
export { ThemeAction as a, ThemeLabels as c, ThemePage as i, ListingEntry$1 as n, ThemeColumn as o, RowContext as r, ThemeCustomization as s, FrameworkRenderer as t };
|
|
165
|
-
//# sourceMappingURL=model-
|
|
167
|
+
//# sourceMappingURL=model-BgCmoksr.d.mts.map
|
package/dist/model.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as ThemePage, n as ListingEntry, r as RowContext, t as FrameworkRenderer } from "./model-
|
|
1
|
+
import { i as ThemePage, n as ListingEntry, r as RowContext, t as FrameworkRenderer } from "./model-BgCmoksr.mjs";
|
|
2
2
|
export { FrameworkRenderer, type ListingEntry, RowContext, ThemePage };
|