@dirwell/theme-crosswave 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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["paths","_ssrRenderAttr","_ssrInterpolate","_unref","_ssrRenderDynamicAttr","_ssrRenderClass","_ssrIncludeBooleanAttr","_ssrRenderStyle","_ssrLooseContain","_ssrLooseEqual","App"],"sources":["../../shared-theme/src/page.ts","../src/icons.ts","../src/categories.ts","../../shared-theme/src/customization.ts","../../shared-theme/src/navigation.ts","../../shared-theme/src/view-state.ts","../../shared-theme/src/icons.ts","../../shared-theme/src/records.ts","../.generated/wave.mjs","../.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","export type CrosswaveIcon =\n | \"all\"\n | \"folder\"\n | \"image\"\n | \"audio\"\n | \"video\"\n | \"document\"\n | \"other\"\n | \"link\"\n | \"back\"\n | \"search\"\n | \"pause\"\n | \"play\"\n | \"controller\";\n\nconst paths: Record<CrosswaveIcon, string> = {\n all: '<rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"/>',\n folder:\n '<path d=\"M3 7V5a1 1 0 0 1 1-1h5l2 3h9a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1Z\"/><path d=\"M3 9h18\"/>',\n image:\n '<rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"1.5\"/><circle cx=\"8\" cy=\"9\" r=\"1.5\"/><path d=\"m3 17 5-5 4 4 4-6 5 7\"/>',\n audio:\n '<path d=\"M9 18V5l11-2v13M9 8l11-2\"/><ellipse cx=\"6\" cy=\"18\" rx=\"3\" ry=\"2.5\"/><ellipse cx=\"17\" cy=\"16\" rx=\"3\" ry=\"2.5\"/>',\n video: '<rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"1.5\"/><path d=\"m10 8 6 4-6 4Z\"/>',\n document: '<path d=\"M5 3h9l5 5v13H5ZM14 3v5h5M8 12h8M8 16h6\"/>',\n other: '<path d=\"m12 3 9 5v9l-9 5-9-5V8ZM3 8l9 5 9-5M12 13v9\"/>',\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 back: '<path d=\"m10 5-7 7 7 7M3 12h18\"/>',\n search: '<circle cx=\"10.5\" cy=\"10.5\" r=\"6.5\"/><path d=\"m16 16 5 5\"/>',\n pause: '<path d=\"M8 5v14M16 5v14\"/>',\n play: '<path d=\"m8 4 12 8-12 8Z\"/>',\n controller:\n '<path d=\"M7 7h10c3 0 4 3 5 9 0 3-2 4-4 1l-2-2H8l-2 2c-2 3-4 2-4-1 1-6 2-9 5-9ZM6 11h4M8 9v4M16 10h.01M19 13h.01\"/>',\n};\n\n/** Original geometric icons, not copied console artwork. */\nexport function crosswaveIcon(name: CrosswaveIcon): 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[name]}</svg>`;\n}\n","import mime from \"mime\";\nimport type { ListingEntry } from \"@dirwell/core\";\nimport { crosswaveIcon, type CrosswaveIcon } from \"./icons.ts\";\n\nexport type CrosswaveCategoryIcon = CrosswaveIcon | { readonly svg: string };\nexport type CrosswaveCategoryMatch =\n | \"all\"\n | \"folders\"\n | \"other\"\n | { readonly extensions?: readonly string[]; readonly mimeTypes?: readonly string[] };\nexport interface CrosswaveCategory {\n readonly id: string;\n readonly label: string;\n readonly icon?: CrosswaveCategoryIcon;\n readonly match: CrosswaveCategoryMatch;\n}\nexport interface ResolvedCrosswaveCategory {\n readonly id: string;\n readonly label: string;\n readonly svg: string;\n readonly match: CrosswaveCategoryMatch;\n}\nconst documents = [\n \"text/*\",\n \"application/pdf\",\n \"application/json\",\n \"application/*+json\",\n \"application/xml\",\n \"application/*+xml\",\n \"application/msword\",\n \"application/rtf\",\n \"application/sql\",\n \"application/epub+zip\",\n \"application/vnd.ms-excel\",\n \"application/vnd.ms-powerpoint\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n] as const;\nconst definitions: readonly CrosswaveCategory[] = [\n { id: \"all\", label: \"All files\", icon: \"all\", match: \"all\" },\n { id: \"folder\", label: \"Folders\", icon: \"folder\", match: \"folders\" },\n { id: \"image\", label: \"Photos\", icon: \"image\", match: { mimeTypes: [\"image/*\"] } },\n {\n id: \"audio\",\n label: \"Music\",\n icon: \"audio\",\n match: { mimeTypes: [\"audio/*\", \"application/vnd.apple.mpegurl\"] },\n },\n { id: \"video\", label: \"Videos\", icon: \"video\", match: { mimeTypes: [\"video/*\"] } },\n { id: \"document\", label: \"Documents\", icon: \"document\", match: { mimeTypes: documents } },\n { id: \"other\", label: \"Other\", icon: \"other\", match: \"other\" },\n];\n/** Default rail definitions. Supply a mapped/filtered copy to change labels, order, or visibility. */\nexport const defaultCrosswaveCategories: readonly CrosswaveCategory[] = Object.freeze(\n definitions.map((category) =>\n Object.freeze({\n ...category,\n match:\n typeof category.match === \"string\"\n ? category.match\n : Object.freeze({\n ...(category.match.extensions\n ? { extensions: Object.freeze([...category.match.extensions]) }\n : {}),\n ...(category.match.mimeTypes\n ? { mimeTypes: Object.freeze([...category.match.mimeTypes]) }\n : {}),\n }),\n }),\n ),\n);\nconst record = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\nfunction strings(\n value: unknown,\n normalize: (value: string) => string,\n): readonly string[] | undefined {\n if (value === undefined) return undefined;\n if (!Array.isArray(value))\n throw new TypeError(\"Crosswave category rules must be arrays of strings\");\n return Object.freeze([\n ...new Set(\n Array.from(value, (item: unknown) => {\n if (typeof item !== \"string\")\n throw new TypeError(\"Crosswave category rules must be arrays of strings\");\n return normalize(item);\n }),\n ),\n ]);\n}\nfunction extension(value: string): string {\n const normalized = value.toLowerCase().replace(/^\\./, \"\");\n if (!/^[a-z0-9+_-]+(?:\\.[a-z0-9+_-]+)*$/.test(normalized))\n throw new TypeError(`Invalid Crosswave extension: ${value}`);\n return normalized;\n}\nfunction mediaType(value: string): string {\n const normalized = value.toLowerCase();\n if (!/^[a-z0-9!#$&^_.+-]+\\/(?:[a-z0-9!#$&^_.+-]+|\\*|\\*\\+[a-z0-9!#$&^_.-]+)$/.test(normalized))\n throw new TypeError(`Invalid Crosswave MIME pattern: ${value}`);\n return normalized;\n}\nfunction match(value: unknown): CrosswaveCategoryMatch {\n if (value === \"all\" || value === \"folders\" || value === \"other\") return value;\n if (\n !record(value) ||\n Object.keys(value).some((key) => ![\"extensions\", \"mimeTypes\"].includes(key))\n )\n throw new TypeError(\"Crosswave match must be all, folders, other, or extension/MIME rules\");\n const extensions = strings(value.extensions, extension);\n const mimeTypes = strings(value.mimeTypes, mediaType);\n if (!extensions?.length && !mimeTypes?.length)\n throw new TypeError(\"Crosswave category needs at least one matching rule\");\n return Object.freeze({\n ...(extensions ? { extensions } : {}),\n ...(mimeTypes ? { mimeTypes } : {}),\n });\n}\nfunction icon(value: unknown, rule: CrosswaveCategoryMatch): string {\n if (value === undefined)\n return crosswaveIcon(rule === \"all\" ? \"all\" : rule === \"folders\" ? \"folder\" : \"other\");\n if (typeof value === \"string\" && isCrosswaveIcon(value)) return crosswaveIcon(value);\n if (\n record(value) &&\n typeof value.svg === \"string\" &&\n /^\\s*<svg\\b/i.test(value.svg) &&\n /<\\/svg>\\s*$/i.test(value.svg)\n )\n return value.svg.replace(/<svg\\b/i, '<svg aria-hidden=\"true\"');\n throw new TypeError(\"Crosswave icon must be a built-in icon name or trusted SVG markup\");\n}\nfunction isCrosswaveIcon(value: string): value is CrosswaveIcon {\n return [\n \"all\",\n \"folder\",\n \"image\",\n \"audio\",\n \"video\",\n \"document\",\n \"other\",\n \"link\",\n \"back\",\n \"search\",\n \"pause\",\n \"play\",\n \"controller\",\n ].includes(value);\n}\nexport function resolveCrosswaveCategories(value: unknown): readonly ResolvedCrosswaveCategory[] {\n const input = value === undefined ? defaultCrosswaveCategories : value;\n if (!Array.isArray(input) || !input.length)\n throw new TypeError(\"Crosswave categories must be a nonempty array\");\n const ids = new Set<string>();\n return Object.freeze(\n Array.from(input).map((category: unknown) => {\n if (\n !record(category) ||\n typeof category.id !== \"string\" ||\n !/^[a-z][a-z0-9_-]{0,63}$/.test(category.id)\n )\n throw new TypeError(\"Crosswave category id must be a lowercase identifier\");\n if (ids.has(category.id))\n throw new TypeError(`Duplicate Crosswave category id: ${category.id}`);\n ids.add(category.id);\n if (typeof category.label !== \"string\" || !category.label.trim())\n throw new TypeError(\"Crosswave category label must be nonempty\");\n const rule = match(category.match);\n return Object.freeze({\n id: category.id,\n label: category.label,\n svg: icon(category.icon, rule),\n match: rule,\n });\n }),\n );\n}\nexport function matchesMimeType(pattern: string, type: string): boolean {\n if (pattern === type) return true;\n const [group, subtype] = pattern.split(\"/\");\n if (!subtype || !type.startsWith(`${group}/`)) return false;\n return subtype === \"*\" || (subtype.startsWith(\"*+\") && type.endsWith(subtype.slice(1)));\n}\nexport function entryMimeType(entry: ListingEntry): string | null {\n if (entry.kind === \"directory\" || entry.link?.targetKind === \"directory\") return null;\n return (\n mime.getType(`./${entry.name}`) ??\n (entry.link?.targetKind === \"file\" && !entry.link.unavailable && entry.href\n ? mime.getType(new URL(entry.href, \"https://dirwell.invalid/\").pathname)\n : null)\n );\n}\nexport function entryCategory(entry: ListingEntry, type: string | null): CrosswaveIcon {\n if (entry.kind === \"directory\" || entry.link?.targetKind === \"directory\") return \"folder\";\n if (type?.startsWith(\"image/\")) return \"image\";\n if (type?.startsWith(\"audio/\") || type === \"application/vnd.apple.mpegurl\") return \"audio\";\n if (type?.startsWith(\"video/\")) return \"video\";\n if (type && documents.some((pattern) => matchesMimeType(pattern, type))) return \"document\";\n return \"other\";\n}\nexport function entryCategories(\n entry: ListingEntry,\n type: string | null,\n categories: readonly ResolvedCrosswaveCategory[],\n): readonly ResolvedCrosswaveCategory[] {\n const folder = entry.kind === \"directory\" || entry.link?.targetKind === \"directory\";\n const filename = entry.name.toLowerCase();\n const specific = categories.filter(\n (category) =>\n typeof category.match !== \"string\" &&\n !folder &&\n (category.match.extensions?.some((ext) => filename.endsWith(`.${ext}`)) ||\n (type && category.match.mimeTypes?.some((pattern) => matchesMimeType(pattern, type)))),\n );\n return categories.filter(\n (category) =>\n category.match === \"all\" ||\n (folder && category.match === \"folders\") ||\n (!folder && category.match === \"other\" && !specific.length) ||\n specific.includes(category),\n );\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 { 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","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","export function createWave(canvas, colors, root, moving, onReady) {\n let gl;\n try {\n gl = canvas.getContext(\"webgl\", {\n alpha: false,\n antialias: false,\n powerPreference: \"low-power\",\n });\n } catch {\n return null;\n }\n if (!gl) return null;\n const vertex = \"attribute vec2 p;void main(){gl_Position=vec4(p,0.,1.);}\";\n const fragment = `precision highp float;uniform vec2 resolution;uniform float time;uniform vec3 tint;\n void main(){vec2 uv=gl_FragCoord.xy/resolution;float x=uv.x;float y=uv.y;float t=time;\n vec3 ground=mix(tint*.22,tint,clamp(y*.85+x*.1,0.,1.));ground+=vec3(.035)*pow(max(0.,1.-distance(uv,vec2(.2,.9))),3.);\n float light=0.;for(int i=0;i<3;i++){float k=float(i);float center=.40+.07*sin(x*4.2+t*.17+k*.8)+.035*cos(x*7.1-t*.11+k*1.4)+k*.024;\n float breadth=.012+.037*(.5+.5*sin(x*2.7+t*.09+k));float d=y-center;float sheet=exp(-pow(d/breadth,2.));float edge=exp(-abs(d-breadth*.65)*430.);\n float fold=exp(-abs(d+breadth*.35)*170.);float taper=pow(sin(clamp(x,0.,1.)*3.14159),.6);light+=(sheet*.07+edge*.23+fold*.09)*taper;}\n ground+=mix(vec3(.6,.8,1.),vec3(1.),.75)*min(light,.12);gl_FragColor=vec4(ground,1.);}`;\n const shader = (type, source) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, source);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, vertex),\n fs = shader(gl.FRAGMENT_SHADER, fragment);\n if (!vs || !fs) {\n if (vs) gl.deleteShader(vs);\n if (fs) gl.deleteShader(fs);\n return null;\n }\n const program = gl.createProgram();\n if (!program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n const buffer = gl.createBuffer();\n if (!buffer) {\n gl.deleteProgram(program);\n return null;\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]), gl.STATIC_DRAW);\n gl.useProgram(program);\n const p = gl.getAttribLocation(program, \"p\");\n gl.enableVertexAttribArray(p);\n gl.vertexAttribPointer(p, 2, gl.FLOAT, false, 0, 0);\n const r = gl.getUniformLocation(program, \"resolution\"),\n t = gl.getUniformLocation(program, \"time\"),\n c = gl.getUniformLocation(program, \"tint\");\n let frame = 0,\n last = 0,\n lost = false,\n frozenTime = 17;\n const draw = (now) => {\n if (lost) return;\n const ratio = Math.min(devicePixelRatio || 1, 1.5, 1600 / innerWidth, 1000 / innerHeight),\n width = Math.round(innerWidth * ratio),\n height = Math.round(innerHeight * ratio);\n if (canvas.width !== width || canvas.height !== height) {\n canvas.width = width;\n canvas.height = height;\n gl.viewport(0, 0, width, height);\n }\n if (moving()) frozenTime = (Date.now() % 86400000) / 1000;\n gl.uniform2f(r, width, height);\n gl.uniform1f(t, frozenTime);\n gl.uniform3fv(c, colors[root.dataset.cwColor] ?? colors.azure);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n onReady(true);\n last = now;\n };\n const tick = (now) => {\n frame = 0;\n if (!moving() || lost) return;\n if (now - last >= 33) draw(now);\n frame = requestAnimationFrame(tick);\n };\n const stop = () => {\n cancelAnimationFrame(frame);\n frame = 0;\n };\n const sync = () => {\n stop();\n if (lost) return;\n draw(0);\n if (moving()) frame = requestAnimationFrame(tick);\n };\n const contextLost = (event) => {\n event.preventDefault();\n lost = true;\n stop();\n onReady(false);\n };\n canvas.addEventListener(\"webglcontextlost\", contextLost);\n const contextRestored = () => {\n onReady(false);\n lost = true;\n };\n canvas.addEventListener(\"webglcontextrestored\", contextRestored);\n const resized = () => draw(0);\n addEventListener(\"resize\", resized);\n return {\n dispose() {\n stop();\n removeEventListener(\"resize\", resized);\n canvas.removeEventListener(\"webglcontextlost\", contextLost);\n canvas.removeEventListener(\"webglcontextrestored\", contextRestored);\n gl.deleteBuffer(buffer);\n gl.deleteProgram(program);\n },\n draw,\n sync,\n stop,\n get available() {\n return !lost;\n },\n };\n}\n","import { unref as _unref } from \"vue\"\nimport { ssrRenderAttr as _ssrRenderAttr, ssrRenderSlot as _ssrRenderSlot, ssrRenderClass as _ssrRenderClass, ssrIncludeBooleanAttr as _ssrIncludeBooleanAttr, ssrRenderDynamicAttr as _ssrRenderDynamicAttr, ssrRenderStyle as _ssrRenderStyle, ssrLooseContain as _ssrLooseContain, ssrLooseEqual as _ssrLooseEqual, ssrInterpolate as _ssrInterpolate, ssrRenderList as _ssrRenderList } from \"vue/server-renderer\"\n\nimport {\n ref,\n shallowRef,\n computed,\n onMounted,\n onBeforeUnmount,\n watchEffect,\n watch,\n nextTick,\n} from \"vue\";\nimport { useGamepad } from \"@vueuse/core\";\nimport { loadListing } from \"@dirwell/core/client\";\nimport {\n fetchThemePage,\n applyThemeMetadata,\n restoreThemePage,\n} from \"../../shared-theme/src/navigation.ts\";\nimport { readView, createViewHistory } from \"../../shared-theme/src/view-state.ts\";\nimport { entryIcon } from \"../../shared-theme/src/icons.ts\";\nimport { directoryLike, size } from \"../../shared-theme/src/records.ts\";\nimport {\n resolveCustomization,\n label,\n formattedDate,\n copyEntryAction,\n publicDataValue,\n} from \"../../shared-theme/src/customization.ts\";\nimport { createWave } from \"./wave.mjs\";\n\nexport default {\n __name: 'Crosswave',\n __ssrInlineRender: true,\n props: { model: { type: Object, required: true } },\n setup(__props) {\n\nconst props = __props,\n model = shallowRef(restoreThemePage(props.model, Boolean(import.meta.hot))),\n entries = shallowRef(model.value.entries),\n ui = computed(() => resolveCustomization(model.value.ui));\nconst query = ref(\"\"),\n category = ref(model.value.categories[0]?.id ?? null),\n selected = ref(null),\n ready = ref(false),\n busy = ref(false),\n error = ref(\"\"),\n failure = ref(null),\n color = ref(props.model.color),\n paused = ref(!props.model.backgroundMotion),\n clock = ref(\"\"),\n pad = ref(false),\n waveReady = ref(false),\n pendingUpdates = ref(null),\n canvas = ref(),\n search = ref(),\n listScroll = ref(),\n footerElement = ref(),\n scrollTop = ref(0),\n viewportHeight = ref(400),\n retryRequest = shallowRef(null),\n heights = shallowRef(new Map());\nconst complete = computed(() => entries.value.length === model.value.total),\n membership = (entry) =>\n Array.isArray(entry.presentation?.categories) ? entry.presentation.categories : [];\nconst rows = computed(() =>\n entries.value.filter(\n (entry) =>\n membership(entry).includes(category.value) &&\n `${entry.name} ${entry.link?.target ?? \"\"}`\n .toLocaleLowerCase()\n .includes(query.value.trim().toLocaleLowerCase()),\n ),\n ),\n active = computed(() => rows.value.find((entry) => entry.id === selected.value) ?? rows.value[0]),\n heading = computed(\n () =>\n model.value.categories.find((item) => item.id === category.value)?.label ??\n ui.value.labels.allFiles,\n );\nconst nodes = new Map();\nconst virtual = computed(() => ready.value && rows.value.length > 500);\nconst offsets = computed(() => {\n const result = [0];\n for (const entry of rows.value) result.push(result.at(-1) + (heights.value.get(entry.id) ?? 76));\n return result;\n});\nconst start = computed(() => {\n if (!virtual.value) return 0;\n const position = Math.max(0, scrollTop.value - (model.value.parentHref ? 76 : 0));\n let low = 0,\n high = rows.value.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if (offsets.value[middle + 1] <= position) low = middle + 1;\n else high = middle;\n }\n return Math.max(0, low - 5);\n});\nconst end = computed(() => {\n if (!virtual.value) return rows.value.length;\n let low = 0,\n high = rows.value.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if (offsets.value[middle + 1] <= scrollTop.value + viewportHeight.value) low = middle + 1;\n else high = middle;\n }\n return Math.min(rows.value.length, Math.max(start.value + 35, low + 5));\n});\nconst visibleRows = computed(() => rows.value.slice(start.value, end.value));\nconst heightCache = new Map();\nlet rowObserver, layoutObserver, viewHistory, measuredWidth;\nfunction measureLayout() {\n if (!listScroll.value) return;\n const width = listScroll.value.clientWidth;\n if (measuredWidth !== undefined && width !== measuredWidth) {\n heightCache.clear();\n heights.value = new Map(\n [...nodes].map(([id, node]) => [id, node.getBoundingClientRect().height]),\n );\n }\n measuredWidth = width;\n const footerHeight = footerElement.value?.getBoundingClientRect().height ?? 82;\n document.documentElement.style.setProperty(\"--cw-footer-height\", footerHeight + \"px\");\n const available = Math.max(\n 160,\n innerHeight - listScroll.value.getBoundingClientRect().top - footerHeight - 24,\n );\n viewportHeight.value = available;\n listScroll.value.style.setProperty(\"--cw-list-height\", available + \"px\");\n}\nwatch([virtual, () => model.value.path], () => nextTick(measureLayout));\nconst viewDefaults = (page) => ({ query: \"\", category: page.categories[0]?.id ?? null });\nfunction saveView() {\n if (!viewHistory) return;\n viewHistory.save(\n new URL(model.value.dataHref, document.baseURI).href,\n model.value.path,\n {\n query: query.value,\n category: category.value,\n selected: selected.value,\n windowY: window.scrollY,\n listTop: listScroll.value?.scrollTop ?? 0,\n },\n viewDefaults(model.value),\n );\n}\nfunction retry() {\n if (failure.value === \"folder\" && retryRequest.value) openFolder(...retryRequest.value, true);\n else openFolder(model.value.dataHref, location.href, false, true);\n}\nwatchEffect((onCleanup) => {\n if (!ready.value || busy.value) return;\n const view = {\n query: query.value,\n category: category.value,\n selected: selected.value,\n listTop: scrollTop.value,\n };\n const dataHref = model.value.dataHref,\n path = model.value.path,\n defaults = viewDefaults(model.value);\n const frame = requestAnimationFrame(() =>\n viewHistory?.save(\n new URL(dataHref, document.baseURI).href,\n path,\n { ...view, windowY: window.scrollY },\n defaults,\n ),\n );\n onCleanup(() => cancelAnimationFrame(frame));\n});\nfunction setNode(id, node) {\n const old = nodes.get(id);\n if (old && old !== node) rowObserver?.unobserve(old);\n if (node) {\n nodes.set(id, node);\n rowObserver?.observe(node);\n } else nodes.delete(id);\n}\nwatch([query, category], () => {\n scrollTop.value = 0;\n if (listScroll.value) listScroll.value.scrollTop = 0;\n});\nlet wave,\n gamepad,\n abort,\n navigation = 0,\n timer,\n lastPad = 0,\n pressed = new Set(),\n disposed = false,\n padIdentity = null,\n motionQuery;\nfunction safeHref(entry) {\n return typeof location !== \"undefined\" &&\n location.protocol === \"file:\" &&\n directoryLike(entry) &&\n !entry.exitsExplorer &&\n entry.href?.endsWith(\"/\")\n ? entry.href + \"index.html\"\n : entry.href;\n}\nasync function loadComplete() {\n if (complete.value || !model.value.manifestHref || location.protocol === \"file:\") return;\n const local = abort,\n token = navigation;\n busy.value = true;\n try {\n const data = await loadListing(new URL(model.value.manifestHref, document.baseURI).href, {\n signal: local.signal,\n cache: model.value.updatesHref ? \"no-store\" : \"default\",\n });\n if (token === navigation && !local.signal.aborted && !disposed) entries.value = data.entries;\n } catch (cause) {\n if (token === navigation && !local.signal.aborted) {\n error.value = ui.value.labels.listingError;\n failure.value = \"listing\";\n }\n } finally {\n if (token === navigation) busy.value = false;\n }\n}\nasync function openFolder(\n dataHref,\n url,\n push,\n refresh = false,\n restoreState = null,\n fresh = false,\n) {\n if (push) saveView();\n const token = ++navigation;\n abort?.abort();\n const local = (abort = new AbortController());\n busy.value = true;\n error.value = \"\";\n failure.value = null;\n try {\n const next = await fetchThemePage(dataHref, url, \"crosswave\", local.signal, refresh || fresh);\n let nextEntries = next.entries;\n if (refresh && next.manifestHref && nextEntries.length !== next.total)\n nextEntries = (\n await loadListing(next.manifestHref, { signal: local.signal, cache: \"no-store\" })\n ).entries;\n if (token !== navigation || local.signal.aborted || disposed) return;\n if (!refresh) viewHistory.commit(next.dataHref, next.path, url, push);\n if (next.path !== model.value.path) {\n heightCache.set(model.value.path, heights.value);\n if (heightCache.size > 8) heightCache.delete(heightCache.keys().next().value);\n heights.value = heightCache.get(next.path) ?? new Map();\n }\n model.value = next;\n retryRequest.value = null;\n entries.value = nextEntries;\n if (!refresh) {\n const view = readView(\n url,\n \"crosswave\",\n next.path,\n viewDefaults(next),\n next.categories.map((item) => item.id),\n restoreState,\n );\n query.value = view.query;\n selected.value = view.selected;\n category.value = view.category;\n }\n applyThemeMetadata(next, url);\n await loadComplete();\n if (!refresh) {\n const view = readView(\n url,\n \"crosswave\",\n next.path,\n viewDefaults(next),\n next.categories.map((item) => item.id),\n restoreState,\n );\n await nextTick();\n if (selected.value && !rows.value.some((entry) => entry.id === selected.value))\n selected.value = null;\n scrollTop.value = view.listTop;\n if (listScroll.value) listScroll.value.scrollTop = view.listTop;\n await nextTick();\n window.scrollTo({ top: view.windowY });\n if (restoreState && selected.value)\n nodes.get(selected.value)?.querySelector(\"a\")?.focus({ preventScroll: true });\n }\n } catch (cause) {\n if (token === navigation && !local.signal.aborted) {\n error.value = ui.value.labels.folderError;\n failure.value = \"folder\";\n retryRequest.value = [dataHref, url, push, refresh, restoreState];\n viewHistory?.rollback();\n }\n } finally {\n if (token === navigation) busy.value = false;\n }\n}\nfunction navigateLink(event, href, dataHref) {\n if (\n typeof href !== \"string\" ||\n typeof dataHref !== \"string\" ||\n event?.altKey ||\n event?.ctrlKey ||\n event?.metaKey ||\n event?.shiftKey ||\n event?.button > 0 ||\n location.protocol === \"file:\"\n )\n return;\n event?.preventDefault();\n openFolder(dataHref, new URL(href, document.baseURI).href, true);\n}\nasync function openEntry(event, entry) {\n saveView();\n const href = entry.presentation?.folderDataHref;\n if (\n entry.exitsExplorer ||\n event?.altKey ||\n event?.ctrlKey ||\n event?.metaKey ||\n event?.shiftKey ||\n event?.button > 0 ||\n typeof href !== \"string\" ||\n location.protocol === \"file:\"\n )\n return;\n event?.preventDefault();\n await openFolder(href, new URL(entry.href, document.baseURI).href, true);\n}\nasync function move(index) {\n const target = Math.max(0, Math.min(rows.value.length - 1, index));\n const entry = rows.value[target];\n if (!entry) return;\n selected.value = entry.id;\n if (virtual.value) {\n scrollTop.value = Math.max(0, offsets.value[target] - 100 + (model.value.parentHref ? 76 : 0));\n if (listScroll.value) listScroll.value.scrollTop = scrollTop.value;\n }\n await nextTick();\n const node = nodes.get(entry.id);\n node?.querySelector(\"a\")?.focus({ preventScroll: true });\n node?.scrollIntoView({ block: \"nearest\" });\n}\nasync function stepCategory(delta) {\n if (ui.value.direction === \"rtl\") delta = -delta;\n const moveFocus = document.activeElement?.getAttribute(\"role\") === \"tab\";\n const items = model.value.categories,\n index = items.findIndex((item) => item.id === category.value);\n category.value = items[(index + delta + items.length) % items.length].id;\n selected.value = null;\n if (moveFocus) {\n await nextTick();\n document.getElementById(\"cw-tab-\" + category.value)?.focus({ preventScroll: true });\n }\n}\nasync function confirm() {\n if (!active.value || busy.value) return;\n await move(rows.value.findIndex((entry) => entry.id === active.value.id));\n const anchor = nodes.get(active.value.id)?.querySelector(\"a\");\n anchor?.click();\n}\nfunction parent() {\n if (model.value.parentHref) {\n if (location.protocol === \"file:\" || typeof model.value.parentDataHref !== \"string\")\n location.href = model.value.parentHref;\n else\n openFolder(\n model.value.parentDataHref,\n new URL(model.value.parentHref, document.baseURI).href,\n true,\n );\n }\n}\nfunction keyboard(event) {\n if (event.isComposing || event.altKey || event.ctrlKey || event.metaKey) return;\n if (event.target?.closest?.(\"[data-dirwell-actions]\")) return;\n const editing = /INPUT|TEXTAREA|SELECT/.test(event.target?.tagName ?? \"\");\n if (editing) {\n if (event.key === \"Escape\") query.value = \"\";\n return;\n }\n const index = rows.value.findIndex((entry) => entry.id === (selected.value ?? active.value?.id));\n if (event.key === \"/\") {\n event.preventDefault();\n search.value?.focus();\n } else if ([\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) {\n event.preventDefault();\n move(\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? rows.value.length - 1\n : index + (event.key === \"ArrowDown\" ? 1 : -1),\n );\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n stepCategory(event.key === \"ArrowRight\" ? 1 : -1);\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n confirm();\n } else if (event.key === \"Backspace\") {\n event.preventDefault();\n parent();\n }\n}\nfunction controller(value) {\n pad.value = !!value;\n if (!value) {\n pressed.clear();\n padIdentity = null;\n return;\n }\n const buttons = value.buttons ?? [],\n next = new Set(\n buttons\n .map((button, index) => (button.pressed || button.value > 0.5 ? index : -1))\n .filter((index) => index >= 0),\n ),\n time = performance.now(),\n axis = value.axes ?? [];\n const identity = `${value.index}:${value.id}`;\n if (padIdentity !== identity) {\n padIdentity = identity;\n pressed = next;\n lastPad = time;\n return;\n }\n if (\n document.hidden ||\n disposed ||\n busy.value ||\n !complete.value ||\n /INPUT|TEXTAREA|SELECT/.test(document.activeElement?.tagName ?? \"\")\n ) {\n pressed = next;\n return;\n }\n if (time - lastPad > 180) {\n const index = rows.value.findIndex(\n (entry) => entry.id === (selected.value ?? active.value?.id),\n );\n if (next.has(13) || (axis[1] ?? 0) > 0.35) {\n move(index + 1);\n lastPad = time;\n } else if (next.has(12) || (axis[1] ?? 0) < -0.35) {\n move(index - 1);\n lastPad = time;\n } else if (next.has(15) || (axis[0] ?? 0) > 0.35) {\n stepCategory(1);\n lastPad = time;\n } else if (next.has(14) || (axis[0] ?? 0) < -0.35) {\n stepCategory(-1);\n lastPad = time;\n }\n }\n if (next.has(0) && !pressed.has(0)) confirm();\n if (next.has(1) && !pressed.has(1)) parent();\n pressed = next;\n}\nconst colors = {\n azure: [0.17, 0.31, 0.52],\n violet: [0.36, 0.25, 0.49],\n amber: [0.44, 0.3, 0.1],\n rose: [0.44, 0.25, 0.33],\n jade: [0.13, 0.37, 0.32],\n graphite: [0.26, 0.3, 0.38],\n};\nconst onPop = (event) =>\n event.state?.dataHref\n ? openFolder(event.state.dataHref, location.href, false, false, event.state)\n : location.reload();\nconst suspend = () => {\n gamepad?.pause();\n controller(null);\n wave?.stop();\n};\nconst syncMotion = () => wave?.sync();\nconst visibility = () => {\n if (document.hidden) {\n gamepad?.pause();\n controller(null);\n wave?.stop();\n } else {\n gamepad?.resume();\n wave?.sync();\n }\n};\nonMounted(() => {\n ready.value = true;\n document.body.setAttribute(\"data-cw-enhanced\", \"\");\n abort = new AbortController();\n if (typeof ResizeObserver !== \"undefined\") {\n rowObserver = new ResizeObserver((observations) => {\n const next = new Map(heights.value);\n let changed = false;\n for (const observation of observations) {\n const id = observation.target.dataset.id;\n const height = observation.target.getBoundingClientRect().height;\n if (height > 0 && next.get(id) !== height) {\n next.set(id, height);\n changed = true;\n }\n }\n if (changed) heights.value = next;\n });\n for (const node of nodes.values()) rowObserver.observe(node);\n layoutObserver = new ResizeObserver(measureLayout);\n if (footerElement.value) layoutObserver.observe(footerElement.value);\n const header = document.querySelector(\"[data-dirwell-theme='crosswave'] .cw-top\");\n if (header) layoutObserver.observe(header);\n }\n measureLayout();\n window.addEventListener(\"resize\", measureLayout);\n viewHistory = createViewHistory(\"crosswave\");\n const view = readView(\n location.href,\n \"crosswave\",\n model.value.path,\n viewDefaults(model.value),\n model.value.categories.map((item) => item.id),\n history.state,\n );\n query.value = view.query;\n category.value = view.category;\n selected.value = view.selected;\n scrollTop.value = view.listTop;\n if (listScroll.value) listScroll.value.scrollTop = view.listTop;\n saveView();\n try {\n const stored = localStorage.getItem(\"dirwell-crosswave-color\");\n if (Object.hasOwn(colors, stored)) color.value = stored;\n } catch {}\n wave = createWave(\n canvas.value,\n colors,\n document.documentElement,\n () =>\n !paused.value && !document.hidden && !matchMedia(\"(prefers-reduced-motion: reduce)\").matches,\n (value) => (waveReady.value = value),\n );\n wave?.sync();\n if (model.value.gamepad && typeof navigator.getGamepads === \"function\") {\n const safeNavigator = {\n getGamepads() {\n try {\n const pads = navigator.getGamepads();\n if (gamepad) {\n const connected = Array.from(pads).filter((value) => value?.connected);\n gamepad.gamepads.value = gamepad.gamepads.value.filter((value) =>\n connected.some((current) => current.index === value.index),\n );\n for (const value of connected)\n if (!gamepad.gamepads.value.some((current) => current.index === value.index))\n gamepad.gamepads.value.push(value);\n }\n return pads;\n } catch {\n if (gamepad) gamepad.gamepads.value = [];\n controller(null);\n return [];\n }\n },\n };\n gamepad = useGamepad({ navigator: safeNavigator });\n safeNavigator.getGamepads();\n gamepad.resume();\n watchEffect(\n () =>\n controller(\n gamepad.gamepads.value.find((value) => value.connected && value.mapping === \"standard\") ??\n null,\n ),\n { flush: \"sync\" },\n );\n }\n const updateClock = () =>\n (clock.value = new Date().toLocaleTimeString(ui.value.dateOptions.locale, {\n timeZone: ui.value.dateOptions.timeZone,\n hour: \"2-digit\",\n minute: \"2-digit\",\n }));\n updateClock();\n timer = setInterval(updateClock, 1000);\n window.addEventListener(\"keydown\", keyboard);\n window.addEventListener(\"popstate\", onPop);\n document.addEventListener(\"visibilitychange\", visibility);\n window.addEventListener(\"pagehide\", suspend);\n window.addEventListener(\"pageshow\", visibility);\n motionQuery = matchMedia(\"(prefers-reduced-motion: reduce)\");\n motionQuery.addEventListener(\"change\", syncMotion);\n loadComplete();\n});\nwatch(\n () =>\n ready.value && model.value.updatesHref\n ? new URL(model.value.updatesHref, document.baseURI).href\n : null,\n (href, _old, onCleanup) => {\n if (!href || typeof EventSource === \"undefined\") return;\n const updates = new EventSource(href);\n updates.onmessage = () => (pendingUpdates.value = href);\n updates.onerror = () => {\n error.value = ui.value.labels.updatesError;\n failure.value = \"updates\";\n };\n updates.onopen = () => {\n if (failure.value === \"updates\") {\n error.value = \"\";\n failure.value = null;\n }\n };\n onCleanup(() => updates.close());\n },\n);\nwatchEffect(() => {\n if (ready.value && !busy.value && pendingUpdates.value) {\n const href = pendingUpdates.value;\n pendingUpdates.value = null;\n if (href === new URL(model.value.updatesHref, document.baseURI).href && !disposed)\n openFolder(model.value.dataHref, location.href, false, true);\n }\n});\nwatchEffect(() => {\n if (ready.value) {\n document.documentElement.dataset.cwColor = color.value;\n document.documentElement.dataset.cwMotion = String(!paused.value);\n try {\n localStorage.setItem(\"dirwell-crosswave-color\", color.value);\n } catch {}\n wave?.sync();\n }\n});\nonBeforeUnmount(() => {\n disposed = true;\n document.body.removeAttribute(\"data-cw-enhanced\");\n abort?.abort();\n rowObserver?.disconnect();\n layoutObserver?.disconnect();\n window.removeEventListener(\"resize\", measureLayout);\n gamepad?.pause();\n wave?.dispose();\n clearInterval(timer);\n window.removeEventListener(\"keydown\", keyboard);\n window.removeEventListener(\"popstate\", onPop);\n document.removeEventListener(\"visibilitychange\", visibility);\n window.removeEventListener(\"pagehide\", suspend);\n window.removeEventListener(\"pageshow\", visibility);\n motionQuery?.removeEventListener(\"change\", syncMotion);\n});\n\nreturn (_ctx, _push, _parent, _attrs) => {\n _push(`<!--[--><div class=\"cw-background\"${_ssrRenderAttr(\"data-ready\", waveReady.value ? true : undefined)}><canvas aria-hidden=\"true\"></canvas><svg class=\"cw-fallback-wave\" aria-hidden=\"true\" viewBox=\"0 0 1200 600\"><path d=\"M-100 400 Q400 150 1300 340\"></path></svg></div><header class=\"cw-top\"><div class=\"cw-brand\">`)\n _ssrRenderSlot(_ctx.$slots, \"header\", { model: model.value }, () => {\n if (ui.value.brand.logoUrl) {\n _push(`<img${\n _ssrRenderAttr(\"src\", ui.value.brand.logoUrl)\n }${\n _ssrRenderAttr(\"alt\", ui.value.brand.logoAlt ?? '')\n } width=\"40\" height=\"40\">`)\n } else {\n _push(`<!---->`)\n }\n _push(`<a${\n _ssrRenderAttr(\"href\", model.value.rootHref)\n }>${\n _ssrInterpolate(ui.value.brand.name ?? model.value.title)\n }</a>`)\n }, _push, _parent)\n _push(`</div><nav class=\"cw-location\"${\n _ssrRenderAttr(\"aria-label\", ui.value.labels.breadcrumb)\n }><a${\n _ssrRenderAttr(\"href\", model.value.rootHref)\n }>${\n _ssrInterpolate(ui.value.labels.home)\n }</a><!--[-->`)\n _ssrRenderList(model.value.breadcrumbs, (crumb) => {\n _push(`<!--[--> / <a${\n _ssrRenderAttr(\"href\", crumb.href)\n }>${\n _ssrInterpolate(crumb.name)\n }</a><!--]-->`)\n })\n _push(`<!--]--></nav>`)\n if (ready.value) {\n _push(`<div class=\"cw-clock\">${_ssrInterpolate(clock.value)}</div>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</header><main class=\"cw-stage\" data-framework=\"vue\"${\n _ssrRenderAttr(\"aria-busy\", busy.value)\n }><h1 class=\"cw-sr\">${\n _ssrInterpolate(_unref(label)(ui.value, \"filesIn\", { path: model.value.path || \"/\" }))\n }</h1><nav class=\"cw-rail\"${\n _ssrRenderAttr(\"aria-label\", ui.value.labels.categories)\n }${\n _ssrRenderDynamicAttr(\"hidden\", !ready.value)\n }><div class=\"cw-categories\" role=\"tablist\"><!--[-->`)\n _ssrRenderList(model.value.categories, (item) => {\n _push(`<button role=\"tab\"${\n _ssrRenderAttr(\"id\", 'cw-tab-' + item.id)\n } aria-controls=\"cw-panel\"${\n _ssrRenderAttr(\"aria-selected\", category.value === item.id)\n }${\n _ssrRenderAttr(\"tabindex\", category.value === item.id ? 0 : -1)\n } class=\"${\n _ssrRenderClass(['cw-category', { 'cw-active': category.value === item.id }])\n }\"${\n (_ssrIncludeBooleanAttr(!complete.value)) ? \" disabled\" : \"\"\n }><span>${\n (item.svg) ?? ''\n }</span><span>${\n _ssrInterpolate(item.label)\n }</span><small>${\n _ssrInterpolate(entries.value.filter((entry) => membership(entry).includes(item.id)).length)\n }</small></button>`)\n })\n _push(`<!--]--></div></nav><section class=\"cw-browser\" id=\"cw-panel\" role=\"tabpanel\"${\n _ssrRenderAttr(\"aria-labelledby\", 'cw-tab-' + category.value)\n }><div class=\"cw-list-head\"><div class=\"cw-directory\"><h2>${\n _ssrInterpolate(heading.value)\n }</h2><span data-cw-count>${\n _ssrInterpolate(_unref(label)(ui.value, \"items\", { count: complete.value ? rows.value.length : entries.value.length }))\n }</span></div><label class=\"cw-search\"><span>${\n _ssrInterpolate(ui.value.labels.search)\n }</span><input type=\"search\"${\n _ssrRenderAttr(\"value\", query.value)\n }${\n (_ssrIncludeBooleanAttr(!ready.value || !complete.value)) ? \" disabled\" : \"\"\n }></label></div><div class=\"cw-list-scroll\"${\n _ssrRenderAttr(\"data-virtual\", virtual.value)\n }><ul class=\"cw-files\">`)\n if (model.value.parentHref) {\n _push(`<li class=\"cw-row\"><a${_ssrRenderAttr(\"href\", model.value.parentHref)} class=\"cw-entry\">../</a></li>`)\n } else {\n _push(`<!---->`)\n }\n if (start.value) {\n _push(`<li aria-hidden=\"true\" style=\"${_ssrRenderStyle({ height: offsets.value[start.value] + 'px' })}\"></li>`)\n } else {\n _push(`<!---->`)\n }\n _push(`<!--[-->`)\n _ssrRenderList(visibleRows.value, (entry, visibleIndex) => {\n _push(`<li${\n _ssrRenderAttr(\"aria-posinset\", start.value + visibleIndex + 1)\n }${\n _ssrRenderAttr(\"aria-setsize\", rows.value.length)\n } class=\"${\n _ssrRenderClass(['cw-row', { 'cw-selected': active.value?.id === entry.id }])\n }\" data-cw-entry${\n _ssrRenderAttr(\"data-custom-columns\", Boolean(model.value.ui?.columns))\n }${\n _ssrRenderAttr(\"data-id\", entry.id)\n }>`)\n if (entry.href) {\n _push(`<a class=\"cw-entry\"${\n _ssrRenderAttr(\"href\", safeHref(entry))\n }${\n _ssrRenderAttr(\"target\", entry.exitsExplorer ? '_blank' : undefined)\n }${\n _ssrRenderAttr(\"rel\", entry.exitsExplorer ? 'noopener' : undefined)\n }>`)\n _ssrRenderSlot(_ctx.$slots, \"row\", {\n model: model.value,\n entry: entry,\n selected: selected.value === entry.id\n }, () => {\n _push(`<span class=\"cw-entry-icon\" aria-hidden=\"true\">${(\n _unref(entryIcon)(\n entry.kind === 'symlink'\n ? 'link'\n : _unref(directoryLike)(entry)\n ? 'directory'\n : 'file',\n )\n ) ?? ''}</span><span class=\"cw-entry-label\"><!--[-->`)\n _ssrRenderList(ui.value.columns, (column) => {\n _push(`<!--[-->`)\n if (column === 'name') {\n _push(`<span class=\"cw-name\">${\n _ssrInterpolate(entry.name)\n }${\n _ssrInterpolate(_unref(directoryLike)(entry) ? \"/\" : \"\")\n }</span>`)\n } else {\n _push(`<!---->`)\n }\n if (entry.link && column === 'name') {\n _push(`<span class=\"cw-target\">${_ssrInterpolate(entry.link.target)}</span>`)\n } else {\n _push(`<!---->`)\n }\n if (column === 'size') {\n _push(`<span class=\"cw-row-meta\">${\n _ssrInterpolate(entry.link?.unavailable\n ? ui.value.labels.unavailable\n : ui.value.labels[entry.kind === \"symlink\" ? \"link\" : entry.kind])\n } · ${\n _ssrInterpolate(_unref(directoryLike)(entry) ? ui.value.labels.folder : _unref(size)(entry.size))\n }</span>`)\n } else {\n _push(`<!---->`)\n }\n if (column === 'modified') {\n _push(`<span class=\"cw-row-date\">${\n _ssrInterpolate(ui.value.labels.modified)\n } ${\n _ssrInterpolate(_unref(formattedDate)(entry.modifiedAt, ui.value, ready.value))\n }</span>`)\n } else {\n _push(`<!---->`)\n }\n if (typeof column === 'object') {\n _push(`<span class=\"cw-data-value\">${\n _ssrInterpolate(column.label)\n }: ${\n _ssrInterpolate(_unref(publicDataValue)(entry.data?.[column.dataKey]))\n }</span>`)\n } else {\n _push(`<!---->`)\n }\n _push(`<!--]-->`)\n })\n _push(`<!--]--></span>`)\n }, _push, _parent)\n _push(`</a>`)\n } else {\n _push(`<span class=\"cw-entry cw-unavailable\">`)\n _ssrRenderSlot(_ctx.$slots, \"row\", {\n model: model.value,\n entry: entry,\n selected: selected.value === entry.id\n }, () => {\n _push(`${_ssrInterpolate(entry.name)}`)\n }, _push, _parent)\n _push(`</span>`)\n }\n if (ui.value.actions.length || _ctx.$slots.actions) {\n _push(`<span data-dirwell-actions class=\"cw-row-actions\">`)\n _ssrRenderSlot(_ctx.$slots, \"actions\", {\n model: model.value,\n entry: entry,\n selected: selected.value === entry.id\n }, null, _push, _parent)\n _push(`<!--[-->`)\n _ssrRenderList(ui.value.actions, (action) => {\n _push(`<!--[-->`)\n if (\n action === 'download' &&\n entry.href &&\n !_unref(directoryLike)(entry) &&\n !entry.link?.unavailable\n ) {\n _push(`<a${\n _ssrRenderAttr(\"href\", safeHref(entry))\n } download>${\n _ssrInterpolate(ui.value.labels.download)\n }</a>`)\n } else if (action !== 'download') {\n _push(`<button${\n (_ssrIncludeBooleanAttr(!ready.value || (action === 'copy-link' && !entry.href))) ? \" disabled\" : \"\"\n }${\n _ssrRenderAttr(\"aria-label\", \n (action === 'copy-link' ? ui.value.labels.copyLink : ui.value.labels.copyPath) +\n ': ' +\n entry.name\n )\n }>${\n _ssrInterpolate(action === \"copy-link\" ? ui.value.labels.copyLink : ui.value.labels.copyPath)\n }</button>`)\n } else {\n _push(`<!---->`)\n }\n _push(`<!--]-->`)\n })\n _push(`<!--]--></span>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</li>`)\n })\n _push(`<!--]-->`)\n if (end.value < rows.value.length) {\n _push(`<li aria-hidden=\"true\" style=\"${_ssrRenderStyle({ height: offsets.value[rows.value.length] - offsets.value[end.value] + 'px' })}\"></li>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</ul>`)\n if (!rows.value.length && !busy.value) {\n _push(`<p class=\"cw-empty\">${_ssrInterpolate(model.value.total === 0 ? ui.value.labels.empty : ui.value.labels.noMatches)}</p>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</div></section>`)\n if (ready.value && active.value) {\n _push(`<aside class=\"cw-detail\"><h2>${_ssrInterpolate(active.value.name)}</h2>`)\n if (ui.value.columns.includes('size')) {\n _push(`<p>${\n _ssrInterpolate(ui.value.labels[active.value.kind === \"symlink\" ? \"link\" : active.value.kind])\n } · ${\n _ssrInterpolate(_unref(directoryLike)(active.value) ? ui.value.labels.folder : _unref(size)(active.value.size))\n }</p>`)\n } else {\n _push(`<!---->`)\n }\n if (ui.value.columns.includes('modified')) {\n _push(`<p>${_ssrInterpolate(_unref(formattedDate)(active.value.modifiedAt, ui.value, ready.value))}</p>`)\n } else {\n _push(`<!---->`)\n }\n if (active.value.link) {\n _push(`<p>${_ssrInterpolate(active.value.link.target)}</p>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</aside>`)\n } else {\n _push(`<!---->`)\n }\n _push(`<p role=\"status\" aria-live=\"polite\">${_ssrInterpolate(busy.value ? ui.value.labels.loading : error.value)}</p>`)\n if (failure.value && failure.value !== 'copy') {\n _push(`<button${\n (_ssrIncludeBooleanAttr(busy.value)) ? \" disabled\" : \"\"\n }>${\n _ssrInterpolate(ui.value.labels.retry)\n }</button>`)\n } else {\n _push(`<!---->`)\n }\n if (failure.value === 'folder' && retryRequest.value) {\n _push(`<a${\n _ssrRenderAttr(\"href\", retryRequest.value[1])\n }>${\n _ssrInterpolate(ui.value.labels.openNative)\n }</a>`)\n } else {\n _push(`<!---->`)\n }\n if (model.value.page?.count > 1 && !complete.value) {\n _push(`<nav${_ssrRenderAttr(\"aria-label\", ui.value.labels.pagination)}>`)\n if (model.value.page.previousHref) {\n _push(`<a${\n _ssrRenderAttr(\"href\", model.value.page.previousHref)\n } rel=\"prev\">${\n _ssrInterpolate(ui.value.labels.previous)\n }</a>`)\n } else {\n _push(`<!---->`)\n }\n _push(` ${_ssrInterpolate(_unref(label)(ui.value, \"page\", { page: model.value.page.number, pages: model.value.page.count }))} `)\n if (model.value.page.nextHref) {\n _push(`<a${\n _ssrRenderAttr(\"href\", model.value.page.nextHref)\n } rel=\"next\">${\n _ssrInterpolate(ui.value.labels.next)\n }</a>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</nav>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</main><footer class=\"cw-bottom\"><div class=\"${_ssrRenderClass(ui.value.brand.footerText || _ctx.$slots.footer ? 'cw-custom-footer' : 'cw-key-help')}\">`)\n _ssrRenderSlot(_ctx.$slots, \"footer\", { model: model.value }, () => {\n if (ui.value.brand.footerText) {\n _push(`<!--[-->`)\n if (ui.value.brand.footerUrl) {\n _push(`<a${\n _ssrRenderAttr(\"href\", ui.value.brand.footerUrl)\n }>${\n _ssrInterpolate(ui.value.brand.footerText)\n }</a>`)\n } else {\n _push(`<span>${_ssrInterpolate(ui.value.brand.footerText)}</span>`)\n }\n _push(`<!--]-->`)\n } else {\n _push(`<!--[-->${_ssrInterpolate(ui.value.labels.crosswaveKeyboardHelp)}<!--]-->`)\n }\n }, _push, _parent)\n _push(`</div>`)\n if (pad.value) {\n _push(`<div class=\"cw-controller\">${_ssrInterpolate(ui.value.labels.controller)}</div>`)\n } else {\n _push(`<!---->`)\n }\n _push(`<label class=\"cw-appearance\">${\n _ssrInterpolate(ui.value.labels.color)\n }<select${\n (_ssrIncludeBooleanAttr(!ready.value)) ? \" disabled\" : \"\"\n }><!--[-->`)\n _ssrRenderList(Object.keys(colors), (name) => {\n _push(`<option${\n _ssrRenderAttr(\"value\", name)\n }${\n (_ssrIncludeBooleanAttr((Array.isArray(color.value))\n ? _ssrLooseContain(color.value, name)\n : _ssrLooseEqual(color.value, name))) ? \" selected\" : \"\"\n }>${\n _ssrInterpolate(ui.value.labels[name])\n }</option>`)\n })\n _push(`<!--]--></select></label><button class=\"cw-motion\"${\n (_ssrIncludeBooleanAttr(!ready.value)) ? \" disabled\" : \"\"\n }>${\n _ssrInterpolate(paused.value ? ui.value.labels.resumeMotion : ui.value.labels.pauseMotion)\n }</button></footer><!--]-->`)\n}\n}\n\n}","import {createSSRApp} from 'vue';import {renderToString} from 'vue/server-renderer';import App from './.generated/App-server.mjs';export const renderBody=model=>renderToString(createSSRApp(App,{model}));","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\";\nimport {\n entryMimeType,\n entryCategories,\n resolveCrosswaveCategories,\n defaultCrosswaveCategories,\n type CrosswaveCategory,\n} from \"./categories.ts\";\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 { defaultCrosswaveCategories } from \"./categories.ts\";\nexport type {\n CrosswaveCategory,\n CrosswaveCategoryMatch,\n CrosswaveCategoryIcon,\n} from \"./categories.ts\";\nexport interface CrosswaveThemeOptions extends ThemeCustomization {\n readonly title?: string;\n readonly categories?: readonly CrosswaveCategory[];\n readonly color?: \"azure\" | \"violet\" | \"amber\" | \"rose\" | \"jade\" | \"graphite\";\n readonly gamepad?: boolean;\n readonly backgroundMotion?: boolean;\n}\nexport function createCrosswaveTheme(\n options: CrosswaveThemeOptions = {},\n renderer?: FrameworkRenderer,\n): ExplorerTheme {\n assertThemeOptions(options, [\"title\", \"categories\", \"color\", \"gamepad\", \"backgroundMotion\"]);\n if (options.title !== undefined && (typeof options.title !== \"string\" || !options.title))\n throw new TypeError(\"title must be a non-empty string\");\n if (\n options.color !== undefined &&\n ![\"azure\", \"violet\", \"amber\", \"rose\", \"jade\", \"graphite\"].includes(options.color)\n )\n throw new TypeError(\"Unsupported Crosswave color\");\n for (const key of [\"gamepad\", \"backgroundMotion\"] as const)\n if (options[key] !== undefined && typeof options[key] !== \"boolean\")\n throw new TypeError(`${key} must be a boolean`);\n const ui = resolveCustomization(options);\n const publishedUi = pickCustomization(options);\n const categoryLabels: Readonly<Record<string, string>> = {\n all: ui.labels.allFiles,\n folder: ui.labels.categoryFolders,\n image: ui.labels.categoryPhotos,\n audio: ui.labels.categoryMusic,\n video: ui.labels.categoryVideos,\n document: ui.labels.categoryDocuments,\n other: ui.labels.categoryOther,\n };\n const categories = resolveCrosswaveCategories(\n options.categories ??\n defaultCrosswaveCategories.map((category) => ({\n ...category,\n label: categoryLabels[category.id] ?? category.label,\n })),\n );\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: `crosswave-client-${createHash(\"sha256\").update(script).digest(\"hex\").slice(0, 16)}.js`,\n })));\n const theme: ExplorerTheme = {\n name: \"crosswave\",\n searchIndex: false,\n listing: { pagination: true },\n entryData: (entry, context) => ({\n mimeType: entryMimeType(entry),\n categories: entryCategories(entry, entryMimeType(entry), categories).map((item) => item.id),\n folderDataHref: folderDataHref(entry, context, \"crosswave\"),\n }),\n async render(context) {\n const model = {\n ...createThemePage(context, theme, options.title ?? ui.brand.name ?? \"Dirwell\"),\n ...(publishedUi === undefined ? {} : { ui: publishedUi }),\n categories: categories.map(({ id, label, svg }) => ({ id, label, svg })),\n color: options.color ?? \"azure\",\n gamepad: options.gamepad ?? true,\n backgroundMotion: options.backgroundMotion ?? true,\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-cw-color=\"${escapeHtml(model.color)}\" data-cw-motion=\"${model.backgroundMotion}\"><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=\"crosswave\">${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(\"crosswave\", 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":["paths","_ssrRenderAttr","_ssrInterpolate","_unref","_ssrRenderDynamicAttr","_ssrRenderClass","_ssrIncludeBooleanAttr","_ssrRenderStyle","_ssrLooseContain","_ssrLooseEqual","App"],"sources":["../../shared-theme/src/page.ts","../src/icons.ts","../src/categories.ts","../../shared-theme/src/live-search.ts","../../shared-theme/src/customization.ts","../../shared-theme/src/navigation.ts","../../shared-theme/src/view-state.ts","../../shared-theme/src/icons.ts","../../shared-theme/src/records.ts","../.generated/wave.mjs","../.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","export type CrosswaveIcon =\n | \"all\"\n | \"folder\"\n | \"image\"\n | \"audio\"\n | \"video\"\n | \"document\"\n | \"other\"\n | \"link\"\n | \"back\"\n | \"search\"\n | \"pause\"\n | \"play\"\n | \"controller\";\n\nconst paths: Record<CrosswaveIcon, string> = {\n all: '<rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"/>',\n folder:\n '<path d=\"M3 7V5a1 1 0 0 1 1-1h5l2 3h9a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1Z\"/><path d=\"M3 9h18\"/>',\n image:\n '<rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"1.5\"/><circle cx=\"8\" cy=\"9\" r=\"1.5\"/><path d=\"m3 17 5-5 4 4 4-6 5 7\"/>',\n audio:\n '<path d=\"M9 18V5l11-2v13M9 8l11-2\"/><ellipse cx=\"6\" cy=\"18\" rx=\"3\" ry=\"2.5\"/><ellipse cx=\"17\" cy=\"16\" rx=\"3\" ry=\"2.5\"/>',\n video: '<rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"1.5\"/><path d=\"m10 8 6 4-6 4Z\"/>',\n document: '<path d=\"M5 3h9l5 5v13H5ZM14 3v5h5M8 12h8M8 16h6\"/>',\n other: '<path d=\"m12 3 9 5v9l-9 5-9-5V8ZM3 8l9 5 9-5M12 13v9\"/>',\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 back: '<path d=\"m10 5-7 7 7 7M3 12h18\"/>',\n search: '<circle cx=\"10.5\" cy=\"10.5\" r=\"6.5\"/><path d=\"m16 16 5 5\"/>',\n pause: '<path d=\"M8 5v14M16 5v14\"/>',\n play: '<path d=\"m8 4 12 8-12 8Z\"/>',\n controller:\n '<path d=\"M7 7h10c3 0 4 3 5 9 0 3-2 4-4 1l-2-2H8l-2 2c-2 3-4 2-4-1 1-6 2-9 5-9ZM6 11h4M8 9v4M16 10h.01M19 13h.01\"/>',\n};\n\n/** Original geometric icons, not copied console artwork. */\nexport function crosswaveIcon(name: CrosswaveIcon): 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[name]}</svg>`;\n}\n","import mime from \"mime\";\nimport type { ListingEntry } from \"@dirwell/core\";\nimport { crosswaveIcon, type CrosswaveIcon } from \"./icons.ts\";\n\nexport type CrosswaveCategoryIcon = CrosswaveIcon | { readonly svg: string };\nexport type CrosswaveCategoryMatch =\n | \"all\"\n | \"folders\"\n | \"other\"\n | { readonly extensions?: readonly string[]; readonly mimeTypes?: readonly string[] };\nexport interface CrosswaveCategory {\n readonly id: string;\n readonly label: string;\n readonly icon?: CrosswaveCategoryIcon;\n readonly match: CrosswaveCategoryMatch;\n}\nexport interface ResolvedCrosswaveCategory {\n readonly id: string;\n readonly label: string;\n readonly svg: string;\n readonly match: CrosswaveCategoryMatch;\n}\nconst documents = [\n \"text/*\",\n \"application/pdf\",\n \"application/json\",\n \"application/*+json\",\n \"application/xml\",\n \"application/*+xml\",\n \"application/msword\",\n \"application/rtf\",\n \"application/sql\",\n \"application/epub+zip\",\n \"application/vnd.ms-excel\",\n \"application/vnd.ms-powerpoint\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n] as const;\nconst definitions: readonly CrosswaveCategory[] = [\n { id: \"all\", label: \"All files\", icon: \"all\", match: \"all\" },\n { id: \"folder\", label: \"Folders\", icon: \"folder\", match: \"folders\" },\n { id: \"image\", label: \"Photos\", icon: \"image\", match: { mimeTypes: [\"image/*\"] } },\n {\n id: \"audio\",\n label: \"Music\",\n icon: \"audio\",\n match: { mimeTypes: [\"audio/*\", \"application/vnd.apple.mpegurl\"] },\n },\n { id: \"video\", label: \"Videos\", icon: \"video\", match: { mimeTypes: [\"video/*\"] } },\n { id: \"document\", label: \"Documents\", icon: \"document\", match: { mimeTypes: documents } },\n { id: \"other\", label: \"Other\", icon: \"other\", match: \"other\" },\n];\n/** Default rail definitions. Supply a mapped/filtered copy to change labels, order, or visibility. */\nexport const defaultCrosswaveCategories: readonly CrosswaveCategory[] = Object.freeze(\n definitions.map((category) =>\n Object.freeze({\n ...category,\n match:\n typeof category.match === \"string\"\n ? category.match\n : Object.freeze({\n ...(category.match.extensions\n ? { extensions: Object.freeze([...category.match.extensions]) }\n : {}),\n ...(category.match.mimeTypes\n ? { mimeTypes: Object.freeze([...category.match.mimeTypes]) }\n : {}),\n }),\n }),\n ),\n);\nconst record = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\nfunction strings(\n value: unknown,\n normalize: (value: string) => string,\n): readonly string[] | undefined {\n if (value === undefined) return undefined;\n if (!Array.isArray(value))\n throw new TypeError(\"Crosswave category rules must be arrays of strings\");\n return Object.freeze([\n ...new Set(\n Array.from(value, (item: unknown) => {\n if (typeof item !== \"string\")\n throw new TypeError(\"Crosswave category rules must be arrays of strings\");\n return normalize(item);\n }),\n ),\n ]);\n}\nfunction extension(value: string): string {\n const normalized = value.toLowerCase().replace(/^\\./, \"\");\n if (!/^[a-z0-9+_-]+(?:\\.[a-z0-9+_-]+)*$/.test(normalized))\n throw new TypeError(`Invalid Crosswave extension: ${value}`);\n return normalized;\n}\nfunction mediaType(value: string): string {\n const normalized = value.toLowerCase();\n if (!/^[a-z0-9!#$&^_.+-]+\\/(?:[a-z0-9!#$&^_.+-]+|\\*|\\*\\+[a-z0-9!#$&^_.-]+)$/.test(normalized))\n throw new TypeError(`Invalid Crosswave MIME pattern: ${value}`);\n return normalized;\n}\nfunction match(value: unknown): CrosswaveCategoryMatch {\n if (value === \"all\" || value === \"folders\" || value === \"other\") return value;\n if (\n !record(value) ||\n Object.keys(value).some((key) => ![\"extensions\", \"mimeTypes\"].includes(key))\n )\n throw new TypeError(\"Crosswave match must be all, folders, other, or extension/MIME rules\");\n const extensions = strings(value.extensions, extension);\n const mimeTypes = strings(value.mimeTypes, mediaType);\n if (!extensions?.length && !mimeTypes?.length)\n throw new TypeError(\"Crosswave category needs at least one matching rule\");\n return Object.freeze({\n ...(extensions ? { extensions } : {}),\n ...(mimeTypes ? { mimeTypes } : {}),\n });\n}\nfunction icon(value: unknown, rule: CrosswaveCategoryMatch): string {\n if (value === undefined)\n return crosswaveIcon(rule === \"all\" ? \"all\" : rule === \"folders\" ? \"folder\" : \"other\");\n if (typeof value === \"string\" && isCrosswaveIcon(value)) return crosswaveIcon(value);\n if (\n record(value) &&\n typeof value.svg === \"string\" &&\n /^\\s*<svg\\b/i.test(value.svg) &&\n /<\\/svg>\\s*$/i.test(value.svg)\n )\n return value.svg.replace(/<svg\\b/i, '<svg aria-hidden=\"true\"');\n throw new TypeError(\"Crosswave icon must be a built-in icon name or trusted SVG markup\");\n}\nfunction isCrosswaveIcon(value: string): value is CrosswaveIcon {\n return [\n \"all\",\n \"folder\",\n \"image\",\n \"audio\",\n \"video\",\n \"document\",\n \"other\",\n \"link\",\n \"back\",\n \"search\",\n \"pause\",\n \"play\",\n \"controller\",\n ].includes(value);\n}\nexport function resolveCrosswaveCategories(value: unknown): readonly ResolvedCrosswaveCategory[] {\n const input = value === undefined ? defaultCrosswaveCategories : value;\n if (!Array.isArray(input) || !input.length)\n throw new TypeError(\"Crosswave categories must be a nonempty array\");\n const ids = new Set<string>();\n return Object.freeze(\n Array.from(input).map((category: unknown) => {\n if (\n !record(category) ||\n typeof category.id !== \"string\" ||\n !/^[a-z][a-z0-9_-]{0,63}$/.test(category.id)\n )\n throw new TypeError(\"Crosswave category id must be a lowercase identifier\");\n if (ids.has(category.id))\n throw new TypeError(`Duplicate Crosswave category id: ${category.id}`);\n ids.add(category.id);\n if (typeof category.label !== \"string\" || !category.label.trim())\n throw new TypeError(\"Crosswave category label must be nonempty\");\n const rule = match(category.match);\n return Object.freeze({\n id: category.id,\n label: category.label,\n svg: icon(category.icon, rule),\n match: rule,\n });\n }),\n );\n}\nexport function matchesMimeType(pattern: string, type: string): boolean {\n if (pattern === type) return true;\n const [group, subtype] = pattern.split(\"/\");\n if (!subtype || !type.startsWith(`${group}/`)) return false;\n return subtype === \"*\" || (subtype.startsWith(\"*+\") && type.endsWith(subtype.slice(1)));\n}\nexport function entryMimeType(entry: ListingEntry): string | null {\n if (entry.kind === \"directory\" || entry.link?.targetKind === \"directory\") return null;\n return (\n mime.getType(`./${entry.name}`) ??\n (entry.link?.targetKind === \"file\" && !entry.link.unavailable && entry.href\n ? mime.getType(new URL(entry.href, \"https://dirwell.invalid/\").pathname)\n : null)\n );\n}\nexport function entryCategory(entry: ListingEntry, type: string | null): CrosswaveIcon {\n if (entry.kind === \"directory\" || entry.link?.targetKind === \"directory\") return \"folder\";\n if (type?.startsWith(\"image/\")) return \"image\";\n if (type?.startsWith(\"audio/\") || type === \"application/vnd.apple.mpegurl\") return \"audio\";\n if (type?.startsWith(\"video/\")) return \"video\";\n if (type && documents.some((pattern) => matchesMimeType(pattern, type))) return \"document\";\n return \"other\";\n}\nexport function entryCategories(\n entry: ListingEntry,\n type: string | null,\n categories: readonly ResolvedCrosswaveCategory[],\n): readonly ResolvedCrosswaveCategory[] {\n const folder = entry.kind === \"directory\" || entry.link?.targetKind === \"directory\";\n const filename = entry.name.toLowerCase();\n const specific = categories.filter(\n (category) =>\n typeof category.match !== \"string\" &&\n !folder &&\n (category.match.extensions?.some((ext) => filename.endsWith(`.${ext}`)) ||\n (type && category.match.mimeTypes?.some((pattern) => matchesMimeType(pattern, type)))),\n );\n return categories.filter(\n (category) =>\n category.match === \"all\" ||\n (folder && category.match === \"folders\") ||\n (!folder && category.match === \"other\" && !specific.length) ||\n specific.includes(category),\n );\n}\n","export async function queryLiveArchive(href: string, query: string, signal: AbortSignal) {\n const url = new URL(href, document.baseURI);\n if (url.origin !== location.origin) throw new Error(\"Unsafe search endpoint\");\n url.searchParams.set(\"q\", query);\n const response = await fetch(url, { signal, cache: \"no-store\" });\n if (!response.ok) throw new Error(\"Archive search unavailable\");\n const data: unknown = await response.json();\n if (\n typeof data !== \"object\" ||\n data === null ||\n !(\"version\" in data) ||\n data.version !== 1 ||\n !(\"results\" in data) ||\n !Array.isArray(data.results) ||\n data.results.length > 10000 ||\n !(\"truncated\" in data) ||\n typeof data.truncated !== \"boolean\"\n )\n throw new Error(\"Invalid archive results\");\n const records = data.results.map((entry: unknown) => {\n if (\n typeof entry !== \"object\" ||\n entry === null ||\n !(\"name\" in entry) ||\n typeof entry.name !== \"string\" ||\n !(\"path\" in entry) ||\n typeof entry.path !== \"string\" ||\n !(\"kind\" in entry) ||\n ![\"file\", \"directory\"].includes(String(entry.kind)) ||\n !(\"href\" in entry) ||\n (entry.href !== null && typeof entry.href !== \"string\")\n )\n throw new Error(\"Invalid archive record\");\n const target = entry.href === null ? null : new URL(entry.href, url);\n if (target && ![\"http:\", \"https:\"].includes(target.protocol))\n throw new Error(\"Unsafe archive link\");\n return {\n name: entry.name,\n path: entry.path,\n href: target?.href ?? null,\n exitsExplorer: entry.kind !== \"directory\",\n };\n });\n return { records, truncated: data.truncated };\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 { 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","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","export function createWave(canvas, colors, root, moving, onReady) {\n let gl;\n try {\n gl = canvas.getContext(\"webgl\", {\n alpha: false,\n antialias: false,\n powerPreference: \"low-power\",\n });\n } catch {\n return null;\n }\n if (!gl) return null;\n const vertex = \"attribute vec2 p;void main(){gl_Position=vec4(p,0.,1.);}\";\n const fragment = `precision highp float;uniform vec2 resolution;uniform float time;uniform vec3 tint;\n void main(){vec2 uv=gl_FragCoord.xy/resolution;float x=uv.x;float y=uv.y;float t=time;\n vec3 ground=mix(tint*.22,tint,clamp(y*.85+x*.1,0.,1.));ground+=vec3(.035)*pow(max(0.,1.-distance(uv,vec2(.2,.9))),3.);\n float light=0.;for(int i=0;i<3;i++){float k=float(i);float center=.40+.07*sin(x*4.2+t*.17+k*.8)+.035*cos(x*7.1-t*.11+k*1.4)+k*.024;\n float breadth=.012+.037*(.5+.5*sin(x*2.7+t*.09+k));float d=y-center;float sheet=exp(-pow(d/breadth,2.));float edge=exp(-abs(d-breadth*.65)*430.);\n float fold=exp(-abs(d+breadth*.35)*170.);float taper=pow(sin(clamp(x,0.,1.)*3.14159),.6);light+=(sheet*.07+edge*.23+fold*.09)*taper;}\n ground+=mix(vec3(.6,.8,1.),vec3(1.),.75)*min(light,.12);gl_FragColor=vec4(ground,1.);}`;\n const shader = (type, source) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, source);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, vertex),\n fs = shader(gl.FRAGMENT_SHADER, fragment);\n if (!vs || !fs) {\n if (vs) gl.deleteShader(vs);\n if (fs) gl.deleteShader(fs);\n return null;\n }\n const program = gl.createProgram();\n if (!program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n const buffer = gl.createBuffer();\n if (!buffer) {\n gl.deleteProgram(program);\n return null;\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]), gl.STATIC_DRAW);\n gl.useProgram(program);\n const p = gl.getAttribLocation(program, \"p\");\n gl.enableVertexAttribArray(p);\n gl.vertexAttribPointer(p, 2, gl.FLOAT, false, 0, 0);\n const r = gl.getUniformLocation(program, \"resolution\"),\n t = gl.getUniformLocation(program, \"time\"),\n c = gl.getUniformLocation(program, \"tint\");\n let frame = 0,\n last = 0,\n lost = false,\n frozenTime = 17;\n const draw = (now) => {\n if (lost) return;\n const ratio = Math.min(devicePixelRatio || 1, 1.5, 1600 / innerWidth, 1000 / innerHeight),\n width = Math.round(innerWidth * ratio),\n height = Math.round(innerHeight * ratio);\n if (canvas.width !== width || canvas.height !== height) {\n canvas.width = width;\n canvas.height = height;\n gl.viewport(0, 0, width, height);\n }\n if (moving()) frozenTime = (Date.now() % 86400000) / 1000;\n gl.uniform2f(r, width, height);\n gl.uniform1f(t, frozenTime);\n gl.uniform3fv(c, colors[root.dataset.cwColor] ?? colors.azure);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n onReady(true);\n last = now;\n };\n const tick = (now) => {\n frame = 0;\n if (!moving() || lost) return;\n if (now - last >= 33) draw(now);\n frame = requestAnimationFrame(tick);\n };\n const stop = () => {\n cancelAnimationFrame(frame);\n frame = 0;\n };\n const sync = () => {\n stop();\n if (lost) return;\n draw(0);\n if (moving()) frame = requestAnimationFrame(tick);\n };\n const contextLost = (event) => {\n event.preventDefault();\n lost = true;\n stop();\n onReady(false);\n };\n canvas.addEventListener(\"webglcontextlost\", contextLost);\n const contextRestored = () => {\n onReady(false);\n lost = true;\n };\n canvas.addEventListener(\"webglcontextrestored\", contextRestored);\n const resized = () => draw(0);\n addEventListener(\"resize\", resized);\n return {\n dispose() {\n stop();\n removeEventListener(\"resize\", resized);\n canvas.removeEventListener(\"webglcontextlost\", contextLost);\n canvas.removeEventListener(\"webglcontextrestored\", contextRestored);\n gl.deleteBuffer(buffer);\n gl.deleteProgram(program);\n },\n draw,\n sync,\n stop,\n get available() {\n return !lost;\n },\n };\n}\n","import { unref as _unref } from \"vue\"\nimport { ssrRenderAttr as _ssrRenderAttr, ssrRenderSlot as _ssrRenderSlot, ssrRenderClass as _ssrRenderClass, ssrIncludeBooleanAttr as _ssrIncludeBooleanAttr, ssrRenderDynamicAttr as _ssrRenderDynamicAttr, ssrRenderStyle as _ssrRenderStyle, ssrLooseContain as _ssrLooseContain, ssrLooseEqual as _ssrLooseEqual, ssrInterpolate as _ssrInterpolate, ssrRenderList as _ssrRenderList } from \"vue/server-renderer\"\n\nimport {\n ref,\n shallowRef,\n computed,\n onMounted,\n onBeforeUnmount,\n watchEffect,\n watch,\n nextTick,\n} from \"vue\";\nimport { queryLiveArchive } from \"../../shared-theme/src/live-search.ts\";\nimport { useGamepad } from \"@vueuse/core\";\nimport { loadListing } from \"@dirwell/core/client\";\nimport {\n fetchThemePage,\n applyThemeMetadata,\n restoreThemePage,\n} from \"../../shared-theme/src/navigation.ts\";\nimport { readView, createViewHistory } from \"../../shared-theme/src/view-state.ts\";\nimport { entryIcon } from \"../../shared-theme/src/icons.ts\";\nimport { directoryLike, size } from \"../../shared-theme/src/records.ts\";\nimport {\n resolveCustomization,\n label,\n formattedDate,\n copyEntryAction,\n publicDataValue,\n} from \"../../shared-theme/src/customization.ts\";\nimport { createWave } from \"./wave.mjs\";\n\nexport default {\n __name: 'Crosswave',\n __ssrInlineRender: true,\n props: { model: { type: Object, required: true } },\n setup(__props) {\n\nconst props = __props,\n model = shallowRef(restoreThemePage(props.model, Boolean(import.meta.hot))),\n entries = shallowRef(model.value.entries),\n ui = computed(() => resolveCustomization(model.value.ui));\nconst query = ref(\"\"),\n category = ref(model.value.categories[0]?.id ?? null),\n selected = ref(null),\n ready = ref(false),\n busy = ref(false),\n error = ref(\"\"),\n failure = ref(null),\n color = ref(props.model.color),\n paused = ref(!props.model.backgroundMotion),\n clock = ref(\"\"),\n pad = ref(false),\n waveReady = ref(false),\n pendingUpdates = ref(null),\n canvas = ref(),\n search = ref(),\n listScroll = ref(),\n footerElement = ref(),\n scrollTop = ref(0),\n viewportHeight = ref(400),\n retryRequest = shallowRef(null),\n heights = shallowRef(new Map());\nconst archiveOpen = ref(false),\n archiveQuery = ref(\"\"),\n archiveRows = shallowRef([]),\n archiveStatus = ref(\"\"),\n archiveFailed = ref(false),\n archiveTrigger = ref(),\n archiveDialog = ref(),\n archiveInput = ref();\nlet archiveAbort,\n archiveRequest = 0,\n archivePending = false,\n archiveDebouncing = false;\nasync function searchArchive() {\n const token = ++archiveRequest;\n archiveAbort?.abort();\n const local = (archiveAbort = new AbortController());\n archiveFailed.value = false;\n if (!archiveQuery.value.trim()) {\n archiveRows.value = [];\n archiveStatus.value = ui.value.labels.beginArchive;\n return;\n }\n archiveStatus.value = ui.value.labels.searchingArchive;\n archivePending = true;\n try {\n const result = await queryLiveArchive(\n model.value.searchQueryHref,\n archiveQuery.value.trim(),\n local.signal,\n );\n if (local.signal.aborted || token !== archiveRequest) return;\n archiveRows.value = result.records;\n archiveStatus.value = result.truncated\n ? label(ui.value, \"truncatedResults\", {\n shown: result.records.length,\n count: result.records.length + \"+\",\n })\n : label(ui.value, \"archiveResults\", { count: result.records.length });\n } catch {\n if (local.signal.aborted || token !== archiveRequest) return;\n archiveRows.value = [];\n archiveStatus.value = ui.value.labels.archiveError;\n archiveFailed.value = true;\n } finally {\n if (token === archiveRequest) archivePending = false;\n }\n}\nwatch([archiveOpen, archiveQuery], (_, __, cleanup) => {\n archiveAbort?.abort();\n archiveRequest++;\n archivePending = false;\n if (!archiveOpen.value) return;\n archiveDebouncing = true;\n const debounce = setTimeout(() => {\n archiveDebouncing = false;\n searchArchive();\n }, 300);\n cleanup(() => {\n clearTimeout(debounce);\n archiveDebouncing = false;\n });\n});\nwatch(archiveOpen, async (open, _, cleanup) => {\n if (!open) {\n await nextTick();\n archiveTrigger.value?.focus();\n return;\n }\n await nextTick();\n if (!archiveOpen.value) return;\n archiveDialog.value?.showModal();\n archiveInput.value?.focus();\n const timer = setInterval(() => {\n if (\n document.visibilityState === \"visible\" &&\n archiveQuery.value.trim() &&\n !archivePending &&\n !archiveDebouncing\n )\n searchArchive();\n }, model.value.searchRefreshIntervalMs ?? 2000);\n cleanup(() => {\n clearInterval(timer);\n archiveAbort?.abort();\n archiveRequest++;\n });\n});\nconst complete = computed(() => entries.value.length === model.value.total),\n membership = (entry) =>\n Array.isArray(entry.presentation?.categories) ? entry.presentation.categories : [];\nconst rows = computed(() =>\n entries.value.filter(\n (entry) =>\n membership(entry).includes(category.value) &&\n `${entry.name} ${entry.link?.target ?? \"\"}`\n .toLocaleLowerCase()\n .includes(query.value.trim().toLocaleLowerCase()),\n ),\n ),\n active = computed(() => rows.value.find((entry) => entry.id === selected.value) ?? rows.value[0]),\n heading = computed(\n () =>\n model.value.categories.find((item) => item.id === category.value)?.label ??\n ui.value.labels.allFiles,\n );\nconst nodes = new Map();\nconst virtual = computed(() => ready.value && rows.value.length > 500);\nconst offsets = computed(() => {\n const result = [0];\n for (const entry of rows.value) result.push(result.at(-1) + (heights.value.get(entry.id) ?? 76));\n return result;\n});\nconst start = computed(() => {\n if (!virtual.value) return 0;\n const position = Math.max(0, scrollTop.value - (model.value.parentHref ? 76 : 0));\n let low = 0,\n high = rows.value.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if (offsets.value[middle + 1] <= position) low = middle + 1;\n else high = middle;\n }\n return Math.max(0, low - 5);\n});\nconst end = computed(() => {\n if (!virtual.value) return rows.value.length;\n let low = 0,\n high = rows.value.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if (offsets.value[middle + 1] <= scrollTop.value + viewportHeight.value) low = middle + 1;\n else high = middle;\n }\n return Math.min(rows.value.length, Math.max(start.value + 35, low + 5));\n});\nconst visibleRows = computed(() => rows.value.slice(start.value, end.value));\nconst heightCache = new Map();\nlet rowObserver, layoutObserver, viewHistory, measuredWidth;\nfunction measureLayout() {\n if (!listScroll.value) return;\n const width = listScroll.value.clientWidth;\n if (measuredWidth !== undefined && width !== measuredWidth) {\n heightCache.clear();\n heights.value = new Map(\n [...nodes].map(([id, node]) => [id, node.getBoundingClientRect().height]),\n );\n }\n measuredWidth = width;\n const footerHeight = footerElement.value?.getBoundingClientRect().height ?? 82;\n document.documentElement.style.setProperty(\"--cw-footer-height\", footerHeight + \"px\");\n const available = Math.max(\n 160,\n innerHeight - listScroll.value.getBoundingClientRect().top - footerHeight - 24,\n );\n viewportHeight.value = available;\n listScroll.value.style.setProperty(\"--cw-list-height\", available + \"px\");\n}\nwatch([virtual, () => model.value.path], () => nextTick(measureLayout));\nconst viewDefaults = (page) => ({ query: \"\", category: page.categories[0]?.id ?? null });\nfunction saveView() {\n if (!viewHistory) return;\n viewHistory.save(\n new URL(model.value.dataHref, document.baseURI).href,\n model.value.path,\n {\n query: query.value,\n category: category.value,\n selected: selected.value,\n windowY: window.scrollY,\n listTop: listScroll.value?.scrollTop ?? 0,\n },\n viewDefaults(model.value),\n );\n}\nfunction retry() {\n if (failure.value === \"folder\" && retryRequest.value) openFolder(...retryRequest.value, true);\n else openFolder(model.value.dataHref, location.href, false, true);\n}\nwatchEffect((onCleanup) => {\n if (!ready.value || busy.value) return;\n const view = {\n query: query.value,\n category: category.value,\n selected: selected.value,\n listTop: scrollTop.value,\n };\n const dataHref = model.value.dataHref,\n path = model.value.path,\n defaults = viewDefaults(model.value);\n const frame = requestAnimationFrame(() =>\n viewHistory?.save(\n new URL(dataHref, document.baseURI).href,\n path,\n { ...view, windowY: window.scrollY },\n defaults,\n ),\n );\n onCleanup(() => cancelAnimationFrame(frame));\n});\nfunction setNode(id, node) {\n const old = nodes.get(id);\n if (old && old !== node) rowObserver?.unobserve(old);\n if (node) {\n nodes.set(id, node);\n rowObserver?.observe(node);\n } else nodes.delete(id);\n}\nwatch([query, category], () => {\n scrollTop.value = 0;\n if (listScroll.value) listScroll.value.scrollTop = 0;\n});\nlet wave,\n gamepad,\n abort,\n navigation = 0,\n timer,\n lastPad = 0,\n pressed = new Set(),\n disposed = false,\n padIdentity = null,\n motionQuery;\nfunction safeHref(entry) {\n return typeof location !== \"undefined\" &&\n location.protocol === \"file:\" &&\n directoryLike(entry) &&\n !entry.exitsExplorer &&\n entry.href?.endsWith(\"/\")\n ? entry.href + \"index.html\"\n : entry.href;\n}\nasync function loadComplete() {\n if (complete.value || !model.value.manifestHref || location.protocol === \"file:\") return;\n const local = abort,\n token = navigation;\n busy.value = true;\n try {\n const data = await loadListing(new URL(model.value.manifestHref, document.baseURI).href, {\n signal: local.signal,\n cache: model.value.updatesHref ? \"no-store\" : \"default\",\n });\n if (token === navigation && !local.signal.aborted && !disposed) entries.value = data.entries;\n } catch (cause) {\n if (token === navigation && !local.signal.aborted) {\n error.value = ui.value.labels.listingError;\n failure.value = \"listing\";\n }\n } finally {\n if (token === navigation) busy.value = false;\n }\n}\nasync function openFolder(\n dataHref,\n url,\n push,\n refresh = false,\n restoreState = null,\n fresh = false,\n) {\n if (push) saveView();\n const token = ++navigation;\n abort?.abort();\n const local = (abort = new AbortController());\n busy.value = true;\n error.value = \"\";\n failure.value = null;\n try {\n const next = await fetchThemePage(dataHref, url, \"crosswave\", local.signal, refresh || fresh);\n let nextEntries = next.entries;\n if (refresh && next.manifestHref && nextEntries.length !== next.total)\n nextEntries = (\n await loadListing(next.manifestHref, { signal: local.signal, cache: \"no-store\" })\n ).entries;\n if (token !== navigation || local.signal.aborted || disposed) return;\n if (!refresh) viewHistory.commit(next.dataHref, next.path, url, push);\n if (next.path !== model.value.path) {\n heightCache.set(model.value.path, heights.value);\n if (heightCache.size > 8) heightCache.delete(heightCache.keys().next().value);\n heights.value = heightCache.get(next.path) ?? new Map();\n }\n model.value = next;\n retryRequest.value = null;\n entries.value = nextEntries;\n if (!refresh) {\n const view = readView(\n url,\n \"crosswave\",\n next.path,\n viewDefaults(next),\n next.categories.map((item) => item.id),\n restoreState,\n );\n query.value = view.query;\n selected.value = view.selected;\n category.value = view.category;\n }\n applyThemeMetadata(next, url);\n await loadComplete();\n if (!refresh) {\n const view = readView(\n url,\n \"crosswave\",\n next.path,\n viewDefaults(next),\n next.categories.map((item) => item.id),\n restoreState,\n );\n await nextTick();\n if (selected.value && !rows.value.some((entry) => entry.id === selected.value))\n selected.value = null;\n scrollTop.value = view.listTop;\n if (listScroll.value) listScroll.value.scrollTop = view.listTop;\n await nextTick();\n window.scrollTo({ top: view.windowY });\n if (restoreState && selected.value)\n nodes.get(selected.value)?.querySelector(\"a\")?.focus({ preventScroll: true });\n }\n } catch (cause) {\n if (token === navigation && !local.signal.aborted) {\n error.value = ui.value.labels.folderError;\n failure.value = \"folder\";\n retryRequest.value = [dataHref, url, push, refresh, restoreState];\n viewHistory?.rollback();\n }\n } finally {\n if (token === navigation) busy.value = false;\n }\n}\nfunction navigateLink(event, href, dataHref) {\n if (\n typeof href !== \"string\" ||\n typeof dataHref !== \"string\" ||\n event?.altKey ||\n event?.ctrlKey ||\n event?.metaKey ||\n event?.shiftKey ||\n event?.button > 0 ||\n location.protocol === \"file:\"\n )\n return;\n event?.preventDefault();\n openFolder(dataHref, new URL(href, document.baseURI).href, true);\n}\nasync function openEntry(event, entry) {\n saveView();\n const href = entry.presentation?.folderDataHref;\n if (\n entry.exitsExplorer ||\n event?.altKey ||\n event?.ctrlKey ||\n event?.metaKey ||\n event?.shiftKey ||\n event?.button > 0 ||\n typeof href !== \"string\" ||\n location.protocol === \"file:\"\n )\n return;\n event?.preventDefault();\n await openFolder(href, new URL(entry.href, document.baseURI).href, true);\n}\nasync function move(index) {\n const target = Math.max(0, Math.min(rows.value.length - 1, index));\n const entry = rows.value[target];\n if (!entry) return;\n selected.value = entry.id;\n if (virtual.value) {\n scrollTop.value = Math.max(0, offsets.value[target] - 100 + (model.value.parentHref ? 76 : 0));\n if (listScroll.value) listScroll.value.scrollTop = scrollTop.value;\n }\n await nextTick();\n const node = nodes.get(entry.id);\n node?.querySelector(\"a\")?.focus({ preventScroll: true });\n node?.scrollIntoView({ block: \"nearest\" });\n}\nasync function stepCategory(delta) {\n if (ui.value.direction === \"rtl\") delta = -delta;\n const moveFocus = document.activeElement?.getAttribute(\"role\") === \"tab\";\n const items = model.value.categories,\n index = items.findIndex((item) => item.id === category.value);\n category.value = items[(index + delta + items.length) % items.length].id;\n selected.value = null;\n if (moveFocus) {\n await nextTick();\n document.getElementById(\"cw-tab-\" + category.value)?.focus({ preventScroll: true });\n }\n}\nasync function confirm() {\n if (!active.value || busy.value) return;\n await move(rows.value.findIndex((entry) => entry.id === active.value.id));\n const anchor = nodes.get(active.value.id)?.querySelector(\"a\");\n anchor?.click();\n}\nfunction parent() {\n if (model.value.parentHref) {\n if (location.protocol === \"file:\" || typeof model.value.parentDataHref !== \"string\")\n location.href = model.value.parentHref;\n else\n openFolder(\n model.value.parentDataHref,\n new URL(model.value.parentHref, document.baseURI).href,\n true,\n );\n }\n}\nfunction keyboard(event) {\n if (archiveOpen.value) return;\n if (event.isComposing || event.altKey || event.ctrlKey || event.metaKey) return;\n if (event.target?.closest?.(\"[data-dirwell-actions]\")) return;\n const editing = /INPUT|TEXTAREA|SELECT/.test(event.target?.tagName ?? \"\");\n if (editing) {\n if (event.key === \"Escape\") query.value = \"\";\n return;\n }\n const index = rows.value.findIndex((entry) => entry.id === (selected.value ?? active.value?.id));\n if (event.key === \"/\") {\n event.preventDefault();\n search.value?.focus();\n } else if ([\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) {\n event.preventDefault();\n move(\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? rows.value.length - 1\n : index + (event.key === \"ArrowDown\" ? 1 : -1),\n );\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n stepCategory(event.key === \"ArrowRight\" ? 1 : -1);\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n confirm();\n } else if (event.key === \"Backspace\") {\n event.preventDefault();\n parent();\n }\n}\nfunction controller(value) {\n if (archiveOpen.value) return;\n pad.value = !!value;\n if (!value) {\n pressed.clear();\n padIdentity = null;\n return;\n }\n const buttons = value.buttons ?? [],\n next = new Set(\n buttons\n .map((button, index) => (button.pressed || button.value > 0.5 ? index : -1))\n .filter((index) => index >= 0),\n ),\n time = performance.now(),\n axis = value.axes ?? [];\n const identity = `${value.index}:${value.id}`;\n if (padIdentity !== identity) {\n padIdentity = identity;\n pressed = next;\n lastPad = time;\n return;\n }\n if (\n document.hidden ||\n disposed ||\n busy.value ||\n !complete.value ||\n /INPUT|TEXTAREA|SELECT/.test(document.activeElement?.tagName ?? \"\")\n ) {\n pressed = next;\n return;\n }\n if (time - lastPad > 180) {\n const index = rows.value.findIndex(\n (entry) => entry.id === (selected.value ?? active.value?.id),\n );\n if (next.has(13) || (axis[1] ?? 0) > 0.35) {\n move(index + 1);\n lastPad = time;\n } else if (next.has(12) || (axis[1] ?? 0) < -0.35) {\n move(index - 1);\n lastPad = time;\n } else if (next.has(15) || (axis[0] ?? 0) > 0.35) {\n stepCategory(1);\n lastPad = time;\n } else if (next.has(14) || (axis[0] ?? 0) < -0.35) {\n stepCategory(-1);\n lastPad = time;\n }\n }\n if (next.has(0) && !pressed.has(0)) confirm();\n if (next.has(1) && !pressed.has(1)) parent();\n pressed = next;\n}\nconst colors = {\n azure: [0.17, 0.31, 0.52],\n violet: [0.36, 0.25, 0.49],\n amber: [0.44, 0.3, 0.1],\n rose: [0.44, 0.25, 0.33],\n jade: [0.13, 0.37, 0.32],\n graphite: [0.26, 0.3, 0.38],\n};\nconst onPop = (event) =>\n event.state?.dataHref\n ? openFolder(event.state.dataHref, location.href, false, false, event.state)\n : location.reload();\nconst suspend = () => {\n gamepad?.pause();\n controller(null);\n wave?.stop();\n};\nconst syncMotion = () => wave?.sync();\nconst visibility = () => {\n if (document.hidden) {\n gamepad?.pause();\n controller(null);\n wave?.stop();\n } else {\n gamepad?.resume();\n wave?.sync();\n }\n};\nonMounted(() => {\n ready.value = true;\n document.body.setAttribute(\"data-cw-enhanced\", \"\");\n abort = new AbortController();\n if (typeof ResizeObserver !== \"undefined\") {\n rowObserver = new ResizeObserver((observations) => {\n const next = new Map(heights.value);\n let changed = false;\n for (const observation of observations) {\n const id = observation.target.dataset.id;\n const height = observation.target.getBoundingClientRect().height;\n if (height > 0 && next.get(id) !== height) {\n next.set(id, height);\n changed = true;\n }\n }\n if (changed) heights.value = next;\n });\n for (const node of nodes.values()) rowObserver.observe(node);\n layoutObserver = new ResizeObserver(measureLayout);\n if (footerElement.value) layoutObserver.observe(footerElement.value);\n const header = document.querySelector(\"[data-dirwell-theme='crosswave'] .cw-top\");\n if (header) layoutObserver.observe(header);\n }\n measureLayout();\n window.addEventListener(\"resize\", measureLayout);\n viewHistory = createViewHistory(\"crosswave\");\n const view = readView(\n location.href,\n \"crosswave\",\n model.value.path,\n viewDefaults(model.value),\n model.value.categories.map((item) => item.id),\n history.state,\n );\n query.value = view.query;\n category.value = view.category;\n selected.value = view.selected;\n scrollTop.value = view.listTop;\n if (listScroll.value) listScroll.value.scrollTop = view.listTop;\n saveView();\n try {\n const stored = localStorage.getItem(\"dirwell-crosswave-color\");\n if (Object.hasOwn(colors, stored)) color.value = stored;\n } catch {}\n wave = createWave(\n canvas.value,\n colors,\n document.documentElement,\n () =>\n !paused.value && !document.hidden && !matchMedia(\"(prefers-reduced-motion: reduce)\").matches,\n (value) => (waveReady.value = value),\n );\n wave?.sync();\n if (model.value.gamepad && typeof navigator.getGamepads === \"function\") {\n const safeNavigator = {\n getGamepads() {\n try {\n const pads = navigator.getGamepads();\n if (gamepad) {\n const connected = Array.from(pads).filter((value) => value?.connected);\n gamepad.gamepads.value = gamepad.gamepads.value.filter((value) =>\n connected.some((current) => current.index === value.index),\n );\n for (const value of connected)\n if (!gamepad.gamepads.value.some((current) => current.index === value.index))\n gamepad.gamepads.value.push(value);\n }\n return pads;\n } catch {\n if (gamepad) gamepad.gamepads.value = [];\n controller(null);\n return [];\n }\n },\n };\n gamepad = useGamepad({ navigator: safeNavigator });\n safeNavigator.getGamepads();\n gamepad.resume();\n watchEffect(\n () =>\n controller(\n gamepad.gamepads.value.find((value) => value.connected && value.mapping === \"standard\") ??\n null,\n ),\n { flush: \"sync\" },\n );\n }\n const updateClock = () =>\n (clock.value = new Date().toLocaleTimeString(ui.value.dateOptions.locale, {\n timeZone: ui.value.dateOptions.timeZone,\n hour: \"2-digit\",\n minute: \"2-digit\",\n }));\n updateClock();\n timer = setInterval(updateClock, 1000);\n window.addEventListener(\"keydown\", keyboard);\n window.addEventListener(\"popstate\", onPop);\n document.addEventListener(\"visibilitychange\", visibility);\n window.addEventListener(\"pagehide\", suspend);\n window.addEventListener(\"pageshow\", visibility);\n motionQuery = matchMedia(\"(prefers-reduced-motion: reduce)\");\n motionQuery.addEventListener(\"change\", syncMotion);\n loadComplete();\n});\nwatch(\n () =>\n ready.value && model.value.updatesHref\n ? new URL(model.value.updatesHref, document.baseURI).href\n : null,\n (href, _old, onCleanup) => {\n if (!href || typeof EventSource === \"undefined\") return;\n const updates = new EventSource(href);\n updates.onmessage = () => (pendingUpdates.value = href);\n updates.onerror = () => {\n error.value = ui.value.labels.updatesError;\n failure.value = \"updates\";\n };\n updates.onopen = () => {\n if (failure.value === \"updates\") {\n error.value = \"\";\n failure.value = null;\n }\n };\n onCleanup(() => updates.close());\n },\n);\nwatchEffect(() => {\n if (ready.value && !busy.value && pendingUpdates.value) {\n const href = pendingUpdates.value;\n pendingUpdates.value = null;\n if (href === new URL(model.value.updatesHref, document.baseURI).href && !disposed)\n openFolder(model.value.dataHref, location.href, false, true);\n }\n});\nwatchEffect(() => {\n if (ready.value) {\n document.documentElement.dataset.cwColor = color.value;\n document.documentElement.dataset.cwMotion = String(!paused.value);\n try {\n localStorage.setItem(\"dirwell-crosswave-color\", color.value);\n } catch {}\n wave?.sync();\n }\n});\nonBeforeUnmount(() => {\n archiveAbort?.abort();\n disposed = true;\n document.body.removeAttribute(\"data-cw-enhanced\");\n abort?.abort();\n rowObserver?.disconnect();\n layoutObserver?.disconnect();\n window.removeEventListener(\"resize\", measureLayout);\n gamepad?.pause();\n wave?.dispose();\n clearInterval(timer);\n window.removeEventListener(\"keydown\", keyboard);\n window.removeEventListener(\"popstate\", onPop);\n document.removeEventListener(\"visibilitychange\", visibility);\n window.removeEventListener(\"pagehide\", suspend);\n window.removeEventListener(\"pageshow\", visibility);\n motionQuery?.removeEventListener(\"change\", syncMotion);\n});\n\nreturn (_ctx, _push, _parent, _attrs) => {\n _push(`<!--[--><div class=\"cw-background\"${_ssrRenderAttr(\"data-ready\", waveReady.value ? true : undefined)}><canvas aria-hidden=\"true\"></canvas><svg class=\"cw-fallback-wave\" aria-hidden=\"true\" viewBox=\"0 0 1200 600\"><path d=\"M-100 400 Q400 150 1300 340\"></path></svg></div><header class=\"cw-top\"><div class=\"cw-brand\">`)\n _ssrRenderSlot(_ctx.$slots, \"header\", { model: model.value }, () => {\n if (ui.value.brand.logoUrl) {\n _push(`<img${\n _ssrRenderAttr(\"src\", ui.value.brand.logoUrl)\n }${\n _ssrRenderAttr(\"alt\", ui.value.brand.logoAlt ?? '')\n } width=\"40\" height=\"40\">`)\n } else {\n _push(`<!---->`)\n }\n _push(`<a${\n _ssrRenderAttr(\"href\", model.value.rootHref)\n }>${\n _ssrInterpolate(ui.value.brand.name ?? model.value.title)\n }</a>`)\n }, _push, _parent)\n _push(`</div><nav class=\"cw-location\"${\n _ssrRenderAttr(\"aria-label\", ui.value.labels.breadcrumb)\n }><a${\n _ssrRenderAttr(\"href\", model.value.rootHref)\n }>${\n _ssrInterpolate(ui.value.labels.home)\n }</a><!--[-->`)\n _ssrRenderList(model.value.breadcrumbs, (crumb) => {\n _push(`<!--[--> / <a${\n _ssrRenderAttr(\"href\", crumb.href)\n }>${\n _ssrInterpolate(crumb.name)\n }</a><!--]-->`)\n })\n _push(`<!--]--></nav>`)\n if (ready.value) {\n _push(`<div class=\"cw-clock\">${_ssrInterpolate(clock.value)}</div>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</header><main class=\"cw-stage\" data-framework=\"vue\"${\n _ssrRenderAttr(\"aria-busy\", busy.value)\n }><h1 class=\"cw-sr\">${\n _ssrInterpolate(_unref(label)(ui.value, \"filesIn\", { path: model.value.path || \"/\" }))\n }</h1><nav class=\"cw-rail\"${\n _ssrRenderAttr(\"aria-label\", ui.value.labels.categories)\n }${\n _ssrRenderDynamicAttr(\"hidden\", !ready.value)\n }><div class=\"cw-categories\" role=\"tablist\"><!--[-->`)\n _ssrRenderList(model.value.categories, (item) => {\n _push(`<button role=\"tab\"${\n _ssrRenderAttr(\"id\", 'cw-tab-' + item.id)\n } aria-controls=\"cw-panel\"${\n _ssrRenderAttr(\"aria-selected\", category.value === item.id)\n }${\n _ssrRenderAttr(\"tabindex\", category.value === item.id ? 0 : -1)\n } class=\"${\n _ssrRenderClass(['cw-category', { 'cw-active': category.value === item.id }])\n }\"${\n (_ssrIncludeBooleanAttr(!complete.value)) ? \" disabled\" : \"\"\n }><span>${\n (item.svg) ?? ''\n }</span><span>${\n _ssrInterpolate(item.label)\n }</span><small>${\n _ssrInterpolate(entries.value.filter((entry) => membership(entry).includes(item.id)).length)\n }</small></button>`)\n })\n _push(`<!--]--></div></nav><section class=\"cw-browser\" id=\"cw-panel\" role=\"tabpanel\"${\n _ssrRenderAttr(\"aria-labelledby\", 'cw-tab-' + category.value)\n }><div class=\"cw-list-head\"><div class=\"cw-directory\"><h2>${\n _ssrInterpolate(heading.value)\n }</h2><span data-cw-count>${\n _ssrInterpolate(_unref(label)(ui.value, \"items\", { count: complete.value ? rows.value.length : entries.value.length }))\n }</span></div><label class=\"cw-search\"><span>${\n _ssrInterpolate(ui.value.labels.search)\n }</span><input type=\"search\"${\n _ssrRenderAttr(\"value\", query.value)\n }${\n (_ssrIncludeBooleanAttr(!ready.value || !complete.value)) ? \" disabled\" : \"\"\n }></label>`)\n if (model.value.searchQueryHref) {\n _push(`<button class=\"cw-archive-trigger\"${\n (_ssrIncludeBooleanAttr(!ready.value)) ? \" disabled\" : \"\"\n }>${\n _ssrInterpolate(ui.value.labels.searchArchive)\n }</button>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</div><div class=\"cw-list-scroll\"${_ssrRenderAttr(\"data-virtual\", virtual.value)}><ul class=\"cw-files\">`)\n if (model.value.parentHref) {\n _push(`<li class=\"cw-row\"><a${_ssrRenderAttr(\"href\", model.value.parentHref)} class=\"cw-entry\">../</a></li>`)\n } else {\n _push(`<!---->`)\n }\n if (start.value) {\n _push(`<li aria-hidden=\"true\" style=\"${_ssrRenderStyle({ height: offsets.value[start.value] + 'px' })}\"></li>`)\n } else {\n _push(`<!---->`)\n }\n _push(`<!--[-->`)\n _ssrRenderList(visibleRows.value, (entry, visibleIndex) => {\n _push(`<li${\n _ssrRenderAttr(\"aria-posinset\", start.value + visibleIndex + 1)\n }${\n _ssrRenderAttr(\"aria-setsize\", rows.value.length)\n } class=\"${\n _ssrRenderClass(['cw-row', { 'cw-selected': active.value?.id === entry.id }])\n }\" data-cw-entry${\n _ssrRenderAttr(\"data-custom-columns\", Boolean(model.value.ui?.columns))\n }${\n _ssrRenderAttr(\"data-id\", entry.id)\n }>`)\n if (entry.href) {\n _push(`<a class=\"cw-entry\"${\n _ssrRenderAttr(\"href\", safeHref(entry))\n }${\n _ssrRenderAttr(\"target\", entry.exitsExplorer ? '_blank' : undefined)\n }${\n _ssrRenderAttr(\"rel\", entry.exitsExplorer ? 'noopener' : undefined)\n }>`)\n _ssrRenderSlot(_ctx.$slots, \"row\", {\n model: model.value,\n entry: entry,\n selected: selected.value === entry.id\n }, () => {\n _push(`<span class=\"cw-entry-icon\" aria-hidden=\"true\">${(\n _unref(entryIcon)(\n entry.kind === 'symlink'\n ? 'link'\n : _unref(directoryLike)(entry)\n ? 'directory'\n : 'file',\n )\n ) ?? ''}</span><span class=\"cw-entry-label\"><!--[-->`)\n _ssrRenderList(ui.value.columns, (column) => {\n _push(`<!--[-->`)\n if (column === 'name') {\n _push(`<span class=\"cw-name\">${\n _ssrInterpolate(entry.name)\n }${\n _ssrInterpolate(_unref(directoryLike)(entry) ? \"/\" : \"\")\n }</span>`)\n } else {\n _push(`<!---->`)\n }\n if (entry.link && column === 'name') {\n _push(`<span class=\"cw-target\">${_ssrInterpolate(entry.link.target)}</span>`)\n } else {\n _push(`<!---->`)\n }\n if (column === 'size') {\n _push(`<span class=\"cw-row-meta\">${\n _ssrInterpolate(entry.link?.unavailable\n ? ui.value.labels.unavailable\n : ui.value.labels[entry.kind === \"symlink\" ? \"link\" : entry.kind])\n } · ${\n _ssrInterpolate(_unref(directoryLike)(entry) ? ui.value.labels.folder : _unref(size)(entry.size))\n }</span>`)\n } else {\n _push(`<!---->`)\n }\n if (column === 'modified') {\n _push(`<span class=\"cw-row-date\">${\n _ssrInterpolate(ui.value.labels.modified)\n } ${\n _ssrInterpolate(_unref(formattedDate)(entry.modifiedAt, ui.value, ready.value))\n }</span>`)\n } else {\n _push(`<!---->`)\n }\n if (typeof column === 'object') {\n _push(`<span class=\"cw-data-value\">${\n _ssrInterpolate(column.label)\n }: ${\n _ssrInterpolate(_unref(publicDataValue)(entry.data?.[column.dataKey]))\n }</span>`)\n } else {\n _push(`<!---->`)\n }\n _push(`<!--]-->`)\n })\n _push(`<!--]--></span>`)\n }, _push, _parent)\n _push(`</a>`)\n } else {\n _push(`<span class=\"cw-entry cw-unavailable\">`)\n _ssrRenderSlot(_ctx.$slots, \"row\", {\n model: model.value,\n entry: entry,\n selected: selected.value === entry.id\n }, () => {\n _push(`${_ssrInterpolate(entry.name)}`)\n }, _push, _parent)\n _push(`</span>`)\n }\n if (ui.value.actions.length || _ctx.$slots.actions) {\n _push(`<span data-dirwell-actions class=\"cw-row-actions\">`)\n _ssrRenderSlot(_ctx.$slots, \"actions\", {\n model: model.value,\n entry: entry,\n selected: selected.value === entry.id\n }, null, _push, _parent)\n _push(`<!--[-->`)\n _ssrRenderList(ui.value.actions, (action) => {\n _push(`<!--[-->`)\n if (\n action === 'download' &&\n entry.href &&\n !_unref(directoryLike)(entry) &&\n !entry.link?.unavailable\n ) {\n _push(`<a${\n _ssrRenderAttr(\"href\", safeHref(entry))\n } download>${\n _ssrInterpolate(ui.value.labels.download)\n }</a>`)\n } else if (action !== 'download') {\n _push(`<button${\n (_ssrIncludeBooleanAttr(!ready.value || (action === 'copy-link' && !entry.href))) ? \" disabled\" : \"\"\n }${\n _ssrRenderAttr(\"aria-label\", \n (action === 'copy-link' ? ui.value.labels.copyLink : ui.value.labels.copyPath) +\n ': ' +\n entry.name\n )\n }>${\n _ssrInterpolate(action === \"copy-link\" ? ui.value.labels.copyLink : ui.value.labels.copyPath)\n }</button>`)\n } else {\n _push(`<!---->`)\n }\n _push(`<!--]-->`)\n })\n _push(`<!--]--></span>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</li>`)\n })\n _push(`<!--]-->`)\n if (end.value < rows.value.length) {\n _push(`<li aria-hidden=\"true\" style=\"${_ssrRenderStyle({ height: offsets.value[rows.value.length] - offsets.value[end.value] + 'px' })}\"></li>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</ul>`)\n if (!rows.value.length && !busy.value) {\n _push(`<p class=\"cw-empty\">${_ssrInterpolate(model.value.total === 0 ? ui.value.labels.empty : ui.value.labels.noMatches)}</p>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</div></section>`)\n if (ready.value && active.value) {\n _push(`<aside class=\"cw-detail\"><h2>${_ssrInterpolate(active.value.name)}</h2>`)\n if (ui.value.columns.includes('size')) {\n _push(`<p>${\n _ssrInterpolate(ui.value.labels[active.value.kind === \"symlink\" ? \"link\" : active.value.kind])\n } · ${\n _ssrInterpolate(_unref(directoryLike)(active.value) ? ui.value.labels.folder : _unref(size)(active.value.size))\n }</p>`)\n } else {\n _push(`<!---->`)\n }\n if (ui.value.columns.includes('modified')) {\n _push(`<p>${_ssrInterpolate(_unref(formattedDate)(active.value.modifiedAt, ui.value, ready.value))}</p>`)\n } else {\n _push(`<!---->`)\n }\n if (active.value.link) {\n _push(`<p>${_ssrInterpolate(active.value.link.target)}</p>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</aside>`)\n } else {\n _push(`<!---->`)\n }\n _push(`<p role=\"status\" aria-live=\"polite\">${_ssrInterpolate(busy.value ? ui.value.labels.loading : error.value)}</p>`)\n if (failure.value && failure.value !== 'copy') {\n _push(`<button${\n (_ssrIncludeBooleanAttr(busy.value)) ? \" disabled\" : \"\"\n }>${\n _ssrInterpolate(ui.value.labels.retry)\n }</button>`)\n } else {\n _push(`<!---->`)\n }\n if (failure.value === 'folder' && retryRequest.value) {\n _push(`<a${\n _ssrRenderAttr(\"href\", retryRequest.value[1])\n }>${\n _ssrInterpolate(ui.value.labels.openNative)\n }</a>`)\n } else {\n _push(`<!---->`)\n }\n if (model.value.page?.count > 1 && !complete.value) {\n _push(`<nav${_ssrRenderAttr(\"aria-label\", ui.value.labels.pagination)}>`)\n if (model.value.page.previousHref) {\n _push(`<a${\n _ssrRenderAttr(\"href\", model.value.page.previousHref)\n } rel=\"prev\">${\n _ssrInterpolate(ui.value.labels.previous)\n }</a>`)\n } else {\n _push(`<!---->`)\n }\n _push(` ${_ssrInterpolate(_unref(label)(ui.value, \"page\", { page: model.value.page.number, pages: model.value.page.count }))} `)\n if (model.value.page.nextHref) {\n _push(`<a${\n _ssrRenderAttr(\"href\", model.value.page.nextHref)\n } rel=\"next\">${\n _ssrInterpolate(ui.value.labels.next)\n }</a>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</nav>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</main><footer class=\"cw-bottom\"><div class=\"${_ssrRenderClass(ui.value.brand.footerText || _ctx.$slots.footer ? 'cw-custom-footer' : 'cw-key-help')}\">`)\n _ssrRenderSlot(_ctx.$slots, \"footer\", { model: model.value }, () => {\n if (ui.value.brand.footerText) {\n _push(`<!--[-->`)\n if (ui.value.brand.footerUrl) {\n _push(`<a${\n _ssrRenderAttr(\"href\", ui.value.brand.footerUrl)\n }>${\n _ssrInterpolate(ui.value.brand.footerText)\n }</a>`)\n } else {\n _push(`<span>${_ssrInterpolate(ui.value.brand.footerText)}</span>`)\n }\n _push(`<!--]-->`)\n } else {\n _push(`<!--[-->${_ssrInterpolate(ui.value.labels.crosswaveKeyboardHelp)}<!--]-->`)\n }\n }, _push, _parent)\n _push(`</div>`)\n if (pad.value) {\n _push(`<div class=\"cw-controller\">${_ssrInterpolate(ui.value.labels.controller)}</div>`)\n } else {\n _push(`<!---->`)\n }\n _push(`<label class=\"cw-appearance\">${\n _ssrInterpolate(ui.value.labels.color)\n }<select${\n (_ssrIncludeBooleanAttr(!ready.value)) ? \" disabled\" : \"\"\n }><!--[-->`)\n _ssrRenderList(Object.keys(colors), (name) => {\n _push(`<option${\n _ssrRenderAttr(\"value\", name)\n }${\n (_ssrIncludeBooleanAttr((Array.isArray(color.value))\n ? _ssrLooseContain(color.value, name)\n : _ssrLooseEqual(color.value, name))) ? \" selected\" : \"\"\n }>${\n _ssrInterpolate(ui.value.labels[name])\n }</option>`)\n })\n _push(`<!--]--></select></label><button class=\"cw-motion\"${\n (_ssrIncludeBooleanAttr(!ready.value)) ? \" disabled\" : \"\"\n }>${\n _ssrInterpolate(paused.value ? ui.value.labels.resumeMotion : ui.value.labels.pauseMotion)\n }</button></footer>`)\n if (archiveOpen.value) {\n _push(`<dialog class=\"cw-archive\"${\n _ssrRenderAttr(\"aria-label\", ui.value.labels.searchArchive)\n }><h2>${\n _ssrInterpolate(ui.value.labels.searchArchive)\n }</h2><input type=\"search\"${\n _ssrRenderAttr(\"value\", archiveQuery.value)\n }${\n _ssrRenderAttr(\"aria-label\", ui.value.labels.archiveSearchInput)\n }><p role=\"status\">${\n _ssrInterpolate(archiveStatus.value)\n }</p>`)\n if (archiveFailed.value) {\n _push(`<button>${_ssrInterpolate(ui.value.labels.retry)}</button>`)\n } else {\n _push(`<!---->`)\n }\n _push(`<ul><!--[-->`)\n _ssrRenderList(archiveRows.value, (record) => {\n _push(`<li>`)\n if (record.href) {\n _push(`<a${\n _ssrRenderAttr(\"href\", record.href)\n }${\n _ssrRenderAttr(\"target\", record.exitsExplorer ? '_blank' : undefined)\n }${\n _ssrRenderAttr(\"rel\", record.exitsExplorer ? 'noopener' : undefined)\n }>${\n _ssrInterpolate(record.path)\n }</a>`)\n } else {\n _push(`<span>${_ssrInterpolate(record.path)}</span>`)\n }\n _push(`</li>`)\n })\n _push(`<!--]--></ul><button>${_ssrInterpolate(ui.value.labels.close)}</button></dialog>`)\n } else {\n _push(`<!---->`)\n }\n _push(`<!--]-->`)\n}\n}\n\n}","import {createSSRApp} from 'vue';import {renderToString} from 'vue/server-renderer';import App from './.generated/App-server.mjs';export const renderBody=model=>renderToString(createSSRApp(App,{model}));","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\";\nimport {\n entryMimeType,\n entryCategories,\n resolveCrosswaveCategories,\n defaultCrosswaveCategories,\n type CrosswaveCategory,\n} from \"./categories.ts\";\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 { defaultCrosswaveCategories } from \"./categories.ts\";\nexport type {\n CrosswaveCategory,\n CrosswaveCategoryMatch,\n CrosswaveCategoryIcon,\n} from \"./categories.ts\";\nexport interface CrosswaveThemeOptions extends ThemeCustomization {\n readonly title?: string;\n readonly categories?: readonly CrosswaveCategory[];\n readonly color?: \"azure\" | \"violet\" | \"amber\" | \"rose\" | \"jade\" | \"graphite\";\n readonly gamepad?: boolean;\n readonly archiveSearch?: boolean;\n readonly backgroundMotion?: boolean;\n}\nexport function createCrosswaveTheme(\n options: CrosswaveThemeOptions = {},\n renderer?: FrameworkRenderer,\n): ExplorerTheme {\n assertThemeOptions(options, [\n \"title\",\n \"categories\",\n \"color\",\n \"gamepad\",\n \"backgroundMotion\",\n \"archiveSearch\",\n ]);\n if (options.title !== undefined && (typeof options.title !== \"string\" || !options.title))\n throw new TypeError(\"title must be a non-empty string\");\n if (\n options.color !== undefined &&\n ![\"azure\", \"violet\", \"amber\", \"rose\", \"jade\", \"graphite\"].includes(options.color)\n )\n throw new TypeError(\"Unsupported Crosswave color\");\n for (const key of [\"gamepad\", \"backgroundMotion\", \"archiveSearch\"] as const)\n if (options[key] !== undefined && typeof options[key] !== \"boolean\")\n throw new TypeError(`${key} must be a boolean`);\n const ui = resolveCustomization(options);\n const publishedUi = pickCustomization(options);\n const categoryLabels: Readonly<Record<string, string>> = {\n all: ui.labels.allFiles,\n folder: ui.labels.categoryFolders,\n image: ui.labels.categoryPhotos,\n audio: ui.labels.categoryMusic,\n video: ui.labels.categoryVideos,\n document: ui.labels.categoryDocuments,\n other: ui.labels.categoryOther,\n };\n const categories = resolveCrosswaveCategories(\n options.categories ??\n defaultCrosswaveCategories.map((category) => ({\n ...category,\n label: categoryLabels[category.id] ?? category.label,\n })),\n );\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: `crosswave-client-${createHash(\"sha256\").update(script).digest(\"hex\").slice(0, 16)}.js`,\n })));\n const theme: ExplorerTheme = {\n name: \"crosswave\",\n searchIndex: false,\n listing: { pagination: true },\n entryData: (entry, context) => ({\n mimeType: entryMimeType(entry),\n categories: entryCategories(entry, entryMimeType(entry), categories).map((item) => item.id),\n folderDataHref: folderDataHref(entry, context, \"crosswave\"),\n }),\n async render(context) {\n const model = {\n ...createThemePage(context, theme, options.title ?? ui.brand.name ?? \"Dirwell\"),\n ...(publishedUi === undefined ? {} : { ui: publishedUi }),\n searchQueryHref: options.archiveSearch === false ? null : (context.searchQueryHref ?? null),\n categories: categories.map(({ id, label, svg }) => ({ id, label, svg })),\n color: options.color ?? \"azure\",\n gamepad: options.gamepad ?? true,\n backgroundMotion: options.backgroundMotion ?? true,\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-cw-color=\"${escapeHtml(model.color)}\" data-cw-motion=\"${model.backgroundMotion}\"><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=\"crosswave\">${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(\"crosswave\", model.path, model.page?.number ?? 1)]: JSON.stringify(model),\n },\n };\n },\n };\n return theme;\n}\n"],"mappings":"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"}