bluedither 1.0.25 → 1.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -282,13 +282,15 @@ async function installFromRegistry(slug, targetDir) {
282
282
 
283
283
  console.log(` Extracted ${extracted} files to ${bdDir}`);
284
284
 
285
- // Copy tuner files from the npm package (not in the theme ZIP)
285
+ // Copy tuner + shader files from the npm package (overrides what's in the theme ZIP)
286
286
  const tunerFiles = [
287
287
  ['dist/bluedither-tuner.js', 'bluedither-tuner.js'],
288
288
  ['fine-tuner/tuner.css', 'bluedither-tuner.css'],
289
289
  ['fine-tuner/inject.js', 'bluedither-tuner-inject.js'],
290
290
  ['fine-tuner/dev-middleware.js', 'dev-middleware.js'],
291
291
  ['fine-tuner/sidecar.js', 'sidecar.js'],
292
+ ['theme/shaders/bluedither-shader.js', 'shaders/bluedither-shader.js'],
293
+ ['theme/shaders/paper-shaders-bundle.js', 'shaders/paper-shaders-bundle.js'],
292
294
  ];
293
295
  for (const [src, dest] of tunerFiles) {
294
296
  const srcPath = resolve(BLUEDITHER_ROOT, src);
@@ -1,4 +1,4 @@
1
- (()=>{if(!window.__BD_TUNER_LOADED__){let w=function(n,r,e){let i=r.split("."),t=n;for(let d=0;d<i.length-1;d++)t=t[i[d]];t[i[i.length-1]]=e},L=function(n,r){return r.split(".").reduce((e,i)=>e?.[i],n)},v=function(n,r){document.documentElement.style.setProperty(n,r)},S=function(n,r){let e=window.__BD_SHADER__;e&&e.updateParams({[n]:r})},U=function(n){let r=b.layout.designWidth,e=n/16,i=n/r*100;return`clamp(${(e*.55).toFixed(4)}rem, ${i.toFixed(4)}vw, ${e.toFixed(4)}rem)`},$=function(n){let r="bd-gf-"+n.replace(/\s+/g,"-").toLowerCase();if(document.getElementById(r))return;let e=document.createElement("link");e.id=r,e.rel="stylesheet",e.href=`https://fonts.googleapis.com/css2?family=${encodeURIComponent(n)}:wght@400;700&display=swap`,document.head.appendChild(e)},_=function(n){let r=document.createElement("div");return r.className="bd-tuner-section",r.innerHTML=`<div class="bd-tuner-section-label">${n}</div>`,f.appendChild(r),r},C=function(n,r,e,i,t){let d=L(b,e)||"#000000",a=document.createElement("div");a.className="bd-tuner-row",a.innerHTML=`
1
+ (()=>{if(!window.__BD_TUNER_LOADED__){let w=function(n,r,e){let i=r.split("."),t=n;for(let d=0;d<i.length-1;d++)t=t[i[d]];t[i[i.length-1]]=e},L=function(n,r){return r.split(".").reduce((e,i)=>e?.[i],n)},v=function(n,r){let e=document.documentElement;e.style.setProperty(n,r),D[n]&&e.style.setProperty(D[n],r)},S=function(n,r){let e=window.__BD_SHADER__;e&&e.updateParams({[n]:r})},U=function(n){let r=b.layout.designWidth,e=n/16,i=n/r*100;return`clamp(${(e*.55).toFixed(4)}rem, ${i.toFixed(4)}vw, ${e.toFixed(4)}rem)`},$=function(n){let r="bd-gf-"+n.replace(/\s+/g,"-").toLowerCase();if(document.getElementById(r))return;let e=document.createElement("link");e.id=r,e.rel="stylesheet",e.href=`https://fonts.googleapis.com/css2?family=${encodeURIComponent(n)}:wght@400;700&display=swap`,document.head.appendChild(e)},_=function(n){let r=document.createElement("div");return r.className="bd-tuner-section",r.innerHTML=`<div class="bd-tuner-section-label">${n}</div>`,f.appendChild(r),r},C=function(n,r,e,i,t){let d=L(b,e)||"#000000",a=document.createElement("div");a.className="bd-tuner-row",a.innerHTML=`
2
2
  <span class="bd-tuner-label">${r}</span>
3
3
  <span class="bd-tuner-input"><input type="color" value="${d.substring(0,7)}"></span>
4
4
  <span class="bd-tuner-value">${d.substring(0,7)}</span>
@@ -17,18 +17,18 @@
17
17
  <span class="bd-tuner-value">${s}</span>
18
18
  </div>
19
19
  <input type="range" class="bd-tuner-slider" min="${i}" max="${t}" step="${d}" value="${s}">
20
- `;let l=c.querySelector(".bd-tuner-slider"),m=c.querySelector(".bd-tuner-value");l.addEventListener("input",u=>{let o=parseFloat(u.target.value);w(b,e,o),m.textContent=o,a&&a(o)}),n.appendChild(c)},D=function(n,r,e,i){let t=L(b,e),d=document.createElement("div");d.className="bd-tuner-row",d.innerHTML=`
20
+ `;let l=c.querySelector(".bd-tuner-slider"),m=c.querySelector(".bd-tuner-value");l.addEventListener("input",u=>{let o=parseFloat(u.target.value);w(b,e,o),m.textContent=o,a&&a(o)}),n.appendChild(c)},B=function(n,r,e,i){let t=L(b,e),d=document.createElement("div");d.className="bd-tuner-row",d.innerHTML=`
21
21
  <span class="bd-tuner-label">${r}</span>
22
22
  <span class="bd-tuner-input bd-tuner-font-input">
23
23
  <input type="text" class="bd-tuner-font-search" value="${t}" placeholder="Search fonts...">
24
24
  <div class="bd-tuner-font-dropdown"></div>
25
25
  </span>
26
- `;let a=d.querySelector(".bd-tuner-font-search"),s=d.querySelector(".bd-tuner-font-dropdown"),c=m=>z.some(u=>u.toLowerCase()===m.toLowerCase());function l(m=""){let u=q.filter(o=>o.toLowerCase().includes(m.toLowerCase())).slice(0,20);s.innerHTML=u.map(o=>{let k=c(o)?' <span style="opacity:0.4;font-size:9px">SYSTEM</span>':"";return`<div class="bd-tuner-font-option" data-font="${o}" style="font-family:'${o}',system-ui">${o}${k}</div>`}).join(""),u.filter(o=>!c(o)).forEach($),s.querySelectorAll(".bd-tuner-font-option").forEach(o=>{o.addEventListener("mousedown",k=>{k.preventDefault();let h=o.dataset.font;a.value=h,w(b,e,h),c(h)||$(h),v(i,`"${h}", system-ui, sans-serif`),s.classList.remove("open")})})}a.addEventListener("focus",()=>{l(a.value),s.classList.add("open")}),a.addEventListener("input",()=>{l(a.value),s.classList.add("open")}),a.addEventListener("blur",()=>{setTimeout(()=>s.classList.remove("open"),150)}),a.addEventListener("keydown",m=>{if(m.key==="Enter"){let u=a.value.trim();u&&(w(b,e,u),c(u)||$(u),v(i,`"${u}", system-ui, sans-serif`),s.classList.remove("open"),a.blur())}}),n.appendChild(d)},B=function(n,r,e,i,t){let d=L(b,e),a=document.createElement("div");a.className="bd-tuner-row bd-tuner-row-stacked",a.innerHTML=`
26
+ `;let a=d.querySelector(".bd-tuner-font-search"),s=d.querySelector(".bd-tuner-font-dropdown"),c=m=>z.some(u=>u.toLowerCase()===m.toLowerCase());function l(m=""){let u=I.filter(o=>o.toLowerCase().includes(m.toLowerCase())).slice(0,20);s.innerHTML=u.map(o=>{let k=c(o)?' <span style="opacity:0.4;font-size:9px">SYSTEM</span>':"";return`<div class="bd-tuner-font-option" data-font="${o}" style="font-family:'${o}',system-ui">${o}${k}</div>`}).join(""),u.filter(o=>!c(o)).forEach($),s.querySelectorAll(".bd-tuner-font-option").forEach(o=>{o.addEventListener("mousedown",k=>{k.preventDefault();let h=o.dataset.font;a.value=h,w(b,e,h),c(h)||$(h),v(i,`"${h}", system-ui, sans-serif`),s.classList.remove("open")})})}a.addEventListener("focus",()=>{l(a.value),s.classList.add("open")}),a.addEventListener("input",()=>{l(a.value),s.classList.add("open")}),a.addEventListener("blur",()=>{setTimeout(()=>s.classList.remove("open"),150)}),a.addEventListener("keydown",m=>{if(m.key==="Enter"){let u=a.value.trim();u&&(w(b,e,u),c(u)||$(u),v(i,`"${u}", system-ui, sans-serif`),s.classList.remove("open"),a.blur())}}),n.appendChild(d)},A=function(n,r,e,i,t){let d=L(b,e),a=document.createElement("div");a.className="bd-tuner-row bd-tuner-row-stacked",a.innerHTML=`
27
27
  <span class="bd-tuner-label">${r}</span>
28
28
  <div class="bd-tuner-segmented">
29
29
  ${i.map(s=>`<button class="bd-tuner-seg-btn${s===d?" active":""}" data-val="${s}">${s}</button>`).join("")}
30
30
  </div>
31
- `,a.querySelectorAll(".bd-tuner-seg-btn").forEach(s=>{s.addEventListener("click",()=>{a.querySelectorAll(".bd-tuner-seg-btn").forEach(l=>l.classList.remove("active")),s.classList.add("active");let c=s.dataset.val;w(b,e,c),t&&t(c)})}),n.appendChild(a)};window.__BD_TUNER_LOADED__=!0;let b=structuredClone(window.__BD_TOKENS__||JSON.parse(document.querySelector('script[type="application/json"][data-bluedither-tokens]')?.textContent||"{}")),O=structuredClone(window.__BD_DEFAULTS__||JSON.parse(document.querySelector('script[type="application/json"][data-bluedither-defaults]')?.textContent||"{}")),H=!!(window.__BD_TOKENS__&&window.__BD_DEFAULTS__)||!!window.__BD_TUNER_SERVER_MODE__,z=["Arial","Arial Black","Bebas Neue Pro","Consolas","Courier New","Georgia","Helvetica","Impact","Lucida Console","Segoe UI","Tahoma","Times New Roman","Trebuchet MS","Verdana","SF Pro Display","SF Mono","Cascadia Code","Menlo","Monaco"],j=["Bebas Neue","Space Mono","Inter","Roboto","Roboto Mono","Roboto Condensed","Open Sans","Montserrat","Lato","Oswald","Raleway","Poppins","Nunito","Playfair Display","Merriweather","Source Sans 3","Source Code Pro","PT Sans","PT Serif","PT Mono","Ubuntu","Ubuntu Mono","Fira Sans","Fira Code","Fira Mono","Work Sans","Noto Sans","Noto Serif","DM Sans","DM Serif Display","DM Mono","IBM Plex Sans","IBM Plex Mono","IBM Plex Serif","JetBrains Mono","Inconsolata","Space Grotesk","Archivo","Archivo Black","Barlow","Barlow Condensed","Lexend","Outfit","Sora","Manrope","Bitter","Crimson Text","Libre Baskerville","Abril Fatface","Anton","Permanent Marker","Righteous","Orbitron","Teko","Rubik","Quicksand","Cabin","Karla","Josefin Sans","Comfortaa","Fredoka","Geologica","Instrument Sans","Instrument Serif"],q=[...new Set([...z,...j])].sort(),f=document.createElement("div");f.id="bd-tuner";let P=document.createElement("button");P.id="bd-tuner-toggle",P.textContent="Tuner",P.onclick=()=>f.classList.remove("collapsed"),document.body.appendChild(f),document.body.appendChild(P),f.innerHTML=`
31
+ `,a.querySelectorAll(".bd-tuner-seg-btn").forEach(s=>{s.addEventListener("click",()=>{a.querySelectorAll(".bd-tuner-seg-btn").forEach(l=>l.classList.remove("active")),s.classList.add("active");let c=s.dataset.val;w(b,e,c),t&&t(c)})}),n.appendChild(a)};window.__BD_TUNER_LOADED__=!0;let b=structuredClone(window.__BD_TOKENS__||JSON.parse(document.querySelector('script[type="application/json"][data-bluedither-tokens]')?.textContent||"{}")),H=structuredClone(window.__BD_DEFAULTS__||JSON.parse(document.querySelector('script[type="application/json"][data-bluedither-defaults]')?.textContent||"{}")),j=!!(window.__BD_TOKENS__&&window.__BD_DEFAULTS__)||!!window.__BD_TUNER_SERVER_MODE__,z=["Arial","Arial Black","Bebas Neue Pro","Consolas","Courier New","Georgia","Helvetica","Impact","Lucida Console","Segoe UI","Tahoma","Times New Roman","Trebuchet MS","Verdana","SF Pro Display","SF Mono","Cascadia Code","Menlo","Monaco"],q=["Bebas Neue","Space Mono","Inter","Roboto","Roboto Mono","Roboto Condensed","Open Sans","Montserrat","Lato","Oswald","Raleway","Poppins","Nunito","Playfair Display","Merriweather","Source Sans 3","Source Code Pro","PT Sans","PT Serif","PT Mono","Ubuntu","Ubuntu Mono","Fira Sans","Fira Code","Fira Mono","Work Sans","Noto Sans","Noto Serif","DM Sans","DM Serif Display","DM Mono","IBM Plex Sans","IBM Plex Mono","IBM Plex Serif","JetBrains Mono","Inconsolata","Space Grotesk","Archivo","Archivo Black","Barlow","Barlow Condensed","Lexend","Outfit","Sora","Manrope","Bitter","Crimson Text","Libre Baskerville","Abril Fatface","Anton","Permanent Marker","Righteous","Orbitron","Teko","Rubik","Quicksand","Cabin","Karla","Josefin Sans","Comfortaa","Fredoka","Geologica","Instrument Sans","Instrument Serif"],I=[...new Set([...z,...q])].sort(),D={"--bd-bg":"--bd-color-background","--bd-primary":"--bd-color-primary","--bd-text":"--bd-color-text","--bd-cta-bg":"--bd-color-cta-bg","--bd-cta-text":"--bd-color-cta-text","--bd-sub-size":"--bd-subheadline-size","--bd-sub-lh":"--bd-subheadline-lh","--bd-sub-transform":"--bd-subheadline-transform"},f=document.createElement("div");f.id="bd-tuner";let P=document.createElement("button");P.id="bd-tuner-toggle",P.textContent="Tuner",P.onclick=()=>f.classList.remove("collapsed"),document.body.appendChild(f),document.body.appendChild(P),f.innerHTML=`
32
32
  <div class="bd-tuner-title">
33
33
  <span>BlueDither Tuner</span>
34
34
  <div style="display:flex;gap:8px;align-items:center;">
@@ -36,7 +36,7 @@
36
36
  <button id="bd-tuner-close" title="Close">&times;</button>
37
37
  </div>
38
38
  </div>
39
- `,f.querySelector("#bd-tuner-close").onclick=()=>f.classList.add("collapsed"),f.querySelector("#bd-tuner-reset").onclick=async()=>{confirm("Reset all tokens to defaults?")&&(Object.assign(b,structuredClone(O)),await R(),location.reload())};let T=_("Colors");C(T,"Background","colors.background","--bd-bg");let N;C(T,"Primary","colors.primary","--bd-primary",n=>{N.setValue(n),S("colorFront",n)}),C(T,"Text","colors.text","--bd-text"),C(T,"CTA Background","colors.ctaBackground","--bd-cta-bg"),C(T,"CTA Text","colors.ctaText","--bd-cta-text"),N=C(T,"Shader Front","colors.shaderFront",null,n=>S("colorFront",n));let y=_("Typography");D(y,"Primary Font","typography.primaryFont","--bd-font-primary"),D(y,"Secondary Font","typography.secondaryFont","--bd-font-secondary"),g(y,"Headline Size","typography.headline.referencePx",32,300,1,"--bd-headline-size"),g(y,"Headline LH","typography.headline.lineHeightPx",24,280,1,"--bd-headline-lh"),g(y,"Sub Size","typography.subHeadline.referencePx",10,48,1,"--bd-sub-size"),g(y,"Sub LH","typography.subHeadline.lineHeightPx",12,80,1,"--bd-sub-lh"),g(y,"Logo Size","typography.logo.referencePx",12,80,1,"--bd-logo-size"),g(y,"Nav Size","typography.navItem.referencePx",10,48,1,"--bd-nav-size");let x=_("Spacing");g(x,"Header Pad X","spacing.headerPaddingX",0,80,1,"--bd-header-px"),g(x,"Header Pad Y","spacing.headerPaddingY",0,60,1,"--bd-header-py"),g(x,"Hero Pad Top","spacing.heroPaddingTop",0,120,1,"--bd-hero-pt"),g(x,"Hero Pad Bottom","spacing.heroPaddingBottom",0,120,1,"--bd-hero-pb"),g(x,"Hero Pad X","spacing.heroPaddingX",0,120,1,"--bd-hero-px"),g(x,"Nav Gap","spacing.navGap",0,100,1,"--bd-nav-gap"),g(x,"CTA Pad X","spacing.ctaPaddingX",0,60,1,"--bd-cta-px"),g(x,"CTA Pad Y","spacing.ctaPaddingY",0,30,1,"--bd-cta-py"),E(x,"CTA Radius","spacing.ctaBorderRadius",0,32,1,n=>v("--bd-cta-radius",`${(n/16).toFixed(4)}rem`));let F=_("Shader");B(F,"Shape","shader.shape",["warp","simplex","dots","wave","ripple","swirl","sphere"],n=>S("shape",n)),B(F,"Dither Type","shader.type",["random","2x2","4x4","8x8"],n=>S("type",n)),E(F,"Speed","shader.speed",0,2,.01,n=>S("speed",n)),E(F,"Scale","shader.scale",.1,5,.01,n=>S("scale",n)),E(F,"Dither Size","shader.size",.5,10,.1,n=>S("size",n));let I=_("Opacity");E(I,"Nav Links","opacity.navLinks",0,1,.01,n=>v("--bd-nav-opacity",n));let p=document.createElement("button");p.id="bd-tuner-commit",p.textContent="Commit Changes";let M=null;async function R(){let n=JSON.stringify(b,null,2);try{let t=await fetch("/__bluedither/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(t.ok&&(await t.json()).ok)return"saved"}catch{}try{let t=await fetch("http://localhost:3344/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(t.ok&&(await t.json()).ok)return"saved"}catch{}if(H)try{let t=await fetch("/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(t.ok&&(await t.json()).ok)return"saved"}catch{}if(window.showSaveFilePicker)try{M||(M=await window.showSaveFilePicker({suggestedName:"tokens.json",types:[{description:"JSON",accept:{"application/json":[".json"]}}]}));let t=await M.createWritable();return await t.write(n),await t.close(),"saved"}catch(t){if(t.name==="AbortError")return"cancelled";M=null}let r=new Blob([n],{type:"application/json"}),e=URL.createObjectURL(r),i=document.createElement("a");return i.href=e,i.download="tokens.json",i.click(),URL.revokeObjectURL(e),"downloaded"}p.onclick=async()=>{p.textContent="Saving...",p.disabled=!0;try{let n=await R();if(n==="cancelled"){p.textContent="Commit Changes",p.disabled=!1;return}p.textContent=n==="saved"?"Saved!":"Downloaded!",p.classList.add("success"),setTimeout(()=>{p.textContent="Commit Changes",p.classList.remove("success"),p.disabled=!1},2e3)}catch(n){p.textContent="Error: "+n.message,p.disabled=!1,setTimeout(()=>{p.textContent="Commit Changes"},3e3)}},f.appendChild(p)}var A=document.createElement("style");A.textContent=`/* =============================================
39
+ `,f.querySelector("#bd-tuner-close").onclick=()=>f.classList.add("collapsed"),f.querySelector("#bd-tuner-reset").onclick=async()=>{confirm("Reset all tokens to defaults?")&&(Object.assign(b,structuredClone(H)),await R(),location.reload())};let T=_("Colors");C(T,"Background","colors.background","--bd-bg");let N;C(T,"Primary","colors.primary","--bd-primary",n=>{N.setValue(n),S("colorFront",n)}),C(T,"Text","colors.text","--bd-text"),C(T,"CTA Background","colors.ctaBackground","--bd-cta-bg"),C(T,"CTA Text","colors.ctaText","--bd-cta-text"),N=C(T,"Shader Front","colors.shaderFront",null,n=>S("colorFront",n));let y=_("Typography");B(y,"Primary Font","typography.primaryFont","--bd-font-primary"),B(y,"Secondary Font","typography.secondaryFont","--bd-font-secondary"),g(y,"Headline Size","typography.headline.referencePx",32,300,1,"--bd-headline-size"),g(y,"Headline LH","typography.headline.lineHeightPx",24,280,1,"--bd-headline-lh"),g(y,"Sub Size","typography.subHeadline.referencePx",10,48,1,"--bd-sub-size"),g(y,"Sub LH","typography.subHeadline.lineHeightPx",12,80,1,"--bd-sub-lh"),g(y,"Logo Size","typography.logo.referencePx",12,80,1,"--bd-logo-size"),g(y,"Nav Size","typography.navItem.referencePx",10,48,1,"--bd-nav-size");let x=_("Spacing");g(x,"Header Pad X","spacing.headerPaddingX",0,80,1,"--bd-header-px"),g(x,"Header Pad Y","spacing.headerPaddingY",0,60,1,"--bd-header-py"),g(x,"Hero Pad Top","spacing.heroPaddingTop",0,120,1,"--bd-hero-pt"),g(x,"Hero Pad Bottom","spacing.heroPaddingBottom",0,120,1,"--bd-hero-pb"),g(x,"Hero Pad X","spacing.heroPaddingX",0,120,1,"--bd-hero-px"),g(x,"Nav Gap","spacing.navGap",0,100,1,"--bd-nav-gap"),g(x,"CTA Pad X","spacing.ctaPaddingX",0,60,1,"--bd-cta-px"),g(x,"CTA Pad Y","spacing.ctaPaddingY",0,30,1,"--bd-cta-py"),E(x,"CTA Radius","spacing.ctaBorderRadius",0,32,1,n=>v("--bd-cta-radius",`${(n/16).toFixed(4)}rem`));let F=_("Shader");A(F,"Shape","shader.shape",["warp","simplex","dots","wave","ripple","swirl","sphere"],n=>S("shape",n)),A(F,"Dither Type","shader.type",["random","2x2","4x4","8x8"],n=>S("type",n)),E(F,"Speed","shader.speed",0,2,.01,n=>S("speed",n)),E(F,"Scale","shader.scale",.1,5,.01,n=>S("scale",n)),E(F,"Dither Size","shader.size",.5,10,.1,n=>S("size",n));let G=_("Opacity");E(G,"Nav Links","opacity.navLinks",0,1,.01,n=>v("--bd-nav-opacity",n));let p=document.createElement("button");p.id="bd-tuner-commit",p.textContent="Commit Changes";let M=null;async function R(){let n=JSON.stringify(b,null,2);try{let t=await fetch("/__bluedither/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(t.ok&&(await t.json()).ok)return"saved"}catch{}try{let t=await fetch("http://localhost:3344/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(t.ok&&(await t.json()).ok)return"saved"}catch{}if(j)try{let t=await fetch("/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(t.ok&&(await t.json()).ok)return"saved"}catch{}if(window.showSaveFilePicker)try{M||(M=await window.showSaveFilePicker({suggestedName:"tokens.json",types:[{description:"JSON",accept:{"application/json":[".json"]}}]}));let t=await M.createWritable();return await t.write(n),await t.close(),"saved"}catch(t){if(t.name==="AbortError")return"cancelled";M=null}let r=new Blob([n],{type:"application/json"}),e=URL.createObjectURL(r),i=document.createElement("a");return i.href=e,i.download="tokens.json",i.click(),URL.revokeObjectURL(e),"downloaded"}p.onclick=async()=>{p.textContent="Saving...",p.disabled=!0;try{let n=await R();if(n==="cancelled"){p.textContent="Commit Changes",p.disabled=!1;return}p.textContent=n==="saved"?"Saved!":"Downloaded!",p.classList.add("success"),setTimeout(()=>{p.textContent="Commit Changes",p.classList.remove("success"),p.disabled=!1},2e3)}catch(n){p.textContent="Error: "+n.message,p.disabled=!1,setTimeout(()=>{p.textContent="Commit Changes"},3e3)}},f.appendChild(p)}var O=document.createElement("style");O.textContent=`/* =============================================
40
40
  BlueDither Fine-Tuner \u2014 Overlay Panel v2
41
41
  ============================================= */
42
42
 
@@ -398,4 +398,4 @@
398
398
  background: rgba(255, 255, 255, 0.1);
399
399
  border-radius: 2px;
400
400
  }
401
- `;document.head.appendChild(A);})();
401
+ `;document.head.appendChild(O);})();
@@ -48,13 +48,19 @@
48
48
  return `clamp(${minRem.toFixed(4)}rem, ${vw.toFixed(4)}vw, ${maxRem.toFixed(4)}rem)`;
49
49
  }
50
50
 
51
+ // Set CSS var + legacy alias (AI sometimes generates old long names)
52
+ function setVar(name, value, legacy) {
53
+ root.style.setProperty(name, value);
54
+ if (legacy) root.style.setProperty(legacy, value);
55
+ }
56
+
51
57
  // Colors
52
58
  if (t.colors) {
53
- if (t.colors.background) root.style.setProperty('--bd-bg', t.colors.background);
54
- if (t.colors.primary) root.style.setProperty('--bd-primary', t.colors.primary);
55
- if (t.colors.text) root.style.setProperty('--bd-text', t.colors.text);
56
- if (t.colors.ctaBackground) root.style.setProperty('--bd-cta-bg', t.colors.ctaBackground);
57
- if (t.colors.ctaText) root.style.setProperty('--bd-cta-text', t.colors.ctaText);
59
+ if (t.colors.background) setVar('--bd-bg', t.colors.background, '--bd-color-background');
60
+ if (t.colors.primary) setVar('--bd-primary', t.colors.primary, '--bd-color-primary');
61
+ if (t.colors.text) setVar('--bd-text', t.colors.text, '--bd-color-text');
62
+ if (t.colors.ctaBackground) setVar('--bd-cta-bg', t.colors.ctaBackground, '--bd-color-cta-bg');
63
+ if (t.colors.ctaText) setVar('--bd-cta-text', t.colors.ctaText, '--bd-color-cta-text');
58
64
  }
59
65
 
60
66
  // Typography
@@ -66,8 +72,8 @@
66
72
  root.style.setProperty('--bd-headline-lh', pxToClamp(t.typography.headline.lineHeightPx));
67
73
  }
68
74
  if (t.typography.subHeadline) {
69
- root.style.setProperty('--bd-sub-size', pxToClamp(t.typography.subHeadline.referencePx));
70
- root.style.setProperty('--bd-sub-lh', pxToClamp(t.typography.subHeadline.lineHeightPx));
75
+ setVar('--bd-sub-size', pxToClamp(t.typography.subHeadline.referencePx), '--bd-subheadline-size');
76
+ setVar('--bd-sub-lh', pxToClamp(t.typography.subHeadline.lineHeightPx), '--bd-subheadline-lh');
71
77
  }
72
78
  if (t.typography.logo) {
73
79
  root.style.setProperty('--bd-logo-size', pxToClamp(t.typography.logo.referencePx));
@@ -65,8 +65,23 @@ function getTokenPath(obj, path) {
65
65
  return path.split('.').reduce((o, k) => o?.[k], obj);
66
66
  }
67
67
 
68
+ // Map short names to legacy aliases (AI sometimes generates the old long names)
69
+ const CSS_VAR_ALIASES = {
70
+ '--bd-bg': '--bd-color-background',
71
+ '--bd-primary': '--bd-color-primary',
72
+ '--bd-text': '--bd-color-text',
73
+ '--bd-cta-bg': '--bd-color-cta-bg',
74
+ '--bd-cta-text': '--bd-color-cta-text',
75
+ '--bd-sub-size': '--bd-subheadline-size',
76
+ '--bd-sub-lh': '--bd-subheadline-lh',
77
+ '--bd-sub-transform': '--bd-subheadline-transform',
78
+ };
79
+
68
80
  function setCSSVar(name, value) {
69
- document.documentElement.style.setProperty(name, value);
81
+ const root = document.documentElement;
82
+ root.style.setProperty(name, value);
83
+ // Also set legacy alias so it works regardless of which names the CSS uses
84
+ if (CSS_VAR_ALIASES[name]) root.style.setProperty(CSS_VAR_ALIASES[name], value);
70
85
  }
71
86
 
72
87
  function updateShader(key, value) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bluedither",
3
- "version": "1.0.25",
3
+ "version": "1.0.27",
4
4
  "description": "A bold, dithered-shader hero theme for Claude Code — skill + fine-tuner",
5
5
  "type": "module",
6
6
  "bin": {