@vizejs/vite-plugin-musea 0.429.1 → 0.430.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/a11y/index.d.mts +1 -1
- package/dist/a11y/index.mjs +1 -1
- package/dist/{a11y-Ci9EEv6F.mjs → a11y-BbFK942j.mjs} +66 -15
- package/dist/a11y-BbFK942j.mjs.map +1 -0
- package/dist/api-gMwahZKm.d.mts +112 -0
- package/dist/api-gMwahZKm.d.mts.map +1 -0
- package/dist/cli/index.d.mts +1 -1
- package/dist/cli/index.d.mts.map +1 -1
- package/dist/cli/index.mjs +79 -33
- package/dist/cli/index.mjs.map +1 -1
- package/dist/gallery/assets/{MonacoEditor-BIjYdDrA.js → MonacoEditor-CnzIyKMy.js} +2 -2
- package/dist/gallery/assets/{cssMode-C5PB9d_X.js → cssMode-DZ_me5CG.js} +1 -1
- package/dist/gallery/assets/{editor.api-tyf2wJeZ.js → editor.api-CjD4Hpms.js} +1 -1
- package/dist/gallery/assets/{freemarker2-Df2SP4C4.js → freemarker2-F7z49Hfe.js} +1 -1
- package/dist/gallery/assets/{handlebars-CbFr-5KQ.js → handlebars-Dt4eGgf-.js} +1 -1
- package/dist/gallery/assets/{html-C1ubjnt5.js → html-B1zmbcur.js} +1 -1
- package/dist/gallery/assets/{htmlMode-9FYaGqmo.js → htmlMode-DmDwpA4v.js} +1 -1
- package/dist/gallery/assets/{index-D81pMC9f.css → index-C4vm-yqv.css} +1 -1
- package/dist/gallery/assets/{index-BjW1cVGf.js → index-vJ3ftuqF.js} +3 -3
- package/dist/gallery/assets/{javascript-DjzYR9ls.js → javascript-CLKbyvz8.js} +1 -1
- package/dist/gallery/assets/{jsonMode-BRxSdIjW.js → jsonMode-sms9-L2I.js} +1 -1
- package/dist/gallery/assets/{liquid-DD0LqlcF.js → liquid-CesACmVT.js} +1 -1
- package/dist/gallery/assets/{lspLanguageFeatures-C0f4qlAU.js → lspLanguageFeatures-C8BR-41u.js} +1 -1
- package/dist/gallery/assets/{mdx-DtcWR2Lx.js → mdx-Cd93KUo_.js} +1 -1
- package/dist/gallery/assets/{python-C1OlrT9L.js → python-8gi7tgMv.js} +1 -1
- package/dist/gallery/assets/{razor-BN2Zj1B9.js → razor-sOyhBXSy.js} +1 -1
- package/dist/gallery/assets/{register-CTEjv03I.js → register-C-_4TcWq.js} +2 -2
- package/dist/gallery/assets/{toggleHighContrast-BELgo5Kd.js → toggleHighContrast-BCHobRx5.js} +1 -1
- package/dist/gallery/assets/{tsMode-Bd8a8shj.js → tsMode-BkQQD7P8.js} +1 -1
- package/dist/gallery/assets/{typescript-DLlFIuFu.js → typescript-XiwOdN8G.js} +1 -1
- package/dist/gallery/assets/{vs-YCtNwrNl.js → vs-Coo3fK7w.js} +3 -3
- package/dist/gallery/assets/{workers-CBv4Qjp-.js → workers-Cypb28_F.js} +1 -1
- package/dist/gallery/assets/{xml-wUPbJH_s.js → xml-CN1ixSLs.js} +1 -1
- package/dist/gallery/assets/{yaml-B52zgDg-.js → yaml-l30MdsZA.js} +1 -1
- package/dist/gallery/index.html +2 -2
- package/dist/{gallery-qE5deHL0.mjs → gallery-CIcrB07g.mjs} +2 -2
- package/dist/{gallery-qE5deHL0.mjs.map → gallery-CIcrB07g.mjs.map} +1 -1
- package/dist/index-C5evpfmF.d.mts +81 -0
- package/dist/index-C5evpfmF.d.mts.map +1 -0
- package/dist/index.d.mts +5 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +33 -9
- package/dist/index.mjs.map +1 -1
- package/dist/options-CZYdDtTW.mjs +581 -0
- package/dist/options-CZYdDtTW.mjs.map +1 -0
- package/dist/{plugin-CIrKPW8K.d.mts → plugin-DkFXWcCD.d.mts} +11 -2
- package/dist/plugin-DkFXWcCD.d.mts.map +1 -0
- package/dist/{template-DNhEgY8-.mjs → template-DDl7rsgo.mjs} +2 -2
- package/dist/{template-DNhEgY8-.mjs.map → template-DDl7rsgo.mjs.map} +1 -1
- package/dist/utils-DeMLVlNS.mjs +628 -0
- package/dist/utils-DeMLVlNS.mjs.map +1 -0
- package/dist/{vrt-DVub2B6r.d.mts → vrt-3T_e4bJ3.d.mts} +7 -1
- package/dist/vrt-3T_e4bJ3.d.mts.map +1 -0
- package/dist/{vrt-BPwRc95_.d.mts → vrt-6iDBfqNg.d.mts} +2 -2
- package/dist/{vrt-BPwRc95_.d.mts.map → vrt-6iDBfqNg.d.mts.map} +1 -1
- package/dist/{vrt-UxzWFygI.mjs → vrt-VuGK9wTX.mjs} +11 -4
- package/dist/vrt-VuGK9wTX.mjs.map +1 -0
- package/dist/vrt.d.mts +1 -1
- package/dist/vrt.mjs +1 -1
- package/package.json +4 -4
- package/dist/a11y-Ci9EEv6F.mjs.map +0 -1
- package/dist/index-HVtO9FK5.d.mts +0 -170
- package/dist/index-HVtO9FK5.d.mts.map +0 -1
- package/dist/options-Cd7bzLGr.mjs +0 -1142
- package/dist/options-Cd7bzLGr.mjs.map +0 -1
- package/dist/plugin-CIrKPW8K.d.mts.map +0 -1
- package/dist/vrt-DVub2B6r.d.mts.map +0 -1
- package/dist/vrt-UxzWFygI.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options-CZYdDtTW.mjs","names":["componentNameFromSource"],"sources":["../src/component-source.ts","../src/art-module-vue2.ts","../src/art-component.ts","../src/art-module.ts","../src/art-style.ts","../src/plugin/art-processing.ts","../src/plugin/options.ts"],"sourcesContent":["import path from \"node:path\";\n\nimport { assertComponentSourcePath, resolveTrustedSourcePath } from \"./security.js\";\nimport type { ArtFileInfo } from \"./types/index.js\";\n\nexport function allowedSourceRoots(root: string, scanRoots: string[] = []): string[] {\n return [...new Set([root, ...scanRoots].map((sourceRoot) => path.resolve(sourceRoot)))];\n}\n\nexport function resolveReadableArtPath(root: string, scanRoots: string[], artPath: string): string {\n return resolveTrustedSourcePath(root, scanRoots, artPath, \"art path\");\n}\n\nexport function resolveComponentSourcePath(\n art: ArtFileInfo,\n artPath: string,\n sourceRoots: string[],\n): string | null {\n const componentPath =\n art.isInline && art.componentPath\n ? art.componentPath\n : art.metadata.component\n ? path.isAbsolute(art.metadata.component)\n ? art.metadata.component\n : path.resolve(path.dirname(artPath), art.metadata.component)\n : null;\n\n const [projectRoot, ...extraRoots] = sourceRoots;\n if (!componentPath) {\n return null;\n }\n\n const resolved = resolveTrustedSourcePath(\n projectRoot ?? \".\",\n extraRoots,\n componentPath,\n \"component path\",\n );\n assertComponentSourcePath(resolved, \"component path\");\n return resolved;\n}\n","/**\n * Legacy Vue 2 variant emission.\n *\n * Vue 2 has no `openBlock`/`createElementBlock` runtime, so the compiled Vue 3\n * render functions the SFC pipeline produces cannot load there. Vue 2 galleries\n * keep the runtime-compiled `template:` string they always had — the TypeScript\n * fix in #3857 applies to Vue 3, which is what `.art.vue` with\n * `<script setup lang=\"ts\">` targets.\n */\n\nimport { escapeHtml } from \"./utils.js\";\n\nexport function escapeTemplateLiteral(str: string): string {\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\").replace(/\\$/g, \"\\\\$\");\n}\n\nexport type LegacyVariantContext = {\n variantComponentName: string;\n variantName: string;\n template: string;\n componentTagName?: string;\n componentBindingName: string;\n scriptSetup: { setupBody: string[]; returnNames: string[]; imports: string[] } | null;\n hasSetup: boolean;\n isolatedSetup: boolean;\n setupReturn: string;\n importDeclaresName: (statement: string, name: string) => boolean;\n};\n\nexport function emitLegacyVariant(context: LegacyVariantContext): string {\n const {\n variantComponentName,\n variantName,\n template,\n componentTagName,\n componentBindingName,\n scriptSetup,\n hasSetup,\n isolatedSetup,\n setupReturn,\n importDeclaresName,\n } = context;\n\n const escapedTemplate = escapeTemplateLiteral(template);\n const escapedVariantName = escapeTemplateLiteral(escapeHtml(variantName));\n const fullTemplate = `<div data-variant=\"${escapedVariantName}\">${escapedTemplate}</div>`;\n\n // Runtime-compiled templates use resolveComponent(), which checks the\n // `components` option rather than setup return values.\n const componentNames = new Map<string, string>();\n if (componentTagName) componentNames.set(componentTagName, componentBindingName);\n if (scriptSetup) {\n for (const name of scriptSetup.returnNames)\n if (/^[A-Z]/.test(name) && scriptSetup.imports.some((imp) => importDeclaresName(imp, name)))\n componentNames.set(name, name);\n }\n const components =\n componentNames.size > 0\n ? ` components: { ${[...componentNames]\n .map(([name, value]) => `${JSON.stringify(name)}: ${value}`)\n .join(\", \")} },\\n`\n : \"\";\n\n if (scriptSetup && hasSetup && isolatedSetup) {\n return `\nexport const ${variantComponentName} = __museaDefineComponent({\n name: '${variantComponentName}',\n${components} setup() {\n${scriptSetup.setupBody.join(\"\\n\")}\n return ${setupReturn};\n },\n template: \\`${fullTemplate}\\`,\n});\n`;\n }\n if (scriptSetup && hasSetup) {\n return `\nexport const ${variantComponentName} = __museaDefineComponent({\n name: '${variantComponentName}',\n${components} setup() {\n return __museaSharedSetup;\n },\n template: \\`${fullTemplate}\\`,\n});\n`;\n }\n // Without a setup block `components` is empty unless a component tag was\n // resolved, so one template covers both cases.\n return `\nexport const ${variantComponentName} = {\n name: '${variantComponentName}',\n${components} template: \\`${fullTemplate}\\`,\n};\n`;\n}\n","/**\n * Resolve which component an art file demonstrates, and under what tag.\n *\n * Shared by the art module and by the per-variant SFC compiler (#3857) so both\n * agree on the import path, the tag `<Self>` expands to, and the binding name.\n * The parsed `<script setup>` is passed in rather than parsed here, so this\n * module does not have to import back from `art-module.ts`.\n */\n\nimport path from \"node:path\";\n\nimport { allowedSourceRoots, resolveComponentSourcePath } from \"./component-source.js\";\nimport type { ArtFileInfo } from \"./types/index.js\";\nimport { toPascalCase } from \"./utils.js\";\n\nexport type ArtScriptSetupInfo = {\n defineArtComponentName?: string;\n defineArtComponentSource?: string;\n} | null;\n\nexport type ResolvedArtComponent = {\n componentImportPath?: string;\n componentTagName?: string;\n componentBindingName: string;\n};\n\nexport function componentNameFromSource(source: string): string {\n const withoutQuery = source.split(/[?#]/, 1)[0] || source;\n const filename = path.basename(withoutQuery);\n const extension = path.extname(filename);\n const stem = extension ? filename.slice(0, -extension.length) : filename;\n const name = toPascalCase(stem);\n return name === \"Variant\" ? \"MuseaComponent\" : name;\n}\n\nexport function resolveArtComponent(\n art: ArtFileInfo,\n filePath: string,\n scriptSetup: ArtScriptSetupInfo,\n options: { root?: string; scanRoots?: string[] } = {},\n): ResolvedArtComponent {\n let componentImportPath: string | undefined;\n let componentTagName: string | undefined;\n let componentBindingName = \"__MuseaComponent\";\n const defineArtComponentName = scriptSetup?.defineArtComponentName;\n const defineArtComponentSource = scriptSetup?.defineArtComponentSource;\n\n if (art.isInline && art.componentPath) {\n // Inline art: import the host .vue file itself as the component\n componentImportPath = options.root\n ? (resolveComponentSourcePath(\n art,\n filePath,\n allowedSourceRoots(options.root, options.scanRoots ?? []),\n ) ?? undefined)\n : art.componentPath;\n componentTagName = \"MuseaComponent\";\n } else if (defineArtComponentSource || art.metadata.component) {\n // .art.vue: resolve component from defineArt(source, ...) or the legacy component attribute.\n const componentSource = defineArtComponentSource ?? art.metadata.component;\n if (componentSource) {\n const sourceArt =\n componentSource === art.metadata.component\n ? art\n : { ...art, metadata: { ...art.metadata, component: componentSource } };\n componentImportPath = options.root\n ? (resolveComponentSourcePath(\n sourceArt,\n filePath,\n allowedSourceRoots(options.root, options.scanRoots ?? []),\n ) ?? undefined)\n : path.isAbsolute(componentSource)\n ? componentSource\n : path.resolve(path.dirname(filePath), componentSource);\n }\n componentTagName =\n defineArtComponentName ??\n (art.metadata.component ? componentNameFromSource(art.metadata.component) : \"MuseaComponent\");\n componentBindingName = componentTagName;\n }\n\n return { componentImportPath, componentTagName, componentBindingName };\n}\n\n/** Expand `<Self>` in a variant template to the resolved component tag. */\nexport function expandSelfTag(template: string, componentTagName: string | undefined): string {\n if (!componentTagName) return template;\n // Match the complete tag name only, so `<Selfish>` and `<Self-Preview>` are\n // left alone while `<Self>`, `<Self />`, and `<Self ...>` expand.\n return template\n .replace(/<Self(?=[\\s/>])/g, `<${componentTagName}`)\n .replace(/<\\/Self\\s*>/g, `</${componentTagName}>`);\n}\n","/**\n * Art module generation for Musea.\n *\n * Generates the virtual ES modules that represent parsed `.art.vue` files,\n * including variant component definitions and script setup handling.\n */\n\nimport path from \"node:path\";\n\nimport { allowedSourceRoots, resolveComponentSourcePath } from \"./component-source.js\";\nimport type { ArtFileInfo } from \"./types/index.js\";\nimport { toPascalCase } from \"./utils.js\";\nimport { emitLegacyVariant } from \"./art-module-vue2.js\";\nimport { expandSelfTag } from \"./art-component.js\";\n\n/**\n * Extract the content of the first <script setup> block from a Vue SFC source.\n */\nexport function extractScriptSetupContent(source: string): string | undefined {\n const match = source.match(/<script\\s+[^>]*setup[^>]*>([\\s\\S]*?)<\\/script>/);\n return match?.[1]?.trim();\n}\n\nexport function extractScriptSetupIsolated(source: string): boolean {\n const match = source.match(/<script\\s+([^>]*)\\bsetup\\b([^>]*)>/);\n if (!match) return true;\n const attrs = `${match[1] ?? \"\"} ${match[2] ?? \"\"}`;\n const isolate = attrs.match(/\\bisolate\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]+))/);\n return (isolate?.[1] ?? isolate?.[2] ?? isolate?.[3]) !== \"false\";\n}\n\nfunction resolveRelativeSpecifier(specifier: string, artDir: string): string {\n if (!specifier.startsWith(\".\")) {\n return specifier;\n }\n\n return path.resolve(artDir, specifier);\n}\n\nexport function rewriteRelativeImportStatement(statement: string, artDir: string): string {\n const rewrittenFromImports = statement.replace(\n /\\bfrom\\s+(['\"])([^'\"]+)\\1/g,\n (_match, quote: string, specifier: string) =>\n `from ${quote}${resolveRelativeSpecifier(specifier, artDir)}${quote}`,\n );\n\n return rewrittenFromImports.replace(\n /^(\\s*import\\s+)(['\"])([^'\"]+)\\2(\\s*;?\\s*)$/s,\n (_match, prefix: string, quote: string, specifier: string, suffix: string) =>\n `${prefix}${quote}${resolveRelativeSpecifier(specifier, artDir)}${quote}${suffix}`,\n );\n}\n\nfunction countCharBalance(source: string, openChar: string, closeChar: string): number {\n let balance = 0;\n for (const char of source) {\n if (char === openChar) balance++;\n else if (char === closeChar) balance--;\n }\n return balance;\n}\n\nfunction isCompleteImportStatement(statement: string): boolean {\n const trimmed = statement.trim();\n if (!trimmed.startsWith(\"import \")) {\n return false;\n }\n\n if (countCharBalance(statement, \"{\", \"}\") > 0) {\n return false;\n }\n\n return (\n /^import\\s+[\\s\\S]+?\\s+from\\s+['\"][^'\"]+['\"]\\s*;?$/s.test(trimmed) ||\n /^import\\s+['\"][^'\"]+['\"]\\s*;?$/s.test(trimmed)\n );\n}\n\nfunction splitTopLevelCommaList(source: string): string[] {\n const parts: string[] = [];\n let current = \"\";\n let braceDepth = 0;\n let bracketDepth = 0;\n let parenDepth = 0;\n\n for (const char of source) {\n if (char === \",\" && braceDepth === 0 && bracketDepth === 0 && parenDepth === 0) {\n const trimmed = current.trim();\n if (trimmed) {\n parts.push(trimmed);\n }\n current = \"\";\n continue;\n }\n\n current += char;\n\n if (char === \"{\") braceDepth++;\n else if (char === \"}\") braceDepth--;\n else if (char === \"[\") bracketDepth++;\n else if (char === \"]\") bracketDepth--;\n else if (char === \"(\") parenDepth++;\n else if (char === \")\") parenDepth--;\n }\n\n const trimmed = current.trim();\n if (trimmed) {\n parts.push(trimmed);\n }\n\n return parts;\n}\n\nfunction collectImportedNames(statement: string, returnNames: Set<string>): void {\n const normalized = statement.replace(/\\s+/g, \" \").trim().replace(/;$/, \"\");\n const fromMatch = normalized.match(/^import\\s+(type\\s+)?(.+?)\\s+from\\s+['\"][^'\"]+['\"]$/);\n\n if (!fromMatch) {\n return;\n }\n\n if (fromMatch[1]) {\n return;\n }\n\n const specifiers = fromMatch[2].trim();\n const specifierParts = splitTopLevelCommaList(specifiers);\n const defaultOrNamespace = specifierParts[0]?.trim() ?? \"\";\n const trailing = specifierParts.slice(1).join(\", \").trim();\n\n if (defaultOrNamespace && !defaultOrNamespace.startsWith(\"{\")) {\n const namespaceMatch = defaultOrNamespace.match(/^\\*\\s+as\\s+([A-Za-z_$][\\w$]*)$/);\n if (namespaceMatch) {\n returnNames.add(namespaceMatch[1]);\n } else if (!defaultOrNamespace.startsWith(\"type \")) {\n returnNames.add(defaultOrNamespace);\n }\n }\n\n const namedBlock = defaultOrNamespace.startsWith(\"{\")\n ? defaultOrNamespace\n : trailing.startsWith(\"{\")\n ? trailing\n : \"\";\n\n if (!namedBlock) {\n return;\n }\n\n const namedContent = namedBlock.slice(1, -1);\n for (const part of splitTopLevelCommaList(namedContent)) {\n const trimmed = part.trim();\n if (!trimmed || trimmed.startsWith(\"type \")) {\n continue;\n }\n\n const alias = trimmed\n .split(/\\s+as\\s+/)\n .pop()\n ?.trim();\n if (alias) {\n returnNames.add(alias);\n }\n }\n}\n\nfunction importDeclaresName(statement: string, name: string): boolean {\n const names = new Set<string>();\n collectImportedNames(statement, names);\n return names.has(name);\n}\n\nfunction collectObjectDestructuredNames(statement: string, returnNames: Set<string>): void {\n const match = statement.match(/^(?:export\\s+)?(?:const|let|var)\\s+\\{([\\s\\S]*?)\\}\\s*=/);\n if (!match) {\n return;\n }\n\n for (const part of splitTopLevelCommaList(match[1])) {\n let name = part.trim();\n if (!name) {\n continue;\n }\n\n if (name.startsWith(\"...\")) {\n name = name.slice(3).trim();\n } else if (name.includes(\":\")) {\n name = name.split(\":\").pop()!.trim();\n } else if (name.includes(\"=\")) {\n name = name.split(\"=\")[0].trim();\n }\n\n if (name.includes(\"=\")) {\n name = name.split(\"=\")[0].trim();\n }\n\n if (/^[A-Za-z_$][\\w$]*$/.test(name)) {\n returnNames.add(name);\n }\n }\n}\n\nfunction collectArrayDestructuredNames(statement: string, returnNames: Set<string>): void {\n const match = statement.match(/^(?:export\\s+)?(?:const|let|var)\\s+\\[([\\s\\S]*?)\\]\\s*=/);\n if (!match) {\n return;\n }\n\n for (const part of splitTopLevelCommaList(match[1])) {\n let name = part.trim();\n if (!name) {\n continue;\n }\n\n if (name.startsWith(\"...\")) {\n name = name.slice(3).trim();\n }\n\n if (name.includes(\"=\")) {\n name = name.split(\"=\")[0].trim();\n }\n\n if (/^[A-Za-z_$][\\w$]*$/.test(name)) {\n returnNames.add(name);\n }\n }\n}\n\nfunction collectTopLevelReturnNames(setupBody: string[], returnNames: Set<string>): void {\n let braceDepth = 0;\n\n for (let i = 0; i < setupBody.length; i++) {\n const line = setupBody[i];\n const trimmed = line.trim();\n\n if (braceDepth === 0) {\n if (/^(?:export\\s+)?(?:const|let|var)\\s+\\{/.test(trimmed)) {\n const statementLines = [line];\n let balance =\n countCharBalance(line, \"{\", \"}\") +\n countCharBalance(line, \"[\", \"]\") +\n countCharBalance(line, \"(\", \")\");\n\n while (balance > 0 && i + 1 < setupBody.length) {\n i++;\n statementLines.push(setupBody[i]);\n balance +=\n countCharBalance(setupBody[i], \"{\", \"}\") +\n countCharBalance(setupBody[i], \"[\", \"]\") +\n countCharBalance(setupBody[i], \"(\", \")\");\n }\n\n collectObjectDestructuredNames(statementLines.join(\"\\n\"), returnNames);\n continue;\n }\n\n if (/^(?:export\\s+)?(?:const|let|var)\\s+\\[/.test(trimmed)) {\n const statementLines = [line];\n let balance =\n countCharBalance(line, \"{\", \"}\") +\n countCharBalance(line, \"[\", \"]\") +\n countCharBalance(line, \"(\", \")\");\n\n while (balance > 0 && i + 1 < setupBody.length) {\n i++;\n statementLines.push(setupBody[i]);\n balance +=\n countCharBalance(setupBody[i], \"{\", \"}\") +\n countCharBalance(setupBody[i], \"[\", \"]\") +\n countCharBalance(setupBody[i], \"(\", \")\");\n }\n\n collectArrayDestructuredNames(statementLines.join(\"\\n\"), returnNames);\n continue;\n }\n\n const constMatch = trimmed.match(/^(?:export\\s+)?(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)/);\n if (constMatch) {\n returnNames.add(constMatch[1]);\n }\n\n const functionMatch = trimmed.match(\n /^(?:export\\s+)?(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)\\s*\\(/,\n );\n if (functionMatch) {\n returnNames.add(functionMatch[1]);\n }\n\n const classMatch = trimmed.match(/^(?:export\\s+)?class\\s+([A-Za-z_$][\\w$]*)\\b/);\n if (classMatch) {\n returnNames.add(classMatch[1]);\n }\n }\n\n braceDepth += countCharBalance(line, \"{\", \"}\");\n }\n}\n\n/**\n * Parse script setup content into imports and setup body.\n * Returns the import lines, setup body lines, and all identifiers to expose.\n */\nexport function parseScriptSetupForArt(content: string): {\n imports: string[];\n setupBody: string[];\n returnNames: string[];\n defineArtComponentName?: string;\n defineArtComponentSource?: string;\n} {\n const lines = content.split(\"\\n\");\n const imports: string[] = [];\n const setupBody: string[] = [];\n const returnNames: Set<string> = new Set();\n let currentImport: string[] | null = null;\n const defineArtComponent = extractDefineArtComponent(content);\n let defineArtBalance = 0;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (defineArtBalance > 0) {\n defineArtBalance += countCharBalance(line, \"(\", \")\");\n continue;\n }\n\n if (currentImport) {\n currentImport.push(line);\n const statement = currentImport.join(\"\\n\");\n if (isCompleteImportStatement(statement)) {\n imports.push(statement);\n collectImportedNames(statement, returnNames);\n currentImport = null;\n }\n continue;\n }\n\n if (trimmed.startsWith(\"import \")) {\n currentImport = [line];\n const statement = currentImport.join(\"\\n\");\n if (isCompleteImportStatement(statement)) {\n imports.push(statement);\n collectImportedNames(statement, returnNames);\n currentImport = null;\n }\n continue;\n }\n\n if (isDefineArtLine(trimmed)) {\n defineArtBalance = Math.max(0, countCharBalance(line, \"(\", \")\"));\n continue;\n }\n\n setupBody.push(line);\n }\n\n if (currentImport) {\n const statement = currentImport.join(\"\\n\");\n imports.push(statement);\n collectImportedNames(statement, returnNames);\n }\n\n collectTopLevelReturnNames(setupBody, returnNames);\n\n // Remove 'type' keyword imports and common Vue utilities that shouldn't be returned\n returnNames.delete(\"type\");\n if (defineArtComponent.name) {\n returnNames.delete(defineArtComponent.name);\n }\n\n return {\n imports,\n setupBody,\n returnNames: [...returnNames],\n defineArtComponentName: defineArtComponent.name,\n defineArtComponentSource: defineArtComponent.source,\n };\n}\n\nfunction extractDefineArtComponent(content: string): { name?: string; source?: string } {\n const sourceMatch = content.match(/\\bdefineArt\\s*\\(\\s*(['\"])([^'\"]+)\\1/);\n if (sourceMatch) {\n return {\n name: componentNameFromSource(sourceMatch[2]),\n source: sourceMatch[2],\n };\n }\n\n const identifierMatch = content.match(/\\bdefineArt\\s*\\(\\s*([A-Za-z_$][\\w$]*)/);\n return { name: identifierMatch?.[1] };\n}\n\nfunction componentNameFromSource(source: string): string {\n const withoutQuery = source.split(/[?#]/, 1)[0] || source;\n const filename = path.basename(withoutQuery);\n const extension = path.extname(filename);\n const stem = extension ? filename.slice(0, -extension.length) : filename;\n const name = toPascalCase(stem);\n return name === \"Variant\" ? \"MuseaComponent\" : name;\n}\n\nfunction isDefineArtLine(trimmed: string): boolean {\n return /\\bdefineArt\\s*\\(/.test(trimmed);\n}\n\ninterface GenerateArtModuleOptions {\n /** Legacy galleries keep runtime-compiled templates; see the Vue 2 branch below. */\n vueVersion?: 2 | 3;\n root?: string;\n scanRoots?: string[];\n}\n\nexport function generateArtModule(\n art: ArtFileInfo,\n filePath: string,\n options: GenerateArtModuleOptions = {},\n): string {\n let componentImportPath: string | undefined;\n let componentTagName: string | undefined;\n let componentBindingName = \"__MuseaComponent\";\n const scriptSetup = art.scriptSetupContent\n ? parseScriptSetupForArt(art.scriptSetupContent)\n : null;\n const defineArtComponentName = scriptSetup?.defineArtComponentName;\n const defineArtComponentSource = scriptSetup?.defineArtComponentSource;\n\n if (art.isInline && art.componentPath) {\n // Inline art: import the host .vue file itself as the component\n componentImportPath = options.root\n ? (resolveComponentSourcePath(\n art,\n filePath,\n allowedSourceRoots(options.root, options.scanRoots ?? []),\n ) ?? undefined)\n : art.componentPath;\n componentTagName = \"MuseaComponent\";\n } else if (defineArtComponentSource || art.metadata.component) {\n // .art.vue: resolve component from defineArt(source, ...) or the legacy component attribute.\n const componentSource = defineArtComponentSource ?? art.metadata.component;\n if (componentSource) {\n const sourceArt =\n componentSource === art.metadata.component\n ? art\n : { ...art, metadata: { ...art.metadata, component: componentSource } };\n componentImportPath = options.root\n ? (resolveComponentSourcePath(\n sourceArt,\n filePath,\n allowedSourceRoots(options.root, options.scanRoots ?? []),\n ) ?? undefined)\n : path.isAbsolute(componentSource)\n ? componentSource\n : path.resolve(path.dirname(filePath), componentSource);\n }\n componentTagName =\n defineArtComponentName ??\n (art.metadata.component ? componentNameFromSource(art.metadata.component) : \"MuseaComponent\");\n componentBindingName = componentTagName;\n }\n\n const hasSetupBody = scriptSetup?.setupBody.some((line) => line.trim().length > 0) ?? false;\n const hasSetup = !!scriptSetup && (hasSetupBody || scriptSetup.returnNames.length > 0);\n\n let code = `\n// Auto-generated module for: ${path.basename(filePath)}\n`;\n\n // Vue 2 variants stay runtime-compiled (see art-module-vue2.ts), and only a\n // variant with a setup block is wrapped in `defineComponent`, a Vue 2.7+\n // export that therefore stays unimported otherwise. The alias keeps it from\n // colliding with an art file that imports `defineComponent` itself.\n if (options.vueVersion === 2 && hasSetup) {\n code += `import { defineComponent as __museaDefineComponent } from 'vue';\\n`;\n }\n\n // Add script setup imports at module level\n // Resolve relative paths to absolute since this code runs inside a virtual module\n if (scriptSetup) {\n const artDir = path.dirname(filePath);\n for (const imp of scriptSetup.imports) {\n const resolved = rewriteRelativeImportStatement(imp, artDir);\n code += `${resolved}\\n`;\n }\n }\n\n if (componentImportPath && componentTagName) {\n // Only add component import if not already imported by script setup\n const alreadyImported = scriptSetup?.imports.some((imp) =>\n importDeclaresName(imp, componentBindingName),\n );\n if (!alreadyImported) {\n code += `import ${componentBindingName} from ${JSON.stringify(componentImportPath)};\\n`;\n }\n code += `export const __component__ = ${componentBindingName};\\n`;\n }\n\n code += `\nexport const metadata = ${JSON.stringify(art.metadata)};\nexport const variants = ${JSON.stringify(art.variants)};\nexport const __styles__ = ${JSON.stringify(art.styleBlocks ?? [])};\n`;\n\n const setupReturn = `{ ${scriptSetup?.returnNames.join(\", \") ?? \"\"} }`;\n const isolatedSetup = art.scriptSetupIsolated !== false;\n\n if (scriptSetup && hasSetup && !isolatedSetup) {\n code += `\nconst __museaSharedSetup = (() => {\n${scriptSetup.setupBody.join(\"\\n\")}\n return ${setupReturn};\n})();\n`;\n }\n\n // Generate variant components\n for (const variant of art.variants) {\n const variantComponentName = toPascalCase(variant.name);\n\n // Replace <Self> with the actual component name (for inline art)\n const template = expandSelfTag(variant.template, componentTagName);\n\n // Vue 2 keeps the runtime-compiled `template:` string; see art-module-vue2.ts (#3857).\n if (options.vueVersion === 2) {\n code += emitLegacyVariant({\n variantComponentName,\n variantName: variant.name,\n template,\n componentTagName,\n componentBindingName,\n scriptSetup,\n hasSetup,\n isolatedSetup,\n setupReturn,\n importDeclaresName,\n });\n continue;\n }\n\n // Each variant is compiled through the SFC pipeline in its own virtual\n // module (#3857): `compileSfc` emits a complete module with its own default\n // export, so it cannot be inlined here, and only that pipeline strips the\n // TypeScript in template expressions and resolves bindings correctly.\n // Variant names are free-form author text, so encode the name to keep the\n // path/name delimiter unambiguous for the resolver, which splits on the last\n // colon. A name containing one would otherwise move the split point and the\n // art path would never match.\n const variantModuleId = `virtual:musea-variant:${filePath}:${encodeURIComponent(variant.name)}`;\n code += `\nimport ${variantComponentName} from ${JSON.stringify(variantModuleId)};\nexport { ${variantComponentName} };\n`;\n }\n\n // Default export\n const defaultVariant = art.variants.find((v) => v.isDefault) || art.variants[0];\n if (defaultVariant) {\n code += `\nexport default ${toPascalCase(defaultVariant.name)};\n`;\n }\n\n return code;\n}\n","import { createHash } from \"node:crypto\";\n\nexport function artScopeAttribute(filePath: string): string {\n const hash = createHash(\"sha256\").update(filePath).digest(\"hex\").slice(0, 8);\n return `data-v-${hash}`;\n}\n\nexport function stampScopeAttribute(template: string, scopeAttr: string): string {\n return template.replace(/<([A-Za-z][\\w:.-]*)([^<>]*?)>/g, (match, tag: string, rest: string) => {\n if (rest.includes(scopeAttr)) return match;\n const selfClosing = /\\/\\s*$/.test(rest);\n const attrs = selfClosing ? rest.replace(/\\/\\s*$/, \"\").trimEnd() : rest.trimEnd();\n const gap = attrs.length > 0 && !attrs.startsWith(\" \") && !attrs.startsWith(\"\\n\") ? \" \" : \"\";\n const body = `${gap}${attrs}`.trimEnd();\n return `<${tag}${body} ${scopeAttr}${selfClosing ? \" /\" : \"\"}>`;\n });\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport { extractScriptSetupContent, extractScriptSetupIsolated } from \"../art-module.js\";\nimport { artScopeAttribute, stampScopeAttribute } from \"../art-style.js\";\nimport { loadNative } from \"../native-loader.js\";\nimport type { NativeBinding } from \"../native-loader.js\";\nimport type { ArtFileInfo, ArtMetadata } from \"../types/index.js\";\n\nexport interface ArtProcessingContext {\n root: string;\n command: string;\n onError?: (message: string) => void;\n}\n\nfunction extractArtTagAttributes(source: string): Record<string, string | true> {\n const artTagMatch = source.match(/<art\\b([\\s\\S]*?)>/i);\n if (!artTagMatch) return {};\n\n const attributes: Record<string, string | true> = {};\n const attrPattern = /([^\\s=/>]+)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'))?/g;\n\n for (const match of artTagMatch[1].matchAll(attrPattern)) {\n const name = match[1];\n if (!name || name === \"/\") continue;\n attributes[name] = match[2] ?? match[3] ?? true;\n }\n\n return attributes;\n}\n\nfunction parseActionEvents(value: string | true | undefined): string[] | undefined {\n if (typeof value !== \"string\") return undefined;\n\n const events = value\n .split(\",\")\n .map((eventName) => eventName.trim().toLowerCase())\n .filter(Boolean);\n\n return events.length > 0 ? [...new Set(events)] : undefined;\n}\n\nfunction extractCustomArtMetadata(source: string): Pick<ArtMetadata, \"actionEvents\"> {\n const attrs = extractArtTagAttributes(source);\n const actionEvents = new Set(parseActionEvents(attrs[\"action-events\"]) ?? []);\n const captureMousemove = attrs[\"capture-mousemove\"];\n\n if (captureMousemove === true || captureMousemove === \"true\") {\n actionEvents.add(\"mousemove\");\n }\n\n return {\n actionEvents: actionEvents.size > 0 ? [...actionEvents] : undefined,\n };\n}\n\nfunction extractStyleBlocks(\n source: string,\n filePath: string,\n): { blocks: string[]; scopeAttr?: string } {\n const styles: Array<{ content: string; scoped: boolean }> = [];\n\n for (const match of source.matchAll(/<style\\b([^>]*)>([\\s\\S]*?)<\\/style>/gi)) {\n const attrs = match[1] ?? \"\";\n const content = match[2]?.trim();\n const lang = attrs.match(/\\blang\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1]?.toLowerCase();\n\n if (!content) continue;\n if (lang && lang !== \"css\") {\n console.warn(\n `[musea] ${filePath}: <style lang=\"${lang}\"> is not processed. Art styles are plain CSS.`,\n );\n continue;\n }\n\n styles.push({ content, scoped: /\\bscoped\\b/i.test(attrs) });\n }\n\n if (!styles.some((style) => style.scoped)) {\n return { blocks: styles.map((style) => style.content) };\n }\n\n const scopeAttr = artScopeAttribute(filePath);\n const scope = loadNative().scopeViteCssForPipeline;\n return {\n scopeAttr,\n blocks: styles.map((style) =>\n style.scoped && scope ? scope(style.content, scopeAttr) : style.content,\n ),\n };\n}\n\nfunction formatArtProcessingError(root: string, filePath: string, error: unknown): string {\n const detail =\n error instanceof Error\n ? error.message || error.name\n : error == null\n ? \"unknown error\"\n : stringifyUnknown(error);\n const relativePath = path.relative(root, filePath) || filePath;\n return `[musea] Failed to process ${relativePath}: ${detail}`;\n}\n\nfunction stringifyUnknown(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return value.toString();\n }\n try {\n return JSON.stringify(value) ?? \"unknown error\";\n } catch {\n return \"unknown error\";\n }\n}\n\nexport function reportArtStatusWarnings(\n binding: Pick<NativeBinding, \"parseArtStatusWarnings\">,\n source: string,\n filename: string,\n warn: (message: string) => void = console.warn,\n): void {\n const warnings = binding.parseArtStatusWarnings?.(source, { filename });\n if (warnings == null) return;\n for (const warning of warnings) {\n warn(`[musea] ${warning}`);\n }\n}\n\nexport async function processMuseaArtFile(\n filePath: string,\n ctx: ArtProcessingContext,\n): Promise<ArtFileInfo | null> {\n try {\n const source = await fs.promises.readFile(filePath, \"utf-8\");\n const binding = loadNative();\n const parsed = binding.parseArt(source, { filename: filePath });\n reportArtStatusWarnings(binding, source, filePath);\n const customMetadata = extractCustomArtMetadata(source);\n\n if (!parsed.variants || parsed.variants.length === 0) return null;\n\n const isInline = !filePath.endsWith(\".art.vue\");\n const styles = isInline ? { blocks: [] as string[] } : extractStyleBlocks(source, filePath);\n\n return {\n path: filePath,\n metadata: {\n title: parsed.metadata.title || (isInline ? path.basename(filePath, \".vue\") : \"\"),\n description: parsed.metadata.description,\n component: isInline ? undefined : parsed.metadata.component,\n category: parsed.metadata.category,\n tags: parsed.metadata.tags,\n status: parsed.metadata.status as \"draft\" | \"ready\" | \"deprecated\",\n order: parsed.metadata.order,\n actionEvents: customMetadata.actionEvents ?? parsed.metadata.actionEvents,\n },\n variants: parsed.variants.map((v) => ({\n name: v.name,\n template: styles.scopeAttr ? stampScopeAttribute(v.template, styles.scopeAttr) : v.template,\n isDefault: v.isDefault,\n skipVrt: v.skipVrt,\n })),\n hasScriptSetup: isInline ? false : parsed.hasScriptSetup,\n scriptSetupContent:\n !isInline && parsed.hasScriptSetup ? extractScriptSetupContent(source) : undefined,\n scriptSetupIsolated:\n !isInline && parsed.hasScriptSetup ? extractScriptSetupIsolated(source) : true,\n hasScript: parsed.hasScript,\n styleCount: parsed.styleCount,\n styleBlocks: styles.blocks,\n isInline,\n componentPath: isInline ? filePath : undefined,\n };\n } catch (error) {\n const message = formatArtProcessingError(ctx.root, filePath, error);\n if (ctx.command === \"build\") throw new Error(message);\n (ctx.onError ?? console.error)(message);\n return null;\n }\n}\n","import type { MuseaOptions } from \"../types/index.js\";\n\nconst MUSEA_OPTIONS_KEY = \"__vizeMuseaOptions\";\n\ntype MuseaPluginOptionsCarrier = {\n [MUSEA_OPTIONS_KEY]?: MuseaOptions;\n};\n\nexport function attachMuseaOptions<T extends object>(plugin: T, options: MuseaOptions): T {\n Object.defineProperty(plugin, MUSEA_OPTIONS_KEY, {\n configurable: false,\n enumerable: false,\n value: options,\n writable: false,\n });\n return plugin;\n}\n\nexport function readMuseaOptions(plugin: unknown): MuseaOptions | undefined {\n if (!plugin || typeof plugin !== \"object\") return undefined;\n return (plugin as MuseaPluginOptionsCarrier)[MUSEA_OPTIONS_KEY];\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { a as VrtOptions, n as CiConfig, r as ComparisonConfig, t as CaptureConfig } from "./vrt-
|
|
1
|
+
import { a as VrtOptions, n as CiConfig, r as ComparisonConfig, t as CaptureConfig } from "./vrt-3T_e4bJ3.mjs";
|
|
2
|
+
import { t as A11yOptions } from "./api-gMwahZKm.mjs";
|
|
2
3
|
|
|
3
4
|
//#region src/tokens/parser.d.ts
|
|
4
5
|
/**
|
|
@@ -146,6 +147,14 @@ interface MuseaVrtOptions extends VrtOptions {
|
|
|
146
147
|
capture?: CaptureConfig;
|
|
147
148
|
comparison?: ComparisonConfig;
|
|
148
149
|
ci?: CiConfig;
|
|
150
|
+
/**
|
|
151
|
+
* axe-core options for `musea-vrt --a11y`.
|
|
152
|
+
*
|
|
153
|
+
* Only path: `musea({ vrt: { a11y: { excludeRules, includeRules, level } } })`.
|
|
154
|
+
* The CLI passes this object to `MuseaA11yRunner`. `--a11y` still decides
|
|
155
|
+
* whether audits run.
|
|
156
|
+
*/
|
|
157
|
+
a11y?: A11yOptions;
|
|
149
158
|
}
|
|
150
159
|
/**
|
|
151
160
|
* Musea plugin options.
|
|
@@ -256,4 +265,4 @@ interface MuseaOptions {
|
|
|
256
265
|
}
|
|
257
266
|
//#endregion
|
|
258
267
|
export { MuseaTokenPreviewConfig as a, ResolvedTokenPreview as c, StyleDictionaryConfig as d, StyleDictionaryOutput as f, MuseaVrtOptions as i, resolveTokenPreview as l, parseTokens as m, MuseaTheme as n, MuseaTokenPreviewKind as o, TokenCategory as p, MuseaThemeColors as r, MuseaTokenPreviewRule as s, MuseaOptions as t, DesignToken as u };
|
|
259
|
-
//# sourceMappingURL=plugin-
|
|
268
|
+
//# sourceMappingURL=plugin-DkFXWcCD.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-DkFXWcCD.d.mts","names":[],"sources":["../src/tokens/parser.ts","../src/tokens/preview.ts","../src/types/plugin.ts"],"mappings":";;;;;;;;AAYA;;;;UAAiB,WAAA;EACf,KAAA;EACA,IAAA;EACA,WAAA;EACA,UAAA,GAAa,MAAM;EACnB,KAAA;EACA,UAAA;EACA,cAAA;AAAA;AAAc;AAMhB;;AANgB,UAMC,aAAA;EACf,IAAA;EACA,MAAA,EAAQ,MAAA,SAAe,WAAA;EACvB,aAAA,GAAgB,aAAA;AAAA;;;;UAMD,qBAAA;EACf,UAAA,EAAY,aAAa;EACzB,QAAA;IACE,IAAA;IACA,OAAA;IACA,WAAA;EAAA;AAAA;;;;UAOa,qBAAA;EAVf;;;EAcA,UAAA;EAXa;AAAA;AAOf;;EAUE,YAAA;EAW2B;;;;EAL3B,SAAA;EAKa;;AAAc;EAA3B,UAAA,GAAa,cAAc;AAAA;;;;KAMjB,cAAA,IAAkB,KAAA,EAAO,WAAA,EAAa,IAAA,eAAmB,WAAW;;;;iBAK1D,WAAA,CAAY,UAAA,WAAqB,OAAO,CAAC,aAAA;;;KC5EnD,qBAAA;AAAA,UAaK,qBAAA;EACf,IAAA,EAAM,qBAAqB;EAC3B,IAAA;EACA,YAAA;EACA,YAAA;EACA,qBAAA;AAAA;AAAA,UAGe,uBAAA;EDRf;;;;ECaA,KAAA,GAAQ,qBAAA;EDTR;ECWA,aAAA,GAAgB,qBAAqB;AAAA;AAAA,UAGtB,oBAAA;EACf,IAAA,EAAM,qBAAA;EACN,KAAA;EACA,SAAA;EACA,SAAA;IACE,IAAA;IACA,KAAA,GAAQ,WAAW;IACnB,KAAA;EAAA;AAAA;AAAA,UAIa,wBAAA;EACf,SAAA;EACA,KAAA,EAAO,WAAA;EACP,QAAA,GAAW,MAAA,SAAe,WAAA;EAC1B,MAAA,GAAS,uBAAA;AAAA;AAAA,iBASK,mBAAA,CAAoB,KAAA,EAAO,wBAAA,GAA2B,oBAAoB;;;KCrD9E,eAAA;AFQZ;;;;AAAA,UEFiB,gBAAA;EACf,SAAA;EACA,WAAA;EACA,UAAA;EACA,UAAA;EACA,MAAA;EACA,WAAA;EACA,cAAA;EACA,YAAA;EACA,IAAA;EACA,aAAA;EACA,SAAA;EACA,MAAA;EACA,YAAA;EACA,OAAA;EACA,KAAA;EACA,IAAA;EACA,OAAA;EACA,MAAA;AAAA;;;;UAMe,UAAA;EFNc;EEQ7B,IAAA;EFFe;EEIf,IAAA;;EAEA,MAAA,EAAQ,gBAAgB;AAAA;AAAA,UAGT,eAAA,SAAwB,UAAA;EACvC,OAAA,GAAU,aAAA;EACV,UAAA,GAAa,gBAAA;EACb,EAAA,GAAK,QAAA;EFPH;;AAAW;AAOf;;;;EESE,IAAA,GAAO,WAAA;AAAA;;;;UAMQ,YAAA;EFMY;AAM7B;;;EEPE,OAAA;EFOmC;;;;EEDnC,OAAA;EFC8E;AAKhF;;;EEAE,QAAA;EFAgC;;;;EEMhC,eAAA;;;;ADlFF;ECwFE,eAAA;;;ADxF+B;AAajC;;;ECmFE,SAAA;EDlFA;;;ECuFA,GAAA,GAAM,eAAA;EDpFN;;;AACqB;AAGvB;ECuFE,UAAA;;;;;EAMA,aAAA,GAAgB,uBAAA;EDtFA;;AAAqB;AAGvC;;;;;;;EC+FE,WAAA;ED3FA;;;;;;AAGO;AAIT;EC8FE,KAAA,iCAAsC,UAAA,GAAa,UAAA;;;;;;;;;;;EAYnD,UAAA;EDvGW;;;;;AACqB;AASlC;;;;ECyGE,YAAA;EDzGkC;;;AAAsD;EC+GxF,UAAA,GAAa,eAAA;;;AApKf;;;;AAA2B;EA6KzB,kBAAA;AAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { p as serializeScriptValue } from "./utils-DeMLVlNS.mjs";
|
|
2
2
|
//#region src/gallery/globals.ts
|
|
3
3
|
function generateGalleryGlobalsScript(globals) {
|
|
4
4
|
const parts = [`window.__MUSEA_BASE_PATH__=${serializeScriptValue(globals.basePath)};`];
|
|
@@ -286,4 +286,4 @@ function generateGalleryScript(basePath) {
|
|
|
286
286
|
//#endregion
|
|
287
287
|
export { generateGalleryGlobalsScript as a, generateDevGlobalsScript as i, generateGalleryScript as n, generateGalleryModule as r, generateGalleryBody as t };
|
|
288
288
|
|
|
289
|
-
//# sourceMappingURL=template-
|
|
289
|
+
//# sourceMappingURL=template-DDl7rsgo.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-DNhEgY8-.mjs","names":[],"sources":["../src/gallery/globals.ts","../src/gallery/module.ts","../src/gallery/template.ts"],"sourcesContent":["import { serializeScriptValue } from \"../security.js\";\nimport type { MuseaTokenPreviewConfig } from \"../tokens/preview.js\";\n\nexport interface MuseaGalleryGlobals {\n basePath: string;\n devSessionToken?: string;\n staticPreviews?: Record<string, Record<string, string>>;\n themeConfig?: { default: string; custom?: Record<string, unknown> };\n tokenPreviewConfig?: MuseaTokenPreviewConfig;\n}\n\nexport function generateGalleryGlobalsScript(globals: MuseaGalleryGlobals): string {\n const parts = [`window.__MUSEA_BASE_PATH__=${serializeScriptValue(globals.basePath)};`];\n if (globals.devSessionToken !== undefined) {\n parts.push(`window.__MUSEA_SESSION_TOKEN__=${serializeScriptValue(globals.devSessionToken)};`);\n }\n if (globals.staticPreviews !== undefined) {\n parts.push(\"window.__MUSEA_STATIC__=true;\");\n parts.push(`window.__MUSEA_STATIC_PREVIEWS__=${serializeScriptValue(globals.staticPreviews)};`);\n }\n if (globals.themeConfig) {\n parts.push(`window.__MUSEA_THEME_CONFIG__=${serializeScriptValue(globals.themeConfig)};`);\n }\n if (globals.tokenPreviewConfig) {\n parts.push(\n `window.__MUSEA_TOKEN_PREVIEWS__=${serializeScriptValue(globals.tokenPreviewConfig)};`,\n );\n }\n return parts.join(\"\");\n}\n\nexport function generateDevGlobalsScript(\n basePath: string,\n devSessionToken: string,\n themeConfig?: MuseaGalleryGlobals[\"themeConfig\"],\n tokenPreviewConfig?: MuseaTokenPreviewConfig,\n): string {\n return generateGalleryGlobalsScript({\n basePath,\n devSessionToken,\n themeConfig,\n tokenPreviewConfig,\n });\n}\n","import { serializeScriptValue } from \"../security.js\";\n\nexport function generateGalleryModule(basePath: string): string {\n return `\nexport const basePath = ${serializeScriptValue(basePath)};\nexport async function loadArts() {\n const res = await fetch(basePath + '/api/arts');\n return res.json();\n}\n`;\n}\n","/**\n * HTML structure and inline JS generation for the Musea gallery.\n *\n * Extracted from gallery.ts to keep file sizes manageable.\n */\n\nimport { serializeScriptValue } from \"../security.js\";\n\nfunction escapeHtmlAttribute(value: string): string {\n return value.replace(/[&<>\"']/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&\";\n case \"<\":\n return \"<\";\n case \">\":\n return \">\";\n case '\"':\n return \""\";\n case \"'\":\n return \"'\";\n default:\n return char;\n }\n });\n}\n\n/**\n * Generate the gallery HTML body (header, sidebar, content, and inline script).\n */\nexport function generateGalleryBody(basePath: string): string {\n const escapedBasePath = escapeHtmlAttribute(basePath);\n\n return `\n <header class=\"header\">\n <div class=\"header-left\">\n <a href=\"${escapedBasePath}\" class=\"logo\">\n <svg class=\"logo-svg\" width=\"32\" height=\"32\" viewBox=\"0 0 200 200\" fill=\"none\">\n <g transform=\"translate(30, 25) scale(1.2)\">\n <g transform=\"translate(15, 10) skewX(-15)\">\n <path d=\"M 65 0 L 40 60 L 70 20 L 65 0 Z\" fill=\"currentColor\"/>\n <path d=\"M 20 0 L 40 60 L 53 13 L 20 0 Z\" fill=\"currentColor\"/>\n </g>\n </g>\n <g transform=\"translate(110, 120)\">\n <line x1=\"5\" y1=\"10\" x2=\"5\" y2=\"50\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\"/>\n <line x1=\"60\" y1=\"10\" x2=\"60\" y2=\"50\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\"/>\n <path d=\"M 0 10 L 32.5 0 L 65 10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <rect x=\"15\" y=\"18\" width=\"14\" height=\"12\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" opacity=\"0.7\"/>\n <rect x=\"36\" y=\"18\" width=\"14\" height=\"12\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" opacity=\"0.7\"/>\n <rect x=\"23\" y=\"35\" width=\"18\" height=\"12\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" opacity=\"0.6\"/>\n </g>\n </svg>\n Musea\n </a>\n <span class=\"header-subtitle\">Component Gallery</span>\n </div>\n <div class=\"search-container\">\n <svg class=\"search-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\"/>\n </svg>\n <input type=\"text\" class=\"search-input\" placeholder=\"Search components...\" id=\"search\">\n </div>\n </header>\n\n <main class=\"main\">\n <aside class=\"sidebar\" id=\"sidebar\">\n <div class=\"loading\">\n <div class=\"loading-spinner\"></div>\n Loading...\n </div>\n </aside>\n <section class=\"content\" id=\"content\">\n <div class=\"empty-state\">\n <div class=\"empty-state-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n <path d=\"M4 5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5Z\"/>\n <path d=\"M4 13a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-6Z\"/>\n <path d=\"M16 13a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-6Z\"/>\n </svg>\n </div>\n <div class=\"empty-state-title\">Select a component</div>\n <div class=\"empty-state-text\">Choose a component from the sidebar to view its variants and documentation</div>\n </div>\n </section>\n </main>`;\n}\n\n/**\n * Generate the gallery inline script (SPA logic).\n */\nexport function generateGalleryScript(basePath: string): string {\n return `\n const basePath = ${serializeScriptValue(basePath)};\n let arts = [];\n let selectedArt = null;\n let searchQuery = '';\n\n async function loadArts() {\n try {\n const res = await fetch(basePath + '/api/arts');\n arts = await res.json();\n renderSidebar();\n } catch (e) {\n console.error('Failed to load arts:', e);\n document.getElementById('sidebar').innerHTML = '<div class=\"loading\">Failed to load</div>';\n }\n }\n\n function renderSidebar() {\n const sidebar = document.getElementById('sidebar');\n const categories = {};\n\n const filtered = searchQuery\n ? arts.filter(a => a.metadata.title.toLowerCase().includes(searchQuery.toLowerCase()))\n : arts;\n\n for (const art of filtered) {\n const cat = art.metadata.category || 'Components';\n if (!categories[cat]) categories[cat] = [];\n categories[cat].push(art);\n }\n\n if (Object.keys(categories).length === 0) {\n sidebar.innerHTML = '<div class=\"sidebar-section\"><div class=\"loading\">No components found</div></div>';\n return;\n }\n\n let html = '';\n for (const [category, items] of Object.entries(categories)) {\n const escapedCategory = escapeHtml(category);\n html += '<div class=\"sidebar-section\">';\n html += '<div class=\"category-header\" data-category=\"' + escapedCategory + '\">';\n html += '<svg class=\"category-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"m9 18 6-6-6-6\"/></svg>';\n html += '<span>' + escapedCategory + '</span>';\n html += '<span class=\"category-count\">' + items.length + '</span>';\n html += '</div>';\n html += '<ul class=\"art-list\" data-category=\"' + escapedCategory + '\">';\n for (const art of items) {\n const active = selectedArt?.path === art.path ? 'active' : '';\n const variantCount = art.variants?.length || 0;\n html += '<li class=\"art-item ' + active + '\" data-path=\"' + escapeHtml(art.path) + '\">';\n html += '<span>' + escapeHtml(art.metadata.title) + '</span>';\n html += '<span class=\"art-variant-count\">' + variantCount + ' variant' + (variantCount !== 1 ? 's' : '') + '</span>';\n html += '</li>';\n }\n html += '</ul>';\n html += '</div>';\n }\n\n sidebar.innerHTML = html;\n\n sidebar.querySelectorAll('.art-item').forEach(item => {\n item.addEventListener('click', () => {\n const artPath = item.dataset.path;\n selectedArt = arts.find(a => a.path === artPath);\n renderSidebar();\n renderContent();\n });\n });\n\n sidebar.querySelectorAll('.category-header').forEach(header => {\n header.addEventListener('click', () => {\n header.classList.toggle('collapsed');\n const list = header.parentElement?.querySelector('.art-list');\n if (list) list.style.display = header.classList.contains('collapsed') ? 'none' : 'block';\n });\n });\n }\n\n function renderContent() {\n const content = document.getElementById('content');\n if (!selectedArt) {\n content.innerHTML = \\`\n <div class=\"empty-state\">\n <div class=\"empty-state-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n <path d=\"M4 5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5Z\"/>\n <path d=\"M4 13a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-6Z\"/>\n <path d=\"M16 13a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-6Z\"/>\n </svg>\n </div>\n <div class=\"empty-state-title\">Select a component</div>\n <div class=\"empty-state-text\">Choose a component from the sidebar to view its variants</div>\n </div>\n \\`;\n return;\n }\n\n const meta = selectedArt.metadata;\n const tags = meta.tags || [];\n const variantCount = selectedArt.variants?.length || 0;\n\n let html = '<div class=\"content-inner\">';\n html += '<div class=\"content-header\">';\n html += '<h1 class=\"content-title\">' + escapeHtml(meta.title) + '</h1>';\n if (meta.description) {\n html += '<p class=\"content-description\">' + escapeHtml(meta.description) + '</p>';\n }\n html += '<div class=\"content-meta\">';\n html += '<span class=\"meta-tag\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"/></svg>' + variantCount + ' variant' + (variantCount !== 1 ? 's' : '') + '</span>';\n if (meta.category) {\n html += '<span class=\"meta-tag\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\"/></svg>' + escapeHtml(meta.category) + '</span>';\n }\n for (const tag of tags) {\n html += '<span class=\"meta-tag\">#' + escapeHtml(tag) + '</span>';\n }\n html += '</div>';\n html += '</div>';\n\n html += '<div class=\"gallery\">';\n for (const variant of selectedArt.variants) {\n const previewUrl = basePath + '/preview?art=' + encodeURIComponent(selectedArt.path) + '&variant=' + encodeURIComponent(variant.name);\n const escapedPreviewUrl = escapeHtml(previewUrl);\n\n html += '<div class=\"variant-card\">';\n html += '<div class=\"variant-preview\">';\n html += '<iframe src=\"' + escapedPreviewUrl + '\" loading=\"lazy\" title=\"' + escapeHtml(variant.name) + '\"></iframe>';\n html += '</div>';\n html += '<div class=\"variant-info\">';\n html += '<div>';\n html += '<span class=\"variant-name\">' + escapeHtml(variant.name) + '</span>';\n if (variant.isDefault) html += ' <span class=\"variant-badge\">Default</span>';\n html += '</div>';\n html += '<div class=\"variant-actions\">';\n html += '<button class=\"variant-action-btn\" title=\"Open in new tab\" data-preview-url=\"' + escapedPreviewUrl + '\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/><polyline points=\"15 3 21 3 21 9\"/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/></svg></button>';\n html += '</div>';\n html += '</div>';\n html += '</div>';\n }\n html += '</div>';\n html += '</div>';\n\n content.innerHTML = html;\n\n content.querySelectorAll('.variant-action-btn[data-preview-url]').forEach(button => {\n button.addEventListener('click', () => {\n const previewUrl = button.dataset.previewUrl;\n if (previewUrl) window.open(previewUrl, '_blank', 'noopener');\n });\n });\n }\n\n function escapeHtml(str) {\n if (!str) return '';\n return String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/'/g, ''');\n }\n\n // Search\n document.getElementById('search').addEventListener('input', (e) => {\n searchQuery = e.target.value;\n renderSidebar();\n });\n\n // Keyboard shortcut for search\n document.addEventListener('keydown', (e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault();\n document.getElementById('search').focus();\n }\n });\n\n loadArts();`;\n}\n"],"mappings":";;AAWA,SAAgB,6BAA6B,SAAsC;CACjF,MAAM,QAAQ,CAAC,8BAA8B,qBAAqB,QAAQ,QAAQ,EAAE,EAAE;CACtF,IAAI,QAAQ,oBAAoB,KAAA,GAC9B,MAAM,KAAK,kCAAkC,qBAAqB,QAAQ,eAAe,EAAE,EAAE;CAE/F,IAAI,QAAQ,mBAAmB,KAAA,GAAW;EACxC,MAAM,KAAK,+BAA+B;EAC1C,MAAM,KAAK,oCAAoC,qBAAqB,QAAQ,cAAc,EAAE,EAAE;CAChG;CACA,IAAI,QAAQ,aACV,MAAM,KAAK,iCAAiC,qBAAqB,QAAQ,WAAW,EAAE,EAAE;CAE1F,IAAI,QAAQ,oBACV,MAAM,KACJ,mCAAmC,qBAAqB,QAAQ,kBAAkB,EAAE,EACtF;CAEF,OAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAAgB,yBACd,UACA,iBACA,aACA,oBACQ;CACR,OAAO,6BAA6B;EAClC;EACA;EACA;EACA;CACF,CAAC;AACH;;;ACzCA,SAAgB,sBAAsB,UAA0B;CAC9D,OAAO;0BACiB,qBAAqB,QAAQ,EAAE;;;;;;AAMzD;;;;;;;;ACFA,SAAS,oBAAoB,OAAuB;CAClD,OAAO,MAAM,QAAQ,aAAa,SAAS;EACzC,QAAQ,MAAR;GACE,KAAK,KACH,OAAO;GACT,KAAK,KACH,OAAO;GACT,KAAK,KACH,OAAO;GACT,KAAK,MACH,OAAO;GACT,KAAK,KACH,OAAO;GACT,SACE,OAAO;EACX;CACF,CAAC;AACH;;;;AAKA,SAAgB,oBAAoB,UAA0B;CAG5D,OAAO;;;iBAFiB,oBAAoB,QAKf,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDjC;;;;AAKA,SAAgB,sBAAsB,UAA0B;CAC9D,OAAO;uBACc,qBAAqB,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0KtD"}
|
|
1
|
+
{"version":3,"file":"template-DDl7rsgo.mjs","names":[],"sources":["../src/gallery/globals.ts","../src/gallery/module.ts","../src/gallery/template.ts"],"sourcesContent":["import { serializeScriptValue } from \"../security.js\";\nimport type { MuseaTokenPreviewConfig } from \"../tokens/preview.js\";\n\nexport interface MuseaGalleryGlobals {\n basePath: string;\n devSessionToken?: string;\n staticPreviews?: Record<string, Record<string, string>>;\n themeConfig?: { default: string; custom?: Record<string, unknown> };\n tokenPreviewConfig?: MuseaTokenPreviewConfig;\n}\n\nexport function generateGalleryGlobalsScript(globals: MuseaGalleryGlobals): string {\n const parts = [`window.__MUSEA_BASE_PATH__=${serializeScriptValue(globals.basePath)};`];\n if (globals.devSessionToken !== undefined) {\n parts.push(`window.__MUSEA_SESSION_TOKEN__=${serializeScriptValue(globals.devSessionToken)};`);\n }\n if (globals.staticPreviews !== undefined) {\n parts.push(\"window.__MUSEA_STATIC__=true;\");\n parts.push(`window.__MUSEA_STATIC_PREVIEWS__=${serializeScriptValue(globals.staticPreviews)};`);\n }\n if (globals.themeConfig) {\n parts.push(`window.__MUSEA_THEME_CONFIG__=${serializeScriptValue(globals.themeConfig)};`);\n }\n if (globals.tokenPreviewConfig) {\n parts.push(\n `window.__MUSEA_TOKEN_PREVIEWS__=${serializeScriptValue(globals.tokenPreviewConfig)};`,\n );\n }\n return parts.join(\"\");\n}\n\nexport function generateDevGlobalsScript(\n basePath: string,\n devSessionToken: string,\n themeConfig?: MuseaGalleryGlobals[\"themeConfig\"],\n tokenPreviewConfig?: MuseaTokenPreviewConfig,\n): string {\n return generateGalleryGlobalsScript({\n basePath,\n devSessionToken,\n themeConfig,\n tokenPreviewConfig,\n });\n}\n","import { serializeScriptValue } from \"../security.js\";\n\nexport function generateGalleryModule(basePath: string): string {\n return `\nexport const basePath = ${serializeScriptValue(basePath)};\nexport async function loadArts() {\n const res = await fetch(basePath + '/api/arts');\n return res.json();\n}\n`;\n}\n","/**\n * HTML structure and inline JS generation for the Musea gallery.\n *\n * Extracted from gallery.ts to keep file sizes manageable.\n */\n\nimport { serializeScriptValue } from \"../security.js\";\n\nfunction escapeHtmlAttribute(value: string): string {\n return value.replace(/[&<>\"']/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&\";\n case \"<\":\n return \"<\";\n case \">\":\n return \">\";\n case '\"':\n return \""\";\n case \"'\":\n return \"'\";\n default:\n return char;\n }\n });\n}\n\n/**\n * Generate the gallery HTML body (header, sidebar, content, and inline script).\n */\nexport function generateGalleryBody(basePath: string): string {\n const escapedBasePath = escapeHtmlAttribute(basePath);\n\n return `\n <header class=\"header\">\n <div class=\"header-left\">\n <a href=\"${escapedBasePath}\" class=\"logo\">\n <svg class=\"logo-svg\" width=\"32\" height=\"32\" viewBox=\"0 0 200 200\" fill=\"none\">\n <g transform=\"translate(30, 25) scale(1.2)\">\n <g transform=\"translate(15, 10) skewX(-15)\">\n <path d=\"M 65 0 L 40 60 L 70 20 L 65 0 Z\" fill=\"currentColor\"/>\n <path d=\"M 20 0 L 40 60 L 53 13 L 20 0 Z\" fill=\"currentColor\"/>\n </g>\n </g>\n <g transform=\"translate(110, 120)\">\n <line x1=\"5\" y1=\"10\" x2=\"5\" y2=\"50\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\"/>\n <line x1=\"60\" y1=\"10\" x2=\"60\" y2=\"50\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\"/>\n <path d=\"M 0 10 L 32.5 0 L 65 10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <rect x=\"15\" y=\"18\" width=\"14\" height=\"12\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" opacity=\"0.7\"/>\n <rect x=\"36\" y=\"18\" width=\"14\" height=\"12\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" opacity=\"0.7\"/>\n <rect x=\"23\" y=\"35\" width=\"18\" height=\"12\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" opacity=\"0.6\"/>\n </g>\n </svg>\n Musea\n </a>\n <span class=\"header-subtitle\">Component Gallery</span>\n </div>\n <div class=\"search-container\">\n <svg class=\"search-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\"/>\n </svg>\n <input type=\"text\" class=\"search-input\" placeholder=\"Search components...\" id=\"search\">\n </div>\n </header>\n\n <main class=\"main\">\n <aside class=\"sidebar\" id=\"sidebar\">\n <div class=\"loading\">\n <div class=\"loading-spinner\"></div>\n Loading...\n </div>\n </aside>\n <section class=\"content\" id=\"content\">\n <div class=\"empty-state\">\n <div class=\"empty-state-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n <path d=\"M4 5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5Z\"/>\n <path d=\"M4 13a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-6Z\"/>\n <path d=\"M16 13a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-6Z\"/>\n </svg>\n </div>\n <div class=\"empty-state-title\">Select a component</div>\n <div class=\"empty-state-text\">Choose a component from the sidebar to view its variants and documentation</div>\n </div>\n </section>\n </main>`;\n}\n\n/**\n * Generate the gallery inline script (SPA logic).\n */\nexport function generateGalleryScript(basePath: string): string {\n return `\n const basePath = ${serializeScriptValue(basePath)};\n let arts = [];\n let selectedArt = null;\n let searchQuery = '';\n\n async function loadArts() {\n try {\n const res = await fetch(basePath + '/api/arts');\n arts = await res.json();\n renderSidebar();\n } catch (e) {\n console.error('Failed to load arts:', e);\n document.getElementById('sidebar').innerHTML = '<div class=\"loading\">Failed to load</div>';\n }\n }\n\n function renderSidebar() {\n const sidebar = document.getElementById('sidebar');\n const categories = {};\n\n const filtered = searchQuery\n ? arts.filter(a => a.metadata.title.toLowerCase().includes(searchQuery.toLowerCase()))\n : arts;\n\n for (const art of filtered) {\n const cat = art.metadata.category || 'Components';\n if (!categories[cat]) categories[cat] = [];\n categories[cat].push(art);\n }\n\n if (Object.keys(categories).length === 0) {\n sidebar.innerHTML = '<div class=\"sidebar-section\"><div class=\"loading\">No components found</div></div>';\n return;\n }\n\n let html = '';\n for (const [category, items] of Object.entries(categories)) {\n const escapedCategory = escapeHtml(category);\n html += '<div class=\"sidebar-section\">';\n html += '<div class=\"category-header\" data-category=\"' + escapedCategory + '\">';\n html += '<svg class=\"category-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"m9 18 6-6-6-6\"/></svg>';\n html += '<span>' + escapedCategory + '</span>';\n html += '<span class=\"category-count\">' + items.length + '</span>';\n html += '</div>';\n html += '<ul class=\"art-list\" data-category=\"' + escapedCategory + '\">';\n for (const art of items) {\n const active = selectedArt?.path === art.path ? 'active' : '';\n const variantCount = art.variants?.length || 0;\n html += '<li class=\"art-item ' + active + '\" data-path=\"' + escapeHtml(art.path) + '\">';\n html += '<span>' + escapeHtml(art.metadata.title) + '</span>';\n html += '<span class=\"art-variant-count\">' + variantCount + ' variant' + (variantCount !== 1 ? 's' : '') + '</span>';\n html += '</li>';\n }\n html += '</ul>';\n html += '</div>';\n }\n\n sidebar.innerHTML = html;\n\n sidebar.querySelectorAll('.art-item').forEach(item => {\n item.addEventListener('click', () => {\n const artPath = item.dataset.path;\n selectedArt = arts.find(a => a.path === artPath);\n renderSidebar();\n renderContent();\n });\n });\n\n sidebar.querySelectorAll('.category-header').forEach(header => {\n header.addEventListener('click', () => {\n header.classList.toggle('collapsed');\n const list = header.parentElement?.querySelector('.art-list');\n if (list) list.style.display = header.classList.contains('collapsed') ? 'none' : 'block';\n });\n });\n }\n\n function renderContent() {\n const content = document.getElementById('content');\n if (!selectedArt) {\n content.innerHTML = \\`\n <div class=\"empty-state\">\n <div class=\"empty-state-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n <path d=\"M4 5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5Z\"/>\n <path d=\"M4 13a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-6Z\"/>\n <path d=\"M16 13a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-6Z\"/>\n </svg>\n </div>\n <div class=\"empty-state-title\">Select a component</div>\n <div class=\"empty-state-text\">Choose a component from the sidebar to view its variants</div>\n </div>\n \\`;\n return;\n }\n\n const meta = selectedArt.metadata;\n const tags = meta.tags || [];\n const variantCount = selectedArt.variants?.length || 0;\n\n let html = '<div class=\"content-inner\">';\n html += '<div class=\"content-header\">';\n html += '<h1 class=\"content-title\">' + escapeHtml(meta.title) + '</h1>';\n if (meta.description) {\n html += '<p class=\"content-description\">' + escapeHtml(meta.description) + '</p>';\n }\n html += '<div class=\"content-meta\">';\n html += '<span class=\"meta-tag\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"/></svg>' + variantCount + ' variant' + (variantCount !== 1 ? 's' : '') + '</span>';\n if (meta.category) {\n html += '<span class=\"meta-tag\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\"/></svg>' + escapeHtml(meta.category) + '</span>';\n }\n for (const tag of tags) {\n html += '<span class=\"meta-tag\">#' + escapeHtml(tag) + '</span>';\n }\n html += '</div>';\n html += '</div>';\n\n html += '<div class=\"gallery\">';\n for (const variant of selectedArt.variants) {\n const previewUrl = basePath + '/preview?art=' + encodeURIComponent(selectedArt.path) + '&variant=' + encodeURIComponent(variant.name);\n const escapedPreviewUrl = escapeHtml(previewUrl);\n\n html += '<div class=\"variant-card\">';\n html += '<div class=\"variant-preview\">';\n html += '<iframe src=\"' + escapedPreviewUrl + '\" loading=\"lazy\" title=\"' + escapeHtml(variant.name) + '\"></iframe>';\n html += '</div>';\n html += '<div class=\"variant-info\">';\n html += '<div>';\n html += '<span class=\"variant-name\">' + escapeHtml(variant.name) + '</span>';\n if (variant.isDefault) html += ' <span class=\"variant-badge\">Default</span>';\n html += '</div>';\n html += '<div class=\"variant-actions\">';\n html += '<button class=\"variant-action-btn\" title=\"Open in new tab\" data-preview-url=\"' + escapedPreviewUrl + '\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/><polyline points=\"15 3 21 3 21 9\"/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/></svg></button>';\n html += '</div>';\n html += '</div>';\n html += '</div>';\n }\n html += '</div>';\n html += '</div>';\n\n content.innerHTML = html;\n\n content.querySelectorAll('.variant-action-btn[data-preview-url]').forEach(button => {\n button.addEventListener('click', () => {\n const previewUrl = button.dataset.previewUrl;\n if (previewUrl) window.open(previewUrl, '_blank', 'noopener');\n });\n });\n }\n\n function escapeHtml(str) {\n if (!str) return '';\n return String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/'/g, ''');\n }\n\n // Search\n document.getElementById('search').addEventListener('input', (e) => {\n searchQuery = e.target.value;\n renderSidebar();\n });\n\n // Keyboard shortcut for search\n document.addEventListener('keydown', (e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault();\n document.getElementById('search').focus();\n }\n });\n\n loadArts();`;\n}\n"],"mappings":";;AAWA,SAAgB,6BAA6B,SAAsC;CACjF,MAAM,QAAQ,CAAC,8BAA8B,qBAAqB,QAAQ,QAAQ,EAAE,EAAE;CACtF,IAAI,QAAQ,oBAAoB,KAAA,GAC9B,MAAM,KAAK,kCAAkC,qBAAqB,QAAQ,eAAe,EAAE,EAAE;CAE/F,IAAI,QAAQ,mBAAmB,KAAA,GAAW;EACxC,MAAM,KAAK,+BAA+B;EAC1C,MAAM,KAAK,oCAAoC,qBAAqB,QAAQ,cAAc,EAAE,EAAE;CAChG;CACA,IAAI,QAAQ,aACV,MAAM,KAAK,iCAAiC,qBAAqB,QAAQ,WAAW,EAAE,EAAE;CAE1F,IAAI,QAAQ,oBACV,MAAM,KACJ,mCAAmC,qBAAqB,QAAQ,kBAAkB,EAAE,EACtF;CAEF,OAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAAgB,yBACd,UACA,iBACA,aACA,oBACQ;CACR,OAAO,6BAA6B;EAClC;EACA;EACA;EACA;CACF,CAAC;AACH;;;ACzCA,SAAgB,sBAAsB,UAA0B;CAC9D,OAAO;0BACiB,qBAAqB,QAAQ,EAAE;;;;;;AAMzD;;;;;;;;ACFA,SAAS,oBAAoB,OAAuB;CAClD,OAAO,MAAM,QAAQ,aAAa,SAAS;EACzC,QAAQ,MAAR;GACE,KAAK,KACH,OAAO;GACT,KAAK,KACH,OAAO;GACT,KAAK,KACH,OAAO;GACT,KAAK,MACH,OAAO;GACT,KAAK,KACH,OAAO;GACT,SACE,OAAO;EACX;CACF,CAAC;AACH;;;;AAKA,SAAgB,oBAAoB,UAA0B;CAG5D,OAAO;;;iBAFiB,oBAAoB,QAKf,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDjC;;;;AAKA,SAAgB,sBAAsB,UAA0B;CAC9D,OAAO;uBACc,qBAAqB,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0KtD"}
|