vartheme 0.1.6 → 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,135 +51,107 @@ export default function App() {
45
51
  }
46
52
  ```
47
53
 
48
- Thats it. Dark mode is done.
54
+ That's it. Dark mode is done.
49
55
 
50
56
  ---
51
57
 
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
64
-
65
- ---
66
-
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
80
-
81
- ```bash
82
- npm install vartheme
83
- ```
84
-
85
- ---
86
-
87
- ## ⚡ Quick Start
88
-
89
- ### 1. Wrap your app
74
+ ## 🔧 Setup
90
75
 
76
+ ### React / Vite
91
77
  ```tsx
78
+ // main.tsx
92
79
  import { ThemeProvider } from 'vartheme'
93
80
 
94
81
  function Main() {
95
82
  return (
96
- <ThemeProvider config={{ mode: 'system', transitions: true }}>
83
+ <ThemeProvider mode="system" transitions>
97
84
  <App />
98
85
  </ThemeProvider>
99
86
  )
100
87
  }
101
88
  ```
102
89
 
103
- ---
104
-
105
- ### 2. Use the hook
90
+ ### Next.js App Router (SSR safe)
106
91
 
92
+ **Step 1 — Prevent FOUC in layout.tsx:**
107
93
  ```tsx
108
- import { useThemeContext } from 'vartheme'
109
-
110
- function Navbar() {
111
- const { resolvedMode, toggle } = useThemeContext()
94
+ import { getFOUCScript } from 'vartheme'
112
95
 
96
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
113
97
  return (
114
- <button onClick={toggle}>
115
- {resolvedMode === 'dark' ? '☀️ Light' : '🌙 Dark'}
116
- </button>
98
+ <html>
99
+ <head>
100
+ <script dangerouslySetInnerHTML={{ __html: getFOUCScript() }} />
101
+ </head>
102
+ <body>{children}</body>
103
+ </html>
117
104
  )
118
105
  }
119
106
  ```
120
107
 
121
- ---
122
-
123
- ### 3. Built-in toggle
124
-
108
+ **Step 2 — Read theme on server side:**
125
109
  ```tsx
126
- import { ThemeToggle } from 'vartheme'
127
-
128
- export default function Navbar() {
129
- return <ThemeToggle size={48} />
130
- }
131
- ```
132
-
133
- ---
110
+ import { cookies } from 'next/headers'
111
+ import { loadModeFromCookieString } from 'vartheme'
134
112
 
135
- ### 4. CSS variables
113
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
114
+ const cookieHeader = cookies().toString()
115
+ const mode = loadModeFromCookieString(cookieHeader) || 'system'
136
116
 
137
- ```css
138
- .card {
139
- background: var(--vt-surface);
140
- color: var(--vt-text);
141
- border: 1px solid var(--vt-border);
117
+ return (
118
+ <html data-theme={mode}>
119
+ <body>
120
+ <ThemeProvider mode={mode}>
121
+ {children}
122
+ </ThemeProvider>
123
+ </body>
124
+ </html>
125
+ )
142
126
  }
143
127
  ```
144
128
 
145
129
  ---
146
130
 
147
- ## 🎨 Default Variables
148
-
149
- | Variable | Light | Dark |
150
- |----------|------|------|
151
- | `--vt-primary` | `#7C3AED` | `#A78BFA` |
152
- | `--vt-background` | `#FFFFFF` | `#0F172A` |
153
- | `--vt-surface` | `#F8FAFC` | `#1E293B` |
154
- | `--vt-text` | `#0F172A` | `#F8FAFC` |
155
- | `--vt-border` | `#E2E8F0` | `#334155` |
156
- | `--vt-accent` | `#06B6D4` | `#22D3EE` |
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
+ ```
157
139
 
158
140
  ---
159
141
 
160
- ## 🎯 Custom Colors
161
-
142
+ ## 🎯 Custom Colors
162
143
  ```tsx
163
144
  <ThemeProvider
164
- config={{
165
- colors: {
166
- primary: '#EC4899',
167
- accent: '#F59E0B',
168
- },
145
+ colors={{
146
+ primary: '#EC4899',
147
+ accent: '#F59E0B',
169
148
  }}
170
149
  >
171
150
  <App />
172
151
  </ThemeProvider>
173
152
  ```
174
153
 
175
- Dynamic:
176
-
154
+ Dynamic at runtime:
177
155
  ```tsx
178
156
  const { setColors } = useThemeContext()
179
157
  setColors({ primary: '#10B981' })
@@ -181,79 +159,83 @@ setColors({ primary: '#10B981' })
181
159
 
182
160
  ---
183
161
 
184
- ## 🧠 API
162
+ ## 🔌 shadcn/ui + Radix support
163
+ ```tsx
164
+ // class="dark" strategy — shadcn/ui ke liye
165
+ <ThemeProvider strategy={{ type: 'class' }}>
185
166
 
186
- ### ThemeProvider
167
+ // data-theme="dark" + class="dark" — dono saath
168
+ <ThemeProvider strategy={{ type: 'both' }}>
187
169
 
188
- | Prop | Type |
189
- |------|------|
190
- | mode | `'light' \| 'dark' \| 'system'` |
191
- | colors | ThemeColors |
192
- | transitions | boolean |
170
+ // Custom attribute
171
+ <ThemeProvider strategy={{ type: 'data-attribute', attribute: 'data-mode' }}>
172
+ ```
193
173
 
194
174
  ---
195
175
 
196
- ### useThemeContext
197
-
198
- - mode
199
- - resolvedMode
200
- - colors
201
- - toggle()
202
- - setMode()
203
- - setColors()
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
+ ```
204
185
 
205
186
  ---
206
187
 
207
- ### ThemeToggle
208
-
209
- | Prop | Default |
210
- |------|------|
211
- | size | 48 |
212
-
213
- ---
188
+ ## 🪝 useThemeContext hook
189
+ ```tsx
190
+ import { useThemeContext } from 'vartheme'
214
191
 
215
- ## 🧩 TypeScript
192
+ function Navbar() {
193
+ const { resolvedMode, toggle, setMode, setTheme, setColors } = useThemeContext()
216
194
 
217
- ```tsx
218
- import type { ThemeMode, ThemeColors, ThemeConfig } from 'vartheme'
195
+ return (
196
+ <button onClick={toggle}>
197
+ {resolvedMode === 'dark' ? '☀️ Light' : '🌙 Dark'}
198
+ </button>
199
+ )
200
+ }
219
201
  ```
220
202
 
221
203
  ---
222
204
 
223
- ## 🌍 Use Cases
224
-
225
- - SaaS dashboards
226
- - Design systems
227
- - Portfolios
228
- - Startups
229
- - Component libraries
230
- - Large scale apps
231
-
232
- ---
205
+ ## 🎛️ ThemeToggle
206
+ ```tsx
207
+ import { ThemeToggle } from 'vartheme'
233
208
 
234
- ## 🤝 Contributing
209
+ // Default size
210
+ <ThemeToggle />
235
211
 
236
- We welcome contributions.
237
- Open issues, submit PRs, or suggest ideas.
212
+ // Custom size
213
+ <ThemeToggle size={64} />
214
+ ```
238
215
 
239
216
  ---
240
217
 
241
- ## Support
242
-
243
- If you like this project:
218
+ ## 🎨 CSS Variables
219
+ ```css
220
+ .card {
221
+ background: var(--vt-surface);
222
+ color: var(--vt-text);
223
+ border: 1px solid var(--vt-border);
224
+ }
225
+ ```
244
226
 
245
- - Star the repo
246
- - 🐦 Share on Twitter
247
- - 💬 Tell your friends
248
- - 🚀 Help grow the community
227
+ | Variable | Light | Dark |
228
+ |----------|-------|------|
229
+ | `--vt-primary` | `#7C3AED` | `#A78BFA` |
230
+ | `--vt-background` | `#FFFFFF` | `#0F172A` |
231
+ | `--vt-surface` | `#F8FAFC` | `#1E293B` |
232
+ | `--vt-text` | `#0F172A` | `#F8FAFC` |
233
+ | `--vt-border` | `#E2E8F0` | `#334155` |
234
+ | `--vt-accent` | `#06B6D4` | `#22D3EE` |
249
235
 
250
236
  ---
251
237
 
252
- ## Tailwind Plugin
253
-
254
- vartheme comes with a Tailwind CSS plugin that adds CSS variables as Tailwind classes.
255
-
256
- ### Setup
238
+ ## 🌀 Tailwind Plugin
257
239
  ```js
258
240
  // tailwind.config.js
259
241
  import { varthemePlugin } from 'vartheme/tailwind'
@@ -262,18 +244,13 @@ export default {
262
244
  plugins: [varthemePlugin],
263
245
  }
264
246
  ```
265
-
266
- ### Usage
267
247
  ```jsx
268
- // Ab directly Tailwind classes use karo
269
248
  <div className="bg-vt-surface text-vt-text border border-vt-border">
270
249
  <h1 className="text-vt-primary">Hello!</h1>
271
250
  <button className="bg-vt-primary text-white">Click me</button>
272
251
  </div>
273
252
  ```
274
253
 
275
- ### Available Classes
276
-
277
254
  | Class | CSS Variable |
278
255
  |-------|-------------|
279
256
  | `bg-vt-primary` | `--vt-primary` |
@@ -285,6 +262,72 @@ export default {
285
262
  | `border-vt-border` | `--vt-border` |
286
263
  | `shadow-vt-glow` | `--vt-primary` glow |
287
264
 
288
- ## 📄 License
265
+ ---
266
+
267
+ ## 🧩 TypeScript
268
+ ```tsx
269
+ import type { ThemeMode, ThemeColors, ThemeConfig, ThemeName, AttributeStrategy } from 'vartheme'
270
+ ```
271
+
272
+ ---
273
+
274
+ ## 🧠 API Reference
275
+
276
+ ### ThemeProvider props
277
+
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` | — |
286
+
287
+ ### useThemeContext returns
288
+
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` |
299
+
300
+ ---
301
+
302
+ ## 🌍 Use Cases
303
+
304
+ - SaaS dashboards
305
+ - Design systems
306
+ - Portfolios
307
+ - Startups
308
+ - Component libraries
309
+ - Large scale apps
310
+
311
+ ---
312
+
313
+ ## 🤝 Contributing
314
+
315
+ We welcome contributions.
316
+ Open issues, submit PRs, or suggest ideas.
317
+
318
+ ---
319
+
320
+ ## ⭐ Support
321
+
322
+ If you like this project:
323
+
324
+ - ⭐ Star the repo
325
+ - 🐦 Share on Twitter
326
+ - 💬 Tell your friends
327
+ - 🚀 Help grow the community
328
+
329
+ ---
330
+
331
+ ## 📄 License
289
332
 
290
- 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":"gKAEA,IAAMA,EAA6B,CACjC,OAAA,CAAS,UACT,UAAA,CAAY,SAAA,CACZ,QAAS,SAAA,CACT,IAAA,CAAM,UACN,MAAA,CAAQ,SAAA,CACR,OAAQ,SACV,CAAA,CAEMC,EAA4B,CAChC,OAAA,CAAS,UACT,UAAA,CAAY,SAAA,CACZ,OAAA,CAAS,SAAA,CACT,KAAM,SAAA,CACN,MAAA,CAAQ,UACR,MAAA,CAAQ,SACV,EAEO,SAASC,CAAAA,CACdC,EACAC,CAAAA,CACM,CACN,IAAMC,CAAAA,CAAO,QAAA,CAAS,gBAEhBC,CAAAA,CAAS,CAAE,GADAF,CAAAA,GAAS,MAAA,CAASH,CAAAA,CAAeD,CAAAA,CACpB,GAAGG,CAAO,CAAA,CAExCE,EAAK,YAAA,CAAa,YAAA,CAAcD,CAAI,CAAA,CAEpC,MAAA,CAAO,QAAQE,CAAM,CAAA,CAAE,QAAQ,CAAC,CAACC,EAAKC,CAAK,CAAA,GAAM,CAC/CH,CAAAA,CAAK,KAAA,CAAM,YAAY,CAAA,KAAA,EAAQE,CAAG,GAAIC,CAAe,EACvD,CAAC,EACH,CAEO,SAASC,CAAAA,EAAyB,CACvC,IAAMC,CAAAA,CAAQ,QAAA,CAAS,cAAc,OAAO,CAAA,CAC5CA,EAAM,EAAA,CAAK,sBAAA,CACXA,EAAM,WAAA,CAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,CAQpB,SAAS,IAAA,CAAK,WAAA,CAAYA,CAAK,EACjC,CAOO,SAASC,CAAAA,CAAiBP,CAAAA,CAAqC,CACpE,OAAOA,IAAS,MAAA,CAASH,CAAAA,CAAeD,CAC1C,CCtDA,IAAMY,EAAmB,eAAA,CACnBC,CAAAA,CAAqB,iBAAA,CAEpB,SAASC,EAASV,CAAAA,CAAuB,CAC9C,GAAI,CACF,YAAA,CAAa,QAAQQ,CAAAA,CAAkBR,CAAI,EAC7C,CAAA,MAAQW,CAAAA,CAAA,CACN,OAAA,CAAQ,IAAA,CAAK,sCAAsC,EACrD,CACF,CAEO,SAASC,CAAAA,EAA6B,CAC3C,GAAI,CACF,IAAMC,CAAAA,CAAQ,aAAa,OAAA,CAAQL,CAAgB,EACnD,OAAIK,CAAAA,GAAU,OAAA,EAAWA,CAAAA,GAAU,QAAUA,CAAAA,GAAU,QAAA,CAC9CA,EAEF,IACT,CAAA,MAAQ,GACN,OAAO,IACT,CACF,CAEO,SAASC,CAAAA,CAAWf,CAAAA,CAA2B,CACpD,GAAI,CACF,aAAa,OAAA,CAAQU,CAAAA,CAAoB,KAAK,SAAA,CAAUV,CAAM,CAAC,EACjE,CAAA,MAAQY,EAAA,CACN,OAAA,CAAQ,KAAK,sCAAsC,EACrD,CACF,CAEO,SAASI,CAAAA,EAAiC,CAC/C,GAAI,CACF,IAAMF,EAAQ,YAAA,CAAa,OAAA,CAAQJ,CAAkB,CAAA,CACrD,OAAII,CAAAA,CAAc,IAAA,CAAK,MAAMA,CAAK,CAAA,CAC3B,IACT,CAAA,MAAQ,CAAA,CAAA,CACN,OAAO,IACT,CACF,CAEO,SAASG,GAAqB,CACnC,GAAI,CACF,YAAA,CAAa,UAAA,CAAWR,CAAgB,CAAA,CACxC,YAAA,CAAa,WAAWC,CAAkB,EAC5C,OAAQ,CAAA,CAAA,CACN,OAAA,CAAQ,KAAK,sCAAsC,EACrD,CACF,CC/CO,SAASQ,CAAAA,EAA4B,CAC1C,OAAI,OAAO,MAAA,EAAW,YAAoB,OAAA,CACnC,MAAA,CAAO,WAAW,8BAA8B,CAAA,CAAE,QACrD,MAAA,CACA,OACN,CAEO,SAASC,CAAAA,CAAgBC,EAA0C,CACxE,GAAI,OAAO,MAAA,EAAW,YAAa,OAAO,IAAM,CAAC,CAAA,CAEjD,IAAMC,EAAa,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAE7DC,CAAAA,CAAWV,GAA2B,CAC1CQ,CAAAA,CAASR,EAAE,OAAA,CAAU,MAAA,CAAS,OAAO,EACvC,CAAA,CAEA,OAAAS,CAAAA,CAAW,iBAAiB,QAAA,CAAUC,CAAO,EAGtC,IAAM,CACXD,EAAW,mBAAA,CAAoB,QAAA,CAAUC,CAAO,EAClD,CACF,CAEO,SAASC,GAAqB,CACnC,OAAO,OAAO,MAAA,EAAW,WAC3B,CCrBO,IAAMC,CAAAA,CAA+C,CAC1D,OAAA,CAAS,CACP,KAAM,SAAA,CACN,KAAA,CAAO,CACL,OAAA,CAAS,UACT,UAAA,CAAY,SAAA,CACZ,QAAS,SAAA,CACT,IAAA,CAAM,UACN,MAAA,CAAQ,SAAA,CACR,MAAA,CAAQ,SACV,EACA,IAAA,CAAM,CACJ,QAAS,SAAA,CACT,UAAA,CAAY,UACZ,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,SAAA,CACN,OAAQ,SAAA,CACR,MAAA,CAAQ,SACV,CACF,CAAA,CAEA,MAAO,CACL,IAAA,CAAM,QACN,KAAA,CAAO,CACL,QAAS,SAAA,CACT,UAAA,CAAY,UACZ,OAAA,CAAS,SAAA,CACT,KAAM,SAAA,CACN,MAAA,CAAQ,SAAA,CACR,MAAA,CAAQ,SACV,CAAA,CACA,IAAA,CAAM,CACJ,OAAA,CAAS,SAAA,CACT,WAAY,SAAA,CACZ,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,UACN,MAAA,CAAQ,SAAA,CACR,OAAQ,SACV,CACF,EAEA,MAAA,CAAQ,CACN,IAAA,CAAM,QAAA,CACN,MAAO,CACL,OAAA,CAAS,UACT,UAAA,CAAY,SAAA,CACZ,QAAS,SAAA,CACT,IAAA,CAAM,UACN,MAAA,CAAQ,SAAA,CACR,OAAQ,SACV,CAAA,CACA,KAAM,CACJ,OAAA,CAAS,UACT,UAAA,CAAY,SAAA,CACZ,OAAA,CAAS,SAAA,CACT,KAAM,SAAA,CACN,MAAA,CAAQ,UACR,MAAA,CAAQ,SACV,CACF,CAAA,CAEA,MAAA,CAAQ,CACN,IAAA,CAAM,QAAA,CACN,MAAO,CACL,OAAA,CAAS,UACT,UAAA,CAAY,SAAA,CACZ,QAAS,SAAA,CACT,IAAA,CAAM,SAAA,CACN,MAAA,CAAQ,UACR,MAAA,CAAQ,SACV,EACA,IAAA,CAAM,CACJ,QAAS,SAAA,CACT,UAAA,CAAY,UACZ,OAAA,CAAS,SAAA,CACT,KAAM,SAAA,CACN,MAAA,CAAQ,UACR,MAAA,CAAQ,SACV,CACF,CAAA,CAEA,IAAA,CAAM,CACJ,IAAA,CAAM,OACN,KAAA,CAAO,CACL,QAAS,SAAA,CACT,UAAA,CAAY,UACZ,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,SAAA,CACN,OAAQ,SAAA,CACR,MAAA,CAAQ,SACV,CAAA,CACA,IAAA,CAAM,CACJ,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,SAAA,CACZ,QAAS,SAAA,CACT,IAAA,CAAM,UACN,MAAA,CAAQ,SAAA,CACR,OAAQ,SACV,CACF,CACF,EAEO,SAASC,EAASC,CAAAA,CAA2B,CAClD,OAAOF,CAAAA,CAAgBE,CAAI,GAAKF,CAAAA,CAAgB,OAClD,CCzGO,SAASG,EACdC,CAAAA,CACAC,CAAAA,CACY,CACZ,GAAM,CAAC5B,EAAM6B,CAAY,CAAA,CAAIC,QAAAA,CAAoB,IACxClB,GAAS,EAAKe,CAAAA,EAAW,QACjC,CAAA,CAEK,CAACI,EAAOC,CAAa,CAAA,CAAIF,QAAAA,CAC7BF,CAAAA,EAAgB,SAClB,CAAA,CAEM,CAAC7B,EAAQkC,CAAc,CAAA,CAAIH,SAAsB,IAC9Cf,CAAAA,IAAgB,EACxB,EAEKmB,CAAAA,CAAelC,CAAAA,GAAS,SAAWiB,CAAAA,EAAc,CAAIjB,EAE3DmC,SAAAA,CAAU,IAAM,CACd,IAAMC,EAASZ,CAAAA,CAASO,CAAK,EACvBM,CAAAA,CAAeH,CAAAA,GAAiB,OAASE,CAAAA,CAAO,IAAA,CAAOA,CAAAA,CAAO,KAAA,CACpEtC,EAAmB,CAAE,GAAGuC,EAAc,GAAGtC,CAAO,EAAGmC,CAAY,EACjE,CAAA,CAAG,CAACA,EAAcnC,CAAAA,CAAQgC,CAAK,CAAC,CAAA,CAEhCI,SAAAA,CAAU,IACJnC,CAAAA,GAAS,QAAA,CAAU,OACPkB,CAAAA,CAAgB,IAAM,CACpC,IAAMkB,CAAAA,CAASZ,EAASO,CAAK,CAAA,CACvBM,EACJpB,CAAAA,EAAc,GAAM,MAAA,CAASmB,CAAAA,CAAO,KAAOA,CAAAA,CAAO,KAAA,CACpDtC,EAAmB,CAAE,GAAGuC,EAAc,GAAGtC,CAAO,EAAGkB,CAAAA,EAAe,EACpE,CAAC,CAAA,CAEA,CAACjB,CAAAA,CAAMD,CAAAA,CAAQgC,CAAK,CAAC,CAAA,CAExB,IAAMO,CAAAA,CAASC,YAAY,IAAM,CAC/B,IAAMC,CAAAA,CAAON,CAAAA,GAAiB,QAAU,MAAA,CAAS,OAAA,CACjDL,EAAaW,CAAI,CAAA,CACjB9B,EAAS8B,CAAI,EACf,EAAG,CAACN,CAAY,CAAC,CAAA,CAEXO,CAAAA,CAAUF,WAAAA,CAAaG,CAAAA,EAAuB,CAClDb,CAAAA,CAAaa,CAAO,EACpBhC,CAAAA,CAASgC,CAAO,EAClB,CAAA,CAAG,EAAE,CAAA,CAECC,EAAYJ,WAAAA,CAAaK,CAAAA,EAA2B,CACxDX,CAAAA,CAAgBY,CAAAA,EAAS,CACvB,IAAM3C,CAAAA,CAAS,CAAE,GAAG2C,EAAM,GAAGD,CAAU,EACvC,OAAA9B,CAAAA,CAAWZ,CAAM,CAAA,CACVA,CACT,CAAC,EACH,CAAA,CAAG,EAAE,CAAA,CAEC4C,EAAWP,WAAAA,CAAaQ,CAAAA,EAAwB,CACpDf,CAAAA,CAAce,CAAQ,EACxB,CAAA,CAAG,EAAE,CAAA,CAEL,OAAO,CACL,IAAA,CAAA/C,EACA,YAAA,CAAAkC,CAAAA,CACA,KAAA,CAAAH,CAAAA,CACA,OAAQ,CAAE,GAAGxB,EAAiB2B,CAAY,CAAA,CAAG,GAAGnC,CAAO,CAAA,CACvD,MAAA,CAAAuC,CAAAA,CACA,QAAAG,CAAAA,CACA,SAAA,CAAAE,EACA,QAAA,CAAAG,CACF,CACF,CCtEA,IAAME,EAAeC,aAAAA,CAAiC,IAAI,EAUnD,SAASC,CAAAA,CAAc,CAC5B,QAAA,CAAAC,CAAAA,CACA,IAAA,CAAAnD,CAAAA,CACA,MAAA+B,CAAAA,CAAQ,SAAA,CACR,OAAAhC,CAAAA,CACA,WAAA,CAAAqD,CACF,CAAA,CAAuB,CACrB,IAAMC,CAAAA,CAAa3B,EAAS1B,CAAAA,CAAM+B,CAAK,EAEvC,OAAIqB,CAAAA,EACF/C,GAAiB,CAGfN,CAAAA,EACFsD,CAAAA,CAAW,SAAA,CAAUtD,CAAM,CAAA,CAI3BuD,GAAAA,CAACN,EAAa,QAAA,CAAb,CAAsB,MAAOK,CAAAA,CAC3B,QAAA,CAAAF,EACH,CAEJ,CAEO,SAASI,CAAAA,EAA8B,CAC5C,IAAMC,CAAAA,CAAUC,UAAAA,CAAWT,CAAY,CAAA,CACvC,GAAI,CAACQ,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,uDACF,CAAA,CAEF,OAAOA,CACT,CCzCO,SAASE,CAAAA,CAAY,CAAE,IAAA,CAAAC,CAAAA,CAAO,EAAG,CAAA,CAAqB,CAC3D,GAAM,CAAE,aAAAzB,CAAAA,CAAc,MAAA,CAAAI,CAAO,CAAA,CAAIiB,CAAAA,GAC3BK,CAAAA,CAAS1B,CAAAA,GAAiB,OAEhC,OACE2B,IAAAA,CAAAC,SAAA,CACE,QAAA,CAAA,CAAAR,IAAC,OAAA,CAAA,CAAO,QAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,CAiBN,EAEFO,IAAAA,CAAC,QAAA,CAAA,CACC,QAASvB,CAAAA,CACT,YAAA,CAAW,eACX,KAAA,CAAO,CACL,KAAA,CAAOqB,CAAAA,CACP,OAAQA,CAAAA,CACR,YAAA,CAAc,MACd,MAAA,CAAQ,MAAA,CACR,OAAQ,SAAA,CACR,QAAA,CAAU,UAAA,CACV,UAAA,CAAYC,EACR,2CAAA,CACA,2CAAA,CACJ,UAAWA,CAAAA,CAAS,oCAAA,CAAuC,oCAC3D,UAAA,CAAY,sBAAA,CACZ,OAAA,CAAS,MAAA,CACT,WAAY,QAAA,CACZ,cAAA,CAAgB,SAChB,QAAA,CAAU,SACZ,EAGC,QAAA,CAAA,CAAA,CAACA,CAAAA,EACAC,IAAAA,CAAAC,QAAAA,CAAA,CAEE,QAAA,CAAA,CAAAR,GAAAA,CAAC,OAAI,KAAA,CAAO,CACV,MAAOK,CAAAA,CAAO,GAAA,CACd,MAAA,CAAQA,CAAAA,CAAO,IACf,YAAA,CAAc,KAAA,CACd,WAAY,SAAA,CACZ,SAAA,CAAW,kBACX,MAAA,CAAQ,CACV,CAAA,CAAG,CAAA,CAGF,CAAC,CAAA,CAAE,EAAA,CAAG,GAAG,GAAA,CAAI,GAAA,CAAI,IAAI,GAAA,CAAI,GAAG,EAAE,GAAA,CAAI,CAACI,EAAKC,CAAAA,GACvCV,GAAAA,CAAC,OAAY,KAAA,CAAO,CAClB,SAAU,UAAA,CACV,KAAA,CAAO,CAAA,CACP,MAAA,CAAQK,EAAO,GAAA,CACf,YAAA,CAAc,EACd,UAAA,CAAY,SAAA,CACZ,IAAK,KAAA,CACL,IAAA,CAAM,KAAA,CACN,eAAA,CAAiB,SACjB,SAAA,CAAW,CAAA,wBAAA,EAA2BI,CAAG,CAAA,iBAAA,EAAoBJ,CAAAA,CAAO,GAAI,CAAA,GAAA,CAAA,CACxE,SAAA,CAAW,4BAAA,CACX,cAAA,CAAgB,GAAGK,CAAAA,CAAI,GAAI,IAC3B,OAAA,CAAS,EACX,GAbUA,CAaP,CACJ,GACH,CAAA,CAIDJ,CAAAA,EACCC,KAAAC,QAAAA,CAAA,CAEE,UAAAR,GAAAA,CAAC,KAAA,CAAA,CAAI,MAAO,CACV,KAAA,CAAOK,CAAAA,CAAO,GAAA,CACd,OAAQA,CAAAA,CAAO,GAAA,CACf,aAAc,KAAA,CACd,UAAA,CAAY,UACZ,SAAA,CAAW,iBAAA,CACX,QAAA,CAAU,UAAA,CACV,OAAQ,CAAA,CACR,QAAA,CAAU,QACZ,CAAA,CAEE,QAAA,CAAAL,IAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CACV,QAAA,CAAU,WACV,KAAA,CAAOK,CAAAA,CAAO,IACd,MAAA,CAAQA,CAAAA,CAAO,IACf,YAAA,CAAc,KAAA,CACd,WAAY,SAAA,CACZ,GAAA,CAAK,CAACA,CAAAA,CAAO,GAAA,CACb,MAAO,CAACA,CAAAA,CAAO,GACjB,CAAA,CAAG,CAAA,CACL,CAAA,CAGC,CACC,CAAE,GAAA,CAAK,EAAA,CAAI,MAAO,EAAA,CAAI,CAAA,CAAG,EAAG,KAAA,CAAO,IAAK,CAAA,CACxC,CAAE,IAAK,CAAA,CAAI,KAAA,CAAO,IAAK,CAAA,CAAG,CAAA,CAAG,MAAO,MAAO,CAAA,CAC3C,CAAE,MAAA,CAAQ,EAAG,KAAA,CAAO,EAAA,CAAI,EAAG,CAAA,CAAG,KAAA,CAAO,IAAK,CAAA,CAC1C,CAAE,IAAK,EAAA,CAAI,IAAA,CAAM,EAAG,CAAA,CAAG,CAAA,CAAG,MAAO,MAAO,CAC1C,EAAE,GAAA,CAAI,CAACM,CAAAA,CAAMD,CAAAA,GACXV,IAAC,KAAA,CAAA,CAAY,KAAA,CAAO,CAClB,QAAA,CAAU,UAAA,CACV,MAAOW,CAAAA,CAAK,CAAA,CACZ,MAAA,CAAQA,CAAAA,CAAK,EACb,YAAA,CAAc,KAAA,CACd,WAAY,SAAA,CACZ,GAAA,CAAKA,EAAK,GAAA,CACV,KAAA,CAAQA,CAAAA,CAAa,KAAA,CACrB,KAAOA,CAAAA,CAAa,IAAA,CACpB,OAASA,CAAAA,CAAa,MAAA,CACtB,UAAW,oCAAA,CACX,cAAA,CAAgBA,EAAK,KACvB,CAAA,CAAA,CAZUD,CAYP,CACJ,CAAA,CAAA,CACH,GAEJ,CAAA,CAAA,CACF,CAEJ,CCvIA,IAAME,EAA4CC,CAAAA,CAChD,SAAU,CAAE,OAAA,CAAAC,CAAQ,EAAG,CACrBA,CAAAA,CAAQ,CACN,OAAA,CAAS,CACP,cAAA,CAAgB,SAAA,CAChB,kBAAmB,SAAA,CACnB,cAAA,CAAgB,UAChB,WAAA,CAAa,SAAA,CACb,aAAA,CAAe,SAAA,CACf,cAAe,SACjB,CACF,CAAC,EACH,CAAA,CACA,CACE,KAAA,CAAO,CACL,OAAQ,CACN,MAAA,CAAQ,CACN,YAAA,CAAiB,mBAAA,CACjB,gBAAiB,sBAAA,CACjB,YAAA,CAAiB,oBACjB,SAAA,CAAiB,gBAAA,CACjB,WAAA,CAAiB,kBAAA,CACjB,YAAiB,kBACnB,CAAA,CACA,gBAAiB,CACf,YAAA,CAAiB,oBACjB,eAAA,CAAiB,sBAAA,CACjB,YAAA,CAAiB,mBACnB,EACA,SAAA,CAAW,CACT,aAAc,mBAAA,CACd,SAAA,CAAc,iBACd,UAAA,CAAc,sBAAA,CACd,WAAA,CAAc,kBAChB,EACA,WAAA,CAAa,CACX,YAAc,kBAAA,CACd,YAAA,CAAc,mBAChB,CAAA,CACA,SAAA,CAAW,CACT,SAAA,CAAW,4BAAA,CACX,UAAW,8BACb,CACF,CACF,CACF,CACF,EAEOC,CAAAA,CAAQH","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.6",
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
  }