@shiftbloom-studio/circadian-ui 0.2.0
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/LICENSE +22 -0
- package/README.md +275 -0
- package/dist/index.cjs +890 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +201 -0
- package/dist/index.d.ts +201 -0
- package/dist/index.js +850 -0
- package/dist/index.js.map +1 -0
- package/dist/server.cjs +216 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +73 -0
- package/dist/server.d.ts +73 -0
- package/dist/server.js +212 -0
- package/dist/server.js.map +1 -0
- package/package.json +87 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,890 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
// src/core/schedule.ts
|
|
7
|
+
var defaultSchedule = {
|
|
8
|
+
dawn: { start: "05:30", end: "08:30" },
|
|
9
|
+
day: { start: "08:30", end: "17:30" },
|
|
10
|
+
dusk: { start: "17:30", end: "21:30" },
|
|
11
|
+
night: { start: "21:30", end: "05:30" }
|
|
12
|
+
};
|
|
13
|
+
var minutesInDay = 24 * 60;
|
|
14
|
+
var parseTimeToMinutes = (value) => {
|
|
15
|
+
const [hours, minutes] = value.split(":").map(Number);
|
|
16
|
+
if (Number.isNaN(hours) || Number.isNaN(minutes)) {
|
|
17
|
+
throw new Error(`Invalid time format: ${value}`);
|
|
18
|
+
}
|
|
19
|
+
return (hours % 24 * 60 + minutes) % minutesInDay;
|
|
20
|
+
};
|
|
21
|
+
var normalizeSchedule = (schedule) => {
|
|
22
|
+
const merged = {
|
|
23
|
+
...defaultSchedule,
|
|
24
|
+
...schedule,
|
|
25
|
+
dawn: { ...defaultSchedule.dawn, ...schedule?.dawn },
|
|
26
|
+
day: { ...defaultSchedule.day, ...schedule?.day },
|
|
27
|
+
dusk: { ...defaultSchedule.dusk, ...schedule?.dusk },
|
|
28
|
+
night: { ...defaultSchedule.night, ...schedule?.night }
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
dawn: {
|
|
32
|
+
start: parseTimeToMinutes(merged.dawn.start),
|
|
33
|
+
end: parseTimeToMinutes(merged.dawn.end)
|
|
34
|
+
},
|
|
35
|
+
day: {
|
|
36
|
+
start: parseTimeToMinutes(merged.day.start),
|
|
37
|
+
end: parseTimeToMinutes(merged.day.end)
|
|
38
|
+
},
|
|
39
|
+
dusk: {
|
|
40
|
+
start: parseTimeToMinutes(merged.dusk.start),
|
|
41
|
+
end: parseTimeToMinutes(merged.dusk.end)
|
|
42
|
+
},
|
|
43
|
+
night: {
|
|
44
|
+
start: parseTimeToMinutes(merged.night.start),
|
|
45
|
+
end: parseTimeToMinutes(merged.night.end)
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
var getMinutesFromDate = (date) => date.getHours() * 60 + date.getMinutes();
|
|
50
|
+
var isWithinRange = (minutes, start, end) => {
|
|
51
|
+
if (start === end) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
if (start < end) {
|
|
55
|
+
return minutes >= start && minutes < end;
|
|
56
|
+
}
|
|
57
|
+
return minutes >= start || minutes < end;
|
|
58
|
+
};
|
|
59
|
+
var getPhaseFromTime = (date, schedule) => {
|
|
60
|
+
const minutes = getMinutesFromDate(date);
|
|
61
|
+
const normalized = normalizeSchedule(schedule);
|
|
62
|
+
const phases = ["dawn", "day", "dusk", "night"];
|
|
63
|
+
for (const phase of phases) {
|
|
64
|
+
const window2 = normalized[phase];
|
|
65
|
+
if (isWithinRange(minutes, window2.start, window2.end)) {
|
|
66
|
+
return phase;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return "night";
|
|
70
|
+
};
|
|
71
|
+
var computeNextTransition = (date, schedule) => {
|
|
72
|
+
const normalized = normalizeSchedule(schedule);
|
|
73
|
+
const currentPhase = getPhaseFromTime(date, schedule);
|
|
74
|
+
const minutes = getMinutesFromDate(date);
|
|
75
|
+
const endMinutes = normalized[currentPhase].end;
|
|
76
|
+
let delta = endMinutes - minutes;
|
|
77
|
+
if (delta <= 0) {
|
|
78
|
+
delta += minutesInDay;
|
|
79
|
+
}
|
|
80
|
+
return new Date(date.getTime() + delta * 60 * 1e3);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// src/core/sun.ts
|
|
84
|
+
var minutesInDay2 = 24 * 60;
|
|
85
|
+
var defaultSunSchedule = {
|
|
86
|
+
dawnOffsetMinutesBefore: 45,
|
|
87
|
+
dawnOffsetMinutesAfter: 45,
|
|
88
|
+
duskOffsetMinutesBefore: 45,
|
|
89
|
+
duskOffsetMinutesAfter: 45
|
|
90
|
+
};
|
|
91
|
+
var normalizeMinutes = (value) => (value % minutesInDay2 + minutesInDay2) % minutesInDay2;
|
|
92
|
+
var deriveSunSchedule = (date, sunTimes, options) => {
|
|
93
|
+
const config = { ...defaultSunSchedule, ...options };
|
|
94
|
+
const sunriseMinutes = getMinutesFromDate(sunTimes.sunrise);
|
|
95
|
+
const sunsetMinutes = getMinutesFromDate(sunTimes.sunset);
|
|
96
|
+
const dawnStart = normalizeMinutes(sunriseMinutes - config.dawnOffsetMinutesBefore);
|
|
97
|
+
const dawnEnd = normalizeMinutes(sunriseMinutes + config.dawnOffsetMinutesAfter);
|
|
98
|
+
const duskStart = normalizeMinutes(sunsetMinutes - config.duskOffsetMinutesBefore);
|
|
99
|
+
const duskEnd = normalizeMinutes(sunsetMinutes + config.duskOffsetMinutesAfter);
|
|
100
|
+
return {
|
|
101
|
+
dawn: { start: dawnStart, end: dawnEnd },
|
|
102
|
+
day: { start: dawnEnd, end: duskStart },
|
|
103
|
+
dusk: { start: duskStart, end: duskEnd },
|
|
104
|
+
night: { start: duskEnd, end: dawnStart }
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
var getPhaseFromSunTimes = (date, sunTimes, options) => {
|
|
108
|
+
const schedule = deriveSunSchedule(date, sunTimes, options);
|
|
109
|
+
const minutes = getMinutesFromDate(date);
|
|
110
|
+
const phases = ["dawn", "day", "dusk", "night"];
|
|
111
|
+
for (const phase of phases) {
|
|
112
|
+
const window2 = schedule[phase];
|
|
113
|
+
const start = window2.start;
|
|
114
|
+
const end = window2.end;
|
|
115
|
+
if (start === end) {
|
|
116
|
+
return phase;
|
|
117
|
+
}
|
|
118
|
+
if (start < end && minutes >= start && minutes < end) {
|
|
119
|
+
return phase;
|
|
120
|
+
}
|
|
121
|
+
if (start > end && (minutes >= start || minutes < end)) {
|
|
122
|
+
return phase;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return "night";
|
|
126
|
+
};
|
|
127
|
+
var getScheduleFromProvider = (date, provider, options) => {
|
|
128
|
+
if (!provider) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const sunTimes = provider(date);
|
|
132
|
+
if (!sunTimes) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
const schedule = deriveSunSchedule(date, sunTimes, options);
|
|
136
|
+
const toTimeString = (minutes) => {
|
|
137
|
+
const normalized = normalizeMinutes(minutes);
|
|
138
|
+
const hours = Math.floor(normalized / 60).toString().padStart(2, "0");
|
|
139
|
+
const mins = (normalized % 60).toString().padStart(2, "0");
|
|
140
|
+
return `${hours}:${mins}`;
|
|
141
|
+
};
|
|
142
|
+
return {
|
|
143
|
+
dawn: {
|
|
144
|
+
start: toTimeString(schedule.dawn.start),
|
|
145
|
+
end: toTimeString(schedule.dawn.end)
|
|
146
|
+
},
|
|
147
|
+
day: {
|
|
148
|
+
start: toTimeString(schedule.day.start),
|
|
149
|
+
end: toTimeString(schedule.day.end)
|
|
150
|
+
},
|
|
151
|
+
dusk: {
|
|
152
|
+
start: toTimeString(schedule.dusk.start),
|
|
153
|
+
end: toTimeString(schedule.dusk.end)
|
|
154
|
+
},
|
|
155
|
+
night: {
|
|
156
|
+
start: toTimeString(schedule.night.start),
|
|
157
|
+
end: toTimeString(schedule.night.end)
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
// src/core/tokens.ts
|
|
163
|
+
var defaultTokens = {
|
|
164
|
+
dawn: {
|
|
165
|
+
bg: "27 60% 96%",
|
|
166
|
+
fg: "24 18% 18%",
|
|
167
|
+
muted: "27 40% 90%",
|
|
168
|
+
mutedFg: "24 14% 35%",
|
|
169
|
+
card: "0 0% 100%",
|
|
170
|
+
cardFg: "24 18% 18%",
|
|
171
|
+
border: "24 22% 84%",
|
|
172
|
+
ring: "20 65% 45%",
|
|
173
|
+
accent: "20 80% 92%",
|
|
174
|
+
accentFg: "20 40% 30%",
|
|
175
|
+
destructive: "0 74% 55%",
|
|
176
|
+
destructiveFg: "0 0% 100%"
|
|
177
|
+
},
|
|
178
|
+
day: {
|
|
179
|
+
bg: "0 0% 100%",
|
|
180
|
+
fg: "222 28% 14%",
|
|
181
|
+
muted: "210 20% 96%",
|
|
182
|
+
mutedFg: "215 16% 35%",
|
|
183
|
+
card: "0 0% 100%",
|
|
184
|
+
cardFg: "222 28% 14%",
|
|
185
|
+
border: "214 20% 90%",
|
|
186
|
+
ring: "220 65% 45%",
|
|
187
|
+
accent: "220 90% 95%",
|
|
188
|
+
accentFg: "220 45% 30%",
|
|
189
|
+
destructive: "0 72% 55%",
|
|
190
|
+
destructiveFg: "0 0% 100%"
|
|
191
|
+
},
|
|
192
|
+
dusk: {
|
|
193
|
+
bg: "240 24% 14%",
|
|
194
|
+
fg: "30 40% 95%",
|
|
195
|
+
muted: "245 20% 22%",
|
|
196
|
+
mutedFg: "30 20% 80%",
|
|
197
|
+
card: "240 22% 16%",
|
|
198
|
+
cardFg: "30 40% 95%",
|
|
199
|
+
border: "245 16% 30%",
|
|
200
|
+
ring: "32 70% 60%",
|
|
201
|
+
accent: "32 55% 25%",
|
|
202
|
+
accentFg: "32 70% 85%",
|
|
203
|
+
destructive: "0 70% 55%",
|
|
204
|
+
destructiveFg: "0 0% 100%"
|
|
205
|
+
},
|
|
206
|
+
night: {
|
|
207
|
+
bg: "230 22% 10%",
|
|
208
|
+
fg: "210 40% 96%",
|
|
209
|
+
muted: "230 18% 16%",
|
|
210
|
+
mutedFg: "210 20% 80%",
|
|
211
|
+
card: "230 20% 12%",
|
|
212
|
+
cardFg: "210 40% 96%",
|
|
213
|
+
border: "230 16% 24%",
|
|
214
|
+
ring: "210 80% 60%",
|
|
215
|
+
accent: "210 35% 20%",
|
|
216
|
+
accentFg: "210 50% 90%",
|
|
217
|
+
destructive: "0 65% 55%",
|
|
218
|
+
destructiveFg: "0 0% 100%"
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
var cssVarMap = {
|
|
222
|
+
bg: "--cui-bg",
|
|
223
|
+
fg: "--cui-fg",
|
|
224
|
+
muted: "--cui-muted",
|
|
225
|
+
mutedFg: "--cui-muted-fg",
|
|
226
|
+
card: "--cui-card",
|
|
227
|
+
cardFg: "--cui-card-fg",
|
|
228
|
+
border: "--cui-border",
|
|
229
|
+
ring: "--cui-ring",
|
|
230
|
+
accent: "--cui-accent",
|
|
231
|
+
accentFg: "--cui-accent-fg",
|
|
232
|
+
destructive: "--cui-destructive",
|
|
233
|
+
destructiveFg: "--cui-destructive-fg"
|
|
234
|
+
};
|
|
235
|
+
var resolveTokens = (phase, overrides) => {
|
|
236
|
+
return {
|
|
237
|
+
...defaultTokens[phase],
|
|
238
|
+
...overrides?.[phase]
|
|
239
|
+
};
|
|
240
|
+
};
|
|
241
|
+
var tokensToCssVars = (tokens) => {
|
|
242
|
+
const vars = {};
|
|
243
|
+
for (const [key, value] of Object.entries(tokens)) {
|
|
244
|
+
const cssVar = cssVarMap[key];
|
|
245
|
+
vars[cssVar] = value;
|
|
246
|
+
}
|
|
247
|
+
return vars;
|
|
248
|
+
};
|
|
249
|
+
var applyTokensToElement = (element, tokens) => {
|
|
250
|
+
const vars = tokensToCssVars(tokens);
|
|
251
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
252
|
+
element.style.setProperty(key, value);
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
var applyColorSchemeBias = (tokens, prefers, bias) => {
|
|
256
|
+
if (prefers === "no-preference") {
|
|
257
|
+
return tokens;
|
|
258
|
+
}
|
|
259
|
+
const delta = prefers === "dark" ? bias.dark : bias.light;
|
|
260
|
+
const adjust = (value) => {
|
|
261
|
+
const [h, s, l] = value.split(" ");
|
|
262
|
+
const lightness = Math.max(0, Math.min(100, Number(l.replace("%", "")) + delta));
|
|
263
|
+
return `${h} ${s} ${lightness}%`;
|
|
264
|
+
};
|
|
265
|
+
return {
|
|
266
|
+
...tokens,
|
|
267
|
+
bg: adjust(tokens.bg),
|
|
268
|
+
fg: adjust(tokens.fg),
|
|
269
|
+
muted: adjust(tokens.muted),
|
|
270
|
+
mutedFg: adjust(tokens.mutedFg),
|
|
271
|
+
card: adjust(tokens.card),
|
|
272
|
+
cardFg: adjust(tokens.cardFg),
|
|
273
|
+
border: adjust(tokens.border),
|
|
274
|
+
ring: adjust(tokens.ring),
|
|
275
|
+
accent: adjust(tokens.accent),
|
|
276
|
+
accentFg: adjust(tokens.accentFg),
|
|
277
|
+
destructive: adjust(tokens.destructive),
|
|
278
|
+
destructiveFg: adjust(tokens.destructiveFg)
|
|
279
|
+
};
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
// src/core/contrast.ts
|
|
283
|
+
var clamp = (value, min = 0, max = 100) => Math.min(max, Math.max(min, value));
|
|
284
|
+
var parseHsl = (value) => {
|
|
285
|
+
const [h, s, l] = value.split(" ");
|
|
286
|
+
return [Number(h), Number(s.replace("%", "")) / 100, Number(l.replace("%", "")) / 100];
|
|
287
|
+
};
|
|
288
|
+
var hslToRgb = (h, s, l) => {
|
|
289
|
+
const c = (1 - Math.abs(2 * l - 1)) * s;
|
|
290
|
+
const x = c * (1 - Math.abs(h / 60 % 2 - 1));
|
|
291
|
+
const m = l - c / 2;
|
|
292
|
+
let r = 0;
|
|
293
|
+
let g = 0;
|
|
294
|
+
let b = 0;
|
|
295
|
+
if (h >= 0 && h < 60) {
|
|
296
|
+
r = c;
|
|
297
|
+
g = x;
|
|
298
|
+
} else if (h < 120) {
|
|
299
|
+
r = x;
|
|
300
|
+
g = c;
|
|
301
|
+
} else if (h < 180) {
|
|
302
|
+
g = c;
|
|
303
|
+
b = x;
|
|
304
|
+
} else if (h < 240) {
|
|
305
|
+
g = x;
|
|
306
|
+
b = c;
|
|
307
|
+
} else if (h < 300) {
|
|
308
|
+
r = x;
|
|
309
|
+
b = c;
|
|
310
|
+
} else {
|
|
311
|
+
r = c;
|
|
312
|
+
b = x;
|
|
313
|
+
}
|
|
314
|
+
return [r + m, g + m, b + m];
|
|
315
|
+
};
|
|
316
|
+
var relativeLuminance = (hsl) => {
|
|
317
|
+
const [h, s, l] = parseHsl(hsl);
|
|
318
|
+
const [r, g, b] = hslToRgb(h, s, l).map((channel) => {
|
|
319
|
+
const linear = channel <= 0.03928 ? channel / 12.92 : Math.pow((channel + 0.055) / 1.055, 2.4);
|
|
320
|
+
return linear;
|
|
321
|
+
});
|
|
322
|
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
323
|
+
};
|
|
324
|
+
var contrastRatio = (foreground, background) => {
|
|
325
|
+
const lum1 = relativeLuminance(foreground);
|
|
326
|
+
const lum2 = relativeLuminance(background);
|
|
327
|
+
const lighter = Math.max(lum1, lum2);
|
|
328
|
+
const darker = Math.min(lum1, lum2);
|
|
329
|
+
return (lighter + 0.05) / (darker + 0.05);
|
|
330
|
+
};
|
|
331
|
+
var adjustLightness = (value, delta) => {
|
|
332
|
+
const [h, s, l] = value.split(" ");
|
|
333
|
+
const lightness = clamp(Number(l.replace("%", "")) + delta);
|
|
334
|
+
return `${h} ${s} ${lightness}%`;
|
|
335
|
+
};
|
|
336
|
+
var ensurePairContrast = (background, foreground, options) => {
|
|
337
|
+
let current = foreground;
|
|
338
|
+
if (contrastRatio(current, background) >= options.minimumRatio) {
|
|
339
|
+
return current;
|
|
340
|
+
}
|
|
341
|
+
const foregroundLum = relativeLuminance(foreground);
|
|
342
|
+
const backgroundLum = relativeLuminance(background);
|
|
343
|
+
const moveDarker = foregroundLum < backgroundLum;
|
|
344
|
+
const step = moveDarker ? -2 : 2;
|
|
345
|
+
for (let i = 0; i < options.maxIterations; i += 1) {
|
|
346
|
+
current = adjustLightness(current, step);
|
|
347
|
+
if (contrastRatio(current, background) >= options.minimumRatio) {
|
|
348
|
+
return current;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return current;
|
|
352
|
+
};
|
|
353
|
+
var ensureContrast = (tokens, options) => {
|
|
354
|
+
return {
|
|
355
|
+
...tokens,
|
|
356
|
+
fg: ensurePairContrast(tokens.bg, tokens.fg, options),
|
|
357
|
+
mutedFg: ensurePairContrast(tokens.muted, tokens.mutedFg, options),
|
|
358
|
+
cardFg: ensurePairContrast(tokens.card, tokens.cardFg, options),
|
|
359
|
+
accentFg: ensurePairContrast(tokens.accent, tokens.accentFg, options),
|
|
360
|
+
destructiveFg: ensurePairContrast(tokens.destructive, tokens.destructiveFg, options)
|
|
361
|
+
};
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
// src/core/storage.ts
|
|
365
|
+
var defaultStorageKey = "cui:preferences";
|
|
366
|
+
var hasStorage = () => typeof window !== "undefined" && typeof window.localStorage !== "undefined";
|
|
367
|
+
var loadPersistedState = (key = defaultStorageKey) => {
|
|
368
|
+
if (!hasStorage()) {
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
try {
|
|
372
|
+
const raw = window.localStorage.getItem(key);
|
|
373
|
+
if (!raw) {
|
|
374
|
+
return null;
|
|
375
|
+
}
|
|
376
|
+
return JSON.parse(raw);
|
|
377
|
+
} catch {
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
var persistState = (state, key = defaultStorageKey) => {
|
|
382
|
+
if (!hasStorage()) {
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
try {
|
|
386
|
+
window.localStorage.setItem(key, JSON.stringify(state));
|
|
387
|
+
} catch {
|
|
388
|
+
}
|
|
389
|
+
};
|
|
390
|
+
var clearPersistedState = (key = defaultStorageKey) => {
|
|
391
|
+
if (!hasStorage()) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
try {
|
|
395
|
+
window.localStorage.removeItem(key);
|
|
396
|
+
} catch {
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
|
|
400
|
+
// src/core/systemPrefs.ts
|
|
401
|
+
var getPreference = (query) => {
|
|
402
|
+
if (typeof window === "undefined" || !window.matchMedia) {
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
return window.matchMedia(query);
|
|
406
|
+
};
|
|
407
|
+
var getSystemPreferences = () => {
|
|
408
|
+
const colorScheme = getPreference("(prefers-color-scheme: dark)");
|
|
409
|
+
const lightScheme = getPreference("(prefers-color-scheme: light)");
|
|
410
|
+
const contrastMore = getPreference("(prefers-contrast: more)");
|
|
411
|
+
const contrastLess = getPreference("(prefers-contrast: less)");
|
|
412
|
+
const reduceMotion = getPreference("(prefers-reduced-motion: reduce)");
|
|
413
|
+
return {
|
|
414
|
+
prefersColorScheme: colorScheme?.matches ? "dark" : lightScheme?.matches ? "light" : "no-preference",
|
|
415
|
+
prefersContrast: contrastMore?.matches ? "more" : contrastLess?.matches ? "less" : "no-preference",
|
|
416
|
+
reducedMotion: Boolean(reduceMotion?.matches)
|
|
417
|
+
};
|
|
418
|
+
};
|
|
419
|
+
var subscribeSystemPreferences = (handler) => {
|
|
420
|
+
if (typeof window === "undefined" || !window.matchMedia) {
|
|
421
|
+
return () => void 0;
|
|
422
|
+
}
|
|
423
|
+
const notify = () => handler(getSystemPreferences());
|
|
424
|
+
const mediaQueries = [
|
|
425
|
+
"(prefers-color-scheme: dark)",
|
|
426
|
+
"(prefers-color-scheme: light)",
|
|
427
|
+
"(prefers-contrast: more)",
|
|
428
|
+
"(prefers-contrast: less)",
|
|
429
|
+
"(prefers-reduced-motion: reduce)"
|
|
430
|
+
];
|
|
431
|
+
const listeners = mediaQueries.map((query) => {
|
|
432
|
+
const list = window.matchMedia(query);
|
|
433
|
+
const listener = () => notify();
|
|
434
|
+
if (list.addEventListener) {
|
|
435
|
+
list.addEventListener("change", listener);
|
|
436
|
+
} else {
|
|
437
|
+
list.addListener(listener);
|
|
438
|
+
}
|
|
439
|
+
return { list, listener };
|
|
440
|
+
});
|
|
441
|
+
return () => {
|
|
442
|
+
for (const { list, listener } of listeners) {
|
|
443
|
+
if (list.removeEventListener) {
|
|
444
|
+
list.removeEventListener("change", listener);
|
|
445
|
+
} else {
|
|
446
|
+
list.removeListener(listener);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
};
|
|
450
|
+
};
|
|
451
|
+
|
|
452
|
+
// src/core/resolve.ts
|
|
453
|
+
var defaultAccessibility = {
|
|
454
|
+
enforceContrast: true,
|
|
455
|
+
minimumRatio: 4.5,
|
|
456
|
+
largeTextRatio: 3,
|
|
457
|
+
preferPreserveHue: true,
|
|
458
|
+
maxIterations: 24
|
|
459
|
+
};
|
|
460
|
+
var defaultSystemOptions = {
|
|
461
|
+
respectColorScheme: true,
|
|
462
|
+
respectContrastPreference: true,
|
|
463
|
+
respectReducedMotion: true
|
|
464
|
+
};
|
|
465
|
+
var defaultColorSchemeBias = {
|
|
466
|
+
dark: -8,
|
|
467
|
+
light: 8
|
|
468
|
+
};
|
|
469
|
+
var defaultTransition = {
|
|
470
|
+
enabled: false,
|
|
471
|
+
durationMs: 200
|
|
472
|
+
};
|
|
473
|
+
var resolveMode = (userMode, system, config) => {
|
|
474
|
+
return userMode ?? config?.mode ?? "time";
|
|
475
|
+
};
|
|
476
|
+
var resolveAccessibility = (system, config) => {
|
|
477
|
+
const base = { ...defaultAccessibility, ...config?.accessibility };
|
|
478
|
+
if (config?.system?.respectContrastPreference !== false) {
|
|
479
|
+
if (system.prefersContrast === "more") {
|
|
480
|
+
base.minimumRatio = Math.max(base.minimumRatio, 7);
|
|
481
|
+
}
|
|
482
|
+
if (system.prefersContrast === "less") {
|
|
483
|
+
base.minimumRatio = Math.min(base.minimumRatio, 3);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
return base;
|
|
487
|
+
};
|
|
488
|
+
|
|
489
|
+
// src/core/script.ts
|
|
490
|
+
var serialize = (value) => JSON.stringify(value);
|
|
491
|
+
var getMergedSchedule = (schedule) => ({
|
|
492
|
+
...defaultSchedule,
|
|
493
|
+
...schedule,
|
|
494
|
+
dawn: { ...defaultSchedule.dawn, ...schedule?.dawn },
|
|
495
|
+
day: { ...defaultSchedule.day, ...schedule?.day },
|
|
496
|
+
dusk: { ...defaultSchedule.dusk, ...schedule?.dusk },
|
|
497
|
+
night: { ...defaultSchedule.night, ...schedule?.night }
|
|
498
|
+
});
|
|
499
|
+
var getMode = (mode) => mode ?? "time";
|
|
500
|
+
var createInlineScript = (config) => {
|
|
501
|
+
const schedule = getMergedSchedule(config?.schedule);
|
|
502
|
+
const storageKey = config?.storageKey ?? defaultStorageKey;
|
|
503
|
+
const persist = config?.persist !== false;
|
|
504
|
+
const tokens = {
|
|
505
|
+
dawn: tokensToCssVars({
|
|
506
|
+
...defaultTokens.dawn,
|
|
507
|
+
...config?.tokens?.dawn
|
|
508
|
+
}),
|
|
509
|
+
day: tokensToCssVars({
|
|
510
|
+
...defaultTokens.day,
|
|
511
|
+
...config?.tokens?.day
|
|
512
|
+
}),
|
|
513
|
+
dusk: tokensToCssVars({
|
|
514
|
+
...defaultTokens.dusk,
|
|
515
|
+
...config?.tokens?.dusk
|
|
516
|
+
}),
|
|
517
|
+
night: tokensToCssVars({
|
|
518
|
+
...defaultTokens.night,
|
|
519
|
+
...config?.tokens?.night
|
|
520
|
+
})
|
|
521
|
+
};
|
|
522
|
+
return `(() => {
|
|
523
|
+
try {
|
|
524
|
+
const schedule = ${serialize(schedule)};
|
|
525
|
+
const tokens = ${serialize(tokens)};
|
|
526
|
+
const storageKey = ${serialize(storageKey)};
|
|
527
|
+
const persist = ${serialize(persist)};
|
|
528
|
+
const fallbackMode = ${serialize(getMode(config?.mode))};
|
|
529
|
+
const now = new Date();
|
|
530
|
+
const minutes = now.getHours() * 60 + now.getMinutes();
|
|
531
|
+
|
|
532
|
+
const isWithin = (value, start, end) => {
|
|
533
|
+
if (start === end) return true;
|
|
534
|
+
if (start < end) return value >= start && value < end;
|
|
535
|
+
return value >= start || value < end;
|
|
536
|
+
};
|
|
537
|
+
|
|
538
|
+
const parse = (time) => {
|
|
539
|
+
const [h, m] = time.split(":").map(Number);
|
|
540
|
+
return ((h % 24) * 60 + m) % 1440;
|
|
541
|
+
};
|
|
542
|
+
|
|
543
|
+
const normalized = {
|
|
544
|
+
dawn: { start: parse(schedule.dawn.start), end: parse(schedule.dawn.end) },
|
|
545
|
+
day: { start: parse(schedule.day.start), end: parse(schedule.day.end) },
|
|
546
|
+
dusk: { start: parse(schedule.dusk.start), end: parse(schedule.dusk.end) },
|
|
547
|
+
night: { start: parse(schedule.night.start), end: parse(schedule.night.end) }
|
|
548
|
+
};
|
|
549
|
+
|
|
550
|
+
const order = ["dawn", "day", "dusk", "night"];
|
|
551
|
+
let phase = "night";
|
|
552
|
+
for (const key of order) {
|
|
553
|
+
const window = normalized[key];
|
|
554
|
+
if (isWithin(minutes, window.start, window.end)) {
|
|
555
|
+
phase = key;
|
|
556
|
+
break;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
let mode = fallbackMode;
|
|
561
|
+
const persisted = persist && window.localStorage ? window.localStorage.getItem(storageKey) : null;
|
|
562
|
+
if (persisted) {
|
|
563
|
+
try {
|
|
564
|
+
const parsed = JSON.parse(persisted);
|
|
565
|
+
if (parsed.mode) mode = parsed.mode;
|
|
566
|
+
if (parsed.phase) phase = parsed.phase;
|
|
567
|
+
} catch {
|
|
568
|
+
// ignore
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
const root = document.documentElement;
|
|
573
|
+
root.setAttribute("data-cui-phase", phase);
|
|
574
|
+
const vars = tokens[phase] || tokens.night;
|
|
575
|
+
for (const key in vars) {
|
|
576
|
+
root.style.setProperty(key, vars[key]);
|
|
577
|
+
}
|
|
578
|
+
} catch {
|
|
579
|
+
// ignore
|
|
580
|
+
}
|
|
581
|
+
})();`;
|
|
582
|
+
};
|
|
583
|
+
var resolveInitialPhase = (date, schedule) => {
|
|
584
|
+
const merged = getMergedSchedule(schedule);
|
|
585
|
+
const minutes = date.getHours() * 60 + date.getMinutes();
|
|
586
|
+
const isWithin = (value, start, end) => {
|
|
587
|
+
if (start === end) return true;
|
|
588
|
+
if (start < end) return value >= start && value < end;
|
|
589
|
+
return value >= start || value < end;
|
|
590
|
+
};
|
|
591
|
+
const parse = (time) => {
|
|
592
|
+
const [h, m] = time.split(":").map(Number);
|
|
593
|
+
return (h % 24 * 60 + m) % 1440;
|
|
594
|
+
};
|
|
595
|
+
const order = ["dawn", "day", "dusk", "night"];
|
|
596
|
+
for (const phase of order) {
|
|
597
|
+
const window2 = merged[phase];
|
|
598
|
+
if (isWithin(minutes, parse(window2.start), parse(window2.end))) {
|
|
599
|
+
return phase;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
return "night";
|
|
603
|
+
};
|
|
604
|
+
var CircadianContext = react.createContext(null);
|
|
605
|
+
var getRootElement = (target) => {
|
|
606
|
+
if (typeof document === "undefined") {
|
|
607
|
+
return {};
|
|
608
|
+
}
|
|
609
|
+
return target === "body" ? document.body : document.documentElement;
|
|
610
|
+
};
|
|
611
|
+
var getInitialSystemPreferences = () => {
|
|
612
|
+
if (typeof window === "undefined") {
|
|
613
|
+
return {
|
|
614
|
+
prefersColorScheme: "no-preference",
|
|
615
|
+
prefersContrast: "no-preference",
|
|
616
|
+
reducedMotion: false
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
return getSystemPreferences();
|
|
620
|
+
};
|
|
621
|
+
var computePhase = (date, mode, config, phaseOverride) => {
|
|
622
|
+
if (mode === "manual" && phaseOverride) {
|
|
623
|
+
return phaseOverride;
|
|
624
|
+
}
|
|
625
|
+
if (mode === "sun") {
|
|
626
|
+
const sunTimes = config.sunTimesProvider?.(date);
|
|
627
|
+
if (sunTimes) {
|
|
628
|
+
return getPhaseFromSunTimes(date, sunTimes, config.sunSchedule);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
return getPhaseFromTime(date, config.schedule);
|
|
632
|
+
};
|
|
633
|
+
var computeNextChange = (date, mode, config) => {
|
|
634
|
+
if (mode === "manual") {
|
|
635
|
+
return null;
|
|
636
|
+
}
|
|
637
|
+
if (mode === "sun") {
|
|
638
|
+
const schedule = getScheduleFromProvider(date, config.sunTimesProvider, config.sunSchedule);
|
|
639
|
+
if (schedule) {
|
|
640
|
+
return computeNextTransition(date, schedule);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
return computeNextTransition(date, config.schedule);
|
|
644
|
+
};
|
|
645
|
+
var CircadianProvider = ({ config = {}, children }) => {
|
|
646
|
+
const storageKey = config.storageKey;
|
|
647
|
+
const shouldPersist = config.persist !== false;
|
|
648
|
+
const [systemPrefs, setSystemPrefs] = react.useState(getInitialSystemPreferences);
|
|
649
|
+
const initialPersisted = typeof window !== "undefined" && shouldPersist ? loadPersistedState(storageKey) : null;
|
|
650
|
+
const [mode, setModeState] = react.useState(
|
|
651
|
+
initialPersisted?.mode ?? config.mode ?? "time"
|
|
652
|
+
);
|
|
653
|
+
const [phaseOverride, setPhaseOverrideState] = react.useState(
|
|
654
|
+
initialPersisted?.phase ?? null
|
|
655
|
+
);
|
|
656
|
+
const [phase, setPhase] = react.useState(
|
|
657
|
+
() => computePhase(/* @__PURE__ */ new Date(), mode, config, phaseOverride)
|
|
658
|
+
);
|
|
659
|
+
const [nextChangeAt, setNextChangeAt] = react.useState(
|
|
660
|
+
() => computeNextChange(/* @__PURE__ */ new Date(), mode, config)
|
|
661
|
+
);
|
|
662
|
+
const timerRef = react.useRef(null);
|
|
663
|
+
const accessibility = react.useMemo(
|
|
664
|
+
() => resolveAccessibility(systemPrefs, config),
|
|
665
|
+
[systemPrefs, config]
|
|
666
|
+
);
|
|
667
|
+
const transition = { ...defaultTransition, ...config.transition };
|
|
668
|
+
const systemOptions = { ...defaultSystemOptions, ...config.system };
|
|
669
|
+
const colorBias = { ...defaultColorSchemeBias, ...config.colorSchemeBias };
|
|
670
|
+
const tokens = react.useMemo(() => {
|
|
671
|
+
let resolved = resolveTokens(phase, config.tokens);
|
|
672
|
+
if (systemOptions.respectColorScheme) {
|
|
673
|
+
resolved = applyColorSchemeBias(resolved, systemPrefs.prefersColorScheme, colorBias);
|
|
674
|
+
}
|
|
675
|
+
if (accessibility.enforceContrast) {
|
|
676
|
+
resolved = ensureContrast(resolved, accessibility);
|
|
677
|
+
}
|
|
678
|
+
return resolved;
|
|
679
|
+
}, [
|
|
680
|
+
phase,
|
|
681
|
+
config.tokens,
|
|
682
|
+
systemPrefs.prefersColorScheme,
|
|
683
|
+
accessibility,
|
|
684
|
+
systemOptions.respectColorScheme,
|
|
685
|
+
colorBias
|
|
686
|
+
]);
|
|
687
|
+
const updatePhase = react.useCallback(() => {
|
|
688
|
+
const now = /* @__PURE__ */ new Date();
|
|
689
|
+
const resolvedMode = resolveMode(mode, systemPrefs, config);
|
|
690
|
+
const nextPhase = computePhase(now, resolvedMode, config, phaseOverride);
|
|
691
|
+
setPhase(nextPhase);
|
|
692
|
+
setNextChangeAt(computeNextChange(now, resolvedMode, config));
|
|
693
|
+
}, [mode, systemPrefs, config, phaseOverride]);
|
|
694
|
+
react.useEffect(() => {
|
|
695
|
+
updatePhase();
|
|
696
|
+
}, [updatePhase]);
|
|
697
|
+
react.useEffect(() => {
|
|
698
|
+
if (mode === "manual") {
|
|
699
|
+
return;
|
|
700
|
+
}
|
|
701
|
+
if (timerRef.current) {
|
|
702
|
+
window.clearTimeout(timerRef.current);
|
|
703
|
+
}
|
|
704
|
+
if (!nextChangeAt) {
|
|
705
|
+
return;
|
|
706
|
+
}
|
|
707
|
+
const delay = Math.max(0, nextChangeAt.getTime() - Date.now() + 500);
|
|
708
|
+
timerRef.current = window.setTimeout(() => {
|
|
709
|
+
updatePhase();
|
|
710
|
+
}, delay);
|
|
711
|
+
return () => {
|
|
712
|
+
if (timerRef.current) {
|
|
713
|
+
window.clearTimeout(timerRef.current);
|
|
714
|
+
}
|
|
715
|
+
};
|
|
716
|
+
}, [mode, nextChangeAt, updatePhase]);
|
|
717
|
+
react.useEffect(() => {
|
|
718
|
+
const root = getRootElement(config.setAttributeOn);
|
|
719
|
+
if (!root || !root.style) {
|
|
720
|
+
return;
|
|
721
|
+
}
|
|
722
|
+
root.setAttribute("data-cui-phase", phase);
|
|
723
|
+
const allowMotion = !systemPrefs.reducedMotion || !systemOptions.respectReducedMotion;
|
|
724
|
+
if (transition.enabled && allowMotion) {
|
|
725
|
+
root.style.transition = `background-color ${transition.durationMs}ms ease, color ${transition.durationMs}ms ease`;
|
|
726
|
+
} else {
|
|
727
|
+
root.style.transition = "";
|
|
728
|
+
}
|
|
729
|
+
applyTokensToElement(root, tokens);
|
|
730
|
+
}, [
|
|
731
|
+
phase,
|
|
732
|
+
tokens,
|
|
733
|
+
transition,
|
|
734
|
+
systemPrefs.reducedMotion,
|
|
735
|
+
systemOptions.respectReducedMotion,
|
|
736
|
+
config.setAttributeOn
|
|
737
|
+
]);
|
|
738
|
+
react.useEffect(() => {
|
|
739
|
+
if (typeof window === "undefined") {
|
|
740
|
+
return;
|
|
741
|
+
}
|
|
742
|
+
return subscribeSystemPreferences(setSystemPrefs);
|
|
743
|
+
}, []);
|
|
744
|
+
react.useEffect(() => {
|
|
745
|
+
if (!shouldPersist) {
|
|
746
|
+
return;
|
|
747
|
+
}
|
|
748
|
+
persistState(
|
|
749
|
+
{
|
|
750
|
+
mode,
|
|
751
|
+
phase: phaseOverride
|
|
752
|
+
},
|
|
753
|
+
storageKey
|
|
754
|
+
);
|
|
755
|
+
}, [mode, phaseOverride, shouldPersist, storageKey]);
|
|
756
|
+
const setMode = react.useCallback(
|
|
757
|
+
(nextMode) => {
|
|
758
|
+
setModeState(nextMode);
|
|
759
|
+
if (nextMode === "manual" && !phaseOverride) {
|
|
760
|
+
setPhaseOverrideState(phase);
|
|
761
|
+
}
|
|
762
|
+
},
|
|
763
|
+
[phase, phaseOverride]
|
|
764
|
+
);
|
|
765
|
+
const setPhaseOverride = react.useCallback((nextPhase) => {
|
|
766
|
+
setPhaseOverrideState(nextPhase);
|
|
767
|
+
setModeState("manual");
|
|
768
|
+
}, []);
|
|
769
|
+
const clearOverride = react.useCallback(() => {
|
|
770
|
+
setPhaseOverrideState(null);
|
|
771
|
+
setModeState("time");
|
|
772
|
+
}, []);
|
|
773
|
+
const contextValue = react.useMemo(
|
|
774
|
+
() => ({
|
|
775
|
+
phase,
|
|
776
|
+
mode,
|
|
777
|
+
tokens,
|
|
778
|
+
nextChangeAt,
|
|
779
|
+
setMode,
|
|
780
|
+
setPhaseOverride,
|
|
781
|
+
clearOverride,
|
|
782
|
+
isAuto: mode !== "manual"
|
|
783
|
+
}),
|
|
784
|
+
[phase, mode, tokens, nextChangeAt, setMode, setPhaseOverride, clearOverride]
|
|
785
|
+
);
|
|
786
|
+
return /* @__PURE__ */ jsxRuntime.jsx(CircadianContext.Provider, { value: contextValue, children });
|
|
787
|
+
};
|
|
788
|
+
var useCircadianContext = () => {
|
|
789
|
+
const context = react.useContext(CircadianContext);
|
|
790
|
+
if (!context) {
|
|
791
|
+
throw new Error("useCircadian must be used within a CircadianProvider");
|
|
792
|
+
}
|
|
793
|
+
return context;
|
|
794
|
+
};
|
|
795
|
+
var useCircadian = () => useCircadianContext();
|
|
796
|
+
var useCircadianTokens = () => {
|
|
797
|
+
const { tokens } = useCircadianContext();
|
|
798
|
+
const cssVars = react.useMemo(() => tokensToCssVars(tokens), [tokens]);
|
|
799
|
+
const applyToStyle = react.useMemo(
|
|
800
|
+
() => ({
|
|
801
|
+
style: Object.fromEntries(Object.entries(cssVars).map(([key, value]) => [key, value]))
|
|
802
|
+
}),
|
|
803
|
+
[cssVars]
|
|
804
|
+
);
|
|
805
|
+
return { tokens, cssVars, applyToStyle };
|
|
806
|
+
};
|
|
807
|
+
var CircadianScript = ({ config, nonce }) => {
|
|
808
|
+
const script = react.useMemo(() => createInlineScript(config), [config]);
|
|
809
|
+
return /* @__PURE__ */ jsxRuntime.jsx("script", { nonce, dangerouslySetInnerHTML: { __html: script } });
|
|
810
|
+
};
|
|
811
|
+
|
|
812
|
+
// src/tailwind/preset.ts
|
|
813
|
+
var toColor = (cssVar) => `hsl(var(${cssVar}) / <alpha-value>)`;
|
|
814
|
+
var circadianTailwindPreset = () => {
|
|
815
|
+
return {
|
|
816
|
+
theme: {
|
|
817
|
+
extend: {
|
|
818
|
+
colors: {
|
|
819
|
+
background: toColor(cssVarMap.bg),
|
|
820
|
+
foreground: toColor(cssVarMap.fg),
|
|
821
|
+
muted: toColor(cssVarMap.muted),
|
|
822
|
+
"muted-foreground": toColor(cssVarMap.mutedFg),
|
|
823
|
+
card: toColor(cssVarMap.card),
|
|
824
|
+
"card-foreground": toColor(cssVarMap.cardFg),
|
|
825
|
+
border: toColor(cssVarMap.border),
|
|
826
|
+
ring: toColor(cssVarMap.ring),
|
|
827
|
+
accent: toColor(cssVarMap.accent),
|
|
828
|
+
"accent-foreground": toColor(cssVarMap.accentFg),
|
|
829
|
+
destructive: toColor(cssVarMap.destructive),
|
|
830
|
+
"destructive-foreground": toColor(cssVarMap.destructiveFg)
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
};
|
|
835
|
+
};
|
|
836
|
+
|
|
837
|
+
// src/tailwind/plugin.ts
|
|
838
|
+
var circadianPlugin = () => {
|
|
839
|
+
return ({ addBase }) => {
|
|
840
|
+
addBase({
|
|
841
|
+
":root": tokensToCssVars(defaultTokens.day),
|
|
842
|
+
"[data-cui-phase='dawn']": tokensToCssVars(defaultTokens.dawn),
|
|
843
|
+
"[data-cui-phase='day']": tokensToCssVars(defaultTokens.day),
|
|
844
|
+
"[data-cui-phase='dusk']": tokensToCssVars(defaultTokens.dusk),
|
|
845
|
+
"[data-cui-phase='night']": tokensToCssVars(defaultTokens.night)
|
|
846
|
+
});
|
|
847
|
+
};
|
|
848
|
+
};
|
|
849
|
+
|
|
850
|
+
exports.CircadianProvider = CircadianProvider;
|
|
851
|
+
exports.CircadianScript = CircadianScript;
|
|
852
|
+
exports.applyColorSchemeBias = applyColorSchemeBias;
|
|
853
|
+
exports.applyTokensToElement = applyTokensToElement;
|
|
854
|
+
exports.circadianPlugin = circadianPlugin;
|
|
855
|
+
exports.circadianTailwindPreset = circadianTailwindPreset;
|
|
856
|
+
exports.clearPersistedState = clearPersistedState;
|
|
857
|
+
exports.computeNextTransition = computeNextTransition;
|
|
858
|
+
exports.contrastRatio = contrastRatio;
|
|
859
|
+
exports.createInlineScript = createInlineScript;
|
|
860
|
+
exports.cssVarMap = cssVarMap;
|
|
861
|
+
exports.defaultAccessibility = defaultAccessibility;
|
|
862
|
+
exports.defaultColorSchemeBias = defaultColorSchemeBias;
|
|
863
|
+
exports.defaultSchedule = defaultSchedule;
|
|
864
|
+
exports.defaultStorageKey = defaultStorageKey;
|
|
865
|
+
exports.defaultSunSchedule = defaultSunSchedule;
|
|
866
|
+
exports.defaultSystemOptions = defaultSystemOptions;
|
|
867
|
+
exports.defaultTokens = defaultTokens;
|
|
868
|
+
exports.defaultTransition = defaultTransition;
|
|
869
|
+
exports.deriveSunSchedule = deriveSunSchedule;
|
|
870
|
+
exports.ensureContrast = ensureContrast;
|
|
871
|
+
exports.getMinutesFromDate = getMinutesFromDate;
|
|
872
|
+
exports.getPhaseFromSunTimes = getPhaseFromSunTimes;
|
|
873
|
+
exports.getPhaseFromTime = getPhaseFromTime;
|
|
874
|
+
exports.getScheduleFromProvider = getScheduleFromProvider;
|
|
875
|
+
exports.getSystemPreferences = getSystemPreferences;
|
|
876
|
+
exports.loadPersistedState = loadPersistedState;
|
|
877
|
+
exports.normalizeSchedule = normalizeSchedule;
|
|
878
|
+
exports.parseTimeToMinutes = parseTimeToMinutes;
|
|
879
|
+
exports.persistState = persistState;
|
|
880
|
+
exports.resolveAccessibility = resolveAccessibility;
|
|
881
|
+
exports.resolveInitialPhase = resolveInitialPhase;
|
|
882
|
+
exports.resolveMode = resolveMode;
|
|
883
|
+
exports.resolveTokens = resolveTokens;
|
|
884
|
+
exports.subscribeSystemPreferences = subscribeSystemPreferences;
|
|
885
|
+
exports.tokensToCssVars = tokensToCssVars;
|
|
886
|
+
exports.useCircadian = useCircadian;
|
|
887
|
+
exports.useCircadianContext = useCircadianContext;
|
|
888
|
+
exports.useCircadianTokens = useCircadianTokens;
|
|
889
|
+
//# sourceMappingURL=index.cjs.map
|
|
890
|
+
//# sourceMappingURL=index.cjs.map
|