@frontfriend/tailwind 4.0.8 → 4.0.9

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.
package/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  var P=(e,o)=>()=>(o||e((o={exports:{}}).exports,o),o.exports);var K=P((jn,Z)=>{var we="https://app.frontfriend.dev",Se="https://registry-legacy.frontfriend.dev",xe=".cache/frontfriend",je={JS:["tokens.js","variables.js","semanticVariables.js","semanticDarkVariables.js","safelist.js","custom.js"],JSON:["fonts.json","icons.json","components-config.json","version.json","metadata.json"]},ke={FF_ID:"FF_ID",FF_API_URL:"FF_API_URL",FF_USE_LOCAL:"FF_USE_LOCAL",FF_AUTH_TOKEN:"FF_AUTH_TOKEN"};Z.exports={DEFAULT_API_URL:we,LEGACY_API_URL:Se,CACHE_DIR_NAME:xe,CACHE_TTL_DAYS:7,CACHE_TTL_MS:6048e5,CACHE_FILES:je,ENV_VARS:ke}});var ie=P((kn,re)=>{var F=require("fs"),W=require("path"),Fe=require("os"),be=require("https"),$e=require("http"),{URL:_e}=require("url"),{DEFAULT_API_URL:Q}=K(),X=W.join(Fe.homedir(),".frontfriend"),b=W.join(X,"credentials");function Te(){return b}function ee(){try{return F.existsSync(b)?JSON.parse(F.readFileSync(b,"utf8")):null}catch{return null}}function ne(e){F.mkdirSync(X,{recursive:!0,mode:448}),F.writeFileSync(b,`${JSON.stringify(e,null,2)}
3
- `,{mode:384});try{F.chmodSync(b,384)}catch{}}function Ee(){return F.existsSync(b)?(F.unlinkSync(b),!0):!1}function oe(e,o=60*1e3){return!(e!=null&&e.accessToken)||!e.expiresAt||Date.now()+o>=e.expiresAt}function O(e){let o=new Error(`${e}. Run \`frontfriend login\` to re-authenticate.`);return o.code="FF_AUTH_REFRESH_FAILED",o}function te(e,o,n){return new Promise((t,s)=>{let r=new _e(e),i=r.protocol==="https:"?be:$e,f=JSON.stringify(o||{}),c=i.request({hostname:r.hostname,port:r.port,path:`${r.pathname}${r.search}`,method:"POST",headers:{"content-type":"application/json","content-length":Buffer.byteLength(f),...n?{authorization:`Bearer ${n}`}:{}}},a=>{let d="";a.on("data",l=>{d+=l}),a.on("end",()=>{if(a.statusCode>=300&&a.statusCode<400){let g=a.headers.location?` to ${a.headers.location}`:"",y=new Error(`HTTP ${a.statusCode}: redirected${g}`);y.statusCode=a.statusCode,y.body=d,s(y);return}let l=null;try{l=d?JSON.parse(d):null}catch(g){if(a.statusCode>=400){let y=new Error(`HTTP ${a.statusCode}: ${a.statusMessage||"Non-JSON response"}`);y.statusCode=a.statusCode,y.body=d,s(y);return}s(g);return}if(a.statusCode>=400){let g=new Error((l==null?void 0:l.error_description)||(l==null?void 0:l.error)||`HTTP ${a.statusCode}`);g.statusCode=a.statusCode,g.body=l,s(g);return}t(l)})});c.on("error",s),c.write(f),c.end()})}async function se(e,o=Q){if(!(e!=null&&e.refreshToken)||!(e!=null&&e.deviceId))throw O("FrontFriend session expired");let n;try{n=await te(`${o}/api/plugin/token`,{grant_type:"refresh_token",refresh_token:e.refreshToken,device_id:e.deviceId})}catch(s){throw O((s==null?void 0:s.message)||"Could not refresh FrontFriend session")}if(!(n!=null&&n.access_token)||!(n!=null&&n.refresh_token))throw O("Could not refresh FrontFriend session");let t={accessToken:n.access_token,refreshToken:n.refresh_token,deviceId:n.device_id||e.deviceId,expiresAt:Date.now()+(n.expires_in||900)*1e3,refreshExpiresAt:Date.now()+(n.refresh_expires_in||604800)*1e3,ffApiUrl:o};return ne(t),t}async function Ae(e={}){if(!e.skipCredentials){let o=ee();if(o!=null&&o.accessToken||o!=null&&o.refreshToken){let n=e.baseURL||o.ffApiUrl||Q;return o.accessToken&&!oe(o)?o.accessToken:(await se(o,n)).accessToken}}return e.envToken?e.envToken:e.legacyToken?(e.silent||console.warn("\u26A0\uFE0F auth-token in frontfriend.config.js is deprecated. Run `frontfriend login` to store credentials outside the repo."),e.legacyToken):null}re.exports={getCredentialsPath:Te,readCredentials:ee,writeCredentials:ne,deleteCredentials:Ee,isExpired:oe,postJson:te,refreshCredentials:se,resolveAuthToken:Ae,createAuthRefreshError:O}});var ce=P((Fn,Ie)=>{Ie.exports={name:"@frontfriend/tailwind",version:"4.0.8",description:"Design token management for Tailwind CSS",main:"./dist/index.js",types:"./dist/types/index.d.ts",bin:{frontfriend:"dist/cli.js"},exports:{".":{types:"./dist/types/index.d.ts",browser:"./dist/browser.mjs",import:"./dist/index.mjs",require:"./dist/index.js",default:"./dist/index.js"},"./runtime":{types:"./dist/runtime.d.ts",default:"./dist/runtime.js"},"./next":{types:"./dist/next.d.ts",default:"./dist/next.js"},"./vite":{types:"./dist/vite.d.ts",default:"./dist/vite.mjs"},"./lib/react/utils":{types:"./dist/lib/react/utils.d.ts",default:"./dist/lib/react/utils.mjs"},"./lib/vue/utils":{types:"./dist/lib/vue/utils.d.ts",default:"./dist/lib/vue/utils.mjs"},"./ffdc":{types:"./dist/ffdc.d.ts",default:"./dist/ffdc.js"},"./theme":"./src/theme.css","./theme.css":"./src/theme.css","./components-config-schema":{types:"./dist/components-config-schema.d.ts",require:"./dist/components-config-schema.js",import:"./dist/components-config-schema.js",default:"./dist/components-config-schema.js"}},scripts:{test:"jest",build:"node scripts/build.js",prepublishOnly:"npm run build"},keywords:["tailwindcss","design-tokens","frontfriend"],author:"Donux",license:"SEE LICENSE IN LICENSE",files:["dist/","src/theme.css","scripts/","README.md","LICENSE"],dependencies:{commander:"^11.0.0",dotenv:"^16.0.0",color:"^4.2.3",clsx:"^2.0.0","tailwind-merge":"^2.0.0","tw-animate-css":"^1.3.4"},peerDependencies:{tailwindcss:"^3.0.0 || ^4.0.0",react:"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",vue:">=3.0.0"},devDependencies:{jest:"^29.0.0",esbuild:"^0.19.0",glob:"^10.0.0"}}});var N=P((bn,U)=>{var j=require("fs"),E=require("path");function ae(e={}){let o=e.projectRoot||process.cwd(),n=E.join(o,"node_modules",".cache","frontfriend","icons.json"),t=e.outputPath||E.join(o,"types","frontfriend.d.ts");j.existsSync(n)||(console.error('[FrontFriend] Error: icons.json not found. Please run "npx frontfriend init" first.'),process.exit(1));try{let c=function(h){for(let C of Object.values(h))typeof C=="string"?f.add(C):typeof C=="object"&&C!==null&&c(C)},a=function(h,C=" "){let w=[];for(let[I,x]of Object.entries(h))typeof x=="string"?w.push(`${C}${I}: '${x}';`):typeof x=="object"&&x!==null&&(w.push(`${C}${I}: {`),w.push(a(x,C+" ")),w.push(`${C}};`));return w.join(`
3
+ `,{mode:384});try{F.chmodSync(b,384)}catch{}}function Ee(){return F.existsSync(b)?(F.unlinkSync(b),!0):!1}function oe(e,o=60*1e3){return!(e!=null&&e.accessToken)||!e.expiresAt||Date.now()+o>=e.expiresAt}function O(e){let o=new Error(`${e}. Run \`frontfriend login\` to re-authenticate.`);return o.code="FF_AUTH_REFRESH_FAILED",o}function te(e,o,n){return new Promise((t,s)=>{let r=new _e(e),i=r.protocol==="https:"?be:$e,f=JSON.stringify(o||{}),c=i.request({hostname:r.hostname,port:r.port,path:`${r.pathname}${r.search}`,method:"POST",headers:{"content-type":"application/json","content-length":Buffer.byteLength(f),...n?{authorization:`Bearer ${n}`}:{}}},a=>{let d="";a.on("data",l=>{d+=l}),a.on("end",()=>{if(a.statusCode>=300&&a.statusCode<400){let g=a.headers.location?` to ${a.headers.location}`:"",y=new Error(`HTTP ${a.statusCode}: redirected${g}`);y.statusCode=a.statusCode,y.body=d,s(y);return}let l=null;try{l=d?JSON.parse(d):null}catch(g){if(a.statusCode>=400){let y=new Error(`HTTP ${a.statusCode}: ${a.statusMessage||"Non-JSON response"}`);y.statusCode=a.statusCode,y.body=d,s(y);return}s(g);return}if(a.statusCode>=400){let g=new Error((l==null?void 0:l.error_description)||(l==null?void 0:l.error)||`HTTP ${a.statusCode}`);g.statusCode=a.statusCode,g.body=l,s(g);return}t(l)})});c.on("error",s),c.write(f),c.end()})}async function se(e,o=Q){if(!(e!=null&&e.refreshToken)||!(e!=null&&e.deviceId))throw O("FrontFriend session expired");let n;try{n=await te(`${o}/api/plugin/token`,{grant_type:"refresh_token",refresh_token:e.refreshToken,device_id:e.deviceId})}catch(s){throw O((s==null?void 0:s.message)||"Could not refresh FrontFriend session")}if(!(n!=null&&n.access_token)||!(n!=null&&n.refresh_token))throw O("Could not refresh FrontFriend session");let t={accessToken:n.access_token,refreshToken:n.refresh_token,deviceId:n.device_id||e.deviceId,expiresAt:Date.now()+(n.expires_in||900)*1e3,refreshExpiresAt:Date.now()+(n.refresh_expires_in||604800)*1e3,ffApiUrl:o};return ne(t),t}async function Ae(e={}){if(!e.skipCredentials){let o=ee();if(o!=null&&o.accessToken||o!=null&&o.refreshToken){let n=e.baseURL||o.ffApiUrl||Q;return o.accessToken&&!oe(o)?o.accessToken:(await se(o,n)).accessToken}}return e.envToken?e.envToken:e.legacyToken?(e.silent||console.warn("\u26A0\uFE0F auth-token in frontfriend.config.js is deprecated. Run `frontfriend login` to store credentials outside the repo."),e.legacyToken):null}re.exports={getCredentialsPath:Te,readCredentials:ee,writeCredentials:ne,deleteCredentials:Ee,isExpired:oe,postJson:te,refreshCredentials:se,resolveAuthToken:Ae,createAuthRefreshError:O}});var ce=P((Fn,Ie)=>{Ie.exports={name:"@frontfriend/tailwind",version:"4.0.9",description:"Design token management for Tailwind CSS",main:"./dist/index.js",types:"./dist/types/index.d.ts",bin:{frontfriend:"dist/cli.js"},exports:{".":{types:"./dist/types/index.d.ts",browser:"./dist/browser.mjs",import:"./dist/index.mjs",require:"./dist/index.js",default:"./dist/index.js"},"./runtime":{types:"./dist/runtime.d.ts",default:"./dist/runtime.js"},"./next":{types:"./dist/next.d.ts",default:"./dist/next.js"},"./vite":{types:"./dist/vite.d.ts",default:"./dist/vite.mjs"},"./lib/react/utils":{types:"./dist/lib/react/utils.d.ts",default:"./dist/lib/react/utils.mjs"},"./lib/vue/utils":{types:"./dist/lib/vue/utils.d.ts",default:"./dist/lib/vue/utils.mjs"},"./ffdc":{types:"./dist/ffdc.d.ts",default:"./dist/ffdc.js"},"./theme":"./src/theme.css","./theme.css":"./src/theme.css","./components-config-schema":{types:"./dist/components-config-schema.d.ts",require:"./dist/components-config-schema.js",import:"./dist/components-config-schema.js",default:"./dist/components-config-schema.js"}},scripts:{test:"jest",build:"node scripts/build.js",prepublishOnly:"npm run build"},keywords:["tailwindcss","design-tokens","frontfriend"],author:"Donux",license:"SEE LICENSE IN LICENSE",files:["dist/","src/theme.css","scripts/","README.md","LICENSE"],dependencies:{commander:"^11.0.0",dotenv:"^16.0.0",color:"^4.2.3",clsx:"^2.0.0","tailwind-merge":"^2.0.0","tw-animate-css":"^1.3.4"},peerDependencies:{tailwindcss:"^3.0.0 || ^4.0.0","tw-animate-css":"^1.3.0",react:"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",vue:">=3.0.0"},devDependencies:{jest:"^29.0.0",esbuild:"^0.19.0",glob:"^10.0.0"}}});var N=P((bn,U)=>{var j=require("fs"),E=require("path");function ae(e={}){let o=e.projectRoot||process.cwd(),n=E.join(o,"node_modules",".cache","frontfriend","icons.json"),t=e.outputPath||E.join(o,"types","frontfriend.d.ts");j.existsSync(n)||(console.error('[FrontFriend] Error: icons.json not found. Please run "npx frontfriend init" first.'),process.exit(1));try{let c=function(h){for(let C of Object.values(h))typeof C=="string"?f.add(C):typeof C=="object"&&C!==null&&c(C)},a=function(h,C=" "){let w=[];for(let[I,x]of Object.entries(h))typeof x=="string"?w.push(`${C}${I}: '${x}';`):typeof x=="object"&&x!==null&&(w.push(`${C}${I}: {`),w.push(a(x,C+" ")),w.push(`${C}};`));return w.join(`
4
4
  `)};var s=c,r=a;let i=JSON.parse(j.readFileSync(n,"utf-8")),f=new Set;c(i);let d=Array.from(f).map(h=>`'${h}'`).join(" | "),l=`// Generated by @frontfriend/tailwind
5
5
  // DO NOT EDIT THIS FILE MANUALLY
6
6
 
@@ -36,7 +36,7 @@ declare module '@/src/components/ui/icon' {
36
36
  declare module '@/src/components/ui/icon/Icon.vue' {
37
37
  export type IconName = ${d||"string"};
38
38
  }
39
- `,g=E.dirname(t);j.existsSync(g)||j.mkdirSync(g,{recursive:!0}),j.writeFileSync(t,l),console.log("[FrontFriend] \u2713 Generated types at",E.relative(o,t));let y=E.join(o,"tsconfig.json");if(j.existsSync(y)){let h=JSON.parse(j.readFileSync(y,"utf-8"));h.include||(h.include=[]);let C="types/**/*.d.ts";h.include.includes(C)||(h.include.push(C),j.writeFileSync(y,JSON.stringify(h,null,2)),console.log("[FrontFriend] \u2713 Updated tsconfig.json to include generated types"))}}catch(i){console.error("[FrontFriend] Error generating icon types:",i.message),process.exit(1)}}require.main===U&&ae();U.exports={generateIconTypes:ae}});var{loadEnvLocal:Pe}=require("./lib/core/env-utils");Pe();var{Command:Oe}=require("commander"),A=require("./lib/core/config-loader"),L=require("./lib/core/cache-manager"),{APIClient:de}=require("./lib/core/api-client"),{getCredentialsPath:De,writeCredentials:Le,readCredentials:Ue,deleteCredentials:Ne,postJson:R}=ie(),{ComponentDownloader:Re}=require("./lib/core/component-downloader"),Me=require("./lib/core/token-processor"),{ConfigError:k,APIError:Ve,CacheError:G}=require("./lib/core/errors"),u=require("path"),p=require("fs"),{spawn:qe}=require("child_process"),S=new Oe,{version:ue}=ce(),Je="https://registry.frontfriend.dev/r/v4",le='@import "@frontfriend/tailwind/theme.css";';function Ge(e){return(e||process.env.FF_REGISTRY_URL||Je).replace(/\/+$/,"")}function _(e){try{return JSON.parse(p.readFileSync(e,"utf8"))}catch{return null}}function B(e,o){p.mkdirSync(u.dirname(e),{recursive:!0}),p.writeFileSync(e,`${JSON.stringify(o,null,2)}
39
+ `,g=E.dirname(t);j.existsSync(g)||j.mkdirSync(g,{recursive:!0}),j.writeFileSync(t,l),console.log("[FrontFriend] \u2713 Generated types at",E.relative(o,t));let y=E.join(o,"tsconfig.json");if(j.existsSync(y)){let h=JSON.parse(j.readFileSync(y,"utf-8"));h.include||(h.include=[]);let C="types/**/*.d.ts";h.include.includes(C)||(h.include.push(C),j.writeFileSync(y,JSON.stringify(h,null,2)),console.log("[FrontFriend] \u2713 Updated tsconfig.json to include generated types"))}}catch(i){console.error("[FrontFriend] Error generating icon types:",i.message),process.exit(1)}}require.main===U&&ae();U.exports={generateIconTypes:ae}});var{loadEnvLocal:Pe}=require("./lib/core/env-utils");Pe();var{Command:Oe}=require("commander"),A=require("./lib/core/config-loader"),L=require("./lib/core/cache-manager"),{APIClient:de}=require("./lib/core/api-client"),{getCredentialsPath:De,writeCredentials:Le,readCredentials:Ue,deleteCredentials:Ne,postJson:R}=ie(),{ComponentDownloader:Re}=require("./lib/core/component-downloader"),Me=require("./lib/core/token-processor"),{ConfigError:k,APIError:Ve,CacheError:G}=require("./lib/core/errors"),u=require("path"),p=require("fs"),{spawn:qe}=require("child_process"),S=new Oe,{version:ue}=ce(),Je="https://registry.frontfriend.dev/r/v4",le='@import "@frontfriend/tailwind/theme.css";';function Ge(e){let o=(e||process.env.FF_REGISTRY_URL||Je).replace(/\/+$/,"");return/\/r\/(legacy|v4)$/i.test(o)?o:`${o}/r/v4`}function _(e){try{return JSON.parse(p.readFileSync(e,"utf8"))}catch{return null}}function B(e,o){p.mkdirSync(u.dirname(e),{recursive:!0}),p.writeFileSync(e,`${JSON.stringify(o,null,2)}
40
40
  `)}var Be=u.join("node_modules",".cache","frontfriend","migrated-components.json");function He(e){let o=_(u.join(e,"package.json"))||{},n={...o.dependencies||{},...o.devDependencies||{}};return n.vue||n["@vitejs/plugin-vue"]?"vue":"react"}function ze(e){let o=_(u.join(e,"package.json"))||{},n={...o.dependencies||{},...o.devDependencies||{}};return n.next||p.existsSync(u.join(e,"next.config.js"))||p.existsSync(u.join(e,"next.config.mjs"))?"next":n.vite||p.existsSync(u.join(e,"vite.config.ts"))||p.existsSync(u.join(e,"vite.config.js"))?"vite":null}function Ye(e,o,n){let t=u.join(e,"components.json");if(!p.existsSync(t))return!1;let s=_(t)||{};s.registries=s.registries||{};let r=`${Ge(n)}/${o}/{name}.json`;return s.registries["@frontfriend"]===r?!1:(s.registries["@frontfriend"]=r,B(t,s),!0)}function Ze(e){let o=u.join(e,"package.json"),n=_(o);return n?(n.dependencies=n.dependencies||{},n.dependencies["@frontfriend/tailwind"]?!1:(n.dependencies["@frontfriend/tailwind"]="^4.0.0",B(o,n),!0)):!1}function Ke(e){let o=u.join(e,"next.config.js");return p.existsSync(o)&&p.readFileSync(o,"utf8").includes("@frontfriend/tailwind/next")?!1:(p.writeFileSync(o,`const frontfriend = require('@frontfriend/tailwind/next');
41
41
 
42
42
  module.exports = frontfriend({});
@@ -1,2 +1,2 @@
1
- var a={anyOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"null"}]},r={$id:"https://frontfriend.dev/schemas/components-config.schema.json",type:"object",additionalProperties:{$ref:"#/$defs/componentEnvelope"},$defs:{classValue:a,classMap:{type:"object",additionalProperties:{anyOf:[{$ref:"#/$defs/classValue"},{$ref:"#/$defs/classMap"}]}},propMap:{type:"object",additionalProperties:{anyOf:[{$ref:"#/$defs/classValue"},{$ref:"#/$defs/propMap"}]}},componentEnvelope:{type:"object",additionalProperties:!1,properties:{root:{anyOf:[{type:"string"},{type:"null"}]},variants:{type:"object",additionalProperties:{$ref:"#/$defs/classMap"}},variant:{$ref:"#/$defs/classMap"},size:{$ref:"#/$defs/classMap"},sizes:{$ref:"#/$defs/classMap"},iconPosition:{$ref:"#/$defs/classMap"},color:{$ref:"#/$defs/classMap"},fullwidth:{$ref:"#/$defs/classMap"},slots:{type:"object",additionalProperties:{$ref:"#/$defs/componentEnvelope"}},icon:{$ref:"#/$defs/componentEnvelope"},states:{$ref:"#/$defs/classMap"},compoundVariants:{$ref:"#/$defs/classMap"},defaultVariants:{$ref:"#/$defs/propMap"},props:{$ref:"#/$defs/propMap"}}}}};function o(e){if(typeof e!="string"||e.trim().length===0||/^[0-9]+$/.test(e)||e==="true"||e==="false")return!1;let s=/\s/.test(e),t=/[-:\[\]\/]/.test(e);return!0}module.exports={componentsConfigSchema:r,isCSSClassString:o};
1
+ var r={anyOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"null"}]},f={$id:"https://frontfriend.dev/schemas/components-config.schema.json",type:"object",additionalProperties:{anyOf:[{$ref:"#/$defs/classValue"},{$ref:"#/$defs/componentEnvelope"}]},$defs:{classValue:r,slotValue:{anyOf:[{$ref:"#/$defs/classValue"},{type:"object",additionalProperties:{$ref:"#/$defs/slotValue"}}]},reservedBucket:{anyOf:[{$ref:"#/$defs/classValue"},{type:"object",additionalProperties:{$ref:"#/$defs/slotValue"}}]},componentEnvelope:{type:"object",additionalProperties:!1,properties:{root:{$ref:"#/$defs/slotValue"},variants:{type:"object",additionalProperties:{$ref:"#/$defs/reservedBucket"}},variant:{$ref:"#/$defs/reservedBucket"},size:{$ref:"#/$defs/reservedBucket"},sizes:{$ref:"#/$defs/reservedBucket"},iconPosition:{$ref:"#/$defs/reservedBucket"},color:{$ref:"#/$defs/reservedBucket"},fullwidth:{$ref:"#/$defs/reservedBucket"},states:{$ref:"#/$defs/reservedBucket"},compoundVariants:{$ref:"#/$defs/reservedBucket"},defaultVariants:{$ref:"#/$defs/reservedBucket"},props:{$ref:"#/$defs/reservedBucket"},slots:{type:"object",additionalProperties:{$ref:"#/$defs/slotValue"}}}}}};function o(e){if(typeof e!="string"||e.trim().length===0||/^[0-9]+$/.test(e)||e==="true"||e==="false")return!1;let s=/\s/.test(e),t=/[-:\[\]\/]/.test(e);return!0}module.exports={componentsConfigSchema:f,isCSSClassString:o};
2
2
  //# sourceMappingURL=components-config-schema.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../lib/core/components-config-schema.js"],
4
- "sourcesContent": ["/**\n * Shared componentsConfig schema for FrontFriend tools.\n *\n * The schema defines the canonical per-component envelope used by ffdc,\n * validation scripts, migration tooling, and registry completeness checks.\n * Keep this file as the single source of truth; consumers should re-export it\n * instead of maintaining local schema copies.\n */\n\nconst classValueSchema = {\n anyOf: [\n { type: 'string' },\n { type: 'number' },\n { type: 'boolean' },\n { type: 'null' },\n ],\n};\n\nconst componentsConfigSchema = {\n $id: 'https://frontfriend.dev/schemas/components-config.schema.json',\n type: 'object',\n additionalProperties: { $ref: '#/$defs/componentEnvelope' },\n $defs: {\n classValue: classValueSchema,\n classMap: {\n type: 'object',\n additionalProperties: {\n anyOf: [\n { $ref: '#/$defs/classValue' },\n { $ref: '#/$defs/classMap' },\n ],\n },\n },\n propMap: {\n type: 'object',\n additionalProperties: {\n anyOf: [\n { $ref: '#/$defs/classValue' },\n { $ref: '#/$defs/propMap' },\n ],\n },\n },\n componentEnvelope: {\n type: 'object',\n additionalProperties: false,\n properties: {\n // Root classes for the component itself.\n root: { anyOf: [{ type: 'string' }, { type: 'null' }] },\n\n // Canonical variant buckets: variants.variant, variants.size,\n // variants.iconPosition, etc. Values stay recursive so leaves can be\n // overridden independently during deep merges.\n variants: {\n type: 'object',\n additionalProperties: { $ref: '#/$defs/classMap' },\n },\n\n // Compatibility aliases for existing component code while v4 sources\n // move to the canonical variants/slots envelope.\n variant: { $ref: '#/$defs/classMap' },\n size: { $ref: '#/$defs/classMap' },\n sizes: { $ref: '#/$defs/classMap' },\n iconPosition: { $ref: '#/$defs/classMap' },\n color: { $ref: '#/$defs/classMap' },\n fullwidth: { $ref: '#/$defs/classMap' },\n\n // Named child slots. Each slot uses the same envelope so tooling can be\n // generic instead of component-specific.\n slots: {\n type: 'object',\n additionalProperties: { $ref: '#/$defs/componentEnvelope' },\n },\n\n // Compatibility alias for the Button icon slot.\n icon: { $ref: '#/$defs/componentEnvelope' },\n\n states: { $ref: '#/$defs/classMap' },\n compoundVariants: { $ref: '#/$defs/classMap' },\n defaultVariants: { $ref: '#/$defs/propMap' },\n props: { $ref: '#/$defs/propMap' },\n },\n },\n },\n};\n\nfunction isCSSClassString(value) {\n if (typeof value !== 'string') return false;\n\n if (value.trim().length === 0) return false;\n\n if (/^[0-9]+$/.test(value)) return false;\n\n if (value === 'true' || value === 'false') return false;\n\n const hasSpaces = /\\s/.test(value);\n const hasTailwindSyntax = /[-:\\[\\]\\/]/.test(value);\n\n if (hasSpaces || hasTailwindSyntax) return true;\n\n return true;\n}\n\nmodule.exports = {\n componentsConfigSchema,\n isCSSClassString,\n};\n"],
5
- "mappings": "AASA,IAAMA,EAAmB,CACvB,MAAO,CACL,CAAE,KAAM,QAAS,EACjB,CAAE,KAAM,QAAS,EACjB,CAAE,KAAM,SAAU,EAClB,CAAE,KAAM,MAAO,CACjB,CACF,EAEMC,EAAyB,CAC7B,IAAK,gEACL,KAAM,SACN,qBAAsB,CAAE,KAAM,2BAA4B,EAC1D,MAAO,CACL,WAAYD,EACZ,SAAU,CACR,KAAM,SACN,qBAAsB,CACpB,MAAO,CACL,CAAE,KAAM,oBAAqB,EAC7B,CAAE,KAAM,kBAAmB,CAC7B,CACF,CACF,EACA,QAAS,CACP,KAAM,SACN,qBAAsB,CACpB,MAAO,CACL,CAAE,KAAM,oBAAqB,EAC7B,CAAE,KAAM,iBAAkB,CAC5B,CACF,CACF,EACA,kBAAmB,CACjB,KAAM,SACN,qBAAsB,GACtB,WAAY,CAEV,KAAM,CAAE,MAAO,CAAC,CAAE,KAAM,QAAS,EAAG,CAAE,KAAM,MAAO,CAAC,CAAE,EAKtD,SAAU,CACR,KAAM,SACN,qBAAsB,CAAE,KAAM,kBAAmB,CACnD,EAIA,QAAS,CAAE,KAAM,kBAAmB,EACpC,KAAM,CAAE,KAAM,kBAAmB,EACjC,MAAO,CAAE,KAAM,kBAAmB,EAClC,aAAc,CAAE,KAAM,kBAAmB,EACzC,MAAO,CAAE,KAAM,kBAAmB,EAClC,UAAW,CAAE,KAAM,kBAAmB,EAItC,MAAO,CACL,KAAM,SACN,qBAAsB,CAAE,KAAM,2BAA4B,CAC5D,EAGA,KAAM,CAAE,KAAM,2BAA4B,EAE1C,OAAQ,CAAE,KAAM,kBAAmB,EACnC,iBAAkB,CAAE,KAAM,kBAAmB,EAC7C,gBAAiB,CAAE,KAAM,iBAAkB,EAC3C,MAAO,CAAE,KAAM,iBAAkB,CACnC,CACF,CACF,CACF,EAEA,SAASE,EAAiBC,EAAO,CAO/B,GANI,OAAOA,GAAU,UAEjBA,EAAM,KAAK,EAAE,SAAW,GAExB,WAAW,KAAKA,CAAK,GAErBA,IAAU,QAAUA,IAAU,QAAS,MAAO,GAElD,IAAMC,EAAY,KAAK,KAAKD,CAAK,EAC3BE,EAAoB,aAAa,KAAKF,CAAK,EAEjD,MAA2C,EAG7C,CAEA,OAAO,QAAU,CACf,uBAAAF,EACA,iBAAAC,CACF",
4
+ "sourcesContent": ["/**\n * Shared componentsConfig schema for FrontFriend tools.\n *\n * The schema defines the canonical per-component envelope used by ffdc,\n * validation scripts, migration tooling, and registry completeness checks.\n * Keep this file as the single source of truth; consumers should re-export it\n * instead of maintaining local schema copies.\n */\n\nconst classValueSchema = {\n anyOf: [\n { type: 'string' },\n { type: 'number' },\n { type: 'boolean' },\n { type: 'null' },\n ],\n};\n\nconst componentsConfigSchema = {\n $id: 'https://frontfriend.dev/schemas/components-config.schema.json',\n type: 'object',\n // A component is a bare class string (e.g. spinner: \"animate-spin\") or a\n // strict envelope.\n additionalProperties: {\n anyOf: [{ $ref: '#/$defs/classValue' }, { $ref: '#/$defs/componentEnvelope' }],\n },\n $defs: {\n classValue: classValueSchema,\n\n // Permissive recursive tree used INSIDE `slots` and for `root`: leaves are\n // class values, objects nest freely. Slot internals are NOT namespaced\n // again (slots live at the component top level only), so e.g.\n // `slots.trigger.icon` and `slots.list.line` stay as plain nested keys.\n slotValue: {\n anyOf: [\n { $ref: '#/$defs/classValue' },\n { type: 'object', additionalProperties: { $ref: '#/$defs/slotValue' } },\n ],\n },\n\n // Variant / prop buckets: a class-value leaf or a (possibly nested) map.\n reservedBucket: {\n anyOf: [\n { $ref: '#/$defs/classValue' },\n { type: 'object', additionalProperties: { $ref: '#/$defs/slotValue' } },\n ],\n },\n\n // STRICT canonical v4 envelope: a fixed set of reserved buckets plus a\n // single `slots` namespace holding every named child slot.\n // `additionalProperties: false` is what standardizes the shape \u2014 any stray\n // top-level key (a slot left outside `slots`, a typo) is rejected.\n componentEnvelope: {\n type: 'object',\n additionalProperties: false,\n properties: {\n // Root classes for the component. Usually a class string; some\n // components (e.g. sidebar) nest a sub-tree under root.\n root: { $ref: '#/$defs/slotValue' },\n\n // Canonical variant buckets (variants.variant, variants.size, \u2026) plus\n // the flat compatibility aliases.\n variants: { type: 'object', additionalProperties: { $ref: '#/$defs/reservedBucket' } },\n variant: { $ref: '#/$defs/reservedBucket' },\n size: { $ref: '#/$defs/reservedBucket' },\n sizes: { $ref: '#/$defs/reservedBucket' },\n iconPosition: { $ref: '#/$defs/reservedBucket' },\n color: { $ref: '#/$defs/reservedBucket' },\n fullwidth: { $ref: '#/$defs/reservedBucket' },\n states: { $ref: '#/$defs/reservedBucket' },\n compoundVariants: { $ref: '#/$defs/reservedBucket' },\n defaultVariants: { $ref: '#/$defs/reservedBucket' },\n props: { $ref: '#/$defs/reservedBucket' },\n\n // All named child slots (item, trigger, content, icon, menu, \u2026) live\n // here. Top-level only \u2014 slot internals stay direct.\n slots: { type: 'object', additionalProperties: { $ref: '#/$defs/slotValue' } },\n },\n },\n },\n};\n\nfunction isCSSClassString(value) {\n if (typeof value !== 'string') return false;\n\n if (value.trim().length === 0) return false;\n\n if (/^[0-9]+$/.test(value)) return false;\n\n if (value === 'true' || value === 'false') return false;\n\n const hasSpaces = /\\s/.test(value);\n const hasTailwindSyntax = /[-:\\[\\]\\/]/.test(value);\n\n if (hasSpaces || hasTailwindSyntax) return true;\n\n return true;\n}\n\nmodule.exports = {\n componentsConfigSchema,\n isCSSClassString,\n};\n"],
5
+ "mappings": "AASA,IAAMA,EAAmB,CACvB,MAAO,CACL,CAAE,KAAM,QAAS,EACjB,CAAE,KAAM,QAAS,EACjB,CAAE,KAAM,SAAU,EAClB,CAAE,KAAM,MAAO,CACjB,CACF,EAEMC,EAAyB,CAC7B,IAAK,gEACL,KAAM,SAGN,qBAAsB,CACpB,MAAO,CAAC,CAAE,KAAM,oBAAqB,EAAG,CAAE,KAAM,2BAA4B,CAAC,CAC/E,EACA,MAAO,CACL,WAAYD,EAMZ,UAAW,CACT,MAAO,CACL,CAAE,KAAM,oBAAqB,EAC7B,CAAE,KAAM,SAAU,qBAAsB,CAAE,KAAM,mBAAoB,CAAE,CACxE,CACF,EAGA,eAAgB,CACd,MAAO,CACL,CAAE,KAAM,oBAAqB,EAC7B,CAAE,KAAM,SAAU,qBAAsB,CAAE,KAAM,mBAAoB,CAAE,CACxE,CACF,EAMA,kBAAmB,CACjB,KAAM,SACN,qBAAsB,GACtB,WAAY,CAGV,KAAM,CAAE,KAAM,mBAAoB,EAIlC,SAAU,CAAE,KAAM,SAAU,qBAAsB,CAAE,KAAM,wBAAyB,CAAE,EACrF,QAAS,CAAE,KAAM,wBAAyB,EAC1C,KAAM,CAAE,KAAM,wBAAyB,EACvC,MAAO,CAAE,KAAM,wBAAyB,EACxC,aAAc,CAAE,KAAM,wBAAyB,EAC/C,MAAO,CAAE,KAAM,wBAAyB,EACxC,UAAW,CAAE,KAAM,wBAAyB,EAC5C,OAAQ,CAAE,KAAM,wBAAyB,EACzC,iBAAkB,CAAE,KAAM,wBAAyB,EACnD,gBAAiB,CAAE,KAAM,wBAAyB,EAClD,MAAO,CAAE,KAAM,wBAAyB,EAIxC,MAAO,CAAE,KAAM,SAAU,qBAAsB,CAAE,KAAM,mBAAoB,CAAE,CAC/E,CACF,CACF,CACF,EAEA,SAASE,EAAiBC,EAAO,CAO/B,GANI,OAAOA,GAAU,UAEjBA,EAAM,KAAK,EAAE,SAAW,GAExB,WAAW,KAAKA,CAAK,GAErBA,IAAU,QAAUA,IAAU,QAAS,MAAO,GAElD,IAAMC,EAAY,KAAK,KAAKD,CAAK,EAC3BE,EAAoB,aAAa,KAAKF,CAAK,EAEjD,MAA2C,EAG7C,CAEA,OAAO,QAAU,CACf,uBAAAF,EACA,iBAAAC,CACF",
6
6
  "names": ["classValueSchema", "componentsConfigSchema", "isCSSClassString", "value", "hasSpaces", "hasTailwindSyntax"]
7
7
  }
package/dist/ffdc.js CHANGED
@@ -1,2 +1,2 @@
1
- var n=(e,s)=>()=>(s||e((s={exports:{}}).exports,s),s.exports);var o=n(($,r)=>{var f={anyOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"null"}]},p={$id:"https://frontfriend.dev/schemas/components-config.schema.json",type:"object",additionalProperties:{$ref:"#/$defs/componentEnvelope"},$defs:{classValue:f,classMap:{type:"object",additionalProperties:{anyOf:[{$ref:"#/$defs/classValue"},{$ref:"#/$defs/classMap"}]}},propMap:{type:"object",additionalProperties:{anyOf:[{$ref:"#/$defs/classValue"},{$ref:"#/$defs/propMap"}]}},componentEnvelope:{type:"object",additionalProperties:!1,properties:{root:{anyOf:[{type:"string"},{type:"null"}]},variants:{type:"object",additionalProperties:{$ref:"#/$defs/classMap"}},variant:{$ref:"#/$defs/classMap"},size:{$ref:"#/$defs/classMap"},sizes:{$ref:"#/$defs/classMap"},iconPosition:{$ref:"#/$defs/classMap"},color:{$ref:"#/$defs/classMap"},fullwidth:{$ref:"#/$defs/classMap"},slots:{type:"object",additionalProperties:{$ref:"#/$defs/componentEnvelope"}},icon:{$ref:"#/$defs/componentEnvelope"},states:{$ref:"#/$defs/classMap"},compoundVariants:{$ref:"#/$defs/classMap"},defaultVariants:{$ref:"#/$defs/propMap"},props:{$ref:"#/$defs/propMap"}}}}};function i(e){if(typeof e!="string"||e.trim().length===0||/^[0-9]+$/.test(e)||e==="true"||e==="false")return!1;let s=/\s/.test(e),a=/[-:\[\]\/]/.test(e);return!0}r.exports={componentsConfigSchema:p,isCSSClassString:i}});var{componentsConfigSchema:c,isCSSClassString:l}=o();function t(e){if(!e)return{};if(typeof e!="object")throw new Error("Config must be an object");return e}t.componentsConfigSchema=c;t.isCSSClassString=l;module.exports=t;
1
+ var n=(e,s)=>()=>(s||e((s={exports:{}}).exports,s),s.exports);var o=n((u,r)=>{var a={anyOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"null"}]},i={$id:"https://frontfriend.dev/schemas/components-config.schema.json",type:"object",additionalProperties:{anyOf:[{$ref:"#/$defs/classValue"},{$ref:"#/$defs/componentEnvelope"}]},$defs:{classValue:a,slotValue:{anyOf:[{$ref:"#/$defs/classValue"},{type:"object",additionalProperties:{$ref:"#/$defs/slotValue"}}]},reservedBucket:{anyOf:[{$ref:"#/$defs/classValue"},{type:"object",additionalProperties:{$ref:"#/$defs/slotValue"}}]},componentEnvelope:{type:"object",additionalProperties:!1,properties:{root:{$ref:"#/$defs/slotValue"},variants:{type:"object",additionalProperties:{$ref:"#/$defs/reservedBucket"}},variant:{$ref:"#/$defs/reservedBucket"},size:{$ref:"#/$defs/reservedBucket"},sizes:{$ref:"#/$defs/reservedBucket"},iconPosition:{$ref:"#/$defs/reservedBucket"},color:{$ref:"#/$defs/reservedBucket"},fullwidth:{$ref:"#/$defs/reservedBucket"},states:{$ref:"#/$defs/reservedBucket"},compoundVariants:{$ref:"#/$defs/reservedBucket"},defaultVariants:{$ref:"#/$defs/reservedBucket"},props:{$ref:"#/$defs/reservedBucket"},slots:{type:"object",additionalProperties:{$ref:"#/$defs/slotValue"}}}}}};function d(e){if(typeof e!="string"||e.trim().length===0||/^[0-9]+$/.test(e)||e==="true"||e==="false")return!1;let s=/\s/.test(e),f=/[-:\[\]\/]/.test(e);return!0}r.exports={componentsConfigSchema:i,isCSSClassString:d}});var{componentsConfigSchema:c,isCSSClassString:l}=o();function t(e){if(!e)return{};if(typeof e!="object")throw new Error("Config must be an object");return e}t.componentsConfigSchema=c;t.isCSSClassString=l;module.exports=t;
2
2
  //# sourceMappingURL=ffdc.js.map
package/dist/ffdc.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../lib/core/components-config-schema.js", "../ffdc.js"],
4
- "sourcesContent": ["/**\n * Shared componentsConfig schema for FrontFriend tools.\n *\n * The schema defines the canonical per-component envelope used by ffdc,\n * validation scripts, migration tooling, and registry completeness checks.\n * Keep this file as the single source of truth; consumers should re-export it\n * instead of maintaining local schema copies.\n */\n\nconst classValueSchema = {\n anyOf: [\n { type: 'string' },\n { type: 'number' },\n { type: 'boolean' },\n { type: 'null' },\n ],\n};\n\nconst componentsConfigSchema = {\n $id: 'https://frontfriend.dev/schemas/components-config.schema.json',\n type: 'object',\n additionalProperties: { $ref: '#/$defs/componentEnvelope' },\n $defs: {\n classValue: classValueSchema,\n classMap: {\n type: 'object',\n additionalProperties: {\n anyOf: [\n { $ref: '#/$defs/classValue' },\n { $ref: '#/$defs/classMap' },\n ],\n },\n },\n propMap: {\n type: 'object',\n additionalProperties: {\n anyOf: [\n { $ref: '#/$defs/classValue' },\n { $ref: '#/$defs/propMap' },\n ],\n },\n },\n componentEnvelope: {\n type: 'object',\n additionalProperties: false,\n properties: {\n // Root classes for the component itself.\n root: { anyOf: [{ type: 'string' }, { type: 'null' }] },\n\n // Canonical variant buckets: variants.variant, variants.size,\n // variants.iconPosition, etc. Values stay recursive so leaves can be\n // overridden independently during deep merges.\n variants: {\n type: 'object',\n additionalProperties: { $ref: '#/$defs/classMap' },\n },\n\n // Compatibility aliases for existing component code while v4 sources\n // move to the canonical variants/slots envelope.\n variant: { $ref: '#/$defs/classMap' },\n size: { $ref: '#/$defs/classMap' },\n sizes: { $ref: '#/$defs/classMap' },\n iconPosition: { $ref: '#/$defs/classMap' },\n color: { $ref: '#/$defs/classMap' },\n fullwidth: { $ref: '#/$defs/classMap' },\n\n // Named child slots. Each slot uses the same envelope so tooling can be\n // generic instead of component-specific.\n slots: {\n type: 'object',\n additionalProperties: { $ref: '#/$defs/componentEnvelope' },\n },\n\n // Compatibility alias for the Button icon slot.\n icon: { $ref: '#/$defs/componentEnvelope' },\n\n states: { $ref: '#/$defs/classMap' },\n compoundVariants: { $ref: '#/$defs/classMap' },\n defaultVariants: { $ref: '#/$defs/propMap' },\n props: { $ref: '#/$defs/propMap' },\n },\n },\n },\n};\n\nfunction isCSSClassString(value) {\n if (typeof value !== 'string') return false;\n\n if (value.trim().length === 0) return false;\n\n if (/^[0-9]+$/.test(value)) return false;\n\n if (value === 'true' || value === 'false') return false;\n\n const hasSpaces = /\\s/.test(value);\n const hasTailwindSyntax = /[-:\\[\\]\\/]/.test(value);\n\n if (hasSpaces || hasTailwindSyntax) return true;\n\n return true;\n}\n\nmodule.exports = {\n componentsConfigSchema,\n isCSSClassString,\n};\n", "// ffdc.js - Simple config accessor\n// No base64 decoding, just returns the config object directly\n\nconst {\n componentsConfigSchema,\n isCSSClassString,\n} = require('./lib/core/components-config-schema');\n\nfunction ffdc(config) {\n if (!config) {\n return {};\n }\n\n if (typeof config !== 'object') {\n throw new Error('Config must be an object');\n }\n\n return config;\n}\n\nffdc.componentsConfigSchema = componentsConfigSchema;\nffdc.isCSSClassString = isCSSClassString;\n\nmodule.exports = ffdc;\n"],
5
- "mappings": "8DAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CASA,IAAMC,EAAmB,CACvB,MAAO,CACL,CAAE,KAAM,QAAS,EACjB,CAAE,KAAM,QAAS,EACjB,CAAE,KAAM,SAAU,EAClB,CAAE,KAAM,MAAO,CACjB,CACF,EAEMC,EAAyB,CAC7B,IAAK,gEACL,KAAM,SACN,qBAAsB,CAAE,KAAM,2BAA4B,EAC1D,MAAO,CACL,WAAYD,EACZ,SAAU,CACR,KAAM,SACN,qBAAsB,CACpB,MAAO,CACL,CAAE,KAAM,oBAAqB,EAC7B,CAAE,KAAM,kBAAmB,CAC7B,CACF,CACF,EACA,QAAS,CACP,KAAM,SACN,qBAAsB,CACpB,MAAO,CACL,CAAE,KAAM,oBAAqB,EAC7B,CAAE,KAAM,iBAAkB,CAC5B,CACF,CACF,EACA,kBAAmB,CACjB,KAAM,SACN,qBAAsB,GACtB,WAAY,CAEV,KAAM,CAAE,MAAO,CAAC,CAAE,KAAM,QAAS,EAAG,CAAE,KAAM,MAAO,CAAC,CAAE,EAKtD,SAAU,CACR,KAAM,SACN,qBAAsB,CAAE,KAAM,kBAAmB,CACnD,EAIA,QAAS,CAAE,KAAM,kBAAmB,EACpC,KAAM,CAAE,KAAM,kBAAmB,EACjC,MAAO,CAAE,KAAM,kBAAmB,EAClC,aAAc,CAAE,KAAM,kBAAmB,EACzC,MAAO,CAAE,KAAM,kBAAmB,EAClC,UAAW,CAAE,KAAM,kBAAmB,EAItC,MAAO,CACL,KAAM,SACN,qBAAsB,CAAE,KAAM,2BAA4B,CAC5D,EAGA,KAAM,CAAE,KAAM,2BAA4B,EAE1C,OAAQ,CAAE,KAAM,kBAAmB,EACnC,iBAAkB,CAAE,KAAM,kBAAmB,EAC7C,gBAAiB,CAAE,KAAM,iBAAkB,EAC3C,MAAO,CAAE,KAAM,iBAAkB,CACnC,CACF,CACF,CACF,EAEA,SAASE,EAAiBC,EAAO,CAO/B,GANI,OAAOA,GAAU,UAEjBA,EAAM,KAAK,EAAE,SAAW,GAExB,WAAW,KAAKA,CAAK,GAErBA,IAAU,QAAUA,IAAU,QAAS,MAAO,GAElD,IAAMC,EAAY,KAAK,KAAKD,CAAK,EAC3BE,EAAoB,aAAa,KAAKF,CAAK,EAEjD,MAA2C,EAG7C,CAEAJ,EAAO,QAAU,CACf,uBAAAE,EACA,iBAAAC,CACF,ICtGA,GAAM,CACJ,uBAAAI,EACA,iBAAAC,CACF,EAAI,IAEJ,SAASC,EAAKC,EAAQ,CACpB,GAAI,CAACA,EACH,MAAO,CAAC,EAGV,GAAI,OAAOA,GAAW,SACpB,MAAM,IAAI,MAAM,0BAA0B,EAG5C,OAAOA,CACT,CAEAD,EAAK,uBAAyBF,EAC9BE,EAAK,iBAAmBD,EAExB,OAAO,QAAUC",
4
+ "sourcesContent": ["/**\n * Shared componentsConfig schema for FrontFriend tools.\n *\n * The schema defines the canonical per-component envelope used by ffdc,\n * validation scripts, migration tooling, and registry completeness checks.\n * Keep this file as the single source of truth; consumers should re-export it\n * instead of maintaining local schema copies.\n */\n\nconst classValueSchema = {\n anyOf: [\n { type: 'string' },\n { type: 'number' },\n { type: 'boolean' },\n { type: 'null' },\n ],\n};\n\nconst componentsConfigSchema = {\n $id: 'https://frontfriend.dev/schemas/components-config.schema.json',\n type: 'object',\n // A component is a bare class string (e.g. spinner: \"animate-spin\") or a\n // strict envelope.\n additionalProperties: {\n anyOf: [{ $ref: '#/$defs/classValue' }, { $ref: '#/$defs/componentEnvelope' }],\n },\n $defs: {\n classValue: classValueSchema,\n\n // Permissive recursive tree used INSIDE `slots` and for `root`: leaves are\n // class values, objects nest freely. Slot internals are NOT namespaced\n // again (slots live at the component top level only), so e.g.\n // `slots.trigger.icon` and `slots.list.line` stay as plain nested keys.\n slotValue: {\n anyOf: [\n { $ref: '#/$defs/classValue' },\n { type: 'object', additionalProperties: { $ref: '#/$defs/slotValue' } },\n ],\n },\n\n // Variant / prop buckets: a class-value leaf or a (possibly nested) map.\n reservedBucket: {\n anyOf: [\n { $ref: '#/$defs/classValue' },\n { type: 'object', additionalProperties: { $ref: '#/$defs/slotValue' } },\n ],\n },\n\n // STRICT canonical v4 envelope: a fixed set of reserved buckets plus a\n // single `slots` namespace holding every named child slot.\n // `additionalProperties: false` is what standardizes the shape \u2014 any stray\n // top-level key (a slot left outside `slots`, a typo) is rejected.\n componentEnvelope: {\n type: 'object',\n additionalProperties: false,\n properties: {\n // Root classes for the component. Usually a class string; some\n // components (e.g. sidebar) nest a sub-tree under root.\n root: { $ref: '#/$defs/slotValue' },\n\n // Canonical variant buckets (variants.variant, variants.size, \u2026) plus\n // the flat compatibility aliases.\n variants: { type: 'object', additionalProperties: { $ref: '#/$defs/reservedBucket' } },\n variant: { $ref: '#/$defs/reservedBucket' },\n size: { $ref: '#/$defs/reservedBucket' },\n sizes: { $ref: '#/$defs/reservedBucket' },\n iconPosition: { $ref: '#/$defs/reservedBucket' },\n color: { $ref: '#/$defs/reservedBucket' },\n fullwidth: { $ref: '#/$defs/reservedBucket' },\n states: { $ref: '#/$defs/reservedBucket' },\n compoundVariants: { $ref: '#/$defs/reservedBucket' },\n defaultVariants: { $ref: '#/$defs/reservedBucket' },\n props: { $ref: '#/$defs/reservedBucket' },\n\n // All named child slots (item, trigger, content, icon, menu, \u2026) live\n // here. Top-level only \u2014 slot internals stay direct.\n slots: { type: 'object', additionalProperties: { $ref: '#/$defs/slotValue' } },\n },\n },\n },\n};\n\nfunction isCSSClassString(value) {\n if (typeof value !== 'string') return false;\n\n if (value.trim().length === 0) return false;\n\n if (/^[0-9]+$/.test(value)) return false;\n\n if (value === 'true' || value === 'false') return false;\n\n const hasSpaces = /\\s/.test(value);\n const hasTailwindSyntax = /[-:\\[\\]\\/]/.test(value);\n\n if (hasSpaces || hasTailwindSyntax) return true;\n\n return true;\n}\n\nmodule.exports = {\n componentsConfigSchema,\n isCSSClassString,\n};\n", "// ffdc.js - Simple config accessor\n// No base64 decoding, just returns the config object directly\n\nconst {\n componentsConfigSchema,\n isCSSClassString,\n} = require('./lib/core/components-config-schema');\n\nfunction ffdc(config) {\n if (!config) {\n return {};\n }\n\n if (typeof config !== 'object') {\n throw new Error('Config must be an object');\n }\n\n return config;\n}\n\nffdc.componentsConfigSchema = componentsConfigSchema;\nffdc.isCSSClassString = isCSSClassString;\n\nmodule.exports = ffdc;\n"],
5
+ "mappings": "8DAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CASA,IAAMC,EAAmB,CACvB,MAAO,CACL,CAAE,KAAM,QAAS,EACjB,CAAE,KAAM,QAAS,EACjB,CAAE,KAAM,SAAU,EAClB,CAAE,KAAM,MAAO,CACjB,CACF,EAEMC,EAAyB,CAC7B,IAAK,gEACL,KAAM,SAGN,qBAAsB,CACpB,MAAO,CAAC,CAAE,KAAM,oBAAqB,EAAG,CAAE,KAAM,2BAA4B,CAAC,CAC/E,EACA,MAAO,CACL,WAAYD,EAMZ,UAAW,CACT,MAAO,CACL,CAAE,KAAM,oBAAqB,EAC7B,CAAE,KAAM,SAAU,qBAAsB,CAAE,KAAM,mBAAoB,CAAE,CACxE,CACF,EAGA,eAAgB,CACd,MAAO,CACL,CAAE,KAAM,oBAAqB,EAC7B,CAAE,KAAM,SAAU,qBAAsB,CAAE,KAAM,mBAAoB,CAAE,CACxE,CACF,EAMA,kBAAmB,CACjB,KAAM,SACN,qBAAsB,GACtB,WAAY,CAGV,KAAM,CAAE,KAAM,mBAAoB,EAIlC,SAAU,CAAE,KAAM,SAAU,qBAAsB,CAAE,KAAM,wBAAyB,CAAE,EACrF,QAAS,CAAE,KAAM,wBAAyB,EAC1C,KAAM,CAAE,KAAM,wBAAyB,EACvC,MAAO,CAAE,KAAM,wBAAyB,EACxC,aAAc,CAAE,KAAM,wBAAyB,EAC/C,MAAO,CAAE,KAAM,wBAAyB,EACxC,UAAW,CAAE,KAAM,wBAAyB,EAC5C,OAAQ,CAAE,KAAM,wBAAyB,EACzC,iBAAkB,CAAE,KAAM,wBAAyB,EACnD,gBAAiB,CAAE,KAAM,wBAAyB,EAClD,MAAO,CAAE,KAAM,wBAAyB,EAIxC,MAAO,CAAE,KAAM,SAAU,qBAAsB,CAAE,KAAM,mBAAoB,CAAE,CAC/E,CACF,CACF,CACF,EAEA,SAASE,EAAiBC,EAAO,CAO/B,GANI,OAAOA,GAAU,UAEjBA,EAAM,KAAK,EAAE,SAAW,GAExB,WAAW,KAAKA,CAAK,GAErBA,IAAU,QAAUA,IAAU,QAAS,MAAO,GAElD,IAAMC,EAAY,KAAK,KAAKD,CAAK,EAC3BE,EAAoB,aAAa,KAAKF,CAAK,EAEjD,MAA2C,EAG7C,CAEAJ,EAAO,QAAU,CACf,uBAAAE,EACA,iBAAAC,CACF,ICnGA,GAAM,CACJ,uBAAAI,EACA,iBAAAC,CACF,EAAI,IAEJ,SAASC,EAAKC,EAAQ,CACpB,GAAI,CAACA,EACH,MAAO,CAAC,EAGV,GAAI,OAAOA,GAAW,SACpB,MAAM,IAAI,MAAM,0BAA0B,EAG5C,OAAOA,CACT,CAEAD,EAAK,uBAAyBF,EAC9BE,EAAK,iBAAmBD,EAExB,OAAO,QAAUC",
6
6
  "names": ["require_components_config_schema", "__commonJSMin", "exports", "module", "classValueSchema", "componentsConfigSchema", "isCSSClassString", "value", "hasSpaces", "hasTailwindSyntax", "componentsConfigSchema", "isCSSClassString", "ffdc", "config"]
7
7
  }
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var v=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports);var $=v((Ee,D)=>{var q={anyOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"null"}]},R={$id:"https://frontfriend.dev/schemas/components-config.schema.json",type:"object",additionalProperties:{$ref:"#/$defs/componentEnvelope"},$defs:{classValue:q,classMap:{type:"object",additionalProperties:{anyOf:[{$ref:"#/$defs/classValue"},{$ref:"#/$defs/classMap"}]}},propMap:{type:"object",additionalProperties:{anyOf:[{$ref:"#/$defs/classValue"},{$ref:"#/$defs/propMap"}]}},componentEnvelope:{type:"object",additionalProperties:!1,properties:{root:{anyOf:[{type:"string"},{type:"null"}]},variants:{type:"object",additionalProperties:{$ref:"#/$defs/classMap"}},variant:{$ref:"#/$defs/classMap"},size:{$ref:"#/$defs/classMap"},sizes:{$ref:"#/$defs/classMap"},iconPosition:{$ref:"#/$defs/classMap"},color:{$ref:"#/$defs/classMap"},fullwidth:{$ref:"#/$defs/classMap"},slots:{type:"object",additionalProperties:{$ref:"#/$defs/componentEnvelope"}},icon:{$ref:"#/$defs/componentEnvelope"},states:{$ref:"#/$defs/classMap"},compoundVariants:{$ref:"#/$defs/classMap"},defaultVariants:{$ref:"#/$defs/propMap"},props:{$ref:"#/$defs/propMap"}}}}};function K(e){if(typeof e!="string"||e.trim().length===0||/^[0-9]+$/.test(e)||e==="true"||e==="false")return!1;let n=/\s/.test(e),s=/[-:\[\]\/]/.test(e);return!0}D.exports={componentsConfigSchema:R,isCSSClassString:K}});var O=v((_e,S)=>{var m=require("fs");function Y(e){try{let n=m.readFileSync(e,"utf8");return JSON.parse(n)}catch(n){if(n.code==="ENOENT")return null;throw n}}function W(e){try{return m.readFileSync(e,"utf8").replace(/^\uFEFF/,"")}catch(n){if(n.code==="ENOENT")return null;throw n}}function B(e,n,s=2){let r=JSON.stringify(n,null,s);m.writeFileSync(e,r,"utf8")}function J(e,n){m.writeFileSync(e,n,"utf8")}function G(e,n){if(n==null||typeof n=="object"&&Object.keys(n).length===0||Array.isArray(n)&&n.length===0){let r=`module.exports = ${Array.isArray(n)?"[]":"{}"};`;m.writeFileSync(e,r,"utf8")}else{let s=`module.exports = ${JSON.stringify(n,null,2)};`;m.writeFileSync(e,s,"utf8")}}function U(e){return m.existsSync(e)}function z(e){m.mkdirSync(e,{recursive:!0})}function Q(e){m.rmSync(e,{recursive:!0,force:!0})}S.exports={readJsonFileSafe:Y,readFileSafe:W,writeJsonFile:B,writeTextFile:J,writeModuleExportsFile:G,fileExists:U,ensureDirectoryExists:z,removeDirectory:Q}});var N=v((Fe,H)=>{H.exports={name:"dotenv",version:"16.6.1",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard",pretest:"npm run lint && npm run dts-check",test:"tap run --allow-empty-coverage --disable-coverage --timeout=60000","test:coverage":"tap run --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},homepage:"https://github.com/motdotla/dotenv#readme",funding:"https://dotenvx.com",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@types/node":"^18.11.3",decache:"^4.6.2",sinon:"^14.0.1",standard:"^17.0.0","standard-version":"^9.5.0",tap:"^19.2.0",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var T=v((De,g)=>{var E=require("fs"),b=require("path"),X=require("os"),Z=require("crypto"),ee=N(),_=ee.version,te=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function ne(e){let n={},s=e.toString();s=s.replace(/\r\n?/mg,`
1
+ var y=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports);var $=y((_e,D)=>{var R={anyOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"null"}]},B={$id:"https://frontfriend.dev/schemas/components-config.schema.json",type:"object",additionalProperties:{anyOf:[{$ref:"#/$defs/classValue"},{$ref:"#/$defs/componentEnvelope"}]},$defs:{classValue:R,slotValue:{anyOf:[{$ref:"#/$defs/classValue"},{type:"object",additionalProperties:{$ref:"#/$defs/slotValue"}}]},reservedBucket:{anyOf:[{$ref:"#/$defs/classValue"},{type:"object",additionalProperties:{$ref:"#/$defs/slotValue"}}]},componentEnvelope:{type:"object",additionalProperties:!1,properties:{root:{$ref:"#/$defs/slotValue"},variants:{type:"object",additionalProperties:{$ref:"#/$defs/reservedBucket"}},variant:{$ref:"#/$defs/reservedBucket"},size:{$ref:"#/$defs/reservedBucket"},sizes:{$ref:"#/$defs/reservedBucket"},iconPosition:{$ref:"#/$defs/reservedBucket"},color:{$ref:"#/$defs/reservedBucket"},fullwidth:{$ref:"#/$defs/reservedBucket"},states:{$ref:"#/$defs/reservedBucket"},compoundVariants:{$ref:"#/$defs/reservedBucket"},defaultVariants:{$ref:"#/$defs/reservedBucket"},props:{$ref:"#/$defs/reservedBucket"},slots:{type:"object",additionalProperties:{$ref:"#/$defs/slotValue"}}}}}};function K(e){if(typeof e!="string"||e.trim().length===0||/^[0-9]+$/.test(e)||e==="true"||e==="false")return!1;let n=/\s/.test(e),s=/[-:\[\]\/]/.test(e);return!0}D.exports={componentsConfigSchema:B,isCSSClassString:K}});var O=y((Ee,S)=>{var m=require("fs");function M(e){try{let n=m.readFileSync(e,"utf8");return JSON.parse(n)}catch(n){if(n.code==="ENOENT")return null;throw n}}function Y(e){try{return m.readFileSync(e,"utf8").replace(/^\uFEFF/,"")}catch(n){if(n.code==="ENOENT")return null;throw n}}function W(e,n,s=2){let r=JSON.stringify(n,null,s);m.writeFileSync(e,r,"utf8")}function J(e,n){m.writeFileSync(e,n,"utf8")}function G(e,n){if(n==null||typeof n=="object"&&Object.keys(n).length===0||Array.isArray(n)&&n.length===0){let r=`module.exports = ${Array.isArray(n)?"[]":"{}"};`;m.writeFileSync(e,r,"utf8")}else{let s=`module.exports = ${JSON.stringify(n,null,2)};`;m.writeFileSync(e,s,"utf8")}}function U(e){return m.existsSync(e)}function z(e){m.mkdirSync(e,{recursive:!0})}function Q(e){m.rmSync(e,{recursive:!0,force:!0})}S.exports={readJsonFileSafe:M,readFileSafe:Y,writeJsonFile:W,writeTextFile:J,writeModuleExportsFile:G,fileExists:U,ensureDirectoryExists:z,removeDirectory:Q}});var k=y((Fe,H)=>{H.exports={name:"dotenv",version:"16.6.1",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard",pretest:"npm run lint && npm run dts-check",test:"tap run --allow-empty-coverage --disable-coverage --timeout=60000","test:coverage":"tap run --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},homepage:"https://github.com/motdotla/dotenv#readme",funding:"https://dotenvx.com",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@types/node":"^18.11.3",decache:"^4.6.2",sinon:"^14.0.1",standard:"^17.0.0","standard-version":"^9.5.0",tap:"^19.2.0",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var T=y((De,g)=>{var _=require("fs"),b=require("path"),X=require("os"),Z=require("crypto"),ee=k(),E=ee.version,te=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function ne(e){let n={},s=e.toString();s=s.replace(/\r\n?/mg,`
2
2
  `);let r;for(;(r=te.exec(s))!=null;){let f=r[1],c=r[2]||"";c=c.trim();let o=c[0];c=c.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),o==='"'&&(c=c.replace(/\\n/g,`
3
- `),c=c.replace(/\\r/g,"\r")),n[f]=c}return n}function re(e){e=e||{};let n=V(e);e.path=n;let s=d.configDotenv(e);if(!s.parsed){let o=new Error(`MISSING_DATA: Cannot parse ${n} for an unknown reason`);throw o.code="MISSING_DATA",o}let r=k(e).split(","),f=r.length,c;for(let o=0;o<f;o++)try{let l=r[o].trim(),t=se(s,l);c=d.decrypt(t.ciphertext,t.key);break}catch(l){if(o+1>=f)throw l}return d.parse(c)}function oe(e){console.log(`[dotenv@${_}][WARN] ${e}`)}function h(e){console.log(`[dotenv@${_}][DEBUG] ${e}`)}function C(e){console.log(`[dotenv@${_}] ${e}`)}function k(e){return e&&e.DOTENV_KEY&&e.DOTENV_KEY.length>0?e.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function se(e,n){let s;try{s=new URL(n)}catch(l){if(l.code==="ERR_INVALID_URL"){let t=new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development");throw t.code="INVALID_DOTENV_KEY",t}throw l}let r=s.password;if(!r){let l=new Error("INVALID_DOTENV_KEY: Missing key part");throw l.code="INVALID_DOTENV_KEY",l}let f=s.searchParams.get("environment");if(!f){let l=new Error("INVALID_DOTENV_KEY: Missing environment part");throw l.code="INVALID_DOTENV_KEY",l}let c=`DOTENV_VAULT_${f.toUpperCase()}`,o=e.parsed[c];if(!o){let l=new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${c} in your .env.vault file.`);throw l.code="NOT_FOUND_DOTENV_ENVIRONMENT",l}return{ciphertext:o,key:r}}function V(e){let n=null;if(e&&e.path&&e.path.length>0)if(Array.isArray(e.path))for(let s of e.path)E.existsSync(s)&&(n=s.endsWith(".vault")?s:`${s}.vault`);else n=e.path.endsWith(".vault")?e.path:`${e.path}.vault`;else n=b.resolve(process.cwd(),".env.vault");return E.existsSync(n)?n:null}function j(e){return e[0]==="~"?b.join(X.homedir(),e.slice(1)):e}function ae(e){let n=!!(e&&e.debug),s=e&&"quiet"in e?e.quiet:!0;(n||!s)&&C("Loading env from encrypted .env.vault");let r=d._parseVault(e),f=process.env;return e&&e.processEnv!=null&&(f=e.processEnv),d.populate(f,r,e),{parsed:r}}function ie(e){let n=b.resolve(process.cwd(),".env"),s="utf8",r=!!(e&&e.debug),f=e&&"quiet"in e?e.quiet:!0;e&&e.encoding?s=e.encoding:r&&h("No encoding is specified. UTF-8 is used by default");let c=[n];if(e&&e.path)if(!Array.isArray(e.path))c=[j(e.path)];else{c=[];for(let a of e.path)c.push(j(a))}let o,l={};for(let a of c)try{let i=d.parse(E.readFileSync(a,{encoding:s}));d.populate(l,i,e)}catch(i){r&&h(`Failed to load ${a} ${i.message}`),o=i}let t=process.env;if(e&&e.processEnv!=null&&(t=e.processEnv),d.populate(t,l,e),r||!f){let a=Object.keys(l).length,i=[];for(let u of c)try{let p=b.relative(process.cwd(),u);i.push(p)}catch(p){r&&h(`Failed to load ${u} ${p.message}`),o=p}C(`injecting env (${a}) from ${i.join(",")}`)}return o?{parsed:l,error:o}:{parsed:l}}function ce(e){if(k(e).length===0)return d.configDotenv(e);let n=V(e);return n?d._configVault(e):(oe(`You set DOTENV_KEY but you are missing a .env.vault file at ${n}. Did you forget to build it?`),d.configDotenv(e))}function le(e,n){let s=Buffer.from(n.slice(-64),"hex"),r=Buffer.from(e,"base64"),f=r.subarray(0,12),c=r.subarray(-16);r=r.subarray(12,-16);try{let o=Z.createDecipheriv("aes-256-gcm",s,f);return o.setAuthTag(c),`${o.update(r)}${o.final()}`}catch(o){let l=o instanceof RangeError,t=o.message==="Invalid key length",a=o.message==="Unsupported state or unable to authenticate data";if(l||t){let i=new Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)");throw i.code="INVALID_DOTENV_KEY",i}else if(a){let i=new Error("DECRYPTION_FAILED: Please check your DOTENV_KEY");throw i.code="DECRYPTION_FAILED",i}else throw o}}function fe(e,n,s={}){let r=!!(s&&s.debug),f=!!(s&&s.override);if(typeof n!="object"){let c=new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");throw c.code="OBJECT_REQUIRED",c}for(let c of Object.keys(n))Object.prototype.hasOwnProperty.call(e,c)?(f===!0&&(e[c]=n[c]),r&&h(f===!0?`"${c}" is already defined and WAS overwritten`:`"${c}" is already defined and was NOT overwritten`)):e[c]=n[c]}var d={configDotenv:ie,_configVault:ae,_parseVault:re,config:ce,decrypt:le,parse:ne,populate:fe};g.exports.configDotenv=d.configDotenv;g.exports._configVault=d._configVault;g.exports._parseVault=d._parseVault;g.exports.config=d.config;g.exports.decrypt=d.decrypt;g.exports.parse=d.parse;g.exports.populate=d.populate;g.exports=d});var A=v((Se,I)=>{var ue=require("path"),{fileExists:de}=O();function pe(e=process.cwd()){let n=ue.join(e,".env.local");return de(n)?(T().config({path:n}),console.log("\u{1F4C4} Loaded .env.local"),!0):!1}function me(e,n=void 0){return process.env[e]||n}function ge(e){return process.env[e]==="true"}I.exports={loadEnvLocal:pe,getEnvVar:me,isEnvTrue:ge}});var L=v((Oe,M)=>{var{componentsConfigSchema:ye,isCSSClassString:ve}=$();function F(e){if(!e)return{};if(typeof e!="object")throw new Error("Config must be an object");return e}F.componentsConfigSchema=ye;F.isCSSClassString=ve;M.exports=F});var he=require("tailwindcss/plugin"),{componentsConfigSchema:we,isCSSClassString:be}=$(),x;try{x=require("postcss")}catch{x=null}var y;if(typeof window>"u"&&typeof process<"u"&&process.versions&&process.versions.node){y=require("./lib/core/cache-manager");let{loadEnvLocal:e}=A();e()}function P(e){return Object.fromEntries(Object.entries(e).filter(([n])=>n!=="DEFAULT"))}var xe=he.withOptions(function(e={}){return function({addBase:n,addUtilities:s,theme:r,matchUtilities:f}){if(!y)return;let c=new y(process.cwd());if(!c.exists()){console.warn('[FrontFriend] No cache found. Please run "npx frontfriend init" first.');return}c.isValid()||console.warn('[FrontFriend] Cache is expired. Please run "npx frontfriend init" to refresh.');let o=c.load();if(!o){console.error("[FrontFriend] Failed to load cache.");return}let l={};if(o.variables)for(let[t,a]of Object.entries(o.variables))t.startsWith("--color-")&&!a.startsWith("hsl(")?l[t]=`hsl(${a})`:l[t]=a;if(o.semanticVariables)for(let[t,a]of Object.entries(o.semanticVariables))typeof a=="string"&&!a.startsWith("var(")&&!a.startsWith("hsl(")&&/^\d+\s+\d+%\s+\d+%/.test(a)?l[t]=`hsl(${a})`:l[t]=a;if(n({":root":l}),o.semanticDarkVariables&&Object.keys(o.semanticDarkVariables).length>0){let t={};for(let[a,i]of Object.entries(o.semanticDarkVariables))typeof i=="string"&&!i.startsWith("var(")&&!i.startsWith("hsl(")&&/^\d+\s+\d+%\s+\d+%/.test(i)?t[a]=`hsl(${i})`:t[a]=i;n({":root:not(.light)":t}),n({":root:not(.dark)":l})}if(o.semanticVariables){let t={};for(let[a]of Object.entries(o.semanticVariables)){let i=a.match(/^--(bg|text|border|layer|overlay|icon)-(.+)$/);if(i){let[,u,p]=i,w=`.${u}-${p}`;u==="bg"||u==="layer"||u==="overlay"?t[w]={backgroundColor:`var(${a})`}:u==="text"?t[w]={color:`var(${a})`}:u==="border"?t[w]={borderColor:`var(${a})`}:u==="icon"&&(t[`.text-${u}-${p}`]={color:`var(${a})`},t[`.fill-${u}-${p}`]={fill:`var(${a})`})}}s(t)}if(o.tokens){if(o.tokens.backgroundColor){let t={};for(let[a,i]of Object.entries(o.tokens.backgroundColor))t[`.bg-${a}`]={backgroundColor:i};s(t)}if(o.tokens.textColor){let t={};for(let[a,i]of Object.entries(o.tokens.textColor))t[`.text-${a}`]={color:i};s(t)}if(o.tokens.borderColor){let t={};for(let[a,i]of Object.entries(o.tokens.borderColor))t[`.border-${a}`]={borderColor:i};s(t)}if(o.tokens.fill){let t={},a={};for(let[i,u]of Object.entries(o.tokens.fill))t[`.fill-${i}`]={fill:u},i.startsWith("icon-")&&(a[`.text-${i}`]={color:u});s(t),s(a)}if(o.tokens.fontFamily){let t={};for(let[a,i]of Object.entries(o.tokens.fontFamily))t[`.font-${a}`]={fontFamily:i};s(t)}}if(o.fonts&&o.fonts.length>0&&o.fonts.forEach(t=>{n({"@font-face":t})}),s({"@keyframes enter":r("keyframes.enter"),"@keyframes exit":r("keyframes.exit"),".animate-in":{animationName:"enter",animationDuration:r("animationDuration.DEFAULT"),"--tw-enter-opacity":"initial","--tw-enter-scale":"initial","--tw-enter-rotate":"initial","--tw-enter-translate-x":"initial","--tw-enter-translate-y":"initial"},".animate-out":{animationName:"exit",animationDuration:r("animationDuration.DEFAULT"),"--tw-exit-opacity":"initial","--tw-exit-scale":"initial","--tw-exit-rotate":"initial","--tw-exit-translate-x":"initial","--tw-exit-translate-y":"initial"}}),f({"fade-in":t=>({"--tw-enter-opacity":t}),"fade-out":t=>({"--tw-exit-opacity":t})},{values:r("animationOpacity")}),f({"zoom-in":t=>({"--tw-enter-scale":t}),"zoom-out":t=>({"--tw-exit-scale":t})},{values:r("animationScale")}),f({"spin-in":t=>({"--tw-enter-rotate":t}),"spin-out":t=>({"--tw-exit-rotate":t})},{values:r("animationRotate")}),f({"slide-in-from-top":t=>({"--tw-enter-translate-y":`-${t}`}),"slide-in-from-bottom":t=>({"--tw-enter-translate-y":t}),"slide-in-from-left":t=>({"--tw-enter-translate-x":`-${t}`}),"slide-in-from-right":t=>({"--tw-enter-translate-x":t}),"slide-out-to-top":t=>({"--tw-exit-translate-y":`-${t}`}),"slide-out-to-bottom":t=>({"--tw-exit-translate-y":t}),"slide-out-to-left":t=>({"--tw-exit-translate-x":`-${t}`}),"slide-out-to-right":t=>({"--tw-exit-translate-x":t})},{values:r("animationTranslate")}),f({duration:t=>({animationDuration:t})},{values:P(r("animationDuration"))}),f({delay:t=>({animationDelay:t})},{values:r("animationDelay")}),f({ease:t=>({animationTimingFunction:t})},{values:P(r("animationTimingFunction"))}),s({".running":{animationPlayState:"running"},".paused":{animationPlayState:"paused"}}),s({".px-ff-main":{paddingLeft:"var(--ff-main-px)",paddingRight:"var(--ff-main-px)"},".py-ff-main":{paddingTop:"var(--ff-main-py)",paddingBottom:"var(--ff-main-py)"},".p-ff-main":{paddingLeft:"var(--ff-main-px)",paddingRight:"var(--ff-main-px)",paddingTop:"var(--ff-main-py)",paddingBottom:"var(--ff-main-py)"}}),f({"fill-mode":t=>({animationFillMode:t})},{values:r("animationFillMode")}),f({direction:t=>({animationDirection:t})},{values:r("animationDirection")}),f({repeat:t=>({animationIterationCount:t})},{values:r("animationRepeat")}),o.custom&&o.custom.raw&&typeof o.custom.raw=="string"){let t=o.custom.raw.trim();if(!t){e.verbose&&console.warn("[FrontFriend] Empty custom CSS");return}if(!x){console.warn("[FrontFriend] PostCSS not available - custom CSS will not be added");return}try{let a=x.parse(t),i=[],u=[];a.each(p=>{if(p.type==="atrule"){i.push(p);return}if(p.type==="rule"){typeof p.selector=="string"&&p.selector.trim().startsWith(".")?u.push(p):i.push(p);return}p.type!=="comment"&&i.push(p)}),i.length>0&&n(i),u.length>0&&s(u),e.verbose&&console.log(`[FrontFriend] Added custom CSS: ${i.length} base rules, ${u.length} utility classes`)}catch(a){console.error("[FrontFriend] Failed to parse custom CSS:",a.message)}}else if(!o.custom){let t=require("fs"),i=require("path").join(process.cwd(),"node_modules",".cache","frontfriend","custom.js");t.existsSync(i)&&(console.warn("[FrontFriend] custom.js file exists but failed to load. This may be due to a parsing error or BOM issue."),console.warn("[FrontFriend] Try deleting node_modules/.cache/frontfriend and running `npx frontfriend init` again."))}e.verbose&&(console.log("[FrontFriend] Plugin loaded successfully"),console.log(`[FrontFriend] Colors: ${Object.keys(o.variables||{}).length}`),console.log(`[FrontFriend] Semantic vars: ${Object.keys(o.semanticVariables||{}).length}`),console.log(`[FrontFriend] Fonts: ${(o.fonts||[]).length}`),console.log(`[FrontFriend] Safelist classes: ${Array.isArray(o.safelist)?o.safelist.length:0}`))}},function(e={}){let n=null;if(y){let r=new y(process.cwd());n=r.exists()?r.load():null}let s=["./pages/**/*.{js,ts,jsx,tsx}","./components/**/*.{js,ts,jsx,tsx}","./app/**/*.{js,ts,jsx,tsx}","./src/**/*.{js,ts,jsx,tsx}","./stories/**/*.{js,ts,jsx,tsx}"];return e.verbose&&n&&(console.log("[FrontFriend] Cache loaded successfully"),n.safelist&&Array.isArray(n.safelist)&&console.log(`[FrontFriend] Loading ${n.safelist.length} classes for safelist`)),{theme:{extend:{colors:e.extendColors||{},animation:e.extendAnimations||{},spacing:{18:"4.5rem",88:"22rem",128:"32rem"},boxShadow:{"top-sm":"0 -1px 1px 0 rgba(0, 0, 0, 0.05)"},borderRadius:{"2xl":"1rem"},animationDelay:({theme:r})=>({...r("transitionDelay")}),animationDuration:({theme:r})=>({0:"0ms",...r("transitionDuration")}),animationTimingFunction:({theme:r})=>({...r("transitionTimingFunction")}),animationFillMode:{none:"none",forwards:"forwards",backwards:"backwards",both:"both"},animationDirection:{normal:"normal",reverse:"reverse",alternate:"alternate","alternate-reverse":"alternate-reverse"},animationOpacity:({theme:r})=>({DEFAULT:0,...r("opacity")}),animationTranslate:({theme:r})=>({DEFAULT:"100%",...r("translate")}),animationScale:({theme:r})=>({DEFAULT:0,...r("scale")}),animationRotate:({theme:r})=>({DEFAULT:"30deg",...r("rotate")}),animationRepeat:{0:"0",1:"1",infinite:"infinite"},keyframes:{enter:{from:{opacity:"var(--tw-enter-opacity, 1)",transform:"translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))"}},exit:{to:{opacity:"var(--tw-exit-opacity, 1)",transform:"translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))"}}}}},safelist:[...((n==null?void 0:n.safelist)||[]).filter(r=>typeof r!="string"||!r.startsWith("file:")),{pattern:/(text|fill)-icon-(neutral|positive|negative|warning|info|highlight|interactive|brand|inverse|onpositive|onnegative|onwarning|oninfo|onhighlight|oninteractive|onbrand)-(mid|strong|subtle|low)(-(neutral|hover|active|selected|disabled))?$/},{pattern:/^(layer-(below|surface|raised|popover|dialog|control)|overlay-(mid|strong|subtle|low))$/}],content:e.content||s}});module.exports=xe;Object.defineProperty(module.exports,"config",{get:function(){if(typeof __FF_CONFIG__<"u")return __FF_CONFIG__;if(typeof window<"u"&&window.__FF_CONFIG__)return window.__FF_CONFIG__;if(y)try{let e=new y(process.cwd());if(e.exists()){let n=e.load();if(n)return n.componentsConfig||null}}catch{}return null}});Object.defineProperty(module.exports,"iconSet",{get:function(){if(typeof __FF_ICONS__<"u")return __FF_ICONS__;if(typeof window<"u"&&window.__FF_ICONS__)return window.__FF_ICONS__;if(y)try{let e=new y(process.cwd());if(e.exists()){let n=e.load();if(n)return n.icons||null}}catch{}return null}});module.exports.componentsConfigSchema=we;module.exports.isCSSClassString=be;module.exports.ffdc=L();
3
+ `),c=c.replace(/\\r/g,"\r")),n[f]=c}return n}function re(e){e=e||{};let n=C(e);e.path=n;let s=d.configDotenv(e);if(!s.parsed){let o=new Error(`MISSING_DATA: Cannot parse ${n} for an unknown reason`);throw o.code="MISSING_DATA",o}let r=V(e).split(","),f=r.length,c;for(let o=0;o<f;o++)try{let l=r[o].trim(),t=se(s,l);c=d.decrypt(t.ciphertext,t.key);break}catch(l){if(o+1>=f)throw l}return d.parse(c)}function oe(e){console.log(`[dotenv@${E}][WARN] ${e}`)}function h(e){console.log(`[dotenv@${E}][DEBUG] ${e}`)}function j(e){console.log(`[dotenv@${E}] ${e}`)}function V(e){return e&&e.DOTENV_KEY&&e.DOTENV_KEY.length>0?e.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function se(e,n){let s;try{s=new URL(n)}catch(l){if(l.code==="ERR_INVALID_URL"){let t=new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development");throw t.code="INVALID_DOTENV_KEY",t}throw l}let r=s.password;if(!r){let l=new Error("INVALID_DOTENV_KEY: Missing key part");throw l.code="INVALID_DOTENV_KEY",l}let f=s.searchParams.get("environment");if(!f){let l=new Error("INVALID_DOTENV_KEY: Missing environment part");throw l.code="INVALID_DOTENV_KEY",l}let c=`DOTENV_VAULT_${f.toUpperCase()}`,o=e.parsed[c];if(!o){let l=new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${c} in your .env.vault file.`);throw l.code="NOT_FOUND_DOTENV_ENVIRONMENT",l}return{ciphertext:o,key:r}}function C(e){let n=null;if(e&&e.path&&e.path.length>0)if(Array.isArray(e.path))for(let s of e.path)_.existsSync(s)&&(n=s.endsWith(".vault")?s:`${s}.vault`);else n=e.path.endsWith(".vault")?e.path:`${e.path}.vault`;else n=b.resolve(process.cwd(),".env.vault");return _.existsSync(n)?n:null}function N(e){return e[0]==="~"?b.join(X.homedir(),e.slice(1)):e}function ie(e){let n=!!(e&&e.debug),s=e&&"quiet"in e?e.quiet:!0;(n||!s)&&j("Loading env from encrypted .env.vault");let r=d._parseVault(e),f=process.env;return e&&e.processEnv!=null&&(f=e.processEnv),d.populate(f,r,e),{parsed:r}}function ae(e){let n=b.resolve(process.cwd(),".env"),s="utf8",r=!!(e&&e.debug),f=e&&"quiet"in e?e.quiet:!0;e&&e.encoding?s=e.encoding:r&&h("No encoding is specified. UTF-8 is used by default");let c=[n];if(e&&e.path)if(!Array.isArray(e.path))c=[N(e.path)];else{c=[];for(let i of e.path)c.push(N(i))}let o,l={};for(let i of c)try{let a=d.parse(_.readFileSync(i,{encoding:s}));d.populate(l,a,e)}catch(a){r&&h(`Failed to load ${i} ${a.message}`),o=a}let t=process.env;if(e&&e.processEnv!=null&&(t=e.processEnv),d.populate(t,l,e),r||!f){let i=Object.keys(l).length,a=[];for(let u of c)try{let p=b.relative(process.cwd(),u);a.push(p)}catch(p){r&&h(`Failed to load ${u} ${p.message}`),o=p}j(`injecting env (${i}) from ${a.join(",")}`)}return o?{parsed:l,error:o}:{parsed:l}}function ce(e){if(V(e).length===0)return d.configDotenv(e);let n=C(e);return n?d._configVault(e):(oe(`You set DOTENV_KEY but you are missing a .env.vault file at ${n}. Did you forget to build it?`),d.configDotenv(e))}function le(e,n){let s=Buffer.from(n.slice(-64),"hex"),r=Buffer.from(e,"base64"),f=r.subarray(0,12),c=r.subarray(-16);r=r.subarray(12,-16);try{let o=Z.createDecipheriv("aes-256-gcm",s,f);return o.setAuthTag(c),`${o.update(r)}${o.final()}`}catch(o){let l=o instanceof RangeError,t=o.message==="Invalid key length",i=o.message==="Unsupported state or unable to authenticate data";if(l||t){let a=new Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)");throw a.code="INVALID_DOTENV_KEY",a}else if(i){let a=new Error("DECRYPTION_FAILED: Please check your DOTENV_KEY");throw a.code="DECRYPTION_FAILED",a}else throw o}}function fe(e,n,s={}){let r=!!(s&&s.debug),f=!!(s&&s.override);if(typeof n!="object"){let c=new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");throw c.code="OBJECT_REQUIRED",c}for(let c of Object.keys(n))Object.prototype.hasOwnProperty.call(e,c)?(f===!0&&(e[c]=n[c]),r&&h(f===!0?`"${c}" is already defined and WAS overwritten`:`"${c}" is already defined and was NOT overwritten`)):e[c]=n[c]}var d={configDotenv:ae,_configVault:ie,_parseVault:re,config:ce,decrypt:le,parse:ne,populate:fe};g.exports.configDotenv=d.configDotenv;g.exports._configVault=d._configVault;g.exports._parseVault=d._parseVault;g.exports.config=d.config;g.exports.decrypt=d.decrypt;g.exports.parse=d.parse;g.exports.populate=d.populate;g.exports=d});var A=y((Se,I)=>{var ue=require("path"),{fileExists:de}=O();function pe(e=process.cwd()){let n=ue.join(e,".env.local");return de(n)?(T().config({path:n}),console.log("\u{1F4C4} Loaded .env.local"),!0):!1}function me(e,n=void 0){return process.env[e]||n}function ge(e){return process.env[e]==="true"}I.exports={loadEnvLocal:pe,getEnvVar:me,isEnvTrue:ge}});var P=y((Oe,L)=>{var{componentsConfigSchema:ve,isCSSClassString:ye}=$();function F(e){if(!e)return{};if(typeof e!="object")throw new Error("Config must be an object");return e}F.componentsConfigSchema=ve;F.isCSSClassString=ye;L.exports=F});var he=require("tailwindcss/plugin"),{componentsConfigSchema:we,isCSSClassString:be}=$(),x;try{x=require("postcss")}catch{x=null}var v;if(typeof window>"u"&&typeof process<"u"&&process.versions&&process.versions.node){v=require("./lib/core/cache-manager");let{loadEnvLocal:e}=A();e()}function q(e){return Object.fromEntries(Object.entries(e).filter(([n])=>n!=="DEFAULT"))}var xe=he.withOptions(function(e={}){return function({addBase:n,addUtilities:s,theme:r,matchUtilities:f}){if(!v)return;let c=new v(process.cwd());if(!c.exists()){console.warn('[FrontFriend] No cache found. Please run "npx frontfriend init" first.');return}c.isValid()||console.warn('[FrontFriend] Cache is expired. Please run "npx frontfriend init" to refresh.');let o=c.load();if(!o){console.error("[FrontFriend] Failed to load cache.");return}let l={};if(o.variables)for(let[t,i]of Object.entries(o.variables))t.startsWith("--color-")&&!i.startsWith("hsl(")?l[t]=`hsl(${i})`:l[t]=i;if(o.semanticVariables)for(let[t,i]of Object.entries(o.semanticVariables))typeof i=="string"&&!i.startsWith("var(")&&!i.startsWith("hsl(")&&/^\d+\s+\d+%\s+\d+%/.test(i)?l[t]=`hsl(${i})`:l[t]=i;if(n({":root":l}),o.semanticDarkVariables&&Object.keys(o.semanticDarkVariables).length>0){let t={};for(let[i,a]of Object.entries(o.semanticDarkVariables))typeof a=="string"&&!a.startsWith("var(")&&!a.startsWith("hsl(")&&/^\d+\s+\d+%\s+\d+%/.test(a)?t[i]=`hsl(${a})`:t[i]=a;n({":root:not(.light)":t}),n({":root:not(.dark)":l})}if(o.semanticVariables){let t={};for(let[i]of Object.entries(o.semanticVariables)){let a=i.match(/^--(bg|text|border|layer|overlay|icon)-(.+)$/);if(a){let[,u,p]=a,w=`.${u}-${p}`;u==="bg"||u==="layer"||u==="overlay"?t[w]={backgroundColor:`var(${i})`}:u==="text"?t[w]={color:`var(${i})`}:u==="border"?t[w]={borderColor:`var(${i})`}:u==="icon"&&(t[`.text-${u}-${p}`]={color:`var(${i})`},t[`.fill-${u}-${p}`]={fill:`var(${i})`})}}s(t)}if(o.tokens){if(o.tokens.backgroundColor){let t={};for(let[i,a]of Object.entries(o.tokens.backgroundColor))t[`.bg-${i}`]={backgroundColor:a};s(t)}if(o.tokens.textColor){let t={};for(let[i,a]of Object.entries(o.tokens.textColor))t[`.text-${i}`]={color:a};s(t)}if(o.tokens.borderColor){let t={};for(let[i,a]of Object.entries(o.tokens.borderColor))t[`.border-${i}`]={borderColor:a};s(t)}if(o.tokens.fill){let t={},i={};for(let[a,u]of Object.entries(o.tokens.fill))t[`.fill-${a}`]={fill:u},a.startsWith("icon-")&&(i[`.text-${a}`]={color:u});s(t),s(i)}if(o.tokens.fontFamily){let t={};for(let[i,a]of Object.entries(o.tokens.fontFamily))t[`.font-${i}`]={fontFamily:a};s(t)}}if(o.fonts&&o.fonts.length>0&&o.fonts.forEach(t=>{n({"@font-face":t})}),s({"@keyframes enter":r("keyframes.enter"),"@keyframes exit":r("keyframes.exit"),".animate-in":{animationName:"enter",animationDuration:r("animationDuration.DEFAULT"),"--tw-enter-opacity":"initial","--tw-enter-scale":"initial","--tw-enter-rotate":"initial","--tw-enter-translate-x":"initial","--tw-enter-translate-y":"initial"},".animate-out":{animationName:"exit",animationDuration:r("animationDuration.DEFAULT"),"--tw-exit-opacity":"initial","--tw-exit-scale":"initial","--tw-exit-rotate":"initial","--tw-exit-translate-x":"initial","--tw-exit-translate-y":"initial"}}),f({"fade-in":t=>({"--tw-enter-opacity":t}),"fade-out":t=>({"--tw-exit-opacity":t})},{values:r("animationOpacity")}),f({"zoom-in":t=>({"--tw-enter-scale":t}),"zoom-out":t=>({"--tw-exit-scale":t})},{values:r("animationScale")}),f({"spin-in":t=>({"--tw-enter-rotate":t}),"spin-out":t=>({"--tw-exit-rotate":t})},{values:r("animationRotate")}),f({"slide-in-from-top":t=>({"--tw-enter-translate-y":`-${t}`}),"slide-in-from-bottom":t=>({"--tw-enter-translate-y":t}),"slide-in-from-left":t=>({"--tw-enter-translate-x":`-${t}`}),"slide-in-from-right":t=>({"--tw-enter-translate-x":t}),"slide-out-to-top":t=>({"--tw-exit-translate-y":`-${t}`}),"slide-out-to-bottom":t=>({"--tw-exit-translate-y":t}),"slide-out-to-left":t=>({"--tw-exit-translate-x":`-${t}`}),"slide-out-to-right":t=>({"--tw-exit-translate-x":t})},{values:r("animationTranslate")}),f({duration:t=>({animationDuration:t})},{values:q(r("animationDuration"))}),f({delay:t=>({animationDelay:t})},{values:r("animationDelay")}),f({ease:t=>({animationTimingFunction:t})},{values:q(r("animationTimingFunction"))}),s({".running":{animationPlayState:"running"},".paused":{animationPlayState:"paused"}}),s({".px-ff-main":{paddingLeft:"var(--ff-main-px)",paddingRight:"var(--ff-main-px)"},".py-ff-main":{paddingTop:"var(--ff-main-py)",paddingBottom:"var(--ff-main-py)"},".p-ff-main":{paddingLeft:"var(--ff-main-px)",paddingRight:"var(--ff-main-px)",paddingTop:"var(--ff-main-py)",paddingBottom:"var(--ff-main-py)"}}),f({"fill-mode":t=>({animationFillMode:t})},{values:r("animationFillMode")}),f({direction:t=>({animationDirection:t})},{values:r("animationDirection")}),f({repeat:t=>({animationIterationCount:t})},{values:r("animationRepeat")}),o.custom&&o.custom.raw&&typeof o.custom.raw=="string"){let t=o.custom.raw.trim();if(!t){e.verbose&&console.warn("[FrontFriend] Empty custom CSS");return}if(!x){console.warn("[FrontFriend] PostCSS not available - custom CSS will not be added");return}try{let i=x.parse(t),a=[],u=[];i.each(p=>{if(p.type==="atrule"){a.push(p);return}if(p.type==="rule"){typeof p.selector=="string"&&p.selector.trim().startsWith(".")?u.push(p):a.push(p);return}p.type!=="comment"&&a.push(p)}),a.length>0&&n(a),u.length>0&&s(u),e.verbose&&console.log(`[FrontFriend] Added custom CSS: ${a.length} base rules, ${u.length} utility classes`)}catch(i){console.error("[FrontFriend] Failed to parse custom CSS:",i.message)}}else if(!o.custom){let t=require("fs"),a=require("path").join(process.cwd(),"node_modules",".cache","frontfriend","custom.js");t.existsSync(a)&&(console.warn("[FrontFriend] custom.js file exists but failed to load. This may be due to a parsing error or BOM issue."),console.warn("[FrontFriend] Try deleting node_modules/.cache/frontfriend and running `npx frontfriend init` again."))}e.verbose&&(console.log("[FrontFriend] Plugin loaded successfully"),console.log(`[FrontFriend] Colors: ${Object.keys(o.variables||{}).length}`),console.log(`[FrontFriend] Semantic vars: ${Object.keys(o.semanticVariables||{}).length}`),console.log(`[FrontFriend] Fonts: ${(o.fonts||[]).length}`),console.log(`[FrontFriend] Safelist classes: ${Array.isArray(o.safelist)?o.safelist.length:0}`))}},function(e={}){let n=null;if(v){let r=new v(process.cwd());n=r.exists()?r.load():null}let s=["./pages/**/*.{js,ts,jsx,tsx}","./components/**/*.{js,ts,jsx,tsx}","./app/**/*.{js,ts,jsx,tsx}","./src/**/*.{js,ts,jsx,tsx}","./stories/**/*.{js,ts,jsx,tsx}"];return e.verbose&&n&&(console.log("[FrontFriend] Cache loaded successfully"),n.safelist&&Array.isArray(n.safelist)&&console.log(`[FrontFriend] Loading ${n.safelist.length} classes for safelist`)),{theme:{extend:{colors:e.extendColors||{},animation:e.extendAnimations||{},spacing:{18:"4.5rem",88:"22rem",128:"32rem"},boxShadow:{"top-sm":"0 -1px 1px 0 rgba(0, 0, 0, 0.05)"},borderRadius:{"2xl":"1rem"},animationDelay:({theme:r})=>({...r("transitionDelay")}),animationDuration:({theme:r})=>({0:"0ms",...r("transitionDuration")}),animationTimingFunction:({theme:r})=>({...r("transitionTimingFunction")}),animationFillMode:{none:"none",forwards:"forwards",backwards:"backwards",both:"both"},animationDirection:{normal:"normal",reverse:"reverse",alternate:"alternate","alternate-reverse":"alternate-reverse"},animationOpacity:({theme:r})=>({DEFAULT:0,...r("opacity")}),animationTranslate:({theme:r})=>({DEFAULT:"100%",...r("translate")}),animationScale:({theme:r})=>({DEFAULT:0,...r("scale")}),animationRotate:({theme:r})=>({DEFAULT:"30deg",...r("rotate")}),animationRepeat:{0:"0",1:"1",infinite:"infinite"},keyframes:{enter:{from:{opacity:"var(--tw-enter-opacity, 1)",transform:"translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))"}},exit:{to:{opacity:"var(--tw-exit-opacity, 1)",transform:"translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))"}}}}},safelist:[...((n==null?void 0:n.safelist)||[]).filter(r=>typeof r!="string"||!r.startsWith("file:")),{pattern:/(text|fill)-icon-(neutral|positive|negative|warning|info|highlight|interactive|brand|inverse|onpositive|onnegative|onwarning|oninfo|onhighlight|oninteractive|onbrand)-(mid|strong|subtle|low)(-(neutral|hover|active|selected|disabled))?$/},{pattern:/^(layer-(below|surface|raised|popover|dialog|control)|overlay-(mid|strong|subtle|low))$/}],content:e.content||s}});module.exports=xe;Object.defineProperty(module.exports,"config",{get:function(){if(typeof __FF_CONFIG__<"u")return __FF_CONFIG__;if(typeof window<"u"&&window.__FF_CONFIG__)return window.__FF_CONFIG__;if(v)try{let e=new v(process.cwd());if(e.exists()){let n=e.load();if(n)return n.componentsConfig||null}}catch{}return null}});Object.defineProperty(module.exports,"iconSet",{get:function(){if(typeof __FF_ICONS__<"u")return __FF_ICONS__;if(typeof window<"u"&&window.__FF_ICONS__)return window.__FF_ICONS__;if(v)try{let e=new v(process.cwd());if(e.exists()){let n=e.load();if(n)return n.icons||null}}catch{}return null}});module.exports.componentsConfigSchema=we;module.exports.isCSSClassString=be;module.exports.ffdc=P();
4
4
  //# sourceMappingURL=index.js.map