@dirwell/theme-crosswave 0.0.0-stage → 0.0.1-alpha

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["paths","_ssrRenderAttr","_ssrInterpolate","_ssrRenderDynamicAttr","_ssrRenderClass","_ssrIncludeBooleanAttr","_unref","_ssrLooseContain","_ssrLooseEqual","App"],"sources":["../../shared-theme/src/page.ts","../src/icons.ts","../src/categories.ts","../../shared-theme/src/navigation.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\";\nexport interface ThemePage {\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;\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;\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 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","import { loadListing, parseListingEntries, ListingDataError } from \"@dirwell/core/client\";\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 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 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 independently fetched page and listing revisions agree.\n if (fresh && result.manifestHref) {\n const loaded = await loadListing(result.manifestHref, { signal, cache: \"no-store\" });\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","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, 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 { entryIcon } from \"../../shared-theme/src/icons.ts\";\nimport { directoryLike, size, modified } from \"../../shared-theme/src/records.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);\nconst query = ref(\"\"),\n category = ref(\"all\"),\n selected = ref(null),\n ready = ref(false),\n busy = ref(false),\n error = ref(\"\"),\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();\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 (category.value === \"all\" || 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 () => model.value.categories.find((item) => item.id === category.value)?.label ?? \"All files\",\n );\nconst nodes = new Map();\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 = \"Could not load complete directory data. Native page links remain available.\";\n } finally {\n if (token === navigation) busy.value = false;\n }\n}\nasync function openFolder(dataHref, url, push, refresh = false) {\n const token = ++navigation;\n abort?.abort();\n const local = (abort = new AbortController());\n busy.value = true;\n error.value = \"\";\n try {\n const next = await fetchThemePage(dataHref, url, \"crosswave\", local.signal, refresh);\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 model.value = next;\n entries.value = nextEntries;\n if (!refresh) {\n query.value = \"\";\n selected.value = null;\n category.value = \"all\";\n }\n if (push) history.pushState({ dataHref: next.dataHref }, \"\", url);\n applyThemeMetadata(next, url);\n await loadComplete();\n } catch (cause) {\n if (token === navigation && !local.signal.aborted)\n error.value = \"Could not open the folder. Its native link remains available.\";\n } finally {\n if (token === navigation) busy.value = false;\n }\n}\nfunction navigateLink(event, href, dataHref) {\n if (\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 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 entry = rows.value[Math.max(0, Math.min(rows.value.length - 1, index))];\n if (!entry) return;\n selected.value = entry.id;\n await nextTick();\n const node = nodes.get(entry.id);\n node?.querySelector(\"a\")?.focus({ preventScroll: true });\n node?.scrollIntoView({ block: \"nearest\" });\n}\nfunction stepCategory(delta) {\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}\nfunction confirm() {\n if (!active.value || busy.value) return;\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:\") 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 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)\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 history.replaceState({ dataHref: new URL(model.value.dataHref, document.baseURI).href }, \"\");\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([], { hour: \"2-digit\", minute: \"2-digit\" }));\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 = () => (error.value = \"Live updates disconnected. Refresh to retry.\");\n updates.onopen = () => {\n if (error.value.startsWith(\"Live updates\")) error.value = \"\";\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 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 _push(`<a${\n _ssrRenderAttr(\"href\", model.value.rootHref)\n }>${\n _ssrInterpolate(model.value.title)\n }</a>`)\n }, _push, _parent)\n _push(`</div><nav class=\"cw-location\" aria-label=\"Breadcrumb\"><a${_ssrRenderAttr(\"href\", model.value.rootHref)}>Home</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\">Files in ${\n _ssrInterpolate(model.value.path || \"/\")\n }</h1><nav class=\"cw-rail\" aria-label=\"File categories\"${\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(complete.value ? rows.value.length : entries.value.length)\n } items</span></div><label class=\"cw-search\">Search<input type=\"search\"${\n _ssrRenderAttr(\"value\", query.value)\n }${\n (_ssrIncludeBooleanAttr(!ready.value || !complete.value)) ? \" disabled\" : \"\"\n }></label></div><div class=\"cw-list-scroll\"><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 _push(`<!--[-->`)\n _ssrRenderList(rows.value, (entry) => {\n _push(`<li class=\"${\n _ssrRenderClass(['cw-row', { 'cw-selected': active.value?.id === entry.id }])\n }\" data-cw-entry${\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 (\n _unref(entryIcon)(\n entry.kind === 'symlink'\n ? 'link'\n : _unref(directoryLike)(entry)\n ? 'directory'\n : 'file',\n )\n ) ?? ''\n }</span><span class=\"cw-entry-label\"><span class=\"cw-name\">${\n _ssrInterpolate(entry.name)\n }${\n _ssrInterpolate(_unref(directoryLike)(entry) ? \"/\" : \"\")\n }</span>`)\n if (entry.link) {\n _push(`<span class=\"cw-target\">${_ssrInterpolate(entry.link.target)}</span>`)\n } else {\n _push(`<!---->`)\n }\n _push(`<span class=\"cw-row-meta\">${\n _ssrInterpolate(entry.link?.unavailable ? \"Target unavailable\" : entry.kind)\n } · ${\n _ssrInterpolate(_unref(directoryLike)(entry) ? \"Folder\" : _unref(size)(entry.size))\n }</span><span class=\"cw-row-date\">Modified ${\n _ssrInterpolate(_unref(modified)(entry.modifiedAt))\n }</span></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 _push(`</li>`)\n })\n _push(`<!--]--></ul>`)\n if (!rows.value.length) {\n _push(`<p class=\"cw-empty\">No matching files.</p>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</div></section>`)\n if (ready.value && active.value) {\n _push(`<aside class=\"cw-detail\"><h2>${\n _ssrInterpolate(active.value.name)\n }</h2><p>${\n _ssrInterpolate(active.value.kind)\n } · ${\n _ssrInterpolate(_unref(directoryLike)(active.value) ? \"Folder\" : _unref(size)(active.value.size))\n }</p><p>${\n _ssrInterpolate(_unref(modified)(active.value.modifiedAt))\n }</p>`)\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 ? \"Loading…\" : error.value)}</p>`)\n if (model.value.page?.count > 1 && !complete.value) {\n _push(`<nav aria-label=\"Pagination\">`)\n if (model.value.page.previousHref) {\n _push(`<a${_ssrRenderAttr(\"href\", model.value.page.previousHref)} rel=\"prev\">Previous</a>`)\n } else {\n _push(`<!---->`)\n }\n _push(` Page ${\n _ssrInterpolate(model.value.page.number)\n } of ${\n _ssrInterpolate(model.value.page.count)\n } `)\n if (model.value.page.nextHref) {\n _push(`<a${_ssrRenderAttr(\"href\", model.value.page.nextHref)} rel=\"next\">Next</a>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</nav>`)\n } else {\n _push(`<!---->`)\n }\n _push(`</main><footer class=\"cw-bottom\"><div class=\"cw-key-help\">`)\n _ssrRenderSlot(_ctx.$slots, \"footer\", { model: model.value }, () => {\n _push(`Arrow keys navigate · Enter confirms · Backspace returns`)\n }, _push, _parent)\n _push(`</div>`)\n if (pad.value) {\n _push(`<div class=\"cw-controller\">Controller · Confirm / Back</div>`)\n } else {\n _push(`<!---->`)\n }\n _push(`<label class=\"cw-appearance\">Color<select${(_ssrIncludeBooleanAttr(!ready.value)) ? \" disabled\" : \"\"}><!--[-->`)\n _ssrRenderList(Object.keys(colors), (name) => {\n _push(`<option${\n (_ssrIncludeBooleanAttr((Array.isArray(color.value))\n ? _ssrLooseContain(color.value, null)\n : _ssrLooseEqual(color.value, null))) ? \" selected\" : \"\"\n }>${\n _ssrInterpolate(name)\n }</option>`)\n })\n _push(`<!--]--></select></label><button class=\"cw-motion\"${\n (_ssrIncludeBooleanAttr(!ready.value)) ? \" disabled\" : \"\"\n }>${\n _ssrInterpolate(paused.value ? \"Resume motion\" : \"Pause motion\")\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 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\";\nexport { defaultCrosswaveCategories } from \"./categories.ts\";\nexport type {\n CrosswaveCategory,\n CrosswaveCategoryMatch,\n CrosswaveCategoryIcon,\n} from \"./categories.ts\";\nexport interface CrosswaveThemeOptions {\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 const categories = resolveCrosswaveCategories(options.categories);\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 ?? \"Dirwell\"),\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 =\n renderer?.clientScript ??\n (await readFile(new URL(\"./client.js\", import.meta.url), \"utf8\")),\n styles = await readFile(new URL(\"./styles.css\", import.meta.url), \"utf8\");\n const scriptName = `crosswave-client-${createHash(\"sha256\").update(script).digest(\"hex\").slice(0, 16)}.js`;\n const json = JSON.stringify(model).replaceAll(\"<\", \"\\\\u003c\");\n return {\n html: `<!doctype html><html lang=\"en\" 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>`}<style>${styles}${renderer?.styles ?? \"\"}</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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"}
@@ -0,0 +1,53 @@
1
+ import { ExplorerTheme, ListingEntry, ListingEntry as ListingEntry$1, ListingPage, SortOptions } from "@dirwell/core";
2
+ //#region ../shared-theme/src/page.d.ts
3
+ interface ThemePage$1 {
4
+ readonly version: 1;
5
+ readonly theme: string;
6
+ readonly title: string;
7
+ readonly metadataHead?: string;
8
+ readonly path: string;
9
+ readonly rootHref: string;
10
+ readonly parentHref: string | null;
11
+ readonly parentDataHref: string | null;
12
+ readonly rootDataHref: string;
13
+ readonly dataHref: string;
14
+ readonly manifestHref: string | null;
15
+ readonly listingRevision?: string;
16
+ readonly updatesHref: string | null;
17
+ readonly total: number;
18
+ readonly entries: readonly ListingEntry[];
19
+ readonly sort: Required<SortOptions>;
20
+ readonly page: ListingPage | null;
21
+ readonly breadcrumbs: readonly {
22
+ readonly name: string;
23
+ readonly href: string;
24
+ readonly dataHref: string;
25
+ }[];
26
+ }
27
+ //#endregion
28
+ //#region src/model.d.ts
29
+ interface ThemePage extends ThemePage$1 {
30
+ readonly categories: readonly {
31
+ readonly id: string;
32
+ readonly label: string;
33
+ readonly svg: string;
34
+ }[];
35
+ readonly color: "azure" | "violet" | "amber" | "rose" | "jade" | "graphite";
36
+ readonly gamepad: boolean;
37
+ readonly backgroundMotion: boolean;
38
+ }
39
+ /** The authoring compiler supplies both halves from the same source. */
40
+ interface FrameworkRenderer {
41
+ readonly renderBody: (model: ThemePage) => string | Promise<string>;
42
+ readonly clientScript: string;
43
+ readonly styles?: string;
44
+ readonly clientType?: "module";
45
+ }
46
+ interface RowContext {
47
+ readonly model: ThemePage;
48
+ readonly entry: import("@dirwell/core").ListingEntry;
49
+ readonly selected: boolean;
50
+ }
51
+ //#endregion
52
+ export { ThemePage as i, ListingEntry$1 as n, RowContext as r, FrameworkRenderer as t };
53
+ //# sourceMappingURL=model-D4-K54I9.d.mts.map
@@ -0,0 +1,2 @@
1
+ import { i as ThemePage, n as ListingEntry, r as RowContext, t as FrameworkRenderer } from "./model-D4-K54I9.mjs";
2
+ export { FrameworkRenderer, type ListingEntry, RowContext, ThemePage };
package/dist/model.mjs ADDED
@@ -0,0 +1 @@
1
+ export {};