The framework auto-derives dark mode from light source colors using CSS relative color syntax
(oklch(from light clamp(0.65, 0.95−l·0.5, 0.88) c·0.9 h)). Turn this on only
when you need precise per-color dark overrides; auto-derivation is usually good enough.
`,1),xl=F(`
Brand Colors — Light Mode
Pick a color via the HEX input, or switch to Advanced to paste any
CSS color value (oklch, rgb, hsl, var(...), etc). Whatever you save is fed
- straight into the framework as the source of the brand scale.
All --sf-* custom properties declared in the active SLASHED bundle,
+ grouped by category.
`);function ho(e,t){ke(t,!0);const s=ne.inventory?.variables??[],a={color:"Colors",text:"Typography",font:"Typography",leading:"Typography",tracking:"Typography",body:"Typography",heading:"Typography",h1:"Typography",h2:"Typography",h3:"Typography",h4:"Typography",h5:"Typography",h6:"Typography",prose:"Typography",code:"Typography",optical:"Typography",line:"Typography",space:"Spacing",gap:"Spacing",gutter:"Spacing",component:"Spacing",section:"Spacing",flow:"Spacing",safe:"Spacing",header:"Spacing",sticky:"Spacing",size:"Sizing",aspect:"Sizing",ratio:"Sizing",touch:"Sizing",container:"Layout",stack:"Layout",cluster:"Layout",sidebar:"Layout",switcher:"Layout",grid:"Layout",cover:"Layout",frame:"Layout",reel:"Layout",imposter:"Layout",bento:"Layout",box:"Layout",center:"Layout",content:"Layout",breakout:"Layout",divider:"Layout",field:"Layout",border:"Borders",stroke:"Borders",radius:"Radius",shadow:"Shadows",blur:"Effects",opacity:"Effects",gradient:"Effects",mask:"Effects",perspective:"Effects",drop:"Effects",contrast:"Effects",duration:"Motion",ease:"Motion",transition:"Motion",motion:"Motion",animation:"Motion",icon:"Icons",z:"Z-Index",is:"States",current:"States",focus:"Focus",caret:"Focus",scroll:"Scroll",scrollbar:"Scroll",print:"Print",truncate:"Misc"},r=["Colors","Typography","Spacing","Sizing","Layout","Borders","Radius","Shadows","Effects","Motion","Icons","Z-Index","States","Focus","Scroll","Print","Misc"];function n(b){let w=b;w.startsWith("--sf-")&&(w=w.slice(5));const h=w.indexOf("-"),y=h===-1?w:w.slice(0,h);return a[y]||"Misc"}function l(b){const w={};for(const y of b){const S=n(y);w[S]||(w[S]=[]),w[S].push(y)}const h=[];for(const y of r)w[y]?.length&&(w[y].sort(),h.push({category:y,items:w[y]}));for(const y of Object.keys(w))!r.includes(y)&&w[y]?.length&&(w[y].sort(),h.push({category:y,items:w[y]}));return h}const o=l(s);let c=Ne({});function d(b){c[b]=!c[b]}var _=po(),v=f(_),u=f(v),m=p(v,4);ie(m,17,()=>o,({category:b,items:w})=>b,(b,w)=>{let h=()=>i(w).category,y=()=>i(w).items;var S=vo(),$=f(S),R=f($),B=f(R),E=p(R,2),C=f(E),O=p(E,2),L=f(O),T=p($,2);{var D=x=>{var k=uo();ie(k,20,y,P=>P,(P,M)=>{var V=fo(),U=f(V),I=f(U);q(()=>A(I,M)),z(P,V)}),z(x,k)};fe(T,x=>{c[h()]&&x(D)})}q(()=>{Q($,"aria-expanded",c[h()]?"true":"false"),A(B,c[h()]?"▼":"▶"),A(C,h()),A(L,`(${y().length??""})`)}),he("click",$,()=>d(h())),z(b,S)}),q(()=>A(u,`CSS Variables (${s.length??""})`)),z(e,_),Se()}De(["click"]);var _o=F('
'),go=F('
'),mo=F('
'),bo=F('
'),yo=F('
All utility and state classes declared in the active SLASHED bundle.
');function wo(e,t){ke(t,!0);const s=ne.inventory?.sf_classes??[],a=ne.inventory?.is_classes??[];let r=te(!1),n=te(!1);var l=yo(),o=f(l),c=f(o),d=p(o,4),_=f(d),v=f(_),u=f(v),m=p(v,4),b=f(m),w=p(_,2);{var h=L=>{var T=go();ie(T,20,()=>s,D=>D,(D,x)=>{var k=_o(),P=f(k),M=f(P);q(()=>A(M,`.${x??""}`)),z(D,k)}),z(L,T)};fe(w,L=>{i(r)&&L(h)})}var y=p(d,2),S=f(y),$=f(S),R=f($),B=p($,4),E=f(B),C=p(S,2);{var O=L=>{var T=bo();ie(T,20,()=>a,D=>D,(D,x)=>{var k=mo(),P=f(k),M=f(P);q(()=>A(M,`.${x??""}`)),z(D,k)}),z(L,T)};fe(C,L=>{i(n)&&L(O)})}q(()=>{A(c,`Registered Classes (${s.length+a.length})`),Q(_,"aria-expanded",i(r)?"true":"false"),A(u,i(r)?"▼":"▶"),A(b,`(${s.length??""})`),Q(S,"aria-expanded",i(n)?"true":"false"),A(R,i(n)?"▼":"▶"),A(E,`(${a.length??""})`)}),he("click",_,()=>K(r,!i(r))),he("click",S,()=>K(n,!i(n))),z(e,l),Se()}De(["click"]);async function ya(e,t){const{url:s,nonce:a}=ne.rest;if(!s)return console.info("[slashed-admin] (dev) would POST",e,t),{ok:!0,dev:!0};const r=await fetch(s+e,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":a},body:JSON.stringify(t)});if(!r.ok){const n=await r.text();throw new Error(n||`HTTP ${r.status}`)}return r.json()}function wr(e,t){return ya("/tokens",{section:e,values:t})}function xr(e){return ya("/tokens/reset",{section:e})}function xo(e){return ya("/settings",e)}async function ko(){const{url:e,nonce:t}=ne.rest;if(!e)return console.info("[slashed-admin] (dev) would GET /tokens/export"),{schema_version:"1",tokens:{},plugin_settings:{},dev:!0};const s=await fetch(e+"/tokens/export",{credentials:"same-origin",headers:{"X-WP-Nonce":t}});if(!s.ok)throw new Error(await s.text()||`HTTP ${s.status}`);return s.json()}function So(e){return ya("/tokens/import",e)}var Eo=F('Saved'),jo=F(''),To=F(`
Bundle Info
The SLASHED CSS bundle is loaded automatically by the plugin. The inventory
is parsed from whichever bundle is active (essential / optimal / full) and
- drives the variable pickers, class autocomplete, and color palette in Bricks.
Variables registered
Classes registered
Plugin Settings
Choose which SLASHED CSS bundle to load on the frontend and in the Bricks editor canvas.
Override the HTML root font-size. Use this if Bricks forces a font-size you don't want.
`);function Co(e,t){xe(t,!0);let s=te(Ne(re.pluginSettings?.css_bundle??"optimal")),a=te(Ne(re.pluginSettings?.html_font_size??"")),r=te(!1),n=te(!1),l=te(""),o=null;async function c(){K(r,!0),K(n,!1),K(l,"");try{await xo({css_bundle:i(s),html_font_size:i(a)}),K(n,!0),o&&clearTimeout(o),o=setTimeout(()=>{K(n,!1),o=null},3e3)}catch(V){K(l,V.message||"Save failed",!0)}finally{K(r,!1)}}var d=To(),_=p(f(d),4),v=p(f(_),2),u=f(v),m=p(v,4),b=f(m),w=p(_,4),h=p(f(w),2),y=f(h);y.value=y.__value="essential";var S=p(y);S.value=S.__value="optimal";var C=p(S);C.value=C.__value="full";var R=p(w,2),B=p(f(R),2),E=f(B);E.value=E.__value="";var $=p(E);$.value=$.__value="100";var O=p($);O.value=O.__value="62.5";var L=p(R,2),T=f(L),D=f(T),x=p(T,2);{var k=V=>{var U=Eo();z(V,U)};fe(x,V=>{i(n)&&V(k)})}var P=p(x,2);{var M=V=>{var U=jo(),I=f(U);q(()=>A(I,i(l))),z(V,U)};fe(P,V=>{i(l)&&V(M)})}q(()=>{A(u,re.inventory?.variables?.length??0),A(b,(re.inventory?.sf_classes?.length??0)+(re.inventory?.is_classes?.length??0)),T.disabled=i(r),A(D,i(r)?"Saving...":"Save Settings")}),ia(h,()=>i(s),V=>K(s,V)),ia(B,()=>i(a),V=>K(a,V)),he("click",T,c),z(e,d),ke()}De(["click"]);const xr=22.5,$o=95;function xn(e,t){if(e<=0||t<=0)return null;const s=$o-xr,a=(t-e)/s,r=parseFloat(a.toFixed(6)),n=parseFloat(e.toFixed(4)),l=parseFloat(t.toFixed(4));return`clamp(${n}rem, calc(${r} * (100vw - ${xr}rem) + ${n}rem), ${l}rem)`}function kr(e){const t=parseFloat(e);if(isNaN(t))return"0";let s=t.toFixed(6).replace(/0+$/,"").replace(/\.$/,"");return s===""?"0":s}function je(e){return e!=null&&e!==""}function zo(e){const t=[],s=["primary","secondary","tertiary","action","neutral","base"];for(const n of s){const l=`brand_${n}`;je(e[l])&&t.push(`--sf-color-${n}-light: ${e[l]};`)}const a=["success","warning","error","info","danger"];for(const n of a){const l=`status_${n}`;je(e[l])&&t.push(`--sf-color-${n}-light: ${e[l]};`)}if(e.dark_overrides_enabled!=="0"){for(const n of s){const l=`brand_dark_${n}`;je(e[l])&&t.push(`--sf-color-${n}-dark: ${e[l]};`)}for(const n of a){const l=`status_dark_${n}`;je(e[l])&&t.push(`--sf-color-${n}-dark: ${e[l]};`)}}return t}function Ao(e){const t=[],s=["body","heading","mono","display","humanist","geometric","slab"];for(const r of s){const n=`font_${r}`;je(e[n])&&t.push(`--sf-font-${r}: ${e[n]};`)}je(e.text_scale)&&t.push(`--sf-text-scale: ${e.text_scale};`),je(e.text_display_scale)&&t.push(`--sf-text-display-scale: ${e.text_display_scale};`);const a=["2xs","xs","s","m","l","xl","2xl","3xl","4xl","display-s","display-m","display-l"];for(const r of a){const n=`size_${r}_min`,l=`size_${r}_max`,o=e[n],c=e[l];if(je(o)&&je(c)){const d=xn(parseFloat(o),parseFloat(c));d&&t.push(`--sf-text-${r}: ${d};`)}}return t}function Fo(e){const t=[];je(e.space_scale)&&t.push(`--sf-space-scale: ${e.space_scale};`);const s=["2xs","xs","s","m","l","xl","2xl","3xl","4xl"];for(const r of s){const n=e[`space_${r}_min`],l=e[`space_${r}_max`];if(je(n)&&je(l)){const o=xn(parseFloat(n),parseFloat(l));o&&t.push(`--sf-space-${r}: calc(${o} * var(--sf-space-scale));`)}}const a={gutter:"--sf-space-gutter",gap:"--sf-gap",content_gap:"--sf-content-gap",component_pad:"--sf-component-pad",section_pad:"--sf-section-pad"};for(const[r,n]of Object.entries(a))je(e[r])&&t.push(`${n}: ${e[r]};`);return t}function Ro(e){const t=[];return je(e.radius_scale)&&t.push(`--sf-radius-scale: ${e.radius_scale};`),t}function Mo(e){const t=[];return je(e.shadow_strength)&&t.push(`--sf-shadow-strength: calc(${e.shadow_strength} + var(--sf-is-dark) * 0.17);`),je(e.glow_color)&&t.push(`--sf-shadow-glow-color: ${e.glow_color};`),t}function Oo(e){const t=[];je(e.motion_scale)&&t.push(`--sf-motion-scale: ${e.motion_scale};`);const s=["instant","fast","normal","slow","slower"];for(const a of s){const r=`duration_${a}`;je(e[r])&&t.push(`--sf-duration-${a}: calc(${e[r]}ms * var(--sf-motion-scale));`)}return t}function Do(e){const t=[],s=["below","base","raised","low","mid","high","top","max"];for(const a of s)je(e[a])&&t.push(`--sf-z-${a}: ${parseInt(e[a],10)};`);return t}function Po(e){const t=[],s={contrast_bias:"--sf-contrast-bias",contrast_threshold:"--sf-contrast-threshold",opacity_disabled:"--sf-opacity-disabled"};for(const[r,n]of Object.entries(s))je(e[r])&&t.push(`${n}: ${kr(e[r])};`);const a={focus_ring_width:"--sf-focus-ring-width",focus_ring_offset:"--sf-focus-ring-offset"};for(const[r,n]of Object.entries(a))je(e[r])&&t.push(`${n}: ${kr(e[r])}px;`);return je(e.focus_ring_style)&&["solid","dashed","dotted","double","none"].includes(e.focus_ring_style)&&t.push(`--sf-focus-ring-style: ${e.focus_ring_style};`),t}function sr(e){const t=[];if(e.colors&&typeof e.colors=="object"&&t.push(...zo(e.colors)),e.typography&&typeof e.typography=="object"&&t.push(...Ao(e.typography)),e.spacing&&typeof e.spacing=="object"&&t.push(...Fo(e.spacing)),e.radius&&typeof e.radius=="object"&&t.push(...Ro(e.radius)),e.shadows&&typeof e.shadows=="object"&&t.push(...Mo(e.shadows)),e.motion&&typeof e.motion=="object"&&t.push(...Oo(e.motion)),e.zindex&&typeof e.zindex=="object"&&t.push(...Do(e.zindex)),e.contrast&&typeof e.contrast=="object"&&t.push(...Po(e.contrast)),t.length===0)return"";let s=`@layer slashed.overrides {
+ drives the variable pickers, class autocomplete, and color palette in Bricks.
Variables registered
Classes registered
Plugin Settings
Choose which SLASHED CSS bundle to load on the frontend and in the Bricks editor canvas.
Override the HTML root font-size. Use this if Bricks forces a font-size you don't want.
`);function $o(e,t){ke(t,!0);let s=te(Ne(ne.pluginSettings?.css_bundle??"optimal")),a=te(Ne(ne.pluginSettings?.html_font_size??"")),r=te(!1),n=te(!1),l=te(""),o=null;async function c(){K(r,!0),K(n,!1),K(l,"");try{await xo({css_bundle:i(s),html_font_size:i(a)}),K(n,!0),o&&clearTimeout(o),o=setTimeout(()=>{K(n,!1),o=null},3e3)}catch(V){K(l,V.message||"Save failed",!0)}finally{K(r,!1)}}var d=To(),_=p(f(d),4),v=p(f(_),2),u=f(v),m=p(v,4),b=f(m),w=p(_,4),h=p(f(w),2),y=f(h);y.value=y.__value="essential";var S=p(y);S.value=S.__value="optimal";var $=p(S);$.value=$.__value="full";var R=p(w,2),B=p(f(R),2),E=f(B);E.value=E.__value="";var C=p(E);C.value=C.__value="100";var O=p(C);O.value=O.__value="62.5";var L=p(R,2),T=f(L),D=f(T),x=p(T,2);{var k=V=>{var U=Eo();z(V,U)};fe(x,V=>{i(n)&&V(k)})}var P=p(x,2);{var M=V=>{var U=jo(),I=f(U);q(()=>A(I,i(l))),z(V,U)};fe(P,V=>{i(l)&&V(M)})}q(()=>{A(u,ne.inventory?.variables?.length??0),A(b,(ne.inventory?.sf_classes?.length??0)+(ne.inventory?.is_classes?.length??0)),T.disabled=i(r),A(D,i(r)?"Saving...":"Save Settings")}),la(h,()=>i(s),V=>K(s,V)),la(B,()=>i(a),V=>K(a,V)),he("click",T,c),z(e,d),Se()}De(["click"]);const kr=22.5,Co=95;function kn(e,t){if(e<=0||t<=0)return null;const s=Co-kr,a=(t-e)/s,r=parseFloat(a.toFixed(6)),n=parseFloat(e.toFixed(4)),l=parseFloat(t.toFixed(4));return`clamp(${n}rem, calc(${r} * (100vw - ${kr}rem) + ${n}rem), ${l}rem)`}function Sr(e){const t=parseFloat(e);if(isNaN(t))return"0";let s=t.toFixed(6).replace(/0+$/,"").replace(/\.$/,"");return s===""?"0":s}function Te(e){return e!=null&&e!==""}function zo(e){const t=[],s=["primary","secondary","tertiary","action","neutral","base"];for(const n of s){const l=`brand_${n}`;Te(e[l])&&t.push(`--sf-color-${n}-light: ${e[l]};`)}const a=["success","warning","error","info","danger"];for(const n of a){const l=`status_${n}`;Te(e[l])&&t.push(`--sf-color-${n}-light: ${e[l]};`)}if(e.dark_overrides_enabled!=="0"){for(const n of s){const l=`brand_dark_${n}`;Te(e[l])&&t.push(`--sf-color-${n}-dark: ${e[l]};`)}for(const n of a){const l=`status_dark_${n}`;Te(e[l])&&t.push(`--sf-color-${n}-dark: ${e[l]};`)}}return t}function Ao(e){const t=[],s=["body","heading","mono","display","humanist","geometric","slab"];for(const r of s){const n=`font_${r}`;Te(e[n])&&t.push(`--sf-font-${r}: ${e[n]};`)}Te(e.text_scale)&&t.push(`--sf-text-scale: ${e.text_scale};`),Te(e.text_display_scale)&&t.push(`--sf-text-display-scale: ${e.text_display_scale};`);const a=["2xs","xs","s","m","l","xl","2xl","3xl","4xl","display-s","display-m","display-l"];for(const r of a){const n=`size_${r}_min`,l=`size_${r}_max`,o=e[n],c=e[l];if(Te(o)&&Te(c)){const d=kn(parseFloat(o),parseFloat(c));d&&t.push(`--sf-text-${r}: ${d};`)}}return t}function Fo(e){const t=[];Te(e.space_scale)&&t.push(`--sf-space-scale: ${e.space_scale};`);const s=["2xs","xs","s","m","l","xl","2xl","3xl","4xl"];for(const r of s){const n=e[`space_${r}_min`],l=e[`space_${r}_max`];if(Te(n)&&Te(l)){const o=kn(parseFloat(n),parseFloat(l));o&&t.push(`--sf-space-${r}: calc(${o} * var(--sf-space-scale));`)}}const a={gutter:"--sf-space-gutter",gap:"--sf-gap",content_gap:"--sf-content-gap",component_pad:"--sf-component-pad",section_pad:"--sf-section-pad"};for(const[r,n]of Object.entries(a))Te(e[r])&&t.push(`${n}: ${e[r]};`);return t}function Ro(e){const t=[];return Te(e.radius_scale)&&t.push(`--sf-radius-scale: ${e.radius_scale};`),t}function Mo(e){const t=[];return Te(e.shadow_strength)&&t.push(`--sf-shadow-strength: calc(${e.shadow_strength} + var(--sf-is-dark) * 0.17);`),Te(e.glow_color)&&t.push(`--sf-shadow-glow-color: ${e.glow_color};`),t}function Oo(e){const t=[];Te(e.motion_scale)&&t.push(`--sf-motion-scale: ${e.motion_scale};`);const s=["instant","fast","normal","slow","slower"];for(const a of s){const r=`duration_${a}`;Te(e[r])&&t.push(`--sf-duration-${a}: calc(${e[r]}ms * var(--sf-motion-scale));`)}return t}function Do(e){const t=[],s=["below","base","raised","low","mid","high","top","max"];for(const a of s)Te(e[a])&&t.push(`--sf-z-${a}: ${parseInt(e[a],10)};`);return t}function Po(e){const t=[],s={contrast_bias:"--sf-contrast-bias",contrast_threshold:"--sf-contrast-threshold",opacity_disabled:"--sf-opacity-disabled"};for(const[r,n]of Object.entries(s))Te(e[r])&&t.push(`${n}: ${Sr(e[r])};`);const a={focus_ring_width:"--sf-focus-ring-width",focus_ring_offset:"--sf-focus-ring-offset"};for(const[r,n]of Object.entries(a))Te(e[r])&&t.push(`${n}: ${Sr(e[r])}px;`);return Te(e.focus_ring_style)&&["solid","dashed","dotted","double","none"].includes(e.focus_ring_style)&&t.push(`--sf-focus-ring-style: ${e.focus_ring_style};`),t}function ar(e){const t=[];if(e.colors&&typeof e.colors=="object"&&t.push(...zo(e.colors)),e.typography&&typeof e.typography=="object"&&t.push(...Ao(e.typography)),e.spacing&&typeof e.spacing=="object"&&t.push(...Fo(e.spacing)),e.radius&&typeof e.radius=="object"&&t.push(...Ro(e.radius)),e.shadows&&typeof e.shadows=="object"&&t.push(...Mo(e.shadows)),e.motion&&typeof e.motion=="object"&&t.push(...Oo(e.motion)),e.zindex&&typeof e.zindex=="object"&&t.push(...Do(e.zindex)),e.contrast&&typeof e.contrast=="object"&&t.push(...Po(e.contrast)),t.length===0)return"";let s=`@layer slashed.overrides {
:root {
`;for(const a of t)s+=` ${a}
`;return s+=` }
@@ -29,7 +29,7 @@ var Sn=Object.defineProperty;var ar=e=>{throw TypeError(e)};var En=(e,t,s)=>t in
import the token file via this tab, then import the Bricks template via Bricks → Templates.
The plugin re-registers all SLASHED classes, variables, and color palettes automatically.
Verify in the Bricks builder canvas that colors, spacing, and fonts match.
If something looks off, check the browser console for unresolved var() calls —
- this means the CSS bundle isn't loading or the token file wasn't imported yet.
`);function Bo(e,t){xe(t,!0);let s=te(!1),a=te("");const r=j(()=>sr(H)),n=j(()=>i(r).length>0);function l(){if(!i(r))return;const M=new Blob([i(r)],{type:"text/css"}),V=URL.createObjectURL(M),U=document.createElement("a");U.href=V,U.download=`slashed-custom-${new Date().toISOString().slice(0,10)}.css`,U.click(),URL.revokeObjectURL(V)}async function o(){K(s,!0),K(a,"");try{const M=await ko(),V=JSON.stringify(M,null,2),U=new Blob([V],{type:"application/json"}),I=URL.createObjectURL(U),Y=document.createElement("a");Y.href=I,Y.download=`slashed-tokens-${new Date().toISOString().slice(0,10)}.json`,Y.click(),URL.revokeObjectURL(I)}catch(M){K(a,M.message||"Export failed",!0)}finally{K(s,!1)}}let c=te(null),d=te(!1),_=te(""),v=te(""),u=te(0);async function m(){const M=i(c)?.files?.[0];if(M){K(_,""),K(v,""),K(d,!0);try{const V=await M.text(),U=JSON.parse(V),I=await So(U),Y=I.settings_imported?" Plugin settings restored.":"";K(_,`Imported ${I.imported} section(s) successfully.${Y}`),K(u,3);const G=setInterval(()=>{K(u,i(u)-1),i(u)<=0&&(clearInterval(G),window.location.reload())},1e3)}catch(V){K(v,V.message||"Import failed",!0)}finally{K(d,!1),i(c)&&(i(c).value="")}}}var b=No(),w=p(f(b),4),h=p(f(w),4),y=f(h),S=f(y),C=p(y,2),R=p(C,2);{var B=M=>{var V=Vo(),U=f(V);q(()=>A(U,i(a))),z(M,V)};fe(R,M=>{i(a)&&M(B)})}var E=p(w,2),$=p(f(E),4),O=f($);ll(O,M=>K(c,M),()=>i(c));var L=p(O,2),T=f(L),D=p($,2);{var x=M=>{var V=Io(),U=f(V),I=p(U);{var Y=G=>{var ae=Wi();q(()=>A(ae,`Reloading in ${i(u)??""}…`)),z(G,ae)};fe(I,G=>{i(u)>0&&G(Y)})}q(()=>A(U,`${i(_)??""} `)),z(M,V)};fe(D,M=>{i(_)&&M(x)})}var k=p(D,2);{var P=M=>{var V=qo(),U=f(V);q(()=>A(U,i(v))),z(M,V)};fe(k,M=>{i(v)&&M(P)})}q(()=>{y.disabled=i(s),A(S,i(s)?"Exporting…":"Download token file (.json)"),C.disabled=!i(n),Q(C,"title",i(n)?"Download overrides as a standalone CSS file":"No overrides set yet"),L.disabled=i(d),A(T,i(d)?"Importing…":"Import token file")}),he("click",y,o),he("click",C,l),he("click",L,m),z(e,b),ke()}De(["click"]);var Ko=F('
Parameters:
'),Ho=F(`
Filter Hooks Reference
These WordPress filter hooks let you customize the SLASHED Bricks integration
+ this means the CSS bundle isn't loading or the token file wasn't imported yet.
`);function Bo(e,t){ke(t,!0);let s=te(!1),a=te("");const r=j(()=>ar(H)),n=j(()=>i(r).length>0);function l(){if(!i(r))return;const M=new Blob([i(r)],{type:"text/css"}),V=URL.createObjectURL(M),U=document.createElement("a");U.href=V,U.download=`slashed-custom-${new Date().toISOString().slice(0,10)}.css`,U.click(),URL.revokeObjectURL(V)}async function o(){K(s,!0),K(a,"");try{const M=await ko(),V=JSON.stringify(M,null,2),U=new Blob([V],{type:"application/json"}),I=URL.createObjectURL(U),Y=document.createElement("a");Y.href=I,Y.download=`slashed-tokens-${new Date().toISOString().slice(0,10)}.json`,Y.click(),URL.revokeObjectURL(I)}catch(M){K(a,M.message||"Export failed",!0)}finally{K(s,!1)}}let c=te(null),d=te(!1),_=te(""),v=te(""),u=te(0);async function m(){const M=i(c)?.files?.[0];if(M){K(_,""),K(v,""),K(d,!0);try{const V=await M.text(),U=JSON.parse(V),I=await So(U),Y=I.settings_imported?" Plugin settings restored.":"";K(_,`Imported ${I.imported} section(s) successfully.${Y}`),K(u,3);const G=setInterval(()=>{K(u,i(u)-1),i(u)<=0&&(clearInterval(G),window.location.reload())},1e3)}catch(V){K(v,V.message||"Import failed",!0)}finally{K(d,!1),i(c)&&(i(c).value="")}}}var b=No(),w=p(f(b),4),h=p(f(w),4),y=f(h),S=f(y),$=p(y,2),R=p($,2);{var B=M=>{var V=Vo(),U=f(V);q(()=>A(U,i(a))),z(M,V)};fe(R,M=>{i(a)&&M(B)})}var E=p(w,2),C=p(f(E),4),O=f(C);ll(O,M=>K(c,M),()=>i(c));var L=p(O,2),T=f(L),D=p(C,2);{var x=M=>{var V=Io(),U=f(V),I=p(U);{var Y=G=>{var ae=Wi();q(()=>A(ae,`Reloading in ${i(u)??""}…`)),z(G,ae)};fe(I,G=>{i(u)>0&&G(Y)})}q(()=>A(U,`${i(_)??""} `)),z(M,V)};fe(D,M=>{i(_)&&M(x)})}var k=p(D,2);{var P=M=>{var V=qo(),U=f(V);q(()=>A(U,i(v))),z(M,V)};fe(k,M=>{i(v)&&M(P)})}q(()=>{y.disabled=i(s),A(S,i(s)?"Exporting…":"Download token file (.json)"),$.disabled=!i(n),Q($,"title",i(n)?"Download overrides as a standalone CSS file":"No overrides set yet"),L.disabled=i(d),A(T,i(d)?"Importing…":"Import token file")}),he("click",y,o),he("click",$,l),he("click",L,m),z(e,b),Se()}De(["click"]);var Ko=F('
Parameters:
'),Ho=F(`
Filter Hooks Reference
These WordPress filter hooks let you customize the SLASHED Bricks integration
from your theme or a mu-plugin. Each hook fires during plugin initialization.
`);function Uo(e){const t=[{name:"slashed_bricks/css_bundle_url",description:"Override which CSS bundle URL to load.",params:"$url (string) - The current CSS bundle URL.",example:`add_filter( 'slashed_bricks/css_bundle_url', function( $url ) {
// Load from a CDN instead.
return 'https://cdn.example.com/slashed/slashed.optimal.css';
@@ -59,7 +59,7 @@ add_filter( 'slashed_bricks/inventory_local_path', function() {
'SLASHED Primary',
'SLASHED Secondary',
] ) );
-} );`}];var s=Ho(),a=p(f(s),4);ne(a,17,()=>t,r=>r.name,(r,n)=>{var l=Ko(),o=f(l),c=f(o),d=f(c),_=p(o,2),v=f(_),u=p(_,2),m=p(f(u),2),b=f(m),w=p(u,2),h=f(w),y=f(h);q(()=>{A(d,i(n).name),A(v,i(n).description),A(b,i(n).params),A(y,i(n).example)}),z(r,l)}),z(e,s)}const Go=[{category:"Colors",description:"Brand, status, semantic, and derived color tokens. Source colors use oklch(); the framework derives light-dark pairs, palettes, and alpha scales automatically.",tokens:[{name:"--sf-color-{brand}-light",description:"Source color for the brand (oklch registered value). Set this to rebrand."},{name:"--sf-color-{brand}-dark",description:"Optional dark-mode override. If set, replaces the auto-derived dark variant for full per-mode control."},{name:"--sf-color-{brand}",description:"Resolved light-dark adaptive color for use in rules."},{name:"--sf-color-{brand}-{50-950}",description:"Palette scale: 50 (lightest) to 950 (darkest) mixed with base/text."},{name:"--sf-color-{brand}-a{5-95}",description:"Alpha scale: 5% to 95% opacity of the brand color."},{name:"--sf-color-{brand}-hover/active/muted/subtle/ghost/lighter/darker/xlight/xdark/superlight/superdark",description:"Semantic aliases for common UI states, mapped to palette steps."},{name:"--sf-color-bg",description:"Page background color, derived from base."},{name:"--sf-color-text",description:"Main body text color, contrast-aware."},{name:"--sf-color-heading",description:"Heading text color, slightly stronger than body text."},{name:"--sf-color-link",description:"Link color, derived from action brand."},{name:"--sf-color-border",description:"Default border color."},{name:"--sf-color-surface",description:"Card/panel surface color (equals base)."},{name:"--sf-color-overlay",description:"Semi-transparent overlay for modals."},{name:"--sf-color-dim",description:"50% black overlay for dimming backgrounds."},{name:"--sf-color-success/warning/error/info/danger",description:"Status feedback colors with -light source, -muted, -strong, -subtle variants."}]},{category:"Typography",description:"Font families, sizes (fluid clamp-based scale), weights, line-heights, letter-spacing, and heading configuration.",tokens:[{name:"--sf-font-body",description:"Body font stack (system-ui default)."},{name:"--sf-font-heading",description:"Heading font stack (defaults to body)."},{name:"--sf-font-mono",description:"Monospace font stack."},{name:"--sf-font-display",description:"Display/hero font (defaults to heading)."},{name:"--sf-font-geometric/humanist/slab",description:"Curated fallback stacks for common typographic personalities."},{name:"--sf-text-{2xs..4xl}",description:"Fluid type scale using clamp(). Sizes: 2xs, xs, s, m, l, xl, 2xl, 3xl, 4xl."},{name:"--sf-text-display-{s,m,l}",description:"Extra-large display/hero sizes."},{name:"--sf-text-scale",description:"Global multiplier for the type scale (default 1)."},{name:"--sf-font-weight-{thin..black}",description:"Named weight tokens: thin(100), extralight(200), light(300), normal(400), medium(500), semibold(600), bold(700), extrabold(800), black(900)."},{name:"--sf-leading-{tight,snug,normal,relaxed}",description:"Line-height presets: 1.1, 1.3, 1.5, 1.625."},{name:"--sf-tracking-{tight,normal,wide,wider,widest}",description:"Letter-spacing presets from -0.025em to 0.1em."},{name:"--sf-h{1-6}-size/font-weight/line-height/letter-spacing",description:"Per-heading-level configuration tokens."},{name:"--sf-body-*",description:"Body text configuration: font-size, font-weight, line-height, color, text-wrap."}]},{category:"Spacing",description:"Fluid spacing scale (clamp-based), gutters, section padding, and component padding.",tokens:[{name:"--sf-space-{2xs..4xl}",description:"Fluid spacing scale. Sizes: none, px, 2xs, xs, s, m, l, xl, 2xl, 3xl, 4xl."},{name:"--sf-space-scale",description:"Global multiplier for all space tokens (default 1)."},{name:"--sf-space-gutter",description:"Page-edge gutter (defaults to space-l)."},{name:"--sf-gap",description:"Default gap for layouts (defaults to space-m)."},{name:"--sf-content-gap",description:"Gap between content elements (defaults to space-s)."},{name:"--sf-section-pad--{s,m,l,xl}",description:"Vertical padding for page sections."},{name:"--sf-component-pad",description:"Internal padding for components (defaults to space-m)."},{name:"--sf-header-height",description:"Expected fixed header height for sticky offset calculations."},{name:"--sf-safe-{top,right,bottom,left}",description:"Safe area insets for notched devices."}]},{category:"Sizing",description:"Component sizes, touch targets, and aspect ratios.",tokens:[{name:"--sf-size-{xs..xl}",description:"Named size tokens: xs(1.5rem), s(2rem), m(2.5rem), l(2.75rem), xl(3.5rem)."},{name:"--sf-touch-target",description:"Minimum interactive element size (defaults to size-l, 2.75rem)."},{name:"--sf-ratio-{square,photo,video,cinema,golden,portrait}",description:"Predefined aspect ratios for frames and containers."},{name:"--sf-icon-{xs..xl}",description:"Icon sizing in em units (0.875em to 3em)."}]},{category:"Layout",description:"Container widths, layout primitive tokens (stack, cluster, grid, sidebar, switcher, bento, cover, frame, reel, imposter).",tokens:[{name:"--sf-container-{narrow,default,prose,wide,full}",description:"Max-width presets for .sf-container."},{name:"--sf-stack-gap",description:"Vertical gap between .sf-stack children."},{name:"--sf-cluster-gap/align/justify",description:"Inline cluster layout tokens."},{name:"--sf-sidebar-width/gap/min-width",description:"Sidebar layout tokens."},{name:"--sf-switcher-threshold/gap",description:"Column-to-stack breakpoint and gap."},{name:"--sf-grid-min/gap",description:"Auto-fill grid minimum item width and gap."},{name:"--sf-bento-cols/gap/row",description:"Dense bento grid configuration."},{name:"--sf-cover-min-height/padding",description:"Full-height cover layout."},{name:"--sf-frame-ratio",description:"Aspect ratio for .sf-frame (defaults to 16/9)."},{name:"--sf-reel-gap/height/item-width",description:"Horizontal scroll strip configuration."},{name:"--sf-imposter-margin",description:"Safety margin for absolute-centered overlays."},{name:"--sf-breakout-width/content-width",description:"Breakout grid track widths."},{name:"--sf-divider-color/style/width",description:"Divider appearance tokens."}]},{category:"Borders",description:"Border widths and styles.",tokens:[{name:"--sf-border-width-{hairline,1,2,3,4}",description:"Border width scale: 0.5px, 1px, 2px, 3px, 4px."},{name:"--sf-border-style/dotted/soft/strong",description:"Border style presets (solid, dotted, dashed, solid)."},{name:"--sf-stroke-{thin,regular,bold,heavy}",description:"Stroke widths for SVG/icon use: 1px, 1.5px, 2px, 3px."}]},{category:"Radius",description:"Border radius scale and special shapes.",tokens:[{name:"--sf-radius-{none,xs,s,m,l,xl,2xl,3xl,4xl,full}",description:"Radius scale from 0 to 9999px (pill)."},{name:"--sf-radius-scale",description:"Global multiplier for all radius tokens (default 1)."},{name:"--sf-radius-pill",description:"Fully rounded (9999px)."},{name:"--sf-radius-outer",description:"Outer radius = inner + padding (for nested rounding)."}]},{category:"Shadows",description:"Box shadows, drop shadows, text shadows, and shadow configuration.",tokens:[{name:"--sf-shadow-{xs,s,m,l,xl,2xl}",description:"Elevation shadow scale, progressively more dramatic."},{name:"--sf-shadow-inner",description:"Inset shadow for recessed elements."},{name:"--sf-shadow-glow",description:"Colored glow effect (uses --sf-shadow-glow-color)."},{name:"--sf-shadow-none",description:"Explicit no-shadow value."},{name:"--sf-shadow-color",description:"Base shadow color (derived from neutral)."},{name:"--sf-shadow-strength",description:"Shadow opacity multiplier (adapts to dark mode)."},{name:"--sf-drop-shadow-{s,m,l}",description:"CSS filter drop-shadow equivalents."},{name:"--sf-text-shadow-{s,m,l,none}",description:"Text shadow presets."}]},{category:"Effects",description:"Blurs, opacities, gradients, masks, and perspective.",tokens:[{name:"--sf-blur-{xs,s,m,l,xl}",description:"Blur radius scale: 4px to 48px."},{name:"--sf-opacity-{0,10,25,50,75,100,disabled}",description:"Named opacity presets."},{name:"--sf-gradient-{brand,primary,secondary,tertiary,surface}",description:"Predefined gradients using brand colors."},{name:"--sf-gradient-fade--{t,b,l,r}",description:"Directional fade-to-background gradients."},{name:"--sf-mask-scrim-start/end",description:"Scroll mask fade depth."},{name:"--sf-perspective-{near,normal,far}",description:"3D perspective presets: 500px, 1000px, 2000px."},{name:"--sf-contrast-bias/threshold",description:"Color contrast tuning for auto text-on-color logic."}]},{category:"Motion",description:"Durations, easing curves, transitions, and animations.",tokens:[{name:"--sf-duration-{none,instant,fast,normal,slow,slower}",description:"Duration scale: 0ms to 600ms (respects --sf-motion-scale)."},{name:"--sf-motion-scale",description:"Global animation speed multiplier (set 0 to disable)."},{name:"--sf-ease-{linear,in,out,in-out,bounce,elastic,overshoot,spring}",description:"Easing function presets."},{name:"--sf-transition-{all,colors,opacity,shadow,transform,fast,slow,enter,exit}",description:"Pre-composed transition shorthands."},{name:"--sf-animation-{fade-in,fade-out,scale-up,scale-down,slide-in-*,float,ping,blink,color-pulse}",description:"Named keyframe animation shorthands."},{name:"--sf-animation-delay-{1-5}",description:"Stagger delays for sequential animations."}]},{category:"Z-Index",description:"Z-index scale for predictable layering.",tokens:[{name:"--sf-z-{below,base,raised,low,mid,high,top,max}",description:"Z-index scale: -1, 0, 1, 10, 100, 500, 900, 9999."}]},{category:"Focus",description:"Focus ring appearance for keyboard navigation.",tokens:[{name:"--sf-focus-ring-width/offset/color/style/shadow",description:"Focus indicator configuration."},{name:"--sf-caret-color",description:"Text input caret color (defaults to action)."}]},{category:"Scroll",description:"Scroll timeline and scrollbar styling.",tokens:[{name:"--sf-scroll-timeline-range-start/end",description:"Scroll-driven animation range."},{name:"--sf-scrollbar-thumb/track",description:"Custom scrollbar colors."}]},{category:"Print",description:"Print stylesheet configuration.",tokens:[{name:"--sf-print-base-size/page-margin/page-size",description:"Print layout tokens: 11pt base, 2cm margins, A4 size."}]}],Wo=[{category:"Layout Primitives",description:"Breakpoint-free, container-query-driven layout components. Each is a single class with per-instance token overrides via inline style.",classes:[{name:".sf-section",description:"Vertical page rhythm with size variants (--s/--m/--l/--xl/--collapse)."},{name:".sf-section-group",description:"Collapses gap between adjacent sections."},{name:".sf-container",description:"Centered max-width wrapper with gutters. Variants: --narrow, --wide, --full, --prose."},{name:".sf-box",description:"Isolated unit with padding and optional border."},{name:".sf-center",description:"Intrinsic centering with max-width. Variant: --intrinsic."},{name:".sf-stack",description:"Vertical flow with consistent gap. Size variants: --2xs to --3xl. Alignment: --center, --end, --stretch."},{name:".sf-cluster",description:"Wrapping inline group. Size variants: --2xs to --xl. Alignment: --center, --end, --between. Wrap: --no-wrap."},{name:".sf-sidebar",description:"Content + side panel that wraps. Variants: --right, --narrow, --wide."},{name:".sf-switcher",description:"N columns above threshold, stacked below. Variants: --no-wrap, --vertical."},{name:".sf-grid",description:"Auto-fill responsive grid. Size variants: --xs to --xl. Variants: --fit, --dense."},{name:".sf-grid-{1,2,3,4,6}",description:"Fixed-column grids, container-responsive."},{name:".sf-grid-{1-2,2-1,1-3,3-1}",description:"Ratio two-column grids."},{name:".sf-bento",description:"Dense free-form grid. Variants: --2, --4, --compact, --tall."},{name:".sf-alternate",description:"Zigzag two-column layout, reverses every other row."},{name:".sf-pancake",description:"Sticky-footer grid: header / main(1fr) / footer."},{name:".sf-content-grid",description:"Breakout layout grid. Children use .sf-breakout or .sf-full-bleed."},{name:".sf-cover",description:"Full-height region with centered content. Variants: --min, --max, --padding-s, --padding-l."},{name:".sf-frame",description:"Aspect-ratio media box. Variants: --square, --portrait, --video, --cinema, --3-2, --4-3, --golden."},{name:".sf-reel",description:"Horizontal scroll strip with optional mask fade."},{name:".sf-imposter",description:"Absolutely-centered overlay. Variants: --fixed, --contain."},{name:".sf-subgrid / .sf-subgrid-rows",description:"Inherit parent grid tracks."},{name:".sf-divider",description:"Token-driven separator. Variant: --vertical."},{name:".sf-icon",description:"Em-based inline icon sizing. Sizes: --xs to --xl. Variant: --boxed."},{name:".sf-prose",description:"Readable long-form text with automatic vertical rhythm."},{name:".sf-not-prose",description:"Reset zone inside .sf-prose for embedded components."}]},{category:"Macros",description:"Recipe classes that answer 'what does this element do/look like?' - composable with layout primitives.",classes:[{name:".sf-flow",description:"Lobotomized owl: consistent gap between consecutive children."},{name:".sf-truncate",description:"Single-line ellipsis overflow."},{name:".sf-line-clamp-{2,3,N}",description:"Multi-line text clamping with ellipsis. -N reads --sf-line-clamp."},{name:".sf-equal-height",description:"Forces flex children to share the tallest child's height."},{name:".sf-aspect",description:"Generic aspect-ratio container (reads --sf-aspect token)."},{name:".sf-scroll-shadow",description:"Top + bottom mask gradient for scrolling containers."},{name:".sf-scroll-snap",description:"Vertical scroll-snap container."},{name:".sf-overflow-fade",description:"End-edge horizontal fade for overflowing inline content."},{name:".sf-no-tap-highlight",description:"Suppresses WebKit/Android tap highlight."},{name:".sf-text-gradient",description:"Gradient text effect using background-clip."},{name:".sf-clickable-parent",description:"Makes an entire card clickable via the first link inside."},{name:".sf-link-external",description:"Adds external link indicator marker."}]},{category:"Surfaces",description:"Color surface utility classes that set background and text color for a brand context.",classes:[{name:".sf-surface--{primary,secondary,tertiary,action,neutral,inverse}",description:"Brand-colored surface with auto-contrast text."},{name:".sf-surface--{success,warning,error,info,danger}",description:"Status-colored surfaces."}]},{category:"Animations",description:"CSS animation utility classes that apply predefined keyframe animations.",classes:[{name:".sf-fade-in / .sf-fade-out",description:"Opacity entrance/exit animations."},{name:".sf-scale-up / .sf-scale-down",description:"Scale entrance/exit animations."},{name:".sf-slide-in-{up,down,left,right}",description:"Directional slide-in entrance animations."},{name:".sf-color-pulse",description:"Continuous color pulse animation."},{name:".sf-entrance--fade / --fade-up / --fade-down / --fade-left / --fade-right / --scale-up",description:"Scroll-triggered entrance animations (scroll-timeline driven)."}]},{category:"State Classes (.is-*)",description:"Runtime state classes toggled by JS or mirrored from ARIA. They live in the slashed.states layer. Always pair with matching ARIA attributes.",classes:[{name:".is-hidden / .is-invisible / .is-visible",description:"Visibility control: removed from layout / hidden but keeps box / visible."},{name:".is-disabled / .is-readonly",description:"Non-interactive states with dimming."},{name:".is-loading / .is-pending / .is-busy",description:"Loading states: spinner replacement / optimistic UI / cursor hint."},{name:".is-skeleton",description:"Placeholder shimmer animation."},{name:".is-active / .is-selected / .is-current / .is-pressed",description:"Selection/activation states."},{name:".is-highlighted",description:"Transient emphasis (e.g. search result highlight)."},{name:".is-open / .is-collapsed / .is-expanded",description:"Disclosure states for modals, drawers, accordions."},{name:".is-valid / .is-invalid",description:"Form field validation results (maps to aria-invalid)."},{name:".is-success / .is-error / .is-warning / .is-info / .is-danger",description:"General feedback states and destructive-action context."},{name:".is-sticky / .is-pinned / .is-fixed / .is-fullscreen",description:"Positioning states."},{name:".is-clipped / .is-scrollable / .is-truncated / .is-resizable",description:"Overflow handling states."},{name:".is-dragging / .is-drop-target / .is-draggable",description:"Drag and drop states."},{name:".is-overlay / .is-focused / .is-clickable / .is-unselectable",description:"Positioning, focus, cursor, and selection states."},{name:".is-empty",description:"Hide element when empty (:empty pseudo-class)."}]}],Yo=[{name:"--sf-is-dark",description:"Numeric flag (0 or 1) indicating dark mode is active. Registered property."},{name:"--sf-lumlocker",description:"Internal luminance lock value for color derivation."},{name:"--sf-color-scheme",description:"CSS color-scheme declaration (light dark)."},{name:"--sf-current-font-weight",description:"Current context font weight (used by strong elements)."},{name:"--sf-link-external-marker",description:"External link arrow character."},{name:"--sf-field-block",description:"Vertical spacing between form fields."},{name:"--sf-field-required-marker",description:"Required field indicator string."}];var Xo=F('
'),Zo=F('
'),Jo=F('
'),Qo=F('MiscTokens that do not fit a single category.
Body and heading fonts update as you adjust typography settings. Colors below
+} );`}];var s=Ho(),a=p(f(s),4);ie(a,17,()=>t,r=>r.name,(r,n)=>{var l=Ko(),o=f(l),c=f(o),d=f(c),_=p(o,2),v=f(_),u=p(_,2),m=p(f(u),2),b=f(m),w=p(u,2),h=f(w),y=f(h);q(()=>{A(d,i(n).name),A(v,i(n).description),A(b,i(n).params),A(y,i(n).example)}),z(r,l)}),z(e,s)}const Go=[{category:"Colors",description:"Brand, status, semantic, and derived color tokens. Source colors use oklch(); the framework derives light-dark pairs, palettes, and alpha scales automatically.",tokens:[{name:"--sf-color-{brand}-light",description:"Source color for the brand (oklch registered value). Set this to rebrand."},{name:"--sf-color-{brand}-dark",description:"Optional dark-mode override. If set, replaces the auto-derived dark variant for full per-mode control."},{name:"--sf-color-{brand}",description:"Resolved light-dark adaptive color for use in rules."},{name:"--sf-color-{brand}-{50-950}",description:"Palette scale: 50 (lightest) to 950 (darkest) mixed with base/text."},{name:"--sf-color-{brand}-a{5-95}",description:"Alpha scale: 5% to 95% opacity of the brand color."},{name:"--sf-color-{brand}-hover/active/muted/subtle/ghost/lighter/darker/xlight/xdark/superlight/superdark",description:"Semantic aliases for common UI states, mapped to palette steps."},{name:"--sf-color-bg",description:"Page background color, derived from base."},{name:"--sf-color-text",description:"Main body text color, contrast-aware."},{name:"--sf-color-heading",description:"Heading text color, slightly stronger than body text."},{name:"--sf-color-link",description:"Link color, derived from action brand."},{name:"--sf-color-border",description:"Default border color."},{name:"--sf-color-surface",description:"Card/panel surface color (equals base)."},{name:"--sf-color-overlay",description:"Semi-transparent overlay for modals."},{name:"--sf-color-dim",description:"50% black overlay for dimming backgrounds."},{name:"--sf-color-success/warning/error/info/danger",description:"Status feedback colors with -light source, -muted, -strong, -subtle variants."}]},{category:"Typography",description:"Font families, sizes (fluid clamp-based scale), weights, line-heights, letter-spacing, and heading configuration.",tokens:[{name:"--sf-font-body",description:"Body font stack (system-ui default)."},{name:"--sf-font-heading",description:"Heading font stack (defaults to body)."},{name:"--sf-font-mono",description:"Monospace font stack."},{name:"--sf-font-display",description:"Display/hero font (defaults to heading)."},{name:"--sf-font-geometric/humanist/slab",description:"Curated fallback stacks for common typographic personalities."},{name:"--sf-text-{2xs..4xl}",description:"Fluid type scale using clamp(). Sizes: 2xs, xs, s, m, l, xl, 2xl, 3xl, 4xl."},{name:"--sf-text-display-{s,m,l}",description:"Extra-large display/hero sizes."},{name:"--sf-text-scale",description:"Global multiplier for the type scale (default 1)."},{name:"--sf-font-weight-{thin..black}",description:"Named weight tokens: thin(100), extralight(200), light(300), normal(400), medium(500), semibold(600), bold(700), extrabold(800), black(900)."},{name:"--sf-leading-{tight,snug,normal,relaxed}",description:"Line-height presets: 1.1, 1.3, 1.5, 1.625."},{name:"--sf-tracking-{tight,normal,wide,wider,widest}",description:"Letter-spacing presets from -0.025em to 0.1em."},{name:"--sf-h{1-6}-size/font-weight/line-height/letter-spacing",description:"Per-heading-level configuration tokens."},{name:"--sf-body-*",description:"Body text configuration: font-size, font-weight, line-height, color, text-wrap."}]},{category:"Spacing",description:"Fluid spacing scale (clamp-based), gutters, section padding, and component padding.",tokens:[{name:"--sf-space-{2xs..4xl}",description:"Fluid spacing scale. Sizes: none, px, 2xs, xs, s, m, l, xl, 2xl, 3xl, 4xl."},{name:"--sf-space-scale",description:"Global multiplier for all space tokens (default 1)."},{name:"--sf-space-gutter",description:"Page-edge gutter (defaults to space-l)."},{name:"--sf-gap",description:"Default gap for layouts (defaults to space-m)."},{name:"--sf-content-gap",description:"Gap between content elements (defaults to space-s)."},{name:"--sf-section-pad--{s,m,l,xl}",description:"Vertical padding for page sections."},{name:"--sf-component-pad",description:"Internal padding for components (defaults to space-m)."},{name:"--sf-header-height",description:"Expected fixed header height for sticky offset calculations."},{name:"--sf-safe-{top,right,bottom,left}",description:"Safe area insets for notched devices."}]},{category:"Sizing",description:"Component sizes, touch targets, and aspect ratios.",tokens:[{name:"--sf-size-{xs..xl}",description:"Named size tokens: xs(1.5rem), s(2rem), m(2.5rem), l(2.75rem), xl(3.5rem)."},{name:"--sf-touch-target",description:"Minimum interactive element size (defaults to size-l, 2.75rem)."},{name:"--sf-ratio-{square,photo,video,cinema,golden,portrait}",description:"Predefined aspect ratios for frames and containers."},{name:"--sf-icon-{xs..xl}",description:"Icon sizing in em units (0.875em to 3em)."}]},{category:"Layout",description:"Container widths, layout primitive tokens (stack, cluster, grid, sidebar, switcher, bento, cover, frame, reel, imposter).",tokens:[{name:"--sf-container-{narrow,default,prose,wide,full}",description:"Max-width presets for .sf-container."},{name:"--sf-stack-gap",description:"Vertical gap between .sf-stack children."},{name:"--sf-cluster-gap/align/justify",description:"Inline cluster layout tokens."},{name:"--sf-sidebar-width/gap/min-width",description:"Sidebar layout tokens."},{name:"--sf-switcher-threshold/gap",description:"Column-to-stack breakpoint and gap."},{name:"--sf-grid-min/gap",description:"Auto-fill grid minimum item width and gap."},{name:"--sf-bento-cols/gap/row",description:"Dense bento grid configuration."},{name:"--sf-cover-min-height/padding",description:"Full-height cover layout."},{name:"--sf-frame-ratio",description:"Aspect ratio for .sf-frame (defaults to 16/9)."},{name:"--sf-reel-gap/height/item-width",description:"Horizontal scroll strip configuration."},{name:"--sf-imposter-margin",description:"Safety margin for absolute-centered overlays."},{name:"--sf-breakout-width/content-width",description:"Breakout grid track widths."},{name:"--sf-divider-color/style/width",description:"Divider appearance tokens."}]},{category:"Borders",description:"Border widths and styles.",tokens:[{name:"--sf-border-width-{hairline,1,2,3,4}",description:"Border width scale: 0.5px, 1px, 2px, 3px, 4px."},{name:"--sf-border-style/dotted/soft/strong",description:"Border style presets (solid, dotted, dashed, solid)."},{name:"--sf-stroke-{thin,regular,bold,heavy}",description:"Stroke widths for SVG/icon use: 1px, 1.5px, 2px, 3px."}]},{category:"Radius",description:"Border radius scale and special shapes.",tokens:[{name:"--sf-radius-{none,xs,s,m,l,xl,2xl,3xl,4xl,full}",description:"Radius scale from 0 to 9999px (pill)."},{name:"--sf-radius-scale",description:"Global multiplier for all radius tokens (default 1)."},{name:"--sf-radius-pill",description:"Fully rounded (9999px)."},{name:"--sf-radius-outer",description:"Outer radius = inner + padding (for nested rounding)."}]},{category:"Shadows",description:"Box shadows, drop shadows, text shadows, and shadow configuration.",tokens:[{name:"--sf-shadow-{xs,s,m,l,xl,2xl}",description:"Elevation shadow scale, progressively more dramatic."},{name:"--sf-shadow-inner",description:"Inset shadow for recessed elements."},{name:"--sf-shadow-glow",description:"Colored glow effect (uses --sf-shadow-glow-color)."},{name:"--sf-shadow-none",description:"Explicit no-shadow value."},{name:"--sf-shadow-color",description:"Base shadow color (derived from neutral)."},{name:"--sf-shadow-strength",description:"Shadow opacity multiplier (adapts to dark mode)."},{name:"--sf-drop-shadow-{s,m,l}",description:"CSS filter drop-shadow equivalents."},{name:"--sf-text-shadow-{s,m,l,none}",description:"Text shadow presets."}]},{category:"Effects",description:"Blurs, opacities, gradients, masks, and perspective.",tokens:[{name:"--sf-blur-{xs,s,m,l,xl}",description:"Blur radius scale: 4px to 48px."},{name:"--sf-opacity-{0,10,25,50,75,100,disabled}",description:"Named opacity presets."},{name:"--sf-gradient-{brand,primary,secondary,tertiary,surface}",description:"Predefined gradients using brand colors."},{name:"--sf-gradient-fade--{t,b,l,r}",description:"Directional fade-to-background gradients."},{name:"--sf-mask-scrim-start/end",description:"Scroll mask fade depth."},{name:"--sf-perspective-{near,normal,far}",description:"3D perspective presets: 500px, 1000px, 2000px."},{name:"--sf-contrast-bias/threshold",description:"Color contrast tuning for auto text-on-color logic."}]},{category:"Motion",description:"Durations, easing curves, transitions, and animations.",tokens:[{name:"--sf-duration-{none,instant,fast,normal,slow,slower}",description:"Duration scale: 0ms to 600ms (respects --sf-motion-scale)."},{name:"--sf-motion-scale",description:"Global animation speed multiplier (set 0 to disable)."},{name:"--sf-ease-{linear,in,out,in-out,bounce,elastic,overshoot,spring}",description:"Easing function presets."},{name:"--sf-transition-{all,colors,opacity,shadow,transform,fast,slow,enter,exit}",description:"Pre-composed transition shorthands."},{name:"--sf-animation-{fade-in,fade-out,scale-up,scale-down,slide-in-*,float,ping,blink,color-pulse}",description:"Named keyframe animation shorthands."},{name:"--sf-animation-delay-{1-5}",description:"Stagger delays for sequential animations."}]},{category:"Z-Index",description:"Z-index scale for predictable layering.",tokens:[{name:"--sf-z-{below,base,raised,low,mid,high,top,max}",description:"Z-index scale: -1, 0, 1, 10, 100, 500, 900, 9999."}]},{category:"Focus",description:"Focus ring appearance for keyboard navigation.",tokens:[{name:"--sf-focus-ring-width/offset/color/style/shadow",description:"Focus indicator configuration."},{name:"--sf-caret-color",description:"Text input caret color (defaults to action)."}]},{category:"Scroll",description:"Scroll timeline and scrollbar styling.",tokens:[{name:"--sf-scroll-timeline-range-start/end",description:"Scroll-driven animation range."},{name:"--sf-scrollbar-thumb/track",description:"Custom scrollbar colors."}]},{category:"Print",description:"Print stylesheet configuration.",tokens:[{name:"--sf-print-base-size/page-margin/page-size",description:"Print layout tokens: 11pt base, 2cm margins, A4 size."}]}],Wo=[{category:"Layout Primitives",description:"Breakpoint-free, container-query-driven layout components. Each is a single class with per-instance token overrides via inline style.",classes:[{name:".sf-section",description:"Vertical page rhythm with size variants (--s/--m/--l/--xl/--collapse)."},{name:".sf-section-group",description:"Collapses gap between adjacent sections."},{name:".sf-container",description:"Centered max-width wrapper with gutters. Variants: --narrow, --wide, --full, --prose."},{name:".sf-box",description:"Isolated unit with padding and optional border."},{name:".sf-center",description:"Intrinsic centering with max-width. Variant: --intrinsic."},{name:".sf-stack",description:"Vertical flow with consistent gap. Size variants: --2xs to --3xl. Alignment: --center, --end, --stretch."},{name:".sf-cluster",description:"Wrapping inline group. Size variants: --2xs to --xl. Alignment: --center, --end, --between. Wrap: --no-wrap."},{name:".sf-sidebar",description:"Content + side panel that wraps. Variants: --right, --narrow, --wide."},{name:".sf-switcher",description:"N columns above threshold, stacked below. Variants: --no-wrap, --vertical."},{name:".sf-grid",description:"Auto-fill responsive grid. Size variants: --xs to --xl. Variants: --fit, --dense."},{name:".sf-grid-{1,2,3,4,6}",description:"Fixed-column grids, container-responsive."},{name:".sf-grid-{1-2,2-1,1-3,3-1}",description:"Ratio two-column grids."},{name:".sf-bento",description:"Dense free-form grid. Variants: --2, --4, --compact, --tall."},{name:".sf-alternate",description:"Zigzag two-column layout, reverses every other row."},{name:".sf-pancake",description:"Sticky-footer grid: header / main(1fr) / footer."},{name:".sf-content-grid",description:"Breakout layout grid. Children use .sf-breakout or .sf-full-bleed."},{name:".sf-cover",description:"Full-height region with centered content. Variants: --min, --max, --padding-s, --padding-l."},{name:".sf-frame",description:"Aspect-ratio media box. Variants: --square, --portrait, --video, --cinema, --3-2, --4-3, --golden."},{name:".sf-reel",description:"Horizontal scroll strip with optional mask fade."},{name:".sf-imposter",description:"Absolutely-centered overlay. Variants: --fixed, --contain."},{name:".sf-subgrid / .sf-subgrid-rows",description:"Inherit parent grid tracks."},{name:".sf-divider",description:"Token-driven separator. Variant: --vertical."},{name:".sf-icon",description:"Em-based inline icon sizing. Sizes: --xs to --xl. Variant: --boxed."},{name:".sf-prose",description:"Readable long-form text with automatic vertical rhythm."},{name:".sf-not-prose",description:"Reset zone inside .sf-prose for embedded components."}]},{category:"Macros",description:"Recipe classes that answer 'what does this element do/look like?' - composable with layout primitives.",classes:[{name:".sf-flow",description:"Lobotomized owl: consistent gap between consecutive children."},{name:".sf-truncate",description:"Single-line ellipsis overflow."},{name:".sf-line-clamp-{2,3,N}",description:"Multi-line text clamping with ellipsis. -N reads --sf-line-clamp."},{name:".sf-equal-height",description:"Forces flex children to share the tallest child's height."},{name:".sf-aspect",description:"Generic aspect-ratio container (reads --sf-aspect token)."},{name:".sf-scroll-shadow",description:"Top + bottom mask gradient for scrolling containers."},{name:".sf-scroll-snap",description:"Vertical scroll-snap container."},{name:".sf-overflow-fade",description:"End-edge horizontal fade for overflowing inline content."},{name:".sf-no-tap-highlight",description:"Suppresses WebKit/Android tap highlight."},{name:".sf-text-gradient",description:"Gradient text effect using background-clip."},{name:".sf-clickable-parent",description:"Makes an entire card clickable via the first link inside."},{name:".sf-link-external",description:"Adds external link indicator marker."}]},{category:"Surfaces",description:"Color surface utility classes that set background and text color for a brand context.",classes:[{name:".sf-surface--{primary,secondary,tertiary,action,neutral,inverse}",description:"Brand-colored surface with auto-contrast text."},{name:".sf-surface--{success,warning,error,info,danger}",description:"Status-colored surfaces."}]},{category:"Animations",description:"CSS animation utility classes that apply predefined keyframe animations.",classes:[{name:".sf-fade-in / .sf-fade-out",description:"Opacity entrance/exit animations."},{name:".sf-scale-up / .sf-scale-down",description:"Scale entrance/exit animations."},{name:".sf-slide-in-{up,down,left,right}",description:"Directional slide-in entrance animations."},{name:".sf-color-pulse",description:"Continuous color pulse animation."},{name:".sf-entrance--fade / --fade-up / --fade-down / --fade-left / --fade-right / --scale-up",description:"Scroll-triggered entrance animations (scroll-timeline driven)."}]},{category:"State Classes (.is-*)",description:"Runtime state classes toggled by JS or mirrored from ARIA. They live in the slashed.states layer. Always pair with matching ARIA attributes.",classes:[{name:".is-hidden / .is-invisible / .is-visible",description:"Visibility control: removed from layout / hidden but keeps box / visible."},{name:".is-disabled / .is-readonly",description:"Non-interactive states with dimming."},{name:".is-loading / .is-pending / .is-busy",description:"Loading states: spinner replacement / optimistic UI / cursor hint."},{name:".is-skeleton",description:"Placeholder shimmer animation."},{name:".is-active / .is-selected / .is-current / .is-pressed",description:"Selection/activation states."},{name:".is-highlighted",description:"Transient emphasis (e.g. search result highlight)."},{name:".is-open / .is-collapsed / .is-expanded",description:"Disclosure states for modals, drawers, accordions."},{name:".is-valid / .is-invalid",description:"Form field validation results (maps to aria-invalid)."},{name:".is-success / .is-error / .is-warning / .is-info / .is-danger",description:"General feedback states and destructive-action context."},{name:".is-sticky / .is-pinned / .is-fixed / .is-fullscreen",description:"Positioning states."},{name:".is-clipped / .is-scrollable / .is-truncated / .is-resizable",description:"Overflow handling states."},{name:".is-dragging / .is-drop-target / .is-draggable",description:"Drag and drop states."},{name:".is-overlay / .is-focused / .is-clickable / .is-unselectable",description:"Positioning, focus, cursor, and selection states."},{name:".is-empty",description:"Hide element when empty (:empty pseudo-class)."}]}],Yo=[{name:"--sf-is-dark",description:"Numeric flag (0 or 1) indicating dark mode is active. Registered property."},{name:"--sf-lumlocker",description:"Internal luminance lock value for color derivation."},{name:"--sf-color-scheme",description:"CSS color-scheme declaration (light dark)."},{name:"--sf-current-font-weight",description:"Current context font weight (used by strong elements)."},{name:"--sf-link-external-marker",description:"External link arrow character."},{name:"--sf-field-block",description:"Vertical spacing between form fields."},{name:"--sf-field-required-marker",description:"Required field indicator string."}];var Xo=F('
'),Zo=F('
'),Jo=F('
'),Qo=F('MiscTokens that do not fit a single category.
The framework auto-derives dark mode from light source colors using CSS relative color syntax
(oklch(from light clamp(0.65, 0.95−l·0.5, 0.88) c·0.9 h)). Turn this on only
- when you need precise per-color dark overrides; auto-derivation is usually good enough.
`,1),xl=F(`
Brand Colors — Light Mode
Pick a color via the HEX input, or switch to Advanced to paste any
+ when you need precise per-color dark overrides; auto-derivation is usually good enough.
`,1),kl=F(`
Brand Colors — Light Mode
Pick a color via the HEX input, or switch to Advanced to paste any
CSS color value (oklch, rgb, hsl, var(...), etc). Whatever you save is fed
- straight into the framework as the source of the brand scale.
All --sf-* custom properties declared in the active SLASHED bundle,
+ grouped by category.
`);function _o(e,t){ke(t,!0);const s=re.inventory?.variables??[],a={color:"Colors",text:"Typography",font:"Typography",leading:"Typography",tracking:"Typography",body:"Typography",heading:"Typography",h1:"Typography",h2:"Typography",h3:"Typography",h4:"Typography",h5:"Typography",h6:"Typography",prose:"Typography",code:"Typography",optical:"Typography",line:"Typography",space:"Spacing",gap:"Spacing",gutter:"Spacing",component:"Spacing",section:"Spacing",flow:"Spacing",safe:"Spacing",header:"Spacing",sticky:"Spacing",size:"Sizing",aspect:"Sizing",ratio:"Sizing",touch:"Sizing",container:"Layout",stack:"Layout",cluster:"Layout",sidebar:"Layout",switcher:"Layout",grid:"Layout",cover:"Layout",frame:"Layout",reel:"Layout",imposter:"Layout",bento:"Layout",box:"Layout",center:"Layout",content:"Layout",breakout:"Layout",divider:"Layout",field:"Layout",border:"Borders",stroke:"Borders",radius:"Radius",shadow:"Shadows",blur:"Effects",opacity:"Effects",gradient:"Effects",mask:"Effects",perspective:"Effects",drop:"Effects",contrast:"Effects",duration:"Motion",ease:"Motion",transition:"Motion",motion:"Motion",animation:"Motion",icon:"Icons",z:"Z-Index",is:"States",current:"States",focus:"Focus",caret:"Focus",scroll:"Scroll",scrollbar:"Scroll",print:"Print",truncate:"Misc"},r=["Colors","Typography","Spacing","Sizing","Layout","Borders","Radius","Shadows","Effects","Motion","Icons","Z-Index","States","Focus","Scroll","Print","Misc"];function n(b){let w=b;w.startsWith("--sf-")&&(w=w.slice(5));const h=w.indexOf("-"),y=h===-1?w:w.slice(0,h);return a[y]||"Misc"}function l(b){const w={};for(const y of b){const S=n(y);w[S]||(w[S]=[]),w[S].push(y)}const h=[];for(const y of r)w[y]?.length&&(w[y].sort(),h.push({category:y,items:w[y]}));for(const y of Object.keys(w))!r.includes(y)&&w[y]?.length&&(w[y].sort(),h.push({category:y,items:w[y]}));return h}const o=l(s);let c=Ne({});function d(b){c[b]=!c[b]}var _=ho(),v=f(_),u=f(v),m=p(v,4);ne(m,17,()=>o,({category:b,items:w})=>b,(b,w)=>{let h=()=>i(w).category,y=()=>i(w).items;var S=po(),$=f(S),R=f($),B=f(R),E=p(R,2),C=f(E),O=p(E,2),L=f(O),T=p($,2);{var D=x=>{var k=vo();ne(k,20,y,P=>P,(P,M)=>{var V=uo(),U=f(V),I=f(U);q(()=>A(I,M)),z(P,V)}),z(x,k)};fe(T,x=>{c[h()]&&x(D)})}q(()=>{Q($,"aria-expanded",c[h()]?"true":"false"),A(B,c[h()]?"▼":"▶"),A(C,h()),A(L,`(${y().length??""})`)}),he("click",$,()=>d(h())),z(b,S)}),q(()=>A(u,`CSS Variables (${s.length??""})`)),z(e,_),Se()}De(["click"]);var go=F('
'),mo=F('
'),bo=F('
'),yo=F('
'),wo=F('
All utility and state classes declared in the active SLASHED bundle.
');function xo(e,t){ke(t,!0);const s=re.inventory?.sf_classes??[],a=re.inventory?.is_classes??[];let r=te(!1),n=te(!1);var l=wo(),o=f(l),c=f(o),d=p(o,4),_=f(d),v=f(_),u=f(v),m=p(v,4),b=f(m),w=p(_,2);{var h=L=>{var T=mo();ne(T,20,()=>s,D=>D,(D,x)=>{var k=go(),P=f(k),M=f(P);q(()=>A(M,`.${x??""}`)),z(D,k)}),z(L,T)};fe(w,L=>{i(r)&&L(h)})}var y=p(d,2),S=f(y),$=f(S),R=f($),B=p($,4),E=f(B),C=p(S,2);{var O=L=>{var T=yo();ne(T,20,()=>a,D=>D,(D,x)=>{var k=bo(),P=f(k),M=f(P);q(()=>A(M,`.${x??""}`)),z(D,k)}),z(L,T)};fe(C,L=>{i(n)&&L(O)})}q(()=>{A(c,`Registered Classes (${s.length+a.length})`),Q(_,"aria-expanded",i(r)?"true":"false"),A(u,i(r)?"▼":"▶"),A(b,`(${s.length??""})`),Q(S,"aria-expanded",i(n)?"true":"false"),A(R,i(n)?"▼":"▶"),A(E,`(${a.length??""})`)}),he("click",_,()=>K(r,!i(r))),he("click",S,()=>K(n,!i(n))),z(e,l),Se()}De(["click"]);async function ya(e,t){const{url:s,nonce:a}=re.rest;if(!s)return console.info("[slashed-admin] (dev) would POST",e,t),{ok:!0,dev:!0};const r=await fetch(s+e,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":a},body:JSON.stringify(t)});if(!r.ok){const n=await r.text();throw new Error(n||`HTTP ${r.status}`)}return r.json()}function xr(e,t){return ya("/tokens",{section:e,values:t})}function kr(e){return ya("/tokens/reset",{section:e})}function ko(e){return ya("/settings",e)}async function So(){const{url:e,nonce:t}=re.rest;if(!e)return console.info("[slashed-admin] (dev) would GET /tokens/export"),{schema_version:"1",tokens:{},plugin_settings:{},dev:!0};const s=await fetch(e+"/tokens/export",{credentials:"same-origin",headers:{"X-WP-Nonce":t}});if(!s.ok)throw new Error(await s.text()||`HTTP ${s.status}`);return s.json()}function Eo(e){return ya("/tokens/import",e)}var jo=F('Saved'),To=F(''),$o=F(`
Bundle Info
The SLASHED CSS bundle is loaded automatically by the plugin. The inventory
is parsed from whichever bundle is active (essential / optimal / full) and
- drives the variable pickers, class autocomplete, and color palette in Bricks.
Variables registered
Classes registered
Plugin Settings
Choose which SLASHED CSS bundle to load on the frontend and in the Bricks editor canvas.
Override the HTML root font-size. Use this if Bricks forces a font-size you don't want.
`);function $o(e,t){ke(t,!0);let s=te(Ne(ne.pluginSettings?.css_bundle??"optimal")),a=te(Ne(ne.pluginSettings?.html_font_size??"")),r=te(!1),n=te(!1),l=te(""),o=null;async function c(){K(r,!0),K(n,!1),K(l,"");try{await xo({css_bundle:i(s),html_font_size:i(a)}),K(n,!0),o&&clearTimeout(o),o=setTimeout(()=>{K(n,!1),o=null},3e3)}catch(V){K(l,V.message||"Save failed",!0)}finally{K(r,!1)}}var d=To(),_=p(f(d),4),v=p(f(_),2),u=f(v),m=p(v,4),b=f(m),w=p(_,4),h=p(f(w),2),y=f(h);y.value=y.__value="essential";var S=p(y);S.value=S.__value="optimal";var $=p(S);$.value=$.__value="full";var R=p(w,2),B=p(f(R),2),E=f(B);E.value=E.__value="";var C=p(E);C.value=C.__value="100";var O=p(C);O.value=O.__value="62.5";var L=p(R,2),T=f(L),D=f(T),x=p(T,2);{var k=V=>{var U=Eo();z(V,U)};fe(x,V=>{i(n)&&V(k)})}var P=p(x,2);{var M=V=>{var U=jo(),I=f(U);q(()=>A(I,i(l))),z(V,U)};fe(P,V=>{i(l)&&V(M)})}q(()=>{A(u,ne.inventory?.variables?.length??0),A(b,(ne.inventory?.sf_classes?.length??0)+(ne.inventory?.is_classes?.length??0)),T.disabled=i(r),A(D,i(r)?"Saving...":"Save Settings")}),la(h,()=>i(s),V=>K(s,V)),la(B,()=>i(a),V=>K(a,V)),he("click",T,c),z(e,d),Se()}De(["click"]);const kr=22.5,Co=95;function kn(e,t){if(e<=0||t<=0)return null;const s=Co-kr,a=(t-e)/s,r=parseFloat(a.toFixed(6)),n=parseFloat(e.toFixed(4)),l=parseFloat(t.toFixed(4));return`clamp(${n}rem, calc(${r} * (100vw - ${kr}rem) + ${n}rem), ${l}rem)`}function Sr(e){const t=parseFloat(e);if(isNaN(t))return"0";let s=t.toFixed(6).replace(/0+$/,"").replace(/\.$/,"");return s===""?"0":s}function Te(e){return e!=null&&e!==""}function zo(e){const t=[],s=["primary","secondary","tertiary","action","neutral","base"];for(const n of s){const l=`brand_${n}`;Te(e[l])&&t.push(`--sf-color-${n}-light: ${e[l]};`)}const a=["success","warning","error","info","danger"];for(const n of a){const l=`status_${n}`;Te(e[l])&&t.push(`--sf-color-${n}-light: ${e[l]};`)}if(e.dark_overrides_enabled!=="0"){for(const n of s){const l=`brand_dark_${n}`;Te(e[l])&&t.push(`--sf-color-${n}-dark: ${e[l]};`)}for(const n of a){const l=`status_dark_${n}`;Te(e[l])&&t.push(`--sf-color-${n}-dark: ${e[l]};`)}}return t}function Ao(e){const t=[],s=["body","heading","mono","display","humanist","geometric","slab"];for(const r of s){const n=`font_${r}`;Te(e[n])&&t.push(`--sf-font-${r}: ${e[n]};`)}Te(e.text_scale)&&t.push(`--sf-text-scale: ${e.text_scale};`),Te(e.text_display_scale)&&t.push(`--sf-text-display-scale: ${e.text_display_scale};`);const a=["2xs","xs","s","m","l","xl","2xl","3xl","4xl","display-s","display-m","display-l"];for(const r of a){const n=`size_${r}_min`,l=`size_${r}_max`,o=e[n],c=e[l];if(Te(o)&&Te(c)){const d=kn(parseFloat(o),parseFloat(c));d&&t.push(`--sf-text-${r}: ${d};`)}}return t}function Fo(e){const t=[];Te(e.space_scale)&&t.push(`--sf-space-scale: ${e.space_scale};`);const s=["2xs","xs","s","m","l","xl","2xl","3xl","4xl"];for(const r of s){const n=e[`space_${r}_min`],l=e[`space_${r}_max`];if(Te(n)&&Te(l)){const o=kn(parseFloat(n),parseFloat(l));o&&t.push(`--sf-space-${r}: calc(${o} * var(--sf-space-scale));`)}}const a={gutter:"--sf-space-gutter",gap:"--sf-gap",content_gap:"--sf-content-gap",component_pad:"--sf-component-pad",section_pad:"--sf-section-pad"};for(const[r,n]of Object.entries(a))Te(e[r])&&t.push(`${n}: ${e[r]};`);return t}function Ro(e){const t=[];return Te(e.radius_scale)&&t.push(`--sf-radius-scale: ${e.radius_scale};`),t}function Mo(e){const t=[];return Te(e.shadow_strength)&&t.push(`--sf-shadow-strength: calc(${e.shadow_strength} + var(--sf-is-dark) * 0.17);`),Te(e.glow_color)&&t.push(`--sf-shadow-glow-color: ${e.glow_color};`),t}function Oo(e){const t=[];Te(e.motion_scale)&&t.push(`--sf-motion-scale: ${e.motion_scale};`);const s=["instant","fast","normal","slow","slower"];for(const a of s){const r=`duration_${a}`;Te(e[r])&&t.push(`--sf-duration-${a}: calc(${e[r]}ms * var(--sf-motion-scale));`)}return t}function Do(e){const t=[],s=["below","base","raised","low","mid","high","top","max"];for(const a of s)Te(e[a])&&t.push(`--sf-z-${a}: ${parseInt(e[a],10)};`);return t}function Po(e){const t=[],s={contrast_bias:"--sf-contrast-bias",contrast_threshold:"--sf-contrast-threshold",opacity_disabled:"--sf-opacity-disabled"};for(const[r,n]of Object.entries(s))Te(e[r])&&t.push(`${n}: ${Sr(e[r])};`);const a={focus_ring_width:"--sf-focus-ring-width",focus_ring_offset:"--sf-focus-ring-offset"};for(const[r,n]of Object.entries(a))Te(e[r])&&t.push(`${n}: ${Sr(e[r])}px;`);return Te(e.focus_ring_style)&&["solid","dashed","dotted","double","none"].includes(e.focus_ring_style)&&t.push(`--sf-focus-ring-style: ${e.focus_ring_style};`),t}function ar(e){const t=[];if(e.colors&&typeof e.colors=="object"&&t.push(...zo(e.colors)),e.typography&&typeof e.typography=="object"&&t.push(...Ao(e.typography)),e.spacing&&typeof e.spacing=="object"&&t.push(...Fo(e.spacing)),e.radius&&typeof e.radius=="object"&&t.push(...Ro(e.radius)),e.shadows&&typeof e.shadows=="object"&&t.push(...Mo(e.shadows)),e.motion&&typeof e.motion=="object"&&t.push(...Oo(e.motion)),e.zindex&&typeof e.zindex=="object"&&t.push(...Do(e.zindex)),e.contrast&&typeof e.contrast=="object"&&t.push(...Po(e.contrast)),t.length===0)return"";let s=`@layer slashed.overrides {
+ drives the variable pickers, class autocomplete, and color palette in Bricks.
Variables registered
Classes registered
Plugin Settings
Choose which SLASHED CSS bundle to load on the frontend and in the Bricks editor canvas.
Override the HTML root font-size. Use this if Bricks forces a font-size you don't want.
`);function Co(e,t){ke(t,!0);let s=te(Ne(re.pluginSettings?.css_bundle??"optimal")),a=te(Ne(re.pluginSettings?.html_font_size??"")),r=te(!1),n=te(!1),l=te(""),o=null;async function c(){K(r,!0),K(n,!1),K(l,"");try{await ko({css_bundle:i(s),html_font_size:i(a)}),K(n,!0),o&&clearTimeout(o),o=setTimeout(()=>{K(n,!1),o=null},3e3)}catch(V){K(l,V.message||"Save failed",!0)}finally{K(r,!1)}}var d=$o(),_=p(f(d),4),v=p(f(_),2),u=f(v),m=p(v,4),b=f(m),w=p(_,4),h=p(f(w),2),y=f(h);y.value=y.__value="essential";var S=p(y);S.value=S.__value="optimal";var $=p(S);$.value=$.__value="full";var R=p(w,2),B=p(f(R),2),E=f(B);E.value=E.__value="";var C=p(E);C.value=C.__value="100";var O=p(C);O.value=O.__value="62.5";var L=p(R,2),T=f(L),D=f(T),x=p(T,2);{var k=V=>{var U=jo();z(V,U)};fe(x,V=>{i(n)&&V(k)})}var P=p(x,2);{var M=V=>{var U=To(),I=f(U);q(()=>A(I,i(l))),z(V,U)};fe(P,V=>{i(l)&&V(M)})}q(()=>{A(u,re.inventory?.variables?.length??0),A(b,(re.inventory?.sf_classes?.length??0)+(re.inventory?.is_classes?.length??0)),T.disabled=i(r),A(D,i(r)?"Saving...":"Save Settings")}),la(h,()=>i(s),V=>K(s,V)),la(B,()=>i(a),V=>K(a,V)),he("click",T,c),z(e,d),Se()}De(["click"]);const Sr=22.5,zo=95;function Sn(e,t){if(e<=0||t<=0)return null;const s=zo-Sr,a=(t-e)/s,r=parseFloat(a.toFixed(6)),n=parseFloat(e.toFixed(4)),l=parseFloat(t.toFixed(4));return`clamp(${n}rem, calc(${r} * (100vw - ${Sr}rem) + ${n}rem), ${l}rem)`}function Er(e){const t=parseFloat(e);if(isNaN(t))return"0";let s=t.toFixed(6).replace(/0+$/,"").replace(/\.$/,"");return s===""?"0":s}function je(e){return e!=null&&e!==""}function Ao(e){const t=[],s=["primary","secondary","tertiary","action","neutral","base"];for(const n of s){const l=`brand_${n}`;je(e[l])&&t.push(`--sf-color-${n}-light: ${e[l]};`)}const a=["success","warning","error","info","danger"];for(const n of a){const l=`status_${n}`;je(e[l])&&t.push(`--sf-color-${n}-light: ${e[l]};`)}if(e.dark_overrides_enabled!=="0"){for(const n of s){const l=`brand_dark_${n}`;je(e[l])&&t.push(`--sf-color-${n}-dark: ${e[l]};`)}for(const n of a){const l=`status_dark_${n}`;je(e[l])&&t.push(`--sf-color-${n}-dark: ${e[l]};`)}}return t}function Fo(e){const t=[],s=["body","heading","mono","display","humanist","geometric","slab"];for(const r of s){const n=`font_${r}`;je(e[n])&&t.push(`--sf-font-${r}: ${e[n]};`)}je(e.text_scale)&&t.push(`--sf-text-scale: ${e.text_scale};`),je(e.text_display_scale)&&t.push(`--sf-text-display-scale: ${e.text_display_scale};`);const a=["2xs","xs","s","m","l","xl","2xl","3xl","4xl","display-s","display-m","display-l"];for(const r of a){const n=`size_${r}_min`,l=`size_${r}_max`,o=e[n],c=e[l];if(je(o)&&je(c)){const d=Sn(parseFloat(o),parseFloat(c));d&&t.push(`--sf-text-${r}: ${d};`)}}return t}function Ro(e){const t=[];je(e.space_scale)&&t.push(`--sf-space-scale: ${e.space_scale};`);const s=["2xs","xs","s","m","l","xl","2xl","3xl","4xl"];for(const r of s){const n=e[`space_${r}_min`],l=e[`space_${r}_max`];if(je(n)&&je(l)){const o=Sn(parseFloat(n),parseFloat(l));o&&t.push(`--sf-space-${r}: calc(${o} * var(--sf-space-scale));`)}}const a={gutter:"--sf-space-gutter",gap:"--sf-gap",content_gap:"--sf-content-gap",component_pad:"--sf-component-pad",section_pad:"--sf-section-pad"};for(const[r,n]of Object.entries(a))je(e[r])&&t.push(`${n}: ${e[r]};`);return t}function Mo(e){const t=[];return je(e.radius_scale)&&t.push(`--sf-radius-scale: ${e.radius_scale};`),t}function Oo(e){const t=[];return je(e.shadow_strength)&&t.push(`--sf-shadow-strength: calc(${e.shadow_strength} + var(--sf-is-dark) * 0.17);`),je(e.glow_color)&&t.push(`--sf-shadow-glow-color: ${e.glow_color};`),t}function Do(e){const t=[];je(e.motion_scale)&&t.push(`--sf-motion-scale: ${e.motion_scale};`);const s=["instant","fast","normal","slow","slower"];for(const a of s){const r=`duration_${a}`;je(e[r])&&t.push(`--sf-duration-${a}: calc(${e[r]}ms * var(--sf-motion-scale));`)}return t}function Po(e){const t=[],s=["below","base","raised","low","mid","high","top","max"];for(const a of s)je(e[a])&&t.push(`--sf-z-${a}: ${parseInt(e[a],10)};`);return t}function Lo(e){const t=[],s={contrast_bias:"--sf-contrast-bias",contrast_threshold:"--sf-contrast-threshold",opacity_disabled:"--sf-opacity-disabled"};for(const[r,n]of Object.entries(s))je(e[r])&&t.push(`${n}: ${Er(e[r])};`);const a={focus_ring_width:"--sf-focus-ring-width",focus_ring_offset:"--sf-focus-ring-offset"};for(const[r,n]of Object.entries(a))je(e[r])&&t.push(`${n}: ${Er(e[r])}px;`);return je(e.focus_ring_style)&&["solid","dashed","dotted","double","none"].includes(e.focus_ring_style)&&t.push(`--sf-focus-ring-style: ${e.focus_ring_style};`),t}function rr(e){const t=[];if(e.colors&&typeof e.colors=="object"&&t.push(...Ao(e.colors)),e.typography&&typeof e.typography=="object"&&t.push(...Fo(e.typography)),e.spacing&&typeof e.spacing=="object"&&t.push(...Ro(e.spacing)),e.radius&&typeof e.radius=="object"&&t.push(...Mo(e.radius)),e.shadows&&typeof e.shadows=="object"&&t.push(...Oo(e.shadows)),e.motion&&typeof e.motion=="object"&&t.push(...Do(e.motion)),e.zindex&&typeof e.zindex=="object"&&t.push(...Po(e.zindex)),e.contrast&&typeof e.contrast=="object"&&t.push(...Lo(e.contrast)),t.length===0)return"";let s=`@layer slashed.overrides {
:root {
`;for(const a of t)s+=` ${a}
`;return s+=` }
-}`,s}function Lo(e){if(!e||typeof e!="object")return!1;for(const t of Object.values(e))if(!(!t||typeof t!="object")){for(const s of Object.values(t))if(typeof s=="object"&&s!==null){for(const a of Object.values(s))if(a!==""&&a!==null&&a!==void 0)return!0}else if(s!==""&&s!==null&&s!==void 0)return!0}return!1}var Vo=F(''),Io=F('
'),qo=F('
'),No=F(`
Export / Import Tokens
Export your current SLASHED token overrides (colors, typography, spacing, etc.) to a .json file and import them on any other WordPress site running this plugin.
+}`,s}function Vo(e){if(!e||typeof e!="object")return!1;for(const t of Object.values(e))if(!(!t||typeof t!="object")){for(const s of Object.values(t))if(typeof s=="object"&&s!==null){for(const a of Object.values(s))if(a!==""&&a!==null&&a!==void 0)return!0}else if(s!==""&&s!==null&&s!==void 0)return!0}return!1}var Io=F(''),qo=F('
'),No=F('
'),Bo=F(`
Export / Import Tokens
Export your current SLASHED token overrides (colors, typography, spacing, etc.) to a .json file and import them on any other WordPress site running this plugin.
This makes Bricks templates fully portable — the template JSON carries structure and
class references; this file carries the brand tokens that drive the visual result.
Export
Downloads a .json file containing all your active token overrides and plugin settings.
Share this file alongside your Bricks template export so the visual result is identical on every site.
Import
Upload a .json file previously exported from this plugin. Each section is validated
@@ -29,8 +29,8 @@ var Sn=Object.defineProperty;var rr=e=>{throw TypeError(e)};var En=(e,t,s)=>t in
import the token file via this tab, then import the Bricks template via Bricks → Templates.
The plugin re-registers all SLASHED classes, variables, and color palettes automatically.
Verify in the Bricks builder canvas that colors, spacing, and fonts match.
If something looks off, check the browser console for unresolved var() calls —
- this means the CSS bundle isn't loading or the token file wasn't imported yet.
`);function Bo(e,t){ke(t,!0);let s=te(!1),a=te("");const r=j(()=>ar(H)),n=j(()=>i(r).length>0);function l(){if(!i(r))return;const M=new Blob([i(r)],{type:"text/css"}),V=URL.createObjectURL(M),U=document.createElement("a");U.href=V,U.download=`slashed-custom-${new Date().toISOString().slice(0,10)}.css`,U.click(),URL.revokeObjectURL(V)}async function o(){K(s,!0),K(a,"");try{const M=await ko(),V=JSON.stringify(M,null,2),U=new Blob([V],{type:"application/json"}),I=URL.createObjectURL(U),Y=document.createElement("a");Y.href=I,Y.download=`slashed-tokens-${new Date().toISOString().slice(0,10)}.json`,Y.click(),URL.revokeObjectURL(I)}catch(M){K(a,M.message||"Export failed",!0)}finally{K(s,!1)}}let c=te(null),d=te(!1),_=te(""),v=te(""),u=te(0);async function m(){const M=i(c)?.files?.[0];if(M){K(_,""),K(v,""),K(d,!0);try{const V=await M.text(),U=JSON.parse(V),I=await So(U),Y=I.settings_imported?" Plugin settings restored.":"";K(_,`Imported ${I.imported} section(s) successfully.${Y}`),K(u,3);const G=setInterval(()=>{K(u,i(u)-1),i(u)<=0&&(clearInterval(G),window.location.reload())},1e3)}catch(V){K(v,V.message||"Import failed",!0)}finally{K(d,!1),i(c)&&(i(c).value="")}}}var b=No(),w=p(f(b),4),h=p(f(w),4),y=f(h),S=f(y),$=p(y,2),R=p($,2);{var B=M=>{var V=Vo(),U=f(V);q(()=>A(U,i(a))),z(M,V)};fe(R,M=>{i(a)&&M(B)})}var E=p(w,2),C=p(f(E),4),O=f(C);ll(O,M=>K(c,M),()=>i(c));var L=p(O,2),T=f(L),D=p(C,2);{var x=M=>{var V=Io(),U=f(V),I=p(U);{var Y=G=>{var ae=Wi();q(()=>A(ae,`Reloading in ${i(u)??""}…`)),z(G,ae)};fe(I,G=>{i(u)>0&&G(Y)})}q(()=>A(U,`${i(_)??""} `)),z(M,V)};fe(D,M=>{i(_)&&M(x)})}var k=p(D,2);{var P=M=>{var V=qo(),U=f(V);q(()=>A(U,i(v))),z(M,V)};fe(k,M=>{i(v)&&M(P)})}q(()=>{y.disabled=i(s),A(S,i(s)?"Exporting…":"Download token file (.json)"),$.disabled=!i(n),Q($,"title",i(n)?"Download overrides as a standalone CSS file":"No overrides set yet"),L.disabled=i(d),A(T,i(d)?"Importing…":"Import token file")}),he("click",y,o),he("click",$,l),he("click",L,m),z(e,b),Se()}De(["click"]);var Ko=F('
Parameters:
'),Ho=F(`
Filter Hooks Reference
These WordPress filter hooks let you customize the SLASHED Bricks integration
- from your theme or a mu-plugin. Each hook fires during plugin initialization.
`);function Uo(e){const t=[{name:"slashed_bricks/css_bundle_url",description:"Override which CSS bundle URL to load.",params:"$url (string) - The current CSS bundle URL.",example:`add_filter( 'slashed_bricks/css_bundle_url', function( $url ) {
+ this means the CSS bundle isn't loading or the token file wasn't imported yet.`);function Ko(e,t){ke(t,!0);let s=te(!1),a=te("");const r=j(()=>rr(H)),n=j(()=>i(r).length>0);function l(){if(!i(r))return;const M=new Blob([i(r)],{type:"text/css"}),V=URL.createObjectURL(M),U=document.createElement("a");U.href=V,U.download=`slashed-custom-${new Date().toISOString().slice(0,10)}.css`,U.click(),URL.revokeObjectURL(V)}async function o(){K(s,!0),K(a,"");try{const M=await So(),V=JSON.stringify(M,null,2),U=new Blob([V],{type:"application/json"}),I=URL.createObjectURL(U),Y=document.createElement("a");Y.href=I,Y.download=`slashed-tokens-${new Date().toISOString().slice(0,10)}.json`,Y.click(),URL.revokeObjectURL(I)}catch(M){K(a,M.message||"Export failed",!0)}finally{K(s,!1)}}let c=te(null),d=te(!1),_=te(""),v=te(""),u=te(0);async function m(){const M=i(c)?.files?.[0];if(M){K(_,""),K(v,""),K(d,!0);try{const V=await M.text(),U=JSON.parse(V),I=await Eo(U),Y=I.settings_imported?" Plugin settings restored.":"";K(_,`Imported ${I.imported} section(s) successfully.${Y}`),K(u,3);const G=setInterval(()=>{K(u,i(u)-1),i(u)<=0&&(clearInterval(G),window.location.reload())},1e3)}catch(V){K(v,V.message||"Import failed",!0)}finally{K(d,!1),i(c)&&(i(c).value="")}}}var b=Bo(),w=p(f(b),4),h=p(f(w),4),y=f(h),S=f(y),$=p(y,2),R=p($,2);{var B=M=>{var V=Io(),U=f(V);q(()=>A(U,i(a))),z(M,V)};fe(R,M=>{i(a)&&M(B)})}var E=p(w,2),C=p(f(E),4),O=f(C);ol(O,M=>K(c,M),()=>i(c));var L=p(O,2),T=f(L),D=p(C,2);{var x=M=>{var V=qo(),U=f(V),I=p(U);{var Y=G=>{var ae=Yi();q(()=>A(ae,`Reloading in ${i(u)??""}…`)),z(G,ae)};fe(I,G=>{i(u)>0&&G(Y)})}q(()=>A(U,`${i(_)??""} `)),z(M,V)};fe(D,M=>{i(_)&&M(x)})}var k=p(D,2);{var P=M=>{var V=No(),U=f(V);q(()=>A(U,i(v))),z(M,V)};fe(k,M=>{i(v)&&M(P)})}q(()=>{y.disabled=i(s),A(S,i(s)?"Exporting…":"Download token file (.json)"),$.disabled=!i(n),Q($,"title",i(n)?"Download overrides as a standalone CSS file":"No overrides set yet"),L.disabled=i(d),A(T,i(d)?"Importing…":"Import token file")}),he("click",y,o),he("click",$,l),he("click",L,m),z(e,b),Se()}De(["click"]);var Ho=F('
Parameters:
'),Uo=F(`
Filter Hooks Reference
These WordPress filter hooks let you customize the SLASHED Bricks integration
+ from your theme or a mu-plugin. Each hook fires during plugin initialization.
`);function Go(e){const t=[{name:"slashed_bricks/css_bundle_url",description:"Override which CSS bundle URL to load.",params:"$url (string) - The current CSS bundle URL.",example:`add_filter( 'slashed_bricks/css_bundle_url', function( $url ) {
// Load from a CDN instead.
return 'https://cdn.example.com/slashed/slashed.optimal.css';
} );`},{name:"slashed_bricks/registered_classes",description:"Filter the array of classes before registration with Bricks.",params:"$classes (array) - Array of class definitions with name and category.",example:`add_filter( 'slashed_bricks/registered_classes', function( $classes ) {
@@ -59,7 +59,7 @@ add_filter( 'slashed_bricks/inventory_local_path', function() {
'SLASHED Primary',
'SLASHED Secondary',
] ) );
-} );`}];var s=Ho(),a=p(f(s),4);ie(a,17,()=>t,r=>r.name,(r,n)=>{var l=Ko(),o=f(l),c=f(o),d=f(c),_=p(o,2),v=f(_),u=p(_,2),m=p(f(u),2),b=f(m),w=p(u,2),h=f(w),y=f(h);q(()=>{A(d,i(n).name),A(v,i(n).description),A(b,i(n).params),A(y,i(n).example)}),z(r,l)}),z(e,s)}const Go=[{category:"Colors",description:"Brand, status, semantic, and derived color tokens. Source colors use oklch(); the framework derives light-dark pairs, palettes, and alpha scales automatically.",tokens:[{name:"--sf-color-{brand}-light",description:"Source color for the brand (oklch registered value). Set this to rebrand."},{name:"--sf-color-{brand}-dark",description:"Optional dark-mode override. If set, replaces the auto-derived dark variant for full per-mode control."},{name:"--sf-color-{brand}",description:"Resolved light-dark adaptive color for use in rules."},{name:"--sf-color-{brand}-{50-950}",description:"Palette scale: 50 (lightest) to 950 (darkest) mixed with base/text."},{name:"--sf-color-{brand}-a{5-95}",description:"Alpha scale: 5% to 95% opacity of the brand color."},{name:"--sf-color-{brand}-hover/active/muted/subtle/ghost/lighter/darker/xlight/xdark/superlight/superdark",description:"Semantic aliases for common UI states, mapped to palette steps."},{name:"--sf-color-bg",description:"Page background color, derived from base."},{name:"--sf-color-text",description:"Main body text color, contrast-aware."},{name:"--sf-color-heading",description:"Heading text color, slightly stronger than body text."},{name:"--sf-color-link",description:"Link color, derived from action brand."},{name:"--sf-color-border",description:"Default border color."},{name:"--sf-color-surface",description:"Card/panel surface color (equals base)."},{name:"--sf-color-overlay",description:"Semi-transparent overlay for modals."},{name:"--sf-color-dim",description:"50% black overlay for dimming backgrounds."},{name:"--sf-color-success/warning/error/info/danger",description:"Status feedback colors with -light source, -muted, -strong, -subtle variants."}]},{category:"Typography",description:"Font families, sizes (fluid clamp-based scale), weights, line-heights, letter-spacing, and heading configuration.",tokens:[{name:"--sf-font-body",description:"Body font stack (system-ui default)."},{name:"--sf-font-heading",description:"Heading font stack (defaults to body)."},{name:"--sf-font-mono",description:"Monospace font stack."},{name:"--sf-font-display",description:"Display/hero font (defaults to heading)."},{name:"--sf-font-geometric/humanist/slab",description:"Curated fallback stacks for common typographic personalities."},{name:"--sf-text-{2xs..4xl}",description:"Fluid type scale using clamp(). Sizes: 2xs, xs, s, m, l, xl, 2xl, 3xl, 4xl."},{name:"--sf-text-display-{s,m,l}",description:"Extra-large display/hero sizes."},{name:"--sf-text-scale",description:"Global multiplier for the type scale (default 1)."},{name:"--sf-font-weight-{thin..black}",description:"Named weight tokens: thin(100), extralight(200), light(300), normal(400), medium(500), semibold(600), bold(700), extrabold(800), black(900)."},{name:"--sf-leading-{tight,snug,normal,relaxed}",description:"Line-height presets: 1.1, 1.3, 1.5, 1.625."},{name:"--sf-tracking-{tight,normal,wide,wider,widest}",description:"Letter-spacing presets from -0.025em to 0.1em."},{name:"--sf-h{1-6}-size/font-weight/line-height/letter-spacing",description:"Per-heading-level configuration tokens."},{name:"--sf-body-*",description:"Body text configuration: font-size, font-weight, line-height, color, text-wrap."}]},{category:"Spacing",description:"Fluid spacing scale (clamp-based), gutters, section padding, and component padding.",tokens:[{name:"--sf-space-{2xs..4xl}",description:"Fluid spacing scale. Sizes: none, px, 2xs, xs, s, m, l, xl, 2xl, 3xl, 4xl."},{name:"--sf-space-scale",description:"Global multiplier for all space tokens (default 1)."},{name:"--sf-space-gutter",description:"Page-edge gutter (defaults to space-l)."},{name:"--sf-gap",description:"Default gap for layouts (defaults to space-m)."},{name:"--sf-content-gap",description:"Gap between content elements (defaults to space-s)."},{name:"--sf-section-pad--{s,m,l,xl}",description:"Vertical padding for page sections."},{name:"--sf-component-pad",description:"Internal padding for components (defaults to space-m)."},{name:"--sf-header-height",description:"Expected fixed header height for sticky offset calculations."},{name:"--sf-safe-{top,right,bottom,left}",description:"Safe area insets for notched devices."}]},{category:"Sizing",description:"Component sizes, touch targets, and aspect ratios.",tokens:[{name:"--sf-size-{xs..xl}",description:"Named size tokens: xs(1.5rem), s(2rem), m(2.5rem), l(2.75rem), xl(3.5rem)."},{name:"--sf-touch-target",description:"Minimum interactive element size (defaults to size-l, 2.75rem)."},{name:"--sf-ratio-{square,photo,video,cinema,golden,portrait}",description:"Predefined aspect ratios for frames and containers."},{name:"--sf-icon-{xs..xl}",description:"Icon sizing in em units (0.875em to 3em)."}]},{category:"Layout",description:"Container widths, layout primitive tokens (stack, cluster, grid, sidebar, switcher, bento, cover, frame, reel, imposter).",tokens:[{name:"--sf-container-{narrow,default,prose,wide,full}",description:"Max-width presets for .sf-container."},{name:"--sf-stack-gap",description:"Vertical gap between .sf-stack children."},{name:"--sf-cluster-gap/align/justify",description:"Inline cluster layout tokens."},{name:"--sf-sidebar-width/gap/min-width",description:"Sidebar layout tokens."},{name:"--sf-switcher-threshold/gap",description:"Column-to-stack breakpoint and gap."},{name:"--sf-grid-min/gap",description:"Auto-fill grid minimum item width and gap."},{name:"--sf-bento-cols/gap/row",description:"Dense bento grid configuration."},{name:"--sf-cover-min-height/padding",description:"Full-height cover layout."},{name:"--sf-frame-ratio",description:"Aspect ratio for .sf-frame (defaults to 16/9)."},{name:"--sf-reel-gap/height/item-width",description:"Horizontal scroll strip configuration."},{name:"--sf-imposter-margin",description:"Safety margin for absolute-centered overlays."},{name:"--sf-breakout-width/content-width",description:"Breakout grid track widths."},{name:"--sf-divider-color/style/width",description:"Divider appearance tokens."}]},{category:"Borders",description:"Border widths and styles.",tokens:[{name:"--sf-border-width-{hairline,1,2,3,4}",description:"Border width scale: 0.5px, 1px, 2px, 3px, 4px."},{name:"--sf-border-style/dotted/soft/strong",description:"Border style presets (solid, dotted, dashed, solid)."},{name:"--sf-stroke-{thin,regular,bold,heavy}",description:"Stroke widths for SVG/icon use: 1px, 1.5px, 2px, 3px."}]},{category:"Radius",description:"Border radius scale and special shapes.",tokens:[{name:"--sf-radius-{none,xs,s,m,l,xl,2xl,3xl,4xl,full}",description:"Radius scale from 0 to 9999px (pill)."},{name:"--sf-radius-scale",description:"Global multiplier for all radius tokens (default 1)."},{name:"--sf-radius-pill",description:"Fully rounded (9999px)."},{name:"--sf-radius-outer",description:"Outer radius = inner + padding (for nested rounding)."}]},{category:"Shadows",description:"Box shadows, drop shadows, text shadows, and shadow configuration.",tokens:[{name:"--sf-shadow-{xs,s,m,l,xl,2xl}",description:"Elevation shadow scale, progressively more dramatic."},{name:"--sf-shadow-inner",description:"Inset shadow for recessed elements."},{name:"--sf-shadow-glow",description:"Colored glow effect (uses --sf-shadow-glow-color)."},{name:"--sf-shadow-none",description:"Explicit no-shadow value."},{name:"--sf-shadow-color",description:"Base shadow color (derived from neutral)."},{name:"--sf-shadow-strength",description:"Shadow opacity multiplier (adapts to dark mode)."},{name:"--sf-drop-shadow-{s,m,l}",description:"CSS filter drop-shadow equivalents."},{name:"--sf-text-shadow-{s,m,l,none}",description:"Text shadow presets."}]},{category:"Effects",description:"Blurs, opacities, gradients, masks, and perspective.",tokens:[{name:"--sf-blur-{xs,s,m,l,xl}",description:"Blur radius scale: 4px to 48px."},{name:"--sf-opacity-{0,10,25,50,75,100,disabled}",description:"Named opacity presets."},{name:"--sf-gradient-{brand,primary,secondary,tertiary,surface}",description:"Predefined gradients using brand colors."},{name:"--sf-gradient-fade--{t,b,l,r}",description:"Directional fade-to-background gradients."},{name:"--sf-mask-scrim-start/end",description:"Scroll mask fade depth."},{name:"--sf-perspective-{near,normal,far}",description:"3D perspective presets: 500px, 1000px, 2000px."},{name:"--sf-contrast-bias/threshold",description:"Color contrast tuning for auto text-on-color logic."}]},{category:"Motion",description:"Durations, easing curves, transitions, and animations.",tokens:[{name:"--sf-duration-{none,instant,fast,normal,slow,slower}",description:"Duration scale: 0ms to 600ms (respects --sf-motion-scale)."},{name:"--sf-motion-scale",description:"Global animation speed multiplier (set 0 to disable)."},{name:"--sf-ease-{linear,in,out,in-out,bounce,elastic,overshoot,spring}",description:"Easing function presets."},{name:"--sf-transition-{all,colors,opacity,shadow,transform,fast,slow,enter,exit}",description:"Pre-composed transition shorthands."},{name:"--sf-animation-{fade-in,fade-out,scale-up,scale-down,slide-in-*,float,ping,blink,color-pulse}",description:"Named keyframe animation shorthands."},{name:"--sf-animation-delay-{1-5}",description:"Stagger delays for sequential animations."}]},{category:"Z-Index",description:"Z-index scale for predictable layering.",tokens:[{name:"--sf-z-{below,base,raised,low,mid,high,top,max}",description:"Z-index scale: -1, 0, 1, 10, 100, 500, 900, 9999."}]},{category:"Focus",description:"Focus ring appearance for keyboard navigation.",tokens:[{name:"--sf-focus-ring-width/offset/color/style/shadow",description:"Focus indicator configuration."},{name:"--sf-caret-color",description:"Text input caret color (defaults to action)."}]},{category:"Scroll",description:"Scroll timeline and scrollbar styling.",tokens:[{name:"--sf-scroll-timeline-range-start/end",description:"Scroll-driven animation range."},{name:"--sf-scrollbar-thumb/track",description:"Custom scrollbar colors."}]},{category:"Print",description:"Print stylesheet configuration.",tokens:[{name:"--sf-print-base-size/page-margin/page-size",description:"Print layout tokens: 11pt base, 2cm margins, A4 size."}]}],Wo=[{category:"Layout Primitives",description:"Breakpoint-free, container-query-driven layout components. Each is a single class with per-instance token overrides via inline style.",classes:[{name:".sf-section",description:"Vertical page rhythm with size variants (--s/--m/--l/--xl/--collapse)."},{name:".sf-section-group",description:"Collapses gap between adjacent sections."},{name:".sf-container",description:"Centered max-width wrapper with gutters. Variants: --narrow, --wide, --full, --prose."},{name:".sf-box",description:"Isolated unit with padding and optional border."},{name:".sf-center",description:"Intrinsic centering with max-width. Variant: --intrinsic."},{name:".sf-stack",description:"Vertical flow with consistent gap. Size variants: --2xs to --3xl. Alignment: --center, --end, --stretch."},{name:".sf-cluster",description:"Wrapping inline group. Size variants: --2xs to --xl. Alignment: --center, --end, --between. Wrap: --no-wrap."},{name:".sf-sidebar",description:"Content + side panel that wraps. Variants: --right, --narrow, --wide."},{name:".sf-switcher",description:"N columns above threshold, stacked below. Variants: --no-wrap, --vertical."},{name:".sf-grid",description:"Auto-fill responsive grid. Size variants: --xs to --xl. Variants: --fit, --dense."},{name:".sf-grid-{1,2,3,4,6}",description:"Fixed-column grids, container-responsive."},{name:".sf-grid-{1-2,2-1,1-3,3-1}",description:"Ratio two-column grids."},{name:".sf-bento",description:"Dense free-form grid. Variants: --2, --4, --compact, --tall."},{name:".sf-alternate",description:"Zigzag two-column layout, reverses every other row."},{name:".sf-pancake",description:"Sticky-footer grid: header / main(1fr) / footer."},{name:".sf-content-grid",description:"Breakout layout grid. Children use .sf-breakout or .sf-full-bleed."},{name:".sf-cover",description:"Full-height region with centered content. Variants: --min, --max, --padding-s, --padding-l."},{name:".sf-frame",description:"Aspect-ratio media box. Variants: --square, --portrait, --video, --cinema, --3-2, --4-3, --golden."},{name:".sf-reel",description:"Horizontal scroll strip with optional mask fade."},{name:".sf-imposter",description:"Absolutely-centered overlay. Variants: --fixed, --contain."},{name:".sf-subgrid / .sf-subgrid-rows",description:"Inherit parent grid tracks."},{name:".sf-divider",description:"Token-driven separator. Variant: --vertical."},{name:".sf-icon",description:"Em-based inline icon sizing. Sizes: --xs to --xl. Variant: --boxed."},{name:".sf-prose",description:"Readable long-form text with automatic vertical rhythm."},{name:".sf-not-prose",description:"Reset zone inside .sf-prose for embedded components."}]},{category:"Macros",description:"Recipe classes that answer 'what does this element do/look like?' - composable with layout primitives.",classes:[{name:".sf-flow",description:"Lobotomized owl: consistent gap between consecutive children."},{name:".sf-truncate",description:"Single-line ellipsis overflow."},{name:".sf-line-clamp-{2,3,N}",description:"Multi-line text clamping with ellipsis. -N reads --sf-line-clamp."},{name:".sf-equal-height",description:"Forces flex children to share the tallest child's height."},{name:".sf-aspect",description:"Generic aspect-ratio container (reads --sf-aspect token)."},{name:".sf-scroll-shadow",description:"Top + bottom mask gradient for scrolling containers."},{name:".sf-scroll-snap",description:"Vertical scroll-snap container."},{name:".sf-overflow-fade",description:"End-edge horizontal fade for overflowing inline content."},{name:".sf-no-tap-highlight",description:"Suppresses WebKit/Android tap highlight."},{name:".sf-text-gradient",description:"Gradient text effect using background-clip."},{name:".sf-clickable-parent",description:"Makes an entire card clickable via the first link inside."},{name:".sf-link-external",description:"Adds external link indicator marker."}]},{category:"Surfaces",description:"Color surface utility classes that set background and text color for a brand context.",classes:[{name:".sf-surface--{primary,secondary,tertiary,action,neutral,inverse}",description:"Brand-colored surface with auto-contrast text."},{name:".sf-surface--{success,warning,error,info,danger}",description:"Status-colored surfaces."}]},{category:"Animations",description:"CSS animation utility classes that apply predefined keyframe animations.",classes:[{name:".sf-fade-in / .sf-fade-out",description:"Opacity entrance/exit animations."},{name:".sf-scale-up / .sf-scale-down",description:"Scale entrance/exit animations."},{name:".sf-slide-in-{up,down,left,right}",description:"Directional slide-in entrance animations."},{name:".sf-color-pulse",description:"Continuous color pulse animation."},{name:".sf-entrance--fade / --fade-up / --fade-down / --fade-left / --fade-right / --scale-up",description:"Scroll-triggered entrance animations (scroll-timeline driven)."}]},{category:"State Classes (.is-*)",description:"Runtime state classes toggled by JS or mirrored from ARIA. They live in the slashed.states layer. Always pair with matching ARIA attributes.",classes:[{name:".is-hidden / .is-invisible / .is-visible",description:"Visibility control: removed from layout / hidden but keeps box / visible."},{name:".is-disabled / .is-readonly",description:"Non-interactive states with dimming."},{name:".is-loading / .is-pending / .is-busy",description:"Loading states: spinner replacement / optimistic UI / cursor hint."},{name:".is-skeleton",description:"Placeholder shimmer animation."},{name:".is-active / .is-selected / .is-current / .is-pressed",description:"Selection/activation states."},{name:".is-highlighted",description:"Transient emphasis (e.g. search result highlight)."},{name:".is-open / .is-collapsed / .is-expanded",description:"Disclosure states for modals, drawers, accordions."},{name:".is-valid / .is-invalid",description:"Form field validation results (maps to aria-invalid)."},{name:".is-success / .is-error / .is-warning / .is-info / .is-danger",description:"General feedback states and destructive-action context."},{name:".is-sticky / .is-pinned / .is-fixed / .is-fullscreen",description:"Positioning states."},{name:".is-clipped / .is-scrollable / .is-truncated / .is-resizable",description:"Overflow handling states."},{name:".is-dragging / .is-drop-target / .is-draggable",description:"Drag and drop states."},{name:".is-overlay / .is-focused / .is-clickable / .is-unselectable",description:"Positioning, focus, cursor, and selection states."},{name:".is-empty",description:"Hide element when empty (:empty pseudo-class)."}]}],Yo=[{name:"--sf-is-dark",description:"Numeric flag (0 or 1) indicating dark mode is active. Registered property."},{name:"--sf-lumlocker",description:"Internal luminance lock value for color derivation."},{name:"--sf-color-scheme",description:"CSS color-scheme declaration (light dark)."},{name:"--sf-current-font-weight",description:"Current context font weight (used by strong elements)."},{name:"--sf-link-external-marker",description:"External link arrow character."},{name:"--sf-field-block",description:"Vertical spacing between form fields."},{name:"--sf-field-required-marker",description:"Required field indicator string."}];var Xo=F('
'),Zo=F('
'),Jo=F('
'),Qo=F('MiscTokens that do not fit a single category.
Body and heading fonts update as you adjust typography settings. Colors below
+} );`}];var s=Uo(),a=p(f(s),4);ne(a,17,()=>t,r=>r.name,(r,n)=>{var l=Ho(),o=f(l),c=f(o),d=f(c),_=p(o,2),v=f(_),u=p(_,2),m=p(f(u),2),b=f(m),w=p(u,2),h=f(w),y=f(h);q(()=>{A(d,i(n).name),A(v,i(n).description),A(b,i(n).params),A(y,i(n).example)}),z(r,l)}),z(e,s)}const Wo=[{category:"Colors",description:"Brand, status, semantic, and derived color tokens. Source colors use oklch(); the framework derives light-dark pairs, palettes, and alpha scales automatically.",tokens:[{name:"--sf-color-{brand}-light",description:"Source color for the brand (oklch registered value). Set this to rebrand."},{name:"--sf-color-{brand}-dark",description:"Optional dark-mode override. If set, replaces the auto-derived dark variant for full per-mode control."},{name:"--sf-color-{brand}",description:"Resolved light-dark adaptive color for use in rules."},{name:"--sf-color-{brand}-{50-950}",description:"Palette scale: 50 (lightest) to 950 (darkest) mixed with base/text."},{name:"--sf-color-{brand}-a{5-95}",description:"Alpha scale: 5% to 95% opacity of the brand color."},{name:"--sf-color-{brand}-hover/active/muted/subtle/ghost/lighter/darker/xlight/xdark/superlight/superdark",description:"Semantic aliases for common UI states, mapped to palette steps."},{name:"--sf-color-bg",description:"Page background color, derived from base."},{name:"--sf-color-text",description:"Main body text color, contrast-aware."},{name:"--sf-color-heading",description:"Heading text color, slightly stronger than body text."},{name:"--sf-color-link",description:"Link color, derived from action brand."},{name:"--sf-color-border",description:"Default border color."},{name:"--sf-color-surface",description:"Card/panel surface color (equals base)."},{name:"--sf-color-overlay",description:"Semi-transparent overlay for modals."},{name:"--sf-color-dim",description:"50% black overlay for dimming backgrounds."},{name:"--sf-color-success/warning/error/info/danger",description:"Status feedback colors with -light source, -muted, -strong, -subtle variants."}]},{category:"Typography",description:"Font families, sizes (fluid clamp-based scale), weights, line-heights, letter-spacing, and heading configuration.",tokens:[{name:"--sf-font-body",description:"Body font stack (system-ui default)."},{name:"--sf-font-heading",description:"Heading font stack (defaults to body)."},{name:"--sf-font-mono",description:"Monospace font stack."},{name:"--sf-font-display",description:"Display/hero font (defaults to heading)."},{name:"--sf-font-geometric/humanist/slab",description:"Curated fallback stacks for common typographic personalities."},{name:"--sf-text-{2xs..4xl}",description:"Fluid type scale using clamp(). Sizes: 2xs, xs, s, m, l, xl, 2xl, 3xl, 4xl."},{name:"--sf-text-display-{s,m,l}",description:"Extra-large display/hero sizes."},{name:"--sf-text-scale",description:"Global multiplier for the type scale (default 1)."},{name:"--sf-font-weight-{thin..black}",description:"Named weight tokens: thin(100), extralight(200), light(300), normal(400), medium(500), semibold(600), bold(700), extrabold(800), black(900)."},{name:"--sf-leading-{tight,snug,normal,relaxed}",description:"Line-height presets: 1.1, 1.3, 1.5, 1.625."},{name:"--sf-tracking-{tight,normal,wide,wider,widest}",description:"Letter-spacing presets from -0.025em to 0.1em."},{name:"--sf-h{1-6}-size/font-weight/line-height/letter-spacing",description:"Per-heading-level configuration tokens."},{name:"--sf-body-*",description:"Body text configuration: font-size, font-weight, line-height, color, text-wrap."}]},{category:"Spacing",description:"Fluid spacing scale (clamp-based), gutters, section padding, and component padding.",tokens:[{name:"--sf-space-{2xs..4xl}",description:"Fluid spacing scale. Sizes: none, px, 2xs, xs, s, m, l, xl, 2xl, 3xl, 4xl."},{name:"--sf-space-scale",description:"Global multiplier for all space tokens (default 1)."},{name:"--sf-space-gutter",description:"Page-edge gutter (defaults to space-l)."},{name:"--sf-gap",description:"Default gap for layouts (defaults to space-m)."},{name:"--sf-content-gap",description:"Gap between content elements (defaults to space-s)."},{name:"--sf-section-pad--{s,m,l,xl}",description:"Vertical padding for page sections."},{name:"--sf-component-pad",description:"Internal padding for components (defaults to space-m)."},{name:"--sf-header-height",description:"Expected fixed header height for sticky offset calculations."},{name:"--sf-safe-{top,right,bottom,left}",description:"Safe area insets for notched devices."}]},{category:"Sizing",description:"Component sizes, touch targets, and aspect ratios.",tokens:[{name:"--sf-size-{xs..xl}",description:"Named size tokens: xs(1.5rem), s(2rem), m(2.5rem), l(2.75rem), xl(3.5rem)."},{name:"--sf-touch-target",description:"Minimum interactive element size (defaults to size-l, 2.75rem)."},{name:"--sf-ratio-{square,photo,video,cinema,golden,portrait}",description:"Predefined aspect ratios for frames and containers."},{name:"--sf-icon-{xs..xl}",description:"Icon sizing in em units (0.875em to 3em)."}]},{category:"Layout",description:"Container widths, layout primitive tokens (stack, cluster, grid, sidebar, switcher, bento, cover, frame, reel, imposter).",tokens:[{name:"--sf-container-{narrow,default,prose,wide,full}",description:"Max-width presets for .sf-container."},{name:"--sf-stack-gap",description:"Vertical gap between .sf-stack children."},{name:"--sf-cluster-gap/align/justify",description:"Inline cluster layout tokens."},{name:"--sf-sidebar-width/gap/min-width",description:"Sidebar layout tokens."},{name:"--sf-switcher-threshold/gap",description:"Column-to-stack breakpoint and gap."},{name:"--sf-grid-min/gap",description:"Auto-fill grid minimum item width and gap."},{name:"--sf-bento-cols/gap/row",description:"Dense bento grid configuration."},{name:"--sf-cover-min-height/padding",description:"Full-height cover layout."},{name:"--sf-frame-ratio",description:"Aspect ratio for .sf-frame (defaults to 16/9)."},{name:"--sf-reel-gap/height/item-width",description:"Horizontal scroll strip configuration."},{name:"--sf-imposter-margin",description:"Safety margin for absolute-centered overlays."},{name:"--sf-breakout-width/content-width",description:"Breakout grid track widths."},{name:"--sf-divider-color/style/width",description:"Divider appearance tokens."}]},{category:"Borders",description:"Border widths and styles.",tokens:[{name:"--sf-border-width-{hairline,1,2,3,4}",description:"Border width scale: 0.5px, 1px, 2px, 3px, 4px."},{name:"--sf-border-style/dotted/soft/strong",description:"Border style presets (solid, dotted, dashed, solid)."},{name:"--sf-stroke-{thin,regular,bold,heavy}",description:"Stroke widths for SVG/icon use: 1px, 1.5px, 2px, 3px."}]},{category:"Radius",description:"Border radius scale and special shapes.",tokens:[{name:"--sf-radius-{none,xs,s,m,l,xl,2xl,3xl,4xl,full}",description:"Radius scale from 0 to 9999px (pill)."},{name:"--sf-radius-scale",description:"Global multiplier for all radius tokens (default 1)."},{name:"--sf-radius-pill",description:"Fully rounded (9999px)."},{name:"--sf-radius-outer",description:"Outer radius = inner + padding (for nested rounding)."}]},{category:"Shadows",description:"Box shadows, drop shadows, text shadows, and shadow configuration.",tokens:[{name:"--sf-shadow-{xs,s,m,l,xl,2xl}",description:"Elevation shadow scale, progressively more dramatic."},{name:"--sf-shadow-inner",description:"Inset shadow for recessed elements."},{name:"--sf-shadow-glow",description:"Colored glow effect (uses --sf-shadow-glow-color)."},{name:"--sf-shadow-none",description:"Explicit no-shadow value."},{name:"--sf-shadow-color",description:"Base shadow color (derived from neutral)."},{name:"--sf-shadow-strength",description:"Shadow opacity multiplier (adapts to dark mode)."},{name:"--sf-drop-shadow-{s,m,l}",description:"CSS filter drop-shadow equivalents."},{name:"--sf-text-shadow-{s,m,l,none}",description:"Text shadow presets."}]},{category:"Effects",description:"Blurs, opacities, gradients, masks, and perspective.",tokens:[{name:"--sf-blur-{xs,s,m,l,xl}",description:"Blur radius scale: 4px to 48px."},{name:"--sf-opacity-{0,10,25,50,75,100,disabled}",description:"Named opacity presets."},{name:"--sf-gradient-{brand,primary,secondary,tertiary,surface}",description:"Predefined gradients using brand colors."},{name:"--sf-gradient-fade--{t,b,l,r}",description:"Directional fade-to-background gradients."},{name:"--sf-mask-scrim-start/end",description:"Scroll mask fade depth."},{name:"--sf-perspective-{near,normal,far}",description:"3D perspective presets: 500px, 1000px, 2000px."},{name:"--sf-contrast-bias/threshold",description:"Color contrast tuning for auto text-on-color logic."}]},{category:"Motion",description:"Durations, easing curves, transitions, and animations.",tokens:[{name:"--sf-duration-{none,instant,fast,normal,slow,slower}",description:"Duration scale: 0ms to 600ms (respects --sf-motion-scale)."},{name:"--sf-motion-scale",description:"Global animation speed multiplier (set 0 to disable)."},{name:"--sf-ease-{linear,in,out,in-out,bounce,elastic,overshoot,spring}",description:"Easing function presets."},{name:"--sf-transition-{all,colors,opacity,shadow,transform,fast,slow,enter,exit}",description:"Pre-composed transition shorthands."},{name:"--sf-animation-{fade-in,fade-out,scale-up,scale-down,slide-in-*,float,ping,blink,color-pulse}",description:"Named keyframe animation shorthands."},{name:"--sf-animation-delay-{1-5}",description:"Stagger delays for sequential animations."}]},{category:"Z-Index",description:"Z-index scale for predictable layering.",tokens:[{name:"--sf-z-{below,base,raised,low,mid,high,top,max}",description:"Z-index scale: -1, 0, 1, 10, 100, 500, 900, 9999."}]},{category:"Focus",description:"Focus ring appearance for keyboard navigation.",tokens:[{name:"--sf-focus-ring-width/offset/color/style/shadow",description:"Focus indicator configuration."},{name:"--sf-caret-color",description:"Text input caret color (defaults to action)."}]},{category:"Scroll",description:"Scroll timeline and scrollbar styling.",tokens:[{name:"--sf-scroll-timeline-range-start/end",description:"Scroll-driven animation range."},{name:"--sf-scrollbar-thumb/track",description:"Custom scrollbar colors."}]},{category:"Print",description:"Print stylesheet configuration.",tokens:[{name:"--sf-print-base-size/page-margin/page-size",description:"Print layout tokens: 11pt base, 2cm margins, A4 size."}]}],Yo=[{category:"Layout Primitives",description:"Breakpoint-free, container-query-driven layout components. Each is a single class with per-instance token overrides via inline style.",classes:[{name:".sf-section",description:"Vertical page rhythm with size variants (--s/--m/--l/--xl/--collapse)."},{name:".sf-section-group",description:"Collapses gap between adjacent sections."},{name:".sf-container",description:"Centered max-width wrapper with gutters. Variants: --narrow, --wide, --full, --prose."},{name:".sf-box",description:"Isolated unit with padding and optional border."},{name:".sf-center",description:"Intrinsic centering with max-width. Variant: --intrinsic."},{name:".sf-stack",description:"Vertical flow with consistent gap. Size variants: --2xs to --3xl. Alignment: --center, --end, --stretch."},{name:".sf-cluster",description:"Wrapping inline group. Size variants: --2xs to --xl. Alignment: --center, --end, --between. Wrap: --no-wrap."},{name:".sf-sidebar",description:"Content + side panel that wraps. Variants: --right, --narrow, --wide."},{name:".sf-switcher",description:"N columns above threshold, stacked below. Variants: --no-wrap, --vertical."},{name:".sf-grid",description:"Auto-fill responsive grid. Size variants: --xs to --xl. Variants: --fit, --dense."},{name:".sf-grid-{1,2,3,4,6}",description:"Fixed-column grids, container-responsive."},{name:".sf-grid-{1-2,2-1,1-3,3-1}",description:"Ratio two-column grids."},{name:".sf-bento",description:"Dense free-form grid. Variants: --2, --4, --compact, --tall."},{name:".sf-alternate",description:"Zigzag two-column layout, reverses every other row."},{name:".sf-pancake",description:"Sticky-footer grid: header / main(1fr) / footer."},{name:".sf-content-grid",description:"Breakout layout grid. Children use .sf-breakout or .sf-full-bleed."},{name:".sf-cover",description:"Full-height region with centered content. Variants: --min, --max, --padding-s, --padding-l."},{name:".sf-frame",description:"Aspect-ratio media box. Variants: --square, --portrait, --video, --cinema, --3-2, --4-3, --golden."},{name:".sf-reel",description:"Horizontal scroll strip with optional mask fade."},{name:".sf-imposter",description:"Absolutely-centered overlay. Variants: --fixed, --contain."},{name:".sf-subgrid / .sf-subgrid-rows",description:"Inherit parent grid tracks."},{name:".sf-divider",description:"Token-driven separator. Variant: --vertical."},{name:".sf-icon",description:"Em-based inline icon sizing. Sizes: --xs to --xl. Variant: --boxed."},{name:".sf-prose",description:"Readable long-form text with automatic vertical rhythm."},{name:".sf-not-prose",description:"Reset zone inside .sf-prose for embedded components."}]},{category:"Macros",description:"Recipe classes that answer 'what does this element do/look like?' - composable with layout primitives.",classes:[{name:".sf-flow",description:"Lobotomized owl: consistent gap between consecutive children."},{name:".sf-truncate",description:"Single-line ellipsis overflow."},{name:".sf-line-clamp-{2,3,N}",description:"Multi-line text clamping with ellipsis. -N reads --sf-line-clamp."},{name:".sf-equal-height",description:"Forces flex children to share the tallest child's height."},{name:".sf-aspect",description:"Generic aspect-ratio container (reads --sf-aspect token)."},{name:".sf-scroll-shadow",description:"Top + bottom mask gradient for scrolling containers."},{name:".sf-scroll-snap",description:"Vertical scroll-snap container."},{name:".sf-overflow-fade",description:"End-edge horizontal fade for overflowing inline content."},{name:".sf-no-tap-highlight",description:"Suppresses WebKit/Android tap highlight."},{name:".sf-text-gradient",description:"Gradient text effect using background-clip."},{name:".sf-clickable-parent",description:"Makes an entire card clickable via the first link inside."},{name:".sf-link-external",description:"Adds external link indicator marker."}]},{category:"Surfaces",description:"Color surface utility classes that set background and text color for a brand context.",classes:[{name:".sf-surface--{primary,secondary,tertiary,action,neutral,inverse}",description:"Brand-colored surface with auto-contrast text."},{name:".sf-surface--{success,warning,error,info,danger}",description:"Status-colored surfaces."}]},{category:"Animations",description:"CSS animation utility classes that apply predefined keyframe animations.",classes:[{name:".sf-fade-in / .sf-fade-out",description:"Opacity entrance/exit animations."},{name:".sf-scale-up / .sf-scale-down",description:"Scale entrance/exit animations."},{name:".sf-slide-in-{up,down,left,right}",description:"Directional slide-in entrance animations."},{name:".sf-color-pulse",description:"Continuous color pulse animation."},{name:".sf-entrance--fade / --fade-up / --fade-down / --fade-left / --fade-right / --scale-up",description:"Scroll-triggered entrance animations (scroll-timeline driven)."}]},{category:"State Classes (.is-*)",description:"Runtime state classes toggled by JS or mirrored from ARIA. They live in the slashed.states layer. Always pair with matching ARIA attributes.",classes:[{name:".is-hidden / .is-invisible / .is-visible",description:"Visibility control: removed from layout / hidden but keeps box / visible."},{name:".is-disabled / .is-readonly",description:"Non-interactive states with dimming."},{name:".is-loading / .is-pending / .is-busy",description:"Loading states: spinner replacement / optimistic UI / cursor hint."},{name:".is-skeleton",description:"Placeholder shimmer animation."},{name:".is-active / .is-selected / .is-current / .is-pressed",description:"Selection/activation states."},{name:".is-highlighted",description:"Transient emphasis (e.g. search result highlight)."},{name:".is-open / .is-collapsed / .is-expanded",description:"Disclosure states for modals, drawers, accordions."},{name:".is-valid / .is-invalid",description:"Form field validation results (maps to aria-invalid)."},{name:".is-success / .is-error / .is-warning / .is-info / .is-danger",description:"General feedback states and destructive-action context."},{name:".is-sticky / .is-pinned / .is-fixed / .is-fullscreen",description:"Positioning states."},{name:".is-clipped / .is-scrollable / .is-truncated / .is-resizable",description:"Overflow handling states."},{name:".is-dragging / .is-drop-target / .is-draggable",description:"Drag and drop states."},{name:".is-overlay / .is-focused / .is-clickable / .is-unselectable",description:"Positioning, focus, cursor, and selection states."},{name:".is-empty",description:"Hide element when empty (:empty pseudo-class)."}]}],Xo=[{name:"--sf-is-dark",description:"Numeric flag (0 or 1) indicating dark mode is active. Registered property."},{name:"--sf-lumlocker",description:"Internal luminance lock value for color derivation."},{name:"--sf-color-scheme",description:"CSS color-scheme declaration (light dark)."},{name:"--sf-current-font-weight",description:"Current context font weight (used by strong elements)."},{name:"--sf-link-external-marker",description:"External link arrow character."},{name:"--sf-field-block",description:"Vertical spacing between form fields."},{name:"--sf-field-required-marker",description:"Required field indicator string."}];var Zo=F('
'),Jo=F('
'),Qo=F('
'),ec=F('MiscTokens that do not fit a single category.
The framework auto-derives dark mode from light source colors using CSS relative color syntax
(oklch(from light clamp(0.65, 0.95−l·0.5, 0.88) c·0.9 h)). Turn this on only
- when you need precise per-color dark overrides; auto-derivation is usually good enough.
`,1),kl=F(`
Brand Colors — Light Mode
Pick a color via the HEX input, or switch to Advanced to paste any
+ when you need precise per-color dark overrides; auto-derivation is usually good enough.
`,1),El=F(`
Brand Colors — Light Mode
Pick a color via the HEX input, or switch to Advanced to paste any
CSS color value (oklch, rgb, hsl, var(...), etc). Whatever you save is fed
- straight into the framework as the source of the brand scale.
All --sf-* custom properties declared in the active SLASHED bundle,
+ grouped by category.
`);function mo(e,t){we(t,!0);const s=ne.inventory?.variables??[],a={color:"Colors",text:"Typography",font:"Typography",leading:"Typography",tracking:"Typography",body:"Typography",heading:"Typography",h1:"Typography",h2:"Typography",h3:"Typography",h4:"Typography",h5:"Typography",h6:"Typography",prose:"Typography",code:"Typography",optical:"Typography",line:"Typography",space:"Spacing",gap:"Spacing",gutter:"Spacing",component:"Spacing",section:"Spacing",flow:"Spacing",safe:"Spacing",header:"Spacing",sticky:"Spacing",size:"Sizing",aspect:"Sizing",ratio:"Sizing",touch:"Sizing",container:"Layout",stack:"Layout",cluster:"Layout",sidebar:"Layout",switcher:"Layout",grid:"Layout",cover:"Layout",frame:"Layout",reel:"Layout",imposter:"Layout",bento:"Layout",box:"Layout",center:"Layout",content:"Layout",breakout:"Layout",divider:"Layout",field:"Layout",border:"Borders",stroke:"Borders",radius:"Radius",shadow:"Shadows",blur:"Effects",opacity:"Effects",gradient:"Effects",mask:"Effects",perspective:"Effects",drop:"Effects",contrast:"Effects",duration:"Motion",ease:"Motion",transition:"Motion",motion:"Motion",animation:"Motion",icon:"Icons",z:"Z-Index",is:"States",current:"States",focus:"Focus",caret:"Focus",scroll:"Scroll",scrollbar:"Scroll",print:"Print",truncate:"Misc"},r=["Colors","Typography","Spacing","Sizing","Layout","Borders","Radius","Shadows","Effects","Motion","Icons","Z-Index","States","Focus","Scroll","Print","Misc"];function n(b){let w=b;w.startsWith("--sf-")&&(w=w.slice(5));const _=w.indexOf("-"),y=_===-1?w:w.slice(0,_);return a[y]||"Misc"}function l(b){const w={};for(const y of b){const S=n(y);w[S]||(w[S]=[]),w[S].push(y)}const _=[];for(const y of r)w[y]?.length&&(w[y].sort(),_.push({category:y,items:w[y]}));for(const y of Object.keys(w))!r.includes(y)&&w[y]?.length&&(w[y].sort(),_.push({category:y,items:w[y]}));return _}const c=l(s);let o=qe({});function f(b){o[b]=!o[b]}var h=go(),p=d(h),u=d(p),m=v(p,4);ie(m,17,()=>c,({category:b,items:w})=>b,(b,w)=>{let _=()=>i(w).category,y=()=>i(w).items;var S=_o(),$=d(S),R=d($),N=d(R),E=v(R,2),C=d(E),M=v(E,2),L=d(M),T=v($,2);{var P=x=>{var k=ho();ie(k,20,y,O=>O,(O,D)=>{var V=po(),U=d(V),I=d(U);q(()=>A(I,D)),z(O,V)}),z(x,k)};ue(T,x=>{o[_()]&&x(P)})}q(()=>{Q($,"aria-expanded",o[_()]?"true":"false"),A(N,o[_()]?"▼":"▶"),A(C,_()),A(L,`(${y().length??""})`)}),_e("click",$,()=>f(_())),z(b,S)}),q(()=>A(u,`CSS Variables (${s.length??""})`)),z(e,h),xe()}De(["click"]);var bo=F('
'),yo=F('
'),wo=F('
'),xo=F('
'),ko=F('
All utility and state classes declared in the active SLASHED bundle.
');function So(e,t){we(t,!0);const s=ne.inventory?.sf_classes??[],a=ne.inventory?.is_classes??[];let r=te(!1),n=te(!1);var l=ko(),c=d(l),o=d(c),f=v(c,4),h=d(f),p=d(h),u=d(p),m=v(p,4),b=d(m),w=v(h,2);{var _=L=>{var T=yo();ie(T,20,()=>s,P=>P,(P,x)=>{var k=bo(),O=d(k),D=d(O);q(()=>A(D,`.${x??""}`)),z(P,k)}),z(L,T)};ue(w,L=>{i(r)&&L(_)})}var y=v(f,2),S=d(y),$=d(S),R=d($),N=v($,4),E=d(N),C=v(S,2);{var M=L=>{var T=xo();ie(T,20,()=>a,P=>P,(P,x)=>{var k=wo(),O=d(k),D=d(O);q(()=>A(D,`.${x??""}`)),z(P,k)}),z(L,T)};ue(C,L=>{i(n)&&L(M)})}q(()=>{A(o,`Registered Classes (${s.length+a.length})`),Q(h,"aria-expanded",i(r)?"true":"false"),A(u,i(r)?"▼":"▶"),A(b,`(${s.length??""})`),Q(S,"aria-expanded",i(n)?"true":"false"),A(R,i(n)?"▼":"▶"),A(E,`(${a.length??""})`)}),_e("click",h,()=>K(r,!i(r))),_e("click",S,()=>K(n,!i(n))),z(e,l),xe()}De(["click"]);async function xa(e,t){const{url:s,nonce:a}=ne.rest;if(!s)return console.info("[slashed-admin] (dev) would POST",e,t),{ok:!0,dev:!0};const r=await fetch(s+e,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":a},body:JSON.stringify(t)});if(!r.ok){const n=await r.text();throw new Error(n||`HTTP ${r.status}`)}return r.json()}function Sr(e,t){return xa("/tokens",{section:e,values:t})}function Er(e){return xa("/tokens/reset",{section:e})}function Eo(e){return xa("/settings",e)}async function jo(){const{url:e,nonce:t}=ne.rest;if(!e)return console.info("[slashed-admin] (dev) would GET /tokens/export"),{schema_version:"1",tokens:{},plugin_settings:{},dev:!0};const s=await fetch(e+"/tokens/export",{credentials:"same-origin",headers:{"X-WP-Nonce":t}});if(!s.ok)throw new Error(await s.text()||`HTTP ${s.status}`);return s.json()}function To(e){return xa("/tokens/import",e)}var $o=F('Saved'),Co=F(''),zo=F(`
Bundle Info
The SLASHED CSS bundle is loaded automatically by the plugin. The inventory
is parsed from whichever bundle is active (essential / optimal / full) and
- drives the variable pickers, class autocomplete, and color palette in Bricks.
Variables registered
Classes registered
Plugin Settings
Choose which SLASHED CSS bundle to load on the frontend and in the Bricks editor canvas.
Override the HTML root font-size. Use this if Bricks forces a font-size you don't want.
`);function Co(e,t){ke(t,!0);let s=te(Ne(re.pluginSettings?.css_bundle??"optimal")),a=te(Ne(re.pluginSettings?.html_font_size??"")),r=te(!1),n=te(!1),l=te(""),o=null;async function c(){K(r,!0),K(n,!1),K(l,"");try{await ko({css_bundle:i(s),html_font_size:i(a)}),K(n,!0),o&&clearTimeout(o),o=setTimeout(()=>{K(n,!1),o=null},3e3)}catch(V){K(l,V.message||"Save failed",!0)}finally{K(r,!1)}}var d=$o(),_=p(f(d),4),v=p(f(_),2),u=f(v),m=p(v,4),b=f(m),w=p(_,4),h=p(f(w),2),y=f(h);y.value=y.__value="essential";var S=p(y);S.value=S.__value="optimal";var $=p(S);$.value=$.__value="full";var R=p(w,2),B=p(f(R),2),E=f(B);E.value=E.__value="";var C=p(E);C.value=C.__value="100";var O=p(C);O.value=O.__value="62.5";var L=p(R,2),T=f(L),D=f(T),x=p(T,2);{var k=V=>{var U=jo();z(V,U)};fe(x,V=>{i(n)&&V(k)})}var P=p(x,2);{var M=V=>{var U=To(),I=f(U);q(()=>A(I,i(l))),z(V,U)};fe(P,V=>{i(l)&&V(M)})}q(()=>{A(u,re.inventory?.variables?.length??0),A(b,(re.inventory?.sf_classes?.length??0)+(re.inventory?.is_classes?.length??0)),T.disabled=i(r),A(D,i(r)?"Saving...":"Save Settings")}),la(h,()=>i(s),V=>K(s,V)),la(B,()=>i(a),V=>K(a,V)),he("click",T,c),z(e,d),Se()}De(["click"]);const Sr=22.5,zo=95;function Sn(e,t){if(e<=0||t<=0)return null;const s=zo-Sr,a=(t-e)/s,r=parseFloat(a.toFixed(6)),n=parseFloat(e.toFixed(4)),l=parseFloat(t.toFixed(4));return`clamp(${n}rem, calc(${r} * (100vw - ${Sr}rem) + ${n}rem), ${l}rem)`}function Er(e){const t=parseFloat(e);if(isNaN(t))return"0";let s=t.toFixed(6).replace(/0+$/,"").replace(/\.$/,"");return s===""?"0":s}function je(e){return e!=null&&e!==""}function Ao(e){const t=[],s=["primary","secondary","tertiary","action","neutral","base"];for(const n of s){const l=`brand_${n}`;je(e[l])&&t.push(`--sf-color-${n}-light: ${e[l]};`)}const a=["success","warning","error","info","danger"];for(const n of a){const l=`status_${n}`;je(e[l])&&t.push(`--sf-color-${n}-light: ${e[l]};`)}if(e.dark_overrides_enabled!=="0"){for(const n of s){const l=`brand_dark_${n}`;je(e[l])&&t.push(`--sf-color-${n}-dark: ${e[l]};`)}for(const n of a){const l=`status_dark_${n}`;je(e[l])&&t.push(`--sf-color-${n}-dark: ${e[l]};`)}}return t}function Fo(e){const t=[],s=["body","heading","mono","display","humanist","geometric","slab"];for(const r of s){const n=`font_${r}`;je(e[n])&&t.push(`--sf-font-${r}: ${e[n]};`)}je(e.text_scale)&&t.push(`--sf-text-scale: ${e.text_scale};`),je(e.text_display_scale)&&t.push(`--sf-text-display-scale: ${e.text_display_scale};`);const a=["2xs","xs","s","m","l","xl","2xl","3xl","4xl","display-s","display-m","display-l"];for(const r of a){const n=`size_${r}_min`,l=`size_${r}_max`,o=e[n],c=e[l];if(je(o)&&je(c)){const d=Sn(parseFloat(o),parseFloat(c));d&&t.push(`--sf-text-${r}: ${d};`)}}return t}function Ro(e){const t=[];je(e.space_scale)&&t.push(`--sf-space-scale: ${e.space_scale};`);const s=["2xs","xs","s","m","l","xl","2xl","3xl","4xl"];for(const r of s){const n=e[`space_${r}_min`],l=e[`space_${r}_max`];if(je(n)&&je(l)){const o=Sn(parseFloat(n),parseFloat(l));o&&t.push(`--sf-space-${r}: calc(${o} * var(--sf-space-scale));`)}}const a={gutter:"--sf-space-gutter",gap:"--sf-gap",content_gap:"--sf-content-gap",component_pad:"--sf-component-pad",section_pad:"--sf-section-pad"};for(const[r,n]of Object.entries(a))je(e[r])&&t.push(`${n}: ${e[r]};`);return t}function Mo(e){const t=[];return je(e.radius_scale)&&t.push(`--sf-radius-scale: ${e.radius_scale};`),t}function Oo(e){const t=[];return je(e.shadow_strength)&&t.push(`--sf-shadow-strength: calc(${e.shadow_strength} + var(--sf-is-dark) * 0.17);`),je(e.glow_color)&&t.push(`--sf-shadow-glow-color: ${e.glow_color};`),t}function Do(e){const t=[];je(e.motion_scale)&&t.push(`--sf-motion-scale: ${e.motion_scale};`);const s=["instant","fast","normal","slow","slower"];for(const a of s){const r=`duration_${a}`;je(e[r])&&t.push(`--sf-duration-${a}: calc(${e[r]}ms * var(--sf-motion-scale));`)}return t}function Po(e){const t=[],s=["below","base","raised","low","mid","high","top","max"];for(const a of s)je(e[a])&&t.push(`--sf-z-${a}: ${parseInt(e[a],10)};`);return t}function Lo(e){const t=[],s={contrast_bias:"--sf-contrast-bias",contrast_threshold:"--sf-contrast-threshold",opacity_disabled:"--sf-opacity-disabled"};for(const[r,n]of Object.entries(s))je(e[r])&&t.push(`${n}: ${Er(e[r])};`);const a={focus_ring_width:"--sf-focus-ring-width",focus_ring_offset:"--sf-focus-ring-offset"};for(const[r,n]of Object.entries(a))je(e[r])&&t.push(`${n}: ${Er(e[r])}px;`);return je(e.focus_ring_style)&&["solid","dashed","dotted","double","none"].includes(e.focus_ring_style)&&t.push(`--sf-focus-ring-style: ${e.focus_ring_style};`),t}function rr(e){const t=[];if(e.colors&&typeof e.colors=="object"&&t.push(...Ao(e.colors)),e.typography&&typeof e.typography=="object"&&t.push(...Fo(e.typography)),e.spacing&&typeof e.spacing=="object"&&t.push(...Ro(e.spacing)),e.radius&&typeof e.radius=="object"&&t.push(...Mo(e.radius)),e.shadows&&typeof e.shadows=="object"&&t.push(...Oo(e.shadows)),e.motion&&typeof e.motion=="object"&&t.push(...Do(e.motion)),e.zindex&&typeof e.zindex=="object"&&t.push(...Po(e.zindex)),e.contrast&&typeof e.contrast=="object"&&t.push(...Lo(e.contrast)),t.length===0)return"";let s=`@layer slashed.overrides {
+ drives the variable pickers, class autocomplete, and color palette in Bricks.
Variables registered
Classes registered
Plugin Settings
Choose which SLASHED CSS bundle to load on the frontend and in the Bricks editor canvas.
Override the HTML root font-size. Use this if Bricks forces a font-size you don't want.
`);function Ao(e,t){we(t,!0);let s=te(qe(ne.pluginSettings?.css_bundle??"optimal")),a=te(qe(ne.pluginSettings?.html_font_size??"")),r=te(!1),n=te(!1),l=te(""),c=null;async function o(){K(r,!0),K(n,!1),K(l,"");try{await Eo({css_bundle:i(s),html_font_size:i(a)}),K(n,!0),c&&clearTimeout(c),c=setTimeout(()=>{K(n,!1),c=null},3e3)}catch(V){K(l,V.message||"Save failed",!0)}finally{K(r,!1)}}var f=zo(),h=v(d(f),4),p=v(d(h),2),u=d(p),m=v(p,4),b=d(m),w=v(h,4),_=v(d(w),2),y=d(_);y.value=y.__value="essential";var S=v(y);S.value=S.__value="optimal";var $=v(S);$.value=$.__value="full";var R=v(w,2),N=v(d(R),2),E=d(N);E.value=E.__value="";var C=v(E);C.value=C.__value="100";var M=v(C);M.value=M.__value="62.5";var L=v(R,2),T=d(L),P=d(T),x=v(T,2);{var k=V=>{var U=$o();z(V,U)};ue(x,V=>{i(n)&&V(k)})}var O=v(x,2);{var D=V=>{var U=Co(),I=d(U);q(()=>A(I,i(l))),z(V,U)};ue(O,V=>{i(l)&&V(D)})}q(()=>{A(u,ne.inventory?.variables?.length??0),A(b,(ne.inventory?.sf_classes?.length??0)+(ne.inventory?.is_classes?.length??0)),T.disabled=i(r),A(P,i(r)?"Saving...":"Save Settings")}),ca(_,()=>i(s),V=>K(s,V)),ca(N,()=>i(a),V=>K(a,V)),_e("click",T,o),z(e,f),xe()}De(["click"]);const jr=22.5,Fo=95;function jn(e,t){if(e<=0||t<=0)return null;const s=Fo-jr,a=(t-e)/s,r=parseFloat(a.toFixed(6)),n=parseFloat(e.toFixed(4)),l=parseFloat(t.toFixed(4));return`clamp(${n}rem, calc(${r} * (100vw - ${jr}rem) + ${n}rem), ${l}rem)`}function Tr(e){const t=parseFloat(e);if(isNaN(t))return"0";let s=t.toFixed(6).replace(/0+$/,"").replace(/\.$/,"");return s===""?"0":s}function Ee(e){return e!=null&&e!==""}function Ro(e){const t=[],s=["primary","secondary","tertiary","action","neutral","base"];for(const n of s){const l=`brand_${n}`;Ee(e[l])&&t.push(`--sf-color-${n}-light: ${e[l]};`)}const a=["success","warning","error","info","danger"];for(const n of a){const l=`status_${n}`;Ee(e[l])&&t.push(`--sf-color-${n}-light: ${e[l]};`)}if(e.dark_overrides_enabled!=="0"){for(const n of s){const l=`brand_dark_${n}`;Ee(e[l])&&t.push(`--sf-color-${n}-dark: ${e[l]};`)}for(const n of a){const l=`status_dark_${n}`;Ee(e[l])&&t.push(`--sf-color-${n}-dark: ${e[l]};`)}}return t}function Do(e){const t=[],s=["body","heading","mono","display","humanist","geometric","slab"];for(const r of s){const n=`font_${r}`;Ee(e[n])&&t.push(`--sf-font-${r}: ${e[n]};`)}Ee(e.text_scale)&&t.push(`--sf-text-scale: ${e.text_scale};`),Ee(e.text_display_scale)&&t.push(`--sf-text-display-scale: ${e.text_display_scale};`);const a=["2xs","xs","s","m","l","xl","2xl","3xl","4xl","display-s","display-m","display-l"];for(const r of a){const n=`size_${r}_min`,l=`size_${r}_max`,c=e[n],o=e[l];if(Ee(c)&&Ee(o)){const f=jn(parseFloat(c),parseFloat(o));f&&t.push(`--sf-text-${r}: ${f};`)}}return t}function Mo(e){const t=[];Ee(e.space_scale)&&t.push(`--sf-space-scale: ${e.space_scale};`);const s=["2xs","xs","s","m","l","xl","2xl","3xl","4xl"];for(const r of s){const n=e[`space_${r}_min`],l=e[`space_${r}_max`];if(Ee(n)&&Ee(l)){const c=jn(parseFloat(n),parseFloat(l));c&&t.push(`--sf-space-${r}: calc(${c} * var(--sf-space-scale));`)}}const a={gutter:"--sf-space-gutter",gap:"--sf-gap",content_gap:"--sf-content-gap",component_pad:"--sf-component-pad",section_pad:"--sf-section-pad"};for(const[r,n]of Object.entries(a))Ee(e[r])&&t.push(`${n}: ${e[r]};`);return t}function Oo(e){const t=[];return Ee(e.radius_scale)&&t.push(`--sf-radius-scale: ${e.radius_scale};`),t}function Po(e){const t=[];return Ee(e.shadow_strength)&&t.push(`--sf-shadow-strength: calc(${e.shadow_strength} + var(--sf-is-dark) * 0.17);`),Ee(e.glow_color)&&t.push(`--sf-shadow-glow-color: ${e.glow_color};`),t}function Lo(e){const t=[];Ee(e.motion_scale)&&t.push(`--sf-motion-scale: ${e.motion_scale};`);const s=["instant","fast","normal","slow","slower"];for(const a of s){const r=`duration_${a}`;Ee(e[r])&&t.push(`--sf-duration-${a}: calc(${e[r]}ms * var(--sf-motion-scale));`)}return t}function Vo(e){const t=[],s=["below","base","raised","low","mid","high","top","max"];for(const a of s)Ee(e[a])&&t.push(`--sf-z-${a}: ${parseInt(e[a],10)};`);return t}function Io(e){const t=[],s={contrast_bias:"--sf-contrast-bias",contrast_threshold:"--sf-contrast-threshold",opacity_disabled:"--sf-opacity-disabled"};for(const[r,n]of Object.entries(s))Ee(e[r])&&t.push(`${n}: ${Tr(e[r])};`);const a={focus_ring_width:"--sf-focus-ring-width",focus_ring_offset:"--sf-focus-ring-offset"};for(const[r,n]of Object.entries(a))Ee(e[r])&&t.push(`${n}: ${Tr(e[r])}px;`);return Ee(e.focus_ring_style)&&["solid","dashed","dotted","double","none"].includes(e.focus_ring_style)&&t.push(`--sf-focus-ring-style: ${e.focus_ring_style};`),t}function ir(e){const t=[];if(e.colors&&typeof e.colors=="object"&&t.push(...Ro(e.colors)),e.typography&&typeof e.typography=="object"&&t.push(...Do(e.typography)),e.spacing&&typeof e.spacing=="object"&&t.push(...Mo(e.spacing)),e.radius&&typeof e.radius=="object"&&t.push(...Oo(e.radius)),e.shadows&&typeof e.shadows=="object"&&t.push(...Po(e.shadows)),e.motion&&typeof e.motion=="object"&&t.push(...Lo(e.motion)),e.zindex&&typeof e.zindex=="object"&&t.push(...Vo(e.zindex)),e.contrast&&typeof e.contrast=="object"&&t.push(...Io(e.contrast)),t.length===0)return"";let s=`@layer slashed.overrides {
:root {
`;for(const a of t)s+=` ${a}
`;return s+=` }
-}`,s}function Vo(e){if(!e||typeof e!="object")return!1;for(const t of Object.values(e))if(!(!t||typeof t!="object")){for(const s of Object.values(t))if(typeof s=="object"&&s!==null){for(const a of Object.values(s))if(a!==""&&a!==null&&a!==void 0)return!0}else if(s!==""&&s!==null&&s!==void 0)return!0}return!1}var Io=F(''),qo=F('
'),No=F('
'),Bo=F(`
Export / Import Tokens
Export your current SLASHED token overrides (colors, typography, spacing, etc.) to a .json file and import them on any other WordPress site running this plugin.
+}`,s}function qo(e){if(!e||typeof e!="object")return!1;for(const t of Object.values(e))if(!(!t||typeof t!="object")){for(const s of Object.values(t))if(typeof s=="object"&&s!==null){for(const a of Object.values(s))if(a!==""&&a!==null&&a!==void 0)return!0}else if(s!==""&&s!==null&&s!==void 0)return!0}return!1}var No=F(''),Bo=F('
'),Ko=F('
'),Ho=F(`
Export / Import Tokens
Export your current SLASHED token overrides (colors, typography, spacing, etc.) to a .json file and import them on any other WordPress site running this plugin.
This makes Bricks templates fully portable — the template JSON carries structure and
class references; this file carries the brand tokens that drive the visual result.
Export
Downloads a .json file containing all your active token overrides and plugin settings.
Share this file alongside your Bricks template export so the visual result is identical on every site.
Import
Upload a .json file previously exported from this plugin. Each section is validated
@@ -29,8 +29,8 @@ var En=Object.defineProperty;var nr=e=>{throw TypeError(e)};var jn=(e,t,s)=>t in
import the token file via this tab, then import the Bricks template via Bricks → Templates.
The plugin re-registers all SLASHED classes, variables, and color palettes automatically.
Verify in the Bricks builder canvas that colors, spacing, and fonts match.
If something looks off, check the browser console for unresolved var() calls —
- this means the CSS bundle isn't loading or the token file wasn't imported yet.
`);function Ko(e,t){ke(t,!0);let s=te(!1),a=te("");const r=j(()=>rr(H)),n=j(()=>i(r).length>0);function l(){if(!i(r))return;const M=new Blob([i(r)],{type:"text/css"}),V=URL.createObjectURL(M),U=document.createElement("a");U.href=V,U.download=`slashed-custom-${new Date().toISOString().slice(0,10)}.css`,U.click(),URL.revokeObjectURL(V)}async function o(){K(s,!0),K(a,"");try{const M=await So(),V=JSON.stringify(M,null,2),U=new Blob([V],{type:"application/json"}),I=URL.createObjectURL(U),Y=document.createElement("a");Y.href=I,Y.download=`slashed-tokens-${new Date().toISOString().slice(0,10)}.json`,Y.click(),URL.revokeObjectURL(I)}catch(M){K(a,M.message||"Export failed",!0)}finally{K(s,!1)}}let c=te(null),d=te(!1),_=te(""),v=te(""),u=te(0);async function m(){const M=i(c)?.files?.[0];if(M){K(_,""),K(v,""),K(d,!0);try{const V=await M.text(),U=JSON.parse(V),I=await Eo(U),Y=I.settings_imported?" Plugin settings restored.":"";K(_,`Imported ${I.imported} section(s) successfully.${Y}`),K(u,3);const G=setInterval(()=>{K(u,i(u)-1),i(u)<=0&&(clearInterval(G),window.location.reload())},1e3)}catch(V){K(v,V.message||"Import failed",!0)}finally{K(d,!1),i(c)&&(i(c).value="")}}}var b=Bo(),w=p(f(b),4),h=p(f(w),4),y=f(h),S=f(y),$=p(y,2),R=p($,2);{var B=M=>{var V=Io(),U=f(V);q(()=>A(U,i(a))),z(M,V)};fe(R,M=>{i(a)&&M(B)})}var E=p(w,2),C=p(f(E),4),O=f(C);ol(O,M=>K(c,M),()=>i(c));var L=p(O,2),T=f(L),D=p(C,2);{var x=M=>{var V=qo(),U=f(V),I=p(U);{var Y=G=>{var ae=Yi();q(()=>A(ae,`Reloading in ${i(u)??""}…`)),z(G,ae)};fe(I,G=>{i(u)>0&&G(Y)})}q(()=>A(U,`${i(_)??""} `)),z(M,V)};fe(D,M=>{i(_)&&M(x)})}var k=p(D,2);{var P=M=>{var V=No(),U=f(V);q(()=>A(U,i(v))),z(M,V)};fe(k,M=>{i(v)&&M(P)})}q(()=>{y.disabled=i(s),A(S,i(s)?"Exporting…":"Download token file (.json)"),$.disabled=!i(n),Q($,"title",i(n)?"Download overrides as a standalone CSS file":"No overrides set yet"),L.disabled=i(d),A(T,i(d)?"Importing…":"Import token file")}),he("click",y,o),he("click",$,l),he("click",L,m),z(e,b),Se()}De(["click"]);var Ho=F('
Parameters:
'),Uo=F(`
Filter Hooks Reference
These WordPress filter hooks let you customize the SLASHED Bricks integration
- from your theme or a mu-plugin. Each hook fires during plugin initialization.
`);function Go(e){const t=[{name:"slashed_bricks/css_bundle_url",description:"Override which CSS bundle URL to load.",params:"$url (string) - The current CSS bundle URL.",example:`add_filter( 'slashed_bricks/css_bundle_url', function( $url ) {
+ this means the CSS bundle isn't loading or the token file wasn't imported yet.`);function Uo(e,t){we(t,!0);let s=te(!1),a=te("");const r=j(()=>ir(H)),n=j(()=>i(r).length>0);function l(){if(!i(r))return;const D=new Blob([i(r)],{type:"text/css"}),V=URL.createObjectURL(D),U=document.createElement("a");U.href=V,U.download=`slashed-custom-${new Date().toISOString().slice(0,10)}.css`,U.click(),URL.revokeObjectURL(V)}async function c(){K(s,!0),K(a,"");try{const D=await jo(),V=JSON.stringify(D,null,2),U=new Blob([V],{type:"application/json"}),I=URL.createObjectURL(U),W=document.createElement("a");W.href=I,W.download=`slashed-tokens-${new Date().toISOString().slice(0,10)}.json`,W.click(),URL.revokeObjectURL(I)}catch(D){K(a,D.message||"Export failed",!0)}finally{K(s,!1)}}let o=te(null),f=te(!1),h=te(""),p=te(""),u=te(0);async function m(){const D=i(o)?.files?.[0];if(D){K(h,""),K(p,""),K(f,!0);try{const V=await D.text(),U=JSON.parse(V),I=await To(U),W=I.settings_imported?" Plugin settings restored.":"";K(h,`Imported ${I.imported} section(s) successfully.${W}`),K(u,3);const G=setInterval(()=>{K(u,i(u)-1),i(u)<=0&&(clearInterval(G),window.location.reload())},1e3)}catch(V){K(p,V.message||"Import failed",!0)}finally{K(f,!1),i(o)&&(i(o).value="")}}}var b=Ho(),w=v(d(b),4),_=v(d(w),4),y=d(_),S=d(y),$=v(y,2),R=v($,2);{var N=D=>{var V=No(),U=d(V);q(()=>A(U,i(a))),z(D,V)};ue(R,D=>{i(a)&&D(N)})}var E=v(w,2),C=v(d(E),4),M=d(C);dl(M,D=>K(o,D),()=>i(o));var L=v(M,2),T=d(L),P=v(C,2);{var x=D=>{var V=Bo(),U=d(V),I=v(U);{var W=G=>{var ae=Zi();q(()=>A(ae,`Reloading in ${i(u)??""}…`)),z(G,ae)};ue(I,G=>{i(u)>0&&G(W)})}q(()=>A(U,`${i(h)??""} `)),z(D,V)};ue(P,D=>{i(h)&&D(x)})}var k=v(P,2);{var O=D=>{var V=Ko(),U=d(V);q(()=>A(U,i(p))),z(D,V)};ue(k,D=>{i(p)&&D(O)})}q(()=>{y.disabled=i(s),A(S,i(s)?"Exporting…":"Download token file (.json)"),$.disabled=!i(n),Q($,"title",i(n)?"Download overrides as a standalone CSS file":"No overrides set yet"),L.disabled=i(f),A(T,i(f)?"Importing…":"Import token file")}),_e("click",y,c),_e("click",$,l),_e("click",L,m),z(e,b),xe()}De(["click"]);var Go=F('
Parameters:
'),Wo=F(`
Filter Hooks Reference
These WordPress filter hooks let you customize the SLASHED Bricks integration
+ from your theme or a mu-plugin. Each hook fires during plugin initialization.
`);function Yo(e){const t=[{name:"slashed_bricks/css_bundle_url",description:"Override which CSS bundle URL to load.",params:"$url (string) - The current CSS bundle URL.",example:`add_filter( 'slashed_bricks/css_bundle_url', function( $url ) {
// Load from a CDN instead.
return 'https://cdn.example.com/slashed/slashed.optimal.css';
} );`},{name:"slashed_bricks/registered_classes",description:"Filter the array of classes before registration with Bricks.",params:"$classes (array) - Array of class definitions with name and category.",example:`add_filter( 'slashed_bricks/registered_classes', function( $classes ) {
@@ -59,7 +59,7 @@ add_filter( 'slashed_bricks/inventory_local_path', function() {
'SLASHED Primary',
'SLASHED Secondary',
] ) );
-} );`}];var s=Uo(),a=p(f(s),4);ne(a,17,()=>t,r=>r.name,(r,n)=>{var l=Ho(),o=f(l),c=f(o),d=f(c),_=p(o,2),v=f(_),u=p(_,2),m=p(f(u),2),b=f(m),w=p(u,2),h=f(w),y=f(h);q(()=>{A(d,i(n).name),A(v,i(n).description),A(b,i(n).params),A(y,i(n).example)}),z(r,l)}),z(e,s)}const Wo=[{category:"Colors",description:"Brand, status, semantic, and derived color tokens. Source colors use oklch(); the framework derives light-dark pairs, palettes, and alpha scales automatically.",tokens:[{name:"--sf-color-{brand}-light",description:"Source color for the brand (oklch registered value). Set this to rebrand."},{name:"--sf-color-{brand}-dark",description:"Optional dark-mode override. If set, replaces the auto-derived dark variant for full per-mode control."},{name:"--sf-color-{brand}",description:"Resolved light-dark adaptive color for use in rules."},{name:"--sf-color-{brand}-{50-950}",description:"Palette scale: 50 (lightest) to 950 (darkest) mixed with base/text."},{name:"--sf-color-{brand}-a{5-95}",description:"Alpha scale: 5% to 95% opacity of the brand color."},{name:"--sf-color-{brand}-hover/active/muted/subtle/ghost/lighter/darker/xlight/xdark/superlight/superdark",description:"Semantic aliases for common UI states, mapped to palette steps."},{name:"--sf-color-bg",description:"Page background color, derived from base."},{name:"--sf-color-text",description:"Main body text color, contrast-aware."},{name:"--sf-color-heading",description:"Heading text color, slightly stronger than body text."},{name:"--sf-color-link",description:"Link color, derived from action brand."},{name:"--sf-color-border",description:"Default border color."},{name:"--sf-color-surface",description:"Card/panel surface color (equals base)."},{name:"--sf-color-overlay",description:"Semi-transparent overlay for modals."},{name:"--sf-color-dim",description:"50% black overlay for dimming backgrounds."},{name:"--sf-color-success/warning/error/info/danger",description:"Status feedback colors with -light source, -muted, -strong, -subtle variants."}]},{category:"Typography",description:"Font families, sizes (fluid clamp-based scale), weights, line-heights, letter-spacing, and heading configuration.",tokens:[{name:"--sf-font-body",description:"Body font stack (system-ui default)."},{name:"--sf-font-heading",description:"Heading font stack (defaults to body)."},{name:"--sf-font-mono",description:"Monospace font stack."},{name:"--sf-font-display",description:"Display/hero font (defaults to heading)."},{name:"--sf-font-geometric/humanist/slab",description:"Curated fallback stacks for common typographic personalities."},{name:"--sf-text-{2xs..4xl}",description:"Fluid type scale using clamp(). Sizes: 2xs, xs, s, m, l, xl, 2xl, 3xl, 4xl."},{name:"--sf-text-display-{s,m,l}",description:"Extra-large display/hero sizes."},{name:"--sf-text-scale",description:"Global multiplier for the type scale (default 1)."},{name:"--sf-font-weight-{thin..black}",description:"Named weight tokens: thin(100), extralight(200), light(300), normal(400), medium(500), semibold(600), bold(700), extrabold(800), black(900)."},{name:"--sf-leading-{tight,snug,normal,relaxed}",description:"Line-height presets: 1.1, 1.3, 1.5, 1.625."},{name:"--sf-tracking-{tight,normal,wide,wider,widest}",description:"Letter-spacing presets from -0.025em to 0.1em."},{name:"--sf-h{1-6}-size/font-weight/line-height/letter-spacing",description:"Per-heading-level configuration tokens."},{name:"--sf-body-*",description:"Body text configuration: font-size, font-weight, line-height, color, text-wrap."}]},{category:"Spacing",description:"Fluid spacing scale (clamp-based), gutters, section padding, and component padding.",tokens:[{name:"--sf-space-{2xs..4xl}",description:"Fluid spacing scale. Sizes: none, px, 2xs, xs, s, m, l, xl, 2xl, 3xl, 4xl."},{name:"--sf-space-scale",description:"Global multiplier for all space tokens (default 1)."},{name:"--sf-space-gutter",description:"Page-edge gutter (defaults to space-l)."},{name:"--sf-gap",description:"Default gap for layouts (defaults to space-m)."},{name:"--sf-content-gap",description:"Gap between content elements (defaults to space-s)."},{name:"--sf-section-pad--{s,m,l,xl}",description:"Vertical padding for page sections."},{name:"--sf-component-pad",description:"Internal padding for components (defaults to space-m)."},{name:"--sf-header-height",description:"Expected fixed header height for sticky offset calculations."},{name:"--sf-safe-{top,right,bottom,left}",description:"Safe area insets for notched devices."}]},{category:"Sizing",description:"Component sizes, touch targets, and aspect ratios.",tokens:[{name:"--sf-size-{xs..xl}",description:"Named size tokens: xs(1.5rem), s(2rem), m(2.5rem), l(2.75rem), xl(3.5rem)."},{name:"--sf-touch-target",description:"Minimum interactive element size (defaults to size-l, 2.75rem)."},{name:"--sf-ratio-{square,photo,video,cinema,golden,portrait}",description:"Predefined aspect ratios for frames and containers."},{name:"--sf-icon-{xs..xl}",description:"Icon sizing in em units (0.875em to 3em)."}]},{category:"Layout",description:"Container widths, layout primitive tokens (stack, cluster, grid, sidebar, switcher, bento, cover, frame, reel, imposter).",tokens:[{name:"--sf-container-{narrow,default,prose,wide,full}",description:"Max-width presets for .sf-container."},{name:"--sf-stack-gap",description:"Vertical gap between .sf-stack children."},{name:"--sf-cluster-gap/align/justify",description:"Inline cluster layout tokens."},{name:"--sf-sidebar-width/gap/min-width",description:"Sidebar layout tokens."},{name:"--sf-switcher-threshold/gap",description:"Column-to-stack breakpoint and gap."},{name:"--sf-grid-min/gap",description:"Auto-fill grid minimum item width and gap."},{name:"--sf-bento-cols/gap/row",description:"Dense bento grid configuration."},{name:"--sf-cover-min-height/padding",description:"Full-height cover layout."},{name:"--sf-frame-ratio",description:"Aspect ratio for .sf-frame (defaults to 16/9)."},{name:"--sf-reel-gap/height/item-width",description:"Horizontal scroll strip configuration."},{name:"--sf-imposter-margin",description:"Safety margin for absolute-centered overlays."},{name:"--sf-breakout-width/content-width",description:"Breakout grid track widths."},{name:"--sf-divider-color/style/width",description:"Divider appearance tokens."}]},{category:"Borders",description:"Border widths and styles.",tokens:[{name:"--sf-border-width-{hairline,1,2,3,4}",description:"Border width scale: 0.5px, 1px, 2px, 3px, 4px."},{name:"--sf-border-style/dotted/soft/strong",description:"Border style presets (solid, dotted, dashed, solid)."},{name:"--sf-stroke-{thin,regular,bold,heavy}",description:"Stroke widths for SVG/icon use: 1px, 1.5px, 2px, 3px."}]},{category:"Radius",description:"Border radius scale and special shapes.",tokens:[{name:"--sf-radius-{none,xs,s,m,l,xl,2xl,3xl,4xl,full}",description:"Radius scale from 0 to 9999px (pill)."},{name:"--sf-radius-scale",description:"Global multiplier for all radius tokens (default 1)."},{name:"--sf-radius-pill",description:"Fully rounded (9999px)."},{name:"--sf-radius-outer",description:"Outer radius = inner + padding (for nested rounding)."}]},{category:"Shadows",description:"Box shadows, drop shadows, text shadows, and shadow configuration.",tokens:[{name:"--sf-shadow-{xs,s,m,l,xl,2xl}",description:"Elevation shadow scale, progressively more dramatic."},{name:"--sf-shadow-inner",description:"Inset shadow for recessed elements."},{name:"--sf-shadow-glow",description:"Colored glow effect (uses --sf-shadow-glow-color)."},{name:"--sf-shadow-none",description:"Explicit no-shadow value."},{name:"--sf-shadow-color",description:"Base shadow color (derived from neutral)."},{name:"--sf-shadow-strength",description:"Shadow opacity multiplier (adapts to dark mode)."},{name:"--sf-drop-shadow-{s,m,l}",description:"CSS filter drop-shadow equivalents."},{name:"--sf-text-shadow-{s,m,l,none}",description:"Text shadow presets."}]},{category:"Effects",description:"Blurs, opacities, gradients, masks, and perspective.",tokens:[{name:"--sf-blur-{xs,s,m,l,xl}",description:"Blur radius scale: 4px to 48px."},{name:"--sf-opacity-{0,10,25,50,75,100,disabled}",description:"Named opacity presets."},{name:"--sf-gradient-{brand,primary,secondary,tertiary,surface}",description:"Predefined gradients using brand colors."},{name:"--sf-gradient-fade--{t,b,l,r}",description:"Directional fade-to-background gradients."},{name:"--sf-mask-scrim-start/end",description:"Scroll mask fade depth."},{name:"--sf-perspective-{near,normal,far}",description:"3D perspective presets: 500px, 1000px, 2000px."},{name:"--sf-contrast-bias/threshold",description:"Color contrast tuning for auto text-on-color logic."}]},{category:"Motion",description:"Durations, easing curves, transitions, and animations.",tokens:[{name:"--sf-duration-{none,instant,fast,normal,slow,slower}",description:"Duration scale: 0ms to 600ms (respects --sf-motion-scale)."},{name:"--sf-motion-scale",description:"Global animation speed multiplier (set 0 to disable)."},{name:"--sf-ease-{linear,in,out,in-out,bounce,elastic,overshoot,spring}",description:"Easing function presets."},{name:"--sf-transition-{all,colors,opacity,shadow,transform,fast,slow,enter,exit}",description:"Pre-composed transition shorthands."},{name:"--sf-animation-{fade-in,fade-out,scale-up,scale-down,slide-in-*,float,ping,blink,color-pulse}",description:"Named keyframe animation shorthands."},{name:"--sf-animation-delay-{1-5}",description:"Stagger delays for sequential animations."}]},{category:"Z-Index",description:"Z-index scale for predictable layering.",tokens:[{name:"--sf-z-{below,base,raised,low,mid,high,top,max}",description:"Z-index scale: -1, 0, 1, 10, 100, 500, 900, 9999."}]},{category:"Focus",description:"Focus ring appearance for keyboard navigation.",tokens:[{name:"--sf-focus-ring-width/offset/color/style/shadow",description:"Focus indicator configuration."},{name:"--sf-caret-color",description:"Text input caret color (defaults to action)."}]},{category:"Scroll",description:"Scroll timeline and scrollbar styling.",tokens:[{name:"--sf-scroll-timeline-range-start/end",description:"Scroll-driven animation range."},{name:"--sf-scrollbar-thumb/track",description:"Custom scrollbar colors."}]},{category:"Print",description:"Print stylesheet configuration.",tokens:[{name:"--sf-print-base-size/page-margin/page-size",description:"Print layout tokens: 11pt base, 2cm margins, A4 size."}]}],Yo=[{category:"Layout Primitives",description:"Breakpoint-free, container-query-driven layout components. Each is a single class with per-instance token overrides via inline style.",classes:[{name:".sf-section",description:"Vertical page rhythm with size variants (--s/--m/--l/--xl/--collapse)."},{name:".sf-section-group",description:"Collapses gap between adjacent sections."},{name:".sf-container",description:"Centered max-width wrapper with gutters. Variants: --narrow, --wide, --full, --prose."},{name:".sf-box",description:"Isolated unit with padding and optional border."},{name:".sf-center",description:"Intrinsic centering with max-width. Variant: --intrinsic."},{name:".sf-stack",description:"Vertical flow with consistent gap. Size variants: --2xs to --3xl. Alignment: --center, --end, --stretch."},{name:".sf-cluster",description:"Wrapping inline group. Size variants: --2xs to --xl. Alignment: --center, --end, --between. Wrap: --no-wrap."},{name:".sf-sidebar",description:"Content + side panel that wraps. Variants: --right, --narrow, --wide."},{name:".sf-switcher",description:"N columns above threshold, stacked below. Variants: --no-wrap, --vertical."},{name:".sf-grid",description:"Auto-fill responsive grid. Size variants: --xs to --xl. Variants: --fit, --dense."},{name:".sf-grid-{1,2,3,4,6}",description:"Fixed-column grids, container-responsive."},{name:".sf-grid-{1-2,2-1,1-3,3-1}",description:"Ratio two-column grids."},{name:".sf-bento",description:"Dense free-form grid. Variants: --2, --4, --compact, --tall."},{name:".sf-alternate",description:"Zigzag two-column layout, reverses every other row."},{name:".sf-pancake",description:"Sticky-footer grid: header / main(1fr) / footer."},{name:".sf-content-grid",description:"Breakout layout grid. Children use .sf-breakout or .sf-full-bleed."},{name:".sf-cover",description:"Full-height region with centered content. Variants: --min, --max, --padding-s, --padding-l."},{name:".sf-frame",description:"Aspect-ratio media box. Variants: --square, --portrait, --video, --cinema, --3-2, --4-3, --golden."},{name:".sf-reel",description:"Horizontal scroll strip with optional mask fade."},{name:".sf-imposter",description:"Absolutely-centered overlay. Variants: --fixed, --contain."},{name:".sf-subgrid / .sf-subgrid-rows",description:"Inherit parent grid tracks."},{name:".sf-divider",description:"Token-driven separator. Variant: --vertical."},{name:".sf-icon",description:"Em-based inline icon sizing. Sizes: --xs to --xl. Variant: --boxed."},{name:".sf-prose",description:"Readable long-form text with automatic vertical rhythm."},{name:".sf-not-prose",description:"Reset zone inside .sf-prose for embedded components."}]},{category:"Macros",description:"Recipe classes that answer 'what does this element do/look like?' - composable with layout primitives.",classes:[{name:".sf-flow",description:"Lobotomized owl: consistent gap between consecutive children."},{name:".sf-truncate",description:"Single-line ellipsis overflow."},{name:".sf-line-clamp-{2,3,N}",description:"Multi-line text clamping with ellipsis. -N reads --sf-line-clamp."},{name:".sf-equal-height",description:"Forces flex children to share the tallest child's height."},{name:".sf-aspect",description:"Generic aspect-ratio container (reads --sf-aspect token)."},{name:".sf-scroll-shadow",description:"Top + bottom mask gradient for scrolling containers."},{name:".sf-scroll-snap",description:"Vertical scroll-snap container."},{name:".sf-overflow-fade",description:"End-edge horizontal fade for overflowing inline content."},{name:".sf-no-tap-highlight",description:"Suppresses WebKit/Android tap highlight."},{name:".sf-text-gradient",description:"Gradient text effect using background-clip."},{name:".sf-clickable-parent",description:"Makes an entire card clickable via the first link inside."},{name:".sf-link-external",description:"Adds external link indicator marker."}]},{category:"Surfaces",description:"Color surface utility classes that set background and text color for a brand context.",classes:[{name:".sf-surface--{primary,secondary,tertiary,action,neutral,inverse}",description:"Brand-colored surface with auto-contrast text."},{name:".sf-surface--{success,warning,error,info,danger}",description:"Status-colored surfaces."}]},{category:"Animations",description:"CSS animation utility classes that apply predefined keyframe animations.",classes:[{name:".sf-fade-in / .sf-fade-out",description:"Opacity entrance/exit animations."},{name:".sf-scale-up / .sf-scale-down",description:"Scale entrance/exit animations."},{name:".sf-slide-in-{up,down,left,right}",description:"Directional slide-in entrance animations."},{name:".sf-color-pulse",description:"Continuous color pulse animation."},{name:".sf-entrance--fade / --fade-up / --fade-down / --fade-left / --fade-right / --scale-up",description:"Scroll-triggered entrance animations (scroll-timeline driven)."}]},{category:"State Classes (.is-*)",description:"Runtime state classes toggled by JS or mirrored from ARIA. They live in the slashed.states layer. Always pair with matching ARIA attributes.",classes:[{name:".is-hidden / .is-invisible / .is-visible",description:"Visibility control: removed from layout / hidden but keeps box / visible."},{name:".is-disabled / .is-readonly",description:"Non-interactive states with dimming."},{name:".is-loading / .is-pending / .is-busy",description:"Loading states: spinner replacement / optimistic UI / cursor hint."},{name:".is-skeleton",description:"Placeholder shimmer animation."},{name:".is-active / .is-selected / .is-current / .is-pressed",description:"Selection/activation states."},{name:".is-highlighted",description:"Transient emphasis (e.g. search result highlight)."},{name:".is-open / .is-collapsed / .is-expanded",description:"Disclosure states for modals, drawers, accordions."},{name:".is-valid / .is-invalid",description:"Form field validation results (maps to aria-invalid)."},{name:".is-success / .is-error / .is-warning / .is-info / .is-danger",description:"General feedback states and destructive-action context."},{name:".is-sticky / .is-pinned / .is-fixed / .is-fullscreen",description:"Positioning states."},{name:".is-clipped / .is-scrollable / .is-truncated / .is-resizable",description:"Overflow handling states."},{name:".is-dragging / .is-drop-target / .is-draggable",description:"Drag and drop states."},{name:".is-overlay / .is-focused / .is-clickable / .is-unselectable",description:"Positioning, focus, cursor, and selection states."},{name:".is-empty",description:"Hide element when empty (:empty pseudo-class)."}]}],Xo=[{name:"--sf-is-dark",description:"Numeric flag (0 or 1) indicating dark mode is active. Registered property."},{name:"--sf-lumlocker",description:"Internal luminance lock value for color derivation."},{name:"--sf-color-scheme",description:"CSS color-scheme declaration (light dark)."},{name:"--sf-current-font-weight",description:"Current context font weight (used by strong elements)."},{name:"--sf-link-external-marker",description:"External link arrow character."},{name:"--sf-field-block",description:"Vertical spacing between form fields."},{name:"--sf-field-required-marker",description:"Required field indicator string."}];var Zo=F('
'),Jo=F('
'),Qo=F('
'),ec=F('MiscTokens that do not fit a single category.
Body and heading fonts update as you adjust typography settings. Colors below
+} );`}];var s=Wo(),a=v(d(s),4);ie(a,17,()=>t,r=>r.name,(r,n)=>{var l=Go(),c=d(l),o=d(c),f=d(o),h=v(c,2),p=d(h),u=v(h,2),m=v(d(u),2),b=d(m),w=v(u,2),_=d(w),y=d(_);q(()=>{A(f,i(n).name),A(p,i(n).description),A(b,i(n).params),A(y,i(n).example)}),z(r,l)}),z(e,s)}const Xo=[{category:"Colors",description:"Brand, status, semantic, and derived color tokens. Source colors use oklch(); the framework derives light-dark pairs, palettes, and alpha scales automatically.",tokens:[{name:"--sf-color-{brand}-light",description:"Source color for the brand (oklch registered value). Set this to rebrand."},{name:"--sf-color-{brand}-dark",description:"Optional dark-mode override. If set, replaces the auto-derived dark variant for full per-mode control."},{name:"--sf-color-{brand}",description:"Resolved light-dark adaptive color for use in rules."},{name:"--sf-color-{brand}-{50-950}",description:"Palette scale: 50 (lightest) to 950 (darkest) mixed with base/text."},{name:"--sf-color-{brand}-a{5-95}",description:"Alpha scale: 5% to 95% opacity of the brand color."},{name:"--sf-color-{brand}-hover/active/muted/subtle/ghost/lighter/darker/xlight/xdark/superlight/superdark",description:"Semantic aliases for common UI states, mapped to palette steps."},{name:"--sf-color-bg",description:"Page background color, derived from base."},{name:"--sf-color-text",description:"Main body text color, contrast-aware."},{name:"--sf-color-heading",description:"Heading text color, slightly stronger than body text."},{name:"--sf-color-link",description:"Link color, derived from action brand."},{name:"--sf-color-border",description:"Default border color."},{name:"--sf-color-surface",description:"Card/panel surface color (equals base)."},{name:"--sf-color-overlay",description:"Semi-transparent overlay for modals."},{name:"--sf-color-dim",description:"50% black overlay for dimming backgrounds."},{name:"--sf-color-success/warning/error/info/danger",description:"Status feedback colors with -light source, -muted, -strong, -subtle variants."}]},{category:"Typography",description:"Font families, sizes (fluid clamp-based scale), weights, line-heights, letter-spacing, and heading configuration.",tokens:[{name:"--sf-font-body",description:"Body font stack (system-ui default)."},{name:"--sf-font-heading",description:"Heading font stack (defaults to body)."},{name:"--sf-font-mono",description:"Monospace font stack."},{name:"--sf-font-display",description:"Display/hero font (defaults to heading)."},{name:"--sf-font-geometric/humanist/slab",description:"Curated fallback stacks for common typographic personalities."},{name:"--sf-text-{2xs..4xl}",description:"Fluid type scale using clamp(). Sizes: 2xs, xs, s, m, l, xl, 2xl, 3xl, 4xl."},{name:"--sf-text-display-{s,m,l}",description:"Extra-large display/hero sizes."},{name:"--sf-text-scale",description:"Global multiplier for the type scale (default 1)."},{name:"--sf-font-weight-{thin..black}",description:"Named weight tokens: thin(100), extralight(200), light(300), normal(400), medium(500), semibold(600), bold(700), extrabold(800), black(900)."},{name:"--sf-leading-{tight,snug,normal,relaxed}",description:"Line-height presets: 1.1, 1.3, 1.5, 1.625."},{name:"--sf-tracking-{tight,normal,wide,wider,widest}",description:"Letter-spacing presets from -0.025em to 0.1em."},{name:"--sf-h{1-6}-size/font-weight/line-height/letter-spacing",description:"Per-heading-level configuration tokens."},{name:"--sf-body-*",description:"Body text configuration: font-size, font-weight, line-height, color, text-wrap."}]},{category:"Spacing",description:"Fluid spacing scale (clamp-based), gutters, section padding, and component padding.",tokens:[{name:"--sf-space-{2xs..4xl}",description:"Fluid spacing scale. Sizes: none, px, 2xs, xs, s, m, l, xl, 2xl, 3xl, 4xl."},{name:"--sf-space-scale",description:"Global multiplier for all space tokens (default 1)."},{name:"--sf-space-gutter",description:"Page-edge gutter (defaults to space-l)."},{name:"--sf-gap",description:"Default gap for layouts (defaults to space-m)."},{name:"--sf-content-gap",description:"Gap between content elements (defaults to space-s)."},{name:"--sf-section-pad--{s,m,l,xl}",description:"Vertical padding for page sections."},{name:"--sf-component-pad",description:"Internal padding for components (defaults to space-m)."},{name:"--sf-header-height",description:"Expected fixed header height for sticky offset calculations."},{name:"--sf-safe-{top,right,bottom,left}",description:"Safe area insets for notched devices."}]},{category:"Sizing",description:"Component sizes, touch targets, and aspect ratios.",tokens:[{name:"--sf-size-{xs..xl}",description:"Named size tokens: xs(1.5rem), s(2rem), m(2.5rem), l(2.75rem), xl(3.5rem)."},{name:"--sf-touch-target",description:"Minimum interactive element size (defaults to size-l, 2.75rem)."},{name:"--sf-ratio-{square,photo,video,cinema,golden,portrait}",description:"Predefined aspect ratios for frames and containers."},{name:"--sf-icon-{xs..xl}",description:"Icon sizing in em units (0.875em to 3em)."}]},{category:"Layout",description:"Container widths, layout primitive tokens (stack, cluster, grid, sidebar, switcher, bento, cover, frame, reel, imposter).",tokens:[{name:"--sf-container-{narrow,default,prose,wide,full}",description:"Max-width presets for .sf-container."},{name:"--sf-stack-gap",description:"Vertical gap between .sf-stack children."},{name:"--sf-cluster-gap/align/justify",description:"Inline cluster layout tokens."},{name:"--sf-sidebar-width/gap/min-width",description:"Sidebar layout tokens."},{name:"--sf-switcher-threshold/gap",description:"Column-to-stack breakpoint and gap."},{name:"--sf-grid-min/gap",description:"Auto-fill grid minimum item width and gap."},{name:"--sf-bento-cols/gap/row",description:"Dense bento grid configuration."},{name:"--sf-cover-min-height/padding",description:"Full-height cover layout."},{name:"--sf-frame-ratio",description:"Aspect ratio for .sf-frame (defaults to 16/9)."},{name:"--sf-reel-gap/height/item-width",description:"Horizontal scroll strip configuration."},{name:"--sf-imposter-margin",description:"Safety margin for absolute-centered overlays."},{name:"--sf-breakout-width/content-width",description:"Breakout grid track widths."},{name:"--sf-divider-color/style/width",description:"Divider appearance tokens."}]},{category:"Borders",description:"Border widths and styles.",tokens:[{name:"--sf-border-width-{hairline,1,2,3,4}",description:"Border width scale: 0.5px, 1px, 2px, 3px, 4px."},{name:"--sf-border-style/dotted/soft/strong",description:"Border style presets (solid, dotted, dashed, solid)."},{name:"--sf-stroke-{thin,regular,bold,heavy}",description:"Stroke widths for SVG/icon use: 1px, 1.5px, 2px, 3px."}]},{category:"Radius",description:"Border radius scale and special shapes.",tokens:[{name:"--sf-radius-{none,xs,s,m,l,xl,2xl,3xl,4xl,full}",description:"Radius scale from 0 to 9999px (pill)."},{name:"--sf-radius-scale",description:"Global multiplier for all radius tokens (default 1)."},{name:"--sf-radius-pill",description:"Fully rounded (9999px)."},{name:"--sf-radius-outer",description:"Outer radius = inner + padding (for nested rounding)."}]},{category:"Shadows",description:"Box shadows, drop shadows, text shadows, and shadow configuration.",tokens:[{name:"--sf-shadow-{xs,s,m,l,xl,2xl}",description:"Elevation shadow scale, progressively more dramatic."},{name:"--sf-shadow-inner",description:"Inset shadow for recessed elements."},{name:"--sf-shadow-glow",description:"Colored glow effect (uses --sf-shadow-glow-color)."},{name:"--sf-shadow-none",description:"Explicit no-shadow value."},{name:"--sf-shadow-color",description:"Base shadow color (derived from neutral)."},{name:"--sf-shadow-strength",description:"Shadow opacity multiplier (adapts to dark mode)."},{name:"--sf-drop-shadow-{s,m,l}",description:"CSS filter drop-shadow equivalents."},{name:"--sf-text-shadow-{s,m,l,none}",description:"Text shadow presets."}]},{category:"Effects",description:"Blurs, opacities, gradients, masks, and perspective.",tokens:[{name:"--sf-blur-{xs,s,m,l,xl}",description:"Blur radius scale: 4px to 48px."},{name:"--sf-opacity-{0,10,25,50,75,100,disabled}",description:"Named opacity presets."},{name:"--sf-gradient-{brand,primary,secondary,tertiary,surface}",description:"Predefined gradients using brand colors."},{name:"--sf-gradient-fade--{t,b,l,r}",description:"Directional fade-to-background gradients."},{name:"--sf-mask-scrim-start/end",description:"Scroll mask fade depth."},{name:"--sf-perspective-{near,normal,far}",description:"3D perspective presets: 500px, 1000px, 2000px."},{name:"--sf-contrast-bias/threshold",description:"Color contrast tuning for auto text-on-color logic."}]},{category:"Motion",description:"Durations, easing curves, transitions, and animations.",tokens:[{name:"--sf-duration-{none,instant,fast,normal,slow,slower}",description:"Duration scale: 0ms to 600ms (respects --sf-motion-scale)."},{name:"--sf-motion-scale",description:"Global animation speed multiplier (set 0 to disable)."},{name:"--sf-ease-{linear,in,out,in-out,bounce,elastic,overshoot,spring}",description:"Easing function presets."},{name:"--sf-transition-{all,colors,opacity,shadow,transform,fast,slow,enter,exit}",description:"Pre-composed transition shorthands."},{name:"--sf-animation-{fade-in,fade-out,scale-up,scale-down,slide-in-*,float,ping,blink,color-pulse}",description:"Named keyframe animation shorthands."},{name:"--sf-animation-delay-{1-5}",description:"Stagger delays for sequential animations."}]},{category:"Z-Index",description:"Z-index scale for predictable layering.",tokens:[{name:"--sf-z-{below,base,raised,low,mid,high,top,max}",description:"Z-index scale: -1, 0, 1, 10, 100, 500, 900, 9999."}]},{category:"Focus",description:"Focus ring appearance for keyboard navigation.",tokens:[{name:"--sf-focus-ring-width/offset/color/style/shadow",description:"Focus indicator configuration."},{name:"--sf-caret-color",description:"Text input caret color (defaults to action)."}]},{category:"Scroll",description:"Scroll timeline and scrollbar styling.",tokens:[{name:"--sf-scroll-timeline-range-start/end",description:"Scroll-driven animation range."},{name:"--sf-scrollbar-thumb/track",description:"Custom scrollbar colors."}]},{category:"Print",description:"Print stylesheet configuration.",tokens:[{name:"--sf-print-base-size/page-margin/page-size",description:"Print layout tokens: 11pt base, 2cm margins, A4 size."}]}],Zo=[{category:"Layout Primitives",description:"Breakpoint-free, container-query-driven layout components. Each is a single class with per-instance token overrides via inline style.",classes:[{name:".sf-section",description:"Vertical page rhythm with size variants (--s/--m/--l/--xl/--collapse)."},{name:".sf-section-group",description:"Collapses gap between adjacent sections."},{name:".sf-container",description:"Centered max-width wrapper with gutters. Variants: --narrow, --wide, --full, --prose."},{name:".sf-box",description:"Isolated unit with padding and optional border."},{name:".sf-center",description:"Intrinsic centering with max-width. Variant: --intrinsic."},{name:".sf-stack",description:"Vertical flow with consistent gap. Size variants: --2xs to --3xl. Alignment: --center, --end, --stretch."},{name:".sf-cluster",description:"Wrapping inline group. Size variants: --2xs to --xl. Alignment: --center, --end, --between. Wrap: --no-wrap."},{name:".sf-sidebar",description:"Content + side panel that wraps. Variants: --right, --narrow, --wide."},{name:".sf-switcher",description:"N columns above threshold, stacked below. Variants: --no-wrap, --vertical."},{name:".sf-grid",description:"Auto-fill responsive grid. Size variants: --xs to --xl. Variants: --fit, --dense."},{name:".sf-grid-{1,2,3,4,6}",description:"Fixed-column grids, container-responsive."},{name:".sf-grid-{1-2,2-1,1-3,3-1}",description:"Ratio two-column grids."},{name:".sf-bento",description:"Dense free-form grid. Variants: --2, --4, --compact, --tall."},{name:".sf-alternate",description:"Zigzag two-column layout, reverses every other row."},{name:".sf-pancake",description:"Sticky-footer grid: header / main(1fr) / footer."},{name:".sf-content-grid",description:"Breakout layout grid. Children use .sf-breakout or .sf-full-bleed."},{name:".sf-cover",description:"Full-height region with centered content. Variants: --min, --max, --padding-s, --padding-l."},{name:".sf-frame",description:"Aspect-ratio media box. Variants: --square, --portrait, --video, --cinema, --3-2, --4-3, --golden."},{name:".sf-reel",description:"Horizontal scroll strip with optional mask fade."},{name:".sf-imposter",description:"Absolutely-centered overlay. Variants: --fixed, --contain."},{name:".sf-subgrid / .sf-subgrid-rows",description:"Inherit parent grid tracks."},{name:".sf-divider",description:"Token-driven separator. Variant: --vertical."},{name:".sf-icon",description:"Em-based inline icon sizing. Sizes: --xs to --xl. Variant: --boxed."},{name:".sf-prose",description:"Readable long-form text with automatic vertical rhythm."},{name:".sf-not-prose",description:"Reset zone inside .sf-prose for embedded components."}]},{category:"Macros",description:"Recipe classes that answer 'what does this element do/look like?' - composable with layout primitives.",classes:[{name:".sf-flow",description:"Lobotomized owl: consistent gap between consecutive children."},{name:".sf-truncate",description:"Single-line ellipsis overflow."},{name:".sf-line-clamp-{2,3,N}",description:"Multi-line text clamping with ellipsis. -N reads --sf-line-clamp."},{name:".sf-equal-height",description:"Forces flex children to share the tallest child's height."},{name:".sf-aspect",description:"Generic aspect-ratio container (reads --sf-aspect token)."},{name:".sf-scroll-shadow",description:"Top + bottom mask gradient for scrolling containers."},{name:".sf-scroll-snap",description:"Vertical scroll-snap container."},{name:".sf-overflow-fade",description:"End-edge horizontal fade for overflowing inline content."},{name:".sf-no-tap-highlight",description:"Suppresses WebKit/Android tap highlight."},{name:".sf-text-gradient",description:"Gradient text effect using background-clip."},{name:".sf-clickable-parent",description:"Makes an entire card clickable via the first link inside."},{name:".sf-link-external",description:"Adds external link indicator marker."}]},{category:"Surfaces",description:"Color surface utility classes that set background and text color for a brand context.",classes:[{name:".sf-surface--{primary,secondary,tertiary,action,neutral,inverse}",description:"Brand-colored surface with auto-contrast text."},{name:".sf-surface--{success,warning,error,info,danger}",description:"Status-colored surfaces."}]},{category:"Animations",description:"CSS animation utility classes that apply predefined keyframe animations.",classes:[{name:".sf-fade-in / .sf-fade-out",description:"Opacity entrance/exit animations."},{name:".sf-scale-up / .sf-scale-down",description:"Scale entrance/exit animations."},{name:".sf-slide-in-{up,down,left,right}",description:"Directional slide-in entrance animations."},{name:".sf-color-pulse",description:"Continuous color pulse animation."},{name:".sf-entrance--fade / --fade-up / --fade-down / --fade-left / --fade-right / --scale-up",description:"Scroll-triggered entrance animations (scroll-timeline driven)."}]},{category:"State Classes (.is-*)",description:"Runtime state classes toggled by JS or mirrored from ARIA. They live in the slashed.states layer. Always pair with matching ARIA attributes.",classes:[{name:".is-hidden / .is-invisible / .is-visible",description:"Visibility control: removed from layout / hidden but keeps box / visible."},{name:".is-disabled / .is-readonly",description:"Non-interactive states with dimming."},{name:".is-loading / .is-pending / .is-busy",description:"Loading states: spinner replacement / optimistic UI / cursor hint."},{name:".is-skeleton",description:"Placeholder shimmer animation."},{name:".is-active / .is-selected / .is-current / .is-pressed",description:"Selection/activation states."},{name:".is-highlighted",description:"Transient emphasis (e.g. search result highlight)."},{name:".is-open / .is-collapsed / .is-expanded",description:"Disclosure states for modals, drawers, accordions."},{name:".is-valid / .is-invalid",description:"Form field validation results (maps to aria-invalid)."},{name:".is-success / .is-error / .is-warning / .is-info / .is-danger",description:"General feedback states and destructive-action context."},{name:".is-sticky / .is-pinned / .is-fixed / .is-fullscreen",description:"Positioning states."},{name:".is-clipped / .is-scrollable / .is-truncated / .is-resizable",description:"Overflow handling states."},{name:".is-dragging / .is-drop-target / .is-draggable",description:"Drag and drop states."},{name:".is-overlay / .is-focused / .is-clickable / .is-unselectable",description:"Positioning, focus, cursor, and selection states."},{name:".is-empty",description:"Hide element when empty (:empty pseudo-class)."}]}],Jo=[{name:"--sf-is-dark",description:"Numeric flag (0 or 1) indicating dark mode is active. Registered property."},{name:"--sf-lumlocker",description:"Internal luminance lock value for color derivation."},{name:"--sf-color-scheme",description:"CSS color-scheme declaration (light dark)."},{name:"--sf-current-font-weight",description:"Current context font weight (used by strong elements)."},{name:"--sf-link-external-marker",description:"External link arrow character."},{name:"--sf-field-block",description:"Vertical spacing between form fields."},{name:"--sf-field-required-marker",description:"Required field indicator string."}];var Qo=F('
'),ec=F('
'),tc=F('
'),sc=F('MiscTokens that do not fit a single category.