next-prefers-theme
Version:
Next.js css media query prefers-* system preference detection & theming.
3 lines (2 loc) • 4.24 kB
JavaScript
var e=Object.defineProperty,r=Object.defineProperties,t=Object.getOwnPropertyDescriptors,o=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable,c=(r,t,o)=>t in r?e(r,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):r[t]=o,s=(e,r)=>{for(var t in r||(r={}))n.call(r,t)&&c(e,t,r[t]);if(o)for(var t of o(r))a.call(r,t)&&c(e,t,r[t]);return e};import f,{createContext as d,useContext as i,useState as u,useCallback as l,useEffect as p}from"react";const y=Object.freeze({theme:{_default:"light",attribute:"data-theme",query:"(prefers-color-scheme: dark)",set:e=>!0===e?"dark":"light"},motion:{_default:"no-preference",attribute:"data-reduced-motion",query:"(prefers-reduced-motion: reduce)",set:e=>!0===e?"reduce":"no-preference"},contrast:{_default:"no-preference",attribute:"data-contrast",query:"(prefers-contrast: more)",set:e=>!0===e?"more":window.matchMedia("(prefers-contrast: less)").matches?"less":"no-preference"},data:{_default:"no-preference",attribute:"data-reduced-data",query:"(prefers-reduced-data: reduce)",set:e=>!0===e?"reduce":"no-preference"}}),b=Object.freeze(Object.keys(y).reduce(((e,r)=>(e[r]=y[r]._default,e)),{})),h=Object.freeze(Object.keys(y).reduce(((e,r)=>(e[r]=y[r].attribute,e)),{})),m=Object.freeze(Object.keys(y).reduce(((e,r)=>(e[r]=null,e)),{})),O=(e,o,n)=>{const a={};return Object.keys(y).forEach((c=>{var f,d;a[c]=(f=s({},y[c]),d={disabled:o.indexOf(c)>=0,value:e[c],handler:e=>{const r={};r[c]=a[c].set(e.matches),n(r)}},r(f,t(d)))})),a},j=["not all",'"(navigation-controls)"'],v=e=>j.indexOf(e.media)<0;var _={exports:{}},g={},k=f,w=60103;if(g.Fragment=60107,"function"==typeof Symbol&&Symbol.for){var E=Symbol.for;w=E("react.element"),g.Fragment=E("react.fragment")}var P=k.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,S=Object.prototype.hasOwnProperty,x={key:!0,ref:!0,__self:!0,__source:!0};function I(e,r,t){var o,n={},a=null,c=null;for(o in void 0!==t&&(a=""+t),void 0!==r.key&&(a=""+r.key),void 0!==r.ref&&(c=r.ref),r)S.call(r,o)&&!x.hasOwnProperty(o)&&(n[o]=r[o]);if(e&&e.defaultProps)for(o in r=e.defaultProps)void 0===n[o]&&(n[o]=r[o]);return{$$typeof:w,type:e,key:a,ref:c,props:n,_owner:P.current}}g.jsx=I,g.jsxs=I,_.exports=g;const q=_.exports.jsx,L=e=>{if(e&&"undefined"!=typeof window)try{const r=localStorage.getItem(e)||void 0;if(r)return JSON.parse(r)}catch{return}},N=(e,r)=>{if(e&&"undefined"!=typeof window)try{localStorage.setItem(e,JSON.stringify(r))}finally{return}},R=(e,r=!1)=>{if(r){const r=L(e);if(r)return r}return Object.keys(b).reduce(((e,r)=>(e[r]=null,e)),{})},z=d({prefs:s({},b),userPrefs:s({},m),themes:[],setPrefs:()=>{},resetStorage:()=>{}}),T=()=>i(z),$=(e,r,t,o)=>()=>{const n=s({},t);t[e]!==r&&(n[e]=r),o(n)},D=({children:e,prefs:r=s({},m),themes:t=["light","dark"],enforceThemes:o=!0,disabledPrefs:n=[],resetValue:a="auto",attributes:c=s({},h),cacheKey:f="prefers-theme",cacheEnabled:d=!0})=>{const[i,y]=u(s({},b)),[j,_]=u(R(f,d)),g=l((e=>{if(e.theme&&!0===o&&t.concat(a).indexOf(e.theme)<0)throw`"${e.theme} is not in the list of supported themes (${t})`;const r=s(s({},j),e);_(r),!0===d&&f&&N(f,r)}),[j]),k=l((()=>{if(f)try{localStorage.removeItem(f)}catch{}}),[f]),w=l((e=>{y(s(s({},i),e))}),[i]),E=l(((e=!0)=>()=>{const t=s({},i),o={},a=O(r,n,w);return Object.keys(a).forEach((r=>{!0!==a[r].disabled&&(o[r]=window.matchMedia(a[r].query),e&&a[r].set&&(t[r]=a[r].set(o[r].matches)),e||v(o[r])&&o[r].addEventListener("change",a[r].handler))})),e&&w(t),()=>{Object.keys(a).forEach((r=>{!0!==a[r].disabled&&(e||v(o[r])&&o[r].removeEventListener("change",a[r].handler))}))}}),[i]);p(E(),[]),p(E(!1),[i]);return q(z.Provider,{value:{prefs:(()=>{const e=s({},i);return Object.keys(j).forEach((r=>{j[r]!==a&&null!==j[r]&&void 0!==j[r]&&(e[r]=j[r])})),Object.keys(r).forEach((t=>{r[t]&&(e[t]=r[t])})),Object.keys(e).forEach((r=>{"undefined"!=typeof document&&c[r]&&document.body.setAttribute(c[r],e[r])})),e})(),userPrefs:j,setPrefs:g,themes:t,resetStorage:k},children:e})};export{z as PrefersThemeContext,D as PrefersThemeProvider,R as getDefaultOverridePrefs,L as getStoredPrefs,$ as setPrefsFactory,N as setStoredPrefs,T as usePrefersTheme};
//# sourceMappingURL=next-prefers-theme.es.js.map