vartheme 0.1.5 → 0.1.7

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
@@ -1,5 +1,5 @@
1
- # vartheme ✨
2
- ### Zero-config, CSS variable based theme switching for React
1
+ # vartheme ✨
2
+ ### Zero-config, CSS variable based theme switching for React
3
3
  **Dark mode in one line. Clean. Fast. Modern.**
4
4
 
5
5
  🌐 **Website:** [vartheme.vercel.app](https://vartheme.vercel.app)
@@ -8,31 +8,37 @@
8
8
  [![bundle size](https://img.shields.io/bundlephobia/minzip/vartheme)](https://bundlephobia.com/package/vartheme)
9
9
  [![license](https://img.shields.io/npm/l/vartheme)](./LICENSE)
10
10
  [![downloads](https://img.shields.io/npm/dm/vartheme)](https://www.npmjs.com/package/vartheme)
11
+ [![CI](https://github.com/sumitt-wayne/vartheme/actions/workflows/ci.yml/badge.svg)](https://github.com/sumitt-wayne/vartheme/actions)
11
12
 
12
13
  ---
13
14
 
14
15
  ## 🚀 Why vartheme?
15
16
 
16
17
  Most theme libraries are either:
17
- - ❌ Complex to set up
18
- - ❌ Framework dependent
19
- - ❌ Not CSS variable friendly
20
- - ❌ Missing UI components
18
+ - ❌ Complex to set up
19
+ - ❌ Not SSR safe (crashes in Next.js)
20
+ - ❌ Not CSS variable friendly
21
+ - ❌ Missing built-in UI components
21
22
 
22
23
  **vartheme solves this.**
23
24
 
24
25
  👉 Zero configuration
26
+ 👉 SSR safe — works with Next.js App Router
25
27
  👉 CSS variables by default
26
- 👉 Built-in toggle
28
+ 👉 Cookie + localStorage persistence
29
+ 👉 Built-in animated toggle
27
30
  👉 System theme detection
31
+ 👉 FOUC prevention built-in
32
+ 👉 Works with shadcn/ui, Radix, DaisyUI, Tailwind
28
33
  👉 TypeScript ready
29
- 👉 Works with Tailwind, CSS, design systems
30
- 👉 Production ready
34
+ 👉 16.8KB package size
31
35
 
32
36
  ---
33
37
 
34
- ## ⚡ Demo (concept)
35
-
38
+ ## ⚡ Quick Start
39
+ ```bash
40
+ npm install vartheme
41
+ ```
36
42
  ```tsx
37
43
  import { ThemeProvider, ThemeToggle } from 'vartheme'
38
44
 
@@ -45,70 +51,146 @@ export default function App() {
45
51
  }
46
52
  ```
47
53
 
48
- Thats it. Dark mode is done.
49
-
50
- ---
51
-
52
- ## ✨ Features
53
-
54
- - ⚡ Zero config
55
- - 🎨 CSS variable driven
56
- - 🌙 Auto system detection
57
- - 🔄 Smooth transitions
58
- - 🧩 Built-in toggle
59
- - 📦 ~5kb bundle
60
- - 🧠 Framework-agnostic core
61
- - 🔧 Custom colors
62
- - 💡 Fully typed
63
- - 🚀 Scalable for large apps
54
+ That's it. Dark mode is done.
64
55
 
65
56
  ---
66
57
 
67
- ## 📊 Comparison
58
+ ## 📊 Comparison
68
59
 
69
60
  | Feature | vartheme | next-themes | manual |
70
61
  |---------|----------|-------------|--------|
71
62
  | Zero config | ✅ | ❌ | ❌ |
63
+ | SSR safe | ✅ | ✅ | ❌ |
72
64
  | CSS variables | ✅ | ❌ | ✅ |
65
+ | FOUC prevention | ✅ | ✅ | ❌ |
66
+ | Cookie persistence | ✅ | ❌ | ❌ |
73
67
  | System detect | ✅ | ✅ | ❌ |
74
- | Built-in UI | ✅ | ❌ | ❌ |
75
- | Framework agnostic | ✅ | ❌ | |
68
+ | Built-in toggle UI | ✅ | ❌ | ❌ |
69
+ | Named themes | ✅ | ❌ | |
70
+ | shadcn/Radix support | ✅ | ✅ | ❌ |
76
71
 
77
72
  ---
78
73
 
79
- ## 📦 Installation
74
+ ## 🔧 Setup
80
75
 
81
- ```bash
82
- npm install vartheme
76
+ ### React / Vite
77
+ ```tsx
78
+ // main.tsx
79
+ import { ThemeProvider } from 'vartheme'
80
+
81
+ function Main() {
82
+ return (
83
+ <ThemeProvider mode="system" transitions>
84
+ <App />
85
+ </ThemeProvider>
86
+ )
87
+ }
83
88
  ```
84
89
 
85
- ---
90
+ ### Next.js App Router (SSR safe)
86
91
 
87
- ## Quick Start
92
+ **Step 1 Prevent FOUC in layout.tsx:**
93
+ ```tsx
94
+ import { getFOUCScript } from 'vartheme'
88
95
 
89
- ### 1. Wrap your app
96
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
97
+ return (
98
+ <html>
99
+ <head>
100
+ <script dangerouslySetInnerHTML={{ __html: getFOUCScript() }} />
101
+ </head>
102
+ <body>{children}</body>
103
+ </html>
104
+ )
105
+ }
106
+ ```
90
107
 
108
+ **Step 2 — Read theme on server side:**
91
109
  ```tsx
92
- import { ThemeProvider } from 'vartheme'
110
+ import { cookies } from 'next/headers'
111
+ import { loadModeFromCookieString } from 'vartheme'
112
+
113
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
114
+ const cookieHeader = cookies().toString()
115
+ const mode = loadModeFromCookieString(cookieHeader) || 'system'
93
116
 
94
- function Main() {
95
117
  return (
96
- <ThemeProvider config={{ mode: 'system', transitions: true }}>
97
- <App />
98
- </ThemeProvider>
118
+ <html data-theme={mode}>
119
+ <body>
120
+ <ThemeProvider mode={mode}>
121
+ {children}
122
+ </ThemeProvider>
123
+ </body>
124
+ </html>
99
125
  )
100
126
  }
101
127
  ```
102
128
 
103
129
  ---
104
130
 
105
- ### 2. Use the hook
131
+ ## 🎨 Built-in Themes
132
+ ```tsx
133
+ <ThemeProvider theme="default"> // purple — default
134
+ <ThemeProvider theme="ocean"> // blue
135
+ <ThemeProvider theme="forest"> // green
136
+ <ThemeProvider theme="sunset"> // orange
137
+ <ThemeProvider theme="rose"> // pink
138
+ ```
139
+
140
+ ---
106
141
 
142
+ ## 🎯 Custom Colors
143
+ ```tsx
144
+ <ThemeProvider
145
+ colors={{
146
+ primary: '#EC4899',
147
+ accent: '#F59E0B',
148
+ }}
149
+ >
150
+ <App />
151
+ </ThemeProvider>
152
+ ```
153
+
154
+ Dynamic at runtime:
155
+ ```tsx
156
+ const { setColors } = useThemeContext()
157
+ setColors({ primary: '#10B981' })
158
+ ```
159
+
160
+ ---
161
+
162
+ ## 🔌 shadcn/ui + Radix support
163
+ ```tsx
164
+ // class="dark" strategy — shadcn/ui ke liye
165
+ <ThemeProvider strategy={{ type: 'class' }}>
166
+
167
+ // data-theme="dark" + class="dark" — dono saath
168
+ <ThemeProvider strategy={{ type: 'both' }}>
169
+
170
+ // Custom attribute
171
+ <ThemeProvider strategy={{ type: 'data-attribute', attribute: 'data-mode' }}>
172
+ ```
173
+
174
+ ---
175
+
176
+ ## 📡 onThemeChange callback
177
+ ```tsx
178
+ <ThemeProvider
179
+ onThemeChange={(mode) => {
180
+ console.log('Theme changed:', mode)
181
+ analytics.track('theme_switch', { mode })
182
+ }}
183
+ >
184
+ ```
185
+
186
+ ---
187
+
188
+ ## 🪝 useThemeContext hook
107
189
  ```tsx
108
190
  import { useThemeContext } from 'vartheme'
109
191
 
110
192
  function Navbar() {
111
- const { resolvedMode, toggle } = useThemeContext()
193
+ const { resolvedMode, toggle, setMode, setTheme, setColors } = useThemeContext()
112
194
 
113
195
  return (
114
196
  <button onClick={toggle}>
@@ -120,20 +202,20 @@ function Navbar() {
120
202
 
121
203
  ---
122
204
 
123
- ### 3. Built-in toggle
124
-
205
+ ## 🎛️ ThemeToggle
125
206
  ```tsx
126
207
  import { ThemeToggle } from 'vartheme'
127
208
 
128
- export default function Navbar() {
129
- return <ThemeToggle size={48} />
130
- }
209
+ // Default size
210
+ <ThemeToggle />
211
+
212
+ // Custom size
213
+ <ThemeToggle size={64} />
131
214
  ```
132
215
 
133
216
  ---
134
217
 
135
- ### 4. CSS variables
136
-
218
+ ## 🎨 CSS Variables
137
219
  ```css
138
220
  .card {
139
221
  background: var(--vt-surface);
@@ -142,12 +224,8 @@ export default function Navbar() {
142
224
  }
143
225
  ```
144
226
 
145
- ---
146
-
147
- ## 🎨 Default Variables
148
-
149
227
  | Variable | Light | Dark |
150
- |----------|------|------|
228
+ |----------|-------|------|
151
229
  | `--vt-primary` | `#7C3AED` | `#A78BFA` |
152
230
  | `--vt-background` | `#FFFFFF` | `#0F172A` |
153
231
  | `--vt-surface` | `#F8FAFC` | `#1E293B` |
@@ -157,98 +235,99 @@ export default function Navbar() {
157
235
 
158
236
  ---
159
237
 
160
- ## 🎯 Custom Colors
238
+ ## 🌀 Tailwind Plugin
239
+ ```js
240
+ // tailwind.config.js
241
+ import { varthemePlugin } from 'vartheme/tailwind'
161
242
 
162
- ```tsx
163
- <ThemeProvider
164
- config={{
165
- colors: {
166
- primary: '#EC4899',
167
- accent: '#F59E0B',
168
- },
169
- }}
170
- >
171
- <App />
172
- </ThemeProvider>
243
+ export default {
244
+ plugins: [varthemePlugin],
245
+ }
173
246
  ```
174
-
175
- Dynamic:
176
-
177
- ```tsx
178
- const { setColors } = useThemeContext()
179
- setColors({ primary: '#10B981' })
247
+ ```jsx
248
+ <div className="bg-vt-surface text-vt-text border border-vt-border">
249
+ <h1 className="text-vt-primary">Hello!</h1>
250
+ <button className="bg-vt-primary text-white">Click me</button>
251
+ </div>
180
252
  ```
181
253
 
182
- ---
183
-
184
- ## 🧠 API
185
-
186
- ### ThemeProvider
187
-
188
- | Prop | Type |
189
- |------|------|
190
- | mode | `'light' \| 'dark' \| 'system'` |
191
- | colors | ThemeColors |
192
- | transitions | boolean |
254
+ | Class | CSS Variable |
255
+ |-------|-------------|
256
+ | `bg-vt-primary` | `--vt-primary` |
257
+ | `bg-vt-background` | `--vt-background` |
258
+ | `bg-vt-surface` | `--vt-surface` |
259
+ | `text-vt-text` | `--vt-text` |
260
+ | `text-vt-primary` | `--vt-primary` |
261
+ | `text-vt-accent` | `--vt-accent` |
262
+ | `border-vt-border` | `--vt-border` |
263
+ | `shadow-vt-glow` | `--vt-primary` glow |
193
264
 
194
265
  ---
195
266
 
196
- ### useThemeContext
197
-
198
- - mode
199
- - resolvedMode
200
- - colors
201
- - toggle()
202
- - setMode()
203
- - setColors()
267
+ ## 🧩 TypeScript
268
+ ```tsx
269
+ import type { ThemeMode, ThemeColors, ThemeConfig, ThemeName, AttributeStrategy } from 'vartheme'
270
+ ```
204
271
 
205
272
  ---
206
273
 
207
- ### ThemeToggle
274
+ ## 🧠 API Reference
208
275
 
209
- | Prop | Default |
210
- |------|------|
211
- | size | 48 |
276
+ ### ThemeProvider props
212
277
 
213
- ---
278
+ | Prop | Type | Default |
279
+ |------|------|---------|
280
+ | `mode` | `'light' \| 'dark' \| 'system'` | `'system'` |
281
+ | `theme` | `'default' \| 'ocean' \| 'forest' \| 'sunset' \| 'rose'` | `'default'` |
282
+ | `colors` | `ThemeColors` | `{}` |
283
+ | `transitions` | `boolean` | `false` |
284
+ | `strategy` | `AttributeStrategy` | `{ type: 'data-attribute' }` |
285
+ | `onThemeChange` | `(mode: 'light' \| 'dark') => void` | — |
214
286
 
215
- ## 🧩 TypeScript
287
+ ### useThemeContext returns
216
288
 
217
- ```tsx
218
- import type { ThemeMode, ThemeColors, ThemeConfig } from 'vartheme'
219
- ```
289
+ | Property | Type |
290
+ |----------|------|
291
+ | `mode` | `ThemeMode` |
292
+ | `resolvedMode` | `'light' \| 'dark'` |
293
+ | `theme` | `ThemeName` |
294
+ | `colors` | `ThemeColors` |
295
+ | `toggle()` | `() => void` |
296
+ | `setMode()` | `(mode: ThemeMode) => void` |
297
+ | `setTheme()` | `(theme: ThemeName) => void` |
298
+ | `setColors()` | `(colors: ThemeColors) => void` |
220
299
 
221
300
  ---
222
301
 
223
- ## 🌍 Use Cases
302
+ ## 🌍 Use Cases
224
303
 
225
- - SaaS dashboards
226
- - Design systems
227
- - Portfolios
228
- - Startups
229
- - Component libraries
230
- - Large scale apps
304
+ - SaaS dashboards
305
+ - Design systems
306
+ - Portfolios
307
+ - Startups
308
+ - Component libraries
309
+ - Large scale apps
231
310
 
232
311
  ---
233
312
 
234
- ## 🤝 Contributing
313
+ ## 🤝 Contributing
235
314
 
236
- We welcome contributions.
315
+ We welcome contributions.
237
316
  Open issues, submit PRs, or suggest ideas.
238
317
 
239
318
  ---
240
319
 
241
- ## ⭐ Support
320
+ ## ⭐ Support
242
321
 
243
322
  If you like this project:
244
323
 
245
- - ⭐ Star the repo
246
- - 🐦 Share on Twitter
247
- - 💬 Tell your friends
248
- - 🚀 Help grow the community
324
+ - ⭐ Star the repo
325
+ - 🐦 Share on Twitter
326
+ - 💬 Tell your friends
327
+ - 🚀 Help grow the community
249
328
 
250
329
  ---
251
330
 
252
- ## 📄 License
331
+ ## 📄 License
253
332
 
254
- MIT © 2026 vartheme
333
+ MIT © 2026 vartheme
package/dist/index.d.mts CHANGED
@@ -28,11 +28,20 @@ interface ThemeState {
28
28
  setTheme: (theme: ThemeName) => void;
29
29
  }
30
30
 
31
- declare function injectCSSVariables(colors: ThemeColors, mode: "light" | "dark"): void;
31
+ type AttributeStrategy = {
32
+ type: "data-attribute";
33
+ attribute?: string;
34
+ } | {
35
+ type: "class";
36
+ } | {
37
+ type: "both";
38
+ };
39
+ declare function injectCSSVariables(colors: ThemeColors, mode: "light" | "dark", strategy?: AttributeStrategy): void;
32
40
  declare function getDefaultColors(mode: "light" | "dark"): ThemeColors;
33
41
 
34
42
  declare function saveMode(mode: ThemeMode): void;
35
43
  declare function loadMode(): ThemeMode | null;
44
+ declare function loadModeFromCookieString(cookieHeader: string): ThemeMode | null;
36
45
  declare function saveColors(colors: ThemeColors): void;
37
46
  declare function loadColors(): ThemeColors | null;
38
47
  declare function clearStorage(): void;
@@ -46,7 +55,7 @@ declare function isBrowser(): boolean;
46
55
  interface ThemeToggleProps {
47
56
  size?: number;
48
57
  }
49
- declare function ThemeToggle({ size }: ThemeToggleProps): react_jsx_runtime.JSX.Element;
58
+ declare function ThemeToggle({ size }: ThemeToggleProps): react_jsx_runtime.JSX.Element | null;
50
59
 
51
60
  interface ThemePreset {
52
61
  name: string;
@@ -58,7 +67,7 @@ declare function getTheme(name: string): ThemePreset;
58
67
 
59
68
  declare const varthemePlugin: ReturnType<typeof plugin>;
60
69
 
61
- declare function useTheme(initial?: ThemeMode, initialTheme?: ThemeName): ThemeState;
70
+ declare function useTheme(initial?: ThemeMode, initialTheme?: ThemeName, strategy?: AttributeStrategy, onThemeChange?: (mode: "light" | "dark") => void): ThemeState;
62
71
 
63
72
  interface ThemeProviderProps {
64
73
  children: ReactNode;
@@ -66,8 +75,12 @@ interface ThemeProviderProps {
66
75
  theme?: ThemeName;
67
76
  colors?: ThemeColors;
68
77
  transitions?: boolean;
78
+ strategy?: AttributeStrategy;
79
+ onThemeChange?: (mode: "light" | "dark") => void;
69
80
  }
70
- declare function ThemeProvider({ children, mode, theme, colors, transitions, }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
81
+ declare function ThemeProvider({ children, mode, theme, colors, transitions, strategy, onThemeChange, }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
71
82
  declare function useThemeContext(): ThemeState;
72
83
 
73
- 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, varthemePlugin, watchSystemMode };
84
+ declare function getFOUCScript(): string;
85
+
86
+ export { type AttributeStrategy, BUILT_IN_THEMES, type ThemeColors, type ThemeConfig, type ThemeMode, type ThemeName, ThemeProvider, type ThemeState, ThemeToggle, clearStorage, getDefaultColors, getFOUCScript, getSystemMode, getTheme, injectCSSVariables, isBrowser, loadColors, loadMode, loadModeFromCookieString, saveColors, saveMode, useTheme, useThemeContext, varthemePlugin, watchSystemMode };
package/dist/index.d.ts CHANGED
@@ -28,11 +28,20 @@ interface ThemeState {
28
28
  setTheme: (theme: ThemeName) => void;
29
29
  }
30
30
 
31
- declare function injectCSSVariables(colors: ThemeColors, mode: "light" | "dark"): void;
31
+ type AttributeStrategy = {
32
+ type: "data-attribute";
33
+ attribute?: string;
34
+ } | {
35
+ type: "class";
36
+ } | {
37
+ type: "both";
38
+ };
39
+ declare function injectCSSVariables(colors: ThemeColors, mode: "light" | "dark", strategy?: AttributeStrategy): void;
32
40
  declare function getDefaultColors(mode: "light" | "dark"): ThemeColors;
33
41
 
34
42
  declare function saveMode(mode: ThemeMode): void;
35
43
  declare function loadMode(): ThemeMode | null;
44
+ declare function loadModeFromCookieString(cookieHeader: string): ThemeMode | null;
36
45
  declare function saveColors(colors: ThemeColors): void;
37
46
  declare function loadColors(): ThemeColors | null;
38
47
  declare function clearStorage(): void;
@@ -46,7 +55,7 @@ declare function isBrowser(): boolean;
46
55
  interface ThemeToggleProps {
47
56
  size?: number;
48
57
  }
49
- declare function ThemeToggle({ size }: ThemeToggleProps): react_jsx_runtime.JSX.Element;
58
+ declare function ThemeToggle({ size }: ThemeToggleProps): react_jsx_runtime.JSX.Element | null;
50
59
 
51
60
  interface ThemePreset {
52
61
  name: string;
@@ -58,7 +67,7 @@ declare function getTheme(name: string): ThemePreset;
58
67
 
59
68
  declare const varthemePlugin: ReturnType<typeof plugin>;
60
69
 
61
- declare function useTheme(initial?: ThemeMode, initialTheme?: ThemeName): ThemeState;
70
+ declare function useTheme(initial?: ThemeMode, initialTheme?: ThemeName, strategy?: AttributeStrategy, onThemeChange?: (mode: "light" | "dark") => void): ThemeState;
62
71
 
63
72
  interface ThemeProviderProps {
64
73
  children: ReactNode;
@@ -66,8 +75,12 @@ interface ThemeProviderProps {
66
75
  theme?: ThemeName;
67
76
  colors?: ThemeColors;
68
77
  transitions?: boolean;
78
+ strategy?: AttributeStrategy;
79
+ onThemeChange?: (mode: "light" | "dark") => void;
69
80
  }
70
- declare function ThemeProvider({ children, mode, theme, colors, transitions, }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
81
+ declare function ThemeProvider({ children, mode, theme, colors, transitions, strategy, onThemeChange, }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
71
82
  declare function useThemeContext(): ThemeState;
72
83
 
73
- 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, varthemePlugin, watchSystemMode };
84
+ declare function getFOUCScript(): string;
85
+
86
+ export { type AttributeStrategy, BUILT_IN_THEMES, type ThemeColors, type ThemeConfig, type ThemeMode, type ThemeName, ThemeProvider, type ThemeState, ThemeToggle, clearStorage, getDefaultColors, getFOUCScript, getSystemMode, getTheme, injectCSSVariables, isBrowser, loadColors, loadMode, loadModeFromCookieString, saveColors, saveMode, useTheme, useThemeContext, varthemePlugin, watchSystemMode };
package/dist/index.js CHANGED
@@ -1,26 +1,49 @@
1
- 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime'),J=require('tailwindcss/plugin');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var J__default=/*#__PURE__*/_interopDefault(J);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 P(){let e=document.createElement("style");e.id="vartheme-transitions",e.textContent=`
1
+ 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime'),ne=require('tailwindcss/plugin');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ne__default=/*#__PURE__*/_interopDefault(ne);var R={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"},L=typeof window!="undefined";function y(e,r,o={type:"data-attribute"}){if(!L)return;let t=document.documentElement,m={...r==="dark"?P:R,...e};if(t.removeAttribute("data-theme"),t.removeAttribute("data-mode"),t.classList.remove("light","dark"),o.type==="data-attribute"||o.type==="both"){let n=o.type==="data-attribute"&&o.attribute?o.attribute:"data-theme";t.setAttribute(n,r);}(o.type==="class"||o.type==="both")&&t.classList.add(r),Object.entries(m).forEach(([n,c])=>{t.style.setProperty(`--vt-${n}`,c);});}function N(){if(!L||document.getElementById("vartheme-transitions"))return;let e=document.createElement("style");e.id="vartheme-transitions",e.textContent=`
2
2
  *, *::before, *::after {
3
- transition:
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 F(e){return e==="dark"?B:M}var y="vartheme-mode",T="vartheme-colors";function p(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(T,JSON.stringify(e));}catch(r){console.warn("vartheme: localStorage not available");}}function C(){try{let e=localStorage.getItem(T);return e?JSON.parse(e):null}catch(e){return null}}function $(){try{localStorage.removeItem(y),localStorage.removeItem(T);}catch(e){console.warn("vartheme: localStorage not available");}}function l(){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 f(e){return k[e]||k.default}function A(e,r){let[o,a]=react.useState(()=>b()||e||"system"),[t,s]=react.useState(r||"default"),[i,N]=react.useState(()=>C()||{}),m=o==="system"?l():o;react.useEffect(()=>{let n=f(t),d=m==="dark"?n.dark:n.light;u({...d,...i},m);},[m,i,t]),react.useEffect(()=>o!=="system"?void 0:E(()=>{let d=f(t),h=l()==="dark"?d.dark:d.light;u({...h,...i},l());}),[o,i,t]);let L=react.useCallback(()=>{let n=m==="light"?"dark":"light";a(n),p(n);},[m]),_=react.useCallback(n=>{a(n),p(n);},[]),O=react.useCallback(n=>{N(d=>{let h={...d,...n};return x(h),h});},[]),U=react.useCallback(n=>{s(n);},[]);return {mode:o,resolvedMode:m,theme:t,colors:{...F(m),...i},toggle:L,setMode:_,setColors:O,setTheme:U}}var R=react.createContext(null);function K({children:e,mode:r,theme:o="default",colors:a,transitions:t}){let s=A(r,o);return t&&P(),a&&s.setColors(a),jsxRuntime.jsx(R.Provider,{value:s,children:e})}function S(){let e=react.useContext(R);if(!e)throw new Error("useThemeContext must be used inside <ThemeProvider />");return e}function Y({size:e=48}){let{resolvedMode:r,toggle:o}=S(),a=r==="dark";return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("style",{children:`
9
- @keyframes vt-spin {
10
- from { transform: rotate(0deg); }
11
- to { transform: rotate(360deg); }
12
- }
13
- @keyframes vt-twinkle {
14
- 0% { opacity: 0.2; transform: scale(0.6); }
15
- 100% { opacity: 1; transform: scale(1.2); }
16
- }
17
- @keyframes vt-glow-sun {
18
- 0% { box-shadow: 0 0 10px 2px #FCD34D66; }
19
- 100% { box-shadow: 0 0 22px 6px #FCD34DAA; }
20
- }
21
- @keyframes vt-glow-moon {
22
- 0% { box-shadow: 0 0 10px 2px #A78BFA55; }
23
- 100% { box-shadow: 0 0 22px 6px #A78BFA99; }
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))]})]})]})}var Q=J__default.default(function({addBase:e}){e({":root":{"--vt-primary":"#7C3AED","--vt-background":"#FFFFFF","--vt-surface":"#F8FAFC","--vt-text":"#0F172A","--vt-border":"#E2E8F0","--vt-accent":"#06B6D4"}});},{theme:{extend:{colors:{"vt-primary":"var(--vt-primary)","vt-background":"var(--vt-background)","vt-surface":"var(--vt-surface)","vt-text":"var(--vt-text)","vt-border":"var(--vt-border)","vt-accent":"var(--vt-accent)"},backgroundColor:{"vt-primary":"var(--vt-primary)","vt-background":"var(--vt-background)","vt-surface":"var(--vt-surface)"},textColor:{"vt-primary":"var(--vt-primary)","vt-text":"var(--vt-text)","vt-muted":"var(--vt-text-muted)","vt-accent":"var(--vt-accent)"},borderColor:{"vt-border":"var(--vt-border)","vt-primary":"var(--vt-primary)"},boxShadow:{"vt-glow":"0 0 20px var(--vt-primary)","vt-card":"0 4px 24px var(--vt-primary)"}}}}),X=Q;exports.BUILT_IN_THEMES=k;exports.ThemeProvider=K;exports.ThemeToggle=Y;exports.clearStorage=$;exports.getDefaultColors=F;exports.getSystemMode=l;exports.getTheme=f;exports.injectCSSVariables=u;exports.isBrowser=j;exports.loadColors=C;exports.loadMode=b;exports.saveColors=x;exports.saveMode=p;exports.useTheme=A;exports.useThemeContext=S;exports.varthemePlugin=X;exports.watchSystemMode=E;//# sourceMappingURL=index.js.map
8
+ `,document.head.appendChild(e);}function T(e){return e==="dark"?P:R}var p="vartheme-mode",h="vartheme-colors",l=typeof window!="undefined";function U(e,r,o=365){if(!l)return;let t=new Date(Date.now()+o*864e5).toUTCString();document.cookie=`${e}=${encodeURIComponent(r)};expires=${t};path=/;SameSite=Lax`;}function _(e){if(!l)return null;let r=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return r?decodeURIComponent(r[1]):null}function O(e){l&&(document.cookie=`${e}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`);}function F(e){if(l)try{localStorage.setItem(p,e),U(p,e);}catch(r){console.warn("vartheme: localStorage not available");}}function E(){if(!l)return null;try{let e=localStorage.getItem(p)||_(p);return e==="light"||e==="dark"||e==="system"?e:null}catch(e){return null}}function X(e){let r=e.match(new RegExp(`(?:^|; )${p}=([^;]*)`));if(!r)return null;let o=decodeURIComponent(r[1]);return o==="light"||o==="dark"||o==="system"?o:null}function k(e){if(l)try{let r=JSON.stringify(e);localStorage.setItem(h,r),U(h,r);}catch(r){console.warn("vartheme: localStorage not available");}}function S(){if(!l)return null;try{let e=localStorage.getItem(h)||_(h);return e?JSON.parse(e):null}catch(e){return null}}function q(){if(l)try{localStorage.removeItem(p),localStorage.removeItem(h),O(p),O(h);}catch(e){console.warn("vartheme: localStorage not available");}}function b(){return typeof window=="undefined"?"light":window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function A(e){if(typeof window=="undefined")return ()=>{};let r=window.matchMedia("(prefers-color-scheme: dark)"),o=t=>{e(t.matches?"dark":"light");};return r.addEventListener("change",o),()=>{r.removeEventListener("change",o);}}function W(){return typeof window!="undefined"}var D={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 x(e){return D[e]||D.default}function M(e,r,o={type:"data-attribute"},t){let[d,m]=react.useState(()=>E()||e||"system"),[n,c]=react.useState(r||"default"),[u,a]=react.useState(()=>S()||{}),i=d==="system"?b():d;react.useEffect(()=>{let s=x(n),f=i==="dark"?s.dark:s.light;y({...f,...u},i,o),t==null||t(i);},[i,u,n]),react.useEffect(()=>d!=="system"?void 0:A(()=>{let f=b(),g=x(n),Q=f==="dark"?g.dark:g.light;y({...Q,...u},f,o),t==null||t(f);}),[d,u,n]);let Y=react.useCallback(()=>{let s=i==="light"?"dark":"light";m(s),F(s);},[i]),H=react.useCallback(s=>{m(s),F(s);},[]),K=react.useCallback(s=>{a(f=>{let g={...f,...s};return k(g),g});},[]),V=react.useCallback(s=>{c(s);},[]);return {mode:d,resolvedMode:i,theme:n,colors:{...T(i),...u},toggle:Y,setMode:H,setColors:K,setTheme:V}}var G=react.createContext(null);function ee({children:e,mode:r,theme:o="default",colors:t,transitions:d,strategy:m={type:"data-attribute"},onThemeChange:n}){let c=M(r,o,m,n);return react.useEffect(()=>{d&&N();},[d]),react.useEffect(()=>{t&&c.setColors(t);},[t]),jsxRuntime.jsx(G.Provider,{value:c,children:e})}function B(){let e=react.useContext(G);if(!e)throw new Error("useThemeContext must be used inside <ThemeProvider />");return e}var oe=`
9
+ @keyframes vt-spin {
10
+ from { transform: rotate(0deg); }
11
+ to { transform: rotate(360deg); }
12
+ }
13
+ @keyframes vt-twinkle {
14
+ 0% { opacity: 0.2; transform: scale(0.6); }
15
+ 100% { opacity: 1; transform: scale(1.2); }
16
+ }
17
+ @keyframes vt-glow-sun {
18
+ 0% { box-shadow: 0 0 10px 2px #FCD34D66; }
19
+ 100% { box-shadow: 0 0 22px 6px #FCD34DAA; }
20
+ }
21
+ @keyframes vt-glow-moon {
22
+ 0% { box-shadow: 0 0 10px 2px #A78BFA55; }
23
+ 100% { box-shadow: 0 0 22px 6px #A78BFA99; }
24
+ }
25
+ @keyframes vt-fade-in {
26
+ from { opacity: 0; transform: scale(0.5) rotate(-30deg); }
27
+ to { opacity: 1; transform: scale(1) rotate(0deg); }
28
+ }
29
+ `;function ae({size:e=48}){let{resolvedMode:r,toggle:o}=B(),t=r==="dark",[d,m]=react.useState(false),[n,c]=react.useState(false);react.useEffect(()=>{if(document.getElementById("vt-toggle-styles"))return;let a=document.createElement("style");a.id="vt-toggle-styles",a.textContent=oe,document.head.appendChild(a),m(true);},[]);function u(){c(true),o(),setTimeout(()=>c(false),400);}return d?jsxRuntime.jsxs("button",{onClick:u,"aria-label":t?"Switch to light mode":"Switch to dark mode",style:{width:e,height:e,borderRadius:"50%",border:"none",cursor:"pointer",position:"relative",background:t?"radial-gradient(circle, #1E293B, #0F172A)":"radial-gradient(circle, #FEF3C7, #FDE68A)",animation:t?"vt-glow-moon 2s infinite alternate":"vt-glow-sun 2s infinite alternate",transition:"background 0.4s ease",display:"flex",alignItems:"center",justifyContent:"center",overflow:"visible",opacity:n?.7:1,transform:n?"scale(0.88)":"scale(1)"},children:[!t&&jsxRuntime.jsxs("div",{style:{animation:"vt-fade-in 0.35s ease",display:"contents"},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((a,i)=>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(${a}deg) translateY(-${e*.54}px)`,animation:"vt-spin 8s linear infinite",animationDelay:`${i*.05}s`,opacity:.9}},i))]}),t&&jsxRuntime.jsxs("div",{style:{animation:"vt-fade-in 0.35s ease",display:"contents"},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((a,i)=>jsxRuntime.jsx("div",{style:{position:"absolute",width:a.s,height:a.s,borderRadius:"50%",background:"#E2E8F0",top:a.top,right:a.right,left:a.left,bottom:a.bottom,animation:"vt-twinkle 1.5s infinite alternate",animationDelay:a.delay}},i))]})]}):null}var ie=ne__default.default(function({addBase:e}){e({":root":{"--vt-primary":"#7C3AED","--vt-background":"#FFFFFF","--vt-surface":"#F8FAFC","--vt-text":"#0F172A","--vt-border":"#E2E8F0","--vt-accent":"#06B6D4"}});},{theme:{extend:{colors:{"vt-primary":"var(--vt-primary)","vt-background":"var(--vt-background)","vt-surface":"var(--vt-surface)","vt-text":"var(--vt-text)","vt-border":"var(--vt-border)","vt-accent":"var(--vt-accent)"},backgroundColor:{"vt-primary":"var(--vt-primary)","vt-background":"var(--vt-background)","vt-surface":"var(--vt-surface)"},textColor:{"vt-primary":"var(--vt-primary)","vt-text":"var(--vt-text)","vt-muted":"var(--vt-text-muted)","vt-accent":"var(--vt-accent)"},borderColor:{"vt-border":"var(--vt-border)","vt-primary":"var(--vt-primary)"},boxShadow:{"vt-glow":"0 0 20px var(--vt-primary)","vt-card":"0 4px 24px var(--vt-primary)"}}}}),se=ie;function de(){return `(function() {
30
+ try {
31
+ var mode = localStorage.getItem('vartheme-mode');
32
+ var resolved = mode;
33
+ if (!mode || mode === 'system') {
34
+ resolved = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
35
+ }
36
+ var colors = null;
37
+ try { colors = JSON.parse(localStorage.getItem('vartheme-colors') || 'null'); } catch(e) {}
38
+ var defaults = resolved === 'dark'
39
+ ? { primary:'#A78BFA', background:'#0F172A', surface:'#1E293B', text:'#F8FAFC', border:'#334155', accent:'#22D3EE' }
40
+ : { primary:'#7C3AED', background:'#FFFFFF', surface:'#F8FAFC', text:'#0F172A', border:'#E2E8F0', accent:'#06B6D4' };
41
+ var merged = Object.assign({}, defaults, colors || {});
42
+ var root = document.documentElement;
43
+ root.setAttribute('data-theme', resolved);
44
+ Object.keys(merged).forEach(function(key) {
45
+ root.style.setProperty('--vt-' + key, merged[key]);
46
+ });
47
+ } catch(e) {}
48
+ })();`}exports.BUILT_IN_THEMES=D;exports.ThemeProvider=ee;exports.ThemeToggle=ae;exports.clearStorage=q;exports.getDefaultColors=T;exports.getFOUCScript=de;exports.getSystemMode=b;exports.getTheme=x;exports.injectCSSVariables=y;exports.isBrowser=W;exports.loadColors=S;exports.loadMode=E;exports.loadModeFromCookieString=X;exports.saveColors=k;exports.saveMode=F;exports.useTheme=M;exports.useThemeContext=B;exports.varthemePlugin=se;exports.watchSystemMode=A;//# sourceMappingURL=index.js.map
26
49
  //# 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","../src/tailwind/plugin.ts"],"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","varthemePlugin","plugin","addBase","plugin_default"],"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}","import plugin from \"tailwindcss/plugin\";\n\nconst varthemePlugin: ReturnType<typeof plugin> = plugin(\n function ({ addBase }) {\n addBase({\n \":root\": {\n \"--vt-primary\": \"#7C3AED\",\n \"--vt-background\": \"#FFFFFF\",\n \"--vt-surface\": \"#F8FAFC\",\n \"--vt-text\": \"#0F172A\",\n \"--vt-border\": \"#E2E8F0\",\n \"--vt-accent\": \"#06B6D4\",\n },\n });\n },\n {\n theme: {\n extend: {\n colors: {\n \"vt-primary\": \"var(--vt-primary)\",\n \"vt-background\": \"var(--vt-background)\",\n \"vt-surface\": \"var(--vt-surface)\",\n \"vt-text\": \"var(--vt-text)\",\n \"vt-border\": \"var(--vt-border)\",\n \"vt-accent\": \"var(--vt-accent)\",\n },\n backgroundColor: {\n \"vt-primary\": \"var(--vt-primary)\",\n \"vt-background\": \"var(--vt-background)\",\n \"vt-surface\": \"var(--vt-surface)\",\n },\n textColor: {\n \"vt-primary\": \"var(--vt-primary)\",\n \"vt-text\": \"var(--vt-text)\",\n \"vt-muted\": \"var(--vt-text-muted)\",\n \"vt-accent\": \"var(--vt-accent)\",\n },\n borderColor: {\n \"vt-border\": \"var(--vt-border)\",\n \"vt-primary\": \"var(--vt-primary)\",\n },\n boxShadow: {\n \"vt-glow\": \"0 0 20px var(--vt-primary)\",\n \"vt-card\": \"0 4px 24px var(--vt-primary)\",\n },\n },\n },\n }\n);\n\nexport default varthemePlugin;"]}
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","../src/tailwind/plugin.ts","../src/core/fouc.ts"],"names":["DEFAULT_LIGHT","DEFAULT_DARK","isBrowser","injectCSSVariables","colors","mode","strategy","root","merged","attr","key","value","applyTransitions","style","getDefaultColors","STORAGE_KEY_MODE","STORAGE_KEY_COLORS","setCookie","name","days","expires","getCookie","match","deleteCookie","saveMode","e","loadMode","saved","loadModeFromCookieString","cookieHeader","val","saveColors","json","loadColors","clearStorage","getSystemMode","watchSystemMode","callback","mediaQuery","handler","BUILT_IN_THEMES","getTheme","useTheme","initial","initialTheme","onThemeChange","setModeState","useState","theme","setThemeState","setColorsState","resolvedMode","useEffect","preset","presetColors","currentMode","toggle","useCallback","next","setMode","newMode","setColors","newColors","prev","setTheme","newTheme","ThemeContext","createContext","ThemeProvider","children","transitions","themeState","jsx","useThemeContext","context","useContext","STYLES","ThemeToggle","size","isDark","mounted","setMounted","animating","setAnimating","handleToggle","jsxs","deg","star","varthemePlugin","plugin","addBase","plugin_default","getFOUCScript"],"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\nconst isBrowser = typeof window !== \"undefined\";\n\nexport type AttributeStrategy =\n | { type: \"data-attribute\"; attribute?: string } // default: data-theme=\"dark\"\n | { type: \"class\" } // shadcn: class=\"dark\"\n | { type: \"both\" }; // dono saath\n\nexport function injectCSSVariables(\n colors: ThemeColors,\n mode: \"light\" | \"dark\",\n strategy: AttributeStrategy = { type: \"data-attribute\" }\n): void {\n if (!isBrowser) return;\n const root = document.documentElement;\n const defaults = mode === \"dark\" ? DEFAULT_DARK : DEFAULT_LIGHT;\n const merged = { ...defaults, ...colors };\n\n // Pehle purane class/attribute clean karo\n root.removeAttribute(\"data-theme\");\n root.removeAttribute(\"data-mode\");\n root.classList.remove(\"light\", \"dark\");\n\n // Strategy ke hisaab se apply karo\n if (strategy.type === \"data-attribute\" || strategy.type === \"both\") {\n const attr = strategy.type === \"data-attribute\" && strategy.attribute\n ? strategy.attribute\n : \"data-theme\";\n root.setAttribute(attr, mode);\n }\n\n if (strategy.type === \"class\" || strategy.type === \"both\") {\n root.classList.add(mode);\n }\n\n // CSS variables set karo\n Object.entries(merged).forEach(([key, value]) => {\n root.style.setProperty(`--vt-${key}`, value as string);\n });\n}\n\nexport function applyTransitions(): void {\n if (!isBrowser) return;\n if (document.getElementById(\"vartheme-transitions\")) return;\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 if (!isBrowser) return;\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}\n","import { ThemeMode, ThemeColors } from \"../types\";\n\nconst STORAGE_KEY_MODE = \"vartheme-mode\";\nconst STORAGE_KEY_COLORS = \"vartheme-colors\";\n\nconst isBrowser = typeof window !== \"undefined\";\n\n// ── Cookie helpers ──────────────────────────────────────────\nfunction setCookie(name: string, value: string, days = 365): void {\n if (!isBrowser) return;\n const expires = new Date(Date.now() + days * 864e5).toUTCString();\n document.cookie = `${name}=${encodeURIComponent(value)};expires=${expires};path=/;SameSite=Lax`;\n}\n\nfunction getCookie(name: string): string | null {\n if (!isBrowser) return null;\n const match = document.cookie.match(new RegExp(`(?:^|; )${name}=([^;]*)`));\n return match ? decodeURIComponent(match[1]) : null;\n}\n\nfunction deleteCookie(name: string): void {\n if (!isBrowser) return;\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`;\n}\n\n// ── Mode ────────────────────────────────────────────────────\nexport function saveMode(mode: ThemeMode): void {\n if (!isBrowser) return;\n try {\n localStorage.setItem(STORAGE_KEY_MODE, mode);\n setCookie(STORAGE_KEY_MODE, mode);\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}\n\nexport function loadMode(): ThemeMode | null {\n if (!isBrowser) return null;\n try {\n const saved = localStorage.getItem(STORAGE_KEY_MODE) || getCookie(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\n// Server side pe cookie se mode padhna (Next.js Server Components)\nexport function loadModeFromCookieString(cookieHeader: string): ThemeMode | null {\n const match = cookieHeader.match(new RegExp(`(?:^|; )${STORAGE_KEY_MODE}=([^;]*)`));\n if (!match) return null;\n const val = decodeURIComponent(match[1]);\n if (val === \"light\" || val === \"dark\" || val === \"system\") return val;\n return null;\n}\n\n// ── Colors ──────────────────────────────────────────────────\nexport function saveColors(colors: ThemeColors): void {\n if (!isBrowser) return;\n try {\n const json = JSON.stringify(colors);\n localStorage.setItem(STORAGE_KEY_COLORS, json);\n setCookie(STORAGE_KEY_COLORS, json);\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}\n\nexport function loadColors(): ThemeColors | null {\n if (!isBrowser) return null;\n try {\n const saved = localStorage.getItem(STORAGE_KEY_COLORS) || getCookie(STORAGE_KEY_COLORS);\n if (saved) return JSON.parse(saved) as ThemeColors;\n return null;\n } catch {\n return null;\n }\n}\n\n// ── Clear ───────────────────────────────────────────────────\nexport function clearStorage(): void {\n if (!isBrowser) return;\n try {\n localStorage.removeItem(STORAGE_KEY_MODE);\n localStorage.removeItem(STORAGE_KEY_COLORS);\n deleteCookie(STORAGE_KEY_MODE);\n deleteCookie(STORAGE_KEY_COLORS);\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\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, AttributeStrategy } 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 strategy: AttributeStrategy = { type: \"data-attribute\" },\n onThemeChange?: (mode: \"light\" | \"dark\") => void\n): ThemeState {\n const [mode, setModeState] = useState<ThemeMode>(() => {\n return loadMode() || initial || \"system\";\n });\n const [theme, setThemeState] = useState<ThemeName>(\n initialTheme || \"default\"\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, strategy);\n onThemeChange?.(resolvedMode);\n }, [resolvedMode, colors, theme]);\n\n useEffect(() => {\n if (mode !== \"system\") return;\n const cleanup = watchSystemMode(() => {\n const currentMode = getSystemMode();\n const preset = getTheme(theme);\n const presetColors = currentMode === \"dark\" ? preset.dark : preset.light;\n injectCSSVariables({ ...presetColors, ...colors }, currentMode, strategy);\n onThemeChange?.(currentMode);\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}\n","import { createContext, useContext, useEffect, ReactNode } from \"react\";\nimport { ThemeState, ThemeMode, ThemeColors, ThemeName } from \"../types\";\nimport { AttributeStrategy } from \"../core/engine\";\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 strategy?: AttributeStrategy;\n onThemeChange?: (mode: \"light\" | \"dark\") => void;\n}\n\nexport function ThemeProvider({\n children,\n mode,\n theme = \"default\",\n colors,\n transitions,\n strategy = { type: \"data-attribute\" },\n onThemeChange,\n}: ThemeProviderProps) {\n const themeState = useTheme(mode, theme, strategy, onThemeChange);\n\n useEffect(() => {\n if (transitions) applyTransitions();\n }, [transitions]);\n\n useEffect(() => {\n if (colors) themeState.setColors(colors);\n }, [colors]);\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(\"useThemeContext must be used inside <ThemeProvider />\");\n }\n return context;\n}\n","import { useThemeContext } from \"./ThemeProvider\";\nimport { useState, useEffect } from \"react\";\n\ninterface ThemeToggleProps {\n size?: number;\n}\n\nconst STYLES = `\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 @keyframes vt-fade-in {\n from { opacity: 0; transform: scale(0.5) rotate(-30deg); }\n to { opacity: 1; transform: scale(1) rotate(0deg); }\n }\n`;\n\nexport function ThemeToggle({ size = 48 }: ThemeToggleProps) {\n const { resolvedMode, toggle } = useThemeContext();\n const isDark = resolvedMode === \"dark\";\n const [mounted, setMounted] = useState(false);\n const [animating, setAnimating] = useState(false);\n\n // Style tag ek baar inject karo\n useEffect(() => {\n if (document.getElementById(\"vt-toggle-styles\")) return;\n const style = document.createElement(\"style\");\n style.id = \"vt-toggle-styles\";\n style.textContent = STYLES;\n document.head.appendChild(style);\n setMounted(true);\n }, []);\n\n // Toggle pe animation trigger karo\n function handleToggle() {\n setAnimating(true);\n toggle();\n setTimeout(() => setAnimating(false), 400);\n }\n\n if (!mounted) return null;\n\n return (\n <button\n onClick={handleToggle}\n aria-label={isDark ? \"Switch to light mode\" : \"Switch to dark mode\"}\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.4s ease\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"visible\",\n opacity: animating ? 0.7 : 1,\n transform: animating ? \"scale(0.88)\" : \"scale(1)\",\n }}\n >\n {/* Sun Mode */}\n {!isDark && (\n <div style={{ animation: \"vt-fade-in 0.35s ease\", display: \"contents\" }}>\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 {[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 </div>\n )}\n\n {/* Moon Mode */}\n {isDark && (\n <div style={{ animation: \"vt-fade-in 0.35s ease\", display: \"contents\" }}>\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 <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 { 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 as any).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 </div>\n )}\n </button>\n );\n}\n","import plugin from \"tailwindcss/plugin\";\n\nconst varthemePlugin: ReturnType<typeof plugin> = plugin(\n function ({ addBase }) {\n addBase({\n \":root\": {\n \"--vt-primary\": \"#7C3AED\",\n \"--vt-background\": \"#FFFFFF\",\n \"--vt-surface\": \"#F8FAFC\",\n \"--vt-text\": \"#0F172A\",\n \"--vt-border\": \"#E2E8F0\",\n \"--vt-accent\": \"#06B6D4\",\n },\n });\n },\n {\n theme: {\n extend: {\n colors: {\n \"vt-primary\": \"var(--vt-primary)\",\n \"vt-background\": \"var(--vt-background)\",\n \"vt-surface\": \"var(--vt-surface)\",\n \"vt-text\": \"var(--vt-text)\",\n \"vt-border\": \"var(--vt-border)\",\n \"vt-accent\": \"var(--vt-accent)\",\n },\n backgroundColor: {\n \"vt-primary\": \"var(--vt-primary)\",\n \"vt-background\": \"var(--vt-background)\",\n \"vt-surface\": \"var(--vt-surface)\",\n },\n textColor: {\n \"vt-primary\": \"var(--vt-primary)\",\n \"vt-text\": \"var(--vt-text)\",\n \"vt-muted\": \"var(--vt-text-muted)\",\n \"vt-accent\": \"var(--vt-accent)\",\n },\n borderColor: {\n \"vt-border\": \"var(--vt-border)\",\n \"vt-primary\": \"var(--vt-primary)\",\n },\n boxShadow: {\n \"vt-glow\": \"0 0 20px var(--vt-primary)\",\n \"vt-card\": \"0 4px 24px var(--vt-primary)\",\n },\n },\n },\n }\n);\n\nexport default varthemePlugin;","export function getFOUCScript(): string {\n return `(function() {\n try {\n var mode = localStorage.getItem('vartheme-mode');\n var resolved = mode;\n if (!mode || mode === 'system') {\n resolved = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n var colors = null;\n try { colors = JSON.parse(localStorage.getItem('vartheme-colors') || 'null'); } catch(e) {}\n var defaults = resolved === 'dark'\n ? { primary:'#A78BFA', background:'#0F172A', surface:'#1E293B', text:'#F8FAFC', border:'#334155', accent:'#22D3EE' }\n : { primary:'#7C3AED', background:'#FFFFFF', surface:'#F8FAFC', text:'#0F172A', border:'#E2E8F0', accent:'#06B6D4' };\n var merged = Object.assign({}, defaults, colors || {});\n var root = document.documentElement;\n root.setAttribute('data-theme', resolved);\n Object.keys(merged).forEach(function(key) {\n root.style.setProperty('--vt-' + key, merged[key]);\n });\n } catch(e) {}\n })();`;\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,26 +1,49 @@
1
- import {createContext,useState,useEffect,useCallback,useContext}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import J from'tailwindcss/plugin';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 P(){let e=document.createElement("style");e.id="vartheme-transitions",e.textContent=`
1
+ import {createContext,useState,useEffect,useCallback,useContext}from'react';import {jsx,jsxs}from'react/jsx-runtime';import ne from'tailwindcss/plugin';var R={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"},L=typeof window!="undefined";function y(e,r,o={type:"data-attribute"}){if(!L)return;let t=document.documentElement,m={...r==="dark"?P:R,...e};if(t.removeAttribute("data-theme"),t.removeAttribute("data-mode"),t.classList.remove("light","dark"),o.type==="data-attribute"||o.type==="both"){let n=o.type==="data-attribute"&&o.attribute?o.attribute:"data-theme";t.setAttribute(n,r);}(o.type==="class"||o.type==="both")&&t.classList.add(r),Object.entries(m).forEach(([n,c])=>{t.style.setProperty(`--vt-${n}`,c);});}function N(){if(!L||document.getElementById("vartheme-transitions"))return;let e=document.createElement("style");e.id="vartheme-transitions",e.textContent=`
2
2
  *, *::before, *::after {
3
- transition:
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 F(e){return e==="dark"?B:M}var y="vartheme-mode",T="vartheme-colors";function p(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(T,JSON.stringify(e));}catch(r){console.warn("vartheme: localStorage not available");}}function C(){try{let e=localStorage.getItem(T);return e?JSON.parse(e):null}catch(e){return null}}function $(){try{localStorage.removeItem(y),localStorage.removeItem(T);}catch(e){console.warn("vartheme: localStorage not available");}}function l(){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 f(e){return k[e]||k.default}function A(e,r){let[o,a]=useState(()=>b()||e||"system"),[t,s]=useState(r||"default"),[i,N]=useState(()=>C()||{}),m=o==="system"?l():o;useEffect(()=>{let n=f(t),d=m==="dark"?n.dark:n.light;u({...d,...i},m);},[m,i,t]),useEffect(()=>o!=="system"?void 0:E(()=>{let d=f(t),h=l()==="dark"?d.dark:d.light;u({...h,...i},l());}),[o,i,t]);let L=useCallback(()=>{let n=m==="light"?"dark":"light";a(n),p(n);},[m]),_=useCallback(n=>{a(n),p(n);},[]),O=useCallback(n=>{N(d=>{let h={...d,...n};return x(h),h});},[]),U=useCallback(n=>{s(n);},[]);return {mode:o,resolvedMode:m,theme:t,colors:{...F(m),...i},toggle:L,setMode:_,setColors:O,setTheme:U}}var R=createContext(null);function K({children:e,mode:r,theme:o="default",colors:a,transitions:t}){let s=A(r,o);return t&&P(),a&&s.setColors(a),jsx(R.Provider,{value:s,children:e})}function S(){let e=useContext(R);if(!e)throw new Error("useThemeContext must be used inside <ThemeProvider />");return e}function Y({size:e=48}){let{resolvedMode:r,toggle:o}=S(),a=r==="dark";return jsxs(Fragment,{children:[jsx("style",{children:`
9
- @keyframes vt-spin {
10
- from { transform: rotate(0deg); }
11
- to { transform: rotate(360deg); }
12
- }
13
- @keyframes vt-twinkle {
14
- 0% { opacity: 0.2; transform: scale(0.6); }
15
- 100% { opacity: 1; transform: scale(1.2); }
16
- }
17
- @keyframes vt-glow-sun {
18
- 0% { box-shadow: 0 0 10px 2px #FCD34D66; }
19
- 100% { box-shadow: 0 0 22px 6px #FCD34DAA; }
20
- }
21
- @keyframes vt-glow-moon {
22
- 0% { box-shadow: 0 0 10px 2px #A78BFA55; }
23
- 100% { box-shadow: 0 0 22px 6px #A78BFA99; }
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))]})]})]})}var Q=J(function({addBase:e}){e({":root":{"--vt-primary":"#7C3AED","--vt-background":"#FFFFFF","--vt-surface":"#F8FAFC","--vt-text":"#0F172A","--vt-border":"#E2E8F0","--vt-accent":"#06B6D4"}});},{theme:{extend:{colors:{"vt-primary":"var(--vt-primary)","vt-background":"var(--vt-background)","vt-surface":"var(--vt-surface)","vt-text":"var(--vt-text)","vt-border":"var(--vt-border)","vt-accent":"var(--vt-accent)"},backgroundColor:{"vt-primary":"var(--vt-primary)","vt-background":"var(--vt-background)","vt-surface":"var(--vt-surface)"},textColor:{"vt-primary":"var(--vt-primary)","vt-text":"var(--vt-text)","vt-muted":"var(--vt-text-muted)","vt-accent":"var(--vt-accent)"},borderColor:{"vt-border":"var(--vt-border)","vt-primary":"var(--vt-primary)"},boxShadow:{"vt-glow":"0 0 20px var(--vt-primary)","vt-card":"0 4px 24px var(--vt-primary)"}}}}),X=Q;export{k as BUILT_IN_THEMES,K as ThemeProvider,Y as ThemeToggle,$ as clearStorage,F as getDefaultColors,l as getSystemMode,f as getTheme,u as injectCSSVariables,j as isBrowser,C as loadColors,b as loadMode,x as saveColors,p as saveMode,A as useTheme,S as useThemeContext,X as varthemePlugin,E as watchSystemMode};//# sourceMappingURL=index.mjs.map
8
+ `,document.head.appendChild(e);}function T(e){return e==="dark"?P:R}var p="vartheme-mode",h="vartheme-colors",l=typeof window!="undefined";function U(e,r,o=365){if(!l)return;let t=new Date(Date.now()+o*864e5).toUTCString();document.cookie=`${e}=${encodeURIComponent(r)};expires=${t};path=/;SameSite=Lax`;}function _(e){if(!l)return null;let r=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return r?decodeURIComponent(r[1]):null}function O(e){l&&(document.cookie=`${e}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`);}function F(e){if(l)try{localStorage.setItem(p,e),U(p,e);}catch(r){console.warn("vartheme: localStorage not available");}}function E(){if(!l)return null;try{let e=localStorage.getItem(p)||_(p);return e==="light"||e==="dark"||e==="system"?e:null}catch(e){return null}}function X(e){let r=e.match(new RegExp(`(?:^|; )${p}=([^;]*)`));if(!r)return null;let o=decodeURIComponent(r[1]);return o==="light"||o==="dark"||o==="system"?o:null}function k(e){if(l)try{let r=JSON.stringify(e);localStorage.setItem(h,r),U(h,r);}catch(r){console.warn("vartheme: localStorage not available");}}function S(){if(!l)return null;try{let e=localStorage.getItem(h)||_(h);return e?JSON.parse(e):null}catch(e){return null}}function q(){if(l)try{localStorage.removeItem(p),localStorage.removeItem(h),O(p),O(h);}catch(e){console.warn("vartheme: localStorage not available");}}function b(){return typeof window=="undefined"?"light":window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function A(e){if(typeof window=="undefined")return ()=>{};let r=window.matchMedia("(prefers-color-scheme: dark)"),o=t=>{e(t.matches?"dark":"light");};return r.addEventListener("change",o),()=>{r.removeEventListener("change",o);}}function W(){return typeof window!="undefined"}var D={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 x(e){return D[e]||D.default}function M(e,r,o={type:"data-attribute"},t){let[d,m]=useState(()=>E()||e||"system"),[n,c]=useState(r||"default"),[u,a]=useState(()=>S()||{}),i=d==="system"?b():d;useEffect(()=>{let s=x(n),f=i==="dark"?s.dark:s.light;y({...f,...u},i,o),t==null||t(i);},[i,u,n]),useEffect(()=>d!=="system"?void 0:A(()=>{let f=b(),g=x(n),Q=f==="dark"?g.dark:g.light;y({...Q,...u},f,o),t==null||t(f);}),[d,u,n]);let Y=useCallback(()=>{let s=i==="light"?"dark":"light";m(s),F(s);},[i]),H=useCallback(s=>{m(s),F(s);},[]),K=useCallback(s=>{a(f=>{let g={...f,...s};return k(g),g});},[]),V=useCallback(s=>{c(s);},[]);return {mode:d,resolvedMode:i,theme:n,colors:{...T(i),...u},toggle:Y,setMode:H,setColors:K,setTheme:V}}var G=createContext(null);function ee({children:e,mode:r,theme:o="default",colors:t,transitions:d,strategy:m={type:"data-attribute"},onThemeChange:n}){let c=M(r,o,m,n);return useEffect(()=>{d&&N();},[d]),useEffect(()=>{t&&c.setColors(t);},[t]),jsx(G.Provider,{value:c,children:e})}function B(){let e=useContext(G);if(!e)throw new Error("useThemeContext must be used inside <ThemeProvider />");return e}var oe=`
9
+ @keyframes vt-spin {
10
+ from { transform: rotate(0deg); }
11
+ to { transform: rotate(360deg); }
12
+ }
13
+ @keyframes vt-twinkle {
14
+ 0% { opacity: 0.2; transform: scale(0.6); }
15
+ 100% { opacity: 1; transform: scale(1.2); }
16
+ }
17
+ @keyframes vt-glow-sun {
18
+ 0% { box-shadow: 0 0 10px 2px #FCD34D66; }
19
+ 100% { box-shadow: 0 0 22px 6px #FCD34DAA; }
20
+ }
21
+ @keyframes vt-glow-moon {
22
+ 0% { box-shadow: 0 0 10px 2px #A78BFA55; }
23
+ 100% { box-shadow: 0 0 22px 6px #A78BFA99; }
24
+ }
25
+ @keyframes vt-fade-in {
26
+ from { opacity: 0; transform: scale(0.5) rotate(-30deg); }
27
+ to { opacity: 1; transform: scale(1) rotate(0deg); }
28
+ }
29
+ `;function ae({size:e=48}){let{resolvedMode:r,toggle:o}=B(),t=r==="dark",[d,m]=useState(false),[n,c]=useState(false);useEffect(()=>{if(document.getElementById("vt-toggle-styles"))return;let a=document.createElement("style");a.id="vt-toggle-styles",a.textContent=oe,document.head.appendChild(a),m(true);},[]);function u(){c(true),o(),setTimeout(()=>c(false),400);}return d?jsxs("button",{onClick:u,"aria-label":t?"Switch to light mode":"Switch to dark mode",style:{width:e,height:e,borderRadius:"50%",border:"none",cursor:"pointer",position:"relative",background:t?"radial-gradient(circle, #1E293B, #0F172A)":"radial-gradient(circle, #FEF3C7, #FDE68A)",animation:t?"vt-glow-moon 2s infinite alternate":"vt-glow-sun 2s infinite alternate",transition:"background 0.4s ease",display:"flex",alignItems:"center",justifyContent:"center",overflow:"visible",opacity:n?.7:1,transform:n?"scale(0.88)":"scale(1)"},children:[!t&&jsxs("div",{style:{animation:"vt-fade-in 0.35s ease",display:"contents"},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((a,i)=>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(${a}deg) translateY(-${e*.54}px)`,animation:"vt-spin 8s linear infinite",animationDelay:`${i*.05}s`,opacity:.9}},i))]}),t&&jsxs("div",{style:{animation:"vt-fade-in 0.35s ease",display:"contents"},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((a,i)=>jsx("div",{style:{position:"absolute",width:a.s,height:a.s,borderRadius:"50%",background:"#E2E8F0",top:a.top,right:a.right,left:a.left,bottom:a.bottom,animation:"vt-twinkle 1.5s infinite alternate",animationDelay:a.delay}},i))]})]}):null}var ie=ne(function({addBase:e}){e({":root":{"--vt-primary":"#7C3AED","--vt-background":"#FFFFFF","--vt-surface":"#F8FAFC","--vt-text":"#0F172A","--vt-border":"#E2E8F0","--vt-accent":"#06B6D4"}});},{theme:{extend:{colors:{"vt-primary":"var(--vt-primary)","vt-background":"var(--vt-background)","vt-surface":"var(--vt-surface)","vt-text":"var(--vt-text)","vt-border":"var(--vt-border)","vt-accent":"var(--vt-accent)"},backgroundColor:{"vt-primary":"var(--vt-primary)","vt-background":"var(--vt-background)","vt-surface":"var(--vt-surface)"},textColor:{"vt-primary":"var(--vt-primary)","vt-text":"var(--vt-text)","vt-muted":"var(--vt-text-muted)","vt-accent":"var(--vt-accent)"},borderColor:{"vt-border":"var(--vt-border)","vt-primary":"var(--vt-primary)"},boxShadow:{"vt-glow":"0 0 20px var(--vt-primary)","vt-card":"0 4px 24px var(--vt-primary)"}}}}),se=ie;function de(){return `(function() {
30
+ try {
31
+ var mode = localStorage.getItem('vartheme-mode');
32
+ var resolved = mode;
33
+ if (!mode || mode === 'system') {
34
+ resolved = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
35
+ }
36
+ var colors = null;
37
+ try { colors = JSON.parse(localStorage.getItem('vartheme-colors') || 'null'); } catch(e) {}
38
+ var defaults = resolved === 'dark'
39
+ ? { primary:'#A78BFA', background:'#0F172A', surface:'#1E293B', text:'#F8FAFC', border:'#334155', accent:'#22D3EE' }
40
+ : { primary:'#7C3AED', background:'#FFFFFF', surface:'#F8FAFC', text:'#0F172A', border:'#E2E8F0', accent:'#06B6D4' };
41
+ var merged = Object.assign({}, defaults, colors || {});
42
+ var root = document.documentElement;
43
+ root.setAttribute('data-theme', resolved);
44
+ Object.keys(merged).forEach(function(key) {
45
+ root.style.setProperty('--vt-' + key, merged[key]);
46
+ });
47
+ } catch(e) {}
48
+ })();`}export{D as BUILT_IN_THEMES,ee as ThemeProvider,ae as ThemeToggle,q as clearStorage,T as getDefaultColors,de as getFOUCScript,b as getSystemMode,x as getTheme,y as injectCSSVariables,W as isBrowser,S as loadColors,E as loadMode,X as loadModeFromCookieString,k as saveColors,F as saveMode,M as useTheme,B as useThemeContext,se as varthemePlugin,A as watchSystemMode};//# sourceMappingURL=index.mjs.map
26
49
  //# 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","../src/tailwind/plugin.ts"],"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","varthemePlugin","plugin","addBase","plugin_default"],"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}","import plugin from \"tailwindcss/plugin\";\n\nconst varthemePlugin: ReturnType<typeof plugin> = plugin(\n function ({ addBase }) {\n addBase({\n \":root\": {\n \"--vt-primary\": \"#7C3AED\",\n \"--vt-background\": \"#FFFFFF\",\n \"--vt-surface\": \"#F8FAFC\",\n \"--vt-text\": \"#0F172A\",\n \"--vt-border\": \"#E2E8F0\",\n \"--vt-accent\": \"#06B6D4\",\n },\n });\n },\n {\n theme: {\n extend: {\n colors: {\n \"vt-primary\": \"var(--vt-primary)\",\n \"vt-background\": \"var(--vt-background)\",\n \"vt-surface\": \"var(--vt-surface)\",\n \"vt-text\": \"var(--vt-text)\",\n \"vt-border\": \"var(--vt-border)\",\n \"vt-accent\": \"var(--vt-accent)\",\n },\n backgroundColor: {\n \"vt-primary\": \"var(--vt-primary)\",\n \"vt-background\": \"var(--vt-background)\",\n \"vt-surface\": \"var(--vt-surface)\",\n },\n textColor: {\n \"vt-primary\": \"var(--vt-primary)\",\n \"vt-text\": \"var(--vt-text)\",\n \"vt-muted\": \"var(--vt-text-muted)\",\n \"vt-accent\": \"var(--vt-accent)\",\n },\n borderColor: {\n \"vt-border\": \"var(--vt-border)\",\n \"vt-primary\": \"var(--vt-primary)\",\n },\n boxShadow: {\n \"vt-glow\": \"0 0 20px var(--vt-primary)\",\n \"vt-card\": \"0 4px 24px var(--vt-primary)\",\n },\n },\n },\n }\n);\n\nexport default varthemePlugin;"]}
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","../src/tailwind/plugin.ts","../src/core/fouc.ts"],"names":["DEFAULT_LIGHT","DEFAULT_DARK","isBrowser","injectCSSVariables","colors","mode","strategy","root","merged","attr","key","value","applyTransitions","style","getDefaultColors","STORAGE_KEY_MODE","STORAGE_KEY_COLORS","setCookie","name","days","expires","getCookie","match","deleteCookie","saveMode","e","loadMode","saved","loadModeFromCookieString","cookieHeader","val","saveColors","json","loadColors","clearStorage","getSystemMode","watchSystemMode","callback","mediaQuery","handler","BUILT_IN_THEMES","getTheme","useTheme","initial","initialTheme","onThemeChange","setModeState","useState","theme","setThemeState","setColorsState","resolvedMode","useEffect","preset","presetColors","currentMode","toggle","useCallback","next","setMode","newMode","setColors","newColors","prev","setTheme","newTheme","ThemeContext","createContext","ThemeProvider","children","transitions","themeState","jsx","useThemeContext","context","useContext","STYLES","ThemeToggle","size","isDark","mounted","setMounted","animating","setAnimating","handleToggle","jsxs","deg","star","varthemePlugin","plugin","addBase","plugin_default","getFOUCScript"],"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\nconst isBrowser = typeof window !== \"undefined\";\n\nexport type AttributeStrategy =\n | { type: \"data-attribute\"; attribute?: string } // default: data-theme=\"dark\"\n | { type: \"class\" } // shadcn: class=\"dark\"\n | { type: \"both\" }; // dono saath\n\nexport function injectCSSVariables(\n colors: ThemeColors,\n mode: \"light\" | \"dark\",\n strategy: AttributeStrategy = { type: \"data-attribute\" }\n): void {\n if (!isBrowser) return;\n const root = document.documentElement;\n const defaults = mode === \"dark\" ? DEFAULT_DARK : DEFAULT_LIGHT;\n const merged = { ...defaults, ...colors };\n\n // Pehle purane class/attribute clean karo\n root.removeAttribute(\"data-theme\");\n root.removeAttribute(\"data-mode\");\n root.classList.remove(\"light\", \"dark\");\n\n // Strategy ke hisaab se apply karo\n if (strategy.type === \"data-attribute\" || strategy.type === \"both\") {\n const attr = strategy.type === \"data-attribute\" && strategy.attribute\n ? strategy.attribute\n : \"data-theme\";\n root.setAttribute(attr, mode);\n }\n\n if (strategy.type === \"class\" || strategy.type === \"both\") {\n root.classList.add(mode);\n }\n\n // CSS variables set karo\n Object.entries(merged).forEach(([key, value]) => {\n root.style.setProperty(`--vt-${key}`, value as string);\n });\n}\n\nexport function applyTransitions(): void {\n if (!isBrowser) return;\n if (document.getElementById(\"vartheme-transitions\")) return;\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 if (!isBrowser) return;\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}\n","import { ThemeMode, ThemeColors } from \"../types\";\n\nconst STORAGE_KEY_MODE = \"vartheme-mode\";\nconst STORAGE_KEY_COLORS = \"vartheme-colors\";\n\nconst isBrowser = typeof window !== \"undefined\";\n\n// ── Cookie helpers ──────────────────────────────────────────\nfunction setCookie(name: string, value: string, days = 365): void {\n if (!isBrowser) return;\n const expires = new Date(Date.now() + days * 864e5).toUTCString();\n document.cookie = `${name}=${encodeURIComponent(value)};expires=${expires};path=/;SameSite=Lax`;\n}\n\nfunction getCookie(name: string): string | null {\n if (!isBrowser) return null;\n const match = document.cookie.match(new RegExp(`(?:^|; )${name}=([^;]*)`));\n return match ? decodeURIComponent(match[1]) : null;\n}\n\nfunction deleteCookie(name: string): void {\n if (!isBrowser) return;\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`;\n}\n\n// ── Mode ────────────────────────────────────────────────────\nexport function saveMode(mode: ThemeMode): void {\n if (!isBrowser) return;\n try {\n localStorage.setItem(STORAGE_KEY_MODE, mode);\n setCookie(STORAGE_KEY_MODE, mode);\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}\n\nexport function loadMode(): ThemeMode | null {\n if (!isBrowser) return null;\n try {\n const saved = localStorage.getItem(STORAGE_KEY_MODE) || getCookie(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\n// Server side pe cookie se mode padhna (Next.js Server Components)\nexport function loadModeFromCookieString(cookieHeader: string): ThemeMode | null {\n const match = cookieHeader.match(new RegExp(`(?:^|; )${STORAGE_KEY_MODE}=([^;]*)`));\n if (!match) return null;\n const val = decodeURIComponent(match[1]);\n if (val === \"light\" || val === \"dark\" || val === \"system\") return val;\n return null;\n}\n\n// ── Colors ──────────────────────────────────────────────────\nexport function saveColors(colors: ThemeColors): void {\n if (!isBrowser) return;\n try {\n const json = JSON.stringify(colors);\n localStorage.setItem(STORAGE_KEY_COLORS, json);\n setCookie(STORAGE_KEY_COLORS, json);\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\n}\n\nexport function loadColors(): ThemeColors | null {\n if (!isBrowser) return null;\n try {\n const saved = localStorage.getItem(STORAGE_KEY_COLORS) || getCookie(STORAGE_KEY_COLORS);\n if (saved) return JSON.parse(saved) as ThemeColors;\n return null;\n } catch {\n return null;\n }\n}\n\n// ── Clear ───────────────────────────────────────────────────\nexport function clearStorage(): void {\n if (!isBrowser) return;\n try {\n localStorage.removeItem(STORAGE_KEY_MODE);\n localStorage.removeItem(STORAGE_KEY_COLORS);\n deleteCookie(STORAGE_KEY_MODE);\n deleteCookie(STORAGE_KEY_COLORS);\n } catch {\n console.warn(\"vartheme: localStorage not available\");\n }\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, AttributeStrategy } 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 strategy: AttributeStrategy = { type: \"data-attribute\" },\n onThemeChange?: (mode: \"light\" | \"dark\") => void\n): ThemeState {\n const [mode, setModeState] = useState<ThemeMode>(() => {\n return loadMode() || initial || \"system\";\n });\n const [theme, setThemeState] = useState<ThemeName>(\n initialTheme || \"default\"\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, strategy);\n onThemeChange?.(resolvedMode);\n }, [resolvedMode, colors, theme]);\n\n useEffect(() => {\n if (mode !== \"system\") return;\n const cleanup = watchSystemMode(() => {\n const currentMode = getSystemMode();\n const preset = getTheme(theme);\n const presetColors = currentMode === \"dark\" ? preset.dark : preset.light;\n injectCSSVariables({ ...presetColors, ...colors }, currentMode, strategy);\n onThemeChange?.(currentMode);\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}\n","import { createContext, useContext, useEffect, ReactNode } from \"react\";\nimport { ThemeState, ThemeMode, ThemeColors, ThemeName } from \"../types\";\nimport { AttributeStrategy } from \"../core/engine\";\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 strategy?: AttributeStrategy;\n onThemeChange?: (mode: \"light\" | \"dark\") => void;\n}\n\nexport function ThemeProvider({\n children,\n mode,\n theme = \"default\",\n colors,\n transitions,\n strategy = { type: \"data-attribute\" },\n onThemeChange,\n}: ThemeProviderProps) {\n const themeState = useTheme(mode, theme, strategy, onThemeChange);\n\n useEffect(() => {\n if (transitions) applyTransitions();\n }, [transitions]);\n\n useEffect(() => {\n if (colors) themeState.setColors(colors);\n }, [colors]);\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(\"useThemeContext must be used inside <ThemeProvider />\");\n }\n return context;\n}\n","import { useThemeContext } from \"./ThemeProvider\";\nimport { useState, useEffect } from \"react\";\n\ninterface ThemeToggleProps {\n size?: number;\n}\n\nconst STYLES = `\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 @keyframes vt-fade-in {\n from { opacity: 0; transform: scale(0.5) rotate(-30deg); }\n to { opacity: 1; transform: scale(1) rotate(0deg); }\n }\n`;\n\nexport function ThemeToggle({ size = 48 }: ThemeToggleProps) {\n const { resolvedMode, toggle } = useThemeContext();\n const isDark = resolvedMode === \"dark\";\n const [mounted, setMounted] = useState(false);\n const [animating, setAnimating] = useState(false);\n\n // Style tag ek baar inject karo\n useEffect(() => {\n if (document.getElementById(\"vt-toggle-styles\")) return;\n const style = document.createElement(\"style\");\n style.id = \"vt-toggle-styles\";\n style.textContent = STYLES;\n document.head.appendChild(style);\n setMounted(true);\n }, []);\n\n // Toggle pe animation trigger karo\n function handleToggle() {\n setAnimating(true);\n toggle();\n setTimeout(() => setAnimating(false), 400);\n }\n\n if (!mounted) return null;\n\n return (\n <button\n onClick={handleToggle}\n aria-label={isDark ? \"Switch to light mode\" : \"Switch to dark mode\"}\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.4s ease\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"visible\",\n opacity: animating ? 0.7 : 1,\n transform: animating ? \"scale(0.88)\" : \"scale(1)\",\n }}\n >\n {/* Sun Mode */}\n {!isDark && (\n <div style={{ animation: \"vt-fade-in 0.35s ease\", display: \"contents\" }}>\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 {[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 </div>\n )}\n\n {/* Moon Mode */}\n {isDark && (\n <div style={{ animation: \"vt-fade-in 0.35s ease\", display: \"contents\" }}>\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 <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 { 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 as any).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 </div>\n )}\n </button>\n );\n}\n","import plugin from \"tailwindcss/plugin\";\n\nconst varthemePlugin: ReturnType<typeof plugin> = plugin(\n function ({ addBase }) {\n addBase({\n \":root\": {\n \"--vt-primary\": \"#7C3AED\",\n \"--vt-background\": \"#FFFFFF\",\n \"--vt-surface\": \"#F8FAFC\",\n \"--vt-text\": \"#0F172A\",\n \"--vt-border\": \"#E2E8F0\",\n \"--vt-accent\": \"#06B6D4\",\n },\n });\n },\n {\n theme: {\n extend: {\n colors: {\n \"vt-primary\": \"var(--vt-primary)\",\n \"vt-background\": \"var(--vt-background)\",\n \"vt-surface\": \"var(--vt-surface)\",\n \"vt-text\": \"var(--vt-text)\",\n \"vt-border\": \"var(--vt-border)\",\n \"vt-accent\": \"var(--vt-accent)\",\n },\n backgroundColor: {\n \"vt-primary\": \"var(--vt-primary)\",\n \"vt-background\": \"var(--vt-background)\",\n \"vt-surface\": \"var(--vt-surface)\",\n },\n textColor: {\n \"vt-primary\": \"var(--vt-primary)\",\n \"vt-text\": \"var(--vt-text)\",\n \"vt-muted\": \"var(--vt-text-muted)\",\n \"vt-accent\": \"var(--vt-accent)\",\n },\n borderColor: {\n \"vt-border\": \"var(--vt-border)\",\n \"vt-primary\": \"var(--vt-primary)\",\n },\n boxShadow: {\n \"vt-glow\": \"0 0 20px var(--vt-primary)\",\n \"vt-card\": \"0 4px 24px var(--vt-primary)\",\n },\n },\n },\n }\n);\n\nexport default varthemePlugin;","export function getFOUCScript(): string {\n return `(function() {\n try {\n var mode = localStorage.getItem('vartheme-mode');\n var resolved = mode;\n if (!mode || mode === 'system') {\n resolved = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n var colors = null;\n try { colors = JSON.parse(localStorage.getItem('vartheme-colors') || 'null'); } catch(e) {}\n var defaults = resolved === 'dark'\n ? { primary:'#A78BFA', background:'#0F172A', surface:'#1E293B', text:'#F8FAFC', border:'#334155', accent:'#22D3EE' }\n : { primary:'#7C3AED', background:'#FFFFFF', surface:'#F8FAFC', text:'#0F172A', border:'#E2E8F0', accent:'#06B6D4' };\n var merged = Object.assign({}, defaults, colors || {});\n var root = document.documentElement;\n root.setAttribute('data-theme', resolved);\n Object.keys(merged).forEach(function(key) {\n root.style.setProperty('--vt-' + key, merged[key]);\n });\n } catch(e) {}\n })();`;\n}\n"]}
package/package.json CHANGED
@@ -1,47 +1,60 @@
1
1
  {
2
2
  "name": "vartheme",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Zero config, CSS variable based theme switching for React",
5
- "author": "Your Name",
6
- "license": "MIT",
7
5
  "main": "./dist/index.js",
8
6
  "module": "./dist/index.mjs",
9
7
  "types": "./dist/index.d.ts",
10
8
  "exports": {
11
9
  ".": {
12
- "types": "./dist/index.d.ts",
13
10
  "import": "./dist/index.mjs",
14
- "require": "./dist/index.js"
11
+ "require": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ },
14
+ "./tailwind": {
15
+ "import": "./dist/tailwind/plugin.mjs",
16
+ "require": "./dist/tailwind/plugin.js",
17
+ "types": "./dist/tailwind/plugin.d.ts"
15
18
  }
16
19
  },
17
- "files": [
18
- "dist"
19
- ],
20
- "scripts": {
21
- "build": "tsup",
22
- "dev": "tsup --watch",
23
- "test": "vitest",
24
- "lint": "tsc --noEmit"
25
- },
26
20
  "peerDependencies": {
27
21
  "react": ">=17.0.0",
28
22
  "react-dom": ">=17.0.0"
29
23
  },
24
+ "peerDependenciesMeta": {
25
+ "react-dom": {
26
+ "optional": true
27
+ }
28
+ },
30
29
  "devDependencies": {
31
- "@types/react": "^18.0.0",
32
- "@types/react-dom": "^18.0.0",
33
- "react": "^18.0.0",
34
- "react-dom": "^18.0.0",
35
- "tailwindcss": "^4.2.1",
30
+ "@types/react": "^19.0.0",
31
+ "@types/react-dom": "^19.0.0",
32
+ "jsdom": "^24.0.0",
33
+ "react": "^19.0.0",
34
+ "react-dom": "^19.0.0",
35
+ "tailwindcss": "^3.4.19",
36
36
  "tsup": "^8.0.0",
37
37
  "typescript": "^5.0.0",
38
38
  "vitest": "^1.0.0"
39
39
  },
40
+ "scripts": {
41
+ "build": "tsup",
42
+ "dev": "tsup --watch",
43
+ "test": "vitest",
44
+ "lint": "tsc --noEmit"
45
+ },
40
46
  "keywords": [
47
+ "dark mode",
41
48
  "theme",
42
- "dark-mode",
43
- "css-variables",
44
49
  "react",
45
- "theming"
50
+ "css variables",
51
+ "next.js",
52
+ "tailwind",
53
+ "theme switcher"
54
+ ],
55
+ "license": "MIT",
56
+ "files": [
57
+ "dist",
58
+ "README.md"
46
59
  ]
47
60
  }