@shiftbloom-studio/circadian-ui 0.2.0 → 0.2.1

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/dist/index.js CHANGED
@@ -54,21 +54,24 @@ var isWithinRange = (minutes, start, end) => {
54
54
  }
55
55
  return minutes >= start || minutes < end;
56
56
  };
57
- var getPhaseFromTime = (date, schedule) => {
58
- const minutes = getMinutesFromDate(date);
59
- const normalized = normalizeSchedule(schedule);
57
+ var getPhaseFromMinutes = (minutes, schedule) => {
60
58
  const phases = ["dawn", "day", "dusk", "night"];
61
59
  for (const phase of phases) {
62
- const window2 = normalized[phase];
60
+ const window2 = schedule[phase];
63
61
  if (isWithinRange(minutes, window2.start, window2.end)) {
64
62
  return phase;
65
63
  }
66
64
  }
67
65
  return "night";
68
66
  };
67
+ var getPhaseFromTime = (date, schedule) => {
68
+ const minutes = getMinutesFromDate(date);
69
+ const normalized = normalizeSchedule(schedule);
70
+ return getPhaseFromMinutes(minutes, normalized);
71
+ };
69
72
  var computeNextTransition = (date, schedule) => {
70
73
  const normalized = normalizeSchedule(schedule);
71
- const currentPhase = getPhaseFromTime(date, schedule);
74
+ const currentPhase = getPhaseFromMinutes(getMinutesFromDate(date), normalized);
72
75
  const minutes = getMinutesFromDate(date);
73
76
  const endMinutes = normalized[currentPhase].end;
74
77
  let delta = endMinutes - minutes;
@@ -77,6 +80,16 @@ var computeNextTransition = (date, schedule) => {
77
80
  }
78
81
  return new Date(date.getTime() + delta * 60 * 1e3);
79
82
  };
83
+ var computeNextTransitionFromMinutes = (date, schedule) => {
84
+ const currentPhase = getPhaseFromMinutes(getMinutesFromDate(date), schedule);
85
+ const minutes = getMinutesFromDate(date);
86
+ const endMinutes = schedule[currentPhase].end;
87
+ let delta = endMinutes - minutes;
88
+ if (delta <= 0) {
89
+ delta += minutesInDay;
90
+ }
91
+ return new Date(date.getTime() + delta * 60 * 1e3);
92
+ };
80
93
 
81
94
  // src/core/sun.ts
82
95
  var minutesInDay2 = 24 * 60;
@@ -122,6 +135,10 @@ var getPhaseFromSunTimes = (date, sunTimes, options) => {
122
135
  }
123
136
  return "night";
124
137
  };
138
+ var computeNextSunTransition = (date, sunTimes, options) => {
139
+ const schedule = deriveSunSchedule(date, sunTimes, options);
140
+ return computeNextTransitionFromMinutes(date, schedule);
141
+ };
125
142
  var getScheduleFromProvider = (date, provider, options) => {
126
143
  if (!provider) {
127
144
  return null;
@@ -469,7 +486,7 @@ var defaultTransition = {
469
486
  durationMs: 200
470
487
  };
471
488
  var resolveMode = (userMode, system, config) => {
472
- return userMode ?? config?.mode ?? "time";
489
+ return userMode ?? config?.mode ?? "auto";
473
490
  };
474
491
  var resolveAccessibility = (system, config) => {
475
492
  const base = { ...defaultAccessibility, ...config?.accessibility };
@@ -494,11 +511,13 @@ var getMergedSchedule = (schedule) => ({
494
511
  dusk: { ...defaultSchedule.dusk, ...schedule?.dusk },
495
512
  night: { ...defaultSchedule.night, ...schedule?.night }
496
513
  });
497
- var getMode = (mode) => mode ?? "time";
514
+ var getMode = (mode) => mode ?? "auto";
498
515
  var createInlineScript = (config) => {
499
516
  const schedule = getMergedSchedule(config?.schedule);
500
517
  const storageKey = config?.storageKey ?? defaultStorageKey;
501
518
  const persist = config?.persist !== false;
519
+ const initialPhase = config?.initialPhase ?? null;
520
+ const setAttributeOn = config?.setAttributeOn ?? "html";
502
521
  const tokens = {
503
522
  dawn: tokensToCssVars({
504
523
  ...defaultTokens.dawn,
@@ -524,6 +543,8 @@ var createInlineScript = (config) => {
524
543
  const storageKey = ${serialize(storageKey)};
525
544
  const persist = ${serialize(persist)};
526
545
  const fallbackMode = ${serialize(getMode(config?.mode))};
546
+ const initialPhase = ${serialize(initialPhase)};
547
+ const setAttributeOn = ${serialize(setAttributeOn)};
527
548
  const now = new Date();
528
549
  const minutes = now.getHours() * 60 + now.getMinutes();
529
550
 
@@ -546,12 +567,14 @@ var createInlineScript = (config) => {
546
567
  };
547
568
 
548
569
  const order = ["dawn", "day", "dusk", "night"];
549
- let phase = "night";
550
- for (const key of order) {
551
- const window = normalized[key];
552
- if (isWithin(minutes, window.start, window.end)) {
553
- phase = key;
554
- break;
570
+ let phase = initialPhase || "night";
571
+ if (!initialPhase) {
572
+ for (const key of order) {
573
+ const window = normalized[key];
574
+ if (isWithin(minutes, window.start, window.end)) {
575
+ phase = key;
576
+ break;
577
+ }
555
578
  }
556
579
  }
557
580
 
@@ -567,7 +590,8 @@ var createInlineScript = (config) => {
567
590
  }
568
591
  }
569
592
 
570
- const root = document.documentElement;
593
+ const root =
594
+ setAttributeOn === "body" && document.body ? document.body : document.documentElement;
571
595
  root.setAttribute("data-cui-phase", phase);
572
596
  const vars = tokens[phase] || tokens.night;
573
597
  for (const key in vars) {
@@ -616,27 +640,21 @@ var getInitialSystemPreferences = () => {
616
640
  }
617
641
  return getSystemPreferences();
618
642
  };
619
- var computePhase = (date, mode, config, phaseOverride) => {
643
+ var computePhase = (date, mode, config, phaseOverride, sunTimes) => {
620
644
  if (mode === "manual" && phaseOverride) {
621
645
  return phaseOverride;
622
646
  }
623
- if (mode === "sun") {
624
- const sunTimes = config.sunTimesProvider?.(date);
625
- if (sunTimes) {
626
- return getPhaseFromSunTimes(date, sunTimes, config.sunSchedule);
627
- }
647
+ if (mode === "sun" && sunTimes) {
648
+ return getPhaseFromSunTimes(date, sunTimes, config.sunSchedule);
628
649
  }
629
650
  return getPhaseFromTime(date, config.schedule);
630
651
  };
631
- var computeNextChange = (date, mode, config) => {
652
+ var computeNextChange = (date, mode, config, sunTimes) => {
632
653
  if (mode === "manual") {
633
654
  return null;
634
655
  }
635
- if (mode === "sun") {
636
- const schedule = getScheduleFromProvider(date, config.sunTimesProvider, config.sunSchedule);
637
- if (schedule) {
638
- return computeNextTransition(date, schedule);
639
- }
656
+ if (mode === "sun" && sunTimes) {
657
+ return computeNextSunTransition(date, sunTimes, config.sunSchedule);
640
658
  }
641
659
  return computeNextTransition(date, config.schedule);
642
660
  };
@@ -646,17 +664,18 @@ var CircadianProvider = ({ config = {}, children }) => {
646
664
  const [systemPrefs, setSystemPrefs] = useState(getInitialSystemPreferences);
647
665
  const initialPersisted = typeof window !== "undefined" && shouldPersist ? loadPersistedState(storageKey) : null;
648
666
  const [mode, setModeState] = useState(
649
- initialPersisted?.mode ?? config.mode ?? "time"
667
+ initialPersisted?.mode ?? config.mode ?? "auto"
650
668
  );
651
669
  const [phaseOverride, setPhaseOverrideState] = useState(
652
670
  initialPersisted?.phase ?? null
653
671
  );
654
672
  const [phase, setPhase] = useState(
655
- () => computePhase(/* @__PURE__ */ new Date(), mode, config, phaseOverride)
673
+ () => config.initialPhase ?? computePhase(/* @__PURE__ */ new Date(), mode, config, phaseOverride, null)
656
674
  );
657
675
  const [nextChangeAt, setNextChangeAt] = useState(
658
- () => computeNextChange(/* @__PURE__ */ new Date(), mode, config)
676
+ () => computeNextChange(/* @__PURE__ */ new Date(), mode, config, null)
659
677
  );
678
+ const [resolvedMode, setResolvedMode] = useState(mode);
660
679
  const timerRef = useRef(null);
661
680
  const accessibility = useMemo(
662
681
  () => resolveAccessibility(systemPrefs, config),
@@ -682,18 +701,42 @@ var CircadianProvider = ({ config = {}, children }) => {
682
701
  systemOptions.respectColorScheme,
683
702
  colorBias
684
703
  ]);
704
+ const resolveModeWithSun = useCallback(
705
+ (date) => {
706
+ const desiredMode = resolveMode(mode, systemPrefs, config);
707
+ if (desiredMode === "auto") {
708
+ if (config.sunTimesProvider) {
709
+ const sunTimes = config.sunTimesProvider(date);
710
+ if (sunTimes) {
711
+ return { resolvedMode: "sun", sunTimes };
712
+ }
713
+ }
714
+ return { resolvedMode: "time", sunTimes: null };
715
+ }
716
+ if (desiredMode === "sun") {
717
+ const sunTimes = config.sunTimesProvider?.(date) ?? null;
718
+ if (!sunTimes) {
719
+ return { resolvedMode: "time", sunTimes: null };
720
+ }
721
+ return { resolvedMode: "sun", sunTimes };
722
+ }
723
+ return { resolvedMode: desiredMode, sunTimes: null };
724
+ },
725
+ [mode, systemPrefs, config]
726
+ );
685
727
  const updatePhase = useCallback(() => {
686
728
  const now = /* @__PURE__ */ new Date();
687
- const resolvedMode = resolveMode(mode, systemPrefs, config);
688
- const nextPhase = computePhase(now, resolvedMode, config, phaseOverride);
729
+ const { resolvedMode: resolvedMode2, sunTimes } = resolveModeWithSun(now);
730
+ const nextPhase = computePhase(now, resolvedMode2, config, phaseOverride, sunTimes);
731
+ setResolvedMode(resolvedMode2);
689
732
  setPhase(nextPhase);
690
- setNextChangeAt(computeNextChange(now, resolvedMode, config));
691
- }, [mode, systemPrefs, config, phaseOverride]);
733
+ setNextChangeAt(computeNextChange(now, resolvedMode2, config, sunTimes));
734
+ }, [config, phaseOverride, resolveModeWithSun]);
692
735
  useEffect(() => {
693
736
  updatePhase();
694
737
  }, [updatePhase]);
695
738
  useEffect(() => {
696
- if (mode === "manual") {
739
+ if (resolvedMode === "manual") {
697
740
  return;
698
741
  }
699
742
  if (timerRef.current) {
@@ -711,7 +754,7 @@ var CircadianProvider = ({ config = {}, children }) => {
711
754
  window.clearTimeout(timerRef.current);
712
755
  }
713
756
  };
714
- }, [mode, nextChangeAt, updatePhase]);
757
+ }, [resolvedMode, nextChangeAt, updatePhase]);
715
758
  useEffect(() => {
716
759
  const root = getRootElement(config.setAttributeOn);
717
760
  if (!root || !root.style) {
@@ -766,8 +809,8 @@ var CircadianProvider = ({ config = {}, children }) => {
766
809
  }, []);
767
810
  const clearOverride = useCallback(() => {
768
811
  setPhaseOverrideState(null);
769
- setModeState("time");
770
- }, []);
812
+ setModeState(config.mode ?? "auto");
813
+ }, [config.mode]);
771
814
  const contextValue = useMemo(
772
815
  () => ({
773
816
  phase,
@@ -777,9 +820,10 @@ var CircadianProvider = ({ config = {}, children }) => {
777
820
  setMode,
778
821
  setPhaseOverride,
779
822
  clearOverride,
780
- isAuto: mode !== "manual"
823
+ isAuto: mode !== "manual",
824
+ resolvedMode
781
825
  }),
782
- [phase, mode, tokens, nextChangeAt, setMode, setPhaseOverride, clearOverride]
826
+ [phase, mode, tokens, nextChangeAt, setMode, setPhaseOverride, clearOverride, resolvedMode]
783
827
  );
784
828
  return /* @__PURE__ */ jsx(CircadianContext.Provider, { value: contextValue, children });
785
829
  };
@@ -845,6 +889,6 @@ var circadianPlugin = () => {
845
889
  };
846
890
  };
847
891
 
848
- export { CircadianProvider, CircadianScript, applyColorSchemeBias, applyTokensToElement, circadianPlugin, circadianTailwindPreset, clearPersistedState, computeNextTransition, contrastRatio, createInlineScript, cssVarMap, defaultAccessibility, defaultColorSchemeBias, defaultSchedule, defaultStorageKey, defaultSunSchedule, defaultSystemOptions, defaultTokens, defaultTransition, deriveSunSchedule, ensureContrast, getMinutesFromDate, getPhaseFromSunTimes, getPhaseFromTime, getScheduleFromProvider, getSystemPreferences, loadPersistedState, normalizeSchedule, parseTimeToMinutes, persistState, resolveAccessibility, resolveInitialPhase, resolveMode, resolveTokens, subscribeSystemPreferences, tokensToCssVars, useCircadian, useCircadianContext, useCircadianTokens };
892
+ export { CircadianProvider, CircadianScript, applyColorSchemeBias, applyTokensToElement, circadianPlugin, circadianTailwindPreset, clearPersistedState, computeNextSunTransition, computeNextTransition, computeNextTransitionFromMinutes, contrastRatio, createInlineScript, cssVarMap, defaultAccessibility, defaultColorSchemeBias, defaultSchedule, defaultStorageKey, defaultSunSchedule, defaultSystemOptions, defaultTokens, defaultTransition, deriveSunSchedule, ensureContrast, getMinutesFromDate, getPhaseFromMinutes, getPhaseFromSunTimes, getPhaseFromTime, getScheduleFromProvider, getSystemPreferences, loadPersistedState, normalizeSchedule, parseTimeToMinutes, persistState, resolveAccessibility, resolveInitialPhase, resolveMode, resolveTokens, subscribeSystemPreferences, tokensToCssVars, useCircadian, useCircadianContext, useCircadianTokens };
849
893
  //# sourceMappingURL=index.js.map
850
894
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/schedule.ts","../src/core/sun.ts","../src/core/tokens.ts","../src/core/contrast.ts","../src/core/storage.ts","../src/core/systemPrefs.ts","../src/core/resolve.ts","../src/core/script.ts","../src/react/CircadianProvider.tsx","../src/react/hooks.ts","../src/react/CircadianScript.tsx","../src/tailwind/preset.ts","../src/tailwind/plugin.ts"],"names":["window","minutesInDay","useMemo","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import { CircadianSchedule, Phase } from \"./types\";\n\nexport const defaultSchedule: CircadianSchedule = {\n dawn: { start: \"05:30\", end: \"08:30\" },\n day: { start: \"08:30\", end: \"17:30\" },\n dusk: { start: \"17:30\", end: \"21:30\" },\n night: { start: \"21:30\", end: \"05:30\" }\n};\n\nexport interface PhaseWindowMinutes {\n start: number;\n end: number;\n}\n\nexport type CircadianScheduleMinutes = Record<Phase, PhaseWindowMinutes>;\n\nconst minutesInDay = 24 * 60;\n\nexport const parseTimeToMinutes = (value: string): number => {\n const [hours, minutes] = value.split(\":\").map(Number);\n if (Number.isNaN(hours) || Number.isNaN(minutes)) {\n throw new Error(`Invalid time format: ${value}`);\n }\n return ((hours % 24) * 60 + minutes) % minutesInDay;\n};\n\nexport const normalizeSchedule = (\n schedule?: Partial<CircadianSchedule>\n): CircadianScheduleMinutes => {\n const merged: CircadianSchedule = {\n ...defaultSchedule,\n ...schedule,\n dawn: { ...defaultSchedule.dawn, ...schedule?.dawn },\n day: { ...defaultSchedule.day, ...schedule?.day },\n dusk: { ...defaultSchedule.dusk, ...schedule?.dusk },\n night: { ...defaultSchedule.night, ...schedule?.night }\n };\n\n return {\n dawn: {\n start: parseTimeToMinutes(merged.dawn.start),\n end: parseTimeToMinutes(merged.dawn.end)\n },\n day: {\n start: parseTimeToMinutes(merged.day.start),\n end: parseTimeToMinutes(merged.day.end)\n },\n dusk: {\n start: parseTimeToMinutes(merged.dusk.start),\n end: parseTimeToMinutes(merged.dusk.end)\n },\n night: {\n start: parseTimeToMinutes(merged.night.start),\n end: parseTimeToMinutes(merged.night.end)\n }\n };\n};\n\nexport const getMinutesFromDate = (date: Date): number => date.getHours() * 60 + date.getMinutes();\n\nconst isWithinRange = (minutes: number, start: number, end: number): boolean => {\n if (start === end) {\n return true;\n }\n if (start < end) {\n return minutes >= start && minutes < end;\n }\n return minutes >= start || minutes < end;\n};\n\nexport const getPhaseFromTime = (date: Date, schedule?: Partial<CircadianSchedule>): Phase => {\n const minutes = getMinutesFromDate(date);\n const normalized = normalizeSchedule(schedule);\n const phases: Phase[] = [\"dawn\", \"day\", \"dusk\", \"night\"];\n for (const phase of phases) {\n const window = normalized[phase];\n if (isWithinRange(minutes, window.start, window.end)) {\n return phase;\n }\n }\n return \"night\";\n};\n\nexport const computeNextTransition = (date: Date, schedule?: Partial<CircadianSchedule>): Date => {\n const normalized = normalizeSchedule(schedule);\n const currentPhase = getPhaseFromTime(date, schedule);\n const minutes = getMinutesFromDate(date);\n const endMinutes = normalized[currentPhase].end;\n let delta = endMinutes - minutes;\n if (delta <= 0) {\n delta += minutesInDay;\n }\n return new Date(date.getTime() + delta * 60 * 1000);\n};\n","import { CircadianSchedule } from \"./types\";\nimport { CircadianScheduleMinutes, getMinutesFromDate } from \"./schedule\";\nimport { Phase, SunScheduleOptions, SunTimes, SunTimesProvider } from \"./types\";\n\nconst minutesInDay = 24 * 60;\n\nexport const defaultSunSchedule: SunScheduleOptions = {\n dawnOffsetMinutesBefore: 45,\n dawnOffsetMinutesAfter: 45,\n duskOffsetMinutesBefore: 45,\n duskOffsetMinutesAfter: 45\n};\n\nconst normalizeMinutes = (value: number): number =>\n ((value % minutesInDay) + minutesInDay) % minutesInDay;\n\nexport const deriveSunSchedule = (\n date: Date,\n sunTimes: SunTimes,\n options?: Partial<SunScheduleOptions>\n): CircadianScheduleMinutes => {\n const config = { ...defaultSunSchedule, ...options };\n const sunriseMinutes = getMinutesFromDate(sunTimes.sunrise);\n const sunsetMinutes = getMinutesFromDate(sunTimes.sunset);\n\n const dawnStart = normalizeMinutes(sunriseMinutes - config.dawnOffsetMinutesBefore);\n const dawnEnd = normalizeMinutes(sunriseMinutes + config.dawnOffsetMinutesAfter);\n const duskStart = normalizeMinutes(sunsetMinutes - config.duskOffsetMinutesBefore);\n const duskEnd = normalizeMinutes(sunsetMinutes + config.duskOffsetMinutesAfter);\n\n return {\n dawn: { start: dawnStart, end: dawnEnd },\n day: { start: dawnEnd, end: duskStart },\n dusk: { start: duskStart, end: duskEnd },\n night: { start: duskEnd, end: dawnStart }\n };\n};\n\nexport const getPhaseFromSunTimes = (\n date: Date,\n sunTimes: SunTimes,\n options?: Partial<SunScheduleOptions>\n): Phase => {\n const schedule = deriveSunSchedule(date, sunTimes, options);\n const minutes = getMinutesFromDate(date);\n const phases: Phase[] = [\"dawn\", \"day\", \"dusk\", \"night\"];\n for (const phase of phases) {\n const window = schedule[phase];\n const start = window.start;\n const end = window.end;\n if (start === end) {\n return phase;\n }\n if (start < end && minutes >= start && minutes < end) {\n return phase;\n }\n if (start > end && (minutes >= start || minutes < end)) {\n return phase;\n }\n }\n return \"night\";\n};\n\nexport const getScheduleFromProvider = (\n date: Date,\n provider?: SunTimesProvider,\n options?: Partial<SunScheduleOptions>\n): CircadianSchedule | null => {\n if (!provider) {\n return null;\n }\n const sunTimes = provider(date);\n if (!sunTimes) {\n return null;\n }\n const schedule = deriveSunSchedule(date, sunTimes, options);\n const toTimeString = (minutes: number): string => {\n const normalized = normalizeMinutes(minutes);\n const hours = Math.floor(normalized / 60)\n .toString()\n .padStart(2, \"0\");\n const mins = (normalized % 60).toString().padStart(2, \"0\");\n return `${hours}:${mins}`;\n };\n return {\n dawn: {\n start: toTimeString(schedule.dawn.start),\n end: toTimeString(schedule.dawn.end)\n },\n day: {\n start: toTimeString(schedule.day.start),\n end: toTimeString(schedule.day.end)\n },\n dusk: {\n start: toTimeString(schedule.dusk.start),\n end: toTimeString(schedule.dusk.end)\n },\n night: {\n start: toTimeString(schedule.night.start),\n end: toTimeString(schedule.night.end)\n }\n };\n};\n","import { CircadianTokens, ColorSchemeBias, Phase } from \"./types\";\n\nexport const defaultTokens: Record<Phase, CircadianTokens> = {\n dawn: {\n bg: \"27 60% 96%\",\n fg: \"24 18% 18%\",\n muted: \"27 40% 90%\",\n mutedFg: \"24 14% 35%\",\n card: \"0 0% 100%\",\n cardFg: \"24 18% 18%\",\n border: \"24 22% 84%\",\n ring: \"20 65% 45%\",\n accent: \"20 80% 92%\",\n accentFg: \"20 40% 30%\",\n destructive: \"0 74% 55%\",\n destructiveFg: \"0 0% 100%\"\n },\n day: {\n bg: \"0 0% 100%\",\n fg: \"222 28% 14%\",\n muted: \"210 20% 96%\",\n mutedFg: \"215 16% 35%\",\n card: \"0 0% 100%\",\n cardFg: \"222 28% 14%\",\n border: \"214 20% 90%\",\n ring: \"220 65% 45%\",\n accent: \"220 90% 95%\",\n accentFg: \"220 45% 30%\",\n destructive: \"0 72% 55%\",\n destructiveFg: \"0 0% 100%\"\n },\n dusk: {\n bg: \"240 24% 14%\",\n fg: \"30 40% 95%\",\n muted: \"245 20% 22%\",\n mutedFg: \"30 20% 80%\",\n card: \"240 22% 16%\",\n cardFg: \"30 40% 95%\",\n border: \"245 16% 30%\",\n ring: \"32 70% 60%\",\n accent: \"32 55% 25%\",\n accentFg: \"32 70% 85%\",\n destructive: \"0 70% 55%\",\n destructiveFg: \"0 0% 100%\"\n },\n night: {\n bg: \"230 22% 10%\",\n fg: \"210 40% 96%\",\n muted: \"230 18% 16%\",\n mutedFg: \"210 20% 80%\",\n card: \"230 20% 12%\",\n cardFg: \"210 40% 96%\",\n border: \"230 16% 24%\",\n ring: \"210 80% 60%\",\n accent: \"210 35% 20%\",\n accentFg: \"210 50% 90%\",\n destructive: \"0 65% 55%\",\n destructiveFg: \"0 0% 100%\"\n }\n};\n\nexport const cssVarMap: Record<keyof CircadianTokens, string> = {\n bg: \"--cui-bg\",\n fg: \"--cui-fg\",\n muted: \"--cui-muted\",\n mutedFg: \"--cui-muted-fg\",\n card: \"--cui-card\",\n cardFg: \"--cui-card-fg\",\n border: \"--cui-border\",\n ring: \"--cui-ring\",\n accent: \"--cui-accent\",\n accentFg: \"--cui-accent-fg\",\n destructive: \"--cui-destructive\",\n destructiveFg: \"--cui-destructive-fg\"\n};\n\nexport const resolveTokens = (\n phase: Phase,\n overrides?: Partial<Record<Phase, Partial<CircadianTokens>>>\n): CircadianTokens => {\n return {\n ...defaultTokens[phase],\n ...overrides?.[phase]\n };\n};\n\nexport const tokensToCssVars = (tokens: CircadianTokens): Record<string, string> => {\n const vars: Record<string, string> = {};\n for (const [key, value] of Object.entries(tokens)) {\n const cssVar = cssVarMap[key as keyof CircadianTokens];\n vars[cssVar] = value;\n }\n return vars;\n};\n\nexport const applyTokensToElement = (element: HTMLElement, tokens: CircadianTokens) => {\n const vars = tokensToCssVars(tokens);\n for (const [key, value] of Object.entries(vars)) {\n element.style.setProperty(key, value);\n }\n};\n\nexport const applyColorSchemeBias = (\n tokens: CircadianTokens,\n prefers: \"dark\" | \"light\" | \"no-preference\",\n bias: ColorSchemeBias\n): CircadianTokens => {\n if (prefers === \"no-preference\") {\n return tokens;\n }\n const delta = prefers === \"dark\" ? bias.dark : bias.light;\n const adjust = (value: string): string => {\n const [h, s, l] = value.split(\" \");\n const lightness = Math.max(0, Math.min(100, Number(l.replace(\"%\", \"\")) + delta));\n return `${h} ${s} ${lightness}%`;\n };\n\n return {\n ...tokens,\n bg: adjust(tokens.bg),\n fg: adjust(tokens.fg),\n muted: adjust(tokens.muted),\n mutedFg: adjust(tokens.mutedFg),\n card: adjust(tokens.card),\n cardFg: adjust(tokens.cardFg),\n border: adjust(tokens.border),\n ring: adjust(tokens.ring),\n accent: adjust(tokens.accent),\n accentFg: adjust(tokens.accentFg),\n destructive: adjust(tokens.destructive),\n destructiveFg: adjust(tokens.destructiveFg)\n };\n};\n","import { CircadianTokens } from \"./types\";\n\nexport interface ContrastOptions {\n minimumRatio: number;\n preferPreserveHue: boolean;\n maxIterations: number;\n}\n\nconst clamp = (value: number, min = 0, max = 100) => Math.min(max, Math.max(min, value));\n\nconst parseHsl = (value: string): [number, number, number] => {\n const [h, s, l] = value.split(\" \");\n return [Number(h), Number(s.replace(\"%\", \"\")) / 100, Number(l.replace(\"%\", \"\")) / 100];\n};\n\nconst hslToRgb = (h: number, s: number, l: number): [number, number, number] => {\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l - c / 2;\n let r = 0;\n let g = 0;\n let b = 0;\n\n if (h >= 0 && h < 60) {\n r = c;\n g = x;\n } else if (h < 120) {\n r = x;\n g = c;\n } else if (h < 180) {\n g = c;\n b = x;\n } else if (h < 240) {\n g = x;\n b = c;\n } else if (h < 300) {\n r = x;\n b = c;\n } else {\n r = c;\n b = x;\n }\n\n return [r + m, g + m, b + m];\n};\n\nconst relativeLuminance = (hsl: string): number => {\n const [h, s, l] = parseHsl(hsl);\n const [r, g, b] = hslToRgb(h, s, l).map((channel) => {\n const linear = channel <= 0.03928 ? channel / 12.92 : Math.pow((channel + 0.055) / 1.055, 2.4);\n return linear;\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\nexport const contrastRatio = (foreground: string, background: string): number => {\n const lum1 = relativeLuminance(foreground);\n const lum2 = relativeLuminance(background);\n const lighter = Math.max(lum1, lum2);\n const darker = Math.min(lum1, lum2);\n return (lighter + 0.05) / (darker + 0.05);\n};\n\nconst adjustLightness = (value: string, delta: number): string => {\n const [h, s, l] = value.split(\" \");\n const lightness = clamp(Number(l.replace(\"%\", \"\")) + delta);\n return `${h} ${s} ${lightness}%`;\n};\n\nconst ensurePairContrast = (\n background: string,\n foreground: string,\n options: ContrastOptions\n): string => {\n let current = foreground;\n if (contrastRatio(current, background) >= options.minimumRatio) {\n return current;\n }\n\n const foregroundLum = relativeLuminance(foreground);\n const backgroundLum = relativeLuminance(background);\n const moveDarker = foregroundLum < backgroundLum;\n const step = moveDarker ? -2 : 2;\n\n for (let i = 0; i < options.maxIterations; i += 1) {\n current = adjustLightness(current, step);\n if (contrastRatio(current, background) >= options.minimumRatio) {\n return current;\n }\n }\n\n return current;\n};\n\nexport const ensureContrast = (\n tokens: CircadianTokens,\n options: ContrastOptions\n): CircadianTokens => {\n return {\n ...tokens,\n fg: ensurePairContrast(tokens.bg, tokens.fg, options),\n mutedFg: ensurePairContrast(tokens.muted, tokens.mutedFg, options),\n cardFg: ensurePairContrast(tokens.card, tokens.cardFg, options),\n accentFg: ensurePairContrast(tokens.accent, tokens.accentFg, options),\n destructiveFg: ensurePairContrast(tokens.destructive, tokens.destructiveFg, options)\n };\n};\n","import { PersistedState } from \"./types\";\n\nexport const defaultStorageKey = \"cui:preferences\";\n\nconst hasStorage = (): boolean =>\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\";\n\nexport const loadPersistedState = (key: string = defaultStorageKey): PersistedState | null => {\n if (!hasStorage()) {\n return null;\n }\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) {\n return null;\n }\n return JSON.parse(raw) as PersistedState;\n } catch {\n return null;\n }\n};\n\nexport const persistState = (state: PersistedState, key: string = defaultStorageKey): void => {\n if (!hasStorage()) {\n return;\n }\n try {\n window.localStorage.setItem(key, JSON.stringify(state));\n } catch {\n // Ignore write errors\n }\n};\n\nexport const clearPersistedState = (key: string = defaultStorageKey): void => {\n if (!hasStorage()) {\n return;\n }\n try {\n window.localStorage.removeItem(key);\n } catch {\n // Ignore cleanup errors\n }\n};\n","import { SystemPreferences } from \"./types\";\n\nconst getPreference = (query: string): MediaQueryList | null => {\n if (typeof window === \"undefined\" || !window.matchMedia) {\n return null;\n }\n return window.matchMedia(query);\n};\n\nexport const getSystemPreferences = (): SystemPreferences => {\n const colorScheme = getPreference(\"(prefers-color-scheme: dark)\");\n const lightScheme = getPreference(\"(prefers-color-scheme: light)\");\n const contrastMore = getPreference(\"(prefers-contrast: more)\");\n const contrastLess = getPreference(\"(prefers-contrast: less)\");\n const reduceMotion = getPreference(\"(prefers-reduced-motion: reduce)\");\n\n return {\n prefersColorScheme: colorScheme?.matches\n ? \"dark\"\n : lightScheme?.matches\n ? \"light\"\n : \"no-preference\",\n prefersContrast: contrastMore?.matches\n ? \"more\"\n : contrastLess?.matches\n ? \"less\"\n : \"no-preference\",\n reducedMotion: Boolean(reduceMotion?.matches)\n };\n};\n\nexport const subscribeSystemPreferences = (\n handler: (prefs: SystemPreferences) => void\n): (() => void) => {\n if (typeof window === \"undefined\" || !window.matchMedia) {\n return () => undefined;\n }\n\n const notify = () => handler(getSystemPreferences());\n const mediaQueries = [\n \"(prefers-color-scheme: dark)\",\n \"(prefers-color-scheme: light)\",\n \"(prefers-contrast: more)\",\n \"(prefers-contrast: less)\",\n \"(prefers-reduced-motion: reduce)\"\n ];\n\n const listeners = mediaQueries.map((query) => {\n const list = window.matchMedia(query);\n const listener = () => notify();\n if (list.addEventListener) {\n list.addEventListener(\"change\", listener);\n } else {\n list.addListener(listener);\n }\n return { list, listener };\n });\n\n return () => {\n for (const { list, listener } of listeners) {\n if (list.removeEventListener) {\n list.removeEventListener(\"change\", listener);\n } else {\n list.removeListener(listener);\n }\n }\n };\n};\n","import { AccessibilityOptions, CircadianConfig, ScheduleMode, SystemPreferences } from \"./types\";\n\nexport const defaultAccessibility: AccessibilityOptions = {\n enforceContrast: true,\n minimumRatio: 4.5,\n largeTextRatio: 3,\n preferPreserveHue: true,\n maxIterations: 24\n};\n\nexport const defaultSystemOptions = {\n respectColorScheme: true,\n respectContrastPreference: true,\n respectReducedMotion: true\n};\n\nexport const defaultColorSchemeBias = {\n dark: -8,\n light: 8\n};\n\nexport const defaultTransition = {\n enabled: false,\n durationMs: 200\n};\n\nexport const resolveMode = (\n userMode: ScheduleMode | undefined,\n system: SystemPreferences,\n config?: CircadianConfig\n): ScheduleMode => {\n return userMode ?? config?.mode ?? \"time\";\n};\n\nexport const resolveAccessibility = (\n system: SystemPreferences,\n config?: CircadianConfig\n): AccessibilityOptions => {\n const base = { ...defaultAccessibility, ...config?.accessibility };\n if (config?.system?.respectContrastPreference !== false) {\n if (system.prefersContrast === \"more\") {\n base.minimumRatio = Math.max(base.minimumRatio, 7);\n }\n if (system.prefersContrast === \"less\") {\n base.minimumRatio = Math.min(base.minimumRatio, 3);\n }\n }\n return base;\n};\n","import { CircadianConfig, CircadianSchedule, Phase, ScheduleMode } from \"./types\";\nimport { defaultSchedule } from \"./schedule\";\nimport { defaultStorageKey } from \"./storage\";\nimport { defaultTokens, tokensToCssVars } from \"./tokens\";\n\nconst serialize = (value: unknown): string => JSON.stringify(value);\n\nconst getMergedSchedule = (schedule?: Partial<CircadianSchedule>): CircadianSchedule => ({\n ...defaultSchedule,\n ...schedule,\n dawn: { ...defaultSchedule.dawn, ...schedule?.dawn },\n day: { ...defaultSchedule.day, ...schedule?.day },\n dusk: { ...defaultSchedule.dusk, ...schedule?.dusk },\n night: { ...defaultSchedule.night, ...schedule?.night }\n});\n\nconst getMode = (mode?: ScheduleMode): ScheduleMode => mode ?? \"time\";\n\nexport const createInlineScript = (config?: CircadianConfig): string => {\n const schedule = getMergedSchedule(config?.schedule);\n const storageKey = config?.storageKey ?? defaultStorageKey;\n const persist = config?.persist !== false;\n const tokens = {\n dawn: tokensToCssVars({\n ...defaultTokens.dawn,\n ...config?.tokens?.dawn\n }),\n day: tokensToCssVars({\n ...defaultTokens.day,\n ...config?.tokens?.day\n }),\n dusk: tokensToCssVars({\n ...defaultTokens.dusk,\n ...config?.tokens?.dusk\n }),\n night: tokensToCssVars({\n ...defaultTokens.night,\n ...config?.tokens?.night\n })\n };\n\n return `(() => {\n try {\n const schedule = ${serialize(schedule)};\n const tokens = ${serialize(tokens)};\n const storageKey = ${serialize(storageKey)};\n const persist = ${serialize(persist)};\n const fallbackMode = ${serialize(getMode(config?.mode))};\n const now = new Date();\n const minutes = now.getHours() * 60 + now.getMinutes();\n\n const isWithin = (value, start, end) => {\n if (start === end) return true;\n if (start < end) return value >= start && value < end;\n return value >= start || value < end;\n };\n\n const parse = (time) => {\n const [h, m] = time.split(\":\").map(Number);\n return ((h % 24) * 60 + m) % 1440;\n };\n\n const normalized = {\n dawn: { start: parse(schedule.dawn.start), end: parse(schedule.dawn.end) },\n day: { start: parse(schedule.day.start), end: parse(schedule.day.end) },\n dusk: { start: parse(schedule.dusk.start), end: parse(schedule.dusk.end) },\n night: { start: parse(schedule.night.start), end: parse(schedule.night.end) }\n };\n\n const order = [\"dawn\", \"day\", \"dusk\", \"night\"];\n let phase = \"night\";\n for (const key of order) {\n const window = normalized[key];\n if (isWithin(minutes, window.start, window.end)) {\n phase = key;\n break;\n }\n }\n\n let mode = fallbackMode;\n const persisted = persist && window.localStorage ? window.localStorage.getItem(storageKey) : null;\n if (persisted) {\n try {\n const parsed = JSON.parse(persisted);\n if (parsed.mode) mode = parsed.mode;\n if (parsed.phase) phase = parsed.phase;\n } catch {\n // ignore\n }\n }\n\n const root = document.documentElement;\n root.setAttribute(\"data-cui-phase\", phase);\n const vars = tokens[phase] || tokens.night;\n for (const key in vars) {\n root.style.setProperty(key, vars[key]);\n }\n } catch {\n // ignore\n }\n})();`;\n};\n\nexport const resolveInitialPhase = (date: Date, schedule?: Partial<CircadianSchedule>): Phase => {\n const merged = getMergedSchedule(schedule);\n const minutes = date.getHours() * 60 + date.getMinutes();\n const isWithin = (value: number, start: number, end: number) => {\n if (start === end) return true;\n if (start < end) return value >= start && value < end;\n return value >= start || value < end;\n };\n const parse = (time: string) => {\n const [h, m] = time.split(\":\").map(Number);\n return ((h % 24) * 60 + m) % 1440;\n };\n const order: Phase[] = [\"dawn\", \"day\", \"dusk\", \"night\"];\n for (const phase of order) {\n const window = merged[phase];\n if (isWithin(minutes, parse(window.start), parse(window.end))) {\n return phase;\n }\n }\n return \"night\";\n};\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode\n} from \"react\";\nimport {\n CircadianConfig,\n CircadianState,\n Phase,\n ScheduleMode,\n SystemPreferences\n} from \"../core/types\";\nimport { getPhaseFromTime, computeNextTransition } from \"../core/schedule\";\nimport { getPhaseFromSunTimes, getScheduleFromProvider } from \"../core/sun\";\nimport { applyColorSchemeBias, applyTokensToElement, resolveTokens } from \"../core/tokens\";\nimport { ensureContrast } from \"../core/contrast\";\nimport { loadPersistedState, persistState } from \"../core/storage\";\nimport { getSystemPreferences, subscribeSystemPreferences } from \"../core/systemPrefs\";\nimport {\n defaultColorSchemeBias,\n defaultSystemOptions,\n defaultTransition,\n resolveAccessibility,\n resolveMode\n} from \"../core/resolve\";\n\nexport interface CircadianContextValue extends CircadianState {\n setMode: (mode: ScheduleMode) => void;\n setPhaseOverride: (phase: Phase) => void;\n clearOverride: () => void;\n isAuto: boolean;\n}\n\nconst CircadianContext = createContext<CircadianContextValue | null>(null);\n\nconst getRootElement = (target: CircadianConfig[\"setAttributeOn\"]): HTMLElement => {\n if (typeof document === \"undefined\") {\n return {} as HTMLElement;\n }\n return target === \"body\" ? document.body : document.documentElement;\n};\n\nconst getInitialSystemPreferences = (): SystemPreferences => {\n if (typeof window === \"undefined\") {\n return {\n prefersColorScheme: \"no-preference\",\n prefersContrast: \"no-preference\",\n reducedMotion: false\n };\n }\n return getSystemPreferences();\n};\n\nconst computePhase = (\n date: Date,\n mode: ScheduleMode,\n config: CircadianConfig,\n phaseOverride: Phase | null\n): Phase => {\n if (mode === \"manual\" && phaseOverride) {\n return phaseOverride;\n }\n if (mode === \"sun\") {\n const sunTimes = config.sunTimesProvider?.(date);\n if (sunTimes) {\n return getPhaseFromSunTimes(date, sunTimes, config.sunSchedule);\n }\n }\n return getPhaseFromTime(date, config.schedule);\n};\n\nconst computeNextChange = (\n date: Date,\n mode: ScheduleMode,\n config: CircadianConfig\n): Date | null => {\n if (mode === \"manual\") {\n return null;\n }\n if (mode === \"sun\") {\n const schedule = getScheduleFromProvider(date, config.sunTimesProvider, config.sunSchedule);\n if (schedule) {\n return computeNextTransition(date, schedule);\n }\n }\n return computeNextTransition(date, config.schedule);\n};\n\nexport interface CircadianProviderProps {\n config?: CircadianConfig;\n children: ReactNode;\n}\n\nexport const CircadianProvider = ({ config = {}, children }: CircadianProviderProps) => {\n const storageKey = config.storageKey;\n const shouldPersist = config.persist !== false;\n const [systemPrefs, setSystemPrefs] = useState<SystemPreferences>(getInitialSystemPreferences);\n\n const initialPersisted =\n typeof window !== \"undefined\" && shouldPersist ? loadPersistedState(storageKey) : null;\n\n const [mode, setModeState] = useState<ScheduleMode>(\n initialPersisted?.mode ?? config.mode ?? \"time\"\n );\n const [phaseOverride, setPhaseOverrideState] = useState<Phase | null>(\n initialPersisted?.phase ?? null\n );\n\n const [phase, setPhase] = useState<Phase>(() =>\n computePhase(new Date(), mode, config, phaseOverride)\n );\n\n const [nextChangeAt, setNextChangeAt] = useState<Date | null>(() =>\n computeNextChange(new Date(), mode, config)\n );\n\n const timerRef = useRef<number | null>(null);\n\n const accessibility = useMemo(\n () => resolveAccessibility(systemPrefs, config),\n [systemPrefs, config]\n );\n\n const transition = { ...defaultTransition, ...config.transition };\n const systemOptions = { ...defaultSystemOptions, ...config.system };\n const colorBias = { ...defaultColorSchemeBias, ...config.colorSchemeBias };\n\n const tokens = useMemo(() => {\n let resolved = resolveTokens(phase, config.tokens);\n if (systemOptions.respectColorScheme) {\n resolved = applyColorSchemeBias(resolved, systemPrefs.prefersColorScheme, colorBias);\n }\n if (accessibility.enforceContrast) {\n resolved = ensureContrast(resolved, accessibility);\n }\n return resolved;\n }, [\n phase,\n config.tokens,\n systemPrefs.prefersColorScheme,\n accessibility,\n systemOptions.respectColorScheme,\n colorBias\n ]);\n\n const updatePhase = useCallback(() => {\n const now = new Date();\n const resolvedMode = resolveMode(mode, systemPrefs, config);\n const nextPhase = computePhase(now, resolvedMode, config, phaseOverride);\n setPhase(nextPhase);\n setNextChangeAt(computeNextChange(now, resolvedMode, config));\n }, [mode, systemPrefs, config, phaseOverride]);\n\n useEffect(() => {\n updatePhase();\n }, [updatePhase]);\n\n useEffect(() => {\n if (mode === \"manual\") {\n return;\n }\n if (timerRef.current) {\n window.clearTimeout(timerRef.current);\n }\n if (!nextChangeAt) {\n return;\n }\n const delay = Math.max(0, nextChangeAt.getTime() - Date.now() + 500);\n timerRef.current = window.setTimeout(() => {\n updatePhase();\n }, delay);\n return () => {\n if (timerRef.current) {\n window.clearTimeout(timerRef.current);\n }\n };\n }, [mode, nextChangeAt, updatePhase]);\n\n useEffect(() => {\n const root = getRootElement(config.setAttributeOn);\n if (!root || !root.style) {\n return;\n }\n root.setAttribute(\"data-cui-phase\", phase);\n const allowMotion = !systemPrefs.reducedMotion || !systemOptions.respectReducedMotion;\n if (transition.enabled && allowMotion) {\n root.style.transition = `background-color ${transition.durationMs}ms ease, color ${transition.durationMs}ms ease`;\n } else {\n root.style.transition = \"\";\n }\n applyTokensToElement(root, tokens);\n }, [\n phase,\n tokens,\n transition,\n systemPrefs.reducedMotion,\n systemOptions.respectReducedMotion,\n config.setAttributeOn\n ]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n return subscribeSystemPreferences(setSystemPrefs);\n }, []);\n\n useEffect(() => {\n if (!shouldPersist) {\n return;\n }\n persistState(\n {\n mode,\n phase: phaseOverride\n },\n storageKey\n );\n }, [mode, phaseOverride, shouldPersist, storageKey]);\n\n const setMode = useCallback(\n (nextMode: ScheduleMode) => {\n setModeState(nextMode);\n if (nextMode === \"manual\" && !phaseOverride) {\n setPhaseOverrideState(phase);\n }\n },\n [phase, phaseOverride]\n );\n\n const setPhaseOverride = useCallback((nextPhase: Phase) => {\n setPhaseOverrideState(nextPhase);\n setModeState(\"manual\");\n }, []);\n\n const clearOverride = useCallback(() => {\n setPhaseOverrideState(null);\n setModeState(\"time\");\n }, []);\n\n const contextValue = useMemo<CircadianContextValue>(\n () => ({\n phase,\n mode,\n tokens,\n nextChangeAt,\n setMode,\n setPhaseOverride,\n clearOverride,\n isAuto: mode !== \"manual\"\n }),\n [phase, mode, tokens, nextChangeAt, setMode, setPhaseOverride, clearOverride]\n );\n\n return <CircadianContext.Provider value={contextValue}>{children}</CircadianContext.Provider>;\n};\n\nexport const useCircadianContext = () => {\n const context = useContext(CircadianContext);\n if (!context) {\n throw new Error(\"useCircadian must be used within a CircadianProvider\");\n }\n return context;\n};\n","import { useMemo } from \"react\";\nimport { useCircadianContext } from \"./CircadianProvider\";\nimport { tokensToCssVars } from \"../core/tokens\";\n\nexport const useCircadian = () => useCircadianContext();\n\nexport const useCircadianTokens = () => {\n const { tokens } = useCircadianContext();\n const cssVars = useMemo(() => tokensToCssVars(tokens), [tokens]);\n const applyToStyle = useMemo(\n () => ({\n style: Object.fromEntries(Object.entries(cssVars).map(([key, value]) => [key, value]))\n }),\n [cssVars]\n );\n\n return { tokens, cssVars, applyToStyle };\n};\n","import { useMemo } from \"react\";\nimport { CircadianConfig } from \"../core/types\";\nimport { createInlineScript } from \"../core/script\";\n\nexport interface CircadianScriptProps {\n config?: CircadianConfig;\n nonce?: string;\n}\n\nexport const CircadianScript = ({ config, nonce }: CircadianScriptProps) => {\n const script = useMemo(() => createInlineScript(config), [config]);\n return <script nonce={nonce} dangerouslySetInnerHTML={{ __html: script }} />;\n};\n","import { cssVarMap } from \"../core/tokens\";\n\nconst toColor = (cssVar: string) => `hsl(var(${cssVar}) / <alpha-value>)`;\n\nexport const circadianTailwindPreset = () => {\n return {\n theme: {\n extend: {\n colors: {\n background: toColor(cssVarMap.bg),\n foreground: toColor(cssVarMap.fg),\n muted: toColor(cssVarMap.muted),\n \"muted-foreground\": toColor(cssVarMap.mutedFg),\n card: toColor(cssVarMap.card),\n \"card-foreground\": toColor(cssVarMap.cardFg),\n border: toColor(cssVarMap.border),\n ring: toColor(cssVarMap.ring),\n accent: toColor(cssVarMap.accent),\n \"accent-foreground\": toColor(cssVarMap.accentFg),\n destructive: toColor(cssVarMap.destructive),\n \"destructive-foreground\": toColor(cssVarMap.destructiveFg)\n }\n }\n }\n };\n};\n","import { defaultTokens, tokensToCssVars } from \"../core/tokens\";\n\ninterface TailwindPluginApi {\n addBase: (styles: Record<string, Record<string, string>>) => void;\n}\n\nexport const circadianPlugin = () => {\n return ({ addBase }: TailwindPluginApi) => {\n addBase({\n \":root\": tokensToCssVars(defaultTokens.day),\n \"[data-cui-phase='dawn']\": tokensToCssVars(defaultTokens.dawn),\n \"[data-cui-phase='day']\": tokensToCssVars(defaultTokens.day),\n \"[data-cui-phase='dusk']\": tokensToCssVars(defaultTokens.dusk),\n \"[data-cui-phase='night']\": tokensToCssVars(defaultTokens.night)\n });\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/core/schedule.ts","../src/core/sun.ts","../src/core/tokens.ts","../src/core/contrast.ts","../src/core/storage.ts","../src/core/systemPrefs.ts","../src/core/resolve.ts","../src/core/script.ts","../src/react/CircadianProvider.tsx","../src/react/hooks.ts","../src/react/CircadianScript.tsx","../src/tailwind/preset.ts","../src/tailwind/plugin.ts"],"names":["window","minutesInDay","resolvedMode","useMemo","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import { CircadianSchedule, Phase } from \"./types\";\n\nexport const defaultSchedule: CircadianSchedule = {\n dawn: { start: \"05:30\", end: \"08:30\" },\n day: { start: \"08:30\", end: \"17:30\" },\n dusk: { start: \"17:30\", end: \"21:30\" },\n night: { start: \"21:30\", end: \"05:30\" }\n};\n\nexport interface PhaseWindowMinutes {\n start: number;\n end: number;\n}\n\nexport type CircadianScheduleMinutes = Record<Phase, PhaseWindowMinutes>;\n\nconst minutesInDay = 24 * 60;\n\nexport const parseTimeToMinutes = (value: string): number => {\n const [hours, minutes] = value.split(\":\").map(Number);\n if (Number.isNaN(hours) || Number.isNaN(minutes)) {\n throw new Error(`Invalid time format: ${value}`);\n }\n return ((hours % 24) * 60 + minutes) % minutesInDay;\n};\n\nexport const normalizeSchedule = (\n schedule?: Partial<CircadianSchedule>\n): CircadianScheduleMinutes => {\n const merged: CircadianSchedule = {\n ...defaultSchedule,\n ...schedule,\n dawn: { ...defaultSchedule.dawn, ...schedule?.dawn },\n day: { ...defaultSchedule.day, ...schedule?.day },\n dusk: { ...defaultSchedule.dusk, ...schedule?.dusk },\n night: { ...defaultSchedule.night, ...schedule?.night }\n };\n\n return {\n dawn: {\n start: parseTimeToMinutes(merged.dawn.start),\n end: parseTimeToMinutes(merged.dawn.end)\n },\n day: {\n start: parseTimeToMinutes(merged.day.start),\n end: parseTimeToMinutes(merged.day.end)\n },\n dusk: {\n start: parseTimeToMinutes(merged.dusk.start),\n end: parseTimeToMinutes(merged.dusk.end)\n },\n night: {\n start: parseTimeToMinutes(merged.night.start),\n end: parseTimeToMinutes(merged.night.end)\n }\n };\n};\n\nexport const getMinutesFromDate = (date: Date): number => date.getHours() * 60 + date.getMinutes();\n\nconst isWithinRange = (minutes: number, start: number, end: number): boolean => {\n if (start === end) {\n return true;\n }\n if (start < end) {\n return minutes >= start && minutes < end;\n }\n return minutes >= start || minutes < end;\n};\n\nexport const getPhaseFromMinutes = (\n minutes: number,\n schedule: CircadianScheduleMinutes\n): Phase => {\n const phases: Phase[] = [\"dawn\", \"day\", \"dusk\", \"night\"];\n for (const phase of phases) {\n const window = schedule[phase];\n if (isWithinRange(minutes, window.start, window.end)) {\n return phase;\n }\n }\n return \"night\";\n};\n\nexport const getPhaseFromTime = (date: Date, schedule?: Partial<CircadianSchedule>): Phase => {\n const minutes = getMinutesFromDate(date);\n const normalized = normalizeSchedule(schedule);\n return getPhaseFromMinutes(minutes, normalized);\n};\n\nexport const computeNextTransition = (date: Date, schedule?: Partial<CircadianSchedule>): Date => {\n const normalized = normalizeSchedule(schedule);\n const currentPhase = getPhaseFromMinutes(getMinutesFromDate(date), normalized);\n const minutes = getMinutesFromDate(date);\n const endMinutes = normalized[currentPhase].end;\n let delta = endMinutes - minutes;\n if (delta <= 0) {\n delta += minutesInDay;\n }\n return new Date(date.getTime() + delta * 60 * 1000);\n};\n\nexport const computeNextTransitionFromMinutes = (\n date: Date,\n schedule: CircadianScheduleMinutes\n): Date => {\n const currentPhase = getPhaseFromMinutes(getMinutesFromDate(date), schedule);\n const minutes = getMinutesFromDate(date);\n const endMinutes = schedule[currentPhase].end;\n let delta = endMinutes - minutes;\n if (delta <= 0) {\n delta += minutesInDay;\n }\n return new Date(date.getTime() + delta * 60 * 1000);\n};\n","import { CircadianSchedule } from \"./types\";\nimport {\n CircadianScheduleMinutes,\n computeNextTransitionFromMinutes,\n getMinutesFromDate\n} from \"./schedule\";\nimport { Phase, SunScheduleOptions, SunTimes, SunTimesProvider } from \"./types\";\n\nconst minutesInDay = 24 * 60;\n\nexport const defaultSunSchedule: SunScheduleOptions = {\n dawnOffsetMinutesBefore: 45,\n dawnOffsetMinutesAfter: 45,\n duskOffsetMinutesBefore: 45,\n duskOffsetMinutesAfter: 45\n};\n\nconst normalizeMinutes = (value: number): number =>\n ((value % minutesInDay) + minutesInDay) % minutesInDay;\n\nexport const deriveSunSchedule = (\n date: Date,\n sunTimes: SunTimes,\n options?: Partial<SunScheduleOptions>\n): CircadianScheduleMinutes => {\n const config = { ...defaultSunSchedule, ...options };\n const sunriseMinutes = getMinutesFromDate(sunTimes.sunrise);\n const sunsetMinutes = getMinutesFromDate(sunTimes.sunset);\n\n const dawnStart = normalizeMinutes(sunriseMinutes - config.dawnOffsetMinutesBefore);\n const dawnEnd = normalizeMinutes(sunriseMinutes + config.dawnOffsetMinutesAfter);\n const duskStart = normalizeMinutes(sunsetMinutes - config.duskOffsetMinutesBefore);\n const duskEnd = normalizeMinutes(sunsetMinutes + config.duskOffsetMinutesAfter);\n\n return {\n dawn: { start: dawnStart, end: dawnEnd },\n day: { start: dawnEnd, end: duskStart },\n dusk: { start: duskStart, end: duskEnd },\n night: { start: duskEnd, end: dawnStart }\n };\n};\n\nexport const getPhaseFromSunTimes = (\n date: Date,\n sunTimes: SunTimes,\n options?: Partial<SunScheduleOptions>\n): Phase => {\n const schedule = deriveSunSchedule(date, sunTimes, options);\n const minutes = getMinutesFromDate(date);\n const phases: Phase[] = [\"dawn\", \"day\", \"dusk\", \"night\"];\n for (const phase of phases) {\n const window = schedule[phase];\n const start = window.start;\n const end = window.end;\n if (start === end) {\n return phase;\n }\n if (start < end && minutes >= start && minutes < end) {\n return phase;\n }\n if (start > end && (minutes >= start || minutes < end)) {\n return phase;\n }\n }\n return \"night\";\n};\n\nexport const computeNextSunTransition = (\n date: Date,\n sunTimes: SunTimes,\n options?: Partial<SunScheduleOptions>\n): Date => {\n const schedule = deriveSunSchedule(date, sunTimes, options);\n return computeNextTransitionFromMinutes(date, schedule);\n};\n\nexport const getScheduleFromProvider = (\n date: Date,\n provider?: SunTimesProvider,\n options?: Partial<SunScheduleOptions>\n): CircadianSchedule | null => {\n if (!provider) {\n return null;\n }\n const sunTimes = provider(date);\n if (!sunTimes) {\n return null;\n }\n const schedule = deriveSunSchedule(date, sunTimes, options);\n const toTimeString = (minutes: number): string => {\n const normalized = normalizeMinutes(minutes);\n const hours = Math.floor(normalized / 60)\n .toString()\n .padStart(2, \"0\");\n const mins = (normalized % 60).toString().padStart(2, \"0\");\n return `${hours}:${mins}`;\n };\n return {\n dawn: {\n start: toTimeString(schedule.dawn.start),\n end: toTimeString(schedule.dawn.end)\n },\n day: {\n start: toTimeString(schedule.day.start),\n end: toTimeString(schedule.day.end)\n },\n dusk: {\n start: toTimeString(schedule.dusk.start),\n end: toTimeString(schedule.dusk.end)\n },\n night: {\n start: toTimeString(schedule.night.start),\n end: toTimeString(schedule.night.end)\n }\n };\n};\n","import { CircadianTokens, ColorSchemeBias, Phase } from \"./types\";\n\nexport const defaultTokens: Record<Phase, CircadianTokens> = {\n dawn: {\n bg: \"27 60% 96%\",\n fg: \"24 18% 18%\",\n muted: \"27 40% 90%\",\n mutedFg: \"24 14% 35%\",\n card: \"0 0% 100%\",\n cardFg: \"24 18% 18%\",\n border: \"24 22% 84%\",\n ring: \"20 65% 45%\",\n accent: \"20 80% 92%\",\n accentFg: \"20 40% 30%\",\n destructive: \"0 74% 55%\",\n destructiveFg: \"0 0% 100%\"\n },\n day: {\n bg: \"0 0% 100%\",\n fg: \"222 28% 14%\",\n muted: \"210 20% 96%\",\n mutedFg: \"215 16% 35%\",\n card: \"0 0% 100%\",\n cardFg: \"222 28% 14%\",\n border: \"214 20% 90%\",\n ring: \"220 65% 45%\",\n accent: \"220 90% 95%\",\n accentFg: \"220 45% 30%\",\n destructive: \"0 72% 55%\",\n destructiveFg: \"0 0% 100%\"\n },\n dusk: {\n bg: \"240 24% 14%\",\n fg: \"30 40% 95%\",\n muted: \"245 20% 22%\",\n mutedFg: \"30 20% 80%\",\n card: \"240 22% 16%\",\n cardFg: \"30 40% 95%\",\n border: \"245 16% 30%\",\n ring: \"32 70% 60%\",\n accent: \"32 55% 25%\",\n accentFg: \"32 70% 85%\",\n destructive: \"0 70% 55%\",\n destructiveFg: \"0 0% 100%\"\n },\n night: {\n bg: \"230 22% 10%\",\n fg: \"210 40% 96%\",\n muted: \"230 18% 16%\",\n mutedFg: \"210 20% 80%\",\n card: \"230 20% 12%\",\n cardFg: \"210 40% 96%\",\n border: \"230 16% 24%\",\n ring: \"210 80% 60%\",\n accent: \"210 35% 20%\",\n accentFg: \"210 50% 90%\",\n destructive: \"0 65% 55%\",\n destructiveFg: \"0 0% 100%\"\n }\n};\n\nexport const cssVarMap: Record<keyof CircadianTokens, string> = {\n bg: \"--cui-bg\",\n fg: \"--cui-fg\",\n muted: \"--cui-muted\",\n mutedFg: \"--cui-muted-fg\",\n card: \"--cui-card\",\n cardFg: \"--cui-card-fg\",\n border: \"--cui-border\",\n ring: \"--cui-ring\",\n accent: \"--cui-accent\",\n accentFg: \"--cui-accent-fg\",\n destructive: \"--cui-destructive\",\n destructiveFg: \"--cui-destructive-fg\"\n};\n\nexport const resolveTokens = (\n phase: Phase,\n overrides?: Partial<Record<Phase, Partial<CircadianTokens>>>\n): CircadianTokens => {\n return {\n ...defaultTokens[phase],\n ...overrides?.[phase]\n };\n};\n\nexport const tokensToCssVars = (tokens: CircadianTokens): Record<string, string> => {\n const vars: Record<string, string> = {};\n for (const [key, value] of Object.entries(tokens)) {\n const cssVar = cssVarMap[key as keyof CircadianTokens];\n vars[cssVar] = value;\n }\n return vars;\n};\n\nexport const applyTokensToElement = (element: HTMLElement, tokens: CircadianTokens) => {\n const vars = tokensToCssVars(tokens);\n for (const [key, value] of Object.entries(vars)) {\n element.style.setProperty(key, value);\n }\n};\n\nexport const applyColorSchemeBias = (\n tokens: CircadianTokens,\n prefers: \"dark\" | \"light\" | \"no-preference\",\n bias: ColorSchemeBias\n): CircadianTokens => {\n if (prefers === \"no-preference\") {\n return tokens;\n }\n const delta = prefers === \"dark\" ? bias.dark : bias.light;\n const adjust = (value: string): string => {\n const [h, s, l] = value.split(\" \");\n const lightness = Math.max(0, Math.min(100, Number(l.replace(\"%\", \"\")) + delta));\n return `${h} ${s} ${lightness}%`;\n };\n\n return {\n ...tokens,\n bg: adjust(tokens.bg),\n fg: adjust(tokens.fg),\n muted: adjust(tokens.muted),\n mutedFg: adjust(tokens.mutedFg),\n card: adjust(tokens.card),\n cardFg: adjust(tokens.cardFg),\n border: adjust(tokens.border),\n ring: adjust(tokens.ring),\n accent: adjust(tokens.accent),\n accentFg: adjust(tokens.accentFg),\n destructive: adjust(tokens.destructive),\n destructiveFg: adjust(tokens.destructiveFg)\n };\n};\n","import { CircadianTokens } from \"./types\";\n\nexport interface ContrastOptions {\n minimumRatio: number;\n preferPreserveHue: boolean;\n maxIterations: number;\n}\n\nconst clamp = (value: number, min = 0, max = 100) => Math.min(max, Math.max(min, value));\n\nconst parseHsl = (value: string): [number, number, number] => {\n const [h, s, l] = value.split(\" \");\n return [Number(h), Number(s.replace(\"%\", \"\")) / 100, Number(l.replace(\"%\", \"\")) / 100];\n};\n\nconst hslToRgb = (h: number, s: number, l: number): [number, number, number] => {\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l - c / 2;\n let r = 0;\n let g = 0;\n let b = 0;\n\n if (h >= 0 && h < 60) {\n r = c;\n g = x;\n } else if (h < 120) {\n r = x;\n g = c;\n } else if (h < 180) {\n g = c;\n b = x;\n } else if (h < 240) {\n g = x;\n b = c;\n } else if (h < 300) {\n r = x;\n b = c;\n } else {\n r = c;\n b = x;\n }\n\n return [r + m, g + m, b + m];\n};\n\nconst relativeLuminance = (hsl: string): number => {\n const [h, s, l] = parseHsl(hsl);\n const [r, g, b] = hslToRgb(h, s, l).map((channel) => {\n const linear = channel <= 0.03928 ? channel / 12.92 : Math.pow((channel + 0.055) / 1.055, 2.4);\n return linear;\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\nexport const contrastRatio = (foreground: string, background: string): number => {\n const lum1 = relativeLuminance(foreground);\n const lum2 = relativeLuminance(background);\n const lighter = Math.max(lum1, lum2);\n const darker = Math.min(lum1, lum2);\n return (lighter + 0.05) / (darker + 0.05);\n};\n\nconst adjustLightness = (value: string, delta: number): string => {\n const [h, s, l] = value.split(\" \");\n const lightness = clamp(Number(l.replace(\"%\", \"\")) + delta);\n return `${h} ${s} ${lightness}%`;\n};\n\nconst ensurePairContrast = (\n background: string,\n foreground: string,\n options: ContrastOptions\n): string => {\n let current = foreground;\n if (contrastRatio(current, background) >= options.minimumRatio) {\n return current;\n }\n\n const foregroundLum = relativeLuminance(foreground);\n const backgroundLum = relativeLuminance(background);\n const moveDarker = foregroundLum < backgroundLum;\n const step = moveDarker ? -2 : 2;\n\n for (let i = 0; i < options.maxIterations; i += 1) {\n current = adjustLightness(current, step);\n if (contrastRatio(current, background) >= options.minimumRatio) {\n return current;\n }\n }\n\n return current;\n};\n\nexport const ensureContrast = (\n tokens: CircadianTokens,\n options: ContrastOptions\n): CircadianTokens => {\n return {\n ...tokens,\n fg: ensurePairContrast(tokens.bg, tokens.fg, options),\n mutedFg: ensurePairContrast(tokens.muted, tokens.mutedFg, options),\n cardFg: ensurePairContrast(tokens.card, tokens.cardFg, options),\n accentFg: ensurePairContrast(tokens.accent, tokens.accentFg, options),\n destructiveFg: ensurePairContrast(tokens.destructive, tokens.destructiveFg, options)\n };\n};\n","import { PersistedState } from \"./types\";\n\nexport const defaultStorageKey = \"cui:preferences\";\n\nconst hasStorage = (): boolean =>\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\";\n\nexport const loadPersistedState = (key: string = defaultStorageKey): PersistedState | null => {\n if (!hasStorage()) {\n return null;\n }\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) {\n return null;\n }\n return JSON.parse(raw) as PersistedState;\n } catch {\n return null;\n }\n};\n\nexport const persistState = (state: PersistedState, key: string = defaultStorageKey): void => {\n if (!hasStorage()) {\n return;\n }\n try {\n window.localStorage.setItem(key, JSON.stringify(state));\n } catch {\n // Ignore write errors\n }\n};\n\nexport const clearPersistedState = (key: string = defaultStorageKey): void => {\n if (!hasStorage()) {\n return;\n }\n try {\n window.localStorage.removeItem(key);\n } catch {\n // Ignore cleanup errors\n }\n};\n","import { SystemPreferences } from \"./types\";\n\nconst getPreference = (query: string): MediaQueryList | null => {\n if (typeof window === \"undefined\" || !window.matchMedia) {\n return null;\n }\n return window.matchMedia(query);\n};\n\nexport const getSystemPreferences = (): SystemPreferences => {\n const colorScheme = getPreference(\"(prefers-color-scheme: dark)\");\n const lightScheme = getPreference(\"(prefers-color-scheme: light)\");\n const contrastMore = getPreference(\"(prefers-contrast: more)\");\n const contrastLess = getPreference(\"(prefers-contrast: less)\");\n const reduceMotion = getPreference(\"(prefers-reduced-motion: reduce)\");\n\n return {\n prefersColorScheme: colorScheme?.matches\n ? \"dark\"\n : lightScheme?.matches\n ? \"light\"\n : \"no-preference\",\n prefersContrast: contrastMore?.matches\n ? \"more\"\n : contrastLess?.matches\n ? \"less\"\n : \"no-preference\",\n reducedMotion: Boolean(reduceMotion?.matches)\n };\n};\n\nexport const subscribeSystemPreferences = (\n handler: (prefs: SystemPreferences) => void\n): (() => void) => {\n if (typeof window === \"undefined\" || !window.matchMedia) {\n return () => undefined;\n }\n\n const notify = () => handler(getSystemPreferences());\n const mediaQueries = [\n \"(prefers-color-scheme: dark)\",\n \"(prefers-color-scheme: light)\",\n \"(prefers-contrast: more)\",\n \"(prefers-contrast: less)\",\n \"(prefers-reduced-motion: reduce)\"\n ];\n\n const listeners = mediaQueries.map((query) => {\n const list = window.matchMedia(query);\n const listener = () => notify();\n if (list.addEventListener) {\n list.addEventListener(\"change\", listener);\n } else {\n list.addListener(listener);\n }\n return { list, listener };\n });\n\n return () => {\n for (const { list, listener } of listeners) {\n if (list.removeEventListener) {\n list.removeEventListener(\"change\", listener);\n } else {\n list.removeListener(listener);\n }\n }\n };\n};\n","import { AccessibilityOptions, CircadianConfig, ScheduleMode, SystemPreferences } from \"./types\";\n\nexport const defaultAccessibility: AccessibilityOptions = {\n enforceContrast: true,\n minimumRatio: 4.5,\n largeTextRatio: 3,\n preferPreserveHue: true,\n maxIterations: 24\n};\n\nexport const defaultSystemOptions = {\n respectColorScheme: true,\n respectContrastPreference: true,\n respectReducedMotion: true\n};\n\nexport const defaultColorSchemeBias = {\n dark: -8,\n light: 8\n};\n\nexport const defaultTransition = {\n enabled: false,\n durationMs: 200\n};\n\nexport const resolveMode = (\n userMode: ScheduleMode | undefined,\n system: SystemPreferences,\n config?: CircadianConfig\n): ScheduleMode => {\n return userMode ?? config?.mode ?? \"auto\";\n};\n\nexport const resolveAccessibility = (\n system: SystemPreferences,\n config?: CircadianConfig\n): AccessibilityOptions => {\n const base = { ...defaultAccessibility, ...config?.accessibility };\n if (config?.system?.respectContrastPreference !== false) {\n if (system.prefersContrast === \"more\") {\n base.minimumRatio = Math.max(base.minimumRatio, 7);\n }\n if (system.prefersContrast === \"less\") {\n base.minimumRatio = Math.min(base.minimumRatio, 3);\n }\n }\n return base;\n};\n","import { CircadianConfig, CircadianSchedule, Phase, ScheduleMode } from \"./types\";\nimport { defaultSchedule } from \"./schedule\";\nimport { defaultStorageKey } from \"./storage\";\nimport { defaultTokens, tokensToCssVars } from \"./tokens\";\n\nconst serialize = (value: unknown): string => JSON.stringify(value);\n\nconst getMergedSchedule = (schedule?: Partial<CircadianSchedule>): CircadianSchedule => ({\n ...defaultSchedule,\n ...schedule,\n dawn: { ...defaultSchedule.dawn, ...schedule?.dawn },\n day: { ...defaultSchedule.day, ...schedule?.day },\n dusk: { ...defaultSchedule.dusk, ...schedule?.dusk },\n night: { ...defaultSchedule.night, ...schedule?.night }\n});\n\nconst getMode = (mode?: ScheduleMode): ScheduleMode => mode ?? \"auto\";\n\nexport const createInlineScript = (config?: CircadianConfig): string => {\n const schedule = getMergedSchedule(config?.schedule);\n const storageKey = config?.storageKey ?? defaultStorageKey;\n const persist = config?.persist !== false;\n const initialPhase = config?.initialPhase ?? null;\n const setAttributeOn = config?.setAttributeOn ?? \"html\";\n const tokens = {\n dawn: tokensToCssVars({\n ...defaultTokens.dawn,\n ...config?.tokens?.dawn\n }),\n day: tokensToCssVars({\n ...defaultTokens.day,\n ...config?.tokens?.day\n }),\n dusk: tokensToCssVars({\n ...defaultTokens.dusk,\n ...config?.tokens?.dusk\n }),\n night: tokensToCssVars({\n ...defaultTokens.night,\n ...config?.tokens?.night\n })\n };\n\n return `(() => {\n try {\n const schedule = ${serialize(schedule)};\n const tokens = ${serialize(tokens)};\n const storageKey = ${serialize(storageKey)};\n const persist = ${serialize(persist)};\n const fallbackMode = ${serialize(getMode(config?.mode))};\n const initialPhase = ${serialize(initialPhase)};\n const setAttributeOn = ${serialize(setAttributeOn)};\n const now = new Date();\n const minutes = now.getHours() * 60 + now.getMinutes();\n\n const isWithin = (value, start, end) => {\n if (start === end) return true;\n if (start < end) return value >= start && value < end;\n return value >= start || value < end;\n };\n\n const parse = (time) => {\n const [h, m] = time.split(\":\").map(Number);\n return ((h % 24) * 60 + m) % 1440;\n };\n\n const normalized = {\n dawn: { start: parse(schedule.dawn.start), end: parse(schedule.dawn.end) },\n day: { start: parse(schedule.day.start), end: parse(schedule.day.end) },\n dusk: { start: parse(schedule.dusk.start), end: parse(schedule.dusk.end) },\n night: { start: parse(schedule.night.start), end: parse(schedule.night.end) }\n };\n\n const order = [\"dawn\", \"day\", \"dusk\", \"night\"];\n let phase = initialPhase || \"night\";\n if (!initialPhase) {\n for (const key of order) {\n const window = normalized[key];\n if (isWithin(minutes, window.start, window.end)) {\n phase = key;\n break;\n }\n }\n }\n\n let mode = fallbackMode;\n const persisted = persist && window.localStorage ? window.localStorage.getItem(storageKey) : null;\n if (persisted) {\n try {\n const parsed = JSON.parse(persisted);\n if (parsed.mode) mode = parsed.mode;\n if (parsed.phase) phase = parsed.phase;\n } catch {\n // ignore\n }\n }\n\n const root =\n setAttributeOn === \"body\" && document.body ? document.body : document.documentElement;\n root.setAttribute(\"data-cui-phase\", phase);\n const vars = tokens[phase] || tokens.night;\n for (const key in vars) {\n root.style.setProperty(key, vars[key]);\n }\n } catch {\n // ignore\n }\n})();`;\n};\n\nexport const resolveInitialPhase = (date: Date, schedule?: Partial<CircadianSchedule>): Phase => {\n const merged = getMergedSchedule(schedule);\n const minutes = date.getHours() * 60 + date.getMinutes();\n const isWithin = (value: number, start: number, end: number) => {\n if (start === end) return true;\n if (start < end) return value >= start && value < end;\n return value >= start || value < end;\n };\n const parse = (time: string) => {\n const [h, m] = time.split(\":\").map(Number);\n return ((h % 24) * 60 + m) % 1440;\n };\n const order: Phase[] = [\"dawn\", \"day\", \"dusk\", \"night\"];\n for (const phase of order) {\n const window = merged[phase];\n if (isWithin(minutes, parse(window.start), parse(window.end))) {\n return phase;\n }\n }\n return \"night\";\n};\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode\n} from \"react\";\nimport {\n CircadianConfig,\n CircadianState,\n Phase,\n ScheduleMode,\n SunTimes,\n SystemPreferences\n} from \"../core/types\";\nimport { computeNextTransition, getPhaseFromTime } from \"../core/schedule\";\nimport { computeNextSunTransition, getPhaseFromSunTimes } from \"../core/sun\";\nimport { applyColorSchemeBias, applyTokensToElement, resolveTokens } from \"../core/tokens\";\nimport { ensureContrast } from \"../core/contrast\";\nimport { loadPersistedState, persistState } from \"../core/storage\";\nimport { getSystemPreferences, subscribeSystemPreferences } from \"../core/systemPrefs\";\nimport {\n defaultColorSchemeBias,\n defaultSystemOptions,\n defaultTransition,\n resolveAccessibility,\n resolveMode\n} from \"../core/resolve\";\n\nexport interface CircadianContextValue extends CircadianState {\n setMode: (mode: ScheduleMode) => void;\n setPhaseOverride: (phase: Phase) => void;\n clearOverride: () => void;\n isAuto: boolean;\n resolvedMode: ScheduleMode;\n}\n\nconst CircadianContext = createContext<CircadianContextValue | null>(null);\n\nconst getRootElement = (target: CircadianConfig[\"setAttributeOn\"]): HTMLElement => {\n if (typeof document === \"undefined\") {\n return {} as HTMLElement;\n }\n return target === \"body\" ? document.body : document.documentElement;\n};\n\nconst getInitialSystemPreferences = (): SystemPreferences => {\n if (typeof window === \"undefined\") {\n return {\n prefersColorScheme: \"no-preference\",\n prefersContrast: \"no-preference\",\n reducedMotion: false\n };\n }\n return getSystemPreferences();\n};\n\nconst computePhase = (\n date: Date,\n mode: ScheduleMode,\n config: CircadianConfig,\n phaseOverride: Phase | null,\n sunTimes: SunTimes | null\n): Phase => {\n if (mode === \"manual\" && phaseOverride) {\n return phaseOverride;\n }\n if (mode === \"sun\" && sunTimes) {\n return getPhaseFromSunTimes(date, sunTimes, config.sunSchedule);\n }\n return getPhaseFromTime(date, config.schedule);\n};\n\nconst computeNextChange = (\n date: Date,\n mode: ScheduleMode,\n config: CircadianConfig,\n sunTimes: SunTimes | null\n): Date | null => {\n if (mode === \"manual\") {\n return null;\n }\n if (mode === \"sun\" && sunTimes) {\n return computeNextSunTransition(date, sunTimes, config.sunSchedule);\n }\n return computeNextTransition(date, config.schedule);\n};\n\nexport interface CircadianProviderProps {\n config?: CircadianConfig;\n children: ReactNode;\n}\n\nexport const CircadianProvider = ({ config = {}, children }: CircadianProviderProps) => {\n const storageKey = config.storageKey;\n const shouldPersist = config.persist !== false;\n const [systemPrefs, setSystemPrefs] = useState<SystemPreferences>(getInitialSystemPreferences);\n\n const initialPersisted =\n typeof window !== \"undefined\" && shouldPersist ? loadPersistedState(storageKey) : null;\n\n const [mode, setModeState] = useState<ScheduleMode>(\n initialPersisted?.mode ?? config.mode ?? \"auto\"\n );\n const [phaseOverride, setPhaseOverrideState] = useState<Phase | null>(\n initialPersisted?.phase ?? null\n );\n\n const [phase, setPhase] = useState<Phase>(() =>\n config.initialPhase ?? computePhase(new Date(), mode, config, phaseOverride, null)\n );\n\n const [nextChangeAt, setNextChangeAt] = useState<Date | null>(() =>\n computeNextChange(new Date(), mode, config, null)\n );\n const [resolvedMode, setResolvedMode] = useState<ScheduleMode>(mode);\n\n const timerRef = useRef<number | null>(null);\n\n const accessibility = useMemo(\n () => resolveAccessibility(systemPrefs, config),\n [systemPrefs, config]\n );\n\n const transition = { ...defaultTransition, ...config.transition };\n const systemOptions = { ...defaultSystemOptions, ...config.system };\n const colorBias = { ...defaultColorSchemeBias, ...config.colorSchemeBias };\n\n const tokens = useMemo(() => {\n let resolved = resolveTokens(phase, config.tokens);\n if (systemOptions.respectColorScheme) {\n resolved = applyColorSchemeBias(resolved, systemPrefs.prefersColorScheme, colorBias);\n }\n if (accessibility.enforceContrast) {\n resolved = ensureContrast(resolved, accessibility);\n }\n return resolved;\n }, [\n phase,\n config.tokens,\n systemPrefs.prefersColorScheme,\n accessibility,\n systemOptions.respectColorScheme,\n colorBias\n ]);\n\n const resolveModeWithSun = useCallback(\n (date: Date): { resolvedMode: ScheduleMode; sunTimes: SunTimes | null } => {\n const desiredMode = resolveMode(mode, systemPrefs, config);\n if (desiredMode === \"auto\") {\n if (config.sunTimesProvider) {\n const sunTimes = config.sunTimesProvider(date);\n if (sunTimes) {\n return { resolvedMode: \"sun\", sunTimes };\n }\n }\n return { resolvedMode: \"time\", sunTimes: null };\n }\n if (desiredMode === \"sun\") {\n const sunTimes = config.sunTimesProvider?.(date) ?? null;\n if (!sunTimes) {\n return { resolvedMode: \"time\", sunTimes: null };\n }\n return { resolvedMode: \"sun\", sunTimes };\n }\n return { resolvedMode: desiredMode, sunTimes: null };\n },\n [mode, systemPrefs, config]\n );\n\n const updatePhase = useCallback(() => {\n const now = new Date();\n const { resolvedMode, sunTimes } = resolveModeWithSun(now);\n const nextPhase = computePhase(now, resolvedMode, config, phaseOverride, sunTimes);\n setResolvedMode(resolvedMode);\n setPhase(nextPhase);\n setNextChangeAt(computeNextChange(now, resolvedMode, config, sunTimes));\n }, [config, phaseOverride, resolveModeWithSun]);\n\n useEffect(() => {\n updatePhase();\n }, [updatePhase]);\n\n useEffect(() => {\n if (resolvedMode === \"manual\") {\n return;\n }\n if (timerRef.current) {\n window.clearTimeout(timerRef.current);\n }\n if (!nextChangeAt) {\n return;\n }\n const delay = Math.max(0, nextChangeAt.getTime() - Date.now() + 500);\n timerRef.current = window.setTimeout(() => {\n updatePhase();\n }, delay);\n return () => {\n if (timerRef.current) {\n window.clearTimeout(timerRef.current);\n }\n };\n }, [resolvedMode, nextChangeAt, updatePhase]);\n\n useEffect(() => {\n const root = getRootElement(config.setAttributeOn);\n if (!root || !root.style) {\n return;\n }\n root.setAttribute(\"data-cui-phase\", phase);\n const allowMotion = !systemPrefs.reducedMotion || !systemOptions.respectReducedMotion;\n if (transition.enabled && allowMotion) {\n root.style.transition = `background-color ${transition.durationMs}ms ease, color ${transition.durationMs}ms ease`;\n } else {\n root.style.transition = \"\";\n }\n applyTokensToElement(root, tokens);\n }, [\n phase,\n tokens,\n transition,\n systemPrefs.reducedMotion,\n systemOptions.respectReducedMotion,\n config.setAttributeOn\n ]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n return subscribeSystemPreferences(setSystemPrefs);\n }, []);\n\n useEffect(() => {\n if (!shouldPersist) {\n return;\n }\n persistState(\n {\n mode,\n phase: phaseOverride\n },\n storageKey\n );\n }, [mode, phaseOverride, shouldPersist, storageKey]);\n\n const setMode = useCallback(\n (nextMode: ScheduleMode) => {\n setModeState(nextMode);\n if (nextMode === \"manual\" && !phaseOverride) {\n setPhaseOverrideState(phase);\n }\n },\n [phase, phaseOverride]\n );\n\n const setPhaseOverride = useCallback((nextPhase: Phase) => {\n setPhaseOverrideState(nextPhase);\n setModeState(\"manual\");\n }, []);\n\n const clearOverride = useCallback(() => {\n setPhaseOverrideState(null);\n setModeState(config.mode ?? \"auto\");\n }, [config.mode]);\n\n const contextValue = useMemo<CircadianContextValue>(\n () => ({\n phase,\n mode,\n tokens,\n nextChangeAt,\n setMode,\n setPhaseOverride,\n clearOverride,\n isAuto: mode !== \"manual\",\n resolvedMode\n }),\n [phase, mode, tokens, nextChangeAt, setMode, setPhaseOverride, clearOverride, resolvedMode]\n );\n\n return <CircadianContext.Provider value={contextValue}>{children}</CircadianContext.Provider>;\n};\n\nexport const useCircadianContext = () => {\n const context = useContext(CircadianContext);\n if (!context) {\n throw new Error(\"useCircadian must be used within a CircadianProvider\");\n }\n return context;\n};\n","import { useMemo } from \"react\";\nimport { useCircadianContext } from \"./CircadianProvider\";\nimport { tokensToCssVars } from \"../core/tokens\";\n\nexport const useCircadian = () => useCircadianContext();\n\nexport const useCircadianTokens = () => {\n const { tokens } = useCircadianContext();\n const cssVars = useMemo(() => tokensToCssVars(tokens), [tokens]);\n const applyToStyle = useMemo(\n () => ({\n style: Object.fromEntries(Object.entries(cssVars).map(([key, value]) => [key, value]))\n }),\n [cssVars]\n );\n\n return { tokens, cssVars, applyToStyle };\n};\n","import { useMemo } from \"react\";\nimport { CircadianConfig } from \"../core/types\";\nimport { createInlineScript } from \"../core/script\";\n\nexport interface CircadianScriptProps {\n config?: CircadianConfig;\n nonce?: string;\n}\n\nexport const CircadianScript = ({ config, nonce }: CircadianScriptProps) => {\n const script = useMemo(() => createInlineScript(config), [config]);\n return <script nonce={nonce} dangerouslySetInnerHTML={{ __html: script }} />;\n};\n","import { cssVarMap } from \"../core/tokens\";\n\nconst toColor = (cssVar: string) => `hsl(var(${cssVar}) / <alpha-value>)`;\n\nexport const circadianTailwindPreset = () => {\n return {\n theme: {\n extend: {\n colors: {\n background: toColor(cssVarMap.bg),\n foreground: toColor(cssVarMap.fg),\n muted: toColor(cssVarMap.muted),\n \"muted-foreground\": toColor(cssVarMap.mutedFg),\n card: toColor(cssVarMap.card),\n \"card-foreground\": toColor(cssVarMap.cardFg),\n border: toColor(cssVarMap.border),\n ring: toColor(cssVarMap.ring),\n accent: toColor(cssVarMap.accent),\n \"accent-foreground\": toColor(cssVarMap.accentFg),\n destructive: toColor(cssVarMap.destructive),\n \"destructive-foreground\": toColor(cssVarMap.destructiveFg)\n }\n }\n }\n };\n};\n","import { defaultTokens, tokensToCssVars } from \"../core/tokens\";\n\ninterface TailwindPluginApi {\n addBase: (styles: Record<string, Record<string, string>>) => void;\n}\n\nexport const circadianPlugin = () => {\n return ({ addBase }: TailwindPluginApi) => {\n addBase({\n \":root\": tokensToCssVars(defaultTokens.day),\n \"[data-cui-phase='dawn']\": tokensToCssVars(defaultTokens.dawn),\n \"[data-cui-phase='day']\": tokensToCssVars(defaultTokens.day),\n \"[data-cui-phase='dusk']\": tokensToCssVars(defaultTokens.dusk),\n \"[data-cui-phase='night']\": tokensToCssVars(defaultTokens.night)\n });\n };\n};\n"]}
package/dist/server.cjs CHANGED
@@ -103,11 +103,13 @@ var getMergedSchedule = (schedule) => ({
103
103
  dusk: { ...defaultSchedule.dusk, ...schedule?.dusk },
104
104
  night: { ...defaultSchedule.night, ...schedule?.night }
105
105
  });
106
- var getMode = (mode) => mode ?? "time";
106
+ var getMode = (mode) => mode ?? "auto";
107
107
  var createInlineScript = (config) => {
108
108
  const schedule = getMergedSchedule(config?.schedule);
109
109
  const storageKey = config?.storageKey ?? defaultStorageKey;
110
110
  const persist = config?.persist !== false;
111
+ const initialPhase = config?.initialPhase ?? null;
112
+ const setAttributeOn = config?.setAttributeOn ?? "html";
111
113
  const tokens = {
112
114
  dawn: tokensToCssVars({
113
115
  ...defaultTokens.dawn,
@@ -133,6 +135,8 @@ var createInlineScript = (config) => {
133
135
  const storageKey = ${serialize(storageKey)};
134
136
  const persist = ${serialize(persist)};
135
137
  const fallbackMode = ${serialize(getMode(config?.mode))};
138
+ const initialPhase = ${serialize(initialPhase)};
139
+ const setAttributeOn = ${serialize(setAttributeOn)};
136
140
  const now = new Date();
137
141
  const minutes = now.getHours() * 60 + now.getMinutes();
138
142
 
@@ -155,12 +159,14 @@ var createInlineScript = (config) => {
155
159
  };
156
160
 
157
161
  const order = ["dawn", "day", "dusk", "night"];
158
- let phase = "night";
159
- for (const key of order) {
160
- const window = normalized[key];
161
- if (isWithin(minutes, window.start, window.end)) {
162
- phase = key;
163
- break;
162
+ let phase = initialPhase || "night";
163
+ if (!initialPhase) {
164
+ for (const key of order) {
165
+ const window = normalized[key];
166
+ if (isWithin(minutes, window.start, window.end)) {
167
+ phase = key;
168
+ break;
169
+ }
164
170
  }
165
171
  }
166
172
 
@@ -176,7 +182,8 @@ var createInlineScript = (config) => {
176
182
  }
177
183
  }
178
184
 
179
- const root = document.documentElement;
185
+ const root =
186
+ setAttributeOn === "body" && document.body ? document.body : document.documentElement;
180
187
  root.setAttribute("data-cui-phase", phase);
181
188
  const vars = tokens[phase] || tokens.night;
182
189
  for (const key in vars) {