@gospore/theme 1.0.122 → 1.0.123

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/theme.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue");require("what-input");const f=require("@gospore/dropdown-menu"),p=["auto","light","dark"],k="gospore-theme-mode",E=60*60*24*365,_="(prefers-color-scheme: dark)";function w(){if(typeof document>"u")return null;const t=b(k);return t&&p.includes(t)?t:null}function D(t){if(typeof document>"u"||!p.includes(t))return;const n=typeof window<"u"?window.location.hostname:"",c=typeof window<"u"?window.location.protocol:"",a=g(n),i=c==="https:",u=["path=/",`max-age=${E}`,"SameSite=Lax"];a&&u.push(`domain=${a}`),i&&u.push("Secure"),document.cookie=[`${encodeURIComponent(k)}=${encodeURIComponent(t)}`,...u].join("; ")}function v(){if(typeof document>"u")return;const t=w()??"auto",n=S(t);document.documentElement.setAttribute("dark-mode",n)}function b(t){if(typeof document>"u"||!document.cookie)return null;const n=`${encodeURIComponent(t)}=`,c=document.cookie.split("; ");for(const a of c)if(a.startsWith(n))return decodeURIComponent(a.slice(n.length));return null}function g(t){if(!t||t==="localhost")return null;if(/^\d+(?:\.\d+){3}$/.test(t))return t;const c=t.split(".");return c.length<=1?null:c.length===2?t:c.slice(-2).join(".")}function S(t){if(t==="dark")return!0;if(t==="light"||typeof window>"u")return!1;try{const n=typeof window.matchMedia=="function"?window.matchMedia(_):null;return n?n.matches:!1}catch{return!1}}const y={class:"theme"},R="(prefers-color-scheme: dark)",O="(prefers-reduced-motion: reduce)",T=200,B=Object.assign({name:"Theme"},{__name:"Theme",props:{mode:{type:String,default:"auto",validator:t=>["auto","light","dark"].includes(t)}},setup(t){const n=t,c=window.matchMedia(R),a=window.matchMedia(O);v();const i=e.ref({darkMode:h(n.mode)});c.addEventListener("change",l),e.watch(()=>n.mode,()=>{u()},{immediate:!0}),e.watch(()=>i.value.darkMode,(o,r)=>{if(r===void 0){m(o);return}s(()=>{m(o)})},{immediate:!0}),e.onBeforeUnmount(()=>{c.removeEventListener("change",l)});function u(){i.value.darkMode=h(n.mode)}function h(o){return o==="dark"?!0:o==="light"?!1:c.matches}function l(o){!o||n.mode!=="auto"||(i.value.darkMode=o.matches)}function m(o){document.documentElement.setAttribute("dark-mode",o)}function s(o){if(a.matches){o();return}const r=document.startViewTransition?.bind(document);if(r){r(()=>{o()});return}o();const d=document.documentElement;typeof d.animate=="function"&&window.requestAnimationFrame(()=>{d.animate([{opacity:.85},{opacity:1}],{duration:T,easing:"ease-in-out"})})}return e.provide("theme",i),(o,r)=>(e.openBlock(),e.createElementBlock("div",y,[e.renderSlot(o.$slots,"default")]))}}),I=(t,n)=>{const c=t.__vccOpts||t;for(const[a,i]of n)c[a]=i;return c},A={__name:"ThemeSwitcher",props:{mode:{type:String,default:"auto",validator:t=>["auto","light","dark"].includes(t)}},emits:["update:mode"],setup(t,{emit:n}){const a=[{value:"auto",label:"System"},{value:"light",label:"Light"},{value:"dark",label:"Dark"}].reduce((o,r)=>(o[r.value]=r.label,o),{}),i=p,u=t,h=n;v();const l=e.ref(!1),m=w()??u.mode,s=e.ref(i.includes(m)?m:"auto");return e.computed(()=>a[s.value]??a.auto),e.watch(()=>u.mode,o=>{i.includes(o)&&o!==s.value&&(s.value=o)}),e.watch(s,o=>{if(!i.includes(o)){s.value="auto";return}l.value=!1,h("update:mode",o),D(o)},{immediate:!0}),(o,r)=>(e.openBlock(),e.createBlock(e.unref(f.DropdownMenu),{open:l.value,"onUpdate:open":r[3]||(r[3]=d=>l.value=d),text:"Theme","aria-label":"Select theme mode"},{default:e.withCtx(()=>[e.createVNode(e.unref(f.DropdownItemGroup),{title:"Theme"},{default:e.withCtx(()=>[e.createVNode(e.unref(f.DropdownItemRadio),{checked:s.value,"onUpdate:checked":r[0]||(r[0]=d=>s.value=d),value:"auto",label:e.unref(a).auto,"aria-label":`${e.unref(a).auto} mode`},null,8,["checked","label","aria-label"]),r[4]||(r[4]=e.createElementVNode("hr",{class:"theme-switcher-divider",role:"separator"},null,-1)),e.createVNode(e.unref(f.DropdownItemRadio),{checked:s.value,"onUpdate:checked":r[1]||(r[1]=d=>s.value=d),value:"light",label:e.unref(a).light,"aria-label":`${e.unref(a).light} mode`},null,8,["checked","label","aria-label"]),e.createVNode(e.unref(f.DropdownItemRadio),{checked:s.value,"onUpdate:checked":r[2]||(r[2]=d=>s.value=d),value:"dark",label:e.unref(a).dark,"aria-label":`${e.unref(a).dark} mode`},null,8,["checked","label","aria-label"])]),_:1})]),_:1},8,["open"]))}},U=I(A,[["__scopeId","data-v-9b82a61c"]]),$="hsl(225, 90%, 16%)",C="#061f80",N="hsl(225, 94%, 35%)",L="#06c",V="hsl(210, 100%, 50%)",Y="hsl(210, 100%, 93%)",x="hsl(225, 100%, 96%)",G="hsl(12, 91%, 46%)",P="hsl(11, 100%, 59%)",j="hsl(40, 100%, 50%)",q="hsl(46, 100%, 50%)",Q="hsl(120, 100%, 25%)",K="#36b37e",F="hsl(0, 0%, 0%)",H="hsl(218, 76%, 15%)",W="hsla(0,0%,10%,.9)",z="hsla(0,0%,10%,.6)",J="hsl(218, 20%, 39%)",X="hsl(218, 17%, 44%)",Z="hsl(218, 14%, 49%)",ee="hsl(218, 14%, 54%)",te="hsl(218, 13%, 59%)",oe="hsl(218, 13%, 64%)",ne="hsl(217, 13%, 69%)",re="hsl(223, 12%, 89%)",ae="hsl(228, 14%, 93%)",ce="hsl(210, 7%, 95%)",se="hsl(220, 16%, 96%)",ie="hsl(210, 25%, 98%)",de="hsl(0, 0%, 98%)",M="hsl(0, 0%, 100%)",ue=N,le=N,me=M;exports.B100=x;exports.B200=Y;exports.B300=V;exports.B400=L;exports.B500=N;exports.B600=C;exports.B900=$;exports.G300=K;exports.G500=Q;exports.N0=M;exports.N10=ie;exports.N100=ee;exports.N1000=F;exports.N20=se;exports.N200=Z;exports.N25=ce;exports.N30=ae;exports.N300=X;exports.N40=re;exports.N400=J;exports.N5=de;exports.N500=z;exports.N70=ne;exports.N80=oe;exports.N800=W;exports.N90=te;exports.N900=H;exports.R300=P;exports.R400=G;exports.Theme=B;exports.ThemeSwitcher=U;exports.Y200=q;exports.Y300=j;exports.primary1=ue;exports.primary2=le;exports.primary3=me;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue");require("what-input");const N=require("@gospore/dropdown-menu"),k=["auto","light","dark"],E="gospore-theme-mode",y=60*60*24*365,D="(prefers-color-scheme: dark)";function v(){if(typeof document>"u")return null;const t=S(E);return t&&k.includes(t)?t:null}function b(t){if(typeof document>"u"||!k.includes(t))return;const n=typeof window<"u"?window.location.hostname:"",c=typeof window<"u"?window.location.protocol:"",r=R(n),l=c==="https:",d=["path=/",`max-age=${y}`,"SameSite=Lax"];r&&d.push(`domain=${r}`),l&&d.push("Secure"),document.cookie=[`${encodeURIComponent(E)}=${encodeURIComponent(t)}`,...d].join("; ")}function g(t){if(typeof document>"u")return;const n=typeof t=="string"&&k.includes(t)?t:v()??"auto";console.log("Applying theme mode:",n);const c=O(n);document.documentElement.setAttribute("dark-mode",c)}function S(t){if(typeof document>"u"||!document.cookie)return null;const n=`${encodeURIComponent(t)}=`,c=document.cookie.split("; ");for(const r of c)if(r.startsWith(n))return decodeURIComponent(r.slice(n.length));return null}function R(t){if(!t||t==="localhost")return null;if(/^\d+(?:\.\d+){3}$/.test(t))return t;const c=t.split(".");return c.length<=1?null:c.length===2?t:c.slice(-2).join(".")}function O(t){if(t==="dark")return!0;if(t==="light"||typeof window>"u")return!1;try{const n=typeof window.matchMedia=="function"?window.matchMedia(D):null;return n?n.matches:!1}catch{return!1}}const T={class:"theme"},B="(prefers-color-scheme: dark)",I="(prefers-reduced-motion: reduce)",A=200,U=Object.assign({name:"Theme"},{__name:"Theme",props:{mode:{type:String,validator:t=>["auto","light","dark"].includes(t)}},setup(t){const n=t,c=window.matchMedia(B),r=window.matchMedia(I),l=u();g(l);const d=e.ref(l),f=e.ref({darkMode:h(l)});c.addEventListener("change",a),e.watch(()=>n.mode,()=>{m()},{immediate:!0}),e.watch(()=>f.value.darkMode,(o,p)=>{if(p===void 0){i(o);return}s(()=>{i(o)})},{immediate:!0}),e.onBeforeUnmount(()=>{c.removeEventListener("change",a)});function m(){const o=u();d.value=o,f.value.darkMode=h(o)}function h(o){return o==="dark"?!0:o==="light"?!1:c.matches}function a(o){!o||d.value!=="auto"||(f.value.darkMode=o.matches)}function i(o){document.documentElement.setAttribute("dark-mode",o)}function s(o){if(r.matches){o();return}const p=document.startViewTransition?.bind(document);if(p){p(()=>{o()});return}o();const M=document.documentElement;typeof M.animate=="function"&&window.requestAnimationFrame(()=>{M.animate([{opacity:.85},{opacity:1}],{duration:A,easing:"ease-in-out"})})}function u(){return n.mode??v()??"auto"}return e.provide("theme",f),(o,p)=>(e.openBlock(),e.createElementBlock("div",T,[e.renderSlot(o.$slots,"default")]))}}),$=(t,n)=>{const c=t.__vccOpts||t;for(const[r,l]of n)c[r]=l;return c},C={__name:"ThemeSwitcher",props:{mode:{type:String,default:"auto",validator:t=>["auto","light","dark"].includes(t)}},emits:["update:mode"],setup(t,{emit:n}){const r=[{value:"auto",label:"System"},{value:"light",label:"Light"},{value:"dark",label:"Dark"}].reduce((i,s)=>(i[s.value]=s.label,i),{}),l=k,d=t,f=n;g();const m=e.ref(!1),h=v()??d.mode,a=e.ref(l.includes(h)?h:"auto");return e.computed(()=>r[a.value]??r.auto),e.watch(()=>d.mode,i=>{l.includes(i)&&i!==a.value&&(a.value=i)}),e.watch(a,i=>{if(!l.includes(i)){a.value="auto";return}m.value=!1,f("update:mode",i),b(i)},{immediate:!0}),(i,s)=>(e.openBlock(),e.createBlock(e.unref(N.DropdownMenu),{open:m.value,"onUpdate:open":s[3]||(s[3]=u=>m.value=u),text:"Theme","aria-label":"Select theme mode"},{default:e.withCtx(()=>[e.createVNode(e.unref(N.DropdownItemGroup),{title:"Theme"},{default:e.withCtx(()=>[e.createVNode(e.unref(N.DropdownItemRadio),{checked:a.value,"onUpdate:checked":s[0]||(s[0]=u=>a.value=u),value:"auto",label:e.unref(r).auto,"aria-label":`${e.unref(r).auto} mode`},null,8,["checked","label","aria-label"]),s[4]||(s[4]=e.createElementVNode("hr",{class:"theme-switcher-divider",role:"separator"},null,-1)),e.createVNode(e.unref(N.DropdownItemRadio),{checked:a.value,"onUpdate:checked":s[1]||(s[1]=u=>a.value=u),value:"light",label:e.unref(r).light,"aria-label":`${e.unref(r).light} mode`},null,8,["checked","label","aria-label"]),e.createVNode(e.unref(N.DropdownItemRadio),{checked:a.value,"onUpdate:checked":s[2]||(s[2]=u=>a.value=u),value:"dark",label:e.unref(r).dark,"aria-label":`${e.unref(r).dark} mode`},null,8,["checked","label","aria-label"])]),_:1})]),_:1},8,["open"]))}},L=$(C,[["__scopeId","data-v-9b82a61c"]]),V="hsl(225, 90%, 16%)",Y="#061f80",w="hsl(225, 94%, 35%)",x="#06c",G="hsl(210, 100%, 50%)",P="hsl(210, 100%, 93%)",j="hsl(225, 100%, 96%)",q="hsl(12, 91%, 46%)",Q="hsl(11, 100%, 59%)",K="hsl(40, 100%, 50%)",F="hsl(46, 100%, 50%)",H="hsl(120, 100%, 25%)",W="#36b37e",z="hsl(0, 0%, 0%)",J="hsl(218, 76%, 15%)",X="hsla(0,0%,10%,.9)",Z="hsla(0,0%,10%,.6)",ee="hsl(218, 20%, 39%)",te="hsl(218, 17%, 44%)",ne="hsl(218, 14%, 49%)",oe="hsl(218, 14%, 54%)",re="hsl(218, 13%, 59%)",ce="hsl(218, 13%, 64%)",se="hsl(217, 13%, 69%)",ae="hsl(223, 12%, 89%)",ie="hsl(228, 14%, 93%)",le="hsl(210, 7%, 95%)",ue="hsl(220, 16%, 96%)",de="hsl(210, 25%, 98%)",fe="hsl(0, 0%, 98%)",_="hsl(0, 0%, 100%)",me=w,he=w,pe=_;exports.B100=j;exports.B200=P;exports.B300=G;exports.B400=x;exports.B500=w;exports.B600=Y;exports.B900=V;exports.G300=W;exports.G500=H;exports.N0=_;exports.N10=de;exports.N100=oe;exports.N1000=z;exports.N20=ue;exports.N200=ne;exports.N25=le;exports.N30=ie;exports.N300=te;exports.N40=ae;exports.N400=ee;exports.N5=fe;exports.N500=Z;exports.N70=se;exports.N80=ce;exports.N800=X;exports.N90=re;exports.N900=J;exports.R300=Q;exports.R400=q;exports.Theme=U;exports.ThemeSwitcher=L;exports.Y200=F;exports.Y300=K;exports.primary1=me;exports.primary2=he;exports.primary3=pe;
2
2
  //# sourceMappingURL=theme.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.cjs.js","sources":["../src/modeStorage.js","../src/Theme.vue","../src/ThemeSwitcher.vue","../src/colors.js"],"sourcesContent":["const VALID_THEME_MODES = [\"auto\", \"light\", \"dark\"];\nconst STORAGE_KEY = \"gospore-theme-mode\";\nconst ONE_YEAR_IN_SECONDS = 60 * 60 * 24 * 365;\nconst DARK_MODE_QUERY = \"(prefers-color-scheme: dark)\";\n\nexport function readStoredMode() {\n if (typeof document === \"undefined\") {\n return null;\n }\n const stored = getCookie(STORAGE_KEY);\n return stored && VALID_THEME_MODES.includes(stored) ? stored : null;\n}\n\nexport function writeStoredMode(mode) {\n if (typeof document === \"undefined\" || !VALID_THEME_MODES.includes(mode)) {\n return;\n }\n const hostname = typeof window !== \"undefined\" ? window.location.hostname : \"\";\n const protocol = typeof window !== \"undefined\" ? window.location.protocol : \"\";\n const domain = getCookieDomain(hostname);\n const secure = protocol === \"https:\";\n const attributes = [\n \"path=/\",\n `max-age=${ONE_YEAR_IN_SECONDS}`,\n \"SameSite=Lax\",\n ];\n if (domain) {\n attributes.push(`domain=${domain}`);\n }\n if (secure) {\n attributes.push(\"Secure\");\n }\n document.cookie = [\n `${encodeURIComponent(STORAGE_KEY)}=${encodeURIComponent(mode)}`,\n ...attributes,\n ].join(\"; \");\n}\n\nexport function applyStoredModeToDocument() {\n if (typeof document === \"undefined\") {\n return;\n }\n const mode = readStoredMode() ?? \"auto\";\n const darkMode = resolveDarkMode(mode);\n document.documentElement.setAttribute(\"dark-mode\", darkMode);\n}\n\nexport { VALID_THEME_MODES, STORAGE_KEY };\n\nfunction getCookie(name) {\n if (typeof document === \"undefined\" || !document.cookie) {\n return null;\n }\n const encodedName = `${encodeURIComponent(name)}=`;\n const cookies = document.cookie.split(\"; \");\n for (const cookie of cookies) {\n if (cookie.startsWith(encodedName)) {\n return decodeURIComponent(cookie.slice(encodedName.length));\n }\n }\n return null;\n}\n\nfunction getCookieDomain(hostname) {\n if (!hostname || hostname === \"localhost\") {\n return null;\n }\n const isIpAddress = /^\\d+(?:\\.\\d+){3}$/.test(hostname);\n if (isIpAddress) {\n return hostname;\n }\n const parts = hostname.split(\".\");\n if (parts.length <= 1) {\n return null;\n }\n if (parts.length === 2) {\n return hostname;\n }\n return parts.slice(-2).join(\".\");\n}\n\nfunction resolveDarkMode(mode) {\n if (mode === \"dark\") {\n return true;\n }\n if (mode === \"light\") {\n return false;\n }\n if (typeof window === \"undefined\") {\n return false;\n }\n try {\n const mediaQueryList =\n typeof window.matchMedia === \"function\"\n ? window.matchMedia(DARK_MODE_QUERY)\n : null;\n return mediaQueryList ? mediaQueryList.matches : false;\n } catch (error) {\n return false;\n }\n}\n","<template>\n <div class=\"theme\">\n <slot />\n </div>\n</template>\n\n<script setup>\nimport { provide, ref, watch, onBeforeUnmount } from \"vue\";\nimport { applyStoredModeToDocument } from \"./modeStorage\";\nimport \"what-input\";\n\ndefineOptions({\n name: \"Theme\",\n});\nconst props = defineProps({\n mode: {\n type: String,\n default: \"auto\",\n validator: (value) => [\"auto\", \"light\", \"dark\"].includes(value),\n },\n});\n\nconst DARK_MODE_QUERY = \"(prefers-color-scheme: dark)\";\nconst PREFERS_REDUCED_MOTION_QUERY = \"(prefers-reduced-motion: reduce)\";\nconst THEME_TRANSITION_DURATION = 200;\nconst darkModeMedia = window.matchMedia(DARK_MODE_QUERY);\nconst prefersReducedMotionMedia = window.matchMedia(\n PREFERS_REDUCED_MOTION_QUERY,\n);\n\napplyStoredModeToDocument();\n\nconst theme = ref({\n darkMode: resolveDarkMode(props.mode),\n});\n\ndarkModeMedia.addEventListener(\"change\", handleSystemPreferenceChange);\n\nwatch(\n () => props.mode,\n () => {\n syncDarkMode();\n },\n { immediate: true },\n);\n\nwatch(\n () => theme.value.darkMode,\n (darkMode, previousValue) => {\n if (previousValue === undefined) {\n setDocumentDarkModeAttribute(darkMode);\n return;\n }\n withThemeTransition(() => {\n setDocumentDarkModeAttribute(darkMode);\n });\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => {\n darkModeMedia.removeEventListener(\"change\", handleSystemPreferenceChange);\n});\n\nfunction syncDarkMode() {\n theme.value.darkMode = resolveDarkMode(props.mode);\n}\n\nfunction resolveDarkMode(mode) {\n if (mode === \"dark\") {\n return true;\n }\n if (mode === \"light\") {\n return false;\n }\n return darkModeMedia.matches;\n}\n\nfunction handleSystemPreferenceChange(event) {\n if (!event || props.mode !== \"auto\") {\n return;\n }\n theme.value.darkMode = event.matches;\n}\n\nfunction setDocumentDarkModeAttribute(darkMode) {\n document.documentElement.setAttribute(\"dark-mode\", darkMode);\n}\n\nfunction withThemeTransition(applyTheme) {\n if (prefersReducedMotionMedia.matches) {\n applyTheme();\n return;\n }\n const startViewTransition = document.startViewTransition?.bind(document);\n if (startViewTransition) {\n startViewTransition(() => {\n applyTheme();\n });\n return;\n }\n applyTheme();\n const element = document.documentElement;\n if (typeof element.animate !== \"function\") {\n return;\n }\n window.requestAnimationFrame(() => {\n element.animate(\n [\n { opacity: 0.85 },\n { opacity: 1 },\n ],\n {\n duration: THEME_TRANSITION_DURATION,\n easing: \"ease-in-out\",\n },\n );\n });\n}\n\nprovide(\"theme\", theme);\n</script>\n\n<style lang=\"less\">\n@import \"index.less\";\n</style>\n","<template>\n <DropdownMenu\n v-model:open=\"open\"\n text=\"Theme\"\n aria-label=\"Select theme mode\"\n >\n <DropdownItemGroup title=\"Theme\">\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"auto\"\n :label=\"MODE_LABELS.auto\"\n :aria-label=\"`${MODE_LABELS.auto} mode`\"\n />\n <hr class=\"theme-switcher-divider\" role=\"separator\" />\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"light\"\n :label=\"MODE_LABELS.light\"\n :aria-label=\"`${MODE_LABELS.light} mode`\"\n />\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"dark\"\n :label=\"MODE_LABELS.dark\"\n :aria-label=\"`${MODE_LABELS.dark} mode`\"\n />\n </DropdownItemGroup>\n </DropdownMenu>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from \"vue\";\nimport {\n DropdownMenu,\n DropdownItemGroup,\n DropdownItemRadio,\n} from \"@gospore/dropdown-menu\";\nimport {\n readStoredMode,\n writeStoredMode,\n VALID_THEME_MODES,\n applyStoredModeToDocument,\n} from \"./modeStorage\";\n\nconst MODE_OPTIONS = [\n { value: \"auto\", label: \"System\" },\n { value: \"light\", label: \"Light\" },\n { value: \"dark\", label: \"Dark\" },\n];\nconst MODE_LABELS = MODE_OPTIONS.reduce((map, option) => {\n map[option.value] = option.label;\n return map;\n}, {});\nconst VALID_MODES = VALID_THEME_MODES;\n\nconst props = defineProps({\n mode: {\n type: String,\n default: \"auto\",\n validator: (value) => [\"auto\", \"light\", \"dark\"].includes(value),\n },\n});\nconst emit = defineEmits([\"update:mode\"]);\n\napplyStoredModeToDocument();\n\nconst open = ref(false);\nconst initialMode = readStoredMode() ?? props.mode;\nconst internalMode = ref(\n VALID_MODES.includes(initialMode) ? initialMode : \"auto\",\n);\nconst label = computed(\n () => MODE_LABELS[internalMode.value] ?? MODE_LABELS.auto,\n);\n\nwatch(\n () => props.mode,\n (mode) => {\n if (VALID_MODES.includes(mode) && mode !== internalMode.value) {\n internalMode.value = mode;\n }\n },\n);\n\nwatch(\n internalMode,\n (mode) => {\n if (!VALID_MODES.includes(mode)) {\n internalMode.value = \"auto\";\n return;\n }\n open.value = false;\n emit(\"update:mode\", mode);\n writeStoredMode(mode);\n },\n { immediate: true },\n);\n\n</script>\n\n<style scoped lang=\"less\">\n.theme-switcher-divider {\n margin: 4px 0;\n background-color: var(--go-color-n20);\n}\n\n[dark-mode=\"true\"] {\n .theme-switcher-divider {\n background-color: var(--background-color-secondary-dark);\n }\n}\n</style>\n","// Blues\nexport const B900 = \"hsl(225, 90%, 16%)\";\n// @go-color-b700 = #000e7f;\nexport const B600 = \"#061f80\";\nexport const B500 = \"hsl(225, 94%, 35%)\";\n// @go-color-b550 = #131ff2;\n// @go-color-b500 = #001dff;\n// @go-color-b400 = #3333ff;\nexport const B400 = \"#06c\";\nexport const B300 = \"hsl(210, 100%, 50%)\";\nexport const B200 = \"hsl(210, 100%, 93%)\";\nexport const B100 = \"hsl(225, 100%, 96%)\";\n\n// Reds\nexport const R400 = \"hsl(12, 91%, 46%)\";\nexport const R300 = \"hsl(11, 100%, 59%)\";\n\n// Yellows\nexport const Y300 = \"hsl(40, 100%, 50%)\";\nexport const Y200 = \"hsl(46, 100%, 50%)\";\n\n// Greens\nexport const G500 = \"hsl(120, 100%, 25%)\";\nexport const G300 = \"#36b37e\";\n\n// Neutrals\nexport const N1000 = \"hsl(0, 0%, 0%)\";\nexport const N900 = \"hsl(218, 76%, 15%)\";\n// @go-color-n900 = hsl(218, 54%, 20%);\nexport const N800 = \"hsla(0,0%,10%,.9)\";\nexport const N500 = \"hsla(0,0%,10%,.6)\";\nexport const N400 = \"hsl(218, 20%, 39%)\";\nexport const N300 = \"hsl(218, 17%, 44%)\";\nexport const N200 = \"hsl(218, 14%, 49%)\";\nexport const N100 = \"hsl(218, 14%, 54%)\";\nexport const N90 = \"hsl(218, 13%, 59%)\";\nexport const N80 = \"hsl(218, 13%, 64%)\";\nexport const N70 = \"hsl(217, 13%, 69%)\";\nexport const N40 = \"hsl(223, 12%, 89%)\";\nexport const N30 = \"hsl(228, 14%, 93%)\";\nexport const N25 = \"hsl(210, 7%, 95%)\";\nexport const N20 = \"hsl(220, 16%, 96%)\";\nexport const N10 = \"hsl(210, 25%, 98%)\";\nexport const N5 = \"hsl(0, 0%, 98%)\";\nexport const N0 = \"hsl(0, 0%, 100%)\";\n\n// Primary color palette\nexport const primary1 = B500;\nexport const primary2 = B500;\nexport const primary3 = N0;\n"],"names":["VALID_THEME_MODES","STORAGE_KEY","ONE_YEAR_IN_SECONDS","DARK_MODE_QUERY","readStoredMode","stored","getCookie","writeStoredMode","mode","hostname","protocol","domain","getCookieDomain","secure","attributes","applyStoredModeToDocument","darkMode","resolveDarkMode","name","encodedName","cookies","cookie","parts","mediaQueryList","props","__props","darkModeMedia","prefersReducedMotionMedia","PREFERS_REDUCED_MOTION_QUERY","theme","ref","handleSystemPreferenceChange","watch","syncDarkMode","previousValue","setDocumentDarkModeAttribute","withThemeTransition","onBeforeUnmount","event","applyTheme","startViewTransition","element","THEME_TRANSITION_DURATION","provide","_openBlock","_createElementBlock","_hoisted_1","_renderSlot","_ctx","MODE_LABELS","map","option","VALID_MODES","emit","__emit","open","initialMode","internalMode","computed","_createBlock","_unref","DropdownMenu","$event","_createVNode","DropdownItemGroup","DropdownItemRadio","_createElementVNode","B900","B600","B500","B400","B300","B200","B100","R400","R300","Y300","Y200","G500","G300","N1000","N900","N800","N500","N400","N300","N200","N100","N90","N80","N70","N40","N30","N25","N20","N10","N5","N0","primary1","primary2","primary3"],"mappings":"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"}
1
+ {"version":3,"file":"theme.cjs.js","sources":["../src/modeStorage.js","../src/Theme.vue","../src/ThemeSwitcher.vue","../src/colors.js"],"sourcesContent":["const VALID_THEME_MODES = [\"auto\", \"light\", \"dark\"];\nconst STORAGE_KEY = \"gospore-theme-mode\";\nconst ONE_YEAR_IN_SECONDS = 60 * 60 * 24 * 365;\nconst DARK_MODE_QUERY = \"(prefers-color-scheme: dark)\";\n\nexport function readStoredMode() {\n if (typeof document === \"undefined\") {\n return null;\n }\n const stored = getCookie(STORAGE_KEY);\n return stored && VALID_THEME_MODES.includes(stored) ? stored : null;\n}\n\nexport function writeStoredMode(mode) {\n if (typeof document === \"undefined\" || !VALID_THEME_MODES.includes(mode)) {\n return;\n }\n const hostname =\n typeof window !== \"undefined\" ? window.location.hostname : \"\";\n const protocol =\n typeof window !== \"undefined\" ? window.location.protocol : \"\";\n const domain = getCookieDomain(hostname);\n const secure = protocol === \"https:\";\n const attributes = [\n \"path=/\",\n `max-age=${ONE_YEAR_IN_SECONDS}`,\n \"SameSite=Lax\",\n ];\n if (domain) {\n attributes.push(`domain=${domain}`);\n }\n if (secure) {\n attributes.push(\"Secure\");\n }\n document.cookie = [\n `${encodeURIComponent(STORAGE_KEY)}=${encodeURIComponent(mode)}`,\n ...attributes,\n ].join(\"; \");\n}\n\nexport function applyStoredModeToDocument(mode) {\n if (typeof document === \"undefined\") {\n return;\n }\n const resolvedMode =\n typeof mode === \"string\" && VALID_THEME_MODES.includes(mode)\n ? mode\n : readStoredMode() ?? \"auto\";\n console.log(\"Applying theme mode:\", resolvedMode);\n const darkMode = resolveDarkMode(resolvedMode);\n document.documentElement.setAttribute(\"dark-mode\", darkMode);\n}\n\nexport { VALID_THEME_MODES, STORAGE_KEY };\n\nfunction getCookie(name) {\n if (typeof document === \"undefined\" || !document.cookie) {\n return null;\n }\n const encodedName = `${encodeURIComponent(name)}=`;\n const cookies = document.cookie.split(\"; \");\n for (const cookie of cookies) {\n if (cookie.startsWith(encodedName)) {\n return decodeURIComponent(cookie.slice(encodedName.length));\n }\n }\n return null;\n}\n\nfunction getCookieDomain(hostname) {\n if (!hostname || hostname === \"localhost\") {\n return null;\n }\n const isIpAddress = /^\\d+(?:\\.\\d+){3}$/.test(hostname);\n if (isIpAddress) {\n return hostname;\n }\n const parts = hostname.split(\".\");\n if (parts.length <= 1) {\n return null;\n }\n if (parts.length === 2) {\n return hostname;\n }\n return parts.slice(-2).join(\".\");\n}\n\nfunction resolveDarkMode(mode) {\n if (mode === \"dark\") {\n return true;\n }\n if (mode === \"light\") {\n return false;\n }\n if (typeof window === \"undefined\") {\n return false;\n }\n try {\n const mediaQueryList =\n typeof window.matchMedia === \"function\"\n ? window.matchMedia(DARK_MODE_QUERY)\n : null;\n return mediaQueryList ? mediaQueryList.matches : false;\n } catch (error) {\n return false;\n }\n}\n","<template>\n <div class=\"theme\">\n <slot />\n </div>\n</template>\n\n<script setup>\nimport { provide, ref, watch, onBeforeUnmount } from \"vue\";\nimport { applyStoredModeToDocument, readStoredMode } from \"./modeStorage\";\nimport \"what-input\";\n\ndefineOptions({\n name: \"Theme\",\n});\nconst props = defineProps({\n mode: {\n type: String,\n validator: (value) => [\"auto\", \"light\", \"dark\"].includes(value),\n },\n});\n\nconst DARK_MODE_QUERY = \"(prefers-color-scheme: dark)\";\nconst PREFERS_REDUCED_MOTION_QUERY = \"(prefers-reduced-motion: reduce)\";\nconst THEME_TRANSITION_DURATION = 200;\nconst darkModeMedia = window.matchMedia(DARK_MODE_QUERY);\nconst prefersReducedMotionMedia = window.matchMedia(\n PREFERS_REDUCED_MOTION_QUERY,\n);\n\nconst initialMode = getEffectiveMode();\napplyStoredModeToDocument(initialMode);\n\nconst currentMode = ref(initialMode);\n\nconst theme = ref({\n darkMode: resolveDarkMode(initialMode),\n});\n\ndarkModeMedia.addEventListener(\"change\", handleSystemPreferenceChange);\n\nwatch(\n () => props.mode,\n () => {\n syncDarkMode();\n },\n { immediate: true },\n);\n\nwatch(\n () => theme.value.darkMode,\n (darkMode, previousValue) => {\n if (previousValue === undefined) {\n setDocumentDarkModeAttribute(darkMode);\n return;\n }\n withThemeTransition(() => {\n setDocumentDarkModeAttribute(darkMode);\n });\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => {\n darkModeMedia.removeEventListener(\"change\", handleSystemPreferenceChange);\n});\n\nfunction syncDarkMode() {\n const mode = getEffectiveMode();\n currentMode.value = mode;\n theme.value.darkMode = resolveDarkMode(mode);\n}\n\nfunction resolveDarkMode(mode) {\n if (mode === \"dark\") {\n return true;\n }\n if (mode === \"light\") {\n return false;\n }\n return darkModeMedia.matches;\n}\n\nfunction handleSystemPreferenceChange(event) {\n if (!event || currentMode.value !== \"auto\") {\n return;\n }\n theme.value.darkMode = event.matches;\n}\n\nfunction setDocumentDarkModeAttribute(darkMode) {\n document.documentElement.setAttribute(\"dark-mode\", darkMode);\n}\n\nfunction withThemeTransition(applyTheme) {\n if (prefersReducedMotionMedia.matches) {\n applyTheme();\n return;\n }\n const startViewTransition = document.startViewTransition?.bind(document);\n if (startViewTransition) {\n startViewTransition(() => {\n applyTheme();\n });\n return;\n }\n applyTheme();\n const element = document.documentElement;\n if (typeof element.animate !== \"function\") {\n return;\n }\n window.requestAnimationFrame(() => {\n element.animate([{ opacity: 0.85 }, { opacity: 1 }], {\n duration: THEME_TRANSITION_DURATION,\n easing: \"ease-in-out\",\n });\n });\n}\n\nfunction getEffectiveMode() {\n return props.mode ?? readStoredMode() ?? \"auto\";\n}\n\nprovide(\"theme\", theme);\n</script>\n\n<style lang=\"less\">\n@import \"index.less\";\n</style>\n","<template>\n <DropdownMenu\n v-model:open=\"open\"\n text=\"Theme\"\n aria-label=\"Select theme mode\"\n >\n <DropdownItemGroup title=\"Theme\">\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"auto\"\n :label=\"MODE_LABELS.auto\"\n :aria-label=\"`${MODE_LABELS.auto} mode`\"\n />\n <hr class=\"theme-switcher-divider\" role=\"separator\" />\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"light\"\n :label=\"MODE_LABELS.light\"\n :aria-label=\"`${MODE_LABELS.light} mode`\"\n />\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"dark\"\n :label=\"MODE_LABELS.dark\"\n :aria-label=\"`${MODE_LABELS.dark} mode`\"\n />\n </DropdownItemGroup>\n </DropdownMenu>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from \"vue\";\nimport {\n DropdownMenu,\n DropdownItemGroup,\n DropdownItemRadio,\n} from \"@gospore/dropdown-menu\";\nimport {\n readStoredMode,\n writeStoredMode,\n VALID_THEME_MODES,\n applyStoredModeToDocument,\n} from \"./modeStorage\";\n\nconst MODE_OPTIONS = [\n { value: \"auto\", label: \"System\" },\n { value: \"light\", label: \"Light\" },\n { value: \"dark\", label: \"Dark\" },\n];\nconst MODE_LABELS = MODE_OPTIONS.reduce((map, option) => {\n map[option.value] = option.label;\n return map;\n}, {});\nconst VALID_MODES = VALID_THEME_MODES;\n\nconst props = defineProps({\n mode: {\n type: String,\n default: \"auto\",\n validator: (value) => [\"auto\", \"light\", \"dark\"].includes(value),\n },\n});\nconst emit = defineEmits([\"update:mode\"]);\n\napplyStoredModeToDocument();\n\nconst open = ref(false);\nconst initialMode = readStoredMode() ?? props.mode;\nconst internalMode = ref(\n VALID_MODES.includes(initialMode) ? initialMode : \"auto\",\n);\nconst label = computed(\n () => MODE_LABELS[internalMode.value] ?? MODE_LABELS.auto,\n);\n\nwatch(\n () => props.mode,\n (mode) => {\n if (VALID_MODES.includes(mode) && mode !== internalMode.value) {\n internalMode.value = mode;\n }\n },\n);\n\nwatch(\n internalMode,\n (mode) => {\n if (!VALID_MODES.includes(mode)) {\n internalMode.value = \"auto\";\n return;\n }\n open.value = false;\n emit(\"update:mode\", mode);\n writeStoredMode(mode);\n },\n { immediate: true },\n);\n\n</script>\n\n<style scoped lang=\"less\">\n.theme-switcher-divider {\n margin: 4px 0;\n background-color: var(--go-color-n20);\n}\n\n[dark-mode=\"true\"] {\n .theme-switcher-divider {\n background-color: var(--background-color-secondary-dark);\n }\n}\n</style>\n","// Blues\nexport const B900 = \"hsl(225, 90%, 16%)\";\n// @go-color-b700 = #000e7f;\nexport const B600 = \"#061f80\";\nexport const B500 = \"hsl(225, 94%, 35%)\";\n// @go-color-b550 = #131ff2;\n// @go-color-b500 = #001dff;\n// @go-color-b400 = #3333ff;\nexport const B400 = \"#06c\";\nexport const B300 = \"hsl(210, 100%, 50%)\";\nexport const B200 = \"hsl(210, 100%, 93%)\";\nexport const B100 = \"hsl(225, 100%, 96%)\";\n\n// Reds\nexport const R400 = \"hsl(12, 91%, 46%)\";\nexport const R300 = \"hsl(11, 100%, 59%)\";\n\n// Yellows\nexport const Y300 = \"hsl(40, 100%, 50%)\";\nexport const Y200 = \"hsl(46, 100%, 50%)\";\n\n// Greens\nexport const G500 = \"hsl(120, 100%, 25%)\";\nexport const G300 = \"#36b37e\";\n\n// Neutrals\nexport const N1000 = \"hsl(0, 0%, 0%)\";\nexport const N900 = \"hsl(218, 76%, 15%)\";\n// @go-color-n900 = hsl(218, 54%, 20%);\nexport const N800 = \"hsla(0,0%,10%,.9)\";\nexport const N500 = \"hsla(0,0%,10%,.6)\";\nexport const N400 = \"hsl(218, 20%, 39%)\";\nexport const N300 = \"hsl(218, 17%, 44%)\";\nexport const N200 = \"hsl(218, 14%, 49%)\";\nexport const N100 = \"hsl(218, 14%, 54%)\";\nexport const N90 = \"hsl(218, 13%, 59%)\";\nexport const N80 = \"hsl(218, 13%, 64%)\";\nexport const N70 = \"hsl(217, 13%, 69%)\";\nexport const N40 = \"hsl(223, 12%, 89%)\";\nexport const N30 = \"hsl(228, 14%, 93%)\";\nexport const N25 = \"hsl(210, 7%, 95%)\";\nexport const N20 = \"hsl(220, 16%, 96%)\";\nexport const N10 = \"hsl(210, 25%, 98%)\";\nexport const N5 = \"hsl(0, 0%, 98%)\";\nexport const N0 = \"hsl(0, 0%, 100%)\";\n\n// Primary color palette\nexport const primary1 = B500;\nexport const primary2 = B500;\nexport const primary3 = N0;\n"],"names":["VALID_THEME_MODES","STORAGE_KEY","ONE_YEAR_IN_SECONDS","DARK_MODE_QUERY","readStoredMode","stored","getCookie","writeStoredMode","mode","hostname","protocol","domain","getCookieDomain","secure","attributes","applyStoredModeToDocument","resolvedMode","darkMode","resolveDarkMode","name","encodedName","cookies","cookie","parts","mediaQueryList","props","__props","darkModeMedia","prefersReducedMotionMedia","PREFERS_REDUCED_MOTION_QUERY","initialMode","getEffectiveMode","currentMode","ref","theme","handleSystemPreferenceChange","watch","syncDarkMode","previousValue","setDocumentDarkModeAttribute","withThemeTransition","onBeforeUnmount","event","applyTheme","startViewTransition","element","THEME_TRANSITION_DURATION","provide","_openBlock","_createElementBlock","_hoisted_1","_renderSlot","_ctx","MODE_LABELS","map","option","VALID_MODES","emit","__emit","open","internalMode","computed","_createBlock","_unref","DropdownMenu","$event","_createVNode","DropdownItemGroup","DropdownItemRadio","_createElementVNode","B900","B600","B500","B400","B300","B200","B100","R400","R300","Y300","Y200","G500","G300","N1000","N900","N800","N500","N400","N300","N200","N100","N90","N80","N70","N40","N30","N25","N20","N10","N5","N0","primary1","primary2","primary3"],"mappings":"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"}
package/dist/theme.es.js CHANGED
@@ -1,150 +1,149 @@
1
- import { ref as v, watch as p, onBeforeUnmount as g, provide as S, createElementBlock as y, openBlock as E, renderSlot as O, computed as R, createBlock as T, unref as l, withCtx as M, createVNode as h, createElementVNode as I } from "vue";
1
+ import { ref as v, watch as M, onBeforeUnmount as O, provide as R, createElementBlock as T, openBlock as D, renderSlot as I, computed as A, createBlock as U, unref as l, withCtx as g, createVNode as k, createElementVNode as B } from "vue";
2
2
  import "what-input";
3
- import { DropdownMenu as A, DropdownItemGroup as U, DropdownItemRadio as k } from "@gospore/dropdown-menu";
4
- const w = ["auto", "light", "dark"], N = "gospore-theme-mode", B = 60 * 60 * 24 * 365, $ = "(prefers-color-scheme: dark)";
5
- function _() {
3
+ import { DropdownMenu as $, DropdownItemGroup as C, DropdownItemRadio as E } from "@gospore/dropdown-menu";
4
+ const w = ["auto", "light", "dark"], b = "gospore-theme-mode", L = 60 * 60 * 24 * 365, x = "(prefers-color-scheme: dark)";
5
+ function N() {
6
6
  if (typeof document > "u")
7
7
  return null;
8
- const e = L(N);
8
+ const e = V(b);
9
9
  return e && w.includes(e) ? e : null;
10
10
  }
11
- function C(e) {
11
+ function Y(e) {
12
12
  if (typeof document > "u" || !w.includes(e))
13
13
  return;
14
- const o = typeof window < "u" ? window.location.hostname : "", s = typeof window < "u" ? window.location.protocol : "", r = x(o), c = s === "https:", d = [
14
+ const t = typeof window < "u" ? window.location.hostname : "", r = typeof window < "u" ? window.location.protocol : "", n = G(t), i = r === "https:", u = [
15
15
  "path=/",
16
- `max-age=${B}`,
16
+ `max-age=${L}`,
17
17
  "SameSite=Lax"
18
18
  ];
19
- r && d.push(`domain=${r}`), c && d.push("Secure"), document.cookie = [
20
- `${encodeURIComponent(N)}=${encodeURIComponent(e)}`,
21
- ...d
19
+ n && u.push(`domain=${n}`), i && u.push("Secure"), document.cookie = [
20
+ `${encodeURIComponent(b)}=${encodeURIComponent(e)}`,
21
+ ...u
22
22
  ].join("; ");
23
23
  }
24
- function D() {
24
+ function S(e) {
25
25
  if (typeof document > "u")
26
26
  return;
27
- const e = _() ?? "auto", o = Y(e);
28
- document.documentElement.setAttribute("dark-mode", o);
27
+ const t = typeof e == "string" && w.includes(e) ? e : N() ?? "auto";
28
+ console.log("Applying theme mode:", t);
29
+ const r = P(t);
30
+ document.documentElement.setAttribute("dark-mode", r);
29
31
  }
30
- function L(e) {
32
+ function V(e) {
31
33
  if (typeof document > "u" || !document.cookie)
32
34
  return null;
33
- const o = `${encodeURIComponent(e)}=`, s = document.cookie.split("; ");
34
- for (const r of s)
35
- if (r.startsWith(o))
36
- return decodeURIComponent(r.slice(o.length));
35
+ const t = `${encodeURIComponent(e)}=`, r = document.cookie.split("; ");
36
+ for (const n of r)
37
+ if (n.startsWith(t))
38
+ return decodeURIComponent(n.slice(t.length));
37
39
  return null;
38
40
  }
39
- function x(e) {
41
+ function G(e) {
40
42
  if (!e || e === "localhost")
41
43
  return null;
42
44
  if (/^\d+(?:\.\d+){3}$/.test(e))
43
45
  return e;
44
- const s = e.split(".");
45
- return s.length <= 1 ? null : s.length === 2 ? e : s.slice(-2).join(".");
46
+ const r = e.split(".");
47
+ return r.length <= 1 ? null : r.length === 2 ? e : r.slice(-2).join(".");
46
48
  }
47
- function Y(e) {
49
+ function P(e) {
48
50
  if (e === "dark")
49
51
  return !0;
50
52
  if (e === "light" || typeof window > "u")
51
53
  return !1;
52
54
  try {
53
- const o = typeof window.matchMedia == "function" ? window.matchMedia($) : null;
54
- return o ? o.matches : !1;
55
+ const t = typeof window.matchMedia == "function" ? window.matchMedia(x) : null;
56
+ return t ? t.matches : !1;
55
57
  } catch {
56
58
  return !1;
57
59
  }
58
60
  }
59
- const V = { class: "theme" }, G = "(prefers-color-scheme: dark)", P = "(prefers-reduced-motion: reduce)", Q = 200, z = /* @__PURE__ */ Object.assign({
61
+ const Q = { class: "theme" }, j = "(prefers-color-scheme: dark)", K = "(prefers-reduced-motion: reduce)", F = 200, Z = /* @__PURE__ */ Object.assign({
60
62
  name: "Theme"
61
63
  }, {
62
64
  __name: "Theme",
63
65
  props: {
64
66
  mode: {
65
67
  type: String,
66
- default: "auto",
67
68
  validator: (e) => ["auto", "light", "dark"].includes(e)
68
69
  }
69
70
  },
70
71
  setup(e) {
71
- const o = e, s = window.matchMedia(G), r = window.matchMedia(
72
- P
73
- );
74
- D();
75
- const c = v({
76
- darkMode: f(o.mode)
72
+ const t = e, r = window.matchMedia(j), n = window.matchMedia(
73
+ K
74
+ ), i = d();
75
+ S(i);
76
+ const u = v(i), m = v({
77
+ darkMode: h(i)
77
78
  });
78
- s.addEventListener("change", u), p(
79
- () => o.mode,
79
+ r.addEventListener("change", c), M(
80
+ () => t.mode,
80
81
  () => {
81
- d();
82
+ f();
82
83
  },
83
84
  { immediate: !0 }
84
- ), p(
85
- () => c.value.darkMode,
86
- (t, n) => {
87
- if (n === void 0) {
88
- m(t);
85
+ ), M(
86
+ () => m.value.darkMode,
87
+ (o, p) => {
88
+ if (p === void 0) {
89
+ a(o);
89
90
  return;
90
91
  }
91
- a(() => {
92
- m(t);
92
+ s(() => {
93
+ a(o);
93
94
  });
94
95
  },
95
96
  { immediate: !0 }
96
- ), g(() => {
97
- s.removeEventListener("change", u);
97
+ ), O(() => {
98
+ r.removeEventListener("change", c);
98
99
  });
99
- function d() {
100
- c.value.darkMode = f(o.mode);
100
+ function f() {
101
+ const o = d();
102
+ u.value = o, m.value.darkMode = h(o);
101
103
  }
102
- function f(t) {
103
- return t === "dark" ? !0 : t === "light" ? !1 : s.matches;
104
+ function h(o) {
105
+ return o === "dark" ? !0 : o === "light" ? !1 : r.matches;
104
106
  }
105
- function u(t) {
106
- !t || o.mode !== "auto" || (c.value.darkMode = t.matches);
107
+ function c(o) {
108
+ !o || u.value !== "auto" || (m.value.darkMode = o.matches);
107
109
  }
108
- function m(t) {
109
- document.documentElement.setAttribute("dark-mode", t);
110
+ function a(o) {
111
+ document.documentElement.setAttribute("dark-mode", o);
110
112
  }
111
- function a(t) {
112
- if (r.matches) {
113
- t();
113
+ function s(o) {
114
+ if (n.matches) {
115
+ o();
114
116
  return;
115
117
  }
116
- const n = document.startViewTransition?.bind(document);
117
- if (n) {
118
- n(() => {
119
- t();
118
+ const p = document.startViewTransition?.bind(document);
119
+ if (p) {
120
+ p(() => {
121
+ o();
120
122
  });
121
123
  return;
122
124
  }
123
- t();
124
- const i = document.documentElement;
125
- typeof i.animate == "function" && window.requestAnimationFrame(() => {
126
- i.animate(
127
- [
128
- { opacity: 0.85 },
129
- { opacity: 1 }
130
- ],
131
- {
132
- duration: Q,
133
- easing: "ease-in-out"
134
- }
135
- );
125
+ o();
126
+ const _ = document.documentElement;
127
+ typeof _.animate == "function" && window.requestAnimationFrame(() => {
128
+ _.animate([{ opacity: 0.85 }, { opacity: 1 }], {
129
+ duration: F,
130
+ easing: "ease-in-out"
131
+ });
136
132
  });
137
133
  }
138
- return S("theme", c), (t, n) => (E(), y("div", V, [
139
- O(t.$slots, "default")
134
+ function d() {
135
+ return t.mode ?? N() ?? "auto";
136
+ }
137
+ return R("theme", m), (o, p) => (D(), T("div", Q, [
138
+ I(o.$slots, "default")
140
139
  ]));
141
140
  }
142
- }), j = (e, o) => {
143
- const s = e.__vccOpts || e;
144
- for (const [r, c] of o)
145
- s[r] = c;
146
- return s;
147
- }, K = {
141
+ }), H = (e, t) => {
142
+ const r = e.__vccOpts || e;
143
+ for (const [n, i] of t)
144
+ r[n] = i;
145
+ return r;
146
+ }, q = {
148
147
  __name: "ThemeSwitcher",
149
148
  props: {
150
149
  mode: {
@@ -154,66 +153,66 @@ const V = { class: "theme" }, G = "(prefers-color-scheme: dark)", P = "(prefers-
154
153
  }
155
154
  },
156
155
  emits: ["update:mode"],
157
- setup(e, { emit: o }) {
158
- const r = [
156
+ setup(e, { emit: t }) {
157
+ const n = [
159
158
  { value: "auto", label: "System" },
160
159
  { value: "light", label: "Light" },
161
160
  { value: "dark", label: "Dark" }
162
- ].reduce((t, n) => (t[n.value] = n.label, t), {}), c = w, d = e, f = o;
163
- D();
164
- const u = v(!1), m = _() ?? d.mode, a = v(
165
- c.includes(m) ? m : "auto"
161
+ ].reduce((a, s) => (a[s.value] = s.label, a), {}), i = w, u = e, m = t;
162
+ S();
163
+ const f = v(!1), h = N() ?? u.mode, c = v(
164
+ i.includes(h) ? h : "auto"
166
165
  );
167
- return R(
168
- () => r[a.value] ?? r.auto
169
- ), p(
170
- () => d.mode,
171
- (t) => {
172
- c.includes(t) && t !== a.value && (a.value = t);
166
+ return A(
167
+ () => n[c.value] ?? n.auto
168
+ ), M(
169
+ () => u.mode,
170
+ (a) => {
171
+ i.includes(a) && a !== c.value && (c.value = a);
173
172
  }
174
- ), p(
175
- a,
176
- (t) => {
177
- if (!c.includes(t)) {
178
- a.value = "auto";
173
+ ), M(
174
+ c,
175
+ (a) => {
176
+ if (!i.includes(a)) {
177
+ c.value = "auto";
179
178
  return;
180
179
  }
181
- u.value = !1, f("update:mode", t), C(t);
180
+ f.value = !1, m("update:mode", a), Y(a);
182
181
  },
183
182
  { immediate: !0 }
184
- ), (t, n) => (E(), T(l(A), {
185
- open: u.value,
186
- "onUpdate:open": n[3] || (n[3] = (i) => u.value = i),
183
+ ), (a, s) => (D(), U(l($), {
184
+ open: f.value,
185
+ "onUpdate:open": s[3] || (s[3] = (d) => f.value = d),
187
186
  text: "Theme",
188
187
  "aria-label": "Select theme mode"
189
188
  }, {
190
- default: M(() => [
191
- h(l(U), { title: "Theme" }, {
192
- default: M(() => [
193
- h(l(k), {
194
- checked: a.value,
195
- "onUpdate:checked": n[0] || (n[0] = (i) => a.value = i),
189
+ default: g(() => [
190
+ k(l(C), { title: "Theme" }, {
191
+ default: g(() => [
192
+ k(l(E), {
193
+ checked: c.value,
194
+ "onUpdate:checked": s[0] || (s[0] = (d) => c.value = d),
196
195
  value: "auto",
197
- label: l(r).auto,
198
- "aria-label": `${l(r).auto} mode`
196
+ label: l(n).auto,
197
+ "aria-label": `${l(n).auto} mode`
199
198
  }, null, 8, ["checked", "label", "aria-label"]),
200
- n[4] || (n[4] = I("hr", {
199
+ s[4] || (s[4] = B("hr", {
201
200
  class: "theme-switcher-divider",
202
201
  role: "separator"
203
202
  }, null, -1)),
204
- h(l(k), {
205
- checked: a.value,
206
- "onUpdate:checked": n[1] || (n[1] = (i) => a.value = i),
203
+ k(l(E), {
204
+ checked: c.value,
205
+ "onUpdate:checked": s[1] || (s[1] = (d) => c.value = d),
207
206
  value: "light",
208
- label: l(r).light,
209
- "aria-label": `${l(r).light} mode`
207
+ label: l(n).light,
208
+ "aria-label": `${l(n).light} mode`
210
209
  }, null, 8, ["checked", "label", "aria-label"]),
211
- h(l(k), {
212
- checked: a.value,
213
- "onUpdate:checked": n[2] || (n[2] = (i) => a.value = i),
210
+ k(l(E), {
211
+ checked: c.value,
212
+ "onUpdate:checked": s[2] || (s[2] = (d) => c.value = d),
214
213
  value: "dark",
215
- label: l(r).dark,
216
- "aria-label": `${l(r).dark} mode`
214
+ label: l(n).dark,
215
+ "aria-label": `${l(n).dark} mode`
217
216
  }, null, 8, ["checked", "label", "aria-label"])
218
217
  ]),
219
218
  _: 1
@@ -222,43 +221,43 @@ const V = { class: "theme" }, G = "(prefers-color-scheme: dark)", P = "(prefers-
222
221
  _: 1
223
222
  }, 8, ["open"]));
224
223
  }
225
- }, J = /* @__PURE__ */ j(K, [["__scopeId", "data-v-9b82a61c"]]), X = "hsl(225, 90%, 16%)", Z = "#061f80", b = "hsl(225, 94%, 35%)", ee = "#06c", te = "hsl(210, 100%, 50%)", oe = "hsl(210, 100%, 93%)", ne = "hsl(225, 100%, 96%)", re = "hsl(12, 91%, 46%)", se = "hsl(11, 100%, 59%)", ae = "hsl(40, 100%, 50%)", ce = "hsl(46, 100%, 50%)", le = "hsl(120, 100%, 25%)", ie = "#36b37e", de = "hsl(0, 0%, 0%)", ue = "hsl(218, 76%, 15%)", me = "hsla(0,0%,10%,.9)", fe = "hsla(0,0%,10%,.6)", he = "hsl(218, 20%, 39%)", pe = "hsl(218, 17%, 44%)", ke = "hsl(218, 14%, 49%)", ve = "hsl(218, 14%, 54%)", we = "hsl(218, 13%, 59%)", Me = "hsl(218, 13%, 64%)", Ee = "hsl(217, 13%, 69%)", Ne = "hsl(223, 12%, 89%)", _e = "hsl(228, 14%, 93%)", De = "hsl(210, 7%, 95%)", be = "hsl(220, 16%, 96%)", ge = "hsl(210, 25%, 98%)", Se = "hsl(0, 0%, 98%)", F = "hsl(0, 0%, 100%)", ye = b, Oe = b, Re = F;
224
+ }, ee = /* @__PURE__ */ H(q, [["__scopeId", "data-v-9b82a61c"]]), te = "hsl(225, 90%, 16%)", oe = "#061f80", y = "hsl(225, 94%, 35%)", ne = "#06c", re = "hsl(210, 100%, 50%)", se = "hsl(210, 100%, 93%)", ce = "hsl(225, 100%, 96%)", ae = "hsl(12, 91%, 46%)", ie = "hsl(11, 100%, 59%)", le = "hsl(40, 100%, 50%)", de = "hsl(46, 100%, 50%)", ue = "hsl(120, 100%, 25%)", me = "#36b37e", fe = "hsl(0, 0%, 0%)", he = "hsl(218, 76%, 15%)", pe = "hsla(0,0%,10%,.9)", ke = "hsla(0,0%,10%,.6)", ve = "hsl(218, 20%, 39%)", Me = "hsl(218, 17%, 44%)", we = "hsl(218, 14%, 49%)", Ee = "hsl(218, 14%, 54%)", Ne = "hsl(218, 13%, 59%)", _e = "hsl(218, 13%, 64%)", ge = "hsl(217, 13%, 69%)", De = "hsl(223, 12%, 89%)", be = "hsl(228, 14%, 93%)", Se = "hsl(210, 7%, 95%)", ye = "hsl(220, 16%, 96%)", Oe = "hsl(210, 25%, 98%)", Re = "hsl(0, 0%, 98%)", W = "hsl(0, 0%, 100%)", Te = y, Ie = y, Ae = W;
226
225
  export {
227
- ne as B100,
228
- oe as B200,
229
- te as B300,
230
- ee as B400,
231
- b as B500,
232
- Z as B600,
233
- X as B900,
234
- ie as G300,
235
- le as G500,
236
- F as N0,
237
- ge as N10,
238
- ve as N100,
239
- de as N1000,
240
- be as N20,
241
- ke as N200,
242
- De as N25,
243
- _e as N30,
244
- pe as N300,
245
- Ne as N40,
246
- he as N400,
247
- Se as N5,
248
- fe as N500,
249
- Ee as N70,
250
- Me as N80,
251
- me as N800,
252
- we as N90,
253
- ue as N900,
254
- se as R300,
255
- re as R400,
256
- z as Theme,
257
- J as ThemeSwitcher,
258
- ce as Y200,
259
- ae as Y300,
260
- ye as primary1,
261
- Oe as primary2,
262
- Re as primary3
226
+ ce as B100,
227
+ se as B200,
228
+ re as B300,
229
+ ne as B400,
230
+ y as B500,
231
+ oe as B600,
232
+ te as B900,
233
+ me as G300,
234
+ ue as G500,
235
+ W as N0,
236
+ Oe as N10,
237
+ Ee as N100,
238
+ fe as N1000,
239
+ ye as N20,
240
+ we as N200,
241
+ Se as N25,
242
+ be as N30,
243
+ Me as N300,
244
+ De as N40,
245
+ ve as N400,
246
+ Re as N5,
247
+ ke as N500,
248
+ ge as N70,
249
+ _e as N80,
250
+ pe as N800,
251
+ Ne as N90,
252
+ he as N900,
253
+ ie as R300,
254
+ ae as R400,
255
+ Z as Theme,
256
+ ee as ThemeSwitcher,
257
+ de as Y200,
258
+ le as Y300,
259
+ Te as primary1,
260
+ Ie as primary2,
261
+ Ae as primary3
263
262
  };
264
263
  //# sourceMappingURL=theme.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.es.js","sources":["../src/modeStorage.js","../src/Theme.vue","../src/ThemeSwitcher.vue","../src/colors.js"],"sourcesContent":["const VALID_THEME_MODES = [\"auto\", \"light\", \"dark\"];\nconst STORAGE_KEY = \"gospore-theme-mode\";\nconst ONE_YEAR_IN_SECONDS = 60 * 60 * 24 * 365;\nconst DARK_MODE_QUERY = \"(prefers-color-scheme: dark)\";\n\nexport function readStoredMode() {\n if (typeof document === \"undefined\") {\n return null;\n }\n const stored = getCookie(STORAGE_KEY);\n return stored && VALID_THEME_MODES.includes(stored) ? stored : null;\n}\n\nexport function writeStoredMode(mode) {\n if (typeof document === \"undefined\" || !VALID_THEME_MODES.includes(mode)) {\n return;\n }\n const hostname = typeof window !== \"undefined\" ? window.location.hostname : \"\";\n const protocol = typeof window !== \"undefined\" ? window.location.protocol : \"\";\n const domain = getCookieDomain(hostname);\n const secure = protocol === \"https:\";\n const attributes = [\n \"path=/\",\n `max-age=${ONE_YEAR_IN_SECONDS}`,\n \"SameSite=Lax\",\n ];\n if (domain) {\n attributes.push(`domain=${domain}`);\n }\n if (secure) {\n attributes.push(\"Secure\");\n }\n document.cookie = [\n `${encodeURIComponent(STORAGE_KEY)}=${encodeURIComponent(mode)}`,\n ...attributes,\n ].join(\"; \");\n}\n\nexport function applyStoredModeToDocument() {\n if (typeof document === \"undefined\") {\n return;\n }\n const mode = readStoredMode() ?? \"auto\";\n const darkMode = resolveDarkMode(mode);\n document.documentElement.setAttribute(\"dark-mode\", darkMode);\n}\n\nexport { VALID_THEME_MODES, STORAGE_KEY };\n\nfunction getCookie(name) {\n if (typeof document === \"undefined\" || !document.cookie) {\n return null;\n }\n const encodedName = `${encodeURIComponent(name)}=`;\n const cookies = document.cookie.split(\"; \");\n for (const cookie of cookies) {\n if (cookie.startsWith(encodedName)) {\n return decodeURIComponent(cookie.slice(encodedName.length));\n }\n }\n return null;\n}\n\nfunction getCookieDomain(hostname) {\n if (!hostname || hostname === \"localhost\") {\n return null;\n }\n const isIpAddress = /^\\d+(?:\\.\\d+){3}$/.test(hostname);\n if (isIpAddress) {\n return hostname;\n }\n const parts = hostname.split(\".\");\n if (parts.length <= 1) {\n return null;\n }\n if (parts.length === 2) {\n return hostname;\n }\n return parts.slice(-2).join(\".\");\n}\n\nfunction resolveDarkMode(mode) {\n if (mode === \"dark\") {\n return true;\n }\n if (mode === \"light\") {\n return false;\n }\n if (typeof window === \"undefined\") {\n return false;\n }\n try {\n const mediaQueryList =\n typeof window.matchMedia === \"function\"\n ? window.matchMedia(DARK_MODE_QUERY)\n : null;\n return mediaQueryList ? mediaQueryList.matches : false;\n } catch (error) {\n return false;\n }\n}\n","<template>\n <div class=\"theme\">\n <slot />\n </div>\n</template>\n\n<script setup>\nimport { provide, ref, watch, onBeforeUnmount } from \"vue\";\nimport { applyStoredModeToDocument } from \"./modeStorage\";\nimport \"what-input\";\n\ndefineOptions({\n name: \"Theme\",\n});\nconst props = defineProps({\n mode: {\n type: String,\n default: \"auto\",\n validator: (value) => [\"auto\", \"light\", \"dark\"].includes(value),\n },\n});\n\nconst DARK_MODE_QUERY = \"(prefers-color-scheme: dark)\";\nconst PREFERS_REDUCED_MOTION_QUERY = \"(prefers-reduced-motion: reduce)\";\nconst THEME_TRANSITION_DURATION = 200;\nconst darkModeMedia = window.matchMedia(DARK_MODE_QUERY);\nconst prefersReducedMotionMedia = window.matchMedia(\n PREFERS_REDUCED_MOTION_QUERY,\n);\n\napplyStoredModeToDocument();\n\nconst theme = ref({\n darkMode: resolveDarkMode(props.mode),\n});\n\ndarkModeMedia.addEventListener(\"change\", handleSystemPreferenceChange);\n\nwatch(\n () => props.mode,\n () => {\n syncDarkMode();\n },\n { immediate: true },\n);\n\nwatch(\n () => theme.value.darkMode,\n (darkMode, previousValue) => {\n if (previousValue === undefined) {\n setDocumentDarkModeAttribute(darkMode);\n return;\n }\n withThemeTransition(() => {\n setDocumentDarkModeAttribute(darkMode);\n });\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => {\n darkModeMedia.removeEventListener(\"change\", handleSystemPreferenceChange);\n});\n\nfunction syncDarkMode() {\n theme.value.darkMode = resolveDarkMode(props.mode);\n}\n\nfunction resolveDarkMode(mode) {\n if (mode === \"dark\") {\n return true;\n }\n if (mode === \"light\") {\n return false;\n }\n return darkModeMedia.matches;\n}\n\nfunction handleSystemPreferenceChange(event) {\n if (!event || props.mode !== \"auto\") {\n return;\n }\n theme.value.darkMode = event.matches;\n}\n\nfunction setDocumentDarkModeAttribute(darkMode) {\n document.documentElement.setAttribute(\"dark-mode\", darkMode);\n}\n\nfunction withThemeTransition(applyTheme) {\n if (prefersReducedMotionMedia.matches) {\n applyTheme();\n return;\n }\n const startViewTransition = document.startViewTransition?.bind(document);\n if (startViewTransition) {\n startViewTransition(() => {\n applyTheme();\n });\n return;\n }\n applyTheme();\n const element = document.documentElement;\n if (typeof element.animate !== \"function\") {\n return;\n }\n window.requestAnimationFrame(() => {\n element.animate(\n [\n { opacity: 0.85 },\n { opacity: 1 },\n ],\n {\n duration: THEME_TRANSITION_DURATION,\n easing: \"ease-in-out\",\n },\n );\n });\n}\n\nprovide(\"theme\", theme);\n</script>\n\n<style lang=\"less\">\n@import \"index.less\";\n</style>\n","<template>\n <DropdownMenu\n v-model:open=\"open\"\n text=\"Theme\"\n aria-label=\"Select theme mode\"\n >\n <DropdownItemGroup title=\"Theme\">\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"auto\"\n :label=\"MODE_LABELS.auto\"\n :aria-label=\"`${MODE_LABELS.auto} mode`\"\n />\n <hr class=\"theme-switcher-divider\" role=\"separator\" />\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"light\"\n :label=\"MODE_LABELS.light\"\n :aria-label=\"`${MODE_LABELS.light} mode`\"\n />\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"dark\"\n :label=\"MODE_LABELS.dark\"\n :aria-label=\"`${MODE_LABELS.dark} mode`\"\n />\n </DropdownItemGroup>\n </DropdownMenu>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from \"vue\";\nimport {\n DropdownMenu,\n DropdownItemGroup,\n DropdownItemRadio,\n} from \"@gospore/dropdown-menu\";\nimport {\n readStoredMode,\n writeStoredMode,\n VALID_THEME_MODES,\n applyStoredModeToDocument,\n} from \"./modeStorage\";\n\nconst MODE_OPTIONS = [\n { value: \"auto\", label: \"System\" },\n { value: \"light\", label: \"Light\" },\n { value: \"dark\", label: \"Dark\" },\n];\nconst MODE_LABELS = MODE_OPTIONS.reduce((map, option) => {\n map[option.value] = option.label;\n return map;\n}, {});\nconst VALID_MODES = VALID_THEME_MODES;\n\nconst props = defineProps({\n mode: {\n type: String,\n default: \"auto\",\n validator: (value) => [\"auto\", \"light\", \"dark\"].includes(value),\n },\n});\nconst emit = defineEmits([\"update:mode\"]);\n\napplyStoredModeToDocument();\n\nconst open = ref(false);\nconst initialMode = readStoredMode() ?? props.mode;\nconst internalMode = ref(\n VALID_MODES.includes(initialMode) ? initialMode : \"auto\",\n);\nconst label = computed(\n () => MODE_LABELS[internalMode.value] ?? MODE_LABELS.auto,\n);\n\nwatch(\n () => props.mode,\n (mode) => {\n if (VALID_MODES.includes(mode) && mode !== internalMode.value) {\n internalMode.value = mode;\n }\n },\n);\n\nwatch(\n internalMode,\n (mode) => {\n if (!VALID_MODES.includes(mode)) {\n internalMode.value = \"auto\";\n return;\n }\n open.value = false;\n emit(\"update:mode\", mode);\n writeStoredMode(mode);\n },\n { immediate: true },\n);\n\n</script>\n\n<style scoped lang=\"less\">\n.theme-switcher-divider {\n margin: 4px 0;\n background-color: var(--go-color-n20);\n}\n\n[dark-mode=\"true\"] {\n .theme-switcher-divider {\n background-color: var(--background-color-secondary-dark);\n }\n}\n</style>\n","// Blues\nexport const B900 = \"hsl(225, 90%, 16%)\";\n// @go-color-b700 = #000e7f;\nexport const B600 = \"#061f80\";\nexport const B500 = \"hsl(225, 94%, 35%)\";\n// @go-color-b550 = #131ff2;\n// @go-color-b500 = #001dff;\n// @go-color-b400 = #3333ff;\nexport const B400 = \"#06c\";\nexport const B300 = \"hsl(210, 100%, 50%)\";\nexport const B200 = \"hsl(210, 100%, 93%)\";\nexport const B100 = \"hsl(225, 100%, 96%)\";\n\n// Reds\nexport const R400 = \"hsl(12, 91%, 46%)\";\nexport const R300 = \"hsl(11, 100%, 59%)\";\n\n// Yellows\nexport const Y300 = \"hsl(40, 100%, 50%)\";\nexport const Y200 = \"hsl(46, 100%, 50%)\";\n\n// Greens\nexport const G500 = \"hsl(120, 100%, 25%)\";\nexport const G300 = \"#36b37e\";\n\n// Neutrals\nexport const N1000 = \"hsl(0, 0%, 0%)\";\nexport const N900 = \"hsl(218, 76%, 15%)\";\n// @go-color-n900 = hsl(218, 54%, 20%);\nexport const N800 = \"hsla(0,0%,10%,.9)\";\nexport const N500 = \"hsla(0,0%,10%,.6)\";\nexport const N400 = \"hsl(218, 20%, 39%)\";\nexport const N300 = \"hsl(218, 17%, 44%)\";\nexport const N200 = \"hsl(218, 14%, 49%)\";\nexport const N100 = \"hsl(218, 14%, 54%)\";\nexport const N90 = \"hsl(218, 13%, 59%)\";\nexport const N80 = \"hsl(218, 13%, 64%)\";\nexport const N70 = \"hsl(217, 13%, 69%)\";\nexport const N40 = \"hsl(223, 12%, 89%)\";\nexport const N30 = \"hsl(228, 14%, 93%)\";\nexport const N25 = \"hsl(210, 7%, 95%)\";\nexport const N20 = \"hsl(220, 16%, 96%)\";\nexport const N10 = \"hsl(210, 25%, 98%)\";\nexport const N5 = \"hsl(0, 0%, 98%)\";\nexport const N0 = \"hsl(0, 0%, 100%)\";\n\n// Primary color palette\nexport const primary1 = B500;\nexport const primary2 = B500;\nexport const primary3 = N0;\n"],"names":["VALID_THEME_MODES","STORAGE_KEY","ONE_YEAR_IN_SECONDS","DARK_MODE_QUERY","readStoredMode","stored","getCookie","writeStoredMode","mode","hostname","protocol","domain","getCookieDomain","secure","attributes","applyStoredModeToDocument","darkMode","resolveDarkMode","name","encodedName","cookies","cookie","parts","mediaQueryList","props","__props","darkModeMedia","prefersReducedMotionMedia","PREFERS_REDUCED_MOTION_QUERY","theme","ref","handleSystemPreferenceChange","watch","syncDarkMode","previousValue","setDocumentDarkModeAttribute","withThemeTransition","onBeforeUnmount","event","applyTheme","startViewTransition","element","THEME_TRANSITION_DURATION","provide","_openBlock","_createElementBlock","_hoisted_1","_renderSlot","_ctx","MODE_LABELS","map","option","VALID_MODES","emit","__emit","open","initialMode","internalMode","computed","_createBlock","_unref","DropdownMenu","$event","_createVNode","DropdownItemGroup","DropdownItemRadio","_createElementVNode","B900","B600","B500","B400","B300","B200","B100","R400","R300","Y300","Y200","G500","G300","N1000","N900","N800","N500","N400","N300","N200","N100","N90","N80","N70","N40","N30","N25","N20","N10","N5","N0","primary1","primary2","primary3"],"mappings":"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"}
1
+ {"version":3,"file":"theme.es.js","sources":["../src/modeStorage.js","../src/Theme.vue","../src/ThemeSwitcher.vue","../src/colors.js"],"sourcesContent":["const VALID_THEME_MODES = [\"auto\", \"light\", \"dark\"];\nconst STORAGE_KEY = \"gospore-theme-mode\";\nconst ONE_YEAR_IN_SECONDS = 60 * 60 * 24 * 365;\nconst DARK_MODE_QUERY = \"(prefers-color-scheme: dark)\";\n\nexport function readStoredMode() {\n if (typeof document === \"undefined\") {\n return null;\n }\n const stored = getCookie(STORAGE_KEY);\n return stored && VALID_THEME_MODES.includes(stored) ? stored : null;\n}\n\nexport function writeStoredMode(mode) {\n if (typeof document === \"undefined\" || !VALID_THEME_MODES.includes(mode)) {\n return;\n }\n const hostname =\n typeof window !== \"undefined\" ? window.location.hostname : \"\";\n const protocol =\n typeof window !== \"undefined\" ? window.location.protocol : \"\";\n const domain = getCookieDomain(hostname);\n const secure = protocol === \"https:\";\n const attributes = [\n \"path=/\",\n `max-age=${ONE_YEAR_IN_SECONDS}`,\n \"SameSite=Lax\",\n ];\n if (domain) {\n attributes.push(`domain=${domain}`);\n }\n if (secure) {\n attributes.push(\"Secure\");\n }\n document.cookie = [\n `${encodeURIComponent(STORAGE_KEY)}=${encodeURIComponent(mode)}`,\n ...attributes,\n ].join(\"; \");\n}\n\nexport function applyStoredModeToDocument(mode) {\n if (typeof document === \"undefined\") {\n return;\n }\n const resolvedMode =\n typeof mode === \"string\" && VALID_THEME_MODES.includes(mode)\n ? mode\n : readStoredMode() ?? \"auto\";\n console.log(\"Applying theme mode:\", resolvedMode);\n const darkMode = resolveDarkMode(resolvedMode);\n document.documentElement.setAttribute(\"dark-mode\", darkMode);\n}\n\nexport { VALID_THEME_MODES, STORAGE_KEY };\n\nfunction getCookie(name) {\n if (typeof document === \"undefined\" || !document.cookie) {\n return null;\n }\n const encodedName = `${encodeURIComponent(name)}=`;\n const cookies = document.cookie.split(\"; \");\n for (const cookie of cookies) {\n if (cookie.startsWith(encodedName)) {\n return decodeURIComponent(cookie.slice(encodedName.length));\n }\n }\n return null;\n}\n\nfunction getCookieDomain(hostname) {\n if (!hostname || hostname === \"localhost\") {\n return null;\n }\n const isIpAddress = /^\\d+(?:\\.\\d+){3}$/.test(hostname);\n if (isIpAddress) {\n return hostname;\n }\n const parts = hostname.split(\".\");\n if (parts.length <= 1) {\n return null;\n }\n if (parts.length === 2) {\n return hostname;\n }\n return parts.slice(-2).join(\".\");\n}\n\nfunction resolveDarkMode(mode) {\n if (mode === \"dark\") {\n return true;\n }\n if (mode === \"light\") {\n return false;\n }\n if (typeof window === \"undefined\") {\n return false;\n }\n try {\n const mediaQueryList =\n typeof window.matchMedia === \"function\"\n ? window.matchMedia(DARK_MODE_QUERY)\n : null;\n return mediaQueryList ? mediaQueryList.matches : false;\n } catch (error) {\n return false;\n }\n}\n","<template>\n <div class=\"theme\">\n <slot />\n </div>\n</template>\n\n<script setup>\nimport { provide, ref, watch, onBeforeUnmount } from \"vue\";\nimport { applyStoredModeToDocument, readStoredMode } from \"./modeStorage\";\nimport \"what-input\";\n\ndefineOptions({\n name: \"Theme\",\n});\nconst props = defineProps({\n mode: {\n type: String,\n validator: (value) => [\"auto\", \"light\", \"dark\"].includes(value),\n },\n});\n\nconst DARK_MODE_QUERY = \"(prefers-color-scheme: dark)\";\nconst PREFERS_REDUCED_MOTION_QUERY = \"(prefers-reduced-motion: reduce)\";\nconst THEME_TRANSITION_DURATION = 200;\nconst darkModeMedia = window.matchMedia(DARK_MODE_QUERY);\nconst prefersReducedMotionMedia = window.matchMedia(\n PREFERS_REDUCED_MOTION_QUERY,\n);\n\nconst initialMode = getEffectiveMode();\napplyStoredModeToDocument(initialMode);\n\nconst currentMode = ref(initialMode);\n\nconst theme = ref({\n darkMode: resolveDarkMode(initialMode),\n});\n\ndarkModeMedia.addEventListener(\"change\", handleSystemPreferenceChange);\n\nwatch(\n () => props.mode,\n () => {\n syncDarkMode();\n },\n { immediate: true },\n);\n\nwatch(\n () => theme.value.darkMode,\n (darkMode, previousValue) => {\n if (previousValue === undefined) {\n setDocumentDarkModeAttribute(darkMode);\n return;\n }\n withThemeTransition(() => {\n setDocumentDarkModeAttribute(darkMode);\n });\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => {\n darkModeMedia.removeEventListener(\"change\", handleSystemPreferenceChange);\n});\n\nfunction syncDarkMode() {\n const mode = getEffectiveMode();\n currentMode.value = mode;\n theme.value.darkMode = resolveDarkMode(mode);\n}\n\nfunction resolveDarkMode(mode) {\n if (mode === \"dark\") {\n return true;\n }\n if (mode === \"light\") {\n return false;\n }\n return darkModeMedia.matches;\n}\n\nfunction handleSystemPreferenceChange(event) {\n if (!event || currentMode.value !== \"auto\") {\n return;\n }\n theme.value.darkMode = event.matches;\n}\n\nfunction setDocumentDarkModeAttribute(darkMode) {\n document.documentElement.setAttribute(\"dark-mode\", darkMode);\n}\n\nfunction withThemeTransition(applyTheme) {\n if (prefersReducedMotionMedia.matches) {\n applyTheme();\n return;\n }\n const startViewTransition = document.startViewTransition?.bind(document);\n if (startViewTransition) {\n startViewTransition(() => {\n applyTheme();\n });\n return;\n }\n applyTheme();\n const element = document.documentElement;\n if (typeof element.animate !== \"function\") {\n return;\n }\n window.requestAnimationFrame(() => {\n element.animate([{ opacity: 0.85 }, { opacity: 1 }], {\n duration: THEME_TRANSITION_DURATION,\n easing: \"ease-in-out\",\n });\n });\n}\n\nfunction getEffectiveMode() {\n return props.mode ?? readStoredMode() ?? \"auto\";\n}\n\nprovide(\"theme\", theme);\n</script>\n\n<style lang=\"less\">\n@import \"index.less\";\n</style>\n","<template>\n <DropdownMenu\n v-model:open=\"open\"\n text=\"Theme\"\n aria-label=\"Select theme mode\"\n >\n <DropdownItemGroup title=\"Theme\">\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"auto\"\n :label=\"MODE_LABELS.auto\"\n :aria-label=\"`${MODE_LABELS.auto} mode`\"\n />\n <hr class=\"theme-switcher-divider\" role=\"separator\" />\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"light\"\n :label=\"MODE_LABELS.light\"\n :aria-label=\"`${MODE_LABELS.light} mode`\"\n />\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"dark\"\n :label=\"MODE_LABELS.dark\"\n :aria-label=\"`${MODE_LABELS.dark} mode`\"\n />\n </DropdownItemGroup>\n </DropdownMenu>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from \"vue\";\nimport {\n DropdownMenu,\n DropdownItemGroup,\n DropdownItemRadio,\n} from \"@gospore/dropdown-menu\";\nimport {\n readStoredMode,\n writeStoredMode,\n VALID_THEME_MODES,\n applyStoredModeToDocument,\n} from \"./modeStorage\";\n\nconst MODE_OPTIONS = [\n { value: \"auto\", label: \"System\" },\n { value: \"light\", label: \"Light\" },\n { value: \"dark\", label: \"Dark\" },\n];\nconst MODE_LABELS = MODE_OPTIONS.reduce((map, option) => {\n map[option.value] = option.label;\n return map;\n}, {});\nconst VALID_MODES = VALID_THEME_MODES;\n\nconst props = defineProps({\n mode: {\n type: String,\n default: \"auto\",\n validator: (value) => [\"auto\", \"light\", \"dark\"].includes(value),\n },\n});\nconst emit = defineEmits([\"update:mode\"]);\n\napplyStoredModeToDocument();\n\nconst open = ref(false);\nconst initialMode = readStoredMode() ?? props.mode;\nconst internalMode = ref(\n VALID_MODES.includes(initialMode) ? initialMode : \"auto\",\n);\nconst label = computed(\n () => MODE_LABELS[internalMode.value] ?? MODE_LABELS.auto,\n);\n\nwatch(\n () => props.mode,\n (mode) => {\n if (VALID_MODES.includes(mode) && mode !== internalMode.value) {\n internalMode.value = mode;\n }\n },\n);\n\nwatch(\n internalMode,\n (mode) => {\n if (!VALID_MODES.includes(mode)) {\n internalMode.value = \"auto\";\n return;\n }\n open.value = false;\n emit(\"update:mode\", mode);\n writeStoredMode(mode);\n },\n { immediate: true },\n);\n\n</script>\n\n<style scoped lang=\"less\">\n.theme-switcher-divider {\n margin: 4px 0;\n background-color: var(--go-color-n20);\n}\n\n[dark-mode=\"true\"] {\n .theme-switcher-divider {\n background-color: var(--background-color-secondary-dark);\n }\n}\n</style>\n","// Blues\nexport const B900 = \"hsl(225, 90%, 16%)\";\n// @go-color-b700 = #000e7f;\nexport const B600 = \"#061f80\";\nexport const B500 = \"hsl(225, 94%, 35%)\";\n// @go-color-b550 = #131ff2;\n// @go-color-b500 = #001dff;\n// @go-color-b400 = #3333ff;\nexport const B400 = \"#06c\";\nexport const B300 = \"hsl(210, 100%, 50%)\";\nexport const B200 = \"hsl(210, 100%, 93%)\";\nexport const B100 = \"hsl(225, 100%, 96%)\";\n\n// Reds\nexport const R400 = \"hsl(12, 91%, 46%)\";\nexport const R300 = \"hsl(11, 100%, 59%)\";\n\n// Yellows\nexport const Y300 = \"hsl(40, 100%, 50%)\";\nexport const Y200 = \"hsl(46, 100%, 50%)\";\n\n// Greens\nexport const G500 = \"hsl(120, 100%, 25%)\";\nexport const G300 = \"#36b37e\";\n\n// Neutrals\nexport const N1000 = \"hsl(0, 0%, 0%)\";\nexport const N900 = \"hsl(218, 76%, 15%)\";\n// @go-color-n900 = hsl(218, 54%, 20%);\nexport const N800 = \"hsla(0,0%,10%,.9)\";\nexport const N500 = \"hsla(0,0%,10%,.6)\";\nexport const N400 = \"hsl(218, 20%, 39%)\";\nexport const N300 = \"hsl(218, 17%, 44%)\";\nexport const N200 = \"hsl(218, 14%, 49%)\";\nexport const N100 = \"hsl(218, 14%, 54%)\";\nexport const N90 = \"hsl(218, 13%, 59%)\";\nexport const N80 = \"hsl(218, 13%, 64%)\";\nexport const N70 = \"hsl(217, 13%, 69%)\";\nexport const N40 = \"hsl(223, 12%, 89%)\";\nexport const N30 = \"hsl(228, 14%, 93%)\";\nexport const N25 = \"hsl(210, 7%, 95%)\";\nexport const N20 = \"hsl(220, 16%, 96%)\";\nexport const N10 = \"hsl(210, 25%, 98%)\";\nexport const N5 = \"hsl(0, 0%, 98%)\";\nexport const N0 = \"hsl(0, 0%, 100%)\";\n\n// Primary color palette\nexport const primary1 = B500;\nexport const primary2 = B500;\nexport const primary3 = N0;\n"],"names":["VALID_THEME_MODES","STORAGE_KEY","ONE_YEAR_IN_SECONDS","DARK_MODE_QUERY","readStoredMode","stored","getCookie","writeStoredMode","mode","hostname","protocol","domain","getCookieDomain","secure","attributes","applyStoredModeToDocument","resolvedMode","darkMode","resolveDarkMode","name","encodedName","cookies","cookie","parts","mediaQueryList","props","__props","darkModeMedia","prefersReducedMotionMedia","PREFERS_REDUCED_MOTION_QUERY","initialMode","getEffectiveMode","currentMode","ref","theme","handleSystemPreferenceChange","watch","syncDarkMode","previousValue","setDocumentDarkModeAttribute","withThemeTransition","onBeforeUnmount","event","applyTheme","startViewTransition","element","THEME_TRANSITION_DURATION","provide","_openBlock","_createElementBlock","_hoisted_1","_renderSlot","_ctx","MODE_LABELS","map","option","VALID_MODES","emit","__emit","open","internalMode","computed","_createBlock","_unref","DropdownMenu","$event","_createVNode","DropdownItemGroup","DropdownItemRadio","_createElementVNode","B900","B600","B500","B400","B300","B200","B100","R400","R300","Y300","Y200","G500","G300","N1000","N900","N800","N500","N400","N300","N200","N100","N90","N80","N70","N40","N30","N25","N20","N10","N5","N0","primary1","primary2","primary3"],"mappings":"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"}
package/dist/theme.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(e,t){typeof exports=="object"&&typeof module<"u"?t(exports,require("vue"),require("what-input"),require("@gospore/dropdown-menu")):typeof define=="function"&&define.amd?define(["exports","vue","what-input","@gospore/dropdown-menu"],t):(e=typeof globalThis<"u"?globalThis:e||self,t(e.theme={},e.Vue,e.whatInput,e.DropdownMenu))})(this,function(e,t,ue,m){"use strict";const p=["auto","light","dark"],w="gospore-theme-mode",M="(prefers-color-scheme: dark)";function _(){if(typeof document>"u")return null;const n=y(w);return n&&p.includes(n)?n:null}function S(n){if(typeof document>"u"||!p.includes(n))return;const a=typeof window<"u"?window.location.hostname:"",r=typeof window<"u"?window.location.protocol:"",i=g(a),l=r==="https:",u=["path=/","max-age=31536000","SameSite=Lax"];i&&u.push(`domain=${i}`),l&&u.push("Secure"),document.cookie=[`${encodeURIComponent(w)}=${encodeURIComponent(n)}`,...u].join("; ")}function E(){if(typeof document>"u")return;const n=_()??"auto",a=b(n);document.documentElement.setAttribute("dark-mode",a)}function y(n){if(typeof document>"u"||!document.cookie)return null;const a=`${encodeURIComponent(n)}=`,r=document.cookie.split("; ");for(const i of r)if(i.startsWith(a))return decodeURIComponent(i.slice(a.length));return null}function g(n){if(!n||n==="localhost")return null;if(/^\d+(?:\.\d+){3}$/.test(n))return n;const r=n.split(".");return r.length<=1?null:r.length===2?n:r.slice(-2).join(".")}function b(n){if(n==="dark")return!0;if(n==="light"||typeof window>"u")return!1;try{const a=typeof window.matchMedia=="function"?window.matchMedia(M):null;return a?a.matches:!1}catch{return!1}}const R={class:"theme"},I="(prefers-color-scheme: dark)",O="(prefers-reduced-motion: reduce)",T=200,B=Object.assign({name:"Theme"},{__name:"Theme",props:{mode:{type:String,default:"auto",validator:n=>["auto","light","dark"].includes(n)}},setup(n){const a=n,r=window.matchMedia(I),i=window.matchMedia(O);E();const l=t.ref({darkMode:N(a.mode)});r.addEventListener("change",f),t.watch(()=>a.mode,()=>{u()},{immediate:!0}),t.watch(()=>l.value.darkMode,(o,c)=>{if(c===void 0){h(o);return}d(()=>{h(o)})},{immediate:!0}),t.onBeforeUnmount(()=>{r.removeEventListener("change",f)});function u(){l.value.darkMode=N(a.mode)}function N(o){return o==="dark"?!0:o==="light"?!1:r.matches}function f(o){!o||a.mode!=="auto"||(l.value.darkMode=o.matches)}function h(o){document.documentElement.setAttribute("dark-mode",o)}function d(o){if(i.matches){o();return}const c=document.startViewTransition?.bind(document);if(c){c(()=>{o()});return}o();const s=document.documentElement;typeof s.animate=="function"&&window.requestAnimationFrame(()=>{s.animate([{opacity:.85},{opacity:1}],{duration:T,easing:"ease-in-out"})})}return t.provide("theme",l),(o,c)=>(t.openBlock(),t.createElementBlock("div",R,[t.renderSlot(o.$slots,"default")]))}}),A=((n,a)=>{const r=n.__vccOpts||n;for(const[i,l]of a)r[i]=l;return r})({__name:"ThemeSwitcher",props:{mode:{type:String,default:"auto",validator:n=>["auto","light","dark"].includes(n)}},emits:["update:mode"],setup(n,{emit:a}){const i=[{value:"auto",label:"System"},{value:"light",label:"Light"},{value:"dark",label:"Dark"}].reduce((o,c)=>(o[c.value]=c.label,o),{}),l=p,u=n,N=a;E();const f=t.ref(!1),h=_()??u.mode,d=t.ref(l.includes(h)?h:"auto");return t.computed(()=>i[d.value]??i.auto),t.watch(()=>u.mode,o=>{l.includes(o)&&o!==d.value&&(d.value=o)}),t.watch(d,o=>{if(!l.includes(o)){d.value="auto";return}f.value=!1,N("update:mode",o),S(o)},{immediate:!0}),(o,c)=>(t.openBlock(),t.createBlock(t.unref(m.DropdownMenu),{open:f.value,"onUpdate:open":c[3]||(c[3]=s=>f.value=s),text:"Theme","aria-label":"Select theme mode"},{default:t.withCtx(()=>[t.createVNode(t.unref(m.DropdownItemGroup),{title:"Theme"},{default:t.withCtx(()=>[t.createVNode(t.unref(m.DropdownItemRadio),{checked:d.value,"onUpdate:checked":c[0]||(c[0]=s=>d.value=s),value:"auto",label:t.unref(i).auto,"aria-label":`${t.unref(i).auto} mode`},null,8,["checked","label","aria-label"]),c[4]||(c[4]=t.createElementVNode("hr",{class:"theme-switcher-divider",role:"separator"},null,-1)),t.createVNode(t.unref(m.DropdownItemRadio),{checked:d.value,"onUpdate:checked":c[1]||(c[1]=s=>d.value=s),value:"light",label:t.unref(i).light,"aria-label":`${t.unref(i).light} mode`},null,8,["checked","label","aria-label"]),t.createVNode(t.unref(m.DropdownItemRadio),{checked:d.value,"onUpdate:checked":c[2]||(c[2]=s=>d.value=s),value:"dark",label:t.unref(i).dark,"aria-label":`${t.unref(i).dark} mode`},null,8,["checked","label","aria-label"])]),_:1})]),_:1},8,["open"]))}},[["__scopeId","data-v-9b82a61c"]]),U="hsl(225, 90%, 16%)",C="#061f80",k="hsl(225, 94%, 35%)",$="#06c",V="hsl(210, 100%, 50%)",Y="hsl(210, 100%, 93%)",L="hsl(225, 100%, 96%)",v="hsl(12, 91%, 46%)",G="hsl(11, 100%, 59%)",j="hsl(40, 100%, 50%)",P="hsl(46, 100%, 50%)",q="hsl(120, 100%, 25%)",Q="#36b37e",K="hsl(0, 0%, 0%)",F="hsl(218, 76%, 15%)",H="hsla(0,0%,10%,.9)",W="hsla(0,0%,10%,.6)",z="hsl(218, 20%, 39%)",J="hsl(218, 17%, 44%)",X="hsl(218, 14%, 49%)",Z="hsl(218, 14%, 54%)",x="hsl(218, 13%, 59%)",ee="hsl(218, 13%, 64%)",te="hsl(217, 13%, 69%)",ne="hsl(223, 12%, 89%)",oe="hsl(228, 14%, 93%)",ae="hsl(210, 7%, 95%)",ce="hsl(220, 16%, 96%)",ie="hsl(210, 25%, 98%)",re="hsl(0, 0%, 98%)",D="hsl(0, 0%, 100%)",de=k,le=k,se=D;e.B100=L,e.B200=Y,e.B300=V,e.B400=$,e.B500=k,e.B600=C,e.B900=U,e.G300=Q,e.G500=q,e.N0=D,e.N10=ie,e.N100=Z,e.N1000=K,e.N20=ce,e.N200=X,e.N25=ae,e.N30=oe,e.N300=J,e.N40=ne,e.N400=z,e.N5=re,e.N500=W,e.N70=te,e.N80=ee,e.N800=H,e.N90=x,e.N900=F,e.R300=G,e.R400=v,e.Theme=B,e.ThemeSwitcher=A,e.Y200=P,e.Y300=j,e.primary1=de,e.primary2=le,e.primary3=se,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
1
+ (function(e,t){typeof exports=="object"&&typeof module<"u"?t(exports,require("vue"),require("what-input"),require("@gospore/dropdown-menu")):typeof define=="function"&&define.amd?define(["exports","vue","what-input","@gospore/dropdown-menu"],t):(e=typeof globalThis<"u"?globalThis:e||self,t(e.theme={},e.Vue,e.whatInput,e.DropdownMenu))})(this,function(e,t,he,h){"use strict";const w=["auto","light","dark"],M="gospore-theme-mode",S="(prefers-color-scheme: dark)";function _(){if(typeof document>"u")return null;const n=R(M);return n&&w.includes(n)?n:null}function b(n){if(typeof document>"u"||!w.includes(n))return;const o=typeof window<"u"?window.location.hostname:"",a=typeof window<"u"?window.location.protocol:"",i=I(o),s=a==="https:",f=["path=/","max-age=31536000","SameSite=Lax"];i&&f.push(`domain=${i}`),s&&f.push("Secure"),document.cookie=[`${encodeURIComponent(M)}=${encodeURIComponent(n)}`,...f].join("; ")}function g(n){if(typeof document>"u")return;const o=typeof n=="string"&&w.includes(n)?n:_()??"auto";console.log("Applying theme mode:",o);const a=O(o);document.documentElement.setAttribute("dark-mode",a)}function R(n){if(typeof document>"u"||!document.cookie)return null;const o=`${encodeURIComponent(n)}=`,a=document.cookie.split("; ");for(const i of a)if(i.startsWith(o))return decodeURIComponent(i.slice(o.length));return null}function I(n){if(!n||n==="localhost")return null;if(/^\d+(?:\.\d+){3}$/.test(n))return n;const a=n.split(".");return a.length<=1?null:a.length===2?n:a.slice(-2).join(".")}function O(n){if(n==="dark")return!0;if(n==="light"||typeof window>"u")return!1;try{const o=typeof window.matchMedia=="function"?window.matchMedia(S):null;return o?o.matches:!1}catch{return!1}}const T={class:"theme"},B="(prefers-color-scheme: dark)",A="(prefers-reduced-motion: reduce)",U=200,C=Object.assign({name:"Theme"},{__name:"Theme",props:{mode:{type:String,validator:n=>["auto","light","dark"].includes(n)}},setup(n){const o=n,a=window.matchMedia(B),i=window.matchMedia(A),s=u();g(s);const f=t.ref(s),m=t.ref({darkMode:p(s)});a.addEventListener("change",d),t.watch(()=>o.mode,()=>{N()},{immediate:!0}),t.watch(()=>m.value.darkMode,(c,k)=>{if(k===void 0){l(c);return}r(()=>{l(c)})},{immediate:!0}),t.onBeforeUnmount(()=>{a.removeEventListener("change",d)});function N(){const c=u();f.value=c,m.value.darkMode=p(c)}function p(c){return c==="dark"?!0:c==="light"?!1:a.matches}function d(c){!c||f.value!=="auto"||(m.value.darkMode=c.matches)}function l(c){document.documentElement.setAttribute("dark-mode",c)}function r(c){if(i.matches){c();return}const k=document.startViewTransition?.bind(document);if(k){k(()=>{c()});return}c();const D=document.documentElement;typeof D.animate=="function"&&window.requestAnimationFrame(()=>{D.animate([{opacity:.85},{opacity:1}],{duration:U,easing:"ease-in-out"})})}function u(){return o.mode??_()??"auto"}return t.provide("theme",m),(c,k)=>(t.openBlock(),t.createElementBlock("div",T,[t.renderSlot(c.$slots,"default")]))}}),$=((n,o)=>{const a=n.__vccOpts||n;for(const[i,s]of o)a[i]=s;return a})({__name:"ThemeSwitcher",props:{mode:{type:String,default:"auto",validator:n=>["auto","light","dark"].includes(n)}},emits:["update:mode"],setup(n,{emit:o}){const i=[{value:"auto",label:"System"},{value:"light",label:"Light"},{value:"dark",label:"Dark"}].reduce((l,r)=>(l[r.value]=r.label,l),{}),s=w,f=n,m=o;g();const N=t.ref(!1),p=_()??f.mode,d=t.ref(s.includes(p)?p:"auto");return t.computed(()=>i[d.value]??i.auto),t.watch(()=>f.mode,l=>{s.includes(l)&&l!==d.value&&(d.value=l)}),t.watch(d,l=>{if(!s.includes(l)){d.value="auto";return}N.value=!1,m("update:mode",l),b(l)},{immediate:!0}),(l,r)=>(t.openBlock(),t.createBlock(t.unref(h.DropdownMenu),{open:N.value,"onUpdate:open":r[3]||(r[3]=u=>N.value=u),text:"Theme","aria-label":"Select theme mode"},{default:t.withCtx(()=>[t.createVNode(t.unref(h.DropdownItemGroup),{title:"Theme"},{default:t.withCtx(()=>[t.createVNode(t.unref(h.DropdownItemRadio),{checked:d.value,"onUpdate:checked":r[0]||(r[0]=u=>d.value=u),value:"auto",label:t.unref(i).auto,"aria-label":`${t.unref(i).auto} mode`},null,8,["checked","label","aria-label"]),r[4]||(r[4]=t.createElementVNode("hr",{class:"theme-switcher-divider",role:"separator"},null,-1)),t.createVNode(t.unref(h.DropdownItemRadio),{checked:d.value,"onUpdate:checked":r[1]||(r[1]=u=>d.value=u),value:"light",label:t.unref(i).light,"aria-label":`${t.unref(i).light} mode`},null,8,["checked","label","aria-label"]),t.createVNode(t.unref(h.DropdownItemRadio),{checked:d.value,"onUpdate:checked":r[2]||(r[2]=u=>d.value=u),value:"dark",label:t.unref(i).dark,"aria-label":`${t.unref(i).dark} mode`},null,8,["checked","label","aria-label"])]),_:1})]),_:1},8,["open"]))}},[["__scopeId","data-v-9b82a61c"]]),V="hsl(225, 90%, 16%)",Y="#061f80",E="hsl(225, 94%, 35%)",v="#06c",L="hsl(210, 100%, 50%)",G="hsl(210, 100%, 93%)",j="hsl(225, 100%, 96%)",P="hsl(12, 91%, 46%)",q="hsl(11, 100%, 59%)",Q="hsl(40, 100%, 50%)",K="hsl(46, 100%, 50%)",F="hsl(120, 100%, 25%)",H="#36b37e",W="hsl(0, 0%, 0%)",z="hsl(218, 76%, 15%)",J="hsla(0,0%,10%,.9)",X="hsla(0,0%,10%,.6)",Z="hsl(218, 20%, 39%)",x="hsl(218, 17%, 44%)",ee="hsl(218, 14%, 49%)",te="hsl(218, 14%, 54%)",ne="hsl(218, 13%, 59%)",oe="hsl(218, 13%, 64%)",ce="hsl(217, 13%, 69%)",ie="hsl(223, 12%, 89%)",ae="hsl(228, 14%, 93%)",re="hsl(210, 7%, 95%)",de="hsl(220, 16%, 96%)",le="hsl(210, 25%, 98%)",se="hsl(0, 0%, 98%)",y="hsl(0, 0%, 100%)",ue=E,fe=E,me=y;e.B100=j,e.B200=G,e.B300=L,e.B400=v,e.B500=E,e.B600=Y,e.B900=V,e.G300=H,e.G500=F,e.N0=y,e.N10=le,e.N100=te,e.N1000=W,e.N20=de,e.N200=ee,e.N25=re,e.N30=ae,e.N300=x,e.N40=ie,e.N400=Z,e.N5=se,e.N500=X,e.N70=ce,e.N80=oe,e.N800=J,e.N90=ne,e.N900=z,e.R300=q,e.R400=P,e.Theme=C,e.ThemeSwitcher=$,e.Y200=K,e.Y300=Q,e.primary1=ue,e.primary2=fe,e.primary3=me,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=theme.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.umd.js","sources":["../src/modeStorage.js","../src/Theme.vue","../src/ThemeSwitcher.vue","../src/colors.js"],"sourcesContent":["const VALID_THEME_MODES = [\"auto\", \"light\", \"dark\"];\nconst STORAGE_KEY = \"gospore-theme-mode\";\nconst ONE_YEAR_IN_SECONDS = 60 * 60 * 24 * 365;\nconst DARK_MODE_QUERY = \"(prefers-color-scheme: dark)\";\n\nexport function readStoredMode() {\n if (typeof document === \"undefined\") {\n return null;\n }\n const stored = getCookie(STORAGE_KEY);\n return stored && VALID_THEME_MODES.includes(stored) ? stored : null;\n}\n\nexport function writeStoredMode(mode) {\n if (typeof document === \"undefined\" || !VALID_THEME_MODES.includes(mode)) {\n return;\n }\n const hostname = typeof window !== \"undefined\" ? window.location.hostname : \"\";\n const protocol = typeof window !== \"undefined\" ? window.location.protocol : \"\";\n const domain = getCookieDomain(hostname);\n const secure = protocol === \"https:\";\n const attributes = [\n \"path=/\",\n `max-age=${ONE_YEAR_IN_SECONDS}`,\n \"SameSite=Lax\",\n ];\n if (domain) {\n attributes.push(`domain=${domain}`);\n }\n if (secure) {\n attributes.push(\"Secure\");\n }\n document.cookie = [\n `${encodeURIComponent(STORAGE_KEY)}=${encodeURIComponent(mode)}`,\n ...attributes,\n ].join(\"; \");\n}\n\nexport function applyStoredModeToDocument() {\n if (typeof document === \"undefined\") {\n return;\n }\n const mode = readStoredMode() ?? \"auto\";\n const darkMode = resolveDarkMode(mode);\n document.documentElement.setAttribute(\"dark-mode\", darkMode);\n}\n\nexport { VALID_THEME_MODES, STORAGE_KEY };\n\nfunction getCookie(name) {\n if (typeof document === \"undefined\" || !document.cookie) {\n return null;\n }\n const encodedName = `${encodeURIComponent(name)}=`;\n const cookies = document.cookie.split(\"; \");\n for (const cookie of cookies) {\n if (cookie.startsWith(encodedName)) {\n return decodeURIComponent(cookie.slice(encodedName.length));\n }\n }\n return null;\n}\n\nfunction getCookieDomain(hostname) {\n if (!hostname || hostname === \"localhost\") {\n return null;\n }\n const isIpAddress = /^\\d+(?:\\.\\d+){3}$/.test(hostname);\n if (isIpAddress) {\n return hostname;\n }\n const parts = hostname.split(\".\");\n if (parts.length <= 1) {\n return null;\n }\n if (parts.length === 2) {\n return hostname;\n }\n return parts.slice(-2).join(\".\");\n}\n\nfunction resolveDarkMode(mode) {\n if (mode === \"dark\") {\n return true;\n }\n if (mode === \"light\") {\n return false;\n }\n if (typeof window === \"undefined\") {\n return false;\n }\n try {\n const mediaQueryList =\n typeof window.matchMedia === \"function\"\n ? window.matchMedia(DARK_MODE_QUERY)\n : null;\n return mediaQueryList ? mediaQueryList.matches : false;\n } catch (error) {\n return false;\n }\n}\n","<template>\n <div class=\"theme\">\n <slot />\n </div>\n</template>\n\n<script setup>\nimport { provide, ref, watch, onBeforeUnmount } from \"vue\";\nimport { applyStoredModeToDocument } from \"./modeStorage\";\nimport \"what-input\";\n\ndefineOptions({\n name: \"Theme\",\n});\nconst props = defineProps({\n mode: {\n type: String,\n default: \"auto\",\n validator: (value) => [\"auto\", \"light\", \"dark\"].includes(value),\n },\n});\n\nconst DARK_MODE_QUERY = \"(prefers-color-scheme: dark)\";\nconst PREFERS_REDUCED_MOTION_QUERY = \"(prefers-reduced-motion: reduce)\";\nconst THEME_TRANSITION_DURATION = 200;\nconst darkModeMedia = window.matchMedia(DARK_MODE_QUERY);\nconst prefersReducedMotionMedia = window.matchMedia(\n PREFERS_REDUCED_MOTION_QUERY,\n);\n\napplyStoredModeToDocument();\n\nconst theme = ref({\n darkMode: resolveDarkMode(props.mode),\n});\n\ndarkModeMedia.addEventListener(\"change\", handleSystemPreferenceChange);\n\nwatch(\n () => props.mode,\n () => {\n syncDarkMode();\n },\n { immediate: true },\n);\n\nwatch(\n () => theme.value.darkMode,\n (darkMode, previousValue) => {\n if (previousValue === undefined) {\n setDocumentDarkModeAttribute(darkMode);\n return;\n }\n withThemeTransition(() => {\n setDocumentDarkModeAttribute(darkMode);\n });\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => {\n darkModeMedia.removeEventListener(\"change\", handleSystemPreferenceChange);\n});\n\nfunction syncDarkMode() {\n theme.value.darkMode = resolveDarkMode(props.mode);\n}\n\nfunction resolveDarkMode(mode) {\n if (mode === \"dark\") {\n return true;\n }\n if (mode === \"light\") {\n return false;\n }\n return darkModeMedia.matches;\n}\n\nfunction handleSystemPreferenceChange(event) {\n if (!event || props.mode !== \"auto\") {\n return;\n }\n theme.value.darkMode = event.matches;\n}\n\nfunction setDocumentDarkModeAttribute(darkMode) {\n document.documentElement.setAttribute(\"dark-mode\", darkMode);\n}\n\nfunction withThemeTransition(applyTheme) {\n if (prefersReducedMotionMedia.matches) {\n applyTheme();\n return;\n }\n const startViewTransition = document.startViewTransition?.bind(document);\n if (startViewTransition) {\n startViewTransition(() => {\n applyTheme();\n });\n return;\n }\n applyTheme();\n const element = document.documentElement;\n if (typeof element.animate !== \"function\") {\n return;\n }\n window.requestAnimationFrame(() => {\n element.animate(\n [\n { opacity: 0.85 },\n { opacity: 1 },\n ],\n {\n duration: THEME_TRANSITION_DURATION,\n easing: \"ease-in-out\",\n },\n );\n });\n}\n\nprovide(\"theme\", theme);\n</script>\n\n<style lang=\"less\">\n@import \"index.less\";\n</style>\n","<template>\n <DropdownMenu\n v-model:open=\"open\"\n text=\"Theme\"\n aria-label=\"Select theme mode\"\n >\n <DropdownItemGroup title=\"Theme\">\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"auto\"\n :label=\"MODE_LABELS.auto\"\n :aria-label=\"`${MODE_LABELS.auto} mode`\"\n />\n <hr class=\"theme-switcher-divider\" role=\"separator\" />\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"light\"\n :label=\"MODE_LABELS.light\"\n :aria-label=\"`${MODE_LABELS.light} mode`\"\n />\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"dark\"\n :label=\"MODE_LABELS.dark\"\n :aria-label=\"`${MODE_LABELS.dark} mode`\"\n />\n </DropdownItemGroup>\n </DropdownMenu>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from \"vue\";\nimport {\n DropdownMenu,\n DropdownItemGroup,\n DropdownItemRadio,\n} from \"@gospore/dropdown-menu\";\nimport {\n readStoredMode,\n writeStoredMode,\n VALID_THEME_MODES,\n applyStoredModeToDocument,\n} from \"./modeStorage\";\n\nconst MODE_OPTIONS = [\n { value: \"auto\", label: \"System\" },\n { value: \"light\", label: \"Light\" },\n { value: \"dark\", label: \"Dark\" },\n];\nconst MODE_LABELS = MODE_OPTIONS.reduce((map, option) => {\n map[option.value] = option.label;\n return map;\n}, {});\nconst VALID_MODES = VALID_THEME_MODES;\n\nconst props = defineProps({\n mode: {\n type: String,\n default: \"auto\",\n validator: (value) => [\"auto\", \"light\", \"dark\"].includes(value),\n },\n});\nconst emit = defineEmits([\"update:mode\"]);\n\napplyStoredModeToDocument();\n\nconst open = ref(false);\nconst initialMode = readStoredMode() ?? props.mode;\nconst internalMode = ref(\n VALID_MODES.includes(initialMode) ? initialMode : \"auto\",\n);\nconst label = computed(\n () => MODE_LABELS[internalMode.value] ?? MODE_LABELS.auto,\n);\n\nwatch(\n () => props.mode,\n (mode) => {\n if (VALID_MODES.includes(mode) && mode !== internalMode.value) {\n internalMode.value = mode;\n }\n },\n);\n\nwatch(\n internalMode,\n (mode) => {\n if (!VALID_MODES.includes(mode)) {\n internalMode.value = \"auto\";\n return;\n }\n open.value = false;\n emit(\"update:mode\", mode);\n writeStoredMode(mode);\n },\n { immediate: true },\n);\n\n</script>\n\n<style scoped lang=\"less\">\n.theme-switcher-divider {\n margin: 4px 0;\n background-color: var(--go-color-n20);\n}\n\n[dark-mode=\"true\"] {\n .theme-switcher-divider {\n background-color: var(--background-color-secondary-dark);\n }\n}\n</style>\n","// Blues\nexport const B900 = \"hsl(225, 90%, 16%)\";\n// @go-color-b700 = #000e7f;\nexport const B600 = \"#061f80\";\nexport const B500 = \"hsl(225, 94%, 35%)\";\n// @go-color-b550 = #131ff2;\n// @go-color-b500 = #001dff;\n// @go-color-b400 = #3333ff;\nexport const B400 = \"#06c\";\nexport const B300 = \"hsl(210, 100%, 50%)\";\nexport const B200 = \"hsl(210, 100%, 93%)\";\nexport const B100 = \"hsl(225, 100%, 96%)\";\n\n// Reds\nexport const R400 = \"hsl(12, 91%, 46%)\";\nexport const R300 = \"hsl(11, 100%, 59%)\";\n\n// Yellows\nexport const Y300 = \"hsl(40, 100%, 50%)\";\nexport const Y200 = \"hsl(46, 100%, 50%)\";\n\n// Greens\nexport const G500 = \"hsl(120, 100%, 25%)\";\nexport const G300 = \"#36b37e\";\n\n// Neutrals\nexport const N1000 = \"hsl(0, 0%, 0%)\";\nexport const N900 = \"hsl(218, 76%, 15%)\";\n// @go-color-n900 = hsl(218, 54%, 20%);\nexport const N800 = \"hsla(0,0%,10%,.9)\";\nexport const N500 = \"hsla(0,0%,10%,.6)\";\nexport const N400 = \"hsl(218, 20%, 39%)\";\nexport const N300 = \"hsl(218, 17%, 44%)\";\nexport const N200 = \"hsl(218, 14%, 49%)\";\nexport const N100 = \"hsl(218, 14%, 54%)\";\nexport const N90 = \"hsl(218, 13%, 59%)\";\nexport const N80 = \"hsl(218, 13%, 64%)\";\nexport const N70 = \"hsl(217, 13%, 69%)\";\nexport const N40 = \"hsl(223, 12%, 89%)\";\nexport const N30 = \"hsl(228, 14%, 93%)\";\nexport const N25 = \"hsl(210, 7%, 95%)\";\nexport const N20 = \"hsl(220, 16%, 96%)\";\nexport const N10 = \"hsl(210, 25%, 98%)\";\nexport const N5 = \"hsl(0, 0%, 98%)\";\nexport const N0 = \"hsl(0, 0%, 100%)\";\n\n// Primary color palette\nexport const primary1 = B500;\nexport const primary2 = B500;\nexport const primary3 = N0;\n"],"names":["VALID_THEME_MODES","STORAGE_KEY","DARK_MODE_QUERY","readStoredMode","stored","getCookie","writeStoredMode","mode","hostname","protocol","domain","getCookieDomain","secure","attributes","applyStoredModeToDocument","darkMode","resolveDarkMode","name","encodedName","cookies","cookie","parts","mediaQueryList","props","__props","darkModeMedia","prefersReducedMotionMedia","PREFERS_REDUCED_MOTION_QUERY","theme","ref","handleSystemPreferenceChange","watch","syncDarkMode","previousValue","setDocumentDarkModeAttribute","withThemeTransition","onBeforeUnmount","event","applyTheme","startViewTransition","element","THEME_TRANSITION_DURATION","provide","_openBlock","_createElementBlock","_hoisted_1","_renderSlot","_ctx","MODE_LABELS","map","option","VALID_MODES","emit","__emit","open","initialMode","internalMode","computed","_createBlock","_unref","DropdownMenu","$event","_createVNode","DropdownItemGroup","DropdownItemRadio","_createElementVNode","B900","B600","B500","B400","B300","B200","B100","R400","R300","Y300","Y200","G500","G300","N1000","N900","N800","N500","N400","N300","N200","N100","N90","N80","N70","N40","N30","N25","N20","N10","N5","N0","primary1","primary2","primary3"],"mappings":"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"}
1
+ {"version":3,"file":"theme.umd.js","sources":["../src/modeStorage.js","../src/Theme.vue","../src/ThemeSwitcher.vue","../src/colors.js"],"sourcesContent":["const VALID_THEME_MODES = [\"auto\", \"light\", \"dark\"];\nconst STORAGE_KEY = \"gospore-theme-mode\";\nconst ONE_YEAR_IN_SECONDS = 60 * 60 * 24 * 365;\nconst DARK_MODE_QUERY = \"(prefers-color-scheme: dark)\";\n\nexport function readStoredMode() {\n if (typeof document === \"undefined\") {\n return null;\n }\n const stored = getCookie(STORAGE_KEY);\n return stored && VALID_THEME_MODES.includes(stored) ? stored : null;\n}\n\nexport function writeStoredMode(mode) {\n if (typeof document === \"undefined\" || !VALID_THEME_MODES.includes(mode)) {\n return;\n }\n const hostname =\n typeof window !== \"undefined\" ? window.location.hostname : \"\";\n const protocol =\n typeof window !== \"undefined\" ? window.location.protocol : \"\";\n const domain = getCookieDomain(hostname);\n const secure = protocol === \"https:\";\n const attributes = [\n \"path=/\",\n `max-age=${ONE_YEAR_IN_SECONDS}`,\n \"SameSite=Lax\",\n ];\n if (domain) {\n attributes.push(`domain=${domain}`);\n }\n if (secure) {\n attributes.push(\"Secure\");\n }\n document.cookie = [\n `${encodeURIComponent(STORAGE_KEY)}=${encodeURIComponent(mode)}`,\n ...attributes,\n ].join(\"; \");\n}\n\nexport function applyStoredModeToDocument(mode) {\n if (typeof document === \"undefined\") {\n return;\n }\n const resolvedMode =\n typeof mode === \"string\" && VALID_THEME_MODES.includes(mode)\n ? mode\n : readStoredMode() ?? \"auto\";\n console.log(\"Applying theme mode:\", resolvedMode);\n const darkMode = resolveDarkMode(resolvedMode);\n document.documentElement.setAttribute(\"dark-mode\", darkMode);\n}\n\nexport { VALID_THEME_MODES, STORAGE_KEY };\n\nfunction getCookie(name) {\n if (typeof document === \"undefined\" || !document.cookie) {\n return null;\n }\n const encodedName = `${encodeURIComponent(name)}=`;\n const cookies = document.cookie.split(\"; \");\n for (const cookie of cookies) {\n if (cookie.startsWith(encodedName)) {\n return decodeURIComponent(cookie.slice(encodedName.length));\n }\n }\n return null;\n}\n\nfunction getCookieDomain(hostname) {\n if (!hostname || hostname === \"localhost\") {\n return null;\n }\n const isIpAddress = /^\\d+(?:\\.\\d+){3}$/.test(hostname);\n if (isIpAddress) {\n return hostname;\n }\n const parts = hostname.split(\".\");\n if (parts.length <= 1) {\n return null;\n }\n if (parts.length === 2) {\n return hostname;\n }\n return parts.slice(-2).join(\".\");\n}\n\nfunction resolveDarkMode(mode) {\n if (mode === \"dark\") {\n return true;\n }\n if (mode === \"light\") {\n return false;\n }\n if (typeof window === \"undefined\") {\n return false;\n }\n try {\n const mediaQueryList =\n typeof window.matchMedia === \"function\"\n ? window.matchMedia(DARK_MODE_QUERY)\n : null;\n return mediaQueryList ? mediaQueryList.matches : false;\n } catch (error) {\n return false;\n }\n}\n","<template>\n <div class=\"theme\">\n <slot />\n </div>\n</template>\n\n<script setup>\nimport { provide, ref, watch, onBeforeUnmount } from \"vue\";\nimport { applyStoredModeToDocument, readStoredMode } from \"./modeStorage\";\nimport \"what-input\";\n\ndefineOptions({\n name: \"Theme\",\n});\nconst props = defineProps({\n mode: {\n type: String,\n validator: (value) => [\"auto\", \"light\", \"dark\"].includes(value),\n },\n});\n\nconst DARK_MODE_QUERY = \"(prefers-color-scheme: dark)\";\nconst PREFERS_REDUCED_MOTION_QUERY = \"(prefers-reduced-motion: reduce)\";\nconst THEME_TRANSITION_DURATION = 200;\nconst darkModeMedia = window.matchMedia(DARK_MODE_QUERY);\nconst prefersReducedMotionMedia = window.matchMedia(\n PREFERS_REDUCED_MOTION_QUERY,\n);\n\nconst initialMode = getEffectiveMode();\napplyStoredModeToDocument(initialMode);\n\nconst currentMode = ref(initialMode);\n\nconst theme = ref({\n darkMode: resolveDarkMode(initialMode),\n});\n\ndarkModeMedia.addEventListener(\"change\", handleSystemPreferenceChange);\n\nwatch(\n () => props.mode,\n () => {\n syncDarkMode();\n },\n { immediate: true },\n);\n\nwatch(\n () => theme.value.darkMode,\n (darkMode, previousValue) => {\n if (previousValue === undefined) {\n setDocumentDarkModeAttribute(darkMode);\n return;\n }\n withThemeTransition(() => {\n setDocumentDarkModeAttribute(darkMode);\n });\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => {\n darkModeMedia.removeEventListener(\"change\", handleSystemPreferenceChange);\n});\n\nfunction syncDarkMode() {\n const mode = getEffectiveMode();\n currentMode.value = mode;\n theme.value.darkMode = resolveDarkMode(mode);\n}\n\nfunction resolveDarkMode(mode) {\n if (mode === \"dark\") {\n return true;\n }\n if (mode === \"light\") {\n return false;\n }\n return darkModeMedia.matches;\n}\n\nfunction handleSystemPreferenceChange(event) {\n if (!event || currentMode.value !== \"auto\") {\n return;\n }\n theme.value.darkMode = event.matches;\n}\n\nfunction setDocumentDarkModeAttribute(darkMode) {\n document.documentElement.setAttribute(\"dark-mode\", darkMode);\n}\n\nfunction withThemeTransition(applyTheme) {\n if (prefersReducedMotionMedia.matches) {\n applyTheme();\n return;\n }\n const startViewTransition = document.startViewTransition?.bind(document);\n if (startViewTransition) {\n startViewTransition(() => {\n applyTheme();\n });\n return;\n }\n applyTheme();\n const element = document.documentElement;\n if (typeof element.animate !== \"function\") {\n return;\n }\n window.requestAnimationFrame(() => {\n element.animate([{ opacity: 0.85 }, { opacity: 1 }], {\n duration: THEME_TRANSITION_DURATION,\n easing: \"ease-in-out\",\n });\n });\n}\n\nfunction getEffectiveMode() {\n return props.mode ?? readStoredMode() ?? \"auto\";\n}\n\nprovide(\"theme\", theme);\n</script>\n\n<style lang=\"less\">\n@import \"index.less\";\n</style>\n","<template>\n <DropdownMenu\n v-model:open=\"open\"\n text=\"Theme\"\n aria-label=\"Select theme mode\"\n >\n <DropdownItemGroup title=\"Theme\">\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"auto\"\n :label=\"MODE_LABELS.auto\"\n :aria-label=\"`${MODE_LABELS.auto} mode`\"\n />\n <hr class=\"theme-switcher-divider\" role=\"separator\" />\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"light\"\n :label=\"MODE_LABELS.light\"\n :aria-label=\"`${MODE_LABELS.light} mode`\"\n />\n <DropdownItemRadio\n v-model:checked=\"internalMode\"\n value=\"dark\"\n :label=\"MODE_LABELS.dark\"\n :aria-label=\"`${MODE_LABELS.dark} mode`\"\n />\n </DropdownItemGroup>\n </DropdownMenu>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from \"vue\";\nimport {\n DropdownMenu,\n DropdownItemGroup,\n DropdownItemRadio,\n} from \"@gospore/dropdown-menu\";\nimport {\n readStoredMode,\n writeStoredMode,\n VALID_THEME_MODES,\n applyStoredModeToDocument,\n} from \"./modeStorage\";\n\nconst MODE_OPTIONS = [\n { value: \"auto\", label: \"System\" },\n { value: \"light\", label: \"Light\" },\n { value: \"dark\", label: \"Dark\" },\n];\nconst MODE_LABELS = MODE_OPTIONS.reduce((map, option) => {\n map[option.value] = option.label;\n return map;\n}, {});\nconst VALID_MODES = VALID_THEME_MODES;\n\nconst props = defineProps({\n mode: {\n type: String,\n default: \"auto\",\n validator: (value) => [\"auto\", \"light\", \"dark\"].includes(value),\n },\n});\nconst emit = defineEmits([\"update:mode\"]);\n\napplyStoredModeToDocument();\n\nconst open = ref(false);\nconst initialMode = readStoredMode() ?? props.mode;\nconst internalMode = ref(\n VALID_MODES.includes(initialMode) ? initialMode : \"auto\",\n);\nconst label = computed(\n () => MODE_LABELS[internalMode.value] ?? MODE_LABELS.auto,\n);\n\nwatch(\n () => props.mode,\n (mode) => {\n if (VALID_MODES.includes(mode) && mode !== internalMode.value) {\n internalMode.value = mode;\n }\n },\n);\n\nwatch(\n internalMode,\n (mode) => {\n if (!VALID_MODES.includes(mode)) {\n internalMode.value = \"auto\";\n return;\n }\n open.value = false;\n emit(\"update:mode\", mode);\n writeStoredMode(mode);\n },\n { immediate: true },\n);\n\n</script>\n\n<style scoped lang=\"less\">\n.theme-switcher-divider {\n margin: 4px 0;\n background-color: var(--go-color-n20);\n}\n\n[dark-mode=\"true\"] {\n .theme-switcher-divider {\n background-color: var(--background-color-secondary-dark);\n }\n}\n</style>\n","// Blues\nexport const B900 = \"hsl(225, 90%, 16%)\";\n// @go-color-b700 = #000e7f;\nexport const B600 = \"#061f80\";\nexport const B500 = \"hsl(225, 94%, 35%)\";\n// @go-color-b550 = #131ff2;\n// @go-color-b500 = #001dff;\n// @go-color-b400 = #3333ff;\nexport const B400 = \"#06c\";\nexport const B300 = \"hsl(210, 100%, 50%)\";\nexport const B200 = \"hsl(210, 100%, 93%)\";\nexport const B100 = \"hsl(225, 100%, 96%)\";\n\n// Reds\nexport const R400 = \"hsl(12, 91%, 46%)\";\nexport const R300 = \"hsl(11, 100%, 59%)\";\n\n// Yellows\nexport const Y300 = \"hsl(40, 100%, 50%)\";\nexport const Y200 = \"hsl(46, 100%, 50%)\";\n\n// Greens\nexport const G500 = \"hsl(120, 100%, 25%)\";\nexport const G300 = \"#36b37e\";\n\n// Neutrals\nexport const N1000 = \"hsl(0, 0%, 0%)\";\nexport const N900 = \"hsl(218, 76%, 15%)\";\n// @go-color-n900 = hsl(218, 54%, 20%);\nexport const N800 = \"hsla(0,0%,10%,.9)\";\nexport const N500 = \"hsla(0,0%,10%,.6)\";\nexport const N400 = \"hsl(218, 20%, 39%)\";\nexport const N300 = \"hsl(218, 17%, 44%)\";\nexport const N200 = \"hsl(218, 14%, 49%)\";\nexport const N100 = \"hsl(218, 14%, 54%)\";\nexport const N90 = \"hsl(218, 13%, 59%)\";\nexport const N80 = \"hsl(218, 13%, 64%)\";\nexport const N70 = \"hsl(217, 13%, 69%)\";\nexport const N40 = \"hsl(223, 12%, 89%)\";\nexport const N30 = \"hsl(228, 14%, 93%)\";\nexport const N25 = \"hsl(210, 7%, 95%)\";\nexport const N20 = \"hsl(220, 16%, 96%)\";\nexport const N10 = \"hsl(210, 25%, 98%)\";\nexport const N5 = \"hsl(0, 0%, 98%)\";\nexport const N0 = \"hsl(0, 0%, 100%)\";\n\n// Primary color palette\nexport const primary1 = B500;\nexport const primary2 = B500;\nexport const primary3 = N0;\n"],"names":["VALID_THEME_MODES","STORAGE_KEY","DARK_MODE_QUERY","readStoredMode","stored","getCookie","writeStoredMode","mode","hostname","protocol","domain","getCookieDomain","secure","attributes","applyStoredModeToDocument","resolvedMode","darkMode","resolveDarkMode","name","encodedName","cookies","cookie","parts","mediaQueryList","props","__props","darkModeMedia","prefersReducedMotionMedia","PREFERS_REDUCED_MOTION_QUERY","initialMode","getEffectiveMode","currentMode","ref","theme","handleSystemPreferenceChange","watch","syncDarkMode","previousValue","setDocumentDarkModeAttribute","withThemeTransition","onBeforeUnmount","event","applyTheme","startViewTransition","element","THEME_TRANSITION_DURATION","provide","_openBlock","_createElementBlock","_hoisted_1","_renderSlot","_ctx","MODE_LABELS","map","option","VALID_MODES","emit","__emit","open","internalMode","computed","_createBlock","_unref","DropdownMenu","$event","_createVNode","DropdownItemGroup","DropdownItemRadio","_createElementVNode","B900","B600","B500","B400","B300","B200","B100","R400","R300","Y300","Y200","G500","G300","N1000","N900","N800","N500","N400","N300","N200","N100","N90","N80","N70","N40","N30","N25","N20","N10","N5","N0","primary1","primary2","primary3"],"mappings":"wXAAA,MAAMA,EAAoB,CAAC,OAAQ,QAAS,MAAM,EAC5CC,EAAc,qBAEdC,EAAkB,+BAEjB,SAASC,GAAiB,CAC7B,GAAI,OAAO,SAAa,IACpB,OAAO,KAEX,MAAMC,EAASC,EAAUJ,CAAW,EACpC,OAAOG,GAAUJ,EAAkB,SAASI,CAAM,EAAIA,EAAS,IACnE,CAEO,SAASE,EAAgBC,EAAM,CAClC,GAAI,OAAO,SAAa,KAAe,CAACP,EAAkB,SAASO,CAAI,EACnE,OAEJ,MAAMC,EACF,OAAO,OAAW,IAAc,OAAO,SAAS,SAAW,GACzDC,EACF,OAAO,OAAW,IAAc,OAAO,SAAS,SAAW,GACzDC,EAASC,EAAgBH,CAAQ,EACjCI,EAASH,IAAa,SACtBI,EAAa,CACf,SACA,mBACA,cACR,EACQH,GACAG,EAAW,KAAK,UAAUH,CAAM,EAAE,EAElCE,GACAC,EAAW,KAAK,QAAQ,EAE5B,SAAS,OAAS,CACd,GAAG,mBAAmBZ,CAAW,CAAC,IAAI,mBAAmBM,CAAI,CAAC,GAC9D,GAAGM,CACX,EAAM,KAAK,IAAI,CACf,CAEO,SAASC,EAA0BP,EAAM,CAC5C,GAAI,OAAO,SAAa,IACpB,OAEJ,MAAMQ,EACF,OAAOR,GAAS,UAAYP,EAAkB,SAASO,CAAI,EACrDA,EACAJ,EAAc,GAAM,OAC9B,QAAQ,IAAI,uBAAwBY,CAAY,EAChD,MAAMC,EAAWC,EAAgBF,CAAY,EAC7C,SAAS,gBAAgB,aAAa,YAAaC,CAAQ,CAC/D,CAIA,SAASX,EAAUa,EAAM,CACrB,GAAI,OAAO,SAAa,KAAe,CAAC,SAAS,OAC7C,OAAO,KAEX,MAAMC,EAAc,GAAG,mBAAmBD,CAAI,CAAC,IACzCE,EAAU,SAAS,OAAO,MAAM,IAAI,EAC1C,UAAWC,KAAUD,EACjB,GAAIC,EAAO,WAAWF,CAAW,EAC7B,OAAO,mBAAmBE,EAAO,MAAMF,EAAY,MAAM,CAAC,EAGlE,OAAO,IACX,CAEA,SAASR,EAAgBH,EAAU,CAC/B,GAAI,CAACA,GAAYA,IAAa,YAC1B,OAAO,KAGX,GADoB,oBAAoB,KAAKA,CAAQ,EAEjD,OAAOA,EAEX,MAAMc,EAAQd,EAAS,MAAM,GAAG,EAChC,OAAIc,EAAM,QAAU,EACT,KAEPA,EAAM,SAAW,EACVd,EAEJc,EAAM,MAAM,EAAE,EAAE,KAAK,GAAG,CACnC,CAEA,SAASL,EAAgBV,EAAM,CAC3B,GAAIA,IAAS,OACT,MAAO,GAKX,GAHIA,IAAS,SAGT,OAAO,OAAW,IAClB,MAAO,GAEX,GAAI,CACA,MAAMgB,EACF,OAAO,OAAO,YAAe,WACvB,OAAO,WAAWrB,CAAe,EACjC,KACV,OAAOqB,EAAiBA,EAAe,QAAU,EACrD,MAAgB,CACZ,MAAO,EACX,CACJ,yOC5FA,MAAMC,EAAQC,EAURC,EAAgB,OAAO,WAAWxB,CAAe,EACjDyB,EAA4B,OAAO,WACrCC,CACJ,EAEMC,EAAcC,EAAgB,EACpChB,EAA0Be,CAAW,EAErC,MAAME,EAAcC,EAAAA,IAAIH,CAAW,EAE7BI,EAAQD,EAAAA,IAAI,CACd,SAAUf,EAAgBY,CAAW,CACzC,CAAC,EAEDH,EAAc,iBAAiB,SAAUQ,CAA4B,EAErEC,EAAAA,MACI,IAAMX,EAAM,KACZ,IAAM,CACFY,EAAY,CAChB,EACA,CAAE,UAAW,EAAI,CACrB,EAEAD,EAAAA,MACI,IAAMF,EAAM,MAAM,SAClB,CAACjB,EAAUqB,IAAkB,CACzB,GAAIA,IAAkB,OAAW,CAC7BC,EAA6BtB,CAAQ,EACrC,MACJ,CACAuB,EAAoB,IAAM,CACtBD,EAA6BtB,CAAQ,CACzC,CAAC,CACL,EACA,CAAE,UAAW,EAAI,CACrB,EAEAwB,EAAAA,gBAAgB,IAAM,CAClBd,EAAc,oBAAoB,SAAUQ,CAA4B,CAC5E,CAAC,EAED,SAASE,GAAe,CACpB,MAAM7B,EAAOuB,EAAgB,EAC7BC,EAAY,MAAQxB,EACpB0B,EAAM,MAAM,SAAWhB,EAAgBV,CAAI,CAC/C,CAEA,SAASU,EAAgBV,EAAM,CAC3B,OAAIA,IAAS,OACF,GAEPA,IAAS,QACF,GAEJmB,EAAc,OACzB,CAEA,SAASQ,EAA6BO,EAAO,CACrC,CAACA,GAASV,EAAY,QAAU,SAGpCE,EAAM,MAAM,SAAWQ,EAAM,QACjC,CAEA,SAASH,EAA6BtB,EAAU,CAC5C,SAAS,gBAAgB,aAAa,YAAaA,CAAQ,CAC/D,CAEA,SAASuB,EAAoBG,EAAY,CACrC,GAAIf,EAA0B,QAAS,CACnCe,EAAU,EACV,MACJ,CACA,MAAMC,EAAsB,SAAS,qBAAqB,KAAK,QAAQ,EACvE,GAAIA,EAAqB,CACrBA,EAAoB,IAAM,CACtBD,EAAU,CACd,CAAC,EACD,MACJ,CACAA,EAAU,EACV,MAAME,EAAU,SAAS,gBACrB,OAAOA,EAAQ,SAAY,YAG/B,OAAO,sBAAsB,IAAM,CAC/BA,EAAQ,QAAQ,CAAC,CAAE,QAAS,GAAI,EAAI,CAAE,QAAS,CAAC,CAAE,EAAG,CACjD,SAAUC,EACV,OAAQ,aACpB,CAAS,CACL,CAAC,CACL,CAEA,SAASf,GAAmB,CACxB,OAAON,EAAM,MAAQrB,EAAc,GAAM,MAC7C,CAEA2C,OAAAA,EAAAA,QAAQ,QAASb,CAAK,UAzHlBc,YAAA,EAAAC,qBAEK,MAFLC,EAEK,CADDC,aAAOC,EAAA,OAAA,SAAA,0OC+Cf,MAAMC,EALe,CACjB,CAAE,MAAO,OAAQ,MAAO,QAAQ,EAChC,CAAE,MAAO,QAAS,MAAO,OAAO,EAChC,CAAE,MAAO,OAAQ,MAAO,MAAM,CAClC,EACiC,OAAO,CAACC,EAAKC,KAC1CD,EAAIC,EAAO,KAAK,EAAIA,EAAO,MACpBD,GACR,EAAE,EACCE,EAAcvD,EAEdwB,EAAQC,EAOR+B,EAAOC,EAEb3C,EAAyB,EAEzB,MAAM4C,EAAO1B,EAAAA,IAAI,EAAK,EAChBH,EAAc1B,KAAoBqB,EAAM,KACxCmC,EAAe3B,EAAAA,IACjBuB,EAAY,SAAS1B,CAAW,EAAIA,EAAc,MACtD,EACc+B,OAAAA,EAAAA,SACV,IAAMR,EAAYO,EAAa,KAAK,GAAKP,EAAY,IACzD,EAEAjB,EAAAA,MACI,IAAMX,EAAM,KACXjB,GAAS,CACFgD,EAAY,SAAShD,CAAI,GAAKA,IAASoD,EAAa,QACpDA,EAAa,MAAQpD,EAE7B,CACJ,EAEA4B,EAAAA,MACIwB,EACCpD,GAAS,CACN,GAAI,CAACgD,EAAY,SAAShD,CAAI,EAAG,CAC7BoD,EAAa,MAAQ,OACrB,MACJ,CACAD,EAAK,MAAQ,GACbF,EAAK,cAAejD,CAAI,EACxBD,EAAgBC,CAAI,CACxB,EACA,CAAE,UAAW,EAAI,CACrB,wBA/FIsD,EAAAA,YA0BeC,EAAAA,MAAAC,EAAAA,YAAA,EAAA,CAzBH,KAAML,EAAA,qCAAAA,EAAI,MAAAM,GAClB,KAAK,QACL,aAAW,wCAEX,IAoBoB,CApBpBC,EAAAA,YAoBoBH,EAAAA,MAAAI,EAAAA,iBAAA,EAAA,CApBD,MAAM,OAAO,EAAA,mBAC5B,IAKE,CALFD,cAKEH,EAAAA,MAAAK,EAAAA,iBAAA,EAAA,CAJU,QAASR,EAAA,wCAAAA,EAAY,MAAAK,GAC7B,MAAM,OACL,MAAOF,EAAAA,MAAAV,CAAA,EAAY,KACnB,aAAU,GAAKU,EAAAA,MAAAV,CAAA,EAAY,IAAI,8DAEpCgB,EAAAA,mBAAsD,KAAA,CAAlD,MAAM,yBAAyB,KAAK,uBACxCH,cAKEH,EAAAA,MAAAK,EAAAA,iBAAA,EAAA,CAJU,QAASR,EAAA,wCAAAA,EAAY,MAAAK,GAC7B,MAAM,QACL,MAAOF,EAAAA,MAAAV,CAAA,EAAY,MACnB,aAAU,GAAKU,EAAAA,MAAAV,CAAA,EAAY,KAAK,kDAErCa,cAKEH,EAAAA,MAAAK,EAAAA,iBAAA,EAAA,CAJU,QAASR,EAAA,wCAAAA,EAAY,MAAAK,GAC7B,MAAM,OACL,MAAOF,EAAAA,MAAAV,CAAA,EAAY,KACnB,aAAU,GAAKU,EAAAA,MAAAV,CAAA,EAAY,IAAI,mHCvBnCiB,EAAO,qBAEPC,EAAO,UACPC,EAAO,qBAIPC,EAAO,OACPC,EAAO,sBACPC,EAAO,sBACPC,EAAO,sBAGPC,EAAO,oBACPC,EAAO,qBAGPC,EAAO,qBACPC,EAAO,qBAGPC,EAAO,sBACPC,EAAO,UAGPC,EAAQ,iBACRC,EAAO,qBAEPC,EAAO,oBACPC,EAAO,oBACPC,EAAO,qBACPC,EAAO,qBACPC,GAAO,qBACPC,GAAO,qBACPC,GAAM,qBACNC,GAAM,qBACNC,GAAM,qBACNC,GAAM,qBACNC,GAAM,qBACNC,GAAM,oBACNC,GAAM,qBACNC,GAAM,qBACNC,GAAK,kBACLC,EAAK,mBAGLC,GAAW7B,EACX8B,GAAW9B,EACX+B,GAAWH"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gospore/theme",
3
- "version": "1.0.122",
3
+ "version": "1.0.123",
4
4
  "description": "",
5
5
  "author": "Gospore",
6
6
  "type": "module",
@@ -34,5 +34,5 @@
34
34
  "unplugin-vue-macros": "^2.14.5",
35
35
  "vite": "^7.1.9"
36
36
  },
37
- "gitHead": "7debe95eca46c638d014182e3c2840fd32286ea3"
37
+ "gitHead": "86999130cd1fa29f924a110a622e33b075643181"
38
38
  }