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