vartheme 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +196 -117
- package/dist/index.d.mts +18 -5
- package/dist/index.d.ts +18 -5
- package/dist/index.js +43 -20
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +43 -20
- package/dist/index.mjs.map +1 -1
- package/package.json +35 -22
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
|
[](https://bundlephobia.com/package/vartheme)
|
|
9
9
|
[](./LICENSE)
|
|
10
10
|
[](https://www.npmjs.com/package/vartheme)
|
|
11
|
+
[](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
|
-
- ❌
|
|
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
|
-
👉
|
|
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
|
-
👉
|
|
30
|
-
👉 Production ready
|
|
34
|
+
👉 16.8KB package size
|
|
31
35
|
|
|
32
36
|
---
|
|
33
37
|
|
|
34
|
-
## ⚡
|
|
35
|
-
|
|
38
|
+
## ⚡ Quick Start
|
|
39
|
+
```bash
|
|
40
|
+
npm install vartheme
|
|
41
|
+
```
|
|
36
42
|
```tsx
|
|
37
43
|
import { ThemeProvider, ThemeToggle } from 'vartheme'
|
|
38
44
|
|
|
@@ -45,70 +51,146 @@ export default function App() {
|
|
|
45
51
|
}
|
|
46
52
|
```
|
|
47
53
|
|
|
48
|
-
That
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
## ✨ Features
|
|
53
|
-
|
|
54
|
-
- ⚡ Zero config
|
|
55
|
-
- 🎨 CSS variable driven
|
|
56
|
-
- 🌙 Auto system detection
|
|
57
|
-
- 🔄 Smooth transitions
|
|
58
|
-
- 🧩 Built-in toggle
|
|
59
|
-
- 📦 ~5kb bundle
|
|
60
|
-
- 🧠 Framework-agnostic core
|
|
61
|
-
- 🔧 Custom colors
|
|
62
|
-
- 💡 Fully typed
|
|
63
|
-
- 🚀 Scalable for large apps
|
|
54
|
+
That's it. Dark mode is done.
|
|
64
55
|
|
|
65
56
|
---
|
|
66
57
|
|
|
67
|
-
## 📊 Comparison
|
|
58
|
+
## 📊 Comparison
|
|
68
59
|
|
|
69
60
|
| Feature | vartheme | next-themes | manual |
|
|
70
61
|
|---------|----------|-------------|--------|
|
|
71
62
|
| Zero config | ✅ | ❌ | ❌ |
|
|
63
|
+
| SSR safe | ✅ | ✅ | ❌ |
|
|
72
64
|
| CSS variables | ✅ | ❌ | ✅ |
|
|
65
|
+
| FOUC prevention | ✅ | ✅ | ❌ |
|
|
66
|
+
| Cookie persistence | ✅ | ❌ | ❌ |
|
|
73
67
|
| System detect | ✅ | ✅ | ❌ |
|
|
74
|
-
| Built-in UI | ✅ | ❌ | ❌ |
|
|
75
|
-
|
|
|
68
|
+
| Built-in toggle UI | ✅ | ❌ | ❌ |
|
|
69
|
+
| Named themes | ✅ | ❌ | ❌ |
|
|
70
|
+
| shadcn/Radix support | ✅ | ✅ | ❌ |
|
|
76
71
|
|
|
77
72
|
---
|
|
78
73
|
|
|
79
|
-
##
|
|
74
|
+
## 🔧 Setup
|
|
80
75
|
|
|
81
|
-
|
|
82
|
-
|
|
76
|
+
### React / Vite
|
|
77
|
+
```tsx
|
|
78
|
+
// main.tsx
|
|
79
|
+
import { ThemeProvider } from 'vartheme'
|
|
80
|
+
|
|
81
|
+
function Main() {
|
|
82
|
+
return (
|
|
83
|
+
<ThemeProvider mode="system" transitions>
|
|
84
|
+
<App />
|
|
85
|
+
</ThemeProvider>
|
|
86
|
+
)
|
|
87
|
+
}
|
|
83
88
|
```
|
|
84
89
|
|
|
85
|
-
|
|
90
|
+
### Next.js App Router (SSR safe)
|
|
86
91
|
|
|
87
|
-
|
|
92
|
+
**Step 1 — Prevent FOUC in layout.tsx:**
|
|
93
|
+
```tsx
|
|
94
|
+
import { getFOUCScript } from 'vartheme'
|
|
88
95
|
|
|
89
|
-
|
|
96
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
97
|
+
return (
|
|
98
|
+
<html>
|
|
99
|
+
<head>
|
|
100
|
+
<script dangerouslySetInnerHTML={{ __html: getFOUCScript() }} />
|
|
101
|
+
</head>
|
|
102
|
+
<body>{children}</body>
|
|
103
|
+
</html>
|
|
104
|
+
)
|
|
105
|
+
}
|
|
106
|
+
```
|
|
90
107
|
|
|
108
|
+
**Step 2 — Read theme on server side:**
|
|
91
109
|
```tsx
|
|
92
|
-
import {
|
|
110
|
+
import { cookies } from 'next/headers'
|
|
111
|
+
import { loadModeFromCookieString } from 'vartheme'
|
|
112
|
+
|
|
113
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
114
|
+
const cookieHeader = cookies().toString()
|
|
115
|
+
const mode = loadModeFromCookieString(cookieHeader) || 'system'
|
|
93
116
|
|
|
94
|
-
function Main() {
|
|
95
117
|
return (
|
|
96
|
-
<
|
|
97
|
-
<
|
|
98
|
-
|
|
118
|
+
<html data-theme={mode}>
|
|
119
|
+
<body>
|
|
120
|
+
<ThemeProvider mode={mode}>
|
|
121
|
+
{children}
|
|
122
|
+
</ThemeProvider>
|
|
123
|
+
</body>
|
|
124
|
+
</html>
|
|
99
125
|
)
|
|
100
126
|
}
|
|
101
127
|
```
|
|
102
128
|
|
|
103
129
|
---
|
|
104
130
|
|
|
105
|
-
|
|
131
|
+
## 🎨 Built-in Themes
|
|
132
|
+
```tsx
|
|
133
|
+
<ThemeProvider theme="default"> // purple — default
|
|
134
|
+
<ThemeProvider theme="ocean"> // blue
|
|
135
|
+
<ThemeProvider theme="forest"> // green
|
|
136
|
+
<ThemeProvider theme="sunset"> // orange
|
|
137
|
+
<ThemeProvider theme="rose"> // pink
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
106
141
|
|
|
142
|
+
## 🎯 Custom Colors
|
|
143
|
+
```tsx
|
|
144
|
+
<ThemeProvider
|
|
145
|
+
colors={{
|
|
146
|
+
primary: '#EC4899',
|
|
147
|
+
accent: '#F59E0B',
|
|
148
|
+
}}
|
|
149
|
+
>
|
|
150
|
+
<App />
|
|
151
|
+
</ThemeProvider>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Dynamic at runtime:
|
|
155
|
+
```tsx
|
|
156
|
+
const { setColors } = useThemeContext()
|
|
157
|
+
setColors({ primary: '#10B981' })
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 🔌 shadcn/ui + Radix support
|
|
163
|
+
```tsx
|
|
164
|
+
// class="dark" strategy — shadcn/ui ke liye
|
|
165
|
+
<ThemeProvider strategy={{ type: 'class' }}>
|
|
166
|
+
|
|
167
|
+
// data-theme="dark" + class="dark" — dono saath
|
|
168
|
+
<ThemeProvider strategy={{ type: 'both' }}>
|
|
169
|
+
|
|
170
|
+
// Custom attribute
|
|
171
|
+
<ThemeProvider strategy={{ type: 'data-attribute', attribute: 'data-mode' }}>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 📡 onThemeChange callback
|
|
177
|
+
```tsx
|
|
178
|
+
<ThemeProvider
|
|
179
|
+
onThemeChange={(mode) => {
|
|
180
|
+
console.log('Theme changed:', mode)
|
|
181
|
+
analytics.track('theme_switch', { mode })
|
|
182
|
+
}}
|
|
183
|
+
>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## 🪝 useThemeContext hook
|
|
107
189
|
```tsx
|
|
108
190
|
import { useThemeContext } from 'vartheme'
|
|
109
191
|
|
|
110
192
|
function Navbar() {
|
|
111
|
-
const { resolvedMode, toggle } = useThemeContext()
|
|
193
|
+
const { resolvedMode, toggle, setMode, setTheme, setColors } = useThemeContext()
|
|
112
194
|
|
|
113
195
|
return (
|
|
114
196
|
<button onClick={toggle}>
|
|
@@ -120,20 +202,20 @@ function Navbar() {
|
|
|
120
202
|
|
|
121
203
|
---
|
|
122
204
|
|
|
123
|
-
|
|
124
|
-
|
|
205
|
+
## 🎛️ ThemeToggle
|
|
125
206
|
```tsx
|
|
126
207
|
import { ThemeToggle } from 'vartheme'
|
|
127
208
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
209
|
+
// Default size
|
|
210
|
+
<ThemeToggle />
|
|
211
|
+
|
|
212
|
+
// Custom size
|
|
213
|
+
<ThemeToggle size={64} />
|
|
131
214
|
```
|
|
132
215
|
|
|
133
216
|
---
|
|
134
217
|
|
|
135
|
-
|
|
136
|
-
|
|
218
|
+
## 🎨 CSS Variables
|
|
137
219
|
```css
|
|
138
220
|
.card {
|
|
139
221
|
background: var(--vt-surface);
|
|
@@ -142,12 +224,8 @@ export default function Navbar() {
|
|
|
142
224
|
}
|
|
143
225
|
```
|
|
144
226
|
|
|
145
|
-
---
|
|
146
|
-
|
|
147
|
-
## 🎨 Default Variables
|
|
148
|
-
|
|
149
227
|
| Variable | Light | Dark |
|
|
150
|
-
|
|
228
|
+
|----------|-------|------|
|
|
151
229
|
| `--vt-primary` | `#7C3AED` | `#A78BFA` |
|
|
152
230
|
| `--vt-background` | `#FFFFFF` | `#0F172A` |
|
|
153
231
|
| `--vt-surface` | `#F8FAFC` | `#1E293B` |
|
|
@@ -157,98 +235,99 @@ export default function Navbar() {
|
|
|
157
235
|
|
|
158
236
|
---
|
|
159
237
|
|
|
160
|
-
##
|
|
238
|
+
## 🌀 Tailwind Plugin
|
|
239
|
+
```js
|
|
240
|
+
// tailwind.config.js
|
|
241
|
+
import { varthemePlugin } from 'vartheme/tailwind'
|
|
161
242
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
colors: {
|
|
166
|
-
primary: '#EC4899',
|
|
167
|
-
accent: '#F59E0B',
|
|
168
|
-
},
|
|
169
|
-
}}
|
|
170
|
-
>
|
|
171
|
-
<App />
|
|
172
|
-
</ThemeProvider>
|
|
243
|
+
export default {
|
|
244
|
+
plugins: [varthemePlugin],
|
|
245
|
+
}
|
|
173
246
|
```
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
setColors({ primary: '#10B981' })
|
|
247
|
+
```jsx
|
|
248
|
+
<div className="bg-vt-surface text-vt-text border border-vt-border">
|
|
249
|
+
<h1 className="text-vt-primary">Hello!</h1>
|
|
250
|
+
<button className="bg-vt-primary text-white">Click me</button>
|
|
251
|
+
</div>
|
|
180
252
|
```
|
|
181
253
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
|
189
|
-
|
|
190
|
-
|
|
|
191
|
-
|
|
|
192
|
-
| transitions | boolean |
|
|
254
|
+
| Class | CSS Variable |
|
|
255
|
+
|-------|-------------|
|
|
256
|
+
| `bg-vt-primary` | `--vt-primary` |
|
|
257
|
+
| `bg-vt-background` | `--vt-background` |
|
|
258
|
+
| `bg-vt-surface` | `--vt-surface` |
|
|
259
|
+
| `text-vt-text` | `--vt-text` |
|
|
260
|
+
| `text-vt-primary` | `--vt-primary` |
|
|
261
|
+
| `text-vt-accent` | `--vt-accent` |
|
|
262
|
+
| `border-vt-border` | `--vt-border` |
|
|
263
|
+
| `shadow-vt-glow` | `--vt-primary` glow |
|
|
193
264
|
|
|
194
265
|
---
|
|
195
266
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
- colors
|
|
201
|
-
- toggle()
|
|
202
|
-
- setMode()
|
|
203
|
-
- setColors()
|
|
267
|
+
## 🧩 TypeScript
|
|
268
|
+
```tsx
|
|
269
|
+
import type { ThemeMode, ThemeColors, ThemeConfig, ThemeName, AttributeStrategy } from 'vartheme'
|
|
270
|
+
```
|
|
204
271
|
|
|
205
272
|
---
|
|
206
273
|
|
|
207
|
-
|
|
274
|
+
## 🧠 API Reference
|
|
208
275
|
|
|
209
|
-
|
|
210
|
-
|------|------|
|
|
211
|
-
| size | 48 |
|
|
276
|
+
### ThemeProvider props
|
|
212
277
|
|
|
213
|
-
|
|
278
|
+
| Prop | Type | Default |
|
|
279
|
+
|------|------|---------|
|
|
280
|
+
| `mode` | `'light' \| 'dark' \| 'system'` | `'system'` |
|
|
281
|
+
| `theme` | `'default' \| 'ocean' \| 'forest' \| 'sunset' \| 'rose'` | `'default'` |
|
|
282
|
+
| `colors` | `ThemeColors` | `{}` |
|
|
283
|
+
| `transitions` | `boolean` | `false` |
|
|
284
|
+
| `strategy` | `AttributeStrategy` | `{ type: 'data-attribute' }` |
|
|
285
|
+
| `onThemeChange` | `(mode: 'light' \| 'dark') => void` | — |
|
|
214
286
|
|
|
215
|
-
|
|
287
|
+
### useThemeContext returns
|
|
216
288
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
289
|
+
| Property | Type |
|
|
290
|
+
|----------|------|
|
|
291
|
+
| `mode` | `ThemeMode` |
|
|
292
|
+
| `resolvedMode` | `'light' \| 'dark'` |
|
|
293
|
+
| `theme` | `ThemeName` |
|
|
294
|
+
| `colors` | `ThemeColors` |
|
|
295
|
+
| `toggle()` | `() => void` |
|
|
296
|
+
| `setMode()` | `(mode: ThemeMode) => void` |
|
|
297
|
+
| `setTheme()` | `(theme: ThemeName) => void` |
|
|
298
|
+
| `setColors()` | `(colors: ThemeColors) => void` |
|
|
220
299
|
|
|
221
300
|
---
|
|
222
301
|
|
|
223
|
-
## 🌍 Use Cases
|
|
302
|
+
## 🌍 Use Cases
|
|
224
303
|
|
|
225
|
-
- SaaS dashboards
|
|
226
|
-
- Design systems
|
|
227
|
-
- Portfolios
|
|
228
|
-
- Startups
|
|
229
|
-
- Component libraries
|
|
230
|
-
- Large scale apps
|
|
304
|
+
- SaaS dashboards
|
|
305
|
+
- Design systems
|
|
306
|
+
- Portfolios
|
|
307
|
+
- Startups
|
|
308
|
+
- Component libraries
|
|
309
|
+
- Large scale apps
|
|
231
310
|
|
|
232
311
|
---
|
|
233
312
|
|
|
234
|
-
## 🤝 Contributing
|
|
313
|
+
## 🤝 Contributing
|
|
235
314
|
|
|
236
|
-
We welcome contributions.
|
|
315
|
+
We welcome contributions.
|
|
237
316
|
Open issues, submit PRs, or suggest ideas.
|
|
238
317
|
|
|
239
318
|
---
|
|
240
319
|
|
|
241
|
-
## ⭐ Support
|
|
320
|
+
## ⭐ Support
|
|
242
321
|
|
|
243
322
|
If you like this project:
|
|
244
323
|
|
|
245
|
-
- ⭐ Star the repo
|
|
246
|
-
- 🐦 Share on Twitter
|
|
247
|
-
- 💬 Tell your friends
|
|
248
|
-
- 🚀 Help grow the community
|
|
324
|
+
- ⭐ Star the repo
|
|
325
|
+
- 🐦 Share on Twitter
|
|
326
|
+
- 💬 Tell your friends
|
|
327
|
+
- 🚀 Help grow the community
|
|
249
328
|
|
|
250
329
|
---
|
|
251
330
|
|
|
252
|
-
## 📄 License
|
|
331
|
+
## 📄 License
|
|
253
332
|
|
|
254
|
-
MIT © 2026 vartheme
|
|
333
|
+
MIT © 2026 vartheme
|
package/dist/index.d.mts
CHANGED
|
@@ -28,11 +28,20 @@ interface ThemeState {
|
|
|
28
28
|
setTheme: (theme: ThemeName) => void;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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'),
|
|
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
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
|
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
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
package/dist/index.mjs.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.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.
|
|
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": "^
|
|
32
|
-
"@types/react-dom": "^
|
|
33
|
-
"
|
|
34
|
-
"react
|
|
35
|
-
"
|
|
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
|
-
"
|
|
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
|
}
|