vartheme 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
  ### Zero-config, CSS variable based theme switching for React
3
3
  **Dark mode in one line. Clean. Fast. Modern.**
4
4
 
5
+ 🌐 **Website:** [vartheme.vercel.app](https://vartheme.vercel.app)
6
+
5
7
  [![npm version](https://img.shields.io/npm/v/vartheme)](https://www.npmjs.com/package/vartheme)
6
8
  [![bundle size](https://img.shields.io/bundlephobia/minzip/vartheme)](https://bundlephobia.com/package/vartheme)
7
9
  [![license](https://img.shields.io/npm/l/vartheme)](./LICENSE)
package/dist/index.d.mts CHANGED
@@ -53,7 +53,14 @@ interface ThemePreset {
53
53
  dark: ThemeColors;
54
54
  }
55
55
  declare const BUILT_IN_THEMES: Record<string, ThemePreset>;
56
+ interface CreateThemeOptions {
57
+ name: string;
58
+ light: ThemeColors;
59
+ dark: ThemeColors;
60
+ }
61
+ declare function createTheme(options: CreateThemeOptions): string;
56
62
  declare function getTheme(name: string): ThemePreset;
63
+ declare function getAllThemes(): ThemePreset[];
57
64
 
58
65
  declare function useTheme(initial?: ThemeMode, initialTheme?: ThemeName): ThemeState;
59
66
 
@@ -67,4 +74,4 @@ interface ThemeProviderProps {
67
74
  declare function ThemeProvider({ children, mode, theme, colors, transitions, }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
68
75
  declare function useThemeContext(): ThemeState;
69
76
 
70
- export { BUILT_IN_THEMES, type ThemeColors, type ThemeConfig, type ThemeMode, type ThemeName, ThemeProvider, type ThemeState, ThemeToggle, clearStorage, getDefaultColors, getSystemMode, getTheme, injectCSSVariables, isBrowser, loadColors, loadMode, saveColors, saveMode, useTheme, useThemeContext, watchSystemMode };
77
+ export { BUILT_IN_THEMES, type CreateThemeOptions, type ThemeColors, type ThemeConfig, type ThemeMode, type ThemeName, ThemeProvider, type ThemeState, ThemeToggle, clearStorage, createTheme, getAllThemes, getDefaultColors, getSystemMode, getTheme, injectCSSVariables, isBrowser, loadColors, loadMode, saveColors, saveMode, useTheme, useThemeContext, watchSystemMode };
package/dist/index.d.ts CHANGED
@@ -53,7 +53,14 @@ interface ThemePreset {
53
53
  dark: ThemeColors;
54
54
  }
55
55
  declare const BUILT_IN_THEMES: Record<string, ThemePreset>;
56
+ interface CreateThemeOptions {
57
+ name: string;
58
+ light: ThemeColors;
59
+ dark: ThemeColors;
60
+ }
61
+ declare function createTheme(options: CreateThemeOptions): string;
56
62
  declare function getTheme(name: string): ThemePreset;
63
+ declare function getAllThemes(): ThemePreset[];
57
64
 
58
65
  declare function useTheme(initial?: ThemeMode, initialTheme?: ThemeName): ThemeState;
59
66
 
@@ -67,4 +74,4 @@ interface ThemeProviderProps {
67
74
  declare function ThemeProvider({ children, mode, theme, colors, transitions, }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
68
75
  declare function useThemeContext(): ThemeState;
69
76
 
70
- export { BUILT_IN_THEMES, type ThemeColors, type ThemeConfig, type ThemeMode, type ThemeName, ThemeProvider, type ThemeState, ThemeToggle, clearStorage, getDefaultColors, getSystemMode, getTheme, injectCSSVariables, isBrowser, loadColors, loadMode, saveColors, saveMode, useTheme, useThemeContext, watchSystemMode };
77
+ export { BUILT_IN_THEMES, type CreateThemeOptions, type ThemeColors, type ThemeConfig, type ThemeMode, type ThemeName, ThemeProvider, type ThemeState, ThemeToggle, clearStorage, createTheme, getAllThemes, getDefaultColors, getSystemMode, getTheme, injectCSSVariables, isBrowser, loadColors, loadMode, saveColors, saveMode, useTheme, useThemeContext, watchSystemMode };
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
- 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime');var M={primary:"#7C3AED",background:"#FFFFFF",surface:"#F8FAFC",text:"#0F172A",border:"#E2E8F0",accent:"#06B6D4"},B={primary:"#A78BFA",background:"#0F172A",surface:"#1E293B",text:"#F8FAFC",border:"#334155",accent:"#22D3EE"};function u(e,r){let o=document.documentElement,t={...r==="dark"?B:M,...e};o.setAttribute("data-theme",r),Object.entries(t).forEach(([s,i])=>{o.style.setProperty(`--vt-${s}`,i);});}function I(){let e=document.createElement("style");e.id="vartheme-transitions",e.textContent=`
1
+ 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime');var B={primary:"#7C3AED",background:"#FFFFFF",surface:"#F8FAFC",text:"#0F172A",border:"#E2E8F0",accent:"#06B6D4"},P={primary:"#A78BFA",background:"#0F172A",surface:"#1E293B",text:"#F8FAFC",border:"#334155",accent:"#22D3EE"};function f(e,o){let r=document.documentElement,t={...o==="dark"?P:B,...e};r.setAttribute("data-theme",o),Object.entries(t).forEach(([n,i])=>{r.style.setProperty(`--vt-${n}`,i);});}function I(){let e=document.createElement("style");e.id="vartheme-transitions",e.textContent=`
2
2
  *, *::before, *::after {
3
3
  transition:
4
4
  background-color 0.3s ease,
5
5
  color 0.3s ease,
6
6
  border-color 0.3s ease !important;
7
7
  }
8
- `,document.head.appendChild(e);}function T(e){return e==="dark"?B:M}var y="vartheme-mode",C="vartheme-colors";function f(e){try{localStorage.setItem(y,e);}catch(r){console.warn("vartheme: localStorage not available");}}function b(){try{let e=localStorage.getItem(y);return e==="light"||e==="dark"||e==="system"?e:null}catch(e){return null}}function x(e){try{localStorage.setItem(C,JSON.stringify(e));}catch(r){console.warn("vartheme: localStorage not available");}}function v(){try{let e=localStorage.getItem(C);return e?JSON.parse(e):null}catch(e){return null}}function $(){try{localStorage.removeItem(y),localStorage.removeItem(C);}catch(e){console.warn("vartheme: localStorage not available");}}function c(){return typeof window=="undefined"?"light":window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function E(e){if(typeof window=="undefined")return ()=>{};let r=window.matchMedia("(prefers-color-scheme: dark)"),o=a=>{e(a.matches?"dark":"light");};return r.addEventListener("change",o),()=>{r.removeEventListener("change",o);}}function j(){return typeof window!="undefined"}var k={default:{name:"default",light:{primary:"#7C3AED",background:"#FFFFFF",surface:"#F8FAFC",text:"#0F172A",border:"#E2E8F0",accent:"#06B6D4"},dark:{primary:"#A78BFA",background:"#0F172A",surface:"#1E293B",text:"#F8FAFC",border:"#334155",accent:"#22D3EE"}},ocean:{name:"ocean",light:{primary:"#0284C7",background:"#F0F9FF",surface:"#E0F2FE",text:"#0C4A6E",border:"#BAE6FD",accent:"#0D9488"},dark:{primary:"#38BDF8",background:"#0C1A2E",surface:"#0F2744",text:"#E0F2FE",border:"#1E3A5F",accent:"#2DD4BF"}},forest:{name:"forest",light:{primary:"#16A34A",background:"#F0FDF4",surface:"#DCFCE7",text:"#14532D",border:"#BBF7D0",accent:"#84CC16"},dark:{primary:"#4ADE80",background:"#0A1F0F",surface:"#0F2D17",text:"#DCFCE7",border:"#166534",accent:"#A3E635"}},sunset:{name:"sunset",light:{primary:"#EA580C",background:"#FFF7ED",surface:"#FFEDD5",text:"#431407",border:"#FED7AA",accent:"#DB2777"},dark:{primary:"#FB923C",background:"#1A0A00",surface:"#2D1200",text:"#FFEDD5",border:"#7C2D12",accent:"#F472B6"}},rose:{name:"rose",light:{primary:"#E11D48",background:"#FFF1F2",surface:"#FFE4E6",text:"#4C0519",border:"#FECDD3",accent:"#BE185D"},dark:{primary:"#FB7185",background:"#1A0008",surface:"#2D000F",text:"#FFE4E6",border:"#881337",accent:"#F472B6"}}};function p(e){return k[e]||k.default}function S(e,r){let[o,a]=react.useState(()=>b()||e||"system"),[t,s]=react.useState(r||"default"),[i,R]=react.useState(()=>v()||{}),m=o==="system"?c():o;react.useEffect(()=>{let n=p(t),d=m==="dark"?n.dark:n.light;u({...d,...i},m);},[m,i,t]),react.useEffect(()=>o!=="system"?void 0:E(()=>{let d=p(t),h=c()==="dark"?d.dark:d.light;u({...h,...i},c());}),[o,i,t]);let L=react.useCallback(()=>{let n=m==="light"?"dark":"light";a(n),f(n);},[m]),_=react.useCallback(n=>{a(n),f(n);},[]),O=react.useCallback(n=>{R(d=>{let h={...d,...n};return x(h),h});},[]),U=react.useCallback(n=>{s(n);},[]);return {mode:o,resolvedMode:m,theme:t,colors:{...T(m),...i},toggle:L,setMode:_,setColors:O,setTheme:U}}var N=react.createContext(null);function K({children:e,mode:r,theme:o="default",colors:a,transitions:t}){let s=S(r,o);return t&&I(),a&&s.setColors(a),jsxRuntime.jsx(N.Provider,{value:s,children:e})}function A(){let e=react.useContext(N);if(!e)throw new Error("useThemeContext must be used inside <ThemeProvider />");return e}function Y({size:e=48}){let{resolvedMode:r,toggle:o}=A(),a=r==="dark";return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("style",{children:`
8
+ `,document.head.appendChild(e);}function y(e){return e==="dark"?P:B}var x="vartheme-mode",b="vartheme-colors";function p(e){try{localStorage.setItem(x,e);}catch(o){console.warn("vartheme: localStorage not available");}}function v(){try{let e=localStorage.getItem(x);return e==="light"||e==="dark"||e==="system"?e:null}catch(e){return null}}function E(e){try{localStorage.setItem(b,JSON.stringify(e));}catch(o){console.warn("vartheme: localStorage not available");}}function k(){try{let e=localStorage.getItem(b);return e?JSON.parse(e):null}catch(e){return null}}function H(){try{localStorage.removeItem(x),localStorage.removeItem(b);}catch(e){console.warn("vartheme: localStorage not available");}}function h(){return typeof window=="undefined"?"light":window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function D(e){if(typeof window=="undefined")return ()=>{};let o=window.matchMedia("(prefers-color-scheme: dark)"),r=a=>{e(a.matches?"dark":"light");};return o.addEventListener("change",r),()=>{o.removeEventListener("change",r);}}function $(){return typeof window!="undefined"}var l={default:{name:"default",light:{primary:"#7C3AED",background:"#FFFFFF",surface:"#F8FAFC",text:"#0F172A",border:"#E2E8F0",accent:"#06B6D4"},dark:{primary:"#A78BFA",background:"#0F172A",surface:"#1E293B",text:"#F8FAFC",border:"#334155",accent:"#22D3EE"}},ocean:{name:"ocean",light:{primary:"#0284C7",background:"#F0F9FF",surface:"#E0F2FE",text:"#0C4A6E",border:"#BAE6FD",accent:"#0D9488"},dark:{primary:"#38BDF8",background:"#0C1A2E",surface:"#0F2744",text:"#E0F2FE",border:"#1E3A5F",accent:"#2DD4BF"}},forest:{name:"forest",light:{primary:"#16A34A",background:"#F0FDF4",surface:"#DCFCE7",text:"#14532D",border:"#BBF7D0",accent:"#84CC16"},dark:{primary:"#4ADE80",background:"#0A1F0F",surface:"#0F2D17",text:"#DCFCE7",border:"#166534",accent:"#A3E635"}},sunset:{name:"sunset",light:{primary:"#EA580C",background:"#FFF7ED",surface:"#FFEDD5",text:"#431407",border:"#FED7AA",accent:"#DB2777"},dark:{primary:"#FB923C",background:"#1A0A00",surface:"#2D1200",text:"#FFEDD5",border:"#7C2D12",accent:"#F472B6"}},rose:{name:"rose",light:{primary:"#E11D48",background:"#FFF1F2",surface:"#FFE4E6",text:"#4C0519",border:"#FECDD3",accent:"#BE185D"},dark:{primary:"#FB7185",background:"#1A0008",surface:"#2D000F",text:"#FFE4E6",border:"#881337",accent:"#F472B6"}}},g={};function G(e){let{name:o,light:r,dark:a}=e,t=l.default.light,n=l.default.dark;return g[o]={name:o,light:{...t,...r},dark:{...n,...a}},o}function T(e){return g[e]?g[e]:l[e]?l[e]:l.default}function K(){return [...Object.values(l),...Object.values(g)]}function A(e,o){let[r,a]=react.useState(()=>v()||e||"system"),[t,n]=react.useState(o||"default"),[i,N]=react.useState(()=>k()||{}),m=r==="system"?h():r;react.useEffect(()=>{let s=T(t),d=m==="dark"?s.dark:s.light;f({...d,...i},m);},[m,i,t]),react.useEffect(()=>r!=="system"?void 0:D(()=>{let d=T(t),u=h()==="dark"?d.dark:d.light;f({...u,...i},h());}),[r,i,t]);let L=react.useCallback(()=>{let s=m==="light"?"dark":"light";a(s),p(s);},[m]),_=react.useCallback(s=>{a(s),p(s);},[]),j=react.useCallback(s=>{N(d=>{let u={...d,...s};return E(u),u});},[]),U=react.useCallback(s=>{n(s);},[]);return {mode:r,resolvedMode:m,theme:t,colors:{...y(m),...i},toggle:L,setMode:_,setColors:j,setTheme:U}}var R=react.createContext(null);function J({children:e,mode:o,theme:r="default",colors:a,transitions:t}){let n=A(o,r);return t&&I(),a&&n.setColors(a),jsxRuntime.jsx(R.Provider,{value:n,children:e})}function w(){let e=react.useContext(R);if(!e)throw new Error("useThemeContext must be used inside <ThemeProvider />");return e}function X({size:e=48}){let{resolvedMode:o,toggle:r}=w(),a=o==="dark";return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("style",{children:`
9
9
  @keyframes vt-spin {
10
10
  from { transform: rotate(0deg); }
11
11
  to { transform: rotate(360deg); }
@@ -22,5 +22,5 @@
22
22
  0% { box-shadow: 0 0 10px 2px #A78BFA55; }
23
23
  100% { box-shadow: 0 0 22px 6px #A78BFA99; }
24
24
  }
25
- `}),jsxRuntime.jsxs("button",{onClick:o,"aria-label":"Toggle theme",style:{width:e,height:e,borderRadius:"50%",border:"none",cursor:"pointer",position:"relative",background:a?"radial-gradient(circle, #1E293B, #0F172A)":"radial-gradient(circle, #FEF3C7, #FDE68A)",animation:a?"vt-glow-moon 2s infinite alternate":"vt-glow-sun 2s infinite alternate",transition:"background 0.5s ease",display:"flex",alignItems:"center",justifyContent:"center",overflow:"visible"},children:[!a&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{style:{width:e*.38,height:e*.38,borderRadius:"50%",background:"#F59E0B",boxShadow:"0 0 8px #FCD34D",zIndex:2}}),[0,45,90,135,180,225,270,315].map((t,s)=>jsxRuntime.jsx("div",{style:{position:"absolute",width:3,height:e*.18,borderRadius:4,background:"#FCD34D",top:"50%",left:"50%",transformOrigin:"50% 0%",transform:`translateX(-50%) rotate(${t}deg) translateY(-${e*.54}px)`,animation:"vt-spin 8s linear infinite",animationDelay:`${s*.05}s`,opacity:.9}},s))]}),a&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{style:{width:e*.45,height:e*.45,borderRadius:"50%",background:"#E2E8F0",boxShadow:"0 0 8px #A78BFA",position:"relative",zIndex:2,overflow:"hidden"},children:jsxRuntime.jsx("div",{style:{position:"absolute",width:e*.38,height:e*.38,borderRadius:"50%",background:"#0F172A",top:-e*.08,right:-e*.08}})}),[{top:-6,right:-4,s:4,delay:"0s"},{top:4,right:-10,s:3,delay:"0.5s"},{bottom:2,right:-8,s:2,delay:"1s"},{top:-4,left:2,s:2,delay:"1.5s"}].map((t,s)=>jsxRuntime.jsx("div",{style:{position:"absolute",width:t.s,height:t.s,borderRadius:"50%",background:"#E2E8F0",top:t.top,right:t.right,left:t.left,bottom:t.bottom,animation:"vt-twinkle 1.5s infinite alternate",animationDelay:t.delay}},s))]})]})]})}exports.BUILT_IN_THEMES=k;exports.ThemeProvider=K;exports.ThemeToggle=Y;exports.clearStorage=$;exports.getDefaultColors=T;exports.getSystemMode=c;exports.getTheme=p;exports.injectCSSVariables=u;exports.isBrowser=j;exports.loadColors=v;exports.loadMode=b;exports.saveColors=x;exports.saveMode=f;exports.useTheme=S;exports.useThemeContext=A;exports.watchSystemMode=E;//# sourceMappingURL=index.js.map
25
+ `}),jsxRuntime.jsxs("button",{onClick:r,"aria-label":"Toggle theme",style:{width:e,height:e,borderRadius:"50%",border:"none",cursor:"pointer",position:"relative",background:a?"radial-gradient(circle, #1E293B, #0F172A)":"radial-gradient(circle, #FEF3C7, #FDE68A)",animation:a?"vt-glow-moon 2s infinite alternate":"vt-glow-sun 2s infinite alternate",transition:"background 0.5s ease",display:"flex",alignItems:"center",justifyContent:"center",overflow:"visible"},children:[!a&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{style:{width:e*.38,height:e*.38,borderRadius:"50%",background:"#F59E0B",boxShadow:"0 0 8px #FCD34D",zIndex:2}}),[0,45,90,135,180,225,270,315].map((t,n)=>jsxRuntime.jsx("div",{style:{position:"absolute",width:3,height:e*.18,borderRadius:4,background:"#FCD34D",top:"50%",left:"50%",transformOrigin:"50% 0%",transform:`translateX(-50%) rotate(${t}deg) translateY(-${e*.54}px)`,animation:"vt-spin 8s linear infinite",animationDelay:`${n*.05}s`,opacity:.9}},n))]}),a&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{style:{width:e*.45,height:e*.45,borderRadius:"50%",background:"#E2E8F0",boxShadow:"0 0 8px #A78BFA",position:"relative",zIndex:2,overflow:"hidden"},children:jsxRuntime.jsx("div",{style:{position:"absolute",width:e*.38,height:e*.38,borderRadius:"50%",background:"#0F172A",top:-e*.08,right:-e*.08}})}),[{top:-6,right:-4,s:4,delay:"0s"},{top:4,right:-10,s:3,delay:"0.5s"},{bottom:2,right:-8,s:2,delay:"1s"},{top:-4,left:2,s:2,delay:"1.5s"}].map((t,n)=>jsxRuntime.jsx("div",{style:{position:"absolute",width:t.s,height:t.s,borderRadius:"50%",background:"#E2E8F0",top:t.top,right:t.right,left:t.left,bottom:t.bottom,animation:"vt-twinkle 1.5s infinite alternate",animationDelay:t.delay}},n))]})]})]})}exports.BUILT_IN_THEMES=l;exports.ThemeProvider=J;exports.ThemeToggle=X;exports.clearStorage=H;exports.createTheme=G;exports.getAllThemes=K;exports.getDefaultColors=y;exports.getSystemMode=h;exports.getTheme=T;exports.injectCSSVariables=f;exports.isBrowser=$;exports.loadColors=k;exports.loadMode=v;exports.saveColors=E;exports.saveMode=p;exports.useTheme=A;exports.useThemeContext=w;exports.watchSystemMode=D;//# sourceMappingURL=index.js.map
26
26
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/engine.ts","../src/core/storage.ts","../src/core/system.ts","../src/core/themes.ts","../src/react/useTheme.ts","../src/react/ThemeProvider.tsx","../src/react/ThemeToggle.tsx"],"names":["DEFAULT_LIGHT","DEFAULT_DARK","injectCSSVariables","colors","mode","root","merged","key","value","applyTransitions","style","getDefaultColors","STORAGE_KEY_MODE","STORAGE_KEY_COLORS","saveMode","e","loadMode","saved","saveColors","loadColors","clearStorage","getSystemMode","watchSystemMode","callback","mediaQuery","handler","isBrowser","BUILT_IN_THEMES","getTheme","name","useTheme","initial","initialTheme","setModeState","useState","theme","setThemeState","setColorsState","resolvedMode","useEffect","preset","presetColors","toggle","useCallback","next","setMode","newMode","setColors","newColors","prev","setTheme","newTheme","ThemeContext","createContext","ThemeProvider","children","transitions","themeState","jsx","useThemeContext","context","useContext","ThemeToggle","size","isDark","jsxs","Fragment","deg","i","star"],"mappings":"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","file":"index.js","sourcesContent":["import { ThemeColors, ThemeMode } from \"../types\";\n\nconst DEFAULT_LIGHT: ThemeColors = {\n primary: \"#7C3AED\",\n background: \"#FFFFFF\",\n surface: \"#F8FAFC\",\n text: \"#0F172A\",\n border: \"#E2E8F0\",\n accent: \"#06B6D4\",\n};\n\nconst DEFAULT_DARK: ThemeColors = {\n primary: \"#A78BFA\",\n background: \"#0F172A\",\n surface: \"#1E293B\",\n text: \"#F8FAFC\",\n border: \"#334155\",\n accent: \"#22D3EE\",\n};\n\nexport function injectCSSVariables(\n colors: ThemeColors,\n mode: \"light\" | \"dark\"\n): void {\n const root = document.documentElement;\n const defaults = mode === \"dark\" ? DEFAULT_DARK : DEFAULT_LIGHT;\n const merged = { ...defaults, ...colors };\n\n root.setAttribute(\"data-theme\", mode);\n\n Object.entries(merged).forEach(([key, value]) => {\n root.style.setProperty(`--vt-${key}`, value as string);\n });\n}\n\nexport function applyTransitions(): void {\n const style = document.createElement(\"style\");\n style.id = \"vartheme-transitions\";\n style.textContent = `\n *, *::before, *::after {\n transition: \n background-color 0.3s ease,\n color 0.3s ease,\n border-color 0.3s ease !important;\n }\n `;\n document.head.appendChild(style);\n}\n\nexport function removeTransitions(): void {\n const style = document.getElementById(\"vartheme-transitions\");\n if (style) style.remove();\n}\n\nexport function getDefaultColors(mode: \"light\" | \"dark\"): ThemeColors {\n return mode === \"dark\" ? DEFAULT_DARK : DEFAULT_LIGHT;\n}","import { ThemeMode, ThemeColors } from \"../types\";\n\nconst STORAGE_KEY_MODE = \"vartheme-mode\";\nconst STORAGE_KEY_COLORS = \"vartheme-colors\";\n\nexport function saveMode(mode: ThemeMode): void {\n try {\n localStorage.setItem(STORAGE_KEY_MODE, mode);\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}\n\nexport function loadMode(): ThemeMode | null {\n try {\n const saved = localStorage.getItem(STORAGE_KEY_MODE);\n if (saved === \"light\" || saved === \"dark\" || saved === \"system\") {\n return saved;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function saveColors(colors: ThemeColors): void {\n try {\n localStorage.setItem(STORAGE_KEY_COLORS, JSON.stringify(colors));\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}\n\nexport function loadColors(): ThemeColors | null {\n try {\n const saved = localStorage.getItem(STORAGE_KEY_COLORS);\n if (saved) return JSON.parse(saved) as ThemeColors;\n return null;\n } catch {\n return null;\n }\n}\n\nexport function clearStorage(): void {\n try {\n localStorage.removeItem(STORAGE_KEY_MODE);\n localStorage.removeItem(STORAGE_KEY_COLORS);\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}","type SystemMode = \"light\" | \"dark\";\ntype SystemModeListener = (mode: SystemMode) => void;\n\nexport function getSystemMode(): SystemMode {\n if (typeof window === \"undefined\") return \"light\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n}\n\nexport function watchSystemMode(callback: SystemModeListener): () => void {\n if (typeof window === \"undefined\") return () => {};\n\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\n const handler = (e: MediaQueryListEvent) => {\n callback(e.matches ? \"dark\" : \"light\");\n };\n\n mediaQuery.addEventListener(\"change\", handler);\n\n // cleanup function return ho raha hai\n return () => {\n mediaQuery.removeEventListener(\"change\", handler);\n };\n}\n\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\";\n}","import { ThemeColors } from \"../types\";\n\nexport interface ThemePreset {\n name: string;\n light: ThemeColors;\n dark: ThemeColors;\n}\n\nexport const BUILT_IN_THEMES: Record<string, ThemePreset> = {\n default: {\n name: \"default\",\n light: {\n primary: \"#7C3AED\",\n background: \"#FFFFFF\",\n surface: \"#F8FAFC\",\n text: \"#0F172A\",\n border: \"#E2E8F0\",\n accent: \"#06B6D4\",\n },\n dark: {\n primary: \"#A78BFA\",\n background: \"#0F172A\",\n surface: \"#1E293B\",\n text: \"#F8FAFC\",\n border: \"#334155\",\n accent: \"#22D3EE\",\n },\n },\n\n ocean: {\n name: \"ocean\",\n light: {\n primary: \"#0284C7\",\n background: \"#F0F9FF\",\n surface: \"#E0F2FE\",\n text: \"#0C4A6E\",\n border: \"#BAE6FD\",\n accent: \"#0D9488\",\n },\n dark: {\n primary: \"#38BDF8\",\n background: \"#0C1A2E\",\n surface: \"#0F2744\",\n text: \"#E0F2FE\",\n border: \"#1E3A5F\",\n accent: \"#2DD4BF\",\n },\n },\n\n forest: {\n name: \"forest\",\n light: {\n primary: \"#16A34A\",\n background: \"#F0FDF4\",\n surface: \"#DCFCE7\",\n text: \"#14532D\",\n border: \"#BBF7D0\",\n accent: \"#84CC16\",\n },\n dark: {\n primary: \"#4ADE80\",\n background: \"#0A1F0F\",\n surface: \"#0F2D17\",\n text: \"#DCFCE7\",\n border: \"#166534\",\n accent: \"#A3E635\",\n },\n },\n\n sunset: {\n name: \"sunset\",\n light: {\n primary: \"#EA580C\",\n background: \"#FFF7ED\",\n surface: \"#FFEDD5\",\n text: \"#431407\",\n border: \"#FED7AA\",\n accent: \"#DB2777\",\n },\n dark: {\n primary: \"#FB923C\",\n background: \"#1A0A00\",\n surface: \"#2D1200\",\n text: \"#FFEDD5\",\n border: \"#7C2D12\",\n accent: \"#F472B6\",\n },\n },\n\n rose: {\n name: \"rose\",\n light: {\n primary: \"#E11D48\",\n background: \"#FFF1F2\",\n surface: \"#FFE4E6\",\n text: \"#4C0519\",\n border: \"#FECDD3\",\n accent: \"#BE185D\",\n },\n dark: {\n primary: \"#FB7185\",\n background: \"#1A0008\",\n surface: \"#2D000F\",\n text: \"#FFE4E6\",\n border: \"#881337\",\n accent: \"#F472B6\",\n },\n },\n};\n\nexport function getTheme(name: string): ThemePreset {\n return BUILT_IN_THEMES[name] || BUILT_IN_THEMES.default;\n}","import { useState, useEffect, useCallback } from \"react\";\nimport { ThemeMode, ThemeColors, ThemeState, ThemeName } from \"../types\";\nimport { injectCSSVariables, getDefaultColors } from \"../core/engine\";\nimport { saveMode, loadMode, saveColors, loadColors } from \"../core/storage\";\nimport { getSystemMode, watchSystemMode } from \"../core/system\";\nimport { getTheme } from \"../core/themes\";\n\nexport function useTheme(\n initial?: ThemeMode,\n initialTheme?: ThemeName\n): ThemeState {\n const [mode, setModeState] = useState<ThemeMode>(() => {\n return loadMode() || initial || \"system\";\n });\n\n const [theme, setThemeState] = useState<ThemeName>(\n initialTheme || \"default\"\n );\n\n const [colors, setColorsState] = useState<ThemeColors>(() => {\n return loadColors() || {};\n });\n\n const resolvedMode = mode === \"system\" ? getSystemMode() : mode;\n\n useEffect(() => {\n const preset = getTheme(theme);\n const presetColors = resolvedMode === \"dark\" ? preset.dark : preset.light;\n injectCSSVariables({ ...presetColors, ...colors }, resolvedMode);\n }, [resolvedMode, colors, theme]);\n\n useEffect(() => {\n if (mode !== \"system\") return;\n const cleanup = watchSystemMode(() => {\n const preset = getTheme(theme);\n const presetColors =\n getSystemMode() === \"dark\" ? preset.dark : preset.light;\n injectCSSVariables({ ...presetColors, ...colors }, getSystemMode());\n });\n return cleanup;\n }, [mode, colors, theme]);\n\n const toggle = useCallback(() => {\n const next = resolvedMode === \"light\" ? \"dark\" : \"light\";\n setModeState(next);\n saveMode(next);\n }, [resolvedMode]);\n\n const setMode = useCallback((newMode: ThemeMode) => {\n setModeState(newMode);\n saveMode(newMode);\n }, []);\n\n const setColors = useCallback((newColors: ThemeColors) => {\n setColorsState((prev) => {\n const merged = { ...prev, ...newColors };\n saveColors(merged);\n return merged;\n });\n }, []);\n\n const setTheme = useCallback((newTheme: ThemeName) => {\n setThemeState(newTheme);\n }, []);\n\n return {\n mode,\n resolvedMode,\n theme,\n colors: { ...getDefaultColors(resolvedMode), ...colors },\n toggle,\n setMode,\n setColors,\n setTheme,\n };\n}","import { createContext, useContext, ReactNode } from \"react\";\nimport { ThemeState, ThemeMode, ThemeColors, ThemeName } from \"../types\";\nimport { useTheme } from \"./useTheme\";\nimport { applyTransitions } from \"../core/engine\";\n\nconst ThemeContext = createContext<ThemeState | null>(null);\n\ninterface ThemeProviderProps {\n children: ReactNode;\n mode?: ThemeMode;\n theme?: ThemeName;\n colors?: ThemeColors;\n transitions?: boolean;\n}\n\nexport function ThemeProvider({\n children,\n mode,\n theme = \"default\",\n colors,\n transitions,\n}: ThemeProviderProps) {\n const themeState = useTheme(mode, theme);\n\n if (transitions) {\n applyTransitions();\n }\n\n if (colors) {\n themeState.setColors(colors);\n }\n\n return (\n <ThemeContext.Provider value={themeState}>\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useThemeContext(): ThemeState {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\n \"useThemeContext must be used inside <ThemeProvider />\"\n );\n }\n return context;\n}","import { useThemeContext } from \"./ThemeProvider\";\n\ninterface ThemeToggleProps {\n size?: number;\n}\n\nexport function ThemeToggle({ size = 48 }: ThemeToggleProps) {\n const { resolvedMode, toggle } = useThemeContext();\n const isDark = resolvedMode === \"dark\";\n\n return (\n <>\n <style>{`\n @keyframes vt-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n @keyframes vt-twinkle {\n 0% { opacity: 0.2; transform: scale(0.6); }\n 100% { opacity: 1; transform: scale(1.2); }\n }\n @keyframes vt-glow-sun {\n 0% { box-shadow: 0 0 10px 2px #FCD34D66; }\n 100% { box-shadow: 0 0 22px 6px #FCD34DAA; }\n }\n @keyframes vt-glow-moon {\n 0% { box-shadow: 0 0 10px 2px #A78BFA55; }\n 100% { box-shadow: 0 0 22px 6px #A78BFA99; }\n }\n `}</style>\n\n <button\n onClick={toggle}\n aria-label=\"Toggle theme\"\n style={{\n width: size,\n height: size,\n borderRadius: \"50%\",\n border: \"none\",\n cursor: \"pointer\",\n position: \"relative\",\n background: isDark\n ? \"radial-gradient(circle, #1E293B, #0F172A)\"\n : \"radial-gradient(circle, #FEF3C7, #FDE68A)\",\n animation: isDark ? \"vt-glow-moon 2s infinite alternate\" : \"vt-glow-sun 2s infinite alternate\",\n transition: \"background 0.5s ease\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"visible\",\n }}\n >\n {/* Sun Mode */}\n {!isDark && (\n <>\n {/* Center circle */}\n <div style={{\n width: size * 0.38,\n height: size * 0.38,\n borderRadius: \"50%\",\n background: \"#F59E0B\",\n boxShadow: \"0 0 8px #FCD34D\",\n zIndex: 2,\n }} />\n\n {/* Rays */}\n {[0,45,90,135,180,225,270,315].map((deg, i) => (\n <div key={i} style={{\n position: \"absolute\",\n width: 3,\n height: size * 0.18,\n borderRadius: 4,\n background: \"#FCD34D\",\n top: \"50%\",\n left: \"50%\",\n transformOrigin: \"50% 0%\",\n transform: `translateX(-50%) rotate(${deg}deg) translateY(-${size * 0.54}px)`,\n animation: \"vt-spin 8s linear infinite\",\n animationDelay: `${i * 0.05}s`,\n opacity: 0.9,\n }} />\n ))}\n </>\n )}\n\n {/* Moon Mode */}\n {isDark && (\n <>\n {/* Crescent using two circles */}\n <div style={{\n width: size * 0.45,\n height: size * 0.45,\n borderRadius: \"50%\",\n background: \"#E2E8F0\",\n boxShadow: \"0 0 8px #A78BFA\",\n position: \"relative\",\n zIndex: 2,\n overflow: \"hidden\",\n }}>\n {/* Inner circle to create crescent */}\n <div style={{\n position: \"absolute\",\n width: size * 0.38,\n height: size * 0.38,\n borderRadius: \"50%\",\n background: \"#0F172A\",\n top: -size * 0.08,\n right: -size * 0.08,\n }} />\n </div>\n\n {/* Stars */}\n {[\n { top: -6, right: -4, s: 4, delay: \"0s\" },\n { top: 4, right: -10, s: 3, delay: \"0.5s\" },\n { bottom: 2, right: -8, s: 2, delay: \"1s\" },\n { top: -4, left: 2, s: 2, delay: \"1.5s\" },\n ].map((star, i) => (\n <div key={i} style={{\n position: \"absolute\",\n width: star.s,\n height: star.s,\n borderRadius: \"50%\",\n background: \"#E2E8F0\",\n top: star.top,\n right: (star as any).right,\n left: (star as any).left,\n bottom: (star as any).bottom,\n animation: `vt-twinkle 1.5s infinite alternate`,\n animationDelay: star.delay,\n }} />\n ))}\n </>\n )}\n </button>\n </>\n );\n}"]}
1
+ {"version":3,"sources":["../src/core/engine.ts","../src/core/storage.ts","../src/core/system.ts","../src/core/themes.ts","../src/react/useTheme.ts","../src/react/ThemeProvider.tsx","../src/react/ThemeToggle.tsx"],"names":["DEFAULT_LIGHT","DEFAULT_DARK","injectCSSVariables","colors","mode","root","merged","key","value","applyTransitions","style","getDefaultColors","STORAGE_KEY_MODE","STORAGE_KEY_COLORS","saveMode","e","loadMode","saved","saveColors","loadColors","clearStorage","getSystemMode","watchSystemMode","callback","mediaQuery","handler","isBrowser","BUILT_IN_THEMES","CUSTOM_THEMES","createTheme","options","name","light","dark","defaultLight","defaultDark","getTheme","getAllThemes","useTheme","initial","initialTheme","setModeState","useState","theme","setThemeState","setColorsState","resolvedMode","useEffect","preset","presetColors","toggle","useCallback","next","setMode","newMode","setColors","newColors","prev","setTheme","newTheme","ThemeContext","createContext","ThemeProvider","children","transitions","themeState","jsx","useThemeContext","context","useContext","ThemeToggle","size","isDark","jsxs","Fragment","deg","i","star"],"mappings":"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","file":"index.js","sourcesContent":["import { ThemeColors, ThemeMode } from \"../types\";\n\nconst DEFAULT_LIGHT: ThemeColors = {\n primary: \"#7C3AED\",\n background: \"#FFFFFF\",\n surface: \"#F8FAFC\",\n text: \"#0F172A\",\n border: \"#E2E8F0\",\n accent: \"#06B6D4\",\n};\n\nconst DEFAULT_DARK: ThemeColors = {\n primary: \"#A78BFA\",\n background: \"#0F172A\",\n surface: \"#1E293B\",\n text: \"#F8FAFC\",\n border: \"#334155\",\n accent: \"#22D3EE\",\n};\n\nexport function injectCSSVariables(\n colors: ThemeColors,\n mode: \"light\" | \"dark\"\n): void {\n const root = document.documentElement;\n const defaults = mode === \"dark\" ? DEFAULT_DARK : DEFAULT_LIGHT;\n const merged = { ...defaults, ...colors };\n\n root.setAttribute(\"data-theme\", mode);\n\n Object.entries(merged).forEach(([key, value]) => {\n root.style.setProperty(`--vt-${key}`, value as string);\n });\n}\n\nexport function applyTransitions(): void {\n const style = document.createElement(\"style\");\n style.id = \"vartheme-transitions\";\n style.textContent = `\n *, *::before, *::after {\n transition: \n background-color 0.3s ease,\n color 0.3s ease,\n border-color 0.3s ease !important;\n }\n `;\n document.head.appendChild(style);\n}\n\nexport function removeTransitions(): void {\n const style = document.getElementById(\"vartheme-transitions\");\n if (style) style.remove();\n}\n\nexport function getDefaultColors(mode: \"light\" | \"dark\"): ThemeColors {\n return mode === \"dark\" ? DEFAULT_DARK : DEFAULT_LIGHT;\n}","import { ThemeMode, ThemeColors } from \"../types\";\n\nconst STORAGE_KEY_MODE = \"vartheme-mode\";\nconst STORAGE_KEY_COLORS = \"vartheme-colors\";\n\nexport function saveMode(mode: ThemeMode): void {\n try {\n localStorage.setItem(STORAGE_KEY_MODE, mode);\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}\n\nexport function loadMode(): ThemeMode | null {\n try {\n const saved = localStorage.getItem(STORAGE_KEY_MODE);\n if (saved === \"light\" || saved === \"dark\" || saved === \"system\") {\n return saved;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function saveColors(colors: ThemeColors): void {\n try {\n localStorage.setItem(STORAGE_KEY_COLORS, JSON.stringify(colors));\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}\n\nexport function loadColors(): ThemeColors | null {\n try {\n const saved = localStorage.getItem(STORAGE_KEY_COLORS);\n if (saved) return JSON.parse(saved) as ThemeColors;\n return null;\n } catch {\n return null;\n }\n}\n\nexport function clearStorage(): void {\n try {\n localStorage.removeItem(STORAGE_KEY_MODE);\n localStorage.removeItem(STORAGE_KEY_COLORS);\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}","type SystemMode = \"light\" | \"dark\";\ntype SystemModeListener = (mode: SystemMode) => void;\n\nexport function getSystemMode(): SystemMode {\n if (typeof window === \"undefined\") return \"light\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n}\n\nexport function watchSystemMode(callback: SystemModeListener): () => void {\n if (typeof window === \"undefined\") return () => {};\n\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\n const handler = (e: MediaQueryListEvent) => {\n callback(e.matches ? \"dark\" : \"light\");\n };\n\n mediaQuery.addEventListener(\"change\", handler);\n\n // cleanup function return ho raha hai\n return () => {\n mediaQuery.removeEventListener(\"change\", handler);\n };\n}\n\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\";\n}","import { ThemeColors } from \"../types\";\n\nexport interface ThemePreset {\n name: string;\n light: ThemeColors;\n dark: ThemeColors;\n}\n\nexport const BUILT_IN_THEMES: Record<string, ThemePreset> = {\n default: {\n name: \"default\",\n light: {\n primary: \"#7C3AED\",\n background: \"#FFFFFF\",\n surface: \"#F8FAFC\",\n text: \"#0F172A\",\n border: \"#E2E8F0\",\n accent: \"#06B6D4\",\n },\n dark: {\n primary: \"#A78BFA\",\n background: \"#0F172A\",\n surface: \"#1E293B\",\n text: \"#F8FAFC\",\n border: \"#334155\",\n accent: \"#22D3EE\",\n },\n },\n ocean: {\n name: \"ocean\",\n light: {\n primary: \"#0284C7\",\n background: \"#F0F9FF\",\n surface: \"#E0F2FE\",\n text: \"#0C4A6E\",\n border: \"#BAE6FD\",\n accent: \"#0D9488\",\n },\n dark: {\n primary: \"#38BDF8\",\n background: \"#0C1A2E\",\n surface: \"#0F2744\",\n text: \"#E0F2FE\",\n border: \"#1E3A5F\",\n accent: \"#2DD4BF\",\n },\n },\n forest: {\n name: \"forest\",\n light: {\n primary: \"#16A34A\",\n background: \"#F0FDF4\",\n surface: \"#DCFCE7\",\n text: \"#14532D\",\n border: \"#BBF7D0\",\n accent: \"#84CC16\",\n },\n dark: {\n primary: \"#4ADE80\",\n background: \"#0A1F0F\",\n surface: \"#0F2D17\",\n text: \"#DCFCE7\",\n border: \"#166534\",\n accent: \"#A3E635\",\n },\n },\n sunset: {\n name: \"sunset\",\n light: {\n primary: \"#EA580C\",\n background: \"#FFF7ED\",\n surface: \"#FFEDD5\",\n text: \"#431407\",\n border: \"#FED7AA\",\n accent: \"#DB2777\",\n },\n dark: {\n primary: \"#FB923C\",\n background: \"#1A0A00\",\n surface: \"#2D1200\",\n text: \"#FFEDD5\",\n border: \"#7C2D12\",\n accent: \"#F472B6\",\n },\n },\n rose: {\n name: \"rose\",\n light: {\n primary: \"#E11D48\",\n background: \"#FFF1F2\",\n surface: \"#FFE4E6\",\n text: \"#4C0519\",\n border: \"#FECDD3\",\n accent: \"#BE185D\",\n },\n dark: {\n primary: \"#FB7185\",\n background: \"#1A0008\",\n surface: \"#2D000F\",\n text: \"#FFE4E6\",\n border: \"#881337\",\n accent: \"#F472B6\",\n },\n },\n};\n\n// Custom theme registry\nconst CUSTOM_THEMES: Record<string, ThemePreset> = {};\n\n// ── createTheme API ──\nexport interface CreateThemeOptions {\n name: string;\n light: ThemeColors;\n dark: ThemeColors;\n}\n\nexport function createTheme(options: CreateThemeOptions): string {\n const { name, light, dark } = options;\n\n const defaultLight = BUILT_IN_THEMES.default.light;\n const defaultDark = BUILT_IN_THEMES.default.dark;\n\n // Merge with defaults so partial colors work\n CUSTOM_THEMES[name] = {\n name,\n light: { ...defaultLight, ...light },\n dark: { ...defaultDark, ...dark },\n };\n\n return name;\n}\n\nexport function getTheme(name: string): ThemePreset {\n // Check custom themes first\n if (CUSTOM_THEMES[name]) return CUSTOM_THEMES[name];\n // Then built-in\n if (BUILT_IN_THEMES[name]) return BUILT_IN_THEMES[name];\n // Fallback\n return BUILT_IN_THEMES.default;\n}\n\nexport function getAllThemes(): ThemePreset[] {\n return [\n ...Object.values(BUILT_IN_THEMES),\n ...Object.values(CUSTOM_THEMES),\n ];\n}","import { useState, useEffect, useCallback } from \"react\";\nimport { ThemeMode, ThemeColors, ThemeState, ThemeName } from \"../types\";\nimport { injectCSSVariables, getDefaultColors } from \"../core/engine\";\nimport { saveMode, loadMode, saveColors, loadColors } from \"../core/storage\";\nimport { getSystemMode, watchSystemMode } from \"../core/system\";\nimport { getTheme } from \"../core/themes\";\n\nexport function useTheme(\n initial?: ThemeMode,\n initialTheme?: ThemeName\n): ThemeState {\n const [mode, setModeState] = useState<ThemeMode>(() => {\n return loadMode() || initial || \"system\";\n });\n\n const [theme, setThemeState] = useState<ThemeName>(\n initialTheme || \"default\"\n );\n\n const [colors, setColorsState] = useState<ThemeColors>(() => {\n return loadColors() || {};\n });\n\n const resolvedMode = mode === \"system\" ? getSystemMode() : mode;\n\n useEffect(() => {\n const preset = getTheme(theme);\n const presetColors = resolvedMode === \"dark\" ? preset.dark : preset.light;\n injectCSSVariables({ ...presetColors, ...colors }, resolvedMode);\n }, [resolvedMode, colors, theme]);\n\n useEffect(() => {\n if (mode !== \"system\") return;\n const cleanup = watchSystemMode(() => {\n const preset = getTheme(theme);\n const presetColors =\n getSystemMode() === \"dark\" ? preset.dark : preset.light;\n injectCSSVariables({ ...presetColors, ...colors }, getSystemMode());\n });\n return cleanup;\n }, [mode, colors, theme]);\n\n const toggle = useCallback(() => {\n const next = resolvedMode === \"light\" ? \"dark\" : \"light\";\n setModeState(next);\n saveMode(next);\n }, [resolvedMode]);\n\n const setMode = useCallback((newMode: ThemeMode) => {\n setModeState(newMode);\n saveMode(newMode);\n }, []);\n\n const setColors = useCallback((newColors: ThemeColors) => {\n setColorsState((prev) => {\n const merged = { ...prev, ...newColors };\n saveColors(merged);\n return merged;\n });\n }, []);\n\n const setTheme = useCallback((newTheme: ThemeName) => {\n setThemeState(newTheme);\n }, []);\n\n return {\n mode,\n resolvedMode,\n theme,\n colors: { ...getDefaultColors(resolvedMode), ...colors },\n toggle,\n setMode,\n setColors,\n setTheme,\n };\n}","import { createContext, useContext, ReactNode } from \"react\";\nimport { ThemeState, ThemeMode, ThemeColors, ThemeName } from \"../types\";\nimport { useTheme } from \"./useTheme\";\nimport { applyTransitions } from \"../core/engine\";\n\nconst ThemeContext = createContext<ThemeState | null>(null);\n\ninterface ThemeProviderProps {\n children: ReactNode;\n mode?: ThemeMode;\n theme?: ThemeName;\n colors?: ThemeColors;\n transitions?: boolean;\n}\n\nexport function ThemeProvider({\n children,\n mode,\n theme = \"default\",\n colors,\n transitions,\n}: ThemeProviderProps) {\n const themeState = useTheme(mode, theme);\n\n if (transitions) {\n applyTransitions();\n }\n\n if (colors) {\n themeState.setColors(colors);\n }\n\n return (\n <ThemeContext.Provider value={themeState}>\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useThemeContext(): ThemeState {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\n \"useThemeContext must be used inside <ThemeProvider />\"\n );\n }\n return context;\n}","import { useThemeContext } from \"./ThemeProvider\";\n\ninterface ThemeToggleProps {\n size?: number;\n}\n\nexport function ThemeToggle({ size = 48 }: ThemeToggleProps) {\n const { resolvedMode, toggle } = useThemeContext();\n const isDark = resolvedMode === \"dark\";\n\n return (\n <>\n <style>{`\n @keyframes vt-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n @keyframes vt-twinkle {\n 0% { opacity: 0.2; transform: scale(0.6); }\n 100% { opacity: 1; transform: scale(1.2); }\n }\n @keyframes vt-glow-sun {\n 0% { box-shadow: 0 0 10px 2px #FCD34D66; }\n 100% { box-shadow: 0 0 22px 6px #FCD34DAA; }\n }\n @keyframes vt-glow-moon {\n 0% { box-shadow: 0 0 10px 2px #A78BFA55; }\n 100% { box-shadow: 0 0 22px 6px #A78BFA99; }\n }\n `}</style>\n\n <button\n onClick={toggle}\n aria-label=\"Toggle theme\"\n style={{\n width: size,\n height: size,\n borderRadius: \"50%\",\n border: \"none\",\n cursor: \"pointer\",\n position: \"relative\",\n background: isDark\n ? \"radial-gradient(circle, #1E293B, #0F172A)\"\n : \"radial-gradient(circle, #FEF3C7, #FDE68A)\",\n animation: isDark ? \"vt-glow-moon 2s infinite alternate\" : \"vt-glow-sun 2s infinite alternate\",\n transition: \"background 0.5s ease\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"visible\",\n }}\n >\n {/* Sun Mode */}\n {!isDark && (\n <>\n {/* Center circle */}\n <div style={{\n width: size * 0.38,\n height: size * 0.38,\n borderRadius: \"50%\",\n background: \"#F59E0B\",\n boxShadow: \"0 0 8px #FCD34D\",\n zIndex: 2,\n }} />\n\n {/* Rays */}\n {[0,45,90,135,180,225,270,315].map((deg, i) => (\n <div key={i} style={{\n position: \"absolute\",\n width: 3,\n height: size * 0.18,\n borderRadius: 4,\n background: \"#FCD34D\",\n top: \"50%\",\n left: \"50%\",\n transformOrigin: \"50% 0%\",\n transform: `translateX(-50%) rotate(${deg}deg) translateY(-${size * 0.54}px)`,\n animation: \"vt-spin 8s linear infinite\",\n animationDelay: `${i * 0.05}s`,\n opacity: 0.9,\n }} />\n ))}\n </>\n )}\n\n {/* Moon Mode */}\n {isDark && (\n <>\n {/* Crescent using two circles */}\n <div style={{\n width: size * 0.45,\n height: size * 0.45,\n borderRadius: \"50%\",\n background: \"#E2E8F0\",\n boxShadow: \"0 0 8px #A78BFA\",\n position: \"relative\",\n zIndex: 2,\n overflow: \"hidden\",\n }}>\n {/* Inner circle to create crescent */}\n <div style={{\n position: \"absolute\",\n width: size * 0.38,\n height: size * 0.38,\n borderRadius: \"50%\",\n background: \"#0F172A\",\n top: -size * 0.08,\n right: -size * 0.08,\n }} />\n </div>\n\n {/* Stars */}\n {[\n { top: -6, right: -4, s: 4, delay: \"0s\" },\n { top: 4, right: -10, s: 3, delay: \"0.5s\" },\n { bottom: 2, right: -8, s: 2, delay: \"1s\" },\n { top: -4, left: 2, s: 2, delay: \"1.5s\" },\n ].map((star, i) => (\n <div key={i} style={{\n position: \"absolute\",\n width: star.s,\n height: star.s,\n borderRadius: \"50%\",\n background: \"#E2E8F0\",\n top: star.top,\n right: (star as any).right,\n left: (star as any).left,\n bottom: (star as any).bottom,\n animation: `vt-twinkle 1.5s infinite alternate`,\n animationDelay: star.delay,\n }} />\n ))}\n </>\n )}\n </button>\n </>\n );\n}"]}
package/dist/index.mjs CHANGED
@@ -1,11 +1,11 @@
1
- import {createContext,useState,useEffect,useCallback,useContext}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var M={primary:"#7C3AED",background:"#FFFFFF",surface:"#F8FAFC",text:"#0F172A",border:"#E2E8F0",accent:"#06B6D4"},B={primary:"#A78BFA",background:"#0F172A",surface:"#1E293B",text:"#F8FAFC",border:"#334155",accent:"#22D3EE"};function u(e,r){let o=document.documentElement,t={...r==="dark"?B:M,...e};o.setAttribute("data-theme",r),Object.entries(t).forEach(([s,i])=>{o.style.setProperty(`--vt-${s}`,i);});}function I(){let e=document.createElement("style");e.id="vartheme-transitions",e.textContent=`
1
+ import {createContext,useState,useEffect,useCallback,useContext}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var B={primary:"#7C3AED",background:"#FFFFFF",surface:"#F8FAFC",text:"#0F172A",border:"#E2E8F0",accent:"#06B6D4"},P={primary:"#A78BFA",background:"#0F172A",surface:"#1E293B",text:"#F8FAFC",border:"#334155",accent:"#22D3EE"};function f(e,o){let r=document.documentElement,t={...o==="dark"?P:B,...e};r.setAttribute("data-theme",o),Object.entries(t).forEach(([n,i])=>{r.style.setProperty(`--vt-${n}`,i);});}function I(){let e=document.createElement("style");e.id="vartheme-transitions",e.textContent=`
2
2
  *, *::before, *::after {
3
3
  transition:
4
4
  background-color 0.3s ease,
5
5
  color 0.3s ease,
6
6
  border-color 0.3s ease !important;
7
7
  }
8
- `,document.head.appendChild(e);}function T(e){return e==="dark"?B:M}var y="vartheme-mode",C="vartheme-colors";function f(e){try{localStorage.setItem(y,e);}catch(r){console.warn("vartheme: localStorage not available");}}function b(){try{let e=localStorage.getItem(y);return e==="light"||e==="dark"||e==="system"?e:null}catch(e){return null}}function x(e){try{localStorage.setItem(C,JSON.stringify(e));}catch(r){console.warn("vartheme: localStorage not available");}}function v(){try{let e=localStorage.getItem(C);return e?JSON.parse(e):null}catch(e){return null}}function $(){try{localStorage.removeItem(y),localStorage.removeItem(C);}catch(e){console.warn("vartheme: localStorage not available");}}function c(){return typeof window=="undefined"?"light":window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function E(e){if(typeof window=="undefined")return ()=>{};let r=window.matchMedia("(prefers-color-scheme: dark)"),o=a=>{e(a.matches?"dark":"light");};return r.addEventListener("change",o),()=>{r.removeEventListener("change",o);}}function j(){return typeof window!="undefined"}var k={default:{name:"default",light:{primary:"#7C3AED",background:"#FFFFFF",surface:"#F8FAFC",text:"#0F172A",border:"#E2E8F0",accent:"#06B6D4"},dark:{primary:"#A78BFA",background:"#0F172A",surface:"#1E293B",text:"#F8FAFC",border:"#334155",accent:"#22D3EE"}},ocean:{name:"ocean",light:{primary:"#0284C7",background:"#F0F9FF",surface:"#E0F2FE",text:"#0C4A6E",border:"#BAE6FD",accent:"#0D9488"},dark:{primary:"#38BDF8",background:"#0C1A2E",surface:"#0F2744",text:"#E0F2FE",border:"#1E3A5F",accent:"#2DD4BF"}},forest:{name:"forest",light:{primary:"#16A34A",background:"#F0FDF4",surface:"#DCFCE7",text:"#14532D",border:"#BBF7D0",accent:"#84CC16"},dark:{primary:"#4ADE80",background:"#0A1F0F",surface:"#0F2D17",text:"#DCFCE7",border:"#166534",accent:"#A3E635"}},sunset:{name:"sunset",light:{primary:"#EA580C",background:"#FFF7ED",surface:"#FFEDD5",text:"#431407",border:"#FED7AA",accent:"#DB2777"},dark:{primary:"#FB923C",background:"#1A0A00",surface:"#2D1200",text:"#FFEDD5",border:"#7C2D12",accent:"#F472B6"}},rose:{name:"rose",light:{primary:"#E11D48",background:"#FFF1F2",surface:"#FFE4E6",text:"#4C0519",border:"#FECDD3",accent:"#BE185D"},dark:{primary:"#FB7185",background:"#1A0008",surface:"#2D000F",text:"#FFE4E6",border:"#881337",accent:"#F472B6"}}};function p(e){return k[e]||k.default}function S(e,r){let[o,a]=useState(()=>b()||e||"system"),[t,s]=useState(r||"default"),[i,R]=useState(()=>v()||{}),m=o==="system"?c():o;useEffect(()=>{let n=p(t),d=m==="dark"?n.dark:n.light;u({...d,...i},m);},[m,i,t]),useEffect(()=>o!=="system"?void 0:E(()=>{let d=p(t),h=c()==="dark"?d.dark:d.light;u({...h,...i},c());}),[o,i,t]);let L=useCallback(()=>{let n=m==="light"?"dark":"light";a(n),f(n);},[m]),_=useCallback(n=>{a(n),f(n);},[]),O=useCallback(n=>{R(d=>{let h={...d,...n};return x(h),h});},[]),U=useCallback(n=>{s(n);},[]);return {mode:o,resolvedMode:m,theme:t,colors:{...T(m),...i},toggle:L,setMode:_,setColors:O,setTheme:U}}var N=createContext(null);function K({children:e,mode:r,theme:o="default",colors:a,transitions:t}){let s=S(r,o);return t&&I(),a&&s.setColors(a),jsx(N.Provider,{value:s,children:e})}function A(){let e=useContext(N);if(!e)throw new Error("useThemeContext must be used inside <ThemeProvider />");return e}function Y({size:e=48}){let{resolvedMode:r,toggle:o}=A(),a=r==="dark";return jsxs(Fragment,{children:[jsx("style",{children:`
8
+ `,document.head.appendChild(e);}function y(e){return e==="dark"?P:B}var x="vartheme-mode",b="vartheme-colors";function p(e){try{localStorage.setItem(x,e);}catch(o){console.warn("vartheme: localStorage not available");}}function v(){try{let e=localStorage.getItem(x);return e==="light"||e==="dark"||e==="system"?e:null}catch(e){return null}}function E(e){try{localStorage.setItem(b,JSON.stringify(e));}catch(o){console.warn("vartheme: localStorage not available");}}function k(){try{let e=localStorage.getItem(b);return e?JSON.parse(e):null}catch(e){return null}}function H(){try{localStorage.removeItem(x),localStorage.removeItem(b);}catch(e){console.warn("vartheme: localStorage not available");}}function h(){return typeof window=="undefined"?"light":window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function D(e){if(typeof window=="undefined")return ()=>{};let o=window.matchMedia("(prefers-color-scheme: dark)"),r=a=>{e(a.matches?"dark":"light");};return o.addEventListener("change",r),()=>{o.removeEventListener("change",r);}}function $(){return typeof window!="undefined"}var l={default:{name:"default",light:{primary:"#7C3AED",background:"#FFFFFF",surface:"#F8FAFC",text:"#0F172A",border:"#E2E8F0",accent:"#06B6D4"},dark:{primary:"#A78BFA",background:"#0F172A",surface:"#1E293B",text:"#F8FAFC",border:"#334155",accent:"#22D3EE"}},ocean:{name:"ocean",light:{primary:"#0284C7",background:"#F0F9FF",surface:"#E0F2FE",text:"#0C4A6E",border:"#BAE6FD",accent:"#0D9488"},dark:{primary:"#38BDF8",background:"#0C1A2E",surface:"#0F2744",text:"#E0F2FE",border:"#1E3A5F",accent:"#2DD4BF"}},forest:{name:"forest",light:{primary:"#16A34A",background:"#F0FDF4",surface:"#DCFCE7",text:"#14532D",border:"#BBF7D0",accent:"#84CC16"},dark:{primary:"#4ADE80",background:"#0A1F0F",surface:"#0F2D17",text:"#DCFCE7",border:"#166534",accent:"#A3E635"}},sunset:{name:"sunset",light:{primary:"#EA580C",background:"#FFF7ED",surface:"#FFEDD5",text:"#431407",border:"#FED7AA",accent:"#DB2777"},dark:{primary:"#FB923C",background:"#1A0A00",surface:"#2D1200",text:"#FFEDD5",border:"#7C2D12",accent:"#F472B6"}},rose:{name:"rose",light:{primary:"#E11D48",background:"#FFF1F2",surface:"#FFE4E6",text:"#4C0519",border:"#FECDD3",accent:"#BE185D"},dark:{primary:"#FB7185",background:"#1A0008",surface:"#2D000F",text:"#FFE4E6",border:"#881337",accent:"#F472B6"}}},g={};function G(e){let{name:o,light:r,dark:a}=e,t=l.default.light,n=l.default.dark;return g[o]={name:o,light:{...t,...r},dark:{...n,...a}},o}function T(e){return g[e]?g[e]:l[e]?l[e]:l.default}function K(){return [...Object.values(l),...Object.values(g)]}function A(e,o){let[r,a]=useState(()=>v()||e||"system"),[t,n]=useState(o||"default"),[i,N]=useState(()=>k()||{}),m=r==="system"?h():r;useEffect(()=>{let s=T(t),d=m==="dark"?s.dark:s.light;f({...d,...i},m);},[m,i,t]),useEffect(()=>r!=="system"?void 0:D(()=>{let d=T(t),u=h()==="dark"?d.dark:d.light;f({...u,...i},h());}),[r,i,t]);let L=useCallback(()=>{let s=m==="light"?"dark":"light";a(s),p(s);},[m]),_=useCallback(s=>{a(s),p(s);},[]),j=useCallback(s=>{N(d=>{let u={...d,...s};return E(u),u});},[]),U=useCallback(s=>{n(s);},[]);return {mode:r,resolvedMode:m,theme:t,colors:{...y(m),...i},toggle:L,setMode:_,setColors:j,setTheme:U}}var R=createContext(null);function J({children:e,mode:o,theme:r="default",colors:a,transitions:t}){let n=A(o,r);return t&&I(),a&&n.setColors(a),jsx(R.Provider,{value:n,children:e})}function w(){let e=useContext(R);if(!e)throw new Error("useThemeContext must be used inside <ThemeProvider />");return e}function X({size:e=48}){let{resolvedMode:o,toggle:r}=w(),a=o==="dark";return jsxs(Fragment,{children:[jsx("style",{children:`
9
9
  @keyframes vt-spin {
10
10
  from { transform: rotate(0deg); }
11
11
  to { transform: rotate(360deg); }
@@ -22,5 +22,5 @@ import {createContext,useState,useEffect,useCallback,useContext}from'react';impo
22
22
  0% { box-shadow: 0 0 10px 2px #A78BFA55; }
23
23
  100% { box-shadow: 0 0 22px 6px #A78BFA99; }
24
24
  }
25
- `}),jsxs("button",{onClick:o,"aria-label":"Toggle theme",style:{width:e,height:e,borderRadius:"50%",border:"none",cursor:"pointer",position:"relative",background:a?"radial-gradient(circle, #1E293B, #0F172A)":"radial-gradient(circle, #FEF3C7, #FDE68A)",animation:a?"vt-glow-moon 2s infinite alternate":"vt-glow-sun 2s infinite alternate",transition:"background 0.5s ease",display:"flex",alignItems:"center",justifyContent:"center",overflow:"visible"},children:[!a&&jsxs(Fragment,{children:[jsx("div",{style:{width:e*.38,height:e*.38,borderRadius:"50%",background:"#F59E0B",boxShadow:"0 0 8px #FCD34D",zIndex:2}}),[0,45,90,135,180,225,270,315].map((t,s)=>jsx("div",{style:{position:"absolute",width:3,height:e*.18,borderRadius:4,background:"#FCD34D",top:"50%",left:"50%",transformOrigin:"50% 0%",transform:`translateX(-50%) rotate(${t}deg) translateY(-${e*.54}px)`,animation:"vt-spin 8s linear infinite",animationDelay:`${s*.05}s`,opacity:.9}},s))]}),a&&jsxs(Fragment,{children:[jsx("div",{style:{width:e*.45,height:e*.45,borderRadius:"50%",background:"#E2E8F0",boxShadow:"0 0 8px #A78BFA",position:"relative",zIndex:2,overflow:"hidden"},children:jsx("div",{style:{position:"absolute",width:e*.38,height:e*.38,borderRadius:"50%",background:"#0F172A",top:-e*.08,right:-e*.08}})}),[{top:-6,right:-4,s:4,delay:"0s"},{top:4,right:-10,s:3,delay:"0.5s"},{bottom:2,right:-8,s:2,delay:"1s"},{top:-4,left:2,s:2,delay:"1.5s"}].map((t,s)=>jsx("div",{style:{position:"absolute",width:t.s,height:t.s,borderRadius:"50%",background:"#E2E8F0",top:t.top,right:t.right,left:t.left,bottom:t.bottom,animation:"vt-twinkle 1.5s infinite alternate",animationDelay:t.delay}},s))]})]})]})}export{k as BUILT_IN_THEMES,K as ThemeProvider,Y as ThemeToggle,$ as clearStorage,T as getDefaultColors,c as getSystemMode,p as getTheme,u as injectCSSVariables,j as isBrowser,v as loadColors,b as loadMode,x as saveColors,f as saveMode,S as useTheme,A as useThemeContext,E as watchSystemMode};//# sourceMappingURL=index.mjs.map
25
+ `}),jsxs("button",{onClick:r,"aria-label":"Toggle theme",style:{width:e,height:e,borderRadius:"50%",border:"none",cursor:"pointer",position:"relative",background:a?"radial-gradient(circle, #1E293B, #0F172A)":"radial-gradient(circle, #FEF3C7, #FDE68A)",animation:a?"vt-glow-moon 2s infinite alternate":"vt-glow-sun 2s infinite alternate",transition:"background 0.5s ease",display:"flex",alignItems:"center",justifyContent:"center",overflow:"visible"},children:[!a&&jsxs(Fragment,{children:[jsx("div",{style:{width:e*.38,height:e*.38,borderRadius:"50%",background:"#F59E0B",boxShadow:"0 0 8px #FCD34D",zIndex:2}}),[0,45,90,135,180,225,270,315].map((t,n)=>jsx("div",{style:{position:"absolute",width:3,height:e*.18,borderRadius:4,background:"#FCD34D",top:"50%",left:"50%",transformOrigin:"50% 0%",transform:`translateX(-50%) rotate(${t}deg) translateY(-${e*.54}px)`,animation:"vt-spin 8s linear infinite",animationDelay:`${n*.05}s`,opacity:.9}},n))]}),a&&jsxs(Fragment,{children:[jsx("div",{style:{width:e*.45,height:e*.45,borderRadius:"50%",background:"#E2E8F0",boxShadow:"0 0 8px #A78BFA",position:"relative",zIndex:2,overflow:"hidden"},children:jsx("div",{style:{position:"absolute",width:e*.38,height:e*.38,borderRadius:"50%",background:"#0F172A",top:-e*.08,right:-e*.08}})}),[{top:-6,right:-4,s:4,delay:"0s"},{top:4,right:-10,s:3,delay:"0.5s"},{bottom:2,right:-8,s:2,delay:"1s"},{top:-4,left:2,s:2,delay:"1.5s"}].map((t,n)=>jsx("div",{style:{position:"absolute",width:t.s,height:t.s,borderRadius:"50%",background:"#E2E8F0",top:t.top,right:t.right,left:t.left,bottom:t.bottom,animation:"vt-twinkle 1.5s infinite alternate",animationDelay:t.delay}},n))]})]})]})}export{l as BUILT_IN_THEMES,J as ThemeProvider,X as ThemeToggle,H as clearStorage,G as createTheme,K as getAllThemes,y as getDefaultColors,h as getSystemMode,T as getTheme,f as injectCSSVariables,$ as isBrowser,k as loadColors,v as loadMode,E as saveColors,p as saveMode,A as useTheme,w as useThemeContext,D as watchSystemMode};//# sourceMappingURL=index.mjs.map
26
26
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/engine.ts","../src/core/storage.ts","../src/core/system.ts","../src/core/themes.ts","../src/react/useTheme.ts","../src/react/ThemeProvider.tsx","../src/react/ThemeToggle.tsx"],"names":["DEFAULT_LIGHT","DEFAULT_DARK","injectCSSVariables","colors","mode","root","merged","key","value","applyTransitions","style","getDefaultColors","STORAGE_KEY_MODE","STORAGE_KEY_COLORS","saveMode","e","loadMode","saved","saveColors","loadColors","clearStorage","getSystemMode","watchSystemMode","callback","mediaQuery","handler","isBrowser","BUILT_IN_THEMES","getTheme","name","useTheme","initial","initialTheme","setModeState","useState","theme","setThemeState","setColorsState","resolvedMode","useEffect","preset","presetColors","toggle","useCallback","next","setMode","newMode","setColors","newColors","prev","setTheme","newTheme","ThemeContext","createContext","ThemeProvider","children","transitions","themeState","jsx","useThemeContext","context","useContext","ThemeToggle","size","isDark","jsxs","Fragment","deg","i","star"],"mappings":"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","file":"index.mjs","sourcesContent":["import { ThemeColors, ThemeMode } from \"../types\";\n\nconst DEFAULT_LIGHT: ThemeColors = {\n primary: \"#7C3AED\",\n background: \"#FFFFFF\",\n surface: \"#F8FAFC\",\n text: \"#0F172A\",\n border: \"#E2E8F0\",\n accent: \"#06B6D4\",\n};\n\nconst DEFAULT_DARK: ThemeColors = {\n primary: \"#A78BFA\",\n background: \"#0F172A\",\n surface: \"#1E293B\",\n text: \"#F8FAFC\",\n border: \"#334155\",\n accent: \"#22D3EE\",\n};\n\nexport function injectCSSVariables(\n colors: ThemeColors,\n mode: \"light\" | \"dark\"\n): void {\n const root = document.documentElement;\n const defaults = mode === \"dark\" ? DEFAULT_DARK : DEFAULT_LIGHT;\n const merged = { ...defaults, ...colors };\n\n root.setAttribute(\"data-theme\", mode);\n\n Object.entries(merged).forEach(([key, value]) => {\n root.style.setProperty(`--vt-${key}`, value as string);\n });\n}\n\nexport function applyTransitions(): void {\n const style = document.createElement(\"style\");\n style.id = \"vartheme-transitions\";\n style.textContent = `\n *, *::before, *::after {\n transition: \n background-color 0.3s ease,\n color 0.3s ease,\n border-color 0.3s ease !important;\n }\n `;\n document.head.appendChild(style);\n}\n\nexport function removeTransitions(): void {\n const style = document.getElementById(\"vartheme-transitions\");\n if (style) style.remove();\n}\n\nexport function getDefaultColors(mode: \"light\" | \"dark\"): ThemeColors {\n return mode === \"dark\" ? DEFAULT_DARK : DEFAULT_LIGHT;\n}","import { ThemeMode, ThemeColors } from \"../types\";\n\nconst STORAGE_KEY_MODE = \"vartheme-mode\";\nconst STORAGE_KEY_COLORS = \"vartheme-colors\";\n\nexport function saveMode(mode: ThemeMode): void {\n try {\n localStorage.setItem(STORAGE_KEY_MODE, mode);\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}\n\nexport function loadMode(): ThemeMode | null {\n try {\n const saved = localStorage.getItem(STORAGE_KEY_MODE);\n if (saved === \"light\" || saved === \"dark\" || saved === \"system\") {\n return saved;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function saveColors(colors: ThemeColors): void {\n try {\n localStorage.setItem(STORAGE_KEY_COLORS, JSON.stringify(colors));\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}\n\nexport function loadColors(): ThemeColors | null {\n try {\n const saved = localStorage.getItem(STORAGE_KEY_COLORS);\n if (saved) return JSON.parse(saved) as ThemeColors;\n return null;\n } catch {\n return null;\n }\n}\n\nexport function clearStorage(): void {\n try {\n localStorage.removeItem(STORAGE_KEY_MODE);\n localStorage.removeItem(STORAGE_KEY_COLORS);\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}","type SystemMode = \"light\" | \"dark\";\ntype SystemModeListener = (mode: SystemMode) => void;\n\nexport function getSystemMode(): SystemMode {\n if (typeof window === \"undefined\") return \"light\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n}\n\nexport function watchSystemMode(callback: SystemModeListener): () => void {\n if (typeof window === \"undefined\") return () => {};\n\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\n const handler = (e: MediaQueryListEvent) => {\n callback(e.matches ? \"dark\" : \"light\");\n };\n\n mediaQuery.addEventListener(\"change\", handler);\n\n // cleanup function return ho raha hai\n return () => {\n mediaQuery.removeEventListener(\"change\", handler);\n };\n}\n\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\";\n}","import { ThemeColors } from \"../types\";\n\nexport interface ThemePreset {\n name: string;\n light: ThemeColors;\n dark: ThemeColors;\n}\n\nexport const BUILT_IN_THEMES: Record<string, ThemePreset> = {\n default: {\n name: \"default\",\n light: {\n primary: \"#7C3AED\",\n background: \"#FFFFFF\",\n surface: \"#F8FAFC\",\n text: \"#0F172A\",\n border: \"#E2E8F0\",\n accent: \"#06B6D4\",\n },\n dark: {\n primary: \"#A78BFA\",\n background: \"#0F172A\",\n surface: \"#1E293B\",\n text: \"#F8FAFC\",\n border: \"#334155\",\n accent: \"#22D3EE\",\n },\n },\n\n ocean: {\n name: \"ocean\",\n light: {\n primary: \"#0284C7\",\n background: \"#F0F9FF\",\n surface: \"#E0F2FE\",\n text: \"#0C4A6E\",\n border: \"#BAE6FD\",\n accent: \"#0D9488\",\n },\n dark: {\n primary: \"#38BDF8\",\n background: \"#0C1A2E\",\n surface: \"#0F2744\",\n text: \"#E0F2FE\",\n border: \"#1E3A5F\",\n accent: \"#2DD4BF\",\n },\n },\n\n forest: {\n name: \"forest\",\n light: {\n primary: \"#16A34A\",\n background: \"#F0FDF4\",\n surface: \"#DCFCE7\",\n text: \"#14532D\",\n border: \"#BBF7D0\",\n accent: \"#84CC16\",\n },\n dark: {\n primary: \"#4ADE80\",\n background: \"#0A1F0F\",\n surface: \"#0F2D17\",\n text: \"#DCFCE7\",\n border: \"#166534\",\n accent: \"#A3E635\",\n },\n },\n\n sunset: {\n name: \"sunset\",\n light: {\n primary: \"#EA580C\",\n background: \"#FFF7ED\",\n surface: \"#FFEDD5\",\n text: \"#431407\",\n border: \"#FED7AA\",\n accent: \"#DB2777\",\n },\n dark: {\n primary: \"#FB923C\",\n background: \"#1A0A00\",\n surface: \"#2D1200\",\n text: \"#FFEDD5\",\n border: \"#7C2D12\",\n accent: \"#F472B6\",\n },\n },\n\n rose: {\n name: \"rose\",\n light: {\n primary: \"#E11D48\",\n background: \"#FFF1F2\",\n surface: \"#FFE4E6\",\n text: \"#4C0519\",\n border: \"#FECDD3\",\n accent: \"#BE185D\",\n },\n dark: {\n primary: \"#FB7185\",\n background: \"#1A0008\",\n surface: \"#2D000F\",\n text: \"#FFE4E6\",\n border: \"#881337\",\n accent: \"#F472B6\",\n },\n },\n};\n\nexport function getTheme(name: string): ThemePreset {\n return BUILT_IN_THEMES[name] || BUILT_IN_THEMES.default;\n}","import { useState, useEffect, useCallback } from \"react\";\nimport { ThemeMode, ThemeColors, ThemeState, ThemeName } from \"../types\";\nimport { injectCSSVariables, getDefaultColors } from \"../core/engine\";\nimport { saveMode, loadMode, saveColors, loadColors } from \"../core/storage\";\nimport { getSystemMode, watchSystemMode } from \"../core/system\";\nimport { getTheme } from \"../core/themes\";\n\nexport function useTheme(\n initial?: ThemeMode,\n initialTheme?: ThemeName\n): ThemeState {\n const [mode, setModeState] = useState<ThemeMode>(() => {\n return loadMode() || initial || \"system\";\n });\n\n const [theme, setThemeState] = useState<ThemeName>(\n initialTheme || \"default\"\n );\n\n const [colors, setColorsState] = useState<ThemeColors>(() => {\n return loadColors() || {};\n });\n\n const resolvedMode = mode === \"system\" ? getSystemMode() : mode;\n\n useEffect(() => {\n const preset = getTheme(theme);\n const presetColors = resolvedMode === \"dark\" ? preset.dark : preset.light;\n injectCSSVariables({ ...presetColors, ...colors }, resolvedMode);\n }, [resolvedMode, colors, theme]);\n\n useEffect(() => {\n if (mode !== \"system\") return;\n const cleanup = watchSystemMode(() => {\n const preset = getTheme(theme);\n const presetColors =\n getSystemMode() === \"dark\" ? preset.dark : preset.light;\n injectCSSVariables({ ...presetColors, ...colors }, getSystemMode());\n });\n return cleanup;\n }, [mode, colors, theme]);\n\n const toggle = useCallback(() => {\n const next = resolvedMode === \"light\" ? \"dark\" : \"light\";\n setModeState(next);\n saveMode(next);\n }, [resolvedMode]);\n\n const setMode = useCallback((newMode: ThemeMode) => {\n setModeState(newMode);\n saveMode(newMode);\n }, []);\n\n const setColors = useCallback((newColors: ThemeColors) => {\n setColorsState((prev) => {\n const merged = { ...prev, ...newColors };\n saveColors(merged);\n return merged;\n });\n }, []);\n\n const setTheme = useCallback((newTheme: ThemeName) => {\n setThemeState(newTheme);\n }, []);\n\n return {\n mode,\n resolvedMode,\n theme,\n colors: { ...getDefaultColors(resolvedMode), ...colors },\n toggle,\n setMode,\n setColors,\n setTheme,\n };\n}","import { createContext, useContext, ReactNode } from \"react\";\nimport { ThemeState, ThemeMode, ThemeColors, ThemeName } from \"../types\";\nimport { useTheme } from \"./useTheme\";\nimport { applyTransitions } from \"../core/engine\";\n\nconst ThemeContext = createContext<ThemeState | null>(null);\n\ninterface ThemeProviderProps {\n children: ReactNode;\n mode?: ThemeMode;\n theme?: ThemeName;\n colors?: ThemeColors;\n transitions?: boolean;\n}\n\nexport function ThemeProvider({\n children,\n mode,\n theme = \"default\",\n colors,\n transitions,\n}: ThemeProviderProps) {\n const themeState = useTheme(mode, theme);\n\n if (transitions) {\n applyTransitions();\n }\n\n if (colors) {\n themeState.setColors(colors);\n }\n\n return (\n <ThemeContext.Provider value={themeState}>\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useThemeContext(): ThemeState {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\n \"useThemeContext must be used inside <ThemeProvider />\"\n );\n }\n return context;\n}","import { useThemeContext } from \"./ThemeProvider\";\n\ninterface ThemeToggleProps {\n size?: number;\n}\n\nexport function ThemeToggle({ size = 48 }: ThemeToggleProps) {\n const { resolvedMode, toggle } = useThemeContext();\n const isDark = resolvedMode === \"dark\";\n\n return (\n <>\n <style>{`\n @keyframes vt-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n @keyframes vt-twinkle {\n 0% { opacity: 0.2; transform: scale(0.6); }\n 100% { opacity: 1; transform: scale(1.2); }\n }\n @keyframes vt-glow-sun {\n 0% { box-shadow: 0 0 10px 2px #FCD34D66; }\n 100% { box-shadow: 0 0 22px 6px #FCD34DAA; }\n }\n @keyframes vt-glow-moon {\n 0% { box-shadow: 0 0 10px 2px #A78BFA55; }\n 100% { box-shadow: 0 0 22px 6px #A78BFA99; }\n }\n `}</style>\n\n <button\n onClick={toggle}\n aria-label=\"Toggle theme\"\n style={{\n width: size,\n height: size,\n borderRadius: \"50%\",\n border: \"none\",\n cursor: \"pointer\",\n position: \"relative\",\n background: isDark\n ? \"radial-gradient(circle, #1E293B, #0F172A)\"\n : \"radial-gradient(circle, #FEF3C7, #FDE68A)\",\n animation: isDark ? \"vt-glow-moon 2s infinite alternate\" : \"vt-glow-sun 2s infinite alternate\",\n transition: \"background 0.5s ease\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"visible\",\n }}\n >\n {/* Sun Mode */}\n {!isDark && (\n <>\n {/* Center circle */}\n <div style={{\n width: size * 0.38,\n height: size * 0.38,\n borderRadius: \"50%\",\n background: \"#F59E0B\",\n boxShadow: \"0 0 8px #FCD34D\",\n zIndex: 2,\n }} />\n\n {/* Rays */}\n {[0,45,90,135,180,225,270,315].map((deg, i) => (\n <div key={i} style={{\n position: \"absolute\",\n width: 3,\n height: size * 0.18,\n borderRadius: 4,\n background: \"#FCD34D\",\n top: \"50%\",\n left: \"50%\",\n transformOrigin: \"50% 0%\",\n transform: `translateX(-50%) rotate(${deg}deg) translateY(-${size * 0.54}px)`,\n animation: \"vt-spin 8s linear infinite\",\n animationDelay: `${i * 0.05}s`,\n opacity: 0.9,\n }} />\n ))}\n </>\n )}\n\n {/* Moon Mode */}\n {isDark && (\n <>\n {/* Crescent using two circles */}\n <div style={{\n width: size * 0.45,\n height: size * 0.45,\n borderRadius: \"50%\",\n background: \"#E2E8F0\",\n boxShadow: \"0 0 8px #A78BFA\",\n position: \"relative\",\n zIndex: 2,\n overflow: \"hidden\",\n }}>\n {/* Inner circle to create crescent */}\n <div style={{\n position: \"absolute\",\n width: size * 0.38,\n height: size * 0.38,\n borderRadius: \"50%\",\n background: \"#0F172A\",\n top: -size * 0.08,\n right: -size * 0.08,\n }} />\n </div>\n\n {/* Stars */}\n {[\n { top: -6, right: -4, s: 4, delay: \"0s\" },\n { top: 4, right: -10, s: 3, delay: \"0.5s\" },\n { bottom: 2, right: -8, s: 2, delay: \"1s\" },\n { top: -4, left: 2, s: 2, delay: \"1.5s\" },\n ].map((star, i) => (\n <div key={i} style={{\n position: \"absolute\",\n width: star.s,\n height: star.s,\n borderRadius: \"50%\",\n background: \"#E2E8F0\",\n top: star.top,\n right: (star as any).right,\n left: (star as any).left,\n bottom: (star as any).bottom,\n animation: `vt-twinkle 1.5s infinite alternate`,\n animationDelay: star.delay,\n }} />\n ))}\n </>\n )}\n </button>\n </>\n );\n}"]}
1
+ {"version":3,"sources":["../src/core/engine.ts","../src/core/storage.ts","../src/core/system.ts","../src/core/themes.ts","../src/react/useTheme.ts","../src/react/ThemeProvider.tsx","../src/react/ThemeToggle.tsx"],"names":["DEFAULT_LIGHT","DEFAULT_DARK","injectCSSVariables","colors","mode","root","merged","key","value","applyTransitions","style","getDefaultColors","STORAGE_KEY_MODE","STORAGE_KEY_COLORS","saveMode","e","loadMode","saved","saveColors","loadColors","clearStorage","getSystemMode","watchSystemMode","callback","mediaQuery","handler","isBrowser","BUILT_IN_THEMES","CUSTOM_THEMES","createTheme","options","name","light","dark","defaultLight","defaultDark","getTheme","getAllThemes","useTheme","initial","initialTheme","setModeState","useState","theme","setThemeState","setColorsState","resolvedMode","useEffect","preset","presetColors","toggle","useCallback","next","setMode","newMode","setColors","newColors","prev","setTheme","newTheme","ThemeContext","createContext","ThemeProvider","children","transitions","themeState","jsx","useThemeContext","context","useContext","ThemeToggle","size","isDark","jsxs","Fragment","deg","i","star"],"mappings":"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","file":"index.mjs","sourcesContent":["import { ThemeColors, ThemeMode } from \"../types\";\n\nconst DEFAULT_LIGHT: ThemeColors = {\n primary: \"#7C3AED\",\n background: \"#FFFFFF\",\n surface: \"#F8FAFC\",\n text: \"#0F172A\",\n border: \"#E2E8F0\",\n accent: \"#06B6D4\",\n};\n\nconst DEFAULT_DARK: ThemeColors = {\n primary: \"#A78BFA\",\n background: \"#0F172A\",\n surface: \"#1E293B\",\n text: \"#F8FAFC\",\n border: \"#334155\",\n accent: \"#22D3EE\",\n};\n\nexport function injectCSSVariables(\n colors: ThemeColors,\n mode: \"light\" | \"dark\"\n): void {\n const root = document.documentElement;\n const defaults = mode === \"dark\" ? DEFAULT_DARK : DEFAULT_LIGHT;\n const merged = { ...defaults, ...colors };\n\n root.setAttribute(\"data-theme\", mode);\n\n Object.entries(merged).forEach(([key, value]) => {\n root.style.setProperty(`--vt-${key}`, value as string);\n });\n}\n\nexport function applyTransitions(): void {\n const style = document.createElement(\"style\");\n style.id = \"vartheme-transitions\";\n style.textContent = `\n *, *::before, *::after {\n transition: \n background-color 0.3s ease,\n color 0.3s ease,\n border-color 0.3s ease !important;\n }\n `;\n document.head.appendChild(style);\n}\n\nexport function removeTransitions(): void {\n const style = document.getElementById(\"vartheme-transitions\");\n if (style) style.remove();\n}\n\nexport function getDefaultColors(mode: \"light\" | \"dark\"): ThemeColors {\n return mode === \"dark\" ? DEFAULT_DARK : DEFAULT_LIGHT;\n}","import { ThemeMode, ThemeColors } from \"../types\";\n\nconst STORAGE_KEY_MODE = \"vartheme-mode\";\nconst STORAGE_KEY_COLORS = \"vartheme-colors\";\n\nexport function saveMode(mode: ThemeMode): void {\n try {\n localStorage.setItem(STORAGE_KEY_MODE, mode);\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}\n\nexport function loadMode(): ThemeMode | null {\n try {\n const saved = localStorage.getItem(STORAGE_KEY_MODE);\n if (saved === \"light\" || saved === \"dark\" || saved === \"system\") {\n return saved;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function saveColors(colors: ThemeColors): void {\n try {\n localStorage.setItem(STORAGE_KEY_COLORS, JSON.stringify(colors));\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}\n\nexport function loadColors(): ThemeColors | null {\n try {\n const saved = localStorage.getItem(STORAGE_KEY_COLORS);\n if (saved) return JSON.parse(saved) as ThemeColors;\n return null;\n } catch {\n return null;\n }\n}\n\nexport function clearStorage(): void {\n try {\n localStorage.removeItem(STORAGE_KEY_MODE);\n localStorage.removeItem(STORAGE_KEY_COLORS);\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}","type SystemMode = \"light\" | \"dark\";\ntype SystemModeListener = (mode: SystemMode) => void;\n\nexport function getSystemMode(): SystemMode {\n if (typeof window === \"undefined\") return \"light\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n}\n\nexport function watchSystemMode(callback: SystemModeListener): () => void {\n if (typeof window === \"undefined\") return () => {};\n\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\n const handler = (e: MediaQueryListEvent) => {\n callback(e.matches ? \"dark\" : \"light\");\n };\n\n mediaQuery.addEventListener(\"change\", handler);\n\n // cleanup function return ho raha hai\n return () => {\n mediaQuery.removeEventListener(\"change\", handler);\n };\n}\n\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\";\n}","import { ThemeColors } from \"../types\";\n\nexport interface ThemePreset {\n name: string;\n light: ThemeColors;\n dark: ThemeColors;\n}\n\nexport const BUILT_IN_THEMES: Record<string, ThemePreset> = {\n default: {\n name: \"default\",\n light: {\n primary: \"#7C3AED\",\n background: \"#FFFFFF\",\n surface: \"#F8FAFC\",\n text: \"#0F172A\",\n border: \"#E2E8F0\",\n accent: \"#06B6D4\",\n },\n dark: {\n primary: \"#A78BFA\",\n background: \"#0F172A\",\n surface: \"#1E293B\",\n text: \"#F8FAFC\",\n border: \"#334155\",\n accent: \"#22D3EE\",\n },\n },\n ocean: {\n name: \"ocean\",\n light: {\n primary: \"#0284C7\",\n background: \"#F0F9FF\",\n surface: \"#E0F2FE\",\n text: \"#0C4A6E\",\n border: \"#BAE6FD\",\n accent: \"#0D9488\",\n },\n dark: {\n primary: \"#38BDF8\",\n background: \"#0C1A2E\",\n surface: \"#0F2744\",\n text: \"#E0F2FE\",\n border: \"#1E3A5F\",\n accent: \"#2DD4BF\",\n },\n },\n forest: {\n name: \"forest\",\n light: {\n primary: \"#16A34A\",\n background: \"#F0FDF4\",\n surface: \"#DCFCE7\",\n text: \"#14532D\",\n border: \"#BBF7D0\",\n accent: \"#84CC16\",\n },\n dark: {\n primary: \"#4ADE80\",\n background: \"#0A1F0F\",\n surface: \"#0F2D17\",\n text: \"#DCFCE7\",\n border: \"#166534\",\n accent: \"#A3E635\",\n },\n },\n sunset: {\n name: \"sunset\",\n light: {\n primary: \"#EA580C\",\n background: \"#FFF7ED\",\n surface: \"#FFEDD5\",\n text: \"#431407\",\n border: \"#FED7AA\",\n accent: \"#DB2777\",\n },\n dark: {\n primary: \"#FB923C\",\n background: \"#1A0A00\",\n surface: \"#2D1200\",\n text: \"#FFEDD5\",\n border: \"#7C2D12\",\n accent: \"#F472B6\",\n },\n },\n rose: {\n name: \"rose\",\n light: {\n primary: \"#E11D48\",\n background: \"#FFF1F2\",\n surface: \"#FFE4E6\",\n text: \"#4C0519\",\n border: \"#FECDD3\",\n accent: \"#BE185D\",\n },\n dark: {\n primary: \"#FB7185\",\n background: \"#1A0008\",\n surface: \"#2D000F\",\n text: \"#FFE4E6\",\n border: \"#881337\",\n accent: \"#F472B6\",\n },\n },\n};\n\n// Custom theme registry\nconst CUSTOM_THEMES: Record<string, ThemePreset> = {};\n\n// ── createTheme API ──\nexport interface CreateThemeOptions {\n name: string;\n light: ThemeColors;\n dark: ThemeColors;\n}\n\nexport function createTheme(options: CreateThemeOptions): string {\n const { name, light, dark } = options;\n\n const defaultLight = BUILT_IN_THEMES.default.light;\n const defaultDark = BUILT_IN_THEMES.default.dark;\n\n // Merge with defaults so partial colors work\n CUSTOM_THEMES[name] = {\n name,\n light: { ...defaultLight, ...light },\n dark: { ...defaultDark, ...dark },\n };\n\n return name;\n}\n\nexport function getTheme(name: string): ThemePreset {\n // Check custom themes first\n if (CUSTOM_THEMES[name]) return CUSTOM_THEMES[name];\n // Then built-in\n if (BUILT_IN_THEMES[name]) return BUILT_IN_THEMES[name];\n // Fallback\n return BUILT_IN_THEMES.default;\n}\n\nexport function getAllThemes(): ThemePreset[] {\n return [\n ...Object.values(BUILT_IN_THEMES),\n ...Object.values(CUSTOM_THEMES),\n ];\n}","import { useState, useEffect, useCallback } from \"react\";\nimport { ThemeMode, ThemeColors, ThemeState, ThemeName } from \"../types\";\nimport { injectCSSVariables, getDefaultColors } from \"../core/engine\";\nimport { saveMode, loadMode, saveColors, loadColors } from \"../core/storage\";\nimport { getSystemMode, watchSystemMode } from \"../core/system\";\nimport { getTheme } from \"../core/themes\";\n\nexport function useTheme(\n initial?: ThemeMode,\n initialTheme?: ThemeName\n): ThemeState {\n const [mode, setModeState] = useState<ThemeMode>(() => {\n return loadMode() || initial || \"system\";\n });\n\n const [theme, setThemeState] = useState<ThemeName>(\n initialTheme || \"default\"\n );\n\n const [colors, setColorsState] = useState<ThemeColors>(() => {\n return loadColors() || {};\n });\n\n const resolvedMode = mode === \"system\" ? getSystemMode() : mode;\n\n useEffect(() => {\n const preset = getTheme(theme);\n const presetColors = resolvedMode === \"dark\" ? preset.dark : preset.light;\n injectCSSVariables({ ...presetColors, ...colors }, resolvedMode);\n }, [resolvedMode, colors, theme]);\n\n useEffect(() => {\n if (mode !== \"system\") return;\n const cleanup = watchSystemMode(() => {\n const preset = getTheme(theme);\n const presetColors =\n getSystemMode() === \"dark\" ? preset.dark : preset.light;\n injectCSSVariables({ ...presetColors, ...colors }, getSystemMode());\n });\n return cleanup;\n }, [mode, colors, theme]);\n\n const toggle = useCallback(() => {\n const next = resolvedMode === \"light\" ? \"dark\" : \"light\";\n setModeState(next);\n saveMode(next);\n }, [resolvedMode]);\n\n const setMode = useCallback((newMode: ThemeMode) => {\n setModeState(newMode);\n saveMode(newMode);\n }, []);\n\n const setColors = useCallback((newColors: ThemeColors) => {\n setColorsState((prev) => {\n const merged = { ...prev, ...newColors };\n saveColors(merged);\n return merged;\n });\n }, []);\n\n const setTheme = useCallback((newTheme: ThemeName) => {\n setThemeState(newTheme);\n }, []);\n\n return {\n mode,\n resolvedMode,\n theme,\n colors: { ...getDefaultColors(resolvedMode), ...colors },\n toggle,\n setMode,\n setColors,\n setTheme,\n };\n}","import { createContext, useContext, ReactNode } from \"react\";\nimport { ThemeState, ThemeMode, ThemeColors, ThemeName } from \"../types\";\nimport { useTheme } from \"./useTheme\";\nimport { applyTransitions } from \"../core/engine\";\n\nconst ThemeContext = createContext<ThemeState | null>(null);\n\ninterface ThemeProviderProps {\n children: ReactNode;\n mode?: ThemeMode;\n theme?: ThemeName;\n colors?: ThemeColors;\n transitions?: boolean;\n}\n\nexport function ThemeProvider({\n children,\n mode,\n theme = \"default\",\n colors,\n transitions,\n}: ThemeProviderProps) {\n const themeState = useTheme(mode, theme);\n\n if (transitions) {\n applyTransitions();\n }\n\n if (colors) {\n themeState.setColors(colors);\n }\n\n return (\n <ThemeContext.Provider value={themeState}>\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useThemeContext(): ThemeState {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\n \"useThemeContext must be used inside <ThemeProvider />\"\n );\n }\n return context;\n}","import { useThemeContext } from \"./ThemeProvider\";\n\ninterface ThemeToggleProps {\n size?: number;\n}\n\nexport function ThemeToggle({ size = 48 }: ThemeToggleProps) {\n const { resolvedMode, toggle } = useThemeContext();\n const isDark = resolvedMode === \"dark\";\n\n return (\n <>\n <style>{`\n @keyframes vt-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n @keyframes vt-twinkle {\n 0% { opacity: 0.2; transform: scale(0.6); }\n 100% { opacity: 1; transform: scale(1.2); }\n }\n @keyframes vt-glow-sun {\n 0% { box-shadow: 0 0 10px 2px #FCD34D66; }\n 100% { box-shadow: 0 0 22px 6px #FCD34DAA; }\n }\n @keyframes vt-glow-moon {\n 0% { box-shadow: 0 0 10px 2px #A78BFA55; }\n 100% { box-shadow: 0 0 22px 6px #A78BFA99; }\n }\n `}</style>\n\n <button\n onClick={toggle}\n aria-label=\"Toggle theme\"\n style={{\n width: size,\n height: size,\n borderRadius: \"50%\",\n border: \"none\",\n cursor: \"pointer\",\n position: \"relative\",\n background: isDark\n ? \"radial-gradient(circle, #1E293B, #0F172A)\"\n : \"radial-gradient(circle, #FEF3C7, #FDE68A)\",\n animation: isDark ? \"vt-glow-moon 2s infinite alternate\" : \"vt-glow-sun 2s infinite alternate\",\n transition: \"background 0.5s ease\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"visible\",\n }}\n >\n {/* Sun Mode */}\n {!isDark && (\n <>\n {/* Center circle */}\n <div style={{\n width: size * 0.38,\n height: size * 0.38,\n borderRadius: \"50%\",\n background: \"#F59E0B\",\n boxShadow: \"0 0 8px #FCD34D\",\n zIndex: 2,\n }} />\n\n {/* Rays */}\n {[0,45,90,135,180,225,270,315].map((deg, i) => (\n <div key={i} style={{\n position: \"absolute\",\n width: 3,\n height: size * 0.18,\n borderRadius: 4,\n background: \"#FCD34D\",\n top: \"50%\",\n left: \"50%\",\n transformOrigin: \"50% 0%\",\n transform: `translateX(-50%) rotate(${deg}deg) translateY(-${size * 0.54}px)`,\n animation: \"vt-spin 8s linear infinite\",\n animationDelay: `${i * 0.05}s`,\n opacity: 0.9,\n }} />\n ))}\n </>\n )}\n\n {/* Moon Mode */}\n {isDark && (\n <>\n {/* Crescent using two circles */}\n <div style={{\n width: size * 0.45,\n height: size * 0.45,\n borderRadius: \"50%\",\n background: \"#E2E8F0\",\n boxShadow: \"0 0 8px #A78BFA\",\n position: \"relative\",\n zIndex: 2,\n overflow: \"hidden\",\n }}>\n {/* Inner circle to create crescent */}\n <div style={{\n position: \"absolute\",\n width: size * 0.38,\n height: size * 0.38,\n borderRadius: \"50%\",\n background: \"#0F172A\",\n top: -size * 0.08,\n right: -size * 0.08,\n }} />\n </div>\n\n {/* Stars */}\n {[\n { top: -6, right: -4, s: 4, delay: \"0s\" },\n { top: 4, right: -10, s: 3, delay: \"0.5s\" },\n { bottom: 2, right: -8, s: 2, delay: \"1s\" },\n { top: -4, left: 2, s: 2, delay: \"1.5s\" },\n ].map((star, i) => (\n <div key={i} style={{\n position: \"absolute\",\n width: star.s,\n height: star.s,\n borderRadius: \"50%\",\n background: \"#E2E8F0\",\n top: star.top,\n right: (star as any).right,\n left: (star as any).left,\n bottom: (star as any).bottom,\n animation: `vt-twinkle 1.5s infinite alternate`,\n animationDelay: star.delay,\n }} />\n ))}\n </>\n )}\n </button>\n </>\n );\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vartheme",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Zero config, CSS variable based theme switching for React",
5
5
  "author": "Your Name",
6
6
  "license": "MIT",
@@ -14,7 +14,9 @@
14
14
  "require": "./dist/index.js"
15
15
  }
16
16
  },
17
- "files": ["dist"],
17
+ "files": [
18
+ "dist"
19
+ ],
18
20
  "scripts": {
19
21
  "build": "tsup",
20
22
  "dev": "tsup --watch",
@@ -41,4 +43,4 @@
41
43
  "react",
42
44
  "theming"
43
45
  ]
44
- }
46
+ }