vue-multiple-themes 6.0.1 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/vue-multiple-themes.cjs +4 -50
- package/dist/vue-multiple-themes.cjs.map +1 -1
- package/dist/vue-multiple-themes.d.ts +10 -28
- package/dist/vue-multiple-themes.js +4 -50
- package/dist/vue-multiple-themes.js.map +1 -1
- package/package.json +38 -15
- package/readme.md +43 -0
- package/src/composables/createBrandContext.test.ts +68 -0
- package/src/icons/index.ts +17 -83
- package/src/utils/color.test.ts +395 -0
- package/src/utils/css-injector.test.ts +132 -0
- package/src/utils/dom.test.ts +89 -0
- package/src/utils/generate-theme.test.ts +175 -0
|
@@ -829,58 +829,12 @@ function createBrandContext(defaults) {
|
|
|
829
829
|
}
|
|
830
830
|
};
|
|
831
831
|
}
|
|
832
|
-
const LUCIDE_ICONS = {
|
|
833
|
-
sun: {
|
|
834
|
-
path: "M12 3V4M12 20V21M4 12H3M6.31 6.31L5.5 5.5M17.69 6.31L18.5 5.5M6.31 17.69L5.5 18.5M17.69 17.69L18.5 18.5M21 12H20M16 12C16 14.21 14.21 16 12 16C9.79 16 8 14.21 8 12C8 9.79 9.79 8 12 8C14.21 8 16 9.79 16 12Z"
|
|
835
|
-
},
|
|
836
|
-
moon: {
|
|
837
|
-
path: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z"
|
|
838
|
-
},
|
|
839
|
-
sunset: {
|
|
840
|
-
path: "M17 18H17.01M3 18H5M19 18H21M12 2V4M4.22 10.22L5.64 11.64M18.36 11.64L19.78 10.22M12 6C9.24 6 7 8.24 7 11V18H17V11C17 8.24 14.76 6 12 6Z"
|
|
841
|
-
},
|
|
842
|
-
sunrise: {
|
|
843
|
-
path: "M17 18H17.01M3 18H5M19 18H21M12 2V4M4.22 10.22L5.64 11.64M18.36 11.64L19.78 10.22M12 10C10.34 10 9 11.34 9 13V18H15V13C15 11.34 13.66 10 12 10Z"
|
|
844
|
-
},
|
|
845
|
-
monitor: {
|
|
846
|
-
path: "M20 3H4a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h3l-1 4h6l-1-4h3a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2Z"
|
|
847
|
-
},
|
|
848
|
-
laptop: {
|
|
849
|
-
path: "M20 16V7a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v9M14 2H10M2 20h20"
|
|
850
|
-
},
|
|
851
|
-
coffee: {
|
|
852
|
-
path: "M18 8H19a2 2 0 0 1 0 4H18M2 8H18V19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8ZM6 2V5M10 2V5M14 2V5"
|
|
853
|
-
},
|
|
854
|
-
leaf: {
|
|
855
|
-
path: "M11 20A7 7 0 0 1 9.8 6.1C15.5 5 17 4.48 19 2C19 10 14 12 12.2 12.6A5.49 5.49 0 0 1 2 12C2 12 4 10 9 11.2M4 20C2 18 2 14 4 12"
|
|
856
|
-
},
|
|
857
|
-
droplets: {
|
|
858
|
-
path: "M7 16.3C5 14.3 5 11 7 9L12 3L17 9C19 11 19 14.3 17 16.3C15 18.3 12 18.3 10 17L7 16.3ZM5 20H19"
|
|
859
|
-
},
|
|
860
|
-
flame: {
|
|
861
|
-
path: "M8.5 14.5A2.5 2.5 0 0 0 11 12C11 9 7 7.5 7 7.5C7 7.5 5 11 5 13C5 15.76 7.24 18 10 18C13 18 14.5 15.24 14.5 13C14.5 10.76 12 7 12 7C12 7 8.5 9 8.5 14.5ZM12 22C16.97 22 21 17.97 21 13C21 8 15 2 15 2C15 2 14 9 11 9C8 9 7 2 7 2C7 2 3 8 3 13C3 17.97 7.03 22 12 22Z"
|
|
862
|
-
},
|
|
863
|
-
snowflake: {
|
|
864
|
-
path: "M2 12H22M12 2V22M20 16L4 8M4 16L20 8M17.66 6.34L6.34 17.66M6.34 6.34L17.66 17.66"
|
|
865
|
-
},
|
|
866
|
-
palette: {
|
|
867
|
-
path: "M12 2C6.48 2 2 6.48 2 12C2 15.31 3.7 18.23 6.24 20.1L6.17 20.17C5.53 20.55 5 21.22 5 22C5 22 8 21 12 21C16 21 19 22 19 22C19 21.22 18.47 20.55 17.83 20.17L17.76 20.1C20.3 18.23 22 15.31 22 12C22 6.48 17.52 2 12 2ZM8 13C7.45 13 7 12.55 7 12C7 11.45 7.45 11 8 11C8.55 11 9 11.45 9 12C9 12.55 8.55 13 8 13ZM12 9C11.45 9 11 8.55 11 8C11 7.45 11.45 7 12 7C12.55 7 13 7.45 13 8C13 8.55 12.55 9 12 9ZM16 13C15.45 13 15 12.55 15 12C15 11.45 15.45 11 16 11C16.55 11 17 11.45 17 12C17 12.55 16.55 13 16 13Z"
|
|
868
|
-
},
|
|
869
|
-
eye: {
|
|
870
|
-
path: "M1 12S5 4 12 4S23 12 23 12S19 20 12 20S1 12 1 12ZM12 15A3 3 0 1 0 12 9A3 3 0 0 0 12 15Z"
|
|
871
|
-
},
|
|
872
|
-
star: {
|
|
873
|
-
path: "M12 2L15.09 8.26L22 9.27L17 14.14L18.18 21.02L12 17.77L5.82 21.02L7 14.14L2 9.27L8.91 8.26L12 2Z"
|
|
874
|
-
},
|
|
875
|
-
zap: {
|
|
876
|
-
path: "M13 2L3 14H12L11 22L21 10H12L13 2Z"
|
|
877
|
-
}
|
|
878
|
-
};
|
|
832
|
+
const LUCIDE_ICONS = {};
|
|
879
833
|
function getIcon(_name) {
|
|
880
|
-
return
|
|
834
|
+
return void 0;
|
|
881
835
|
}
|
|
882
|
-
function iconToSvg(_name,
|
|
883
|
-
return
|
|
836
|
+
function iconToSvg(_name, _size, _color, _strokeWidth) {
|
|
837
|
+
return "";
|
|
884
838
|
}
|
|
885
839
|
function generateLightTheme(primaryHex, options = {}) {
|
|
886
840
|
const {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vue-multiple-themes.cjs","sources":["../src/utils/css-injector.ts","../src/utils/dom.ts","../src/components/VmtIcon.vue","../src/components/VueMultipleThemes.vue","../src/composables/useTheme.ts","../src/components/VmtThemePicker.vue","../src/plugin.ts","../src/composables/createBrandContext.ts","../src/icons/index.ts","../src/utils/generate-theme.ts","../src/themes/presets.ts"],"sourcesContent":["import type { ThemeDefinition, ThemeOptions } from '../types'\nimport { normalizeToRgbChannels } from './color'\n\nconst DEFAULT_STYLE_ID = 'vmt-theme-styles'\n\n/** Return the `<style>` element id for the given namespace. */\nexport function getStyleId(namespace?: string): string {\n return namespace ? `vmt-theme-styles-${namespace}` : DEFAULT_STYLE_ID\n}\n\n/**\n * Convert camelCase token names to kebab-case CSS variable segments.\n * e.g. \"primaryDark\" → \"primary-dark\"\n */\nexport function toKebab(str: string): string {\n return str.replace(/([A-Z])/g, (_, c: string) => `-${c.toLowerCase()}`)\n}\n\n/** Build a full CSS block string for all themes. */\nexport function buildCssVars(\n themes: ThemeDefinition[],\n options: Pick<ThemeOptions, 'strategy' | 'attribute' | 'classPrefix' | 'cssVarPrefix' | 'target' | 'namespace'>,\n): string {\n const {\n strategy = 'attribute',\n attribute = 'data-theme',\n classPrefix = 'theme-',\n cssVarPrefix = '--vmt-',\n target = 'html',\n } = options\n\n const rootSelector = target === 'html' ? ':root' : target\n\n function buildSelector(themeName: string, isDefault: boolean): string {\n const parts: string[] = []\n if (isDefault) parts.push(rootSelector)\n\n if (strategy === 'attribute' || strategy === 'both') {\n const base =\n target === 'html'\n ? `:root[${attribute}=\"${themeName}\"]`\n : `${target}[${attribute}=\"${themeName}\"]`\n if (!parts.includes(base)) parts.push(base)\n }\n\n if (strategy === 'class' || strategy === 'both') {\n const cls = `${classPrefix}${themeName}`\n const base = target === 'html' ? `:root.${cls}` : `${target}.${cls}`\n if (!parts.includes(base)) parts.push(base)\n }\n\n return parts.join(',\\n')\n }\n\n const blocks: string[] = []\n\n // Convenience icon-color variable on :root\n blocks.push(\n `${rootSelector} {\\n ${cssVarPrefix}icon-color: var(${cssVarPrefix}text, currentColor);\\n}`,\n )\n\n for (let i = 0; i < themes.length; i++) {\n const theme = themes[i]\n const selector = buildSelector(theme.name, i === 0)\n const vars = Object.entries(theme.colors)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => {\n const kebab = toKebab(k)\n const channels = normalizeToRgbChannels(v!)\n const lines: string[] = []\n // RGB channels for Tailwind opacity modifier support: bg-vmt-primary/50\n lines.push(` ${cssVarPrefix}${kebab}: ${channels};`)\n // Full rgb() color for direct CSS use: color: var(--vmt-primary-color)\n lines.push(` ${cssVarPrefix}${kebab}-color: rgb(${channels});`)\n return lines.join('\\n')\n })\n .join('\\n')\n blocks.push(`${selector} {\\n${vars}\\n}`)\n }\n\n return blocks.join('\\n\\n')\n}\n\n/** Inject (or update) a `<style>` tag with the generated CSS into `<head>`. */\nexport function injectStyles(css: string, namespace?: string): void {\n if (typeof document === 'undefined') return\n\n const id = getStyleId(namespace)\n let el = document.getElementById(id) as HTMLStyleElement | null\n if (!el) {\n el = document.createElement('style')\n el.id = id\n document.head.appendChild(el)\n }\n el.textContent = css\n}\n\n/** Remove the injected `<style>` tag. */\nexport function removeStyles(namespace?: string): void {\n if (typeof document === 'undefined') return\n document.getElementById(getStyleId(namespace))?.remove()\n}\n","import type { ThemeOptions, ThemeTarget } from '../types'\n\n/** Resolve the target DOM element. Returns null in SSR. */\nexport function resolveTarget(target: ThemeTarget = 'html'): Element | null {\n if (typeof document === 'undefined') return null\n if (target === 'html') return document.documentElement\n if (target === 'body') return document.body\n return document.querySelector(target)\n}\n\n/**\n * Apply a theme to the DOM by setting attributes and / or CSS classes\n * on the target element, and removing the previous ones.\n */\nexport function applyThemeToDom(\n name: string,\n previousName: string | null,\n options: Pick<ThemeOptions, 'strategy' | 'attribute' | 'classPrefix' | 'target'>,\n): void {\n const {\n strategy = 'attribute',\n attribute = 'data-theme',\n classPrefix = 'theme-',\n target = 'html',\n } = options\n\n const el = resolveTarget(target)\n if (!el) return\n\n if (strategy === 'attribute' || strategy === 'both') {\n el.setAttribute(attribute, name)\n }\n\n if (strategy === 'class' || strategy === 'both') {\n // Remove ALL theme classes (not just previousName) to handle stale classes\n // that may linger after a page refresh when previousName is null\n const toRemove = Array.from(el.classList).filter(\n (cls) => cls.startsWith(classPrefix) && cls !== `${classPrefix}${name}`,\n )\n for (const cls of toRemove) {\n el.classList.remove(cls)\n }\n el.classList.add(`${classPrefix}${name}`)\n }\n}\n\n/** Remove all theme markers from the DOM (cleanup). */\nexport function clearThemeFromDom(\n name: string,\n options: Pick<ThemeOptions, 'strategy' | 'attribute' | 'classPrefix' | 'target'>,\n): void {\n const {\n strategy = 'attribute',\n attribute = 'data-theme',\n classPrefix = 'theme-',\n target = 'html',\n } = options\n\n const el = resolveTarget(target)\n if (!el) return\n\n if (strategy === 'attribute' || strategy === 'both') {\n el.removeAttribute(attribute)\n }\n\n if (strategy === 'class' || strategy === 'both') {\n el.classList.remove(`${classPrefix}${name}`)\n }\n}\n\n/** Read / write from Web Storage, swallowing errors in private-browsing mode. */\nexport function readStorage(key: string, type: 'localStorage' | 'sessionStorage'): string | null {\n try {\n return window[type].getItem(key)\n } catch {\n return null\n }\n}\n\nexport function writeStorage(key: string, value: string, type: 'localStorage' | 'sessionStorage'): void {\n try {\n window[type].setItem(key, value)\n } catch {\n /* ignore */\n }\n}\n\n/** Returns 'dark' or 'light' based on OS preference (browser only). */\nexport function getSystemPreference(): 'dark' | 'light' {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n","<script setup lang=\"ts\">\n/**\n * VmtIcon.vue\n *\n * A thin sizing/color wrapper for any Vue icon component.\n * Works with lucide-vue-next, @heroicons/vue, @phosphor-icons/vue, etc.\n *\n * @example\n * import { Sun } from 'lucide-vue-next'\n * <VmtIcon :as=\"Sun\" :size=\"20\" />\n */\nimport type { Component } from 'vue'\n\nwithDefaults(\n defineProps<{\n /** Any Vue icon component (Lucide, Heroicons, Phosphor, etc.) */\n as: Component\n /** Icon size in pixels */\n size?: number\n /** Stroke / fill color — defaults to `currentColor` */\n color?: string\n /** Stroke width */\n strokeWidth?: number\n }>(),\n {\n size: 20,\n color: 'currentColor',\n strokeWidth: 2,\n },\n)\n</script>\n\n<template>\n <component\n :is=\"as\"\n :size=\"size\"\n :color=\"color\"\n :stroke-width=\"strokeWidth\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport {\n computed,\n onBeforeUnmount,\n onMounted,\n ref,\n watch,\n} from \"vue\";\nimport type { Component } from \"vue\";\nimport type {\n\tThemeDefinition,\n\tThemeStrategy,\n\tThemeTarget,\n} from \"../types\";\nimport {\n\tbuildCssVars,\n\tinjectStyles,\n\tremoveStyles,\n} from \"../utils/css-injector\";\nimport {\n\tapplyThemeToDom,\n getSystemPreference,\n\treadStorage,\n writeStorage,\n} from \"../utils/dom\";\nimport { normalizeToRgbChannels } from \"../utils/color\";\nimport VmtIcon from \"./VmtIcon.vue\";\n// VmtIcon is used in the #icon slot default when the theme has a Component icon\n\n// ── Ref-counted instance tracking (keyed by storageKey) ────────────────────\n// Prevents a navigating-away component from wiping the shared <style> tag\n// while other components (e.g. NavThemeSwitcher) are still mounted.\nconst _componentCounts = new Map<string, number>()\n\nconst props = withDefaults(defineProps<{\n /** All available theme definitions */\n themes?: ThemeDefinition[];\n /** Active theme on first render (default: first in `themes`) */\n defaultTheme?: string;\n /** How to stamp the theme on the DOM */\n strategy?: ThemeStrategy;\n /** Attribute name (default: `data-theme`) */\n attribute?: string;\n /** Class prefix (default: `theme-`) */\n classPrefix?: string;\n /** DOM element that receives the attribute / class */\n target?: ThemeTarget;\n /** CSS variable prefix (default: `--vmt-`) */\n cssVarPrefix?: string;\n /** Inject CSS variables automatically */\n injectCssVars?: boolean;\n /** Persist theme in storage */\n storage?: \"localStorage\" | \"sessionStorage\" | \"none\";\n /** Storage key for persistence */\n storageKey?: string;\n /** Respect OS dark/light preference on first load */\n respectSystemPreference?: boolean;\n /** Show the built-in toggle button */\n showToggle?: boolean;\n /** Show the label next to the icon */\n showLabel?: boolean;\n /** Size (px) of the toggle icon */\n iconSize?: number;\n /** Extra CSS classes on the root wrapper */\n extraClass?: string;\n}>(), {\n themes: () => [\n {\n name: \"light\",\n label: \"Light\",\n colors: {\n primary: \"#3b82f6\",\n secondary: \"#8b5cf6\",\n accent: \"#f59e0b\",\n background: \"#ffffff\",\n surface: \"#f8fafc\",\n surfaceElevated: \"#f1f5f9\",\n text: \"#111827\",\n textMuted: \"#6b7280\",\n textInverse: \"#ffffff\",\n border: \"#e5e7eb\",\n ring: \"#3b82f6\",\n success: \"#10b981\",\n warning: \"#f59e0b\",\n error: \"#ef4444\",\n info: \"#3b82f6\",\n },\n },\n {\n name: \"dark\",\n label: \"Dark\",\n colors: {\n primary: \"#60a5fa\",\n secondary: \"#a78bfa\",\n accent: \"#fbbf24\",\n background: \"#0f172a\",\n surface: \"#1e293b\",\n surfaceElevated: \"#334155\",\n text: \"#f8fafc\",\n textMuted: \"#94a3b8\",\n textInverse: \"#0f172a\",\n border: \"#334155\",\n ring: \"#60a5fa\",\n success: \"#34d399\",\n warning: \"#fbbf24\",\n error: \"#f87171\",\n info: \"#60a5fa\",\n },\n },\n {\n name: \"sepia\",\n label: \"Sepia\",\n colors: {\n primary: \"#92400e\",\n secondary: \"#78350f\",\n accent: \"#d97706\",\n background: \"#fdf6e3\",\n surface: \"#f5e9c9\",\n surfaceElevated: \"#ede0b5\",\n text: \"#3c2415\",\n textMuted: \"#78583d\",\n textInverse: \"#fdf6e3\",\n border: \"#d6b896\",\n ring: \"#92400e\",\n success: \"#166534\",\n warning: \"#92400e\",\n error: \"#991b1b\",\n info: \"#1e40af\",\n },\n },\n ],\n strategy: \"attribute\",\n attribute: \"data-theme\",\n classPrefix: \"theme-\",\n target: \"html\",\n cssVarPrefix: \"--vmt-\",\n injectCssVars: true,\n storage: \"localStorage\",\n storageKey: \"vmt-theme\",\n respectSystemPreference: false,\n showToggle: true,\n showLabel: false,\n iconSize: 20,\n extraClass: \"\",\n});\n\nconst emit = defineEmits<{\n (e: \"change\", theme: ThemeDefinition): void;\n}>();\n\n// ── Resolve initial theme ───────────────────────────────────────────\nfunction getInitial(): string {\n if (props.storage !== \"none\") {\n const stored = readStorage(\n props.storageKey,\n props.storage as \"localStorage\" | \"sessionStorage\",\n );\n if (\n stored &&\n props.themes.some((t: ThemeDefinition) => t.name === stored)\n )\n return stored;\n }\n\n if (props.respectSystemPreference) {\n const pref = getSystemPreference();\n const match = props.themes.find(\n (t: ThemeDefinition) => t.name === pref,\n );\n if (match) return match.name;\n }\n\n if (\n props.defaultTheme &&\n props.themes.some((t: ThemeDefinition) => t.name === props.defaultTheme)\n ) {\n return props.defaultTheme;\n }\n\n return props.themes[0]?.name ?? \"light\";\n}\n\nconst currentName = ref<string>(getInitial());\nlet previousName: string | null = null;\n\nconst currentTheme = computed<ThemeDefinition>(\n () =>\n props.themes.find(\n (t: ThemeDefinition) => t.name === currentName.value,\n ) ?? props.themes[0],\n);\n\nconst isDark = computed<boolean>(() => {\n const bg = currentTheme.value.colors.background;\n if (bg) {\n try {\n const channels = normalizeToRgbChannels(bg);\n const parts = channels.split(' ').map(Number);\n if (parts.length === 3 && parts.every((n) => !Number.isNaN(n))) {\n const [r, g, b] = parts.map((v) => {\n const c = v / 255;\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b < 0.5;\n }\n } catch { /* fall through */ }\n }\n return currentName.value.toLowerCase().includes(\"dark\");\n});\n\n/** Returns the icon Component from the current theme, or null. */\nconst currentIconComponent = computed<Component | null>(\n () => (currentTheme.value.icon ?? null) as Component | null,\n);\n\n// ── Apply to DOM ────────────────────────────────────────────────────\nfunction applyTheme(name: string) {\n applyThemeToDom(name, previousName, {\n strategy: props.strategy,\n attribute: props.attribute,\n classPrefix: props.classPrefix,\n target: props.target,\n });\n previousName = name;\n\n if (props.storage !== \"none\") {\n writeStorage(\n props.storageKey,\n name,\n props.storage as \"localStorage\" | \"sessionStorage\",\n );\n }\n\n emit(\"change\", currentTheme.value);\n}\n\n// ── Actions ─────────────────────────────────────────────────────────\nfunction setTheme(name: string) {\n if (!props.themes.some((t: ThemeDefinition) => t.name === name)) {\n console.warn(`[VueMultipleThemes] Unknown theme: \"${name}\"`);\n return;\n }\n currentName.value = name;\n}\n\nfunction nextTheme() {\n const idx = props.themes.findIndex(\n (t: ThemeDefinition) => t.name === currentName.value,\n );\n currentName.value = props.themes[(idx + 1) % props.themes.length].name;\n}\n\nfunction prevTheme() {\n const idx = props.themes.findIndex(\n (t: ThemeDefinition) => t.name === currentName.value,\n );\n currentName.value =\n props.themes[\n (idx - 1 + props.themes.length) % props.themes.length\n ].name;\n}\n\nfunction toggleTheme() {\n if (props.themes.length < 2) return;\n if (props.themes.length === 2) {\n // Classic two-theme toggle\n const other = props.themes.find(\n (t: ThemeDefinition) => t.name !== currentName.value,\n );\n if (other) currentName.value = other.name;\n } else {\n // 3+ themes: cycle to next\n nextTheme();\n }\n}\n\n// ── Lifecycle ────────────────────────────────────────────────────────\n// Apply immediately in browser context to prevent flash of wrong theme on refresh.\nfunction ensureStylesAndApply() {\n if (props.injectCssVars) {\n const css = buildCssVars(props.themes, {\n strategy: props.strategy,\n attribute: props.attribute,\n classPrefix: props.classPrefix,\n cssVarPrefix: props.cssVarPrefix,\n target: props.target,\n });\n injectStyles(css);\n }\n applyTheme(currentName.value);\n}\n\nlet appliedInSetup = false;\nif (typeof document !== \"undefined\") {\n ensureStylesAndApply();\n appliedInSetup = true;\n}\n\nonMounted(() => {\n if (!appliedInSetup) {\n ensureStylesAndApply();\n }\n});\n\nwatch(currentName, (name) => {\n applyTheme(name);\n});\n\n// ── Ref-counted cleanup ─────────────────────────────────────────────\n// Only remove the shared <style> tag when ALL instances using this\n// storageKey are unmounted. Mirrors the pattern in useTheme.ts.\nconst _key = props.storageKey;\n_componentCounts.set(_key, (_componentCounts.get(_key) ?? 0) + 1);\n\nonBeforeUnmount(() => {\n const count = (_componentCounts.get(_key) ?? 1) - 1;\n _componentCounts.set(_key, count);\n if (count <= 0) {\n _componentCounts.delete(_key);\n removeStyles();\n }\n});\n</script>\n\n<template>\n <div class=\"vmt-root\" :class=\"[extraClass, isDark ? 'vmt-dark' : 'vmt-light']\">\n <!-- Default slot: completely custom UI -->\n <slot :current=\"currentTheme\" :themes=\"themes\" :set-theme=\"setTheme\" :next-theme=\"nextTheme\"\n :prev-theme=\"prevTheme\" :toggle-theme=\"toggleTheme\" :is-dark=\"isDark\">\n <!-- Built-in toggle button (shown when no default slot is provided) -->\n <button v-if=\"showToggle\" class=\"vmt-toggle\"\n :aria-label=\"'Current theme: ' + currentTheme.label + '. Click to switch theme.'\"\n :title=\"currentTheme.label\" @click=\"nextTheme\">\n <!-- icon: pass a Component as theme.icon, or use the #icon slot -->\n <span v-if=\"currentIconComponent || $slots.icon\" class=\"vmt-icon\">\n <slot name=\"icon\" :icon=\"currentIconComponent\" :size=\"iconSize\" :theme=\"currentTheme\">\n <VmtIcon v-if=\"currentIconComponent\" :as=\"currentIconComponent\" :size=\"iconSize\" />\n </slot>\n </span>\n <!-- label -->\n <span v-if=\"showLabel\" class=\"vmt-label\">\n {{ currentTheme.label }}\n </span>\n </button>\n </slot>\n\n <!-- Picker slot: list of all themes -->\n <slot name=\"picker\" :current=\"currentTheme\" :themes=\"themes\" :set-theme=\"setTheme\" />\n </div>\n</template>\n\n<style>\n.vmt-root {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n position: relative;\n}\n\n.vmt-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.6rem;\n border-radius: 0.5rem;\n border: 1px solid var(--vmt-border, #e5e7eb);\n background: var(--vmt-surface-color, transparent);\n color: var(--vmt-text-color, inherit);\n cursor: pointer;\n transition: background 0.2s, border-color 0.2s;\n outline: none;\n}\n\n.vmt-toggle:hover {\n background: var(--vmt-surface-elevated-color, rgba(0, 0, 0, 0.05));\n}\n\n.vmt-toggle:focus-visible {\n outline: 2px solid var(--vmt-ring-color, #4f46e5);\n outline-offset: 2px;\n}\n\n.vmt-icon {\n display: inline-flex;\n align-items: center;\n color: var(--vmt-icon-color, var(--vmt-text-color, currentColor));\n flex-shrink: 0;\n}\n\n.vmt-label {\n font-size: 0.875rem;\n font-weight: 500;\n white-space: nowrap;\n color: var(--vmt-text-color, inherit);\n}\n</style>\n","import {\n computed,\n onBeforeUnmount,\n onMounted,\n reactive,\n ref,\n watch,\n} from 'vue'\nimport type { ThemeDefinition, ThemeOptions, UseThemeReturn } from '../types'\nimport { buildCssVars, injectStyles, removeStyles } from '../utils/css-injector'\nimport { normalizeToRgbChannels } from '../utils/color'\nimport { applyThemeToDom, getSystemPreference, readStorage, writeStorage } from '../utils/dom'\n\n// ─── Shared singleton state (module-level) ────────────────────────────────────\n// Allows multiple useTheme() calls to share the same reactive state when\n// options match. We track instances per storage-key.\nconst singletons = new Map<\n string,\n {\n current: ReturnType<typeof ref<string>>\n options: ThemeOptions\n _count: number\n _mediaCleanup?: () => void\n }\n>()\n\nfunction getSingletonKey(options: ThemeOptions): string {\n const base = options.storageKey ?? 'vmt-theme'\n return options.namespace ? `${options.namespace}:${base}` : base\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/**\n * Determine if a theme is \"dark\" by checking the background color luminance.\n * Falls back to name-based check if no background color is defined.\n */\nfunction isThemeDark(theme: ThemeDefinition): boolean {\n const bg = theme.colors.background\n if (bg) {\n try {\n // Normalize to RGB channels, then reconstruct hex for luminance check\n const channels = normalizeToRgbChannels(bg)\n const parts = channels.split(' ').map(Number)\n if (parts.length === 3 && parts.every((n) => !Number.isNaN(n))) {\n // Calculate relative luminance: dark if < 0.5\n const [r, g, b] = parts.map((v) => {\n const c = v / 255\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4\n })\n const lum = 0.2126 * r + 0.7152 * g + 0.0722 * b\n return lum < 0.5\n }\n } catch {\n // Fall through to name-based check\n }\n }\n return (theme.name ?? '').toLowerCase().includes('dark')\n}\n\n/**\n * Parse a theme's colors into `{ r, g, b }` objects.\n */\nfunction resolveThemeColors(theme: ThemeDefinition): Record<string, { r: number; g: number; b: number }> {\n const result: Record<string, { r: number; g: number; b: number }> = {}\n for (const [key, value] of Object.entries(theme.colors)) {\n if (value === undefined) continue\n try {\n const channels = normalizeToRgbChannels(value)\n const parts = channels.split(' ').map(Number)\n if (parts.length === 3 && parts.every((n) => !Number.isNaN(n))) {\n result[key] = { r: parts[0], g: parts[1], b: parts[2] }\n }\n } catch {\n // Skip unparseable colors\n }\n }\n return result\n}\n\n// ─── Main composable ──────────────────────────────────────────────────────────\n/**\n * `useTheme(options)` – the core Composition-API composable.\n *\n * Returns reactive `ComputedRef` values that auto-unwrap in templates and can be\n * destructured for use with `watch()`:\n *\n * ```ts\n * const { current, isDark, setTheme } = useTheme({\n * themes: [lightTheme, darkTheme, oceanTheme],\n * defaultTheme: 'light',\n * strategy: 'both',\n * })\n *\n * // Watch for theme changes\n * watch(current, (name) => console.log('Theme changed to', name))\n *\n * // Use in template (auto-unwraps)\n * // <span>{{ current }}</span>\n * ```\n */\nexport function useTheme(options: ThemeOptions): UseThemeReturn {\n const {\n themes,\n defaultTheme,\n strategy = 'attribute',\n attribute = 'data-theme',\n classPrefix = 'theme-',\n target = 'html',\n storage = 'localStorage',\n storageKey = 'vmt-theme',\n injectCssVars = true,\n cssVarPrefix = '--vmt-',\n respectSystemPreference = false,\n namespace,\n onChange,\n onThemeChange,\n } = options\n\n if (themes.length === 0) {\n throw new Error('[vue-multiple-themes] `themes` array must not be empty.')\n }\n\n // ─── Resolve initial theme name ─────────────────────────────────────────\n function getInitialTheme(): string {\n // 1. Check storage\n if (storage !== 'none') {\n const stored = readStorage(storageKey, storage as 'localStorage' | 'sessionStorage')\n if (stored && themes.some((t) => t.name === stored)) return stored\n }\n\n // 2. OS preference\n if (respectSystemPreference) {\n const pref = getSystemPreference()\n const match = themes.find((t) => t.name === pref)\n if (match) return match.name\n }\n\n // 3. Explicit default\n if (defaultTheme && themes.some((t) => t.name === defaultTheme)) {\n return defaultTheme\n }\n\n // 4. First theme\n return themes[0].name\n }\n\n // ─── Singleton current-name ref ─────────────────────────────────────────\n const singletonKey = getSingletonKey(options)\n let singleton = singletons.get(singletonKey)\n let currentName: ReturnType<typeof ref<string>>\n\n if (singleton) {\n currentName = singleton.current\n } else {\n currentName = ref<string>(getInitialTheme())\n singleton = { current: currentName, options, _count: 0 }\n singletons.set(singletonKey, singleton)\n }\n\n // ─── Derived state (ComputedRefs) ──────────────────────────────────────\n const currentComputed = computed<string>(\n () => currentName.value ?? themes[0]?.name ?? '',\n )\n\n const themeComputed = computed<ThemeDefinition>(\n () => themes.find((t) => t.name === currentName.value) ?? themes[0],\n )\n\n const isDarkComputed = computed<boolean>(() => isThemeDark(themeComputed.value))\n\n const resolvedColorsComputed = computed<Record<string, { r: number; g: number; b: number }>>(\n () => resolveThemeColors(themeComputed.value),\n )\n\n // ─── Apply theme to DOM ─────────────────────────────────────────────────\n let previousName: string | null = null\n\n function applyTheme(name: string) {\n const oldName = previousName\n\n // Add transition class for smooth color changes\n if (typeof document !== 'undefined' && oldName !== null) {\n const el = document.documentElement\n el.classList.add('vmt-transitioning')\n // Remove after transition completes\n setTimeout(() => el.classList.remove('vmt-transitioning'), 250)\n }\n\n applyThemeToDom(name, previousName, { strategy, attribute, classPrefix, target })\n previousName = name\n\n if (storage !== 'none') {\n writeStorage(storageKey, name, storage as 'localStorage' | 'sessionStorage')\n }\n\n const def = themes.find((t) => t.name === name) ?? themes[0]\n onChange?.(def)\n\n // Fire onThemeChange callback with old and new theme names\n if (onThemeChange && oldName !== null && oldName !== name) {\n onThemeChange(name, oldName)\n }\n\n // Dispatch DOM custom event for non-Vue consumers\n if (typeof document !== 'undefined') {\n document.dispatchEvent(\n new CustomEvent('vmt:theme-change', {\n detail: { theme: name, previous: oldName, definition: def },\n }),\n )\n }\n }\n\n // ─── Inject CSS vars (once) ─────────────────────────────────────────────\n function ensureStyles() {\n if (!injectCssVars) return\n const css = buildCssVars(themes, { strategy, attribute, classPrefix, cssVarPrefix, target, namespace })\n injectStyles(css, namespace)\n }\n\n // ─── Actions ────────────────────────────────────────────────────────────\n function setTheme(name: string) {\n if (!themes.some((t) => t.name === name)) {\n console.warn(`[vue-multiple-themes] Unknown theme: \"${name}\"`)\n return\n }\n currentName.value = name\n }\n\n function nextTheme() {\n const idx = themes.findIndex((t) => t.name === currentName.value)\n currentName.value = themes[(idx + 1) % themes.length].name\n }\n\n function prevTheme() {\n const idx = themes.findIndex((t) => t.name === currentName.value)\n currentName.value = themes[(idx - 1 + themes.length) % themes.length].name\n }\n\n function toggleTheme() {\n if (themes.length < 2) return\n if (themes.length === 2) {\n const other = themes.find((t) => t.name !== currentName.value) ?? themes[1]\n currentName.value = other.name\n } else {\n nextTheme()\n }\n }\n\n // ─── System preference watcher ──────────────────────────────────────────\n function setupSystemPreferenceWatcher() {\n if (typeof window === 'undefined') return\n if (!respectSystemPreference) return\n if (singleton!._mediaCleanup) return // Already watching\n\n const mql = window.matchMedia('(prefers-color-scheme: dark)')\n const handler = (e: MediaQueryListEvent) => {\n const pref = e.matches ? 'dark' : 'light'\n const match = themes.find((t) => t.name === pref)\n if (match) {\n currentName.value = match.name\n }\n }\n mql.addEventListener('change', handler)\n singleton!._mediaCleanup = () => mql.removeEventListener('change', handler)\n }\n\n // ─── Lifecycle ──────────────────────────────────────────────────────────\n let appliedInSetup = false\n if (typeof document !== 'undefined') {\n ensureStyles()\n const initialName = currentName.value\n if (initialName) applyTheme(initialName)\n appliedInSetup = true\n setupSystemPreferenceWatcher()\n }\n\n onMounted(() => {\n if (!appliedInSetup) {\n ensureStyles()\n const mountedName = currentName.value\n if (mountedName) applyTheme(mountedName)\n setupSystemPreferenceWatcher()\n }\n })\n\n watch(currentName, (name) => {\n if (name) applyTheme(name)\n })\n\n // Clean up injected styles only when ALL instances are unmounted\n singleton._count++\n\n onBeforeUnmount(() => {\n const entry = singletons.get(singletonKey)\n if (entry) {\n entry._count--\n if (entry._count <= 0) {\n // Clean up system preference watcher\n entry._mediaCleanup?.()\n singletons.delete(singletonKey)\n removeStyles(namespace)\n }\n }\n })\n\n // Wrap in reactive() so ComputedRef properties auto-unwrap in Vue templates.\n // Both access patterns work:\n // Template: {{ ts.current }} — auto-unwrapped by reactive()\n // Script: ts.current.value — still a ComputedRef when destructured\n // Script: const { current } = ts; current.value — works as Ref\n return reactive({\n current: currentComputed,\n theme: themeComputed,\n isDark: isDarkComputed,\n themes,\n resolvedColors: resolvedColorsComputed,\n setTheme,\n nextTheme,\n prevTheme,\n toggleTheme,\n }) as UseThemeReturn\n}\n","<script setup lang=\"ts\">\n/**\n * VmtThemePicker.vue\n *\n * Headless dropdown/popover for selecting themes.\n * Provides keyboard navigation (arrow keys, Enter, Escape) and full ARIA support.\n * No built-in styles — use slots and Tailwind classes for custom styling.\n *\n * @example\n * ```vue\n * <VmtThemePicker :themes=\"themes\" v-slot=\"{ open, toggle, items, activeIndex }\">\n * <button @click=\"toggle\">{{ current }}</button>\n * <ul v-if=\"open\">\n * <li v-for=\"(item, i) in items\" :key=\"item.name\"\n * :class=\"{ active: i === activeIndex }\"\n * @click=\"item.select()\">\n * {{ item.label }}\n * </li>\n * </ul>\n * </VmtThemePicker>\n * ```\n */\nimport { computed, ref, onMounted, onBeforeUnmount } from 'vue'\nimport type { ThemeDefinition, ThemeOptions } from '../types'\nimport { useTheme } from '../composables/useTheme'\n\nconst props = withDefaults(\n defineProps<{\n /** All available themes */\n themes: ThemeDefinition[]\n /** Theme options passed to useTheme */\n defaultTheme?: string\n strategy?: ThemeOptions['strategy']\n storage?: ThemeOptions['storage']\n storageKey?: string\n /** Close dropdown when a theme is selected. Default: true */\n closeOnSelect?: boolean\n }>(),\n {\n strategy: 'both',\n storage: 'localStorage',\n storageKey: 'vmt-theme',\n closeOnSelect: true,\n },\n)\n\nconst emit = defineEmits<{\n (e: 'select', theme: ThemeDefinition): void\n (e: 'open'): void\n (e: 'close'): void\n}>()\n\nconst themeApi = useTheme({\n themes: props.themes,\n defaultTheme: props.defaultTheme,\n strategy: props.strategy,\n storage: props.storage,\n storageKey: props.storageKey,\n})\n\nconst isOpen = ref(false)\nconst activeIndex = ref(-1)\nconst pickerRef = ref<HTMLElement | null>(null)\n\nfunction toggle() {\n isOpen.value = !isOpen.value\n if (isOpen.value) {\n activeIndex.value = props.themes.findIndex((t) => t.name === themeApi.current)\n emit('open')\n } else {\n emit('close')\n }\n}\n\nfunction open() {\n if (!isOpen.value) {\n isOpen.value = true\n activeIndex.value = props.themes.findIndex((t) => t.name === themeApi.current)\n emit('open')\n }\n}\n\nfunction close() {\n if (isOpen.value) {\n isOpen.value = false\n activeIndex.value = -1\n emit('close')\n }\n}\n\nfunction selectTheme(theme: ThemeDefinition) {\n themeApi.setTheme(theme.name)\n emit('select', theme)\n if (props.closeOnSelect) {\n close()\n }\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (!isOpen.value) {\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault()\n open()\n }\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n activeIndex.value = (activeIndex.value + 1) % props.themes.length\n break\n case 'ArrowUp':\n e.preventDefault()\n activeIndex.value = (activeIndex.value - 1 + props.themes.length) % props.themes.length\n break\n case 'Enter':\n case ' ':\n e.preventDefault()\n if (activeIndex.value >= 0) {\n selectTheme(props.themes[activeIndex.value])\n }\n break\n case 'Escape':\n e.preventDefault()\n close()\n break\n case 'Home':\n e.preventDefault()\n activeIndex.value = 0\n break\n case 'End':\n e.preventDefault()\n activeIndex.value = props.themes.length - 1\n break\n }\n}\n\n// Close on outside click\nfunction onClickOutside(e: MouseEvent) {\n if (pickerRef.value && !pickerRef.value.contains(e.target as Node)) {\n close()\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', onClickOutside, true)\n})\n\nonBeforeUnmount(() => {\n document.removeEventListener('click', onClickOutside, true)\n})\n\nconst items = computed(() =>\n props.themes.map((theme) => ({\n name: theme.name,\n label: theme.label ?? theme.name,\n icon: theme.icon,\n colors: theme.colors,\n isActive: theme.name === themeApi.current,\n select: () => selectTheme(theme),\n })),\n)\n</script>\n\n<template>\n <div\n ref=\"pickerRef\"\n role=\"listbox\"\n :aria-expanded=\"isOpen\"\n aria-label=\"Theme picker\"\n @keydown=\"onKeydown\"\n tabindex=\"0\"\n >\n <slot\n :open=\"isOpen\"\n :toggle=\"toggle\"\n :close=\"close\"\n :items=\"items\"\n :active-index=\"activeIndex\"\n :current=\"themeApi.current\"\n :current-theme=\"themeApi.theme\"\n :is-dark=\"themeApi.isDark\"\n :set-theme=\"themeApi.setTheme\"\n :next-theme=\"themeApi.nextTheme\"\n :prev-theme=\"themeApi.prevTheme\"\n :toggle-theme=\"themeApi.toggleTheme\"\n />\n </div>\n</template>\n","/**\n * Vue plugin for vue-multiple-themes.\n *\n * Registers `<VueMultipleThemes>` globally and optionally applies the initial\n * theme before the app mounts (useful for SSR / SSG hydration).\n *\n * @example Vue 3\n * ```ts\n * import { createApp } from 'vue'\n * import { VueMultipleThemesPlugin } from 'vue-multiple-themes'\n *\n * createApp(App).use(VueMultipleThemesPlugin, {\n * themes: myThemes,\n * defaultTheme: 'light',\n * strategy: 'both',\n * }).mount('#app')\n * ```\n *\n * @example Vue 2\n * ```js\n * import Vue from 'vue'\n * import { VueMultipleThemesPlugin } from 'vue-multiple-themes'\n *\n * Vue.use(VueMultipleThemesPlugin, {\n * themes: myThemes,\n * defaultTheme: 'light',\n * })\n * ```\n */\n\nimport { type App } from 'vue'\nimport VueMultipleThemes from './components/VueMultipleThemes.vue'\nimport type { ThemeOptions } from './types'\nimport { buildCssVars, injectStyles } from './utils/css-injector'\nimport { applyThemeToDom, getSystemPreference, readStorage, writeStorage } from './utils/dom'\n\nexport const VueMultipleThemesPlugin = {\n install(app: App, options: ThemeOptions = { themes: [] }) {\n const {\n themes,\n defaultTheme,\n strategy = 'attribute',\n attribute = 'data-theme',\n classPrefix = 'theme-',\n target = 'html',\n storage = 'localStorage',\n storageKey = 'vmt-theme',\n injectCssVars = true,\n cssVarPrefix = '--vmt-',\n respectSystemPreference = false,\n namespace,\n } = options\n\n if (themes.length === 0) {\n console.warn('[vue-multiple-themes] Plugin installed with empty themes array.')\n return\n }\n\n // ── Resolve & apply initial theme immediately (before mount) ─────────\n let initialTheme = themes[0]?.name ?? 'light'\n let fromStorage = false\n\n // 1. Check storage first (highest priority — user's previous choice)\n if (storage !== 'none') {\n const stored = readStorage(storageKey, storage as 'localStorage' | 'sessionStorage')\n if (stored && themes.some((t) => t.name === stored)) {\n initialTheme = stored\n fromStorage = true\n }\n }\n\n // 2. OS preference (only when nothing was stored)\n if (!fromStorage && respectSystemPreference) {\n const pref = getSystemPreference()\n const match = themes.find((t) => t.name === pref)\n if (match) initialTheme = match.name\n }\n\n // 3. Explicit default (only when neither storage nor OS preference matched)\n if (!fromStorage && initialTheme === (themes[0]?.name ?? 'light') && defaultTheme && themes.some((t) => t.name === defaultTheme)) {\n initialTheme = defaultTheme\n }\n\n // Inject CSS vars into <head> immediately\n if (injectCssVars) {\n const css = buildCssVars(themes, { strategy, attribute, classPrefix, cssVarPrefix, target, namespace })\n injectStyles(css, namespace)\n }\n\n // Persist the resolved theme so the composable picks up the same value\n if (storage !== 'none') {\n writeStorage(storageKey, initialTheme, storage as 'localStorage' | 'sessionStorage')\n }\n\n // Apply theme to DOM\n applyThemeToDom(initialTheme, null, { strategy, attribute, classPrefix, target })\n\n // ── Register global component ─────────────────────────────────────────\n app.component('VueMultipleThemes', VueMultipleThemes)\n\n // ── Provide the options for injection ────────────────────────────────\n if (typeof app.provide === 'function') {\n const provideKey = namespace ? `vmt:options:${namespace}` : 'vmt:options'\n app.provide(provideKey, options)\n }\n },\n}\n","/**\n * `createBrandContext` — factory for isolated, namespaced theme contexts.\n *\n * Use this when you need multiple independent theme engines in the same Vue\n * application — e.g. white-label setups, micro-frontends, or embeddable\n * widgets where each brand manages its own palette, storage key, and CSS\n * variable namespace.\n *\n * Each context gets:\n * - A scoped `<style>` tag (`id=\"vmt-theme-styles-<namespace>\"`)\n * - An isolated singleton reactive state (keyed by `<namespace>:<storageKey>`)\n * - A namespaced `provide` key (`\"vmt:options:<namespace>\"`)\n *\n * @example\n * ```ts\n * // brand-a.ts\n * import { createBrandContext } from 'vue-multiple-themes'\n * import brandAThemes from './themes/brand-a'\n *\n * export const brandA = createBrandContext({\n * namespace: 'brand-a',\n * themes: brandAThemes,\n * storageKey: 'brand-a-theme',\n * cssVarPrefix: '--brand-a-',\n * defaultTheme: 'light',\n * strategy: 'both',\n * })\n *\n * // In main.ts:\n * app.use(brandA.BrandPlugin)\n *\n * // In any component:\n * const { current, setTheme, isDark } = brandA.useTheme()\n * ```\n *\n * @example Multiple brands in one app\n * ```ts\n * const acme = createBrandContext({ namespace: 'acme', themes: acmeThemes, cssVarPrefix: '--acme-' })\n * const beta = createBrandContext({ namespace: 'beta', themes: betaThemes, cssVarPrefix: '--beta-' })\n *\n * app.use(acme.BrandPlugin)\n * app.use(beta.BrandPlugin)\n * ```\n */\n\nimport type { App } from 'vue'\nimport type { ThemeOptions, UseThemeReturn } from '../types'\nimport { useTheme } from './useTheme'\nimport { VueMultipleThemesPlugin } from '../plugin'\n\nexport interface BrandContext {\n /** The namespace string that was used to create this context. */\n readonly namespace: string\n /**\n * Composable — returns the reactive theme state for this brand context.\n * Optionally accepts partial overrides (e.g. to temporarily swap themes).\n */\n useTheme: (overrides?: Partial<ThemeOptions>) => UseThemeReturn\n /**\n * Vue plugin — install this into your `app` to register the global\n * `<VueMultipleThemes>` component and apply the initial theme.\n *\n * @example app.use(brandA.BrandPlugin)\n * @example app.use(brandA.BrandPlugin, { defaultTheme: 'dark' }) // override\n */\n BrandPlugin: {\n install: (app: App, overrides?: Partial<ThemeOptions>) => void\n }\n}\n\n/**\n * Create an isolated, namespaced brand context.\n *\n * @param defaults - Base options for this brand. `namespace` is required and\n * must be **unique per application** to prevent state collisions.\n */\nexport function createBrandContext(\n defaults: ThemeOptions & { namespace: string },\n): BrandContext {\n const { namespace } = defaults\n\n return {\n namespace,\n\n useTheme(overrides?: Partial<ThemeOptions>): UseThemeReturn {\n return useTheme({ ...defaults, ...overrides, namespace })\n },\n\n BrandPlugin: {\n install(app: App, overrides: Partial<ThemeOptions> = {}): void {\n VueMultipleThemesPlugin.install(app, { ...defaults, ...overrides, namespace })\n },\n },\n }\n}\n","/**\n * @deprecated The built-in icon registry has been removed in v6.\n *\n * Use any Vue icon component library directly instead:\n * - `lucide-vue-next` (recommended)\n * - `@heroicons/vue`\n * - `@phosphor-icons/vue`\n *\n * Pass the component to `VmtIcon` via its `as` prop, or assign it directly\n * as `ThemeDefinition.icon`:\n *\n * ```ts\n * import { Sun, Moon } from 'lucide-vue-next'\n *\n * const themes = [\n * { name: 'light', label: 'Light', icon: Sun, colors: { ... } },\n * { name: 'dark', label: 'Dark', icon: Moon, colors: { ... } },\n * ]\n * ```\n *\n * @module\n */\n\n/** @deprecated */\nexport interface LucideIconData {\n path: string\n extra?: string\n}\n\n/** @deprecated Use `lucide-vue-next` or another icon library directly. */\nexport const LUCIDE_ICONS: Record<string, LucideIconData> = {\n sun: {\n path: 'M12 3V4M12 20V21M4 12H3M6.31 6.31L5.5 5.5M17.69 6.31L18.5 5.5M6.31 17.69L5.5 18.5M17.69 17.69L18.5 18.5M21 12H20M16 12C16 14.21 14.21 16 12 16C9.79 16 8 14.21 8 12C8 9.79 9.79 8 12 8C14.21 8 16 9.79 16 12Z',\n },\n moon: {\n path: 'M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z',\n },\n sunset: {\n path: 'M17 18H17.01M3 18H5M19 18H21M12 2V4M4.22 10.22L5.64 11.64M18.36 11.64L19.78 10.22M12 6C9.24 6 7 8.24 7 11V18H17V11C17 8.24 14.76 6 12 6Z',\n },\n sunrise: {\n path: 'M17 18H17.01M3 18H5M19 18H21M12 2V4M4.22 10.22L5.64 11.64M18.36 11.64L19.78 10.22M12 10C10.34 10 9 11.34 9 13V18H15V13C15 11.34 13.66 10 12 10Z',\n },\n monitor: {\n path: 'M20 3H4a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h3l-1 4h6l-1-4h3a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2Z',\n },\n laptop: {\n path: 'M20 16V7a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v9M14 2H10M2 20h20',\n },\n coffee: {\n path: 'M18 8H19a2 2 0 0 1 0 4H18M2 8H18V19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8ZM6 2V5M10 2V5M14 2V5',\n },\n leaf: {\n path: 'M11 20A7 7 0 0 1 9.8 6.1C15.5 5 17 4.48 19 2C19 10 14 12 12.2 12.6A5.49 5.49 0 0 1 2 12C2 12 4 10 9 11.2M4 20C2 18 2 14 4 12',\n },\n droplets: {\n path: 'M7 16.3C5 14.3 5 11 7 9L12 3L17 9C19 11 19 14.3 17 16.3C15 18.3 12 18.3 10 17L7 16.3ZM5 20H19',\n },\n flame: {\n path: 'M8.5 14.5A2.5 2.5 0 0 0 11 12C11 9 7 7.5 7 7.5C7 7.5 5 11 5 13C5 15.76 7.24 18 10 18C13 18 14.5 15.24 14.5 13C14.5 10.76 12 7 12 7C12 7 8.5 9 8.5 14.5ZM12 22C16.97 22 21 17.97 21 13C21 8 15 2 15 2C15 2 14 9 11 9C8 9 7 2 7 2C7 2 3 8 3 13C3 17.97 7.03 22 12 22Z',\n },\n snowflake: {\n path: 'M2 12H22M12 2V22M20 16L4 8M4 16L20 8M17.66 6.34L6.34 17.66M6.34 6.34L17.66 17.66',\n },\n palette: {\n path: 'M12 2C6.48 2 2 6.48 2 12C2 15.31 3.7 18.23 6.24 20.1L6.17 20.17C5.53 20.55 5 21.22 5 22C5 22 8 21 12 21C16 21 19 22 19 22C19 21.22 18.47 20.55 17.83 20.17L17.76 20.1C20.3 18.23 22 15.31 22 12C22 6.48 17.52 2 12 2ZM8 13C7.45 13 7 12.55 7 12C7 11.45 7.45 11 8 11C8.55 11 9 11.45 9 12C9 12.55 8.55 13 8 13ZM12 9C11.45 9 11 8.55 11 8C11 7.45 11.45 7 12 7C12.55 7 13 7.45 13 8C13 8.55 12.55 9 12 9ZM16 13C15.45 13 15 12.55 15 12C15 11.45 15.45 11 16 11C16.55 11 17 11.45 17 12C17 12.55 16.55 13 16 13Z',\n },\n eye: {\n path: 'M1 12S5 4 12 4S23 12 23 12S19 20 12 20S1 12 1 12ZM12 15A3 3 0 1 0 12 9A3 3 0 0 0 12 15Z',\n },\n star: {\n path: 'M12 2L15.09 8.26L22 9.27L17 14.14L18.18 21.02L12 17.77L5.82 21.02L7 14.14L2 9.27L8.91 8.26L12 2Z',\n },\n zap: {\n path: 'M13 2L3 14H12L11 22L21 10H12L13 2Z',\n },\n}\n\n/** @deprecated Use `lucide-vue-next` or another icon library directly. */\nexport function getIcon(_name: string): LucideIconData {\n return { path: '' }\n}\n\n/**\n * @deprecated The built-in SVG path registry has been removed.\n * Returns a placeholder circle SVG. Replace with your icon library.\n */\nexport function iconToSvg(\n _name: string,\n size = 20,\n color = 'currentColor',\n strokeWidth = 2,\n): string {\n return (\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" ` +\n `viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${color}\" stroke-width=\"${strokeWidth}\" ` +\n `stroke-linecap=\"round\" stroke-linejoin=\"round\">` +\n `<circle cx=\"12\" cy=\"12\" r=\"10\"/>` +\n `</svg>`\n )\n}\n","/**\n * generate-theme.ts\n *\n * Developer-experience utilities that solve the #1 pain point:\n * \"I have a brand color — how do I get a full theme from it?\"\n *\n * Core functions:\n * generateLightTheme(baseColor, options) → ThemeDefinition\n * generateDarkTheme(baseColor, options) → ThemeDefinition\n * generateThemePair(baseColor, options) → [light, dark] ThemeDefinition[]\n * generateSeasonalTheme(season, options) → ThemeDefinition\n * generateFromCssVar(varName, options) → CSS string (runtime, browser-only)\n */\n\nimport type { Component } from 'vue'\nimport type { ThemeColors, ThemeDefinition } from '../types'\nimport {\n autoContrast,\n contrastRatio,\n ensureContrast,\n hexToHsl,\n hslToHex,\n lighten,\n mix,\n saturate,\n withAlpha,\n} from './color'\n\nexport interface GenerateThemeOptions {\n /** Theme name (slug used in DOM, e.g. 'brand-light') */\n name?: string\n /** Human-readable label */\n label?: string\n /** Optional icon component (e.g. from `lucide-vue-next`) */\n icon?: Component\n /**\n * Saturation boost/reduction for background tones.\n * Positive = more colorful surfaces, negative = more neutral.\n * Default: 0\n */\n saturationBias?: number\n /**\n * Whether to tint surfaces with the brand hue (default: true).\n * Set false for pure white/dark surfaces.\n */\n tintedSurfaces?: boolean\n /**\n * Accent color override. Defaults to an analogous color of the primary.\n */\n accentColor?: string\n /**\n * Extra classes appended to the theme's `extraClasses` array.\n */\n extraClasses?: string[]\n}\n\n// ─── Light theme generator ────────────────────────────────────────────────────\n\n/**\n * Generate a WCAG-compliant light theme from a single brand color.\n *\n * @example\n * const myTheme = generateLightTheme('#7c3aed', { name: 'brand', label: 'Brand' })\n */\nexport function generateLightTheme(\n primaryHex: string,\n options: GenerateThemeOptions = {},\n): ThemeDefinition {\n const {\n name = 'generated-light',\n label = 'Light',\n icon,\n saturationBias = 0,\n tintedSurfaces = true,\n accentColor,\n extraClasses = [],\n } = options\n\n const [h, s] = hexToHsl(primaryHex)\n const surfaceSat = tintedSurfaces ? Math.max(0, s * 0.08 + saturationBias) : 0\n const secondary = hslToHex(h, Math.max(0, s - 15), Math.min(70, hexToHsl(primaryHex)[2] + 10))\n const accent = accentColor ?? hslToHex((h + 30) % 360, Math.min(100, s + 5), 55)\n\n const background = hslToHex(h, surfaceSat, 99)\n const surface = hslToHex(h, surfaceSat + 1, 97)\n const surfaceElevated = hslToHex(h, surfaceSat + 2, 94)\n const border = hslToHex(h, surfaceSat + 4, 88)\n\n // Ensure primary is visible on white background (darken if needed)\n const primary = ensureContrast(primaryHex, background, 3)\n\n const text = ensureContrast(hslToHex(h, Math.min(20, s * 0.3), 12), background, 7)\n const textMuted = ensureContrast(hslToHex(h, Math.min(15, s * 0.2), 40), background, 4.5)\n const textInverse = autoContrast(primary, '#ffffff', '#000000') === '#ffffff'\n ? '#ffffff'\n : '#1a1a1a'\n\n const colors: ThemeColors = {\n primary,\n secondary,\n accent,\n background,\n surface,\n surfaceElevated,\n text,\n textMuted,\n textInverse,\n border,\n ring: withAlpha(primary, 0.4),\n success: '#16a34a',\n warning: '#d97706',\n error: '#dc2626',\n info: primary,\n }\n\n return { name, label, icon, colors, extraClasses }\n}\n\n// ─── Dark theme generator ─────────────────────────────────────────────────────\n\n/**\n * Generate a WCAG-compliant dark theme from a single brand color.\n *\n * @example\n * const myDark = generateDarkTheme('#7c3aed', { name: 'brand-dark', label: 'Dark' })\n */\nexport function generateDarkTheme(\n primaryHex: string,\n options: GenerateThemeOptions = {},\n): ThemeDefinition {\n const {\n name = 'generated-dark',\n label = 'Dark',\n icon,\n saturationBias = 0,\n tintedSurfaces = true,\n accentColor,\n extraClasses = [],\n } = options\n\n const [h, s] = hexToHsl(primaryHex)\n const surfaceSat = tintedSurfaces ? Math.max(0, s * 0.12 + saturationBias) : 0\n\n // Lighten the primary so it's visible on dark backgrounds\n const primary = lighten(saturate(primaryHex, 10), 15)\n const secondary = hslToHex(h, Math.max(0, s - 10), 75)\n const accent = accentColor ?? hslToHex((h + 30) % 360, Math.min(100, s + 10), 70)\n\n const background = hslToHex(h, surfaceSat, 7)\n const surface = hslToHex(h, surfaceSat + 1, 11)\n const surfaceElevated = hslToHex(h, surfaceSat + 2, 16)\n const border = hslToHex(h, surfaceSat + 3, 22)\n\n const text = hslToHex(h, Math.min(15, s * 0.1), 96)\n const textMuted = hslToHex(h, Math.min(12, s * 0.08), 60)\n const textInverse = hslToHex(h, Math.min(20, s * 0.3), 10)\n\n const colors: ThemeColors = {\n primary,\n secondary,\n accent,\n background,\n surface,\n surfaceElevated,\n text,\n textMuted,\n textInverse,\n border,\n ring: withAlpha(primary, 0.5),\n success: '#4ade80',\n warning: '#fb923c',\n error: '#f87171',\n info: primary,\n }\n\n return { name, label, icon, colors, extraClasses }\n}\n\n// ─── Pair generator ───────────────────────────────────────────────────────────\n\n/**\n * Generate a matched [light, dark] `ThemeDefinition` pair from one color.\n *\n * @example\n * const [light, dark] = generateThemePair('#7c3aed')\n * app.use(VueMultipleThemesPlugin, { themes: [...generateThemePair('#7c3aed')] })\n */\nexport function generateThemePair(\n primaryHex: string,\n options: {\n lightName?: string\n darkName?: string\n lightLabel?: string\n darkLabel?: string\n saturationBias?: number\n tintedSurfaces?: boolean\n } = {},\n): [ThemeDefinition, ThemeDefinition] {\n const {\n lightName = 'light',\n darkName = 'dark',\n lightLabel = 'Light',\n darkLabel = 'Dark',\n saturationBias,\n tintedSurfaces,\n } = options\n\n return [\n generateLightTheme(primaryHex, {\n name: lightName,\n label: lightLabel,\n saturationBias,\n tintedSurfaces,\n }),\n generateDarkTheme(primaryHex, {\n name: darkName,\n label: darkLabel,\n saturationBias,\n tintedSurfaces,\n }),\n ]\n}\n\n// ─── Palette from multiple brand colors ───────────────────────────────────────\n\nexport interface BrandPalette {\n primary: string\n secondary?: string\n accent?: string\n}\n\n/**\n * Generate a full theme from a complete brand palette.\n * More control than the single-color generators.\n */\nexport function generateThemeFromPalette(\n palette: BrandPalette,\n variant: 'light' | 'dark',\n options: GenerateThemeOptions = {},\n): ThemeDefinition {\n const base = variant === 'light'\n ? generateLightTheme(palette.primary, options)\n : generateDarkTheme(palette.primary, options)\n\n return {\n ...base,\n colors: {\n ...base.colors,\n ...(palette.secondary ? { secondary: palette.secondary } : {}),\n ...(palette.accent ? { accent: palette.accent } : {}),\n },\n }\n}\n\n// ─── Seasonal / mood presets ──────────────────────────────────────────────────\n\ntype Season = 'spring' | 'summer' | 'autumn' | 'winter' | 'midnight' | 'neon' | 'pastel'\n\nconst SEASON_COLORS: Record<Season, string> = {\n spring: '#34d399', // emerald green\n summer: '#f59e0b', // amber\n autumn: '#b45309', // burnt orange\n winter: '#7dd3fc', // icy blue\n midnight: '#6366f1', // indigo\n neon: '#22d3ee', // cyan\n pastel: '#f9a8d4', // rose\n}\n\n/**\n * Generate a light + dark theme pair for a named mood/season.\n *\n * @example\n * const themes = generateSeasonalThemes('midnight')\n */\nexport function generateSeasonalThemes(season: Season): [ThemeDefinition, ThemeDefinition] {\n const base = SEASON_COLORS[season]\n return generateThemePair(base, {\n lightName: `${season}-light`,\n darkName: `${season}-dark`,\n lightLabel: `${capitalize(season)} Light`,\n darkLabel: `${capitalize(season)} Dark`,\n })\n}\n\n// ─── CSS color-mix() integration (browser only) ───────────────────────────────\n\n/**\n * Build CSS custom properties using `color-mix()` so the browser does the\n * heavy lifting at runtime. Returns a CSS string ready to inject into a\n * `<style>` tag.\n *\n * > **Browser-only**: `color-mix()` requires a modern browser (Chrome 111+,\n * > Firefox 113+, Safari 16.2+). For SSR or older browsers, prefer the\n * > static generators above.\n *\n * @example\n * import { buildCssMixTheme } from 'vue-multiple-themes'\n * const css = buildCssMixTheme('#7c3aed', 'brand')\n * document.head.insertAdjacentHTML('beforeend', `<style>${css}</style>`)\n */\nexport function buildCssMixTheme(\n primaryHex: string,\n name: string,\n variant: 'light' | 'dark' = 'light',\n): string {\n const base = variant === 'dark' ? '#000000' : '#ffffff'\n const selector = `[data-theme=\"${name}\"]`\n\n const steps = variant === 'light'\n ? { bg: '98%', surface: '95%', border: '85%', text: '10%' }\n : { bg: '8%', surface: '14%', border: '24%', text: '96%' }\n\n return `\n${selector} {\n --vmt-primary: ${primaryHex};\n --vmt-background: color-mix(in oklch, ${primaryHex} 3%, ${base} ${steps.bg});\n --vmt-surface: color-mix(in oklch, ${primaryHex} 5%, ${base} ${steps.surface});\n --vmt-surface-elevated: color-mix(in oklch, ${primaryHex} 8%, ${base});\n --vmt-border: color-mix(in oklch, ${primaryHex} 15%, ${base} ${steps.border});\n --vmt-foreground: color-mix(in oklch, ${primaryHex} 10%, ${base === '#ffffff' ? '#000000' : '#ffffff'} ${steps.text});\n --vmt-foreground-muted: color-mix(in oklch, var(--vmt-foreground) 60%, ${base});\n --vmt-ring: color-mix(in oklch, ${primaryHex} 50%, transparent);\n}`.trim()\n}\n\n// ─── Adaptive theme (detects CSS vars at runtime, browser-only) ───────────────\n\n/**\n * Read the current CSS custom properties from the document and return them\n * as a `ThemeColors` object. Useful for syncing with design tokens from\n * another design system.\n *\n * @browser-only\n */\nexport function readCssVarsAsColors(\n varMap: Partial<Record<keyof ThemeColors, string>>,\n element: Element = document.documentElement,\n): Partial<ThemeColors> {\n const styles = getComputedStyle(element)\n const result: Partial<ThemeColors> = {}\n for (const [key, varName] of Object.entries(varMap)) {\n const value = styles.getPropertyValue(varName as string).trim()\n if (value) {\n result[key as keyof ThemeColors] = value\n }\n }\n return result\n}\n\n// ─── Contrast checker utility ─────────────────────────────────────────────────\n\nexport interface ContrastReport {\n ratio: number\n aa: boolean\n aaLarge: boolean\n aaa: boolean\n aaaLarge: boolean\n}\n\n/**\n * Analyse a text/background color combination against WCAG 2.1 levels.\n *\n * @example\n * const report = checkContrast('#7c3aed', '#ffffff')\n * console.log(report.aa) // true\n */\nexport function checkContrast(foreground: string, background: string): ContrastReport {\n const ratio = contrastRatio(foreground, background)\n return {\n ratio: Math.round(ratio * 100) / 100,\n aa: ratio >= 4.5,\n aaLarge: ratio >= 3,\n aaa: ratio >= 7,\n aaaLarge: ratio >= 4.5,\n }\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n","import type { ThemeDefinition } from '../types'\n\n// ─── Light (default) ──────────────────────────────────────────────────────────\nexport const lightTheme: ThemeDefinition = {\n name: 'light',\n label: 'Light',\n colors: {\n primary: '#3b82f6',\n primaryLight: '#93c5fd',\n primaryDark: '#1d4ed8',\n secondary: '#8b5cf6',\n accent: '#f59e0b',\n background: '#ffffff',\n surface: '#f8fafc',\n surfaceElevated: '#f1f5f9',\n text: '#111827',\n textMuted: '#6b7280',\n textInverse: '#ffffff',\n border: '#e5e7eb',\n ring: '#3b82f6',\n success: '#10b981',\n warning: '#f59e0b',\n error: '#ef4444',\n info: '#3b82f6',\n },\n}\n\n// ─── Dark ─────────────────────────────────────────────────────────────────────\nexport const darkTheme: ThemeDefinition = {\n name: 'dark',\n label: 'Dark',\n colors: {\n primary: '#60a5fa',\n primaryLight: '#bfdbfe',\n primaryDark: '#3b82f6',\n secondary: '#a78bfa',\n accent: '#fbbf24',\n background: '#0f172a',\n surface: '#1e293b',\n surfaceElevated: '#334155',\n text: '#f8fafc',\n textMuted: '#94a3b8',\n textInverse: '#0f172a',\n border: '#334155',\n ring: '#60a5fa',\n success: '#34d399',\n warning: '#fbbf24',\n error: '#f87171',\n info: '#60a5fa',\n },\n}\n\n// ─── Sepia ────────────────────────────────────────────────────────────────────\nexport const sepiaTheme: ThemeDefinition = {\n name: 'sepia',\n label: 'Sepia',\n colors: {\n primary: '#92400e',\n primaryLight: '#d97706',\n primaryDark: '#78350f',\n secondary: '#78350f',\n accent: '#d97706',\n background: '#fdf6e3',\n surface: '#f5e9c9',\n surfaceElevated: '#ede0b5',\n text: '#3c2415',\n textMuted: '#78583d',\n textInverse: '#fdf6e3',\n border: '#d6b896',\n ring: '#92400e',\n success: '#166534',\n warning: '#92400e',\n error: '#991b1b',\n info: '#1e40af',\n },\n}\n\n// ─── Ocean ────────────────────────────────────────────────────────────────────\nexport const oceanTheme: ThemeDefinition = {\n name: 'ocean',\n label: 'Ocean',\n colors: {\n primary: '#0ea5e9',\n primaryLight: '#7dd3fc',\n primaryDark: '#0369a1',\n secondary: '#06b6d4',\n accent: '#f0abfc',\n background: '#0c1a2e',\n surface: '#132338',\n surfaceElevated: '#1b3554',\n text: '#e0f2fe',\n textMuted: '#7dd3fc',\n textInverse: '#0c1a2e',\n border: '#1e4877',\n ring: '#0ea5e9',\n success: '#34d399',\n warning: '#fbbf24',\n error: '#f87171',\n info: '#38bdf8',\n },\n}\n\n// ─── Forest ───────────────────────────────────────────────────────────────────\nexport const forestTheme: ThemeDefinition = {\n name: 'forest',\n label: 'Forest',\n colors: {\n primary: '#16a34a',\n primaryLight: '#86efac',\n primaryDark: '#166534',\n secondary: '#15803d',\n accent: '#84cc16',\n background: '#052e16',\n surface: '#14532d',\n surfaceElevated: '#166534',\n text: '#dcfce7',\n textMuted: '#86efac',\n textInverse: '#052e16',\n border: '#166534',\n ring: '#16a34a',\n success: '#4ade80',\n warning: '#facc15',\n error: '#f87171',\n info: '#60a5fa',\n },\n}\n\n// ─── Sunset ───────────────────────────────────────────────────────────────────\nexport const sunsetTheme: ThemeDefinition = {\n name: 'sunset',\n label: 'Sunset',\n colors: {\n primary: '#f97316',\n primaryLight: '#fdba74',\n primaryDark: '#c2410c',\n secondary: '#fb923c',\n accent: '#facc15',\n background: '#1c0a00',\n surface: '#2d1507',\n surfaceElevated: '#3f2010',\n text: '#fff7ed',\n textMuted: '#fdba74',\n textInverse: '#1c0a00',\n border: '#7c2d12',\n ring: '#f97316',\n success: '#4ade80',\n warning: '#facc15',\n error: '#f87171',\n info: '#60a5fa',\n },\n}\n\n// ─── Winter ───────────────────────────────────────────────────────────────────\nexport const winterTheme: ThemeDefinition = {\n name: 'winter',\n label: 'Winter',\n colors: {\n primary: '#818cf8',\n primaryLight: '#c7d2fe',\n primaryDark: '#4f46e5',\n secondary: '#a5b4fc',\n accent: '#67e8f9',\n background: '#0f0f23',\n surface: '#1a1a3e',\n surfaceElevated: '#252550',\n text: '#e0e7ff',\n textMuted: '#a5b4fc',\n textInverse: '#0f0f23',\n border: '#312e81',\n ring: '#818cf8',\n success: '#4ade80',\n warning: '#fbbf24',\n error: '#f87171',\n info: '#67e8f9',\n },\n}\n\n// ─── All presets ──────────────────────────────────────────────────────────────\nexport const PRESET_THEMES: ThemeDefinition[] = [\n lightTheme,\n darkTheme,\n sepiaTheme,\n oceanTheme,\n forestTheme,\n sunsetTheme,\n winterTheme,\n]\n"],"names":["normalizeToRgbChannels","_openBlock","_createBlock","_resolveDynamicComponent","ref","computed","onMounted","watch","onBeforeUnmount","_createElementBlock","_normalizeClass","_renderSlot","$slots","VmtIcon","_toDisplayString","reactive","_unref","VueMultipleThemes","color","hexToHsl","hslToHex","ensureContrast","autoContrast","withAlpha","lighten","saturate","contrastRatio"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vue-multiple-themes.cjs","sources":["../src/utils/css-injector.ts","../src/utils/dom.ts","../src/components/VmtIcon.vue","../src/components/VueMultipleThemes.vue","../src/composables/useTheme.ts","../src/components/VmtThemePicker.vue","../src/plugin.ts","../src/composables/createBrandContext.ts","../src/icons/index.ts","../src/utils/generate-theme.ts","../src/themes/presets.ts"],"sourcesContent":["import type { ThemeDefinition, ThemeOptions } from '../types'\nimport { normalizeToRgbChannels } from './color'\n\nconst DEFAULT_STYLE_ID = 'vmt-theme-styles'\n\n/** Return the `<style>` element id for the given namespace. */\nexport function getStyleId(namespace?: string): string {\n return namespace ? `vmt-theme-styles-${namespace}` : DEFAULT_STYLE_ID\n}\n\n/**\n * Convert camelCase token names to kebab-case CSS variable segments.\n * e.g. \"primaryDark\" → \"primary-dark\"\n */\nexport function toKebab(str: string): string {\n return str.replace(/([A-Z])/g, (_, c: string) => `-${c.toLowerCase()}`)\n}\n\n/** Build a full CSS block string for all themes. */\nexport function buildCssVars(\n themes: ThemeDefinition[],\n options: Pick<ThemeOptions, 'strategy' | 'attribute' | 'classPrefix' | 'cssVarPrefix' | 'target' | 'namespace'>,\n): string {\n const {\n strategy = 'attribute',\n attribute = 'data-theme',\n classPrefix = 'theme-',\n cssVarPrefix = '--vmt-',\n target = 'html',\n } = options\n\n const rootSelector = target === 'html' ? ':root' : target\n\n function buildSelector(themeName: string, isDefault: boolean): string {\n const parts: string[] = []\n if (isDefault) parts.push(rootSelector)\n\n if (strategy === 'attribute' || strategy === 'both') {\n const base =\n target === 'html'\n ? `:root[${attribute}=\"${themeName}\"]`\n : `${target}[${attribute}=\"${themeName}\"]`\n if (!parts.includes(base)) parts.push(base)\n }\n\n if (strategy === 'class' || strategy === 'both') {\n const cls = `${classPrefix}${themeName}`\n const base = target === 'html' ? `:root.${cls}` : `${target}.${cls}`\n if (!parts.includes(base)) parts.push(base)\n }\n\n return parts.join(',\\n')\n }\n\n const blocks: string[] = []\n\n // Convenience icon-color variable on :root\n blocks.push(\n `${rootSelector} {\\n ${cssVarPrefix}icon-color: var(${cssVarPrefix}text, currentColor);\\n}`,\n )\n\n for (let i = 0; i < themes.length; i++) {\n const theme = themes[i]\n const selector = buildSelector(theme.name, i === 0)\n const vars = Object.entries(theme.colors)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => {\n const kebab = toKebab(k)\n const channels = normalizeToRgbChannels(v!)\n const lines: string[] = []\n // RGB channels for Tailwind opacity modifier support: bg-vmt-primary/50\n lines.push(` ${cssVarPrefix}${kebab}: ${channels};`)\n // Full rgb() color for direct CSS use: color: var(--vmt-primary-color)\n lines.push(` ${cssVarPrefix}${kebab}-color: rgb(${channels});`)\n return lines.join('\\n')\n })\n .join('\\n')\n blocks.push(`${selector} {\\n${vars}\\n}`)\n }\n\n return blocks.join('\\n\\n')\n}\n\n/** Inject (or update) a `<style>` tag with the generated CSS into `<head>`. */\nexport function injectStyles(css: string, namespace?: string): void {\n if (typeof document === 'undefined') return\n\n const id = getStyleId(namespace)\n let el = document.getElementById(id) as HTMLStyleElement | null\n if (!el) {\n el = document.createElement('style')\n el.id = id\n document.head.appendChild(el)\n }\n el.textContent = css\n}\n\n/** Remove the injected `<style>` tag. */\nexport function removeStyles(namespace?: string): void {\n if (typeof document === 'undefined') return\n document.getElementById(getStyleId(namespace))?.remove()\n}\n","import type { ThemeOptions, ThemeTarget } from '../types'\n\n/** Resolve the target DOM element. Returns null in SSR. */\nexport function resolveTarget(target: ThemeTarget = 'html'): Element | null {\n if (typeof document === 'undefined') return null\n if (target === 'html') return document.documentElement\n if (target === 'body') return document.body\n return document.querySelector(target)\n}\n\n/**\n * Apply a theme to the DOM by setting attributes and / or CSS classes\n * on the target element, and removing the previous ones.\n */\nexport function applyThemeToDom(\n name: string,\n previousName: string | null,\n options: Pick<ThemeOptions, 'strategy' | 'attribute' | 'classPrefix' | 'target'>,\n): void {\n const {\n strategy = 'attribute',\n attribute = 'data-theme',\n classPrefix = 'theme-',\n target = 'html',\n } = options\n\n const el = resolveTarget(target)\n if (!el) return\n\n if (strategy === 'attribute' || strategy === 'both') {\n el.setAttribute(attribute, name)\n }\n\n if (strategy === 'class' || strategy === 'both') {\n // Remove ALL theme classes (not just previousName) to handle stale classes\n // that may linger after a page refresh when previousName is null\n const toRemove = Array.from(el.classList).filter(\n (cls) => cls.startsWith(classPrefix) && cls !== `${classPrefix}${name}`,\n )\n for (const cls of toRemove) {\n el.classList.remove(cls)\n }\n el.classList.add(`${classPrefix}${name}`)\n }\n}\n\n/** Remove all theme markers from the DOM (cleanup). */\nexport function clearThemeFromDom(\n name: string,\n options: Pick<ThemeOptions, 'strategy' | 'attribute' | 'classPrefix' | 'target'>,\n): void {\n const {\n strategy = 'attribute',\n attribute = 'data-theme',\n classPrefix = 'theme-',\n target = 'html',\n } = options\n\n const el = resolveTarget(target)\n if (!el) return\n\n if (strategy === 'attribute' || strategy === 'both') {\n el.removeAttribute(attribute)\n }\n\n if (strategy === 'class' || strategy === 'both') {\n el.classList.remove(`${classPrefix}${name}`)\n }\n}\n\n/** Read / write from Web Storage, swallowing errors in private-browsing mode. */\nexport function readStorage(key: string, type: 'localStorage' | 'sessionStorage'): string | null {\n try {\n return window[type].getItem(key)\n } catch {\n return null\n }\n}\n\nexport function writeStorage(key: string, value: string, type: 'localStorage' | 'sessionStorage'): void {\n try {\n window[type].setItem(key, value)\n } catch {\n /* ignore */\n }\n}\n\n/** Returns 'dark' or 'light' based on OS preference (browser only). */\nexport function getSystemPreference(): 'dark' | 'light' {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n","<script setup lang=\"ts\">\n/**\n * VmtIcon.vue\n *\n * A thin sizing/color wrapper for any Vue icon component.\n * Works with lucide-vue-next, @heroicons/vue, @phosphor-icons/vue, etc.\n *\n * @example\n * import { Sun } from 'lucide-vue-next'\n * <VmtIcon :as=\"Sun\" :size=\"20\" />\n */\nimport type { Component } from 'vue'\n\nwithDefaults(\n defineProps<{\n /** Any Vue icon component (Lucide, Heroicons, Phosphor, etc.) */\n as: Component\n /** Icon size in pixels */\n size?: number\n /** Stroke / fill color — defaults to `currentColor` */\n color?: string\n /** Stroke width */\n strokeWidth?: number\n }>(),\n {\n size: 20,\n color: 'currentColor',\n strokeWidth: 2,\n },\n)\n</script>\n\n<template>\n <component\n :is=\"as\"\n :size=\"size\"\n :color=\"color\"\n :stroke-width=\"strokeWidth\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport {\n computed,\n onBeforeUnmount,\n onMounted,\n ref,\n watch,\n} from \"vue\";\nimport type { Component } from \"vue\";\nimport type {\n\tThemeDefinition,\n\tThemeStrategy,\n\tThemeTarget,\n} from \"../types\";\nimport {\n\tbuildCssVars,\n\tinjectStyles,\n\tremoveStyles,\n} from \"../utils/css-injector\";\nimport {\n\tapplyThemeToDom,\n getSystemPreference,\n\treadStorage,\n writeStorage,\n} from \"../utils/dom\";\nimport { normalizeToRgbChannels } from \"../utils/color\";\nimport VmtIcon from \"./VmtIcon.vue\";\n// VmtIcon is used in the #icon slot default when the theme has a Component icon\n\n// ── Ref-counted instance tracking (keyed by storageKey) ────────────────────\n// Prevents a navigating-away component from wiping the shared <style> tag\n// while other components (e.g. NavThemeSwitcher) are still mounted.\nconst _componentCounts = new Map<string, number>()\n\nconst props = withDefaults(defineProps<{\n /** All available theme definitions */\n themes?: ThemeDefinition[];\n /** Active theme on first render (default: first in `themes`) */\n defaultTheme?: string;\n /** How to stamp the theme on the DOM */\n strategy?: ThemeStrategy;\n /** Attribute name (default: `data-theme`) */\n attribute?: string;\n /** Class prefix (default: `theme-`) */\n classPrefix?: string;\n /** DOM element that receives the attribute / class */\n target?: ThemeTarget;\n /** CSS variable prefix (default: `--vmt-`) */\n cssVarPrefix?: string;\n /** Inject CSS variables automatically */\n injectCssVars?: boolean;\n /** Persist theme in storage */\n storage?: \"localStorage\" | \"sessionStorage\" | \"none\";\n /** Storage key for persistence */\n storageKey?: string;\n /** Respect OS dark/light preference on first load */\n respectSystemPreference?: boolean;\n /** Show the built-in toggle button */\n showToggle?: boolean;\n /** Show the label next to the icon */\n showLabel?: boolean;\n /** Size (px) of the toggle icon */\n iconSize?: number;\n /** Extra CSS classes on the root wrapper */\n extraClass?: string;\n}>(), {\n themes: () => [\n {\n name: \"light\",\n label: \"Light\",\n colors: {\n primary: \"#3b82f6\",\n secondary: \"#8b5cf6\",\n accent: \"#f59e0b\",\n background: \"#ffffff\",\n surface: \"#f8fafc\",\n surfaceElevated: \"#f1f5f9\",\n text: \"#111827\",\n textMuted: \"#6b7280\",\n textInverse: \"#ffffff\",\n border: \"#e5e7eb\",\n ring: \"#3b82f6\",\n success: \"#10b981\",\n warning: \"#f59e0b\",\n error: \"#ef4444\",\n info: \"#3b82f6\",\n },\n },\n {\n name: \"dark\",\n label: \"Dark\",\n colors: {\n primary: \"#60a5fa\",\n secondary: \"#a78bfa\",\n accent: \"#fbbf24\",\n background: \"#0f172a\",\n surface: \"#1e293b\",\n surfaceElevated: \"#334155\",\n text: \"#f8fafc\",\n textMuted: \"#94a3b8\",\n textInverse: \"#0f172a\",\n border: \"#334155\",\n ring: \"#60a5fa\",\n success: \"#34d399\",\n warning: \"#fbbf24\",\n error: \"#f87171\",\n info: \"#60a5fa\",\n },\n },\n {\n name: \"sepia\",\n label: \"Sepia\",\n colors: {\n primary: \"#92400e\",\n secondary: \"#78350f\",\n accent: \"#d97706\",\n background: \"#fdf6e3\",\n surface: \"#f5e9c9\",\n surfaceElevated: \"#ede0b5\",\n text: \"#3c2415\",\n textMuted: \"#78583d\",\n textInverse: \"#fdf6e3\",\n border: \"#d6b896\",\n ring: \"#92400e\",\n success: \"#166534\",\n warning: \"#92400e\",\n error: \"#991b1b\",\n info: \"#1e40af\",\n },\n },\n ],\n strategy: \"attribute\",\n attribute: \"data-theme\",\n classPrefix: \"theme-\",\n target: \"html\",\n cssVarPrefix: \"--vmt-\",\n injectCssVars: true,\n storage: \"localStorage\",\n storageKey: \"vmt-theme\",\n respectSystemPreference: false,\n showToggle: true,\n showLabel: false,\n iconSize: 20,\n extraClass: \"\",\n});\n\nconst emit = defineEmits<{\n (e: \"change\", theme: ThemeDefinition): void;\n}>();\n\n// ── Resolve initial theme ───────────────────────────────────────────\nfunction getInitial(): string {\n if (props.storage !== \"none\") {\n const stored = readStorage(\n props.storageKey,\n props.storage as \"localStorage\" | \"sessionStorage\",\n );\n if (\n stored &&\n props.themes.some((t: ThemeDefinition) => t.name === stored)\n )\n return stored;\n }\n\n if (props.respectSystemPreference) {\n const pref = getSystemPreference();\n const match = props.themes.find(\n (t: ThemeDefinition) => t.name === pref,\n );\n if (match) return match.name;\n }\n\n if (\n props.defaultTheme &&\n props.themes.some((t: ThemeDefinition) => t.name === props.defaultTheme)\n ) {\n return props.defaultTheme;\n }\n\n return props.themes[0]?.name ?? \"light\";\n}\n\nconst currentName = ref<string>(getInitial());\nlet previousName: string | null = null;\n\nconst currentTheme = computed<ThemeDefinition>(\n () =>\n props.themes.find(\n (t: ThemeDefinition) => t.name === currentName.value,\n ) ?? props.themes[0],\n);\n\nconst isDark = computed<boolean>(() => {\n const bg = currentTheme.value.colors.background;\n if (bg) {\n try {\n const channels = normalizeToRgbChannels(bg);\n const parts = channels.split(' ').map(Number);\n if (parts.length === 3 && parts.every((n) => !Number.isNaN(n))) {\n const [r, g, b] = parts.map((v) => {\n const c = v / 255;\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b < 0.5;\n }\n } catch { /* fall through */ }\n }\n return currentName.value.toLowerCase().includes(\"dark\");\n});\n\n/** Returns the icon Component from the current theme, or null. */\nconst currentIconComponent = computed<Component | null>(\n () => (currentTheme.value.icon ?? null) as Component | null,\n);\n\n// ── Apply to DOM ────────────────────────────────────────────────────\nfunction applyTheme(name: string) {\n applyThemeToDom(name, previousName, {\n strategy: props.strategy,\n attribute: props.attribute,\n classPrefix: props.classPrefix,\n target: props.target,\n });\n previousName = name;\n\n if (props.storage !== \"none\") {\n writeStorage(\n props.storageKey,\n name,\n props.storage as \"localStorage\" | \"sessionStorage\",\n );\n }\n\n emit(\"change\", currentTheme.value);\n}\n\n// ── Actions ─────────────────────────────────────────────────────────\nfunction setTheme(name: string) {\n if (!props.themes.some((t: ThemeDefinition) => t.name === name)) {\n console.warn(`[VueMultipleThemes] Unknown theme: \"${name}\"`);\n return;\n }\n currentName.value = name;\n}\n\nfunction nextTheme() {\n const idx = props.themes.findIndex(\n (t: ThemeDefinition) => t.name === currentName.value,\n );\n currentName.value = props.themes[(idx + 1) % props.themes.length].name;\n}\n\nfunction prevTheme() {\n const idx = props.themes.findIndex(\n (t: ThemeDefinition) => t.name === currentName.value,\n );\n currentName.value =\n props.themes[\n (idx - 1 + props.themes.length) % props.themes.length\n ].name;\n}\n\nfunction toggleTheme() {\n if (props.themes.length < 2) return;\n if (props.themes.length === 2) {\n // Classic two-theme toggle\n const other = props.themes.find(\n (t: ThemeDefinition) => t.name !== currentName.value,\n );\n if (other) currentName.value = other.name;\n } else {\n // 3+ themes: cycle to next\n nextTheme();\n }\n}\n\n// ── Lifecycle ────────────────────────────────────────────────────────\n// Apply immediately in browser context to prevent flash of wrong theme on refresh.\nfunction ensureStylesAndApply() {\n if (props.injectCssVars) {\n const css = buildCssVars(props.themes, {\n strategy: props.strategy,\n attribute: props.attribute,\n classPrefix: props.classPrefix,\n cssVarPrefix: props.cssVarPrefix,\n target: props.target,\n });\n injectStyles(css);\n }\n applyTheme(currentName.value);\n}\n\nlet appliedInSetup = false;\nif (typeof document !== \"undefined\") {\n ensureStylesAndApply();\n appliedInSetup = true;\n}\n\nonMounted(() => {\n if (!appliedInSetup) {\n ensureStylesAndApply();\n }\n});\n\nwatch(currentName, (name) => {\n applyTheme(name);\n});\n\n// ── Ref-counted cleanup ─────────────────────────────────────────────\n// Only remove the shared <style> tag when ALL instances using this\n// storageKey are unmounted. Mirrors the pattern in useTheme.ts.\nconst _key = props.storageKey;\n_componentCounts.set(_key, (_componentCounts.get(_key) ?? 0) + 1);\n\nonBeforeUnmount(() => {\n const count = (_componentCounts.get(_key) ?? 1) - 1;\n _componentCounts.set(_key, count);\n if (count <= 0) {\n _componentCounts.delete(_key);\n removeStyles();\n }\n});\n</script>\n\n<template>\n <div class=\"vmt-root\" :class=\"[extraClass, isDark ? 'vmt-dark' : 'vmt-light']\">\n <!-- Default slot: completely custom UI -->\n <slot :current=\"currentTheme\" :themes=\"themes\" :set-theme=\"setTheme\" :next-theme=\"nextTheme\"\n :prev-theme=\"prevTheme\" :toggle-theme=\"toggleTheme\" :is-dark=\"isDark\">\n <!-- Built-in toggle button (shown when no default slot is provided) -->\n <button v-if=\"showToggle\" class=\"vmt-toggle\"\n :aria-label=\"'Current theme: ' + currentTheme.label + '. Click to switch theme.'\"\n :title=\"currentTheme.label\" @click=\"nextTheme\">\n <!-- icon: pass a Component as theme.icon, or use the #icon slot -->\n <span v-if=\"currentIconComponent || $slots.icon\" class=\"vmt-icon\">\n <slot name=\"icon\" :icon=\"currentIconComponent\" :size=\"iconSize\" :theme=\"currentTheme\">\n <VmtIcon v-if=\"currentIconComponent\" :as=\"currentIconComponent\" :size=\"iconSize\" />\n </slot>\n </span>\n <!-- label -->\n <span v-if=\"showLabel\" class=\"vmt-label\">\n {{ currentTheme.label }}\n </span>\n </button>\n </slot>\n\n <!-- Picker slot: list of all themes -->\n <slot name=\"picker\" :current=\"currentTheme\" :themes=\"themes\" :set-theme=\"setTheme\" />\n </div>\n</template>\n\n<style>\n.vmt-root {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n position: relative;\n}\n\n.vmt-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.6rem;\n border-radius: 0.5rem;\n border: 1px solid var(--vmt-border, #e5e7eb);\n background: var(--vmt-surface-color, transparent);\n color: var(--vmt-text-color, inherit);\n cursor: pointer;\n transition: background 0.2s, border-color 0.2s;\n outline: none;\n}\n\n.vmt-toggle:hover {\n background: var(--vmt-surface-elevated-color, rgba(0, 0, 0, 0.05));\n}\n\n.vmt-toggle:focus-visible {\n outline: 2px solid var(--vmt-ring-color, #4f46e5);\n outline-offset: 2px;\n}\n\n.vmt-icon {\n display: inline-flex;\n align-items: center;\n color: var(--vmt-icon-color, var(--vmt-text-color, currentColor));\n flex-shrink: 0;\n}\n\n.vmt-label {\n font-size: 0.875rem;\n font-weight: 500;\n white-space: nowrap;\n color: var(--vmt-text-color, inherit);\n}\n</style>\n","import {\n computed,\n onBeforeUnmount,\n onMounted,\n reactive,\n ref,\n watch,\n} from 'vue'\nimport type { ThemeDefinition, ThemeOptions, UseThemeReturn } from '../types'\nimport { buildCssVars, injectStyles, removeStyles } from '../utils/css-injector'\nimport { normalizeToRgbChannels } from '../utils/color'\nimport { applyThemeToDom, getSystemPreference, readStorage, writeStorage } from '../utils/dom'\n\n// ─── Shared singleton state (module-level) ────────────────────────────────────\n// Allows multiple useTheme() calls to share the same reactive state when\n// options match. We track instances per storage-key.\nconst singletons = new Map<\n string,\n {\n current: ReturnType<typeof ref<string>>\n options: ThemeOptions\n _count: number\n _mediaCleanup?: () => void\n }\n>()\n\nfunction getSingletonKey(options: ThemeOptions): string {\n const base = options.storageKey ?? 'vmt-theme'\n return options.namespace ? `${options.namespace}:${base}` : base\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/**\n * Determine if a theme is \"dark\" by checking the background color luminance.\n * Falls back to name-based check if no background color is defined.\n */\nfunction isThemeDark(theme: ThemeDefinition): boolean {\n const bg = theme.colors.background\n if (bg) {\n try {\n // Normalize to RGB channels, then reconstruct hex for luminance check\n const channels = normalizeToRgbChannels(bg)\n const parts = channels.split(' ').map(Number)\n if (parts.length === 3 && parts.every((n) => !Number.isNaN(n))) {\n // Calculate relative luminance: dark if < 0.5\n const [r, g, b] = parts.map((v) => {\n const c = v / 255\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4\n })\n const lum = 0.2126 * r + 0.7152 * g + 0.0722 * b\n return lum < 0.5\n }\n } catch {\n // Fall through to name-based check\n }\n }\n return (theme.name ?? '').toLowerCase().includes('dark')\n}\n\n/**\n * Parse a theme's colors into `{ r, g, b }` objects.\n */\nfunction resolveThemeColors(theme: ThemeDefinition): Record<string, { r: number; g: number; b: number }> {\n const result: Record<string, { r: number; g: number; b: number }> = {}\n for (const [key, value] of Object.entries(theme.colors)) {\n if (value === undefined) continue\n try {\n const channels = normalizeToRgbChannels(value)\n const parts = channels.split(' ').map(Number)\n if (parts.length === 3 && parts.every((n) => !Number.isNaN(n))) {\n result[key] = { r: parts[0], g: parts[1], b: parts[2] }\n }\n } catch {\n // Skip unparseable colors\n }\n }\n return result\n}\n\n// ─── Main composable ──────────────────────────────────────────────────────────\n/**\n * `useTheme(options)` – the core Composition-API composable.\n *\n * Returns reactive `ComputedRef` values that auto-unwrap in templates and can be\n * destructured for use with `watch()`:\n *\n * ```ts\n * const { current, isDark, setTheme } = useTheme({\n * themes: [lightTheme, darkTheme, oceanTheme],\n * defaultTheme: 'light',\n * strategy: 'both',\n * })\n *\n * // Watch for theme changes\n * watch(current, (name) => console.log('Theme changed to', name))\n *\n * // Use in template (auto-unwraps)\n * // <span>{{ current }}</span>\n * ```\n */\nexport function useTheme(options: ThemeOptions): UseThemeReturn {\n const {\n themes,\n defaultTheme,\n strategy = 'attribute',\n attribute = 'data-theme',\n classPrefix = 'theme-',\n target = 'html',\n storage = 'localStorage',\n storageKey = 'vmt-theme',\n injectCssVars = true,\n cssVarPrefix = '--vmt-',\n respectSystemPreference = false,\n namespace,\n onChange,\n onThemeChange,\n } = options\n\n if (themes.length === 0) {\n throw new Error('[vue-multiple-themes] `themes` array must not be empty.')\n }\n\n // ─── Resolve initial theme name ─────────────────────────────────────────\n function getInitialTheme(): string {\n // 1. Check storage\n if (storage !== 'none') {\n const stored = readStorage(storageKey, storage as 'localStorage' | 'sessionStorage')\n if (stored && themes.some((t) => t.name === stored)) return stored\n }\n\n // 2. OS preference\n if (respectSystemPreference) {\n const pref = getSystemPreference()\n const match = themes.find((t) => t.name === pref)\n if (match) return match.name\n }\n\n // 3. Explicit default\n if (defaultTheme && themes.some((t) => t.name === defaultTheme)) {\n return defaultTheme\n }\n\n // 4. First theme\n return themes[0].name\n }\n\n // ─── Singleton current-name ref ─────────────────────────────────────────\n const singletonKey = getSingletonKey(options)\n let singleton = singletons.get(singletonKey)\n let currentName: ReturnType<typeof ref<string>>\n\n if (singleton) {\n currentName = singleton.current\n } else {\n currentName = ref<string>(getInitialTheme())\n singleton = { current: currentName, options, _count: 0 }\n singletons.set(singletonKey, singleton)\n }\n\n // ─── Derived state (ComputedRefs) ──────────────────────────────────────\n const currentComputed = computed<string>(\n () => currentName.value ?? themes[0]?.name ?? '',\n )\n\n const themeComputed = computed<ThemeDefinition>(\n () => themes.find((t) => t.name === currentName.value) ?? themes[0],\n )\n\n const isDarkComputed = computed<boolean>(() => isThemeDark(themeComputed.value))\n\n const resolvedColorsComputed = computed<Record<string, { r: number; g: number; b: number }>>(\n () => resolveThemeColors(themeComputed.value),\n )\n\n // ─── Apply theme to DOM ─────────────────────────────────────────────────\n let previousName: string | null = null\n\n function applyTheme(name: string) {\n const oldName = previousName\n\n // Add transition class for smooth color changes\n if (typeof document !== 'undefined' && oldName !== null) {\n const el = document.documentElement\n el.classList.add('vmt-transitioning')\n // Remove after transition completes\n setTimeout(() => el.classList.remove('vmt-transitioning'), 250)\n }\n\n applyThemeToDom(name, previousName, { strategy, attribute, classPrefix, target })\n previousName = name\n\n if (storage !== 'none') {\n writeStorage(storageKey, name, storage as 'localStorage' | 'sessionStorage')\n }\n\n const def = themes.find((t) => t.name === name) ?? themes[0]\n onChange?.(def)\n\n // Fire onThemeChange callback with old and new theme names\n if (onThemeChange && oldName !== null && oldName !== name) {\n onThemeChange(name, oldName)\n }\n\n // Dispatch DOM custom event for non-Vue consumers\n if (typeof document !== 'undefined') {\n document.dispatchEvent(\n new CustomEvent('vmt:theme-change', {\n detail: { theme: name, previous: oldName, definition: def },\n }),\n )\n }\n }\n\n // ─── Inject CSS vars (once) ─────────────────────────────────────────────\n function ensureStyles() {\n if (!injectCssVars) return\n const css = buildCssVars(themes, { strategy, attribute, classPrefix, cssVarPrefix, target, namespace })\n injectStyles(css, namespace)\n }\n\n // ─── Actions ────────────────────────────────────────────────────────────\n function setTheme(name: string) {\n if (!themes.some((t) => t.name === name)) {\n console.warn(`[vue-multiple-themes] Unknown theme: \"${name}\"`)\n return\n }\n currentName.value = name\n }\n\n function nextTheme() {\n const idx = themes.findIndex((t) => t.name === currentName.value)\n currentName.value = themes[(idx + 1) % themes.length].name\n }\n\n function prevTheme() {\n const idx = themes.findIndex((t) => t.name === currentName.value)\n currentName.value = themes[(idx - 1 + themes.length) % themes.length].name\n }\n\n function toggleTheme() {\n if (themes.length < 2) return\n if (themes.length === 2) {\n const other = themes.find((t) => t.name !== currentName.value) ?? themes[1]\n currentName.value = other.name\n } else {\n nextTheme()\n }\n }\n\n // ─── System preference watcher ──────────────────────────────────────────\n function setupSystemPreferenceWatcher() {\n if (typeof window === 'undefined') return\n if (!respectSystemPreference) return\n if (singleton!._mediaCleanup) return // Already watching\n\n const mql = window.matchMedia('(prefers-color-scheme: dark)')\n const handler = (e: MediaQueryListEvent) => {\n const pref = e.matches ? 'dark' : 'light'\n const match = themes.find((t) => t.name === pref)\n if (match) {\n currentName.value = match.name\n }\n }\n mql.addEventListener('change', handler)\n singleton!._mediaCleanup = () => mql.removeEventListener('change', handler)\n }\n\n // ─── Lifecycle ──────────────────────────────────────────────────────────\n let appliedInSetup = false\n if (typeof document !== 'undefined') {\n ensureStyles()\n const initialName = currentName.value\n if (initialName) applyTheme(initialName)\n appliedInSetup = true\n setupSystemPreferenceWatcher()\n }\n\n onMounted(() => {\n if (!appliedInSetup) {\n ensureStyles()\n const mountedName = currentName.value\n if (mountedName) applyTheme(mountedName)\n setupSystemPreferenceWatcher()\n }\n })\n\n watch(currentName, (name) => {\n if (name) applyTheme(name)\n })\n\n // Clean up injected styles only when ALL instances are unmounted\n singleton._count++\n\n onBeforeUnmount(() => {\n const entry = singletons.get(singletonKey)\n if (entry) {\n entry._count--\n if (entry._count <= 0) {\n // Clean up system preference watcher\n entry._mediaCleanup?.()\n singletons.delete(singletonKey)\n removeStyles(namespace)\n }\n }\n })\n\n // Wrap in reactive() so ComputedRef properties auto-unwrap in Vue templates.\n // Both access patterns work:\n // Template: {{ ts.current }} — auto-unwrapped by reactive()\n // Script: ts.current.value — still a ComputedRef when destructured\n // Script: const { current } = ts; current.value — works as Ref\n return reactive({\n current: currentComputed,\n theme: themeComputed,\n isDark: isDarkComputed,\n themes,\n resolvedColors: resolvedColorsComputed,\n setTheme,\n nextTheme,\n prevTheme,\n toggleTheme,\n }) as UseThemeReturn\n}\n","<script setup lang=\"ts\">\n/**\n * VmtThemePicker.vue\n *\n * Headless dropdown/popover for selecting themes.\n * Provides keyboard navigation (arrow keys, Enter, Escape) and full ARIA support.\n * No built-in styles — use slots and Tailwind classes for custom styling.\n *\n * @example\n * ```vue\n * <VmtThemePicker :themes=\"themes\" v-slot=\"{ open, toggle, items, activeIndex }\">\n * <button @click=\"toggle\">{{ current }}</button>\n * <ul v-if=\"open\">\n * <li v-for=\"(item, i) in items\" :key=\"item.name\"\n * :class=\"{ active: i === activeIndex }\"\n * @click=\"item.select()\">\n * {{ item.label }}\n * </li>\n * </ul>\n * </VmtThemePicker>\n * ```\n */\nimport { computed, ref, onMounted, onBeforeUnmount } from 'vue'\nimport type { ThemeDefinition, ThemeOptions } from '../types'\nimport { useTheme } from '../composables/useTheme'\n\nconst props = withDefaults(\n defineProps<{\n /** All available themes */\n themes: ThemeDefinition[]\n /** Theme options passed to useTheme */\n defaultTheme?: string\n strategy?: ThemeOptions['strategy']\n storage?: ThemeOptions['storage']\n storageKey?: string\n /** Close dropdown when a theme is selected. Default: true */\n closeOnSelect?: boolean\n }>(),\n {\n strategy: 'both',\n storage: 'localStorage',\n storageKey: 'vmt-theme',\n closeOnSelect: true,\n },\n)\n\nconst emit = defineEmits<{\n (e: 'select', theme: ThemeDefinition): void\n (e: 'open'): void\n (e: 'close'): void\n}>()\n\nconst themeApi = useTheme({\n themes: props.themes,\n defaultTheme: props.defaultTheme,\n strategy: props.strategy,\n storage: props.storage,\n storageKey: props.storageKey,\n})\n\nconst isOpen = ref(false)\nconst activeIndex = ref(-1)\nconst pickerRef = ref<HTMLElement | null>(null)\n\nfunction toggle() {\n isOpen.value = !isOpen.value\n if (isOpen.value) {\n activeIndex.value = props.themes.findIndex((t) => t.name === themeApi.current)\n emit('open')\n } else {\n emit('close')\n }\n}\n\nfunction open() {\n if (!isOpen.value) {\n isOpen.value = true\n activeIndex.value = props.themes.findIndex((t) => t.name === themeApi.current)\n emit('open')\n }\n}\n\nfunction close() {\n if (isOpen.value) {\n isOpen.value = false\n activeIndex.value = -1\n emit('close')\n }\n}\n\nfunction selectTheme(theme: ThemeDefinition) {\n themeApi.setTheme(theme.name)\n emit('select', theme)\n if (props.closeOnSelect) {\n close()\n }\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (!isOpen.value) {\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault()\n open()\n }\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n activeIndex.value = (activeIndex.value + 1) % props.themes.length\n break\n case 'ArrowUp':\n e.preventDefault()\n activeIndex.value = (activeIndex.value - 1 + props.themes.length) % props.themes.length\n break\n case 'Enter':\n case ' ':\n e.preventDefault()\n if (activeIndex.value >= 0) {\n selectTheme(props.themes[activeIndex.value])\n }\n break\n case 'Escape':\n e.preventDefault()\n close()\n break\n case 'Home':\n e.preventDefault()\n activeIndex.value = 0\n break\n case 'End':\n e.preventDefault()\n activeIndex.value = props.themes.length - 1\n break\n }\n}\n\n// Close on outside click\nfunction onClickOutside(e: MouseEvent) {\n if (pickerRef.value && !pickerRef.value.contains(e.target as Node)) {\n close()\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', onClickOutside, true)\n})\n\nonBeforeUnmount(() => {\n document.removeEventListener('click', onClickOutside, true)\n})\n\nconst items = computed(() =>\n props.themes.map((theme) => ({\n name: theme.name,\n label: theme.label ?? theme.name,\n icon: theme.icon,\n colors: theme.colors,\n isActive: theme.name === themeApi.current,\n select: () => selectTheme(theme),\n })),\n)\n</script>\n\n<template>\n <div\n ref=\"pickerRef\"\n role=\"listbox\"\n :aria-expanded=\"isOpen\"\n aria-label=\"Theme picker\"\n @keydown=\"onKeydown\"\n tabindex=\"0\"\n >\n <slot\n :open=\"isOpen\"\n :toggle=\"toggle\"\n :close=\"close\"\n :items=\"items\"\n :active-index=\"activeIndex\"\n :current=\"themeApi.current\"\n :current-theme=\"themeApi.theme\"\n :is-dark=\"themeApi.isDark\"\n :set-theme=\"themeApi.setTheme\"\n :next-theme=\"themeApi.nextTheme\"\n :prev-theme=\"themeApi.prevTheme\"\n :toggle-theme=\"themeApi.toggleTheme\"\n />\n </div>\n</template>\n","/**\n * Vue plugin for vue-multiple-themes.\n *\n * Registers `<VueMultipleThemes>` globally and optionally applies the initial\n * theme before the app mounts (useful for SSR / SSG hydration).\n *\n * @example Vue 3\n * ```ts\n * import { createApp } from 'vue'\n * import { VueMultipleThemesPlugin } from 'vue-multiple-themes'\n *\n * createApp(App).use(VueMultipleThemesPlugin, {\n * themes: myThemes,\n * defaultTheme: 'light',\n * strategy: 'both',\n * }).mount('#app')\n * ```\n *\n * @example Vue 2\n * ```js\n * import Vue from 'vue'\n * import { VueMultipleThemesPlugin } from 'vue-multiple-themes'\n *\n * Vue.use(VueMultipleThemesPlugin, {\n * themes: myThemes,\n * defaultTheme: 'light',\n * })\n * ```\n */\n\nimport { type App } from 'vue'\nimport VueMultipleThemes from './components/VueMultipleThemes.vue'\nimport type { ThemeOptions } from './types'\nimport { buildCssVars, injectStyles } from './utils/css-injector'\nimport { applyThemeToDom, getSystemPreference, readStorage, writeStorage } from './utils/dom'\n\nexport const VueMultipleThemesPlugin = {\n install(app: App, options: ThemeOptions = { themes: [] }) {\n const {\n themes,\n defaultTheme,\n strategy = 'attribute',\n attribute = 'data-theme',\n classPrefix = 'theme-',\n target = 'html',\n storage = 'localStorage',\n storageKey = 'vmt-theme',\n injectCssVars = true,\n cssVarPrefix = '--vmt-',\n respectSystemPreference = false,\n namespace,\n } = options\n\n if (themes.length === 0) {\n console.warn('[vue-multiple-themes] Plugin installed with empty themes array.')\n return\n }\n\n // ── Resolve & apply initial theme immediately (before mount) ─────────\n let initialTheme = themes[0]?.name ?? 'light'\n let fromStorage = false\n\n // 1. Check storage first (highest priority — user's previous choice)\n if (storage !== 'none') {\n const stored = readStorage(storageKey, storage as 'localStorage' | 'sessionStorage')\n if (stored && themes.some((t) => t.name === stored)) {\n initialTheme = stored\n fromStorage = true\n }\n }\n\n // 2. OS preference (only when nothing was stored)\n if (!fromStorage && respectSystemPreference) {\n const pref = getSystemPreference()\n const match = themes.find((t) => t.name === pref)\n if (match) initialTheme = match.name\n }\n\n // 3. Explicit default (only when neither storage nor OS preference matched)\n if (!fromStorage && initialTheme === (themes[0]?.name ?? 'light') && defaultTheme && themes.some((t) => t.name === defaultTheme)) {\n initialTheme = defaultTheme\n }\n\n // Inject CSS vars into <head> immediately\n if (injectCssVars) {\n const css = buildCssVars(themes, { strategy, attribute, classPrefix, cssVarPrefix, target, namespace })\n injectStyles(css, namespace)\n }\n\n // Persist the resolved theme so the composable picks up the same value\n if (storage !== 'none') {\n writeStorage(storageKey, initialTheme, storage as 'localStorage' | 'sessionStorage')\n }\n\n // Apply theme to DOM\n applyThemeToDom(initialTheme, null, { strategy, attribute, classPrefix, target })\n\n // ── Register global component ─────────────────────────────────────────\n app.component('VueMultipleThemes', VueMultipleThemes)\n\n // ── Provide the options for injection ────────────────────────────────\n if (typeof app.provide === 'function') {\n const provideKey = namespace ? `vmt:options:${namespace}` : 'vmt:options'\n app.provide(provideKey, options)\n }\n },\n}\n","/**\n * `createBrandContext` — factory for isolated, namespaced theme contexts.\n *\n * Use this when you need multiple independent theme engines in the same Vue\n * application — e.g. white-label setups, micro-frontends, or embeddable\n * widgets where each brand manages its own palette, storage key, and CSS\n * variable namespace.\n *\n * Each context gets:\n * - A scoped `<style>` tag (`id=\"vmt-theme-styles-<namespace>\"`)\n * - An isolated singleton reactive state (keyed by `<namespace>:<storageKey>`)\n * - A namespaced `provide` key (`\"vmt:options:<namespace>\"`)\n *\n * @example\n * ```ts\n * // brand-a.ts\n * import { createBrandContext } from 'vue-multiple-themes'\n * import brandAThemes from './themes/brand-a'\n *\n * export const brandA = createBrandContext({\n * namespace: 'brand-a',\n * themes: brandAThemes,\n * storageKey: 'brand-a-theme',\n * cssVarPrefix: '--brand-a-',\n * defaultTheme: 'light',\n * strategy: 'both',\n * })\n *\n * // In main.ts:\n * app.use(brandA.BrandPlugin)\n *\n * // In any component:\n * const { current, setTheme, isDark } = brandA.useTheme()\n * ```\n *\n * @example Multiple brands in one app\n * ```ts\n * const acme = createBrandContext({ namespace: 'acme', themes: acmeThemes, cssVarPrefix: '--acme-' })\n * const beta = createBrandContext({ namespace: 'beta', themes: betaThemes, cssVarPrefix: '--beta-' })\n *\n * app.use(acme.BrandPlugin)\n * app.use(beta.BrandPlugin)\n * ```\n */\n\nimport type { App } from 'vue'\nimport type { ThemeOptions, UseThemeReturn } from '../types'\nimport { useTheme } from './useTheme'\nimport { VueMultipleThemesPlugin } from '../plugin'\n\nexport interface BrandContext {\n /** The namespace string that was used to create this context. */\n readonly namespace: string\n /**\n * Composable — returns the reactive theme state for this brand context.\n * Optionally accepts partial overrides (e.g. to temporarily swap themes).\n */\n useTheme: (overrides?: Partial<ThemeOptions>) => UseThemeReturn\n /**\n * Vue plugin — install this into your `app` to register the global\n * `<VueMultipleThemes>` component and apply the initial theme.\n *\n * @example app.use(brandA.BrandPlugin)\n * @example app.use(brandA.BrandPlugin, { defaultTheme: 'dark' }) // override\n */\n BrandPlugin: {\n install: (app: App, overrides?: Partial<ThemeOptions>) => void\n }\n}\n\n/**\n * Create an isolated, namespaced brand context.\n *\n * @param defaults - Base options for this brand. `namespace` is required and\n * must be **unique per application** to prevent state collisions.\n */\nexport function createBrandContext(\n defaults: ThemeOptions & { namespace: string },\n): BrandContext {\n const { namespace } = defaults\n\n return {\n namespace,\n\n useTheme(overrides?: Partial<ThemeOptions>): UseThemeReturn {\n return useTheme({ ...defaults, ...overrides, namespace })\n },\n\n BrandPlugin: {\n install(app: App, overrides: Partial<ThemeOptions> = {}): void {\n VueMultipleThemesPlugin.install(app, { ...defaults, ...overrides, namespace })\n },\n },\n }\n}\n","/**\n * @deprecated The built-in icon registry has been removed in v6.\n *\n * Import icon components directly from `lucide-vue-next` or any Vue icon\n * library and pass them via `<VmtIcon :as=\"IconComponent\" />` or\n * `ThemeDefinition.icon`.\n *\n * @module\n */\n\n/**\n * @deprecated No icon data is shipped by vue-multiple-themes.\n * Import icon components directly from lucide-vue-next or any Vue icon library\n * and pass them to <VmtIcon :as=\"IconComponent\" /> or ThemeDefinition.icon.\n */\nexport const LUCIDE_ICONS: Record<string, never> = {}\n\n/** @deprecated See LUCIDE_ICONS. */\nexport interface LucideIconData {\n path: string\n extra?: string\n}\n\n/** @deprecated See LUCIDE_ICONS. */\nexport function getIcon(_name: string): undefined {\n return undefined\n}\n\n/**\n * @deprecated The built-in SVG path registry has been removed.\n * Returns an empty string. Replace with your icon library.\n */\nexport function iconToSvg(_name: string, _size?: number, _color?: string, _strokeWidth?: number): string {\n return ''\n}\n","/**\n * generate-theme.ts\n *\n * Developer-experience utilities that solve the #1 pain point:\n * \"I have a brand color — how do I get a full theme from it?\"\n *\n * Core functions:\n * generateLightTheme(baseColor, options) → ThemeDefinition\n * generateDarkTheme(baseColor, options) → ThemeDefinition\n * generateThemePair(baseColor, options) → [light, dark] ThemeDefinition[]\n * generateSeasonalTheme(season, options) → ThemeDefinition\n * generateFromCssVar(varName, options) → CSS string (runtime, browser-only)\n */\n\nimport type { Component } from 'vue'\nimport type { ThemeColors, ThemeDefinition } from '../types'\nimport {\n autoContrast,\n contrastRatio,\n ensureContrast,\n hexToHsl,\n hslToHex,\n lighten,\n mix,\n saturate,\n withAlpha,\n} from './color'\n\nexport interface GenerateThemeOptions {\n /** Theme name (slug used in DOM, e.g. 'brand-light') */\n name?: string\n /** Human-readable label */\n label?: string\n /** Optional icon component (e.g. from `lucide-vue-next`) */\n icon?: Component\n /**\n * Saturation boost/reduction for background tones.\n * Positive = more colorful surfaces, negative = more neutral.\n * Default: 0\n */\n saturationBias?: number\n /**\n * Whether to tint surfaces with the brand hue (default: true).\n * Set false for pure white/dark surfaces.\n */\n tintedSurfaces?: boolean\n /**\n * Accent color override. Defaults to an analogous color of the primary.\n */\n accentColor?: string\n /**\n * Extra classes appended to the theme's `extraClasses` array.\n */\n extraClasses?: string[]\n}\n\n// ─── Light theme generator ────────────────────────────────────────────────────\n\n/**\n * Generate a WCAG-compliant light theme from a single brand color.\n *\n * @example\n * const myTheme = generateLightTheme('#7c3aed', { name: 'brand', label: 'Brand' })\n */\nexport function generateLightTheme(\n primaryHex: string,\n options: GenerateThemeOptions = {},\n): ThemeDefinition {\n const {\n name = 'generated-light',\n label = 'Light',\n icon,\n saturationBias = 0,\n tintedSurfaces = true,\n accentColor,\n extraClasses = [],\n } = options\n\n const [h, s] = hexToHsl(primaryHex)\n const surfaceSat = tintedSurfaces ? Math.max(0, s * 0.08 + saturationBias) : 0\n const secondary = hslToHex(h, Math.max(0, s - 15), Math.min(70, hexToHsl(primaryHex)[2] + 10))\n const accent = accentColor ?? hslToHex((h + 30) % 360, Math.min(100, s + 5), 55)\n\n const background = hslToHex(h, surfaceSat, 99)\n const surface = hslToHex(h, surfaceSat + 1, 97)\n const surfaceElevated = hslToHex(h, surfaceSat + 2, 94)\n const border = hslToHex(h, surfaceSat + 4, 88)\n\n // Ensure primary is visible on white background (darken if needed)\n const primary = ensureContrast(primaryHex, background, 3)\n\n const text = ensureContrast(hslToHex(h, Math.min(20, s * 0.3), 12), background, 7)\n const textMuted = ensureContrast(hslToHex(h, Math.min(15, s * 0.2), 40), background, 4.5)\n const textInverse = autoContrast(primary, '#ffffff', '#000000') === '#ffffff'\n ? '#ffffff'\n : '#1a1a1a'\n\n const colors: ThemeColors = {\n primary,\n secondary,\n accent,\n background,\n surface,\n surfaceElevated,\n text,\n textMuted,\n textInverse,\n border,\n ring: withAlpha(primary, 0.4),\n success: '#16a34a',\n warning: '#d97706',\n error: '#dc2626',\n info: primary,\n }\n\n return { name, label, icon, colors, extraClasses }\n}\n\n// ─── Dark theme generator ─────────────────────────────────────────────────────\n\n/**\n * Generate a WCAG-compliant dark theme from a single brand color.\n *\n * @example\n * const myDark = generateDarkTheme('#7c3aed', { name: 'brand-dark', label: 'Dark' })\n */\nexport function generateDarkTheme(\n primaryHex: string,\n options: GenerateThemeOptions = {},\n): ThemeDefinition {\n const {\n name = 'generated-dark',\n label = 'Dark',\n icon,\n saturationBias = 0,\n tintedSurfaces = true,\n accentColor,\n extraClasses = [],\n } = options\n\n const [h, s] = hexToHsl(primaryHex)\n const surfaceSat = tintedSurfaces ? Math.max(0, s * 0.12 + saturationBias) : 0\n\n // Lighten the primary so it's visible on dark backgrounds\n const primary = lighten(saturate(primaryHex, 10), 15)\n const secondary = hslToHex(h, Math.max(0, s - 10), 75)\n const accent = accentColor ?? hslToHex((h + 30) % 360, Math.min(100, s + 10), 70)\n\n const background = hslToHex(h, surfaceSat, 7)\n const surface = hslToHex(h, surfaceSat + 1, 11)\n const surfaceElevated = hslToHex(h, surfaceSat + 2, 16)\n const border = hslToHex(h, surfaceSat + 3, 22)\n\n const text = hslToHex(h, Math.min(15, s * 0.1), 96)\n const textMuted = hslToHex(h, Math.min(12, s * 0.08), 60)\n const textInverse = hslToHex(h, Math.min(20, s * 0.3), 10)\n\n const colors: ThemeColors = {\n primary,\n secondary,\n accent,\n background,\n surface,\n surfaceElevated,\n text,\n textMuted,\n textInverse,\n border,\n ring: withAlpha(primary, 0.5),\n success: '#4ade80',\n warning: '#fb923c',\n error: '#f87171',\n info: primary,\n }\n\n return { name, label, icon, colors, extraClasses }\n}\n\n// ─── Pair generator ───────────────────────────────────────────────────────────\n\n/**\n * Generate a matched [light, dark] `ThemeDefinition` pair from one color.\n *\n * @example\n * const [light, dark] = generateThemePair('#7c3aed')\n * app.use(VueMultipleThemesPlugin, { themes: [...generateThemePair('#7c3aed')] })\n */\nexport function generateThemePair(\n primaryHex: string,\n options: {\n lightName?: string\n darkName?: string\n lightLabel?: string\n darkLabel?: string\n saturationBias?: number\n tintedSurfaces?: boolean\n } = {},\n): [ThemeDefinition, ThemeDefinition] {\n const {\n lightName = 'light',\n darkName = 'dark',\n lightLabel = 'Light',\n darkLabel = 'Dark',\n saturationBias,\n tintedSurfaces,\n } = options\n\n return [\n generateLightTheme(primaryHex, {\n name: lightName,\n label: lightLabel,\n saturationBias,\n tintedSurfaces,\n }),\n generateDarkTheme(primaryHex, {\n name: darkName,\n label: darkLabel,\n saturationBias,\n tintedSurfaces,\n }),\n ]\n}\n\n// ─── Palette from multiple brand colors ───────────────────────────────────────\n\nexport interface BrandPalette {\n primary: string\n secondary?: string\n accent?: string\n}\n\n/**\n * Generate a full theme from a complete brand palette.\n * More control than the single-color generators.\n */\nexport function generateThemeFromPalette(\n palette: BrandPalette,\n variant: 'light' | 'dark',\n options: GenerateThemeOptions = {},\n): ThemeDefinition {\n const base = variant === 'light'\n ? generateLightTheme(palette.primary, options)\n : generateDarkTheme(palette.primary, options)\n\n return {\n ...base,\n colors: {\n ...base.colors,\n ...(palette.secondary ? { secondary: palette.secondary } : {}),\n ...(palette.accent ? { accent: palette.accent } : {}),\n },\n }\n}\n\n// ─── Seasonal / mood presets ──────────────────────────────────────────────────\n\ntype Season = 'spring' | 'summer' | 'autumn' | 'winter' | 'midnight' | 'neon' | 'pastel'\n\nconst SEASON_COLORS: Record<Season, string> = {\n spring: '#34d399', // emerald green\n summer: '#f59e0b', // amber\n autumn: '#b45309', // burnt orange\n winter: '#7dd3fc', // icy blue\n midnight: '#6366f1', // indigo\n neon: '#22d3ee', // cyan\n pastel: '#f9a8d4', // rose\n}\n\n/**\n * Generate a light + dark theme pair for a named mood/season.\n *\n * @example\n * const themes = generateSeasonalThemes('midnight')\n */\nexport function generateSeasonalThemes(season: Season): [ThemeDefinition, ThemeDefinition] {\n const base = SEASON_COLORS[season]\n return generateThemePair(base, {\n lightName: `${season}-light`,\n darkName: `${season}-dark`,\n lightLabel: `${capitalize(season)} Light`,\n darkLabel: `${capitalize(season)} Dark`,\n })\n}\n\n// ─── CSS color-mix() integration (browser only) ───────────────────────────────\n\n/**\n * Build CSS custom properties using `color-mix()` so the browser does the\n * heavy lifting at runtime. Returns a CSS string ready to inject into a\n * `<style>` tag.\n *\n * > **Browser-only**: `color-mix()` requires a modern browser (Chrome 111+,\n * > Firefox 113+, Safari 16.2+). For SSR or older browsers, prefer the\n * > static generators above.\n *\n * @example\n * import { buildCssMixTheme } from 'vue-multiple-themes'\n * const css = buildCssMixTheme('#7c3aed', 'brand')\n * document.head.insertAdjacentHTML('beforeend', `<style>${css}</style>`)\n */\nexport function buildCssMixTheme(\n primaryHex: string,\n name: string,\n variant: 'light' | 'dark' = 'light',\n): string {\n const base = variant === 'dark' ? '#000000' : '#ffffff'\n const selector = `[data-theme=\"${name}\"]`\n\n const steps = variant === 'light'\n ? { bg: '98%', surface: '95%', border: '85%', text: '10%' }\n : { bg: '8%', surface: '14%', border: '24%', text: '96%' }\n\n return `\n${selector} {\n --vmt-primary: ${primaryHex};\n --vmt-background: color-mix(in oklch, ${primaryHex} 3%, ${base} ${steps.bg});\n --vmt-surface: color-mix(in oklch, ${primaryHex} 5%, ${base} ${steps.surface});\n --vmt-surface-elevated: color-mix(in oklch, ${primaryHex} 8%, ${base});\n --vmt-border: color-mix(in oklch, ${primaryHex} 15%, ${base} ${steps.border});\n --vmt-foreground: color-mix(in oklch, ${primaryHex} 10%, ${base === '#ffffff' ? '#000000' : '#ffffff'} ${steps.text});\n --vmt-foreground-muted: color-mix(in oklch, var(--vmt-foreground) 60%, ${base});\n --vmt-ring: color-mix(in oklch, ${primaryHex} 50%, transparent);\n}`.trim()\n}\n\n// ─── Adaptive theme (detects CSS vars at runtime, browser-only) ───────────────\n\n/**\n * Read the current CSS custom properties from the document and return them\n * as a `ThemeColors` object. Useful for syncing with design tokens from\n * another design system.\n *\n * @browser-only\n */\nexport function readCssVarsAsColors(\n varMap: Partial<Record<keyof ThemeColors, string>>,\n element: Element = document.documentElement,\n): Partial<ThemeColors> {\n const styles = getComputedStyle(element)\n const result: Partial<ThemeColors> = {}\n for (const [key, varName] of Object.entries(varMap)) {\n const value = styles.getPropertyValue(varName as string).trim()\n if (value) {\n result[key as keyof ThemeColors] = value\n }\n }\n return result\n}\n\n// ─── Contrast checker utility ─────────────────────────────────────────────────\n\nexport interface ContrastReport {\n ratio: number\n aa: boolean\n aaLarge: boolean\n aaa: boolean\n aaaLarge: boolean\n}\n\n/**\n * Analyse a text/background color combination against WCAG 2.1 levels.\n *\n * @example\n * const report = checkContrast('#7c3aed', '#ffffff')\n * console.log(report.aa) // true\n */\nexport function checkContrast(foreground: string, background: string): ContrastReport {\n const ratio = contrastRatio(foreground, background)\n return {\n ratio: Math.round(ratio * 100) / 100,\n aa: ratio >= 4.5,\n aaLarge: ratio >= 3,\n aaa: ratio >= 7,\n aaaLarge: ratio >= 4.5,\n }\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n","import type { ThemeDefinition } from '../types'\n\n// ─── Light (default) ──────────────────────────────────────────────────────────\nexport const lightTheme: ThemeDefinition = {\n name: 'light',\n label: 'Light',\n colors: {\n primary: '#3b82f6',\n primaryLight: '#93c5fd',\n primaryDark: '#1d4ed8',\n secondary: '#8b5cf6',\n accent: '#f59e0b',\n background: '#ffffff',\n surface: '#f8fafc',\n surfaceElevated: '#f1f5f9',\n text: '#111827',\n textMuted: '#6b7280',\n textInverse: '#ffffff',\n border: '#e5e7eb',\n ring: '#3b82f6',\n success: '#10b981',\n warning: '#f59e0b',\n error: '#ef4444',\n info: '#3b82f6',\n },\n}\n\n// ─── Dark ─────────────────────────────────────────────────────────────────────\nexport const darkTheme: ThemeDefinition = {\n name: 'dark',\n label: 'Dark',\n colors: {\n primary: '#60a5fa',\n primaryLight: '#bfdbfe',\n primaryDark: '#3b82f6',\n secondary: '#a78bfa',\n accent: '#fbbf24',\n background: '#0f172a',\n surface: '#1e293b',\n surfaceElevated: '#334155',\n text: '#f8fafc',\n textMuted: '#94a3b8',\n textInverse: '#0f172a',\n border: '#334155',\n ring: '#60a5fa',\n success: '#34d399',\n warning: '#fbbf24',\n error: '#f87171',\n info: '#60a5fa',\n },\n}\n\n// ─── Sepia ────────────────────────────────────────────────────────────────────\nexport const sepiaTheme: ThemeDefinition = {\n name: 'sepia',\n label: 'Sepia',\n colors: {\n primary: '#92400e',\n primaryLight: '#d97706',\n primaryDark: '#78350f',\n secondary: '#78350f',\n accent: '#d97706',\n background: '#fdf6e3',\n surface: '#f5e9c9',\n surfaceElevated: '#ede0b5',\n text: '#3c2415',\n textMuted: '#78583d',\n textInverse: '#fdf6e3',\n border: '#d6b896',\n ring: '#92400e',\n success: '#166534',\n warning: '#92400e',\n error: '#991b1b',\n info: '#1e40af',\n },\n}\n\n// ─── Ocean ────────────────────────────────────────────────────────────────────\nexport const oceanTheme: ThemeDefinition = {\n name: 'ocean',\n label: 'Ocean',\n colors: {\n primary: '#0ea5e9',\n primaryLight: '#7dd3fc',\n primaryDark: '#0369a1',\n secondary: '#06b6d4',\n accent: '#f0abfc',\n background: '#0c1a2e',\n surface: '#132338',\n surfaceElevated: '#1b3554',\n text: '#e0f2fe',\n textMuted: '#7dd3fc',\n textInverse: '#0c1a2e',\n border: '#1e4877',\n ring: '#0ea5e9',\n success: '#34d399',\n warning: '#fbbf24',\n error: '#f87171',\n info: '#38bdf8',\n },\n}\n\n// ─── Forest ───────────────────────────────────────────────────────────────────\nexport const forestTheme: ThemeDefinition = {\n name: 'forest',\n label: 'Forest',\n colors: {\n primary: '#16a34a',\n primaryLight: '#86efac',\n primaryDark: '#166534',\n secondary: '#15803d',\n accent: '#84cc16',\n background: '#052e16',\n surface: '#14532d',\n surfaceElevated: '#166534',\n text: '#dcfce7',\n textMuted: '#86efac',\n textInverse: '#052e16',\n border: '#166534',\n ring: '#16a34a',\n success: '#4ade80',\n warning: '#facc15',\n error: '#f87171',\n info: '#60a5fa',\n },\n}\n\n// ─── Sunset ───────────────────────────────────────────────────────────────────\nexport const sunsetTheme: ThemeDefinition = {\n name: 'sunset',\n label: 'Sunset',\n colors: {\n primary: '#f97316',\n primaryLight: '#fdba74',\n primaryDark: '#c2410c',\n secondary: '#fb923c',\n accent: '#facc15',\n background: '#1c0a00',\n surface: '#2d1507',\n surfaceElevated: '#3f2010',\n text: '#fff7ed',\n textMuted: '#fdba74',\n textInverse: '#1c0a00',\n border: '#7c2d12',\n ring: '#f97316',\n success: '#4ade80',\n warning: '#facc15',\n error: '#f87171',\n info: '#60a5fa',\n },\n}\n\n// ─── Winter ───────────────────────────────────────────────────────────────────\nexport const winterTheme: ThemeDefinition = {\n name: 'winter',\n label: 'Winter',\n colors: {\n primary: '#818cf8',\n primaryLight: '#c7d2fe',\n primaryDark: '#4f46e5',\n secondary: '#a5b4fc',\n accent: '#67e8f9',\n background: '#0f0f23',\n surface: '#1a1a3e',\n surfaceElevated: '#252550',\n text: '#e0e7ff',\n textMuted: '#a5b4fc',\n textInverse: '#0f0f23',\n border: '#312e81',\n ring: '#818cf8',\n success: '#4ade80',\n warning: '#fbbf24',\n error: '#f87171',\n info: '#67e8f9',\n },\n}\n\n// ─── All presets ──────────────────────────────────────────────────────────────\nexport const PRESET_THEMES: ThemeDefinition[] = [\n lightTheme,\n darkTheme,\n sepiaTheme,\n oceanTheme,\n forestTheme,\n sunsetTheme,\n winterTheme,\n]\n"],"names":["normalizeToRgbChannels","_openBlock","_createBlock","_resolveDynamicComponent","ref","computed","onMounted","watch","onBeforeUnmount","_createElementBlock","_normalizeClass","_renderSlot","$slots","VmtIcon","_toDisplayString","reactive","_unref","VueMultipleThemes","hexToHsl","hslToHex","ensureContrast","autoContrast","withAlpha","lighten","saturate","contrastRatio"],"mappings":"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"}
|
|
@@ -355,8 +355,8 @@ export declare function generateThemePair(primaryHex: string, options?: {
|
|
|
355
355
|
tintedSurfaces?: boolean;
|
|
356
356
|
}): [ThemeDefinition, ThemeDefinition];
|
|
357
357
|
|
|
358
|
-
/** @deprecated
|
|
359
|
-
export declare function getIcon(_name: string):
|
|
358
|
+
/** @deprecated See LUCIDE_ICONS. */
|
|
359
|
+
export declare function getIcon(_name: string): undefined;
|
|
360
360
|
|
|
361
361
|
/** Return the `<style>` element id for the given namespace. */
|
|
362
362
|
export declare function getStyleId(namespace?: string): string;
|
|
@@ -373,9 +373,9 @@ export declare function hslToRgb(h: number, s: number, l: number): RGB;
|
|
|
373
373
|
|
|
374
374
|
/**
|
|
375
375
|
* @deprecated The built-in SVG path registry has been removed.
|
|
376
|
-
* Returns
|
|
376
|
+
* Returns an empty string. Replace with your icon library.
|
|
377
377
|
*/
|
|
378
|
-
export declare function iconToSvg(_name: string,
|
|
378
|
+
export declare function iconToSvg(_name: string, _size?: number, _color?: string, _strokeWidth?: number): string;
|
|
379
379
|
|
|
380
380
|
/** Inject (or update) a `<style>` tag with the generated CSS into `<head>`. */
|
|
381
381
|
export declare function injectStyles(css: string, namespace?: string): void;
|
|
@@ -385,32 +385,14 @@ export declare function lighten(hex: string, amount: number): string;
|
|
|
385
385
|
|
|
386
386
|
export declare const lightTheme: ThemeDefinition;
|
|
387
387
|
|
|
388
|
-
/** @deprecated Use `lucide-vue-next` or another icon library directly. */
|
|
389
|
-
export declare const LUCIDE_ICONS: Record<string, LucideIconData>;
|
|
390
|
-
|
|
391
388
|
/**
|
|
392
|
-
* @deprecated
|
|
393
|
-
*
|
|
394
|
-
*
|
|
395
|
-
* - `lucide-vue-next` (recommended)
|
|
396
|
-
* - `@heroicons/vue`
|
|
397
|
-
* - `@phosphor-icons/vue`
|
|
398
|
-
*
|
|
399
|
-
* Pass the component to `VmtIcon` via its `as` prop, or assign it directly
|
|
400
|
-
* as `ThemeDefinition.icon`:
|
|
401
|
-
*
|
|
402
|
-
* ```ts
|
|
403
|
-
* import { Sun, Moon } from 'lucide-vue-next'
|
|
404
|
-
*
|
|
405
|
-
* const themes = [
|
|
406
|
-
* { name: 'light', label: 'Light', icon: Sun, colors: { ... } },
|
|
407
|
-
* { name: 'dark', label: 'Dark', icon: Moon, colors: { ... } },
|
|
408
|
-
* ]
|
|
409
|
-
* ```
|
|
410
|
-
*
|
|
411
|
-
* @module
|
|
389
|
+
* @deprecated No icon data is shipped by vue-multiple-themes.
|
|
390
|
+
* Import icon components directly from lucide-vue-next or any Vue icon library
|
|
391
|
+
* and pass them to <VmtIcon :as="IconComponent" /> or ThemeDefinition.icon.
|
|
412
392
|
*/
|
|
413
|
-
|
|
393
|
+
export declare const LUCIDE_ICONS: Record<string, never>;
|
|
394
|
+
|
|
395
|
+
/** @deprecated See LUCIDE_ICONS. */
|
|
414
396
|
export declare interface LucideIconData {
|
|
415
397
|
path: string;
|
|
416
398
|
extra?: string;
|