@frontfriend/tailwind 4.0.0 → 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- var e=class extends Error{constructor(t,s,i){super(t),this.name="APIError",this.statusCode=s,this.url=i,this.code=`API_${s}`}},o=class extends Error{constructor(t,s){super(t),this.name="CacheError",this.operation=s,this.code=`CACHE_${s.toUpperCase()}`}},c=class extends Error{constructor(t,s){super(t),this.name="ConfigError",this.field=s,this.code=`CONFIG_${s.toUpperCase()}`}},h=class extends Error{constructor(t,s){super(t),this.name="ProcessingError",this.token=s,this.code="PROCESSING_ERROR"}};module.exports={APIError:e,CacheError:o,ConfigError:c,ProcessingError:h};
1
+ var e=class extends Error{constructor(t,s,h){super(t),this.name="APIError",this.statusCode=s,this.url=h,this.code=`API_${s}`}},o=class extends Error{constructor(t,s){super(t),this.name="CacheError",this.operation=s,this.code=`CACHE_${s.toUpperCase()}`}},c=class extends Error{constructor(t,s){super(t),this.name="ConfigError",this.field=s,this.code=s?`CONFIG_${String(s).toUpperCase()}`:"CONFIG_ERROR"}},n=class extends Error{constructor(t,s){super(t),this.name="ProcessingError",this.token=s,this.code="PROCESSING_ERROR"}};module.exports={APIError:e,CacheError:o,ConfigError:c,ProcessingError:n};
2
2
  //# sourceMappingURL=errors.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../lib/core/errors.js"],
4
- "sourcesContent": ["class APIError extends Error {\n constructor(message, statusCode, url) {\n super(message);\n this.name = 'APIError';\n this.statusCode = statusCode;\n this.url = url;\n this.code = `API_${statusCode}`;\n }\n}\n\nclass CacheError extends Error {\n constructor(message, operation) {\n super(message);\n this.name = 'CacheError';\n this.operation = operation;\n this.code = `CACHE_${operation.toUpperCase()}`;\n }\n}\n\nclass ConfigError extends Error {\n constructor(message, field) {\n super(message);\n this.name = 'ConfigError';\n this.field = field;\n this.code = `CONFIG_${field.toUpperCase()}`;\n }\n}\n\nclass ProcessingError extends Error {\n constructor(message, token) {\n super(message);\n this.name = 'ProcessingError';\n this.token = token;\n this.code = 'PROCESSING_ERROR';\n }\n}\n\nmodule.exports = {\n APIError,\n CacheError,\n ConfigError,\n ProcessingError\n};"],
5
- "mappings": "AAAA,IAAMA,EAAN,cAAuB,KAAM,CAC3B,YAAYC,EAASC,EAAYC,EAAK,CACpC,MAAMF,CAAO,EACb,KAAK,KAAO,WACZ,KAAK,WAAaC,EAClB,KAAK,IAAMC,EACX,KAAK,KAAO,OAAOD,CAAU,EAC/B,CACF,EAEME,EAAN,cAAyB,KAAM,CAC7B,YAAYH,EAASI,EAAW,CAC9B,MAAMJ,CAAO,EACb,KAAK,KAAO,aACZ,KAAK,UAAYI,EACjB,KAAK,KAAO,SAASA,EAAU,YAAY,CAAC,EAC9C,CACF,EAEMC,EAAN,cAA0B,KAAM,CAC9B,YAAYL,EAASM,EAAO,CAC1B,MAAMN,CAAO,EACb,KAAK,KAAO,cACZ,KAAK,MAAQM,EACb,KAAK,KAAO,UAAUA,EAAM,YAAY,CAAC,EAC3C,CACF,EAEMC,EAAN,cAA8B,KAAM,CAClC,YAAYP,EAASQ,EAAO,CAC1B,MAAMR,CAAO,EACb,KAAK,KAAO,kBACZ,KAAK,MAAQQ,EACb,KAAK,KAAO,kBACd,CACF,EAEA,OAAO,QAAU,CACf,SAAAT,EACA,WAAAI,EACA,YAAAE,EACA,gBAAAE,CACF",
4
+ "sourcesContent": ["class APIError extends Error {\n constructor(message, statusCode, url) {\n super(message);\n this.name = 'APIError';\n this.statusCode = statusCode;\n this.url = url;\n this.code = `API_${statusCode}`;\n }\n}\n\nclass CacheError extends Error {\n constructor(message, operation) {\n super(message);\n this.name = 'CacheError';\n this.operation = operation;\n this.code = `CACHE_${operation.toUpperCase()}`;\n }\n}\n\nclass ConfigError extends Error {\n constructor(message, field) {\n super(message);\n this.name = 'ConfigError';\n this.field = field;\n // `field` is optional; guard so a missing field never crashes (and masks)\n // the real error with `Cannot read properties of undefined (toUpperCase)`.\n this.code = field ? `CONFIG_${String(field).toUpperCase()}` : 'CONFIG_ERROR';\n }\n}\n\nclass ProcessingError extends Error {\n constructor(message, token) {\n super(message);\n this.name = 'ProcessingError';\n this.token = token;\n this.code = 'PROCESSING_ERROR';\n }\n}\n\nmodule.exports = {\n APIError,\n CacheError,\n ConfigError,\n ProcessingError\n};"],
5
+ "mappings": "AAAA,IAAMA,EAAN,cAAuB,KAAM,CAC3B,YAAYC,EAASC,EAAYC,EAAK,CACpC,MAAMF,CAAO,EACb,KAAK,KAAO,WACZ,KAAK,WAAaC,EAClB,KAAK,IAAMC,EACX,KAAK,KAAO,OAAOD,CAAU,EAC/B,CACF,EAEME,EAAN,cAAyB,KAAM,CAC7B,YAAYH,EAASI,EAAW,CAC9B,MAAMJ,CAAO,EACb,KAAK,KAAO,aACZ,KAAK,UAAYI,EACjB,KAAK,KAAO,SAASA,EAAU,YAAY,CAAC,EAC9C,CACF,EAEMC,EAAN,cAA0B,KAAM,CAC9B,YAAYL,EAASM,EAAO,CAC1B,MAAMN,CAAO,EACb,KAAK,KAAO,cACZ,KAAK,MAAQM,EAGb,KAAK,KAAOA,EAAQ,UAAU,OAAOA,CAAK,EAAE,YAAY,CAAC,GAAK,cAChE,CACF,EAEMC,EAAN,cAA8B,KAAM,CAClC,YAAYP,EAASQ,EAAO,CAC1B,MAAMR,CAAO,EACb,KAAK,KAAO,kBACZ,KAAK,MAAQQ,EACb,KAAK,KAAO,kBACd,CACF,EAEA,OAAO,QAAU,CACf,SAAAT,EACA,WAAAI,EACA,YAAAE,EACA,gBAAAE,CACF",
6
6
  "names": ["APIError", "message", "statusCode", "url", "CacheError", "operation", "ConfigError", "field", "ProcessingError", "token"]
7
7
  }
@@ -1,4 +1,4 @@
1
- var H=(g,t)=>()=>(t||g((t={exports:{}}).exports,t),t.exports);var M=H((U,S)=>{var C=class extends Error{constructor(t,e,r){super(t),this.name="APIError",this.statusCode=e,this.url=r,this.code=`API_${e}`}},x=class extends Error{constructor(t,e){super(t),this.name="CacheError",this.operation=e,this.code=`CACHE_${e.toUpperCase()}`}},w=class extends Error{constructor(t,e){super(t),this.name="ConfigError",this.field=e,this.code=`CONFIG_${e.toUpperCase()}`}},j=class extends Error{constructor(t,e){super(t),this.name="ProcessingError",this.token=e,this.code="PROCESSING_ERROR"}};S.exports={APIError:C,CacheError:x,ConfigError:w,ProcessingError:j}});var W=require("color"),K=require("https"),A=require("fs"),I=require("path"),{ProcessingError:E}=M(),P={"--background":"oklch(1 0 0)","--foreground":"oklch(0.145 0 0)","--card":"oklch(1 0 0)","--card-foreground":"oklch(0.145 0 0)","--popover":"oklch(1 0 0)","--popover-foreground":"oklch(0.145 0 0)","--primary":"oklch(0.205 0 0)","--primary-foreground":"oklch(0.985 0 0)","--secondary":"oklch(0.97 0 0)","--secondary-foreground":"oklch(0.205 0 0)","--muted":"oklch(0.97 0 0)","--muted-foreground":"oklch(0.556 0 0)","--accent":"oklch(0.97 0 0)","--accent-foreground":"oklch(0.205 0 0)","--destructive":"oklch(0.577 0.245 27.325)","--destructive-foreground":"oklch(0.985 0 0)","--border":"oklch(0.922 0 0)","--input":"oklch(0.922 0 0)","--ring":"oklch(0.708 0 0)","--sidebar":"oklch(0.985 0 0)","--sidebar-foreground":"oklch(0.145 0 0)","--sidebar-primary":"oklch(0.205 0 0)","--sidebar-primary-foreground":"oklch(0.985 0 0)","--sidebar-accent":"oklch(0.97 0 0)","--sidebar-accent-foreground":"oklch(0.205 0 0)","--sidebar-border":"oklch(0.922 0 0)","--sidebar-ring":"oklch(0.708 0 0)","--chart-1":"oklch(0.646 0.222 41.116)","--chart-2":"oklch(0.6 0.118 184.704)","--chart-3":"oklch(0.398 0.07 227.392)","--chart-4":"oklch(0.828 0.189 84.429)","--chart-5":"oklch(0.769 0.188 70.08)"},_={"--background":["--bg-default","--bg-neutral-low","--layer-base"],"--foreground":["--text-neutral-strong","--text-default"],"--card":["--layer-1","--bg-neutral-low","--bg-default"],"--card-foreground":["--text-neutral-strong","--text-default"],"--popover":["--layer-1","--bg-neutral-low","--bg-default"],"--popover-foreground":["--text-neutral-strong","--text-default"],"--primary":["--bg-brand-mid","--bg-brand-strong"],"--primary-foreground":["--text-onbrand-strong","--text-inverse-low"],"--secondary":["--bg-interactive-subtle","--bg-neutral-low"],"--secondary-foreground":["--text-oninteractive-subtle","--text-neutral-strong"],"--muted":["--bg-neutral-low","--bg-disabled"],"--muted-foreground":["--text-neutral-subtle","--text-disabled"],"--accent":["--bg-interactive-low","--bg-brand-low","--bg-neutral-low"],"--accent-foreground":["--text-oninteractive-low","--text-brand-strong","--text-neutral-strong"],"--destructive":["--bg-negative-mid","--bg-negative-subtle"],"--destructive-foreground":["--text-onnegative-subtle","--text-inverse-low"],"--border":["--border-neutral-subtle","--border-default"],"--input":["--border-neutral-subtle","--border-default"],"--ring":["--border-brand-mid","--bg-brand-mid"],"--sidebar":["--layer-1","--bg-neutral-low","--bg-default"],"--sidebar-foreground":["--text-neutral-strong","--text-default"],"--sidebar-primary":["--bg-brand-mid","--bg-brand-strong"],"--sidebar-primary-foreground":["--text-onbrand-strong","--text-inverse-low"],"--sidebar-accent":["--bg-interactive-low","--bg-neutral-low"],"--sidebar-accent-foreground":["--text-oninteractive-low","--text-neutral-strong"],"--sidebar-border":["--border-neutral-subtle","--border-default"],"--sidebar-ring":["--border-brand-mid","--bg-brand-mid"],"--chart-1":["--bg-brand-mid","--bg-brand-strong"],"--chart-2":["--bg-interactive-mid","--bg-interactive-low"],"--chart-3":["--bg-positive-mid","--bg-positive-subtle"],"--chart-4":["--bg-warning-mid","--bg-warning-subtle"],"--chart-5":["--bg-negative-mid","--bg-negative-subtle"]};function q(g,t,e){for(let r of t||[])if(g[r])return g[r];return e}function L(g={},t={}){let e={};for(let[s,n]of Object.entries(_))e[s]=q(g,n,P[s]);let r=t.borderRadius||{};return e["--radius"]=r.default||r.md||r.lg||"0.625rem",e["--radius-sm"]=r.sm||"calc(var(--radius) - 4px)",e["--radius-md"]=r.md||"calc(var(--radius) - 2px)",e["--radius-lg"]=r.lg||"var(--radius)",e["--radius-xl"]=r.xl||"calc(var(--radius) + 4px)",e}var V=class{constructor(){this.useTailwindV4=this.detectTailwindVersion()}detectTailwindVersion(){var t,e,r,s;try{let n=I.join(process.cwd(),"package.json");if(!A.existsSync(n))return!1;let i=JSON.parse(A.readFileSync(n,"utf8")),a=((t=i.devDependencies)==null?void 0:t.tailwindcss)||((e=i.dependencies)==null?void 0:e.tailwindcss)||((r=i.peerDependencies)==null?void 0:r.tailwindcss),c=(s=a==null?void 0:a.match(/(\d+)\./))==null?void 0:s[1];return c?Number(c)>=4:!1}catch{return console.warn("[FrontFriend] Could not detect Tailwind version, defaulting to v3 (hex/HSL plugin mode)"),!1}}hexToHsl(t){try{let e=W(t),r=e.hsl(),s=Math.round(r.hue()),n=Math.round(r.saturationl()),i=Math.round(r.lightness()),a=e.alpha();if(a<1){let c=Math.round(a*100)/100;return`${s} ${n}% ${i}% / ${c}`}return`${s} ${n}% ${i}%`}catch(e){throw new E(`Failed to convert color ${t}: ${e.message}`,t)}}hexToOklch(t){try{let e=W(t),r=e.rgb(),s=r.red()/255,n=r.green()/255,i=r.blue()/255,a=y=>y<=.04045?y/12.92:Math.pow((y+.055)/1.055,2.4),c=a(s),l=a(n),o=a(i),u=c*.4124564+l*.3575761+o*.1804375,f=c*.2126729+l*.7151522+o*.072175,d=c*.0193339+l*.119192+o*.9503041,h=Math.cbrt(.8189330101*u+.3618667424*f-.1288597137*d),m=Math.cbrt(.0329845436*u+.9293118715*f+.0361456387*d),b=Math.cbrt(.0482003018*u+.2643662691*f+.633851707*d),p=.2104542553*h+.793617785*m-.0040720468*b,v=1.9779984951*h-2.428592205*m+.4505937099*b,$=.0259040371*h+.7827717662*m-.808675766*b,R=Math.sqrt(v*v+$*$),k=Math.atan2($,v)*180/Math.PI;k<0&&(k+=360);let O=Math.round(p*1e3)/1e3,F=Math.round(R*1e3)/1e3,N=Math.round(k*100)/100,T=e.alpha();if(T<1){let y=Math.round(T*100)/100;return`oklch(${O} ${F} ${N} / ${y})`}return`oklch(${O} ${F} ${N})`}catch(e){throw new E(`Failed to convert color ${t}: ${e.message}`,t)}}processColors(t){let e={},r={},s={backgroundColor:{},textColor:{},borderColor:{}};if(!t||typeof t!="object")return console.log(" \u26A0\uFE0F No valid color data to process"),{variables:e,colorMap:r,utilities:s};let n=(i,a="")=>{for(let[c,l]of Object.entries(i))if(l&&typeof l=="object")if(l.$value){let o=a?`${a}-${c}`:c,u=`--color-${o}`,f=this.useTailwindV4?this.hexToOklch(l.$value):this.hexToHsl(l.$value);e[u]=f,r[o]=u;let d=this.useTailwindV4?`var(${u})`:`hsl(var(${u}))`;s.backgroundColor[o]=d,s.textColor[o]=d,s.borderColor[o]=d}else{let o=a?`${a}-${c}`:c;n(l,o)}};return t&&(t.colors?n(t.colors):n(t)),{variables:e,colorMap:r,utilities:s}}processSemanticTokens(t,e){let r={},s={backgroundColor:{},textColor:{},borderColor:{}},n=c=>c.replace(/ /g,"").replace(/\./g,"-").toLowerCase(),i=c=>{if(typeof c!="string")return null;let l=c.match(/^\{(.+)\}$/);if(!l)return null;let o=l[1].split(".");return o[0]==="colors"&&o.length>1?o[1]==="colors"&&o.length>2?o.slice(2).join("-"):o.slice(1).join("-"):o.join("-")},a=(c,l)=>{if(t[c])for(let[o,u]of Object.entries(t[c])){if(o==="disabled"){let f=i(u.$value);if(f){let d=e[f];if(d){let h=`--${c}-disabled`;r[h]=`var(${d})`,s[l].disabled=`var(${h})`}}continue}for(let[f,d]of Object.entries(u))for(let[h,m]of Object.entries(d)){let b=n(`${o}-${f}-${h}`);b.endsWith("-default")&&(b=b.slice(0,-8));let p=`--${c}-${b}`,v=i(m.$value);if(v){let $=e[v];$&&(r[p]=`var(${$})`,s[l][b]=`var(${p})`)}else if(m.$value){let $=this.useTailwindV4?this.hexToOklch(m.$value):this.hexToHsl(m.$value);r[p]=$,s[l][b]=this.useTailwindV4?`var(${p})`:`hsl(var(${p}))`}}}};if(a("bg","backgroundColor"),a("text","textColor"),a("border","borderColor"),t.layer)for(let[c,l]of Object.entries(t.layer)){let o=`--layer-${c}`,u=i(l.$value);if(u){let f=u.replace(/\./g,"-").toLowerCase();if(f.endsWith("-default")&&(f=f.slice(0,-8)),f.startsWith("bg-")||f.startsWith("text-")||f.startsWith("border-")){let d=`--${f}`;r[o]=`var(${d})`,s.backgroundColor[`layer-${c}`]=`var(${o})`}else{let d=e[f];d&&(r[o]=`var(${d})`,s.backgroundColor[`layer-${c}`]=`var(${o})`)}}else if(l.$value){let f=this.useTailwindV4?this.hexToOklch(l.$value):this.hexToHsl(l.$value);r[o]=f,s.backgroundColor[`layer-${c}`]=this.useTailwindV4?`var(${o})`:`hsl(var(${o}))`}}if(t.overlay)for(let[c,l]of Object.entries(t.overlay)){let o=`--overlay-${c}`;l.$value&&(r[o]=l.$value,s.backgroundColor[`overlay-${c}`]=`var(${o})`)}if(t.icon){s.fill||(s.fill={});for(let[c,l]of Object.entries(t.icon)){if(c==="disabled"){let o=i(l.$value);if(o){let u=e[o];if(u){let f="--icon-disabled";r[f]=`var(${u})`,s.textColor["icon-disabled"]=`var(${f})`,s.fill["icon-disabled"]=`var(${f})`}}continue}for(let[o,u]of Object.entries(l))for(let[f,d]of Object.entries(u)){let h=n(`icon-${c}-${o}-${f}`);h.endsWith("-default")&&(h=h.slice(0,-8));let m=`--${h}`,b=i(d.$value);if(b){let p=e[b];p&&(r[m]=`var(${p})`,s.textColor[h]=`var(${m})`,s.fill[h]=`var(${m})`)}}}}return{semanticVariables:r,tokens:s}}async fetchFontCss(t){return new Promise((e,r)=>{K.get(t,s=>{let n="";if(s.statusCode!==200){r(new Error(`Failed to fetch font CSS: ${s.statusCode}`));return}s.on("data",i=>{n+=i}),s.on("end",()=>{e(n)}),s.on("error",i=>{r(i)})}).on("error",s=>{r(s)})})}parseFontFaces(t){let e=/@font-face\s*{([^}]+)}/g,r=[],s;for(;(s=e.exec(t))!==null;){let n=s[1].trim().split(";").filter(Boolean),i={};n.forEach(a=>{let c=a.indexOf(":");if(c!==-1){let l=a.slice(0,c).trim(),o=a.slice(c+1).trim();l==="font-family"?i[l]=o.replace(/["']/g,""):i[l]=o}}),i.src&&(i.src=i.src.replace(/url\(["']?/,"url('").replace(/["']?\)/,"')")),r.push(i)}return r}async processFonts(t){let e=[];if(!t||typeof t!="object")return e;let r=Object.keys(t).filter(s=>s.startsWith("font"));for(let s of r){let n=t[s];if(typeof n=="string"&&n.startsWith("http"))try{let i=await this.fetchFontCss(n),a=this.parseFontFaces(i);a.length>0&&e.push(...a)}catch(i){console.warn(`Failed to process font ${s}:`,i.message)}}return e}processFontFamilies(t){let e={};if(!t||!t.font||!t.font.family)return e;let r=t.font.family;for(let[s,n]of Object.entries(r))if(n&&n.$value){let i=s.toLowerCase(),a=n.$value;typeof a=="string"&&a.startsWith("{")&&a.endsWith("}")&&(a=a.slice(1,-1));let c=l=>l.split(" ").map(o=>o.charAt(0).toUpperCase()+o.slice(1).toLowerCase()).join(" ");if(a.includes(","))e[i]=a;else{let l=c(a);l.includes(" ")&&!l.startsWith('"')&&!l.startsWith("'")?e[i]=`"${l}", sans-serif`:e[i]=`${l}, sans-serif`}}return e}processAnimations(t){let e={},r={};if(!t||typeof t!="object")return{keyframes:e,animations:r};for(let[s,n]of Object.entries(t))if(n&&typeof n=="object"){let i=`${s}`;if(n.keyframes){let c={};for(let[l,o]of Object.entries(n.keyframes))o&&typeof o=="object"&&(c[l]=o);e[i]=c}let a=[i,n.duration||"1s",n.easing||"ease",n.delay||"0s",n.iterations||"1",n.direction||"normal",n.fillMode||"none"].join(" ");r[s]=a}return{keyframes:e,animations:r}}generateSafelistClasses(t){let e=[];if(t.backgroundColor)for(let r of Object.keys(t.backgroundColor))e.push(`bg-${r}`);if(t.textColor)for(let r of Object.keys(t.textColor))e.push(`text-${r}`);if(t.borderColor)for(let r of Object.keys(t.borderColor))e.push(`border-${r}`);if(t.fill)for(let r of Object.keys(t.fill))e.push(`fill-${r}`),r.startsWith("icon-")&&e.push(`text-${r}`);if(t.fontFamily)for(let r of Object.keys(t.fontFamily))e.push(`font-${r}`);if(t.animations)for(let r of Object.keys(t.animations))e.push(`animate-${r}`);return e}extractClassesFromComponentsConfig(t){let e=new Set,r=n=>{typeof n=="string"&&n.split(/\s+/).filter(a=>a.length>0).forEach(a=>{e.add(a)})},s=n=>{if(!(!n||typeof n!="object"))for(let i in n){let a=n[i];typeof a=="string"?r(a):typeof a=="object"&&s(a)}};return t&&s(t),Array.from(e).filter(n=>!n.startsWith("file:")).sort()}generateClassesContent(t=[]){let e=["/*"," * Frontfriend Component Classes"," *"," * This file contains all classes used in Frontfriend component configs."," * Tailwind v4 scans this file via @source to generate utilities."," * DO NOT EDIT - Auto-generated by frontfriend CLI"," */","","/*"," * Classes:"],r=" * ";for(let s of[...new Set(t)].sort())r.length+s.length+1>100?(e.push(r),r=` * ${s}`):r+=(r===" * "?"":" ")+s;return r!==" * "&&e.push(r),e.push(" */"),e.join(`
1
+ var H=(g,t)=>()=>(t||g((t={exports:{}}).exports,t),t.exports);var M=H((U,T)=>{var C=class extends Error{constructor(t,e,r){super(t),this.name="APIError",this.statusCode=e,this.url=r,this.code=`API_${e}`}},x=class extends Error{constructor(t,e){super(t),this.name="CacheError",this.operation=e,this.code=`CACHE_${e.toUpperCase()}`}},w=class extends Error{constructor(t,e){super(t),this.name="ConfigError",this.field=e,this.code=e?`CONFIG_${String(e).toUpperCase()}`:"CONFIG_ERROR"}},j=class extends Error{constructor(t,e){super(t),this.name="ProcessingError",this.token=e,this.code="PROCESSING_ERROR"}};T.exports={APIError:C,CacheError:x,ConfigError:w,ProcessingError:j}});var W=require("color"),I=require("https"),A=require("fs"),K=require("path"),{ProcessingError:E}=M(),P={"--background":"oklch(1 0 0)","--foreground":"oklch(0.145 0 0)","--card":"oklch(1 0 0)","--card-foreground":"oklch(0.145 0 0)","--popover":"oklch(1 0 0)","--popover-foreground":"oklch(0.145 0 0)","--primary":"oklch(0.205 0 0)","--primary-foreground":"oklch(0.985 0 0)","--secondary":"oklch(0.97 0 0)","--secondary-foreground":"oklch(0.205 0 0)","--muted":"oklch(0.97 0 0)","--muted-foreground":"oklch(0.556 0 0)","--accent":"oklch(0.97 0 0)","--accent-foreground":"oklch(0.205 0 0)","--destructive":"oklch(0.577 0.245 27.325)","--destructive-foreground":"oklch(0.985 0 0)","--border":"oklch(0.922 0 0)","--input":"oklch(0.922 0 0)","--ring":"oklch(0.708 0 0)","--sidebar":"oklch(0.985 0 0)","--sidebar-foreground":"oklch(0.145 0 0)","--sidebar-primary":"oklch(0.205 0 0)","--sidebar-primary-foreground":"oklch(0.985 0 0)","--sidebar-accent":"oklch(0.97 0 0)","--sidebar-accent-foreground":"oklch(0.205 0 0)","--sidebar-border":"oklch(0.922 0 0)","--sidebar-ring":"oklch(0.708 0 0)","--chart-1":"oklch(0.646 0.222 41.116)","--chart-2":"oklch(0.6 0.118 184.704)","--chart-3":"oklch(0.398 0.07 227.392)","--chart-4":"oklch(0.828 0.189 84.429)","--chart-5":"oklch(0.769 0.188 70.08)"},_={"--background":["--bg-default","--bg-neutral-low","--layer-base"],"--foreground":["--text-neutral-strong","--text-default"],"--card":["--layer-1","--bg-neutral-low","--bg-default"],"--card-foreground":["--text-neutral-strong","--text-default"],"--popover":["--layer-1","--bg-neutral-low","--bg-default"],"--popover-foreground":["--text-neutral-strong","--text-default"],"--primary":["--bg-brand-mid","--bg-brand-strong"],"--primary-foreground":["--text-onbrand-strong","--text-inverse-low"],"--secondary":["--bg-interactive-subtle","--bg-neutral-low"],"--secondary-foreground":["--text-oninteractive-subtle","--text-neutral-strong"],"--muted":["--bg-neutral-low","--bg-disabled"],"--muted-foreground":["--text-neutral-subtle","--text-disabled"],"--accent":["--bg-interactive-low","--bg-brand-low","--bg-neutral-low"],"--accent-foreground":["--text-oninteractive-low","--text-brand-strong","--text-neutral-strong"],"--destructive":["--bg-negative-mid","--bg-negative-subtle"],"--destructive-foreground":["--text-onnegative-subtle","--text-inverse-low"],"--border":["--border-neutral-subtle","--border-default"],"--input":["--border-neutral-subtle","--border-default"],"--ring":["--border-brand-mid","--bg-brand-mid"],"--sidebar":["--layer-1","--bg-neutral-low","--bg-default"],"--sidebar-foreground":["--text-neutral-strong","--text-default"],"--sidebar-primary":["--bg-brand-mid","--bg-brand-strong"],"--sidebar-primary-foreground":["--text-onbrand-strong","--text-inverse-low"],"--sidebar-accent":["--bg-interactive-low","--bg-neutral-low"],"--sidebar-accent-foreground":["--text-oninteractive-low","--text-neutral-strong"],"--sidebar-border":["--border-neutral-subtle","--border-default"],"--sidebar-ring":["--border-brand-mid","--bg-brand-mid"],"--chart-1":["--bg-brand-mid","--bg-brand-strong"],"--chart-2":["--bg-interactive-mid","--bg-interactive-low"],"--chart-3":["--bg-positive-mid","--bg-positive-subtle"],"--chart-4":["--bg-warning-mid","--bg-warning-subtle"],"--chart-5":["--bg-negative-mid","--bg-negative-subtle"]};function G(g,t,e){for(let r of t||[])if(g[r])return g[r];return e}function L(g={},t={}){let e={};for(let[s,n]of Object.entries(_))e[s]=G(g,n,P[s]);let r=t.borderRadius||{};return e["--radius"]=r.default||r.md||r.lg||"0.625rem",e["--radius-sm"]=r.sm||"calc(var(--radius) - 4px)",e["--radius-md"]=r.md||"calc(var(--radius) - 2px)",e["--radius-lg"]=r.lg||"var(--radius)",e["--radius-xl"]=r.xl||"calc(var(--radius) + 4px)",e}var V=class{constructor(){this.useTailwindV4=this.detectTailwindVersion()}detectTailwindVersion(){var t,e,r,s;try{let n=K.join(process.cwd(),"package.json");if(!A.existsSync(n))return!1;let i=JSON.parse(A.readFileSync(n,"utf8")),a=((t=i.devDependencies)==null?void 0:t.tailwindcss)||((e=i.dependencies)==null?void 0:e.tailwindcss)||((r=i.peerDependencies)==null?void 0:r.tailwindcss),c=(s=a==null?void 0:a.match(/(\d+)\./))==null?void 0:s[1];return c?Number(c)>=4:!1}catch{return console.warn("[FrontFriend] Could not detect Tailwind version, defaulting to v3 (hex/HSL plugin mode)"),!1}}hexToHsl(t){try{let e=W(t),r=e.hsl(),s=Math.round(r.hue()),n=Math.round(r.saturationl()),i=Math.round(r.lightness()),a=e.alpha();if(a<1){let c=Math.round(a*100)/100;return`${s} ${n}% ${i}% / ${c}`}return`${s} ${n}% ${i}%`}catch(e){throw new E(`Failed to convert color ${t}: ${e.message}`,t)}}hexToOklch(t){try{let e=W(t),r=e.rgb(),s=r.red()/255,n=r.green()/255,i=r.blue()/255,a=y=>y<=.04045?y/12.92:Math.pow((y+.055)/1.055,2.4),c=a(s),l=a(n),o=a(i),u=c*.4124564+l*.3575761+o*.1804375,f=c*.2126729+l*.7151522+o*.072175,d=c*.0193339+l*.119192+o*.9503041,h=Math.cbrt(.8189330101*u+.3618667424*f-.1288597137*d),m=Math.cbrt(.0329845436*u+.9293118715*f+.0361456387*d),b=Math.cbrt(.0482003018*u+.2643662691*f+.633851707*d),p=.2104542553*h+.793617785*m-.0040720468*b,v=1.9779984951*h-2.428592205*m+.4505937099*b,$=.0259040371*h+.7827717662*m-.808675766*b,R=Math.sqrt(v*v+$*$),k=Math.atan2($,v)*180/Math.PI;k<0&&(k+=360);let O=Math.round(p*1e3)/1e3,F=Math.round(R*1e3)/1e3,N=Math.round(k*100)/100,S=e.alpha();if(S<1){let y=Math.round(S*100)/100;return`oklch(${O} ${F} ${N} / ${y})`}return`oklch(${O} ${F} ${N})`}catch(e){throw new E(`Failed to convert color ${t}: ${e.message}`,t)}}processColors(t){let e={},r={},s={backgroundColor:{},textColor:{},borderColor:{}};if(!t||typeof t!="object")return console.log(" \u26A0\uFE0F No valid color data to process"),{variables:e,colorMap:r,utilities:s};let n=(i,a="")=>{for(let[c,l]of Object.entries(i))if(l&&typeof l=="object")if(l.$value){let o=a?`${a}-${c}`:c,u=`--color-${o}`,f=this.useTailwindV4?this.hexToOklch(l.$value):this.hexToHsl(l.$value);e[u]=f,r[o]=u;let d=this.useTailwindV4?`var(${u})`:`hsl(var(${u}))`;s.backgroundColor[o]=d,s.textColor[o]=d,s.borderColor[o]=d}else{let o=a?`${a}-${c}`:c;n(l,o)}};return t&&(t.colors?n(t.colors):n(t)),{variables:e,colorMap:r,utilities:s}}processSemanticTokens(t,e){let r={},s={backgroundColor:{},textColor:{},borderColor:{}},n=c=>c.replace(/ /g,"").replace(/\./g,"-").toLowerCase(),i=c=>{if(typeof c!="string")return null;let l=c.match(/^\{(.+)\}$/);if(!l)return null;let o=l[1].split(".");return o[0]==="colors"&&o.length>1?o[1]==="colors"&&o.length>2?o.slice(2).join("-"):o.slice(1).join("-"):o.join("-")},a=(c,l)=>{if(t[c])for(let[o,u]of Object.entries(t[c])){if(o==="disabled"){let f=i(u.$value);if(f){let d=e[f];if(d){let h=`--${c}-disabled`;r[h]=`var(${d})`,s[l].disabled=`var(${h})`}}continue}for(let[f,d]of Object.entries(u))for(let[h,m]of Object.entries(d)){let b=n(`${o}-${f}-${h}`);b.endsWith("-default")&&(b=b.slice(0,-8));let p=`--${c}-${b}`,v=i(m.$value);if(v){let $=e[v];$&&(r[p]=`var(${$})`,s[l][b]=`var(${p})`)}else if(m.$value){let $=this.useTailwindV4?this.hexToOklch(m.$value):this.hexToHsl(m.$value);r[p]=$,s[l][b]=this.useTailwindV4?`var(${p})`:`hsl(var(${p}))`}}}};if(a("bg","backgroundColor"),a("text","textColor"),a("border","borderColor"),t.layer)for(let[c,l]of Object.entries(t.layer)){let o=`--layer-${c}`,u=i(l.$value);if(u){let f=u.replace(/\./g,"-").toLowerCase();if(f.endsWith("-default")&&(f=f.slice(0,-8)),f.startsWith("bg-")||f.startsWith("text-")||f.startsWith("border-")){let d=`--${f}`;r[o]=`var(${d})`,s.backgroundColor[`layer-${c}`]=`var(${o})`}else{let d=e[f];d&&(r[o]=`var(${d})`,s.backgroundColor[`layer-${c}`]=`var(${o})`)}}else if(l.$value){let f=this.useTailwindV4?this.hexToOklch(l.$value):this.hexToHsl(l.$value);r[o]=f,s.backgroundColor[`layer-${c}`]=this.useTailwindV4?`var(${o})`:`hsl(var(${o}))`}}if(t.overlay)for(let[c,l]of Object.entries(t.overlay)){let o=`--overlay-${c}`;l.$value&&(r[o]=l.$value,s.backgroundColor[`overlay-${c}`]=`var(${o})`)}if(t.icon){s.fill||(s.fill={});for(let[c,l]of Object.entries(t.icon)){if(c==="disabled"){let o=i(l.$value);if(o){let u=e[o];if(u){let f="--icon-disabled";r[f]=`var(${u})`,s.textColor["icon-disabled"]=`var(${f})`,s.fill["icon-disabled"]=`var(${f})`}}continue}for(let[o,u]of Object.entries(l))for(let[f,d]of Object.entries(u)){let h=n(`icon-${c}-${o}-${f}`);h.endsWith("-default")&&(h=h.slice(0,-8));let m=`--${h}`,b=i(d.$value);if(b){let p=e[b];p&&(r[m]=`var(${p})`,s.textColor[h]=`var(${m})`,s.fill[h]=`var(${m})`)}}}}return{semanticVariables:r,tokens:s}}async fetchFontCss(t){return new Promise((e,r)=>{I.get(t,s=>{let n="";if(s.statusCode!==200){r(new Error(`Failed to fetch font CSS: ${s.statusCode}`));return}s.on("data",i=>{n+=i}),s.on("end",()=>{e(n)}),s.on("error",i=>{r(i)})}).on("error",s=>{r(s)})})}parseFontFaces(t){let e=/@font-face\s*{([^}]+)}/g,r=[],s;for(;(s=e.exec(t))!==null;){let n=s[1].trim().split(";").filter(Boolean),i={};n.forEach(a=>{let c=a.indexOf(":");if(c!==-1){let l=a.slice(0,c).trim(),o=a.slice(c+1).trim();l==="font-family"?i[l]=o.replace(/["']/g,""):i[l]=o}}),i.src&&(i.src=i.src.replace(/url\(["']?/,"url('").replace(/["']?\)/,"')")),r.push(i)}return r}async processFonts(t){let e=[];if(!t||typeof t!="object")return e;let r=Object.keys(t).filter(s=>s.startsWith("font"));for(let s of r){let n=t[s];if(typeof n=="string"&&n.startsWith("http"))try{let i=await this.fetchFontCss(n),a=this.parseFontFaces(i);a.length>0&&e.push(...a)}catch(i){console.warn(`Failed to process font ${s}:`,i.message)}}return e}processFontFamilies(t){let e={};if(!t||!t.font||!t.font.family)return e;let r=t.font.family;for(let[s,n]of Object.entries(r))if(n&&n.$value){let i=s.toLowerCase(),a=n.$value;typeof a=="string"&&a.startsWith("{")&&a.endsWith("}")&&(a=a.slice(1,-1));let c=l=>l.split(" ").map(o=>o.charAt(0).toUpperCase()+o.slice(1).toLowerCase()).join(" ");if(a.includes(","))e[i]=a;else{let l=c(a);l.includes(" ")&&!l.startsWith('"')&&!l.startsWith("'")?e[i]=`"${l}", sans-serif`:e[i]=`${l}, sans-serif`}}return e}processAnimations(t){let e={},r={};if(!t||typeof t!="object")return{keyframes:e,animations:r};for(let[s,n]of Object.entries(t))if(n&&typeof n=="object"){let i=`${s}`;if(n.keyframes){let c={};for(let[l,o]of Object.entries(n.keyframes))o&&typeof o=="object"&&(c[l]=o);e[i]=c}let a=[i,n.duration||"1s",n.easing||"ease",n.delay||"0s",n.iterations||"1",n.direction||"normal",n.fillMode||"none"].join(" ");r[s]=a}return{keyframes:e,animations:r}}generateSafelistClasses(t){let e=[];if(t.backgroundColor)for(let r of Object.keys(t.backgroundColor))e.push(`bg-${r}`);if(t.textColor)for(let r of Object.keys(t.textColor))e.push(`text-${r}`);if(t.borderColor)for(let r of Object.keys(t.borderColor))e.push(`border-${r}`);if(t.fill)for(let r of Object.keys(t.fill))e.push(`fill-${r}`),r.startsWith("icon-")&&e.push(`text-${r}`);if(t.fontFamily)for(let r of Object.keys(t.fontFamily))e.push(`font-${r}`);if(t.animations)for(let r of Object.keys(t.animations))e.push(`animate-${r}`);return e}extractClassesFromComponentsConfig(t){let e=new Set,r=n=>{typeof n=="string"&&n.split(/\s+/).filter(a=>a.length>0).forEach(a=>{e.add(a)})},s=n=>{if(!(!n||typeof n!="object"))for(let i in n){let a=n[i];typeof a=="string"?r(a):typeof a=="object"&&s(a)}};return t&&s(t),Array.from(e).filter(n=>!n.startsWith("file:")).sort()}generateClassesContent(t=[]){let e=["/*"," * Frontfriend Component Classes"," *"," * This file contains all classes used in Frontfriend component configs."," * Tailwind v4 scans this file via @source to generate utilities."," * DO NOT EDIT - Auto-generated by frontfriend CLI"," */","","/*"," * Classes:"],r=" * ";for(let s of[...new Set(t)].sort())r.length+s.length+1>100?(e.push(r),r=` * ${s}`):r+=(r===" * "?"":" ")+s;return r!==" * "&&e.push(r),e.push(" */"),e.join(`
2
2
  `)}processCustomCss(t){return!t||typeof t!="string"?{}:{raw:t}}async process(t){try{let e={variables:{},semanticVariables:{},semanticDarkVariables:{},utilities:{},fontFaces:[],keyframes:{},animations:{},safelist:[],metadata:{},custom:t.customCss?this.processCustomCss(t.customCss):{}},r=null;if(t.tokens&&typeof t.tokens=="object"){let s=t.tokens;r=s["Global Colors/Default"]||s["Global Colors"]||s.colors||s}else t.colors&&(r=t.colors);if(r){let s=this.processColors(r);e.variables={...e.variables,...s.variables},e.utilities={...e.utilities,...s.utilities},e.colorMap=s.colorMap||{}}else e.colorMap={};if(t.semantic&&e.colorMap){let s=this.processSemanticTokens(t.semantic,e.colorMap);e.semanticVariables=s.semanticVariables,s.tokens&&(e.tokens=s.tokens,e.utilities=s.tokens)}if(t.semanticDark&&e.colorMap){let s=this.processSemanticTokens(t.semanticDark,e.colorMap);e.semanticDarkVariables=s.semanticVariables}if(t.fonts&&(e.fontFaces=await this.processFonts(t.fonts)),t.globalTokens&&(e.fontFamilies=this.processFontFamilies(t.globalTokens),e.fontFamilies&&(e.utilities.fontFamily||(e.utilities.fontFamily={}),Object.assign(e.utilities.fontFamily,e.fontFamilies))),t.animations){let s=this.processAnimations(t.animations);e.keyframes=s.keyframes,e.animations=s.animations}return e.safelist=this.generateSafelistClasses(e.tokens||e.utilities),e.metadata={timestamp:new Date().toISOString(),version:t.version||"2.0.0",ffId:t.ffId},e}catch(e){throw console.error("Error processing tokens:",e),e}}generateThemeCSS(t){var a,c,l;let e=['@import "tw-animate-css";',"","@theme {"];for(let[o,u]of Object.entries(t.variables||{}))e.push(` ${o}: ${u};`);for(let[o,u]of Object.entries(t.fontFamilies||{})){let f=o.startsWith("--")?o:`--font-${o}`,d=Array.isArray(u)?u.join(", "):u;e.push(` ${f}: ${d};`)}for(let[o,u]of Object.entries(((a=t.utilities)==null?void 0:a.spacing)||{})){let f=o.startsWith("--")?o:`--spacing-${o}`;e.push(` ${f}: ${u};`)}for(let[o,u]of Object.entries(((c=t.utilities)==null?void 0:c.borderRadius)||{})){let f=o.startsWith("--")?o:`--radius-${o}`;e.push(` ${f}: ${u};`)}e.push("}","");let r=t.semanticVariables||{},s=L(r,t.utilities||{});e.push(":root:not(.dark) {");for(let[o,u]of Object.entries(s))e.push(` ${o}: ${u};`);for(let[o,u]of Object.entries(r))e.push(` ${o}: ${u};`);if(e.push("}"),t.semanticDarkVariables&&Object.keys(t.semanticDarkVariables).length>0){let o={...r,...t.semanticDarkVariables},u=L(o,t.utilities||{});e.push("",":root:not(.light) {");for(let[f,d]of Object.entries(u))e.push(` ${f}: ${d};`);for(let[f,d]of Object.entries(t.semanticDarkVariables))e.push(` ${f}: ${d};`);e.push("}")}let n={bg:[],text:[],border:[],icon:[],layer:[],overlay:[]};for(let o of Object.keys(t.semanticVariables||{}))o.startsWith("--bg-")&&n.bg.push(o.slice(5)),o.startsWith("--text-")&&n.text.push(o.slice(7)),o.startsWith("--border-")&&n.border.push(o.slice(9)),o.startsWith("--icon-")&&n.icon.push(o.slice(7)),o.startsWith("--layer-")&&n.layer.push(o.slice(8)),o.startsWith("--overlay-")&&n.overlay.push(o.slice(10));let i=(o,u)=>{e.push("",`@utility ${o} {`);for(let f of u)e.push(` ${f}`);e.push("}")};for(let o of n.bg)i(`bg-${o}`,[`background-color: var(--bg-${o});`]);for(let o of n.layer)i(`bg-layer-${o}`,[`background-color: var(--layer-${o});`]);for(let o of n.overlay)i(`bg-overlay-${o}`,[`background-color: var(--overlay-${o});`]);for(let o of n.text)i(`text-${o}`,[`color: var(--text-${o});`]);for(let o of n.border)i(`border-${o}`,[`border-color: var(--border-${o});`]);for(let o of n.icon)i(`icon-${o}`,[`color: var(--icon-${o});`]),i(`text-icon-${o}`,[`color: var(--icon-${o});`]);for(let o of t.fontFaces||[]){e.push("","@font-face {");for(let[u,f]of Object.entries(o)){let d=u.replace(/([A-Z])/g,"-$1").toLowerCase(),h=Array.isArray(f)?f.join(", "):f;e.push(` ${d}: ${h};`)}e.push("}")}for(let[o,u]of Object.entries(t.keyframes||{})){e.push("",`@keyframes ${o} {`);for(let[f,d]of Object.entries(u)){e.push(` ${f} {`);for(let[h,m]of Object.entries(d)){let b=h.replace(/([A-Z])/g,"-$1").toLowerCase();e.push(` ${b}: ${m};`)}e.push(" }")}e.push("}")}for(let[o,u]of Object.entries(t.animations||{}))i(`animate-${o}`,[`animation: ${u};`]);return(l=t.custom)!=null&&l.raw&&e.push("","/* Custom CSS */",t.custom.raw),e.push("","/* Component classes for Tailwind scanning */","@source './classes.css';"),e.join(`
3
3
  `)}};module.exports=V;
4
4
  //# sourceMappingURL=token-processor.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../lib/core/errors.js", "../../../lib/core/token-processor.js"],
4
- "sourcesContent": ["class APIError extends Error {\n constructor(message, statusCode, url) {\n super(message);\n this.name = 'APIError';\n this.statusCode = statusCode;\n this.url = url;\n this.code = `API_${statusCode}`;\n }\n}\n\nclass CacheError extends Error {\n constructor(message, operation) {\n super(message);\n this.name = 'CacheError';\n this.operation = operation;\n this.code = `CACHE_${operation.toUpperCase()}`;\n }\n}\n\nclass ConfigError extends Error {\n constructor(message, field) {\n super(message);\n this.name = 'ConfigError';\n this.field = field;\n this.code = `CONFIG_${field.toUpperCase()}`;\n }\n}\n\nclass ProcessingError extends Error {\n constructor(message, token) {\n super(message);\n this.name = 'ProcessingError';\n this.token = token;\n this.code = 'PROCESSING_ERROR';\n }\n}\n\nmodule.exports = {\n APIError,\n CacheError,\n ConfigError,\n ProcessingError\n};", "const Color = require('color');\nconst https = require('https');\nconst fs = require('fs');\nconst path = require('path');\nconst { ProcessingError } = require('./errors');\n\n\nconst SHADCN_THEME_FALLBACKS = {\n '--background': 'oklch(1 0 0)',\n '--foreground': 'oklch(0.145 0 0)',\n '--card': 'oklch(1 0 0)',\n '--card-foreground': 'oklch(0.145 0 0)',\n '--popover': 'oklch(1 0 0)',\n '--popover-foreground': 'oklch(0.145 0 0)',\n '--primary': 'oklch(0.205 0 0)',\n '--primary-foreground': 'oklch(0.985 0 0)',\n '--secondary': 'oklch(0.97 0 0)',\n '--secondary-foreground': 'oklch(0.205 0 0)',\n '--muted': 'oklch(0.97 0 0)',\n '--muted-foreground': 'oklch(0.556 0 0)',\n '--accent': 'oklch(0.97 0 0)',\n '--accent-foreground': 'oklch(0.205 0 0)',\n '--destructive': 'oklch(0.577 0.245 27.325)',\n '--destructive-foreground': 'oklch(0.985 0 0)',\n '--border': 'oklch(0.922 0 0)',\n '--input': 'oklch(0.922 0 0)',\n '--ring': 'oklch(0.708 0 0)',\n '--sidebar': 'oklch(0.985 0 0)',\n '--sidebar-foreground': 'oklch(0.145 0 0)',\n '--sidebar-primary': 'oklch(0.205 0 0)',\n '--sidebar-primary-foreground': 'oklch(0.985 0 0)',\n '--sidebar-accent': 'oklch(0.97 0 0)',\n '--sidebar-accent-foreground': 'oklch(0.205 0 0)',\n '--sidebar-border': 'oklch(0.922 0 0)',\n '--sidebar-ring': 'oklch(0.708 0 0)',\n '--chart-1': 'oklch(0.646 0.222 41.116)',\n '--chart-2': 'oklch(0.6 0.118 184.704)',\n '--chart-3': 'oklch(0.398 0.07 227.392)',\n '--chart-4': 'oklch(0.828 0.189 84.429)',\n '--chart-5': 'oklch(0.769 0.188 70.08)'\n};\n\nconst SHADCN_THEME_MAP = {\n '--background': ['--bg-default', '--bg-neutral-low', '--layer-base'],\n '--foreground': ['--text-neutral-strong', '--text-default'],\n '--card': ['--layer-1', '--bg-neutral-low', '--bg-default'],\n '--card-foreground': ['--text-neutral-strong', '--text-default'],\n '--popover': ['--layer-1', '--bg-neutral-low', '--bg-default'],\n '--popover-foreground': ['--text-neutral-strong', '--text-default'],\n '--primary': ['--bg-brand-mid', '--bg-brand-strong'],\n '--primary-foreground': ['--text-onbrand-strong', '--text-inverse-low'],\n '--secondary': ['--bg-interactive-subtle', '--bg-neutral-low'],\n '--secondary-foreground': ['--text-oninteractive-subtle', '--text-neutral-strong'],\n '--muted': ['--bg-neutral-low', '--bg-disabled'],\n '--muted-foreground': ['--text-neutral-subtle', '--text-disabled'],\n '--accent': ['--bg-interactive-low', '--bg-brand-low', '--bg-neutral-low'],\n '--accent-foreground': ['--text-oninteractive-low', '--text-brand-strong', '--text-neutral-strong'],\n '--destructive': ['--bg-negative-mid', '--bg-negative-subtle'],\n '--destructive-foreground': ['--text-onnegative-subtle', '--text-inverse-low'],\n '--border': ['--border-neutral-subtle', '--border-default'],\n '--input': ['--border-neutral-subtle', '--border-default'],\n '--ring': ['--border-brand-mid', '--bg-brand-mid'],\n '--sidebar': ['--layer-1', '--bg-neutral-low', '--bg-default'],\n '--sidebar-foreground': ['--text-neutral-strong', '--text-default'],\n '--sidebar-primary': ['--bg-brand-mid', '--bg-brand-strong'],\n '--sidebar-primary-foreground': ['--text-onbrand-strong', '--text-inverse-low'],\n '--sidebar-accent': ['--bg-interactive-low', '--bg-neutral-low'],\n '--sidebar-accent-foreground': ['--text-oninteractive-low', '--text-neutral-strong'],\n '--sidebar-border': ['--border-neutral-subtle', '--border-default'],\n '--sidebar-ring': ['--border-brand-mid', '--bg-brand-mid'],\n '--chart-1': ['--bg-brand-mid', '--bg-brand-strong'],\n '--chart-2': ['--bg-interactive-mid', '--bg-interactive-low'],\n '--chart-3': ['--bg-positive-mid', '--bg-positive-subtle'],\n '--chart-4': ['--bg-warning-mid', '--bg-warning-subtle'],\n '--chart-5': ['--bg-negative-mid', '--bg-negative-subtle']\n};\n\nfunction resolveFirst(source, names, fallback) {\n for (const name of names || []) {\n if (source[name]) return source[name];\n }\n return fallback;\n}\n\nfunction buildShadcnThemeContract(semanticVariables = {}, utilities = {}) {\n const contract = {};\n\n for (const [cssVar, candidates] of Object.entries(SHADCN_THEME_MAP)) {\n contract[cssVar] = resolveFirst(\n semanticVariables,\n candidates,\n SHADCN_THEME_FALLBACKS[cssVar]\n );\n }\n\n const radius = utilities.borderRadius || {};\n contract['--radius'] = radius.default || radius.md || radius.lg || '0.625rem';\n contract['--radius-sm'] = radius.sm || 'calc(var(--radius) - 4px)';\n contract['--radius-md'] = radius.md || 'calc(var(--radius) - 2px)';\n contract['--radius-lg'] = radius.lg || 'var(--radius)';\n contract['--radius-xl'] = radius.xl || 'calc(var(--radius) + 4px)';\n\n return contract;\n}\n\nclass TokenProcessor {\n constructor() {\n this.useTailwindV4 = this.detectTailwindVersion();\n }\n\n /**\n * Detect whether the consuming project uses Tailwind CSS v4.\n *\n * Defaults to v3 behavior for backward compatibility when detection fails.\n *\n * @returns {boolean}\n */\n detectTailwindVersion() {\n try {\n const packageJsonPath = path.join(process.cwd(), 'package.json');\n if (!fs.existsSync(packageJsonPath)) {\n return false;\n }\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n const tailwindVersion =\n packageJson.devDependencies?.tailwindcss ||\n packageJson.dependencies?.tailwindcss ||\n packageJson.peerDependencies?.tailwindcss;\n\n const majorVersion = tailwindVersion?.match(/(\\d+)\\./)?.[1];\n return majorVersion ? Number(majorVersion) >= 4 : false;\n } catch (error) {\n console.warn('[FrontFriend] Could not detect Tailwind version, defaulting to v3 (hex/HSL plugin mode)');\n return false;\n }\n }\n\n /**\n * Convert hex color to HSL format for Tailwind CSS\n * @param {string} hex - Hex color value\n * @returns {string} HSL string in format \"H S% L%\"\n */\n hexToHsl(hex) {\n try {\n const color = Color(hex);\n const hsl = color.hsl();\n \n // Get HSL values\n const h = Math.round(hsl.hue());\n const s = Math.round(hsl.saturationl());\n const l = Math.round(hsl.lightness());\n \n // Handle alpha channel if present\n const alpha = color.alpha();\n if (alpha < 1) {\n // Round alpha to 2 decimal places\n const roundedAlpha = Math.round(alpha * 100) / 100;\n return `${h} ${s}% ${l}% / ${roundedAlpha}`;\n }\n \n return `${h} ${s}% ${l}%`;\n } catch (error) {\n throw new ProcessingError(`Failed to convert color ${hex}: ${error.message}`, hex);\n }\n }\n\n /**\n * Convert a color to OKLCH format for Tailwind CSS v4 theme variables.\n *\n * @param {string} colorValue - Any color value supported by the color package\n * @returns {string} OKLCH color function\n */\n hexToOklch(colorValue) {\n try {\n const color = Color(colorValue);\n const rgb = color.rgb();\n const r = rgb.red() / 255;\n const g = rgb.green() / 255;\n const b = rgb.blue() / 255;\n\n const toLinear = (value) => (\n value <= 0.04045 ? value / 12.92 : Math.pow((value + 0.055) / 1.055, 2.4)\n );\n\n const rLin = toLinear(r);\n const gLin = toLinear(g);\n const bLin = toLinear(b);\n\n const x = rLin * 0.4124564 + gLin * 0.3575761 + bLin * 0.1804375;\n const y = rLin * 0.2126729 + gLin * 0.7151522 + bLin * 0.0721750;\n const z = rLin * 0.0193339 + gLin * 0.1191920 + bLin * 0.9503041;\n\n const l = Math.cbrt(0.8189330101 * x + 0.3618667424 * y - 0.1288597137 * z);\n const m = Math.cbrt(0.0329845436 * x + 0.9293118715 * y + 0.0361456387 * z);\n const s = Math.cbrt(0.0482003018 * x + 0.2643662691 * y + 0.6338517070 * z);\n\n const L = 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s;\n const a = 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s;\n const bAxis = 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s;\n\n const C = Math.sqrt(a * a + bAxis * bAxis);\n let H = Math.atan2(bAxis, a) * 180 / Math.PI;\n if (H < 0) H += 360;\n\n const roundedL = Math.round(L * 1000) / 1000;\n const roundedC = Math.round(C * 1000) / 1000;\n const roundedH = Math.round(H * 100) / 100;\n const alpha = color.alpha();\n\n if (alpha < 1) {\n const roundedAlpha = Math.round(alpha * 100) / 100;\n return `oklch(${roundedL} ${roundedC} ${roundedH} / ${roundedAlpha})`;\n }\n\n return `oklch(${roundedL} ${roundedC} ${roundedH})`;\n } catch (error) {\n throw new ProcessingError(`Failed to convert color ${colorValue}: ${error.message}`, colorValue);\n }\n }\n\n /**\n * Process color tokens into CSS variables\n * @param {Object} colorsData - Color tokens data\n * @returns {Object} Processed variables and color map\n */\n processColors(colorsData) {\n const variables = {};\n const colorMap = {};\n const utilities = {\n backgroundColor: {},\n textColor: {},\n borderColor: {}\n };\n\n // Check if we have valid color data\n if (!colorsData || typeof colorsData !== 'object') {\n console.log(' \u26A0\uFE0F No valid color data to process');\n return { variables, colorMap, utilities };\n }\n\n // Recursive function to process nested color structures\n const processColorGroup = (obj, prefix = '') => {\n for (const [key, value] of Object.entries(obj)) {\n if (value && typeof value === 'object') {\n if (value.$value) {\n // This is a color value\n const colorName = prefix ? `${prefix}-${key}` : key;\n const varName = `--color-${colorName}`;\n \n const colorValue = this.useTailwindV4\n ? this.hexToOklch(value.$value)\n : this.hexToHsl(value.$value);\n\n variables[varName] = colorValue;\n colorMap[colorName] = varName;\n \n // Generate Tailwind utilities\n const utilityValue = this.useTailwindV4 ? `var(${varName})` : `hsl(var(${varName}))`;\n utilities.backgroundColor[colorName] = utilityValue;\n utilities.textColor[colorName] = utilityValue;\n utilities.borderColor[colorName] = utilityValue;\n } else {\n // Nested structure, recurse\n const newPrefix = prefix ? `${prefix}-${key}` : key;\n processColorGroup(value, newPrefix);\n }\n }\n }\n };\n\n // Process colors - handle both nested and flat structures\n if (colorsData) {\n if (colorsData.colors) {\n processColorGroup(colorsData.colors);\n } else {\n // Direct color structure\n processColorGroup(colorsData);\n }\n }\n\n return {\n variables,\n colorMap,\n utilities\n };\n }\n\n /**\n * Process semantic tokens that reference other tokens\n * @param {Object} semanticData - Semantic tokens data\n * @param {Object} colorMap - Map of color names to CSS variables\n * @returns {Object} Semantic CSS variables and token utilities\n */\n processSemanticTokens(semanticData, colorMap) {\n const semanticVariables = {};\n const tokens = {\n backgroundColor: {},\n textColor: {},\n borderColor: {}\n };\n\n // Format token name (similar to current plugin)\n const formatTokenName = (name) => {\n return name.replace(/ /g, '').replace(/\\./g, '-').toLowerCase();\n };\n\n // Extract token reference from string like \"{colors.primary.500}\"\n const extractReference = (refString) => {\n // Handle non-string values\n if (typeof refString !== 'string') return null;\n \n const match = refString.match(/^\\{(.+)\\}$/);\n if (!match) return null;\n \n // Split the reference path and remove the first part if it's \"colors\"\n const parts = match[1].split('.');\n if (parts[0] === 'colors' && parts.length > 1) {\n // Check if second part is also \"colors\" (nested structure)\n if (parts[1] === 'colors' && parts.length > 2) {\n return parts.slice(2).join('-');\n }\n return parts.slice(1).join('-');\n }\n return parts.join('-');\n };\n\n // Process semantic category (bg, text, border)\n const processCategory = (category, outputCategory) => {\n if (!semanticData[category]) return;\n\n for (const [key, value] of Object.entries(semanticData[category])) {\n if (key === 'disabled') {\n // Handle disabled state specially\n const reference = extractReference(value.$value);\n if (reference) {\n const referencedVar = colorMap[reference];\n if (referencedVar) {\n const varName = `--${category}-disabled`;\n semanticVariables[varName] = `var(${referencedVar})`;\n tokens[outputCategory]['disabled'] = `var(${varName})`;\n }\n }\n continue;\n }\n\n // Process nested structure (e.g., neutral -> low -> default)\n for (const [mainKey, mainValue] of Object.entries(value)) {\n for (const [stateKey, stateValue] of Object.entries(mainValue)) {\n let tokenKey = formatTokenName(`${key}-${mainKey}-${stateKey}`);\n \n // Remove '-default' suffix for cleaner class names\n if (tokenKey.endsWith('-default')) {\n tokenKey = tokenKey.slice(0, -8);\n }\n\n const varName = `--${category}-${tokenKey}`;\n \n // Check if it's a reference\n const reference = extractReference(stateValue.$value);\n if (reference) {\n // Look up the referenced color variable\n const referencedVar = colorMap[reference];\n if (referencedVar) {\n semanticVariables[varName] = `var(${referencedVar})`;\n tokens[outputCategory][tokenKey] = `var(${varName})`;\n }\n } else if (stateValue.$value) {\n // Direct color value\n const colorValue = this.useTailwindV4\n ? this.hexToOklch(stateValue.$value)\n : this.hexToHsl(stateValue.$value);\n semanticVariables[varName] = colorValue;\n tokens[outputCategory][tokenKey] = this.useTailwindV4\n ? `var(${varName})`\n : `hsl(var(${varName}))`;\n }\n }\n }\n }\n };\n\n // Process semantic categories\n processCategory('bg', 'backgroundColor');\n processCategory('text', 'textColor');\n processCategory('border', 'borderColor');\n\n // Process layer tokens\n if (semanticData.layer) {\n for (const [layerKey, layerValue] of Object.entries(semanticData.layer)) {\n const varName = `--layer-${layerKey}`;\n const reference = extractReference(layerValue.$value);\n \n if (reference) {\n // Format the reference to match semantic token naming\n let formattedRef = reference.replace(/\\./g, '-').toLowerCase();\n \n // Remove -default suffix if present\n if (formattedRef.endsWith('-default')) {\n formattedRef = formattedRef.slice(0, -8);\n }\n \n // Check if it's a semantic reference (e.g., bg-neutral-subtle)\n if (formattedRef.startsWith('bg-') || formattedRef.startsWith('text-') || formattedRef.startsWith('border-')) {\n // It's referencing a semantic token\n const semanticVar = `--${formattedRef}`;\n semanticVariables[varName] = `var(${semanticVar})`;\n tokens.backgroundColor[`layer-${layerKey}`] = `var(${varName})`;\n } else {\n // It's referencing a color token\n const referencedVar = colorMap[formattedRef];\n if (referencedVar) {\n semanticVariables[varName] = `var(${referencedVar})`;\n tokens.backgroundColor[`layer-${layerKey}`] = `var(${varName})`;\n }\n }\n } else if (layerValue.$value) {\n // Direct value\n const colorValue = this.useTailwindV4\n ? this.hexToOklch(layerValue.$value)\n : this.hexToHsl(layerValue.$value);\n semanticVariables[varName] = colorValue;\n tokens.backgroundColor[`layer-${layerKey}`] = this.useTailwindV4\n ? `var(${varName})`\n : `hsl(var(${varName}))`;\n }\n }\n }\n\n // Process overlay tokens\n if (semanticData.overlay) {\n for (const [overlayKey, overlayValue] of Object.entries(semanticData.overlay)) {\n const varName = `--overlay-${overlayKey}`;\n \n if (overlayValue.$value) {\n // Overlay values are hex colors with alpha, keep them as-is\n semanticVariables[varName] = overlayValue.$value;\n tokens.backgroundColor[`overlay-${overlayKey}`] = `var(${varName})`;\n }\n }\n }\n\n // Process icon tokens (map to text and fill colors)\n if (semanticData.icon) {\n // Ensure fill property exists\n if (!tokens.fill) {\n tokens.fill = {};\n }\n \n for (const [iconKey, iconValue] of Object.entries(semanticData.icon)) {\n if (iconKey === 'disabled') {\n const reference = extractReference(iconValue.$value);\n if (reference) {\n const referencedVar = colorMap[reference];\n if (referencedVar) {\n const varName = `--icon-disabled`;\n semanticVariables[varName] = `var(${referencedVar})`;\n tokens.textColor['icon-disabled'] = `var(${varName})`;\n tokens.fill['icon-disabled'] = `var(${varName})`;\n }\n }\n continue;\n }\n\n for (const [mainKey, mainValue] of Object.entries(iconValue)) {\n for (const [stateKey, stateValue] of Object.entries(mainValue)) {\n let tokenKey = formatTokenName(`icon-${iconKey}-${mainKey}-${stateKey}`);\n if (tokenKey.endsWith('-default')) {\n tokenKey = tokenKey.slice(0, -8);\n }\n\n const varName = `--${tokenKey}`;\n const reference = extractReference(stateValue.$value);\n \n if (reference) {\n const referencedVar = colorMap[reference];\n if (referencedVar) {\n semanticVariables[varName] = `var(${referencedVar})`;\n tokens.textColor[tokenKey] = `var(${varName})`;\n tokens.fill[tokenKey] = `var(${varName})`;\n }\n }\n }\n }\n }\n }\n\n return { semanticVariables, tokens };\n }\n\n /**\n * Fetch CSS from URL and parse font-face rules\n * @param {string} url - Font CSS URL\n * @returns {Promise<string>} Font face CSS\n */\n async fetchFontCss(url) {\n return new Promise((resolve, reject) => {\n https.get(url, (response) => {\n let data = '';\n \n if (response.statusCode !== 200) {\n reject(new Error(`Failed to fetch font CSS: ${response.statusCode}`));\n return;\n }\n\n response.on('data', (chunk) => {\n data += chunk;\n });\n\n response.on('end', () => {\n resolve(data);\n });\n\n response.on('error', (error) => {\n reject(error);\n });\n }).on('error', (error) => {\n reject(error);\n });\n });\n }\n\n /**\n * Parse font-face CSS into structured objects\n * @param {string} css - CSS text containing @font-face rules\n * @returns {Array} Array of font-face objects\n */\n parseFontFaces(css) {\n const fontFaceRegex = /@font-face\\s*{([^}]+)}/g;\n const fontFaces = [];\n let match;\n\n while ((match = fontFaceRegex.exec(css)) !== null) {\n const fontProperties = match[1].trim().split(';').filter(Boolean);\n const fontObj = {};\n\n fontProperties.forEach(prop => {\n const colonIndex = prop.indexOf(':');\n if (colonIndex !== -1) {\n const key = prop.slice(0, colonIndex).trim();\n const value = prop.slice(colonIndex + 1).trim();\n \n // Clean up quotes from font-family\n if (key === 'font-family') {\n fontObj[key] = value.replace(/[\"']/g, '');\n } else {\n fontObj[key] = value;\n }\n }\n });\n\n // Ensure src URLs are properly quoted\n if (fontObj['src']) {\n fontObj['src'] = fontObj['src']\n .replace(/url\\([\"']?/, 'url(\\'')\n .replace(/[\"']?\\)/, '\\')');\n }\n\n fontFaces.push(fontObj);\n }\n\n return fontFaces;\n }\n\n /**\n * Process fonts data\n * @param {Object} fontData - Font URLs object\n * @returns {Promise<Array>} Array of font-face objects\n */\n async processFonts(fontData) {\n const fontFaces = [];\n\n if (!fontData || typeof fontData !== 'object') {\n return fontFaces;\n }\n\n // Process each font URL (font, font2, etc.)\n const fontFields = Object.keys(fontData).filter(key => key.startsWith('font'));\n \n for (const field of fontFields) {\n const url = fontData[field];\n if (typeof url === 'string' && url.startsWith('http')) {\n try {\n const css = await this.fetchFontCss(url);\n const parsedFonts = this.parseFontFaces(css);\n \n if (parsedFonts.length > 0) {\n fontFaces.push(...parsedFonts);\n }\n } catch (error) {\n console.warn(`Failed to process font ${field}:`, error.message);\n }\n }\n }\n\n return fontFaces;\n }\n\n /**\n * Process font family tokens\n * @param {Object} globalTokens - Global tokens data containing font families\n * @returns {Object} Font family utilities\n */\n processFontFamilies(globalTokens) {\n const fontFamilyUtilities = {};\n \n if (!globalTokens || !globalTokens.font || !globalTokens.font.family) {\n return fontFamilyUtilities;\n }\n\n const fontFamilies = globalTokens.font.family;\n \n // Process each font family (primary, secondary, etc.)\n for (const [key, value] of Object.entries(fontFamilies)) {\n if (value && value.$value) {\n // Format the key (e.g., primary -> primary)\n const fontKey = key.toLowerCase();\n \n // Extract font family value\n let fontFamilyValue = value.$value;\n \n // If it's a reference, extract it\n if (typeof fontFamilyValue === 'string' && fontFamilyValue.startsWith('{') && fontFamilyValue.endsWith('}')) {\n // This is a reference, but for font families we usually have direct values\n fontFamilyValue = fontFamilyValue.slice(1, -1);\n }\n \n // Store the font family utility\n // Store the font family utility - ensure proper quoting for multi-word fonts\n // For Tailwind, we need to format font families properly\n \n // Capitalize the first letter of each word in font names for proper rendering\n const capitalizeFontName = (name) => {\n return name.split(' ').map(word => \n word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n ).join(' ');\n };\n \n // Check if it's already a font stack or needs quoting\n if (fontFamilyValue.includes(',')) {\n // It's already a font stack, use as is\n fontFamilyUtilities[fontKey] = fontFamilyValue;\n } else {\n // Capitalize the font name\n const capitalizedFont = capitalizeFontName(fontFamilyValue);\n \n if (capitalizedFont.includes(' ') && !capitalizedFont.startsWith('\"') && !capitalizedFont.startsWith(\"'\")) {\n // Multi-word font needs quotes, add generic fallback\n fontFamilyUtilities[fontKey] = `\"${capitalizedFont}\", sans-serif`;\n } else {\n // Single word font, add generic fallback\n fontFamilyUtilities[fontKey] = `${capitalizedFont}, sans-serif`;\n }\n }\n }\n }\n \n return fontFamilyUtilities;\n }\n\n /**\n * Process animations data\n * @param {Object} animationData - Animation definitions\n * @returns {Object} Keyframes and animation utilities\n */\n processAnimations(animationData) {\n const keyframes = {};\n const animations = {};\n\n if (!animationData || typeof animationData !== 'object') {\n return { keyframes, animations };\n }\n\n // Process each animation\n for (const [name, definition] of Object.entries(animationData)) {\n if (definition && typeof definition === 'object') {\n // Generate keyframe name\n const keyframeName = `${name}`;\n \n // Process keyframe steps\n if (definition.keyframes) {\n const keyframeSteps = {};\n \n for (const [step, props] of Object.entries(definition.keyframes)) {\n if (props && typeof props === 'object') {\n keyframeSteps[step] = props;\n }\n }\n \n keyframes[keyframeName] = keyframeSteps;\n }\n\n // Create animation utility\n const animationValue = [\n keyframeName,\n definition.duration || '1s',\n definition.easing || 'ease',\n definition.delay || '0s',\n definition.iterations || '1',\n definition.direction || 'normal',\n definition.fillMode || 'none'\n ].join(' ');\n\n animations[name] = animationValue;\n }\n }\n\n return { keyframes, animations };\n }\n\n /**\n * Generate safelist classes for Tailwind\n * @param {Object} tokens - All processed tokens\n * @returns {Array} Safelist patterns\n */\n generateSafelistClasses(tokens) {\n const safelist = [];\n\n // Add semantic token utilities (bg-, text-, border-)\n // Note: Only base classes are added to safelist. Variants (hover:, focus:, etc.)\n // are detected by Tailwind's JIT when actually used in components.\n // This prevents generation of invalid CSS selector combinations with Turbopack.\n if (tokens.backgroundColor) {\n for (const tokenName of Object.keys(tokens.backgroundColor)) {\n safelist.push(`bg-${tokenName}`);\n }\n }\n\n if (tokens.textColor) {\n for (const tokenName of Object.keys(tokens.textColor)) {\n safelist.push(`text-${tokenName}`);\n }\n }\n\n if (tokens.borderColor) {\n for (const tokenName of Object.keys(tokens.borderColor)) {\n safelist.push(`border-${tokenName}`);\n }\n }\n\n // Add fill utilities (for icons)\n if (tokens.fill) {\n for (const tokenName of Object.keys(tokens.fill)) {\n safelist.push(`fill-${tokenName}`);\n \n // Also add text-icon-* classes\n if (tokenName.startsWith('icon-')) {\n safelist.push(`text-${tokenName}`);\n }\n }\n }\n\n // Add font family utilities\n if (tokens.fontFamily) {\n for (const fontName of Object.keys(tokens.fontFamily)) {\n safelist.push(`font-${fontName}`);\n }\n }\n\n // Add animation classes\n if (tokens.animations) {\n for (const animationName of Object.keys(tokens.animations)) {\n safelist.push(`animate-${animationName}`);\n }\n }\n\n return safelist;\n }\n\n /**\n * Extract unique classes from components configuration\n * @param {Object} componentsConfig - Components configuration object\n * @returns {Array} Array of unique class names\n */\n extractClassesFromComponentsConfig(componentsConfig) {\n const classSet = new Set();\n\n // Helper function to extract classes from a string\n const extractClasses = (classString) => {\n if (typeof classString === 'string') {\n // Split by spaces and filter out empty strings\n const classes = classString.split(/\\s+/).filter(c => c.length > 0);\n classes.forEach(cls => {\n // Skip variant selectors like [&>svg]:absolute\n classSet.add(cls);\n });\n }\n };\n\n // Recursive function to traverse the config object\n const traverse = (obj) => {\n if (!obj || typeof obj !== 'object') return;\n\n for (const key in obj) {\n const value = obj[key];\n \n if (typeof value === 'string') {\n extractClasses(value);\n } else if (typeof value === 'object') {\n traverse(value);\n }\n }\n };\n\n // Process the components config\n if (componentsConfig) {\n traverse(componentsConfig);\n }\n\n // Convert set to array, filter out file: variant classes (they produce invalid\n // chained pseudo-element CSS like ::placeholder::file-selector-button), and sort\n return Array.from(classSet).filter(cls => !cls.startsWith('file:')).sort();\n }\n\n /**\n * Generate a CSS source file containing component classes for Tailwind v4 @source\n * scanning. Classes stay in comments because Tailwind only needs to discover the\n * strings; actual readable utilities are emitted by generateThemeCSS().\n *\n * @param {Array<string>} classes - Unique component classes\n * @returns {string}\n */\n generateClassesContent(classes = []) {\n const lines = [\n '/*',\n ' * Frontfriend Component Classes',\n ' *',\n ' * This file contains all classes used in Frontfriend component configs.',\n ' * Tailwind v4 scans this file via @source to generate utilities.',\n ' * DO NOT EDIT - Auto-generated by frontfriend CLI',\n ' */',\n '',\n '/*',\n ' * Classes:'\n ];\n\n let currentLine = ' * ';\n for (const cls of [...new Set(classes)].sort()) {\n if (currentLine.length + cls.length + 1 > 100) {\n lines.push(currentLine);\n currentLine = ` * ${cls}`;\n } else {\n currentLine += (currentLine === ' * ' ? '' : ' ') + cls;\n }\n }\n\n if (currentLine !== ' * ') {\n lines.push(currentLine);\n }\n\n lines.push(' */');\n\n return lines.join('\\n');\n }\n\n /**\n * Process custom CSS into a format compatible with Tailwind's addBase\n * @param {string} css - Raw CSS string\n * @returns {Object} CSS rules as object for Tailwind addBase\n */\n processCustomCss(css) {\n if (!css || typeof css !== 'string') {\n return {};\n }\n\n // Simply return the raw CSS as a string that can be added via addBase\n return { raw: css };\n }\n\n /**\n * Main orchestration method to process all token data\n * @param {Object} data - Complete token data from API\n * @returns {Promise<Object>} Processed token data\n */\n async process(data) {\n try {\n const result = {\n variables: {},\n semanticVariables: {},\n semanticDarkVariables: {},\n utilities: {},\n fontFaces: [],\n keyframes: {},\n animations: {},\n safelist: [],\n metadata: {},\n custom: data.customCss ? this.processCustomCss(data.customCss) : {}\n };\n\n // Handle different token formats (new vs legacy)\n let colorData = null;\n \n // Check if we have tokens in the new format\n if (data.tokens && typeof data.tokens === 'object') {\n // New format from processed-tokens endpoint\n const tokens = data.tokens;\n \n // Extract color data from various possible locations\n colorData = tokens['Global Colors/Default'] || \n tokens['Global Colors'] || \n tokens['colors'] ||\n tokens;\n } else if (data.colors) {\n // Legacy format or direct colors data\n colorData = data.colors;\n }\n\n // Process colors\n if (colorData) {\n const colorResult = this.processColors(colorData);\n result.variables = { ...result.variables, ...colorResult.variables };\n result.utilities = { ...result.utilities, ...colorResult.utilities };\n result.colorMap = colorResult.colorMap || {};\n } else {\n result.colorMap = {};\n }\n\n // Process semantic tokens (light mode)\n if (data.semantic && result.colorMap) {\n const semanticResult = this.processSemanticTokens(data.semantic, result.colorMap);\n result.semanticVariables = semanticResult.semanticVariables;\n // Merge tokens into utilities\n if (semanticResult.tokens) {\n result.tokens = semanticResult.tokens;\n // Replace color utilities with semantic token utilities\n result.utilities = semanticResult.tokens;\n }\n }\n\n // Process semantic tokens (dark mode)\n if (data.semanticDark && result.colorMap) {\n const semanticDarkResult = this.processSemanticTokens(data.semanticDark, result.colorMap);\n result.semanticDarkVariables = semanticDarkResult.semanticVariables;\n }\n\n // Process fonts\n if (data.fonts) {\n result.fontFaces = await this.processFonts(data.fonts);\n }\n\n // Process font families from global tokens\n if (data.globalTokens) {\n result.fontFamilies = this.processFontFamilies(data.globalTokens);\n \n // Add font family utilities\n if (result.fontFamilies) {\n if (!result.utilities.fontFamily) {\n result.utilities.fontFamily = {};\n }\n Object.assign(result.utilities.fontFamily, result.fontFamilies);\n }\n }\n\n // Process animations\n if (data.animations) {\n const animationResult = this.processAnimations(data.animations);\n result.keyframes = animationResult.keyframes;\n result.animations = animationResult.animations;\n }\n\n // Generate safelist from semantic tokens (not colorMap)\n // Pass the tokens object that contains backgroundColor, textColor, etc.\n result.safelist = this.generateSafelistClasses(result.tokens || result.utilities);\n\n // Add metadata\n result.metadata = {\n timestamp: new Date().toISOString(),\n version: data.version || '2.0.0',\n ffId: data.ffId\n };\n\n return result;\n } catch (error) {\n console.error('Error processing tokens:', error);\n throw error;\n }\n }\n\n /**\n * Generate Tailwind CSS v4 theme CSS while preserving Frontfriend's readable\n * semantic class names through @utility directives.\n *\n * @param {Object} processedData - Output from process()\n * @returns {string}\n */\n generateThemeCSS(processedData) {\n const lines = [\n '@import \"tw-animate-css\";',\n '',\n '@theme {'\n ];\n\n for (const [cssVar, value] of Object.entries(processedData.variables || {})) {\n lines.push(` ${cssVar}: ${value};`);\n }\n\n for (const [name, value] of Object.entries(processedData.fontFamilies || {})) {\n const cssVar = name.startsWith('--') ? name : `--font-${name}`;\n const fontValue = Array.isArray(value) ? value.join(', ') : value;\n lines.push(` ${cssVar}: ${fontValue};`);\n }\n\n for (const [name, value] of Object.entries(processedData.utilities?.spacing || {})) {\n const cssVar = name.startsWith('--') ? name : `--spacing-${name}`;\n lines.push(` ${cssVar}: ${value};`);\n }\n\n for (const [name, value] of Object.entries(processedData.utilities?.borderRadius || {})) {\n const cssVar = name.startsWith('--') ? name : `--radius-${name}`;\n lines.push(` ${cssVar}: ${value};`);\n }\n\n lines.push('}', '');\n\n const semanticVariables = processedData.semanticVariables || {};\n const lightShadcnContract = buildShadcnThemeContract(\n semanticVariables,\n processedData.utilities || {}\n );\n\n lines.push(':root:not(.dark) {');\n for (const [cssVar, value] of Object.entries(lightShadcnContract)) {\n lines.push(` ${cssVar}: ${value};`);\n }\n for (const [cssVar, value] of Object.entries(semanticVariables)) {\n lines.push(` ${cssVar}: ${value};`);\n }\n lines.push('}');\n\n if (processedData.semanticDarkVariables && Object.keys(processedData.semanticDarkVariables).length > 0) {\n const darkSemanticVariables = {\n ...semanticVariables,\n ...processedData.semanticDarkVariables\n };\n const darkShadcnContract = buildShadcnThemeContract(\n darkSemanticVariables,\n processedData.utilities || {}\n );\n\n lines.push('', ':root:not(.light) {');\n for (const [cssVar, value] of Object.entries(darkShadcnContract)) {\n lines.push(` ${cssVar}: ${value};`);\n }\n for (const [cssVar, value] of Object.entries(processedData.semanticDarkVariables)) {\n lines.push(` ${cssVar}: ${value};`);\n }\n lines.push('}');\n }\n\n const tokenGroups = {\n bg: [],\n text: [],\n border: [],\n icon: [],\n layer: [],\n overlay: []\n };\n\n for (const cssVar of Object.keys(processedData.semanticVariables || {})) {\n if (cssVar.startsWith('--bg-')) tokenGroups.bg.push(cssVar.slice('--bg-'.length));\n if (cssVar.startsWith('--text-')) tokenGroups.text.push(cssVar.slice('--text-'.length));\n if (cssVar.startsWith('--border-')) tokenGroups.border.push(cssVar.slice('--border-'.length));\n if (cssVar.startsWith('--icon-')) tokenGroups.icon.push(cssVar.slice('--icon-'.length));\n if (cssVar.startsWith('--layer-')) tokenGroups.layer.push(cssVar.slice('--layer-'.length));\n if (cssVar.startsWith('--overlay-')) tokenGroups.overlay.push(cssVar.slice('--overlay-'.length));\n }\n\n const addUtility = (className, declarations) => {\n lines.push('', `@utility ${className} {`);\n for (const declaration of declarations) {\n lines.push(` ${declaration}`);\n }\n lines.push('}');\n };\n\n for (const tokenName of tokenGroups.bg) {\n addUtility(`bg-${tokenName}`, [`background-color: var(--bg-${tokenName});`]);\n }\n\n for (const tokenName of tokenGroups.layer) {\n addUtility(`bg-layer-${tokenName}`, [`background-color: var(--layer-${tokenName});`]);\n }\n\n for (const tokenName of tokenGroups.overlay) {\n addUtility(`bg-overlay-${tokenName}`, [`background-color: var(--overlay-${tokenName});`]);\n }\n\n for (const tokenName of tokenGroups.text) {\n addUtility(`text-${tokenName}`, [`color: var(--text-${tokenName});`]);\n }\n\n for (const tokenName of tokenGroups.border) {\n addUtility(`border-${tokenName}`, [`border-color: var(--border-${tokenName});`]);\n }\n\n for (const tokenName of tokenGroups.icon) {\n addUtility(`icon-${tokenName}`, [`color: var(--icon-${tokenName});`]);\n addUtility(`text-icon-${tokenName}`, [`color: var(--icon-${tokenName});`]);\n }\n\n for (const fontFace of processedData.fontFaces || []) {\n lines.push('', '@font-face {');\n for (const [property, value] of Object.entries(fontFace)) {\n const cssProperty = property.replace(/([A-Z])/g, '-$1').toLowerCase();\n const cssValue = Array.isArray(value) ? value.join(', ') : value;\n lines.push(` ${cssProperty}: ${cssValue};`);\n }\n lines.push('}');\n }\n\n for (const [name, steps] of Object.entries(processedData.keyframes || {})) {\n lines.push('', `@keyframes ${name} {`);\n for (const [step, declarations] of Object.entries(steps)) {\n lines.push(` ${step} {`);\n for (const [property, value] of Object.entries(declarations)) {\n const cssProperty = property.replace(/([A-Z])/g, '-$1').toLowerCase();\n lines.push(` ${cssProperty}: ${value};`);\n }\n lines.push(' }');\n }\n lines.push('}');\n }\n\n for (const [name, value] of Object.entries(processedData.animations || {})) {\n addUtility(`animate-${name}`, [`animation: ${value};`]);\n }\n\n if (processedData.custom?.raw) {\n lines.push('', '/* Custom CSS */', processedData.custom.raw);\n }\n\n lines.push('', '/* Component classes for Tailwind scanning */', '@source \\'./classes.css\\';');\n\n return lines.join('\\n');\n }\n}\n\nmodule.exports = TokenProcessor;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["class APIError extends Error {\n constructor(message, statusCode, url) {\n super(message);\n this.name = 'APIError';\n this.statusCode = statusCode;\n this.url = url;\n this.code = `API_${statusCode}`;\n }\n}\n\nclass CacheError extends Error {\n constructor(message, operation) {\n super(message);\n this.name = 'CacheError';\n this.operation = operation;\n this.code = `CACHE_${operation.toUpperCase()}`;\n }\n}\n\nclass ConfigError extends Error {\n constructor(message, field) {\n super(message);\n this.name = 'ConfigError';\n this.field = field;\n // `field` is optional; guard so a missing field never crashes (and masks)\n // the real error with `Cannot read properties of undefined (toUpperCase)`.\n this.code = field ? `CONFIG_${String(field).toUpperCase()}` : 'CONFIG_ERROR';\n }\n}\n\nclass ProcessingError extends Error {\n constructor(message, token) {\n super(message);\n this.name = 'ProcessingError';\n this.token = token;\n this.code = 'PROCESSING_ERROR';\n }\n}\n\nmodule.exports = {\n APIError,\n CacheError,\n ConfigError,\n ProcessingError\n};", "const Color = require('color');\nconst https = require('https');\nconst fs = require('fs');\nconst path = require('path');\nconst { ProcessingError } = require('./errors');\n\n\nconst SHADCN_THEME_FALLBACKS = {\n '--background': 'oklch(1 0 0)',\n '--foreground': 'oklch(0.145 0 0)',\n '--card': 'oklch(1 0 0)',\n '--card-foreground': 'oklch(0.145 0 0)',\n '--popover': 'oklch(1 0 0)',\n '--popover-foreground': 'oklch(0.145 0 0)',\n '--primary': 'oklch(0.205 0 0)',\n '--primary-foreground': 'oklch(0.985 0 0)',\n '--secondary': 'oklch(0.97 0 0)',\n '--secondary-foreground': 'oklch(0.205 0 0)',\n '--muted': 'oklch(0.97 0 0)',\n '--muted-foreground': 'oklch(0.556 0 0)',\n '--accent': 'oklch(0.97 0 0)',\n '--accent-foreground': 'oklch(0.205 0 0)',\n '--destructive': 'oklch(0.577 0.245 27.325)',\n '--destructive-foreground': 'oklch(0.985 0 0)',\n '--border': 'oklch(0.922 0 0)',\n '--input': 'oklch(0.922 0 0)',\n '--ring': 'oklch(0.708 0 0)',\n '--sidebar': 'oklch(0.985 0 0)',\n '--sidebar-foreground': 'oklch(0.145 0 0)',\n '--sidebar-primary': 'oklch(0.205 0 0)',\n '--sidebar-primary-foreground': 'oklch(0.985 0 0)',\n '--sidebar-accent': 'oklch(0.97 0 0)',\n '--sidebar-accent-foreground': 'oklch(0.205 0 0)',\n '--sidebar-border': 'oklch(0.922 0 0)',\n '--sidebar-ring': 'oklch(0.708 0 0)',\n '--chart-1': 'oklch(0.646 0.222 41.116)',\n '--chart-2': 'oklch(0.6 0.118 184.704)',\n '--chart-3': 'oklch(0.398 0.07 227.392)',\n '--chart-4': 'oklch(0.828 0.189 84.429)',\n '--chart-5': 'oklch(0.769 0.188 70.08)'\n};\n\nconst SHADCN_THEME_MAP = {\n '--background': ['--bg-default', '--bg-neutral-low', '--layer-base'],\n '--foreground': ['--text-neutral-strong', '--text-default'],\n '--card': ['--layer-1', '--bg-neutral-low', '--bg-default'],\n '--card-foreground': ['--text-neutral-strong', '--text-default'],\n '--popover': ['--layer-1', '--bg-neutral-low', '--bg-default'],\n '--popover-foreground': ['--text-neutral-strong', '--text-default'],\n '--primary': ['--bg-brand-mid', '--bg-brand-strong'],\n '--primary-foreground': ['--text-onbrand-strong', '--text-inverse-low'],\n '--secondary': ['--bg-interactive-subtle', '--bg-neutral-low'],\n '--secondary-foreground': ['--text-oninteractive-subtle', '--text-neutral-strong'],\n '--muted': ['--bg-neutral-low', '--bg-disabled'],\n '--muted-foreground': ['--text-neutral-subtle', '--text-disabled'],\n '--accent': ['--bg-interactive-low', '--bg-brand-low', '--bg-neutral-low'],\n '--accent-foreground': ['--text-oninteractive-low', '--text-brand-strong', '--text-neutral-strong'],\n '--destructive': ['--bg-negative-mid', '--bg-negative-subtle'],\n '--destructive-foreground': ['--text-onnegative-subtle', '--text-inverse-low'],\n '--border': ['--border-neutral-subtle', '--border-default'],\n '--input': ['--border-neutral-subtle', '--border-default'],\n '--ring': ['--border-brand-mid', '--bg-brand-mid'],\n '--sidebar': ['--layer-1', '--bg-neutral-low', '--bg-default'],\n '--sidebar-foreground': ['--text-neutral-strong', '--text-default'],\n '--sidebar-primary': ['--bg-brand-mid', '--bg-brand-strong'],\n '--sidebar-primary-foreground': ['--text-onbrand-strong', '--text-inverse-low'],\n '--sidebar-accent': ['--bg-interactive-low', '--bg-neutral-low'],\n '--sidebar-accent-foreground': ['--text-oninteractive-low', '--text-neutral-strong'],\n '--sidebar-border': ['--border-neutral-subtle', '--border-default'],\n '--sidebar-ring': ['--border-brand-mid', '--bg-brand-mid'],\n '--chart-1': ['--bg-brand-mid', '--bg-brand-strong'],\n '--chart-2': ['--bg-interactive-mid', '--bg-interactive-low'],\n '--chart-3': ['--bg-positive-mid', '--bg-positive-subtle'],\n '--chart-4': ['--bg-warning-mid', '--bg-warning-subtle'],\n '--chart-5': ['--bg-negative-mid', '--bg-negative-subtle']\n};\n\nfunction resolveFirst(source, names, fallback) {\n for (const name of names || []) {\n if (source[name]) return source[name];\n }\n return fallback;\n}\n\nfunction buildShadcnThemeContract(semanticVariables = {}, utilities = {}) {\n const contract = {};\n\n for (const [cssVar, candidates] of Object.entries(SHADCN_THEME_MAP)) {\n contract[cssVar] = resolveFirst(\n semanticVariables,\n candidates,\n SHADCN_THEME_FALLBACKS[cssVar]\n );\n }\n\n const radius = utilities.borderRadius || {};\n contract['--radius'] = radius.default || radius.md || radius.lg || '0.625rem';\n contract['--radius-sm'] = radius.sm || 'calc(var(--radius) - 4px)';\n contract['--radius-md'] = radius.md || 'calc(var(--radius) - 2px)';\n contract['--radius-lg'] = radius.lg || 'var(--radius)';\n contract['--radius-xl'] = radius.xl || 'calc(var(--radius) + 4px)';\n\n return contract;\n}\n\nclass TokenProcessor {\n constructor() {\n this.useTailwindV4 = this.detectTailwindVersion();\n }\n\n /**\n * Detect whether the consuming project uses Tailwind CSS v4.\n *\n * Defaults to v3 behavior for backward compatibility when detection fails.\n *\n * @returns {boolean}\n */\n detectTailwindVersion() {\n try {\n const packageJsonPath = path.join(process.cwd(), 'package.json');\n if (!fs.existsSync(packageJsonPath)) {\n return false;\n }\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n const tailwindVersion =\n packageJson.devDependencies?.tailwindcss ||\n packageJson.dependencies?.tailwindcss ||\n packageJson.peerDependencies?.tailwindcss;\n\n const majorVersion = tailwindVersion?.match(/(\\d+)\\./)?.[1];\n return majorVersion ? Number(majorVersion) >= 4 : false;\n } catch (error) {\n console.warn('[FrontFriend] Could not detect Tailwind version, defaulting to v3 (hex/HSL plugin mode)');\n return false;\n }\n }\n\n /**\n * Convert hex color to HSL format for Tailwind CSS\n * @param {string} hex - Hex color value\n * @returns {string} HSL string in format \"H S% L%\"\n */\n hexToHsl(hex) {\n try {\n const color = Color(hex);\n const hsl = color.hsl();\n \n // Get HSL values\n const h = Math.round(hsl.hue());\n const s = Math.round(hsl.saturationl());\n const l = Math.round(hsl.lightness());\n \n // Handle alpha channel if present\n const alpha = color.alpha();\n if (alpha < 1) {\n // Round alpha to 2 decimal places\n const roundedAlpha = Math.round(alpha * 100) / 100;\n return `${h} ${s}% ${l}% / ${roundedAlpha}`;\n }\n \n return `${h} ${s}% ${l}%`;\n } catch (error) {\n throw new ProcessingError(`Failed to convert color ${hex}: ${error.message}`, hex);\n }\n }\n\n /**\n * Convert a color to OKLCH format for Tailwind CSS v4 theme variables.\n *\n * @param {string} colorValue - Any color value supported by the color package\n * @returns {string} OKLCH color function\n */\n hexToOklch(colorValue) {\n try {\n const color = Color(colorValue);\n const rgb = color.rgb();\n const r = rgb.red() / 255;\n const g = rgb.green() / 255;\n const b = rgb.blue() / 255;\n\n const toLinear = (value) => (\n value <= 0.04045 ? value / 12.92 : Math.pow((value + 0.055) / 1.055, 2.4)\n );\n\n const rLin = toLinear(r);\n const gLin = toLinear(g);\n const bLin = toLinear(b);\n\n const x = rLin * 0.4124564 + gLin * 0.3575761 + bLin * 0.1804375;\n const y = rLin * 0.2126729 + gLin * 0.7151522 + bLin * 0.0721750;\n const z = rLin * 0.0193339 + gLin * 0.1191920 + bLin * 0.9503041;\n\n const l = Math.cbrt(0.8189330101 * x + 0.3618667424 * y - 0.1288597137 * z);\n const m = Math.cbrt(0.0329845436 * x + 0.9293118715 * y + 0.0361456387 * z);\n const s = Math.cbrt(0.0482003018 * x + 0.2643662691 * y + 0.6338517070 * z);\n\n const L = 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s;\n const a = 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s;\n const bAxis = 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s;\n\n const C = Math.sqrt(a * a + bAxis * bAxis);\n let H = Math.atan2(bAxis, a) * 180 / Math.PI;\n if (H < 0) H += 360;\n\n const roundedL = Math.round(L * 1000) / 1000;\n const roundedC = Math.round(C * 1000) / 1000;\n const roundedH = Math.round(H * 100) / 100;\n const alpha = color.alpha();\n\n if (alpha < 1) {\n const roundedAlpha = Math.round(alpha * 100) / 100;\n return `oklch(${roundedL} ${roundedC} ${roundedH} / ${roundedAlpha})`;\n }\n\n return `oklch(${roundedL} ${roundedC} ${roundedH})`;\n } catch (error) {\n throw new ProcessingError(`Failed to convert color ${colorValue}: ${error.message}`, colorValue);\n }\n }\n\n /**\n * Process color tokens into CSS variables\n * @param {Object} colorsData - Color tokens data\n * @returns {Object} Processed variables and color map\n */\n processColors(colorsData) {\n const variables = {};\n const colorMap = {};\n const utilities = {\n backgroundColor: {},\n textColor: {},\n borderColor: {}\n };\n\n // Check if we have valid color data\n if (!colorsData || typeof colorsData !== 'object') {\n console.log(' \u26A0\uFE0F No valid color data to process');\n return { variables, colorMap, utilities };\n }\n\n // Recursive function to process nested color structures\n const processColorGroup = (obj, prefix = '') => {\n for (const [key, value] of Object.entries(obj)) {\n if (value && typeof value === 'object') {\n if (value.$value) {\n // This is a color value\n const colorName = prefix ? `${prefix}-${key}` : key;\n const varName = `--color-${colorName}`;\n \n const colorValue = this.useTailwindV4\n ? this.hexToOklch(value.$value)\n : this.hexToHsl(value.$value);\n\n variables[varName] = colorValue;\n colorMap[colorName] = varName;\n \n // Generate Tailwind utilities\n const utilityValue = this.useTailwindV4 ? `var(${varName})` : `hsl(var(${varName}))`;\n utilities.backgroundColor[colorName] = utilityValue;\n utilities.textColor[colorName] = utilityValue;\n utilities.borderColor[colorName] = utilityValue;\n } else {\n // Nested structure, recurse\n const newPrefix = prefix ? `${prefix}-${key}` : key;\n processColorGroup(value, newPrefix);\n }\n }\n }\n };\n\n // Process colors - handle both nested and flat structures\n if (colorsData) {\n if (colorsData.colors) {\n processColorGroup(colorsData.colors);\n } else {\n // Direct color structure\n processColorGroup(colorsData);\n }\n }\n\n return {\n variables,\n colorMap,\n utilities\n };\n }\n\n /**\n * Process semantic tokens that reference other tokens\n * @param {Object} semanticData - Semantic tokens data\n * @param {Object} colorMap - Map of color names to CSS variables\n * @returns {Object} Semantic CSS variables and token utilities\n */\n processSemanticTokens(semanticData, colorMap) {\n const semanticVariables = {};\n const tokens = {\n backgroundColor: {},\n textColor: {},\n borderColor: {}\n };\n\n // Format token name (similar to current plugin)\n const formatTokenName = (name) => {\n return name.replace(/ /g, '').replace(/\\./g, '-').toLowerCase();\n };\n\n // Extract token reference from string like \"{colors.primary.500}\"\n const extractReference = (refString) => {\n // Handle non-string values\n if (typeof refString !== 'string') return null;\n \n const match = refString.match(/^\\{(.+)\\}$/);\n if (!match) return null;\n \n // Split the reference path and remove the first part if it's \"colors\"\n const parts = match[1].split('.');\n if (parts[0] === 'colors' && parts.length > 1) {\n // Check if second part is also \"colors\" (nested structure)\n if (parts[1] === 'colors' && parts.length > 2) {\n return parts.slice(2).join('-');\n }\n return parts.slice(1).join('-');\n }\n return parts.join('-');\n };\n\n // Process semantic category (bg, text, border)\n const processCategory = (category, outputCategory) => {\n if (!semanticData[category]) return;\n\n for (const [key, value] of Object.entries(semanticData[category])) {\n if (key === 'disabled') {\n // Handle disabled state specially\n const reference = extractReference(value.$value);\n if (reference) {\n const referencedVar = colorMap[reference];\n if (referencedVar) {\n const varName = `--${category}-disabled`;\n semanticVariables[varName] = `var(${referencedVar})`;\n tokens[outputCategory]['disabled'] = `var(${varName})`;\n }\n }\n continue;\n }\n\n // Process nested structure (e.g., neutral -> low -> default)\n for (const [mainKey, mainValue] of Object.entries(value)) {\n for (const [stateKey, stateValue] of Object.entries(mainValue)) {\n let tokenKey = formatTokenName(`${key}-${mainKey}-${stateKey}`);\n \n // Remove '-default' suffix for cleaner class names\n if (tokenKey.endsWith('-default')) {\n tokenKey = tokenKey.slice(0, -8);\n }\n\n const varName = `--${category}-${tokenKey}`;\n \n // Check if it's a reference\n const reference = extractReference(stateValue.$value);\n if (reference) {\n // Look up the referenced color variable\n const referencedVar = colorMap[reference];\n if (referencedVar) {\n semanticVariables[varName] = `var(${referencedVar})`;\n tokens[outputCategory][tokenKey] = `var(${varName})`;\n }\n } else if (stateValue.$value) {\n // Direct color value\n const colorValue = this.useTailwindV4\n ? this.hexToOklch(stateValue.$value)\n : this.hexToHsl(stateValue.$value);\n semanticVariables[varName] = colorValue;\n tokens[outputCategory][tokenKey] = this.useTailwindV4\n ? `var(${varName})`\n : `hsl(var(${varName}))`;\n }\n }\n }\n }\n };\n\n // Process semantic categories\n processCategory('bg', 'backgroundColor');\n processCategory('text', 'textColor');\n processCategory('border', 'borderColor');\n\n // Process layer tokens\n if (semanticData.layer) {\n for (const [layerKey, layerValue] of Object.entries(semanticData.layer)) {\n const varName = `--layer-${layerKey}`;\n const reference = extractReference(layerValue.$value);\n \n if (reference) {\n // Format the reference to match semantic token naming\n let formattedRef = reference.replace(/\\./g, '-').toLowerCase();\n \n // Remove -default suffix if present\n if (formattedRef.endsWith('-default')) {\n formattedRef = formattedRef.slice(0, -8);\n }\n \n // Check if it's a semantic reference (e.g., bg-neutral-subtle)\n if (formattedRef.startsWith('bg-') || formattedRef.startsWith('text-') || formattedRef.startsWith('border-')) {\n // It's referencing a semantic token\n const semanticVar = `--${formattedRef}`;\n semanticVariables[varName] = `var(${semanticVar})`;\n tokens.backgroundColor[`layer-${layerKey}`] = `var(${varName})`;\n } else {\n // It's referencing a color token\n const referencedVar = colorMap[formattedRef];\n if (referencedVar) {\n semanticVariables[varName] = `var(${referencedVar})`;\n tokens.backgroundColor[`layer-${layerKey}`] = `var(${varName})`;\n }\n }\n } else if (layerValue.$value) {\n // Direct value\n const colorValue = this.useTailwindV4\n ? this.hexToOklch(layerValue.$value)\n : this.hexToHsl(layerValue.$value);\n semanticVariables[varName] = colorValue;\n tokens.backgroundColor[`layer-${layerKey}`] = this.useTailwindV4\n ? `var(${varName})`\n : `hsl(var(${varName}))`;\n }\n }\n }\n\n // Process overlay tokens\n if (semanticData.overlay) {\n for (const [overlayKey, overlayValue] of Object.entries(semanticData.overlay)) {\n const varName = `--overlay-${overlayKey}`;\n \n if (overlayValue.$value) {\n // Overlay values are hex colors with alpha, keep them as-is\n semanticVariables[varName] = overlayValue.$value;\n tokens.backgroundColor[`overlay-${overlayKey}`] = `var(${varName})`;\n }\n }\n }\n\n // Process icon tokens (map to text and fill colors)\n if (semanticData.icon) {\n // Ensure fill property exists\n if (!tokens.fill) {\n tokens.fill = {};\n }\n \n for (const [iconKey, iconValue] of Object.entries(semanticData.icon)) {\n if (iconKey === 'disabled') {\n const reference = extractReference(iconValue.$value);\n if (reference) {\n const referencedVar = colorMap[reference];\n if (referencedVar) {\n const varName = `--icon-disabled`;\n semanticVariables[varName] = `var(${referencedVar})`;\n tokens.textColor['icon-disabled'] = `var(${varName})`;\n tokens.fill['icon-disabled'] = `var(${varName})`;\n }\n }\n continue;\n }\n\n for (const [mainKey, mainValue] of Object.entries(iconValue)) {\n for (const [stateKey, stateValue] of Object.entries(mainValue)) {\n let tokenKey = formatTokenName(`icon-${iconKey}-${mainKey}-${stateKey}`);\n if (tokenKey.endsWith('-default')) {\n tokenKey = tokenKey.slice(0, -8);\n }\n\n const varName = `--${tokenKey}`;\n const reference = extractReference(stateValue.$value);\n \n if (reference) {\n const referencedVar = colorMap[reference];\n if (referencedVar) {\n semanticVariables[varName] = `var(${referencedVar})`;\n tokens.textColor[tokenKey] = `var(${varName})`;\n tokens.fill[tokenKey] = `var(${varName})`;\n }\n }\n }\n }\n }\n }\n\n return { semanticVariables, tokens };\n }\n\n /**\n * Fetch CSS from URL and parse font-face rules\n * @param {string} url - Font CSS URL\n * @returns {Promise<string>} Font face CSS\n */\n async fetchFontCss(url) {\n return new Promise((resolve, reject) => {\n https.get(url, (response) => {\n let data = '';\n \n if (response.statusCode !== 200) {\n reject(new Error(`Failed to fetch font CSS: ${response.statusCode}`));\n return;\n }\n\n response.on('data', (chunk) => {\n data += chunk;\n });\n\n response.on('end', () => {\n resolve(data);\n });\n\n response.on('error', (error) => {\n reject(error);\n });\n }).on('error', (error) => {\n reject(error);\n });\n });\n }\n\n /**\n * Parse font-face CSS into structured objects\n * @param {string} css - CSS text containing @font-face rules\n * @returns {Array} Array of font-face objects\n */\n parseFontFaces(css) {\n const fontFaceRegex = /@font-face\\s*{([^}]+)}/g;\n const fontFaces = [];\n let match;\n\n while ((match = fontFaceRegex.exec(css)) !== null) {\n const fontProperties = match[1].trim().split(';').filter(Boolean);\n const fontObj = {};\n\n fontProperties.forEach(prop => {\n const colonIndex = prop.indexOf(':');\n if (colonIndex !== -1) {\n const key = prop.slice(0, colonIndex).trim();\n const value = prop.slice(colonIndex + 1).trim();\n \n // Clean up quotes from font-family\n if (key === 'font-family') {\n fontObj[key] = value.replace(/[\"']/g, '');\n } else {\n fontObj[key] = value;\n }\n }\n });\n\n // Ensure src URLs are properly quoted\n if (fontObj['src']) {\n fontObj['src'] = fontObj['src']\n .replace(/url\\([\"']?/, 'url(\\'')\n .replace(/[\"']?\\)/, '\\')');\n }\n\n fontFaces.push(fontObj);\n }\n\n return fontFaces;\n }\n\n /**\n * Process fonts data\n * @param {Object} fontData - Font URLs object\n * @returns {Promise<Array>} Array of font-face objects\n */\n async processFonts(fontData) {\n const fontFaces = [];\n\n if (!fontData || typeof fontData !== 'object') {\n return fontFaces;\n }\n\n // Process each font URL (font, font2, etc.)\n const fontFields = Object.keys(fontData).filter(key => key.startsWith('font'));\n \n for (const field of fontFields) {\n const url = fontData[field];\n if (typeof url === 'string' && url.startsWith('http')) {\n try {\n const css = await this.fetchFontCss(url);\n const parsedFonts = this.parseFontFaces(css);\n \n if (parsedFonts.length > 0) {\n fontFaces.push(...parsedFonts);\n }\n } catch (error) {\n console.warn(`Failed to process font ${field}:`, error.message);\n }\n }\n }\n\n return fontFaces;\n }\n\n /**\n * Process font family tokens\n * @param {Object} globalTokens - Global tokens data containing font families\n * @returns {Object} Font family utilities\n */\n processFontFamilies(globalTokens) {\n const fontFamilyUtilities = {};\n \n if (!globalTokens || !globalTokens.font || !globalTokens.font.family) {\n return fontFamilyUtilities;\n }\n\n const fontFamilies = globalTokens.font.family;\n \n // Process each font family (primary, secondary, etc.)\n for (const [key, value] of Object.entries(fontFamilies)) {\n if (value && value.$value) {\n // Format the key (e.g., primary -> primary)\n const fontKey = key.toLowerCase();\n \n // Extract font family value\n let fontFamilyValue = value.$value;\n \n // If it's a reference, extract it\n if (typeof fontFamilyValue === 'string' && fontFamilyValue.startsWith('{') && fontFamilyValue.endsWith('}')) {\n // This is a reference, but for font families we usually have direct values\n fontFamilyValue = fontFamilyValue.slice(1, -1);\n }\n \n // Store the font family utility\n // Store the font family utility - ensure proper quoting for multi-word fonts\n // For Tailwind, we need to format font families properly\n \n // Capitalize the first letter of each word in font names for proper rendering\n const capitalizeFontName = (name) => {\n return name.split(' ').map(word => \n word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n ).join(' ');\n };\n \n // Check if it's already a font stack or needs quoting\n if (fontFamilyValue.includes(',')) {\n // It's already a font stack, use as is\n fontFamilyUtilities[fontKey] = fontFamilyValue;\n } else {\n // Capitalize the font name\n const capitalizedFont = capitalizeFontName(fontFamilyValue);\n \n if (capitalizedFont.includes(' ') && !capitalizedFont.startsWith('\"') && !capitalizedFont.startsWith(\"'\")) {\n // Multi-word font needs quotes, add generic fallback\n fontFamilyUtilities[fontKey] = `\"${capitalizedFont}\", sans-serif`;\n } else {\n // Single word font, add generic fallback\n fontFamilyUtilities[fontKey] = `${capitalizedFont}, sans-serif`;\n }\n }\n }\n }\n \n return fontFamilyUtilities;\n }\n\n /**\n * Process animations data\n * @param {Object} animationData - Animation definitions\n * @returns {Object} Keyframes and animation utilities\n */\n processAnimations(animationData) {\n const keyframes = {};\n const animations = {};\n\n if (!animationData || typeof animationData !== 'object') {\n return { keyframes, animations };\n }\n\n // Process each animation\n for (const [name, definition] of Object.entries(animationData)) {\n if (definition && typeof definition === 'object') {\n // Generate keyframe name\n const keyframeName = `${name}`;\n \n // Process keyframe steps\n if (definition.keyframes) {\n const keyframeSteps = {};\n \n for (const [step, props] of Object.entries(definition.keyframes)) {\n if (props && typeof props === 'object') {\n keyframeSteps[step] = props;\n }\n }\n \n keyframes[keyframeName] = keyframeSteps;\n }\n\n // Create animation utility\n const animationValue = [\n keyframeName,\n definition.duration || '1s',\n definition.easing || 'ease',\n definition.delay || '0s',\n definition.iterations || '1',\n definition.direction || 'normal',\n definition.fillMode || 'none'\n ].join(' ');\n\n animations[name] = animationValue;\n }\n }\n\n return { keyframes, animations };\n }\n\n /**\n * Generate safelist classes for Tailwind\n * @param {Object} tokens - All processed tokens\n * @returns {Array} Safelist patterns\n */\n generateSafelistClasses(tokens) {\n const safelist = [];\n\n // Add semantic token utilities (bg-, text-, border-)\n // Note: Only base classes are added to safelist. Variants (hover:, focus:, etc.)\n // are detected by Tailwind's JIT when actually used in components.\n // This prevents generation of invalid CSS selector combinations with Turbopack.\n if (tokens.backgroundColor) {\n for (const tokenName of Object.keys(tokens.backgroundColor)) {\n safelist.push(`bg-${tokenName}`);\n }\n }\n\n if (tokens.textColor) {\n for (const tokenName of Object.keys(tokens.textColor)) {\n safelist.push(`text-${tokenName}`);\n }\n }\n\n if (tokens.borderColor) {\n for (const tokenName of Object.keys(tokens.borderColor)) {\n safelist.push(`border-${tokenName}`);\n }\n }\n\n // Add fill utilities (for icons)\n if (tokens.fill) {\n for (const tokenName of Object.keys(tokens.fill)) {\n safelist.push(`fill-${tokenName}`);\n \n // Also add text-icon-* classes\n if (tokenName.startsWith('icon-')) {\n safelist.push(`text-${tokenName}`);\n }\n }\n }\n\n // Add font family utilities\n if (tokens.fontFamily) {\n for (const fontName of Object.keys(tokens.fontFamily)) {\n safelist.push(`font-${fontName}`);\n }\n }\n\n // Add animation classes\n if (tokens.animations) {\n for (const animationName of Object.keys(tokens.animations)) {\n safelist.push(`animate-${animationName}`);\n }\n }\n\n return safelist;\n }\n\n /**\n * Extract unique classes from components configuration\n * @param {Object} componentsConfig - Components configuration object\n * @returns {Array} Array of unique class names\n */\n extractClassesFromComponentsConfig(componentsConfig) {\n const classSet = new Set();\n\n // Helper function to extract classes from a string\n const extractClasses = (classString) => {\n if (typeof classString === 'string') {\n // Split by spaces and filter out empty strings\n const classes = classString.split(/\\s+/).filter(c => c.length > 0);\n classes.forEach(cls => {\n // Skip variant selectors like [&>svg]:absolute\n classSet.add(cls);\n });\n }\n };\n\n // Recursive function to traverse the config object\n const traverse = (obj) => {\n if (!obj || typeof obj !== 'object') return;\n\n for (const key in obj) {\n const value = obj[key];\n \n if (typeof value === 'string') {\n extractClasses(value);\n } else if (typeof value === 'object') {\n traverse(value);\n }\n }\n };\n\n // Process the components config\n if (componentsConfig) {\n traverse(componentsConfig);\n }\n\n // Convert set to array, filter out file: variant classes (they produce invalid\n // chained pseudo-element CSS like ::placeholder::file-selector-button), and sort\n return Array.from(classSet).filter(cls => !cls.startsWith('file:')).sort();\n }\n\n /**\n * Generate a CSS source file containing component classes for Tailwind v4 @source\n * scanning. Classes stay in comments because Tailwind only needs to discover the\n * strings; actual readable utilities are emitted by generateThemeCSS().\n *\n * @param {Array<string>} classes - Unique component classes\n * @returns {string}\n */\n generateClassesContent(classes = []) {\n const lines = [\n '/*',\n ' * Frontfriend Component Classes',\n ' *',\n ' * This file contains all classes used in Frontfriend component configs.',\n ' * Tailwind v4 scans this file via @source to generate utilities.',\n ' * DO NOT EDIT - Auto-generated by frontfriend CLI',\n ' */',\n '',\n '/*',\n ' * Classes:'\n ];\n\n let currentLine = ' * ';\n for (const cls of [...new Set(classes)].sort()) {\n if (currentLine.length + cls.length + 1 > 100) {\n lines.push(currentLine);\n currentLine = ` * ${cls}`;\n } else {\n currentLine += (currentLine === ' * ' ? '' : ' ') + cls;\n }\n }\n\n if (currentLine !== ' * ') {\n lines.push(currentLine);\n }\n\n lines.push(' */');\n\n return lines.join('\\n');\n }\n\n /**\n * Process custom CSS into a format compatible with Tailwind's addBase\n * @param {string} css - Raw CSS string\n * @returns {Object} CSS rules as object for Tailwind addBase\n */\n processCustomCss(css) {\n if (!css || typeof css !== 'string') {\n return {};\n }\n\n // Simply return the raw CSS as a string that can be added via addBase\n return { raw: css };\n }\n\n /**\n * Main orchestration method to process all token data\n * @param {Object} data - Complete token data from API\n * @returns {Promise<Object>} Processed token data\n */\n async process(data) {\n try {\n const result = {\n variables: {},\n semanticVariables: {},\n semanticDarkVariables: {},\n utilities: {},\n fontFaces: [],\n keyframes: {},\n animations: {},\n safelist: [],\n metadata: {},\n custom: data.customCss ? this.processCustomCss(data.customCss) : {}\n };\n\n // Handle different token formats (new vs legacy)\n let colorData = null;\n \n // Check if we have tokens in the new format\n if (data.tokens && typeof data.tokens === 'object') {\n // New format from processed-tokens endpoint\n const tokens = data.tokens;\n \n // Extract color data from various possible locations\n colorData = tokens['Global Colors/Default'] || \n tokens['Global Colors'] || \n tokens['colors'] ||\n tokens;\n } else if (data.colors) {\n // Legacy format or direct colors data\n colorData = data.colors;\n }\n\n // Process colors\n if (colorData) {\n const colorResult = this.processColors(colorData);\n result.variables = { ...result.variables, ...colorResult.variables };\n result.utilities = { ...result.utilities, ...colorResult.utilities };\n result.colorMap = colorResult.colorMap || {};\n } else {\n result.colorMap = {};\n }\n\n // Process semantic tokens (light mode)\n if (data.semantic && result.colorMap) {\n const semanticResult = this.processSemanticTokens(data.semantic, result.colorMap);\n result.semanticVariables = semanticResult.semanticVariables;\n // Merge tokens into utilities\n if (semanticResult.tokens) {\n result.tokens = semanticResult.tokens;\n // Replace color utilities with semantic token utilities\n result.utilities = semanticResult.tokens;\n }\n }\n\n // Process semantic tokens (dark mode)\n if (data.semanticDark && result.colorMap) {\n const semanticDarkResult = this.processSemanticTokens(data.semanticDark, result.colorMap);\n result.semanticDarkVariables = semanticDarkResult.semanticVariables;\n }\n\n // Process fonts\n if (data.fonts) {\n result.fontFaces = await this.processFonts(data.fonts);\n }\n\n // Process font families from global tokens\n if (data.globalTokens) {\n result.fontFamilies = this.processFontFamilies(data.globalTokens);\n \n // Add font family utilities\n if (result.fontFamilies) {\n if (!result.utilities.fontFamily) {\n result.utilities.fontFamily = {};\n }\n Object.assign(result.utilities.fontFamily, result.fontFamilies);\n }\n }\n\n // Process animations\n if (data.animations) {\n const animationResult = this.processAnimations(data.animations);\n result.keyframes = animationResult.keyframes;\n result.animations = animationResult.animations;\n }\n\n // Generate safelist from semantic tokens (not colorMap)\n // Pass the tokens object that contains backgroundColor, textColor, etc.\n result.safelist = this.generateSafelistClasses(result.tokens || result.utilities);\n\n // Add metadata\n result.metadata = {\n timestamp: new Date().toISOString(),\n version: data.version || '2.0.0',\n ffId: data.ffId\n };\n\n return result;\n } catch (error) {\n console.error('Error processing tokens:', error);\n throw error;\n }\n }\n\n /**\n * Generate Tailwind CSS v4 theme CSS while preserving Frontfriend's readable\n * semantic class names through @utility directives.\n *\n * @param {Object} processedData - Output from process()\n * @returns {string}\n */\n generateThemeCSS(processedData) {\n const lines = [\n '@import \"tw-animate-css\";',\n '',\n '@theme {'\n ];\n\n for (const [cssVar, value] of Object.entries(processedData.variables || {})) {\n lines.push(` ${cssVar}: ${value};`);\n }\n\n for (const [name, value] of Object.entries(processedData.fontFamilies || {})) {\n const cssVar = name.startsWith('--') ? name : `--font-${name}`;\n const fontValue = Array.isArray(value) ? value.join(', ') : value;\n lines.push(` ${cssVar}: ${fontValue};`);\n }\n\n for (const [name, value] of Object.entries(processedData.utilities?.spacing || {})) {\n const cssVar = name.startsWith('--') ? name : `--spacing-${name}`;\n lines.push(` ${cssVar}: ${value};`);\n }\n\n for (const [name, value] of Object.entries(processedData.utilities?.borderRadius || {})) {\n const cssVar = name.startsWith('--') ? name : `--radius-${name}`;\n lines.push(` ${cssVar}: ${value};`);\n }\n\n lines.push('}', '');\n\n const semanticVariables = processedData.semanticVariables || {};\n const lightShadcnContract = buildShadcnThemeContract(\n semanticVariables,\n processedData.utilities || {}\n );\n\n lines.push(':root:not(.dark) {');\n for (const [cssVar, value] of Object.entries(lightShadcnContract)) {\n lines.push(` ${cssVar}: ${value};`);\n }\n for (const [cssVar, value] of Object.entries(semanticVariables)) {\n lines.push(` ${cssVar}: ${value};`);\n }\n lines.push('}');\n\n if (processedData.semanticDarkVariables && Object.keys(processedData.semanticDarkVariables).length > 0) {\n const darkSemanticVariables = {\n ...semanticVariables,\n ...processedData.semanticDarkVariables\n };\n const darkShadcnContract = buildShadcnThemeContract(\n darkSemanticVariables,\n processedData.utilities || {}\n );\n\n lines.push('', ':root:not(.light) {');\n for (const [cssVar, value] of Object.entries(darkShadcnContract)) {\n lines.push(` ${cssVar}: ${value};`);\n }\n for (const [cssVar, value] of Object.entries(processedData.semanticDarkVariables)) {\n lines.push(` ${cssVar}: ${value};`);\n }\n lines.push('}');\n }\n\n const tokenGroups = {\n bg: [],\n text: [],\n border: [],\n icon: [],\n layer: [],\n overlay: []\n };\n\n for (const cssVar of Object.keys(processedData.semanticVariables || {})) {\n if (cssVar.startsWith('--bg-')) tokenGroups.bg.push(cssVar.slice('--bg-'.length));\n if (cssVar.startsWith('--text-')) tokenGroups.text.push(cssVar.slice('--text-'.length));\n if (cssVar.startsWith('--border-')) tokenGroups.border.push(cssVar.slice('--border-'.length));\n if (cssVar.startsWith('--icon-')) tokenGroups.icon.push(cssVar.slice('--icon-'.length));\n if (cssVar.startsWith('--layer-')) tokenGroups.layer.push(cssVar.slice('--layer-'.length));\n if (cssVar.startsWith('--overlay-')) tokenGroups.overlay.push(cssVar.slice('--overlay-'.length));\n }\n\n const addUtility = (className, declarations) => {\n lines.push('', `@utility ${className} {`);\n for (const declaration of declarations) {\n lines.push(` ${declaration}`);\n }\n lines.push('}');\n };\n\n for (const tokenName of tokenGroups.bg) {\n addUtility(`bg-${tokenName}`, [`background-color: var(--bg-${tokenName});`]);\n }\n\n for (const tokenName of tokenGroups.layer) {\n addUtility(`bg-layer-${tokenName}`, [`background-color: var(--layer-${tokenName});`]);\n }\n\n for (const tokenName of tokenGroups.overlay) {\n addUtility(`bg-overlay-${tokenName}`, [`background-color: var(--overlay-${tokenName});`]);\n }\n\n for (const tokenName of tokenGroups.text) {\n addUtility(`text-${tokenName}`, [`color: var(--text-${tokenName});`]);\n }\n\n for (const tokenName of tokenGroups.border) {\n addUtility(`border-${tokenName}`, [`border-color: var(--border-${tokenName});`]);\n }\n\n for (const tokenName of tokenGroups.icon) {\n addUtility(`icon-${tokenName}`, [`color: var(--icon-${tokenName});`]);\n addUtility(`text-icon-${tokenName}`, [`color: var(--icon-${tokenName});`]);\n }\n\n for (const fontFace of processedData.fontFaces || []) {\n lines.push('', '@font-face {');\n for (const [property, value] of Object.entries(fontFace)) {\n const cssProperty = property.replace(/([A-Z])/g, '-$1').toLowerCase();\n const cssValue = Array.isArray(value) ? value.join(', ') : value;\n lines.push(` ${cssProperty}: ${cssValue};`);\n }\n lines.push('}');\n }\n\n for (const [name, steps] of Object.entries(processedData.keyframes || {})) {\n lines.push('', `@keyframes ${name} {`);\n for (const [step, declarations] of Object.entries(steps)) {\n lines.push(` ${step} {`);\n for (const [property, value] of Object.entries(declarations)) {\n const cssProperty = property.replace(/([A-Z])/g, '-$1').toLowerCase();\n lines.push(` ${cssProperty}: ${value};`);\n }\n lines.push(' }');\n }\n lines.push('}');\n }\n\n for (const [name, value] of Object.entries(processedData.animations || {})) {\n addUtility(`animate-${name}`, [`animation: ${value};`]);\n }\n\n if (processedData.custom?.raw) {\n lines.push('', '/* Custom CSS */', processedData.custom.raw);\n }\n\n lines.push('', '/* Component classes for Tailwind scanning */', '@source \\'./classes.css\\';');\n\n return lines.join('\\n');\n }\n}\n\nmodule.exports = TokenProcessor;\n"],
5
+ "mappings": "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",
6
6
  "names": ["require_errors", "__commonJSMin", "exports", "module", "APIError", "message", "statusCode", "url", "CacheError", "operation", "ConfigError", "field", "ProcessingError", "token", "Color", "https", "fs", "path", "ProcessingError", "SHADCN_THEME_FALLBACKS", "SHADCN_THEME_MAP", "resolveFirst", "source", "names", "fallback", "name", "buildShadcnThemeContract", "semanticVariables", "utilities", "contract", "cssVar", "candidates", "radius", "TokenProcessor", "_a", "_b", "_c", "_d", "packageJsonPath", "packageJson", "tailwindVersion", "majorVersion", "hex", "color", "hsl", "h", "s", "l", "alpha", "roundedAlpha", "error", "colorValue", "rgb", "r", "g", "b", "toLinear", "value", "rLin", "gLin", "bLin", "x", "y", "z", "L", "a", "bAxis", "C", "H", "roundedL", "roundedC", "roundedH", "colorsData", "variables", "colorMap", "processColorGroup", "obj", "prefix", "key", "colorName", "varName", "utilityValue", "newPrefix", "semanticData", "tokens", "formatTokenName", "extractReference", "refString", "match", "parts", "processCategory", "category", "outputCategory", "reference", "referencedVar", "mainKey", "mainValue", "stateKey", "stateValue", "tokenKey", "layerKey", "layerValue", "formattedRef", "semanticVar", "overlayKey", "overlayValue", "iconKey", "iconValue", "url", "resolve", "reject", "response", "data", "chunk", "css", "fontFaceRegex", "fontFaces", "fontProperties", "fontObj", "prop", "colonIndex", "fontData", "fontFields", "field", "parsedFonts", "globalTokens", "fontFamilyUtilities", "fontFamilies", "fontKey", "fontFamilyValue", "capitalizeFontName", "word", "capitalizedFont", "animationData", "keyframes", "animations", "definition", "keyframeName", "keyframeSteps", "step", "props", "animationValue", "safelist", "tokenName", "fontName", "animationName", "componentsConfig", "classSet", "extractClasses", "classString", "c", "cls", "traverse", "classes", "lines", "currentLine", "result", "colorData", "colorResult", "semanticResult", "semanticDarkResult", "animationResult", "processedData", "fontValue", "lightShadcnContract", "darkSemanticVariables", "darkShadcnContract", "tokenGroups", "addUtility", "className", "declarations", "declaration", "fontFace", "property", "cssProperty", "cssValue", "steps"]
7
7
  }