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),Do=C(`
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),Io=C(`
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.
Scale GeneratorComputes all step min/max values from a modular scale. Click Apply to write them to the fields below.
');function ml(e,t){ze(t,!0);const s=[{label:"Minor Second (1.067)",value:1.067},{label:"Major Second (1.125)",value:1.125},{label:"Minor Third (1.200)",value:1.2},{label:"Major Third (1.250)",value:1.25},{label:"Perfect Fourth (1.333)",value:1.333},{label:"Aug. Fourth (1.414)",value:1.414},{label:"Perfect Fifth (1.500)",value:1.5},{label:"Golden Ratio (1.618)",value:1.618},{label:"Major Sixth (1.667)",value:1.667},{label:"Octave (2.000)",value:2}],a=[{name:"2xs",idx:-4},{name:"xs",idx:-3},{name:"s",idx:-2},{name:"m",idx:0},{name:"l",idx:1},{name:"xl",idx:2},{name:"2xl",idx:3},{name:"3xl",idx:4},{name:"4xl",idx:5},{name:"display-s",idx:5},{name:"display-m",idx:6},{name:"display-l",idx:7}];let n=fe(1),i=fe(1.25),o=fe(1.25),u=fe(1.333),c=fe(.85);const v=y(()=>a.map(({name:$,idx:k})=>{const G=$.startsWith("display")?r(c):1,Z=+(r(n)*G*Math.pow(r(o),k)).toFixed(4),j=+(r(i)*G*Math.pow(r(u),k)).toFixed(4);return{name:$,min:Z,max:j}}));function h(){Q.typography||(Q.typography={});for(const{name:$,min:k,max:P}of r(v))Q.typography[`size_${$}_min`]=String(k),Q.typography[`size_${$}_max`]=String(P);gr()}var f=gl(),p=d(l(f),2),m=l(p),b=d(l(m),2),x=l(b),_=d(m,2),w=d(l(_),2),S=l(w),E=d(_,2),F=d(l(E),2);de(F,21,()=>s,$=>$.value,($,k)=>{var P=pl(),G=l(P),Z={};V(()=>{R(G,r(k).label),Z!==(Z=r(k).value)&&(P.value=(P.__value=r(k).value)??"")}),A($,P)});var Y=d(E,2),T=d(l(Y),2);de(T,21,()=>s,$=>$.value,($,k)=>{var P=hl(),G=l(P),Z={};V(()=>{R(G,r(k).label),Z!==(Z=r(k).value)&&(P.value=(P.__value=r(k).value)??"")}),A($,P)});var z=d(Y,2),D=d(l(z),2),O=l(D),K=d(p,2);de(K,21,()=>r(v),({name:$,min:k,max:P})=>$,($,k)=>{let P=()=>r(k).name,G=()=>r(k).min,Z=()=>r(k).max;var j=_l();let N;var L=l(j),H=l(L),se=d(L,2),ie=l(se);V((ae,oe,U)=>{N=Ie(j,1,"scale-gen__step svelte-1y8fkhh",null,N,ae),R(H,P()),R(ie,`${oe??""} / ${U??""}`)},[()=>({display:P().startsWith("display")}),()=>G().toFixed(3),()=>Z().toFixed(3)]),A($,j)});var q=d(K,2),B=l(q);Vt(x,()=>r(n),$=>J(n,$)),Vt(S,()=>r(i),$=>J(i,$)),Sa(F,()=>r(o),$=>J(o,$)),Sa(T,()=>r(u),$=>J(u,$)),Vt(O,()=>r(c),$=>J(c,$)),ge("click",B,h),A(e,f),Fe()}He(["click"]);var bl=C('
'),yl=C(`
Additional Font Families
Font Size Scale
Min and max values in rem for fluid type scaling via clamp().
Leave both fields blank to use the framework defaults. The viewport range these
sizes interpolate across (and the range the Live Scale Preview above scrubs) is the Fluid Scale Viewport Range set in the Spacing tab —
- it's the shared source for both spacing and typography.
The viewport width range (in rem) used to compute all fluid clamp() formulas for custom-overridden spacing and typography values. Default: 22.5 rem (360 px) → 95 rem (1520 px). Changing these only affects values you explicitly
+ it's the shared source for both spacing and typography.
The viewport width range (in rem) used to compute all fluid clamp() formulas for custom-overridden spacing and typography values. Default: 22.5 rem (360 px) → 95 rem (1520 px). Changing these only affects values you explicitly
override below or in the Typography tab — the framework's built-in scale uses the same defaults
and is unaffected.
Space Scale Steps
Min and max values in rem for fluid spacing via clamp().
- Leave both fields blank to use the framework defaults.
Space Aliases
`,1),xl=C(`
Spacing
The Space Scale multiplier scales every spacing token at once — the quickest
+ Leave both fields blank to use the framework defaults.
Space Aliases
`,1),$l=C(`
Spacing
The Space Scale multiplier scales every spacing token at once — the quickest
way to make a whole site more or less airy. Fine-grained per-step overrides, the fluid
- viewport range, and named aliases live under Advanced.
All --sf-* custom properties declared in the active SLASHED bundle,
- grouped by category.
`);function Il(e,t){ze(t,!0);const s=le.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",object:"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",alternate:"Layout",equal:"Layout",col:"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",state:"States",focus:"Focus",caret:"Focus",scroll:"Scroll",scrollbar:"Scroll",print:"Print",truncate:"Misc"},n=["Colors","Typography","Spacing","Sizing","Layout","Borders","Radius","Shadows","Effects","Motion","Icons","Z-Index","States","Focus","Scroll","Print","Misc"];function i(b){let x=b;x.startsWith("--sf-")&&(x=x.slice(5));const _=x.indexOf("-"),w=_===-1?x:x.slice(0,_);return a[w]||"Misc"}function o(b){const x={};for(const w of b){const E=i(w);x[E]||(x[E]=[]),x[E].push(w)}const _=[];for(const w of n)x[w]?.length&&(x[w].sort(),_.push({category:w,items:x[w]}));for(const w of Object.keys(x))!n.includes(w)&&x[w]?.length&&(x[w].sort(),_.push({category:w,items:x[w]}));return _}const u=o(s);let c=Ve({});function v(b){c[b]=!c[b]}var h=Ll(),f=l(h),p=l(f),m=d(f,4);de(m,17,()=>u,({category:b,items:x})=>b,(b,x)=>{let _=()=>r(x).category,w=()=>r(x).items;var E=Dl(),A=l(E),F=l(A),Y=l(F),T=d(F,2),z=l(T),D=d(T,2),O=l(D),K=d(A,2);{var q=B=>{var $=Ml();de($,20,w,k=>k,(k,R)=>{var G=ql(),Z=l(G),j=l(Z);V(()=>P(j,R)),S(k,G)}),S(B,$)};me(K,B=>{c[_()]&&B(q)})}V(()=>{te(A,"aria-expanded",c[_()]?"true":"false"),P(Y,c[_()]?"▼":"▶"),P(z,_()),P(O,`(${w().length??""})`)}),ge("click",A,()=>v(_())),S(b,E)}),V(()=>P(p,`CSS Variables (${s.length??""})`)),S(e,h),Fe()}He(["click"]);var Vl=C('
'),Ol=C('
'),Kl=C('
'),Bl=C('
'),Nl=C('
All utility and state classes declared in the active SLASHED bundle.
');function Hl(e,t){ze(t,!0);const s=le.inventory?.sf_classes??[],a=le.inventory?.is_classes??[];let n=he(!1),i=he(!1);var o=Nl(),u=l(o),c=l(u),v=d(u,4),h=l(v),f=l(h),p=l(f),m=d(f,4),b=l(m),x=d(h,2);{var _=O=>{var K=Ol();de(K,20,()=>s,q=>q,(q,B)=>{var $=Vl(),k=l($),R=l(k);V(()=>P(R,`.${B??""}`)),S(q,$)}),S(O,K)};me(x,O=>{r(n)&&O(_)})}var w=d(v,2),E=l(w),A=l(E),F=l(A),Y=d(A,4),T=l(Y),z=d(E,2);{var D=O=>{var K=Bl();de(K,20,()=>a,q=>q,(q,B)=>{var $=Kl(),k=l($),R=l(k);V(()=>P(R,`.${B??""}`)),S(q,$)}),S(O,K)};me(z,O=>{r(i)&&O(D)})}V(()=>{P(c,`Registered Classes (${s.length+a.length})`),te(h,"aria-expanded",r(n)?"true":"false"),P(p,r(n)?"▼":"▶"),P(b,`(${s.length??""})`),te(E,"aria-expanded",r(i)?"true":"false"),P(F,r(i)?"▼":"▶"),P(T,`(${a.length??""})`)}),ge("click",h,()=>J(n,!r(n))),ge("click",E,()=>J(i,!r(i))),S(e,o),Fe()}He(["click"]);async function Pa(e,t){const{url:s,nonce:a}=le.rest;if(!s)return console.info("[slashed-admin] (dev) would POST",e,t),{ok:!0,dev:!0};const n=await fetch(s+e,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":a},body:JSON.stringify(t)});if(!n.ok){const i=await n.text();throw new Error(i||`HTTP ${n.status}`)}return n.json()}function Mr(e,t){return Pa("/tokens",{section:e,values:t})}function Dr(e){return Pa("/tokens/reset",{section:e})}function Gl(e){return Pa("/settings",e)}async function Ul(){const{url:e,nonce:t}=le.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 Wl(e){return Pa("/tokens/import",e)}var Yl=C(`
When enabled, hovering a SLASHED class in the Bricks class manager shows a short
- description of what it does. Powered by data/classes-hints.json.
`),Xl=C('
Show class hints in Bricks editor Bricks
Enable the Bricks integration in SLASHED Settings to use this feature.
'),Zl=C('Saved'),Jl=C(''),Ql=C(`
Bundle Info
The SLASHED CSS bundle is loaded automatically on the frontend and in the block editor canvas.
+ viewport range, and named aliases live under Advanced.
When enabled, hovering a SLASHED class in the Bricks class manager shows a short
+ description of what it does. Powered by data/classes-hints.json.
`),Ql=C('
Show class hints in Bricks editor Bricks
Enable the Bricks integration in SLASHED Settings to use this feature.
'),ec=C('Saved'),tc=C(''),sc=C(`
Bundle Info
The SLASHED CSS bundle is loaded automatically on the frontend and in the block editor canvas.
The inventory is parsed from whichever bundle is active and drives the variable pickers,
class autocomplete, and color palette in any active builder integration.
Variables registered
Classes registered
Plugin Settings
Choose which SLASHED CSS bundle to load on the frontend and in builder canvases. Essential is the full core layer (everything in core/). Optimal adds the optional color palette, extended size/spacing scales,
form styling, and legacy fallbacks. Full additionally bundles the
component tokens & styles and the utility classes.
Override the HTML root font-size. Use this when your theme or builder forces a root font-size
- that conflicts with rem-based framework values.
`);function ec(e,t){ze(t,!0);let s=he(Ve(le.pluginSettings?.css_bundle??"optimal")),a=he(Ve(le.pluginSettings?.html_font_size??"")),n=he(Ve(le.pluginSettings?.show_class_hints??!1)),i=he(!1),o=he(!1),u=he(""),c=null;const v=y(()=>le.activeIntegrations?.bricks??!0);async function h(){J(i,!0),J(o,!1),J(u,"");try{await Gl({css_bundle:r(s),html_font_size:r(a),show_class_hints:r(n)}),J(o,!0),c&&clearTimeout(c),c=setTimeout(()=>{J(o,!1),c=null},3e3)}catch(H){J(u,H.message||"Save failed",!0)}finally{J(i,!1)}}var f=Ql(),p=d(l(f),4),m=d(l(p),2),b=l(m),x=d(m,4),_=l(x),w=d(p,4),E=d(l(w),2),A=l(E);A.value=A.__value="essential";var F=d(A);F.value=F.__value="optimal";var Y=d(F);Y.value=Y.__value="full";var T=d(w,2),z=d(l(T),2),D=l(z);D.value=D.__value="";var O=d(D);O.value=O.__value="100";var K=d(O);K.value=K.__value="62.5";var q=d(T,2);{var B=H=>{var se=Yl(),ne=l(se),ae=l(ne);wo(ae,()=>r(n),ie=>J(n,ie)),S(H,se)},$=H=>{var se=Xl();S(H,se)};me(q,H=>{r(v)?H(B):H($,-1)})}var k=d(q,2),R=l(k),G=l(R),Z=d(R,2);{var j=H=>{var se=Zl();S(H,se)};me(Z,H=>{r(o)&&H(j)})}var N=d(Z,2);{var L=H=>{var se=Jl(),ne=l(se);V(()=>P(ne,r(u))),S(H,se)};me(N,H=>{r(u)&&H(L)})}V(()=>{P(b,le.inventory?.variables?.length??0),P(_,(le.inventory?.sf_classes?.length??0)+(le.inventory?.is_classes?.length??0)),R.disabled=r(i),P(G,r(i)?"Saving...":"Save Settings")}),ka(E,()=>r(s),H=>J(s,H)),ka(z,()=>r(a),H=>J(a,H)),ge("click",R,h),S(e,f),Fe()}He(["click"]);const Lr=22.5,tc=95;function qn(e,t){if(e<=0||t<=0)return null;const s=tc-Lr,a=(t-e)/s,n=parseFloat(a.toFixed(6)),i=parseFloat(e.toFixed(4)),o=parseFloat(t.toFixed(4));return`clamp(${i}rem, calc(${n} * (100vw - ${Lr}rem) + ${i}rem), ${o}rem)`}function Ir(e){const t=parseFloat(e);if(isNaN(t))return"0";let s=t.toFixed(6).replace(/0+$/,"").replace(/\.$/,"");return s===""?"0":s}function De(e){return e!=null&&e!==""}function sc(e){const t=[],s=["primary","secondary","tertiary","action","neutral","base"];for(const i of s){const o=`brand_${i}`;De(e[o])&&t.push(`--sf-color-${i}-light: ${e[o]};`)}const a=["success","warning","error","info","danger"];for(const i of a){const o=`status_${i}`;De(e[o])&&t.push(`--sf-color-${i}-light: ${e[o]};`)}if(e.dark_overrides_enabled!=="0"){for(const i of s){const o=`brand_dark_${i}`;De(e[o])&&t.push(`--sf-color-${i}-dark: ${e[o]};`)}for(const i of a){const o=`status_dark_${i}`;De(e[o])&&t.push(`--sf-color-${i}-dark: ${e[o]};`)}}return t}function ac(e){const t=[],s=["body","heading","mono","display","humanist","geometric","slab"];for(const n of s){const i=`font_${n}`;De(e[i])&&t.push(`--sf-font-${n}: ${e[i]};`)}De(e.text_scale)&&t.push(`--sf-text-scale: ${e.text_scale};`),De(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 n of a){const i=`size_${n}_min`,o=`size_${n}_max`,u=e[i],c=e[o];if(De(u)&&De(c)){const v=qn(parseFloat(u),parseFloat(c));v&&t.push(`--sf-text-${n}: ${v};`)}}return t}function rc(e){const t=[];De(e.space_scale)&&t.push(`--sf-space-scale: ${e.space_scale};`);const s=["2xs","xs","s","m","l","xl","2xl","3xl","4xl"];for(const n of s){const i=e[`space_${n}_min`],o=e[`space_${n}_max`];if(De(i)&&De(o)){const u=qn(parseFloat(i),parseFloat(o));u&&t.push(`--sf-space-${n}: calc(${u} * 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[n,i]of Object.entries(a))De(e[n])&&t.push(`${i}: ${e[n]};`);return t}function nc(e){const t=[];return De(e.radius_scale)&&t.push(`--sf-radius-scale: ${e.radius_scale};`),t}function ic(e){const t=[];return De(e.shadow_strength)&&t.push(`--sf-shadow-strength: calc(${e.shadow_strength} + var(--sf-is-dark) * 0.17);`),De(e.glow_color)&&t.push(`--sf-shadow-glow-color: ${e.glow_color};`),t}function oc(e){const t=[];De(e.motion_scale)&&t.push(`--sf-motion-scale: ${e.motion_scale};`);const s=["instant","fast","normal","slow","slower"];for(const a of s){const n=`duration_${a}`;De(e[n])&&t.push(`--sf-duration-${a}: calc(${e[n]}ms * var(--sf-motion-scale));`)}return t}function lc(e){const t=[],s=["below","base","raised","low","mid","high","top","max"];for(const a of s)De(e[a])&&t.push(`--sf-z-${a}: ${parseInt(e[a],10)};`);return t}function cc(e){const t=[],s={contrast_bias:"--sf-contrast-bias",contrast_threshold:"--sf-contrast-threshold",opacity_disabled:"--sf-opacity-disabled"};for(const[n,i]of Object.entries(s))De(e[n])&&t.push(`${i}: ${Ir(e[n])};`);const a={focus_ring_width:"--sf-focus-ring-width",focus_ring_offset:"--sf-focus-ring-offset"};for(const[n,i]of Object.entries(a))De(e[n])&&t.push(`${i}: ${Ir(e[n])}px;`);return De(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 mr(e){const t=[];if(e.colors&&typeof e.colors=="object"&&t.push(...sc(e.colors)),e.typography&&typeof e.typography=="object"&&t.push(...ac(e.typography)),e.spacing&&typeof e.spacing=="object"&&t.push(...rc(e.spacing)),e.radius&&typeof e.radius=="object"&&t.push(...nc(e.radius)),e.shadows&&typeof e.shadows=="object"&&t.push(...ic(e.shadows)),e.motion&&typeof e.motion=="object"&&t.push(...oc(e.motion)),e.zindex&&typeof e.zindex=="object"&&t.push(...lc(e.zindex)),e.contrast&&typeof e.contrast=="object"&&t.push(...cc(e.contrast)),t.length===0)return"";let s=`@layer slashed.overrides {
+ that conflicts with rem-based framework values.
`);function ac(e,t){ze(t,!0);let s=fe(Ve(ne.pluginSettings?.css_bundle??"optimal")),a=fe(Ve(ne.pluginSettings?.html_font_size??"")),n=fe(Ve(ne.pluginSettings?.show_class_hints??!1)),i=fe(!1),o=fe(!1),u=fe(""),c=null;const v=y(()=>ne.activeIntegrations?.bricks??!0);async function h(){J(i,!0),J(o,!1),J(u,"");try{await Uo({css_bundle:r(s),html_font_size:r(a),show_class_hints:r(n)}),J(o,!0),c&&clearTimeout(c),c=setTimeout(()=>{J(o,!1),c=null},3e3)}catch(H){J(u,H.message||"Save failed",!0)}finally{J(i,!1)}}var f=sc(),p=d(l(f),4),m=d(l(p),2),b=l(m),x=d(m,4),_=l(x),w=d(p,4),S=d(l(w),2),E=l(S);E.value=E.__value="essential";var F=d(E);F.value=F.__value="optimal";var Y=d(F);Y.value=Y.__value="full";var T=d(w,2),z=d(l(T),2),D=l(z);D.value=D.__value="";var O=d(D);O.value=O.__value="100";var K=d(O);K.value=K.__value="62.5";var q=d(T,2);{var B=H=>{var se=Jl(),ie=l(se),ae=l(ie);xo(ae,()=>r(n),oe=>J(n,oe)),A(H,se)},$=H=>{var se=Ql();A(H,se)};me(q,H=>{r(v)?H(B):H($,-1)})}var k=d(q,2),P=l(k),G=l(P),Z=d(P,2);{var j=H=>{var se=ec();A(H,se)};me(Z,H=>{r(o)&&H(j)})}var N=d(Z,2);{var L=H=>{var se=tc(),ie=l(se);V(()=>R(ie,r(u))),A(H,se)};me(N,H=>{r(u)&&H(L)})}V(()=>{R(b,ne.inventory?.variables?.length??0),R(_,(ne.inventory?.sf_classes?.length??0)+(ne.inventory?.is_classes?.length??0)),P.disabled=r(i),R(G,r(i)?"Saving...":"Save Settings")}),Sa(S,()=>r(s),H=>J(s,H)),Sa(z,()=>r(a),H=>J(a,H)),ge("click",P,h),A(e,f),Fe()}He(["click"]);const Lr=22.5,rc=95;function qn(e,t){if(e<=0||t<=0)return null;const s=rc-Lr,a=(t-e)/s,n=parseFloat(a.toFixed(6)),i=parseFloat(e.toFixed(4)),o=parseFloat(t.toFixed(4));return`clamp(${i}rem, calc(${n} * (100vw - ${Lr}rem) + ${i}rem), ${o}rem)`}function Ir(e){const t=parseFloat(e);if(isNaN(t))return"0";let s=t.toFixed(6).replace(/0+$/,"").replace(/\.$/,"");return s===""?"0":s}function De(e){return e!=null&&e!==""}function nc(e){const t=[],s=["primary","secondary","tertiary","action","neutral","base"];for(const i of s){const o=`brand_${i}`;De(e[o])&&t.push(`--sf-color-${i}-light: ${e[o]};`)}const a=["success","warning","error","info","danger"];for(const i of a){const o=`status_${i}`;De(e[o])&&t.push(`--sf-color-${i}-light: ${e[o]};`)}if(e.dark_overrides_enabled!=="0"){for(const i of s){const o=`brand_dark_${i}`;De(e[o])&&t.push(`--sf-color-${i}-dark: ${e[o]};`)}for(const i of a){const o=`status_dark_${i}`;De(e[o])&&t.push(`--sf-color-${i}-dark: ${e[o]};`)}}return t}function ic(e){const t=[],s=["body","heading","mono","display","humanist","geometric","slab"];for(const n of s){const i=`font_${n}`;De(e[i])&&t.push(`--sf-font-${n}: ${e[i]};`)}De(e.text_scale)&&t.push(`--sf-text-scale: ${e.text_scale};`),De(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 n of a){const i=`size_${n}_min`,o=`size_${n}_max`,u=e[i],c=e[o];if(De(u)&&De(c)){const v=qn(parseFloat(u),parseFloat(c));v&&t.push(`--sf-text-${n}: ${v};`)}}return t}function oc(e){const t=[];De(e.space_scale)&&t.push(`--sf-space-scale: ${e.space_scale};`);const s=["2xs","xs","s","m","l","xl","2xl","3xl","4xl"];for(const n of s){const i=e[`space_${n}_min`],o=e[`space_${n}_max`];if(De(i)&&De(o)){const u=qn(parseFloat(i),parseFloat(o));u&&t.push(`--sf-space-${n}: calc(${u} * 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[n,i]of Object.entries(a))De(e[n])&&t.push(`${i}: ${e[n]};`);return t}function lc(e){const t=[];return De(e.radius_scale)&&t.push(`--sf-radius-scale: ${e.radius_scale};`),t}function cc(e){const t=[];return De(e.shadow_strength)&&t.push(`--sf-shadow-strength: calc(${e.shadow_strength} + var(--sf-is-dark) * 0.17);`),De(e.glow_color)&&t.push(`--sf-shadow-glow-color: ${e.glow_color};`),t}function dc(e){const t=[];De(e.motion_scale)&&t.push(`--sf-motion-scale: ${e.motion_scale};`);const s=["instant","fast","normal","slow","slower"];for(const a of s){const n=`duration_${a}`;De(e[n])&&t.push(`--sf-duration-${a}: calc(${e[n]}ms * var(--sf-motion-scale));`)}return t}function uc(e){const t=[],s=["below","base","raised","low","mid","high","top","max"];for(const a of s)De(e[a])&&t.push(`--sf-z-${a}: ${parseInt(e[a],10)};`);return t}function vc(e){const t=[],s={contrast_bias:"--sf-contrast-bias",contrast_threshold:"--sf-contrast-threshold",opacity_disabled:"--sf-opacity-disabled"};for(const[n,i]of Object.entries(s))De(e[n])&&t.push(`${i}: ${Ir(e[n])};`);const a={focus_ring_width:"--sf-focus-ring-width",focus_ring_offset:"--sf-focus-ring-offset"};for(const[n,i]of Object.entries(a))De(e[n])&&t.push(`${i}: ${Ir(e[n])}px;`);return De(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 mr(e){const t=[];if(e.colors&&typeof e.colors=="object"&&t.push(...nc(e.colors)),e.typography&&typeof e.typography=="object"&&t.push(...ic(e.typography)),e.spacing&&typeof e.spacing=="object"&&t.push(...oc(e.spacing)),e.radius&&typeof e.radius=="object"&&t.push(...lc(e.radius)),e.shadows&&typeof e.shadows=="object"&&t.push(...cc(e.shadows)),e.motion&&typeof e.motion=="object"&&t.push(...dc(e.motion)),e.zindex&&typeof e.zindex=="object"&&t.push(...uc(e.zindex)),e.contrast&&typeof e.contrast=="object"&&t.push(...vc(e.contrast)),t.length===0)return"";let s=`@layer slashed.overrides {
:root {
`;for(const a of t)s+=` ${a}
`;return s+=` }
-}`,s}function dc(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 uc=C(''),vc=C('
'),fc=C('
'),pc=C(`
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 fc(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 pc=C(''),hc=C('
'),_c=C('
'),gc=C(`
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.
Token exports are builder-agnostic — the file carries the brand tokens that drive the visual
result regardless of which builder or theme is in use.
Export
Downloads a .json file containing all your active token overrides and plugin settings.
Share this file alongside your 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
@@ -38,8 +38,8 @@ var Dn=Object.defineProperty;var br=e=>{throw TypeError(e)};var Ln=(e,t,s)=>t in
via this tab, then import your template via your builder. SLASHED re-registers all classes,
variables, and color palettes automatically.
Verify that colors, spacing, and fonts match the original.
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 hc(e,t){ze(t,!0);let s=he(!1),a=he("");const n=y(()=>mr(Q)),i=y(()=>r(n).length>0);function o(){if(!r(n))return;const R=new Blob([r(n)],{type:"text/css"}),G=URL.createObjectURL(R),Z=document.createElement("a");Z.href=G,Z.download=`slashed-custom-${new Date().toISOString().slice(0,10)}.css`,Z.click(),URL.revokeObjectURL(G)}async function u(){J(s,!0),J(a,"");try{const R=await Ul(),G=JSON.stringify(R,null,2),Z=new Blob([G],{type:"application/json"}),j=URL.createObjectURL(Z),N=document.createElement("a");N.href=j,N.download=`slashed-tokens-${new Date().toISOString().slice(0,10)}.json`,N.click(),URL.revokeObjectURL(j)}catch(R){J(a,R.message||"Export failed",!0)}finally{J(s,!1)}}let c=he(null),v=he(!1),h=he(""),f=he(""),p=he(0);async function m(){const R=r(c)?.files?.[0];if(R){J(h,""),J(f,""),J(v,!0);try{const G=await R.text(),Z=JSON.parse(G),j=await Wl(Z),N=j.settings_imported?" Plugin settings restored.":"";J(h,`Imported ${j.imported} section(s) successfully.${N}`),J(p,3);const L=setInterval(()=>{J(p,r(p)-1),r(p)<=0&&(clearInterval(L),window.location.reload())},1e3)}catch(G){J(f,G.message||"Import failed",!0)}finally{J(v,!1),r(c)&&(r(c).value="")}}}var b=pc(),x=d(l(b),4),_=d(l(x),4),w=l(_),E=l(w),A=d(w,2),F=d(A,2);{var Y=R=>{var G=uc(),Z=l(G);V(()=>P(Z,r(a))),S(R,G)};me(F,R=>{r(a)&&R(Y)})}var T=d(x,2),z=d(l(T),4),D=l(z);xo(D,R=>J(c,R),()=>r(c));var O=d(D,2),K=l(O),q=d(z,2);{var B=R=>{var G=vc(),Z=l(G),j=d(Z);{var N=L=>{var H=oo();V(()=>P(H,`Reloading in ${r(p)??""}…`)),S(L,H)};me(j,L=>{r(p)>0&&L(N)})}V(()=>P(Z,`${r(h)??""} `)),S(R,G)};me(q,R=>{r(h)&&R(B)})}var $=d(q,2);{var k=R=>{var G=fc(),Z=l(G);V(()=>P(Z,r(f))),S(R,G)};me($,R=>{r(f)&&R(k)})}V(()=>{w.disabled=r(s),P(E,r(s)?"Exporting…":"Download token file (.json)"),A.disabled=!r(i),te(A,"title",r(i)?"Download overrides as a standalone CSS file":"No overrides set yet"),O.disabled=r(v),P(K,r(v)?"Importing…":"Import token file")}),ge("click",w,u),ge("click",A,o),ge("click",O,m),S(e,b),Fe()}He(["click"]);var _c=C('Bricks integration is disabled — these hooks have no effect until it is turned on.'),gc=C('
Parameters:
'),mc=C(`
Filter Hooks Reference
These WordPress filter hooks let you customize SLASHED integrations from your theme or a mu-plugin.
- Hooks only fire when their respective integration is active.
Bricks integrationBricks
`);function bc(e,t){ze(t,!0);const s=[{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 mc(e,t){ze(t,!0);let s=fe(!1),a=fe("");const n=y(()=>mr(Q)),i=y(()=>r(n).length>0);function o(){if(!r(n))return;const P=new Blob([r(n)],{type:"text/css"}),G=URL.createObjectURL(P),Z=document.createElement("a");Z.href=G,Z.download=`slashed-custom-${new Date().toISOString().slice(0,10)}.css`,Z.click(),URL.revokeObjectURL(G)}async function u(){J(s,!0),J(a,"");try{const P=await Yo(),G=JSON.stringify(P,null,2),Z=new Blob([G],{type:"application/json"}),j=URL.createObjectURL(Z),N=document.createElement("a");N.href=j,N.download=`slashed-tokens-${new Date().toISOString().slice(0,10)}.json`,N.click(),URL.revokeObjectURL(j)}catch(P){J(a,P.message||"Export failed",!0)}finally{J(s,!1)}}let c=fe(null),v=fe(!1),h=fe(""),f=fe(""),p=fe(0);async function m(){const P=r(c)?.files?.[0];if(P){J(h,""),J(f,""),J(v,!0);try{const G=await P.text(),Z=JSON.parse(G),j=await Xo(Z),N=j.settings_imported?" Plugin settings restored.":"";J(h,`Imported ${j.imported} section(s) successfully.${N}`),J(p,3);const L=setInterval(()=>{J(p,r(p)-1),r(p)<=0&&(clearInterval(L),window.location.reload())},1e3)}catch(G){J(f,G.message||"Import failed",!0)}finally{J(v,!1),r(c)&&(r(c).value="")}}}var b=gc(),x=d(l(b),4),_=d(l(x),4),w=l(_),S=l(w),E=d(w,2),F=d(E,2);{var Y=P=>{var G=pc(),Z=l(G);V(()=>R(Z,r(a))),A(P,G)};me(F,P=>{r(a)&&P(Y)})}var T=d(x,2),z=d(l(T),4),D=l(z);ko(D,P=>J(c,P),()=>r(c));var O=d(D,2),K=l(O),q=d(z,2);{var B=P=>{var G=hc(),Z=l(G),j=d(Z);{var N=L=>{var H=lo();V(()=>R(H,`Reloading in ${r(p)??""}…`)),A(L,H)};me(j,L=>{r(p)>0&&L(N)})}V(()=>R(Z,`${r(h)??""} `)),A(P,G)};me(q,P=>{r(h)&&P(B)})}var $=d(q,2);{var k=P=>{var G=_c(),Z=l(G);V(()=>R(Z,r(f))),A(P,G)};me($,P=>{r(f)&&P(k)})}V(()=>{w.disabled=r(s),R(S,r(s)?"Exporting…":"Download token file (.json)"),E.disabled=!r(i),te(E,"title",r(i)?"Download overrides as a standalone CSS file":"No overrides set yet"),O.disabled=r(v),R(K,r(v)?"Importing…":"Import token file")}),ge("click",w,u),ge("click",E,o),ge("click",O,m),A(e,b),Fe()}He(["click"]);var bc=C('Bricks integration is disabled — these hooks have no effect until it is turned on.'),yc=C('
Parameters:
'),wc=C(`
Filter Hooks Reference
These WordPress filter hooks let you customize SLASHED integrations from your theme or a mu-plugin.
+ Hooks only fire when their respective integration is active.
Bricks integrationBricks
`);function xc(e,t){ze(t,!0);const s=[{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 ) {
@@ -68,14 +68,14 @@ add_filter( 'slashed_bricks/inventory_local_path', function() {
'SLASHED Primary',
'SLASHED Secondary',
] ) );
-} );`}],a=y(()=>le.activeIntegrations?.bricks??!0);var n=mc(),i=d(l(n),4);let o;var u=l(i),c=d(l(u),4);{var v=f=>{var p=_c();S(f,p)};me(c,f=>{r(a)||f(v)})}var h=d(u,2);de(h,17,()=>s,f=>f.name,(f,p)=>{var m=gc(),b=l(m),x=l(b),_=l(x),w=d(b,2),E=l(w),A=d(w,2),F=d(l(A),2),Y=l(F),T=d(A,2),z=l(T),D=l(z);V(()=>{P(_,r(p).name),P(E,r(p).description),P(Y,r(p).params),P(D,r(p).example)}),S(f,m)}),V(()=>o=Ie(i,1,"group svelte-a36hjt",null,o,{"group--inactive":!r(a)})),S(e,n),Fe()}const yc=[{category:"Colors",description:"Brand, status, and semantic color tokens. Source colors use oklch(); the framework derives light-dark pairs, 50–950 palettes, alpha scales, and state variants automatically. Palette and alpha scales require optional/tokens.palette.css (optimal bundle and above).",tokens:[{name:"--sf-color-{primary,secondary,tertiary,action,neutral,base}",description:"Resolved light-dark adaptive brand color for use in rules."},{name:"--sf-color-{primary,secondary,tertiary,action,neutral,base}-light",description:"Source color (oklch registered value). Set this to rebrand."},{name:"--sf-color-{primary,secondary,tertiary,action,neutral,base}-dark",description:"Optional dark-mode override. If set, replaces the auto-derived dark variant for full per-mode control."},{name:"--sf-color-{primary,secondary,tertiary,action,neutral,base}-{50,100,200,300,400,500,600,700,800,900,950}",description:"Palette scale: 50 (lightest) → 950 (darkest), mixed with base/text. Requires tokens.palette.css."},{name:"--sf-color-{primary,secondary,tertiary,action,neutral,base}-{a5,a10,a20,a30,a40,a50,a60,a70,a80,a90,a95}",description:"Alpha scale: 5%–95% opacity of the brand color. Requires tokens.palette.css."},{name:"--sf-color-{primary,secondary,tertiary,action,neutral,base}-{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-{surface,inverse}",description:"Surface (card/panel) and inverse (high-contrast) context colors."},{name:"--sf-color-{success,warning,error,info,danger}",description:"Status feedback colors (resolved adaptive value)."},{name:"--sf-color-{success,warning,error,info,danger}-{light,strong,hover,active,muted,subtle,ghost,lighter,darker,xlight,xdark,superlight,superdark}",description:"Status color source (-light), emphasis (-strong), and state variants."},{name:"--sf-color-bg",description:"Page background color, derived from base."},{name:"--sf-color-bg--{hover,active,selected,focus,disabled}",description:"Interactive background overlays for hover/active/selected/focus/disabled states."},{name:"--sf-color-text",description:"Main body text color, contrast-aware."},{name:"--sf-color-text--{secondary,muted,disabled,placeholder,inverse}",description:"Secondary, muted, disabled, placeholder, and inverted text colors."},{name:"--sf-color-text--on-{primary,secondary,tertiary,action,neutral,base,surface,inverse,success,warning,error,info,danger}",description:"Auto-contrast text color to use on top of each colored surface."},{name:"--sf-color-heading",description:"Heading text color, slightly stronger than body text."},{name:"--sf-color-link",description:"Link color, derived from the action brand."},{name:"--sf-color-link--{hover,active,visited,underline,disabled}",description:"Link state colors and underline accent."},{name:"--sf-color-border",description:"Default border color."},{name:"--sf-color-border--{subtle,strong,focus,disabled,translucent}",description:"De-emphasized, emphasized, focus, disabled, and translucent border colors."},{name:"--sf-color-{code-bg,code-text,mark-bg,mark-text}",description:"Inline and background/foreground colors."},{name:"--sf-color-{white,black}",description:"Absolute white/black anchors in oklch space, for staying inside the token system."},{name:"--sf-color-surface",description:"Card/panel surface color (equals base)."},{name:"--sf-color-{inset,raised}",description:"Recessed (inset) and elevated (raised) surface background contexts."},{name:"--sf-color-selection-{bg,text}",description:"Text selection (::selection) background and foreground colors."},{name:"--sf-color-overlay",description:"Semi-transparent overlay for modals."},{name:"--sf-color-dim",description:"50% black overlay for dimming backgrounds."},{name:"--sf-color-scheme",description:"CSS color-scheme declaration (light dark). Holds a string, not a color."}]},{category:"Typography",description:"Font families, fluid size scale, weights, line-heights, letter-spacing, per-size sub-properties, and heading/body/prose configuration.",tokens:[{name:"--sf-font-{body,heading,mono,display,humanist,geometric,slab}",description:"Font stacks: body, heading, mono, display, plus curated humanist/geometric/slab fallback personalities."},{name:"--sf-font-{features,variation}",description:"font-feature-settings and font-variation-settings hooks."},{name:"--sf-font-weight-{thin,extralight,light,normal,medium,semibold,bold,extrabold,black}",description:"Named weight tokens: 100→900."},{name:"--sf-font-weight-{body,heading,display}",description:"Contextual weight tokens for body, heading, and display text."},{name:"--sf-current-font-weight",description:"Current context font weight (used by strong elements)."},{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-text-{2xs,xs,s,m,l,xl,2xl,3xl,4xl}",description:"Fluid type scale using clamp(). Honours --sf-text-scale."},{name:"--sf-text-display-{s,m,l}",description:"Extra-large display/hero sizes. Honour --sf-text-display-scale."},{name:"--sf-text-{scale,display-scale}",description:"Global multipliers for the body and display type scales (default 1)."},{name:"--sf-text-{2xs,xs,s,m,l,xl,2xl,3xl,4xl}-{line-height,font-weight,letter-spacing,max-width}",description:"Per-size sub-property override knobs (relaxed leading for small text, tight leading for display). Requires tokens.sizes-extended.css."},{name:"--sf-text-{xs,s,m,l,xl,2xl,3xl,4xl}-to-{2xs,xs,s,m,l,xl,2xl,3xl}",description:"Text bridge tokens: a clamp() spanning from one step (wide) to another (narrow) for extra range of motion. Requires tokens.sizes-extended.css."},{name:"--sf-h{1,2,3,4,5,6}-{size,font-weight,line-height,letter-spacing}",description:"Per-heading-level configuration tokens."},{name:"--sf-heading-{color,font-family,text-wrap}",description:"Global heading color, font stack, and text-wrap mode (balance)."},{name:"--sf-body-{color,font-family,font-size,font-weight,line-height,text-wrap,em-style,strong-weight}",description:"Body text configuration tokens."},{name:"--sf-prose-{block-margin,heading-gap,list-gap,paragraph,figure-margin,figcaption-size,media-margin,media-radius,marker-color}",description:"Long-form .sf-prose rhythm and element styling tokens."},{name:"--sf-code-font-size",description:"Inline font-size (relative em)."},{name:"--sf-optical-sizing",description:"font-optical-sizing control (auto)."},{name:"--sf-line-clamp",description:"Default line count for .sf-line-clamp-N."}]},{category:"Spacing",description:"Fluid spacing scale (clamp-based), bridge tokens, gutters, section padding, component padding, flow, safe-area insets, and sticky-header offsets.",tokens:[{name:"--sf-space-{none,px,2xs,xs,s,m,l,xl,2xl,3xl,4xl}",description:"Fluid spacing scale. Honours --sf-space-scale (none/px are fixed)."},{name:"--sf-space-scale",description:"Global multiplier for all space tokens (default 1)."},{name:"--sf-space-{2xs,xs,s,m,l,xl,2xl,3xl,4xl}-to-{2xs,xs,s,m,l,xl,2xl,3xl}",description:"Spacing bridge tokens: clamp() spanning a wider range than any single step. Requires tokens.sizes-extended.css."},{name:"--sf-space-{gutter,gap,content}",description:"Internal aliases: page gutter, default gap, content gap (consumed by --sf-gap / --sf-content-gap)."},{name:"--sf-gap / --sf-gap-size",description:"Default layout gap and its raw size component."},{name:"--sf-content-gap",description:"Gap between content elements (defaults to space-s)."},{name:"--sf-component-pad",description:"Internal padding for components (defaults to space-m)."},{name:"--sf-section-pad",description:"Active section padding alias."},{name:"--sf-section-pad--{xs,s,m,l,xl,2xl}",description:"Vertical padding presets for page sections."},{name:"--sf-flow-space",description:"Gap applied between .sf-flow children (lobotomized owl)."},{name:"--sf-safe-{top,right,bottom,left}",description:"Safe-area insets for notched devices."},{name:"--sf-header-height",description:"Resolved fixed-header height for sticky offset calculations."},{name:"--sf-header-height-{mobile,desktop}",description:"Per-breakpoint header height inputs."},{name:"--sf-sticky-offset",description:"Resolved sticky offset (defaults to header height)."},{name:"--sf-sticky-offset-{mobile,desktop}",description:"Per-breakpoint sticky offset inputs."}]},{category:"Sizing",description:"Component sizes, touch targets, aspect ratios, and icon sizing.",tokens:[{name:"--sf-size-{xs,s,m,l,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,portrait,video,cinema,golden,3-2,4-3}",description:"Predefined aspect ratios for frames and containers."},{name:"--sf-aspect",description:"Generic aspect-ratio token read by the .sf-aspect macro (16/9)."},{name:"--sf-object-{fit,position}",description:"Default object-fit (cover) and object-position (50% 50%) for media elements."}]},{category:"Layout",description:"Container widths and layout-primitive tokens (stack, cluster, grid, sidebar, switcher, bento, cover, frame, reel, imposter, box, center, content-grid, divider, alternate, equal, multi-column).",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-grid-min-{xs,s,m,l,xl,2xl}",description:"Per-size minimum item widths for .sf-grid--*."},{name:"--sf-bento-{cols-default,gap,row-default,row-compact,row-tall}",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-box-{padding,border-color,border-width}",description:"Isolated .sf-box unit padding and border."},{name:"--sf-center-{gutter,max}",description:"Intrinsic-centering gutter and max-width."},{name:"--sf-content-width / --sf-breakout-width",description:"Breakout grid track widths."},{name:"--sf-divider-{color,style,width,gap}",description:"Divider appearance and surrounding gap tokens."},{name:"--sf-alternate-{gap,inner-gap}",description:"Zigzag .sf-alternate layout gaps."},{name:"--sf-equal-{cols,gap}",description:"Equal-columns count and gap."},{name:"--sf-col-width-{s,m,l}",description:"CSS multi-column track widths (ch-based)."},{name:"--sf-col-rule-width-{s,m,l}",description:"CSS multi-column rule (divider) widths."},{name:"--sf-field-{block,required-marker}",description:"Form field vertical spacing and required indicator string."}]},{category:"Borders",description:"Border shorthands, widths, styles, and stroke widths.",tokens:[{name:"--sf-border / --sf-border-{subtle,strong}",description:"Composed border shorthands (width + style + color). Replaces the three-part recipe."},{name:"--sf-border-width-{hairline,1,2,3,4}",description:"Border width scale: 0.5px, 1px, 2px, 3px, 4px."},{name:"--sf-border-style",description:"Default border style (solid)."},{name:"--sf-border-style-{dotted,soft,strong}",description:"Border style presets (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 / --sf-shadow-glow-color",description:"Base shadow color (derived from neutral) and glow color."},{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, perspective, and contrast tuning.",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-up,slide-in-down,slide-in-left,slide-in-right,float,ping,blink,color-pulse,shimmer,spin}",description:"Named keyframe animation shorthands."},{name:"--sf-animation-delay-{1,2,3,4,5}",description:"Stagger delays for sequential animations."}]},{category:"Icons",description:"Inline icon sizing and the boxed-icon container.",tokens:[{name:"--sf-icon-{xs,s,m,l,xl,2xl}",description:"Icon sizing in em units (0.875em to ~3em)."},{name:"--sf-icon-box-{bg,border,pad,radius}",description:"Boxed icon (.sf-icon--boxed) background, border, padding, radius."}]},{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:"States",description:"Internal flags and state tokens that drive runtime .is-* behaviour.",tokens:[{name:"--sf-is-dark",description:"Numeric flag (0 or 1) indicating dark mode is active. Registered property."},{name:"--sf-is-{active,current,open,pressed}",description:"Internal numeric/derived flags mirrored from matching .is-* classes."},{name:"--sf-state-pending-opacity",description:"Opacity applied to elements in the .is-pending optimistic state."}]},{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, scroll-shadow, and scrollbar styling.",tokens:[{name:"--sf-scroll-timeline-range-{start,end}",description:"Scroll-driven animation range."},{name:"--sf-scroll-shadow-size",description:"Depth of the .sf-scroll-shadow mask gradient."},{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."}]},{category:"Misc",description:"Internal helpers and string-valued tokens that don't belong to a single visual family.",tokens:[{name:"--sf-lumlocker",description:"Internal luminance lock value for color derivation."},{name:"--sf-truncate-suffix",description:"Ellipsis string used by truncation utilities."},{name:"--sf-link-external-marker",description:"External link arrow character."}]}],wc=[{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 / .sf-section-group",description:"Vertical page rhythm; -group collapses gap between adjacent sections."},{name:".sf-section--{xs,s,m,l,xl,2xl,collapse}",description:"Section size variants and collapse."},{name:".sf-container",description:"Centered max-width wrapper with gutters."},{name:".sf-container--{narrow,wide,full,prose}",description:"Container width variants."},{name:".sf-box",description:"Isolated unit with padding and optional border."},{name:".sf-center / .sf-center--intrinsic",description:"Intrinsic centering with max-width."},{name:".sf-stack",description:"Vertical flow with consistent gap."},{name:".sf-stack--{xs,s,m,l,xl,2xl,center,end,stretch}",description:"Stack size and alignment variants."},{name:".sf-cluster",description:"Wrapping inline group."},{name:".sf-cluster--{xs,s,m,l,xl,2xl,center,end,between,no-wrap}",description:"Cluster size, alignment, and wrap variants."},{name:".sf-sidebar",description:"Content + side panel that wraps."},{name:".sf-sidebar--{right,narrow,wide}",description:"Sidebar side and width variants."},{name:".sf-switcher",description:"N columns above threshold, stacked below."},{name:".sf-switcher--{no-wrap,vertical}",description:"Switcher behaviour variants."},{name:".sf-grid",description:"Auto-fill responsive grid."},{name:".sf-grid--{xs,s,m,l,xl,2xl,fit,dense}",description:"Grid item-size and packing variants."},{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."},{name:".sf-bento--{2,4,compact,tall}",description:"Bento column-count and row-height variants."},{name:".sf-equal / .sf-equal-height",description:"Equal-width columns; -height equalizes flex child heights."},{name:".sf-equal--{2,3,4,6}",description:"Equal-columns count variants."},{name:".sf-gap",description:"Standalone gap utility for grid/flex parents."},{name:".sf-gap--{xs,s,m,l,xl,2xl}",description:"Gap size variants."},{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-breakout / .sf-full-bleed",description:"Content-grid escape hatches: breakout band and edge-to-edge bleed."},{name:".sf-cover / .sf-cover__center",description:"Full-height region with a centered content child."},{name:".sf-cover--{min,max,padding-s,padding-l}",description:"Cover height and padding variants."},{name:".sf-frame",description:"Aspect-ratio media box."},{name:".sf-frame--{square,portrait,video,cinema,3-2,4-3,golden}",description:"Frame aspect-ratio variants."},{name:".sf-reel",description:"Horizontal scroll strip with optional mask fade."},{name:".sf-imposter / .sf-imposter--{fixed,contain}",description:"Absolutely-centered overlay and its position variants."},{name:".sf-subgrid / .sf-subgrid-rows",description:"Inherit parent grid tracks."},{name:".sf-divider / .sf-divider--vertical",description:"Token-driven separator (horizontal or vertical)."},{name:".sf-icon",description:"Em-based inline icon sizing."},{name:".sf-icon--{xs,s,m,l,xl,2xl,boxed}",description:"Icon size variants and boxed container."},{name:".sf-prose / .sf-not-prose",description:"Readable long-form text rhythm; -not resets a zone inside it."}]},{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-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 / .sf-focus-parent",description:"Makes a whole card clickable via the first link inside; -focus mirrors focus ring to the parent."},{name:".sf-link-external",description:"Adds external link indicator marker."}]},{category:"Surfaces",description:"Color surface utility classes that set background and auto-contrast text 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)."}]}],xc=[{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 kc=C('
'),Sc=C('
'),Ec=C('
'),Ac=C('MiscTokens that do not fit a single category.
Normal: 4.5:1 AA · 7:1 AAA | Large: 3:1 AA · 4.5:1 AAA
',1),Dc=C('
Select different colors to compute contrast.
'),Lc=C('
'),Ic=C(''),Vc=C('—'),Oc=C("
"),Kc=C('
'),Bc=C(`
WCAG Contrast Checker
Pick any two SLASHED color tokens to check their WCAG 2.1 contrast ratio. The
+} );`}],a=y(()=>ne.activeIntegrations?.bricks??!0);var n=wc(),i=d(l(n),4);let o;var u=l(i),c=d(l(u),4);{var v=f=>{var p=bc();A(f,p)};me(c,f=>{r(a)||f(v)})}var h=d(u,2);de(h,17,()=>s,f=>f.name,(f,p)=>{var m=yc(),b=l(m),x=l(b),_=l(x),w=d(b,2),S=l(w),E=d(w,2),F=d(l(E),2),Y=l(F),T=d(E,2),z=l(T),D=l(z);V(()=>{R(_,r(p).name),R(S,r(p).description),R(Y,r(p).params),R(D,r(p).example)}),A(f,m)}),V(()=>o=Ie(i,1,"group svelte-a36hjt",null,o,{"group--inactive":!r(a)})),A(e,n),Fe()}const kc=[{category:"Colors",description:"Brand, status, and semantic color tokens. Source colors use oklch(); the framework derives light-dark pairs, 50–950 palettes, alpha scales, and state variants automatically. Palette and alpha scales require optional/tokens.palette.css (optimal bundle and above).",tokens:[{name:"--sf-color-{primary,secondary,tertiary,action,neutral,base}",description:"Resolved light-dark adaptive brand color for use in rules."},{name:"--sf-color-{primary,secondary,tertiary,action,neutral,base}-light",description:"Source color (oklch registered value). Set this to rebrand."},{name:"--sf-color-{primary,secondary,tertiary,action,neutral,base}-dark",description:"Optional dark-mode override. If set, replaces the auto-derived dark variant for full per-mode control."},{name:"--sf-color-{primary,secondary,tertiary,action,neutral,base}-{50,100,200,300,400,500,600,700,800,900,950}",description:"Palette scale: 50 (lightest) → 950 (darkest), mixed with base/text. Requires tokens.palette.css."},{name:"--sf-color-{primary,secondary,tertiary,action,neutral,base}-{a5,a10,a20,a30,a40,a50,a60,a70,a80,a90,a95}",description:"Alpha scale: 5%–95% opacity of the brand color. Requires tokens.palette.css."},{name:"--sf-color-{primary,secondary,tertiary,action,neutral,base}-{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-{surface,inverse}",description:"Surface (card/panel) and inverse (high-contrast) context colors."},{name:"--sf-color-{success,warning,error,info,danger}",description:"Status feedback colors (resolved adaptive value)."},{name:"--sf-color-{success,warning,error,info,danger}-{light,strong,hover,active,muted,subtle,ghost,lighter,darker,xlight,xdark,superlight,superdark}",description:"Status color source (-light), emphasis (-strong), and state variants."},{name:"--sf-color-bg",description:"Page background color, derived from base."},{name:"--sf-color-bg--{hover,active,selected,focus,disabled}",description:"Interactive background overlays for hover/active/selected/focus/disabled states."},{name:"--sf-color-text",description:"Main body text color, contrast-aware."},{name:"--sf-color-text--{secondary,muted,disabled,placeholder,inverse}",description:"Secondary, muted, disabled, placeholder, and inverted text colors."},{name:"--sf-color-text--on-{primary,secondary,tertiary,action,neutral,base,surface,inverse,success,warning,error,info,danger}",description:"Auto-contrast text color to use on top of each colored surface."},{name:"--sf-color-heading",description:"Heading text color, slightly stronger than body text."},{name:"--sf-color-link",description:"Link color, derived from the action brand."},{name:"--sf-color-link--{hover,active,visited,underline,disabled}",description:"Link state colors and underline accent."},{name:"--sf-color-border",description:"Default border color."},{name:"--sf-color-border--{subtle,strong,focus,disabled,translucent}",description:"De-emphasized, emphasized, focus, disabled, and translucent border colors."},{name:"--sf-color-{code-bg,code-text,mark-bg,mark-text}",description:"Inline and background/foreground colors."},{name:"--sf-color-{white,black}",description:"Absolute white/black anchors in oklch space, for staying inside the token system."},{name:"--sf-color-surface",description:"Card/panel surface color (equals base)."},{name:"--sf-color-{inset,raised}",description:"Recessed (inset) and elevated (raised) surface background contexts."},{name:"--sf-color-selection-{bg,text}",description:"Text selection (::selection) background and foreground colors."},{name:"--sf-color-overlay",description:"Semi-transparent overlay for modals."},{name:"--sf-color-dim",description:"50% black overlay for dimming backgrounds."},{name:"--sf-color-scheme",description:"CSS color-scheme declaration (light dark). Holds a string, not a color."}]},{category:"Typography",description:"Font families, fluid size scale, weights, line-heights, letter-spacing, per-size sub-properties, and heading/body/prose configuration.",tokens:[{name:"--sf-font-{body,heading,mono,display,humanist,geometric,slab}",description:"Font stacks: body, heading, mono, display, plus curated humanist/geometric/slab fallback personalities."},{name:"--sf-font-{features,variation}",description:"font-feature-settings and font-variation-settings hooks."},{name:"--sf-font-weight-{thin,extralight,light,normal,medium,semibold,bold,extrabold,black}",description:"Named weight tokens: 100→900."},{name:"--sf-font-weight-{body,heading,display}",description:"Contextual weight tokens for body, heading, and display text."},{name:"--sf-current-font-weight",description:"Current context font weight (used by strong elements)."},{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-text-{2xs,xs,s,m,l,xl,2xl,3xl,4xl}",description:"Fluid type scale using clamp(). Honours --sf-text-scale."},{name:"--sf-text-display-{s,m,l}",description:"Extra-large display/hero sizes. Honour --sf-text-display-scale."},{name:"--sf-text-{scale,display-scale}",description:"Global multipliers for the body and display type scales (default 1)."},{name:"--sf-text-{2xs,xs,s,m,l,xl,2xl,3xl,4xl}-{line-height,font-weight,letter-spacing,max-width}",description:"Per-size sub-property override knobs (relaxed leading for small text, tight leading for display). Requires tokens.sizes-extended.css."},{name:"--sf-text-{xs,s,m,l,xl,2xl,3xl,4xl}-to-{2xs,xs,s,m,l,xl,2xl,3xl}",description:"Text bridge tokens: a clamp() spanning from one step (wide) to another (narrow) for extra range of motion. Requires tokens.sizes-extended.css."},{name:"--sf-h{1,2,3,4,5,6}-{size,font-weight,line-height,letter-spacing}",description:"Per-heading-level configuration tokens."},{name:"--sf-heading-{color,font-family,text-wrap}",description:"Global heading color, font stack, and text-wrap mode (balance)."},{name:"--sf-body-{color,font-family,font-size,font-weight,line-height,text-wrap,em-style,strong-weight}",description:"Body text configuration tokens."},{name:"--sf-prose-{block-margin,heading-gap,list-gap,paragraph,figure-margin,figcaption-size,media-margin,media-radius,marker-color}",description:"Long-form .sf-prose rhythm and element styling tokens."},{name:"--sf-code-font-size",description:"Inline font-size (relative em)."},{name:"--sf-optical-sizing",description:"font-optical-sizing control (auto)."},{name:"--sf-line-clamp",description:"Default line count for .sf-line-clamp-N."}]},{category:"Spacing",description:"Fluid spacing scale (clamp-based), bridge tokens, gutters, section padding, component padding, flow, safe-area insets, and sticky-header offsets.",tokens:[{name:"--sf-space-{none,px,2xs,xs,s,m,l,xl,2xl,3xl,4xl}",description:"Fluid spacing scale. Honours --sf-space-scale (none/px are fixed)."},{name:"--sf-space-scale",description:"Global multiplier for all space tokens (default 1)."},{name:"--sf-space-{2xs,xs,s,m,l,xl,2xl,3xl,4xl}-to-{2xs,xs,s,m,l,xl,2xl,3xl}",description:"Spacing bridge tokens: clamp() spanning a wider range than any single step. Requires tokens.sizes-extended.css."},{name:"--sf-space-{gutter,gap,content}",description:"Internal aliases: page gutter, default gap, content gap (consumed by --sf-gap / --sf-content-gap)."},{name:"--sf-gap / --sf-gap-size",description:"Default layout gap and its raw size component."},{name:"--sf-content-gap",description:"Gap between content elements (defaults to space-s)."},{name:"--sf-component-pad",description:"Internal padding for components (defaults to space-m)."},{name:"--sf-section-pad",description:"Active section padding alias."},{name:"--sf-section-pad--{xs,s,m,l,xl,2xl}",description:"Vertical padding presets for page sections."},{name:"--sf-flow-space",description:"Gap applied between .sf-flow children (lobotomized owl)."},{name:"--sf-safe-{top,right,bottom,left}",description:"Safe-area insets for notched devices."},{name:"--sf-header-height",description:"Resolved fixed-header height for sticky offset calculations."},{name:"--sf-header-height-{mobile,desktop}",description:"Per-breakpoint header height inputs."},{name:"--sf-sticky-offset",description:"Resolved sticky offset (defaults to header height)."},{name:"--sf-sticky-offset-{mobile,desktop}",description:"Per-breakpoint sticky offset inputs."}]},{category:"Sizing",description:"Component sizes, touch targets, aspect ratios, and icon sizing.",tokens:[{name:"--sf-size-{xs,s,m,l,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,portrait,video,cinema,golden,3-2,4-3}",description:"Predefined aspect ratios for frames and containers."},{name:"--sf-aspect",description:"Generic aspect-ratio token read by the .sf-aspect macro (16/9)."},{name:"--sf-object-{fit,position}",description:"Default object-fit (cover) and object-position (50% 50%) for media elements."}]},{category:"Layout",description:"Container widths and layout-primitive tokens (stack, cluster, grid, sidebar, switcher, bento, cover, frame, reel, imposter, box, center, content-grid, divider, alternate, equal, multi-column).",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-grid-min-{xs,s,m,l,xl,2xl}",description:"Per-size minimum item widths for .sf-grid--*."},{name:"--sf-bento-{cols-default,gap,row-default,row-compact,row-tall}",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-box-{padding,border-color,border-width}",description:"Isolated .sf-box unit padding and border."},{name:"--sf-center-{gutter,max}",description:"Intrinsic-centering gutter and max-width."},{name:"--sf-content-width / --sf-breakout-width",description:"Breakout grid track widths."},{name:"--sf-divider-{color,style,width,gap}",description:"Divider appearance and surrounding gap tokens."},{name:"--sf-alternate-{gap,inner-gap}",description:"Zigzag .sf-alternate layout gaps."},{name:"--sf-equal-{cols,gap}",description:"Equal-columns count and gap."},{name:"--sf-col-width-{s,m,l}",description:"CSS multi-column track widths (ch-based)."},{name:"--sf-col-rule-width-{s,m,l}",description:"CSS multi-column rule (divider) widths."},{name:"--sf-field-{block,required-marker}",description:"Form field vertical spacing and required indicator string."}]},{category:"Borders",description:"Border shorthands, widths, styles, and stroke widths.",tokens:[{name:"--sf-border / --sf-border-{subtle,strong}",description:"Composed border shorthands (width + style + color). Replaces the three-part recipe."},{name:"--sf-border-width-{hairline,1,2,3,4}",description:"Border width scale: 0.5px, 1px, 2px, 3px, 4px."},{name:"--sf-border-style",description:"Default border style (solid)."},{name:"--sf-border-style-{dotted,soft,strong}",description:"Border style presets (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 / --sf-shadow-glow-color",description:"Base shadow color (derived from neutral) and glow color."},{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, perspective, and contrast tuning.",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-up,slide-in-down,slide-in-left,slide-in-right,float,ping,blink,color-pulse,shimmer,spin}",description:"Named keyframe animation shorthands."},{name:"--sf-animation-delay-{1,2,3,4,5}",description:"Stagger delays for sequential animations."}]},{category:"Icons",description:"Inline icon sizing and the boxed-icon container.",tokens:[{name:"--sf-icon-{xs,s,m,l,xl,2xl}",description:"Icon sizing in em units (0.875em to ~3em)."},{name:"--sf-icon-box-{bg,border,pad,radius}",description:"Boxed icon (.sf-icon--boxed) background, border, padding, radius."}]},{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:"States",description:"Internal flags and state tokens that drive runtime .is-* behaviour.",tokens:[{name:"--sf-is-dark",description:"Numeric flag (0 or 1) indicating dark mode is active. Registered property."},{name:"--sf-is-{active,current,open,pressed}",description:"Internal numeric/derived flags mirrored from matching .is-* classes."},{name:"--sf-state-pending-opacity",description:"Opacity applied to elements in the .is-pending optimistic state."}]},{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, scroll-shadow, and scrollbar styling.",tokens:[{name:"--sf-scroll-timeline-range-{start,end}",description:"Scroll-driven animation range."},{name:"--sf-scroll-shadow-size",description:"Depth of the .sf-scroll-shadow mask gradient."},{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."}]},{category:"Misc",description:"Internal helpers and string-valued tokens that don't belong to a single visual family.",tokens:[{name:"--sf-lumlocker",description:"Internal luminance lock value for color derivation."},{name:"--sf-truncate-suffix",description:"Ellipsis string used by truncation utilities."},{name:"--sf-link-external-marker",description:"External link arrow character."}]}],Sc=[{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 / .sf-section-group",description:"Vertical page rhythm; -group collapses gap between adjacent sections."},{name:".sf-section--{xs,s,m,l,xl,2xl,collapse}",description:"Section size variants and collapse."},{name:".sf-container",description:"Centered max-width wrapper with gutters."},{name:".sf-container--{narrow,wide,full,prose}",description:"Container width variants."},{name:".sf-box",description:"Isolated unit with padding and optional border."},{name:".sf-center / .sf-center--intrinsic",description:"Intrinsic centering with max-width."},{name:".sf-stack",description:"Vertical flow with consistent gap."},{name:".sf-stack--{xs,s,m,l,xl,2xl,center,end,stretch}",description:"Stack size and alignment variants."},{name:".sf-cluster",description:"Wrapping inline group."},{name:".sf-cluster--{xs,s,m,l,xl,2xl,center,end,between,no-wrap}",description:"Cluster size, alignment, and wrap variants."},{name:".sf-sidebar",description:"Content + side panel that wraps."},{name:".sf-sidebar--{right,narrow,wide}",description:"Sidebar side and width variants."},{name:".sf-switcher",description:"N columns above threshold, stacked below."},{name:".sf-switcher--{no-wrap,vertical}",description:"Switcher behaviour variants."},{name:".sf-grid",description:"Auto-fill responsive grid."},{name:".sf-grid--{xs,s,m,l,xl,2xl,fit,dense}",description:"Grid item-size and packing variants."},{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."},{name:".sf-bento--{2,4,compact,tall}",description:"Bento column-count and row-height variants."},{name:".sf-equal / .sf-equal-height",description:"Equal-width columns; -height equalizes flex child heights."},{name:".sf-equal--{2,3,4,6}",description:"Equal-columns count variants."},{name:".sf-gap",description:"Standalone gap utility for grid/flex parents."},{name:".sf-gap--{xs,s,m,l,xl,2xl}",description:"Gap size variants."},{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-breakout / .sf-full-bleed",description:"Content-grid escape hatches: breakout band and edge-to-edge bleed."},{name:".sf-cover / .sf-cover__center",description:"Full-height region with a centered content child."},{name:".sf-cover--{min,max,padding-s,padding-l}",description:"Cover height and padding variants."},{name:".sf-frame",description:"Aspect-ratio media box."},{name:".sf-frame--{square,portrait,video,cinema,3-2,4-3,golden}",description:"Frame aspect-ratio variants."},{name:".sf-reel",description:"Horizontal scroll strip with optional mask fade."},{name:".sf-imposter / .sf-imposter--{fixed,contain}",description:"Absolutely-centered overlay and its position variants."},{name:".sf-subgrid / .sf-subgrid-rows",description:"Inherit parent grid tracks."},{name:".sf-divider / .sf-divider--vertical",description:"Token-driven separator (horizontal or vertical)."},{name:".sf-icon",description:"Em-based inline icon sizing."},{name:".sf-icon--{xs,s,m,l,xl,2xl,boxed}",description:"Icon size variants and boxed container."},{name:".sf-prose / .sf-not-prose",description:"Readable long-form text rhythm; -not resets a zone inside it."}]},{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-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 / .sf-focus-parent",description:"Makes a whole card clickable via the first link inside; -focus mirrors focus ring to the parent."},{name:".sf-link-external",description:"Adds external link indicator marker."}]},{category:"Surfaces",description:"Color surface utility classes that set background and auto-contrast text 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)."}]}],Ec=[{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 Ac=C('
'),Cc=C('
'),$c=C('
'),Tc=C('MiscTokens that do not fit a single category.
Normal: 4.5:1 AA · 7:1 AAA | Large: 3:1 AA · 4.5:1 AAA
',1),Vc=C('
Select different colors to compute contrast.
'),Oc=C('
'),Kc=C(''),Bc=C('—'),Nc=C("
"),Hc=C('
'),Gc=C(`
WCAG Contrast Checker
Pick any two SLASHED color tokens to check their WCAG 2.1 contrast ratio. The
grid below shows every token pair — click any cell to load it into the picker.
- Colors shown are the light-mode variants.
Foreground
Background
All-pairs reference
Foreground → rows · Background → columns. Click any cell to load the pair into the picker above.
AAA (≥ 7:1) AA (≥ 4.5:1) AA large only (≥ 3:1) Fail (< 3:1)
Max-width values for .sf-container size variants. Any valid CSS length
(rem, px, ch, %, etc.).
Grid
Minimum column width for .sf-grid auto-fill layouts.
The grid will fit as many columns as possible at or above this width.
Switcher
Viewport width at which .sf-switcher flips from a stacked column to a row.
Bento Grid
Column count and row height presets for .sf-bento free-form grid layouts.
Header & Sticky
Set mobile and desktop header heights in rem. When both are provided, --sf-header-height becomes a fluid clamp() between them using
the viewport range configured in the Spacing tab. Set both to the same value for a
- fixed height. Leave blank to use the framework defaults (3.5rem mobile, 5rem desktop) — shown as the input placeholders.
Body text uses --sf-color-text--secondary over the page
+ fixed height. Leave blank to use the framework defaults (3.5rem mobile, 5rem desktop) — shown as the input placeholders.
Body text uses --sf-color-text--secondary over the page
background. Headings, body, secondary and muted text each pull from
their own token so the hierarchy stays readable in both modes.