love-ui 1.2.20 → 1.2.21

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/index.js CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import{$ as L,A as Lt,Aa as Zo,B as _t,Ba as lt,C as To,Ca as He,D as Vt,Da as Xo,E as Dt,Ea as Qo,F as Fo,Fa as en,G as Ut,Ga as tn,H as Mt,Ha as rn,I as xr,J as Oo,K as Ao,L as No,M as Lo,N as q,O as _o,P as Bt,Q as Vo,R as Do,S as Uo,T as Mo,U as j,V as ae,W as ze,X as Bo,Y as Sr,Z as Te,_ as Je,a as S,aa as ne,b as re,ba as Wt,c as jt,ca as Wo,d,da as Ir,e as l,ea as zo,f as M,fa as le,g as B,ga as ce,h as W,ha as Jo,i as xo,ia as R,j as So,ja as lm,k as Tt,ka as ie,l as z,la as cm,m as Io,ma as fm,n as at,na as Ge,o as je,oa as Pr,p as Po,pa as Go,q as Rr,qa as Ho,r as $o,ra as zt,s as Eo,sa as mm,t as jo,ta as Ko,u as b,ua as Yo,v as Ft,va as $r,w as We,wa as qo,x as Ot,xa as pm,y as At,ya as um,z as Nt,za as F}from"./chunk-NJPHI6KT.js";import hl from"path";import{promises as Aa}from"fs";import ue from"path";import nn from"path";import Er from"fs-extra";async function sn(e){let t={};if(!Er.existsSync(e.cwd)||!Er.existsSync(nn.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,projectInfo:null};let r=b("Preflight checks.",{silent:e.silent}).start();Er.existsSync(nn.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),l.break(),l.error(`A ${d.info("components.json")} file already exists at ${d.info(e.cwd)}.
2
+ import{$ as L,A as Lt,Aa as qo,B as _t,Ba as lt,C as jo,Ca as He,D as Vt,Da as Zo,E as Dt,Ea as Xo,F as To,Fa as Qo,G as Ut,Ga as en,H as Mt,Ha as tn,I as xr,J as Fo,K as Oo,L as Ao,M as No,N as q,O as Lo,P as Bt,Q as _o,R as Vo,S as Do,T as Uo,U as j,V as ae,W as ze,X as Mo,Y as Sr,Z as je,_ as Je,a as S,aa as ne,b as re,ba as Wt,c as jt,ca as Bo,d,da as Ir,e as l,ea as Wo,f as M,fa as le,g as B,ga as ce,h as W,ha as zo,i as Ro,ia as R,j as xo,ja as lm,k as Tt,ka as ie,l as z,la as cm,m as So,ma as fm,n as at,na as Ge,o as Ee,oa as Pr,p as Io,pa as Jo,q as Rr,qa as Go,r as Po,ra as zt,s as $o,sa as mm,t as Eo,ta as Ho,u as b,ua as Ko,v as Ft,va as $r,w as We,wa as Yo,x as Ot,xa as pm,y as At,ya as um,z as Nt,za as F}from"./chunk-VDMHIXDM.js";import hl from"path";import{promises as Aa}from"fs";import ue from"path";import on from"path";import Er from"fs-extra";async function nn(e){let t={};if(!Er.existsSync(e.cwd)||!Er.existsSync(on.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,projectInfo:null};let r=b("Preflight checks.",{silent:e.silent}).start();Er.existsSync(on.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),l.break(),l.error(`A ${d.info("components.json")} file already exists at ${d.info(e.cwd)}.
3
3
  To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),l.break(),process.exit(1)),r?.succeed();let o=b("Verifying framework.",{silent:e.silent}).start(),n=e.existingConfig?.tailwind,i=await F(e.cwd,{configCssFile:typeof n?.css=="string"?n.css:void 0});if(!i||i?.framework.name==="manual"){if(t["7"]=!0,o?.fail(),!e.monorepo&&await M(e.cwd)){let f=await B(e.cwd);f.length>0&&(W("init",f),process.exit(1))}l.break(),i?.framework.links.installation&&l.error(`We could not detect a supported framework at ${d.info(e.cwd)}.
4
4
  Visit ${d.info(i?.framework.links.installation)} to manually configure your project.
5
- Once configured, you can use the cli to add components.`),l.break(),process.exit(1)}o?.succeed(`Verifying framework. Found ${d.info(i.framework.label)}.`);let s="Validating Tailwind CSS.";i.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${d.info("v4")}.`);let c=b(s,{silent:e.silent}).start();i.tailwindVersion==="v3"&&(!i?.tailwindConfigFile||!i?.tailwindCssFile)?(t["5"]=!0,c?.fail()):i.tailwindVersion==="v4"&&!i?.tailwindCssFile?(t["5"]=!0,c?.fail()):i.tailwindVersion?c?.succeed():(t["5"]=!0,c?.fail());let a=b("Validating import alias.",{silent:e.silent}).start();return i?.aliasPrefix?a?.succeed():(t["6"]=!0,a?.fail()),Object.keys(t).length>0&&(t["5"]&&(l.break(),l.error(`No Tailwind CSS configuration found at ${d.info(e.cwd)}.`),l.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),l.error("Install Tailwind CSS then try again."),i?.framework.links.tailwind&&l.error(`Visit ${d.info(i?.framework.links.tailwind)} to get started.`)),t["6"]&&(l.break(),l.error(`Could not find valid path aliases or package imports for ${d.info("init")}.`),l.error(`Configure path aliases in ${d.info("tsconfig.json")} or imports in ${d.info("package.json")}, then run ${d.info("init")} again.`),l.error(`Learn more at ${d.info(`${S}/docs/installation/manual#configure-import-aliases`)}.`)),l.break(),process.exit(1)),{errors:t,projectInfo:i}}var ys=["nova","vega","maia","lyra","mira","luma","sera","rhea"],jr=["neutral","stone","zinc","gray","mauve","olive","mist","taupe"],Gt=["neutral","stone","zinc","gray","amber","blue","cyan","emerald","fuchsia","green","indigo","lime","orange","pink","purple","red","rose","sky","teal","violet","yellow","mauve","olive","mist","taupe"],ws=Gt,an={neutral:"blue",stone:"lime",zinc:"amber",mauve:"emerald",olive:"violet",mist:"rose",taupe:"cyan"},Tr=["lucide","hugeicons","tabler","phosphor","remixicon"],Ht=["inter","noto-sans","nunito-sans","figtree","roboto","raleway","dm-sans","public-sans","outfit","jetbrains-mono","geist","geist-mono","lora","merriweather","playfair-display","noto-serif","roboto-slab","oxanium","manrope","space-grotesk","montserrat","ibm-plex-sans","source-sans-3","instrument-sans","eb-garamond","instrument-serif"],Fr=["inherit",...Ht],bs=["default","none","small","medium","large"],Or=["subtle","bold"],Ar=["default","inverted","default-translucent","inverted-translucent"],ln=[{key:"menuColor",values:Ar,bits:3},{key:"menuAccent",values:Or,bits:3},{key:"radius",values:bs,bits:4},{key:"font",values:Ht,bits:6},{key:"iconLibrary",values:Tr,bits:6},{key:"theme",values:Gt,bits:6},{key:"baseColor",values:jr,bits:6},{key:"style",values:ys,bits:6}],Nr=[...ln,{key:"chartColor",values:ws,bits:6},{key:"fontHeading",values:Fr,bits:5}],ks=Object.fromEntries(Nr.map(e=>[e.key,e.values[0]])),Lr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",vs="b",cn=["a","b"];function Cs(e){if(e===0)return"0";let t="",r=e;for(;r>0;)t=Lr[r%62]+t,r=Math.floor(r/62);return t}function Rs(e){let t=0;for(let r=0;r<e.length;r++){let o=Lr.indexOf(e[r]);if(o===-1)return-1;t=t*62+o}return t}function fn(e){let t={...ks,...e},r=0,o=0;for(let n of Nr){let i=n.values.indexOf(t[n.key]);r+=(i===-1?0:i)*2**o,o+=n.bits}return vs+Cs(r)}function Ke(e){if(!e||e.length<2)return null;let t=e[0];if(!cn.includes(t))return null;let r=t==="a"?ln:Nr,o=Rs(e.slice(1));if(o<0)return null;let n={},i=0;for(let s of r){let c=Math.floor(o/2**i)%2**s.bits;n[s.key]=c<s.values.length?s.values[c]:s.values[0],i+=s.bits}return t==="a"&&(n.fontHeading="inherit"),n}function Ye(e){if(!e||e.length<2||e.length>10||!cn.includes(e[0]))return!1;for(let t=1;t<e.length;t++)if(Lr.indexOf(e[t])===-1)return!1;return!0}import xs from"path";async function mn(e,t){let r=new Set,o=new Set,n=[...e];for(;n.length>0;){let i=n.shift();if(o.has(i))continue;o.add(i);let{registry:s}=Tt(i);s&&!re[s]&&r.add(s);try{let[c]=await zo([i],t,{useCache:!0});if(c?.registryDependencies)for(let a of c.registryDependencies){let{registry:f}=Tt(a);f&&!re[f]&&r.add(f),o.has(a)||n.push(a)}}catch(c){if(c instanceof So){let{registry:a}=Tt(i);a&&!re[a]&&r.add(a);continue}continue}}return Array.from(r)}import Ss from"fs-extra";async function G(e,t,r={}){r={silent:!1,writeFile:!0,...r};let n=(await mn(e,t)).filter(f=>!t.registries?.[f]&&!Object.keys(re).includes(f));if(n.length===0)return{config:t,newRegistries:[]};let i=await qo({useCache:process.env.NODE_ENV!=="development"});if(!i)return{config:t,newRegistries:[]};let s={};for(let f of n)i[f]&&(s[f]=i[f]);if(Object.keys(s).length===0)return{config:t,newRegistries:[]};let c=Object.fromEntries(Object.entries(t.registries||{}).filter(([f])=>!Object.keys(re).includes(f))),a={...t,registries:{...c,...s}};if(r.writeFile){let{resolvedPaths:f,...m}=a,p=b("Updating components.json.",{silent:r.silent}).start(),u=z.parse(m);await Ss.writeFile(xs.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
6
- `,"utf-8"),p.succeed()}return{config:a,newRegistries:Object.keys(s)}}import Is from"open";import _r from"prompts";var Z={nova:{title:"Nova",description:"Lucide / Geist",style:"nova",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"geist",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},vega:{title:"Vega",description:"Lucide / Inter",style:"vega",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},maia:{title:"Maia",description:"Hugeicons / Figtree",style:"maia",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"figtree",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},lyra:{title:"Lyra",description:"Phosphor / JetBrains Mono",style:"lyra",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"phosphor",font:"jetbrains-mono",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},mira:{title:"Mira",description:"Hugeicons / Inter",style:"mira",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},luma:{title:"Luma",description:"Lucide / Inter",style:"luma",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},sera:{title:"Sera",description:"Lucide / Noto Sans + Playfair Display",style:"sera",baseColor:"taupe",theme:"taupe",chartColor:"taupe",iconLibrary:"lucide",font:"noto-sans",fontHeading:"playfair-display",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},rhea:{title:"Rhea",description:"Lucide / Inter",style:"rhea",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1}};function Vr(e){let t=new URL(`${S}/create`),{rtl:r,pointer:o,...n}=e??{};for(let[i,s]of Object.entries(n))s!==void 0&&t.searchParams.set(i,String(s));return r&&t.searchParams.set("rtl","true"),o&&t.searchParams.set("pointer","true"),t.toString()}async function Dr(e){if(l.break(),l.log(` Build your custom preset on ${d.info(e.createUrl)}`),l.log(` ${e.followUp}`),l.break(),e.prompt===!1)return;let{proceed:t}=await _r({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});t&&await Is(e.createUrl)}function he(e,t){let r=new URLSearchParams({base:e.base,style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,font:e.font,rtl:String(e.rtl??!1),menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return e.chartColor&&e.chartColor!=="neutral"&&r.set("chartColor",e.chartColor),e.fontHeading&&e.fontHeading!=="inherit"&&r.set("fontHeading",e.fontHeading),t?.preset&&r.set("preset",t.preset),t?.template&&r.set("template",t.template),t?.only&&r.set("only",t.only),t?.pointer&&r.set("pointer","true"),r.set("track","1"),`${S}/init?${r.toString()}`}async function qe(){let{base:e}=await _r({type:"select",name:"base",message:`Select a ${d.info("component library")}`,choices:[{title:"Radix",value:"radix"},{title:"Base",value:"base"}]});return e||process.exit(1),e}async function ct(e){let t=Object.entries(Z),{selectedPreset:r}=await _r({type:"select",name:"selectedPreset",message:`Which ${d.info("preset")} would you like to use?`,choices:[...t.map(([n,i])=>({title:i.title,description:i.description,value:n})),{title:"Custom",description:`Build your own at ${d.info(`${S}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let n=Vr({command:"init",rtl:e.rtl,pointer:e.pointer,base:e.base,...e.template&&{template:e.template}});await Dr({createUrl:n,followUp:`Then ${d.info("copy and run the command")} from loveui.dev.`}),process.exit(0)}let o=Z[r];return o||process.exit(1),{url:he({...o,base:e.base,rtl:e.rtl},{template:e.template,pointer:e.pointer}),base:e.base}}async function Fe(e,t,r){let o=L(Je({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:n}=await G([e],o,{silent:!0,writeFile:!1});o=n,Wo(e,o);let[i]=await ie([e],{config:o,useCache:!0}),s=i?.type==="registry:base"&&i.config?i.config:void 0,c=e;if(Ps(e)){let a=new URL(e);a.searchParams.delete("track"),c=a.toString()}return{registryBaseConfig:s,installStyleIndex:i?.extends!=="none",url:c}}function Ps(e){try{return new URL(e).pathname==="/init"&&e.startsWith(S)}catch{return!1}}import Pn from"dedent";import $s from"os";import me from"path";import{execa as Oe}from"execa";import V from"fs-extra";var Es=process.env.LOVEUI_GITHUB_URL??"https://github.com/loveconnor/loveui.git";function X(e){return{...e,frameworks:e.frameworks??[],scaffold:e.scaffold??un({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??Os}}function Ae(e,{monorepo:t}){if(!t||!e.monorepo)return e;let r=e.monorepo,o={...e,templateDir:r.templateDir,defaultProjectName:r.defaultProjectName??r.templateDir,init:r.init??e.init,files:r.files??e.files};return o.scaffold=un({title:e.title,templateDir:r.templateDir}),o}function js(e){switch(e){case"pnpm":return["--no-frozen-lockfile"];case"yarn":return["--no-immutable"];default:return[]}}async function Ts(e,t){if(t==="pnpm")return;let r=me.join(e,"pnpm-workspace.yaml"),o=me.join(e,"package.json"),n=me.join(e,"pnpm-lock.yaml");V.existsSync(n)&&await V.remove(n);let i=V.existsSync(r),s=i?xo(await V.readFile(r,"utf8")):[],c=s.length>0;if(V.existsSync(o)){let a=await V.readFile(o,"utf8"),f=JSON.parse(a);c?f.packageManager=await Fs(t):delete f.packageManager,c&&(f.workspaces=s),await V.writeFile(o,JSON.stringify(f,null,2)+`
7
- `)}i&&await V.remove(r),c&&t==="npm"&&await pn(e)}async function Fs(e){try{let{stdout:t}=await Oe(e,["--version"]);return`${e}@${t.trim()}`}catch{return`${e}@*`}}async function pn(e){let t=await V.readdir(e,{withFileTypes:!0});for(let r of t){if(r.name==="node_modules")continue;let o=me.join(e,r.name);if(r.isDirectory())await pn(o);else if(r.name==="package.json"){let n=await V.readFile(o,"utf8");if(!n.includes("workspace:"))continue;let i=JSON.parse(n),s=!1;for(let c of["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let a=i[c];if(a)for(let[f,m]of Object.entries(a))typeof m=="string"&&m.startsWith("workspace:")&&(a[f]="*",s=!0)}s&&await V.writeFile(o,JSON.stringify(i,null,2)+`
8
- `)}}}function un({title:e,templateDir:t}){return async({projectPath:r,packageManager:o})=>{let n=b(`Creating a new ${e} project. This may take a few minutes.`).start();try{let i=process.env.LOVEUI_TEMPLATE_DIR;if(i){let f=me.resolve(i,t);await V.copy(f,r,{filter:m=>!m.includes("node_modules")})}else{let f=me.join($s.tmpdir(),`love-ui-template-${Date.now()}`);await Oe("git",["clone","--depth","1","--filter=blob:none","--sparse",Es,f]),await Oe("git",["-C",f,"sparse-checkout","set",`templates/${t}`]);let m=me.resolve(f,"templates",t);await V.move(m,r),await V.remove(f)}await Ts(r,o);let c=["install",...js(o)];await Oe(o,c,{cwd:r});let a=me.join(r,"package.json");if(V.existsSync(a)){let f=await V.readFile(a,"utf8"),m=JSON.parse(f);m.name=me.basename(r),await V.writeFile(a,JSON.stringify(m,null,2)+`
9
- `)}n?.succeed(`Creating a new ${e} project.`)}catch(i){n?.fail(`Something went wrong creating a new ${e} project.`),R(i)}}}async function Os({projectPath:e}){try{await Oe("git",["init"],{cwd:e}),await Oe("git",["add","-A"],{cwd:e}),await Oe("git",["commit","-m","feat: initial commit"],{cwd:e})}catch{}}import Xt from"path";import ke from"path";var dn={"--font-heading":"cn-font-heading"};function As(e){return e.startsWith("--")?e:`--${e}`}function Ne(e){let t=new Set;for(let r of e){for(let o of r.fonts??[]){let n=o.font?.variable;if(!n)continue;let i=dn[n];i&&t.add(i)}for(let o of Object.values(r.cssVars??{}))for(let n of Object.keys(o??{})){let i=dn[As(n)];i&&t.add(i)}}return Array.from(t)}import Ze from"path";function gn(e,t){if(e.includes("\0"))return!1;let r;try{r=e;let u="";for(;r!==u&&r.includes("%");)u=r,r=decodeURIComponent(r)}catch{return!1}let o=Ze.normalize(r.replace(/\\/g,"/")),n=Ze.normalize(t),i=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(i(o)||i(r)||i(e))return!1;let s=u=>u.replace(/\[\.\.\..*?\]/g,""),c=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(c)||u.test(a))||(e.includes("~")||r.includes("~"))&&(e.includes("../")||r.includes("../")))return!1;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(t.toLowerCase()):!1;if(Ze.isAbsolute(o))return o.startsWith(n+Ze.sep);let p=Ze.resolve(n,o);return p.startsWith(n+Ze.sep)||p===n}import{promises as kn}from"fs";import Hs from"path";import{promises as hn}from"fs";import Ns from"path";import N from"postcss";import Ls from"postcss/lib/at-rule";import{z as ye}from"zod";async function Kt(e,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:!1,silent:!1,tailwindVersion:"v3",overwriteCssVars:!1,...r};let o=t.resolvedPaths.tailwindCss,n=Ns.relative(t.resolvedPaths.cwd,o),i=b(`Updating CSS variables in ${d.info(n)}`,{silent:r.silent}).start(),s=await hn.readFile(o,"utf8"),c=await ft(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars});await hn.writeFile(o,c,"utf8"),i.succeed()}async function ft(e,t,r,o={cleanupDefaultNextStyles:!1,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:!1}){o={cleanupDefaultNextStyles:!1,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:!1,...o};let n=[_s(t)];o.cleanupDefaultNextStyles&&n.push(wn()),o.tailwindVersion==="v4"&&(n=[],n.push(Ms({params:"dark (&:is(.dark *))"})),o.cleanupDefaultNextStyles&&n.push(wn()),n.push(Ds(t,{overwriteCssVars:o.overwriteCssVars})),n.push(Us(t)),o.tailwindConfig&&(n.push(Bs(o.tailwindConfig)),n.push(zs(o.tailwindConfig)),n.push(Ws(o.tailwindConfig))));let s=(await N(n).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),o.tailwindVersion==="v4"&&(s=s.replace(/(\n\s*\n)+/g,`
5
+ Once configured, you can use the cli to add components.`),l.break(),process.exit(1)}o?.succeed(`Verifying framework. Found ${d.info(i.framework.label)}.`);let s="Validating Tailwind CSS.";i.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${d.info("v4")}.`);let c=b(s,{silent:e.silent}).start();i.tailwindVersion==="v3"&&(!i?.tailwindConfigFile||!i?.tailwindCssFile)?(t["5"]=!0,c?.fail()):i.tailwindVersion==="v4"&&!i?.tailwindCssFile?(t["5"]=!0,c?.fail()):i.tailwindVersion?c?.succeed():(t["5"]=!0,c?.fail());let a=b("Validating import alias.",{silent:e.silent}).start();return i?.aliasPrefix?a?.succeed():(t["6"]=!0,a?.fail()),Object.keys(t).length>0&&(t["5"]&&(l.break(),l.error(`No Tailwind CSS configuration found at ${d.info(e.cwd)}.`),l.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),l.error("Install Tailwind CSS then try again."),i?.framework.links.tailwind&&l.error(`Visit ${d.info(i?.framework.links.tailwind)} to get started.`)),t["6"]&&(l.break(),l.error(`Could not find valid path aliases or package imports for ${d.info("init")}.`),l.error(`Configure path aliases in ${d.info("tsconfig.json")} or imports in ${d.info("package.json")}, then run ${d.info("init")} again.`),l.error(`Learn more at ${d.info(`${S}/docs/installation/manual#configure-import-aliases`)}.`)),l.break(),process.exit(1)),{errors:t,projectInfo:i}}var ys=["nova","vega","maia","lyra","mira","luma","sera","rhea"],jr=["neutral","stone","zinc","gray","mauve","olive","mist","taupe"],Gt=["neutral","stone","zinc","gray","amber","blue","cyan","emerald","fuchsia","green","indigo","lime","orange","pink","purple","red","rose","sky","teal","violet","yellow","mauve","olive","mist","taupe"],ws=Gt,sn={neutral:"blue",stone:"lime",zinc:"amber",mauve:"emerald",olive:"violet",mist:"rose",taupe:"cyan"},Tr=["lucide","hugeicons","tabler","phosphor","remixicon"],Ht=["inter","noto-sans","nunito-sans","figtree","roboto","raleway","dm-sans","public-sans","outfit","jetbrains-mono","geist","geist-mono","lora","merriweather","playfair-display","noto-serif","roboto-slab","oxanium","manrope","space-grotesk","montserrat","ibm-plex-sans","source-sans-3","instrument-sans","eb-garamond","instrument-serif"],Fr=["inherit",...Ht],bs=["default","none","small","medium","large"],Or=["subtle","bold"],Ar=["default","inverted","default-translucent","inverted-translucent"],an=[{key:"menuColor",values:Ar,bits:3},{key:"menuAccent",values:Or,bits:3},{key:"radius",values:bs,bits:4},{key:"font",values:Ht,bits:6},{key:"iconLibrary",values:Tr,bits:6},{key:"theme",values:Gt,bits:6},{key:"baseColor",values:jr,bits:6},{key:"style",values:ys,bits:6}],Nr=[...an,{key:"chartColor",values:ws,bits:6},{key:"fontHeading",values:Fr,bits:5}],ks=Object.fromEntries(Nr.map(e=>[e.key,e.values[0]])),Lr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",vs="b",ln=["a","b"];function Cs(e){if(e===0)return"0";let t="",r=e;for(;r>0;)t=Lr[r%62]+t,r=Math.floor(r/62);return t}function Rs(e){let t=0;for(let r=0;r<e.length;r++){let o=Lr.indexOf(e[r]);if(o===-1)return-1;t=t*62+o}return t}function cn(e){let t={...ks,...e},r=0,o=0;for(let n of Nr){let i=n.values.indexOf(t[n.key]);r+=(i===-1?0:i)*2**o,o+=n.bits}return vs+Cs(r)}function Ke(e){if(!e||e.length<2)return null;let t=e[0];if(!ln.includes(t))return null;let r=t==="a"?an:Nr,o=Rs(e.slice(1));if(o<0)return null;let n={},i=0;for(let s of r){let c=Math.floor(o/2**i)%2**s.bits;n[s.key]=c<s.values.length?s.values[c]:s.values[0],i+=s.bits}return t==="a"&&(n.fontHeading="inherit"),n}function Ye(e){if(!e||e.length<2||e.length>10||!ln.includes(e[0]))return!1;for(let t=1;t<e.length;t++)if(Lr.indexOf(e[t])===-1)return!1;return!0}import xs from"path";async function fn(e,t){let r=new Set,o=new Set,n=[...e];for(;n.length>0;){let i=n.shift();if(o.has(i))continue;o.add(i);let{registry:s}=Tt(i);s&&!re[s]&&r.add(s);try{let[c]=await Wo([i],t,{useCache:!0});if(c?.registryDependencies)for(let a of c.registryDependencies){let{registry:f}=Tt(a);f&&!re[f]&&r.add(f),o.has(a)||n.push(a)}}catch(c){if(c instanceof xo){let{registry:a}=Tt(i);a&&!re[a]&&r.add(a);continue}continue}}return Array.from(r)}import Ss from"fs-extra";async function G(e,t,r={}){r={silent:!1,writeFile:!0,...r};let n=(await fn(e,t)).filter(f=>!t.registries?.[f]&&!Object.keys(re).includes(f));if(n.length===0)return{config:t,newRegistries:[]};let i=await Yo({useCache:process.env.NODE_ENV!=="development"});if(!i)return{config:t,newRegistries:[]};let s={};for(let f of n)i[f]&&(s[f]=i[f]);if(Object.keys(s).length===0)return{config:t,newRegistries:[]};let c=Object.fromEntries(Object.entries(t.registries||{}).filter(([f])=>!Object.keys(re).includes(f))),a={...t,registries:{...c,...s}};if(r.writeFile){let{resolvedPaths:f,...m}=a,p=b("Updating components.json.",{silent:r.silent}).start(),u=z.parse(m);await Ss.writeFile(xs.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
6
+ `,"utf-8"),p.succeed()}return{config:a,newRegistries:Object.keys(s)}}import Is from"open";import mn from"prompts";var Z={nova:{title:"Nova",description:"Lucide / Geist",style:"nova",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"geist",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},vega:{title:"Vega",description:"Lucide / Inter",style:"vega",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},maia:{title:"Maia",description:"Hugeicons / Figtree",style:"maia",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"figtree",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},lyra:{title:"Lyra",description:"Phosphor / JetBrains Mono",style:"lyra",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"phosphor",font:"jetbrains-mono",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},mira:{title:"Mira",description:"Hugeicons / Inter",style:"mira",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},luma:{title:"Luma",description:"Lucide / Inter",style:"luma",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},sera:{title:"Sera",description:"Lucide / Noto Sans + Playfair Display",style:"sera",baseColor:"taupe",theme:"taupe",chartColor:"taupe",iconLibrary:"lucide",font:"noto-sans",fontHeading:"playfair-display",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},rhea:{title:"Rhea",description:"Lucide / Inter",style:"rhea",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1}};function _r(e){let t=new URL(`${S}/create`),{rtl:r,pointer:o,...n}=e??{};for(let[i,s]of Object.entries(n))s!==void 0&&t.searchParams.set(i,String(s));return r&&t.searchParams.set("rtl","true"),o&&t.searchParams.set("pointer","true"),t.toString()}async function Vr(e){if(l.break(),l.log(` Build your custom preset on ${d.info(e.createUrl)}`),l.log(` ${e.followUp}`),l.break(),e.prompt===!1)return;let{proceed:t}=await mn({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});t&&await Is(e.createUrl)}function he(e,t){let r=new URLSearchParams({base:"base",style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,font:e.font,rtl:String(e.rtl??!1),menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return e.chartColor&&e.chartColor!=="neutral"&&r.set("chartColor",e.chartColor),e.fontHeading&&e.fontHeading!=="inherit"&&r.set("fontHeading",e.fontHeading),t?.preset&&r.set("preset",t.preset),t?.template&&r.set("template",t.template),t?.only&&r.set("only",t.only),t?.pointer&&r.set("pointer","true"),r.set("track","1"),`${S}/init?${r.toString()}`}async function qe(){return"base"}async function ct(e){let t=Object.entries(Z),{selectedPreset:r}=await mn({type:"select",name:"selectedPreset",message:`Which ${d.info("preset")} would you like to use?`,choices:[...t.map(([n,i])=>({title:i.title,description:i.description,value:n})),{title:"Custom",description:`Build your own at ${d.info(`${S}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let n=_r({command:"init",rtl:e.rtl,pointer:e.pointer,base:e.base,...e.template&&{template:e.template}});await Vr({createUrl:n,followUp:`Then ${d.info("copy and run the command")} from loveui.dev.`}),process.exit(0)}let o=Z[r];return o||process.exit(1),{url:he({...o,base:e.base,rtl:e.rtl},{template:e.template,pointer:e.pointer}),base:e.base}}async function Te(e,t,r){let o=L(Je({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:n}=await G([e],o,{silent:!0,writeFile:!1});o=n,Bo(e,o);let[i]=await ie([e],{config:o,useCache:!0}),s=i?.type==="registry:base"&&i.config?i.config:void 0,c=e;if(Ps(e)){let a=new URL(e);a.searchParams.delete("track"),c=a.toString()}return{registryBaseConfig:s,installStyleIndex:i?.extends!=="none",url:c}}function Ps(e){try{return new URL(e).pathname==="/init"&&e.startsWith(S)}catch{return!1}}import Pn from"dedent";import $s from"os";import me from"path";import{execa as Fe}from"execa";import V from"fs-extra";var Es=process.env.LOVEUI_GITHUB_URL??"https://github.com/loveconnor/loveui.git";function X(e){return{...e,frameworks:e.frameworks??[],scaffold:e.scaffold??un({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??Os}}function Oe(e,{monorepo:t}){if(!t||!e.monorepo)return e;let r=e.monorepo,o={...e,templateDir:r.templateDir,defaultProjectName:r.defaultProjectName??r.templateDir,init:r.init??e.init,files:r.files??e.files};return o.scaffold=un({title:e.title,templateDir:r.templateDir}),o}function js(e){switch(e){case"pnpm":return["--no-frozen-lockfile"];case"yarn":return["--no-immutable"];default:return[]}}async function Ts(e,t){if(t==="pnpm")return;let r=me.join(e,"pnpm-workspace.yaml"),o=me.join(e,"package.json"),n=me.join(e,"pnpm-lock.yaml");V.existsSync(n)&&await V.remove(n);let i=V.existsSync(r),s=i?Ro(await V.readFile(r,"utf8")):[],c=s.length>0;if(V.existsSync(o)){let a=await V.readFile(o,"utf8"),f=JSON.parse(a);c?f.packageManager=await Fs(t):delete f.packageManager,c&&(f.workspaces=s),await V.writeFile(o,JSON.stringify(f,null,2)+`
7
+ `)}i&&await V.remove(r),c&&t==="npm"&&await pn(e)}async function Fs(e){try{let{stdout:t}=await Fe(e,["--version"]);return`${e}@${t.trim()}`}catch{return`${e}@*`}}async function pn(e){let t=await V.readdir(e,{withFileTypes:!0});for(let r of t){if(r.name==="node_modules")continue;let o=me.join(e,r.name);if(r.isDirectory())await pn(o);else if(r.name==="package.json"){let n=await V.readFile(o,"utf8");if(!n.includes("workspace:"))continue;let i=JSON.parse(n),s=!1;for(let c of["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let a=i[c];if(a)for(let[f,m]of Object.entries(a))typeof m=="string"&&m.startsWith("workspace:")&&(a[f]="*",s=!0)}s&&await V.writeFile(o,JSON.stringify(i,null,2)+`
8
+ `)}}}function un({title:e,templateDir:t}){return async({projectPath:r,packageManager:o})=>{let n=b(`Creating a new ${e} project. This may take a few minutes.`).start();try{let i=process.env.LOVEUI_TEMPLATE_DIR;if(i){let f=me.resolve(i,t);await V.copy(f,r,{filter:m=>!m.includes("node_modules")})}else{let f=me.join($s.tmpdir(),`love-ui-template-${Date.now()}`);await Fe("git",["clone","--depth","1","--filter=blob:none","--sparse",Es,f]),await Fe("git",["-C",f,"sparse-checkout","set",`templates/${t}`]);let m=me.resolve(f,"templates",t);await V.move(m,r),await V.remove(f)}await Ts(r,o);let c=["install",...js(o)];await Fe(o,c,{cwd:r});let a=me.join(r,"package.json");if(V.existsSync(a)){let f=await V.readFile(a,"utf8"),m=JSON.parse(f);m.name=me.basename(r),await V.writeFile(a,JSON.stringify(m,null,2)+`
9
+ `)}n?.succeed(`Creating a new ${e} project.`)}catch(i){n?.fail(`Something went wrong creating a new ${e} project.`),R(i)}}}async function Os({projectPath:e}){try{await Fe("git",["init"],{cwd:e}),await Fe("git",["add","-A"],{cwd:e}),await Fe("git",["commit","-m","feat: initial commit"],{cwd:e})}catch{}}import Xt from"path";import ke from"path";var dn={"--font-heading":"cn-font-heading"};function As(e){return e.startsWith("--")?e:`--${e}`}function Ae(e){let t=new Set;for(let r of e){for(let o of r.fonts??[]){let n=o.font?.variable;if(!n)continue;let i=dn[n];i&&t.add(i)}for(let o of Object.values(r.cssVars??{}))for(let n of Object.keys(o??{})){let i=dn[As(n)];i&&t.add(i)}}return Array.from(t)}import Ze from"path";function gn(e,t){if(e.includes("\0"))return!1;let r;try{r=e;let u="";for(;r!==u&&r.includes("%");)u=r,r=decodeURIComponent(r)}catch{return!1}let o=Ze.normalize(r.replace(/\\/g,"/")),n=Ze.normalize(t),i=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(i(o)||i(r)||i(e))return!1;let s=u=>u.replace(/\[\.\.\..*?\]/g,""),c=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(c)||u.test(a))||(e.includes("~")||r.includes("~"))&&(e.includes("../")||r.includes("../")))return!1;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(t.toLowerCase()):!1;if(Ze.isAbsolute(o))return o.startsWith(n+Ze.sep);let p=Ze.resolve(n,o);return p.startsWith(n+Ze.sep)||p===n}import{promises as kn}from"fs";import Hs from"path";import{promises as hn}from"fs";import Ns from"path";import N from"postcss";import Ls from"postcss/lib/at-rule";import{z as ye}from"zod";async function Kt(e,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:!1,silent:!1,tailwindVersion:"v3",overwriteCssVars:!1,...r};let o=t.resolvedPaths.tailwindCss,n=Ns.relative(t.resolvedPaths.cwd,o),i=b(`Updating CSS variables in ${d.info(n)}`,{silent:r.silent}).start(),s=await hn.readFile(o,"utf8"),c=await ft(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars});await hn.writeFile(o,c,"utf8"),i.succeed()}async function ft(e,t,r,o={cleanupDefaultNextStyles:!1,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:!1}){o={cleanupDefaultNextStyles:!1,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:!1,...o};let n=[_s(t)];o.cleanupDefaultNextStyles&&n.push(wn()),o.tailwindVersion==="v4"&&(n=[],n.push(Ms({params:"dark (&:is(.dark *))"})),o.cleanupDefaultNextStyles&&n.push(wn()),n.push(Ds(t,{overwriteCssVars:o.overwriteCssVars})),n.push(Us(t)),o.tailwindConfig&&(n.push(Bs(o.tailwindConfig)),n.push(zs(o.tailwindConfig)),n.push(Ws(o.tailwindConfig))));let s=(await N(n).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),o.tailwindVersion==="v4"&&(s=s.replace(/(\n\s*\n)+/g,`
10
10
 
11
11
  `)),s}function _s(e){return{postcssPlugin:"update-css-vars",Once(t){let r=t.nodes.find(o=>o.type==="atrule"&&o.name==="layer"&&o.params==="base");r instanceof Ls||(r=N.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:!0,before:`
12
12
  `,between:" "}}),t.append(r),t.insertBefore(r,N.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([o,n])=>{let i=o==="light"?":root":`.${o}`;Vs(r,i,n)})}}}function yn(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector===":root");if(t){let r=["--background","--foreground"];t.nodes.filter(o=>o.type==="decl"&&r.includes(o.prop)).forEach(o=>o.remove()),t.nodes.length===0&&t.remove()}}function wn(){return{postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(o=>o.type==="rule"&&o.selector==="body");t&&(t.nodes.find(o=>o.type==="decl"&&o.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(o.value))?.remove(),t.nodes.find(o=>o.type==="decl"&&o.prop==="background"&&(o.value.startsWith("linear-gradient")||o.value==="var(--background)"))?.remove(),t.nodes.find(o=>o.type==="decl"&&o.prop==="font-family"&&o.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),yn(e);let r=e.nodes.find(o=>o.type==="atrule"&&o.params==="(prefers-color-scheme: dark)");r&&(yn(r),r.nodes.length===0&&r.remove())}}}function Vs(e,t,r){let o=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);o||Object.keys(r).length>0&&(o=N.rule({selector:t,raws:{between:" ",before:`
@@ -18,32 +18,32 @@ Once configured, you can use the cli to add components.`),l.break(),process.exit
18
18
  `}});for(let[f,m]of Object.entries(c.data)){let p=N.rule({selector:f,nodes:Object.entries(m).map(([u,h])=>N.decl({prop:u,value:h,raws:{semicolon:!0,before:`
19
19
  `,between:": "}})),raws:{semicolon:!0,between:" ",before:`
20
20
  `}});a.append(p)}r.append(a),r.insertBefore(a,N.comment({text:"---break---"}))}}}}function zs(e){return{postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Yt(t),o=r.nodes?.filter(i=>i.type==="decl"&&i.prop.startsWith("--animate-")),n=ye.record(ye.string(),ye.string()).safeParse(e.theme.extend.animation);if(n.success)for(let[i,s]of Object.entries(n.data)){let c=`--animate-${i}`;if(o?.find(f=>f.prop===c))continue;let a=N.decl({prop:c,value:s,raws:{semicolon:!0,between:": ",before:`
21
- `}});r.append(a)}}}}function Js(e){return e.nodes[0].toString().includes("'")?"single":"double"}function bn(e){if(e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch"))return!1;let t=e.split(" ");return t.length===3&&t.slice(1,3).every(r=>r.includes("%"))}function Gs(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}import P from"postcss";import{twMerge as Ks}from"tailwind-merge";async function mt(e,t,r){let o=e&&Object.keys(e).length>0,n=Object.keys(r.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!o&&!n)return;r={silent:!1,...r};let i=t.resolvedPaths.tailwindCss,s=Hs.relative(t.resolvedPaths.cwd,i),c=b(`Updating ${d.info(s)}`,{silent:r.silent}).start(),a=await kn.readFile(i,"utf8");n&&(a=await ft(a,r.cssVars,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars})),o&&(a=await Ur(a,e)),await kn.writeFile(i,a,"utf8"),c.succeed()}async function Ur(e,t){let r=[Ys(t)],o=await P(r).process(e,{from:void 0}),n=o.css,i=o.root;if(i.nodes&&i.nodes.length>0){let s=i.nodes[i.nodes.length-1];s.type==="atrule"&&!s.nodes&&!n.trimEnd().endsWith(";")&&(n=n.trimEnd()+";")}return n=n.replace(/\/\* ---break--- \*\//g,""),n=n.replace(/(\n\s*\n)+/g,`
21
+ `}});r.append(a)}}}}function Js(e){return e.nodes[0].toString().includes("'")?"single":"double"}function bn(e){if(e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch"))return!1;let t=e.split(" ");return t.length===3&&t.slice(1,3).every(r=>r.includes("%"))}function Gs(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}import P from"postcss";import{twMerge as Ks}from"tailwind-merge";async function mt(e,t,r){let o=e&&Object.keys(e).length>0,n=Object.keys(r.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!o&&!n)return;r={silent:!1,...r};let i=t.resolvedPaths.tailwindCss,s=Hs.relative(t.resolvedPaths.cwd,i),c=b(`Updating ${d.info(s)}`,{silent:r.silent}).start(),a=await kn.readFile(i,"utf8");n&&(a=await ft(a,r.cssVars,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars})),o&&(a=await Dr(a,e)),await kn.writeFile(i,a,"utf8"),c.succeed()}async function Dr(e,t){let r=[Ys(t)],o=await P(r).process(e,{from:void 0}),n=o.css,i=o.root;if(i.nodes&&i.nodes.length>0){let s=i.nodes[i.nodes.length-1];s.type==="atrule"&&!s.nodes&&!n.trimEnd().endsWith(";")&&(n=n.trimEnd()+";")}return n=n.replace(/\/\* ---break--- \*\//g,""),n=n.replace(/(\n\s*\n)+/g,`
22
22
 
23
23
  `),n=n.trimEnd(),n}function Ys(e){return{postcssPlugin:"update-css",Once(t){for(let[r,o]of Object.entries(e))if(r.startsWith("@")){let n=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!n)continue;let[,i,s]=n;if(i==="import"){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name==="import"&&a.params===s)){let a=P.atRule({name:"import",params:s,raws:{semicolon:!0}}),f=t.nodes?.filter(m=>m.type==="atrule"&&m.name==="import");if(f&&f.length>0){let m=f[f.length-1];a.raws.before=`
24
24
  `,t.insertAfter(m,a)}else!t.nodes||t.nodes.length,a.raws.before="",t.prepend(a)}}else if(i==="plugin"){let c=s;s&&!s.startsWith('"')&&!s.startsWith("'")&&(c=`"${s}"`);let a=m=>m.startsWith('"')&&m.endsWith('"')||m.startsWith("'")&&m.endsWith("'")?m.slice(1,-1):m;if(!t.nodes?.find(m=>m.type!=="atrule"||m.name!=="plugin"?!1:a(m.params)===a(s))){let m=P.atRule({name:"plugin",params:c,raws:{semicolon:!0,before:`
25
25
  `}}),p=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="import"),u=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="plugin");if(u&&u.length>0){let h=u[u.length-1];t.insertAfter(h,m)}else if(p&&p.length>0){let h=p[p.length-1];t.insertAfter(h,m),t.insertBefore(m,P.comment({text:"---break---"})),t.insertAfter(m,P.comment({text:"---break---"}))}else t.prepend(m),t.insertBefore(m,P.comment({text:"---break---"})),t.insertAfter(m,P.comment({text:"---break---"}))}}else if(typeof o=="object"&&Object.keys(o).length===0){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name===i&&a.params===s)){let a=P.atRule({name:i,params:s,raws:{semicolon:!0}});t.append(a),t.insertBefore(a,P.comment({text:"---break---"}))}}else if(i==="keyframes"){let c=t.nodes?.find(m=>m.type==="atrule"&&m.name==="theme"&&m.params==="inline");c||(c=P.atRule({name:"theme",params:"inline",raws:{semicolon:!0,between:" ",before:`
26
26
  `}}),t.append(c),t.insertBefore(c,P.comment({text:"---break---"})));let a=c.nodes?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===s),f;if(a?(f=P.atRule({name:"keyframes",params:s,raws:{semicolon:!0,between:" ",before:`
27
27
  `}}),a.replaceWith(f)):(f=P.atRule({name:"keyframes",params:s,raws:{semicolon:!0,between:" ",before:`
28
- `}}),c.append(f)),typeof o=="object")for(let[m,p]of Object.entries(o))Le(f,m,p)}else if(i==="utility"){let c=t.nodes?.find(a=>a.type==="atrule"&&a.name===i&&a.params===s);if(c){if(typeof o=="object")for(let[a,f]of Object.entries(o))if(typeof f=="string"){let m=c.nodes?.find(u=>u.type==="decl"&&u.prop===a),p=P.decl({prop:a,value:f,raws:{semicolon:!0,before:`
28
+ `}}),c.append(f)),typeof o=="object")for(let[m,p]of Object.entries(o))Ne(f,m,p)}else if(i==="utility"){let c=t.nodes?.find(a=>a.type==="atrule"&&a.name===i&&a.params===s);if(c){if(typeof o=="object")for(let[a,f]of Object.entries(o))if(typeof f=="string"){let m=c.nodes?.find(u=>u.type==="decl"&&u.prop===a),p=P.decl({prop:a,value:f,raws:{semicolon:!0,before:`
29
29
  `}});m?m.replaceWith(p):c.append(p)}else if(a.startsWith("@")&&typeof f=="object"&&f!==null&&Object.keys(f).length===0){let m=a.match(/@([a-zA-Z-]+)\s*(.*)/);if(m){let[,p,u]=m;if(!c.nodes?.find(g=>g.type==="atrule"&&g.name===p&&g.params===u)){let g=P.atRule({name:p,params:u,raws:{semicolon:!0,before:`
30
- `}});c.append(g)}}}else typeof f=="object"&&Le(c,a,f)}else{let a=P.atRule({name:i,params:s,raws:{semicolon:!0,between:" ",before:`
30
+ `}});c.append(g)}}}else typeof f=="object"&&Ne(c,a,f)}else{let a=P.atRule({name:i,params:s,raws:{semicolon:!0,between:" ",before:`
31
31
  `}});if(t.append(a),t.insertBefore(a,P.comment({text:"---break---"})),typeof o=="object")for(let[f,m]of Object.entries(o))if(typeof m=="string"){let p=P.decl({prop:f,value:m,raws:{semicolon:!0,before:`
32
32
  `}});a.append(p)}else if(f.startsWith("@")&&typeof m=="object"&&m!==null&&Object.keys(m).length===0){let p=f.match(/@([a-zA-Z-]+)\s*(.*)/);if(p){let[,u,h]=p;if(!a.nodes?.find(y=>y.type==="atrule"&&y.name===u&&y.params===h)){let y=P.atRule({name:u,params:h,raws:{semicolon:!0,before:`
33
- `}});a.append(y)}}}else typeof m=="object"&&Le(a,f,m)}}else i==="property"?Le(t,r,o):vn(t,i,s,o)}else Le(t,r,o)}}}function vn(e,t,r,o){let n=e.nodes?.find(i=>i.type==="atrule"&&i.name===t&&i.params===r);if(n||(n=P.atRule({name:t,params:r,raws:{semicolon:!0,between:" ",before:`
34
- `}}),e.append(n),e.insertBefore(n,P.comment({text:"---break---"}))),typeof o=="object")for(let[i,s]of Object.entries(o))if(i.startsWith("@")){let c=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(c){let[,a,f]=c;vn(n,a,f,s)}}else Le(n,i,s);else if(typeof o=="string")try{let s=P.parse(`.temp{${o}}`).first;if(s&&s.nodes){let c=P.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
33
+ `}});a.append(y)}}}else typeof m=="object"&&Ne(a,f,m)}}else i==="property"?Ne(t,r,o):vn(t,i,s,o)}else Ne(t,r,o)}}}function vn(e,t,r,o){let n=e.nodes?.find(i=>i.type==="atrule"&&i.name===t&&i.params===r);if(n||(n=P.atRule({name:t,params:r,raws:{semicolon:!0,between:" ",before:`
34
+ `}}),e.append(n),e.insertBefore(n,P.comment({text:"---break---"}))),typeof o=="object")for(let[i,s]of Object.entries(o))if(i.startsWith("@")){let c=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(c){let[,a,f]=c;vn(n,a,f,s)}}else Ne(n,i,s);else if(typeof o=="string")try{let s=P.parse(`.temp{${o}}`).first;if(s&&s.nodes){let c=P.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
35
35
  `}});s.nodes.forEach(a=>{if(a.type==="decl"){let f=a.clone();f.raws.before=`
36
- `,c.append(f)}}),c.nodes?.length&&n.append(c)}}catch(i){throw console.error("Error parsing at-rule content:",o,i),i}}function Le(e,t,r){let o=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);if(o||(o=P.rule({selector:t,raws:{semicolon:!0,between:" ",before:`
36
+ `,c.append(f)}}),c.nodes?.length&&n.append(c)}}catch(i){throw console.error("Error parsing at-rule content:",o,i),i}}function Ne(e,t,r){let o=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);if(o||(o=P.rule({selector:t,raws:{semicolon:!0,between:" ",before:`
37
37
  `}}),e.append(o)),typeof r=="object"){for(let[n,i]of Object.entries(r))if(n.startsWith("@")&&typeof i=="object"&&i!==null&&Object.keys(i).length===0){let s=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,a]=s;if(!o.nodes?.find(m=>m.type==="atrule"&&m.name===c&&m.params===a)){if(c==="apply"){let p=o.nodes?.find(u=>u.type==="atrule"&&u.name==="apply");if(p){p.params=Ks(p.params,a);continue}}let m=P.atRule({name:c,params:a,raws:{semicolon:!0,before:`
38
38
  `}});o.append(m)}}}else if(typeof i=="string"){let s=P.decl({prop:n,value:i,raws:{semicolon:!0,before:`
39
- `}}),c=o.nodes?.find(a=>a.type==="decl"&&a.prop===n);c?c.replaceWith(s):o.append(s)}else if(typeof i=="object"){let s=n.startsWith("&")?t.replace(/^([^:]+)/,`$1${n.substring(1)}`):n;Le(e,s,i)}}else if(typeof r=="string")try{let i=P.parse(`.temp{${r}}`).first;i&&i.nodes&&i.nodes.forEach(s=>{if(s.type==="decl"){let c=s.clone();c.raws.before=`
39
+ `}}),c=o.nodes?.find(a=>a.type==="decl"&&a.prop===n);c?c.replaceWith(s):o.append(s)}else if(typeof i=="object"){let s=n.startsWith("&")?t.replace(/^([^:]+)/,`$1${n.substring(1)}`):n;Ne(e,s,i)}}else if(typeof r=="string")try{let i=P.parse(`.temp{${r}}`).first;i&&i.nodes&&i.nodes.forEach(s=>{if(s.type==="decl"){let c=s.clone();c.raws.before=`
40
40
  `,o?.append(c)}})}catch(n){throw console.error("Error parsing rule content:",t,r,n),n}}import{execa as we}from"execa";import qs from"prompts";var Zs=/^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/i;async function D(e,t,r,o){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;o={silent:!1,...o};let n=b("Installing dependencies.",{silent:o.silent})?.start(),i=await Qs(r),s="";if(Xs(r)&&i==="npm")if(o.silent)s="force";else{n.stopAndPersist(),l.warn(`
41
41
  It looks like you are using React 19.
42
42
  Some packages may fail to install due to peer dependency issues in npm (see ${S}/react-19).
43
- `);let c=await qs([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);c&&(s=c.flag)}n?.start(),await ea(i,e,t,r.resolvedPaths.cwd,s),n?.succeed()}function Xs(e){let t=je(e.resolvedPaths.cwd,!1);if(!t?.dependencies?.react)return!1;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),o=t.dependencies["react-day-picker"]?.startsWith("8");return r&&o}async function Qs(e){return je(e.resolvedPaths.cwd,!1)?.dependencies?.expo?"expo":ce(e.resolvedPaths.cwd)}async function ea(e,t,r,o,n){if(e==="npm")return ta(t,r,o,n);if(e==="deno")return ra(t,r,o);if(e==="expo")return oa(t,r,o);t?.length&&await we(e,["add",...t],{cwd:o}),r?.length&&await we(e,["add","-D",...r],{cwd:o})}async function ta(e,t,r,o){let n=e.map(Cn),i=t.map(Cn);n.length&&await we("npm",["install",...o?[`--${o}`]:[],...n],{cwd:r}),i.length&&await we("npm",["install",...o?[`--${o}`]:[],"-D",...i],{cwd:r})}function Cn(e){return Zs.test(e)?`${e}@latest`:e}async function ra(e,t,r){e?.length&&await we("deno",["add",...e.map(o=>`npm:${o}`)],{cwd:r}),t?.length&&await we("deno",["add","-D",...t.map(o=>`npm:${o}`)],{cwd:r})}async function oa(e,t,r){e.length&&await we("npx",["expo","install",...e],{cwd:r}),t.length&&await we("npx",["expo","install","-- -D",...t],{cwd:r})}import{existsSync as na,promises as Mr}from"fs";import qt from"path";async function Br(e,t,r){if(!e||Object.keys(e).length===0)return{envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:!1,...r};let o=b("Adding environment variables.",{silent:r.silent})?.start(),n=t.resolvedPaths.cwd,i=qt.join(n,".env.local"),s=$o(n);s&&(i=s);let c=na(i),a=qt.basename(i),f=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
44
- `),m=[],p=null,u=null;if(c){let h=await Mr.readFile(i,"utf-8"),g=jo(h,f);if(m=Eo(h,f),m.length>0){if(await Mr.writeFile(i,g,"utf-8"),p=qt.relative(n,i),o?.succeed(`Added the following variables to ${d.info(a)}:`),!r.silent)for(let y of m)l.log(` ${d.success("+")} ${y}`)}else o?.stop()}else if(await Mr.writeFile(i,f+`
43
+ `);let c=await qs([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);c&&(s=c.flag)}n?.start(),await ea(i,e,t,r.resolvedPaths.cwd,s),n?.succeed()}function Xs(e){let t=Ee(e.resolvedPaths.cwd,!1);if(!t?.dependencies?.react)return!1;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),o=t.dependencies["react-day-picker"]?.startsWith("8");return r&&o}async function Qs(e){return Ee(e.resolvedPaths.cwd,!1)?.dependencies?.expo?"expo":ce(e.resolvedPaths.cwd)}async function ea(e,t,r,o,n){if(e==="npm")return ta(t,r,o,n);if(e==="deno")return ra(t,r,o);if(e==="expo")return oa(t,r,o);t?.length&&await we(e,["add",...t],{cwd:o}),r?.length&&await we(e,["add","-D",...r],{cwd:o})}async function ta(e,t,r,o){let n=e.map(Cn),i=t.map(Cn);n.length&&await we("npm",["install",...o?[`--${o}`]:[],...n],{cwd:r}),i.length&&await we("npm",["install",...o?[`--${o}`]:[],"-D",...i],{cwd:r})}function Cn(e){return Zs.test(e)?`${e}@latest`:e}async function ra(e,t,r){e?.length&&await we("deno",["add",...e.map(o=>`npm:${o}`)],{cwd:r}),t?.length&&await we("deno",["add","-D",...t.map(o=>`npm:${o}`)],{cwd:r})}async function oa(e,t,r){e.length&&await we("npx",["expo","install",...e],{cwd:r}),t.length&&await we("npx",["expo","install","-- -D",...t],{cwd:r})}import{existsSync as na,promises as Ur}from"fs";import qt from"path";async function Mr(e,t,r){if(!e||Object.keys(e).length===0)return{envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:!1,...r};let o=b("Adding environment variables.",{silent:r.silent})?.start(),n=t.resolvedPaths.cwd,i=qt.join(n,".env.local"),s=Po(n);s&&(i=s);let c=na(i),a=qt.basename(i),f=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
44
+ `),m=[],p=null,u=null;if(c){let h=await Ur.readFile(i,"utf-8"),g=Eo(h,f);if(m=$o(h,f),m.length>0){if(await Ur.writeFile(i,g,"utf-8"),p=qt.relative(n,i),o?.succeed(`Added the following variables to ${d.info(a)}:`),!r.silent)for(let y of m)l.log(` ${d.success("+")} ${y}`)}else o?.stop()}else if(await Ur.writeFile(i,f+`
45
45
  `,"utf-8"),u=qt.relative(n,i),m=Object.keys(e),o?.succeed(`Added the following variables to ${d.info(a)}:`),!r.silent)for(let h of m)l.log(` ${d.success("+")} ${h}`);return!r.silent&&m.length>0&&l.break(),{envVarsAdded:m,envFileUpdated:p,envFileCreated:u}}import{existsSync as ia,promises as Rn}from"fs";import sa from"path";import{Project as aa,ScriptKind as la,SyntaxKind as be,VariableDeclarationKind as ca}from"ts-morph";var fa=new Set(["--font-sans","--font-serif","--font-mono"]);async function ut(e,t){if(!e.fonts?.length)return e;let r=await F(t.resolvedPaths.cwd);if(!r)return e;e.cssVars??={},e.cssVars.theme??={};let o=r.framework.name==="next-app"||r.framework.name==="next-pages";for(let n of e.fonts)if(o)e.cssVars.theme[n.font.variable]=`var(${n.font.variable})`;else{let i=n.name.replace("font-",""),s=n.font.dependency??`@fontsource-variable/${i}`;e.dependencies??=[],e.dependencies.push(s),e.css??={},e.css[`@import "${s}"`]={},e.cssVars.theme[n.font.variable]=n.font.family}if(e.fonts.length>0){let n=new Map;for(let i of e.fonts){let s=i.font.selector??ga(i.font.variable);if(!s)continue;let c=i.font.variable.replace("--","");n.has(s)||n.set(s,[]),n.get(s).push(c)}e.css??={},e.css["@layer base"]??={};for(let[i,s]of Array.from(n.entries())){let c=s.join(" ");e.css["@layer base"][i]??={};let a=Object.keys(e.css["@layer base"][i]).find(f=>f.startsWith("@apply "));a?(delete e.css["@layer base"][i][a],e.css["@layer base"][i][`${a} ${c}`]={}):e.css["@layer base"][i][`@apply ${c}`]={}}}return e}async function dt(e,t,r){if(!e?.length)return;let o=await F(t.resolvedPaths.cwd);if(!o||o.framework.name!=="next-app"&&o.framework.name!=="next-pages")return;let n=b("Updating fonts.",{silent:r.silent})?.start();try{await ma(e,t,o),n?.succeed("Updating fonts.")}catch(i){throw n?.fail("Failed to update fonts."),i}}async function ma(e,t,r){let o=await pa(t,r);if(!o)return;let n=await Rn.readFile(o,"utf-8"),i=await ua(n,e,t);i!==n&&await Rn.writeFile(o,i,"utf-8")}async function pa(e,t){let r=e.resolvedPaths.cwd,o=t.isSrcDir,i=t.isTsx?"tsx":"jsx",s=o?[`src/app/layout.${i}`,`app/layout.${i}`]:[`app/layout.${i}`];for(let c of s){let a=sa.join(r,c);if(ia(a))return a}return null}async function ua(e,t,r){let n=new aa({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:la.TSX}),i=t.filter(p=>p.font.provider==="google"),s=[],c=[];for(let p of i){let u=p.font.import;if(!u)continue;let h=n.getImportDeclaration(x=>x.getModuleSpecifierValue()==="next/font/google"),g=!1;h?(g=h.getNamedImports().some(C=>C.getName()===u),g||h.addNamedImport(u)):n.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[u]});let y=ya(u,p.font.variable),k=da(p),v=ka(n,p.font.variable),I=y;if(!(g&&!v&&Zt(p.font.variable)&&!va(n,u))){if(v)v.setInitializer(`${u}(${k})`),v.getName()!==y&&v.rename(y),I=y;else{let x=Ca(n);n.insertVariableStatement(x,{declarationKind:ca.Const,declarations:[{name:y,initializer:`${u}(${k})`}]}).appendWhitespace(`
46
- `)}s.push(I),ha(p)&&c.push(p.font.variable.replace("--",""))}}let a=new Set(["font-sans","font-serif","font-mono"]),f=[...c].reverse().find(p=>a.has(p)),m=c.filter(p=>!a.has(p));return f&&m.unshift(f),s.length>0&&Ra(n,s,m,r),n.getFullText()}function da(e){let t={};return e.font.subsets?.length&&(t.subsets=e.font.subsets),e.font.weight?.length&&(t.weight=e.font.weight),t.variable=e.font.variable,JSON.stringify(t).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'")}function Zt(e){return fa.has(e)}function ga(e){return Zt(e)?"html":null}function ha(e){return!e.font.selector&&Zt(e.font.variable)}function ya(e,t){let r=wa(e);return Zt(t)?r:`${r}${ba(t.replace(/^--font-/,""))}`}function wa(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ba(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function ka(e,t){let r=e.getVariableStatements();for(let o of r)for(let n of o.getDeclarations()){let i=n.getInitializer();if(!i||i.getKind()!==be.CallExpression)continue;let c=i.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return n}return null}function va(e,t){let r=e.getVariableStatements();for(let o of r)for(let n of o.getDeclarations()){let i=n.getInitializer();if(!i||i.getKind()!==be.CallExpression)continue;let s=i;if(s.getExpression().getText()!==t)continue;let c=s.getArguments();if(!c.length)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes("--font-heading"))return!0}return!1}function Ca(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Ra(e,t,r,o){let n=e.getDescendantsOfKind(be.JsxOpeningElement);for(let i of n){if(i.getTagNameNode().getText()!=="html")continue;let c=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),f=[...c,...a],m=i.getAttribute("className");if(!m){pt(e,o),i.addAttribute({name:"className",initializer:`{cn(${f.join(", ")})}`});return}if(m.getKind()!==be.JsxAttribute)return;let p=m.asKindOrThrow(be.JsxAttribute),u=p.getInitializer();if(!u)return;if(u.getKind()===be.StringLiteral){let h=u.getText().slice(1,-1);pt(e,o),p.setInitializer(`{cn("${h}", ${f.join(", ")})}`)}else if(u.getKind()===be.JsxExpression){let h=u.asKindOrThrow(be.JsxExpression),g=h.getExpression();if(!g)return;let y=g.getText();if(y.startsWith("cn(")){let k=a.every($=>y.includes($)),v=r.every($=>y.includes(`"${$}"`)),I=["font-sans","font-serif","font-mono"].filter($=>!r.includes($)).some($=>y.includes(`"${$}"`));if(k&&v&&!I)continue;let x=Sa(y,a);x=Ia(x);let C=Pa(x,f);h.replaceWithText(`{${C}}`)}else if(/^\w+\.variable$/.test(y)){if(a.includes(y)&&r.length===0)continue;pt(e,o);let v=(y.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(v?`{cn(${y}, ${f.join(", ")})}`:`{cn(${f.join(", ")})}`)}else if(y.startsWith("`")&&y.endsWith("`")){let k=xa(y);pt(e,o);let v=new Set(f),I=new Set(["font-sans","font-serif","font-mono"].map(C=>`"${C}"`)),x=k.filter(C=>!v.has(C)&&!I.has(C));h.replaceWithText(`{cn(${[...x,...f].join(", ")})}`)}else pt(e,o),h.replaceWithText(`{cn(${y}, ${f.join(", ")})}`)}}}function pt(e,t){if(!e.getImportDeclaration(o=>o.getNamedImports().some(i=>i.getName()==="cn"))){let o=e.getImportDeclaration(n=>n.getModuleSpecifierValue().includes("/lib/utils"));o?o.getNamedImports().some(i=>i.getName()==="cn")||o.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]})}}function xa(e){let t=[],r=[],n=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let i of n)if(i)if(i.startsWith("${")&&i.endsWith("}")){let s=i.slice(2,-1).trim();s&&r.push(s)}else{let s=i.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`)}return[...t,...r]}function Sa(e,t){let r=e;for(let o of t)r=r.replace(new RegExp(`,?\\s*${o.replace(".","\\.")}`,"g"),"").replace(/cn\(\s*,/,"cn(");return r}function Ia(e){let t=e;for(let r of["font-sans","font-serif","font-mono"])t=t.replace(new RegExp(`,?\\s*"${r}"`,"g"),"").replace(/cn\(\s*,/,"cn(");return t}function Pa(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}import{z as $a}from"zod";async function pe(e,t,r){r={overwrite:!1,silent:!1,isNewProject:!1,...r};let o=await ze(t);return o&&o.ui&&o.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await ja(e,t,o,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Ea(e,t,{...r,skipFonts:r.skipFonts})}async function Ea(e,t,r){if(!e.length)return;let o=b("Checking registry.",{silent:r.silent})?.start(),n=await le(e,L(t));if(!n)return o?.fail(),R(new Error("Failed to fetch components from registry."));try{Sn(n.files??[],t.resolvedPaths.cwd)}catch(a){return o?.fail(),R(a)}o?.succeed();let i=await lt(t);r.skipFonts||(n=await ut(n,t));let s=Ne([n]);await D(n.dependencies,n.devDependencies,t,{silent:r.silent}),await Ir(n.tailwind?.config,t,{silent:r.silent,tailwindVersion:i}),await Br(n.envVars,t,{silent:r.silent}),r.skipFonts||await dt(n.fonts,t,{silent:r.silent}),await xr(n.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let c=n.cssVars?r.overwriteCssVars??await xn(e,t):void 0;await mt(n.css,t,{silent:r.silent,cssVars:n.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:c,tailwindVersion:i,tailwindConfig:n.tailwind?.config}),n.docs&&l.info(n.docs)}async function ja(e,t,r,o){if(!e.length)return;let n=b("Checking registry.",{silent:o.silent})?.start(),i=await le(e,L(t));if(!i)return n?.fail(),R(new Error("Failed to fetch components from registry."));try{Sn(i.files??[],t.resolvedPaths.cwd)}catch(E){return n?.fail(),R(E)}n?.succeed();let s=[],c=[],a=[],f=b("Installing components.")?.start(),m=r.ui,p=await lt(m),u=Sr(t.resolvedPaths.cwd,m.resolvedPaths.ui);i=await ut(i,t);let h=Ne([i]);await D(i.dependencies,i.devDependencies,m,{silent:!0}),i.tailwind?.config&&(await Ir(i.tailwind?.config,m,{silent:!0,tailwindVersion:p}),c.push(ke.relative(u,m.resolvedPaths.tailwindConfig))),i.envVars&&await Br(i.envVars,m,{silent:!0}),await dt(i.fonts,t,{silent:!0});let g=["components","ui","lib","hooks"],y=new Map,k={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"},v=E=>g.includes(E),I=E=>{let se=E?.match(/^@([^/]+)\//);return se&&v(se[1])?se[1]:null},x=E=>I(E.target)??k[E.type||"registry:ui"]??"components",C=E=>E&&r[E]?r[E]:t;for(let E of i.files??[]){let se=x(E);y.has(se)||y.set(se,[]),y.get(se).push(E)}for(let E of Array.from(y.keys())){let se=y.get(E),Be=C(E),gs=(i.files??[]).filter(Ee=>C(x(Ee)).resolvedPaths.cwd===Be.resolvedPaths.cwd),Et=Sr(t.resolvedPaths.cwd,Be.resolvedPaths.ui||Be.resolvedPaths.cwd),vr=await Bo(Et,Be.resolvedPaths.cwd)??Be.resolvedPaths.cwd,Cr=await xr(se,Be,{overwrite:o.overwrite,silent:!0,rootSpinner:f,isRemote:o.isRemote,isWorkspace:!0,path:o.path,plannedFiles:gs,supportedFontMarkers:h});s.push(...Cr.filesCreated.map(Ee=>ke.relative(Et,ke.join(vr,Ee)))),c.push(...Cr.filesUpdated.map(Ee=>ke.relative(Et,ke.join(vr,Ee)))),a.push(...Cr.filesSkipped.map(Ee=>ke.relative(Et,ke.join(vr,Ee))))}let $=i.cssVars?o.overwriteCssVars??await xn(e,t):void 0;await mt(i.css,m,{silent:!0,cssVars:i.cssVars,overwriteCssVars:$,tailwindVersion:p,tailwindConfig:i.tailwind?.config}),(i.cssVars||i.css)&&c.push(ke.relative(u,m.resolvedPaths.tailwindCss)),f?.succeed();let U=Array.from(new Set(s)).sort(),Y=Array.from(new Set(c.filter(E=>!s.includes(E)))).sort(),$e=Array.from(new Set(a)).sort();if(!(U.length||Y.length)&&!$e.length&&b("No files updated.",{silent:o.silent})?.info(),U.length){b(`Created ${U.length} ${U.length===1?"file":"files"}:`,{silent:o.silent})?.succeed();for(let E of U)l.log(` - ${E}`)}if(Y.length){b(`Updated ${Y.length} ${Y.length===1?"file":"files"}:`,{silent:o.silent})?.info();for(let E of Y)l.log(` - ${E}`)}if($e.length){b(`Skipped ${$e.length} ${$e.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:o.silent})?.info();for(let E of $e)l.log(` - ${E}`)}i.docs&&l.info(i.docs)}async function xn(e,t){let r=await ie(e,{config:t});return $a.array(at).parse(r).some(n=>n.type==="registry:theme"||n.type==="registry:style"||n.type==="registry:font"||n.type==="registry:base")}function Sn(e,t){for(let r of e)if(r?.target&&!gn(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}import In from"deepmerge";import Qt from"fs-extra";async function ve(e){let t=Xt.resolve(e.projectPath,"packages/ui"),r=Xt.resolve(e.projectPath,"apps/web"),o=Xt.resolve(t,"components.json"),n=await Qt.readJson(o);e.registryBaseConfig&&(n=In(n,e.registryBaseConfig)),n.tailwind.baseColor="neutral",e.rtl&&(n.rtl=!0),e.menuColor&&(n.menuColor=e.menuColor),e.menuAccent&&(n.menuAccent=e.menuAccent),e.iconLibrary&&(n.iconLibrary=e.iconLibrary),await Qt.writeJson(o,n,{spaces:2});let i=Xt.resolve(r,"components.json"),s=await Qt.readJson(i);e.registryBaseConfig&&(s=In(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=!0),e.menuColor&&(s.menuColor=e.menuColor),e.menuAccent&&(s.menuAccent=e.menuAccent),e.iconLibrary&&(s.iconLibrary=e.iconLibrary),await Qt.writeJson(i,s,{spaces:2});let c=await ae(t,z.parse(n)),{config:a}=await G(e.components,c,{silent:!0});await pe(e.components,a,{overwrite:!0,silent:e.silent,isNewProject:!0,skipFonts:!0});let f=await ae(r,z.parse(s)),m=await le(e.components,L(a));if(m?.fonts?.length){let u={},h=new Set;for(let g of m.fonts){let y=g.name.replace(/^font-heading-/,"").replace("font-",""),k=g.font.dependency??`@fontsource-variable/${y}`;u[g.font.variable]=g.font.family,h.add(k)}await D(Array.from(h),[],c,{silent:!0}),await Kt({theme:u},c,{silent:e.silent,overwriteCssVars:!1,tailwindVersion:"v4"}),await mt(Object.fromEntries(Array.from(h).map(g=>[`@import "${g}"`,{}])),c,{silent:e.silent})}let p=c.iconLibrary;if(p&&p in We){let u=[...We[p].packages];await D(u,[],c,{silent:!0}),await D(u,[],f,{silent:!0})}return f}var $n=X({name:"astro",title:"Astro",defaultProjectName:"astro-app",templateDir:"astro-app",frameworks:["astro"],create:async()=>{},files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:Pn`---
46
+ `)}s.push(I),ha(p)&&c.push(p.font.variable.replace("--",""))}}let a=new Set(["font-sans","font-serif","font-mono"]),f=[...c].reverse().find(p=>a.has(p)),m=c.filter(p=>!a.has(p));return f&&m.unshift(f),s.length>0&&Ra(n,s,m,r),n.getFullText()}function da(e){let t={};return e.font.subsets?.length&&(t.subsets=e.font.subsets),e.font.weight?.length&&(t.weight=e.font.weight),t.variable=e.font.variable,JSON.stringify(t).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'")}function Zt(e){return fa.has(e)}function ga(e){return Zt(e)?"html":null}function ha(e){return!e.font.selector&&Zt(e.font.variable)}function ya(e,t){let r=wa(e);return Zt(t)?r:`${r}${ba(t.replace(/^--font-/,""))}`}function wa(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ba(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function ka(e,t){let r=e.getVariableStatements();for(let o of r)for(let n of o.getDeclarations()){let i=n.getInitializer();if(!i||i.getKind()!==be.CallExpression)continue;let c=i.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return n}return null}function va(e,t){let r=e.getVariableStatements();for(let o of r)for(let n of o.getDeclarations()){let i=n.getInitializer();if(!i||i.getKind()!==be.CallExpression)continue;let s=i;if(s.getExpression().getText()!==t)continue;let c=s.getArguments();if(!c.length)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes("--font-heading"))return!0}return!1}function Ca(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Ra(e,t,r,o){let n=e.getDescendantsOfKind(be.JsxOpeningElement);for(let i of n){if(i.getTagNameNode().getText()!=="html")continue;let c=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),f=[...c,...a],m=i.getAttribute("className");if(!m){pt(e,o),i.addAttribute({name:"className",initializer:`{cn(${f.join(", ")})}`});return}if(m.getKind()!==be.JsxAttribute)return;let p=m.asKindOrThrow(be.JsxAttribute),u=p.getInitializer();if(!u)return;if(u.getKind()===be.StringLiteral){let h=u.getText().slice(1,-1);pt(e,o),p.setInitializer(`{cn("${h}", ${f.join(", ")})}`)}else if(u.getKind()===be.JsxExpression){let h=u.asKindOrThrow(be.JsxExpression),g=h.getExpression();if(!g)return;let y=g.getText();if(y.startsWith("cn(")){let k=a.every($=>y.includes($)),v=r.every($=>y.includes(`"${$}"`)),I=["font-sans","font-serif","font-mono"].filter($=>!r.includes($)).some($=>y.includes(`"${$}"`));if(k&&v&&!I)continue;let x=Sa(y,a);x=Ia(x);let C=Pa(x,f);h.replaceWithText(`{${C}}`)}else if(/^\w+\.variable$/.test(y)){if(a.includes(y)&&r.length===0)continue;pt(e,o);let v=(y.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(v?`{cn(${y}, ${f.join(", ")})}`:`{cn(${f.join(", ")})}`)}else if(y.startsWith("`")&&y.endsWith("`")){let k=xa(y);pt(e,o);let v=new Set(f),I=new Set(["font-sans","font-serif","font-mono"].map(C=>`"${C}"`)),x=k.filter(C=>!v.has(C)&&!I.has(C));h.replaceWithText(`{cn(${[...x,...f].join(", ")})}`)}else pt(e,o),h.replaceWithText(`{cn(${y}, ${f.join(", ")})}`)}}}function pt(e,t){if(!e.getImportDeclaration(o=>o.getNamedImports().some(i=>i.getName()==="cn"))){let o=e.getImportDeclaration(n=>n.getModuleSpecifierValue().includes("/lib/utils"));o?o.getNamedImports().some(i=>i.getName()==="cn")||o.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]})}}function xa(e){let t=[],r=[],n=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let i of n)if(i)if(i.startsWith("${")&&i.endsWith("}")){let s=i.slice(2,-1).trim();s&&r.push(s)}else{let s=i.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`)}return[...t,...r]}function Sa(e,t){let r=e;for(let o of t)r=r.replace(new RegExp(`,?\\s*${o.replace(".","\\.")}`,"g"),"").replace(/cn\(\s*,/,"cn(");return r}function Ia(e){let t=e;for(let r of["font-sans","font-serif","font-mono"])t=t.replace(new RegExp(`,?\\s*"${r}"`,"g"),"").replace(/cn\(\s*,/,"cn(");return t}function Pa(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}import{z as $a}from"zod";async function pe(e,t,r){r={overwrite:!1,silent:!1,isNewProject:!1,...r};let o=await ze(t);return o&&o.ui&&o.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await ja(e,t,o,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Ea(e,t,{...r,skipFonts:r.skipFonts})}async function Ea(e,t,r){if(!e.length)return;let o=b("Checking registry.",{silent:r.silent})?.start(),n=await le(e,L(t));if(!n)return o?.fail(),R(new Error("Failed to fetch components from registry."));try{Sn(n.files??[],t.resolvedPaths.cwd)}catch(a){return o?.fail(),R(a)}o?.succeed();let i=await lt(t);r.skipFonts||(n=await ut(n,t));let s=Ae([n]);await D(n.dependencies,n.devDependencies,t,{silent:r.silent}),await Ir(n.tailwind?.config,t,{silent:r.silent,tailwindVersion:i}),await Mr(n.envVars,t,{silent:r.silent}),r.skipFonts||await dt(n.fonts,t,{silent:r.silent}),await xr(n.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let c=n.cssVars?r.overwriteCssVars??await xn(e,t):void 0;await mt(n.css,t,{silent:r.silent,cssVars:n.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:c,tailwindVersion:i,tailwindConfig:n.tailwind?.config}),n.docs&&l.info(n.docs)}async function ja(e,t,r,o){if(!e.length)return;let n=b("Checking registry.",{silent:o.silent})?.start(),i=await le(e,L(t));if(!i)return n?.fail(),R(new Error("Failed to fetch components from registry."));try{Sn(i.files??[],t.resolvedPaths.cwd)}catch(E){return n?.fail(),R(E)}n?.succeed();let s=[],c=[],a=[],f=b("Installing components.")?.start(),m=r.ui,p=await lt(m),u=Sr(t.resolvedPaths.cwd,m.resolvedPaths.ui);i=await ut(i,t);let h=Ae([i]);await D(i.dependencies,i.devDependencies,m,{silent:!0}),i.tailwind?.config&&(await Ir(i.tailwind?.config,m,{silent:!0,tailwindVersion:p}),c.push(ke.relative(u,m.resolvedPaths.tailwindConfig))),i.envVars&&await Mr(i.envVars,m,{silent:!0}),await dt(i.fonts,t,{silent:!0});let g=["components","ui","lib","hooks"],y=new Map,k={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"},v=E=>g.includes(E),I=E=>{let se=E?.match(/^@([^/]+)\//);return se&&v(se[1])?se[1]:null},x=E=>I(E.target)??k[E.type||"registry:ui"]??"components",C=E=>E&&r[E]?r[E]:t;for(let E of i.files??[]){let se=x(E);y.has(se)||y.set(se,[]),y.get(se).push(E)}for(let E of Array.from(y.keys())){let se=y.get(E),Be=C(E),gs=(i.files??[]).filter($e=>C(x($e)).resolvedPaths.cwd===Be.resolvedPaths.cwd),Et=Sr(t.resolvedPaths.cwd,Be.resolvedPaths.ui||Be.resolvedPaths.cwd),vr=await Mo(Et,Be.resolvedPaths.cwd)??Be.resolvedPaths.cwd,Cr=await xr(se,Be,{overwrite:o.overwrite,silent:!0,rootSpinner:f,isRemote:o.isRemote,isWorkspace:!0,path:o.path,plannedFiles:gs,supportedFontMarkers:h});s.push(...Cr.filesCreated.map($e=>ke.relative(Et,ke.join(vr,$e)))),c.push(...Cr.filesUpdated.map($e=>ke.relative(Et,ke.join(vr,$e)))),a.push(...Cr.filesSkipped.map($e=>ke.relative(Et,ke.join(vr,$e))))}let $=i.cssVars?o.overwriteCssVars??await xn(e,t):void 0;await mt(i.css,m,{silent:!0,cssVars:i.cssVars,overwriteCssVars:$,tailwindVersion:p,tailwindConfig:i.tailwind?.config}),(i.cssVars||i.css)&&c.push(ke.relative(u,m.resolvedPaths.tailwindCss)),f?.succeed();let U=Array.from(new Set(s)).sort(),Y=Array.from(new Set(c.filter(E=>!s.includes(E)))).sort(),Pe=Array.from(new Set(a)).sort();if(!(U.length||Y.length)&&!Pe.length&&b("No files updated.",{silent:o.silent})?.info(),U.length){b(`Created ${U.length} ${U.length===1?"file":"files"}:`,{silent:o.silent})?.succeed();for(let E of U)l.log(` - ${E}`)}if(Y.length){b(`Updated ${Y.length} ${Y.length===1?"file":"files"}:`,{silent:o.silent})?.info();for(let E of Y)l.log(` - ${E}`)}if(Pe.length){b(`Skipped ${Pe.length} ${Pe.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:o.silent})?.info();for(let E of Pe)l.log(` - ${E}`)}i.docs&&l.info(i.docs)}async function xn(e,t){let r=await ie(e,{config:t});return $a.array(at).parse(r).some(n=>n.type==="registry:theme"||n.type==="registry:style"||n.type==="registry:font"||n.type==="registry:base")}function Sn(e,t){for(let r of e)if(r?.target&&!gn(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}import In from"deepmerge";import Qt from"fs-extra";async function ve(e){let t=Xt.resolve(e.projectPath,"packages/ui"),r=Xt.resolve(e.projectPath,"apps/web"),o=Xt.resolve(t,"components.json"),n=await Qt.readJson(o);e.registryBaseConfig&&(n=In(n,e.registryBaseConfig)),n.tailwind.baseColor="neutral",e.rtl&&(n.rtl=!0),e.menuColor&&(n.menuColor=e.menuColor),e.menuAccent&&(n.menuAccent=e.menuAccent),e.iconLibrary&&(n.iconLibrary=e.iconLibrary),await Qt.writeJson(o,n,{spaces:2});let i=Xt.resolve(r,"components.json"),s=await Qt.readJson(i);e.registryBaseConfig&&(s=In(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=!0),e.menuColor&&(s.menuColor=e.menuColor),e.menuAccent&&(s.menuAccent=e.menuAccent),e.iconLibrary&&(s.iconLibrary=e.iconLibrary),await Qt.writeJson(i,s,{spaces:2});let c=await ae(t,z.parse(n)),{config:a}=await G(e.components,c,{silent:!0});await pe(e.components,a,{overwrite:!0,silent:e.silent,isNewProject:!0,skipFonts:!0});let f=await ae(r,z.parse(s)),m=await le(e.components,L(a));if(m?.fonts?.length){let u={},h=new Set;for(let g of m.fonts){let y=g.name.replace(/^font-heading-/,"").replace("font-",""),k=g.font.dependency??`@fontsource-variable/${y}`;u[g.font.variable]=g.font.family,h.add(k)}await D(Array.from(h),[],c,{silent:!0}),await Kt({theme:u},c,{silent:e.silent,overwriteCssVars:!1,tailwindVersion:"v4"}),await mt(Object.fromEntries(Array.from(h).map(g=>[`@import "${g}"`,{}])),c,{silent:e.silent})}let p=c.iconLibrary;if(p&&p in We){let u=[...We[p].packages];await D(u,[],c,{silent:!0}),await D(u,[],f,{silent:!0})}return f}var $n=X({name:"astro",title:"Astro",defaultProjectName:"astro-app",templateDir:"astro-app",frameworks:["astro"],create:async()=>{},files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:Pn`---
47
47
  import Layout from "@/layouts/main.astro"
48
48
  import { ComponentExample } from "@/components/component-example"
49
49
  ---
@@ -120,52 +120,52 @@ export function App() {
120
120
  }
121
121
 
122
122
  export default App;
123
- `}]}});var Q={next:Fn,vite:Vn,start:Ln,"react-router":An,astro:$n,laravel:En};function Xe(e){if(e){for(let[t,r]of Object.entries(Q))if(r.frameworks.includes(e))return t}}function Un(e,t){let r=t?.lib??rr(e,"lib");return{ui:t?.ui??rr(e,"ui"),lib:r,hooks:t?.hooks??rr(e,"hooks"),utils:t?.utils??rr(e,"utils",r)}}function rr(e,t,r){let o=e||Bt;if(t==="ui")return`${o}/ui`;if(t==="utils"){let n=r||Dn(o,"lib");return n?`${n}/utils`:Vo}return Dn(o,t)}function Dn(e,t){return e==="components"?t:e.endsWith("/components")?`${e.slice(0,-11)}/${t}`:e.endsWith("components")&&!e.includes("/")?`${e.slice(0,-10)}${t}`:""}import Mn from"path";import Wr from"fs-extra";import Ta from"prompts";async function or(e){let t=e.template&&e.template in Q?e.template:"next",r=Ae(Q[t],{monorepo:e.monorepo}),o=e.name??r.defaultProjectName,n=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(n&&(t="next"),!e.force){let{type:a,name:f}=await Ta([{type:e.template||n?null:"select",name:"type",message:`The path ${d.info(e.cwd)} does not contain a package.json file.
124
- Would you like to start a new project?`,choices:Object.entries(Q).map(([m,p])=>({title:p.title,value:m,description:p.description})),initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:o,format:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":!0}]);t=a??t,o=f??o}let i=Ae(Q[t],{monorepo:e.monorepo}),s=await ce(e.cwd,{withFallback:!0}),c=Mn.join(e.cwd,o);try{await Wr.access(e.cwd,Wr.constants.W_OK)}catch{l.break(),l.error(`The path ${d.info(e.cwd)} is not writable.`),l.error(`It is likely you do not have write permissions for this folder or the path ${d.info(e.cwd)} does not exist.`),l.break(),process.exit(1)}return Wr.existsSync(Mn.resolve(e.cwd,o,"package.json"))&&(l.break(),l.error(`A project with the name ${d.info(o)} already exists.`),l.error("Please choose a different name and try again."),l.break(),process.exit(1)),await i.scaffold({projectPath:c,packageManager:s,cwd:e.cwd}),{projectPath:c,projectName:o,template:t}}import{existsSync as Fa}from"fs";import{join as Oa}from"path";async function ee(e=process.cwd()){try{let{config:t}=await import("@dotenvx/dotenvx"),r=[".env.local",".env.development.local",".env.development",".env"];for(let o of r){let n=Oa(e,o);Fa(n)&&t({path:n,overload:!1,quiet:!0})}}catch(t){l.warn("Failed to load env files:",t)}}import _e from"fs-extra";var tt=".bak",Qe=class extends Error{filePath;constructor(t){super(`Could not back up ${t}.`),this.name="FileBackupError",this.filePath=t}};function gt(e){if(!_e.existsSync(e))return null;let t=`${e}${tt}`;try{return _e.renameSync(e,t),t}catch{return null}}function et(e){let t=`${e}${tt}`;if(!_e.existsSync(t))return!1;try{return _e.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),!1}}function ht(e){let t=`${e}${tt}`;if(!_e.existsSync(t))return!1;try{return _e.unlinkSync(t),!0}catch{return!1}}async function Bn(e,t){if(!_e.existsSync(e))return t();if(!gt(e))throw new Qe(e);let o=()=>et(e);process.on("exit",o);try{let n=await t();return process.removeListener("exit",o),ht(e),n}catch(n){throw process.removeListener("exit",o),et(e),n}}import{Command as Na}from"commander";import La from"deepmerge";import de from"fs-extra";import Ce from"prompts";import{z as T}from"zod";var _a=T.object({cwd:T.string(),name:T.string().optional(),preset:T.union([T.boolean(),T.string()]).optional(),components:T.array(T.string()).optional(),yes:T.boolean(),defaults:T.boolean(),force:T.boolean(),reinstall:T.boolean().optional(),silent:T.boolean(),isNewProject:T.boolean().default(!1),cssVariables:T.boolean().default(!0),rtl:T.boolean().optional(),pointer:T.boolean().optional(),base:T.enum(["radix","base"]).optional(),template:T.string().optional(),monorepo:T.boolean().optional(),existingConfig:T.record(T.unknown()).optional(),installStyleIndex:T.boolean().default(!0),registryBaseConfig:z.deepPartial().optional(),menuColor:T.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:T.enum(["subtle","bold"]).optional(),iconLibrary:T.string().optional()});function Va(e,t){return t.rtl?e.searchParams.set("rtl","true"):t.rtl===!1&&e.searchParams.delete("rtl"),t.pointer?e.searchParams.set("pointer","true"):t.pointer===!1&&e.searchParams.delete("pointer"),e}var Wn=new Na().name("init").alias("create").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, react-router, laravel, astro)").option("-b, --base <base>","the component library to use. (radix, base)").option("--monorepo","scaffold a monorepo project.").option("--no-monorepo","skip the monorepo prompt.").option("-p, --preset [name]","use a preset configuration").option("-y, --yes","skip confirmation prompt.",!0).option("-d, --defaults","use default configuration: --template=next --preset=base-nova",!1).option("-f, --force","force overwrite of existing configuration.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-n, --name <name>","the name for the new project.").option("-s, --silent","mute output.",!1).option("--css-variables","use css variables for theming.",!0).option("--no-css-variables","do not use css variables for theming.").option("--rtl","enable RTL support.").option("--no-rtl","disable RTL support.").option("--pointer","enable pointer cursor for buttons.").option("--no-pointer","disable pointer cursor for buttons.").option("--reinstall","re-install existing UI components.").option("--no-reinstall","do not re-install existing UI components.").action(async(e,t)=>{let r,o=[],n=()=>{r&&et(r.replace(tt,""))};process.on("exit",n);try{let i=_a.parse({...t,reinstall:t.reinstall,cwd:ue.resolve(t.cwd)}),s=new Map(Object.entries(Z)),c;if(i.defaults&&(i.template=i.template||"next",i.base=i.base||"base",i.reinstall=i.reinstall??!1),i.template&&!(i.template in Q)&&(l.error(`Invalid template: ${d.info(i.template)}. Available templates: ${Object.keys(Q).map(u=>d.info(u)).join(", ")}.`),l.break(),process.exit(1)),typeof i.preset=="string"&&!q(i.preset)&&!Ye(i.preset)){let u=Array.from(s.keys());s.has(i.preset)||(l.error(`Invalid preset: ${d.info(i.preset)}. Available presets: ${u.join(", ")}`),l.break(),process.exit(1))}let a=i.cwd,f=de.existsSync(ue.resolve(a,"components.json"));if(!i.monorepo&&!f&&await M(a)){let u=await F(a);if(!u||u.framework.name==="manual"){let h=await B(a);h.length>0&&(W("init",h),process.exit(1))}}if(f&&!i.force){let{overwrite:u}=await Ce({type:"confirm",name:"overwrite",message:`A ${d.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});u||(l.info(` To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),l.break(),process.exit(1)),i.force=!0}let m;if(f){try{m=await de.readJson(ue.resolve(a,"components.json"))}catch{}m&&(i.existingConfig=m);let u=i.reinstall;if(u===void 0){let{reinstall:h}=await Ce({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});u=h}if(u&&(o=await He(a),o.length)){l.break(),l.log(" The following components will be re-installed and overwritten:");for(let h=0;h<o.length;h+=8)l.log(` - ${o.slice(h,h+8).join(", ")}`);l.break()}}if(i.preset===void 0&&e.length===0&&!i.defaults){let u=de.existsSync(ue.resolve(a,"package.json"));if(!i.template&&!u){let{template:h}=await Ce({type:"select",name:"template",message:"Select a template",choices:Object.entries(Q).map(([g,y])=>({title:y.title,value:g,description:y.description,disabled:i.monorepo&&g==="laravel"}))});h||process.exit(1),i.template=h}if(!i.template&&u){let h=await F(a),g=Xe(h?.framework.name);g&&(i.template=g)}if(i.template==="laravel"&&!u&&(l.break(),l.log(` Please create a new app with ${d.info("laravel new --react")} first then run ${d.info("love-ui init")}.`),l.log(` See ${d.info(`${S}/docs/installation/laravel`)} for more information.`),l.break(),process.exit(0)),i.monorepo===void 0&&!u&&i.template&&Q[i.template]?.monorepo){let{monorepo:h}=await Ce({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});i.monorepo=h}i.base||(i.base=await qe()),i.preset=!0}if(i.preset!==void 0){let u=i.preset===!0?!0:i.preset;if(u===!0){let h=await ct({rtl:i.rtl??!1,template:i.template,base:i.base,pointer:i.pointer});e=[h.url,...e],c=h.base}if(typeof u=="string"){let h;if(q(u)){let g=new URL(u);Va(g,i),g.pathname==="/init"&&u.startsWith(S)&&g.searchParams.set("track","1"),h=g.toString(),c=g.searchParams.get("base")??void 0}else if(Ye(u)){let g=Ke(u);g||(l.error(`Invalid preset code: ${d.info(u)}`),l.break(),process.exit(1)),h=he({...g,base:"radix",rtl:i.rtl??!1},{template:i.template,preset:u,pointer:i.pointer}),c=void 0}else{let g=s.get(u);if(!g)throw new Error(`Unknown preset: ${u}`);h=he({...g,base:i.base??"radix",rtl:i.rtl??g.rtl},{template:i.template,pointer:i.pointer}),c=void 0}e=[h,...e]}}let p=i.base??c??(m?.style?m.style.startsWith("base-")?"base":"radix":"");if(!p)if(e.length>0)p="radix";else{let u=await qe();p=u,i.base=u}if(i.defaults&&!e.some(q)&&(e=[he({...Z.nova,base:p,rtl:i.rtl??!1},{template:i.template,pointer:i.pointer}),...e]),e.length>0&&q(e[0])){let u=new URL(e[0]);u.searchParams.set("base",p),e[0]=u.toString()}if(m?.style){let u=await Ma(m.style,p);if(u!==p&&(p=u,e.length>0&&q(e[0]))){let h=new URL(e[0]);h.searchParams.set("base",u),e[0]=h.toString()}}if(o.length&&(e=[...e,...o]),i.components=e,await ee(i.cwd),e.length>0){let u=ue.resolve(a,"components.json");f&&(r=gt(u)??void 0,r||l.warn(`Could not back up ${d.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:g,url:y}=await Fe(e[0],a,{registries:m?.registries});e[0]=y,g||(i.installStyleIndex=!1),h&&(i.registryBaseConfig=h)}await rt(i),l.break(),l.log(`Project initialization completed.
125
- You may now add components.`),process.removeListener("exit",n),ht(ue.resolve(a,"components.json")),l.break()}catch(i){process.removeListener("exit",n),n(),l.break(),R(i)}finally{ne()}});async function rt(e){let t,r,o,n=e.template,i=n?Ae(Q[n],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&de.existsSync(ue.resolve(e.cwd,"package.json")))t=await F(e.cwd);else if(e.skipPreflight)t=await F(e.cwd);else{let C=await sn(e);if(C.errors["1"]){let{projectPath:$,template:U}=await or(e);$||process.exit(1),e.cwd=$,e.isNewProject=!0,o=U,t=await F(e.cwd)}else t=C.projectInfo}r=await Zo(e.cwd,t);let c=o??n,a=c?Ae(Q[c],{monorepo:e.monorepo}):void 0,f=[...e.installStyleIndex?["index"]:[],...e.components??[],...a?["button"]:[]],m=o?a?.postInit:void 0;if(a?.init){let C=await a.init({projectPath:e.cwd,components:f,registryBaseConfig:e.registryBaseConfig,rtl:e.rtl??!1,menuColor:e.menuColor,menuAccent:e.menuAccent,iconLibrary:e.iconLibrary,silent:e.silent});return m&&await m({projectPath:e.cwd}),C}let p=r?await Ua(r,e):await Da(await j(e.cwd));if(!e.yes){let{proceed:C}=await Ce({type:"confirm",name:"proceed",message:`Write configuration to ${d.info("components.json")}. Proceed?`,initial:!0});C||process.exit(1)}let u=await ae(e.cwd,p),{config:h}=await G(f,u,{silent:!0});h.registries&&(p.registries=h.registries);let g=b("Writing components.json.").start(),y=ue.resolve(e.cwd,"components.json"),k=`${y}${tt}`,v=(C,$)=>{let{registries:U,...Y}=La(C,$);return{...Y,registries:U}};if(de.existsSync(k)){let C=await de.readJson(k);e.force?C.registries&&(p.registries={...C.registries,...p.registries||{}}):p=v(C,p)}e.registryBaseConfig&&(p=v(p,e.registryBaseConfig)),e.rtl!==void 0&&(p.rtl=e.rtl),p.registries=Object.fromEntries(Object.entries(p.registries||{}).filter(([C])=>!Object.keys(re).includes(C))),await Aa.writeFile(y,`${JSON.stringify(p,null,2)}
126
- `,"utf8"),g.succeed();let I=await ae(e.cwd,p),x=await ze(I);if(x){let C={};if(p.menuColor&&(C.menuColor=p.menuColor),p.menuAccent&&(C.menuAccent=p.menuAccent),p.rtl!==void 0&&(C.rtl=p.rtl),p.iconLibrary&&(C.iconLibrary=p.iconLibrary),Object.keys(C).length>0)for(let $ of Object.keys(x)){let U=x[$];if(U.resolvedPaths.cwd===I.resolvedPaths.cwd)continue;let Y=ue.resolve(U.resolvedPaths.cwd,"components.json");if(de.existsSync(Y)){let $e=await de.readJson(Y);await de.writeJson(Y,{...$e,...C},{spaces:2})}}}return Mo.clearCaches(),await pe(f,I,{overwrite:!0,overwriteCssVars:e.reinstall||void 0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),m&&await m({projectPath:e.cwd}),I}async function Da(e=null){let[t,r]=await Promise.all([Pr(),Ho()]);l.info("");let o=await Ce([{type:"toggle",name:"typescript",message:`Would you like to use ${d.info("TypeScript")} (recommended)?`,initial:e?.tsx??!0,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:t.map(s=>({title:s.label,value:s.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:r.map(s=>({title:s.label,value:s.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${d.info("global CSS")} file?`,initial:e?.tailwind.css??Do},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${d.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables??!0,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${d.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${d.info("tailwind.config.js")} located?`,initial:e?.tailwind.config??Uo},{type:"text",name:"components",message:`Configure the import alias for ${d.info("components")}:`,initial:e?.aliases.components??Bt},{type:"toggle",name:"rsc",message:`Are you using ${d.info("React Server Components")}?`,initial:e?.rsc??!0,active:"yes",inactive:"no"}]);o.style||process.exit(1);let n=e&&e.aliases.components===o.components?e.aliases:void 0,i=Un(o.components,n);return z.parse({$schema:"https://www.loveui.dev/schema.json",style:o.style,tailwind:{config:o.tailwindConfig,css:o.tailwindCss,baseColor:o.tailwindBaseColor,cssVariables:o.tailwindCssVariables,prefix:o.tailwindPrefix},rsc:o.rsc,tsx:o.typescript,aliases:{components:o.components,ui:i.ui,lib:i.lib,hooks:i.hooks,utils:i.utils}})}async function Ua(e,t){let r=e.style,o="neutral",n=e.tailwind.cssVariables,i=e.iconLibrary??"lucide";if(!t.defaults){let[s,c]=await Promise.all([Pr(),lt(e)]);r=(await Ce([{type:c==="v4"||r?null:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:s.map(f=>({title:f.name==="new-york"?"New York (Recommended)":f.label,value:f.name})),initial:0}])).style??r??"new-york"}return n=t.cssVariables,z.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:o,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:i,rtl:t.rtl??e?.rtl??!1,aliases:e?.aliases})}async function Ma(e,t){let r=e.startsWith("base-")?"base":"radix";if(t===r)return t;l.warn(` You are switching from ${d.info(r)} to ${d.info(t)}.`),l.warn(` Components outside the ${d.info("ui")} directory that depend on ${d.info(r)} primitives may need manual updates.`),l.break();let{proceed:o}=await Ce({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});return o?t:r}import zn from"path";import zr from"fs-extra";async function Jn(e){let t={};if(!zr.existsSync(e.cwd)||!zr.existsSync(zn.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};if(!zr.existsSync(zn.resolve(e.cwd,"components.json"))){if(await M(e.cwd)){let r=await B(e.cwd);r.length>0&&(W("add [component]",r),process.exit(1))}return t["3"]=!0,{errors:t,config:null}}try{let r=await j(e.cwd);return{errors:t,config:r}}catch{l.break(),l.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
127
- Before you can add components, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{existsSync as Jr,promises as Gn}from"fs";import nr from"path";import{Project as Ba}from"ts-morph";import{loadConfig as Wa}from"tsconfig-paths";async function Hn(e,t,r={}){let o={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return o;let n=await le(e,L(t));if(!n)throw new Error("Failed to fetch components from registry.");r.skipFonts||(n=await ut(n,t));let i=Ne([n]);return o.dependencies=Array.from(new Set(n.dependencies??[])),o.devDependencies=Array.from(new Set(n.devDependencies??[])),o.docs=n.docs??null,await za(n,t,o,r,i),await Ja(n,t,o,r),Ga(n,t,o),r.skipFonts||Ha(n,o),o}async function za(e,t,r,o,n){let i=e.files;if(!i?.length)return;let[s,c]=await Promise.all([F(t.resolvedPaths.cwd),t.tailwind.baseColor?zt(t.tailwind.baseColor):Promise.resolve(void 0)]),a;try{a=Wa(t.resolvedPaths.cwd)}catch{a={resultType:"failed"}}let f=new Ba({compilerOptions:{}}),m=No(i,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name});for(let p=0;p<i.length;p++){let u=i[p];if(!u.content)continue;let h=Oo(u,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name,commonRoot:Ao(i.map($=>$.path),u.path),fileIndex:p});if(!h)continue;t.tsx||(h=h.replace(/\.tsx?$/,$=>$===".tsx"?".jsx":".js"));let g=Jr(h),y=nr.relative(t.resolvedPaths.cwd,h),k=u.type==="registry:file"||u.type==="registry:item",v=Rr(h)||k?u.content:await Dt({filename:u.path,raw:u.content,config:t,baseColor:c,transformJsx:!t.tsx,isRemote:!1,supportedFontMarkers:n},[At,Nt,Ft,Vt,Ot,Mt,Fo,_t,Ut,Lt]),I=Rr(h)||k?v:await Lo({config:t,content:v,filePaths:m,project:f,projectInfo:s,resolvedPath:h,tsConfig:a}),x="create",C;g&&(C=await Gn.readFile(h,"utf-8"),Po(C,I)?x="skip":x="overwrite"),r.files.push({path:y,action:x,content:I,...x==="overwrite"&&{existingContent:C},type:u.type??"registry:ui"})}}async function Ja(e,t,r,o){let n=e.css&&Object.keys(e.css).length>0,i=Object.keys(e.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!n&&!i)return;let s=t.resolvedPaths.tailwindCss,c=Jr(s),a=nr.relative(t.resolvedPaths.cwd,s),f=c?await Gn.readFile(s,"utf8"):"",m=f;i&&(m=await ft(m,e.cssVars,t,{overwriteCssVars:o.overwriteCssVars})),n&&(m=await Ur(m,e.css));let p=0;if(e.cssVars)for(let u of Object.values(e.cssVars))u&&(p+=Object.keys(u).length);r.css={path:a,content:m,...c&&{existingContent:f},action:c?"update":"create",cssVarsCount:p}}function Ga(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let o=nr.join(t.resolvedPaths.cwd,".env.local"),n=Jr(o),i=nr.relative(t.resolvedPaths.cwd,o);r.envVars={path:i,variables:e.envVars,action:n?"update":"create"}}function Ha(e,t){if(e.fonts?.length)for(let r of e.fonts)t.fonts.push({name:r.font.family,provider:r.font.provider==="google"?"Google Fonts":r.font.provider})}import{diffWords as Ka,structuredPatch as Ya}from"diff";import{bold as H,cyan as Gr,dim as w,green as K,red as Hr,yellow as ot}from"kleur/colors";var Re=5,qa=w("\u250C"+"\u2500".repeat(46)),Za=w("\u2514"+"\u2500".repeat(46)),Xa={create:"+",overwrite:"~",skip:"="},Qa={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function yt(e){return e==="create"?K(e):e==="overwrite"||e==="update"?ot(e):w(e)}function wt(e){return`${H("\u250C")} ${H(`love-ui add ${e.join(", ")}`)} ${w("(dry run)")}`}function qn(e,t){return e===t||e.includes(t)||e.endsWith(t)}function Ve(e,t,r=o=>o){e.push(`${w("\u2502")} ${qa}`);for(let o of t)e.push(`${w("\u2502")} ${w("\u2502")} ${r(o)}`);e.push(`${w("\u2502")} ${Za}`)}function Zn(e,t,r={}){return r.diff?typeof r.diff=="string"?tl(e,t,r.diff):rl(e,t):r.view?typeof r.view=="string"?nl(e,t,r.view):ol(e,t):el(e,t)}function el(e,t){let r=[];r.push(wt(t)),r.push(w("\u2502")),il(e,r),Kn("Dependencies",e.dependencies,r),Kn("Dev Dependencies",e.devDependencies,r),sl(e,r),al(e,r),ll(e,r);let o=e.files.filter(i=>i.action==="overwrite").length;o>0&&(r.push(ot(`\u26A0 ${o} ${o===1?"file":"files"} will be overwritten.`)),r.push(w("\u2502")));let n=[];return e.files.length>0&&n.push(`${e.files.length} ${e.files.length===1?"file":"files"}`),e.dependencies.length>0&&n.push(`${e.dependencies.length} ${e.dependencies.length===1?"dep":"deps"}`),e.css?.cssVarsCount&&n.push(`${e.css.cssVarsCount} CSS vars`),n.length>0&&(r.push(`${w("\u2502")} ${w(n.join(", "))}`),r.push(w("\u2502"))),r.push(`${w("\u2502")} ${w("Run with --diff to view changes.")}`),r.push(`${w("\u2502")} ${w("Run with --view to view file contents.")}`),r.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),r.join(`
123
+ `}]}});var Q={next:Fn,vite:Vn,start:Ln,"react-router":An,astro:$n,laravel:En};function Xe(e){if(e){for(let[t,r]of Object.entries(Q))if(r.frameworks.includes(e))return t}}function Un(e,t){let r=t?.lib??rr(e,"lib");return{ui:t?.ui??rr(e,"ui"),lib:r,hooks:t?.hooks??rr(e,"hooks"),utils:t?.utils??rr(e,"utils",r)}}function rr(e,t,r){let o=e||Bt;if(t==="ui")return`${o}/ui`;if(t==="utils"){let n=r||Dn(o,"lib");return n?`${n}/utils`:_o}return Dn(o,t)}function Dn(e,t){return e==="components"?t:e.endsWith("/components")?`${e.slice(0,-11)}/${t}`:e.endsWith("components")&&!e.includes("/")?`${e.slice(0,-10)}${t}`:""}import Mn from"path";import Br from"fs-extra";import Ta from"prompts";async function or(e){let t=e.template&&e.template in Q?e.template:"next",r=Oe(Q[t],{monorepo:e.monorepo}),o=e.name??r.defaultProjectName,n=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(n&&(t="next"),!e.force){let{type:a,name:f}=await Ta([{type:e.template||n?null:"select",name:"type",message:`The path ${d.info(e.cwd)} does not contain a package.json file.
124
+ Would you like to start a new project?`,choices:Object.entries(Q).map(([m,p])=>({title:p.title,value:m,description:p.description})),initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:o,format:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":!0}]);t=a??t,o=f??o}let i=Oe(Q[t],{monorepo:e.monorepo}),s=await ce(e.cwd,{withFallback:!0}),c=Mn.join(e.cwd,o);try{await Br.access(e.cwd,Br.constants.W_OK)}catch{l.break(),l.error(`The path ${d.info(e.cwd)} is not writable.`),l.error(`It is likely you do not have write permissions for this folder or the path ${d.info(e.cwd)} does not exist.`),l.break(),process.exit(1)}return Br.existsSync(Mn.resolve(e.cwd,o,"package.json"))&&(l.break(),l.error(`A project with the name ${d.info(o)} already exists.`),l.error("Please choose a different name and try again."),l.break(),process.exit(1)),await i.scaffold({projectPath:c,packageManager:s,cwd:e.cwd}),{projectPath:c,projectName:o,template:t}}import{existsSync as Fa}from"fs";import{join as Oa}from"path";async function ee(e=process.cwd()){try{let{config:t}=await import("@dotenvx/dotenvx"),r=[".env.local",".env.development.local",".env.development",".env"];for(let o of r){let n=Oa(e,o);Fa(n)&&t({path:n,overload:!1,quiet:!0})}}catch(t){l.warn("Failed to load env files:",t)}}import Le from"fs-extra";var tt=".bak",Qe=class extends Error{filePath;constructor(t){super(`Could not back up ${t}.`),this.name="FileBackupError",this.filePath=t}};function gt(e){if(!Le.existsSync(e))return null;let t=`${e}${tt}`;try{return Le.renameSync(e,t),t}catch{return null}}function et(e){let t=`${e}${tt}`;if(!Le.existsSync(t))return!1;try{return Le.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),!1}}function ht(e){let t=`${e}${tt}`;if(!Le.existsSync(t))return!1;try{return Le.unlinkSync(t),!0}catch{return!1}}async function Bn(e,t){if(!Le.existsSync(e))return t();if(!gt(e))throw new Qe(e);let o=()=>et(e);process.on("exit",o);try{let n=await t();return process.removeListener("exit",o),ht(e),n}catch(n){throw process.removeListener("exit",o),et(e),n}}import{Command as Na}from"commander";import La from"deepmerge";import de from"fs-extra";import _e from"prompts";import{z as T}from"zod";var _a=T.object({cwd:T.string(),name:T.string().optional(),preset:T.union([T.boolean(),T.string()]).optional(),components:T.array(T.string()).optional(),yes:T.boolean(),defaults:T.boolean(),force:T.boolean(),reinstall:T.boolean().optional(),silent:T.boolean(),isNewProject:T.boolean().default(!1),cssVariables:T.boolean().default(!0),rtl:T.boolean().optional(),pointer:T.boolean().optional(),base:T.enum(["base"]).optional(),template:T.string().optional(),monorepo:T.boolean().optional(),existingConfig:T.record(T.unknown()).optional(),installStyleIndex:T.boolean().default(!0),registryBaseConfig:z.deepPartial().optional(),menuColor:T.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:T.enum(["subtle","bold"]).optional(),iconLibrary:T.string().optional()});function Va(e,t){return t.rtl?e.searchParams.set("rtl","true"):t.rtl===!1&&e.searchParams.delete("rtl"),t.pointer?e.searchParams.set("pointer","true"):t.pointer===!1&&e.searchParams.delete("pointer"),e}var Wn=new Na().name("init").alias("create").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, react-router, laravel, astro)").option("-b, --base <base>","the component library to use. (base)").option("--monorepo","scaffold a monorepo project.").option("--no-monorepo","skip the monorepo prompt.").option("-p, --preset [name]","use a preset configuration").option("-y, --yes","skip confirmation prompt.",!0).option("-d, --defaults","use default configuration: --template=next --preset=base-nova",!1).option("-f, --force","force overwrite of existing configuration.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-n, --name <name>","the name for the new project.").option("-s, --silent","mute output.",!1).option("--css-variables","use css variables for theming.",!0).option("--no-css-variables","do not use css variables for theming.").option("--rtl","enable RTL support.").option("--no-rtl","disable RTL support.").option("--pointer","enable pointer cursor for buttons.").option("--no-pointer","disable pointer cursor for buttons.").option("--reinstall","re-install existing UI components.").option("--no-reinstall","do not re-install existing UI components.").action(async(e,t)=>{let r,o=[],n=()=>{r&&et(r.replace(tt,""))};process.on("exit",n);try{let i=_a.parse({...t,reinstall:t.reinstall,cwd:ue.resolve(t.cwd)}),s=new Map(Object.entries(Z)),c;if(i.defaults&&(i.template=i.template||"next",i.base=i.base||"base",i.reinstall=i.reinstall??!1),i.template&&!(i.template in Q)&&(l.error(`Invalid template: ${d.info(i.template)}. Available templates: ${Object.keys(Q).map(u=>d.info(u)).join(", ")}.`),l.break(),process.exit(1)),typeof i.preset=="string"&&!q(i.preset)&&!Ye(i.preset)){let u=Array.from(s.keys());s.has(i.preset)||(l.error(`Invalid preset: ${d.info(i.preset)}. Available presets: ${u.join(", ")}`),l.break(),process.exit(1))}let a=i.cwd,f=de.existsSync(ue.resolve(a,"components.json"));if(!i.monorepo&&!f&&await M(a)){let u=await F(a);if(!u||u.framework.name==="manual"){let h=await B(a);h.length>0&&(W("init",h),process.exit(1))}}if(f&&!i.force){let{overwrite:u}=await _e({type:"confirm",name:"overwrite",message:`A ${d.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});u||(l.info(` To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),l.break(),process.exit(1)),i.force=!0}let m;if(f){try{m=await de.readJson(ue.resolve(a,"components.json"))}catch{}m&&(i.existingConfig=m);let u=i.reinstall;if(u===void 0){let{reinstall:h}=await _e({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});u=h}if(u&&(o=await He(a),o.length)){l.break(),l.log(" The following components will be re-installed and overwritten:");for(let h=0;h<o.length;h+=8)l.log(` - ${o.slice(h,h+8).join(", ")}`);l.break()}}if(i.preset===void 0&&e.length===0&&!i.defaults){let u=de.existsSync(ue.resolve(a,"package.json"));if(!i.template&&!u){let{template:h}=await _e({type:"select",name:"template",message:"Select a template",choices:Object.entries(Q).map(([g,y])=>({title:y.title,value:g,description:y.description,disabled:i.monorepo&&g==="laravel"}))});h||process.exit(1),i.template=h}if(!i.template&&u){let h=await F(a),g=Xe(h?.framework.name);g&&(i.template=g)}if(i.template==="laravel"&&!u&&(l.break(),l.log(` Please create a new app with ${d.info("laravel new --react")} first then run ${d.info("love-ui init")}.`),l.log(` See ${d.info(`${S}/docs/installation/laravel`)} for more information.`),l.break(),process.exit(0)),i.monorepo===void 0&&!u&&i.template&&Q[i.template]?.monorepo){let{monorepo:h}=await _e({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});i.monorepo=h}i.base||(i.base=await qe()),i.preset=!0}if(i.preset!==void 0){let u=i.preset===!0?!0:i.preset;if(u===!0){let h=await ct({rtl:i.rtl??!1,template:i.template,base:i.base,pointer:i.pointer});e=[h.url,...e],c=h.base}if(typeof u=="string"){let h;if(q(u)){let g=new URL(u);Va(g,i),g.pathname==="/init"&&u.startsWith(S)&&g.searchParams.set("track","1"),h=g.toString(),c=g.searchParams.get("base")??void 0}else if(Ye(u)){let g=Ke(u);g||(l.error(`Invalid preset code: ${d.info(u)}`),l.break(),process.exit(1)),h=he({...g,base:"base",rtl:i.rtl??!1},{template:i.template,preset:u,pointer:i.pointer}),c=void 0}else{let g=s.get(u);if(!g)throw new Error(`Unknown preset: ${u}`);h=he({...g,base:"base",rtl:i.rtl??g.rtl},{template:i.template,pointer:i.pointer}),c=void 0}e=[h,...e]}}let p=i.base??c??(m?.style?"base":"");if(!p)if(e.length>0)p="base";else{let u=await qe();p=u,i.base=u}if(i.defaults&&!e.some(q)&&(e=[he({...Z.nova,base:p,rtl:i.rtl??!1},{template:i.template,pointer:i.pointer}),...e]),e.length>0&&q(e[0])){let u=new URL(e[0]);u.searchParams.set("base",p),e[0]=u.toString()}if(m?.style){let u=await Ma(m.style,p);if(u!==p&&(p=u,e.length>0&&q(e[0]))){let h=new URL(e[0]);h.searchParams.set("base",u),e[0]=h.toString()}}if(o.length&&(e=[...e,...o]),i.components=e,await ee(i.cwd),e.length>0){let u=ue.resolve(a,"components.json");f&&(r=gt(u)??void 0,r||l.warn(`Could not back up ${d.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:g,url:y}=await Te(e[0],a,{registries:m?.registries});e[0]=y,g||(i.installStyleIndex=!1),h&&(i.registryBaseConfig=h)}await rt(i),l.break(),l.log(`Project initialization completed.
125
+ You may now add components.`),process.removeListener("exit",n),ht(ue.resolve(a,"components.json")),l.break()}catch(i){process.removeListener("exit",n),n(),l.break(),R(i)}finally{ne()}});async function rt(e){let t,r,o,n=e.template,i=n?Oe(Q[n],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&de.existsSync(ue.resolve(e.cwd,"package.json")))t=await F(e.cwd);else if(e.skipPreflight)t=await F(e.cwd);else{let C=await nn(e);if(C.errors["1"]){let{projectPath:$,template:U}=await or(e);$||process.exit(1),e.cwd=$,e.isNewProject=!0,o=U,t=await F(e.cwd)}else t=C.projectInfo}r=await qo(e.cwd,t);let c=o??n,a=c?Oe(Q[c],{monorepo:e.monorepo}):void 0,f=[...e.installStyleIndex?["index"]:[],...e.components??[],...a?["button"]:[]],m=o?a?.postInit:void 0;if(a?.init){let C=await a.init({projectPath:e.cwd,components:f,registryBaseConfig:e.registryBaseConfig,rtl:e.rtl??!1,menuColor:e.menuColor,menuAccent:e.menuAccent,iconLibrary:e.iconLibrary,silent:e.silent});return m&&await m({projectPath:e.cwd}),C}let p=r?await Ua(r,e):await Da(await j(e.cwd));if(!e.yes){let{proceed:C}=await _e({type:"confirm",name:"proceed",message:`Write configuration to ${d.info("components.json")}. Proceed?`,initial:!0});C||process.exit(1)}let u=await ae(e.cwd,p),{config:h}=await G(f,u,{silent:!0});h.registries&&(p.registries=h.registries);let g=b("Writing components.json.").start(),y=ue.resolve(e.cwd,"components.json"),k=`${y}${tt}`,v=(C,$)=>{let{registries:U,...Y}=La(C,$);return{...Y,registries:U}};if(de.existsSync(k)){let C=await de.readJson(k);e.force?C.registries&&(p.registries={...C.registries,...p.registries||{}}):p=v(C,p)}e.registryBaseConfig&&(p=v(p,e.registryBaseConfig)),e.rtl!==void 0&&(p.rtl=e.rtl),p.registries=Object.fromEntries(Object.entries(p.registries||{}).filter(([C])=>!Object.keys(re).includes(C))),await Aa.writeFile(y,`${JSON.stringify(p,null,2)}
126
+ `,"utf8"),g.succeed();let I=await ae(e.cwd,p),x=await ze(I);if(x){let C={};if(p.menuColor&&(C.menuColor=p.menuColor),p.menuAccent&&(C.menuAccent=p.menuAccent),p.rtl!==void 0&&(C.rtl=p.rtl),p.iconLibrary&&(C.iconLibrary=p.iconLibrary),Object.keys(C).length>0)for(let $ of Object.keys(x)){let U=x[$];if(U.resolvedPaths.cwd===I.resolvedPaths.cwd)continue;let Y=ue.resolve(U.resolvedPaths.cwd,"components.json");if(de.existsSync(Y)){let Pe=await de.readJson(Y);await de.writeJson(Y,{...Pe,...C},{spaces:2})}}}return Uo.clearCaches(),await pe(f,I,{overwrite:!0,overwriteCssVars:e.reinstall||void 0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),m&&await m({projectPath:e.cwd}),I}async function Da(e=null){let[t,r]=await Promise.all([Pr(),Go()]);l.info("");let o=await _e([{type:"toggle",name:"typescript",message:`Would you like to use ${d.info("TypeScript")} (recommended)?`,initial:e?.tsx??!0,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:t.map(s=>({title:s.label,value:s.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:r.map(s=>({title:s.label,value:s.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${d.info("global CSS")} file?`,initial:e?.tailwind.css??Vo},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${d.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables??!0,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${d.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${d.info("tailwind.config.js")} located?`,initial:e?.tailwind.config??Do},{type:"text",name:"components",message:`Configure the import alias for ${d.info("components")}:`,initial:e?.aliases.components??Bt},{type:"toggle",name:"rsc",message:`Are you using ${d.info("React Server Components")}?`,initial:e?.rsc??!0,active:"yes",inactive:"no"}]);o.style||process.exit(1);let n=e&&e.aliases.components===o.components?e.aliases:void 0,i=Un(o.components,n);return z.parse({$schema:"https://www.loveui.dev/schema.json",style:o.style,tailwind:{config:o.tailwindConfig,css:o.tailwindCss,baseColor:o.tailwindBaseColor,cssVariables:o.tailwindCssVariables,prefix:o.tailwindPrefix},rsc:o.rsc,tsx:o.typescript,aliases:{components:o.components,ui:i.ui,lib:i.lib,hooks:i.hooks,utils:i.utils}})}async function Ua(e,t){let r=typeof t.registryBaseConfig?.style=="string"?t.registryBaseConfig.style:e.style,o=typeof t.registryBaseConfig?.tailwind?.baseColor=="string"?t.registryBaseConfig.tailwind.baseColor:"neutral",n=e.tailwind.cssVariables,i=typeof t.registryBaseConfig?.iconLibrary=="string"?t.registryBaseConfig.iconLibrary:e.iconLibrary??"lucide";if(!t.defaults&&!t.registryBaseConfig?.style){let[s,c]=await Promise.all([Pr(),lt(e)]);r=(await _e([{type:c==="v4"||r?null:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:s.map(f=>({title:f.name==="new-york"?"New York (Recommended)":f.label,value:f.name})),initial:0}])).style??r??"new-york"}return n=t.cssVariables,z.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:o,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:i,rtl:t.rtl??e?.rtl??!1,aliases:e?.aliases})}async function Ma(e,t){return e.startsWith("base-")?t:(l.warn(` Existing config uses ${d.info(e)}. Love UI now uses ${d.info("Base UI")} presets only.`),l.break(),"base")}import zn from"path";import Wr from"fs-extra";async function Jn(e){let t={};if(!Wr.existsSync(e.cwd)||!Wr.existsSync(zn.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};if(!Wr.existsSync(zn.resolve(e.cwd,"components.json"))){if(await M(e.cwd)){let r=await B(e.cwd);r.length>0&&(W("add [component]",r),process.exit(1))}return t["3"]=!0,{errors:t,config:null}}try{let r=await j(e.cwd);return{errors:t,config:r}}catch{l.break(),l.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
127
+ Before you can add components, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{existsSync as zr,promises as Gn}from"fs";import nr from"path";import{Project as Ba}from"ts-morph";import{loadConfig as Wa}from"tsconfig-paths";async function Hn(e,t,r={}){let o={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return o;let n=await le(e,L(t));if(!n)throw new Error("Failed to fetch components from registry.");r.skipFonts||(n=await ut(n,t));let i=Ae([n]);return o.dependencies=Array.from(new Set(n.dependencies??[])),o.devDependencies=Array.from(new Set(n.devDependencies??[])),o.docs=n.docs??null,await za(n,t,o,r,i),await Ja(n,t,o,r),Ga(n,t,o),r.skipFonts||Ha(n,o),o}async function za(e,t,r,o,n){let i=e.files;if(!i?.length)return;let[s,c]=await Promise.all([F(t.resolvedPaths.cwd),t.tailwind.baseColor?zt(t.tailwind.baseColor):Promise.resolve(void 0)]),a;try{a=Wa(t.resolvedPaths.cwd)}catch{a={resultType:"failed"}}let f=new Ba({compilerOptions:{}}),m=Ao(i,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name});for(let p=0;p<i.length;p++){let u=i[p];if(!u.content)continue;let h=Fo(u,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name,commonRoot:Oo(i.map($=>$.path),u.path),fileIndex:p});if(!h)continue;t.tsx||(h=h.replace(/\.tsx?$/,$=>$===".tsx"?".jsx":".js"));let g=zr(h),y=nr.relative(t.resolvedPaths.cwd,h),k=u.type==="registry:file"||u.type==="registry:item",v=Rr(h)||k?u.content:await Dt({filename:u.path,raw:u.content,config:t,baseColor:c,transformJsx:!t.tsx,isRemote:!1,supportedFontMarkers:n},[At,Nt,Ft,Vt,Ot,Mt,To,_t,Ut,Lt]),I=Rr(h)||k?v:await No({config:t,content:v,filePaths:m,project:f,projectInfo:s,resolvedPath:h,tsConfig:a}),x="create",C;g&&(C=await Gn.readFile(h,"utf-8"),Io(C,I)?x="skip":x="overwrite"),r.files.push({path:y,action:x,content:I,...x==="overwrite"&&{existingContent:C},type:u.type??"registry:ui"})}}async function Ja(e,t,r,o){let n=e.css&&Object.keys(e.css).length>0,i=Object.keys(e.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!n&&!i)return;let s=t.resolvedPaths.tailwindCss,c=zr(s),a=nr.relative(t.resolvedPaths.cwd,s),f=c?await Gn.readFile(s,"utf8"):"",m=f;i&&(m=await ft(m,e.cssVars,t,{overwriteCssVars:o.overwriteCssVars})),n&&(m=await Dr(m,e.css));let p=0;if(e.cssVars)for(let u of Object.values(e.cssVars))u&&(p+=Object.keys(u).length);r.css={path:a,content:m,...c&&{existingContent:f},action:c?"update":"create",cssVarsCount:p}}function Ga(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let o=nr.join(t.resolvedPaths.cwd,".env.local"),n=zr(o),i=nr.relative(t.resolvedPaths.cwd,o);r.envVars={path:i,variables:e.envVars,action:n?"update":"create"}}function Ha(e,t){if(e.fonts?.length)for(let r of e.fonts)t.fonts.push({name:r.font.family,provider:r.font.provider==="google"?"Google Fonts":r.font.provider})}import{diffWords as Ka,structuredPatch as Ya}from"diff";import{bold as H,cyan as Jr,dim as w,green as K,red as Gr,yellow as ot}from"kleur/colors";var Ce=5,qa=w("\u250C"+"\u2500".repeat(46)),Za=w("\u2514"+"\u2500".repeat(46)),Xa={create:"+",overwrite:"~",skip:"="},Qa={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function yt(e){return e==="create"?K(e):e==="overwrite"||e==="update"?ot(e):w(e)}function wt(e){return`${H("\u250C")} ${H(`love-ui add ${e.join(", ")}`)} ${w("(dry run)")}`}function qn(e,t){return e===t||e.includes(t)||e.endsWith(t)}function Ve(e,t,r=o=>o){e.push(`${w("\u2502")} ${qa}`);for(let o of t)e.push(`${w("\u2502")} ${w("\u2502")} ${r(o)}`);e.push(`${w("\u2502")} ${Za}`)}function Zn(e,t,r={}){return r.diff?typeof r.diff=="string"?tl(e,t,r.diff):rl(e,t):r.view?typeof r.view=="string"?nl(e,t,r.view):ol(e,t):el(e,t)}function el(e,t){let r=[];r.push(wt(t)),r.push(w("\u2502")),il(e,r),Kn("Dependencies",e.dependencies,r),Kn("Dev Dependencies",e.devDependencies,r),sl(e,r),al(e,r),ll(e,r);let o=e.files.filter(i=>i.action==="overwrite").length;o>0&&(r.push(ot(`\u26A0 ${o} ${o===1?"file":"files"} will be overwritten.`)),r.push(w("\u2502")));let n=[];return e.files.length>0&&n.push(`${e.files.length} ${e.files.length===1?"file":"files"}`),e.dependencies.length>0&&n.push(`${e.dependencies.length} ${e.dependencies.length===1?"dep":"deps"}`),e.css?.cssVarsCount&&n.push(`${e.css.cssVarsCount} CSS vars`),n.length>0&&(r.push(`${w("\u2502")} ${w(n.join(", "))}`),r.push(w("\u2502"))),r.push(`${w("\u2502")} ${w("Run with --diff to view changes.")}`),r.push(`${w("\u2502")} ${w("Run with --view to view file contents.")}`),r.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),r.join(`
128
128
  `)}function tl(e,t,r){let o=[];o.push(wt(t)),o.push(w("\u2502"));let n=Qn(e.files,r),i=e.css&&qn(e.css.path,r);if(n.length===0&&!i)o.push(`${w("\u2502")} ${ot(`No file matching "${r}" found.`)}`),o.push(w("\u2502"));else{for(let s of n)Xn(s,o);if(i&&e.css){if(o.push(`${w("\u251C")} ${H(e.css.path)} ${w("(")}${yt(e.css.action)}${w(")")}`),e.css.action==="create"||!e.css.existingContent)Ve(o,e.css.content.split(`
129
129
  `),s=>K(`+${s}`));else{let s=ei(e.css.existingContent,e.css.content,e.css.path,{fullContext:!0});Ve(o,s)}o.push(w("\u2502"))}}return o.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),o.join(`
130
- `)}function rl(e,t){let r=[];r.push(wt(t)),r.push(w("\u2502"));let o=e.files.slice(0,Re);if(o.length===0&&!e.css)r.push(`${w("\u2502")} ${w("No changes.")}`),r.push(w("\u2502"));else{for(let s of o)Xn(s,r);e.files.length>Re&&r.push(w("\u2502"))}let n=e.files.length;return n>Re&&r.push(` ${w(`Showing ${Re} of ${n} files. Use --diff <path> to view a specific file.`)}`),r.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),r.join(`
131
- `)}function ol(e,t){let r=[];r.push(wt(t)),r.push(w("\u2502"));let o=e.files.slice(0,Re);if(o.length===0&&!e.css)r.push(`${w("\u2502")} ${w("No files.")}`),r.push(w("\u2502"));else{for(let s of o){let c=s.content.split(`
132
- `);r.push(`${w("\u251C")} ${H(s.path)} ${w("(")}${yt(s.action)}${w(")")} ${w(`${c.length} lines`)}`),Ve(r,c),r.push(w("\u2502"))}e.files.length>Re&&r.push(w("\u2502"))}let n=e.files.length;return n>Re&&r.push(` ${w(`Showing ${Re} of ${n} files. Use --view <path> to view a specific file.`)}`),r.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),r.join(`
130
+ `)}function rl(e,t){let r=[];r.push(wt(t)),r.push(w("\u2502"));let o=e.files.slice(0,Ce);if(o.length===0&&!e.css)r.push(`${w("\u2502")} ${w("No changes.")}`),r.push(w("\u2502"));else{for(let s of o)Xn(s,r);e.files.length>Ce&&r.push(w("\u2502"))}let n=e.files.length;return n>Ce&&r.push(` ${w(`Showing ${Ce} of ${n} files. Use --diff <path> to view a specific file.`)}`),r.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),r.join(`
131
+ `)}function ol(e,t){let r=[];r.push(wt(t)),r.push(w("\u2502"));let o=e.files.slice(0,Ce);if(o.length===0&&!e.css)r.push(`${w("\u2502")} ${w("No files.")}`),r.push(w("\u2502"));else{for(let s of o){let c=s.content.split(`
132
+ `);r.push(`${w("\u251C")} ${H(s.path)} ${w("(")}${yt(s.action)}${w(")")} ${w(`${c.length} lines`)}`),Ve(r,c),r.push(w("\u2502"))}e.files.length>Ce&&r.push(w("\u2502"))}let n=e.files.length;return n>Ce&&r.push(` ${w(`Showing ${Ce} of ${n} files. Use --view <path> to view a specific file.`)}`),r.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),r.join(`
133
133
  `)}function Xn(e,t){if(t.push(`${w("\u251C")} ${H(e.path)} ${w("(")}${yt(e.action)}${w(")")}`),e.action==="skip")t.push(`${w("\u2502")} ${w("No changes.")}`);else if(e.action==="create")Ve(t,e.content.split(`
134
134
  `),r=>K(`+${r}`));else{let r=ei(e.existingContent,e.content,e.path);Ve(t,r)}t.push(w("\u2502"))}function nl(e,t,r){let o=[];o.push(wt(t)),o.push(w("\u2502"));let n=Qn(e.files,r),i=e.css&&qn(e.css.path,r);if(n.length===0&&!i)o.push(`${w("\u2502")} ${ot(`No file matching "${r}" found.`)}`),o.push(w("\u2502"));else{for(let s of n){let c=s.content.split(`
135
135
  `);o.push(`${w("\u251C")} ${H(s.path)} ${w("(")}${yt(s.action)}${w(")")} ${w(`${c.length} lines`)}`),Ve(o,c),o.push(w("\u2502"))}if(i&&e.css){let s=e.css.content.split(`
136
136
  `);o.push(`${w("\u251C")} ${H(e.css.path)} ${w("(")}${yt(e.css.action)}${w(")")} ${w(`${s.length} lines`)}`),Ve(o,s),o.push(w("\u2502"))}}return o.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),o.join(`
137
- `)}function il(e,t){if(e.files.length===0)return;let r={create:0,overwrite:0,skip:0};for(let s of e.files)r[s.action]++;let o=[];r.create>0&&o.push(K(`+${r.create} new`)),r.overwrite>0&&o.push(ot(`~${r.overwrite} overwrite`)),r.skip>0&&o.push(w(`=${r.skip} skip`));let n=o.length>0?` ${o.join(w(", "))}`:"";t.push(`${w("\u251C")} ${H("Files")} ${w(`(${e.files.length})`)}${n}`);let i=Math.max(...e.files.map(s=>s.path.length));for(let s of e.files){let c=Xa[s.action],a=Qa[s.action],f=" ".repeat(Math.max(1,i-s.path.length+2)),m=s.action==="create"?K:s.action==="overwrite"?ot:w,p=s.action==="skip"?w(s.path):s.path;t.push(`${w("\u2502")} ${m(c)} ${p}${f}${m(a)}`)}t.push(w("\u2502"))}function Kn(e,t,r){if(t.length){r.push(`${w("\u251C")} ${H(e)} ${w(`(${t.length})`)}`);for(let o of t)r.push(`${w("\u2502")} ${K("+")} ${o}`);r.push(w("\u2502"))}}function sl(e,t){e.css&&(t.push(`${w("\u251C")} ${H("CSS")}`),e.css.cssVarsCount>0?t.push(`${w("\u2502")} ${K("+")} ${e.css.cssVarsCount} CSS variables added to ${Gr(e.css.path)}`):t.push(`${w("\u2502")} ${K("+")} Updated ${Gr(e.css.path)}`),t.push(w("\u2502")))}function al(e,t){if(!e.envVars)return;let r=Object.keys(e.envVars.variables);t.push(`${w("\u251C")} ${H("Environment Variables")}`);for(let o of r)t.push(`${w("\u2502")} ${K("+")} ${o}`);t.push(w("\u2502"))}function ll(e,t){if(e.fonts.length){t.push(`${w("\u251C")} ${H("Fonts")}`);for(let r of e.fonts)t.push(`${w("\u2502")} ${K("+")} ${r.name} ${w(`(${r.provider})`)}`);t.push(w("\u2502"))}}function Qn(e,t){let r=e.filter(o=>o.path===t);return r.length>0?r:e.filter(o=>o.path.includes(t)||o.path.replace(/\\/g,"/").includes(t))}function ei(e,t,r,o={}){if(ul(e,t))return[w(" Formatting-only changes (spacing, quotes, semicolons).")];let n=Yn(e),i=Yn(t),s=o.fullContext?Math.max(n.split(`
137
+ `)}function il(e,t){if(e.files.length===0)return;let r={create:0,overwrite:0,skip:0};for(let s of e.files)r[s.action]++;let o=[];r.create>0&&o.push(K(`+${r.create} new`)),r.overwrite>0&&o.push(ot(`~${r.overwrite} overwrite`)),r.skip>0&&o.push(w(`=${r.skip} skip`));let n=o.length>0?` ${o.join(w(", "))}`:"";t.push(`${w("\u251C")} ${H("Files")} ${w(`(${e.files.length})`)}${n}`);let i=Math.max(...e.files.map(s=>s.path.length));for(let s of e.files){let c=Xa[s.action],a=Qa[s.action],f=" ".repeat(Math.max(1,i-s.path.length+2)),m=s.action==="create"?K:s.action==="overwrite"?ot:w,p=s.action==="skip"?w(s.path):s.path;t.push(`${w("\u2502")} ${m(c)} ${p}${f}${m(a)}`)}t.push(w("\u2502"))}function Kn(e,t,r){if(t.length){r.push(`${w("\u251C")} ${H(e)} ${w(`(${t.length})`)}`);for(let o of t)r.push(`${w("\u2502")} ${K("+")} ${o}`);r.push(w("\u2502"))}}function sl(e,t){e.css&&(t.push(`${w("\u251C")} ${H("CSS")}`),e.css.cssVarsCount>0?t.push(`${w("\u2502")} ${K("+")} ${e.css.cssVarsCount} CSS variables added to ${Jr(e.css.path)}`):t.push(`${w("\u2502")} ${K("+")} Updated ${Jr(e.css.path)}`),t.push(w("\u2502")))}function al(e,t){if(!e.envVars)return;let r=Object.keys(e.envVars.variables);t.push(`${w("\u251C")} ${H("Environment Variables")}`);for(let o of r)t.push(`${w("\u2502")} ${K("+")} ${o}`);t.push(w("\u2502"))}function ll(e,t){if(e.fonts.length){t.push(`${w("\u251C")} ${H("Fonts")}`);for(let r of e.fonts)t.push(`${w("\u2502")} ${K("+")} ${r.name} ${w(`(${r.provider})`)}`);t.push(w("\u2502"))}}function Qn(e,t){let r=e.filter(o=>o.path===t);return r.length>0?r:e.filter(o=>o.path.includes(t)||o.path.replace(/\\/g,"/").includes(t))}function ei(e,t,r,o={}){if(ul(e,t))return[w(" Formatting-only changes (spacing, quotes, semicolons).")];let n=Yn(e),i=Yn(t),s=o.fullContext?Math.max(n.split(`
138
138
  `).length,i.split(`
139
139
  `).length):3,c=Ya(`a/${r}`,`b/${r}`,n,i,"","",{context:s});if(!c.hunks.length)return[w(" No changes.")];let a=[w(`--- a/${r}`),w(`+++ b/${r}`)],f=t.split(`
140
- `);for(let m of c.hunks){let{entries:p,newLineIndex:u}=cl(m,f);if(!p.some(k=>k.kind!=="context"))continue;let h=p.filter(k=>k.kind==="context").length,g=p.filter(k=>k.kind==="removed").length,y=p.filter(k=>k.kind==="added").length;a.push(Gr(`@@ -${m.oldStart},${h+g} +${m.newStart},${h+y} @@`));for(let k of p)a.push(k.formatted)}return a}function cl(e,t){let r=[],o=e.newStart-1,n=0;for(;n<e.lines.length;){let i=e.lines[n];if(i.startsWith("-")){let s=[];for(;n<e.lines.length&&e.lines[n].startsWith("-");)s.push(e.lines[n].slice(1)),n++;for(;n<e.lines.length&&e.lines[n].startsWith("\\");)n++;let c=[];for(;n<e.lines.length&&e.lines[n].startsWith("+");)c.push(e.lines[n].slice(1)),n++;for(;n<e.lines.length&&e.lines[n].startsWith("\\");)n++;o=fl(s,c,t,o,r)}else if(i.startsWith("+")){let s=t[o]??i.slice(1);r.push({kind:"added",formatted:K(`+${s}`)}),o++,n++}else if(i.startsWith("\\"))n++;else{let s=t[o]??i.slice(1);r.push({kind:"context",formatted:w(` ${s}`)}),o++,n++}}return{entries:r,newLineIndex:o}}function fl(e,t,r,o,n){if(dl(e,t)){for(let a=0;a<t.length;a++){let f=r[o]??t[a];n.push({kind:"context",formatted:w(` ${f}`)}),o++}return o}let i=ml(e),s=i.map(ir),c=new Set;for(let a=0;a<t.length;a++){let f=r[o]??t[a],m=ir(t[a]),p=s.findIndex((u,h)=>!c.has(h)&&u===m);if(p!==-1)c.add(p),n.push({kind:"context",formatted:w(` ${f}`)});else{let u=s.findIndex((h,g)=>!c.has(g));if(u!==-1){c.add(u);let{oldHighlighted:h,newHighlighted:g}=pl(i[u],f);n.push({kind:"removed",formatted:h}),n.push({kind:"added",formatted:g})}else n.push({kind:"added",formatted:K(`+${f}`)})}o++}for(let a=0;a<i.length;a++)c.has(a)||n.push({kind:"removed",formatted:Hr(`-${i[a]}`)});return o}function Yn(e){return e.split(`
140
+ `);for(let m of c.hunks){let{entries:p,newLineIndex:u}=cl(m,f);if(!p.some(k=>k.kind!=="context"))continue;let h=p.filter(k=>k.kind==="context").length,g=p.filter(k=>k.kind==="removed").length,y=p.filter(k=>k.kind==="added").length;a.push(Jr(`@@ -${m.oldStart},${h+g} +${m.newStart},${h+y} @@`));for(let k of p)a.push(k.formatted)}return a}function cl(e,t){let r=[],o=e.newStart-1,n=0;for(;n<e.lines.length;){let i=e.lines[n];if(i.startsWith("-")){let s=[];for(;n<e.lines.length&&e.lines[n].startsWith("-");)s.push(e.lines[n].slice(1)),n++;for(;n<e.lines.length&&e.lines[n].startsWith("\\");)n++;let c=[];for(;n<e.lines.length&&e.lines[n].startsWith("+");)c.push(e.lines[n].slice(1)),n++;for(;n<e.lines.length&&e.lines[n].startsWith("\\");)n++;o=fl(s,c,t,o,r)}else if(i.startsWith("+")){let s=t[o]??i.slice(1);r.push({kind:"added",formatted:K(`+${s}`)}),o++,n++}else if(i.startsWith("\\"))n++;else{let s=t[o]??i.slice(1);r.push({kind:"context",formatted:w(` ${s}`)}),o++,n++}}return{entries:r,newLineIndex:o}}function fl(e,t,r,o,n){if(dl(e,t)){for(let a=0;a<t.length;a++){let f=r[o]??t[a];n.push({kind:"context",formatted:w(` ${f}`)}),o++}return o}let i=ml(e),s=i.map(ir),c=new Set;for(let a=0;a<t.length;a++){let f=r[o]??t[a],m=ir(t[a]),p=s.findIndex((u,h)=>!c.has(h)&&u===m);if(p!==-1)c.add(p),n.push({kind:"context",formatted:w(` ${f}`)});else{let u=s.findIndex((h,g)=>!c.has(g));if(u!==-1){c.add(u);let{oldHighlighted:h,newHighlighted:g}=pl(i[u],f);n.push({kind:"removed",formatted:h}),n.push({kind:"added",formatted:g})}else n.push({kind:"added",formatted:K(`+${f}`)})}o++}for(let a=0;a<i.length;a++)c.has(a)||n.push({kind:"removed",formatted:Gr(`-${i[a]}`)});return o}function Yn(e){return e.split(`
141
141
  `).map(t=>{let r=t.match(/^(\s*)/)?.[1]??"",o=t.slice(r.length);return r+o.replace(/['"]/g,'"').replace(/;$/g,"")}).join(`
142
- `)}function ml(e){let t=[];for(let r=0;r<e.length;r++){let o=e[r];for(;r+1<e.length&&o.trimEnd().endsWith(":");)r++,o=o.trimEnd()+" "+e[r].trim();t.push(o)}return t}function pl(e,t){let r=Ka(e,t),o="-",n="+";for(let i of r)i.added?n+=H(K(i.value)):i.removed?o+=H(Hr(i.value)):(o+=Hr(i.value),n+=K(i.value));return{oldHighlighted:o,newHighlighted:n}}function ir(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function ul(e,t){let r=o=>o.split(`
142
+ `)}function ml(e){let t=[];for(let r=0;r<e.length;r++){let o=e[r];for(;r+1<e.length&&o.trimEnd().endsWith(":");)r++,o=o.trimEnd()+" "+e[r].trim();t.push(o)}return t}function pl(e,t){let r=Ka(e,t),o="-",n="+";for(let i of r)i.added?n+=H(K(i.value)):i.removed?o+=H(Gr(i.value)):(o+=Gr(i.value),n+=K(i.value));return{oldHighlighted:o,newHighlighted:n}}function ir(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function ul(e,t){let r=o=>o.split(`
143
143
  `).map(ir).filter(n=>n.length>0).join(" ");return r(e)===r(t)}function dl(e,t){let r=o=>o.map(ir).filter(n=>n.length>0).join(" ");return r(e)===r(t)}import ti from"fs/promises";import gl from"path";async function ri(e,t){let r=gl.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await ti.stat(r)).isFile())return;let[o]=await ie([e],{config:t});if(!o?.meta?.importSpecifier||!o?.meta?.moduleSpecifier)return;let n=`import { ${o?.meta?.importSpecifier} } from "${o.meta.moduleSpecifier}"
144
144
 
145
145
  export default function Page() {
146
146
  return <${o?.meta?.importSpecifier} />
147
- }`;await ti.writeFile(r,n,"utf8")}import{Command as yl}from"commander";import Kr from"prompts";import{z as _}from"zod";var wl=_.object({components:_.array(_.string()).optional(),yes:_.boolean(),overwrite:_.boolean(),cwd:_.string(),all:_.boolean(),path:_.string().optional(),silent:_.boolean(),dryRun:_.boolean(),diff:_.union([_.string(),_.literal(!0)]).optional(),view:_.union([_.string(),_.literal(!0)]).optional()}),oi=new yl().name("add").description("add a component to your project").argument("[components...]","names, url or local path to component").option("-y, --yes","skip confirmation prompt.",!1).option("-o, --overwrite","overwrite existing files.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",!1).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",!1).option("--dry-run","preview changes without writing files.",!1).option("--diff [path]","show diff for a file.").option("--view [path]","show file contents.").action(async(e,t)=>{try{let r=wl.parse({components:e,...t,cwd:hl.resolve(t.cwd)});await ee(r.cwd);let o=r.dryRun||r.diff||r.view,n=await j(r.cwd);n||(n=Je({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let i=!1;if(e.length>0){let{config:g,newRegistries:y}=await G(e,n,{silent:r.silent,writeFile:!1});n=g,i=y.length>0}let s,c=!0;if(e.length>0){let[g]=await ie([e[0]],{config:n});if(s=g?.type,c=s!=="registry:theme"&&s!=="registry:style"&&s!=="registry:base",_o(g)&&!o){await pe(e,n,r);return}if(!r.yes&&!o&&(s==="registry:style"||s==="registry:theme")){l.break();let{confirm:y}=await Kr({type:"confirm",name:"confirm",message:d.warn(`You are about to install a new ${s.replace("registry:","")}.
148
- Existing CSS variables and components will be overwritten. Continue?`)});y||(l.break(),l.log("Installation cancelled."),l.break(),process.exit(1))}}r.components?.length||(r.components=await bl(r));let a=await F(r.cwd);if(a?.tailwindVersion==="v4"){let g=jt.filter(y=>r.components?.includes(y.name));g?.length&&(l.break(),g.forEach(y=>{l.warn(d.warn(y.message))}),l.break(),process.exit(1))}let{errors:f,config:m}=await Jn(r),p=!1;if(f["3"]){let{proceed:g}=await Kr({type:"confirm",name:"proceed",message:`You need to create a ${d.info("components.json")} file to add components. Proceed?`,initial:!0});g||(l.break(),process.exit(1));let y=Xe(a?.framework.name),k=await qe(),{url:v}=await ct({rtl:!1,base:k,template:y}),{registryBaseConfig:I,installStyleIndex:x,url:C}=await Fe(v,r.cwd);m=await rt({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!i,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:x,components:[C,...r.components??[]],registryBaseConfig:I}),p=!0}let u=!1;if(f["1"]){let{projectPath:g,template:y}=await or({cwd:r.cwd,force:r.overwrite,components:r.components});g||(l.break(),process.exit(1)),r.cwd=g;let k=await qe(),{url:v}=await ct({rtl:!1,base:k,template:y}),{registryBaseConfig:I,installStyleIndex:x,url:C}=await Fe(v,r.cwd);m=await rt({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!i&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:x,components:[C,...r.components??[]],registryBaseConfig:I}),p=!0,u=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//)}if(!m)throw new Error(`Failed to read config at ${d.info(r.cwd)}.`);let{config:h}=await G(r.components,m,{silent:r.silent||i,writeFile:!o});if(m=h,o){let g=b("Resolving items.",{silent:r.silent}).start(),y=await Hn(r.components,m,{overwrite:r.overwrite});g.stop(),l.log(Zn(y,r.components,{diff:r.diff,view:r.view}));return}p||await pe(r.components,m,r),u&&await ri(r.components[0],m)}catch(r){l.break(),R(r)}finally{ne()}});async function bl(e){let t=await Ge();if(!t)return l.break(),R(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(n=>n.name).filter(n=>!jt.some(i=>i.name===n));if(e.components?.length)return e.components;let{components:r}=await Kr({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:!1,choices:t.filter(n=>n.type==="registry:ui"&&!jt.some(i=>i.name===n.name)).map(n=>({title:n.name,value:n.name,selected:e.all?!0:e.components?.includes(n.name)}))});r?.length||(l.warn("No components selected. Exiting."),l.info(""),process.exit(1));let o=_.array(_.string()).safeParse(r);return o.success?o.data:(l.error(""),R(new Error("Something went wrong. Please try again.")),[])}import Xr from"path";import Yr from"path";import qr from"fs-extra";async function ni(e){let t={};if(!qr.existsSync(e.cwd)||!qr.existsSync(Yr.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};if(!qr.existsSync(Yr.resolve(e.cwd,"components.json"))){if(await M(e.cwd)){let r=await B(e.cwd),o=[];for(let n of r){let i=await F(Yr.resolve(e.cwd,n.name));i?.framework&&i.framework.name!=="manual"&&o.push(n)}o.length>0&&(W("apply --preset <preset>",o,{cwdFlag:"-c"}),process.exit(1))}return t["3"]=!0,{errors:t,config:null}}try{let r=await j(e.cwd);return{errors:t,config:r}}catch{l.break(),l.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
149
- Before you can apply a preset, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{Command as kl}from"commander";import Zr from"fs-extra";import vl from"prompts";import{z as ge}from"zod";var Cl=ge.object({cwd:ge.string(),positionalPreset:ge.string().optional(),preset:ge.string().optional(),only:ge.union([ge.boolean(),ge.string()]).optional(),yes:ge.boolean(),silent:ge.boolean()}),ai=["theme","font"],nt=class extends Error{constructor(t){super(t),this.name="ApplyOnlyError"}},sr=class extends Error{constructor(t){super(t),this.name="ApplyWorkspaceSyncError"}},li=new kl().name("apply").description("apply a preset to an existing project").argument("[preset]","the preset to apply").option("--preset <preset>","preset configuration to apply").option("--only [parts]","apply only parts of a preset: theme, font").option("-y, --yes","skip confirmation prompt.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",!1).action(async(e,t)=>{try{let r=Cl.parse({...t,cwd:Xr.resolve(t.cwd),positionalPreset:e}),o=Rl(r),n=ii(r.only);Il({preset:o,only:n});let i=await ni(r);i.errors["1"]&&(l.break(),l.error(`The ${d.info("apply")} command only works in an existing project.`),l.error(`Run ${d.info(si(o))} first.`),l.break(),process.exit(1)),i.errors["3"]&&(l.break(),l.error(`No ${d.info("components.json")} found at ${d.info(r.cwd)}.`),l.error(`Run ${d.info(si(o))} first.`),l.break(),process.exit(1));let s=i.config;s||process.exit(1);let c=s.rtl??!1,a=await El(r.cwd);if(!o){let y=Vr({command:"init",template:a,base:Te(s.style),rtl:c});await Dr({createUrl:y,followUp:`Then run ${d.info("love-ui apply --preset <preset>")} with the preset code or preset URL from loveui.dev.`,prompt:!r.yes}),process.exit(0)}$l(o);let f=n??ii(xl(o)),m=!f,p=m?await He(r.cwd):[];if(!r.yes){if(l.break(),f?l.warn(d.warn("Applying the selected preset parts will update your project configuration and styles.")):l.warn(d.warn("Applying a new preset will overwrite existing UI components, fonts, and CSS variables.")),l.warn("Commit or stash your changes before continuing so you can easily go back."),m)if(l.break(),l.log(" The following components will be re-installed:"),p.length)for(let k=0;k<p.length;k+=8)l.log(` - ${p.slice(k,k+8).join(", ")}`);else l.log(" - No installed UI components were detected.");l.break();let{proceed:y}=await vl({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});y||(l.break(),process.exit(1))}await ee(r.cwd);let u=Te(s.style),h=Fl(o,u,{template:a,rtl:c,only:f?.join(",")}),g=await Bn(Xr.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:y,installStyleIndex:k,url:v}=await Fe(h,r.cwd,{registries:s.registries}),I=Pl({registryBaseConfig:y,existingConfig:s,only:f});return await rt({cwd:r.cwd,yes:!0,force:!1,reinstall:m,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:k,registryBaseConfig:I,existingConfig:s,components:[v,...p]})});await jl(g,{only:f}),l.break(),l.log("Preset applied successfully."),l.break()}catch(r){if(r instanceof nt){for(let o of r.message.split(`
147
+ }`;await ti.writeFile(r,n,"utf8")}import{Command as yl}from"commander";import Hr from"prompts";import{z as _}from"zod";var wl=_.object({components:_.array(_.string()).optional(),yes:_.boolean(),overwrite:_.boolean(),cwd:_.string(),all:_.boolean(),path:_.string().optional(),silent:_.boolean(),dryRun:_.boolean(),diff:_.union([_.string(),_.literal(!0)]).optional(),view:_.union([_.string(),_.literal(!0)]).optional()}),oi=new yl().name("add").description("add a component to your project").argument("[components...]","names, url or local path to component").option("-y, --yes","skip confirmation prompt.",!1).option("-o, --overwrite","overwrite existing files.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",!1).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",!1).option("--dry-run","preview changes without writing files.",!1).option("--diff [path]","show diff for a file.").option("--view [path]","show file contents.").action(async(e,t)=>{try{let r=wl.parse({components:e,...t,cwd:hl.resolve(t.cwd)});await ee(r.cwd);let o=r.dryRun||r.diff||r.view,n=await j(r.cwd);n||(n=Je({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let i=!1;if(e.length>0){let{config:g,newRegistries:y}=await G(e,n,{silent:r.silent,writeFile:!1});n=g,i=y.length>0}let s,c=!0;if(e.length>0){let[g]=await ie([e[0]],{config:n});if(s=g?.type,c=s!=="registry:theme"&&s!=="registry:style"&&s!=="registry:base",Lo(g)&&!o){await pe(e,n,r);return}if(!r.yes&&!o&&(s==="registry:style"||s==="registry:theme")){l.break();let{confirm:y}=await Hr({type:"confirm",name:"confirm",message:d.warn(`You are about to install a new ${s.replace("registry:","")}.
148
+ Existing CSS variables and components will be overwritten. Continue?`)});y||(l.break(),l.log("Installation cancelled."),l.break(),process.exit(1))}}r.components?.length||(r.components=await bl(r));let a=await F(r.cwd);if(a?.tailwindVersion==="v4"){let g=jt.filter(y=>r.components?.includes(y.name));g?.length&&(l.break(),g.forEach(y=>{l.warn(d.warn(y.message))}),l.break(),process.exit(1))}let{errors:f,config:m}=await Jn(r),p=!1;if(f["3"]){let{proceed:g}=await Hr({type:"confirm",name:"proceed",message:`You need to create a ${d.info("components.json")} file to add components. Proceed?`,initial:!0});g||(l.break(),process.exit(1));let y=Xe(a?.framework.name),k=await qe(),{url:v}=await ct({rtl:!1,base:k,template:y}),{registryBaseConfig:I,installStyleIndex:x,url:C}=await Te(v,r.cwd);m=await rt({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!i,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:x,components:[C,...r.components??[]],registryBaseConfig:I}),p=!0}let u=!1;if(f["1"]){let{projectPath:g,template:y}=await or({cwd:r.cwd,force:r.overwrite,components:r.components});g||(l.break(),process.exit(1)),r.cwd=g;let k=await qe(),{url:v}=await ct({rtl:!1,base:k,template:y}),{registryBaseConfig:I,installStyleIndex:x,url:C}=await Te(v,r.cwd);m=await rt({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!i&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:x,components:[C,...r.components??[]],registryBaseConfig:I}),p=!0,u=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//)}if(!m)throw new Error(`Failed to read config at ${d.info(r.cwd)}.`);let{config:h}=await G(r.components,m,{silent:r.silent||i,writeFile:!o});if(m=h,o){let g=b("Resolving items.",{silent:r.silent}).start(),y=await Hn(r.components,m,{overwrite:r.overwrite});g.stop(),l.log(Zn(y,r.components,{diff:r.diff,view:r.view}));return}p||await pe(r.components,m,r),u&&await ri(r.components[0],m)}catch(r){l.break(),R(r)}finally{ne()}});async function bl(e){let t=await Ge();if(!t)return l.break(),R(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(n=>n.name).filter(n=>!jt.some(i=>i.name===n));if(e.components?.length)return e.components;let{components:r}=await Hr({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:!1,choices:t.filter(n=>n.type==="registry:ui"&&!jt.some(i=>i.name===n.name)).map(n=>({title:n.name,value:n.name,selected:e.all?!0:e.components?.includes(n.name)}))});r?.length||(l.warn("No components selected. Exiting."),l.info(""),process.exit(1));let o=_.array(_.string()).safeParse(r);return o.success?o.data:(l.error(""),R(new Error("Something went wrong. Please try again.")),[])}import Zr from"path";import Kr from"path";import Yr from"fs-extra";async function ni(e){let t={};if(!Yr.existsSync(e.cwd)||!Yr.existsSync(Kr.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};if(!Yr.existsSync(Kr.resolve(e.cwd,"components.json"))){if(await M(e.cwd)){let r=await B(e.cwd),o=[];for(let n of r){let i=await F(Kr.resolve(e.cwd,n.name));i?.framework&&i.framework.name!=="manual"&&o.push(n)}o.length>0&&(W("apply --preset <preset>",o,{cwdFlag:"-c"}),process.exit(1))}return t["3"]=!0,{errors:t,config:null}}try{let r=await j(e.cwd);return{errors:t,config:r}}catch{l.break(),l.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
149
+ Before you can apply a preset, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{Command as kl}from"commander";import qr from"fs-extra";import vl from"prompts";import{z as ge}from"zod";var Cl=ge.object({cwd:ge.string(),positionalPreset:ge.string().optional(),preset:ge.string().optional(),only:ge.union([ge.boolean(),ge.string()]).optional(),yes:ge.boolean(),silent:ge.boolean()}),ai=["theme","font"],nt=class extends Error{constructor(t){super(t),this.name="ApplyOnlyError"}},sr=class extends Error{constructor(t){super(t),this.name="ApplyWorkspaceSyncError"}},li=new kl().name("apply").description("apply a preset to an existing project").argument("[preset]","the preset to apply").option("--preset <preset>","preset configuration to apply").option("--only [parts]","apply only parts of a preset: theme, font").option("-y, --yes","skip confirmation prompt.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",!1).action(async(e,t)=>{try{let r=Cl.parse({...t,cwd:Zr.resolve(t.cwd),positionalPreset:e}),o=Rl(r),n=ii(r.only);Il({preset:o,only:n});let i=await ni(r);i.errors["1"]&&(l.break(),l.error(`The ${d.info("apply")} command only works in an existing project.`),l.error(`Run ${d.info(si(o))} first.`),l.break(),process.exit(1)),i.errors["3"]&&(l.break(),l.error(`No ${d.info("components.json")} found at ${d.info(r.cwd)}.`),l.error(`Run ${d.info(si(o))} first.`),l.break(),process.exit(1));let s=i.config;s||process.exit(1);let c=s.rtl??!1,a=await El(r.cwd);if(!o){let y=_r({command:"init",template:a,base:je(s.style),rtl:c});await Vr({createUrl:y,followUp:`Then run ${d.info("love-ui apply --preset <preset>")} with the preset code or preset URL from loveui.dev.`,prompt:!r.yes}),process.exit(0)}$l(o);let f=n??ii(xl(o)),m=!f,p=m?await He(r.cwd):[];if(!r.yes){if(l.break(),f?l.warn(d.warn("Applying the selected preset parts will update your project configuration and styles.")):l.warn(d.warn("Applying a new preset will overwrite existing UI components, fonts, and CSS variables.")),l.warn("Commit or stash your changes before continuing so you can easily go back."),m)if(l.break(),l.log(" The following components will be re-installed:"),p.length)for(let k=0;k<p.length;k+=8)l.log(` - ${p.slice(k,k+8).join(", ")}`);else l.log(" - No installed UI components were detected.");l.break();let{proceed:y}=await vl({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});y||(l.break(),process.exit(1))}await ee(r.cwd);let u=je(s.style),h=Fl(o,u,{template:a,rtl:c,only:f?.join(",")}),g=await Bn(Zr.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:y,installStyleIndex:k,url:v}=await Te(h,r.cwd,{registries:s.registries}),I=Pl({registryBaseConfig:y,existingConfig:s,only:f});return await rt({cwd:r.cwd,yes:!0,force:!1,reinstall:m,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:k,registryBaseConfig:I,existingConfig:s,components:[v,...p]})});await jl(g,{only:f}),l.break(),l.log("Preset applied successfully."),l.break()}catch(r){if(r instanceof nt){for(let o of r.message.split(`
150
150
  `))l.error(o);l.break(),process.exit(1)}r instanceof Qe&&(l.error(`Could not back up ${d.info("components.json")}. Aborting.`),l.break(),process.exit(1)),r instanceof sr&&(l.error(r.message),l.break(),process.exit(1)),l.break(),R(r)}finally{ne()}});function Rl(e){let t=e.positionalPreset?.trim(),r=e.preset?.trim();return t&&r&&t!==r&&(l.error(`Received two different preset values. Use either the positional preset or ${d.info("--preset")}, or pass the same value to both.`),l.break(),process.exit(1)),r??t}function xl(e){if(!q(e))return;let t=new URL(e);if(t.pathname==="/init")return t.searchParams.get("only")??void 0}function ii(e){if(!(e===void 0||e===!1)){if(e===!0)throw new nt(["Missing value for --only.",`Use one or more of: ${ai.join(", ")}.`,"Example: love-ui apply <preset> --only theme,font."].join(`
151
151
  `));return Sl(e)}}function Sl(e){let t={theme:"theme",font:"font",fonts:"font"},r=e.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean),o=r.filter(n=>!t[n]);if(!r.length||o.length)throw new nt([`Invalid value for --only: ${e}.`,`Use one or more of: ${ai.join(", ")}.`,"Example: love-ui apply <preset> --only theme,font."].join(`
152
152
  `));return Array.from(new Set(r.map(n=>t[n])))}function Il(e){if(!(!e.only||e.preset))throw new nt(["Missing preset for --only.","Use: love-ui apply <preset> --only theme,font."].join(`
153
153
  `))}function Pl(e){if(!e.only||e.only.includes("theme"))return e.registryBaseConfig;let t=typeof e.existingConfig.tailwind=="object"&&e.existingConfig.tailwind!==null?e.existingConfig.tailwind:{},r=typeof e.registryBaseConfig?.tailwind=="object"&&e.registryBaseConfig.tailwind!==null?e.registryBaseConfig.tailwind:{},o={...e.registryBaseConfig,tailwind:{...t,...r}};return e.existingConfig.menuColor&&(o.menuColor=e.existingConfig.menuColor),e.existingConfig.menuAccent&&(o.menuAccent=e.existingConfig.menuAccent),o}function $l(e){if(q(e)||Ye(e))return;let t=Object.keys(Z);t.includes(e)||(l.error(`Invalid preset: ${d.info(e)}.
154
154
  Use one of the available presets: ${t.join(", ")}
155
- or build your own at ${d.info(`${S}/create`)}`),l.break(),process.exit(1))}async function El(e){let t=await F(e);return Xe(t?.framework.name)}async function jl(e,t){if(t?.only&&!t.only.includes("theme"))return;let r=await Tl(e);if(!r.length)return;let o={style:e.style,tailwind:{baseColor:e.tailwind.baseColor,cssVariables:e.tailwind.cssVariables},...e.iconLibrary?{iconLibrary:e.iconLibrary}:{},...e.rtl!==void 0?{rtl:e.rtl}:{},...e.menuColor?{menuColor:e.menuColor}:{},...e.menuAccent?{menuAccent:e.menuAccent}:{}},n=[];for(let i of r){let s=Xr.resolve(i.resolvedPaths.cwd,"components.json");await Zr.pathExists(s)&&n.push({configPath:s,existingConfig:await Zr.readJson(s)})}try{for(let i of n)if(!gt(i.configPath))throw new Qe(i.configPath);for(let i of n)await Zr.writeJson(i.configPath,{...i.existingConfig,...o,tailwind:{...i.existingConfig.tailwind,...o.tailwind}},{spaces:2});for(let i of n)ht(i.configPath)}catch(i){for(let s of[...n].reverse())et(s.configPath);throw new sr(`Failed to sync linked workspace configs.${i instanceof Error?` ${i.message}`:""}`)}}async function Tl(e){let t=await ze(e);if(!t)return[];let r=new Map;for(let o of Object.values(t))o.resolvedPaths.cwd!==e.resolvedPaths.cwd&&r.set(o.resolvedPaths.cwd,o);return Array.from(r.values()).sort((o,n)=>o.resolvedPaths.cwd.localeCompare(n.resolvedPaths.cwd))}function Fl(e,t,r={}){if(q(e)){let n=new URL(e);return n.pathname==="/init"&&e.startsWith(S)&&n.searchParams.set("track","1"),n.searchParams.set("base",t),n.searchParams.set("rtl",String(r.rtl??!1)),r.only&&n.searchParams.set("only",r.only),n.toString()}if(Ye(e)){let n=Ke(e);return n||(l.error(`Invalid preset code: ${d.info(e)}`),l.break(),process.exit(1)),he({...n,base:t,rtl:r.rtl??!1},{preset:e,template:r.template,only:r.only})}let o=Z[e];return he({...o,base:t,rtl:r.rtl??o.rtl},{template:r.template,only:r.only})}function Ol(e){return/[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function si(e){return e?`love-ui init --preset ${Ol(e)}`:"love-ui init"}import*as bt from"fs/promises";import*as De from"path";import fi from"path";import mi from"fs-extra";async function pi(e){let t={},r={cwd:e.cwd,registryFile:fi.resolve(e.cwd,e.registryFile),outputDir:fi.resolve(e.cwd,e.outputDir)};return mi.existsSync(r.registryFile)||(t["13"]=!0),await mi.mkdir(r.outputDir,{recursive:!0}),Object.keys(t).length>0&&(t["13"]&&(l.break(),l.error(`The path ${d.info(r.registryFile)} does not exist.`)),l.break(),process.exit(1)),{errors:t,resolvePaths:r}}import{Command as Al}from"commander";import{z as ar}from"zod";var Nl=ar.object({cwd:ar.string(),registryFile:ar.string(),outputDir:ar.string()}),ui=new Al().name("build").description("build components for a Love UI registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Nl.parse({cwd:De.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:o}=await pi(r),n=await Xo(o.registryFile,{cwd:o.cwd}),i=n.registry,s=n.usesInclude?De.dirname(o.registryFile):o.cwd,c=Qo(n,s,o.cwd),a=b("Building registry...");for(let f of i.items){a.start(`Building ${f.name}...`);let m=await en(f,n,s,o.cwd);await bt.writeFile(De.resolve(o.outputDir,`${m.name}.json`),JSON.stringify(m,null,2))}n.usesInclude?await bt.writeFile(De.resolve(o.outputDir,"registry.json"),JSON.stringify(c,null,2)):await bt.copyFile(o.registryFile,De.resolve(o.outputDir,"registry.json")),a.succeed("Building registry.")}catch(r){l.break(),R(r)}});import{existsSync as Qr,promises as Ll}from"fs";import eo from"path";import{Command as _l}from"commander";import{diffLines as Vl}from"diff";import{z as kt}from"zod";var Dl=kt.object({component:kt.string().optional(),yes:kt.boolean(),cwd:kt.string(),path:kt.string().optional()}),gi=new _l().name("diff").description("[DEPRECATED] Use `add [component] --diff` instead.").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Dl.parse({component:e,...t}),o=eo.resolve(r.cwd);Qr(o)||(l.error(`The path ${o} does not exist. Please try again.`),process.exit(1));let n=await j(o);if(!n){if(await M(o)){let a=await B(o);a.length>0&&(W("diff [component]",a),process.exit(1))}l.warn(`Configuration is missing. Please run ${d.success("init")} to create a components.json file.`),process.exit(1)}let i=await Ge();if(i||(R(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a=n.resolvedPaths.components,f=i.filter(p=>{for(let u of p.files??[]){let h=eo.resolve(a,typeof u=="string"?u:u.path);if(Qr(h))return!0}return!1}),m=[];for(let p of f){let u=await di(p,n);u.length&&m.push({name:p.name,changes:u})}m.length||(l.info("No updates found."),process.exit(0)),l.info("The following components have updates available:");for(let p of m){l.info(`- ${p.name}`);for(let u of p.changes)l.info(` - ${u.filePath}`)}l.break(),l.info(`Run ${d.success("diff <component>")} to see the changes.`),process.exit(0)}let s=i.find(a=>a.name===r.component);s||(l.error(`The component ${d.success(r.component)} does not exist.`),process.exit(1));let c=await di(s,n);c.length||(l.info(`No updates found for ${r.component}.`),process.exit(0));for(let a of c)l.info(`- ${a.filePath}`),await Ul(a.patch),l.info("")}catch(r){R(r)}});async function di(e,t){let r=await Ko(t.style,[e]),o=await zt(t.tailwind.baseColor),n=Ne(r);if(!r)return[];let i=[];for(let s of r){let c=await Yo(t,s);if(c)for(let a of s.files??[]){let f=eo.resolve(c,typeof a=="string"?a:a.path);if(!Qr(f))continue;let m=await Ll.readFile(f,"utf8");if(typeof a=="string"||!a.content)continue;let p=await Dt({filename:a.path,raw:a.content,config:t,baseColor:o,supportedFontMarkers:n},[At,Nt,Ft,Vt,Ot,Mt,_t,Ut,Lt]),u=Vl(p,m);u.length>1&&i.push({filePath:f,patch:u})}}return i}async function Ul(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(d.success(t.value)):t.removed?process.stdout.write(d.error(t.value)):process.stdout.write(t.value)})}import Ml from"path";import{Command as Bl}from"commander";var hi="https://www.loveui.dev",yi=new Bl().name("docs").description("get docs, api references and usage examples for components").argument("<components...>","component names").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-b, --base <base>","the base to use either 'base' or 'radix'. defaults to project base.").option("--json","output as JSON.",!1).action(async(e,t)=>{try{let r=Ml.resolve(t.cwd),o=await j(r),n=t.base??Te(o?.style),i=await Ge();i||(l.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let a of e){let f=i.find(p=>p.name===a);f||(l.error(`Component ${d.info(a)} not found in the Love UI registry.`),process.exit(1));let m=f.meta?.links?.[n];if(!m||Object.keys(m).length===0){l.warn(`No documentation links available for ${d.info(a)}.`);continue}s.push({component:a,base:n,links:Wl(m)})}if(t.json){console.log(JSON.stringify({base:n,results:s},null,2));return}let c=Math.max(...s.flatMap(a=>Object.keys(a.links).map(f=>f.length)));for(let{component:a,links:f}of s){l.log(d.info(a));for(let[m,p]of Object.entries(f))l.log(` - ${m.padEnd(c+2)}${p}`);l.break()}}catch(r){R(r)}});function Wl(e){return Object.fromEntries(Object.entries(e).map(([t,r])=>[t,r.startsWith(hi)?`${S}${r.slice(hi.length)}`:r]))}import{promises as to}from"fs";import te from"path";import{Command as zl}from"commander";import{execa as lr}from"execa";import vt from"fs-extra";import Jl from"prompts";import{z as cr}from"zod";var wi=/@import\s+["']love-ui\/tailwind\.css["'];?\s*\n?/,Gl=cr.object({cwd:cr.string(),yes:cr.boolean(),silent:cr.boolean()}),bi=new zl().name("eject").description("inline love-ui/tailwind.css and remove the love-ui dependency").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-y, --yes","skip confirmation prompt.",!1).option("-s, --silent","mute output.",!1).action(async e=>{try{let t=Gl.parse({cwd:te.resolve(e.cwd),yes:e.yes,silent:e.silent});await Hl(t)}catch(t){R(t)}});async function Hl(e){if(!vt.existsSync(te.resolve(e.cwd,"components.json"))){if(await M(e.cwd)){let m=await B(e.cwd);m.length>0&&(W("eject",m),process.exit(1))}l.break(),l.error(`No ${d.info("components.json")} found. Run ${d.info("love-ui init")} first.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}let t=await j(e.cwd);t?.resolvedPaths.tailwindCss||(l.break(),l.error("Could not resolve the Tailwind CSS file from components.json."),l.break(),process.exit(1));let r=t.resolvedPaths.tailwindCss,o=te.relative(e.cwd,r),n=await to.readFile(r,"utf8");wi.test(n)||(l.break(),l.error(`Could not find ${d.info('@import "love-ui/tailwind.css"')} in ${d.info(o)}.`),l.error("Nothing to eject."),l.break(),process.exit(1));let i=je(e.cwd,!1),s=Kl(i),c=ql(e.cwd),a=await to.readFile(c,"utf8");if(e.silent||(l.break(),l.warn("This action is not reversible. Future Love UI CLI updates to tailwind.css will not apply automatically."),l.break()),!e.yes){l.log("This will:"),l.log(` - Inline ${d.info("love-ui/tailwind.css")} into ${d.info(o)}`),l.log(` - Remove the ${d.info("love-ui")} dependency`),l.break();let{proceed:m}=await Jl({type:"confirm",name:"proceed",message:"Proceed?",initial:!1});m||process.exit(0)}let f=b(`Inlining ${d.info("love-ui/tailwind.css")}.`,{silent:e.silent})?.start();if(n=n.replace(wi,()=>`/* ejected from love-ui@${s} */
155
+ or build your own at ${d.info(`${S}/create`)}`),l.break(),process.exit(1))}async function El(e){let t=await F(e);return Xe(t?.framework.name)}async function jl(e,t){if(t?.only&&!t.only.includes("theme"))return;let r=await Tl(e);if(!r.length)return;let o={style:e.style,tailwind:{baseColor:e.tailwind.baseColor,cssVariables:e.tailwind.cssVariables},...e.iconLibrary?{iconLibrary:e.iconLibrary}:{},...e.rtl!==void 0?{rtl:e.rtl}:{},...e.menuColor?{menuColor:e.menuColor}:{},...e.menuAccent?{menuAccent:e.menuAccent}:{}},n=[];for(let i of r){let s=Zr.resolve(i.resolvedPaths.cwd,"components.json");await qr.pathExists(s)&&n.push({configPath:s,existingConfig:await qr.readJson(s)})}try{for(let i of n)if(!gt(i.configPath))throw new Qe(i.configPath);for(let i of n)await qr.writeJson(i.configPath,{...i.existingConfig,...o,tailwind:{...i.existingConfig.tailwind,...o.tailwind}},{spaces:2});for(let i of n)ht(i.configPath)}catch(i){for(let s of[...n].reverse())et(s.configPath);throw new sr(`Failed to sync linked workspace configs.${i instanceof Error?` ${i.message}`:""}`)}}async function Tl(e){let t=await ze(e);if(!t)return[];let r=new Map;for(let o of Object.values(t))o.resolvedPaths.cwd!==e.resolvedPaths.cwd&&r.set(o.resolvedPaths.cwd,o);return Array.from(r.values()).sort((o,n)=>o.resolvedPaths.cwd.localeCompare(n.resolvedPaths.cwd))}function Fl(e,t,r={}){if(q(e)){let n=new URL(e);return n.pathname==="/init"&&e.startsWith(S)&&n.searchParams.set("track","1"),n.searchParams.set("base",t),n.searchParams.set("rtl",String(r.rtl??!1)),r.only&&n.searchParams.set("only",r.only),n.toString()}if(Ye(e)){let n=Ke(e);return n||(l.error(`Invalid preset code: ${d.info(e)}`),l.break(),process.exit(1)),he({...n,base:t,rtl:r.rtl??!1},{preset:e,template:r.template,only:r.only})}let o=Z[e];return he({...o,base:t,rtl:r.rtl??o.rtl},{template:r.template,only:r.only})}function Ol(e){return/[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function si(e){return e?`love-ui init --preset ${Ol(e)}`:"love-ui init"}import*as bt from"fs/promises";import*as De from"path";import fi from"path";import mi from"fs-extra";async function pi(e){let t={},r={cwd:e.cwd,registryFile:fi.resolve(e.cwd,e.registryFile),outputDir:fi.resolve(e.cwd,e.outputDir)};return mi.existsSync(r.registryFile)||(t["13"]=!0),await mi.mkdir(r.outputDir,{recursive:!0}),Object.keys(t).length>0&&(t["13"]&&(l.break(),l.error(`The path ${d.info(r.registryFile)} does not exist.`)),l.break(),process.exit(1)),{errors:t,resolvePaths:r}}import{Command as Al}from"commander";import{z as ar}from"zod";var Nl=ar.object({cwd:ar.string(),registryFile:ar.string(),outputDir:ar.string()}),ui=new Al().name("build").description("build components for a Love UI registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Nl.parse({cwd:De.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:o}=await pi(r),n=await Zo(o.registryFile,{cwd:o.cwd}),i=n.registry,s=n.usesInclude?De.dirname(o.registryFile):o.cwd,c=Xo(n,s,o.cwd),a=b("Building registry...");for(let f of i.items){a.start(`Building ${f.name}...`);let m=await Qo(f,n,s,o.cwd);await bt.writeFile(De.resolve(o.outputDir,`${m.name}.json`),JSON.stringify(m,null,2))}n.usesInclude?await bt.writeFile(De.resolve(o.outputDir,"registry.json"),JSON.stringify(c,null,2)):await bt.copyFile(o.registryFile,De.resolve(o.outputDir,"registry.json")),a.succeed("Building registry.")}catch(r){l.break(),R(r)}});import{existsSync as Xr,promises as Ll}from"fs";import Qr from"path";import{Command as _l}from"commander";import{diffLines as Vl}from"diff";import{z as kt}from"zod";var Dl=kt.object({component:kt.string().optional(),yes:kt.boolean(),cwd:kt.string(),path:kt.string().optional()}),gi=new _l().name("diff").description("[DEPRECATED] Use `add [component] --diff` instead.").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Dl.parse({component:e,...t}),o=Qr.resolve(r.cwd);Xr(o)||(l.error(`The path ${o} does not exist. Please try again.`),process.exit(1));let n=await j(o);if(!n){if(await M(o)){let a=await B(o);a.length>0&&(W("diff [component]",a),process.exit(1))}l.warn(`Configuration is missing. Please run ${d.success("init")} to create a components.json file.`),process.exit(1)}let i=await Ge();if(i||(R(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a=n.resolvedPaths.components,f=i.filter(p=>{for(let u of p.files??[]){let h=Qr.resolve(a,typeof u=="string"?u:u.path);if(Xr(h))return!0}return!1}),m=[];for(let p of f){let u=await di(p,n);u.length&&m.push({name:p.name,changes:u})}m.length||(l.info("No updates found."),process.exit(0)),l.info("The following components have updates available:");for(let p of m){l.info(`- ${p.name}`);for(let u of p.changes)l.info(` - ${u.filePath}`)}l.break(),l.info(`Run ${d.success("diff <component>")} to see the changes.`),process.exit(0)}let s=i.find(a=>a.name===r.component);s||(l.error(`The component ${d.success(r.component)} does not exist.`),process.exit(1));let c=await di(s,n);c.length||(l.info(`No updates found for ${r.component}.`),process.exit(0));for(let a of c)l.info(`- ${a.filePath}`),await Ul(a.patch),l.info("")}catch(r){R(r)}});async function di(e,t){let r=await Ho(t.style,[e]),o=await zt(t.tailwind.baseColor),n=Ae(r);if(!r)return[];let i=[];for(let s of r){let c=await Ko(t,s);if(c)for(let a of s.files??[]){let f=Qr.resolve(c,typeof a=="string"?a:a.path);if(!Xr(f))continue;let m=await Ll.readFile(f,"utf8");if(typeof a=="string"||!a.content)continue;let p=await Dt({filename:a.path,raw:a.content,config:t,baseColor:o,supportedFontMarkers:n},[At,Nt,Ft,Vt,Ot,Mt,_t,Ut,Lt]),u=Vl(p,m);u.length>1&&i.push({filePath:f,patch:u})}}return i}async function Ul(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(d.success(t.value)):t.removed?process.stdout.write(d.error(t.value)):process.stdout.write(t.value)})}import Ml from"path";import{Command as Bl}from"commander";var hi="https://www.loveui.dev",yi=new Bl().name("docs").description("get docs, api references and usage examples for components").argument("<components...>","component names").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-b, --base <base>","the base to use either 'base' or 'radix'. defaults to project base.").option("--json","output as JSON.",!1).action(async(e,t)=>{try{let r=Ml.resolve(t.cwd),o=await j(r),n=t.base??je(o?.style),i=await Ge();i||(l.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let a of e){let f=i.find(p=>p.name===a);f||(l.error(`Component ${d.info(a)} not found in the Love UI registry.`),process.exit(1));let m=f.meta?.links?.[n];if(!m||Object.keys(m).length===0){l.warn(`No documentation links available for ${d.info(a)}.`);continue}s.push({component:a,base:n,links:Wl(m)})}if(t.json){console.log(JSON.stringify({base:n,results:s},null,2));return}let c=Math.max(...s.flatMap(a=>Object.keys(a.links).map(f=>f.length)));for(let{component:a,links:f}of s){l.log(d.info(a));for(let[m,p]of Object.entries(f))l.log(` - ${m.padEnd(c+2)}${p}`);l.break()}}catch(r){R(r)}});function Wl(e){return Object.fromEntries(Object.entries(e).map(([t,r])=>[t,r.startsWith(hi)?`${S}${r.slice(hi.length)}`:r]))}import{promises as eo}from"fs";import te from"path";import{Command as zl}from"commander";import{execa as lr}from"execa";import vt from"fs-extra";import Jl from"prompts";import{z as cr}from"zod";var wi=/@import\s+["']love-ui\/tailwind\.css["'];?\s*\n?/,Gl=cr.object({cwd:cr.string(),yes:cr.boolean(),silent:cr.boolean()}),bi=new zl().name("eject").description("inline love-ui/tailwind.css and remove the love-ui dependency").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-y, --yes","skip confirmation prompt.",!1).option("-s, --silent","mute output.",!1).action(async e=>{try{let t=Gl.parse({cwd:te.resolve(e.cwd),yes:e.yes,silent:e.silent});await Hl(t)}catch(t){R(t)}});async function Hl(e){if(!vt.existsSync(te.resolve(e.cwd,"components.json"))){if(await M(e.cwd)){let m=await B(e.cwd);m.length>0&&(W("eject",m),process.exit(1))}l.break(),l.error(`No ${d.info("components.json")} found. Run ${d.info("love-ui init")} first.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}let t=await j(e.cwd);t?.resolvedPaths.tailwindCss||(l.break(),l.error("Could not resolve the Tailwind CSS file from components.json."),l.break(),process.exit(1));let r=t.resolvedPaths.tailwindCss,o=te.relative(e.cwd,r),n=await eo.readFile(r,"utf8");wi.test(n)||(l.break(),l.error(`Could not find ${d.info('@import "love-ui/tailwind.css"')} in ${d.info(o)}.`),l.error("Nothing to eject."),l.break(),process.exit(1));let i=Ee(e.cwd,!1),s=Kl(i),c=ql(e.cwd),a=await eo.readFile(c,"utf8");if(e.silent||(l.break(),l.warn("This action is not reversible. Future Love UI CLI updates to tailwind.css will not apply automatically."),l.break()),!e.yes){l.log("This will:"),l.log(` - Inline ${d.info("love-ui/tailwind.css")} into ${d.info(o)}`),l.log(` - Remove the ${d.info("love-ui")} dependency`),l.break();let{proceed:m}=await Jl({type:"confirm",name:"proceed",message:"Proceed?",initial:!1});m||process.exit(0)}let f=b(`Inlining ${d.info("love-ui/tailwind.css")}.`,{silent:e.silent})?.start();if(n=n.replace(wi,()=>`/* ejected from love-ui@${s} */
156
156
  ${a.trim()}
157
157
 
158
- `),await to.writeFile(r,n,"utf8"),f?.succeed(),Yl(i)){let m=b(`Removing ${d.info("love-ui")}.`,{silent:e.silent})?.start();await Zl(e.cwd),m?.succeed()}else e.silent||l.warn(`The ${d.info("love-ui")} package was not found in package.json. Skipped removal.`);l.break(),l.log(`Ejected ${d.info("love-ui/tailwind.css")} into ${d.info(o)}.`),l.break()}function Kl(e){return e?(e.dependencies?.["love-ui"]??e.devDependencies?.["love-ui"]??"unknown").replace(/^[\^~]/,"").trim():"unknown"}function Yl(e){return e?!!(e.dependencies?.["love-ui"]||e.devDependencies?.["love-ui"]):!1}function ql(e){let t=te.join(e,"node_modules/love-ui/dist/tailwind.css");if(vt.existsSync(t))return t;let r=process.argv[1]?te.dirname(te.resolve(process.argv[1])):e;for(let o of[te.join(r,"tailwind.css"),te.join(r,"dist","tailwind.css"),te.join(r,"src","tailwind.css"),te.join(process.cwd(),"src/tailwind.css"),te.join(process.cwd(),"dist/tailwind.css")])if(vt.existsSync(o))return o;throw new Error("Could not resolve love-ui/tailwind.css.")}async function Zl(e){switch(await ce(e)){case"npm":await lr("npm",["uninstall","love-ui"],{cwd:e});break;case"pnpm":await lr("pnpm",["remove","love-ui"],{cwd:e});break;case"yarn":await lr("yarn",["remove","love-ui"],{cwd:e});break;case"bun":await lr("bun",["remove","love-ui"],{cwd:e});break;case"deno":{let r=te.join(e,"package.json"),o=await vt.readJson(r);for(let n of["dependencies","devDependencies"])o[n]?.["love-ui"]&&delete o[n]["love-ui"];await vt.writeJson(r,o,{spaces:2});break}}}import{existsSync as Dc}from"fs";import Ai from"path";import{existsSync as rc,promises as Pi}from"fs";import oc from"path";var Xl=["50","100","200","300","400","500","600","700","800","900","950"],Ql=["red","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose","slate","gray","zinc","neutral","stone","mauve","olive","mist","taupe"],ec={red:{50:"oklch(97.1% 0.013 17.38)",100:"oklch(93.6% 0.032 17.717)",200:"oklch(88.5% 0.062 18.334)",300:"oklch(80.8% 0.114 19.571)",400:"oklch(70.4% 0.191 22.216)",500:"oklch(63.7% 0.237 25.331)",600:"oklch(57.7% 0.245 27.325)",700:"oklch(50.5% 0.213 27.518)",800:"oklch(44.4% 0.177 26.899)",900:"oklch(39.6% 0.141 25.723)",950:"oklch(25.8% 0.092 26.042)"},orange:{50:"oklch(98% 0.016 73.684)",100:"oklch(95.4% 0.038 75.164)",200:"oklch(90.1% 0.076 70.697)",300:"oklch(83.7% 0.128 66.29)",400:"oklch(75% 0.183 55.934)",500:"oklch(70.5% 0.213 47.604)",600:"oklch(64.6% 0.222 41.116)",700:"oklch(55.3% 0.195 38.402)",800:"oklch(47% 0.157 37.304)",900:"oklch(40.8% 0.123 38.172)",950:"oklch(26.6% 0.079 36.259)"},amber:{50:"oklch(98.7% 0.022 95.277)",100:"oklch(96.2% 0.059 95.617)",200:"oklch(92.4% 0.12 95.746)",300:"oklch(87.9% 0.169 91.605)",400:"oklch(82.8% 0.189 84.429)",500:"oklch(76.9% 0.188 70.08)",600:"oklch(66.6% 0.179 58.318)",700:"oklch(55.5% 0.163 48.998)",800:"oklch(47.3% 0.137 46.201)",900:"oklch(41.4% 0.112 45.904)",950:"oklch(27.9% 0.077 45.635)"},yellow:{50:"oklch(98.7% 0.026 102.212)",100:"oklch(97.3% 0.071 103.193)",200:"oklch(94.5% 0.129 101.54)",300:"oklch(90.5% 0.182 98.111)",400:"oklch(85.2% 0.199 91.936)",500:"oklch(79.5% 0.184 86.047)",600:"oklch(68.1% 0.162 75.834)",700:"oklch(55.4% 0.135 66.442)",800:"oklch(47.6% 0.114 61.907)",900:"oklch(42.1% 0.095 57.708)",950:"oklch(28.6% 0.066 53.813)"},lime:{50:"oklch(98.6% 0.031 120.757)",100:"oklch(96.7% 0.067 122.328)",200:"oklch(93.8% 0.127 124.321)",300:"oklch(89.7% 0.196 126.665)",400:"oklch(84.1% 0.238 128.85)",500:"oklch(76.8% 0.233 130.85)",600:"oklch(64.8% 0.2 131.684)",700:"oklch(53.2% 0.157 131.589)",800:"oklch(45.3% 0.124 130.933)",900:"oklch(40.5% 0.101 131.063)",950:"oklch(27.4% 0.072 132.109)"},green:{50:"oklch(98.2% 0.018 155.826)",100:"oklch(96.2% 0.044 156.743)",200:"oklch(92.5% 0.084 155.995)",300:"oklch(87.1% 0.15 154.449)",400:"oklch(79.2% 0.209 151.711)",500:"oklch(72.3% 0.219 149.579)",600:"oklch(62.7% 0.194 149.214)",700:"oklch(52.7% 0.154 150.069)",800:"oklch(44.8% 0.119 151.328)",900:"oklch(39.3% 0.095 152.535)",950:"oklch(26.6% 0.065 152.934)"},emerald:{50:"oklch(97.9% 0.021 166.113)",100:"oklch(95% 0.052 163.051)",200:"oklch(90.5% 0.093 164.15)",300:"oklch(84.5% 0.143 164.978)",400:"oklch(76.5% 0.177 163.223)",500:"oklch(69.6% 0.17 162.48)",600:"oklch(59.6% 0.145 163.225)",700:"oklch(50.8% 0.118 165.612)",800:"oklch(43.2% 0.095 166.913)",900:"oklch(37.8% 0.077 168.94)",950:"oklch(26.2% 0.051 172.552)"},teal:{50:"oklch(98.4% 0.014 180.72)",100:"oklch(95.3% 0.051 180.801)",200:"oklch(91% 0.096 180.426)",300:"oklch(85.5% 0.138 181.071)",400:"oklch(77.7% 0.152 181.912)",500:"oklch(70.4% 0.14 182.503)",600:"oklch(60% 0.118 184.704)",700:"oklch(51.1% 0.096 186.391)",800:"oklch(43.7% 0.078 188.216)",900:"oklch(38.6% 0.063 188.416)",950:"oklch(27.7% 0.046 192.524)"},cyan:{50:"oklch(98.4% 0.019 200.873)",100:"oklch(95.6% 0.045 203.388)",200:"oklch(91.7% 0.08 205.041)",300:"oklch(86.5% 0.127 207.078)",400:"oklch(78.9% 0.154 211.53)",500:"oklch(71.5% 0.143 215.221)",600:"oklch(60.9% 0.126 221.723)",700:"oklch(52% 0.105 223.128)",800:"oklch(45% 0.085 224.283)",900:"oklch(39.8% 0.07 227.392)",950:"oklch(30.2% 0.056 229.695)"},sky:{50:"oklch(97.7% 0.013 236.62)",100:"oklch(95.1% 0.026 236.824)",200:"oklch(90.1% 0.058 230.902)",300:"oklch(82.8% 0.111 230.318)",400:"oklch(74.6% 0.16 232.661)",500:"oklch(68.5% 0.169 237.323)",600:"oklch(58.8% 0.158 241.966)",700:"oklch(50% 0.134 242.749)",800:"oklch(44.3% 0.11 240.79)",900:"oklch(39.1% 0.09 240.876)",950:"oklch(29.3% 0.066 243.157)"},blue:{50:"oklch(97% 0.014 254.604)",100:"oklch(93.2% 0.032 255.585)",200:"oklch(88.2% 0.059 254.128)",300:"oklch(80.9% 0.105 251.813)",400:"oklch(70.7% 0.165 254.624)",500:"oklch(62.3% 0.214 259.815)",600:"oklch(54.6% 0.245 262.881)",700:"oklch(48.8% 0.243 264.376)",800:"oklch(42.4% 0.199 265.638)",900:"oklch(37.9% 0.146 265.522)",950:"oklch(28.2% 0.091 267.935)"},indigo:{50:"oklch(96.2% 0.018 272.314)",100:"oklch(93% 0.034 272.788)",200:"oklch(87% 0.065 274.039)",300:"oklch(78.5% 0.115 274.713)",400:"oklch(67.3% 0.182 276.935)",500:"oklch(58.5% 0.233 277.117)",600:"oklch(51.1% 0.262 276.966)",700:"oklch(45.7% 0.24 277.023)",800:"oklch(39.8% 0.195 277.366)",900:"oklch(35.9% 0.144 278.697)",950:"oklch(25.7% 0.09 281.288)"},violet:{50:"oklch(96.9% 0.016 293.756)",100:"oklch(94.3% 0.029 294.588)",200:"oklch(89.4% 0.057 293.283)",300:"oklch(81.1% 0.111 293.571)",400:"oklch(70.2% 0.183 293.541)",500:"oklch(60.6% 0.25 292.717)",600:"oklch(54.1% 0.281 293.009)",700:"oklch(49.1% 0.27 292.581)",800:"oklch(43.2% 0.232 292.759)",900:"oklch(38% 0.189 293.745)",950:"oklch(28.3% 0.141 291.089)"},purple:{50:"oklch(97.7% 0.014 308.299)",100:"oklch(94.6% 0.033 307.174)",200:"oklch(90.2% 0.063 306.703)",300:"oklch(82.7% 0.119 306.383)",400:"oklch(71.4% 0.203 305.504)",500:"oklch(62.7% 0.265 303.9)",600:"oklch(55.8% 0.288 302.321)",700:"oklch(49.6% 0.265 301.924)",800:"oklch(43.8% 0.218 303.724)",900:"oklch(38.1% 0.176 304.987)",950:"oklch(29.1% 0.149 302.717)"},fuchsia:{50:"oklch(97.7% 0.017 320.058)",100:"oklch(95.2% 0.037 318.852)",200:"oklch(90.3% 0.076 319.62)",300:"oklch(83.3% 0.145 321.434)",400:"oklch(74% 0.238 322.16)",500:"oklch(66.7% 0.295 322.15)",600:"oklch(59.1% 0.293 322.896)",700:"oklch(51.8% 0.253 323.949)",800:"oklch(45.2% 0.211 324.591)",900:"oklch(40.1% 0.17 325.612)",950:"oklch(29.3% 0.136 325.661)"},pink:{50:"oklch(97.1% 0.014 343.198)",100:"oklch(94.8% 0.028 342.258)",200:"oklch(89.9% 0.061 343.231)",300:"oklch(82.3% 0.12 346.018)",400:"oklch(71.8% 0.202 349.761)",500:"oklch(65.6% 0.241 354.308)",600:"oklch(59.2% 0.249 0.584)",700:"oklch(52.5% 0.223 3.958)",800:"oklch(45.9% 0.187 3.815)",900:"oklch(40.8% 0.153 2.432)",950:"oklch(28.4% 0.109 3.907)"},rose:{50:"oklch(96.9% 0.015 12.422)",100:"oklch(94.1% 0.03 12.58)",200:"oklch(89.2% 0.058 10.001)",300:"oklch(81% 0.117 11.638)",400:"oklch(71.2% 0.194 13.428)",500:"oklch(64.5% 0.246 16.439)",600:"oklch(58.6% 0.253 17.585)",700:"oklch(51.4% 0.222 16.935)",800:"oklch(45.5% 0.188 13.697)",900:"oklch(41% 0.159 10.272)",950:"oklch(27.1% 0.105 12.094)"},slate:{50:"oklch(98.4% 0.003 247.858)",100:"oklch(96.8% 0.007 247.896)",200:"oklch(92.9% 0.013 255.508)",300:"oklch(86.9% 0.022 252.894)",400:"oklch(70.4% 0.04 256.788)",500:"oklch(55.4% 0.046 257.417)",600:"oklch(44.6% 0.043 257.281)",700:"oklch(37.2% 0.044 257.287)",800:"oklch(27.9% 0.041 260.031)",900:"oklch(20.8% 0.042 265.755)",950:"oklch(12.9% 0.042 264.695)"},gray:{50:"oklch(98.5% 0.002 247.839)",100:"oklch(96.7% 0.003 264.542)",200:"oklch(92.8% 0.006 264.531)",300:"oklch(87.2% 0.01 258.338)",400:"oklch(70.7% 0.022 261.325)",500:"oklch(55.1% 0.027 264.364)",600:"oklch(44.6% 0.03 256.802)",700:"oklch(37.3% 0.034 259.733)",800:"oklch(27.8% 0.033 256.848)",900:"oklch(21% 0.034 264.665)",950:"oklch(13% 0.028 261.692)"},zinc:{50:"oklch(98.5% 0 0)",100:"oklch(96.7% 0.001 286.375)",200:"oklch(92% 0.004 286.32)",300:"oklch(87.1% 0.006 286.286)",400:"oklch(70.5% 0.015 286.067)",500:"oklch(55.2% 0.016 285.938)",600:"oklch(44.2% 0.017 285.786)",700:"oklch(37% 0.013 285.805)",800:"oklch(27.4% 0.006 286.033)",900:"oklch(21% 0.006 285.885)",950:"oklch(14.1% 0.005 285.823)"},neutral:{50:"oklch(98.5% 0 0)",100:"oklch(97% 0 0)",200:"oklch(92.2% 0 0)",300:"oklch(87% 0 0)",400:"oklch(70.8% 0 0)",500:"oklch(55.6% 0 0)",600:"oklch(43.9% 0 0)",700:"oklch(37.1% 0 0)",800:"oklch(26.9% 0 0)",900:"oklch(20.5% 0 0)",950:"oklch(14.5% 0 0)"},stone:{50:"oklch(98.5% 0.001 106.423)",100:"oklch(97% 0.001 106.424)",200:"oklch(92.3% 0.003 48.717)",300:"oklch(86.9% 0.005 56.366)",400:"oklch(70.9% 0.01 56.259)",500:"oklch(55.3% 0.013 58.071)",600:"oklch(44.4% 0.011 73.639)",700:"oklch(37.4% 0.01 67.558)",800:"oklch(26.8% 0.007 34.298)",900:"oklch(21.6% 0.006 56.043)",950:"oklch(14.7% 0.004 49.25)"},mauve:{50:"oklch(98.5% 0 0)",100:"oklch(96% 0.003 325.6)",200:"oklch(92.2% 0.005 325.62)",300:"oklch(86.5% 0.012 325.68)",400:"oklch(71.1% 0.019 323.02)",500:"oklch(54.2% 0.034 322.5)",600:"oklch(43.5% 0.029 321.78)",700:"oklch(36.4% 0.029 323.89)",800:"oklch(26.3% 0.024 320.12)",900:"oklch(21.2% 0.019 322.12)",950:"oklch(14.5% 0.008 326)"},olive:{50:"oklch(98.8% 0.003 106.5)",100:"oklch(96.6% 0.005 106.5)",200:"oklch(93% 0.007 106.5)",300:"oklch(88% 0.011 106.6)",400:"oklch(73.7% 0.021 106.9)",500:"oklch(58% 0.031 107.3)",600:"oklch(46.6% 0.025 107.3)",700:"oklch(39.4% 0.023 107.4)",800:"oklch(28.6% 0.016 107.4)",900:"oklch(22.8% 0.013 107.4)",950:"oklch(15.3% 0.006 107.1)"},mist:{50:"oklch(98.7% 0.002 197.1)",100:"oklch(96.3% 0.002 197.1)",200:"oklch(92.5% 0.005 214.3)",300:"oklch(87.2% 0.007 219.6)",400:"oklch(72.3% 0.014 214.4)",500:"oklch(56% 0.021 213.5)",600:"oklch(45% 0.017 213.2)",700:"oklch(37.8% 0.015 216)",800:"oklch(27.5% 0.011 216.9)",900:"oklch(21.8% 0.008 223.9)",950:"oklch(14.8% 0.004 228.8)"},taupe:{50:"oklch(98.6% 0.002 67.8)",100:"oklch(96% 0.002 17.2)",200:"oklch(92.2% 0.005 34.3)",300:"oklch(86.8% 0.007 39.5)",400:"oklch(71.4% 0.014 41.2)",500:"oklch(54.7% 0.021 43.1)",600:"oklch(43.8% 0.017 39.3)",700:"oklch(36.7% 0.016 35.7)",800:"oklch(26.8% 0.011 36.5)",900:"oklch(21.4% 0.009 43.1)",950:"oklch(14.7% 0.004 49.3)"}},tc={"220.9 39.3% 11%":"gray","210 20% 98%":"gray","12 76% 61%":"gray","220 70% 50%":"gray"},vi=new Map;for(let e of Ql)for(let t of Xl)vi.set(Ri(ec[e][t]),e);function Ci(e){let t=Ri(e);return t?vi.get(t)??tc[t]??null:null}function Ri(e){if(!e)return"";let t=e.trim().replace(/\s+/g," ").toLowerCase();if(!t.startsWith("oklch(")||!t.endsWith(")"))return t;let r=t.slice(6,-1).trim(),[o]=r.split(/\s*\/\s*/),n=o.split(/\s+/);if(n.length<3)return t;let i=ro(n[0],{percentage:!0}),s=ro(n[1]),c=ro(n[2]);return`oklch(${i} ${s} ${c})`}function ro(e,t={}){return t.percentage&&e.endsWith("%")?ki(Number.parseFloat(e)/100):ki(Number.parseFloat(e))}function ki(e){return Number.isNaN(e)?"":Number(e.toFixed(12)).toString()}import nc from"postcss";import{Node as Ue,Project as ic,ScriptKind as sc,SyntaxKind as Ct}from"ts-morph";var ac=new Set(jr),lc=new Set(Tr),cc=new Set(Or),fc=new Set(Ar),mc=new Set(Ht),pc=new Set(Fr),uc=new Set(Gt),dc=new Set(["eb-garamond","instrument-serif","lora","merriweather","playfair-display","noto-serif","roboto-slab"]),gc=new Set(["jetbrains-mono","geist-mono"]),Rt=["--font-sans","--font-serif","--font-mono"],$i=new Set(Rt),hc=[...Rt,"--font-heading"],Ei=new Set(hc),xi={appliedBodyVariable:null,variables:{}},yc={0:"none","0rem":"none","0.45rem":"small","0.625rem":"default","0.875rem":"large"};async function pr(e,t){let r=bc(e.style);if(!r)return{code:null,fallbacks:[],values:null};let o=Z[r],n=await wc(e.resolvedPaths.tailwindCss),i=fr(ac,e.tailwind.baseColor),s=Cc(n),c=Rc(n),a=fr(lc,e.iconLibrary),f=Si(n,xi),m=f??o.font,p=Ii(n,m,xi);if(!f||!p){let I=t;if(t===void 0)try{I=await F(e.resolvedPaths.cwd,{configCssFile:e.tailwind.css})}catch{I=null}let x=await $c(e,I);f??=Si(n,x),m=f??o.font,p??=Ii(n,m,x)}let u=Sc(p??o.fontHeading,m,o.fontHeading),h=xc(n.rootVars["--radius"]),g=fr(cc,e.menuAccent),y=fr(fc,e.menuColor),k={style:r,baseColor:i??o.baseColor,theme:s??o.theme,chartColor:c??o.chartColor,iconLibrary:a??o.iconLibrary,font:m,fontHeading:u,radius:h??o.radius,menuAccent:g??o.menuAccent,menuColor:y??o.menuColor},v=[!i&&"baseColor",!s&&"theme",!c&&"chartColor",!a&&"iconLibrary",!f&&"font",!p&&"fontHeading",!h&&"radius",!g&&"menuAccent",!y&&"menuColor"].filter(Boolean);return{code:fn(k),fallbacks:v,values:k}}async function wc(e){let t={darkVars:{},imports:[],rootVars:{},themeVars:{}};if(!e)return t;try{let r=await Pi.readFile(e,"utf8");return kc(r)}catch{return t}}function bc(e){if(!e)return null;let t=e.replace(/^(base|radix)-/,"");return t in Z?t:null}function kc(e){let t=nc.parse(e),r={darkVars:{},imports:[],rootVars:{},themeVars:{}};return t.walkAtRules("import",o=>{let n=vc(o.params);n&&r.imports.push(n)}),t.walkRules(o=>{let n=o.selector.split(",").map(i=>i.trim()).filter(Boolean);n.includes(":root")&&oo(o,r.rootVars),n.includes(".dark")&&oo(o,r.darkVars)}),t.walkAtRules("theme",o=>{o.params.trim()==="inline"&&oo(o,r.themeVars)}),r}function oo(e,t){for(let r of e.nodes??[])r.type!=="decl"||!r.prop.startsWith("--")||(t[r.prop]=r.value.trim())}function vc(e){let t=e.trim();return(t.match(/^url\((['"]?)(.+?)\1\)$/)??t.match(/^(['"])(.+?)\1$/))?.[2]??null}function Cc(e){let t=mr(e.rootVars["--primary"]);if(!t)return null;let r=e.darkVars["--primary"];return r?mr(r)===t?t:null:t}function Rc(e){let t=mr(e.rootVars["--chart-1"]);if(!t)return null;let r=e.darkVars["--chart-1"];return r?mr(r)===t?t:null:t}function mr(e){let t=Ci(e);return!t||!uc.has(t)?null:t}function xc(e){if(!e)return null;let t=ur(e);return yc[t]??null}function Si(e,t){for(let r of Rt){let o=Ti(e,r);if(o)return o}for(let r of Rt){let o=Ic(e.imports,r);if(o)return o}return Pc(t)}function Ii(e,t,r){let o=no(e,"--font-heading"),n=o?Oi(o):null;if(n)return n===t?"inherit":n;let i=r.variables["--font-heading"],s=ji(e,"--font-heading");if(!s)return i&&i!==t?i:null;let c=io(s);if(c&&$i.has(c)){let a=Ti(e,c),f=r.variables[c],m=a??f??null;return!m||m===t?"inherit":m}return c==="--font-heading"?i?i===t?"inherit":i:null:i&&i!==t?i:null}function Sc(e,t,r){let o=e===t?"inherit":e;return pc.has(o)?o:r}function no(e,t,r=new Set){if(r.has(t))return null;r.add(t);let o=ji(e,t);if(!o)return null;let n=io(o);return n?Ei.has(n)?no(e,n,r):null:o}function ji(e,t){let r=e.themeVars[t];return r&&io(r)!==t?r:e.rootVars[t]??r??null}function io(e){return ur(e).match(/^var\((--[a-z0-9-]+)\)$/)?.[1]??null}function Ti(e,t){let r=no(e,t),o=r?Oi(r):null;return o||null}function Ic(e,t){let r=e.flatMap(o=>{let n=Lc(o);return n&&Vc(n)===t?[n]:[]});return r.length===1?r[0]:null}function Pc(e){if(e.appliedBodyVariable&&e.variables[e.appliedBodyVariable])return e.variables[e.appliedBodyVariable]??null;let t=Rt.map(r=>e.variables[r]).filter(Boolean).filter((r,o,n)=>n.indexOf(r)===o);return t.length===1?t[0]:null}async function $c(e,t){let r={appliedBodyVariable:null,variables:{}};if(!t||t.framework.name!=="next-app"&&t.framework.name!=="next-pages")return r;let o=Ec(e,t);if(!o)return r;try{let n=await Pi.readFile(o,"utf8");return jc(n,t.framework.name)}catch{return r}}function Ec(e,t){let r=t.isTsx?"tsx":"jsx",o=t.framework.name==="next-app"?t.isSrcDir?[`src/app/layout.${r}`,`app/layout.${r}`]:[`app/layout.${r}`]:t.isSrcDir?[`src/pages/_app.${r}`,`pages/_app.${r}`]:[`pages/_app.${r}`];for(let n of o){let i=oc.join(e.resolvedPaths.cwd,n);if(rc(i))return i}return null}function jc(e,t){let o=new ic({compilerOptions:{}}).createSourceFile("font-source.tsx",e,{overwrite:!0,scriptKind:sc.TSX}),n=new Map;for(let c of o.getImportDeclarations())if(c.getModuleSpecifierValue()==="next/font/google")for(let a of c.getNamedImports()){let f=a.getName(),m=a.getAliasNode()?.getText()??f,p=_c(f);p&&n.set(m,p)}let i={},s=new Map;for(let c of o.getVariableStatements())for(let a of c.getDeclarations()){let f=a.getInitializer();if(!f?.isKind(Ct.CallExpression))continue;let m=n.get(f.getExpression().getText());if(!m)continue;let p=Tc(f);p&&(s.set(a.getName(),p),i[p]=m)}return{appliedBodyVariable:Fc(o,s,t),variables:i}}function Tc(e){let t=e.getArguments()[0];if(!t||!Ue.isObjectLiteralExpression(t))return null;let r=t.getProperty("variable");if(!r||!Ue.isPropertyAssignment(r))return null;let o=r.getInitializer();if(!o)return null;let n=Fi(o.getText());return Ei.has(n)?n:null}function Fc(e,t,r){let o=e.getDescendantsOfKind(Ct.JsxOpeningElement).filter(i=>r==="next-app"?i.getTagNameNode().getText()==="html":!0),n=new Set;for(let i of o){let s=i.getAttribute("className");if(!s||!Ue.isJsxAttribute(s))continue;let c=s.getInitializer();if(!c)continue;let a=Oc(c,t),f=Ac(c);if(f&&a.includes(f))return f;a.length===1&&n.add(a[0])}return n.size===1?Array.from(n)[0]:null}function Oc(e,t){let r=Ue.isJsxExpression(e)?[e.getExpression(),...e.getDescendantsOfKind(Ct.PropertyAccessExpression)].filter(Boolean):[],o=new Set;for(let n of r){if(!n||!Ue.isPropertyAccessExpression(n)||n.getName()!=="variable")continue;let i=n.getExpression().getText(),s=t.get(i);s&&$i.has(s)&&o.add(s)}return Array.from(o)}function Ac(e){let t=Nc(e);return/\bfont-sans\b/.test(t)?"--font-sans":/\bfont-serif\b/.test(t)?"--font-serif":/\bfont-mono\b/.test(t)?"--font-mono":null}function Nc(e){let t=[];(Ue.isStringLiteral(e)||Ue.isNoSubstitutionTemplateLiteral(e))&&t.push(e.getLiteralValue());for(let r of e.getDescendantsOfKind(Ct.StringLiteral))t.push(r.getLiteralValue());for(let r of e.getDescendantsOfKind(Ct.NoSubstitutionTemplateLiteral))t.push(r.getLiteralValue());return t.length>0?t.join(" "):e.getText()}function Fi(e){return e.replace(/^['"]|['"]$/g,"")}function Oi(e){if(!e)return null;let t=Fi(e.split(",")[0]?.trim()??"").replace(/\s+variable$/i,"").trim();return t?so(t.replace(/\s+/g,"-")):null}function Lc(e){if(!e)return null;let t=ur(e),r="@fontsource-variable/";return t.startsWith(r)?so(t.slice(r.length)):null}function _c(e){return e?so(e.replace(/_/g,"-")):null}function so(e){let t=ur(e);return mc.has(t)?t:null}function Vc(e){return gc.has(e)?"--font-mono":dc.has(e)?"--font-serif":"--font-sans"}function ur(e){return e?e.trim().replace(/\s+/g," ").replace(/\s*,\s*/g,", ").replace(/"/g,"'").toLowerCase():""}function fr(e,t){return t&&e.has(t)?t:null}import{Command as Uc}from"commander";var Ni=`${S}/code/apps/v4/registry/bases`,Li=new Uc().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",!1).action(async e=>{try{let t=Ai.resolve(e.cwd);if(!Dc(Ai.resolve(t,"components.json"))&&await M(t)){let c=await B(t);c.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running info from a monorepo root. Use the -c flag to specify a workspace.",targets:c.map(a=>a.name)},null,2)):W("info",c),process.exit(1))}let r=await F(t),o=await j(t),n=await He(t),i=Te(o?.style),s=await Bc(r,o,n,i);if(e.json){console.log(JSON.stringify(s,null,2));return}Wc(s)}catch(t){R(t)}});function Mc(e){if(!e)return{};let t={};for(let[r,o]of Object.entries(e))t[r]=typeof o=="string"?o:o.url;return t}async function Bc(e,t,r,o){let n=t?await pr(t,e):null;return{project:e?{framework:e.framework.label,frameworkName:e.framework.name,frameworkVersion:e.frameworkVersion??null,srcDirectory:e.isSrcDir,rsc:e.isRSC,typescript:e.isTsx,tailwindVersion:e.tailwindVersion??null,tailwindConfig:e.tailwindConfigFile??null,tailwindCss:e.tailwindCssFile??null,importAlias:e.aliasPrefix??null}:null,config:t?{style:t.style,base:o,rsc:t.rsc,typescript:t.tsx,iconLibrary:t.iconLibrary??null,rtl:t.rtl??!1,menuColor:t.menuColor??null,menuAccent:t.menuAccent??null,aliases:{components:t.aliases.components,utils:t.aliases.utils,ui:t.aliases.ui??null,lib:t.aliases.lib??null,hooks:t.aliases.hooks??null},resolvedPaths:{cwd:t.resolvedPaths.cwd,tailwindConfig:t.resolvedPaths.tailwindConfig||null,tailwindCss:t.resolvedPaths.tailwindCss||null,utils:t.resolvedPaths.utils,components:t.resolvedPaths.components,lib:t.resolvedPaths.lib,hooks:t.resolvedPaths.hooks,ui:t.resolvedPaths.ui},registries:Mc(t.registries)}:null,preset:n,components:r,links:{docs:`${S}/docs`,components:`${S}/docs/components/${o}/[component].md`,ui:`${Ni}/${o}/ui/[component].tsx`,examples:`${Ni}/${o}/examples/[component]-example.tsx`,schema:`${S}/schema.json`}}}function Wc(e){l.log(d.info("Project")),e.project?xe({framework:`${e.project.framework} (${e.project.frameworkName})`,frameworkVersion:e.project.frameworkVersion??"-",srcDirectory:e.project.srcDirectory?"Yes":"No",rsc:e.project.rsc?"Yes":"No",typescript:e.project.typescript?"Yes":"No",tailwindVersion:e.project.tailwindVersion??"-",tailwindConfig:e.project.tailwindConfig??"-",tailwindCss:e.project.tailwindCss??"-",importAlias:e.project.importAlias??"-"}):l.log(" No project info detected."),l.break(),l.log(d.info("Configuration")),e.config?(xe({style:e.config.style,base:e.config.base,rsc:e.config.rsc?"Yes":"No",typescript:e.config.typescript?"Yes":"No",iconLibrary:e.config.iconLibrary??"-",rtl:e.config.rtl?"Yes":"No",menuColor:e.config.menuColor??"-",menuAccent:e.config.menuAccent??"-"}),l.break(),dr(e.preset),l.break(),l.log(d.info("Aliases")),xe({components:e.config.aliases.components,utils:e.config.aliases.utils,ui:e.config.aliases.ui??"-",lib:e.config.aliases.lib??"-",hooks:e.config.aliases.hooks??"-"}),l.break(),l.log(d.info("Resolved Paths")),xe({cwd:e.config.resolvedPaths.cwd,tailwindConfig:e.config.resolvedPaths.tailwindConfig??"-",tailwindCss:e.config.resolvedPaths.tailwindCss??"-",utils:e.config.resolvedPaths.utils,components:e.config.resolvedPaths.components,lib:e.config.resolvedPaths.lib,hooks:e.config.resolvedPaths.hooks,ui:e.config.resolvedPaths.ui}),Object.keys(e.config.registries).length>0&&(l.break(),l.log("registries:"),xe(e.config.registries))):l.log(" No components.json found."),l.break(),l.log(d.info("Installed Components")),e.components.length>0?l.log(` ${e.components.join(", ")}`):l.log(" No components installed."),l.break(),l.log(d.info("Links")),xe(e.links),l.break()}function dr(e,t={}){if(l.log(d.info("Preset")),!e?.code)xe({code:"-"});else{let r=e.fallbacks??[],o=(n,i)=>{let s=r.includes(n)?"*":"";return`${i??"-"}${s}`};xe({code:e.code,version:e.code[0],style:e.values?.style??"-",baseColor:o("baseColor",e.values?.baseColor),theme:o("theme",e.values?.theme),chartColor:o("chartColor",e.values?.chartColor),iconLibrary:o("iconLibrary",e.values?.iconLibrary),font:o("font",e.values?.font),fontHeading:o("fontHeading",e.values?.fontHeading),radius:o("radius",e.values?.radius),menuAccent:o("menuAccent",e.values?.menuAccent),menuColor:o("menuColor",e.values?.menuColor),url:`${S}/create?preset=${e.code}`}),r.length>0&&(l.log(""),l.log(t.fallbackNote??" * Uses preset defaults for values not available as options on love-ui create."))}}function xe(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,o]of Object.entries(e))l.log(` ${r.padEnd(t+2)}${o}`)}import{promises as _i}from"fs";import Vi from"path";import{StdioServerTransport as zc}from"@modelcontextprotocol/sdk/server/stdio.js";import{Command as Jc}from"commander";import Gc from"deepmerge";import{execa as Di}from"execa";import Hc from"fs-extra";import Kc from"prompts";import ao from"zod";var Me="latest",hr=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{loveui:{command:"npx",args:[`love-ui@${Me}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{loveui:{command:"npx",args:[`love-ui@${Me}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{loveui:{command:"npx",args:[`love-ui@${Me}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.loveui]
158
+ `),await eo.writeFile(r,n,"utf8"),f?.succeed(),Yl(i)){let m=b(`Removing ${d.info("love-ui")}.`,{silent:e.silent})?.start();await Zl(e.cwd),m?.succeed()}else e.silent||l.warn(`The ${d.info("love-ui")} package was not found in package.json. Skipped removal.`);l.break(),l.log(`Ejected ${d.info("love-ui/tailwind.css")} into ${d.info(o)}.`),l.break()}function Kl(e){return e?(e.dependencies?.["love-ui"]??e.devDependencies?.["love-ui"]??"unknown").replace(/^[\^~]/,"").trim():"unknown"}function Yl(e){return e?!!(e.dependencies?.["love-ui"]||e.devDependencies?.["love-ui"]):!1}function ql(e){let t=te.join(e,"node_modules/love-ui/dist/tailwind.css");if(vt.existsSync(t))return t;let r=process.argv[1]?te.dirname(te.resolve(process.argv[1])):e;for(let o of[te.join(r,"tailwind.css"),te.join(r,"dist","tailwind.css"),te.join(r,"src","tailwind.css"),te.join(process.cwd(),"src/tailwind.css"),te.join(process.cwd(),"dist/tailwind.css")])if(vt.existsSync(o))return o;throw new Error("Could not resolve love-ui/tailwind.css.")}async function Zl(e){switch(await ce(e)){case"npm":await lr("npm",["uninstall","love-ui"],{cwd:e});break;case"pnpm":await lr("pnpm",["remove","love-ui"],{cwd:e});break;case"yarn":await lr("yarn",["remove","love-ui"],{cwd:e});break;case"bun":await lr("bun",["remove","love-ui"],{cwd:e});break;case"deno":{let r=te.join(e,"package.json"),o=await vt.readJson(r);for(let n of["dependencies","devDependencies"])o[n]?.["love-ui"]&&delete o[n]["love-ui"];await vt.writeJson(r,o,{spaces:2});break}}}import{existsSync as Dc}from"fs";import Ai from"path";import{existsSync as rc,promises as Pi}from"fs";import oc from"path";var Xl=["50","100","200","300","400","500","600","700","800","900","950"],Ql=["red","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose","slate","gray","zinc","neutral","stone","mauve","olive","mist","taupe"],ec={red:{50:"oklch(97.1% 0.013 17.38)",100:"oklch(93.6% 0.032 17.717)",200:"oklch(88.5% 0.062 18.334)",300:"oklch(80.8% 0.114 19.571)",400:"oklch(70.4% 0.191 22.216)",500:"oklch(63.7% 0.237 25.331)",600:"oklch(57.7% 0.245 27.325)",700:"oklch(50.5% 0.213 27.518)",800:"oklch(44.4% 0.177 26.899)",900:"oklch(39.6% 0.141 25.723)",950:"oklch(25.8% 0.092 26.042)"},orange:{50:"oklch(98% 0.016 73.684)",100:"oklch(95.4% 0.038 75.164)",200:"oklch(90.1% 0.076 70.697)",300:"oklch(83.7% 0.128 66.29)",400:"oklch(75% 0.183 55.934)",500:"oklch(70.5% 0.213 47.604)",600:"oklch(64.6% 0.222 41.116)",700:"oklch(55.3% 0.195 38.402)",800:"oklch(47% 0.157 37.304)",900:"oklch(40.8% 0.123 38.172)",950:"oklch(26.6% 0.079 36.259)"},amber:{50:"oklch(98.7% 0.022 95.277)",100:"oklch(96.2% 0.059 95.617)",200:"oklch(92.4% 0.12 95.746)",300:"oklch(87.9% 0.169 91.605)",400:"oklch(82.8% 0.189 84.429)",500:"oklch(76.9% 0.188 70.08)",600:"oklch(66.6% 0.179 58.318)",700:"oklch(55.5% 0.163 48.998)",800:"oklch(47.3% 0.137 46.201)",900:"oklch(41.4% 0.112 45.904)",950:"oklch(27.9% 0.077 45.635)"},yellow:{50:"oklch(98.7% 0.026 102.212)",100:"oklch(97.3% 0.071 103.193)",200:"oklch(94.5% 0.129 101.54)",300:"oklch(90.5% 0.182 98.111)",400:"oklch(85.2% 0.199 91.936)",500:"oklch(79.5% 0.184 86.047)",600:"oklch(68.1% 0.162 75.834)",700:"oklch(55.4% 0.135 66.442)",800:"oklch(47.6% 0.114 61.907)",900:"oklch(42.1% 0.095 57.708)",950:"oklch(28.6% 0.066 53.813)"},lime:{50:"oklch(98.6% 0.031 120.757)",100:"oklch(96.7% 0.067 122.328)",200:"oklch(93.8% 0.127 124.321)",300:"oklch(89.7% 0.196 126.665)",400:"oklch(84.1% 0.238 128.85)",500:"oklch(76.8% 0.233 130.85)",600:"oklch(64.8% 0.2 131.684)",700:"oklch(53.2% 0.157 131.589)",800:"oklch(45.3% 0.124 130.933)",900:"oklch(40.5% 0.101 131.063)",950:"oklch(27.4% 0.072 132.109)"},green:{50:"oklch(98.2% 0.018 155.826)",100:"oklch(96.2% 0.044 156.743)",200:"oklch(92.5% 0.084 155.995)",300:"oklch(87.1% 0.15 154.449)",400:"oklch(79.2% 0.209 151.711)",500:"oklch(72.3% 0.219 149.579)",600:"oklch(62.7% 0.194 149.214)",700:"oklch(52.7% 0.154 150.069)",800:"oklch(44.8% 0.119 151.328)",900:"oklch(39.3% 0.095 152.535)",950:"oklch(26.6% 0.065 152.934)"},emerald:{50:"oklch(97.9% 0.021 166.113)",100:"oklch(95% 0.052 163.051)",200:"oklch(90.5% 0.093 164.15)",300:"oklch(84.5% 0.143 164.978)",400:"oklch(76.5% 0.177 163.223)",500:"oklch(69.6% 0.17 162.48)",600:"oklch(59.6% 0.145 163.225)",700:"oklch(50.8% 0.118 165.612)",800:"oklch(43.2% 0.095 166.913)",900:"oklch(37.8% 0.077 168.94)",950:"oklch(26.2% 0.051 172.552)"},teal:{50:"oklch(98.4% 0.014 180.72)",100:"oklch(95.3% 0.051 180.801)",200:"oklch(91% 0.096 180.426)",300:"oklch(85.5% 0.138 181.071)",400:"oklch(77.7% 0.152 181.912)",500:"oklch(70.4% 0.14 182.503)",600:"oklch(60% 0.118 184.704)",700:"oklch(51.1% 0.096 186.391)",800:"oklch(43.7% 0.078 188.216)",900:"oklch(38.6% 0.063 188.416)",950:"oklch(27.7% 0.046 192.524)"},cyan:{50:"oklch(98.4% 0.019 200.873)",100:"oklch(95.6% 0.045 203.388)",200:"oklch(91.7% 0.08 205.041)",300:"oklch(86.5% 0.127 207.078)",400:"oklch(78.9% 0.154 211.53)",500:"oklch(71.5% 0.143 215.221)",600:"oklch(60.9% 0.126 221.723)",700:"oklch(52% 0.105 223.128)",800:"oklch(45% 0.085 224.283)",900:"oklch(39.8% 0.07 227.392)",950:"oklch(30.2% 0.056 229.695)"},sky:{50:"oklch(97.7% 0.013 236.62)",100:"oklch(95.1% 0.026 236.824)",200:"oklch(90.1% 0.058 230.902)",300:"oklch(82.8% 0.111 230.318)",400:"oklch(74.6% 0.16 232.661)",500:"oklch(68.5% 0.169 237.323)",600:"oklch(58.8% 0.158 241.966)",700:"oklch(50% 0.134 242.749)",800:"oklch(44.3% 0.11 240.79)",900:"oklch(39.1% 0.09 240.876)",950:"oklch(29.3% 0.066 243.157)"},blue:{50:"oklch(97% 0.014 254.604)",100:"oklch(93.2% 0.032 255.585)",200:"oklch(88.2% 0.059 254.128)",300:"oklch(80.9% 0.105 251.813)",400:"oklch(70.7% 0.165 254.624)",500:"oklch(62.3% 0.214 259.815)",600:"oklch(54.6% 0.245 262.881)",700:"oklch(48.8% 0.243 264.376)",800:"oklch(42.4% 0.199 265.638)",900:"oklch(37.9% 0.146 265.522)",950:"oklch(28.2% 0.091 267.935)"},indigo:{50:"oklch(96.2% 0.018 272.314)",100:"oklch(93% 0.034 272.788)",200:"oklch(87% 0.065 274.039)",300:"oklch(78.5% 0.115 274.713)",400:"oklch(67.3% 0.182 276.935)",500:"oklch(58.5% 0.233 277.117)",600:"oklch(51.1% 0.262 276.966)",700:"oklch(45.7% 0.24 277.023)",800:"oklch(39.8% 0.195 277.366)",900:"oklch(35.9% 0.144 278.697)",950:"oklch(25.7% 0.09 281.288)"},violet:{50:"oklch(96.9% 0.016 293.756)",100:"oklch(94.3% 0.029 294.588)",200:"oklch(89.4% 0.057 293.283)",300:"oklch(81.1% 0.111 293.571)",400:"oklch(70.2% 0.183 293.541)",500:"oklch(60.6% 0.25 292.717)",600:"oklch(54.1% 0.281 293.009)",700:"oklch(49.1% 0.27 292.581)",800:"oklch(43.2% 0.232 292.759)",900:"oklch(38% 0.189 293.745)",950:"oklch(28.3% 0.141 291.089)"},purple:{50:"oklch(97.7% 0.014 308.299)",100:"oklch(94.6% 0.033 307.174)",200:"oklch(90.2% 0.063 306.703)",300:"oklch(82.7% 0.119 306.383)",400:"oklch(71.4% 0.203 305.504)",500:"oklch(62.7% 0.265 303.9)",600:"oklch(55.8% 0.288 302.321)",700:"oklch(49.6% 0.265 301.924)",800:"oklch(43.8% 0.218 303.724)",900:"oklch(38.1% 0.176 304.987)",950:"oklch(29.1% 0.149 302.717)"},fuchsia:{50:"oklch(97.7% 0.017 320.058)",100:"oklch(95.2% 0.037 318.852)",200:"oklch(90.3% 0.076 319.62)",300:"oklch(83.3% 0.145 321.434)",400:"oklch(74% 0.238 322.16)",500:"oklch(66.7% 0.295 322.15)",600:"oklch(59.1% 0.293 322.896)",700:"oklch(51.8% 0.253 323.949)",800:"oklch(45.2% 0.211 324.591)",900:"oklch(40.1% 0.17 325.612)",950:"oklch(29.3% 0.136 325.661)"},pink:{50:"oklch(97.1% 0.014 343.198)",100:"oklch(94.8% 0.028 342.258)",200:"oklch(89.9% 0.061 343.231)",300:"oklch(82.3% 0.12 346.018)",400:"oklch(71.8% 0.202 349.761)",500:"oklch(65.6% 0.241 354.308)",600:"oklch(59.2% 0.249 0.584)",700:"oklch(52.5% 0.223 3.958)",800:"oklch(45.9% 0.187 3.815)",900:"oklch(40.8% 0.153 2.432)",950:"oklch(28.4% 0.109 3.907)"},rose:{50:"oklch(96.9% 0.015 12.422)",100:"oklch(94.1% 0.03 12.58)",200:"oklch(89.2% 0.058 10.001)",300:"oklch(81% 0.117 11.638)",400:"oklch(71.2% 0.194 13.428)",500:"oklch(64.5% 0.246 16.439)",600:"oklch(58.6% 0.253 17.585)",700:"oklch(51.4% 0.222 16.935)",800:"oklch(45.5% 0.188 13.697)",900:"oklch(41% 0.159 10.272)",950:"oklch(27.1% 0.105 12.094)"},slate:{50:"oklch(98.4% 0.003 247.858)",100:"oklch(96.8% 0.007 247.896)",200:"oklch(92.9% 0.013 255.508)",300:"oklch(86.9% 0.022 252.894)",400:"oklch(70.4% 0.04 256.788)",500:"oklch(55.4% 0.046 257.417)",600:"oklch(44.6% 0.043 257.281)",700:"oklch(37.2% 0.044 257.287)",800:"oklch(27.9% 0.041 260.031)",900:"oklch(20.8% 0.042 265.755)",950:"oklch(12.9% 0.042 264.695)"},gray:{50:"oklch(98.5% 0.002 247.839)",100:"oklch(96.7% 0.003 264.542)",200:"oklch(92.8% 0.006 264.531)",300:"oklch(87.2% 0.01 258.338)",400:"oklch(70.7% 0.022 261.325)",500:"oklch(55.1% 0.027 264.364)",600:"oklch(44.6% 0.03 256.802)",700:"oklch(37.3% 0.034 259.733)",800:"oklch(27.8% 0.033 256.848)",900:"oklch(21% 0.034 264.665)",950:"oklch(13% 0.028 261.692)"},zinc:{50:"oklch(98.5% 0 0)",100:"oklch(96.7% 0.001 286.375)",200:"oklch(92% 0.004 286.32)",300:"oklch(87.1% 0.006 286.286)",400:"oklch(70.5% 0.015 286.067)",500:"oklch(55.2% 0.016 285.938)",600:"oklch(44.2% 0.017 285.786)",700:"oklch(37% 0.013 285.805)",800:"oklch(27.4% 0.006 286.033)",900:"oklch(21% 0.006 285.885)",950:"oklch(14.1% 0.005 285.823)"},neutral:{50:"oklch(98.5% 0 0)",100:"oklch(97% 0 0)",200:"oklch(92.2% 0 0)",300:"oklch(87% 0 0)",400:"oklch(70.8% 0 0)",500:"oklch(55.6% 0 0)",600:"oklch(43.9% 0 0)",700:"oklch(37.1% 0 0)",800:"oklch(26.9% 0 0)",900:"oklch(20.5% 0 0)",950:"oklch(14.5% 0 0)"},stone:{50:"oklch(98.5% 0.001 106.423)",100:"oklch(97% 0.001 106.424)",200:"oklch(92.3% 0.003 48.717)",300:"oklch(86.9% 0.005 56.366)",400:"oklch(70.9% 0.01 56.259)",500:"oklch(55.3% 0.013 58.071)",600:"oklch(44.4% 0.011 73.639)",700:"oklch(37.4% 0.01 67.558)",800:"oklch(26.8% 0.007 34.298)",900:"oklch(21.6% 0.006 56.043)",950:"oklch(14.7% 0.004 49.25)"},mauve:{50:"oklch(98.5% 0 0)",100:"oklch(96% 0.003 325.6)",200:"oklch(92.2% 0.005 325.62)",300:"oklch(86.5% 0.012 325.68)",400:"oklch(71.1% 0.019 323.02)",500:"oklch(54.2% 0.034 322.5)",600:"oklch(43.5% 0.029 321.78)",700:"oklch(36.4% 0.029 323.89)",800:"oklch(26.3% 0.024 320.12)",900:"oklch(21.2% 0.019 322.12)",950:"oklch(14.5% 0.008 326)"},olive:{50:"oklch(98.8% 0.003 106.5)",100:"oklch(96.6% 0.005 106.5)",200:"oklch(93% 0.007 106.5)",300:"oklch(88% 0.011 106.6)",400:"oklch(73.7% 0.021 106.9)",500:"oklch(58% 0.031 107.3)",600:"oklch(46.6% 0.025 107.3)",700:"oklch(39.4% 0.023 107.4)",800:"oklch(28.6% 0.016 107.4)",900:"oklch(22.8% 0.013 107.4)",950:"oklch(15.3% 0.006 107.1)"},mist:{50:"oklch(98.7% 0.002 197.1)",100:"oklch(96.3% 0.002 197.1)",200:"oklch(92.5% 0.005 214.3)",300:"oklch(87.2% 0.007 219.6)",400:"oklch(72.3% 0.014 214.4)",500:"oklch(56% 0.021 213.5)",600:"oklch(45% 0.017 213.2)",700:"oklch(37.8% 0.015 216)",800:"oklch(27.5% 0.011 216.9)",900:"oklch(21.8% 0.008 223.9)",950:"oklch(14.8% 0.004 228.8)"},taupe:{50:"oklch(98.6% 0.002 67.8)",100:"oklch(96% 0.002 17.2)",200:"oklch(92.2% 0.005 34.3)",300:"oklch(86.8% 0.007 39.5)",400:"oklch(71.4% 0.014 41.2)",500:"oklch(54.7% 0.021 43.1)",600:"oklch(43.8% 0.017 39.3)",700:"oklch(36.7% 0.016 35.7)",800:"oklch(26.8% 0.011 36.5)",900:"oklch(21.4% 0.009 43.1)",950:"oklch(14.7% 0.004 49.3)"}},tc={"220.9 39.3% 11%":"gray","210 20% 98%":"gray","12 76% 61%":"gray","220 70% 50%":"gray"},vi=new Map;for(let e of Ql)for(let t of Xl)vi.set(Ri(ec[e][t]),e);function Ci(e){let t=Ri(e);return t?vi.get(t)??tc[t]??null:null}function Ri(e){if(!e)return"";let t=e.trim().replace(/\s+/g," ").toLowerCase();if(!t.startsWith("oklch(")||!t.endsWith(")"))return t;let r=t.slice(6,-1).trim(),[o]=r.split(/\s*\/\s*/),n=o.split(/\s+/);if(n.length<3)return t;let i=to(n[0],{percentage:!0}),s=to(n[1]),c=to(n[2]);return`oklch(${i} ${s} ${c})`}function to(e,t={}){return t.percentage&&e.endsWith("%")?ki(Number.parseFloat(e)/100):ki(Number.parseFloat(e))}function ki(e){return Number.isNaN(e)?"":Number(e.toFixed(12)).toString()}import nc from"postcss";import{Node as Ue,Project as ic,ScriptKind as sc,SyntaxKind as Ct}from"ts-morph";var ac=new Set(jr),lc=new Set(Tr),cc=new Set(Or),fc=new Set(Ar),mc=new Set(Ht),pc=new Set(Fr),uc=new Set(Gt),dc=new Set(["eb-garamond","instrument-serif","lora","merriweather","playfair-display","noto-serif","roboto-slab"]),gc=new Set(["jetbrains-mono","geist-mono"]),Rt=["--font-sans","--font-serif","--font-mono"],$i=new Set(Rt),hc=[...Rt,"--font-heading"],Ei=new Set(hc),xi={appliedBodyVariable:null,variables:{}},yc={0:"none","0rem":"none","0.45rem":"small","0.625rem":"default","0.875rem":"large"};async function pr(e,t){let r=bc(e.style);if(!r)return{code:null,fallbacks:[],values:null};let o=Z[r],n=await wc(e.resolvedPaths.tailwindCss),i=fr(ac,e.tailwind.baseColor),s=Cc(n),c=Rc(n),a=fr(lc,e.iconLibrary),f=Si(n,xi),m=f??o.font,p=Ii(n,m,xi);if(!f||!p){let I=t;if(t===void 0)try{I=await F(e.resolvedPaths.cwd,{configCssFile:e.tailwind.css})}catch{I=null}let x=await $c(e,I);f??=Si(n,x),m=f??o.font,p??=Ii(n,m,x)}let u=Sc(p??o.fontHeading,m,o.fontHeading),h=xc(n.rootVars["--radius"]),g=fr(cc,e.menuAccent),y=fr(fc,e.menuColor),k={style:r,baseColor:i??o.baseColor,theme:s??o.theme,chartColor:c??o.chartColor,iconLibrary:a??o.iconLibrary,font:m,fontHeading:u,radius:h??o.radius,menuAccent:g??o.menuAccent,menuColor:y??o.menuColor},v=[!i&&"baseColor",!s&&"theme",!c&&"chartColor",!a&&"iconLibrary",!f&&"font",!p&&"fontHeading",!h&&"radius",!g&&"menuAccent",!y&&"menuColor"].filter(Boolean);return{code:cn(k),fallbacks:v,values:k}}async function wc(e){let t={darkVars:{},imports:[],rootVars:{},themeVars:{}};if(!e)return t;try{let r=await Pi.readFile(e,"utf8");return kc(r)}catch{return t}}function bc(e){if(!e)return null;let t=e.replace(/^(base|radix)-/,"");return t in Z?t:null}function kc(e){let t=nc.parse(e),r={darkVars:{},imports:[],rootVars:{},themeVars:{}};return t.walkAtRules("import",o=>{let n=vc(o.params);n&&r.imports.push(n)}),t.walkRules(o=>{let n=o.selector.split(",").map(i=>i.trim()).filter(Boolean);n.includes(":root")&&ro(o,r.rootVars),n.includes(".dark")&&ro(o,r.darkVars)}),t.walkAtRules("theme",o=>{o.params.trim()==="inline"&&ro(o,r.themeVars)}),r}function ro(e,t){for(let r of e.nodes??[])r.type!=="decl"||!r.prop.startsWith("--")||(t[r.prop]=r.value.trim())}function vc(e){let t=e.trim();return(t.match(/^url\((['"]?)(.+?)\1\)$/)??t.match(/^(['"])(.+?)\1$/))?.[2]??null}function Cc(e){let t=mr(e.rootVars["--primary"]);if(!t)return null;let r=e.darkVars["--primary"];return r?mr(r)===t?t:null:t}function Rc(e){let t=mr(e.rootVars["--chart-1"]);if(!t)return null;let r=e.darkVars["--chart-1"];return r?mr(r)===t?t:null:t}function mr(e){let t=Ci(e);return!t||!uc.has(t)?null:t}function xc(e){if(!e)return null;let t=ur(e);return yc[t]??null}function Si(e,t){for(let r of Rt){let o=Ti(e,r);if(o)return o}for(let r of Rt){let o=Ic(e.imports,r);if(o)return o}return Pc(t)}function Ii(e,t,r){let o=oo(e,"--font-heading"),n=o?Oi(o):null;if(n)return n===t?"inherit":n;let i=r.variables["--font-heading"],s=ji(e,"--font-heading");if(!s)return i&&i!==t?i:null;let c=no(s);if(c&&$i.has(c)){let a=Ti(e,c),f=r.variables[c],m=a??f??null;return!m||m===t?"inherit":m}return c==="--font-heading"?i?i===t?"inherit":i:null:i&&i!==t?i:null}function Sc(e,t,r){let o=e===t?"inherit":e;return pc.has(o)?o:r}function oo(e,t,r=new Set){if(r.has(t))return null;r.add(t);let o=ji(e,t);if(!o)return null;let n=no(o);return n?Ei.has(n)?oo(e,n,r):null:o}function ji(e,t){let r=e.themeVars[t];return r&&no(r)!==t?r:e.rootVars[t]??r??null}function no(e){return ur(e).match(/^var\((--[a-z0-9-]+)\)$/)?.[1]??null}function Ti(e,t){let r=oo(e,t),o=r?Oi(r):null;return o||null}function Ic(e,t){let r=e.flatMap(o=>{let n=Lc(o);return n&&Vc(n)===t?[n]:[]});return r.length===1?r[0]:null}function Pc(e){if(e.appliedBodyVariable&&e.variables[e.appliedBodyVariable])return e.variables[e.appliedBodyVariable]??null;let t=Rt.map(r=>e.variables[r]).filter(Boolean).filter((r,o,n)=>n.indexOf(r)===o);return t.length===1?t[0]:null}async function $c(e,t){let r={appliedBodyVariable:null,variables:{}};if(!t||t.framework.name!=="next-app"&&t.framework.name!=="next-pages")return r;let o=Ec(e,t);if(!o)return r;try{let n=await Pi.readFile(o,"utf8");return jc(n,t.framework.name)}catch{return r}}function Ec(e,t){let r=t.isTsx?"tsx":"jsx",o=t.framework.name==="next-app"?t.isSrcDir?[`src/app/layout.${r}`,`app/layout.${r}`]:[`app/layout.${r}`]:t.isSrcDir?[`src/pages/_app.${r}`,`pages/_app.${r}`]:[`pages/_app.${r}`];for(let n of o){let i=oc.join(e.resolvedPaths.cwd,n);if(rc(i))return i}return null}function jc(e,t){let o=new ic({compilerOptions:{}}).createSourceFile("font-source.tsx",e,{overwrite:!0,scriptKind:sc.TSX}),n=new Map;for(let c of o.getImportDeclarations())if(c.getModuleSpecifierValue()==="next/font/google")for(let a of c.getNamedImports()){let f=a.getName(),m=a.getAliasNode()?.getText()??f,p=_c(f);p&&n.set(m,p)}let i={},s=new Map;for(let c of o.getVariableStatements())for(let a of c.getDeclarations()){let f=a.getInitializer();if(!f?.isKind(Ct.CallExpression))continue;let m=n.get(f.getExpression().getText());if(!m)continue;let p=Tc(f);p&&(s.set(a.getName(),p),i[p]=m)}return{appliedBodyVariable:Fc(o,s,t),variables:i}}function Tc(e){let t=e.getArguments()[0];if(!t||!Ue.isObjectLiteralExpression(t))return null;let r=t.getProperty("variable");if(!r||!Ue.isPropertyAssignment(r))return null;let o=r.getInitializer();if(!o)return null;let n=Fi(o.getText());return Ei.has(n)?n:null}function Fc(e,t,r){let o=e.getDescendantsOfKind(Ct.JsxOpeningElement).filter(i=>r==="next-app"?i.getTagNameNode().getText()==="html":!0),n=new Set;for(let i of o){let s=i.getAttribute("className");if(!s||!Ue.isJsxAttribute(s))continue;let c=s.getInitializer();if(!c)continue;let a=Oc(c,t),f=Ac(c);if(f&&a.includes(f))return f;a.length===1&&n.add(a[0])}return n.size===1?Array.from(n)[0]:null}function Oc(e,t){let r=Ue.isJsxExpression(e)?[e.getExpression(),...e.getDescendantsOfKind(Ct.PropertyAccessExpression)].filter(Boolean):[],o=new Set;for(let n of r){if(!n||!Ue.isPropertyAccessExpression(n)||n.getName()!=="variable")continue;let i=n.getExpression().getText(),s=t.get(i);s&&$i.has(s)&&o.add(s)}return Array.from(o)}function Ac(e){let t=Nc(e);return/\bfont-sans\b/.test(t)?"--font-sans":/\bfont-serif\b/.test(t)?"--font-serif":/\bfont-mono\b/.test(t)?"--font-mono":null}function Nc(e){let t=[];(Ue.isStringLiteral(e)||Ue.isNoSubstitutionTemplateLiteral(e))&&t.push(e.getLiteralValue());for(let r of e.getDescendantsOfKind(Ct.StringLiteral))t.push(r.getLiteralValue());for(let r of e.getDescendantsOfKind(Ct.NoSubstitutionTemplateLiteral))t.push(r.getLiteralValue());return t.length>0?t.join(" "):e.getText()}function Fi(e){return e.replace(/^['"]|['"]$/g,"")}function Oi(e){if(!e)return null;let t=Fi(e.split(",")[0]?.trim()??"").replace(/\s+variable$/i,"").trim();return t?io(t.replace(/\s+/g,"-")):null}function Lc(e){if(!e)return null;let t=ur(e),r="@fontsource-variable/";return t.startsWith(r)?io(t.slice(r.length)):null}function _c(e){return e?io(e.replace(/_/g,"-")):null}function io(e){let t=ur(e);return mc.has(t)?t:null}function Vc(e){return gc.has(e)?"--font-mono":dc.has(e)?"--font-serif":"--font-sans"}function ur(e){return e?e.trim().replace(/\s+/g," ").replace(/\s*,\s*/g,", ").replace(/"/g,"'").toLowerCase():""}function fr(e,t){return t&&e.has(t)?t:null}import{Command as Uc}from"commander";var Ni=`${S}/code/apps/v4/registry/bases`,Li=new Uc().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",!1).action(async e=>{try{let t=Ai.resolve(e.cwd);if(!Dc(Ai.resolve(t,"components.json"))&&await M(t)){let c=await B(t);c.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running info from a monorepo root. Use the -c flag to specify a workspace.",targets:c.map(a=>a.name)},null,2)):W("info",c),process.exit(1))}let r=await F(t),o=await j(t),n=await He(t),i=je(o?.style),s=await Bc(r,o,n,i);if(e.json){console.log(JSON.stringify(s,null,2));return}Wc(s)}catch(t){R(t)}});function Mc(e){if(!e)return{};let t={};for(let[r,o]of Object.entries(e))t[r]=typeof o=="string"?o:o.url;return t}async function Bc(e,t,r,o){let n=t?await pr(t,e):null;return{project:e?{framework:e.framework.label,frameworkName:e.framework.name,frameworkVersion:e.frameworkVersion??null,srcDirectory:e.isSrcDir,rsc:e.isRSC,typescript:e.isTsx,tailwindVersion:e.tailwindVersion??null,tailwindConfig:e.tailwindConfigFile??null,tailwindCss:e.tailwindCssFile??null,importAlias:e.aliasPrefix??null}:null,config:t?{style:t.style,base:o,rsc:t.rsc,typescript:t.tsx,iconLibrary:t.iconLibrary??null,rtl:t.rtl??!1,menuColor:t.menuColor??null,menuAccent:t.menuAccent??null,aliases:{components:t.aliases.components,utils:t.aliases.utils,ui:t.aliases.ui??null,lib:t.aliases.lib??null,hooks:t.aliases.hooks??null},resolvedPaths:{cwd:t.resolvedPaths.cwd,tailwindConfig:t.resolvedPaths.tailwindConfig||null,tailwindCss:t.resolvedPaths.tailwindCss||null,utils:t.resolvedPaths.utils,components:t.resolvedPaths.components,lib:t.resolvedPaths.lib,hooks:t.resolvedPaths.hooks,ui:t.resolvedPaths.ui},registries:Mc(t.registries)}:null,preset:n,components:r,links:{docs:`${S}/docs`,components:`${S}/docs/components/${o}/[component].md`,ui:`${Ni}/${o}/ui/[component].tsx`,examples:`${Ni}/${o}/examples/[component]-example.tsx`,schema:`${S}/schema.json`}}}function Wc(e){l.log(d.info("Project")),e.project?Re({framework:`${e.project.framework} (${e.project.frameworkName})`,frameworkVersion:e.project.frameworkVersion??"-",srcDirectory:e.project.srcDirectory?"Yes":"No",rsc:e.project.rsc?"Yes":"No",typescript:e.project.typescript?"Yes":"No",tailwindVersion:e.project.tailwindVersion??"-",tailwindConfig:e.project.tailwindConfig??"-",tailwindCss:e.project.tailwindCss??"-",importAlias:e.project.importAlias??"-"}):l.log(" No project info detected."),l.break(),l.log(d.info("Configuration")),e.config?(Re({style:e.config.style,base:e.config.base,rsc:e.config.rsc?"Yes":"No",typescript:e.config.typescript?"Yes":"No",iconLibrary:e.config.iconLibrary??"-",rtl:e.config.rtl?"Yes":"No",menuColor:e.config.menuColor??"-",menuAccent:e.config.menuAccent??"-"}),l.break(),dr(e.preset),l.break(),l.log(d.info("Aliases")),Re({components:e.config.aliases.components,utils:e.config.aliases.utils,ui:e.config.aliases.ui??"-",lib:e.config.aliases.lib??"-",hooks:e.config.aliases.hooks??"-"}),l.break(),l.log(d.info("Resolved Paths")),Re({cwd:e.config.resolvedPaths.cwd,tailwindConfig:e.config.resolvedPaths.tailwindConfig??"-",tailwindCss:e.config.resolvedPaths.tailwindCss??"-",utils:e.config.resolvedPaths.utils,components:e.config.resolvedPaths.components,lib:e.config.resolvedPaths.lib,hooks:e.config.resolvedPaths.hooks,ui:e.config.resolvedPaths.ui}),Object.keys(e.config.registries).length>0&&(l.break(),l.log("registries:"),Re(e.config.registries))):l.log(" No components.json found."),l.break(),l.log(d.info("Installed Components")),e.components.length>0?l.log(` ${e.components.join(", ")}`):l.log(" No components installed."),l.break(),l.log(d.info("Links")),Re(e.links),l.break()}function dr(e,t={}){if(l.log(d.info("Preset")),!e?.code)Re({code:"-"});else{let r=e.fallbacks??[],o=(n,i)=>{let s=r.includes(n)?"*":"";return`${i??"-"}${s}`};Re({code:e.code,version:e.code[0],style:e.values?.style??"-",baseColor:o("baseColor",e.values?.baseColor),theme:o("theme",e.values?.theme),chartColor:o("chartColor",e.values?.chartColor),iconLibrary:o("iconLibrary",e.values?.iconLibrary),font:o("font",e.values?.font),fontHeading:o("fontHeading",e.values?.fontHeading),radius:o("radius",e.values?.radius),menuAccent:o("menuAccent",e.values?.menuAccent),menuColor:o("menuColor",e.values?.menuColor),url:`${S}/create?preset=${e.code}`}),r.length>0&&(l.log(""),l.log(t.fallbackNote??" * Uses preset defaults for values not available as options on love-ui create."))}}function Re(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,o]of Object.entries(e))l.log(` ${r.padEnd(t+2)}${o}`)}import{promises as _i}from"fs";import Vi from"path";import{StdioServerTransport as zc}from"@modelcontextprotocol/sdk/server/stdio.js";import{Command as Jc}from"commander";import Gc from"deepmerge";import{execa as Di}from"execa";import Hc from"fs-extra";import Kc from"prompts";import so from"zod";var Me="latest",hr=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{loveui:{command:"npx",args:[`love-ui@${Me}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{loveui:{command:"npx",args:[`love-ui@${Me}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{loveui:{command:"npx",args:[`love-ui@${Me}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.loveui]
159
159
  command = "npx"
160
160
  args = ["love-ui@${Me}", "mcp"]
161
- `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{loveui:{type:"local",command:["npx",`love-ui@${Me}`,"mcp"],enabled:!0}}}}],gr=[`love-ui@${Me}`],lo=new Jc().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await ee(e.cwd);let t=new zc;await rn.connect(t)}catch(t){l.break(),R(t)}}),Yc=ao.object({client:ao.enum(["claude","cursor","vscode","codex","opencode"]),cwd:ao.string()});lo.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${hr.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let o=(t.parent?.opts()||{}).cwd||process.cwd(),n=e.client;if(!n){let f=await Kc({type:"select",name:"client",message:"Which MCP client are you using?",choices:hr.map(m=>({title:m.label,value:m.name}))});f.client||(l.break(),process.exit(1)),n=f.client}let i=Yc.parse({client:n,cwd:o}),s=await j(i.cwd);if(i.client==="codex"){if(s)await D([],gr,s,{silent:!1});else{let f=await ce(i.cwd),m=f==="npm"?"install":"add",p=f==="npm"?"--save-dev":"-D",u=b("Installing dependencies...").start();await Di(f,[m,p,...gr],{cwd:i.cwd}),u.succeed("Installing dependencies.")}l.break(),l.log("To configure the Love UI MCP server in Codex:"),l.break(),l.log(`1. Open or create the file ${d.info("~/.codex/config.toml")}`),l.log("2. Add the following configuration:"),l.log(),l.info(`[mcp_servers.loveui]
161
+ `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{loveui:{type:"local",command:["npx",`love-ui@${Me}`,"mcp"],enabled:!0}}}}],gr=[`love-ui@${Me}`],ao=new Jc().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await ee(e.cwd);let t=new zc;await tn.connect(t)}catch(t){l.break(),R(t)}}),Yc=so.object({client:so.enum(["claude","cursor","vscode","codex","opencode"]),cwd:so.string()});ao.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${hr.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let o=(t.parent?.opts()||{}).cwd||process.cwd(),n=e.client;if(!n){let f=await Kc({type:"select",name:"client",message:"Which MCP client are you using?",choices:hr.map(m=>({title:m.label,value:m.name}))});f.client||(l.break(),process.exit(1)),n=f.client}let i=Yc.parse({client:n,cwd:o}),s=await j(i.cwd);if(i.client==="codex"){if(s)await D([],gr,s,{silent:!1});else{let f=await ce(i.cwd),m=f==="npm"?"install":"add",p=f==="npm"?"--save-dev":"-D",u=b("Installing dependencies...").start();await Di(f,[m,p,...gr],{cwd:i.cwd}),u.succeed("Installing dependencies.")}l.break(),l.log("To configure the Love UI MCP server in Codex:"),l.break(),l.log(`1. Open or create the file ${d.info("~/.codex/config.toml")}`),l.log("2. Add the following configuration:"),l.log(),l.info(`[mcp_servers.loveui]
162
162
  command = "npx"
163
163
  args = ["love-ui@${Me}", "mcp"]`),l.break(),l.info("3. Restart Codex to load the MCP server"),l.break(),process.exit(0)}let c=b("Configuring MCP server...").start(),a=await Zc(i);if(c.succeed("Configuring MCP server."),s)await D([],gr,s,{silent:!1});else{let f=await ce(i.cwd),m=f==="npm"?"install":"add",p=f==="npm"?"--save-dev":"-D",u=b("Installing dependencies...").start();await Di(f,[m,p,...gr],{cwd:i.cwd}),u.succeed("Installing dependencies.")}l.break(),l.success(`Configuration saved to ${a}.`),l.break()}catch(r){R(r)}});var qc=(e,t)=>t;async function Zc(e){let{client:t,cwd:r}=e,o=hr.find(a=>a.name===t);if(!o)throw new Error(`Unknown client: ${t}. Available clients: ${hr.map(a=>a.name).join(", ")}`);let n=Vi.join(r,o.configPath),i=Vi.dirname(n);await Hc.ensureDir(i);let s={};try{let a=await _i.readFile(n,"utf-8");s=JSON.parse(a)}catch{}let c=Gc(s,o.config,{arrayMerge:qc});return await _i.writeFile(n,JSON.stringify(c,null,2)+`
164
- `,"utf-8"),o.configPath}import uf from"path";import{randomBytes as Xc}from"crypto";import{promises as co}from"fs";import{tmpdir as Qc}from"os";import yr from"path";var Se={lucide:{name:"lucide-react",package:"lucide-react",import:"lucide-react"},radix:{name:"@radix-ui/react-icons",package:"@radix-ui/react-icons",import:"@radix-ui/react-icons"}};import ef from"fast-glob";import Ui from"prompts";import{Project as tf,ScriptKind as rf,SyntaxKind as of}from"ts-morph";async function Mi(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t=e.resolvedPaths.ui,[r,o]=await Promise.all([ef("**/*.{js,ts,jsx,tsx}",{cwd:t}),Go()]);if(Object.keys(o).length===0)throw new Error("Something went wrong fetching the registry icons.");let n=Object.entries(Se).map(([m,p])=>({title:p.name,value:m})),i=await Ui([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${d.info("migrate from")}?`,choices:n},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${d.info("migrate to")}?`,choices:n}]);if(i.sourceLibrary===i.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(i.sourceLibrary in Se&&i.targetLibrary in Se))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=Se[i.sourceLibrary],c=Se[i.targetLibrary],{confirm:a}=await Ui({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${d.info(r.length)} files in ${d.info(`./${yr.relative(e.resolvedPaths.cwd,t)}`)} from ${d.info(s.name)} to ${d.info(c.name)}. Continue?`});a||(l.info("Migration cancelled."),process.exit(0)),c.package&&await D([c.package],[],e,{silent:!1});let f=b("Migrating icons...")?.start();await Promise.all(r.map(async m=>{f.text=`Migrating ${m}...`;let p=yr.join(t,m),u=await co.readFile(p,"utf-8"),h=await nf(u,i.sourceLibrary,i.targetLibrary,o);await co.writeFile(p,h)})),f.succeed("Migration complete.")}async function nf(e,t,r,o){let n=Se[t]?.import,i=Se[r]?.import,s=await co.mkdtemp(yr.join(Qc(),"love-ui-")),c=new tf({compilerOptions:{}}),a=yr.join(s,`love-ui-icons-${Xc(4).toString("hex")}.tsx`),f=c.createSourceFile(a,e,{scriptKind:rf.TSX}),m=[];for(let p of f.getImportDeclarations()??[])if(p.getModuleSpecifier()?.getText()===`"${n}"`){for(let u of p.getNamedImports()??[]){let h=u.getName(),g=Object.values(o).find(y=>y[t]===h)?.[r];!g||m.includes(g)||(m.push(g),u.remove(),f.getDescendantsOfKind(of.JsxSelfClosingElement).filter(y=>y.getTagNameNode()?.getText()===h).forEach(y=>y.getTagNameNode()?.replaceWithText(g)))}p.getNamedImports()?.length===0&&p.remove()}return m.length>0&&f.addImportDeclaration({moduleSpecifier:i,namedImports:m.map(p=>({name:p}))}),await f.getText()}import{promises as wr}from"fs";import br from"path";import fo from"fast-glob";import sf from"prompts";function af(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function lf(e,t,r,o){let i=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of i){let c=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),a=s.match(/^(\w+)\s+as\s+(\w+)$/);if(c){let f=c[1],m=c[2];o==="slot"&&f==="Slot"&&!m?r.push({name:"Slot",alias:"SlotPrimitive",isType:!0}):r.push({name:f,alias:m,isType:!0})}else if(a){let f=a[1],m=a[2];o==="slot"&&f==="Slot"&&m==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:f,alias:m,isType:t})}else o==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t})}}async function Bi(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await fo(t.path,{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else{let a=br.resolve(o,t.path),f=await wr.stat(a).catch(()=>null);if(!f)throw new Error(`File not found: ${t.path}`);if(f.isDirectory())o=a,r=await fo("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else if(f.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else{if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");o=e.resolvedPaths.ui,r=await fo("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0})}if(!t.yes){let c=t.path?t.path:`./${br.relative(e.resolvedPaths.cwd,o)}`,{confirm:a}=await sf({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${d.info(r.length)} file(s) in ${d.info(c)} to ${d.info("radix-ui")}. Continue?`});a||(l.info("Migration cancelled."),process.exit(0))}let n=b("Migrating imports...")?.start(),i=new Set;await Promise.all(r.map(async c=>{n.text=`Migrating ${c}...`;let a=br.join(o,c),f=await wr.readFile(a,"utf-8"),{content:m,replacedPackages:p}=await cf(f);p.forEach(u=>i.add(u)),await wr.writeFile(a,m)})),n.succeed("Migrating imports.");let s=b("Updating package.json...")?.start();try{let c=je(e.resolvedPaths.cwd,!1);if(!c){s.fail("Could not read package.json"),l.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let a=Array.from(i);if(a.length>0){if(c.dependencies||(c.dependencies={}),c.dependencies?.["radix-ui"]||c.devDependencies?.["radix-ui"])s.succeed("radix-ui already in package.json.");else{c.dependencies["radix-ui"]="latest";let m=br.join(e.resolvedPaths.cwd,"package.json");await wr.writeFile(m,JSON.stringify(c,null,2)+`
164
+ `,"utf-8"),o.configPath}import uf from"path";import{randomBytes as Xc}from"crypto";import{promises as lo}from"fs";import{tmpdir as Qc}from"os";import yr from"path";var xe={lucide:{name:"lucide-react",package:"lucide-react",import:"lucide-react"},radix:{name:"@radix-ui/react-icons",package:"@radix-ui/react-icons",import:"@radix-ui/react-icons"}};import ef from"fast-glob";import Ui from"prompts";import{Project as tf,ScriptKind as rf,SyntaxKind as of}from"ts-morph";async function Mi(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t=e.resolvedPaths.ui,[r,o]=await Promise.all([ef("**/*.{js,ts,jsx,tsx}",{cwd:t}),Jo()]);if(Object.keys(o).length===0)throw new Error("Something went wrong fetching the registry icons.");let n=Object.entries(xe).map(([m,p])=>({title:p.name,value:m})),i=await Ui([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${d.info("migrate from")}?`,choices:n},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${d.info("migrate to")}?`,choices:n}]);if(i.sourceLibrary===i.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(i.sourceLibrary in xe&&i.targetLibrary in xe))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=xe[i.sourceLibrary],c=xe[i.targetLibrary],{confirm:a}=await Ui({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${d.info(r.length)} files in ${d.info(`./${yr.relative(e.resolvedPaths.cwd,t)}`)} from ${d.info(s.name)} to ${d.info(c.name)}. Continue?`});a||(l.info("Migration cancelled."),process.exit(0)),c.package&&await D([c.package],[],e,{silent:!1});let f=b("Migrating icons...")?.start();await Promise.all(r.map(async m=>{f.text=`Migrating ${m}...`;let p=yr.join(t,m),u=await lo.readFile(p,"utf-8"),h=await nf(u,i.sourceLibrary,i.targetLibrary,o);await lo.writeFile(p,h)})),f.succeed("Migration complete.")}async function nf(e,t,r,o){let n=xe[t]?.import,i=xe[r]?.import,s=await lo.mkdtemp(yr.join(Qc(),"love-ui-")),c=new tf({compilerOptions:{}}),a=yr.join(s,`love-ui-icons-${Xc(4).toString("hex")}.tsx`),f=c.createSourceFile(a,e,{scriptKind:rf.TSX}),m=[];for(let p of f.getImportDeclarations()??[])if(p.getModuleSpecifier()?.getText()===`"${n}"`){for(let u of p.getNamedImports()??[]){let h=u.getName(),g=Object.values(o).find(y=>y[t]===h)?.[r];!g||m.includes(g)||(m.push(g),u.remove(),f.getDescendantsOfKind(of.JsxSelfClosingElement).filter(y=>y.getTagNameNode()?.getText()===h).forEach(y=>y.getTagNameNode()?.replaceWithText(g)))}p.getNamedImports()?.length===0&&p.remove()}return m.length>0&&f.addImportDeclaration({moduleSpecifier:i,namedImports:m.map(p=>({name:p}))}),await f.getText()}import{promises as wr}from"fs";import br from"path";import co from"fast-glob";import sf from"prompts";function af(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function lf(e,t,r,o){let i=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of i){let c=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),a=s.match(/^(\w+)\s+as\s+(\w+)$/);if(c){let f=c[1],m=c[2];o==="slot"&&f==="Slot"&&!m?r.push({name:"Slot",alias:"SlotPrimitive",isType:!0}):r.push({name:f,alias:m,isType:!0})}else if(a){let f=a[1],m=a[2];o==="slot"&&f==="Slot"&&m==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:f,alias:m,isType:t})}else o==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t})}}async function Bi(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await co(t.path,{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else{let a=br.resolve(o,t.path),f=await wr.stat(a).catch(()=>null);if(!f)throw new Error(`File not found: ${t.path}`);if(f.isDirectory())o=a,r=await co("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else if(f.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else{if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");o=e.resolvedPaths.ui,r=await co("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0})}if(!t.yes){let c=t.path?t.path:`./${br.relative(e.resolvedPaths.cwd,o)}`,{confirm:a}=await sf({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${d.info(r.length)} file(s) in ${d.info(c)} to ${d.info("radix-ui")}. Continue?`});a||(l.info("Migration cancelled."),process.exit(0))}let n=b("Migrating imports...")?.start(),i=new Set;await Promise.all(r.map(async c=>{n.text=`Migrating ${c}...`;let a=br.join(o,c),f=await wr.readFile(a,"utf-8"),{content:m,replacedPackages:p}=await cf(f);p.forEach(u=>i.add(u)),await wr.writeFile(a,m)})),n.succeed("Migrating imports.");let s=b("Updating package.json...")?.start();try{let c=Ee(e.resolvedPaths.cwd,!1);if(!c){s.fail("Could not read package.json"),l.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let a=Array.from(i);if(a.length>0){if(c.dependencies||(c.dependencies={}),c.dependencies?.["radix-ui"]||c.devDependencies?.["radix-ui"])s.succeed("radix-ui already in package.json.");else{c.dependencies["radix-ui"]="latest";let m=br.join(e.resolvedPaths.cwd,"package.json");await wr.writeFile(m,JSON.stringify(c,null,2)+`
165
165
  `),s.succeed("Updated package.json."),await D(["radix-ui"],[],e,{silent:!1})}l.info(""),l.info("Migration complete. The following packages may be removed if no longer in use:"),l.info(d.info(a.join(", "))),l.info("Please review your codebase before removing.")}else s.succeed("No packages found in source files.")}catch{s.fail("Failed to update package.json"),l.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui")}}async function cf(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],o=[],n=[],i='"',s=!1,c=e,a;for(;(a=t.exec(e))!==null;){let[g,y,k,v,I,x,C]=a;if(x==="icons"||x.startsWith("icons/"))continue;o.push(g),o.length===1&&(i=I,s=C===";"),n.push(`@radix-ui/react-${x}`);let $=!!y;if(k){let U=af(x);r.push({name:U,alias:k,isType:$})}else v&&lf(v,$,r,x)}if(r.length===0)return{content:e,replacedPackages:[]};let f=r.filter((g,y,k)=>y===k.findIndex(v=>v.name===g.name&&v.alias===g.alias&&v.isType===g.isType)),p=`import { ${f.map(g=>{let y=g.isType?"type ":"";return g.alias?`${y}${g.name} as ${g.alias}`:`${y}${g.name}`}).join(", ")} } from ${i}radix-ui${i}${s?";":""}`;c=o.reduce((g,y,k)=>g.replace(y,k===0?p:""),c),c=c.replace(/\n\s*\n\s*\n/g,`
166
166
 
167
167
  `),f.some(g=>g.name==="Slot"&&g.alias==="SlotPrimitive")&&(c=c.split(`
168
168
  `).map(k=>{if(k.trim().startsWith("import "))return k;let v=k;return v=v.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bSlot\b/g,(I,x,C)=>{let $=C.substring(0,x),U=($.match(/"/g)||[]).length,Y=($.match(/'/g)||[]).length;return U%2!==0||Y%2!==0?I:"__SLOT_PLACEHOLDER__"}),v=v.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),v}).join(`
169
- `));let h=Array.from(new Set(n));return{content:c,replacedPackages:h}}import{promises as xt}from"fs";import St from"path";import mo from"fast-glob";import ff from"prompts";var mf=["sidebar.tsx","pagination.tsx","calendar.tsx"],pf=`${S}/docs/rtl#manual-migration-optional`;async function Wi(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await mo(t.path,{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else{let f=St.resolve(o,t.path),m=await xt.stat(f).catch(()=>null);if(!m)throw new Error(`File not found: ${t.path}`);if(m.isDirectory())o=f,r=await mo("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else if(m.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else{if(!e.resolvedPaths.ui)throw new Error("Could not find a valid `ui` path in your `components.json`. Please provide a path or glob pattern.");o=e.resolvedPaths.ui,r=await mo("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0})}if(!t.yes){let a=t.path?t.path:`./${St.relative(e.resolvedPaths.cwd,o)}`,{confirm:f}=await ff({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${d.info(r.length)} file(s) in ${d.info(a)} to RTL. Continue?`});f||(l.info("Migration cancelled."),process.exit(0))}let n=b("Updating components.json...").start();try{let a=St.resolve(e.resolvedPaths.cwd,"components.json"),f=JSON.parse(await xt.readFile(a,"utf-8"));f.rtl=!0,await xt.writeFile(a,JSON.stringify(f,null,2)+`
170
- `),n.succeed("Updated components.json.")}catch{throw n.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let i=b("Migrating files to RTL...").start(),s=0,c=[];if(await Promise.all(r.map(async a=>{i.text=`Migrating ${a}...`;let f=St.join(o,a),m=await xt.readFile(f,"utf-8"),p=await To(m,!0);p!==m&&(await xt.writeFile(f,p),s++);let u=St.basename(a);mf.includes(u)&&c.push(a)})),i.succeed(`Migration complete. ${s} file(s) transformed.`),c.length>0){l.break(),l.warn("The following components may need manual RTL adjustments:");for(let a of c)l.info(` - ${a}`);l.break(),l.info(`See ${d.info(pf)} for more information.`)}}import zi from"path";import po from"fs-extra";async function Ji(e){let t={};if(!po.existsSync(e.cwd)||!po.existsSync(zi.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};if(!po.existsSync(zi.resolve(e.cwd,"components.json")))return t["3"]=!0,{errors:t,config:null};try{let r=await j(e.cwd);return{errors:t,config:r}}catch{l.break(),l.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
171
- Before you can run a migration, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{Command as df}from"commander";import{z as it}from"zod";var Gi=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."},{name:"rtl",description:"migrate your components to support RTL (right-to-left)."}],gf=it.object({cwd:it.string(),list:it.boolean(),yes:it.boolean(),migration:it.string().refine(e=>e&&Gi.some(t=>t.name===e),{message:"You must specify a valid migration. Run `love-ui migrate --list` to see available migrations."}).optional(),path:it.string().optional()}),Hi=new df().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").argument("[path]","optional path or glob pattern to migrate.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-l, --list","list all migrations.",!1).option("-y, --yes","skip confirmation prompt.",!1).action(async(e,t,r)=>{try{let o=gf.parse({cwd:uf.resolve(r.cwd),migration:e,path:t,list:r.list,yes:r.yes});if(o.list||!o.migration){l.info("Available migrations:");for(let s of Gi)l.info(`- ${s.name}: ${s.description}`);return}if(!o.migration)throw new Error("You must specify a migration. Run `love-ui migrate --list` to see available migrations.");let{errors:n,config:i}=await Ji(o);if(n["1"]||n["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!i)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");o.migration==="icons"&&await Mi(i),o.migration==="radix"&&await Bi(i,{yes:o.yes,path:o.path}),o.migration==="rtl"&&await Wi(i,{yes:o.yes,path:o.path})}catch(o){l.break(),R(o)}});import{existsSync as hf}from"fs";import Ki from"path";import{Command as It}from"commander";import yf from"open";function wf(e){return`${S}/create?preset=${e}`}function uo(e){let t=Ke(e);if(!t)throw new Error(`Invalid preset code: ${e}`);let r=[],o=t.chartColor??an[t.theme]??t.theme;return t.chartColor||r.push("chartColor"),{code:e,version:e[0],values:{...t,chartColor:o},derived:r,url:wf(e)}}function bf(e){dr({code:e.code,fallbacks:e.derived,values:e.values},{fallbackNote:" * Compatibility value for older preset versions."})}var kf=new It().name("decode").description("decode a preset code").argument("<code>","the preset code to decode").option("--json","output as JSON.",!1).action((e,t)=>{try{let r=uo(e);if(t.json){console.log(JSON.stringify({code:r.code,version:r.version,values:r.values,derived:r.derived,url:r.url},null,2));return}bf(r)}catch(r){kr(r)}}),vf=new It().name("url").description("get the create URL for a preset code").argument("<code>","the preset code").action(e=>{try{l.log(uo(e).url)}catch(t){kr(t)}}),Cf=new It().name("open").description("open a preset code in the browser").argument("<code>","the preset code").action(async e=>{let t;try{t=uo(e).url}catch(r){kr(r);return}l.break(),l.log(` Opening ${t} in your browser.`),l.break();try{await yf(t)}catch(r){let o=r instanceof Error?r.message:String(r);kr(new Error(`Failed to open preset URL: ${o}`))}}),Rf=new It().name("resolve").alias("info").description("resolve a preset from your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",!1).action(async e=>{try{let t=Ki.resolve(e.cwd);if(!hf(Ki.resolve(t,"components.json"))&&await M(t)){let i=await B(t);i.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running preset resolve from a monorepo root. Use the -c flag to specify a workspace.",targets:i.map(s=>s.name)},null,2)):W("preset resolve",i),process.exit(1))}let r=await j(t);if(!r){if(e.json){console.log(JSON.stringify(null,null,2));return}l.log("No components.json found.");return}let o=await F(t),n=await pr(r,o);if(e.json){console.log(JSON.stringify(n.code?n:null,null,2));return}dr(n)}catch(t){R(t)}}),go=new It().name("preset").description("manage presets").addCommand(kf).addCommand(Rf).addCommand(vf).addCommand(Cf).action(()=>{go.outputHelp()});function kr(e){e instanceof Error&&l.error(e.message),process.exit(1)}import Yi from"path";import{Command as xf}from"commander";import ho from"fs-extra";import Sf from"prompts";import{z as yo}from"zod";var If=yo.object({cwd:yo.string(),silent:yo.boolean()}),qi=new xf().name("add").description("add registries to your project").argument("[registries...]","registries (@namespace) or registry URLs (@namespace=url)").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",!1).action(async(e,t)=>{try{let r=If.parse({cwd:Yi.resolve(t.cwd),silent:t.silent}),o=e.length>0?e:await Ef({silent:r.silent});await $f(o,r.cwd,{silent:r.silent})}catch(r){l.break(),R(r)}});function Pf(e){let[t,...r]=e.split("="),o=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${d.info(t)}. Registry names must start with @ (e.g., @acme).`);return{namespace:t,url:o}}function wo(e,t,r){return`${e} ${e===1?t:r}`}async function $f(e,t,r){let o=Yi.resolve(t,"components.json");if(!ho.existsSync(o))throw new Error(`No ${d.info("components.json")} found. Run ${d.info("love-ui init")} first.`);let n=e.map(Pf),i=n.filter(g=>!g.url),s=[];if(i.length>0){let g=b("Fetching registries.",{silent:r.silent}).start(),y=await $r();if(!y)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),s=y}let c={};for(let{namespace:g,url:y}of n){if(g in re){l.warn(`${d.info(g)} is a built-in registry and cannot be added.`);continue}if(y){if(!y.includes("{name}"))throw new Error(`Invalid registry URL for ${d.info(g)}. URL must include {name} placeholder. Example: ${d.info(`${g}=https://example.com/r/{name}.json`)}`);c[g]=y}else{let k=s.find(v=>v.name===g);if(!k)throw new Error(`Registry ${d.info(g)} not found. Provide a URL: ${d.info(`${g}=https://.../{name}.json`)}`);c[g]=k.url}}if(Object.keys(c).length===0)return{addedRegistries:[]};let a=await ho.readJson(o),f=a.registries||{},m={},p=[];for(let[g,y]of Object.entries(c))f[g]?p.push(g):m[g]=y;if(Object.keys(m).length===0){if(p.length>0&&!r.silent){b(`Skipped ${wo(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let g of p)l.log(` - ${g}`)}else r.silent||l.info("No new registries to add.");return}let u={...a,registries:{...f,...m}},h=b("Updating components.json.",{silent:r.silent}).start();if(await ho.writeJson(o,u,{spaces:2}),h.succeed(),!r.silent){let g=Object.keys(m);b(`Added ${wo(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let y of g)l.log(` - ${y}`);if(p.length>0){b(`Skipped ${wo(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let y of p)l.log(` - ${y}`)}}}async function Ef(e){let t=b("Fetching registries.",{silent:e.silent}).start(),r=await $r();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let o=[...r].sort((i,s)=>i.name.localeCompare(s.name)),{selected:n}=await Sf({type:"autocompleteMultiselect",name:"selected",message:"Which registries would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:!1,choices:o.map(i=>({title:i.name,description:i.description,value:i.name}))});return n?.length||(l.warn("No registries selected. Exiting."),l.info(""),process.exit(1)),n}import*as Pe from"path";import*as vo from"fs/promises";import*as O from"path";import{z as Ie}from"zod";var Zi=32,jf=Io.options.filter(e=>e!=="registry:example"&&e!=="registry:internal"),Tf=Ie.record(Ie.string(),Ie.unknown()),Ff=Ie.array(Ie.string()),Of=Ie.array(Ie.unknown());async function Qi(e){let t=O.resolve(e.cwd),r=O.resolve(t,e.registryFile),o={cwd:t,rootFile:r,usesInclude:!1,diagnostics:[],registryFiles:new Set,checkedRegistryFiles:new Set,itemsChecked:0,itemSourcesByItem:new Map,firstIncludedFrom:new Map};if(O.basename(r)!=="registry.json"&&A(o,{registryFile:r,message:"Root source registry file must be named registry.json.",suggestion:"Rename the file to registry.json and pass that file to love-ui registry validate."}),!Co(r,t))return A(o,{registryFile:r,message:`Root registry file must stay inside ${st(t,t)}.`,suggestion:"Run the command from the registry root or pass a registry.json file inside --cwd."}),ko(o,[]);let n=await ts(r,o);if(!n)return ko(o,[]);o.usesInclude=!!n.include?.length,Af(n,r,o);let i=await es(r,n,o,[]);return Lf(i,o),await _f(i,o),ko(o,i)}async function es(e,t,r,o){if(o.length>=Zi)return A(r,{registryFile:e,message:`Registry include tree is too deep. The maximum include depth is ${Zi}.`,suggestion:"Flatten part of the registry include tree or reduce nested include depth."}),[];if(o.includes(e))return A(r,{registryFile:e,message:`Registry include cycle detected: ${zf([...o,e])}.`,suggestion:"Remove one include so the registry graph is acyclic."}),[];let n=o.at(-1)??e,i=r.firstIncludedFrom.get(e);if(i)return A(r,{registryFile:e,message:`Registry file included more than once. First included from ${st(i,r.cwd)}, then included from ${st(n,r.cwd)}.`,suggestion:"Remove one include or move shared items into a single included registry.json."}),[];r.registryFiles.add(e),r.firstIncludedFrom.set(e,n);let s=O.dirname(e),c=[...o,e],a=[];for(let m of t.include??[]){let p=Nf(m,e,s,r);if(!p)continue;let u=await ts(p,r);if(!u)continue;let h=await es(p,u,r,c);a.push(...h)}let f=!r.usesInclude&&e===r.rootFile?r.cwd:s;return t.items.forEach((m,p)=>{r.itemSourcesByItem.set(m,{registryFile:e,registryDir:f,itemIndex:p})}),[...a,...t.items]}async function ts(e,t){t.checkedRegistryFiles.add(e);let r;try{r=await vo.readFile(e,"utf-8")}catch{return A(t,{registryFile:e,message:"Registry file was not found or could not be read.",suggestion:"Check that the registry.json file exists and is readable."}),null}let o;try{o=JSON.parse(r)}catch{return A(t,{registryFile:e,message:"Registry file contains invalid JSON.",suggestion:"Fix the JSON syntax in the registry.json file."}),null}return Uf(o,e,t)}function Af(e,t,r){!e.name&&!e.hasName&&A(r,{registryFile:t,message:'Root registry.json must define "name".',suggestion:'Add a top-level "name" field to the root registry.json.'}),!e.homepage&&!e.hasHomepage&&A(r,{registryFile:t,message:'Root registry.json must define "homepage".',suggestion:'Add a top-level "homepage" field to the root registry.json.'})}function Nf(e,t,r,o){if(q(e))return A(o,{registryFile:t,includePath:e,message:`Remote include "${e}" is not supported.`,suggestion:"Use a relative path to an explicit registry.json file in the same repository."}),null;if(O.isAbsolute(e))return A(o,{registryFile:t,includePath:e,message:`Include "${e}" must be relative.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;if(rs(e))return A(o,{registryFile:t,includePath:e,message:`Include "${e}" cannot use parent-directory traversal.`,suggestion:"Registry includes must descend from the including chunk. Move shared registries into the registry root and include them from there."}),null;if(O.basename(e)!=="registry.json")return A(o,{registryFile:t,includePath:e,message:`Include "${e}" must explicitly reference a registry.json file.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;let n=O.resolve(r,e);return Co(n,o.cwd)?n:(A(o,{registryFile:t,includePath:e,message:`Include "${e}" must stay inside ${st(o.cwd,o.cwd)}.`,suggestion:"Keep included registry.json files inside the registry root."}),null)}function Lf(e,t){let r=new Map;for(let o of e){let n=r.get(o.name);if(!n){r.set(o.name,o);continue}let i=t.itemSourcesByItem.get(n),s=t.itemSourcesByItem.get(o);A(t,{registryFile:s?.registryFile??t.rootFile,itemName:o.name,itemIndex:s?.itemIndex,message:`Duplicate registry item name "${o.name}". First defined at ${Jf(i,t.cwd)}.`,suggestion:"Rename one of these items so each name is unique across the resolved registry."})}}async function _f(e,t){let r=Wf(t);for(let o of e){let n=t.itemSourcesByItem.get(o),i={...Df(o,t,r),$schema:"https://www.loveui.dev/schema/registry-item.json"};for(let c=0;c<(o.files?.length??0);c++){let a=o.files?.[c];if(!a||!n)continue;let f=Vf(o,a.path,n,t);if(f)try{await vo.readFile(f,"utf-8")}catch{A(t,{registryFile:n.registryFile,itemName:o.name,itemIndex:n.itemIndex,filePath:a.path,message:`File "${a.path}" was not found or could not be read.`,suggestion:"Make sure the file path is relative to the registry.json file that declares the item."})}}let s=at.safeParse(i);s.success||Pt(s.error,n?.registryFile??t.rootFile,t,{itemName:o.name,itemIndex:n?.itemIndex,suggestion:"Update the registry item so the built item matches the registry item schema."})}}function Vf(e,t,r,o){if(q(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" cannot be remote.`,suggestion:"Use a local file path relative to the registry.json file that declares the item."}),null;if(O.isAbsolute(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" must be relative.`,suggestion:"Use a local file path relative to the registry.json file that declares the item."}),null;if(rs(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" cannot use parent-directory traversal.`,suggestion:"Keep item files inside the registry chunk directory."}),null;let n=O.resolve(r.registryDir,t);return Co(n,r.registryDir)?n:(A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" must stay inside the registry chunk directory.`,suggestion:"Move the file into the same registry chunk directory or update the registry item path."}),null)}function Df(e,t,r){let o=t.itemSourcesByItem.get(e);return{...e,files:e.files?.map(n=>{let i=O.resolve(o?.registryDir??t.cwd,n.path);return{...n,path:O.relative(r,i).split(O.sep).join("/")}})}}function Uf(e,t,r){let o=Tf.safeParse(e);if(!o.success)return Pt(o.error,t,r,{suggestion:"Update the registry.json file so it matches the schema."}),null;let n=o.data,i={$schema:bo(n,"$schema",t,r),name:bo(n,"name",t,r),homepage:bo(n,"homepage",t,r),hasName:n.name!==void 0,hasHomepage:n.homepage!==void 0,items:[]};if(n.include!==void 0){let s=Ff.safeParse(n.include);s.success?i.include=s.data:Pt(s.error,t,r,{pathPrefix:["include"],suggestion:"Update include so it is an array of registry.json paths."})}if(n.items!==void 0){let s=Of.safeParse(n.items);s.success?(r.itemsChecked+=s.data.length,i.items=Mf(s.data,t,r)):Pt(s.error,t,r,{pathPrefix:["items"],suggestion:"Update items so it is an array of registry items."})}return n.items===void 0&&n.include===void 0&&A(r,{registryFile:t,message:"Registry must define at least one of `items` or `include`.",suggestion:'Add an "items" array, an "include" array, or both to registry.json.'}),i}function Mf(e,t,r){let o=[];return e.forEach((n,i)=>{let s=at.safeParse(n);if(!s.success){Pt(s.error,t,r,{itemName:Bf(n),itemIndex:i,suggestion:"Update the registry item so it matches the registry item schema."});return}o.push(s.data)}),o}function bo(e,t,r,o){let n=e[t];if(n!==void 0){if(typeof n=="string")return n;A(o,{registryFile:r,message:`${t}: Expected string, received ${typeof n}.`,suggestion:`Update "${t}" so it is a string.`})}}function Bf(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e.name;return typeof t=="string"?t:void 0}function Pt(e,t,r,o){for(let n of e.errors)A(r,{registryFile:t,itemName:o.itemName,itemIndex:o.itemIndex,message:Gf(n,o.pathPrefix),suggestion:o.suggestion})}function A(e,t){e.diagnostics.push(t)}function ko(e,t){return{valid:e.diagnostics.length===0,cwd:e.cwd,registryFiles:e.checkedRegistryFiles.size,registryFilePaths:Array.from(e.checkedRegistryFiles),items:e.itemsChecked,diagnostics:e.diagnostics}}function Wf(e){return e.usesInclude?O.dirname(e.rootFile):e.cwd}function rs(e){return e.split(/[\\/]+/).includes("..")}function Co(e,t){let r=O.relative(t,e);return!!r&&!r.startsWith("..")&&!O.isAbsolute(r)}function zf(e){return e.map(t=>st(t,O.dirname(e[0]))).join(" -> ")}function Jf(e,t){return e?`${st(e.registryFile,t)} items[${e.itemIndex}]`:"unknown source"}function Xi(e){return e.length?e.join("."):"(root)"}function Gf(e,t=[]){let r=[...t,...e.path];return e.code===Ie.ZodIssueCode.invalid_union_discriminator&&e.path.at(-1)==="type"?`${Xi(r)}: Invalid registry item type. Expected ${jf.map(o=>`"${o}"`).join(" | ")}.`:`${Xi(r)}: ${e.message}`}function st(e,t){let r=O.relative(t,e);return r&&!r.startsWith("..")&&!O.isAbsolute(r)?r.split(O.sep).join("/"):r?e:"."}import{Command as Hf}from"commander";import{z as Ro}from"zod";var Kf=Ro.object({cwd:Ro.string(),registryFile:Ro.string()}),is=new Hf().name("validate").description("validate a Love UI registry").argument("[registry]","path to registry.json file","./registry.json").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{let r;try{let o=Kf.parse({cwd:Pe.resolve(t.cwd),registryFile:e});r=b("Validating registry.").start();let n=await Qi(o);Yf(n,r),n.valid||(process.exitCode=1)}catch(o){r?.fail("Registry validation failed."),l.break(),R(o)}});function Yf(e,t){if(e.valid){t.succeed("Registry is valid."),os(e,{success:!0});return}t.fail("Registry validation failed."),os(e),l.break();for(let[r,o]of Array.from(qf(e))){l.log(d.info(ss(r,e.cwd)));for(let n of o)l.error(` - ${Zf(n)}`),n.suggestion&&l.log(` ${n.suggestion}`);l.break()}}function os(e,t={}){let r=`Checked ${ns(e.registryFiles,"registry file","registry files")} and ${ns(e.items,"item","items")}.`;t.success?Xf(r):l.log(` ${r}`);for(let o of e.registryFilePaths)l.log(` - ${ss(o,e.cwd)}`)}function qf(e){let t=new Map;for(let r of e.diagnostics){let o=t.get(r.registryFile)??[];o.push(r),t.set(r.registryFile,o)}return t}function Zf(e){let t=[];return e.itemIndex!==void 0&&t.push(`items[${e.itemIndex}]`),e.itemName&&t.push(`"${e.itemName}"`),e.includePath&&t.push(`include "${e.includePath}"`),e.filePath&&t.push(`file "${e.filePath}"`),t.length?`${t.join(" ")}: ${e.message}`:e.message}function ss(e,t){let r=Pe.relative(t,e);return r&&!r.startsWith("..")&&!Pe.isAbsolute(r)?r.split(Pe.sep).join("/"):r?e:"."}function Xf(e){b(e).succeed()}function ns(e,t,r){return`${e} ${e===1?t:r}`}import{Command as Qf}from"commander";var as=new Qf().name("registry").description("manage registries").addCommand(qi).addCommand(is);import ls from"path";import{Command as em}from"commander";import cs from"fs-extra";import{z as $t}from"zod";var tm=$t.object({cwd:$t.string(),query:$t.string().optional(),limit:$t.number().optional(),offset:$t.number().optional()}),fs=new em().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry names or urls to search items from. Names must be prefixed with @.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-l, --limit <number>","maximum number of items to display per registry","100").option("-o, --offset <number>","number of items to skip","0").action(async(e,t)=>{try{let r=tm.parse({cwd:ls.resolve(t.cwd),query:t.query,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});await ee(r.cwd);let o=Je({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n=L(o),i=ls.resolve(r.cwd,"components.json");if(cs.existsSync(i)){let m=await cs.readJson(i),p=z.partial().parse(m);n=L({...o,...p})}let s=n;try{let m=await j(r.cwd);m&&(s=L(m))}catch{}let{config:c,newRegistries:a}=await G(e.map(m=>`${m}/registry`),s,{silent:!0,writeFile:!1});a.length>0&&(s.registries=c.registries),Wt(e,s);let f=await tn(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(f,null,2)),process.exit(0)}catch(r){R(r)}finally{ne()}});import ms from"path";import{Command as rm}from"commander";import ps from"fs-extra";import{z as us}from"zod";var om=us.object({cwd:us.string()}),ds=new rm().name("view").description("view items from the registry").argument("<items...>","the item names or URLs to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=om.parse({cwd:ms.resolve(t.cwd)});await ee(r.cwd);let o=L({}),n=ms.resolve(r.cwd,"components.json");if(ps.existsSync(n)){let f=await ps.readJson(n),m=z.partial().parse(f);o=L(m)}let i=o;try{let f=await j(r.cwd);f&&(i=L(f))}catch{}let{config:s,newRegistries:c}=await G(e,i,{silent:!0,writeFile:!1});c.length>0&&(i.registries=s.registries),Wt(e,i);let a=await ie(e,{config:i});console.log(JSON.stringify(a,null,2)),process.exit(0)}catch(r){R(r)}finally{ne()}});import{Command as nm}from"commander";process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function im(){let e=new nm().name("love-ui").description("build your Love UI component library").version(Jo.version||"1.0.0","-v, --version","display the version number");e.addCommand(Wn).addCommand(li).addCommand(oi).addCommand(gi).addCommand(yi).addCommand(ds).addCommand(fs).addCommand(Hi).addCommand(bi).addCommand(Li).addCommand(ui).addCommand(lo).addCommand(go).addCommand(as),e.parse()}im();export{Ko as fetchTree,Yo as getItemTargetPath,Ge as getLoveUIRegistryIndex,um as getPreset,pm as getPresets,$r as getRegistries,fm as getRegistriesConfig,qo as getRegistriesIndex,lm as getRegistry,zt as getRegistryBaseColor,Ho as getRegistryBaseColors,Go as getRegistryIcons,ie as getRegistryItems,Pr as getRegistryStyles,cm as resolveRegistryItems,mm as resolveTree};
169
+ `));let h=Array.from(new Set(n));return{content:c,replacedPackages:h}}import{promises as xt}from"fs";import St from"path";import fo from"fast-glob";import ff from"prompts";var mf=["sidebar.tsx","pagination.tsx","calendar.tsx"],pf=`${S}/docs/rtl#manual-migration-optional`;async function Wi(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await fo(t.path,{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else{let f=St.resolve(o,t.path),m=await xt.stat(f).catch(()=>null);if(!m)throw new Error(`File not found: ${t.path}`);if(m.isDirectory())o=f,r=await fo("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else if(m.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else{if(!e.resolvedPaths.ui)throw new Error("Could not find a valid `ui` path in your `components.json`. Please provide a path or glob pattern.");o=e.resolvedPaths.ui,r=await fo("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0})}if(!t.yes){let a=t.path?t.path:`./${St.relative(e.resolvedPaths.cwd,o)}`,{confirm:f}=await ff({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${d.info(r.length)} file(s) in ${d.info(a)} to RTL. Continue?`});f||(l.info("Migration cancelled."),process.exit(0))}let n=b("Updating components.json...").start();try{let a=St.resolve(e.resolvedPaths.cwd,"components.json"),f=JSON.parse(await xt.readFile(a,"utf-8"));f.rtl=!0,await xt.writeFile(a,JSON.stringify(f,null,2)+`
170
+ `),n.succeed("Updated components.json.")}catch{throw n.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let i=b("Migrating files to RTL...").start(),s=0,c=[];if(await Promise.all(r.map(async a=>{i.text=`Migrating ${a}...`;let f=St.join(o,a),m=await xt.readFile(f,"utf-8"),p=await jo(m,!0);p!==m&&(await xt.writeFile(f,p),s++);let u=St.basename(a);mf.includes(u)&&c.push(a)})),i.succeed(`Migration complete. ${s} file(s) transformed.`),c.length>0){l.break(),l.warn("The following components may need manual RTL adjustments:");for(let a of c)l.info(` - ${a}`);l.break(),l.info(`See ${d.info(pf)} for more information.`)}}import zi from"path";import mo from"fs-extra";async function Ji(e){let t={};if(!mo.existsSync(e.cwd)||!mo.existsSync(zi.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};if(!mo.existsSync(zi.resolve(e.cwd,"components.json")))return t["3"]=!0,{errors:t,config:null};try{let r=await j(e.cwd);return{errors:t,config:r}}catch{l.break(),l.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
171
+ Before you can run a migration, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{Command as df}from"commander";import{z as it}from"zod";var Gi=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."},{name:"rtl",description:"migrate your components to support RTL (right-to-left)."}],gf=it.object({cwd:it.string(),list:it.boolean(),yes:it.boolean(),migration:it.string().refine(e=>e&&Gi.some(t=>t.name===e),{message:"You must specify a valid migration. Run `love-ui migrate --list` to see available migrations."}).optional(),path:it.string().optional()}),Hi=new df().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").argument("[path]","optional path or glob pattern to migrate.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-l, --list","list all migrations.",!1).option("-y, --yes","skip confirmation prompt.",!1).action(async(e,t,r)=>{try{let o=gf.parse({cwd:uf.resolve(r.cwd),migration:e,path:t,list:r.list,yes:r.yes});if(o.list||!o.migration){l.info("Available migrations:");for(let s of Gi)l.info(`- ${s.name}: ${s.description}`);return}if(!o.migration)throw new Error("You must specify a migration. Run `love-ui migrate --list` to see available migrations.");let{errors:n,config:i}=await Ji(o);if(n["1"]||n["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!i)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");o.migration==="icons"&&await Mi(i),o.migration==="radix"&&await Bi(i,{yes:o.yes,path:o.path}),o.migration==="rtl"&&await Wi(i,{yes:o.yes,path:o.path})}catch(o){l.break(),R(o)}});import{existsSync as hf}from"fs";import Ki from"path";import{Command as It}from"commander";import yf from"open";function wf(e){return`${S}/create?preset=${e}`}function po(e){let t=Ke(e);if(!t)throw new Error(`Invalid preset code: ${e}`);let r=[],o=t.chartColor??sn[t.theme]??t.theme;return t.chartColor||r.push("chartColor"),{code:e,version:e[0],values:{...t,chartColor:o},derived:r,url:wf(e)}}function bf(e){dr({code:e.code,fallbacks:e.derived,values:e.values},{fallbackNote:" * Compatibility value for older preset versions."})}var kf=new It().name("decode").description("decode a preset code").argument("<code>","the preset code to decode").option("--json","output as JSON.",!1).action((e,t)=>{try{let r=po(e);if(t.json){console.log(JSON.stringify({code:r.code,version:r.version,values:r.values,derived:r.derived,url:r.url},null,2));return}bf(r)}catch(r){kr(r)}}),vf=new It().name("url").description("get the create URL for a preset code").argument("<code>","the preset code").action(e=>{try{l.log(po(e).url)}catch(t){kr(t)}}),Cf=new It().name("open").description("open a preset code in the browser").argument("<code>","the preset code").action(async e=>{let t;try{t=po(e).url}catch(r){kr(r);return}l.break(),l.log(` Opening ${t} in your browser.`),l.break();try{await yf(t)}catch(r){let o=r instanceof Error?r.message:String(r);kr(new Error(`Failed to open preset URL: ${o}`))}}),Rf=new It().name("resolve").alias("info").description("resolve a preset from your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",!1).action(async e=>{try{let t=Ki.resolve(e.cwd);if(!hf(Ki.resolve(t,"components.json"))&&await M(t)){let i=await B(t);i.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running preset resolve from a monorepo root. Use the -c flag to specify a workspace.",targets:i.map(s=>s.name)},null,2)):W("preset resolve",i),process.exit(1))}let r=await j(t);if(!r){if(e.json){console.log(JSON.stringify(null,null,2));return}l.log("No components.json found.");return}let o=await F(t),n=await pr(r,o);if(e.json){console.log(JSON.stringify(n.code?n:null,null,2));return}dr(n)}catch(t){R(t)}}),uo=new It().name("preset").description("manage presets").addCommand(kf).addCommand(Rf).addCommand(vf).addCommand(Cf).action(()=>{uo.outputHelp()});function kr(e){e instanceof Error&&l.error(e.message),process.exit(1)}import Yi from"path";import{Command as xf}from"commander";import go from"fs-extra";import Sf from"prompts";import{z as ho}from"zod";var If=ho.object({cwd:ho.string(),silent:ho.boolean()}),qi=new xf().name("add").description("add registries to your project").argument("[registries...]","registries (@namespace) or registry URLs (@namespace=url)").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",!1).action(async(e,t)=>{try{let r=If.parse({cwd:Yi.resolve(t.cwd),silent:t.silent}),o=e.length>0?e:await Ef({silent:r.silent});await $f(o,r.cwd,{silent:r.silent})}catch(r){l.break(),R(r)}});function Pf(e){let[t,...r]=e.split("="),o=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${d.info(t)}. Registry names must start with @ (e.g., @acme).`);return{namespace:t,url:o}}function yo(e,t,r){return`${e} ${e===1?t:r}`}async function $f(e,t,r){let o=Yi.resolve(t,"components.json");if(!go.existsSync(o))throw new Error(`No ${d.info("components.json")} found. Run ${d.info("love-ui init")} first.`);let n=e.map(Pf),i=n.filter(g=>!g.url),s=[];if(i.length>0){let g=b("Fetching registries.",{silent:r.silent}).start(),y=await $r();if(!y)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),s=y}let c={};for(let{namespace:g,url:y}of n){if(g in re){l.warn(`${d.info(g)} is a built-in registry and cannot be added.`);continue}if(y){if(!y.includes("{name}"))throw new Error(`Invalid registry URL for ${d.info(g)}. URL must include {name} placeholder. Example: ${d.info(`${g}=https://example.com/r/{name}.json`)}`);c[g]=y}else{let k=s.find(v=>v.name===g);if(!k)throw new Error(`Registry ${d.info(g)} not found. Provide a URL: ${d.info(`${g}=https://.../{name}.json`)}`);c[g]=k.url}}if(Object.keys(c).length===0)return{addedRegistries:[]};let a=await go.readJson(o),f=a.registries||{},m={},p=[];for(let[g,y]of Object.entries(c))f[g]?p.push(g):m[g]=y;if(Object.keys(m).length===0){if(p.length>0&&!r.silent){b(`Skipped ${yo(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let g of p)l.log(` - ${g}`)}else r.silent||l.info("No new registries to add.");return}let u={...a,registries:{...f,...m}},h=b("Updating components.json.",{silent:r.silent}).start();if(await go.writeJson(o,u,{spaces:2}),h.succeed(),!r.silent){let g=Object.keys(m);b(`Added ${yo(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let y of g)l.log(` - ${y}`);if(p.length>0){b(`Skipped ${yo(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let y of p)l.log(` - ${y}`)}}}async function Ef(e){let t=b("Fetching registries.",{silent:e.silent}).start(),r=await $r();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let o=[...r].sort((i,s)=>i.name.localeCompare(s.name)),{selected:n}=await Sf({type:"autocompleteMultiselect",name:"selected",message:"Which registries would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:!1,choices:o.map(i=>({title:i.name,description:i.description,value:i.name}))});return n?.length||(l.warn("No registries selected. Exiting."),l.info(""),process.exit(1)),n}import*as Ie from"path";import*as ko from"fs/promises";import*as O from"path";import{z as Se}from"zod";var Zi=32,jf=So.options.filter(e=>e!=="registry:example"&&e!=="registry:internal"),Tf=Se.record(Se.string(),Se.unknown()),Ff=Se.array(Se.string()),Of=Se.array(Se.unknown());async function Qi(e){let t=O.resolve(e.cwd),r=O.resolve(t,e.registryFile),o={cwd:t,rootFile:r,usesInclude:!1,diagnostics:[],registryFiles:new Set,checkedRegistryFiles:new Set,itemsChecked:0,itemSourcesByItem:new Map,firstIncludedFrom:new Map};if(O.basename(r)!=="registry.json"&&A(o,{registryFile:r,message:"Root source registry file must be named registry.json.",suggestion:"Rename the file to registry.json and pass that file to love-ui registry validate."}),!vo(r,t))return A(o,{registryFile:r,message:`Root registry file must stay inside ${st(t,t)}.`,suggestion:"Run the command from the registry root or pass a registry.json file inside --cwd."}),bo(o,[]);let n=await ts(r,o);if(!n)return bo(o,[]);o.usesInclude=!!n.include?.length,Af(n,r,o);let i=await es(r,n,o,[]);return Lf(i,o),await _f(i,o),bo(o,i)}async function es(e,t,r,o){if(o.length>=Zi)return A(r,{registryFile:e,message:`Registry include tree is too deep. The maximum include depth is ${Zi}.`,suggestion:"Flatten part of the registry include tree or reduce nested include depth."}),[];if(o.includes(e))return A(r,{registryFile:e,message:`Registry include cycle detected: ${zf([...o,e])}.`,suggestion:"Remove one include so the registry graph is acyclic."}),[];let n=o.at(-1)??e,i=r.firstIncludedFrom.get(e);if(i)return A(r,{registryFile:e,message:`Registry file included more than once. First included from ${st(i,r.cwd)}, then included from ${st(n,r.cwd)}.`,suggestion:"Remove one include or move shared items into a single included registry.json."}),[];r.registryFiles.add(e),r.firstIncludedFrom.set(e,n);let s=O.dirname(e),c=[...o,e],a=[];for(let m of t.include??[]){let p=Nf(m,e,s,r);if(!p)continue;let u=await ts(p,r);if(!u)continue;let h=await es(p,u,r,c);a.push(...h)}let f=!r.usesInclude&&e===r.rootFile?r.cwd:s;return t.items.forEach((m,p)=>{r.itemSourcesByItem.set(m,{registryFile:e,registryDir:f,itemIndex:p})}),[...a,...t.items]}async function ts(e,t){t.checkedRegistryFiles.add(e);let r;try{r=await ko.readFile(e,"utf-8")}catch{return A(t,{registryFile:e,message:"Registry file was not found or could not be read.",suggestion:"Check that the registry.json file exists and is readable."}),null}let o;try{o=JSON.parse(r)}catch{return A(t,{registryFile:e,message:"Registry file contains invalid JSON.",suggestion:"Fix the JSON syntax in the registry.json file."}),null}return Uf(o,e,t)}function Af(e,t,r){!e.name&&!e.hasName&&A(r,{registryFile:t,message:'Root registry.json must define "name".',suggestion:'Add a top-level "name" field to the root registry.json.'}),!e.homepage&&!e.hasHomepage&&A(r,{registryFile:t,message:'Root registry.json must define "homepage".',suggestion:'Add a top-level "homepage" field to the root registry.json.'})}function Nf(e,t,r,o){if(q(e))return A(o,{registryFile:t,includePath:e,message:`Remote include "${e}" is not supported.`,suggestion:"Use a relative path to an explicit registry.json file in the same repository."}),null;if(O.isAbsolute(e))return A(o,{registryFile:t,includePath:e,message:`Include "${e}" must be relative.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;if(rs(e))return A(o,{registryFile:t,includePath:e,message:`Include "${e}" cannot use parent-directory traversal.`,suggestion:"Registry includes must descend from the including chunk. Move shared registries into the registry root and include them from there."}),null;if(O.basename(e)!=="registry.json")return A(o,{registryFile:t,includePath:e,message:`Include "${e}" must explicitly reference a registry.json file.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;let n=O.resolve(r,e);return vo(n,o.cwd)?n:(A(o,{registryFile:t,includePath:e,message:`Include "${e}" must stay inside ${st(o.cwd,o.cwd)}.`,suggestion:"Keep included registry.json files inside the registry root."}),null)}function Lf(e,t){let r=new Map;for(let o of e){let n=r.get(o.name);if(!n){r.set(o.name,o);continue}let i=t.itemSourcesByItem.get(n),s=t.itemSourcesByItem.get(o);A(t,{registryFile:s?.registryFile??t.rootFile,itemName:o.name,itemIndex:s?.itemIndex,message:`Duplicate registry item name "${o.name}". First defined at ${Jf(i,t.cwd)}.`,suggestion:"Rename one of these items so each name is unique across the resolved registry."})}}async function _f(e,t){let r=Wf(t);for(let o of e){let n=t.itemSourcesByItem.get(o),i={...Df(o,t,r),$schema:"https://www.loveui.dev/schema/registry-item.json"};for(let c=0;c<(o.files?.length??0);c++){let a=o.files?.[c];if(!a||!n)continue;let f=Vf(o,a.path,n,t);if(f)try{await ko.readFile(f,"utf-8")}catch{A(t,{registryFile:n.registryFile,itemName:o.name,itemIndex:n.itemIndex,filePath:a.path,message:`File "${a.path}" was not found or could not be read.`,suggestion:"Make sure the file path is relative to the registry.json file that declares the item."})}}let s=at.safeParse(i);s.success||Pt(s.error,n?.registryFile??t.rootFile,t,{itemName:o.name,itemIndex:n?.itemIndex,suggestion:"Update the registry item so the built item matches the registry item schema."})}}function Vf(e,t,r,o){if(q(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" cannot be remote.`,suggestion:"Use a local file path relative to the registry.json file that declares the item."}),null;if(O.isAbsolute(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" must be relative.`,suggestion:"Use a local file path relative to the registry.json file that declares the item."}),null;if(rs(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" cannot use parent-directory traversal.`,suggestion:"Keep item files inside the registry chunk directory."}),null;let n=O.resolve(r.registryDir,t);return vo(n,r.registryDir)?n:(A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" must stay inside the registry chunk directory.`,suggestion:"Move the file into the same registry chunk directory or update the registry item path."}),null)}function Df(e,t,r){let o=t.itemSourcesByItem.get(e);return{...e,files:e.files?.map(n=>{let i=O.resolve(o?.registryDir??t.cwd,n.path);return{...n,path:O.relative(r,i).split(O.sep).join("/")}})}}function Uf(e,t,r){let o=Tf.safeParse(e);if(!o.success)return Pt(o.error,t,r,{suggestion:"Update the registry.json file so it matches the schema."}),null;let n=o.data,i={$schema:wo(n,"$schema",t,r),name:wo(n,"name",t,r),homepage:wo(n,"homepage",t,r),hasName:n.name!==void 0,hasHomepage:n.homepage!==void 0,items:[]};if(n.include!==void 0){let s=Ff.safeParse(n.include);s.success?i.include=s.data:Pt(s.error,t,r,{pathPrefix:["include"],suggestion:"Update include so it is an array of registry.json paths."})}if(n.items!==void 0){let s=Of.safeParse(n.items);s.success?(r.itemsChecked+=s.data.length,i.items=Mf(s.data,t,r)):Pt(s.error,t,r,{pathPrefix:["items"],suggestion:"Update items so it is an array of registry items."})}return n.items===void 0&&n.include===void 0&&A(r,{registryFile:t,message:"Registry must define at least one of `items` or `include`.",suggestion:'Add an "items" array, an "include" array, or both to registry.json.'}),i}function Mf(e,t,r){let o=[];return e.forEach((n,i)=>{let s=at.safeParse(n);if(!s.success){Pt(s.error,t,r,{itemName:Bf(n),itemIndex:i,suggestion:"Update the registry item so it matches the registry item schema."});return}o.push(s.data)}),o}function wo(e,t,r,o){let n=e[t];if(n!==void 0){if(typeof n=="string")return n;A(o,{registryFile:r,message:`${t}: Expected string, received ${typeof n}.`,suggestion:`Update "${t}" so it is a string.`})}}function Bf(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e.name;return typeof t=="string"?t:void 0}function Pt(e,t,r,o){for(let n of e.errors)A(r,{registryFile:t,itemName:o.itemName,itemIndex:o.itemIndex,message:Gf(n,o.pathPrefix),suggestion:o.suggestion})}function A(e,t){e.diagnostics.push(t)}function bo(e,t){return{valid:e.diagnostics.length===0,cwd:e.cwd,registryFiles:e.checkedRegistryFiles.size,registryFilePaths:Array.from(e.checkedRegistryFiles),items:e.itemsChecked,diagnostics:e.diagnostics}}function Wf(e){return e.usesInclude?O.dirname(e.rootFile):e.cwd}function rs(e){return e.split(/[\\/]+/).includes("..")}function vo(e,t){let r=O.relative(t,e);return!!r&&!r.startsWith("..")&&!O.isAbsolute(r)}function zf(e){return e.map(t=>st(t,O.dirname(e[0]))).join(" -> ")}function Jf(e,t){return e?`${st(e.registryFile,t)} items[${e.itemIndex}]`:"unknown source"}function Xi(e){return e.length?e.join("."):"(root)"}function Gf(e,t=[]){let r=[...t,...e.path];return e.code===Se.ZodIssueCode.invalid_union_discriminator&&e.path.at(-1)==="type"?`${Xi(r)}: Invalid registry item type. Expected ${jf.map(o=>`"${o}"`).join(" | ")}.`:`${Xi(r)}: ${e.message}`}function st(e,t){let r=O.relative(t,e);return r&&!r.startsWith("..")&&!O.isAbsolute(r)?r.split(O.sep).join("/"):r?e:"."}import{Command as Hf}from"commander";import{z as Co}from"zod";var Kf=Co.object({cwd:Co.string(),registryFile:Co.string()}),is=new Hf().name("validate").description("validate a Love UI registry").argument("[registry]","path to registry.json file","./registry.json").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{let r;try{let o=Kf.parse({cwd:Ie.resolve(t.cwd),registryFile:e});r=b("Validating registry.").start();let n=await Qi(o);Yf(n,r),n.valid||(process.exitCode=1)}catch(o){r?.fail("Registry validation failed."),l.break(),R(o)}});function Yf(e,t){if(e.valid){t.succeed("Registry is valid."),os(e,{success:!0});return}t.fail("Registry validation failed."),os(e),l.break();for(let[r,o]of Array.from(qf(e))){l.log(d.info(ss(r,e.cwd)));for(let n of o)l.error(` - ${Zf(n)}`),n.suggestion&&l.log(` ${n.suggestion}`);l.break()}}function os(e,t={}){let r=`Checked ${ns(e.registryFiles,"registry file","registry files")} and ${ns(e.items,"item","items")}.`;t.success?Xf(r):l.log(` ${r}`);for(let o of e.registryFilePaths)l.log(` - ${ss(o,e.cwd)}`)}function qf(e){let t=new Map;for(let r of e.diagnostics){let o=t.get(r.registryFile)??[];o.push(r),t.set(r.registryFile,o)}return t}function Zf(e){let t=[];return e.itemIndex!==void 0&&t.push(`items[${e.itemIndex}]`),e.itemName&&t.push(`"${e.itemName}"`),e.includePath&&t.push(`include "${e.includePath}"`),e.filePath&&t.push(`file "${e.filePath}"`),t.length?`${t.join(" ")}: ${e.message}`:e.message}function ss(e,t){let r=Ie.relative(t,e);return r&&!r.startsWith("..")&&!Ie.isAbsolute(r)?r.split(Ie.sep).join("/"):r?e:"."}function Xf(e){b(e).succeed()}function ns(e,t,r){return`${e} ${e===1?t:r}`}import{Command as Qf}from"commander";var as=new Qf().name("registry").description("manage registries").addCommand(qi).addCommand(is);import ls from"path";import{Command as em}from"commander";import cs from"fs-extra";import{z as $t}from"zod";var tm=$t.object({cwd:$t.string(),query:$t.string().optional(),limit:$t.number().optional(),offset:$t.number().optional()}),fs=new em().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry names or urls to search items from. Names must be prefixed with @.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-l, --limit <number>","maximum number of items to display per registry","100").option("-o, --offset <number>","number of items to skip","0").action(async(e,t)=>{try{let r=tm.parse({cwd:ls.resolve(t.cwd),query:t.query,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});await ee(r.cwd);let o=Je({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n=L(o),i=ls.resolve(r.cwd,"components.json");if(cs.existsSync(i)){let m=await cs.readJson(i),p=z.partial().parse(m);n=L({...o,...p})}let s=n;try{let m=await j(r.cwd);m&&(s=L(m))}catch{}let{config:c,newRegistries:a}=await G(e.map(m=>`${m}/registry`),s,{silent:!0,writeFile:!1});a.length>0&&(s.registries=c.registries),Wt(e,s);let f=await en(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(f,null,2)),process.exit(0)}catch(r){R(r)}finally{ne()}});import ms from"path";import{Command as rm}from"commander";import ps from"fs-extra";import{z as us}from"zod";var om=us.object({cwd:us.string()}),ds=new rm().name("view").description("view items from the registry").argument("<items...>","the item names or URLs to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=om.parse({cwd:ms.resolve(t.cwd)});await ee(r.cwd);let o=L({}),n=ms.resolve(r.cwd,"components.json");if(ps.existsSync(n)){let f=await ps.readJson(n),m=z.partial().parse(f);o=L(m)}let i=o;try{let f=await j(r.cwd);f&&(i=L(f))}catch{}let{config:s,newRegistries:c}=await G(e,i,{silent:!0,writeFile:!1});c.length>0&&(i.registries=s.registries),Wt(e,i);let a=await ie(e,{config:i});console.log(JSON.stringify(a,null,2)),process.exit(0)}catch(r){R(r)}finally{ne()}});import{Command as nm}from"commander";process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function im(){let e=new nm().name("love-ui").description("build your Love UI component library").version(zo.version||"1.0.0","-v, --version","display the version number");e.addCommand(Wn).addCommand(li).addCommand(oi).addCommand(gi).addCommand(yi).addCommand(ds).addCommand(fs).addCommand(Hi).addCommand(bi).addCommand(Li).addCommand(ui).addCommand(ao).addCommand(uo).addCommand(as),e.parse()}im();export{Ho as fetchTree,Ko as getItemTargetPath,Ge as getLoveUIRegistryIndex,um as getPreset,pm as getPresets,$r as getRegistries,fm as getRegistriesConfig,Yo as getRegistriesIndex,lm as getRegistry,zt as getRegistryBaseColor,Go as getRegistryBaseColors,Jo as getRegistryIcons,ie as getRegistryItems,Pr as getRegistryStyles,cm as resolveRegistryItems,mm as resolveTree};