UNPKG

@osaedasia/oresume

Version:

A user-friendly library for generating complete Single Page Applications (SPAs)

2 lines (1 loc) 2 kB
import{Observable as e}from"../observer/Observable.js";import{DuplicateThemeError as t,ThemeNotFoundError as s}from"../../domain/exceptions/Theme.js";class i{static _instance=null;currentTheme;_storeKey="O-Store[ThemeService]";_mediaQueryTheme;_themes;_defaultTheme;_propertyVariablesProxy;constructor(e){this._themes=new Map,this._defaultTheme=e.defaultTheme,this._mediaQueryTheme=window.matchMedia("(prefers-color-scheme: dark)"),this._initializeThemes(e.themes),this._initializeMediaQuery(),this.currentTheme=this._initializeThemeObservable(),this._propertyVariablesProxy=new Proxy({},{get:(e,t)=>`var(--${String(t)})`})}get var(){return this._propertyVariablesProxy}static getInstance(e){return null===i._instance&&(i._instance=new i(e)),i._instance}_initializeThemes(e){e.forEach((e=>this._registerTheme(e)))}_initializeMediaQuery(){this._mediaQueryTheme.addEventListener("change",(e=>{if("system"===this.currentTheme.state){const t=this._resolveSystemTheme(e);this._applyTheme(t)}}))}_registerTheme(e){const s=e.name;if(void 0!==this._themes.get(s))throw new t(`Theme with name "${s}" already exists.`);this._themes.set(s,e)}_initializeThemeObservable(){const t=this._resolveSystemTheme(this._mediaQueryTheme),s=this._validateTheme(t),i=new e(s,this._storeKey);return i.state=this._validateTheme(i.state),i.subscribe((e=>{const[t]=this._resolveCurrentTheme(e);this._applyTheme(t)})),this._applyTheme(i.state),i}_resolveSystemTheme(e){return e.matches?"dark":"light"}_validateTheme(e){return this._themes.has(e)?e:this._defaultTheme}_resolveCurrentTheme(e){const t="system"===e?this._resolveSystemTheme(this._mediaQueryTheme):e,i=this._validateTheme(t),h=this._themes.get(i);if(void 0===h)throw new s(`Theme with name "${t}" does not exist.`);return[h.name,h]}_applyTheme(e){const t=this._themes.get(e);if(void 0===t)throw new s(`Theme with name "${e}" does not exist.`);const i=document.documentElement;i.classList.remove(...this._themes.keys()),i.classList.add(t.name)}}export{i as ThemeService};