resonare 0.0.7 → 0.0.9

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
@@ -238,6 +238,7 @@ 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'
241
242
  import { useResonare } from 'resonare/react'
242
243
 
243
244
  function ThemeSelect() {
@@ -245,18 +246,7 @@ function ThemeSelect() {
245
246
  window.resonare.getThemeStore(),
246
247
  )
247
248
 
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]) => (
249
+ return getThemesAndOptions(config).map(([theme, options]) => (
260
250
  <div key={theme}>
261
251
  <label htmlFor={theme}>{theme}</label>
262
252
  <select
package/dist/index.d.ts CHANGED
@@ -45,7 +45,7 @@ type ThemeKeysWithSystemOption<T extends ThemeConfig> = { [K in keyof T]: T[K] e
45
45
  } ? K : never : never }[keyof T];
46
46
  type NonSystemOptionValues<T extends ThemeConfig, K extends keyof T> = T[K] extends {
47
47
  options: ReadonlyArray<infer U>;
48
- } ? U extends string | number | boolean ? U : U extends ThemeOption ? U extends {
48
+ } ? U extends ThemeOptionValue ? U : U extends ThemeOption ? U extends {
49
49
  media: [string, string, string];
50
50
  } ? never : U['value'] : never : never;
51
51
  type SystemOptions<T extends ThemeConfig> = { [K in ThemeKeysWithSystemOption<T>]?: [NonSystemOptionValues<T, K>, NonSystemOptionValues<T, K>] };
@@ -60,6 +60,10 @@ type ThemeStoreOptions<T extends ThemeConfig> = {
60
60
  initialState?: Partial<PersistedState<T>>;
61
61
  storage?: StorageAdapterCreate;
62
62
  };
63
+ type ThemeAndOptions<T extends ThemeConfig> = Array<{ [K in keyof T]: [K, Array<T[K] extends {
64
+ options: ReadonlyArray<infer U>;
65
+ } ? U extends ThemeOption ? U['value'] : U : never>] }[keyof T]>;
66
+ declare function getThemesAndOptions<T extends ThemeConfig>(config: T): ThemeAndOptions<T>;
63
67
  declare function getDefaultThemes<T extends ThemeConfig>(config: T): Themes<T>;
64
68
  declare class ThemeStore<T extends ThemeConfig> {
65
69
  #private;
@@ -88,5 +92,5 @@ declare const getThemeStore: <T extends keyof ThemeStoreRegistry>(key?: T | unde
88
92
  declare const destroyThemeStore: <T extends keyof ThemeStoreRegistry>(key?: T | undefined) => void;
89
93
  interface ThemeStoreRegistry {}
90
94
  //#endregion
91
- export { StorageAdapter, StorageAdapterCreate, StorageAdapterCreator, ThemeConfig, type ThemeStore, ThemeStoreOptions, ThemeStoreRegistry, Themes, createThemeStore, destroyThemeStore, getDefaultThemes, getThemeStore, localStorageAdapter, memoryStorageAdapter };
95
+ export { StorageAdapter, StorageAdapterCreate, StorageAdapterCreator, ThemeAndOptions, ThemeConfig, type ThemeStore, ThemeStoreOptions, ThemeStoreRegistry, Themes, createThemeStore, destroyThemeStore, getDefaultThemes, getThemeStore, getThemesAndOptions, localStorageAdapter, memoryStorageAdapter };
92
96
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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,iBAGK,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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/storage.ts","../src/index.ts"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -57,6 +57,11 @@ const memoryStorageAdapter = () => {
57
57
 
58
58
  //#endregion
59
59
  //#region src/index.ts
60
+ function getThemesAndOptions(config) {
61
+ return Object.entries(config).map(([themeKey, themeOptions]) => {
62
+ return [themeKey, "options" in themeOptions ? themeOptions.options.map((option) => typeof option === "string" ? option : option.value) : []];
63
+ });
64
+ }
60
65
  function getDefaultThemes(config) {
61
66
  return Object.fromEntries(Object.entries(config).map(([themeKey, themeOptions]) => {
62
67
  return [themeKey, themeOptions.initialValue ?? (typeof themeOptions.options[0] === "object" ? themeOptions.options[0].value : themeOptions.options[0])];
@@ -236,5 +241,5 @@ const getThemeStore = registry.get;
236
241
  const destroyThemeStore = registry.destroy;
237
242
 
238
243
  //#endregion
239
- export { createThemeStore, destroyThemeStore, getDefaultThemes, getThemeStore, localStorageAdapter, memoryStorageAdapter };
244
+ export { createThemeStore, destroyThemeStore, getDefaultThemes, getThemeStore, getThemesAndOptions, localStorageAdapter, memoryStorageAdapter };
240
245
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +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","getDefaultThemes","Object","fromEntries","entries","map","themeKey","themeOptions","defaultValue","isClient","window","document","createElement","ThemeStore","defaultThemes","currentThemes","Required","Omit","listeners","Set","mediaQueryCache","MediaQueryList","abortController","AbortController","constructor","keyedConfig","forEach","option","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 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":"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"}
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","themeOptions","option","getDefaultThemes","fromEntries","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 ThemeOptionValue\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] extends { options: ReadonlyArray<infer U> }\n\t\t\t\t\t? U extends ThemeOption\n\t\t\t\t\t\t? U['value']\n\t\t\t\t\t\t: U\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, themeOptions]) => {\n\t\treturn [\n\t\t\tthemeKey,\n\t\t\t'options' in themeOptions\n\t\t\t\t? themeOptions.options.map((option) =>\n\t\t\t\t\t\ttypeof option === 'string' ? option : option.value,\n\t\t\t\t\t)\n\t\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":"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"}
@@ -1 +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.fromEntries(Object.entries(e).map(([e,t])=>[e,t.initialValue??(typeof t.options[0]==`object`?t.options[0].value:t.options[0])]))}let a=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;var o=class{#e;#t;#n;#r;#i;#a=new Set;#o;#s=new AbortController;constructor({key:e=t,config:r,initialState:a={},storage:o=n()}){let s={},c={...a.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=i(r),this.#t={...this.#e,...a.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(!a)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,o]=this.#r[e];return this.#o[r].matches?i:o};#d=()=>{for(let e of this.#a)e({themes:this.#t,resolvedThemes:this.#l()})}};let s=new class{#e=new Map;create=e=>{let n=e.key||t,r=this.#e.get(n);return r||(r=new o(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))}},c=s.create,l=s.get,u=s.destroy;return e.createThemeStore=c,e.destroyThemeStore=u,e.getDefaultThemes=i,e.getThemeStore=l,e.localStorageAdapter=n,e.memoryStorageAdapter=r,e})({});"
1
+ export const resonareInlineScript = "/**\n\t* resonare v0.0.9\n\t*\n\t* This source code is licensed under the MIT license found in the\n\t* LICENSE file in the root directory of this source tree.\n*/\nvar 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,t])=>[e,`options`in t?t.options.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})({});"
@@ -1,7 +1,7 @@
1
1
  /**
2
- * resonare v0.0.7
2
+ * resonare v0.0.9
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
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.fromEntries(Object.entries(e).map(([e,t])=>[e,t.initialValue??(typeof t.options[0]==`object`?t.options[0].value:t.options[0])]))}let a=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;var o=class{#e;#t;#n;#r;#i;#a=new Set;#o;#s=new AbortController;constructor({key:e=t,config:r,initialState:a={},storage:o=n()}){let s={},c={...a.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=i(r),this.#t={...this.#e,...a.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(!a)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,o]=this.#r[e];return this.#o[r].matches?i:o};#d=()=>{for(let e of this.#a)e({themes:this.#t,resolvedThemes:this.#l()})}};let s=new class{#e=new Map;create=e=>{let n=e.key||t,r=this.#e.get(n);return r||(r=new o(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))}},c=s.create,l=s.get,u=s.destroy;return e.createThemeStore=c,e.destroyThemeStore=u,e.getDefaultThemes=i,e.getThemeStore=l,e.localStorageAdapter=n,e.memoryStorageAdapter=r,e})({});
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,t])=>[e,`options`in t?t.options.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.7",
3
+ "version": "0.0.9",
4
4
  "description": "Resonare",
5
5
  "keywords": [
6
6
  "theming"
@@ -22,9 +22,6 @@
22
22
  "./inline-script": {
23
23
  "import": "./dist/inline-script.ts"
24
24
  },
25
- "./raw": {
26
- "import": "./dist/resonare.iife.min.js"
27
- },
28
25
  "./react": {
29
26
  "types": "./dist/react.d.ts",
30
27
  "import": "./dist/react.js"