@gospore/theme 1.0.132 → 1.0.133

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.
@@ -1,18 +1,59 @@
1
- declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
1
+ declare const _default: typeof __VLS_export;
2
2
  export default _default;
3
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
3
4
  type __VLS_WithSlots<T, S> = T & (new () => {
4
5
  $slots: S;
5
6
  });
6
- declare const __VLS_component: import("vue").DefineComponent<{}, {
7
- exposeGlobalAccent: boolean;
8
- mode?: string;
9
- accentColor?: string;
10
- $props: {
11
- readonly exposeGlobalAccent?: boolean;
12
- readonly mode?: string;
13
- readonly accentColor?: string;
7
+ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
8
+ mode: {
9
+ type: StringConstructor;
10
+ validator: (value: unknown) => boolean;
11
+ };
12
+ /**
13
+ * Optional hex accent color ("#RRGGBB" or "#RGB"). When provided,
14
+ * Theme derives the `--color-brand-*` palette and exposes the tokens on
15
+ * the root .theme element (and the global document for portals).
16
+ */
17
+ accentColor: {
18
+ type: StringConstructor;
19
+ required: false;
20
+ default: any;
21
+ };
22
+ /**
23
+ * When true the brand vars are also exposed on <html>, allowing portals
24
+ * attached outside the Theme subtree to inherit the accent colors.
25
+ */
26
+ exposeGlobalAccent: {
27
+ type: BooleanConstructor;
28
+ default: boolean;
29
+ };
30
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
31
+ mode: {
32
+ type: StringConstructor;
33
+ validator: (value: unknown) => boolean;
14
34
  };
15
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
35
+ /**
36
+ * Optional hex accent color ("#RRGGBB" or "#RGB"). When provided,
37
+ * Theme derives the `--color-brand-*` palette and exposes the tokens on
38
+ * the root .theme element (and the global document for portals).
39
+ */
40
+ accentColor: {
41
+ type: StringConstructor;
42
+ required: false;
43
+ default: any;
44
+ };
45
+ /**
46
+ * When true the brand vars are also exposed on <html>, allowing portals
47
+ * attached outside the Theme subtree to inherit the accent colors.
48
+ */
49
+ exposeGlobalAccent: {
50
+ type: BooleanConstructor;
51
+ default: boolean;
52
+ };
53
+ }>> & Readonly<{}>, {
54
+ accentColor: string;
55
+ exposeGlobalAccent: boolean;
56
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
16
57
  type __VLS_Slots = {
17
58
  default?: (props: {}) => any;
18
59
  };
@@ -1,8 +1,21 @@
1
- declare const _default: import("vue").DefineComponent<{}, {
2
- $emit: (event: "update:mode", ...args: any[]) => void;
3
- mode: string;
4
- $props: {
5
- readonly mode?: string;
6
- };
7
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
1
+ declare const _default: typeof __VLS_export;
8
2
  export default _default;
3
+ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
+ mode: {
5
+ type: StringConstructor;
6
+ default: string;
7
+ validator: (value: unknown) => boolean;
8
+ };
9
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
10
+ "update:mode": (...args: any[]) => void;
11
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
12
+ mode: {
13
+ type: StringConstructor;
14
+ default: string;
15
+ validator: (value: unknown) => boolean;
16
+ };
17
+ }>> & Readonly<{
18
+ "onUpdate:mode"?: (...args: any[]) => any;
19
+ }>, {
20
+ mode: string;
21
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
package/dist/theme.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("vue");require("what-input");const L=require("@gospore/dropdown-menu"),x=["auto","light","dark"],z="gospore-theme-mode",ae=60*60*24*365,se="(prefers-color-scheme: dark)";function B(){if(typeof document>"u")return null;const o=ue(z);return o&&x.includes(o)?o:null}function le(o){if(typeof document>"u"||!x.includes(o))return;const a=typeof window<"u"?window.location.hostname:"",l=typeof window<"u"?window.location.protocol:"",s=ie(a),b=l==="https:",k=["path=/",`max-age=${ae}`,"SameSite=Lax"];s&&k.push(`domain=${s}`),b&&k.push("Secure"),document.cookie=[`${encodeURIComponent(z)}=${encodeURIComponent(o)}`,...k].join("; ")}function F(o){if(typeof document>"u")return;const a=typeof o=="string"&&x.includes(o)?o:B()??"auto";console.log("Applying theme mode:",a);const l=de(a);document.documentElement.setAttribute("dark-mode",l)}function ue(o){if(typeof document>"u"||!document.cookie)return null;const a=`${encodeURIComponent(o)}=`,l=document.cookie.split("; ");for(const s of l)if(s.startsWith(a))return decodeURIComponent(s.slice(a.length));return null}function ie(o){if(!o||o==="localhost")return null;if(/^\d+(?:\.\d+){3}$/.test(o))return o;const l=o.split(".");return l.length<=1?null:l.length===2?o:l.slice(-2).join(".")}function de(o){if(o==="dark")return!0;if(o==="light"||typeof window>"u")return!1;try{const a=typeof window.matchMedia=="function"?window.matchMedia(se):null;return a?a.matches:!1}catch{return!1}}const H=Symbol.for("gospore.theme.portalHost");function fe(){const o=t.inject(H,null);console.log("Using theme portal host:",o);const a=typeof document<"u"?document.body:"body";return t.computed(()=>o?.value??a)}const me="(prefers-color-scheme: dark)",he="(prefers-reduced-motion: reduce)",pe=200,be=Object.assign({name:"Theme"},{__name:"Theme",props:{mode:{type:String,validator:o=>["auto","light","dark"].includes(o)},accentColor:{type:String,required:!1,default:void 0},exposeGlobalAccent:{type:Boolean,default:!1}},setup(o){const a=o,l=[],s=new Set;function b(){const e=document.documentElement;if(!e)return;s.forEach(c=>{e.style.removeProperty(c)}),s.clear();const n=[...l].reverse().find(c=>c.enabled&&c.vars&&Object.keys(c.vars).length>0);n&&Object.entries(n.vars).forEach(([c,r])=>{e.style.setProperty(c,r),s.add(c)})}const k=window.matchMedia(me),U=window.matchMedia(he),_=q();F(_);const I=t.ref(_),u=t.ref({darkMode:M(_)}),h=t.ref(null);k.addEventListener("change",V),t.watch(()=>a.mode,()=>{f()},{immediate:!0}),t.watch(()=>u.value.darkMode,(e,n)=>{if(n===void 0){G(e);return}W(()=>{G(e)})},{immediate:!0}),t.onBeforeUnmount(()=>{k.removeEventListener("change",V);const e=l.indexOf(A);e!==-1&&l.splice(e,1),b()});function f(){const e=q();I.value=e,u.value.darkMode=M(e)}function M(e){return e==="dark"?!0:e==="light"?!1:k.matches}function V(e){!e||I.value!=="auto"||(u.value.darkMode=e.matches)}function G(e){document.documentElement.setAttribute("dark-mode",e)}function W(e){if(U.matches){e();return}const n=document.startViewTransition?.bind(document);if(n){n(()=>{e()});return}e();const c=document.documentElement;typeof c.animate=="function"&&window.requestAnimationFrame(()=>{c.animate([{opacity:.85},{opacity:1}],{duration:pe,easing:"ease-in-out"})})}function q(){return a.mode??B()??"auto"}t.provide("theme",u),t.provide(H,h);function K(e){if(!e)return null;const n=e.trim().toLowerCase();if(!/^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.exec(n))return null;if(n.length===4){const r=n[1],i=n[2],m=n[3];return`#${r}${r}${i}${i}${m}${m}`}return n}function J(e){const n=K(e);if(!n)return null;const c=parseInt(n.slice(1,3),16),r=parseInt(n.slice(3,5),16),i=parseInt(n.slice(5,7),16);return{r:c,g:r,b:i}}function X({r:e,g:n,b:c}){const r=i=>i.toString(16).padStart(2,"0");return`#${r(e)}${r(n)}${r(c)}`}function p(e){return Math.max(0,Math.min(1,e))}function P(e){return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function j(e){const n=p(e);return n<=.0031308?12.92*n:1.055*Math.pow(n,1/2.4)-.055}function Z({r:e,g:n,b:c}){const r=e/255,i=n/255,m=c/255,y=P(r),R=P(i),d=P(m),v=.4122214708*y+.5363325363*R+.0514459929*d,w=.2119034982*y+.6806995451*R+.1073969566*d,S=.0883024619*y+.2817188376*R+.6299787005*d,g=Math.cbrt(v),E=Math.cbrt(w),D=Math.cbrt(S),$=.2104542553*g+.793617785*E-.0040720468*D,O=1.9779984951*g-2.428592205*E+.4505937099*D,T=.0259040371*g+.7827717662*E-.808675766*D,C=Math.sqrt(O*O+T*T);let N=Math.atan2(T,O)*(180/Math.PI);return N<0&&(N+=360),{l:$,c:C,h:N}}function Y(e,n,c,r=!1){const i=c*Math.PI/180,m=n*Math.cos(i),y=n*Math.sin(i),R=e+.3963377774*m+.2158037573*y,d=e-.1055613458*m-.0638541728*y,v=e-.0894841775*m-1.291485548*y,w=r?p(R):R,S=r?p(d):d,g=r?p(v):v;if(!r&&(w<-1e-4||w>1.0001||S<-1e-4||S>1.0001||g<-1e-4||g>1.0001))return null;const E=w*w*w,D=S*S*S,$=g*g*g;let O=4.0767416621*E-3.3077115913*D+.2309699292*$,T=-1.2684380046*E+2.6097574011*D-.3413193965*$,C=-.0041960863*E-.7034186147*D+1.707614701*$;if(r)O=p(O),T=p(T),C=p(C);else if(O<-1e-4||O>1.0001||T<-1e-4||T>1.0001||C<-1e-4||C>1.0001)return null;const N=p(j(O)),oe=p(j(T)),re=p(j(C));return{r:Math.round(N*255),g:Math.round(oe*255),b:Math.round(re*255)}}function ee(e,n,c){let r=n;for(let i=0;i<8;i+=1){const m=Y(e,r,c);if(m)return m;r*=.9}return Y(e,p(r),c,!0)||{r:0,g:0,b:0}}function te(e){const n=K(e);if(!n)return null;const c=J(n);if(!c)return null;const r=Z(c),i={100:{lightness:.35,chroma:.45},200:{lightness:.28,chroma:.5},300:{lightness:.22,chroma:.6},400:{lightness:.16,chroma:.75},500:{lightness:.08,chroma:.9},600:{lightness:0,chroma:1,base:!0},700:{lightness:-.08,chroma:1.05},800:{lightness:-.18,chroma:1.1},900:{lightness:-.28,chroma:1.15},1e3:{lightness:-.35,chroma:1.2}},m={},y=d=>d===0?r.l:d>0?p(r.l+d*(1-r.l)):p(r.l*(1+d)),R=d=>{if(d===1)return r.c;const v=r.c*d;return Math.max(0,Math.min(.4,v))};return Object.entries(i).forEach(([d,v])=>{const w=`--color-brand-${d}`;if(v.base){m[w]=n;return}const S=y(v.lightness),g=R(v.chroma),E=ee(S,g,r.h);m[w]=X(E)}),m}const Q=t.computed(()=>te(a.accentColor)??{}),ne=t.computed(()=>Q.value),A={vars:{},enabled:!!a.exposeGlobalAccent};return l.push(A),t.watch(()=>a.exposeGlobalAccent,e=>{A.enabled=!!e,b()},{immediate:!0}),t.watch(Q,e=>{e&&Object.keys(e).length>0?A.vars={...e}:A.vars={},b()},{immediate:!0}),(e,n)=>(t.openBlock(),t.createElementBlock("div",{class:"theme",style:t.normalizeStyle(ne.value)},[t.renderSlot(e.$slots,"default"),t.createElementVNode("div",{ref_key:"portalHost",ref:h,class:"theme__portal-host"},null,512)],4))}}),ge=(o,a)=>{const l=o.__vccOpts||o;for(const[s,b]of a)l[s]=b;return l},ke={__name:"ThemeSwitcher",props:{mode:{type:String,default:"auto",validator:o=>["auto","light","dark"].includes(o)}},emits:["update:mode"],setup(o,{emit:a}){const s=[{value:"auto",label:"System"},{value:"light",label:"Light"},{value:"dark",label:"Dark"}].reduce((h,f)=>(h[f.value]=f.label,h),{}),b=x,k=o,U=a;F();const _=t.ref(!1),I=B()??k.mode,u=t.ref(b.includes(I)?I:"auto");return t.computed(()=>s[u.value]??s.auto),t.watch(()=>k.mode,h=>{b.includes(h)&&h!==u.value&&(u.value=h)}),t.watch(u,h=>{if(!b.includes(h)){u.value="auto";return}_.value=!1,U("update:mode",h),le(h)},{immediate:!0}),(h,f)=>(t.openBlock(),t.createBlock(t.unref(L.DropdownMenu),{open:_.value,"onUpdate:open":f[3]||(f[3]=M=>_.value=M),text:"Theme","aria-label":"Select theme mode"},{default:t.withCtx(()=>[t.createVNode(t.unref(L.DropdownItemGroup),{title:"Theme"},{default:t.withCtx(()=>[t.createVNode(t.unref(L.DropdownItemRadio),{checked:u.value,"onUpdate:checked":f[0]||(f[0]=M=>u.value=M),value:"auto",label:t.unref(s).auto,"aria-label":`${t.unref(s).auto} mode`},null,8,["checked","label","aria-label"]),f[4]||(f[4]=t.createElementVNode("hr",{class:"theme-switcher-divider",role:"separator"},null,-1)),t.createVNode(t.unref(L.DropdownItemRadio),{checked:u.value,"onUpdate:checked":f[1]||(f[1]=M=>u.value=M),value:"light",label:t.unref(s).light,"aria-label":`${t.unref(s).light} mode`},null,8,["checked","label","aria-label"]),t.createVNode(t.unref(L.DropdownItemRadio),{checked:u.value,"onUpdate:checked":f[2]||(f[2]=M=>u.value=M),value:"dark",label:t.unref(s).dark,"aria-label":`${t.unref(s).dark} mode`},null,8,["checked","label","aria-label"])]),_:1})]),_:1},8,["open"]))}},Me=ge(ke,[["__scopeId","data-v-bcbc87cb"]]);exports.Theme=be;exports.ThemeSwitcher=Me;exports.themePortalHostKey=H;exports.useThemePortalTarget=fe;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("vue");require("what-input");const L=require("@gospore/dropdown-menu"),x=["auto","light","dark"],z="gospore-theme-mode",ae=3600*24*365,se="(prefers-color-scheme: dark)";function B(){if(typeof document>"u")return null;const o=ue(z);return o&&x.includes(o)?o:null}function le(o){if(typeof document>"u"||!x.includes(o))return;const a=typeof window<"u"?window.location.hostname:"",l=typeof window<"u"?window.location.protocol:"",s=ie(a),b=l==="https:",k=["path=/",`max-age=${ae}`,"SameSite=Lax"];s&&k.push(`domain=${s}`),b&&k.push("Secure"),document.cookie=[`${encodeURIComponent(z)}=${encodeURIComponent(o)}`,...k].join("; ")}function F(o){if(typeof document>"u")return;const a=typeof o=="string"&&x.includes(o)?o:B()??"auto";console.log("Applying theme mode:",a);const l=de(a);document.documentElement.setAttribute("dark-mode",l)}function ue(o){if(typeof document>"u"||!document.cookie)return null;const a=`${encodeURIComponent(o)}=`,l=document.cookie.split("; ");for(const s of l)if(s.startsWith(a))return decodeURIComponent(s.slice(a.length));return null}function ie(o){if(!o||o==="localhost")return null;if(/^\d+(?:\.\d+){3}$/.test(o))return o;const l=o.split(".");return l.length<=1?null:l.length===2?o:l.slice(-2).join(".")}function de(o){if(o==="dark")return!0;if(o==="light"||typeof window>"u")return!1;try{const a=typeof window.matchMedia=="function"?window.matchMedia(se):null;return a?a.matches:!1}catch{return!1}}const H=Symbol.for("gospore.theme.portalHost");function fe(){const o=t.inject(H,null);console.log("Using theme portal host:",o);const a=typeof document<"u"?document.body:"body";return t.computed(()=>o?.value??a)}const me="(prefers-color-scheme: dark)",he="(prefers-reduced-motion: reduce)",pe=200,be=Object.assign({name:"Theme"},{__name:"Theme",props:{mode:{type:String,validator:o=>["auto","light","dark"].includes(o)},accentColor:{type:String,required:!1,default:void 0},exposeGlobalAccent:{type:Boolean,default:!1}},setup(o){const a=o,l=[],s=new Set;function b(){const e=document.documentElement;if(!e)return;s.forEach(c=>{e.style.removeProperty(c)}),s.clear();const n=[...l].reverse().find(c=>c.enabled&&c.vars&&Object.keys(c.vars).length>0);n&&Object.entries(n.vars).forEach(([c,r])=>{e.style.setProperty(c,r),s.add(c)})}const k=window.matchMedia(me),U=window.matchMedia(he),_=q();F(_);const I=t.ref(_),u=t.ref({darkMode:M(_)}),h=t.ref(null);k.addEventListener("change",V),t.watch(()=>a.mode,()=>{f()},{immediate:!0}),t.watch(()=>u.value.darkMode,(e,n)=>{if(n===void 0){G(e);return}W(()=>{G(e)})},{immediate:!0}),t.onBeforeUnmount(()=>{k.removeEventListener("change",V);const e=l.indexOf(A);e!==-1&&l.splice(e,1),b()});function f(){const e=q();I.value=e,u.value.darkMode=M(e)}function M(e){return e==="dark"?!0:e==="light"?!1:k.matches}function V(e){!e||I.value!=="auto"||(u.value.darkMode=e.matches)}function G(e){document.documentElement.setAttribute("dark-mode",e)}function W(e){if(U.matches){e();return}const n=document.startViewTransition?.bind(document);if(n){n(()=>{e()});return}e();const c=document.documentElement;typeof c.animate=="function"&&window.requestAnimationFrame(()=>{c.animate([{opacity:.85},{opacity:1}],{duration:pe,easing:"ease-in-out"})})}function q(){return a.mode??B()??"auto"}t.provide("theme",u),t.provide(H,h);function K(e){if(!e)return null;const n=e.trim().toLowerCase();if(!/^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.exec(n))return null;if(n.length===4){const r=n[1],i=n[2],m=n[3];return`#${r}${r}${i}${i}${m}${m}`}return n}function J(e){const n=K(e);if(!n)return null;const c=parseInt(n.slice(1,3),16),r=parseInt(n.slice(3,5),16),i=parseInt(n.slice(5,7),16);return{r:c,g:r,b:i}}function X({r:e,g:n,b:c}){const r=i=>i.toString(16).padStart(2,"0");return`#${r(e)}${r(n)}${r(c)}`}function p(e){return Math.max(0,Math.min(1,e))}function P(e){return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function j(e){const n=p(e);return n<=.0031308?12.92*n:1.055*Math.pow(n,1/2.4)-.055}function Z({r:e,g:n,b:c}){const r=e/255,i=n/255,m=c/255,y=P(r),R=P(i),d=P(m),v=.4122214708*y+.5363325363*R+.0514459929*d,w=.2119034982*y+.6806995451*R+.1073969566*d,S=.0883024619*y+.2817188376*R+.6299787005*d,g=Math.cbrt(v),E=Math.cbrt(w),D=Math.cbrt(S),$=.2104542553*g+.793617785*E-.0040720468*D,O=1.9779984951*g-2.428592205*E+.4505937099*D,T=.0259040371*g+.7827717662*E-.808675766*D,C=Math.sqrt(O*O+T*T);let N=Math.atan2(T,O)*(180/Math.PI);return N<0&&(N+=360),{l:$,c:C,h:N}}function Y(e,n,c,r=!1){const i=c*Math.PI/180,m=n*Math.cos(i),y=n*Math.sin(i),R=e+.3963377774*m+.2158037573*y,d=e-.1055613458*m-.0638541728*y,v=e-.0894841775*m-1.291485548*y,w=r?p(R):R,S=r?p(d):d,g=r?p(v):v;if(!r&&(w<-1e-4||w>1.0001||S<-1e-4||S>1.0001||g<-1e-4||g>1.0001))return null;const E=w*w*w,D=S*S*S,$=g*g*g;let O=4.0767416621*E-3.3077115913*D+.2309699292*$,T=-1.2684380046*E+2.6097574011*D-.3413193965*$,C=-.0041960863*E-.7034186147*D+1.707614701*$;if(r)O=p(O),T=p(T),C=p(C);else if(O<-1e-4||O>1.0001||T<-1e-4||T>1.0001||C<-1e-4||C>1.0001)return null;const N=p(j(O)),oe=p(j(T)),re=p(j(C));return{r:Math.round(N*255),g:Math.round(oe*255),b:Math.round(re*255)}}function ee(e,n,c){let r=n;for(let i=0;i<8;i+=1){const m=Y(e,r,c);if(m)return m;r*=.9}return Y(e,p(r),c,!0)||{r:0,g:0,b:0}}function te(e){const n=K(e);if(!n)return null;const c=J(n);if(!c)return null;const r=Z(c),i={100:{lightness:.35,chroma:.45},200:{lightness:.28,chroma:.5},300:{lightness:.22,chroma:.6},400:{lightness:.16,chroma:.75},500:{lightness:.08,chroma:.9},600:{lightness:0,chroma:1,base:!0},700:{lightness:-.08,chroma:1.05},800:{lightness:-.18,chroma:1.1},900:{lightness:-.28,chroma:1.15},1e3:{lightness:-.35,chroma:1.2}},m={},y=d=>d===0?r.l:d>0?p(r.l+d*(1-r.l)):p(r.l*(1+d)),R=d=>{if(d===1)return r.c;const v=r.c*d;return Math.max(0,Math.min(.4,v))};return Object.entries(i).forEach(([d,v])=>{const w=`--color-brand-${d}`;if(v.base){m[w]=n;return}const S=y(v.lightness),g=R(v.chroma),E=ee(S,g,r.h);m[w]=X(E)}),m}const Q=t.computed(()=>te(a.accentColor)??{}),ne=t.computed(()=>Q.value),A={vars:{},enabled:!!a.exposeGlobalAccent};return l.push(A),t.watch(()=>a.exposeGlobalAccent,e=>{A.enabled=!!e,b()},{immediate:!0}),t.watch(Q,e=>{e&&Object.keys(e).length>0?A.vars={...e}:A.vars={},b()},{immediate:!0}),(e,n)=>(t.openBlock(),t.createElementBlock("div",{class:"theme",style:t.normalizeStyle(ne.value)},[t.renderSlot(e.$slots,"default"),t.createElementVNode("div",{ref_key:"portalHost",ref:h,class:"theme__portal-host"},null,512)],4))}}),ge=(o,a)=>{const l=o.__vccOpts||o;for(const[s,b]of a)l[s]=b;return l},ke={__name:"ThemeSwitcher",props:{mode:{type:String,default:"auto",validator:o=>["auto","light","dark"].includes(o)}},emits:["update:mode"],setup(o,{emit:a}){const s=[{value:"auto",label:"System"},{value:"light",label:"Light"},{value:"dark",label:"Dark"}].reduce((h,f)=>(h[f.value]=f.label,h),{}),b=x,k=o,U=a;F();const _=t.ref(!1),I=B()??k.mode,u=t.ref(b.includes(I)?I:"auto");return t.computed(()=>s[u.value]??s.auto),t.watch(()=>k.mode,h=>{b.includes(h)&&h!==u.value&&(u.value=h)}),t.watch(u,h=>{if(!b.includes(h)){u.value="auto";return}_.value=!1,U("update:mode",h),le(h)},{immediate:!0}),(h,f)=>(t.openBlock(),t.createBlock(t.unref(L.DropdownMenu),{open:_.value,"onUpdate:open":f[3]||(f[3]=M=>_.value=M),text:"Theme","aria-label":"Select theme mode"},{default:t.withCtx(()=>[t.createVNode(t.unref(L.DropdownItemGroup),{title:"Theme"},{default:t.withCtx(()=>[t.createVNode(t.unref(L.DropdownItemRadio),{checked:u.value,"onUpdate:checked":f[0]||(f[0]=M=>u.value=M),value:"auto",label:t.unref(s).auto,"aria-label":`${t.unref(s).auto} mode`},null,8,["checked","label","aria-label"]),f[4]||(f[4]=t.createElementVNode("hr",{class:"theme-switcher-divider",role:"separator"},null,-1)),t.createVNode(t.unref(L.DropdownItemRadio),{checked:u.value,"onUpdate:checked":f[1]||(f[1]=M=>u.value=M),value:"light",label:t.unref(s).light,"aria-label":`${t.unref(s).light} mode`},null,8,["checked","label","aria-label"]),t.createVNode(t.unref(L.DropdownItemRadio),{checked:u.value,"onUpdate:checked":f[2]||(f[2]=M=>u.value=M),value:"dark",label:t.unref(s).dark,"aria-label":`${t.unref(s).dark} mode`},null,8,["checked","label","aria-label"])]),_:1})]),_:1},8,["open"]))}},Me=ge(ke,[["__scopeId","data-v-bcbc87cb"]]);exports.Theme=be;exports.ThemeSwitcher=Me;exports.themePortalHostKey=H;exports.useThemePortalTarget=fe;
2
2
  //# sourceMappingURL=theme.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.cjs.js","sources":["../src/modeStorage.js","../src/portalHost.js","../src/Theme.vue","../src/ThemeSwitcher.vue"],"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","import { computed, inject } from \"vue\";\n\nexport const themePortalHostKey = Symbol.for(\"gospore.theme.portalHost\");\n\nexport function useThemePortalTarget() {\n const hostRef = inject(themePortalHostKey, null);\n console.log(\"Using theme portal host:\", hostRef);\n const fallbackTarget =\n typeof document !== \"undefined\" ? document.body : \"body\";\n\n return computed(() => hostRef?.value ?? fallbackTarget);\n}\n","<template>\n <div class=\"theme\" :style=\"brandStyle\">\n <slot />\n <div ref=\"portalHost\" class=\"theme__portal-host\"></div>\n </div>\n</template>\n\n<script setup>\nimport { provide, ref, watch, onBeforeUnmount, computed } from \"vue\";\nimport { applyStoredModeToDocument, readStoredMode } from \"./modeStorage\";\nimport \"what-input\";\nimport { themePortalHostKey } from \"./portalHost\";\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 * Optional hex accent color (\"#RRGGBB\" or \"#RGB\"). When provided,\n * Theme derives the `--color-brand-*` palette and exposes the tokens on\n * the root .theme element (and the global document for portals).\n */\n accentColor: {\n type: String,\n required: false,\n default: undefined,\n },\n /**\n * When true the brand vars are also exposed on <html>, allowing portals\n * attached outside the Theme subtree to inherit the accent colors.\n */\n exposeGlobalAccent: {\n type: Boolean,\n default: false,\n },\n});\n\nconst globalAccentStack = [];\nconst appliedGlobalAccentKeys = new Set();\n\nfunction applyGlobalAccentFromStack() {\n const root = document.documentElement;\n if (!root) {\n return;\n }\n\n appliedGlobalAccentKeys.forEach((key) => {\n root.style.removeProperty(key);\n });\n appliedGlobalAccentKeys.clear();\n\n const activeEntry = [...globalAccentStack]\n .reverse()\n .find(\n (entry) =>\n entry.enabled &&\n entry.vars &&\n Object.keys(entry.vars).length > 0,\n );\n\n if (!activeEntry) {\n return;\n }\n\n Object.entries(activeEntry.vars).forEach(([key, value]) => {\n root.style.setProperty(key, value);\n appliedGlobalAccentKeys.add(key);\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});\nconst portalHost = ref(null);\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 const index = globalAccentStack.indexOf(accentStackEntry);\n if (index !== -1) {\n globalAccentStack.splice(index, 1);\n }\n applyGlobalAccentFromStack();\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);\nprovide(themePortalHostKey, portalHost);\n\n// --- Accent helpers -------------------------------------------------------\nfunction normalizeHex(hex) {\n if (!hex) return null;\n const h = hex.trim().toLowerCase();\n const m = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.exec(h);\n if (!m) return null;\n if (h.length === 4) {\n // expand #rgb -> #rrggbb\n const r = h[1],\n g = h[2],\n b = h[3];\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n return h;\n}\n\nfunction hexToRgb(hex) {\n const h = normalizeHex(hex);\n if (!h) return null;\n const r = parseInt(h.slice(1, 3), 16);\n const g = parseInt(h.slice(3, 5), 16);\n const b = parseInt(h.slice(5, 7), 16);\n return { r, g, b };\n}\n\nfunction rgbToHex({ r, g, b }) {\n const toHex = (value) => value.toString(16).padStart(2, \"0\");\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction clamp01(value) {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction srgbChannelToLinear(channel) {\n if (channel <= 0.04045) {\n return channel / 12.92;\n }\n return Math.pow((channel + 0.055) / 1.055, 2.4);\n}\n\nfunction linearChannelToSrgb(channel) {\n const normalized = clamp01(channel);\n if (normalized <= 0.0031308) {\n return 12.92 * normalized;\n }\n return 1.055 * Math.pow(normalized, 1 / 2.4) - 0.055;\n}\n\nfunction rgbToOklch({ r, g, b }) {\n const rNorm = r / 255;\n const gNorm = g / 255;\n const bNorm = b / 255;\n\n const rLin = srgbChannelToLinear(rNorm);\n const gLin = srgbChannelToLinear(gNorm);\n const bLin = srgbChannelToLinear(bNorm);\n\n const l = 0.4122214708 * rLin + 0.5363325363 * gLin + 0.0514459929 * bLin;\n const m = 0.2119034982 * rLin + 0.6806995451 * gLin + 0.1073969566 * bLin;\n const s = 0.0883024619 * rLin + 0.2817188376 * gLin + 0.6299787005 * bLin;\n\n const lRoot = Math.cbrt(l);\n const mRoot = Math.cbrt(m);\n const sRoot = Math.cbrt(s);\n\n const oklabL =\n 0.2104542553 * lRoot + 0.793617785 * mRoot - 0.0040720468 * sRoot;\n const oklabA =\n 1.9779984951 * lRoot - 2.428592205 * mRoot + 0.4505937099 * sRoot;\n const oklabB =\n 0.0259040371 * lRoot + 0.7827717662 * mRoot - 0.808675766 * sRoot;\n\n const chroma = Math.sqrt(oklabA * oklabA + oklabB * oklabB);\n let hue = Math.atan2(oklabB, oklabA) * (180 / Math.PI);\n if (hue < 0) {\n hue += 360;\n }\n\n return { l: oklabL, c: chroma, h: hue };\n}\n\nfunction tryOklchToSrgb(l, c, h, clampLinear = false) {\n const angle = (h * Math.PI) / 180;\n const a = c * Math.cos(angle);\n const b = c * Math.sin(angle);\n\n const lComponent = l + 0.3963377774 * a + 0.2158037573 * b;\n const mComponent = l - 0.1055613458 * a - 0.0638541728 * b;\n const sComponent = l - 0.0894841775 * a - 1.291485548 * b;\n\n const lCube = clampLinear ? clamp01(lComponent) : lComponent;\n const mCube = clampLinear ? clamp01(mComponent) : mComponent;\n const sCube = clampLinear ? clamp01(sComponent) : sComponent;\n\n if (!clampLinear) {\n const outOfRange =\n lCube < -0.0001 ||\n lCube > 1.0001 ||\n mCube < -0.0001 ||\n mCube > 1.0001 ||\n sCube < -0.0001 ||\n sCube > 1.0001;\n if (outOfRange) {\n return null;\n }\n }\n\n const lLin = lCube * lCube * lCube;\n const mLin = mCube * mCube * mCube;\n const sLin = sCube * sCube * sCube;\n\n let rLin = 4.0767416621 * lLin - 3.3077115913 * mLin + 0.2309699292 * sLin;\n let gLin = -1.2684380046 * lLin + 2.6097574011 * mLin - 0.3413193965 * sLin;\n let bLin = -0.0041960863 * lLin - 0.7034186147 * mLin + 1.707614701 * sLin;\n\n if (clampLinear) {\n rLin = clamp01(rLin);\n gLin = clamp01(gLin);\n bLin = clamp01(bLin);\n } else {\n const outOfRange =\n rLin < -0.0001 ||\n rLin > 1.0001 ||\n gLin < -0.0001 ||\n gLin > 1.0001 ||\n bLin < -0.0001 ||\n bLin > 1.0001;\n if (outOfRange) {\n return null;\n }\n }\n\n const r = clamp01(linearChannelToSrgb(rLin));\n const g = clamp01(linearChannelToSrgb(gLin));\n const bValue = clamp01(linearChannelToSrgb(bLin));\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(bValue * 255),\n };\n}\n\nfunction oklchToSrgb(l, c, h) {\n let chroma = c;\n for (let attempt = 0; attempt < 8; attempt += 1) {\n const rgb = tryOklchToSrgb(l, chroma, h);\n if (rgb) {\n return rgb;\n }\n chroma *= 0.9;\n }\n return tryOklchToSrgb(l, clamp01(chroma), h, true) || { r: 0, g: 0, b: 0 };\n}\n\nfunction makeBrandScale(baseHex) {\n const norm = normalizeHex(baseHex);\n if (!norm) return null;\n const baseRgb = hexToRgb(norm);\n if (!baseRgb) return null;\n const baseOklch = rgbToOklch(baseRgb);\n const toneConfig = {\n 100: { lightness: 0.35, chroma: 0.45 },\n 200: { lightness: 0.28, chroma: 0.5 },\n 300: { lightness: 0.22, chroma: 0.6 },\n 400: { lightness: 0.16, chroma: 0.75 },\n 500: { lightness: 0.08, chroma: 0.9 },\n 600: { lightness: 0, chroma: 1, base: true },\n 700: { lightness: -0.08, chroma: 1.05 },\n 800: { lightness: -0.18, chroma: 1.1 },\n 900: { lightness: -0.28, chroma: 1.15 },\n 1000: { lightness: -0.35, chroma: 1.2 },\n };\n const tokens = {};\n\n const adjustLightness = (lightnessValue) => {\n if (lightnessValue === 0) {\n return baseOklch.l;\n }\n if (lightnessValue > 0) {\n return clamp01(baseOklch.l + lightnessValue * (1 - baseOklch.l));\n }\n return clamp01(baseOklch.l * (1 + lightnessValue));\n };\n\n const adjustChroma = (chromaScale) => {\n if (chromaScale === 1) {\n return baseOklch.c;\n }\n const scaled = baseOklch.c * chromaScale;\n return Math.max(0, Math.min(0.4, scaled));\n };\n\n Object.entries(toneConfig).forEach(([stop, config]) => {\n const tokenName = `--color-brand-${stop}`;\n if (config.base) {\n tokens[tokenName] = norm;\n return;\n }\n const toneL = adjustLightness(config.lightness);\n const toneC = adjustChroma(config.chroma);\n const toneRgb = oklchToSrgb(toneL, toneC, baseOklch.h);\n tokens[tokenName] = rgbToHex(toneRgb);\n });\n return tokens;\n}\n\nconst brandVars = computed(() => makeBrandScale(props.accentColor) ?? {});\nconst brandStyle = computed(() => brandVars.value);\n\nconst accentStackEntry = {\n vars: {},\n enabled: Boolean(props.exposeGlobalAccent),\n};\nglobalAccentStack.push(accentStackEntry);\n\nwatch(\n () => props.exposeGlobalAccent,\n (enabled) => {\n accentStackEntry.enabled = Boolean(enabled);\n applyGlobalAccentFromStack();\n },\n { immediate: true },\n);\n\nwatch(\n brandVars,\n (vars) => {\n if (vars && Object.keys(vars).length > 0) {\n accentStackEntry.vars = { ...vars };\n } else {\n accentStackEntry.vars = {};\n }\n applyGlobalAccentFromStack();\n },\n { immediate: true },\n);\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</script>\n\n<style scoped lang=\"less\">\n.theme-switcher-divider {\n margin: 4px 0;\n}\n</style>\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","themePortalHostKey","useThemePortalTarget","hostRef","inject","fallbackTarget","computed","props","__props","globalAccentStack","appliedGlobalAccentKeys","applyGlobalAccentFromStack","root","key","activeEntry","entry","value","darkModeMedia","prefersReducedMotionMedia","PREFERS_REDUCED_MOTION_QUERY","initialMode","getEffectiveMode","currentMode","ref","theme","portalHost","handleSystemPreferenceChange","watch","syncDarkMode","previousValue","setDocumentDarkModeAttribute","withThemeTransition","onBeforeUnmount","index","accentStackEntry","event","applyTheme","startViewTransition","element","THEME_TRANSITION_DURATION","provide","normalizeHex","hex","h","g","b","hexToRgb","r","rgbToHex","toHex","clamp01","srgbChannelToLinear","channel","linearChannelToSrgb","normalized","rgbToOklch","rNorm","gNorm","bNorm","rLin","gLin","bLin","l","m","s","lRoot","mRoot","sRoot","oklabL","oklabA","oklabB","chroma","hue","tryOklchToSrgb","c","clampLinear","angle","a","lComponent","mComponent","sComponent","lCube","mCube","sCube","lLin","mLin","sLin","bValue","oklchToSrgb","attempt","rgb","makeBrandScale","baseHex","norm","baseRgb","baseOklch","toneConfig","tokens","adjustLightness","lightnessValue","adjustChroma","chromaScale","scaled","stop","config","tokenName","toneL","toneC","toneRgb","brandVars","brandStyle","enabled","vars","_createElementBlock","_renderSlot","_ctx","_createElementVNode","MODE_LABELS","map","option","VALID_MODES","emit","__emit","open","internalMode","_createBlock","_unref","DropdownMenu","$event","_createVNode","DropdownItemGroup","DropdownItemRadio"],"mappings":"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"}
1
+ {"version":3,"file":"theme.cjs.js","sources":["../src/modeStorage.js","../src/portalHost.js","../src/Theme.vue","../src/ThemeSwitcher.vue"],"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","import { computed, inject } from \"vue\";\n\nexport const themePortalHostKey = Symbol.for(\"gospore.theme.portalHost\");\n\nexport function useThemePortalTarget() {\n const hostRef = inject(themePortalHostKey, null);\n console.log(\"Using theme portal host:\", hostRef);\n const fallbackTarget =\n typeof document !== \"undefined\" ? document.body : \"body\";\n\n return computed(() => hostRef?.value ?? fallbackTarget);\n}\n","<template>\n <div class=\"theme\" :style=\"brandStyle\">\n <slot />\n <div ref=\"portalHost\" class=\"theme__portal-host\"></div>\n </div>\n</template>\n\n<script setup>\nimport { provide, ref, watch, onBeforeUnmount, computed } from \"vue\";\nimport { applyStoredModeToDocument, readStoredMode } from \"./modeStorage\";\nimport \"what-input\";\nimport { themePortalHostKey } from \"./portalHost\";\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 * Optional hex accent color (\"#RRGGBB\" or \"#RGB\"). When provided,\n * Theme derives the `--color-brand-*` palette and exposes the tokens on\n * the root .theme element (and the global document for portals).\n */\n accentColor: {\n type: String,\n required: false,\n default: undefined,\n },\n /**\n * When true the brand vars are also exposed on <html>, allowing portals\n * attached outside the Theme subtree to inherit the accent colors.\n */\n exposeGlobalAccent: {\n type: Boolean,\n default: false,\n },\n});\n\nconst globalAccentStack = [];\nconst appliedGlobalAccentKeys = new Set();\n\nfunction applyGlobalAccentFromStack() {\n const root = document.documentElement;\n if (!root) {\n return;\n }\n\n appliedGlobalAccentKeys.forEach((key) => {\n root.style.removeProperty(key);\n });\n appliedGlobalAccentKeys.clear();\n\n const activeEntry = [...globalAccentStack]\n .reverse()\n .find(\n (entry) =>\n entry.enabled &&\n entry.vars &&\n Object.keys(entry.vars).length > 0,\n );\n\n if (!activeEntry) {\n return;\n }\n\n Object.entries(activeEntry.vars).forEach(([key, value]) => {\n root.style.setProperty(key, value);\n appliedGlobalAccentKeys.add(key);\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});\nconst portalHost = ref(null);\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 const index = globalAccentStack.indexOf(accentStackEntry);\n if (index !== -1) {\n globalAccentStack.splice(index, 1);\n }\n applyGlobalAccentFromStack();\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);\nprovide(themePortalHostKey, portalHost);\n\n// --- Accent helpers -------------------------------------------------------\nfunction normalizeHex(hex) {\n if (!hex) return null;\n const h = hex.trim().toLowerCase();\n const m = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.exec(h);\n if (!m) return null;\n if (h.length === 4) {\n // expand #rgb -> #rrggbb\n const r = h[1],\n g = h[2],\n b = h[3];\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n return h;\n}\n\nfunction hexToRgb(hex) {\n const h = normalizeHex(hex);\n if (!h) return null;\n const r = parseInt(h.slice(1, 3), 16);\n const g = parseInt(h.slice(3, 5), 16);\n const b = parseInt(h.slice(5, 7), 16);\n return { r, g, b };\n}\n\nfunction rgbToHex({ r, g, b }) {\n const toHex = (value) => value.toString(16).padStart(2, \"0\");\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction clamp01(value) {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction srgbChannelToLinear(channel) {\n if (channel <= 0.04045) {\n return channel / 12.92;\n }\n return Math.pow((channel + 0.055) / 1.055, 2.4);\n}\n\nfunction linearChannelToSrgb(channel) {\n const normalized = clamp01(channel);\n if (normalized <= 0.0031308) {\n return 12.92 * normalized;\n }\n return 1.055 * Math.pow(normalized, 1 / 2.4) - 0.055;\n}\n\nfunction rgbToOklch({ r, g, b }) {\n const rNorm = r / 255;\n const gNorm = g / 255;\n const bNorm = b / 255;\n\n const rLin = srgbChannelToLinear(rNorm);\n const gLin = srgbChannelToLinear(gNorm);\n const bLin = srgbChannelToLinear(bNorm);\n\n const l = 0.4122214708 * rLin + 0.5363325363 * gLin + 0.0514459929 * bLin;\n const m = 0.2119034982 * rLin + 0.6806995451 * gLin + 0.1073969566 * bLin;\n const s = 0.0883024619 * rLin + 0.2817188376 * gLin + 0.6299787005 * bLin;\n\n const lRoot = Math.cbrt(l);\n const mRoot = Math.cbrt(m);\n const sRoot = Math.cbrt(s);\n\n const oklabL =\n 0.2104542553 * lRoot + 0.793617785 * mRoot - 0.0040720468 * sRoot;\n const oklabA =\n 1.9779984951 * lRoot - 2.428592205 * mRoot + 0.4505937099 * sRoot;\n const oklabB =\n 0.0259040371 * lRoot + 0.7827717662 * mRoot - 0.808675766 * sRoot;\n\n const chroma = Math.sqrt(oklabA * oklabA + oklabB * oklabB);\n let hue = Math.atan2(oklabB, oklabA) * (180 / Math.PI);\n if (hue < 0) {\n hue += 360;\n }\n\n return { l: oklabL, c: chroma, h: hue };\n}\n\nfunction tryOklchToSrgb(l, c, h, clampLinear = false) {\n const angle = (h * Math.PI) / 180;\n const a = c * Math.cos(angle);\n const b = c * Math.sin(angle);\n\n const lComponent = l + 0.3963377774 * a + 0.2158037573 * b;\n const mComponent = l - 0.1055613458 * a - 0.0638541728 * b;\n const sComponent = l - 0.0894841775 * a - 1.291485548 * b;\n\n const lCube = clampLinear ? clamp01(lComponent) : lComponent;\n const mCube = clampLinear ? clamp01(mComponent) : mComponent;\n const sCube = clampLinear ? clamp01(sComponent) : sComponent;\n\n if (!clampLinear) {\n const outOfRange =\n lCube < -0.0001 ||\n lCube > 1.0001 ||\n mCube < -0.0001 ||\n mCube > 1.0001 ||\n sCube < -0.0001 ||\n sCube > 1.0001;\n if (outOfRange) {\n return null;\n }\n }\n\n const lLin = lCube * lCube * lCube;\n const mLin = mCube * mCube * mCube;\n const sLin = sCube * sCube * sCube;\n\n let rLin = 4.0767416621 * lLin - 3.3077115913 * mLin + 0.2309699292 * sLin;\n let gLin = -1.2684380046 * lLin + 2.6097574011 * mLin - 0.3413193965 * sLin;\n let bLin = -0.0041960863 * lLin - 0.7034186147 * mLin + 1.707614701 * sLin;\n\n if (clampLinear) {\n rLin = clamp01(rLin);\n gLin = clamp01(gLin);\n bLin = clamp01(bLin);\n } else {\n const outOfRange =\n rLin < -0.0001 ||\n rLin > 1.0001 ||\n gLin < -0.0001 ||\n gLin > 1.0001 ||\n bLin < -0.0001 ||\n bLin > 1.0001;\n if (outOfRange) {\n return null;\n }\n }\n\n const r = clamp01(linearChannelToSrgb(rLin));\n const g = clamp01(linearChannelToSrgb(gLin));\n const bValue = clamp01(linearChannelToSrgb(bLin));\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(bValue * 255),\n };\n}\n\nfunction oklchToSrgb(l, c, h) {\n let chroma = c;\n for (let attempt = 0; attempt < 8; attempt += 1) {\n const rgb = tryOklchToSrgb(l, chroma, h);\n if (rgb) {\n return rgb;\n }\n chroma *= 0.9;\n }\n return tryOklchToSrgb(l, clamp01(chroma), h, true) || { r: 0, g: 0, b: 0 };\n}\n\nfunction makeBrandScale(baseHex) {\n const norm = normalizeHex(baseHex);\n if (!norm) return null;\n const baseRgb = hexToRgb(norm);\n if (!baseRgb) return null;\n const baseOklch = rgbToOklch(baseRgb);\n const toneConfig = {\n 100: { lightness: 0.35, chroma: 0.45 },\n 200: { lightness: 0.28, chroma: 0.5 },\n 300: { lightness: 0.22, chroma: 0.6 },\n 400: { lightness: 0.16, chroma: 0.75 },\n 500: { lightness: 0.08, chroma: 0.9 },\n 600: { lightness: 0, chroma: 1, base: true },\n 700: { lightness: -0.08, chroma: 1.05 },\n 800: { lightness: -0.18, chroma: 1.1 },\n 900: { lightness: -0.28, chroma: 1.15 },\n 1000: { lightness: -0.35, chroma: 1.2 },\n };\n const tokens = {};\n\n const adjustLightness = (lightnessValue) => {\n if (lightnessValue === 0) {\n return baseOklch.l;\n }\n if (lightnessValue > 0) {\n return clamp01(baseOklch.l + lightnessValue * (1 - baseOklch.l));\n }\n return clamp01(baseOklch.l * (1 + lightnessValue));\n };\n\n const adjustChroma = (chromaScale) => {\n if (chromaScale === 1) {\n return baseOklch.c;\n }\n const scaled = baseOklch.c * chromaScale;\n return Math.max(0, Math.min(0.4, scaled));\n };\n\n Object.entries(toneConfig).forEach(([stop, config]) => {\n const tokenName = `--color-brand-${stop}`;\n if (config.base) {\n tokens[tokenName] = norm;\n return;\n }\n const toneL = adjustLightness(config.lightness);\n const toneC = adjustChroma(config.chroma);\n const toneRgb = oklchToSrgb(toneL, toneC, baseOklch.h);\n tokens[tokenName] = rgbToHex(toneRgb);\n });\n return tokens;\n}\n\nconst brandVars = computed(() => makeBrandScale(props.accentColor) ?? {});\nconst brandStyle = computed(() => brandVars.value);\n\nconst accentStackEntry = {\n vars: {},\n enabled: Boolean(props.exposeGlobalAccent),\n};\nglobalAccentStack.push(accentStackEntry);\n\nwatch(\n () => props.exposeGlobalAccent,\n (enabled) => {\n accentStackEntry.enabled = Boolean(enabled);\n applyGlobalAccentFromStack();\n },\n { immediate: true },\n);\n\nwatch(\n brandVars,\n (vars) => {\n if (vars && Object.keys(vars).length > 0) {\n accentStackEntry.vars = { ...vars };\n } else {\n accentStackEntry.vars = {};\n }\n applyGlobalAccentFromStack();\n },\n { immediate: true },\n);\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</script>\n\n<style scoped lang=\"less\">\n.theme-switcher-divider {\n margin: 4px 0;\n}\n</style>\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","themePortalHostKey","useThemePortalTarget","hostRef","inject","fallbackTarget","computed","props","__props","globalAccentStack","appliedGlobalAccentKeys","applyGlobalAccentFromStack","root","key","activeEntry","entry","value","darkModeMedia","prefersReducedMotionMedia","PREFERS_REDUCED_MOTION_QUERY","initialMode","getEffectiveMode","currentMode","ref","theme","portalHost","handleSystemPreferenceChange","watch","syncDarkMode","previousValue","setDocumentDarkModeAttribute","withThemeTransition","onBeforeUnmount","index","accentStackEntry","event","applyTheme","startViewTransition","element","THEME_TRANSITION_DURATION","provide","normalizeHex","hex","h","g","b","hexToRgb","r","rgbToHex","toHex","clamp01","srgbChannelToLinear","channel","linearChannelToSrgb","normalized","rgbToOklch","rNorm","gNorm","bNorm","rLin","gLin","bLin","l","m","s","lRoot","mRoot","sRoot","oklabL","oklabA","oklabB","chroma","hue","tryOklchToSrgb","c","clampLinear","angle","a","lComponent","mComponent","sComponent","lCube","mCube","sCube","lLin","mLin","sLin","bValue","oklchToSrgb","attempt","rgb","makeBrandScale","baseHex","norm","baseRgb","baseOklch","toneConfig","tokens","adjustLightness","lightnessValue","adjustChroma","chromaScale","scaled","stop","config","tokenName","toneL","toneC","toneRgb","brandVars","brandStyle","enabled","vars","_createElementBlock","_renderSlot","_ctx","_createElementVNode","MODE_LABELS","map","option","VALID_MODES","emit","__emit","open","internalMode","_createBlock","_unref","DropdownMenu","$event","_createVNode","DropdownItemGroup","DropdownItemRadio"],"mappings":"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"}
package/dist/theme.es.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { inject as he, computed as j, ref as N, watch as A, onBeforeUnmount as pe, provide as J, createElementBlock as be, openBlock as Z, normalizeStyle as ge, renderSlot as ke, createElementVNode as ee, createBlock as Me, unref as g, withCtx as X, createVNode as U } from "vue";
2
2
  import "what-input";
3
3
  import { DropdownMenu as ve, DropdownItemGroup as ye, DropdownItemRadio as K } from "@gospore/dropdown-menu";
4
- const B = ["auto", "light", "dark"], te = "gospore-theme-mode", Ee = 60 * 60 * 24 * 365, Se = "(prefers-color-scheme: dark)";
4
+ const B = ["auto", "light", "dark"], te = "gospore-theme-mode", Ee = 3600 * 24 * 365, Se = "(prefers-color-scheme: dark)";
5
5
  function V() {
6
6
  if (typeof document > "u")
7
7
  return null;
@@ -58,7 +58,7 @@ function Re(n) {
58
58
  return !1;
59
59
  }
60
60
  }
61
- const oe = Symbol.for("gospore.theme.portalHost");
61
+ const oe = /* @__PURE__ */ Symbol.for("gospore.theme.portalHost");
62
62
  function Ne() {
63
63
  const n = he(oe, null);
64
64
  console.log("Using theme portal host:", n);
@@ -1 +1 @@
1
- {"version":3,"file":"theme.es.js","sources":["../src/modeStorage.js","../src/portalHost.js","../src/Theme.vue","../src/ThemeSwitcher.vue"],"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","import { computed, inject } from \"vue\";\n\nexport const themePortalHostKey = Symbol.for(\"gospore.theme.portalHost\");\n\nexport function useThemePortalTarget() {\n const hostRef = inject(themePortalHostKey, null);\n console.log(\"Using theme portal host:\", hostRef);\n const fallbackTarget =\n typeof document !== \"undefined\" ? document.body : \"body\";\n\n return computed(() => hostRef?.value ?? fallbackTarget);\n}\n","<template>\n <div class=\"theme\" :style=\"brandStyle\">\n <slot />\n <div ref=\"portalHost\" class=\"theme__portal-host\"></div>\n </div>\n</template>\n\n<script setup>\nimport { provide, ref, watch, onBeforeUnmount, computed } from \"vue\";\nimport { applyStoredModeToDocument, readStoredMode } from \"./modeStorage\";\nimport \"what-input\";\nimport { themePortalHostKey } from \"./portalHost\";\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 * Optional hex accent color (\"#RRGGBB\" or \"#RGB\"). When provided,\n * Theme derives the `--color-brand-*` palette and exposes the tokens on\n * the root .theme element (and the global document for portals).\n */\n accentColor: {\n type: String,\n required: false,\n default: undefined,\n },\n /**\n * When true the brand vars are also exposed on <html>, allowing portals\n * attached outside the Theme subtree to inherit the accent colors.\n */\n exposeGlobalAccent: {\n type: Boolean,\n default: false,\n },\n});\n\nconst globalAccentStack = [];\nconst appliedGlobalAccentKeys = new Set();\n\nfunction applyGlobalAccentFromStack() {\n const root = document.documentElement;\n if (!root) {\n return;\n }\n\n appliedGlobalAccentKeys.forEach((key) => {\n root.style.removeProperty(key);\n });\n appliedGlobalAccentKeys.clear();\n\n const activeEntry = [...globalAccentStack]\n .reverse()\n .find(\n (entry) =>\n entry.enabled &&\n entry.vars &&\n Object.keys(entry.vars).length > 0,\n );\n\n if (!activeEntry) {\n return;\n }\n\n Object.entries(activeEntry.vars).forEach(([key, value]) => {\n root.style.setProperty(key, value);\n appliedGlobalAccentKeys.add(key);\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});\nconst portalHost = ref(null);\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 const index = globalAccentStack.indexOf(accentStackEntry);\n if (index !== -1) {\n globalAccentStack.splice(index, 1);\n }\n applyGlobalAccentFromStack();\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);\nprovide(themePortalHostKey, portalHost);\n\n// --- Accent helpers -------------------------------------------------------\nfunction normalizeHex(hex) {\n if (!hex) return null;\n const h = hex.trim().toLowerCase();\n const m = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.exec(h);\n if (!m) return null;\n if (h.length === 4) {\n // expand #rgb -> #rrggbb\n const r = h[1],\n g = h[2],\n b = h[3];\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n return h;\n}\n\nfunction hexToRgb(hex) {\n const h = normalizeHex(hex);\n if (!h) return null;\n const r = parseInt(h.slice(1, 3), 16);\n const g = parseInt(h.slice(3, 5), 16);\n const b = parseInt(h.slice(5, 7), 16);\n return { r, g, b };\n}\n\nfunction rgbToHex({ r, g, b }) {\n const toHex = (value) => value.toString(16).padStart(2, \"0\");\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction clamp01(value) {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction srgbChannelToLinear(channel) {\n if (channel <= 0.04045) {\n return channel / 12.92;\n }\n return Math.pow((channel + 0.055) / 1.055, 2.4);\n}\n\nfunction linearChannelToSrgb(channel) {\n const normalized = clamp01(channel);\n if (normalized <= 0.0031308) {\n return 12.92 * normalized;\n }\n return 1.055 * Math.pow(normalized, 1 / 2.4) - 0.055;\n}\n\nfunction rgbToOklch({ r, g, b }) {\n const rNorm = r / 255;\n const gNorm = g / 255;\n const bNorm = b / 255;\n\n const rLin = srgbChannelToLinear(rNorm);\n const gLin = srgbChannelToLinear(gNorm);\n const bLin = srgbChannelToLinear(bNorm);\n\n const l = 0.4122214708 * rLin + 0.5363325363 * gLin + 0.0514459929 * bLin;\n const m = 0.2119034982 * rLin + 0.6806995451 * gLin + 0.1073969566 * bLin;\n const s = 0.0883024619 * rLin + 0.2817188376 * gLin + 0.6299787005 * bLin;\n\n const lRoot = Math.cbrt(l);\n const mRoot = Math.cbrt(m);\n const sRoot = Math.cbrt(s);\n\n const oklabL =\n 0.2104542553 * lRoot + 0.793617785 * mRoot - 0.0040720468 * sRoot;\n const oklabA =\n 1.9779984951 * lRoot - 2.428592205 * mRoot + 0.4505937099 * sRoot;\n const oklabB =\n 0.0259040371 * lRoot + 0.7827717662 * mRoot - 0.808675766 * sRoot;\n\n const chroma = Math.sqrt(oklabA * oklabA + oklabB * oklabB);\n let hue = Math.atan2(oklabB, oklabA) * (180 / Math.PI);\n if (hue < 0) {\n hue += 360;\n }\n\n return { l: oklabL, c: chroma, h: hue };\n}\n\nfunction tryOklchToSrgb(l, c, h, clampLinear = false) {\n const angle = (h * Math.PI) / 180;\n const a = c * Math.cos(angle);\n const b = c * Math.sin(angle);\n\n const lComponent = l + 0.3963377774 * a + 0.2158037573 * b;\n const mComponent = l - 0.1055613458 * a - 0.0638541728 * b;\n const sComponent = l - 0.0894841775 * a - 1.291485548 * b;\n\n const lCube = clampLinear ? clamp01(lComponent) : lComponent;\n const mCube = clampLinear ? clamp01(mComponent) : mComponent;\n const sCube = clampLinear ? clamp01(sComponent) : sComponent;\n\n if (!clampLinear) {\n const outOfRange =\n lCube < -0.0001 ||\n lCube > 1.0001 ||\n mCube < -0.0001 ||\n mCube > 1.0001 ||\n sCube < -0.0001 ||\n sCube > 1.0001;\n if (outOfRange) {\n return null;\n }\n }\n\n const lLin = lCube * lCube * lCube;\n const mLin = mCube * mCube * mCube;\n const sLin = sCube * sCube * sCube;\n\n let rLin = 4.0767416621 * lLin - 3.3077115913 * mLin + 0.2309699292 * sLin;\n let gLin = -1.2684380046 * lLin + 2.6097574011 * mLin - 0.3413193965 * sLin;\n let bLin = -0.0041960863 * lLin - 0.7034186147 * mLin + 1.707614701 * sLin;\n\n if (clampLinear) {\n rLin = clamp01(rLin);\n gLin = clamp01(gLin);\n bLin = clamp01(bLin);\n } else {\n const outOfRange =\n rLin < -0.0001 ||\n rLin > 1.0001 ||\n gLin < -0.0001 ||\n gLin > 1.0001 ||\n bLin < -0.0001 ||\n bLin > 1.0001;\n if (outOfRange) {\n return null;\n }\n }\n\n const r = clamp01(linearChannelToSrgb(rLin));\n const g = clamp01(linearChannelToSrgb(gLin));\n const bValue = clamp01(linearChannelToSrgb(bLin));\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(bValue * 255),\n };\n}\n\nfunction oklchToSrgb(l, c, h) {\n let chroma = c;\n for (let attempt = 0; attempt < 8; attempt += 1) {\n const rgb = tryOklchToSrgb(l, chroma, h);\n if (rgb) {\n return rgb;\n }\n chroma *= 0.9;\n }\n return tryOklchToSrgb(l, clamp01(chroma), h, true) || { r: 0, g: 0, b: 0 };\n}\n\nfunction makeBrandScale(baseHex) {\n const norm = normalizeHex(baseHex);\n if (!norm) return null;\n const baseRgb = hexToRgb(norm);\n if (!baseRgb) return null;\n const baseOklch = rgbToOklch(baseRgb);\n const toneConfig = {\n 100: { lightness: 0.35, chroma: 0.45 },\n 200: { lightness: 0.28, chroma: 0.5 },\n 300: { lightness: 0.22, chroma: 0.6 },\n 400: { lightness: 0.16, chroma: 0.75 },\n 500: { lightness: 0.08, chroma: 0.9 },\n 600: { lightness: 0, chroma: 1, base: true },\n 700: { lightness: -0.08, chroma: 1.05 },\n 800: { lightness: -0.18, chroma: 1.1 },\n 900: { lightness: -0.28, chroma: 1.15 },\n 1000: { lightness: -0.35, chroma: 1.2 },\n };\n const tokens = {};\n\n const adjustLightness = (lightnessValue) => {\n if (lightnessValue === 0) {\n return baseOklch.l;\n }\n if (lightnessValue > 0) {\n return clamp01(baseOklch.l + lightnessValue * (1 - baseOklch.l));\n }\n return clamp01(baseOklch.l * (1 + lightnessValue));\n };\n\n const adjustChroma = (chromaScale) => {\n if (chromaScale === 1) {\n return baseOklch.c;\n }\n const scaled = baseOklch.c * chromaScale;\n return Math.max(0, Math.min(0.4, scaled));\n };\n\n Object.entries(toneConfig).forEach(([stop, config]) => {\n const tokenName = `--color-brand-${stop}`;\n if (config.base) {\n tokens[tokenName] = norm;\n return;\n }\n const toneL = adjustLightness(config.lightness);\n const toneC = adjustChroma(config.chroma);\n const toneRgb = oklchToSrgb(toneL, toneC, baseOklch.h);\n tokens[tokenName] = rgbToHex(toneRgb);\n });\n return tokens;\n}\n\nconst brandVars = computed(() => makeBrandScale(props.accentColor) ?? {});\nconst brandStyle = computed(() => brandVars.value);\n\nconst accentStackEntry = {\n vars: {},\n enabled: Boolean(props.exposeGlobalAccent),\n};\nglobalAccentStack.push(accentStackEntry);\n\nwatch(\n () => props.exposeGlobalAccent,\n (enabled) => {\n accentStackEntry.enabled = Boolean(enabled);\n applyGlobalAccentFromStack();\n },\n { immediate: true },\n);\n\nwatch(\n brandVars,\n (vars) => {\n if (vars && Object.keys(vars).length > 0) {\n accentStackEntry.vars = { ...vars };\n } else {\n accentStackEntry.vars = {};\n }\n applyGlobalAccentFromStack();\n },\n { immediate: true },\n);\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</script>\n\n<style scoped lang=\"less\">\n.theme-switcher-divider {\n margin: 4px 0;\n}\n</style>\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","themePortalHostKey","useThemePortalTarget","hostRef","inject","fallbackTarget","computed","props","__props","globalAccentStack","appliedGlobalAccentKeys","applyGlobalAccentFromStack","root","key","activeEntry","entry","value","darkModeMedia","prefersReducedMotionMedia","PREFERS_REDUCED_MOTION_QUERY","initialMode","getEffectiveMode","currentMode","ref","theme","portalHost","handleSystemPreferenceChange","watch","syncDarkMode","previousValue","setDocumentDarkModeAttribute","withThemeTransition","onBeforeUnmount","index","accentStackEntry","event","applyTheme","startViewTransition","element","THEME_TRANSITION_DURATION","provide","normalizeHex","hex","h","r","g","b","hexToRgb","rgbToHex","toHex","clamp01","srgbChannelToLinear","channel","linearChannelToSrgb","normalized","rgbToOklch","rNorm","gNorm","bNorm","rLin","gLin","bLin","l","m","s","lRoot","mRoot","sRoot","oklabL","oklabA","oklabB","chroma","hue","tryOklchToSrgb","c","clampLinear","angle","a","lComponent","mComponent","sComponent","lCube","mCube","sCube","lLin","mLin","sLin","bValue","oklchToSrgb","attempt","rgb","makeBrandScale","baseHex","norm","baseRgb","baseOklch","toneConfig","tokens","adjustLightness","lightnessValue","adjustChroma","chromaScale","scaled","stop","config","tokenName","toneL","toneC","toneRgb","brandVars","brandStyle","enabled","vars","_createElementBlock","_renderSlot","_ctx","_createElementVNode","MODE_LABELS","map","option","VALID_MODES","emit","__emit","open","internalMode","_createBlock","_unref","DropdownMenu","$event","_createVNode","DropdownItemGroup","DropdownItemRadio"],"mappings":";;;AAAA,MAAMA,IAAoB,CAAC,QAAQ,SAAS,MAAM,GAC5CC,KAAc,sBACdC,KAAsB,KAAK,KAAK,KAAK,KACrCC,KAAkB;AAEjB,SAASC,IAAiB;AAC7B,MAAI,OAAO,WAAa;AACpB,WAAO;AAEX,QAAMC,IAASC,GAAUL,EAAW;AACpC,SAAOI,KAAUL,EAAkB,SAASK,CAAM,IAAIA,IAAS;AACnE;AAEO,SAASE,GAAgBC,GAAM;AAClC,MAAI,OAAO,WAAa,OAAe,CAACR,EAAkB,SAASQ,CAAI;AACnE;AAEJ,QAAMC,IACF,OAAO,SAAW,MAAc,OAAO,SAAS,WAAW,IACzDC,IACF,OAAO,SAAW,MAAc,OAAO,SAAS,WAAW,IACzDC,IAASC,GAAgBH,CAAQ,GACjCI,IAASH,MAAa,UACtBI,IAAa;AAAA,IACf;AAAA,IACA,WAAWZ,EAAmB;AAAA,IAC9B;AAAA,EACR;AACI,EAAIS,KACAG,EAAW,KAAK,UAAUH,CAAM,EAAE,GAElCE,KACAC,EAAW,KAAK,QAAQ,GAE5B,SAAS,SAAS;AAAA,IACd,GAAG,mBAAmBb,EAAW,CAAC,IAAI,mBAAmBO,CAAI,CAAC;AAAA,IAC9D,GAAGM;AAAA,EACX,EAAM,KAAK,IAAI;AACf;AAEO,SAASC,GAA0BP,GAAM;AAC5C,MAAI,OAAO,WAAa;AACpB;AAEJ,QAAMQ,IACF,OAAOR,KAAS,YAAYR,EAAkB,SAASQ,CAAI,IACrDA,IACAJ,EAAc,KAAM;AAC9B,UAAQ,IAAI,wBAAwBY,CAAY;AAChD,QAAMC,IAAWC,GAAgBF,CAAY;AAC7C,WAAS,gBAAgB,aAAa,aAAaC,CAAQ;AAC/D;AAIA,SAASX,GAAUa,GAAM;AACrB,MAAI,OAAO,WAAa,OAAe,CAAC,SAAS;AAC7C,WAAO;AAEX,QAAMC,IAAc,GAAG,mBAAmBD,CAAI,CAAC,KACzCE,IAAU,SAAS,OAAO,MAAM,IAAI;AAC1C,aAAWC,KAAUD;AACjB,QAAIC,EAAO,WAAWF,CAAW;AAC7B,aAAO,mBAAmBE,EAAO,MAAMF,EAAY,MAAM,CAAC;AAGlE,SAAO;AACX;AAEA,SAASR,GAAgBH,GAAU;AAC/B,MAAI,CAACA,KAAYA,MAAa;AAC1B,WAAO;AAGX,MADoB,oBAAoB,KAAKA,CAAQ;AAEjD,WAAOA;AAEX,QAAMc,IAAQd,EAAS,MAAM,GAAG;AAChC,SAAIc,EAAM,UAAU,IACT,OAEPA,EAAM,WAAW,IACVd,IAEJc,EAAM,MAAM,EAAE,EAAE,KAAK,GAAG;AACnC;AAEA,SAASL,GAAgBV,GAAM;AAC3B,MAAIA,MAAS;AACT,WAAO;AAKX,MAHIA,MAAS,WAGT,OAAO,SAAW;AAClB,WAAO;AAEX,MAAI;AACA,UAAMgB,IACF,OAAO,OAAO,cAAe,aACvB,OAAO,WAAWrB,EAAe,IACjC;AACV,WAAOqB,IAAiBA,EAAe,UAAU;AAAA,EACrD,QAAgB;AACZ,WAAO;AAAA,EACX;AACJ;ACxGY,MAACC,KAAqB,OAAO,IAAI,0BAA0B;AAEhE,SAASC,KAAuB;AACnC,QAAMC,IAAUC,GAAOH,IAAoB,IAAI;AAC/C,UAAQ,IAAI,4BAA4BE,CAAO;AAC/C,QAAME,IACF,OAAO,WAAa,MAAc,SAAS,OAAO;AAEtD,SAAOC,EAAS,MAAMH,GAAS,SAASE,CAAc;AAC1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACKA,UAAME,IAAQC,GAyBRC,IAAoB,CAAA,GACpBC,IAA0B,oBAAI,IAAG;AAEvC,aAASC,IAA6B;AAClC,YAAMC,IAAO,SAAS;AACtB,UAAI,CAACA;AACD;AAGJ,MAAAF,EAAwB,QAAQ,CAACG,MAAQ;AACrC,QAAAD,EAAK,MAAM,eAAeC,CAAG;AAAA,MACjC,CAAC,GACDH,EAAwB,MAAK;AAE7B,YAAMI,IAAc,CAAC,GAAGL,CAAiB,EACpC,QAAO,EACP;AAAA,QACG,CAACM,MACGA,EAAM,WACNA,EAAM,QACN,OAAO,KAAKA,EAAM,IAAI,EAAE,SAAS;AAAA,MACjD;AAEI,MAAKD,KAIL,OAAO,QAAQA,EAAY,IAAI,EAAE,QAAQ,CAAC,CAACD,GAAKG,CAAK,MAAM;AACvD,QAAAJ,EAAK,MAAM,YAAYC,GAAKG,CAAK,GACjCN,EAAwB,IAAIG,CAAG;AAAA,MACnC,CAAC;AAAA,IACL;AAKA,UAAMI,IAAgB,OAAO,WAAWtC,EAAe,GACjDuC,IAA4B,OAAO;AAAA,MACrCC;AAAA,IACJ,GAEMC,IAAcC,EAAgB;AACpC,IAAA9B,GAA0B6B,CAAW;AAErC,UAAME,IAAcC,EAAIH,CAAW,GAE7BI,IAAQD,EAAI;AAAA,MACd,UAAU7B,EAAgB0B,CAAW;AAAA,IACzC,CAAC,GACKK,IAAaF,EAAI,IAAI;AAE3B,IAAAN,EAAc,iBAAiB,UAAUS,CAA4B,GAErEC;AAAA,MACI,MAAMpB,EAAM;AAAA,MACZ,MAAM;AACF,QAAAqB,EAAY;AAAA,MAChB;AAAA,MACA,EAAE,WAAW,GAAI;AAAA,IACrB,GAEAD;AAAA,MACI,MAAMH,EAAM,MAAM;AAAA,MAClB,CAAC/B,GAAUoC,MAAkB;AACzB,YAAIA,MAAkB,QAAW;AAC7B,UAAAC,EAA6BrC,CAAQ;AACrC;AAAA,QACJ;AACA,QAAAsC,GAAoB,MAAM;AACtB,UAAAD,EAA6BrC,CAAQ;AAAA,QACzC,CAAC;AAAA,MACL;AAAA,MACA,EAAE,WAAW,GAAI;AAAA,IACrB,GAEAuC,GAAgB,MAAM;AAClB,MAAAf,EAAc,oBAAoB,UAAUS,CAA4B;AACxE,YAAMO,IAAQxB,EAAkB,QAAQyB,CAAgB;AACxD,MAAID,MAAU,MACVxB,EAAkB,OAAOwB,GAAO,CAAC,GAErCtB,EAA0B;AAAA,IAC9B,CAAC;AAED,aAASiB,IAAe;AACpB,YAAM5C,IAAOqC,EAAgB;AAC7B,MAAAC,EAAY,QAAQtC,GACpBwC,EAAM,MAAM,WAAW9B,EAAgBV,CAAI;AAAA,IAC/C;AAEA,aAASU,EAAgBV,GAAM;AAC3B,aAAIA,MAAS,SACF,KAEPA,MAAS,UACF,KAEJiC,EAAc;AAAA,IACzB;AAEA,aAASS,EAA6BS,GAAO;AACzC,MAAI,CAACA,KAASb,EAAY,UAAU,WAGpCE,EAAM,MAAM,WAAWW,EAAM;AAAA,IACjC;AAEA,aAASL,EAA6BrC,GAAU;AAC5C,eAAS,gBAAgB,aAAa,aAAaA,CAAQ;AAAA,IAC/D;AAEA,aAASsC,GAAoBK,GAAY;AACrC,UAAIlB,EAA0B,SAAS;AACnC,QAAAkB,EAAU;AACV;AAAA,MACJ;AACA,YAAMC,IAAsB,SAAS,qBAAqB,KAAK,QAAQ;AACvE,UAAIA,GAAqB;AACrB,QAAAA,EAAoB,MAAM;AACtB,UAAAD,EAAU;AAAA,QACd,CAAC;AACD;AAAA,MACJ;AACA,MAAAA,EAAU;AACV,YAAME,IAAU,SAAS;AACzB,MAAI,OAAOA,EAAQ,WAAY,cAG/B,OAAO,sBAAsB,MAAM;AAC/B,QAAAA,EAAQ,QAAQ,CAAC,EAAE,SAAS,KAAI,GAAI,EAAE,SAAS,EAAC,CAAE,GAAG;AAAA,UACjD,UAAUC;AAAA,UACV,QAAQ;AAAA,QACpB,CAAS;AAAA,MACL,CAAC;AAAA,IACL;AAEA,aAASlB,IAAmB;AACxB,aAAOd,EAAM,QAAQ3B,EAAc,KAAM;AAAA,IAC7C;AAEA,IAAA4D,EAAQ,SAAShB,CAAK,GACtBgB,EAAQvC,IAAoBwB,CAAU;AAGtC,aAASgB,EAAaC,GAAK;AACvB,UAAI,CAACA,EAAK,QAAO;AACjB,YAAMC,IAAID,EAAI,KAAI,EAAG,YAAW;AAEhC,UAAI,CADM,kCAAkC,KAAKC,CAAC,EAC1C,QAAO;AACf,UAAIA,EAAE,WAAW,GAAG;AAEhB,cAAMC,IAAID,EAAE,CAAC,GACTE,IAAIF,EAAE,CAAC,GACPG,IAAIH,EAAE,CAAC;AACX,eAAO,IAAIC,CAAC,GAAGA,CAAC,GAAGC,CAAC,GAAGA,CAAC,GAAGC,CAAC,GAAGA,CAAC;AAAA,MACpC;AACA,aAAOH;AAAA,IACX;AAEA,aAASI,GAASL,GAAK;AACnB,YAAMC,IAAIF,EAAaC,CAAG;AAC1B,UAAI,CAACC,EAAG,QAAO;AACf,YAAM,IAAI,SAASA,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,GAC9BE,IAAI,SAASF,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,GAC9BG,IAAI,SAASH,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AACpC,aAAO,EAAE,GAAG,GAAAE,GAAG,GAAAC,EAAC;AAAA,IACpB;AAEA,aAASE,GAAS,EAAE,GAAAJ,GAAG,GAAAC,GAAG,GAAAC,EAAC,GAAI;AAC3B,YAAMG,IAAQ,CAACjC,MAAUA,EAAM,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC3D,aAAO,IAAIiC,EAAML,CAAC,CAAC,GAAGK,EAAMJ,CAAC,CAAC,GAAGI,EAAMH,CAAC,CAAC;AAAA,IAC7C;AAEA,aAASI,EAAQlC,GAAO;AACpB,aAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAK,CAAC;AAAA,IACzC;AAEA,aAASmC,EAAoBC,GAAS;AAClC,aAAIA,KAAW,UACJA,IAAU,QAEd,KAAK,KAAKA,IAAU,SAAS,OAAO,GAAG;AAAA,IAClD;AAEA,aAASC,EAAoBD,GAAS;AAClC,YAAME,IAAaJ,EAAQE,CAAO;AAClC,aAAIE,KAAc,WACP,QAAQA,IAEZ,QAAQ,KAAK,IAAIA,GAAY,IAAI,GAAG,IAAI;AAAA,IACnD;AAEA,aAASC,GAAW,EAAE,GAAAX,GAAG,GAAAC,GAAG,GAAAC,EAAC,GAAI;AAC7B,YAAMU,IAAQZ,IAAI,KACZa,IAAQZ,IAAI,KACZa,IAAQZ,IAAI,KAEZa,IAAOR,EAAoBK,CAAK,GAChCI,IAAOT,EAAoBM,CAAK,GAChCI,IAAOV,EAAoBO,CAAK,GAEhCI,IAAI,eAAeH,IAAO,eAAeC,IAAO,eAAeC,GAC/DE,IAAI,eAAeJ,IAAO,eAAeC,IAAO,eAAeC,GAC/DG,IAAI,eAAeL,IAAO,eAAeC,IAAO,eAAeC,GAE/DI,IAAQ,KAAK,KAAKH,CAAC,GACnBI,IAAQ,KAAK,KAAKH,CAAC,GACnBI,IAAQ,KAAK,KAAKH,CAAC,GAEnBI,IACF,eAAeH,IAAQ,cAAcC,IAAQ,eAAeC,GAC1DE,IACF,eAAeJ,IAAQ,cAAcC,IAAQ,eAAeC,GAC1DG,IACF,eAAeL,IAAQ,eAAeC,IAAQ,cAAcC,GAE1DI,IAAS,KAAK,KAAKF,IAASA,IAASC,IAASA,CAAM;AAC1D,UAAIE,IAAM,KAAK,MAAMF,GAAQD,CAAM,KAAK,MAAM,KAAK;AACnD,aAAIG,IAAM,MACNA,KAAO,MAGJ,EAAE,GAAGJ,GAAQ,GAAGG,GAAQ,GAAGC,EAAG;AAAA,IACzC;AAEA,aAASC,EAAeX,GAAGY,GAAG/B,GAAGgC,IAAc,IAAO;AAClD,YAAMC,IAASjC,IAAI,KAAK,KAAM,KACxBkC,IAAIH,IAAI,KAAK,IAAIE,CAAK,GACtB9B,IAAI4B,IAAI,KAAK,IAAIE,CAAK,GAEtBE,IAAahB,IAAI,eAAee,IAAI,eAAe/B,GACnDiC,IAAajB,IAAI,eAAee,IAAI,eAAe/B,GACnDkC,IAAalB,IAAI,eAAee,IAAI,cAAc/B,GAElDmC,IAAQN,IAAczB,EAAQ4B,CAAU,IAAIA,GAC5CI,IAAQP,IAAczB,EAAQ6B,CAAU,IAAIA,GAC5CI,IAAQR,IAAczB,EAAQ8B,CAAU,IAAIA;AAElD,UAAI,CAACL,MAEGM,IAAQ,SACRA,IAAQ,UACRC,IAAQ,SACRA,IAAQ,UACRC,IAAQ,SACRA,IAAQ;AAER,eAAO;AAIf,YAAMC,IAAOH,IAAQA,IAAQA,GACvBI,IAAOH,IAAQA,IAAQA,GACvBI,IAAOH,IAAQA,IAAQA;AAE7B,UAAIxB,IAAO,eAAeyB,IAAO,eAAeC,IAAO,eAAeC,GAClE1B,IAAO,gBAAgBwB,IAAO,eAAeC,IAAO,eAAeC,GACnEzB,IAAO,gBAAgBuB,IAAO,eAAeC,IAAO,cAAcC;AAEtE,UAAIX;AACA,QAAAhB,IAAOT,EAAQS,CAAI,GACnBC,IAAOV,EAAQU,CAAI,GACnBC,IAAOX,EAAQW,CAAI;AAAA,eAGfF,IAAO,SACPA,IAAO,UACPC,IAAO,SACPA,IAAO,UACPC,IAAO,SACPA,IAAO;AAEP,eAAO;AAIf,YAAMjB,IAAIM,EAAQG,EAAoBM,CAAI,CAAC,GACrCd,KAAIK,EAAQG,EAAoBO,CAAI,CAAC,GACrC2B,KAASrC,EAAQG,EAAoBQ,CAAI,CAAC;AAEhD,aAAO;AAAA,QACH,GAAG,KAAK,MAAMjB,IAAI,GAAG;AAAA,QACrB,GAAG,KAAK,MAAMC,KAAI,GAAG;AAAA,QACrB,GAAG,KAAK,MAAM0C,KAAS,GAAG;AAAA,MAClC;AAAA,IACA;AAEA,aAASC,GAAY1B,GAAGY,GAAG/B,GAAG;AAC1B,UAAI4B,IAASG;AACb,eAASe,IAAU,GAAGA,IAAU,GAAGA,KAAW,GAAG;AAC7C,cAAMC,IAAMjB,EAAeX,GAAGS,GAAQ5B,CAAC;AACvC,YAAI+C;AACA,iBAAOA;AAEX,QAAAnB,KAAU;AAAA,MACd;AACA,aAAOE,EAAeX,GAAGZ,EAAQqB,CAAM,GAAG5B,GAAG,EAAI,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAC;AAAA,IAC5E;AAEA,aAASgD,GAAeC,GAAS;AAC7B,YAAMC,IAAOpD,EAAamD,CAAO;AACjC,UAAI,CAACC,EAAM,QAAO;AAClB,YAAMC,IAAU/C,GAAS8C,CAAI;AAC7B,UAAI,CAACC,EAAS,QAAO;AACrB,YAAMC,IAAYxC,GAAWuC,CAAO,GAC9BE,IAAa;AAAA,QACf,KAAK,EAAE,WAAW,MAAM,QAAQ,KAAI;AAAA,QACpC,KAAK,EAAE,WAAW,MAAM,QAAQ,IAAG;AAAA,QACnC,KAAK,EAAE,WAAW,MAAM,QAAQ,IAAG;AAAA,QACnC,KAAK,EAAE,WAAW,MAAM,QAAQ,KAAI;AAAA,QACpC,KAAK,EAAE,WAAW,MAAM,QAAQ,IAAG;AAAA,QACnC,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAI;AAAA,QAC1C,KAAK,EAAE,WAAW,OAAO,QAAQ,KAAI;AAAA,QACrC,KAAK,EAAE,WAAW,OAAO,QAAQ,IAAG;AAAA,QACpC,KAAK,EAAE,WAAW,OAAO,QAAQ,KAAI;AAAA,QACrC,KAAM,EAAE,WAAW,OAAO,QAAQ,IAAG;AAAA,MAC7C,GACUC,IAAS,CAAA,GAETC,IAAkB,CAACC,MACjBA,MAAmB,IACZJ,EAAU,IAEjBI,IAAiB,IACVjD,EAAQ6C,EAAU,IAAII,KAAkB,IAAIJ,EAAU,EAAE,IAE5D7C,EAAQ6C,EAAU,KAAK,IAAII,EAAe,GAG/CC,IAAe,CAACC,MAAgB;AAClC,YAAIA,MAAgB;AAChB,iBAAON,EAAU;AAErB,cAAMO,IAASP,EAAU,IAAIM;AAC7B,eAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKC,CAAM,CAAC;AAAA,MAC5C;AAEA,oBAAO,QAAQN,CAAU,EAAE,QAAQ,CAAC,CAACO,GAAMC,CAAM,MAAM;AACnD,cAAMC,IAAY,iBAAiBF,CAAI;AACvC,YAAIC,EAAO,MAAM;AACb,UAAAP,EAAOQ,CAAS,IAAIZ;AACpB;AAAA,QACJ;AACA,cAAMa,IAAQR,EAAgBM,EAAO,SAAS,GACxCG,IAAQP,EAAaI,EAAO,MAAM,GAClCI,IAAUpB,GAAYkB,GAAOC,GAAOZ,EAAU,CAAC;AACrD,QAAAE,EAAOQ,CAAS,IAAIzD,GAAS4D,CAAO;AAAA,MACxC,CAAC,GACMX;AAAA,IACX;AAEA,UAAMY,IAAYvG,EAAS,MAAMqF,GAAepF,EAAM,WAAW,KAAK,EAAE,GAClEuG,KAAaxG,EAAS,MAAMuG,EAAU,KAAK,GAE3C3E,IAAmB;AAAA,MACrB,MAAM,CAAA;AAAA,MACN,SAAS,EAAQ3B,EAAM;AAAA,IAC3B;AACA,WAAAE,EAAkB,KAAKyB,CAAgB,GAEvCP;AAAA,MACI,MAAMpB,EAAM;AAAA,MACZ,CAACwG,MAAY;AACT,QAAA7E,EAAiB,UAAU,EAAQ6E,GACnCpG,EAA0B;AAAA,MAC9B;AAAA,MACA,EAAE,WAAW,GAAI;AAAA,IACrB,GAEAgB;AAAA,MACIkF;AAAA,MACA,CAACG,MAAS;AACN,QAAIA,KAAQ,OAAO,KAAKA,CAAI,EAAE,SAAS,IACnC9E,EAAiB,OAAO,EAAE,GAAG8E,EAAI,IAEjC9E,EAAiB,OAAO,CAAA,GAE5BvB,EAA0B;AAAA,MAC9B;AAAA,MACA,EAAE,WAAW,GAAI;AAAA,IACrB,mBApaIsG,GAGK,OAAA;AAAA,MAHA,OAAM;AAAA,MAAS,UAAOH,GAAA,KAAU;AAAA;MACjCI,GAAOC,EAAA,QAAA,SAAA;AAAA,MACPC,GAAsD,OAAA;AAAA,iBAA7C;AAAA,QAAJ,KAAI3F;AAAA,QAAa,OAAM;AAAA;;;;;;;;;;;;;;;;;;;AC8CpC,UAAM4F,IALe;AAAA,MACjB,EAAE,OAAO,QAAQ,OAAO,SAAQ;AAAA,MAChC,EAAE,OAAO,SAAS,OAAO,QAAO;AAAA,MAChC,EAAE,OAAO,QAAQ,OAAO,OAAM;AAAA,IAClC,EACiC,OAAO,CAACC,GAAKC,OAC1CD,EAAIC,EAAO,KAAK,IAAIA,EAAO,OACpBD,IACR,EAAE,GACCE,IAAchJ,GAEd+B,IAAQC,GAORiH,IAAOC;AAEb,IAAAnI,GAAyB;AAEzB,UAAMoI,IAAOpG,EAAI,EAAK,GAChBH,IAAcxC,OAAoB2B,EAAM,MACxCqH,IAAerG;AAAA,MACjBiG,EAAY,SAASpG,CAAW,IAAIA,IAAc;AAAA,IACtD;AACc,WAAAd;AAAA,MACV,MAAM+G,EAAYO,EAAa,KAAK,KAAKP,EAAY;AAAA,IACzD,GAEA1F;AAAA,MACI,MAAMpB,EAAM;AAAA,MACZ,CAACvB,MAAS;AACN,QAAIwI,EAAY,SAASxI,CAAI,KAAKA,MAAS4I,EAAa,UACpDA,EAAa,QAAQ5I;AAAA,MAE7B;AAAA,IACJ,GAEA2C;AAAA,MACIiG;AAAA,MACA,CAAC5I,MAAS;AACN,YAAI,CAACwI,EAAY,SAASxI,CAAI,GAAG;AAC7B,UAAA4I,EAAa,QAAQ;AACrB;AAAA,QACJ;AACA,QAAAD,EAAK,QAAQ,IACbF,EAAK,eAAezI,CAAI,GACxBD,GAAgBC,CAAI;AAAA,MACxB;AAAA,MACA,EAAE,WAAW,GAAI;AAAA,IACrB,mBA/FI6I,GA0BeC,EAAAC,EAAA,GAAA;AAAA,MAzBH,MAAMJ,EAAA;AAAA,8CAAAA,EAAI,QAAAK;AAAA,MAClB,MAAK;AAAA,MACL,cAAW;AAAA;iBAEX,MAoBoB;AAAA,QApBpBC,EAoBoBH,EAAAI,EAAA,GAAA,EApBD,OAAM,QAAO,GAAA;AAAA,qBAC5B,MAKE;AAAA,YALFD,EAKEH,EAAAK,CAAA,GAAA;AAAA,cAJU,SAASP,EAAA;AAAA,yDAAAA,EAAY,QAAAI;AAAA,cAC7B,OAAM;AAAA,cACL,OAAOF,EAAAT,CAAA,EAAY;AAAA,cACnB,cAAU,GAAKS,EAAAT,CAAA,EAAY,IAAI;AAAA;4BAEpCD,GAAsD,MAAA;AAAA,cAAlD,OAAM;AAAA,cAAyB,MAAK;AAAA;YACxCa,EAKEH,EAAAK,CAAA,GAAA;AAAA,cAJU,SAASP,EAAA;AAAA,yDAAAA,EAAY,QAAAI;AAAA,cAC7B,OAAM;AAAA,cACL,OAAOF,EAAAT,CAAA,EAAY;AAAA,cACnB,cAAU,GAAKS,EAAAT,CAAA,EAAY,KAAK;AAAA;YAErCY,EAKEH,EAAAK,CAAA,GAAA;AAAA,cAJU,SAASP,EAAA;AAAA,yDAAAA,EAAY,QAAAI;AAAA,cAC7B,OAAM;AAAA,cACL,OAAOF,EAAAT,CAAA,EAAY;AAAA,cACnB,cAAU,GAAKS,EAAAT,CAAA,EAAY,IAAI;AAAA;;;;;;;;;"}
1
+ {"version":3,"file":"theme.es.js","sources":["../src/modeStorage.js","../src/portalHost.js","../src/Theme.vue","../src/ThemeSwitcher.vue"],"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","import { computed, inject } from \"vue\";\n\nexport const themePortalHostKey = Symbol.for(\"gospore.theme.portalHost\");\n\nexport function useThemePortalTarget() {\n const hostRef = inject(themePortalHostKey, null);\n console.log(\"Using theme portal host:\", hostRef);\n const fallbackTarget =\n typeof document !== \"undefined\" ? document.body : \"body\";\n\n return computed(() => hostRef?.value ?? fallbackTarget);\n}\n","<template>\n <div class=\"theme\" :style=\"brandStyle\">\n <slot />\n <div ref=\"portalHost\" class=\"theme__portal-host\"></div>\n </div>\n</template>\n\n<script setup>\nimport { provide, ref, watch, onBeforeUnmount, computed } from \"vue\";\nimport { applyStoredModeToDocument, readStoredMode } from \"./modeStorage\";\nimport \"what-input\";\nimport { themePortalHostKey } from \"./portalHost\";\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 * Optional hex accent color (\"#RRGGBB\" or \"#RGB\"). When provided,\n * Theme derives the `--color-brand-*` palette and exposes the tokens on\n * the root .theme element (and the global document for portals).\n */\n accentColor: {\n type: String,\n required: false,\n default: undefined,\n },\n /**\n * When true the brand vars are also exposed on <html>, allowing portals\n * attached outside the Theme subtree to inherit the accent colors.\n */\n exposeGlobalAccent: {\n type: Boolean,\n default: false,\n },\n});\n\nconst globalAccentStack = [];\nconst appliedGlobalAccentKeys = new Set();\n\nfunction applyGlobalAccentFromStack() {\n const root = document.documentElement;\n if (!root) {\n return;\n }\n\n appliedGlobalAccentKeys.forEach((key) => {\n root.style.removeProperty(key);\n });\n appliedGlobalAccentKeys.clear();\n\n const activeEntry = [...globalAccentStack]\n .reverse()\n .find(\n (entry) =>\n entry.enabled &&\n entry.vars &&\n Object.keys(entry.vars).length > 0,\n );\n\n if (!activeEntry) {\n return;\n }\n\n Object.entries(activeEntry.vars).forEach(([key, value]) => {\n root.style.setProperty(key, value);\n appliedGlobalAccentKeys.add(key);\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});\nconst portalHost = ref(null);\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 const index = globalAccentStack.indexOf(accentStackEntry);\n if (index !== -1) {\n globalAccentStack.splice(index, 1);\n }\n applyGlobalAccentFromStack();\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);\nprovide(themePortalHostKey, portalHost);\n\n// --- Accent helpers -------------------------------------------------------\nfunction normalizeHex(hex) {\n if (!hex) return null;\n const h = hex.trim().toLowerCase();\n const m = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.exec(h);\n if (!m) return null;\n if (h.length === 4) {\n // expand #rgb -> #rrggbb\n const r = h[1],\n g = h[2],\n b = h[3];\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n return h;\n}\n\nfunction hexToRgb(hex) {\n const h = normalizeHex(hex);\n if (!h) return null;\n const r = parseInt(h.slice(1, 3), 16);\n const g = parseInt(h.slice(3, 5), 16);\n const b = parseInt(h.slice(5, 7), 16);\n return { r, g, b };\n}\n\nfunction rgbToHex({ r, g, b }) {\n const toHex = (value) => value.toString(16).padStart(2, \"0\");\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction clamp01(value) {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction srgbChannelToLinear(channel) {\n if (channel <= 0.04045) {\n return channel / 12.92;\n }\n return Math.pow((channel + 0.055) / 1.055, 2.4);\n}\n\nfunction linearChannelToSrgb(channel) {\n const normalized = clamp01(channel);\n if (normalized <= 0.0031308) {\n return 12.92 * normalized;\n }\n return 1.055 * Math.pow(normalized, 1 / 2.4) - 0.055;\n}\n\nfunction rgbToOklch({ r, g, b }) {\n const rNorm = r / 255;\n const gNorm = g / 255;\n const bNorm = b / 255;\n\n const rLin = srgbChannelToLinear(rNorm);\n const gLin = srgbChannelToLinear(gNorm);\n const bLin = srgbChannelToLinear(bNorm);\n\n const l = 0.4122214708 * rLin + 0.5363325363 * gLin + 0.0514459929 * bLin;\n const m = 0.2119034982 * rLin + 0.6806995451 * gLin + 0.1073969566 * bLin;\n const s = 0.0883024619 * rLin + 0.2817188376 * gLin + 0.6299787005 * bLin;\n\n const lRoot = Math.cbrt(l);\n const mRoot = Math.cbrt(m);\n const sRoot = Math.cbrt(s);\n\n const oklabL =\n 0.2104542553 * lRoot + 0.793617785 * mRoot - 0.0040720468 * sRoot;\n const oklabA =\n 1.9779984951 * lRoot - 2.428592205 * mRoot + 0.4505937099 * sRoot;\n const oklabB =\n 0.0259040371 * lRoot + 0.7827717662 * mRoot - 0.808675766 * sRoot;\n\n const chroma = Math.sqrt(oklabA * oklabA + oklabB * oklabB);\n let hue = Math.atan2(oklabB, oklabA) * (180 / Math.PI);\n if (hue < 0) {\n hue += 360;\n }\n\n return { l: oklabL, c: chroma, h: hue };\n}\n\nfunction tryOklchToSrgb(l, c, h, clampLinear = false) {\n const angle = (h * Math.PI) / 180;\n const a = c * Math.cos(angle);\n const b = c * Math.sin(angle);\n\n const lComponent = l + 0.3963377774 * a + 0.2158037573 * b;\n const mComponent = l - 0.1055613458 * a - 0.0638541728 * b;\n const sComponent = l - 0.0894841775 * a - 1.291485548 * b;\n\n const lCube = clampLinear ? clamp01(lComponent) : lComponent;\n const mCube = clampLinear ? clamp01(mComponent) : mComponent;\n const sCube = clampLinear ? clamp01(sComponent) : sComponent;\n\n if (!clampLinear) {\n const outOfRange =\n lCube < -0.0001 ||\n lCube > 1.0001 ||\n mCube < -0.0001 ||\n mCube > 1.0001 ||\n sCube < -0.0001 ||\n sCube > 1.0001;\n if (outOfRange) {\n return null;\n }\n }\n\n const lLin = lCube * lCube * lCube;\n const mLin = mCube * mCube * mCube;\n const sLin = sCube * sCube * sCube;\n\n let rLin = 4.0767416621 * lLin - 3.3077115913 * mLin + 0.2309699292 * sLin;\n let gLin = -1.2684380046 * lLin + 2.6097574011 * mLin - 0.3413193965 * sLin;\n let bLin = -0.0041960863 * lLin - 0.7034186147 * mLin + 1.707614701 * sLin;\n\n if (clampLinear) {\n rLin = clamp01(rLin);\n gLin = clamp01(gLin);\n bLin = clamp01(bLin);\n } else {\n const outOfRange =\n rLin < -0.0001 ||\n rLin > 1.0001 ||\n gLin < -0.0001 ||\n gLin > 1.0001 ||\n bLin < -0.0001 ||\n bLin > 1.0001;\n if (outOfRange) {\n return null;\n }\n }\n\n const r = clamp01(linearChannelToSrgb(rLin));\n const g = clamp01(linearChannelToSrgb(gLin));\n const bValue = clamp01(linearChannelToSrgb(bLin));\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(bValue * 255),\n };\n}\n\nfunction oklchToSrgb(l, c, h) {\n let chroma = c;\n for (let attempt = 0; attempt < 8; attempt += 1) {\n const rgb = tryOklchToSrgb(l, chroma, h);\n if (rgb) {\n return rgb;\n }\n chroma *= 0.9;\n }\n return tryOklchToSrgb(l, clamp01(chroma), h, true) || { r: 0, g: 0, b: 0 };\n}\n\nfunction makeBrandScale(baseHex) {\n const norm = normalizeHex(baseHex);\n if (!norm) return null;\n const baseRgb = hexToRgb(norm);\n if (!baseRgb) return null;\n const baseOklch = rgbToOklch(baseRgb);\n const toneConfig = {\n 100: { lightness: 0.35, chroma: 0.45 },\n 200: { lightness: 0.28, chroma: 0.5 },\n 300: { lightness: 0.22, chroma: 0.6 },\n 400: { lightness: 0.16, chroma: 0.75 },\n 500: { lightness: 0.08, chroma: 0.9 },\n 600: { lightness: 0, chroma: 1, base: true },\n 700: { lightness: -0.08, chroma: 1.05 },\n 800: { lightness: -0.18, chroma: 1.1 },\n 900: { lightness: -0.28, chroma: 1.15 },\n 1000: { lightness: -0.35, chroma: 1.2 },\n };\n const tokens = {};\n\n const adjustLightness = (lightnessValue) => {\n if (lightnessValue === 0) {\n return baseOklch.l;\n }\n if (lightnessValue > 0) {\n return clamp01(baseOklch.l + lightnessValue * (1 - baseOklch.l));\n }\n return clamp01(baseOklch.l * (1 + lightnessValue));\n };\n\n const adjustChroma = (chromaScale) => {\n if (chromaScale === 1) {\n return baseOklch.c;\n }\n const scaled = baseOklch.c * chromaScale;\n return Math.max(0, Math.min(0.4, scaled));\n };\n\n Object.entries(toneConfig).forEach(([stop, config]) => {\n const tokenName = `--color-brand-${stop}`;\n if (config.base) {\n tokens[tokenName] = norm;\n return;\n }\n const toneL = adjustLightness(config.lightness);\n const toneC = adjustChroma(config.chroma);\n const toneRgb = oklchToSrgb(toneL, toneC, baseOklch.h);\n tokens[tokenName] = rgbToHex(toneRgb);\n });\n return tokens;\n}\n\nconst brandVars = computed(() => makeBrandScale(props.accentColor) ?? {});\nconst brandStyle = computed(() => brandVars.value);\n\nconst accentStackEntry = {\n vars: {},\n enabled: Boolean(props.exposeGlobalAccent),\n};\nglobalAccentStack.push(accentStackEntry);\n\nwatch(\n () => props.exposeGlobalAccent,\n (enabled) => {\n accentStackEntry.enabled = Boolean(enabled);\n applyGlobalAccentFromStack();\n },\n { immediate: true },\n);\n\nwatch(\n brandVars,\n (vars) => {\n if (vars && Object.keys(vars).length > 0) {\n accentStackEntry.vars = { ...vars };\n } else {\n accentStackEntry.vars = {};\n }\n applyGlobalAccentFromStack();\n },\n { immediate: true },\n);\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</script>\n\n<style scoped lang=\"less\">\n.theme-switcher-divider {\n margin: 4px 0;\n}\n</style>\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","themePortalHostKey","useThemePortalTarget","hostRef","inject","fallbackTarget","computed","props","__props","globalAccentStack","appliedGlobalAccentKeys","applyGlobalAccentFromStack","root","key","activeEntry","entry","value","darkModeMedia","prefersReducedMotionMedia","PREFERS_REDUCED_MOTION_QUERY","initialMode","getEffectiveMode","currentMode","ref","theme","portalHost","handleSystemPreferenceChange","watch","syncDarkMode","previousValue","setDocumentDarkModeAttribute","withThemeTransition","onBeforeUnmount","index","accentStackEntry","event","applyTheme","startViewTransition","element","THEME_TRANSITION_DURATION","provide","normalizeHex","hex","h","r","g","b","hexToRgb","rgbToHex","toHex","clamp01","srgbChannelToLinear","channel","linearChannelToSrgb","normalized","rgbToOklch","rNorm","gNorm","bNorm","rLin","gLin","bLin","l","m","s","lRoot","mRoot","sRoot","oklabL","oklabA","oklabB","chroma","hue","tryOklchToSrgb","c","clampLinear","angle","a","lComponent","mComponent","sComponent","lCube","mCube","sCube","lLin","mLin","sLin","bValue","oklchToSrgb","attempt","rgb","makeBrandScale","baseHex","norm","baseRgb","baseOklch","toneConfig","tokens","adjustLightness","lightnessValue","adjustChroma","chromaScale","scaled","stop","config","tokenName","toneL","toneC","toneRgb","brandVars","brandStyle","enabled","vars","_createElementBlock","_renderSlot","_ctx","_createElementVNode","MODE_LABELS","map","option","VALID_MODES","emit","__emit","open","internalMode","_createBlock","_unref","DropdownMenu","$event","_createVNode","DropdownItemGroup","DropdownItemRadio"],"mappings":"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"}
package/dist/theme.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(b,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):(b=typeof globalThis<"u"?globalThis:b||self,t(b.theme={},b.Vue,b.whatInput,b.DropdownMenu))})(this,function(b,t,ke,N){"use strict";const P=["auto","light","dark"],G="gospore-theme-mode",J="(prefers-color-scheme: dark)";function j(){if(typeof document>"u")return null;const o=Z(G);return o&&P.includes(o)?o:null}function X(o){if(typeof document>"u"||!P.includes(o))return;const a=typeof window<"u"?window.location.hostname:"",i=typeof window<"u"?window.location.protocol:"",s=ee(a),g=i==="https:",M=["path=/","max-age=31536000","SameSite=Lax"];s&&M.push(`domain=${s}`),g&&M.push("Secure"),document.cookie=[`${encodeURIComponent(G)}=${encodeURIComponent(o)}`,...M].join("; ")}function q(o){if(typeof document>"u")return;const a=typeof o=="string"&&P.includes(o)?o:j()??"auto";console.log("Applying theme mode:",a);const i=te(a);document.documentElement.setAttribute("dark-mode",i)}function Z(o){if(typeof document>"u"||!document.cookie)return null;const a=`${encodeURIComponent(o)}=`,i=document.cookie.split("; ");for(const s of i)if(s.startsWith(a))return decodeURIComponent(s.slice(a.length));return null}function ee(o){if(!o||o==="localhost")return null;if(/^\d+(?:\.\d+){3}$/.test(o))return o;const i=o.split(".");return i.length<=1?null:i.length===2?o:i.slice(-2).join(".")}function te(o){if(o==="dark")return!0;if(o==="light"||typeof window>"u")return!1;try{const a=typeof window.matchMedia=="function"?window.matchMedia(J):null;return a?a.matches:!1}catch{return!1}}const v=Symbol.for("gospore.theme.portalHost");function ne(){const o=t.inject(v,null);console.log("Using theme portal host:",o);const a=typeof document<"u"?document.body:"body";return t.computed(()=>o?.value??a)}const oe="(prefers-color-scheme: dark)",re="(prefers-reduced-motion: reduce)",ce=200,ae=Object.assign({name:"Theme"},{__name:"Theme",props:{mode:{type:String,validator:o=>["auto","light","dark"].includes(o)},accentColor:{type:String,required:!1,default:void 0},exposeGlobalAccent:{type:Boolean,default:!1}},setup(o){const a=o,i=[],s=new Set;function g(){const e=document.documentElement;if(!e)return;s.forEach(c=>{e.style.removeProperty(c)}),s.clear();const n=[...i].reverse().find(c=>c.enabled&&c.vars&&Object.keys(c.vars).length>0);n&&Object.entries(n.vars).forEach(([c,r])=>{e.style.setProperty(c,r),s.add(c)})}const M=window.matchMedia(oe),B=window.matchMedia(re),I=Q();q(I);const $=t.ref(I),l=t.ref({darkMode:w(I)}),h=t.ref(null);M.addEventListener("change",K),t.watch(()=>a.mode,()=>{f()},{immediate:!0}),t.watch(()=>l.value.darkMode,(e,n)=>{if(n===void 0){Y(e);return}ie(()=>{Y(e)})},{immediate:!0}),t.onBeforeUnmount(()=>{M.removeEventListener("change",K);const e=i.indexOf(L);e!==-1&&i.splice(e,1),g()});function f(){const e=Q();$.value=e,l.value.darkMode=w(e)}function w(e){return e==="dark"?!0:e==="light"?!1:M.matches}function K(e){!e||$.value!=="auto"||(l.value.darkMode=e.matches)}function Y(e){document.documentElement.setAttribute("dark-mode",e)}function ie(e){if(B.matches){e();return}const n=document.startViewTransition?.bind(document);if(n){n(()=>{e()});return}e();const c=document.documentElement;typeof c.animate=="function"&&window.requestAnimationFrame(()=>{c.animate([{opacity:.85},{opacity:1}],{duration:ce,easing:"ease-in-out"})})}function Q(){return a.mode??j()??"auto"}t.provide("theme",l),t.provide(v,h);function z(e){if(!e)return null;const n=e.trim().toLowerCase();if(!/^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.exec(n))return null;if(n.length===4){const r=n[1],u=n[2],m=n[3];return`#${r}${r}${u}${u}${m}${m}`}return n}function le(e){const n=z(e);if(!n)return null;const c=parseInt(n.slice(1,3),16),r=parseInt(n.slice(3,5),16),u=parseInt(n.slice(5,7),16);return{r:c,g:r,b:u}}function ue({r:e,g:n,b:c}){const r=u=>u.toString(16).padStart(2,"0");return`#${r(e)}${r(n)}${r(c)}`}function p(e){return Math.max(0,Math.min(1,e))}function H(e){return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function V(e){const n=p(e);return n<=.0031308?12.92*n:1.055*Math.pow(n,1/2.4)-.055}function de({r:e,g:n,b:c}){const r=e/255,u=n/255,m=c/255,S=H(r),D=H(u),d=H(m),y=.4122214708*S+.5363325363*D+.0514459929*d,E=.2119034982*S+.6806995451*D+.1073969566*d,_=.0883024619*S+.2817188376*D+.6299787005*d,k=Math.cbrt(y),O=Math.cbrt(E),C=Math.cbrt(_),x=.2104542553*k+.793617785*O-.0040720468*C,T=1.9779984951*k-2.428592205*O+.4505937099*C,R=.0259040371*k+.7827717662*O-.808675766*C,A=Math.sqrt(T*T+R*R);let U=Math.atan2(R,T)*(180/Math.PI);return U<0&&(U+=360),{l:x,c:A,h:U}}function F(e,n,c,r=!1){const u=c*Math.PI/180,m=n*Math.cos(u),S=n*Math.sin(u),D=e+.3963377774*m+.2158037573*S,d=e-.1055613458*m-.0638541728*S,y=e-.0894841775*m-1.291485548*S,E=r?p(D):D,_=r?p(d):d,k=r?p(y):y;if(!r&&(E<-1e-4||E>1.0001||_<-1e-4||_>1.0001||k<-1e-4||k>1.0001))return null;const O=E*E*E,C=_*_*_,x=k*k*k;let T=4.0767416621*O-3.3077115913*C+.2309699292*x,R=-1.2684380046*O+2.6097574011*C-.3413193965*x,A=-.0041960863*O-.7034186147*C+1.707614701*x;if(r)T=p(T),R=p(R),A=p(A);else if(T<-1e-4||T>1.0001||R<-1e-4||R>1.0001||A<-1e-4||A>1.0001)return null;const U=p(V(T)),pe=p(V(R)),be=p(V(A));return{r:Math.round(U*255),g:Math.round(pe*255),b:Math.round(be*255)}}function fe(e,n,c){let r=n;for(let u=0;u<8;u+=1){const m=F(e,r,c);if(m)return m;r*=.9}return F(e,p(r),c,!0)||{r:0,g:0,b:0}}function me(e){const n=z(e);if(!n)return null;const c=le(n);if(!c)return null;const r=de(c),u={100:{lightness:.35,chroma:.45},200:{lightness:.28,chroma:.5},300:{lightness:.22,chroma:.6},400:{lightness:.16,chroma:.75},500:{lightness:.08,chroma:.9},600:{lightness:0,chroma:1,base:!0},700:{lightness:-.08,chroma:1.05},800:{lightness:-.18,chroma:1.1},900:{lightness:-.28,chroma:1.15},1e3:{lightness:-.35,chroma:1.2}},m={},S=d=>d===0?r.l:d>0?p(r.l+d*(1-r.l)):p(r.l*(1+d)),D=d=>{if(d===1)return r.c;const y=r.c*d;return Math.max(0,Math.min(.4,y))};return Object.entries(u).forEach(([d,y])=>{const E=`--color-brand-${d}`;if(y.base){m[E]=n;return}const _=S(y.lightness),k=D(y.chroma),O=fe(_,k,r.h);m[E]=ue(O)}),m}const W=t.computed(()=>me(a.accentColor)??{}),he=t.computed(()=>W.value),L={vars:{},enabled:!!a.exposeGlobalAccent};return i.push(L),t.watch(()=>a.exposeGlobalAccent,e=>{L.enabled=!!e,g()},{immediate:!0}),t.watch(W,e=>{e&&Object.keys(e).length>0?L.vars={...e}:L.vars={},g()},{immediate:!0}),(e,n)=>(t.openBlock(),t.createElementBlock("div",{class:"theme",style:t.normalizeStyle(he.value)},[t.renderSlot(e.$slots,"default"),t.createElementVNode("div",{ref_key:"portalHost",ref:h,class:"theme__portal-host"},null,512)],4))}}),se=((o,a)=>{const i=o.__vccOpts||o;for(const[s,g]of a)i[s]=g;return i})({__name:"ThemeSwitcher",props:{mode:{type:String,default:"auto",validator:o=>["auto","light","dark"].includes(o)}},emits:["update:mode"],setup(o,{emit:a}){const s=[{value:"auto",label:"System"},{value:"light",label:"Light"},{value:"dark",label:"Dark"}].reduce((h,f)=>(h[f.value]=f.label,h),{}),g=P,M=o,B=a;q();const I=t.ref(!1),$=j()??M.mode,l=t.ref(g.includes($)?$:"auto");return t.computed(()=>s[l.value]??s.auto),t.watch(()=>M.mode,h=>{g.includes(h)&&h!==l.value&&(l.value=h)}),t.watch(l,h=>{if(!g.includes(h)){l.value="auto";return}I.value=!1,B("update:mode",h),X(h)},{immediate:!0}),(h,f)=>(t.openBlock(),t.createBlock(t.unref(N.DropdownMenu),{open:I.value,"onUpdate:open":f[3]||(f[3]=w=>I.value=w),text:"Theme","aria-label":"Select theme mode"},{default:t.withCtx(()=>[t.createVNode(t.unref(N.DropdownItemGroup),{title:"Theme"},{default:t.withCtx(()=>[t.createVNode(t.unref(N.DropdownItemRadio),{checked:l.value,"onUpdate:checked":f[0]||(f[0]=w=>l.value=w),value:"auto",label:t.unref(s).auto,"aria-label":`${t.unref(s).auto} mode`},null,8,["checked","label","aria-label"]),f[4]||(f[4]=t.createElementVNode("hr",{class:"theme-switcher-divider",role:"separator"},null,-1)),t.createVNode(t.unref(N.DropdownItemRadio),{checked:l.value,"onUpdate:checked":f[1]||(f[1]=w=>l.value=w),value:"light",label:t.unref(s).light,"aria-label":`${t.unref(s).light} mode`},null,8,["checked","label","aria-label"]),t.createVNode(t.unref(N.DropdownItemRadio),{checked:l.value,"onUpdate:checked":f[2]||(f[2]=w=>l.value=w),value:"dark",label:t.unref(s).dark,"aria-label":`${t.unref(s).dark} mode`},null,8,["checked","label","aria-label"])]),_:1})]),_:1},8,["open"]))}},[["__scopeId","data-v-bcbc87cb"]]);b.Theme=ae,b.ThemeSwitcher=se,b.themePortalHostKey=v,b.useThemePortalTarget=ne,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})});
1
+ (function(b,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):(b=typeof globalThis<"u"?globalThis:b||self,t(b.theme={},b.Vue,b.whatInput,b.DropdownMenu))})(this,(function(b,t,ke,N){"use strict";const P=["auto","light","dark"],G="gospore-theme-mode",J="(prefers-color-scheme: dark)";function j(){if(typeof document>"u")return null;const o=Z(G);return o&&P.includes(o)?o:null}function X(o){if(typeof document>"u"||!P.includes(o))return;const a=typeof window<"u"?window.location.hostname:"",i=typeof window<"u"?window.location.protocol:"",s=ee(a),g=i==="https:",M=["path=/","max-age=31536000","SameSite=Lax"];s&&M.push(`domain=${s}`),g&&M.push("Secure"),document.cookie=[`${encodeURIComponent(G)}=${encodeURIComponent(o)}`,...M].join("; ")}function q(o){if(typeof document>"u")return;const a=typeof o=="string"&&P.includes(o)?o:j()??"auto";console.log("Applying theme mode:",a);const i=te(a);document.documentElement.setAttribute("dark-mode",i)}function Z(o){if(typeof document>"u"||!document.cookie)return null;const a=`${encodeURIComponent(o)}=`,i=document.cookie.split("; ");for(const s of i)if(s.startsWith(a))return decodeURIComponent(s.slice(a.length));return null}function ee(o){if(!o||o==="localhost")return null;if(/^\d+(?:\.\d+){3}$/.test(o))return o;const i=o.split(".");return i.length<=1?null:i.length===2?o:i.slice(-2).join(".")}function te(o){if(o==="dark")return!0;if(o==="light"||typeof window>"u")return!1;try{const a=typeof window.matchMedia=="function"?window.matchMedia(J):null;return a?a.matches:!1}catch{return!1}}const v=Symbol.for("gospore.theme.portalHost");function ne(){const o=t.inject(v,null);console.log("Using theme portal host:",o);const a=typeof document<"u"?document.body:"body";return t.computed(()=>o?.value??a)}const oe="(prefers-color-scheme: dark)",re="(prefers-reduced-motion: reduce)",ce=200,ae=Object.assign({name:"Theme"},{__name:"Theme",props:{mode:{type:String,validator:o=>["auto","light","dark"].includes(o)},accentColor:{type:String,required:!1,default:void 0},exposeGlobalAccent:{type:Boolean,default:!1}},setup(o){const a=o,i=[],s=new Set;function g(){const e=document.documentElement;if(!e)return;s.forEach(c=>{e.style.removeProperty(c)}),s.clear();const n=[...i].reverse().find(c=>c.enabled&&c.vars&&Object.keys(c.vars).length>0);n&&Object.entries(n.vars).forEach(([c,r])=>{e.style.setProperty(c,r),s.add(c)})}const M=window.matchMedia(oe),B=window.matchMedia(re),I=Q();q(I);const $=t.ref(I),l=t.ref({darkMode:w(I)}),h=t.ref(null);M.addEventListener("change",K),t.watch(()=>a.mode,()=>{f()},{immediate:!0}),t.watch(()=>l.value.darkMode,(e,n)=>{if(n===void 0){Y(e);return}ie(()=>{Y(e)})},{immediate:!0}),t.onBeforeUnmount(()=>{M.removeEventListener("change",K);const e=i.indexOf(L);e!==-1&&i.splice(e,1),g()});function f(){const e=Q();$.value=e,l.value.darkMode=w(e)}function w(e){return e==="dark"?!0:e==="light"?!1:M.matches}function K(e){!e||$.value!=="auto"||(l.value.darkMode=e.matches)}function Y(e){document.documentElement.setAttribute("dark-mode",e)}function ie(e){if(B.matches){e();return}const n=document.startViewTransition?.bind(document);if(n){n(()=>{e()});return}e();const c=document.documentElement;typeof c.animate=="function"&&window.requestAnimationFrame(()=>{c.animate([{opacity:.85},{opacity:1}],{duration:ce,easing:"ease-in-out"})})}function Q(){return a.mode??j()??"auto"}t.provide("theme",l),t.provide(v,h);function z(e){if(!e)return null;const n=e.trim().toLowerCase();if(!/^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.exec(n))return null;if(n.length===4){const r=n[1],u=n[2],m=n[3];return`#${r}${r}${u}${u}${m}${m}`}return n}function le(e){const n=z(e);if(!n)return null;const c=parseInt(n.slice(1,3),16),r=parseInt(n.slice(3,5),16),u=parseInt(n.slice(5,7),16);return{r:c,g:r,b:u}}function ue({r:e,g:n,b:c}){const r=u=>u.toString(16).padStart(2,"0");return`#${r(e)}${r(n)}${r(c)}`}function p(e){return Math.max(0,Math.min(1,e))}function H(e){return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function V(e){const n=p(e);return n<=.0031308?12.92*n:1.055*Math.pow(n,1/2.4)-.055}function de({r:e,g:n,b:c}){const r=e/255,u=n/255,m=c/255,S=H(r),D=H(u),d=H(m),y=.4122214708*S+.5363325363*D+.0514459929*d,E=.2119034982*S+.6806995451*D+.1073969566*d,_=.0883024619*S+.2817188376*D+.6299787005*d,k=Math.cbrt(y),O=Math.cbrt(E),C=Math.cbrt(_),x=.2104542553*k+.793617785*O-.0040720468*C,T=1.9779984951*k-2.428592205*O+.4505937099*C,R=.0259040371*k+.7827717662*O-.808675766*C,A=Math.sqrt(T*T+R*R);let U=Math.atan2(R,T)*(180/Math.PI);return U<0&&(U+=360),{l:x,c:A,h:U}}function F(e,n,c,r=!1){const u=c*Math.PI/180,m=n*Math.cos(u),S=n*Math.sin(u),D=e+.3963377774*m+.2158037573*S,d=e-.1055613458*m-.0638541728*S,y=e-.0894841775*m-1.291485548*S,E=r?p(D):D,_=r?p(d):d,k=r?p(y):y;if(!r&&(E<-1e-4||E>1.0001||_<-1e-4||_>1.0001||k<-1e-4||k>1.0001))return null;const O=E*E*E,C=_*_*_,x=k*k*k;let T=4.0767416621*O-3.3077115913*C+.2309699292*x,R=-1.2684380046*O+2.6097574011*C-.3413193965*x,A=-.0041960863*O-.7034186147*C+1.707614701*x;if(r)T=p(T),R=p(R),A=p(A);else if(T<-1e-4||T>1.0001||R<-1e-4||R>1.0001||A<-1e-4||A>1.0001)return null;const U=p(V(T)),pe=p(V(R)),be=p(V(A));return{r:Math.round(U*255),g:Math.round(pe*255),b:Math.round(be*255)}}function fe(e,n,c){let r=n;for(let u=0;u<8;u+=1){const m=F(e,r,c);if(m)return m;r*=.9}return F(e,p(r),c,!0)||{r:0,g:0,b:0}}function me(e){const n=z(e);if(!n)return null;const c=le(n);if(!c)return null;const r=de(c),u={100:{lightness:.35,chroma:.45},200:{lightness:.28,chroma:.5},300:{lightness:.22,chroma:.6},400:{lightness:.16,chroma:.75},500:{lightness:.08,chroma:.9},600:{lightness:0,chroma:1,base:!0},700:{lightness:-.08,chroma:1.05},800:{lightness:-.18,chroma:1.1},900:{lightness:-.28,chroma:1.15},1e3:{lightness:-.35,chroma:1.2}},m={},S=d=>d===0?r.l:d>0?p(r.l+d*(1-r.l)):p(r.l*(1+d)),D=d=>{if(d===1)return r.c;const y=r.c*d;return Math.max(0,Math.min(.4,y))};return Object.entries(u).forEach(([d,y])=>{const E=`--color-brand-${d}`;if(y.base){m[E]=n;return}const _=S(y.lightness),k=D(y.chroma),O=fe(_,k,r.h);m[E]=ue(O)}),m}const W=t.computed(()=>me(a.accentColor)??{}),he=t.computed(()=>W.value),L={vars:{},enabled:!!a.exposeGlobalAccent};return i.push(L),t.watch(()=>a.exposeGlobalAccent,e=>{L.enabled=!!e,g()},{immediate:!0}),t.watch(W,e=>{e&&Object.keys(e).length>0?L.vars={...e}:L.vars={},g()},{immediate:!0}),(e,n)=>(t.openBlock(),t.createElementBlock("div",{class:"theme",style:t.normalizeStyle(he.value)},[t.renderSlot(e.$slots,"default"),t.createElementVNode("div",{ref_key:"portalHost",ref:h,class:"theme__portal-host"},null,512)],4))}}),se=((o,a)=>{const i=o.__vccOpts||o;for(const[s,g]of a)i[s]=g;return i})({__name:"ThemeSwitcher",props:{mode:{type:String,default:"auto",validator:o=>["auto","light","dark"].includes(o)}},emits:["update:mode"],setup(o,{emit:a}){const s=[{value:"auto",label:"System"},{value:"light",label:"Light"},{value:"dark",label:"Dark"}].reduce((h,f)=>(h[f.value]=f.label,h),{}),g=P,M=o,B=a;q();const I=t.ref(!1),$=j()??M.mode,l=t.ref(g.includes($)?$:"auto");return t.computed(()=>s[l.value]??s.auto),t.watch(()=>M.mode,h=>{g.includes(h)&&h!==l.value&&(l.value=h)}),t.watch(l,h=>{if(!g.includes(h)){l.value="auto";return}I.value=!1,B("update:mode",h),X(h)},{immediate:!0}),(h,f)=>(t.openBlock(),t.createBlock(t.unref(N.DropdownMenu),{open:I.value,"onUpdate:open":f[3]||(f[3]=w=>I.value=w),text:"Theme","aria-label":"Select theme mode"},{default:t.withCtx(()=>[t.createVNode(t.unref(N.DropdownItemGroup),{title:"Theme"},{default:t.withCtx(()=>[t.createVNode(t.unref(N.DropdownItemRadio),{checked:l.value,"onUpdate:checked":f[0]||(f[0]=w=>l.value=w),value:"auto",label:t.unref(s).auto,"aria-label":`${t.unref(s).auto} mode`},null,8,["checked","label","aria-label"]),f[4]||(f[4]=t.createElementVNode("hr",{class:"theme-switcher-divider",role:"separator"},null,-1)),t.createVNode(t.unref(N.DropdownItemRadio),{checked:l.value,"onUpdate:checked":f[1]||(f[1]=w=>l.value=w),value:"light",label:t.unref(s).light,"aria-label":`${t.unref(s).light} mode`},null,8,["checked","label","aria-label"]),t.createVNode(t.unref(N.DropdownItemRadio),{checked:l.value,"onUpdate:checked":f[2]||(f[2]=w=>l.value=w),value:"dark",label:t.unref(s).dark,"aria-label":`${t.unref(s).dark} mode`},null,8,["checked","label","aria-label"])]),_:1})]),_:1},8,["open"]))}},[["__scopeId","data-v-bcbc87cb"]]);b.Theme=ae,b.ThemeSwitcher=se,b.themePortalHostKey=v,b.useThemePortalTarget=ne,Object.defineProperty(b,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/portalHost.js","../src/Theme.vue","../src/ThemeSwitcher.vue"],"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","import { computed, inject } from \"vue\";\n\nexport const themePortalHostKey = Symbol.for(\"gospore.theme.portalHost\");\n\nexport function useThemePortalTarget() {\n const hostRef = inject(themePortalHostKey, null);\n console.log(\"Using theme portal host:\", hostRef);\n const fallbackTarget =\n typeof document !== \"undefined\" ? document.body : \"body\";\n\n return computed(() => hostRef?.value ?? fallbackTarget);\n}\n","<template>\n <div class=\"theme\" :style=\"brandStyle\">\n <slot />\n <div ref=\"portalHost\" class=\"theme__portal-host\"></div>\n </div>\n</template>\n\n<script setup>\nimport { provide, ref, watch, onBeforeUnmount, computed } from \"vue\";\nimport { applyStoredModeToDocument, readStoredMode } from \"./modeStorage\";\nimport \"what-input\";\nimport { themePortalHostKey } from \"./portalHost\";\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 * Optional hex accent color (\"#RRGGBB\" or \"#RGB\"). When provided,\n * Theme derives the `--color-brand-*` palette and exposes the tokens on\n * the root .theme element (and the global document for portals).\n */\n accentColor: {\n type: String,\n required: false,\n default: undefined,\n },\n /**\n * When true the brand vars are also exposed on <html>, allowing portals\n * attached outside the Theme subtree to inherit the accent colors.\n */\n exposeGlobalAccent: {\n type: Boolean,\n default: false,\n },\n});\n\nconst globalAccentStack = [];\nconst appliedGlobalAccentKeys = new Set();\n\nfunction applyGlobalAccentFromStack() {\n const root = document.documentElement;\n if (!root) {\n return;\n }\n\n appliedGlobalAccentKeys.forEach((key) => {\n root.style.removeProperty(key);\n });\n appliedGlobalAccentKeys.clear();\n\n const activeEntry = [...globalAccentStack]\n .reverse()\n .find(\n (entry) =>\n entry.enabled &&\n entry.vars &&\n Object.keys(entry.vars).length > 0,\n );\n\n if (!activeEntry) {\n return;\n }\n\n Object.entries(activeEntry.vars).forEach(([key, value]) => {\n root.style.setProperty(key, value);\n appliedGlobalAccentKeys.add(key);\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});\nconst portalHost = ref(null);\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 const index = globalAccentStack.indexOf(accentStackEntry);\n if (index !== -1) {\n globalAccentStack.splice(index, 1);\n }\n applyGlobalAccentFromStack();\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);\nprovide(themePortalHostKey, portalHost);\n\n// --- Accent helpers -------------------------------------------------------\nfunction normalizeHex(hex) {\n if (!hex) return null;\n const h = hex.trim().toLowerCase();\n const m = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.exec(h);\n if (!m) return null;\n if (h.length === 4) {\n // expand #rgb -> #rrggbb\n const r = h[1],\n g = h[2],\n b = h[3];\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n return h;\n}\n\nfunction hexToRgb(hex) {\n const h = normalizeHex(hex);\n if (!h) return null;\n const r = parseInt(h.slice(1, 3), 16);\n const g = parseInt(h.slice(3, 5), 16);\n const b = parseInt(h.slice(5, 7), 16);\n return { r, g, b };\n}\n\nfunction rgbToHex({ r, g, b }) {\n const toHex = (value) => value.toString(16).padStart(2, \"0\");\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction clamp01(value) {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction srgbChannelToLinear(channel) {\n if (channel <= 0.04045) {\n return channel / 12.92;\n }\n return Math.pow((channel + 0.055) / 1.055, 2.4);\n}\n\nfunction linearChannelToSrgb(channel) {\n const normalized = clamp01(channel);\n if (normalized <= 0.0031308) {\n return 12.92 * normalized;\n }\n return 1.055 * Math.pow(normalized, 1 / 2.4) - 0.055;\n}\n\nfunction rgbToOklch({ r, g, b }) {\n const rNorm = r / 255;\n const gNorm = g / 255;\n const bNorm = b / 255;\n\n const rLin = srgbChannelToLinear(rNorm);\n const gLin = srgbChannelToLinear(gNorm);\n const bLin = srgbChannelToLinear(bNorm);\n\n const l = 0.4122214708 * rLin + 0.5363325363 * gLin + 0.0514459929 * bLin;\n const m = 0.2119034982 * rLin + 0.6806995451 * gLin + 0.1073969566 * bLin;\n const s = 0.0883024619 * rLin + 0.2817188376 * gLin + 0.6299787005 * bLin;\n\n const lRoot = Math.cbrt(l);\n const mRoot = Math.cbrt(m);\n const sRoot = Math.cbrt(s);\n\n const oklabL =\n 0.2104542553 * lRoot + 0.793617785 * mRoot - 0.0040720468 * sRoot;\n const oklabA =\n 1.9779984951 * lRoot - 2.428592205 * mRoot + 0.4505937099 * sRoot;\n const oklabB =\n 0.0259040371 * lRoot + 0.7827717662 * mRoot - 0.808675766 * sRoot;\n\n const chroma = Math.sqrt(oklabA * oklabA + oklabB * oklabB);\n let hue = Math.atan2(oklabB, oklabA) * (180 / Math.PI);\n if (hue < 0) {\n hue += 360;\n }\n\n return { l: oklabL, c: chroma, h: hue };\n}\n\nfunction tryOklchToSrgb(l, c, h, clampLinear = false) {\n const angle = (h * Math.PI) / 180;\n const a = c * Math.cos(angle);\n const b = c * Math.sin(angle);\n\n const lComponent = l + 0.3963377774 * a + 0.2158037573 * b;\n const mComponent = l - 0.1055613458 * a - 0.0638541728 * b;\n const sComponent = l - 0.0894841775 * a - 1.291485548 * b;\n\n const lCube = clampLinear ? clamp01(lComponent) : lComponent;\n const mCube = clampLinear ? clamp01(mComponent) : mComponent;\n const sCube = clampLinear ? clamp01(sComponent) : sComponent;\n\n if (!clampLinear) {\n const outOfRange =\n lCube < -0.0001 ||\n lCube > 1.0001 ||\n mCube < -0.0001 ||\n mCube > 1.0001 ||\n sCube < -0.0001 ||\n sCube > 1.0001;\n if (outOfRange) {\n return null;\n }\n }\n\n const lLin = lCube * lCube * lCube;\n const mLin = mCube * mCube * mCube;\n const sLin = sCube * sCube * sCube;\n\n let rLin = 4.0767416621 * lLin - 3.3077115913 * mLin + 0.2309699292 * sLin;\n let gLin = -1.2684380046 * lLin + 2.6097574011 * mLin - 0.3413193965 * sLin;\n let bLin = -0.0041960863 * lLin - 0.7034186147 * mLin + 1.707614701 * sLin;\n\n if (clampLinear) {\n rLin = clamp01(rLin);\n gLin = clamp01(gLin);\n bLin = clamp01(bLin);\n } else {\n const outOfRange =\n rLin < -0.0001 ||\n rLin > 1.0001 ||\n gLin < -0.0001 ||\n gLin > 1.0001 ||\n bLin < -0.0001 ||\n bLin > 1.0001;\n if (outOfRange) {\n return null;\n }\n }\n\n const r = clamp01(linearChannelToSrgb(rLin));\n const g = clamp01(linearChannelToSrgb(gLin));\n const bValue = clamp01(linearChannelToSrgb(bLin));\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(bValue * 255),\n };\n}\n\nfunction oklchToSrgb(l, c, h) {\n let chroma = c;\n for (let attempt = 0; attempt < 8; attempt += 1) {\n const rgb = tryOklchToSrgb(l, chroma, h);\n if (rgb) {\n return rgb;\n }\n chroma *= 0.9;\n }\n return tryOklchToSrgb(l, clamp01(chroma), h, true) || { r: 0, g: 0, b: 0 };\n}\n\nfunction makeBrandScale(baseHex) {\n const norm = normalizeHex(baseHex);\n if (!norm) return null;\n const baseRgb = hexToRgb(norm);\n if (!baseRgb) return null;\n const baseOklch = rgbToOklch(baseRgb);\n const toneConfig = {\n 100: { lightness: 0.35, chroma: 0.45 },\n 200: { lightness: 0.28, chroma: 0.5 },\n 300: { lightness: 0.22, chroma: 0.6 },\n 400: { lightness: 0.16, chroma: 0.75 },\n 500: { lightness: 0.08, chroma: 0.9 },\n 600: { lightness: 0, chroma: 1, base: true },\n 700: { lightness: -0.08, chroma: 1.05 },\n 800: { lightness: -0.18, chroma: 1.1 },\n 900: { lightness: -0.28, chroma: 1.15 },\n 1000: { lightness: -0.35, chroma: 1.2 },\n };\n const tokens = {};\n\n const adjustLightness = (lightnessValue) => {\n if (lightnessValue === 0) {\n return baseOklch.l;\n }\n if (lightnessValue > 0) {\n return clamp01(baseOklch.l + lightnessValue * (1 - baseOklch.l));\n }\n return clamp01(baseOklch.l * (1 + lightnessValue));\n };\n\n const adjustChroma = (chromaScale) => {\n if (chromaScale === 1) {\n return baseOklch.c;\n }\n const scaled = baseOklch.c * chromaScale;\n return Math.max(0, Math.min(0.4, scaled));\n };\n\n Object.entries(toneConfig).forEach(([stop, config]) => {\n const tokenName = `--color-brand-${stop}`;\n if (config.base) {\n tokens[tokenName] = norm;\n return;\n }\n const toneL = adjustLightness(config.lightness);\n const toneC = adjustChroma(config.chroma);\n const toneRgb = oklchToSrgb(toneL, toneC, baseOklch.h);\n tokens[tokenName] = rgbToHex(toneRgb);\n });\n return tokens;\n}\n\nconst brandVars = computed(() => makeBrandScale(props.accentColor) ?? {});\nconst brandStyle = computed(() => brandVars.value);\n\nconst accentStackEntry = {\n vars: {},\n enabled: Boolean(props.exposeGlobalAccent),\n};\nglobalAccentStack.push(accentStackEntry);\n\nwatch(\n () => props.exposeGlobalAccent,\n (enabled) => {\n accentStackEntry.enabled = Boolean(enabled);\n applyGlobalAccentFromStack();\n },\n { immediate: true },\n);\n\nwatch(\n brandVars,\n (vars) => {\n if (vars && Object.keys(vars).length > 0) {\n accentStackEntry.vars = { ...vars };\n } else {\n accentStackEntry.vars = {};\n }\n applyGlobalAccentFromStack();\n },\n { immediate: true },\n);\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</script>\n\n<style scoped lang=\"less\">\n.theme-switcher-divider {\n margin: 4px 0;\n}\n</style>\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","themePortalHostKey","useThemePortalTarget","hostRef","inject","fallbackTarget","computed","props","__props","globalAccentStack","appliedGlobalAccentKeys","applyGlobalAccentFromStack","root","key","activeEntry","entry","value","darkModeMedia","prefersReducedMotionMedia","PREFERS_REDUCED_MOTION_QUERY","initialMode","getEffectiveMode","currentMode","ref","theme","portalHost","handleSystemPreferenceChange","watch","syncDarkMode","previousValue","setDocumentDarkModeAttribute","withThemeTransition","onBeforeUnmount","index","accentStackEntry","event","applyTheme","startViewTransition","element","THEME_TRANSITION_DURATION","provide","normalizeHex","hex","h","g","b","hexToRgb","r","rgbToHex","toHex","clamp01","srgbChannelToLinear","channel","linearChannelToSrgb","normalized","rgbToOklch","rNorm","gNorm","bNorm","rLin","gLin","bLin","l","m","s","lRoot","mRoot","sRoot","oklabL","oklabA","oklabB","chroma","hue","tryOklchToSrgb","c","clampLinear","angle","a","lComponent","mComponent","sComponent","lCube","mCube","sCube","lLin","mLin","sLin","bValue","oklchToSrgb","attempt","rgb","makeBrandScale","baseHex","norm","baseRgb","baseOklch","toneConfig","tokens","adjustLightness","lightnessValue","adjustChroma","chromaScale","scaled","stop","config","tokenName","toneL","toneC","toneRgb","brandVars","brandStyle","enabled","vars","_createElementBlock","_renderSlot","_ctx","_createElementVNode","MODE_LABELS","map","option","VALID_MODES","emit","__emit","open","internalMode","_createBlock","_unref","DropdownMenu","$event","_createVNode","DropdownItemGroup","DropdownItemRadio"],"mappings":"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"}
1
+ {"version":3,"file":"theme.umd.js","sources":["../src/modeStorage.js","../src/portalHost.js","../src/Theme.vue","../src/ThemeSwitcher.vue"],"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","import { computed, inject } from \"vue\";\n\nexport const themePortalHostKey = Symbol.for(\"gospore.theme.portalHost\");\n\nexport function useThemePortalTarget() {\n const hostRef = inject(themePortalHostKey, null);\n console.log(\"Using theme portal host:\", hostRef);\n const fallbackTarget =\n typeof document !== \"undefined\" ? document.body : \"body\";\n\n return computed(() => hostRef?.value ?? fallbackTarget);\n}\n","<template>\n <div class=\"theme\" :style=\"brandStyle\">\n <slot />\n <div ref=\"portalHost\" class=\"theme__portal-host\"></div>\n </div>\n</template>\n\n<script setup>\nimport { provide, ref, watch, onBeforeUnmount, computed } from \"vue\";\nimport { applyStoredModeToDocument, readStoredMode } from \"./modeStorage\";\nimport \"what-input\";\nimport { themePortalHostKey } from \"./portalHost\";\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 * Optional hex accent color (\"#RRGGBB\" or \"#RGB\"). When provided,\n * Theme derives the `--color-brand-*` palette and exposes the tokens on\n * the root .theme element (and the global document for portals).\n */\n accentColor: {\n type: String,\n required: false,\n default: undefined,\n },\n /**\n * When true the brand vars are also exposed on <html>, allowing portals\n * attached outside the Theme subtree to inherit the accent colors.\n */\n exposeGlobalAccent: {\n type: Boolean,\n default: false,\n },\n});\n\nconst globalAccentStack = [];\nconst appliedGlobalAccentKeys = new Set();\n\nfunction applyGlobalAccentFromStack() {\n const root = document.documentElement;\n if (!root) {\n return;\n }\n\n appliedGlobalAccentKeys.forEach((key) => {\n root.style.removeProperty(key);\n });\n appliedGlobalAccentKeys.clear();\n\n const activeEntry = [...globalAccentStack]\n .reverse()\n .find(\n (entry) =>\n entry.enabled &&\n entry.vars &&\n Object.keys(entry.vars).length > 0,\n );\n\n if (!activeEntry) {\n return;\n }\n\n Object.entries(activeEntry.vars).forEach(([key, value]) => {\n root.style.setProperty(key, value);\n appliedGlobalAccentKeys.add(key);\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});\nconst portalHost = ref(null);\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 const index = globalAccentStack.indexOf(accentStackEntry);\n if (index !== -1) {\n globalAccentStack.splice(index, 1);\n }\n applyGlobalAccentFromStack();\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);\nprovide(themePortalHostKey, portalHost);\n\n// --- Accent helpers -------------------------------------------------------\nfunction normalizeHex(hex) {\n if (!hex) return null;\n const h = hex.trim().toLowerCase();\n const m = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.exec(h);\n if (!m) return null;\n if (h.length === 4) {\n // expand #rgb -> #rrggbb\n const r = h[1],\n g = h[2],\n b = h[3];\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n return h;\n}\n\nfunction hexToRgb(hex) {\n const h = normalizeHex(hex);\n if (!h) return null;\n const r = parseInt(h.slice(1, 3), 16);\n const g = parseInt(h.slice(3, 5), 16);\n const b = parseInt(h.slice(5, 7), 16);\n return { r, g, b };\n}\n\nfunction rgbToHex({ r, g, b }) {\n const toHex = (value) => value.toString(16).padStart(2, \"0\");\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction clamp01(value) {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction srgbChannelToLinear(channel) {\n if (channel <= 0.04045) {\n return channel / 12.92;\n }\n return Math.pow((channel + 0.055) / 1.055, 2.4);\n}\n\nfunction linearChannelToSrgb(channel) {\n const normalized = clamp01(channel);\n if (normalized <= 0.0031308) {\n return 12.92 * normalized;\n }\n return 1.055 * Math.pow(normalized, 1 / 2.4) - 0.055;\n}\n\nfunction rgbToOklch({ r, g, b }) {\n const rNorm = r / 255;\n const gNorm = g / 255;\n const bNorm = b / 255;\n\n const rLin = srgbChannelToLinear(rNorm);\n const gLin = srgbChannelToLinear(gNorm);\n const bLin = srgbChannelToLinear(bNorm);\n\n const l = 0.4122214708 * rLin + 0.5363325363 * gLin + 0.0514459929 * bLin;\n const m = 0.2119034982 * rLin + 0.6806995451 * gLin + 0.1073969566 * bLin;\n const s = 0.0883024619 * rLin + 0.2817188376 * gLin + 0.6299787005 * bLin;\n\n const lRoot = Math.cbrt(l);\n const mRoot = Math.cbrt(m);\n const sRoot = Math.cbrt(s);\n\n const oklabL =\n 0.2104542553 * lRoot + 0.793617785 * mRoot - 0.0040720468 * sRoot;\n const oklabA =\n 1.9779984951 * lRoot - 2.428592205 * mRoot + 0.4505937099 * sRoot;\n const oklabB =\n 0.0259040371 * lRoot + 0.7827717662 * mRoot - 0.808675766 * sRoot;\n\n const chroma = Math.sqrt(oklabA * oklabA + oklabB * oklabB);\n let hue = Math.atan2(oklabB, oklabA) * (180 / Math.PI);\n if (hue < 0) {\n hue += 360;\n }\n\n return { l: oklabL, c: chroma, h: hue };\n}\n\nfunction tryOklchToSrgb(l, c, h, clampLinear = false) {\n const angle = (h * Math.PI) / 180;\n const a = c * Math.cos(angle);\n const b = c * Math.sin(angle);\n\n const lComponent = l + 0.3963377774 * a + 0.2158037573 * b;\n const mComponent = l - 0.1055613458 * a - 0.0638541728 * b;\n const sComponent = l - 0.0894841775 * a - 1.291485548 * b;\n\n const lCube = clampLinear ? clamp01(lComponent) : lComponent;\n const mCube = clampLinear ? clamp01(mComponent) : mComponent;\n const sCube = clampLinear ? clamp01(sComponent) : sComponent;\n\n if (!clampLinear) {\n const outOfRange =\n lCube < -0.0001 ||\n lCube > 1.0001 ||\n mCube < -0.0001 ||\n mCube > 1.0001 ||\n sCube < -0.0001 ||\n sCube > 1.0001;\n if (outOfRange) {\n return null;\n }\n }\n\n const lLin = lCube * lCube * lCube;\n const mLin = mCube * mCube * mCube;\n const sLin = sCube * sCube * sCube;\n\n let rLin = 4.0767416621 * lLin - 3.3077115913 * mLin + 0.2309699292 * sLin;\n let gLin = -1.2684380046 * lLin + 2.6097574011 * mLin - 0.3413193965 * sLin;\n let bLin = -0.0041960863 * lLin - 0.7034186147 * mLin + 1.707614701 * sLin;\n\n if (clampLinear) {\n rLin = clamp01(rLin);\n gLin = clamp01(gLin);\n bLin = clamp01(bLin);\n } else {\n const outOfRange =\n rLin < -0.0001 ||\n rLin > 1.0001 ||\n gLin < -0.0001 ||\n gLin > 1.0001 ||\n bLin < -0.0001 ||\n bLin > 1.0001;\n if (outOfRange) {\n return null;\n }\n }\n\n const r = clamp01(linearChannelToSrgb(rLin));\n const g = clamp01(linearChannelToSrgb(gLin));\n const bValue = clamp01(linearChannelToSrgb(bLin));\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(bValue * 255),\n };\n}\n\nfunction oklchToSrgb(l, c, h) {\n let chroma = c;\n for (let attempt = 0; attempt < 8; attempt += 1) {\n const rgb = tryOklchToSrgb(l, chroma, h);\n if (rgb) {\n return rgb;\n }\n chroma *= 0.9;\n }\n return tryOklchToSrgb(l, clamp01(chroma), h, true) || { r: 0, g: 0, b: 0 };\n}\n\nfunction makeBrandScale(baseHex) {\n const norm = normalizeHex(baseHex);\n if (!norm) return null;\n const baseRgb = hexToRgb(norm);\n if (!baseRgb) return null;\n const baseOklch = rgbToOklch(baseRgb);\n const toneConfig = {\n 100: { lightness: 0.35, chroma: 0.45 },\n 200: { lightness: 0.28, chroma: 0.5 },\n 300: { lightness: 0.22, chroma: 0.6 },\n 400: { lightness: 0.16, chroma: 0.75 },\n 500: { lightness: 0.08, chroma: 0.9 },\n 600: { lightness: 0, chroma: 1, base: true },\n 700: { lightness: -0.08, chroma: 1.05 },\n 800: { lightness: -0.18, chroma: 1.1 },\n 900: { lightness: -0.28, chroma: 1.15 },\n 1000: { lightness: -0.35, chroma: 1.2 },\n };\n const tokens = {};\n\n const adjustLightness = (lightnessValue) => {\n if (lightnessValue === 0) {\n return baseOklch.l;\n }\n if (lightnessValue > 0) {\n return clamp01(baseOklch.l + lightnessValue * (1 - baseOklch.l));\n }\n return clamp01(baseOklch.l * (1 + lightnessValue));\n };\n\n const adjustChroma = (chromaScale) => {\n if (chromaScale === 1) {\n return baseOklch.c;\n }\n const scaled = baseOklch.c * chromaScale;\n return Math.max(0, Math.min(0.4, scaled));\n };\n\n Object.entries(toneConfig).forEach(([stop, config]) => {\n const tokenName = `--color-brand-${stop}`;\n if (config.base) {\n tokens[tokenName] = norm;\n return;\n }\n const toneL = adjustLightness(config.lightness);\n const toneC = adjustChroma(config.chroma);\n const toneRgb = oklchToSrgb(toneL, toneC, baseOklch.h);\n tokens[tokenName] = rgbToHex(toneRgb);\n });\n return tokens;\n}\n\nconst brandVars = computed(() => makeBrandScale(props.accentColor) ?? {});\nconst brandStyle = computed(() => brandVars.value);\n\nconst accentStackEntry = {\n vars: {},\n enabled: Boolean(props.exposeGlobalAccent),\n};\nglobalAccentStack.push(accentStackEntry);\n\nwatch(\n () => props.exposeGlobalAccent,\n (enabled) => {\n accentStackEntry.enabled = Boolean(enabled);\n applyGlobalAccentFromStack();\n },\n { immediate: true },\n);\n\nwatch(\n brandVars,\n (vars) => {\n if (vars && Object.keys(vars).length > 0) {\n accentStackEntry.vars = { ...vars };\n } else {\n accentStackEntry.vars = {};\n }\n applyGlobalAccentFromStack();\n },\n { immediate: true },\n);\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</script>\n\n<style scoped lang=\"less\">\n.theme-switcher-divider {\n margin: 4px 0;\n}\n</style>\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","themePortalHostKey","useThemePortalTarget","hostRef","inject","fallbackTarget","computed","props","__props","globalAccentStack","appliedGlobalAccentKeys","applyGlobalAccentFromStack","root","key","activeEntry","entry","value","darkModeMedia","prefersReducedMotionMedia","PREFERS_REDUCED_MOTION_QUERY","initialMode","getEffectiveMode","currentMode","ref","theme","portalHost","handleSystemPreferenceChange","watch","syncDarkMode","previousValue","setDocumentDarkModeAttribute","withThemeTransition","onBeforeUnmount","index","accentStackEntry","event","applyTheme","startViewTransition","element","THEME_TRANSITION_DURATION","provide","normalizeHex","hex","h","g","b","hexToRgb","r","rgbToHex","toHex","clamp01","srgbChannelToLinear","channel","linearChannelToSrgb","normalized","rgbToOklch","rNorm","gNorm","bNorm","rLin","gLin","bLin","l","m","s","lRoot","mRoot","sRoot","oklabL","oklabA","oklabB","chroma","hue","tryOklchToSrgb","c","clampLinear","angle","a","lComponent","mComponent","sComponent","lCube","mCube","sCube","lLin","mLin","sLin","bValue","oklchToSrgb","attempt","rgb","makeBrandScale","baseHex","norm","baseRgb","baseOklch","toneConfig","tokens","adjustLightness","lightnessValue","adjustChroma","chromaScale","scaled","stop","config","tokenName","toneL","toneC","toneRgb","brandVars","brandStyle","enabled","vars","_createElementBlock","_renderSlot","_ctx","_createElementVNode","MODE_LABELS","map","option","VALID_MODES","emit","__emit","open","internalMode","_createBlock","_unref","DropdownMenu","$event","_createVNode","DropdownItemGroup","DropdownItemRadio"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gospore/theme",
3
- "version": "1.0.132",
3
+ "version": "1.0.133",
4
4
  "description": "",
5
5
  "author": "Gospore",
6
6
  "type": "module",
@@ -28,14 +28,14 @@
28
28
  "vue": "^3.4.20"
29
29
  },
30
30
  "dependencies": {
31
- "@gospore/dropdown-menu": "^1.0.100",
31
+ "@gospore/dropdown-menu": "^1.0.101",
32
32
  "what-input": "^5.2.12"
33
33
  },
34
34
  "devDependencies": {
35
- "@vitejs/plugin-vue": "^6.0.1",
35
+ "@vitejs/plugin-vue": "^6.0.4",
36
36
  "unplugin-vue-macros": "^2.14.5",
37
- "vite": "^7.1.12"
37
+ "vite": "^7.3.1"
38
38
  },
39
- "gitHead": "bbb833df3768d71bc93c6ec30f2c2862ef66056e",
39
+ "gitHead": "7ed27a611172eeeffdb4c21b78eb6cf13a79fbe6",
40
40
  "types": "./dist/index.d.ts"
41
41
  }