resonare 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -113,7 +113,7 @@ const config = {
113
113
  'standard',
114
114
  'high',
115
115
  ],
116
- defaultOption: 'standard',
116
+ initialValue: 'standard',
117
117
  }
118
118
  } as const satisfies ThemeConfig
119
119
 
@@ -238,7 +238,6 @@ Ensure that you have initialized Resonare as per instructions under [Basic Usage
238
238
 
239
239
  ```tsx
240
240
  import * as React from 'react'
241
- import { getThemesAndOptions } from 'resonare'
242
241
  import { useResonare } from 'resonare/react'
243
242
 
244
243
  function ThemeSelect() {
@@ -246,7 +245,18 @@ function ThemeSelect() {
246
245
  window.resonare.getThemeStore(),
247
246
  )
248
247
 
249
- return getThemesAndOptions(config).map(([theme, options]) => (
248
+ const themesAndOptions = Object.entries(config).map(
249
+ ([themeKey, { options }]) => {
250
+ return [
251
+ themeKey,
252
+ options.map((option) =>
253
+ typeof option === 'string' ? option : option.value,
254
+ ),
255
+ ] as [keyof typeof config, Array<string>]
256
+ },
257
+ )
258
+
259
+ return themesAndOptions.map(([theme, options]) => (
250
260
  <div key={theme}>
251
261
  <label htmlFor={theme}>{theme}</label>
252
262
  <select
package/dist/index.d.ts CHANGED
@@ -17,23 +17,35 @@ declare const localStorageAdapter: StorageAdapterCreator<{
17
17
  declare const memoryStorageAdapter: StorageAdapterCreator<never>;
18
18
  //#endregion
19
19
  //#region src/index.d.ts
20
- type ThemeOption = {
21
- value: string;
22
- media?: [string, string, string];
20
+ type ThemeOptionValue = string | number | boolean;
21
+ type ThemeOption<T extends ThemeOptionValue = string> = {
22
+ value: T;
23
+ media?: [string, T, T];
23
24
  };
24
- type ThemeConfig = Record<string, {
25
- options: ReadonlyArray<string | ThemeOption>;
26
- defaultOption?: string;
27
- }>;
28
- type Themes<T extends ThemeConfig> = { [K in keyof T]: T[K]['options'] extends ReadonlyArray<infer U> ? U extends string ? U : U extends ThemeOption ? U['value'] : never : never };
25
+ type ThemeOptions<T extends ThemeOptionValue = string> = {
26
+ options: [T | ThemeOption<T>, T | ThemeOption<T>, ...ReadonlyArray<T | ThemeOption<T>>];
27
+ initialValue?: T;
28
+ } | {
29
+ initialValue: T;
30
+ };
31
+ type ThemeConfig = Record<string, ThemeOptions<string> | ThemeOptions<number> | ThemeOptions<boolean>>;
32
+ type Themes<T extends ThemeConfig> = { [K in keyof T]: T[K] extends {
33
+ options: ReadonlyArray<infer U>;
34
+ } ? U extends ThemeOption ? U['value'] : U : T[K] extends {
35
+ initialValue: infer U;
36
+ } ? U extends string ? string : U extends number ? number : boolean : never };
29
37
  type Listener<T extends ThemeConfig> = (value: {
30
38
  themes: Themes<T>;
31
39
  resolvedThemes: Themes<T>;
32
40
  }) => void;
33
- type ThemeKeysWithSystemOption<T extends ThemeConfig> = { [K in keyof T]: T[K]['options'] extends ReadonlyArray<infer U> ? U extends {
34
- media: [string, string, string];
41
+ type ThemeKeysWithSystemOption<T extends ThemeConfig> = { [K in keyof T]: T[K] extends {
42
+ options: ReadonlyArray<infer U>;
43
+ } ? U extends {
44
+ media: ReadonlyArray<unknown>;
35
45
  } ? K : never : never }[keyof T];
36
- type NonSystemOptionValues<T extends ThemeConfig, K$1 extends keyof T> = T[K$1]['options'] extends ReadonlyArray<infer U> ? U extends string ? U : U extends ThemeOption ? U extends {
46
+ type NonSystemOptionValues<T extends ThemeConfig, K extends keyof T> = T[K] extends {
47
+ options: ReadonlyArray<infer U>;
48
+ } ? U extends string | number | boolean ? U : U extends ThemeOption ? U extends {
37
49
  media: [string, string, string];
38
50
  } ? never : U['value'] : never : never;
39
51
  type SystemOptions<T extends ThemeConfig> = { [K in ThemeKeysWithSystemOption<T>]?: [NonSystemOptionValues<T, K>, NonSystemOptionValues<T, K>] };
@@ -62,7 +74,7 @@ declare class ThemeStore<T extends ThemeConfig> {
62
74
  getThemes: () => Themes<T>;
63
75
  getResolvedThemes: () => Themes<T>;
64
76
  setThemes: (themes: Partial<Themes<T>> | ((currentThemes: Themes<T>) => Partial<Themes<T>>)) => Promise<void>;
65
- updateSystemOption: <K$1 extends ThemeKeysWithSystemOption<T>>(themeKey: K$1, [ifMatch, ifNotMatch]: [NonSystemOptionValues<T, K$1>, NonSystemOptionValues<T, K$1>]) => void;
77
+ updateSystemOption: <K extends ThemeKeysWithSystemOption<T>>(themeKey: K, [ifMatch, ifNotMatch]: [NonSystemOptionValues<T, K>, NonSystemOptionValues<T, K>]) => void;
66
78
  getStateToPersist: () => PersistedState<T>;
67
79
  restore: () => Promise<void>;
68
80
  subscribe: (callback: Listener<T>, {
@@ -78,4 +90,5 @@ declare const getThemeStore: <T extends keyof ThemeStoreRegistry>(key?: T | unde
78
90
  declare const destroyThemeStore: <T extends keyof ThemeStoreRegistry>(key?: T | undefined) => void;
79
91
  interface ThemeStoreRegistry {}
80
92
  //#endregion
81
- export { StorageAdapter, StorageAdapterCreate, StorageAdapterCreator, ThemeAndOptions, ThemeConfig, type ThemeStore, ThemeStoreOptions, ThemeStoreRegistry, Themes, createThemeStore, destroyThemeStore, getDefaultThemes, getThemeStore, getThemesAndOptions, localStorageAdapter, memoryStorageAdapter };
93
+ export { StorageAdapter, StorageAdapterCreate, StorageAdapterCreator, ThemeAndOptions, ThemeConfig, type ThemeStore, ThemeStoreOptions, ThemeStoreRegistry, Themes, createThemeStore, destroyThemeStore, getDefaultThemes, getThemeStore, getThemesAndOptions, localStorageAdapter, memoryStorageAdapter };
94
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/storage.ts","../src/index.ts"],"mappings":";KAEY,cAAA;EACX,OAAA,GAAU,GAAA,6BAAgC,OAAA;EAC1C,OAAA,GAAU,GAAA,UAAa,KAAA,oBAAyB,OAAA;EAEhD,SAAA,IAAa,GAAA,UAAa,KAAA;EAC1B,KAAA,IAAS,EAAA,GAAK,GAAA,iBAAoB,KAAA;AAAA;AAAA,KAGvB,oBAAA;EACX;AAAA;EAEA,eAAA,EAAiB,eAAA;AAAA,MACZ,cAAA;AAAA,KAEM,qBAAA,aACX,OAAA,GAAU,OAAA,KACN,oBAAA;AAAA,cAEQ,mBAAA,EAAqB,qBAAA;EACjC,WAAA;AAAA;AAAA,cA0CY,oBAAA,EAAsB,qBAAA;;;KCxD9B,gBAAA;AAAA,KAEA,WAAA,WAAsB,gBAAA;EAC1B,KAAA,EAAO,CAAA;EACP,KAAA,YAAiB,CAAA,EAAG,CAAA;AAAA;AAAA,KAGhB,YAAA,WAAuB,gBAAA;EAEzB,OAAA,GACC,CAAA,GAAI,WAAA,CAAY,CAAA,GAChB,CAAA,GAAI,WAAA,CAAY,CAAA,MACb,aAAA,CAAc,CAAA,GAAI,WAAA,CAAY,CAAA;EAElC,YAAA,GAAe,CAAA;AAAA;EAGf,YAAA,EAAc,CAAA;AAAA;AAAA,KAGL,WAAA,GAAc,MAAA,SAEzB,YAAA,WAAuB,YAAA,WAAuB,YAAA;AAAA,KAQnC,MAAA,WAAiB,WAAA,kBAChB,CAAA,GAAI,CAAA,CAAE,CAAA;EAAa,OAAA,EAAS,aAAA;AAAA,IACrC,CAAA,SAAU,WAAA,GACT,CAAA,YACA,CAAA,GACD,CAAA,CAAE,CAAA;EAAa,YAAA;AAAA,IACd,CAAA,2BAEC,CAAA;AAAA,KAMD,QAAA,WAAmB,WAAA,KAAgB,KAAA;EACvC,MAAA,EAAQ,MAAA,CAAO,CAAA;EACf,cAAA,EAAgB,MAAA,CAAO,CAAA;AAAA;AAAA,KAGnB,yBAAA,WAAoC,WAAA,kBAC5B,CAAA,GAAI,CAAA,CAAE,CAAA;EAAa,OAAA,EAAS,aAAA;AAAA,IACrC,CAAA;EAAY,KAAA,EAAO,aAAA;AAAA,IAClB,CAAA,yBAGG,CAAA;AAAA,KAEH,qBAAA,WACM,WAAA,kBACM,CAAA,IACb,CAAA,CAAE,CAAA;EAAa,OAAA,EAAS,aAAA;AAAA,IACzB,CAAA,qCACC,CAAA,GACA,CAAA,SAAU,WAAA,GACT,CAAA;EAAY,KAAA;AAAA,YAEX,CAAA;AAAA,KAID,aAAA,WAAwB,WAAA,YACtB,yBAAA,CAA0B,CAAA,MAC/B,qBAAA,CAAsB,CAAA,EAAG,CAAA,GACzB,qBAAA,CAAsB,CAAA,EAAG,CAAA;AAAA,KAItB,cAAA,WAAyB,WAAA;EAC7B,OAAA;EACA,MAAA,EAAQ,OAAA,CAAQ,MAAA,CAAO,CAAA;EACvB,aAAA,EAAe,aAAA,CAAc,CAAA;AAAA;AAAA,KAGlB,iBAAA,WAA4B,WAAA;EACvC,GAAA;EACA,MAAA,EAAQ,CAAA;EACR,YAAA,GAAe,OAAA,CAAQ,cAAA,CAAe,CAAA;EACtC,OAAA,GAAU,oBAAA;AAAA;AAAA,KAGC,eAAA,WAA0B,WAAA,IAAe,KAAA,eAEvC,CAAA,IACX,CAAA,EACA,KAAA,CACC,CAAA,CAAE,CAAA,qBAAsB,aAAA,YACrB,CAAA,kBACC,CAAA,GACA,CAAA,SAAU,WAAA,GACT,CAAA,oCAKA,CAAA;AAAA,iBAGO,mBAAA,WAA8B,WAAA,CAAA,CAAa,MAAA,EAAQ,CAAA,GAQ5D,eAAA,CAAgB,CAAA;AAAA,iBAGP,gBAAA,WAA2B,WAAA,CAAA,CAAa,MAAA,EAAQ,CAAA,GAW1D,MAAA,CAAO,CAAA;AAAA,cASP,UAAA,WAAqB,WAAA;EAAA;;IAmBzB,GAAA;IACA,MAAA;IACA,YAAA;IACA;EAAA,GACE,iBAAA,CAAkB,CAAA;EA4CrB,SAAA,QAAgB,MAAA,CAAO,CAAA;EAIvB,iBAAA,QAAwB,MAAA,CAAO,CAAA;EAI/B,SAAA,GACC,MAAA,EACG,OAAA,CAAQ,MAAA,CAAO,CAAA,OACb,aAAA,EAAe,MAAA,CAAO,CAAA,MAAO,OAAA,CAAQ,MAAA,CAAO,CAAA,QAC/C,OAAA;EAaH,kBAAA,aAAgC,yBAAA,CAA0B,CAAA,GACzD,QAAA,EAAU,CAAA,GACV,OAAA,EAAA,UAAA,IACC,qBAAA,CAAsB,CAAA,EAAG,CAAA,GACzB,qBAAA,CAAsB,CAAA,EAAG,CAAA;EAQ3B,iBAAA,QAAwB,cAAA,CAAe,CAAA;EAQvC,OAAA,QAAoB,OAAA;EA4BpB,SAAA,GACC,QAAA,EAAU,QAAA,CAAS,CAAA;IACnB;EAAA;IAAyB,SAAA;EAAA;EAgB1B,IAAA;EAkBA,UAAA;AAAA;AAAA,cAqHY,gBAAA,aAzCQ,WAAA,EAAW,OAAA,EAAA,iBAAA,CAAA,CAAA,MAAA,UAAA,CAAA,CAAA;AAAA,cA0CnB,aAAA,mBA3BW,kBAAA,EAAkB,GAAA,GAAA,CAAA,iBAAA,kBAAA,CAAA,CAAA;AAAA,cA4B7B,iBAAA,mBAhBe,kBAAA,EAAkB,GAAA,GAAA,CAAA;AAAA,UAoB7B,kBAAA"}
package/dist/index.js CHANGED
@@ -63,8 +63,8 @@ function getThemesAndOptions(config) {
63
63
  });
64
64
  }
65
65
  function getDefaultThemes(config) {
66
- return Object.fromEntries(Object.entries(config).map(([themeKey, { options, defaultOption }]) => {
67
- return [themeKey, defaultOption ?? (typeof options[0] === "string" ? options[0] : options[0].value)];
66
+ return Object.fromEntries(Object.entries(config).map(([themeKey, themeOptions]) => {
67
+ return [themeKey, themeOptions.initialValue ?? (typeof themeOptions.options[0] === "object" ? themeOptions.options[0].value : themeOptions.options[0])];
68
68
  }));
69
69
  }
70
70
  const isClient = !!(typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined");
@@ -80,14 +80,13 @@ var ThemeStore = class {
80
80
  constructor({ key = name, config, initialState = {}, storage = localStorageAdapter() }) {
81
81
  const keyedConfig = {};
82
82
  const systemOptions = { ...initialState.systemOptions };
83
- Object.entries(config).forEach(([themeKey, { options }]) => {
84
- keyedConfig[themeKey] = keyedConfig[themeKey] || {};
85
- options.forEach((option) => {
86
- if (typeof option === "string") keyedConfig[themeKey][option] = { value: option };
87
- else {
83
+ Object.entries(config).forEach(([themeKey, themeOptions]) => {
84
+ keyedConfig[themeKey] = {};
85
+ if ("options" in themeOptions) themeOptions.options.forEach((option) => {
86
+ if (typeof option === "object") {
88
87
  if (option.media && !Object.hasOwn(systemOptions, themeKey)) systemOptions[themeKey] = [option.media[1], option.media[2]];
89
- keyedConfig[themeKey][option.value] = option;
90
- }
88
+ keyedConfig[themeKey][String(option.value)] = option;
89
+ } else keyedConfig[themeKey][String(option)] = { value: option };
91
90
  });
92
91
  });
93
92
  this.#options = {
@@ -182,11 +181,11 @@ var ThemeStore = class {
182
181
  };
183
182
  #resolveThemes = () => {
184
183
  return Object.fromEntries(Object.entries(this.#currentThemes).map(([themeKey, optionKey]) => {
185
- const option = this.#options.config[themeKey][optionKey];
186
- return [themeKey, this.#resolveThemeOption({
184
+ const option = this.#options.config[themeKey]?.[optionKey];
185
+ return [themeKey, option ? this.#resolveThemeOption({
187
186
  themeKey,
188
187
  option
189
- })];
188
+ }) : optionKey];
190
189
  }));
191
190
  };
192
191
  #resolveThemeOption = ({ themeKey, option }) => {
@@ -231,7 +230,7 @@ var Registry = class {
231
230
  };
232
231
  destroy = (key) => {
233
232
  const storeKey = key || name;
234
- if (!this.#registry.has(storeKey)) throw new Error(`[${name}] Theme store with key '${storeKey}' could not be found. Please run \`createThemeStore\` with key '${storeKey}' first.`);
233
+ if (!this.#registry.has(storeKey)) return;
235
234
  this.#registry.get(storeKey).___destroy();
236
235
  this.#registry.delete(storeKey);
237
236
  };
@@ -242,4 +241,5 @@ const getThemeStore = registry.get;
242
241
  const destroyThemeStore = registry.destroy;
243
242
 
244
243
  //#endregion
245
- export { createThemeStore, destroyThemeStore, getDefaultThemes, getThemeStore, getThemesAndOptions, localStorageAdapter, memoryStorageAdapter };
244
+ export { createThemeStore, destroyThemeStore, getDefaultThemes, getThemeStore, getThemesAndOptions, localStorageAdapter, memoryStorageAdapter };
245
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["name","PACKAGE_NAME","type","StorageAdapter","getItem","key","Promise","setItem","value","broadcast","watch","cb","StorageAdapterCreate","abortController","AbortController","StorageAdapterCreator","options","Options","localStorageAdapter","storageType","JSON","parse","window","stringify","controller","addEventListener","e","storageArea","newValue","signal","AbortSignal","any","abort","memoryStorageAdapter","storage","Map","channel","BroadcastChannel","get","set","postMessage","data","name","PACKAGE_NAME","type","localStorageAdapter","StorageAdapter","StorageAdapterCreate","ThemeOptionValue","ThemeOption","value","T","media","ThemeOptions","options","ReadonlyArray","initialValue","ThemeConfig","Record","KeyedThemeConfig","Themes","K","U","Listener","themes","resolvedThemes","ThemeKeysWithSystemOption","NonSystemOptionValues","SystemOptions","PersistedState","version","Partial","systemOptions","ThemeStoreOptions","key","config","initialState","storage","ThemeAndOptions","Array","getThemesAndOptions","Object","entries","map","themeKey","option","getDefaultThemes","fromEntries","themeOptions","defaultValue","isClient","window","document","createElement","ThemeStore","defaultThemes","currentThemes","Required","Omit","listeners","Set","mediaQueryCache","MediaQueryList","abortController","AbortController","constructor","keyedConfig","forEach","hasOwn","String","getThemes","getResolvedThemes","resolveThemes","setThemes","Promise","updatedThemes","setThemesAndNotify","stateToPersist","getStateToPersist","setItem","broadcast","updateSystemOption","ifMatch","ifNotMatch","restore","persistedState","getItem","subscribe","callback","immediate","add","delete","sync","watch","console","warn","___destroy","clear","abort","#setThemesAndNotify","notify","#resolveThemes","optionKey","resolveThemeOption","#resolveThemeOption","mediaQuery","mediaQueryList","matchMedia","addEventListener","signal","matches","#notify","listener","Registry","registry","Map","create","storeKey","themeStore","get","set","ThemeStoreRegistry","has","Error","destroy","createThemeStore","getThemeStore","destroyThemeStore"],"sources":["../package.json","../src/storage.ts","../src/index.ts"],"sourcesContent":["","import { name as PACKAGE_NAME } from '../package.json' with { type: 'json' }\n\nexport type StorageAdapter = {\n\tgetItem: (key: string) => object | null | Promise<object | null>\n\tsetItem: (key: string, value: object) => void | Promise<void>\n\t// removeItem: (key: string) => void | Promise<void>\n\tbroadcast?: (key: string, value: object) => void\n\twatch?: (cb: (key: string | null, value: object) => void) => () => void\n}\n\nexport type StorageAdapterCreate = ({\n\tabortController,\n}: {\n\tabortController: AbortController\n}) => StorageAdapter\n\nexport type StorageAdapterCreator<Options> = (\n\toptions?: Options,\n) => StorageAdapterCreate\n\nexport const localStorageAdapter: StorageAdapterCreator<{\n\tstorageType?: 'localStorage' | 'sessionStorage'\n}> = ({ storageType = 'localStorage' } = {}) => {\n\treturn ({ abortController }) => {\n\t\treturn {\n\t\t\tgetItem: (key: string) => {\n\t\t\t\treturn JSON.parse(window[storageType].getItem(key) || 'null')\n\t\t\t},\n\n\t\t\tsetItem: (key: string, value: object) => {\n\t\t\t\twindow[storageType].setItem(key, JSON.stringify(value))\n\t\t\t},\n\n\t\t\t// removeItem: (key: string) => {\n\t\t\t// \twindow[storageType].removeItem(key)\n\t\t\t// },\n\n\t\t\twatch: (cb) => {\n\t\t\t\tconst controller = new AbortController()\n\n\t\t\t\twindow.addEventListener(\n\t\t\t\t\t'storage',\n\t\t\t\t\t(e) => {\n\t\t\t\t\t\tif (e.storageArea !== window[storageType]) return\n\n\t\t\t\t\t\tcb(e.key, JSON.parse(e.newValue!))\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsignal: AbortSignal.any([\n\t\t\t\t\t\t\tabortController.signal,\n\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t]),\n\t\t\t\t\t},\n\t\t\t\t)\n\n\t\t\t\treturn () => {\n\t\t\t\t\tcontroller.abort()\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t}\n}\n\nexport const memoryStorageAdapter: StorageAdapterCreator<never> = () => {\n\treturn ({ abortController }) => {\n\t\tconst storage = new Map<string, object>()\n\t\tconst channel = new BroadcastChannel(PACKAGE_NAME)\n\n\t\treturn {\n\t\t\tgetItem: (key: string) => {\n\t\t\t\treturn storage.get(key) || null\n\t\t\t},\n\n\t\t\tsetItem: (key: string, value: object) => {\n\t\t\t\tstorage.set(key, value)\n\t\t\t},\n\n\t\t\t// removeItem: (key: string) => {\n\t\t\t// \tstorage.delete(key)\n\t\t\t// },\n\n\t\t\tbroadcast: (key: string, value: object) => {\n\t\t\t\tchannel.postMessage({ key, value })\n\t\t\t},\n\n\t\t\twatch: (cb) => {\n\t\t\t\tconst controller = new AbortController()\n\n\t\t\t\tchannel.addEventListener(\n\t\t\t\t\t'message',\n\t\t\t\t\t(e) => {\n\t\t\t\t\t\tcb(e.data.key, e.data.value)\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsignal: AbortSignal.any([\n\t\t\t\t\t\t\tabortController.signal,\n\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t]),\n\t\t\t\t\t},\n\t\t\t\t)\n\n\t\t\t\treturn () => {\n\t\t\t\t\tcontroller.abort()\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t}\n}\n","import { name as PACKAGE_NAME } from '../package.json' with { type: 'json' }\nimport {\n\tlocalStorageAdapter,\n\ttype StorageAdapter,\n\ttype StorageAdapterCreate,\n} from './storage'\n\ntype ThemeOptionValue = string | number | boolean\n\ntype ThemeOption<T extends ThemeOptionValue = string> = {\n\tvalue: T\n\tmedia?: [string, T, T]\n}\n\ntype ThemeOptions<T extends ThemeOptionValue = string> =\n\t| {\n\t\t\toptions: [\n\t\t\t\tT | ThemeOption<T>,\n\t\t\t\tT | ThemeOption<T>,\n\t\t\t\t...ReadonlyArray<T | ThemeOption<T>>,\n\t\t\t]\n\t\t\tinitialValue?: T\n\t }\n\t| {\n\t\t\tinitialValue: T\n\t }\n\nexport type ThemeConfig = Record<\n\tstring,\n\tThemeOptions<string> | ThemeOptions<number> | ThemeOptions<boolean>\n>\n\n// { [themeKey]: { [optionKey]: ThemeOption } }\ntype KeyedThemeConfig<T extends ThemeConfig> = {\n\t[K in keyof T]: Record<string, ThemeOption>\n}\n\nexport type Themes<T extends ThemeConfig> = {\n\t[K in keyof T]: T[K] extends { options: ReadonlyArray<infer U> }\n\t\t? U extends ThemeOption\n\t\t\t? U['value']\n\t\t\t: U\n\t\t: T[K] extends { initialValue: infer U }\n\t\t\t? U extends string\n\t\t\t\t? string\n\t\t\t\t: U extends number\n\t\t\t\t\t? number\n\t\t\t\t\t: boolean\n\t\t\t: never\n}\n\ntype Listener<T extends ThemeConfig> = (value: {\n\tthemes: Themes<T>\n\tresolvedThemes: Themes<T>\n}) => void\n\ntype ThemeKeysWithSystemOption<T extends ThemeConfig> = {\n\t[K in keyof T]: T[K] extends { options: ReadonlyArray<infer U> }\n\t\t? U extends { media: ReadonlyArray<unknown> }\n\t\t\t? K\n\t\t\t: never\n\t\t: never\n}[keyof T]\n\ntype NonSystemOptionValues<\n\tT extends ThemeConfig,\n\tK extends keyof T,\n> = T[K] extends { options: ReadonlyArray<infer U> }\n\t? U extends string | number | boolean\n\t\t? U\n\t\t: U extends ThemeOption\n\t\t\t? U extends { media: [string, string, string] }\n\t\t\t\t? never\n\t\t\t\t: U['value']\n\t\t\t: never\n\t: never\n\ntype SystemOptions<T extends ThemeConfig> = {\n\t[K in ThemeKeysWithSystemOption<T>]?: [\n\t\tNonSystemOptionValues<T, K>,\n\t\tNonSystemOptionValues<T, K>,\n\t]\n}\n\ntype PersistedState<T extends ThemeConfig> = {\n\tversion: 1\n\tthemes: Partial<Themes<T>>\n\tsystemOptions: SystemOptions<T>\n}\n\nexport type ThemeStoreOptions<T extends ThemeConfig> = {\n\tkey?: string\n\tconfig: T\n\tinitialState?: Partial<PersistedState<T>>\n\tstorage?: StorageAdapterCreate\n}\n\nexport type ThemeAndOptions<T extends ThemeConfig> = Array<\n\t{\n\t\t[K in keyof T]: [\n\t\t\tK,\n\t\t\tArray<\n\t\t\t\tT[K]['options'] extends ReadonlyArray<infer U>\n\t\t\t\t\t? U extends string\n\t\t\t\t\t\t? U\n\t\t\t\t\t\t: U extends ThemeOption\n\t\t\t\t\t\t\t? U['value']\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t: never\n\t\t\t>,\n\t\t]\n\t}[keyof T]\n>\n\nexport function getThemesAndOptions<T extends ThemeConfig>(config: T) {\n\treturn Object.entries(config).map(([themeKey, { options }]) => {\n\t\treturn [\n\t\t\tthemeKey,\n\t\t\toptions.map((option) =>\n\t\t\t\ttypeof option === 'string' ? option : option.value,\n\t\t\t),\n\t\t]\n\t}) as ThemeAndOptions<T>\n}\n\nexport function getDefaultThemes<T extends ThemeConfig>(config: T) {\n\treturn Object.fromEntries(\n\t\tObject.entries(config).map(([themeKey, themeOptions]) => {\n\t\t\tconst defaultValue =\n\t\t\t\tthemeOptions.initialValue ??\n\t\t\t\t(typeof themeOptions.options[0] === 'object'\n\t\t\t\t\t? themeOptions.options[0].value\n\t\t\t\t\t: themeOptions.options[0])\n\n\t\t\treturn [themeKey, defaultValue]\n\t\t}),\n\t) as Themes<T>\n}\n\nconst isClient = !!(\n\ttypeof window !== 'undefined' &&\n\ttypeof window.document !== 'undefined' &&\n\ttypeof window.document.createElement !== 'undefined'\n)\n\nclass ThemeStore<T extends ThemeConfig> {\n\t#defaultThemes: Themes<T>\n\t#currentThemes: Themes<T>\n\n\t#options: Required<Omit<ThemeStoreOptions<T>, 'config' | 'initialState'>> & {\n\t\tconfig: KeyedThemeConfig<T>\n\t}\n\n\t#systemOptions: SystemOptions<T>\n\n\t#storage: StorageAdapter\n\n\t#listeners: Set<Listener<T>> = new Set<Listener<T>>()\n\n\t#mediaQueryCache: Record<string, MediaQueryList>\n\n\t#abortController = new AbortController()\n\n\tconstructor({\n\t\tkey = PACKAGE_NAME,\n\t\tconfig,\n\t\tinitialState = {},\n\t\tstorage = localStorageAdapter(),\n\t}: ThemeStoreOptions<T>) {\n\t\tconst keyedConfig: Record<string, Record<string, ThemeOption<any>>> = {}\n\t\tconst systemOptions: Record<string, [ThemeOptionValue, ThemeOptionValue]> =\n\t\t\t{\n\t\t\t\t...initialState.systemOptions,\n\t\t\t}\n\n\t\tObject.entries(config).forEach(([themeKey, themeOptions]) => {\n\t\t\tkeyedConfig[themeKey] = {}\n\n\t\t\tif ('options' in themeOptions) {\n\t\t\t\tthemeOptions.options.forEach((option) => {\n\t\t\t\t\tif (typeof option === 'object') {\n\t\t\t\t\t\tif (option.media && !Object.hasOwn(systemOptions, themeKey)) {\n\t\t\t\t\t\t\tsystemOptions[themeKey] = [option.media[1], option.media[2]]\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tkeyedConfig[themeKey]![String(option.value)] = option\n\t\t\t\t\t} else {\n\t\t\t\t\t\tkeyedConfig[themeKey]![String(option)] = { value: option }\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\n\t\tthis.#options = {\n\t\t\tkey,\n\t\t\tconfig: keyedConfig as KeyedThemeConfig<T>,\n\t\t\tstorage,\n\t\t}\n\n\t\tthis.#systemOptions = systemOptions as SystemOptions<T>\n\n\t\tthis.#defaultThemes = getDefaultThemes(config)\n\n\t\tthis.#currentThemes = { ...this.#defaultThemes, ...initialState.themes }\n\n\t\tthis.#storage = this.#options.storage({\n\t\t\tabortController: this.#abortController,\n\t\t})\n\n\t\tthis.#mediaQueryCache = {}\n\t}\n\n\tgetThemes = (): Themes<T> => {\n\t\treturn this.#currentThemes\n\t}\n\n\tgetResolvedThemes = (): Themes<T> => {\n\t\treturn this.#resolveThemes()\n\t}\n\n\tsetThemes = async (\n\t\tthemes:\n\t\t\t| Partial<Themes<T>>\n\t\t\t| ((currentThemes: Themes<T>) => Partial<Themes<T>>),\n\t): Promise<void> => {\n\t\tconst updatedThemes =\n\t\t\ttypeof themes === 'function' ? themes(this.#currentThemes) : themes\n\n\t\tthis.#setThemesAndNotify({ ...this.#currentThemes, ...updatedThemes })\n\n\t\tconst stateToPersist = this.getStateToPersist()\n\n\t\tawait this.#storage.setItem(this.#options.key, stateToPersist)\n\n\t\tthis.#storage.broadcast?.(this.#options.key, stateToPersist)\n\t}\n\n\tupdateSystemOption = <K extends ThemeKeysWithSystemOption<T>>(\n\t\tthemeKey: K,\n\t\t[ifMatch, ifNotMatch]: [\n\t\t\tNonSystemOptionValues<T, K>,\n\t\t\tNonSystemOptionValues<T, K>,\n\t\t],\n\t) => {\n\t\tthis.#systemOptions[themeKey] = [ifMatch, ifNotMatch]\n\n\t\tthis.setThemes({ ...this.#currentThemes })\n\t}\n\n\tgetStateToPersist = (): PersistedState<T> => {\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\tthemes: this.#currentThemes,\n\t\t\tsystemOptions: this.#systemOptions,\n\t\t}\n\t}\n\n\trestore = async (): Promise<void> => {\n\t\tlet persistedState = await this.#storage.getItem(this.#options.key)\n\n\t\tif (!persistedState) {\n\t\t\tthis.#setThemesAndNotify({ ...this.#defaultThemes })\n\t\t\treturn\n\t\t}\n\n\t\t// for backward compatibility\n\t\tif (!Object.hasOwn(persistedState, 'version')) {\n\t\t\tpersistedState = {\n\t\t\t\tversion: 1,\n\t\t\t\tthemes: persistedState,\n\t\t\t\tsystemOptions: this.#systemOptions,\n\t\t\t}\n\t\t}\n\n\t\tthis.#systemOptions = {\n\t\t\t...this.#systemOptions,\n\t\t\t...persistedState.systemOptions,\n\t\t}\n\n\t\tthis.#setThemesAndNotify({\n\t\t\t...this.#defaultThemes,\n\t\t\t...persistedState.themes,\n\t\t})\n\t}\n\n\tsubscribe = (\n\t\tcallback: Listener<T>,\n\t\t{ immediate = false }: { immediate?: boolean } = {},\n\t): (() => void) => {\n\t\tif (immediate) {\n\t\t\tcallback({\n\t\t\t\tthemes: this.#currentThemes,\n\t\t\t\tresolvedThemes: this.#resolveThemes(),\n\t\t\t})\n\t\t}\n\n\t\tthis.#listeners.add(callback)\n\n\t\treturn () => {\n\t\t\tthis.#listeners.delete(callback)\n\t\t}\n\t}\n\n\tsync = (): (() => void) | undefined => {\n\t\tif (!this.#storage.watch) {\n\t\t\tconsole.warn(\n\t\t\t\t`[${PACKAGE_NAME}] No watch method was provided for storage.`,\n\t\t\t)\n\n\t\t\treturn\n\t\t}\n\n\t\treturn this.#storage.watch((key, persistedState) => {\n\t\t\tif (key !== this.#options.key) return\n\n\t\t\tthis.#systemOptions = (persistedState as PersistedState<T>).systemOptions\n\n\t\t\tthis.#setThemesAndNotify((persistedState as PersistedState<T>).themes)\n\t\t})\n\t}\n\n\t___destroy = (): void => {\n\t\tthis.#listeners.clear()\n\t\tthis.#abortController.abort()\n\t}\n\n\t#setThemesAndNotify = (themes: Themes<T>): void => {\n\t\tthis.#currentThemes = themes\n\t\tthis.#notify()\n\t}\n\n\t#resolveThemes = (): Themes<T> => {\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(this.#currentThemes).map(([themeKey, optionKey]) => {\n\t\t\t\tconst option = this.#options.config[themeKey]?.[optionKey]\n\n\t\t\t\treturn [\n\t\t\t\t\tthemeKey,\n\t\t\t\t\toption ? this.#resolveThemeOption({ themeKey, option }) : optionKey,\n\t\t\t\t]\n\t\t\t}),\n\t\t) as Themes<T>\n\t}\n\n\t#resolveThemeOption = ({\n\t\tthemeKey,\n\t\toption,\n\t}: {\n\t\tthemeKey: string\n\t\toption: ThemeOption\n\t}): string => {\n\t\tif (!option.media) return option.value\n\n\t\tif (!isClient) {\n\t\t\tconsole.warn(\n\t\t\t\t`[${PACKAGE_NAME}] Option with key \"media\" cannot be resolved in server environment.`,\n\t\t\t)\n\n\t\t\treturn option.value\n\t\t}\n\n\t\tconst [mediaQuery] = option.media\n\n\t\tif (!this.#mediaQueryCache[mediaQuery]) {\n\t\t\tconst mediaQueryList = window.matchMedia(mediaQuery)\n\n\t\t\tthis.#mediaQueryCache[mediaQuery] = mediaQueryList\n\n\t\t\tmediaQueryList.addEventListener(\n\t\t\t\t'change',\n\t\t\t\t() => {\n\t\t\t\t\tif (this.#currentThemes[themeKey] === option.value) {\n\t\t\t\t\t\tthis.#setThemesAndNotify({ ...this.#currentThemes })\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{ signal: this.#abortController.signal },\n\t\t\t)\n\t\t}\n\n\t\tconst [ifMatch, ifNotMatch] = this.#systemOptions[themeKey]!\n\n\t\treturn this.#mediaQueryCache[mediaQuery].matches ? ifMatch : ifNotMatch\n\t}\n\n\t#notify = (): void => {\n\t\tfor (const listener of this.#listeners) {\n\t\t\tlistener({\n\t\t\t\tthemes: this.#currentThemes,\n\t\t\t\tresolvedThemes: this.#resolveThemes(),\n\t\t\t})\n\t\t}\n\t}\n}\n\nclass Registry {\n\t#registry = new Map<string, ThemeStore<ThemeConfig>>()\n\n\tcreate = <T extends ThemeConfig>(\n\t\toptions: ThemeStoreOptions<T>,\n\t): ThemeStore<T> => {\n\t\tconst storeKey = options.key || PACKAGE_NAME\n\n\t\tlet themeStore = this.#registry.get(storeKey) as ThemeStore<T>\n\n\t\tif (!themeStore) {\n\t\t\tthemeStore = new ThemeStore<T>(options)\n\t\t\tthis.#registry.set(storeKey, themeStore as ThemeStore<ThemeConfig>)\n\t\t}\n\n\t\treturn themeStore\n\t}\n\n\tget = <T extends keyof ThemeStoreRegistry>(key?: T) => {\n\t\tconst storeKey = key || PACKAGE_NAME\n\n\t\tif (!this.#registry.has(storeKey)) {\n\t\t\tthrow new Error(\n\t\t\t\t`[${PACKAGE_NAME}] Theme store with key '${storeKey}' could not be found. Please run \\`createThemeStore\\` with key '${storeKey}' first.`,\n\t\t\t)\n\t\t}\n\n\t\treturn this.#registry.get(storeKey)! as ThemeStoreRegistry[T]\n\t}\n\n\tdestroy = <T extends keyof ThemeStoreRegistry>(key?: T) => {\n\t\tconst storeKey = key || PACKAGE_NAME\n\n\t\tif (!this.#registry.has(storeKey)) return\n\n\t\tthis.#registry.get(storeKey)!.___destroy()\n\t\tthis.#registry.delete(storeKey)\n\t}\n}\n\nconst registry = new Registry()\n\nexport type { ThemeStore }\n\nexport const createThemeStore = registry.create\nexport const getThemeStore = registry.get\nexport const destroyThemeStore = registry.destroy\n\nexport * from './storage'\n\nexport interface ThemeStoreRegistry {}\n"],"mappings":";;;;;ACoBA,MAAakB,uBAEP,EAAEC,cAAc,mBAAmB,EAAE,KAAK;AAC/C,SAAQ,EAAEN,sBAAsB;AAC/B,SAAO;GACNT,UAAUC,QAAgB;AACzB,WAAOe,KAAKC,MAAMC,OAAOH,aAAaf,QAAQC,IAAI,IAAI,OAAO;;GAG9DE,UAAUF,KAAaG,UAAkB;AACxCc,WAAOH,aAAaZ,QAAQF,KAAKe,KAAKG,UAAUf,MAAM,CAAC;;GAOxDE,QAAQC,OAAO;IACd,MAAMa,aAAa,IAAIV,iBAAiB;AAExCQ,WAAOG,iBACN,YACCC,MAAM;AACN,SAAIA,EAAEC,gBAAgBL,OAAOH,aAAc;AAE3CR,QAAGe,EAAErB,KAAKe,KAAKC,MAAMK,EAAEE,SAAU,CAAC;OAEnC,EACCC,QAAQC,YAAYC,IAAI,CACvBlB,gBAAgBgB,QAChBL,WAAWK,OACX,CAAA,EAEH,CAAC;AAED,iBAAa;AACZL,gBAAWQ,OAAO;;;GAGpB;;;AAIH,MAAaC,6BAA2D;AACvE,SAAQ,EAAEpB,sBAAsB;EAC/B,MAAMqB,0BAAU,IAAIC,KAAqB;EACzC,MAAMC,UAAU,IAAIC,iBAAiBpC,KAAa;AAElD,SAAO;GACNG,UAAUC,QAAgB;AACzB,WAAO6B,QAAQI,IAAIjC,IAAI,IAAI;;GAG5BE,UAAUF,KAAaG,UAAkB;AACxC0B,YAAQK,IAAIlC,KAAKG,MAAM;;GAOxBC,YAAYJ,KAAaG,UAAkB;AAC1C4B,YAAQI,YAAY;KAAEnC;KAAKG;KAAO,CAAC;;GAGpCE,QAAQC,OAAO;IACd,MAAMa,aAAa,IAAIV,iBAAiB;AAExCsB,YAAQX,iBACP,YACCC,MAAM;AACNf,QAAGe,EAAEe,KAAKpC,KAAKqB,EAAEe,KAAKjC,MAAM;OAE7B,EACCqB,QAAQC,YAAYC,IAAI,CACvBlB,gBAAgBgB,QAChBL,WAAWK,OACX,CAAA,EAEH,CAAC;AAED,iBAAa;AACZL,gBAAWQ,OAAO;;;GAGpB;;;;;;ACSH,SAAgBgD,oBAA2CL,QAAW;AACrE,QAAOM,OAAOC,QAAQP,OAAO,CAACQ,KAAK,CAACC,UAAU,EAAE9B,eAAe;AAC9D,SAAO,CACN8B,UACA9B,QAAQ6B,KAAKE,WACZ,OAAOA,WAAW,WAAWA,SAASA,OAAOnC,MAC7C,CACD;GACA;;AAGH,SAAgBoC,iBAAwCX,QAAW;AAClE,QAAOM,OAAOM,YACbN,OAAOC,QAAQP,OAAO,CAACQ,KAAK,CAACC,UAAUI,kBAAkB;AAOxD,SAAO,CAACJ,UALPI,aAAahC,iBACZ,OAAOgC,aAAalC,QAAQ,OAAO,WACjCkC,aAAalC,QAAQ,GAAGJ,QACxBsC,aAAalC,QAAQ,IAEM;GAEjC,CAAC;;AAGF,MAAMoC,WAAW,CAAC,EACjB,OAAOC,WAAW,eAClB,OAAOA,OAAOC,aAAa,eAC3B,OAAOD,OAAOC,SAASC,kBAAkB;AAG1C,IAAMC,aAAN,MAAwC;CACvC;CACA;CAEA;CAIA;CAEA;CAEA,6BAA+B,IAAIM,KAAkB;CAErD;CAEA,mBAAmB,IAAII,iBAAiB;CAExCC,YAAY,EACX/B,MAAM/B,MACNgC,QACAC,eAAe,EAAE,EACjBC,UAAUhC,qBAAoB,IACN;EACxB,MAAM6D,cAAgE,EAAE;EACxE,MAAMlC,gBACL,EACC,GAAGI,aAAaJ,eAChB;AAEFS,SAAOC,QAAQP,OAAO,CAACgC,SAAS,CAACvB,UAAUI,kBAAkB;AAC5DkB,eAAYtB,YAAY,EAAE;AAE1B,OAAI,aAAaI,aAChBA,cAAalC,QAAQqD,SAAStB,WAAW;AACxC,QAAI,OAAOA,WAAW,UAAU;AAC/B,SAAIA,OAAOjC,SAAS,CAAC6B,OAAO2B,OAAOpC,eAAeY,SAAS,CAC1DZ,eAAcY,YAAY,CAACC,OAAOjC,MAAM,IAAIiC,OAAOjC,MAAM,GAAG;AAG7DsD,iBAAYtB,UAAWyB,OAAOxB,OAAOnC,MAAM,IAAImC;UAE/CqB,aAAYtB,UAAWyB,OAAOxB,OAAO,IAAI,EAAEnC,OAAOmC,QAAQ;KAE1D;IAEF;AAEF,QAAK,UAAW;GACfX;GACAC,QAAQ+B;GACR7B;GACA;AAED,QAAK,gBAAiBL;AAEtB,QAAK,gBAAiBc,iBAAiBX,OAAO;AAE9C,QAAK,gBAAiB;GAAE,GAAG,MAAK;GAAgB,GAAGC,aAAaZ;GAAQ;AAExE,QAAK,UAAW,MAAK,QAASa,QAAQ,EACrC0B,iBAAiB,MAAK,iBACtB,CAAC;AAEF,QAAK,kBAAmB,EAAE;;CAG3BO,kBAA6B;AAC5B,SAAO,MAAK;;CAGbC,0BAAqC;AACpC,SAAO,MAAK,eAAgB;;CAG7BE,YAAY,OACXjD,WAGmB;EACnB,MAAMmD,gBACL,OAAOnD,WAAW,aAAaA,OAAO,MAAK,cAAe,GAAGA;AAE9D,QAAK,mBAAoB;GAAE,GAAG,MAAK;GAAgB,GAAGmD;GAAe,CAAC;EAEtE,MAAME,iBAAiB,KAAKC,mBAAmB;AAE/C,QAAM,MAAK,QAASC,QAAQ,MAAK,QAAS7C,KAAK2C,eAAe;AAE9D,QAAK,QAASG,YAAY,MAAK,QAAS9C,KAAK2C,eAAe;;CAG7DI,sBACCrC,UACA,CAACsC,SAASC,gBAIN;AACJ,QAAK,cAAevC,YAAY,CAACsC,SAASC,WAAW;AAErD,OAAKV,UAAU,EAAE,GAAG,MAAK,eAAgB,CAAC;;CAG3CK,0BAA6C;AAC5C,SAAO;GACNhD,SAAS;GACTN,QAAQ,MAAK;GACbQ,eAAe,MAAK;GACpB;;CAGFoD,UAAU,YAA2B;EACpC,IAAIC,iBAAiB,MAAM,MAAK,QAASC,QAAQ,MAAK,QAASpD,IAAI;AAEnE,MAAI,CAACmD,gBAAgB;AACpB,SAAK,mBAAoB,EAAE,GAAG,MAAK,eAAgB,CAAC;AACpD;;AAID,MAAI,CAAC5C,OAAO2B,OAAOiB,gBAAgB,UAAU,CAC5CA,kBAAiB;GAChBvD,SAAS;GACTN,QAAQ6D;GACRrD,eAAe,MAAK;GACpB;AAGF,QAAK,gBAAiB;GACrB,GAAG,MAAK;GACR,GAAGqD,eAAerD;GAClB;AAED,QAAK,mBAAoB;GACxB,GAAG,MAAK;GACR,GAAGqD,eAAe7D;GAClB,CAAC;;CAGH+D,aACCC,UACA,EAAEC,YAAY,UAAmC,EAAE,KACjC;AAClB,MAAIA,UACHD,UAAS;GACRhE,QAAQ,MAAK;GACbC,gBAAgB,MAAK,eAAe;GACpC,CAAC;AAGH,QAAK,UAAWiE,IAAIF,SAAS;AAE7B,eAAa;AACZ,SAAK,UAAWG,OAAOH,SAAS;;;CAIlCI,aAAuC;AACtC,MAAI,CAAC,MAAK,QAASC,OAAO;AACzBC,WAAQC,KACP,IAAI5F,KAAY,6CAChB;AAED;;AAGD,SAAO,MAAK,QAAS0F,OAAO3D,KAAKmD,mBAAmB;AACnD,OAAInD,QAAQ,MAAK,QAASA,IAAK;AAE/B,SAAK,gBAAkBmD,eAAqCrD;AAE5D,SAAK,mBAAqBqD,eAAqC7D,OAAO;IACrE;;CAGHwE,mBAAyB;AACxB,QAAK,UAAWC,OAAO;AACvB,QAAK,gBAAiBC,OAAO;;CAG9B,uBAAuB1E,WAA4B;AAClD,QAAK,gBAAiBA;AACtB,QAAK,QAAS;;CAGf,uBAAkC;AACjC,SAAOiB,OAAOM,YACbN,OAAOC,QAAQ,MAAK,cAAe,CAACC,KAAK,CAACC,UAAU0D,eAAe;GAClE,MAAMzD,SAAS,MAAK,QAASV,OAAOS,YAAY0D;AAEhD,UAAO,CACN1D,UACAC,SAAS,MAAK,mBAAoB;IAAED;IAAUC;IAAQ,CAAC,GAAGyD,UAC1D;IAEH,CAAC;;CAGF,uBAAuB,EACtB1D,UACAC,aAIa;AACb,MAAI,CAACA,OAAOjC,MAAO,QAAOiC,OAAOnC;AAEjC,MAAI,CAACwC,UAAU;AACd4C,WAAQC,KACP,IAAI5F,KAAY,qEAChB;AAED,UAAO0C,OAAOnC;;EAGf,MAAM,CAAC+F,cAAc5D,OAAOjC;AAE5B,MAAI,CAAC,MAAK,gBAAiB6F,aAAa;GACvC,MAAMC,iBAAiBvD,OAAOwD,WAAWF,WAAW;AAEpD,SAAK,gBAAiBA,cAAcC;AAEpCA,kBAAeE,iBACd,gBACM;AACL,QAAI,MAAK,cAAehE,cAAcC,OAAOnC,MAC5C,OAAK,mBAAoB,EAAE,GAAG,MAAK,eAAgB,CAAC;MAGtD,EAAEmG,QAAQ,MAAK,gBAAiBA,QACjC,CAAC;;EAGF,MAAM,CAAC3B,SAASC,cAAc,MAAK,cAAevC;AAElD,SAAO,MAAK,gBAAiB6D,YAAYK,UAAU5B,UAAUC;;CAG9D,gBAAsB;AACrB,OAAK,MAAM6B,YAAY,MAAK,UAC3BA,UAAS;GACRxF,QAAQ,MAAK;GACbC,gBAAgB,MAAK,eAAe;GACpC,CAAC;;;AAKL,IAAMwF,WAAN,MAAe;CACd,4BAAY,IAAIE,KAAsC;CAEtDC,UACCtG,YACmB;EACnB,MAAMuG,WAAWvG,QAAQoB,OAAO/B;EAEhC,IAAImH,aAAa,MAAK,SAAUC,IAAIF,SAAS;AAE7C,MAAI,CAACC,YAAY;AAChBA,gBAAa,IAAIhE,WAAcxC,QAAQ;AACvC,SAAK,SAAU0G,IAAIH,UAAUC,WAAsC;;AAGpE,SAAOA;;CAGRC,OAA2CrF,QAAY;EACtD,MAAMmF,WAAWnF,OAAO/B;AAExB,MAAI,CAAC,MAAK,SAAUuH,IAAIL,SAAS,CAChC,OAAM,IAAIM,MACT,IAAIxH,KAAY,0BAA2BkH,SAAQ,kEAAmEA,SAAQ,UAC9H;AAGF,SAAO,MAAK,SAAUE,IAAIF,SAAS;;CAGpCO,WAA+C1F,QAAY;EAC1D,MAAMmF,WAAWnF,OAAO/B;AAExB,MAAI,CAAC,MAAK,SAAUuH,IAAIL,SAAS,CAAE;AAEnC,QAAK,SAAUE,IAAIF,SAAS,CAAErB,YAAY;AAC1C,QAAK,SAAUL,OAAO0B,SAAS;;;AAIjC,MAAMH,WAAW,IAAID,UAAU;AAI/B,MAAaY,mBAAmBX,SAASE;AACzC,MAAaU,gBAAgBZ,SAASK;AACtC,MAAaQ,oBAAoBb,SAASU"}
@@ -0,0 +1 @@
1
+ export const resonareInlineScript = "var resonare=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=`resonare`;let n=({storageType:e=`localStorage`}={})=>({abortController:t})=>({getItem:t=>JSON.parse(window[e].getItem(t)||`null`),setItem:(t,n)=>{window[e].setItem(t,JSON.stringify(n))},watch:n=>{let r=new AbortController;return window.addEventListener(`storage`,t=>{t.storageArea===window[e]&&n(t.key,JSON.parse(t.newValue))},{signal:AbortSignal.any([t.signal,r.signal])}),()=>{r.abort()}}}),r=()=>({abortController:e})=>{let n=new Map,r=new BroadcastChannel(t);return{getItem:e=>n.get(e)||null,setItem:(e,t)=>{n.set(e,t)},broadcast:(e,t)=>{r.postMessage({key:e,value:t})},watch:t=>{let n=new AbortController;return r.addEventListener(`message`,e=>{t(e.data.key,e.data.value)},{signal:AbortSignal.any([e.signal,n.signal])}),()=>{n.abort()}}}};function i(e){return Object.entries(e).map(([e,{options:t}])=>[e,t.map(e=>typeof e==`string`?e:e.value)])}function a(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.initialValue??(typeof t.options[0]==`object`?t.options[0].value:t.options[0])]))}let o=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;var s=class{#e;#t;#n;#r;#i;#a=new Set;#o;#s=new AbortController;constructor({key:e=t,config:r,initialState:i={},storage:o=n()}){let s={},c={...i.systemOptions};Object.entries(r).forEach(([e,t])=>{s[e]={},`options`in t&&t.options.forEach(t=>{typeof t==`object`?(t.media&&!Object.hasOwn(c,e)&&(c[e]=[t.media[1],t.media[2]]),s[e][String(t.value)]=t):s[e][String(t)]={value:t}})}),this.#n={key:e,config:s,storage:o},this.#r=c,this.#e=a(r),this.#t={...this.#e,...i.themes},this.#i=this.#n.storage({abortController:this.#s}),this.#o={}}getThemes=()=>this.#t;getResolvedThemes=()=>this.#l();setThemes=async e=>{let t=typeof e==`function`?e(this.#t):e;this.#c({...this.#t,...t});let n=this.getStateToPersist();await this.#i.setItem(this.#n.key,n),this.#i.broadcast?.(this.#n.key,n)};updateSystemOption=(e,[t,n])=>{this.#r[e]=[t,n],this.setThemes({...this.#t})};getStateToPersist=()=>({version:1,themes:this.#t,systemOptions:this.#r});restore=async()=>{let e=await this.#i.getItem(this.#n.key);if(!e){this.#c({...this.#e});return}Object.hasOwn(e,`version`)||(e={version:1,themes:e,systemOptions:this.#r}),this.#r={...this.#r,...e.systemOptions},this.#c({...this.#e,...e.themes})};subscribe=(e,{immediate:t=!1}={})=>(t&&e({themes:this.#t,resolvedThemes:this.#l()}),this.#a.add(e),()=>{this.#a.delete(e)});sync=()=>{if(!this.#i.watch){console.warn(`[${t}] No watch method was provided for storage.`);return}return this.#i.watch((e,t)=>{e===this.#n.key&&(this.#r=t.systemOptions,this.#c(t.themes))})};___destroy=()=>{this.#a.clear(),this.#s.abort()};#c=e=>{this.#t=e,this.#d()};#l=()=>Object.fromEntries(Object.entries(this.#t).map(([e,t])=>{let n=this.#n.config[e]?.[t];return[e,n?this.#u({themeKey:e,option:n}):t]}));#u=({themeKey:e,option:n})=>{if(!n.media)return n.value;if(!o)return console.warn(`[${t}] Option with key \"media\" cannot be resolved in server environment.`),n.value;let[r]=n.media;if(!this.#o[r]){let t=window.matchMedia(r);this.#o[r]=t,t.addEventListener(`change`,()=>{this.#t[e]===n.value&&this.#c({...this.#t})},{signal:this.#s.signal})}let[i,a]=this.#r[e];return this.#o[r].matches?i:a};#d=()=>{for(let e of this.#a)e({themes:this.#t,resolvedThemes:this.#l()})}};let c=new class{#e=new Map;create=e=>{let n=e.key||t,r=this.#e.get(n);return r||(r=new s(e),this.#e.set(n,r)),r};get=e=>{let n=e||t;if(!this.#e.has(n))throw Error(`[${t}] Theme store with key '${n}' could not be found. Please run \\`createThemeStore\\` with key '${n}' first.`);return this.#e.get(n)};destroy=e=>{let n=e||t;this.#e.has(n)&&(this.#e.get(n).___destroy(),this.#e.delete(n))}},l=c.create,u=c.get,d=c.destroy;return e.createThemeStore=l,e.destroyThemeStore=d,e.getDefaultThemes=a,e.getThemeStore=u,e.getThemesAndOptions=i,e.localStorageAdapter=n,e.memoryStorageAdapter=r,e})({});"
package/dist/react.d.ts CHANGED
@@ -9,14 +9,20 @@ declare function useResonare<T extends ThemeConfig>(getStore: () => ThemeStore<T
9
9
  themes: Themes<T>;
10
10
  resolvedThemes: Themes<T>;
11
11
  setThemes: (themes: Partial<Themes<T>> | ((currentThemes: Themes<T>) => Partial<Themes<T>>)) => Promise<void>;
12
- updateSystemOption: <K extends { [K_1 in keyof T]: T[K_1]["options"] extends readonly (infer U)[] ? U extends {
13
- media: [string, string, string];
14
- } ? K_1 : never : never }[keyof T]>(themeKey: K, [ifMatch, ifNotMatch]: [T[K]["options"] extends readonly (infer U)[] ? U extends string ? U : U extends {
12
+ updateSystemOption: <K extends { [K_1 in keyof T]: T[K_1] extends {
13
+ options: ReadonlyArray<infer U>;
14
+ } ? U extends {
15
+ media: ReadonlyArray<unknown>;
16
+ } ? K_1 : never : never }[keyof T]>(themeKey: K, [ifMatch, ifNotMatch]: [T[K] extends {
17
+ options: ReadonlyArray<infer U>;
18
+ } ? U extends string | number | boolean ? U : U extends {
15
19
  value: string;
16
20
  media?: [string, string, string];
17
21
  } ? U extends {
18
22
  media: [string, string, string];
19
- } ? never : U["value"] : never : never, T[K]["options"] extends readonly (infer U)[] ? U extends string ? U : U extends {
23
+ } ? never : U["value"] : never : never, T[K] extends {
24
+ options: ReadonlyArray<infer U>;
25
+ } ? U extends string | number | boolean ? U : U extends {
20
26
  value: string;
21
27
  media?: [string, string, string];
22
28
  } ? U extends {
@@ -25,14 +31,20 @@ declare function useResonare<T extends ThemeConfig>(getStore: () => ThemeStore<T
25
31
  getStateToPersist: () => {
26
32
  version: 1;
27
33
  themes: Partial<Themes<T>>;
28
- systemOptions: { [K_1 in { [K in keyof T]: T[K]["options"] extends readonly (infer U)[] ? U extends {
29
- media: [string, string, string];
30
- } ? K : never : never }[keyof T]]?: [T[K_1]["options"] extends readonly (infer U)[] ? U extends string ? U : U extends {
34
+ systemOptions: { [K_1 in { [K in keyof T]: T[K] extends {
35
+ options: ReadonlyArray<infer U>;
36
+ } ? U extends {
37
+ media: ReadonlyArray<unknown>;
38
+ } ? K : never : never }[keyof T]]?: [T[K_1] extends {
39
+ options: ReadonlyArray<infer U>;
40
+ } ? U extends string | number | boolean ? U : U extends {
31
41
  value: string;
32
42
  media?: [string, string, string];
33
43
  } ? U extends {
34
44
  media: [string, string, string];
35
- } ? never : U["value"] : never : never, T[K_1]["options"] extends readonly (infer U)[] ? U extends string ? U : U extends {
45
+ } ? never : U["value"] : never : never, T[K_1] extends {
46
+ options: ReadonlyArray<infer U>;
47
+ } ? U extends string | number | boolean ? U : U extends {
36
48
  value: string;
37
49
  media?: [string, string, string];
38
50
  } ? U extends {
@@ -51,4 +63,5 @@ declare function useResonare<T extends ThemeConfig>(getStore: () => ThemeStore<T
51
63
  }) => (() => void);
52
64
  };
53
65
  //#endregion
54
- export { useResonare };
66
+ export { useResonare };
67
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","names":[],"sources":["../src/react.ts"],"mappings":";;;iBAkBgB,WAAA,WAAsB,WAAA,CAAA,CACrC,QAAA,QAAgB,UAAA,CAAW,CAAA;EACzB;AAAA"}
package/dist/react.js CHANGED
@@ -68,4 +68,5 @@ function useResonare(getStore, t0) {
68
68
  }
69
69
 
70
70
  //#endregion
71
- export { useResonare };
71
+ export { useResonare };
72
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","names":["React","ThemeConfig","ThemeStore","noop","emptyObject","emptyStore","getThemes","getResolvedThemes","setThemes","updateSystemOption","getStateToPersist","restore","sync","subscribe","useResonare","getStore","t0","$","_c","t1","undefined","initOnMount","t2","isMounted","setIsMounted","useState","t3","t4","Symbol","for","useEffect","T","themes","useSyncExternalStore","t5","t6","resolvedThemes"],"sources":["../src/react.ts"],"sourcesContent":["import * as React from 'react'\nimport type { ThemeConfig, ThemeStore } from '.'\n\nfunction noop() {}\nconst emptyObject = {}\n\nconst emptyStore = {\n\tgetThemes: () => emptyObject,\n\tgetResolvedThemes: () => emptyObject,\n\tsetThemes: noop,\n\tupdateSystemOption: noop,\n\tgetStateToPersist: noop,\n\trestore: noop,\n\tsync: noop,\n\t// clear: noop,\n\tsubscribe: () => noop,\n}\n\nexport function useResonare<T extends ThemeConfig>(\n\tgetStore: () => ThemeStore<T>,\n\t{ initOnMount = false } = {},\n) {\n\tconst [isMounted, setIsMounted] = React.useState(initOnMount)\n\n\tReact.useEffect(() => {\n\t\tsetIsMounted(true)\n\t}, [])\n\n\tconst {\n\t\tgetThemes,\n\t\tgetResolvedThemes,\n\t\tsetThemes,\n\t\tupdateSystemOption,\n\t\tgetStateToPersist,\n\t\trestore,\n\t\tsync,\n\t\t// clear,\n\t\tsubscribe,\n\t} = isMounted ? getStore() : (emptyStore as unknown as ThemeStore<T>)\n\n\tconst themes = React.useSyncExternalStore(subscribe, getThemes, getThemes)\n\n\treturn {\n\t\tthemes,\n\t\tresolvedThemes: getResolvedThemes(),\n\t\tsetThemes,\n\t\tupdateSystemOption,\n\t\tgetStateToPersist,\n\t\trestore,\n\t\tsync,\n\t\t// clear,\n\t\tsubscribe,\n\t}\n}\n"],"mappings":";;;;AAGA,SAASG,OAAO;AAChB,MAAMC,cAAc,EAAE;AAEtB,MAAMC,aAAa;CAClBC,iBAAiBF;CACjBG,yBAAyBH;CACzBI,WAAWL;CACXM,oBAAoBN;CACpBO,mBAAmBP;CACnBQ,SAASR;CACTS,MAAMT;CAENU,iBAAiBV;CACjB;AAED,SAAOW,YAAAC,UAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,GAAA;CAAA,IAAAC;AAAA,KAAAF,EAAA,OAAAD,IAAA;AAENG,OAAAH,OAAAI,SAAA,EAA4B,GAA5BJ;AAA4BC,IAAA,KAAAD;AAAAC,IAAA,KAAAE;OAAAA,MAAAF,EAAA;CAA5B,MAAA,EAAAI,aAAAC,OAAAH;CAAE,MAAAE,cAAAC,OAAAF,SAAA,QAAAE;CAEF,MAAA,CAAAC,WAAAC,gBAAkCxB,MAAKyB,SAAUJ,YAAY;CAAA,IAAAK;CAAA,IAAAC;AAAA,KAAAV,EAAA,OAAAW,OAAAC,IAAA,4BAAA,EAAA;AAE7CH,aAAA;AACfF,gBAAa,KAAK;;AAChBG,OAAA,EAAE;AAAAV,IAAA,KAAAS;AAAAT,IAAA,KAAAU;QAAA;AAAAD,OAAAT,EAAA;AAAAU,OAAAV,EAAA;;AAFLjB,OAAK8B,UAAWJ,IAEbC,GAAG;CAEN,MAAA,EAAArB,WAAAC,mBAAAC,WAAAC,oBAAAC,mBAAAC,SAAAC,MAAAC,cAUIU,YAAYR,UAAqD,GAAvCV;CAE9B,MAAA2B,SAAehC,MAAKiC,qBAAsBpB,WAAWP,WAAWA,UAAU;CAIzD,MAAA4B,KAAA3B,mBAAmB;CAAA,IAAA4B;AAAA,KAAAlB,EAAA,OAAAP,qBAAAO,EAAA,OAAAN,WAAAM,EAAA,OAAAT,aAAAS,EAAA,OAAAJ,aAAAI,EAAA,OAAAL,QAAAK,EAAA,OAAAiB,MAAAjB,EAAA,QAAAe,UAAAf,EAAA,QAAAR,oBAAA;AAF7B0B,OAAA;GAAAH;GAAAI,gBAEUF;GAAmB1B;GAAAC;GAAAC;GAAAC;GAAAC;GAAAC;GAQnC;AAAAI,IAAA,KAAAP;AAAAO,IAAA,KAAAN;AAAAM,IAAA,KAAAT;AAAAS,IAAA,KAAAJ;AAAAI,IAAA,KAAAL;AAAAK,IAAA,KAAAiB;AAAAjB,IAAA,MAAAe;AAAAf,IAAA,MAAAR;AAAAQ,IAAA,MAAAkB;OAAAA,MAAAlB,EAAA;AAAA,QAVMkB"}
@@ -1,7 +1,7 @@
1
1
  /**
2
- * resonare v0.0.4
2
+ * resonare v0.0.6
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
- */
7
- var resonare=(function(e){var t=`resonare`;let n=({storageType:e=`localStorage`}={})=>({abortController:t})=>({getItem:t=>JSON.parse(window[e].getItem(t)||`null`),setItem:(t,n)=>{window[e].setItem(t,JSON.stringify(n))},watch:n=>{let r=new AbortController;return window.addEventListener(`storage`,t=>{t.storageArea===window[e]&&n(t.key,JSON.parse(t.newValue))},{signal:AbortSignal.any([t.signal,r.signal])}),()=>{r.abort()}}}),r=()=>({abortController:e})=>{let n=new Map,r=new BroadcastChannel(t);return{getItem:e=>n.get(e)||null,setItem:(e,t)=>{n.set(e,t)},broadcast:(e,t)=>{r.postMessage({key:e,value:t})},watch:t=>{let n=new AbortController;return r.addEventListener(`message`,e=>{t(e.data.key,e.data.value)},{signal:AbortSignal.any([e.signal,n.signal])}),()=>{n.abort()}}}};function i(e){return Object.entries(e).map(([e,{options:t}])=>[e,t.map(e=>typeof e==`string`?e:e.value)])}function a(e){return Object.fromEntries(Object.entries(e).map(([e,{options:t,defaultOption:n}])=>[e,n??(typeof t[0]==`string`?t[0]:t[0].value)]))}let o=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;var s=class{#e;#t;#n;#r;#i;#a=new Set;#o;#s=new AbortController;constructor({key:e=t,config:r,initialState:i={},storage:o=n()}){let s={},c={...i.systemOptions};Object.entries(r).forEach(([e,{options:t}])=>{s[e]=s[e]||{},t.forEach(t=>{typeof t==`string`?s[e][t]={value:t}:(t.media&&!Object.hasOwn(c,e)&&(c[e]=[t.media[1],t.media[2]]),s[e][t.value]=t)})}),this.#n={key:e,config:s,storage:o},this.#r=c,this.#e=a(r),this.#t={...this.#e,...i.themes},this.#i=this.#n.storage({abortController:this.#s}),this.#o={}}getThemes=()=>this.#t;getResolvedThemes=()=>this.#l();setThemes=async e=>{let t=typeof e==`function`?e(this.#t):e;this.#c({...this.#t,...t});let n=this.getStateToPersist();await this.#i.setItem(this.#n.key,n),this.#i.broadcast?.(this.#n.key,n)};updateSystemOption=(e,[t,n])=>{this.#r[e]=[t,n],this.setThemes({...this.#t})};getStateToPersist=()=>({version:1,themes:this.#t,systemOptions:this.#r});restore=async()=>{let e=await this.#i.getItem(this.#n.key);if(!e){this.#c({...this.#e});return}Object.hasOwn(e,`version`)||(e={version:1,themes:e,systemOptions:this.#r}),this.#r={...this.#r,...e.systemOptions},this.#c({...this.#e,...e.themes})};subscribe=(e,{immediate:t=!1}={})=>(t&&e({themes:this.#t,resolvedThemes:this.#l()}),this.#a.add(e),()=>{this.#a.delete(e)});sync=()=>{if(!this.#i.watch){console.warn(`[${t}] No watch method was provided for storage.`);return}return this.#i.watch((e,t)=>{e===this.#n.key&&(this.#r=t.systemOptions,this.#c(t.themes))})};___destroy=()=>{this.#a.clear(),this.#s.abort()};#c=e=>{this.#t=e,this.#d()};#l=()=>Object.fromEntries(Object.entries(this.#t).map(([e,t])=>{let n=this.#n.config[e][t];return[e,this.#u({themeKey:e,option:n})]}));#u=({themeKey:e,option:n})=>{if(!n.media)return n.value;if(!o)return console.warn(`[${t}] Option with key "media" cannot be resolved in server environment.`),n.value;let[r]=n.media;if(!this.#o[r]){let t=window.matchMedia(r);this.#o[r]=t,t.addEventListener(`change`,()=>{this.#t[e]===n.value&&this.#c({...this.#t})},{signal:this.#s.signal})}let[i,a]=this.#r[e];return this.#o[r].matches?i:a};#d=()=>{for(let e of this.#a)e({themes:this.#t,resolvedThemes:this.#l()})}};let c=new class{#e=new Map;create=e=>{let n=e.key||t,r=this.#e.get(n);return r||(r=new s(e),this.#e.set(n,r)),r};get=e=>{let n=e||t;if(!this.#e.has(n))throw Error(`[${t}] Theme store with key '${n}' could not be found. Please run \`createThemeStore\` with key '${n}' first.`);return this.#e.get(n)};destroy=e=>{let n=e||t;if(!this.#e.has(n))throw Error(`[${t}] Theme store with key '${n}' could not be found. Please run \`createThemeStore\` with key '${n}' first.`);this.#e.get(n).___destroy(),this.#e.delete(n)}},l=c.create,u=c.get,d=c.destroy;return e.createThemeStore=l,e.destroyThemeStore=d,e.getDefaultThemes=a,e.getThemeStore=u,e.getThemesAndOptions=i,e.localStorageAdapter=n,e.memoryStorageAdapter=r,e})({});
6
+ */
7
+ var resonare=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=`resonare`;let n=({storageType:e=`localStorage`}={})=>({abortController:t})=>({getItem:t=>JSON.parse(window[e].getItem(t)||`null`),setItem:(t,n)=>{window[e].setItem(t,JSON.stringify(n))},watch:n=>{let r=new AbortController;return window.addEventListener(`storage`,t=>{t.storageArea===window[e]&&n(t.key,JSON.parse(t.newValue))},{signal:AbortSignal.any([t.signal,r.signal])}),()=>{r.abort()}}}),r=()=>({abortController:e})=>{let n=new Map,r=new BroadcastChannel(t);return{getItem:e=>n.get(e)||null,setItem:(e,t)=>{n.set(e,t)},broadcast:(e,t)=>{r.postMessage({key:e,value:t})},watch:t=>{let n=new AbortController;return r.addEventListener(`message`,e=>{t(e.data.key,e.data.value)},{signal:AbortSignal.any([e.signal,n.signal])}),()=>{n.abort()}}}};function i(e){return Object.entries(e).map(([e,{options:t}])=>[e,t.map(e=>typeof e==`string`?e:e.value)])}function a(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.initialValue??(typeof t.options[0]==`object`?t.options[0].value:t.options[0])]))}let o=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;var s=class{#e;#t;#n;#r;#i;#a=new Set;#o;#s=new AbortController;constructor({key:e=t,config:r,initialState:i={},storage:o=n()}){let s={},c={...i.systemOptions};Object.entries(r).forEach(([e,t])=>{s[e]={},`options`in t&&t.options.forEach(t=>{typeof t==`object`?(t.media&&!Object.hasOwn(c,e)&&(c[e]=[t.media[1],t.media[2]]),s[e][String(t.value)]=t):s[e][String(t)]={value:t}})}),this.#n={key:e,config:s,storage:o},this.#r=c,this.#e=a(r),this.#t={...this.#e,...i.themes},this.#i=this.#n.storage({abortController:this.#s}),this.#o={}}getThemes=()=>this.#t;getResolvedThemes=()=>this.#l();setThemes=async e=>{let t=typeof e==`function`?e(this.#t):e;this.#c({...this.#t,...t});let n=this.getStateToPersist();await this.#i.setItem(this.#n.key,n),this.#i.broadcast?.(this.#n.key,n)};updateSystemOption=(e,[t,n])=>{this.#r[e]=[t,n],this.setThemes({...this.#t})};getStateToPersist=()=>({version:1,themes:this.#t,systemOptions:this.#r});restore=async()=>{let e=await this.#i.getItem(this.#n.key);if(!e){this.#c({...this.#e});return}Object.hasOwn(e,`version`)||(e={version:1,themes:e,systemOptions:this.#r}),this.#r={...this.#r,...e.systemOptions},this.#c({...this.#e,...e.themes})};subscribe=(e,{immediate:t=!1}={})=>(t&&e({themes:this.#t,resolvedThemes:this.#l()}),this.#a.add(e),()=>{this.#a.delete(e)});sync=()=>{if(!this.#i.watch){console.warn(`[${t}] No watch method was provided for storage.`);return}return this.#i.watch((e,t)=>{e===this.#n.key&&(this.#r=t.systemOptions,this.#c(t.themes))})};___destroy=()=>{this.#a.clear(),this.#s.abort()};#c=e=>{this.#t=e,this.#d()};#l=()=>Object.fromEntries(Object.entries(this.#t).map(([e,t])=>{let n=this.#n.config[e]?.[t];return[e,n?this.#u({themeKey:e,option:n}):t]}));#u=({themeKey:e,option:n})=>{if(!n.media)return n.value;if(!o)return console.warn(`[${t}] Option with key "media" cannot be resolved in server environment.`),n.value;let[r]=n.media;if(!this.#o[r]){let t=window.matchMedia(r);this.#o[r]=t,t.addEventListener(`change`,()=>{this.#t[e]===n.value&&this.#c({...this.#t})},{signal:this.#s.signal})}let[i,a]=this.#r[e];return this.#o[r].matches?i:a};#d=()=>{for(let e of this.#a)e({themes:this.#t,resolvedThemes:this.#l()})}};let c=new class{#e=new Map;create=e=>{let n=e.key||t,r=this.#e.get(n);return r||(r=new s(e),this.#e.set(n,r)),r};get=e=>{let n=e||t;if(!this.#e.has(n))throw Error(`[${t}] Theme store with key '${n}' could not be found. Please run \`createThemeStore\` with key '${n}' first.`);return this.#e.get(n)};destroy=e=>{let n=e||t;this.#e.has(n)&&(this.#e.get(n).___destroy(),this.#e.delete(n))}},l=c.create,u=c.get,d=c.destroy;return e.createThemeStore=l,e.destroyThemeStore=d,e.getDefaultThemes=a,e.getThemeStore=u,e.getThemesAndOptions=i,e.localStorageAdapter=n,e.memoryStorageAdapter=r,e})({});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "resonare",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "Resonare",
5
5
  "keywords": [
6
6
  "theming"
@@ -19,6 +19,9 @@
19
19
  "types": "./dist/index.d.ts",
20
20
  "import": "./dist/index.js"
21
21
  },
22
+ "./inline-script": {
23
+ "import": "./dist/inline-script.ts"
24
+ },
22
25
  "./raw": {
23
26
  "import": "./dist/resonare.iife.min.js"
24
27
  },
@@ -39,16 +42,16 @@
39
42
  },
40
43
  "devDependencies": {
41
44
  "@size-limit/preset-small-lib": "12.0.0",
42
- "@types/react": "19.2.7",
43
- "@vitejs/plugin-react": "5.1.2",
45
+ "@types/react": "19.2.14",
46
+ "@vitejs/plugin-react": "5.1.4",
44
47
  "babel-plugin-react-compiler": "1.0.0",
45
- "jsdom": "27.4.0",
46
- "react": "19.2.3",
47
- "react-dom": "19.2.3",
48
+ "jsdom": "28.1.0",
49
+ "react": "19.2.4",
50
+ "react-dom": "19.2.4",
48
51
  "size-limit": "12.0.0",
49
- "tsdown": "0.18.4",
52
+ "tsdown": "0.20.3",
50
53
  "typescript": "5.9.3",
51
- "vitest": "4.0.16"
54
+ "vitest": "4.0.18"
52
55
  },
53
56
  "peerDependencies": {
54
57
  "react": "^18.0.0 || ^19.0.0"