shadcn 4.16.2 → 4.18.0

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 {b as b$2,c as c$4,a as a$5}from'./chunk-3W6BGJGE.js';import {a as a$3}from'./chunk-FWHPVUDH.js';import {f,e,N as N$1,g,za as za$1,h,i,Ca as Ca$1,a as a$1,Z,Ma as Ma$1,ia,Q,Aa as Aa$1,W,X,C,b as b$1,Y as Y$1,V,La as La$1,oa as oa$1,qa as qa$1,T as T$1,U,R,Ba as Ba$1,_,c as c$2,ka as ka$1,O,na,d,Pa,Qa as Qa$1,Ra as Ra$1,ta,ra,Da as Da$1,ua,H,D,E,G,F,z as z$1,fa as fa$1,Ia,va as va$1,ca as ca$1,P,Wa as Wa$1,Va as Va$1,$,Ta as Ta$1,aa as aa$1,Ua as Ua$1,Xa as Xa$1,ea as ea$1,Ea,Ka as Ka$1,ba as ba$1,wa as wa$1,Ja as Ja$1,pa as pa$1,ha as ha$1,Ga as Ga$1,y,da,q as q$1,S,L as L$1,J,K as K$1,B as B$1,I,M,A,Fa as Fa$1,Ha as Ha$1,j as j$1}from'./chunk-Q6Y23SOV.js';export{ta as fetchTree,ua as getItemTargetPath,ya as getPreset,xa as getPresets,va as getRegistries,ma as getRegistriesConfig,wa as getRegistriesIndex,ja as getRegistry,ra as getRegistryBaseColor,qa as getRegistryBaseColors,pa as getRegistryIcons,ka as getRegistryItems,oa as getRegistryStyles,na as getShadcnRegistryIndex,la as resolveRegistryItems,sa as resolveTree}from'./chunk-Q6Y23SOV.js';import {a,t,b,s,c as c$1,e as e$1,i as i$1,m,n,j,k,f as f$2,r,h as h$1}from'./chunk-2XFBGS5K.js';import {c,f as f$3,n as n$1}from'./chunk-4WBGNKSZ.js';import {a as a$2,c as c$3,g as g$1,d as d$1,f as f$1,e as e$2}from'./chunk-7SBJAAAY.js';import {a as a$4}from'./chunk-CHWMSXYA.js';import*as T from'path';import T__default from'path';import {promises,existsSync}from'fs';import L from'fs-extra';import Hi from'open';import de from'prompts';import qo from'dedent';import Ki,{tmpdir}from'os';import {execa}from'execa';import Yo from'deepmerge';import {Command}from'commander';import $r,{z}from'zod';import {Project,ScriptKind,SyntaxKind,Node}from'ts-morph';import {loadConfig}from'tsconfig-paths';import {diffLines,structuredPatch,diffWords}from'diff';import {dim,yellow,bold,green,cyan,red}from'kleur/colors';import*as Ie from'fs/promises';import Ie__default from'fs/promises';import Pa$1 from'postcss';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import jr from'fast-glob';async function zo(e$1){let t={};if(!L.existsSync(e$1.cwd)||!L.existsSync(T__default.resolve(e$1.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=C("Preflight checks.",{silent:e$1.silent}).start();L.existsSync(T__default.resolve(e$1.cwd,"components.json"))&&!e$1.force&&(r?.fail(),f.break(),f.error(`A ${e.info("components.json")} file already exists at ${e.info(e$1.cwd)}.
3
- To start over, remove the ${e.info("components.json")} file and run ${e.info("init")} again.`),f.break(),process.exit(1)),r?.succeed();let o=C("Verifying framework.",{silent:e$1.silent}).start(),n=e$1.existingConfig?.tailwind,i$1=await za$1(e$1.cwd,{configCssFile:typeof n?.css=="string"?n.css:void 0});if(!i$1||i$1?.framework.name==="manual"){if(t["7"]=true,o?.fail(),!e$1.monorepo&&await g(e$1.cwd)){let m=await h(e$1.cwd);m.length>0&&(i("init",m),process.exit(1));}f.break(),i$1?.framework.links.installation&&f.error(`We could not detect a supported framework at ${e.info(e$1.cwd)}.
2
+ import {a as a$3}from'./chunk-LKVYHONI.js';import {f,e,N,g,Aa as Aa$1,h,i,Da as Da$1,a as a$1,Z,Na as Na$1,ia as ia$1,Q,Ba as Ba$1,W,X as X$1,C,b as b$1,Y as Y$1,V,Ma as Ma$1,pa,ra as ra$1,T as T$1,U as U$1,R,Ca as Ca$1,_,c as c$2,ka as ka$1,O,oa,d,Qa as Qa$1,Ra as Ra$1,Sa as Sa$1,ua as ua$1,sa,Ea,va as va$1,H,D,E,G,F,z as z$1,fa,Ja as Ja$1,wa as wa$1,ca,P,Xa as Xa$1,Wa as Wa$1,$,Ua as Ua$1,aa,Va as Va$1,Ya as Ya$1,ea as ea$1,Fa as Fa$1,La as La$1,ba as ba$1,na,xa as xa$1,Ka as Ka$1,qa as qa$1,ha,Ha as Ha$1,y,da as da$1,q as q$1,S,L as L$1,J,K,B,I,M,A,Ga as Ga$1,Ia as Ia$1,j as j$2}from'./chunk-2CD4IZV7.js';export{ua as fetchTree,va as getItemTargetPath,na as getPackageJsonRegistries,za as getPreset,ya as getPresets,wa as getRegistries,ma as getRegistriesConfig,xa as getRegistriesIndex,ja as getRegistry,sa as getRegistryBaseColor,ra as getRegistryBaseColors,qa as getRegistryIcons,ka as getRegistryItems,pa as getRegistryStyles,oa as getShadcnRegistryIndex,la as resolveRegistryItems,ta as resolveTree}from'./chunk-2CD4IZV7.js';import {a,t,b,s,c as c$1,e as e$1,i as i$1,m,n,j as j$1,k,f as f$2,r,h as h$1}from'./chunk-2XFBGS5K.js';import {c,f as f$3,n as n$1}from'./chunk-4WBGNKSZ.js';import {b as b$2,c as c$4,a as a$5}from'./chunk-3W6BGJGE.js';import {a as a$2,c as c$3,g as g$1,d as d$1,f as f$1,e as e$2}from'./chunk-7SBJAAAY.js';import {a as a$4}from'./chunk-CHWMSXYA.js';import*as j from'path';import j__default from'path';import {promises,existsSync}from'fs';import L from'fs-extra';import Ki from'open';import de from'prompts';import en from'dedent';import qi,{tmpdir}from'os';import {execa}from'execa';import Qo from'deepmerge';import {Command}from'commander';import jr,{z}from'zod';import {Project,ScriptKind,SyntaxKind,Node}from'ts-morph';import {loadConfig}from'tsconfig-paths';import {diffLines,structuredPatch,diffWords}from'diff';import {dim,yellow,bold,green,cyan,red}from'kleur/colors';import*as Ie from'fs/promises';import Ie__default from'fs/promises';import Ea$1 from'postcss';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import Nr from'fast-glob';async function Yo(e$1){let t={};if(!L.existsSync(e$1.cwd)||!L.existsSync(j__default.resolve(e$1.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=C("Preflight checks.",{silent:e$1.silent}).start();L.existsSync(j__default.resolve(e$1.cwd,"components.json"))&&!e$1.force&&(r?.fail(),f.break(),f.error(`A ${e.info("components.json")} file already exists at ${e.info(e$1.cwd)}.
3
+ To start over, remove the ${e.info("components.json")} file and run ${e.info("init")} again.`),f.break(),process.exit(1)),r?.succeed();let o=C("Verifying framework.",{silent:e$1.silent}).start(),n=e$1.existingConfig?.tailwind,i$1=await Aa$1(e$1.cwd,{configCssFile:typeof n?.css=="string"?n.css:void 0});if(!i$1||i$1?.framework.name==="manual"){if(t["7"]=true,o?.fail(),!e$1.monorepo&&await g(e$1.cwd)){let m=await h(e$1.cwd);m.length>0&&(i("init",m),process.exit(1));}f.break(),i$1?.framework.links.installation&&f.error(`We could not detect a supported framework at ${e.info(e$1.cwd)}.
4
4
  Visit ${e.info(i$1?.framework.links.installation)} to manually configure your project.
5
- Once configured, you can use the cli to add components.`),f.break(),process.exit(1);}o?.succeed(`Verifying framework. Found ${e.info(i$1.framework.label)}.`);let s="Validating Tailwind CSS.";i$1.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${e.info("v4")}.`);let l=C(s,{silent:e$1.silent}).start();i$1.tailwindVersion==="v3"&&(!i$1?.tailwindConfigFile||!i$1?.tailwindCssFile)?(t["5"]=true,l?.fail()):i$1.tailwindVersion==="v4"&&!i$1?.tailwindCssFile?(t["5"]=true,l?.fail()):i$1.tailwindVersion?l?.succeed():(t["5"]=true,l?.fail());let c=C("Validating import alias.",{silent:e$1.silent}).start();return i$1?.aliasPrefix?c?.succeed():(t["6"]=true,c?.fail()),Object.keys(t).length>0&&(t["5"]&&(f.break(),f.error(`No Tailwind CSS configuration found at ${e.info(e$1.cwd)}.`),f.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),f.error("Install Tailwind CSS then try again."),i$1?.framework.links.tailwind&&f.error(`Visit ${e.info(i$1?.framework.links.tailwind)} to get started.`)),t["6"]&&(f.break(),f.error(`Could not find valid path aliases or package imports for ${e.info("init")}.`),f.error(`Configure path aliases in ${e.info("tsconfig.json")} or imports in ${e.info("package.json")}, then run ${e.info("init")} again.`),f.error(`Learn more at ${e.info(`${a$1}/docs/installation/manual#configure-import-aliases`)}.`)),f.break(),process.exit(1)),{errors:t,projectInfo:i$1}}async function Ho(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}=y(i);s&&!b$1[s]&&r.add(s);try{let[l]=await da([i],t,{useCache:!0});if(l?.registryDependencies)for(let c of l.registryDependencies){let{registry:m}=y(c);m&&!b$1[m]&&r.add(m),o.has(c)||n.push(c);}}catch(l){if(l instanceof q$1){let{registry:c}=y(i);c&&!b$1[c]&&r.add(c);continue}continue}}return Array.from(r)}async function B(e,t,r={}){r={silent:false,writeFile:true,...r};let n=(await Ho(e,t)).filter(m=>!t.registries?.[m]&&!Object.keys(b$1).includes(m));if(n.length===0)return {config:t,newRegistries:[]};let i=await wa$1({useCache:process.env.NODE_ENV!=="development"});if(!i)return {config:t,newRegistries:[]};let s={};for(let m of n)i[m]&&(s[m]=i[m]);if(Object.keys(s).length===0)return {config:t,newRegistries:[]};let l=Object.fromEntries(Object.entries(t.registries||{}).filter(([m])=>!Object.keys(b$1).includes(m))),c$1={...t,registries:{...l,...s}};if(r.writeFile){let{resolvedPaths:m,...d}=c$1,p=C("Updating components.json.",{silent:r.silent}).start(),y=c.parse(d);await L.writeFile(T__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(y,null,2)+`
6
- `,"utf-8"),p.succeed();}return {config:c$1,newRegistries:Object.keys(s)}}var K={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:false},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:false},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:false},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:false},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:false},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:false},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:false},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:false}};function cr(e){let t=new URL(`${a$1}/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 lr(e$1){if(f.break(),f.log(` Build your custom preset on ${e.info(e$1.createUrl)}`),f.log(` ${e$1.followUp}`),f.break(),e$1.prompt===false)return;let{proceed:t}=await de({type:"confirm",name:"proceed",message:"Open in browser?",initial:true});t&&await Hi(e$1.createUrl);}function fe(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??false),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"),`${a$1}/init?${r.toString()}`}async function De(){let{base:e$1}=await de({type:"select",name:"base",message:`Select a ${e.info("component library")}`,choices:[{title:"Base UI (Recommended)",value:"base"},{title:"React Aria",value:"aria"},{title:"Radix UI",value:"radix"}]});return e$1||process.exit(1),e$1}async function Ke(e$1){let t=Object.entries(K),{selectedPreset:r}=await de({type:"select",name:"selectedPreset",message:`Which ${e.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 ${e.info(`${a$1}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let n=cr({command:"init",rtl:e$1.rtl,pointer:e$1.pointer,base:e$1.base,...e$1.template&&{template:e$1.template}});await lr({createUrl:n,followUp:`Then ${e.info("copy and run the command")} from ui.shadcn.com.`}),process.exit(0);}let o=K[r];return o||process.exit(1),{url:fe({...o,base:e$1.base,rtl:e$1.rtl},{template:e$1.template,pointer:e$1.pointer}),base:e$1.base}}async function Ce(e,t,r){let o=$(_({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:n}=await B([e],o,{silent:true,writeFile:false});o=n,ba$1(e,o);let[i]=await ka$1([e],{config:o,useCache:true}),s=i?.type==="registry:base"&&i.config?i.config:void 0,l=e;if(Gi(e)){let c=new URL(e);c.searchParams.delete("track"),l=c.toString();}return {registryBaseConfig:s,installStyleIndex:i?.extends!=="none",url:l}}function Gi(e){try{return new URL(e).pathname==="/init"&&e.startsWith(a$1)}catch{return false}}var Yi=process.env.SHADCN_GITHUB_URL??"https://github.com/shadcn-ui/ui.git";function Y(e){return {...e,frameworks:e.frameworks??[],scaffold:e.scaffold??Ko({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??Qi}}function ve(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=Ko({title:e.title,templateDir:r.templateDir}),o}function qi(e){switch(e){case "pnpm":return ["--no-frozen-lockfile"];case "yarn":return ["--no-immutable"];default:return []}}async function Xi(e,t){if(t==="pnpm")return;let r=T__default.join(e,"pnpm-workspace.yaml"),o=T__default.join(e,"package.json"),n=T__default.join(e,"pnpm-lock.yaml");L.existsSync(n)&&await L.remove(n);let i=L.existsSync(r),s=i?j$1(await L.readFile(r,"utf8")):[],l=s.length>0;if(L.existsSync(o)){let c=await L.readFile(o,"utf8"),m=JSON.parse(c);l?m.packageManager=await Zi(t):delete m.packageManager,l&&(m.workspaces=s),await L.writeFile(o,JSON.stringify(m,null,2)+`
7
- `);}i&&await L.remove(r),l&&t==="npm"&&await Go(e);}async function Zi(e){try{let{stdout:t}=await execa(e,["--version"]);return `${e}@${t.trim()}`}catch{return `${e}@*`}}async function Go(e){let t=await L.readdir(e,{withFileTypes:true});for(let r of t){if(r.name==="node_modules")continue;let o=T__default.join(e,r.name);if(r.isDirectory())await Go(o);else if(r.name==="package.json"){let n=await L.readFile(o,"utf8");if(!n.includes("workspace:"))continue;let i=JSON.parse(n),s=false;for(let l of ["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let c=i[l];if(c)for(let[m,d]of Object.entries(c))typeof d=="string"&&d.startsWith("workspace:")&&(c[m]="*",s=true);}s&&await L.writeFile(o,JSON.stringify(i,null,2)+`
8
- `);}}}function Ko({title:e,templateDir:t}){return async({projectPath:r,packageManager:o})=>{let n=C(`Creating a new ${e} project. This may take a few minutes.`).start();try{let i=process.env.SHADCN_TEMPLATE_DIR;if(i){let m=T__default.resolve(i,t);await L.copy(m,r,{filter:d=>!d.includes("node_modules")});}else {let m=T__default.join(Ki.tmpdir(),`shadcn-template-${Date.now()}`);await execa("git",["clone","--depth","1","--filter=blob:none","--sparse",Yi,m]),await execa("git",["-C",m,"sparse-checkout","set",`templates/${t}`]);let d=T__default.resolve(m,"templates",t);await L.move(d,r),await L.remove(m);}await Xi(r,o);let l=["install",...qi(o)];await execa(o,l,{cwd:r});let c=T__default.join(r,"package.json");if(L.existsSync(c)){let m=await L.readFile(c,"utf8"),d=JSON.parse(m);d.name=T__default.basename(r),await L.writeFile(c,JSON.stringify(d,null,2)+`
9
- `);}n?.succeed(`Creating a new ${e} project.`);}catch(i){n?.fail(`Something went wrong creating a new ${e} project.`),ia(i);}}}async function Qi({projectPath:e}){try{await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","feat: initial commit"],{cwd:e});}catch{}}async function pe(e){let t=T__default.resolve(e.projectPath,"packages/ui"),r=T__default.resolve(e.projectPath,"apps/web"),o=T__default.resolve(t,"components.json"),n=await L.readJson(o);e.registryBaseConfig&&(n=Yo(n,e.registryBaseConfig)),n.tailwind.baseColor="neutral",e.rtl&&(n.rtl=true),e.menuColor&&(n.menuColor=e.menuColor),e.menuAccent&&(n.menuAccent=e.menuAccent),e.iconLibrary&&(n.iconLibrary=e.iconLibrary),await L.writeJson(o,n,{spaces:2});let i=T__default.resolve(r,"components.json"),s=await L.readJson(i);e.registryBaseConfig&&(s=Yo(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),e.menuColor&&(s.menuColor=e.menuColor),e.menuAccent&&(s.menuAccent=e.menuAccent),e.iconLibrary&&(s.iconLibrary=e.iconLibrary),await L.writeJson(i,s,{spaces:2});let l=await X(t,c.parse(n)),{config:c$1}=await B(e.components,l,{silent:true});await La$1(e.components,c$1,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let m=await X(r,c.parse(s)),d=await ea$1(e.components,$(c$1));if(d?.fonts?.length){let y={},g=new Set;for(let u of d.fonts){let w=u.name.replace(/^font-heading-/,"").replace("font-",""),k=u.font.dependency??`@fontsource-variable/${w}`;y[u.font.variable]=u.font.family,g.add(k);}await Ia(Array.from(g),[],l,{silent:true}),await Ea({theme:y},l,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await Ga$1(Object.fromEntries(Array.from(g).map(u=>[`@import "${u}"`,{}])),l,{silent:e.silent});}let p=l.iconLibrary;if(p&&p in a$4){let y=[...a$4[p].packages];await Ia(y,[],l,{silent:true}),await Ia(y,[],m,{silent:true});}return m}var Xo=Y({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:qo`---
5
+ Once configured, you can use the cli to add components.`),f.break(),process.exit(1);}o?.succeed(`Verifying framework. Found ${e.info(i$1.framework.label)}.`);let s="Validating Tailwind CSS.";i$1.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${e.info("v4")}.`);let l=C(s,{silent:e$1.silent}).start();i$1.tailwindVersion==="v3"&&(!i$1?.tailwindConfigFile||!i$1?.tailwindCssFile)?(t["5"]=true,l?.fail()):i$1.tailwindVersion==="v4"&&!i$1?.tailwindCssFile?(t["5"]=true,l?.fail()):i$1.tailwindVersion?l?.succeed():(t["5"]=true,l?.fail());let c=C("Validating import alias.",{silent:e$1.silent}).start();return i$1?.aliasPrefix?c?.succeed():(t["6"]=true,c?.fail()),Object.keys(t).length>0&&(t["5"]&&(f.break(),f.error(`No Tailwind CSS configuration found at ${e.info(e$1.cwd)}.`),f.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),f.error("Install Tailwind CSS then try again."),i$1?.framework.links.tailwind&&f.error(`Visit ${e.info(i$1?.framework.links.tailwind)} to get started.`)),t["6"]&&(f.break(),f.error(`Could not find valid path aliases or package imports for ${e.info("init")}.`),f.error(`Configure path aliases in ${e.info("tsconfig.json")} or imports in ${e.info("package.json")}, then run ${e.info("init")} again.`),f.error(`Learn more at ${e.info(`${a$1}/docs/installation/manual#configure-import-aliases`)}.`)),f.break(),process.exit(1)),{errors:t,projectInfo:i$1}}async function qo(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}=y(i);s&&!b$1[s]&&r.add(s);try{let[l]=await da$1([i],t,{useCache:!0});if(l?.registryDependencies)for(let c of l.registryDependencies){let{registry:m}=y(c);m&&!b$1[m]&&r.add(m),o.has(c)||n.push(c);}}catch(l){if(l instanceof q$1){let{registry:c}=y(i);c&&!b$1[c]&&r.add(c);continue}continue}}return Array.from(r)}async function U(e,t,r={}){r={silent:false,writeFile:true,...r};let n=(await qo(e,t)).filter(u=>!t.registries?.[u]&&!Object.keys(b$1).includes(u));if(n.length===0)return {config:t,newRegistries:[],discoveredRegistries:{},packageJsonRegistries:{}};let i=await na(t.resolvedPaths.cwd),s={},l=[];for(let u of n)i[u]?s[u]=i[u]:l.push(u);let c={};if(l.length>0){let u=await xa$1({useCache:process.env.NODE_ENV!=="development"});if(u)for(let g of l)u[g]&&(c[g]=u[g]);}let m={...s,...c};if(Object.keys(m).length===0)return {config:t,newRegistries:[],discoveredRegistries:{},packageJsonRegistries:{}};let d=Object.fromEntries(Object.entries(t.registries||{}).filter(([u])=>!Object.keys(b$1).includes(u))),p={...t,registries:{...d,...m}};if(r.writeFile&&Object.keys(c).length>0){let u=j__default.resolve(t.resolvedPaths.cwd,"components.json");if(L.existsSync(u)){let g=C("Updating components.json.",{silent:r.silent}).start(),h=await L.readJson(u),w={...h,registries:{...h.registries,...c}};await L.writeFile(u,JSON.stringify(w,null,2)+`
6
+ `,"utf-8"),g.succeed();}}return {config:p,newRegistries:Object.keys(m),discoveredRegistries:c,packageJsonRegistries:s}}var Y={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:false},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:false},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:false},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:false},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:false},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:false},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:false},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:false}};function mr(e){let t=new URL(`${a$1}/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 fr(e$1){if(f.break(),f.log(` Build your custom preset on ${e.info(e$1.createUrl)}`),f.log(` ${e$1.followUp}`),f.break(),e$1.prompt===false)return;let{proceed:t}=await de({type:"confirm",name:"proceed",message:"Open in browser?",initial:true});t&&await Ki(e$1.createUrl);}function fe(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??false),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"),`${a$1}/init?${r.toString()}`}async function De(){let{base:e$1}=await de({type:"select",name:"base",message:`Select a ${e.info("component library")}`,choices:[{title:"Base UI (Recommended)",value:"base"},{title:"React Aria",value:"aria"},{title:"Radix UI",value:"radix"}]});return e$1||process.exit(1),e$1}async function Ye(e$1){let t=Object.entries(Y),{selectedPreset:r}=await de({type:"select",name:"selectedPreset",message:`Which ${e.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 ${e.info(`${a$1}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let n=mr({command:"init",rtl:e$1.rtl,pointer:e$1.pointer,base:e$1.base,...e$1.template&&{template:e$1.template}});await fr({createUrl:n,followUp:`Then ${e.info("copy and run the command")} from ui.shadcn.com.`}),process.exit(0);}let o=Y[r];return o||process.exit(1),{url:fe({...o,base:e$1.base,rtl:e$1.rtl},{template:e$1.template,pointer:e$1.pointer}),base:e$1.base}}async function Ce(e,t,r){let o=$(_({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:n}=await U([e],o,{silent:true,writeFile:false});o=n,ba$1(e,o);let[i]=await ka$1([e],{config:o,useCache:true}),s=i?.type==="registry:base"&&i.config?i.config:void 0,l=e;if(Yi(e)){let c=new URL(e);c.searchParams.delete("track"),l=c.toString();}return {registryBaseConfig:s,installStyleIndex:i?.extends!=="none",url:l}}function Yi(e){try{return new URL(e).pathname==="/init"&&e.startsWith(a$1)}catch{return false}}var Xi=process.env.SHADCN_GITHUB_URL??"https://github.com/shadcn-ui/ui.git";function q(e){return {...e,frameworks:e.frameworks??[],scaffold:e.scaffold??Zo({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??ts}}function ve(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=Zo({title:e.title,templateDir:r.templateDir}),o}function Zi(e){switch(e){case "pnpm":return ["--no-frozen-lockfile"];case "yarn":return ["--no-immutable"];default:return []}}async function Qi(e,t){if(t==="pnpm")return;let r=j__default.join(e,"pnpm-workspace.yaml"),o=j__default.join(e,"package.json"),n=j__default.join(e,"pnpm-lock.yaml");L.existsSync(n)&&await L.remove(n);let i=L.existsSync(r),s=i?j$2(await L.readFile(r,"utf8")):[],l=s.length>0;if(L.existsSync(o)){let c=await L.readFile(o,"utf8"),m=JSON.parse(c);l?m.packageManager=await es(t):delete m.packageManager,l&&(m.workspaces=s),await L.writeFile(o,JSON.stringify(m,null,2)+`
7
+ `);}i&&await L.remove(r),l&&t==="npm"&&await Xo(e);}async function es(e){try{let{stdout:t}=await execa(e,["--version"]);return `${e}@${t.trim()}`}catch{return `${e}@*`}}async function Xo(e){let t=await L.readdir(e,{withFileTypes:true});for(let r of t){if(r.name==="node_modules")continue;let o=j__default.join(e,r.name);if(r.isDirectory())await Xo(o);else if(r.name==="package.json"){let n=await L.readFile(o,"utf8");if(!n.includes("workspace:"))continue;let i=JSON.parse(n),s=false;for(let l of ["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let c=i[l];if(c)for(let[m,d]of Object.entries(c))typeof d=="string"&&d.startsWith("workspace:")&&(c[m]="*",s=true);}s&&await L.writeFile(o,JSON.stringify(i,null,2)+`
8
+ `);}}}function Zo({title:e,templateDir:t}){return async({projectPath:r,packageManager:o})=>{let n=C(`Creating a new ${e} project. This may take a few minutes.`).start();try{let i=process.env.SHADCN_TEMPLATE_DIR;if(i){let m=j__default.resolve(i,t);await L.copy(m,r,{filter:d=>!d.includes("node_modules")});}else {let m=j__default.join(qi.tmpdir(),`shadcn-template-${Date.now()}`);await execa("git",["clone","--depth","1","--filter=blob:none","--sparse",Xi,m]),await execa("git",["-C",m,"sparse-checkout","set",`templates/${t}`]);let d=j__default.resolve(m,"templates",t);await L.move(d,r),await L.remove(m);}await Qi(r,o);let l=["install",...Zi(o)];await execa(o,l,{cwd:r});let c=j__default.join(r,"package.json");if(L.existsSync(c)){let m=await L.readFile(c,"utf8"),d=JSON.parse(m);d.name=j__default.basename(r),await L.writeFile(c,JSON.stringify(d,null,2)+`
9
+ `);}n?.succeed(`Creating a new ${e} project.`);}catch(i){n?.fail(`Something went wrong creating a new ${e} project.`),ia$1(i);}}}async function ts({projectPath:e}){try{await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","feat: initial commit"],{cwd:e});}catch{}}async function pe(e){let t=j__default.resolve(e.projectPath,"packages/ui"),r=j__default.resolve(e.projectPath,"apps/web"),o=j__default.resolve(t,"components.json"),n=await L.readJson(o);e.registryBaseConfig&&(n=Qo(n,e.registryBaseConfig)),n.tailwind.baseColor="neutral",e.rtl&&(n.rtl=true),e.menuColor&&(n.menuColor=e.menuColor),e.menuAccent&&(n.menuAccent=e.menuAccent),e.iconLibrary&&(n.iconLibrary=e.iconLibrary),await L.writeJson(o,n,{spaces:2});let i=j__default.resolve(r,"components.json"),s=await L.readJson(i);e.registryBaseConfig&&(s=Qo(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),e.menuColor&&(s.menuColor=e.menuColor),e.menuAccent&&(s.menuAccent=e.menuAccent),e.iconLibrary&&(s.iconLibrary=e.iconLibrary),await L.writeJson(i,s,{spaces:2});let l=await X$1(t,c.parse(n)),{config:c$1}=await U(e.components,l,{silent:true});await Ma$1(e.components,c$1,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let m=await X$1(r,c.parse(s)),d=await ea$1(e.components,$(c$1));if(d?.fonts?.length){let u={},g=new Set;for(let h of d.fonts){let w=h.name.replace(/^font-heading-/,"").replace("font-",""),k=h.font.dependency??`@fontsource-variable/${w}`;u[h.font.variable]=h.font.family,g.add(k);}await Ja$1(Array.from(g),[],l,{silent:true}),await Fa$1({theme:u},l,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await Ha$1(Object.fromEntries(Array.from(g).map(h=>[`@import "${h}"`,{}])),l,{silent:e.silent});}let p=l.iconLibrary;if(p&&p in a$4){let u=[...a$4[p].packages];await Ja$1(u,[],l,{silent:true}),await Ja$1(u,[],m,{silent:true});}return m}var tn=q({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:en`---
10
10
  import Layout from "@/layouts/main.astro"
11
11
  import { ComponentExample } from "@/components/component-example"
12
12
  ---
@@ -14,7 +14,7 @@ import { ComponentExample } from "@/components/component-example"
14
14
  <Layout>
15
15
  <ComponentExample client:load />
16
16
  </Layout>
17
- `}],monorepo:{templateDir:"astro-monorepo",init:pe,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:qo`---
17
+ `}],monorepo:{templateDir:"astro-monorepo",init:pe,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:en`---
18
18
  import "@workspace/ui/globals.css"
19
19
  import { ComponentExample } from "@/components/component-example"
20
20
  ---
@@ -29,27 +29,27 @@ import { ComponentExample } from "@/components/component-example"
29
29
  <ComponentExample client:load />
30
30
  </body>
31
31
  </html>
32
- `}]}});var Zo=Y({name:"laravel",title:"Laravel",description:"Requires `laravel new`",defaultProjectName:"laravel-app",templateDir:"laravel-app",frameworks:["laravel"],scaffold:async()=>{f.break(),f.log(` Please create a new app with ${e.info("laravel new --react")} first then run ${e.info("shadcn init")}.`),f.log(` See ${e.info(`${a$1}/docs/installation/laravel`)} for more information.`),f.break(),process.exit(0);},create:async()=>{}});var tn=Y({name:"next",title:"Next.js",defaultProjectName:"next-app",templateDir:"next-app",frameworks:["next-app","next-pages"],create:async()=>{},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:qo`import { ComponentExample } from "@/components/component-example";
32
+ `}]}});var rn=q({name:"laravel",title:"Laravel",description:"Requires `laravel new`",defaultProjectName:"laravel-app",templateDir:"laravel-app",frameworks:["laravel"],scaffold:async()=>{f.break(),f.log(` Please create a new app with ${e.info("laravel new --react")} first then run ${e.info("shadcn init")}.`),f.log(` See ${e.info(`${a$1}/docs/installation/laravel`)} for more information.`),f.break(),process.exit(0);},create:async()=>{}});var sn=q({name:"next",title:"Next.js",defaultProjectName:"next-app",templateDir:"next-app",frameworks:["next-app","next-pages"],create:async()=>{},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:en`import { ComponentExample } from "@/components/component-example";
33
33
 
34
34
  export default function Page() {
35
35
  return <ComponentExample />;
36
36
  }
37
- `}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=T__default.resolve(e.projectPath,"packages/ui"),r=T__default.resolve(e.projectPath,"apps/web"),o=T__default.resolve(t,"components.json"),n=await L.readJson(o);e.registryBaseConfig&&(n=Yo(n,e.registryBaseConfig)),n.tailwind.baseColor="neutral",e.rtl&&(n.rtl=true),await L.writeJson(o,n,{spaces:2});let i=T__default.resolve(r,"components.json"),s=await L.readJson(i);e.registryBaseConfig&&(s=Yo(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),await L.writeJson(i,s,{spaces:2});let l=await X(t,c.parse(n)),{config:c$1}=await B(e.components,l,{silent:true});await La$1(e.components,c$1,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let m=await X(r,c.parse(s)),d=await ea$1(e.components,$(c$1));if(d?.fonts?.length){let y={};for(let g of d.fonts)y[g.font.variable]=`var(${g.font.variable})`;await Ea({theme:y},l,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await Ka$1(d.fonts,m,{silent:e.silent});}let p=l.iconLibrary;if(p&&p in a$4){let y=[...a$4[p].packages];await Ia(y,[],l,{silent:true}),await Ia(y,[],m,{silent:true});}return m},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:qo`import { ComponentExample } from "@/components/component-example";
37
+ `}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=j__default.resolve(e.projectPath,"packages/ui"),r=j__default.resolve(e.projectPath,"apps/web"),o=j__default.resolve(t,"components.json"),n=await L.readJson(o);e.registryBaseConfig&&(n=Qo(n,e.registryBaseConfig)),n.tailwind.baseColor="neutral",e.rtl&&(n.rtl=true),await L.writeJson(o,n,{spaces:2});let i=j__default.resolve(r,"components.json"),s=await L.readJson(i);e.registryBaseConfig&&(s=Qo(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),await L.writeJson(i,s,{spaces:2});let l=await X$1(t,c.parse(n)),{config:c$1}=await U(e.components,l,{silent:true});await Ma$1(e.components,c$1,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let m=await X$1(r,c.parse(s)),d=await ea$1(e.components,$(c$1));if(d?.fonts?.length){let u={};for(let g of d.fonts)u[g.font.variable]=`var(${g.font.variable})`;await Fa$1({theme:u},l,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await La$1(d.fonts,m,{silent:e.silent});}let p=l.iconLibrary;if(p&&p in a$4){let u=[...a$4[p].packages];await Ja$1(u,[],l,{silent:true}),await Ja$1(u,[],m,{silent:true});}return m},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:en`import { ComponentExample } from "@/components/component-example";
38
38
 
39
39
  export default function Page() {
40
40
  return <ComponentExample />;
41
41
  }
42
- `}]}});var on=Y({name:"react-router",title:"React Router",defaultProjectName:"react-router-app",templateDir:"react-router-app",frameworks:["react-router"],create:async()=>{},files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:qo`import { ComponentExample } from "@/components/component-example";
42
+ `}]}});var cn=q({name:"react-router",title:"React Router",defaultProjectName:"react-router-app",templateDir:"react-router-app",frameworks:["react-router"],create:async()=>{},files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:en`import { ComponentExample } from "@/components/component-example";
43
43
 
44
44
  export default function Home() {
45
45
  return <ComponentExample />;
46
46
  }
47
- `}],monorepo:{templateDir:"react-router-monorepo",init:pe,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:qo`import { ComponentExample } from "@/components/component-example";
47
+ `}],monorepo:{templateDir:"react-router-monorepo",init:pe,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:en`import { ComponentExample } from "@/components/component-example";
48
48
 
49
49
  export default function Home() {
50
50
  return <ComponentExample />;
51
51
  }
52
- `}]}});var sn=Y({name:"start",title:"TanStack Start",defaultProjectName:"start-app",templateDir:"start-app",frameworks:["tanstack-start"],create:async()=>{},files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:qo`import { createFileRoute } from "@tanstack/react-router";
52
+ `}]}});var mn=q({name:"start",title:"TanStack Start",defaultProjectName:"start-app",templateDir:"start-app",frameworks:["tanstack-start"],create:async()=>{},files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:en`import { createFileRoute } from "@tanstack/react-router";
53
53
  import { ComponentExample } from "@/components/component-example";
54
54
 
55
55
  export const Route = createFileRoute("/")({ component: App });
@@ -59,7 +59,7 @@ function App() {
59
59
  <ComponentExample />
60
60
  );
61
61
  }
62
- `}],monorepo:{templateDir:"start-monorepo",init:pe,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:qo`import { createFileRoute } from "@tanstack/react-router";
62
+ `}],monorepo:{templateDir:"start-monorepo",init:pe,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:en`import { createFileRoute } from "@tanstack/react-router";
63
63
  import { ComponentExample } from "@/components/component-example";
64
64
 
65
65
  export const Route = createFileRoute("/")({ component: App });
@@ -69,66 +69,66 @@ function App() {
69
69
  <ComponentExample />
70
70
  );
71
71
  }
72
- `}]}});var cn=Y({name:"vite",title:"Vite",defaultProjectName:"vite-app",templateDir:"vite-app",frameworks:["vite"],create:async()=>{},files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:qo`import { ComponentExample } from "@/components/component-example";
72
+ `}]}});var pn=q({name:"vite",title:"Vite",defaultProjectName:"vite-app",templateDir:"vite-app",frameworks:["vite"],create:async()=>{},files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:en`import { ComponentExample } from "@/components/component-example";
73
73
 
74
74
  export function App() {
75
75
  return <ComponentExample />;
76
76
  }
77
77
 
78
78
  export default App;
79
- `}],monorepo:{templateDir:"vite-monorepo",init:pe,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:qo`import { ComponentExample } from "@/components/component-example";
79
+ `}],monorepo:{templateDir:"vite-monorepo",init:pe,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:en`import { ComponentExample } from "@/components/component-example";
80
80
 
81
81
  export function App() {
82
82
  return <ComponentExample />;
83
83
  }
84
84
 
85
85
  export default App;
86
- `}]}});var q={next:tn,vite:cn,start:sn,"react-router":on,astro:Xo,laravel:Zo};function _e(e){if(e){for(let[t,r]of Object.entries(q))if(r.frameworks.includes(e))return t}}function mn(e,t){let r=t?.lib??Ft(e,"lib");return {ui:t?.ui??Ft(e,"ui"),lib:r,hooks:t?.hooks??Ft(e,"hooks"),utils:t?.utils??Ft(e,"utils",r)}}function Ft(e,t,r){let o=e||R;if(t==="ui")return `${o}/ui`;if(t==="utils"){let n=r||ln(o,"lib");return n?`${n}/utils`:S}return ln(o,t)}function ln(e,t){return e==="components"?t:e.endsWith("/components")?`${e.slice(0,-11)}/${t}`:e.endsWith("components")&&!e.includes("/")?`${e.slice(0,-10)}${t}`:""}async function Ot(e$1){let t=e$1.template&&e$1.template in q?e$1.template:"next",r=ve(q[t],{monorepo:e$1.monorepo}),o=e$1.name??r.defaultProjectName,n=e$1.components?.length===1&&!!e$1.components[0].match(/\/chat\/b\//);if(n&&(t="next"),!e$1.force){let{type:c,name:m}=await de([{type:e$1.template||n?null:"select",name:"type",message:`The path ${e.info(e$1.cwd)} does not contain a package.json file.
87
- Would you like to start a new project?`,choices:Object.entries(q).map(([d,p])=>({title:p.title,value:d,description:p.description})),initial:0},{type:e$1.name?null:"text",name:"name",message:"What is your project named?",initial:o,format:d=>d.trim(),validate:d=>d.length>128?"Name should be less than 128 characters.":true}]);t=c??t,o=m??o;}let i=ve(q[t],{monorepo:e$1.monorepo}),s=await fa$1(e$1.cwd,{withFallback:true}),l=T__default.join(e$1.cwd,o);try{await L.access(e$1.cwd,L.constants.W_OK);}catch{f.break(),f.error(`The path ${e.info(e$1.cwd)} is not writable.`),f.error(`It is likely you do not have write permissions for this folder or the path ${e.info(e$1.cwd)} does not exist.`),f.break(),process.exit(1);}return L.existsSync(T__default.resolve(e$1.cwd,o,"package.json"))&&(f.break(),f.error(`A project with the name ${e.info(o)} already exists.`),f.error("Please choose a different name and try again."),f.break(),process.exit(1)),await i.scaffold({projectPath:l,packageManager:s,cwd:e$1.cwd}),{projectPath:l,projectName:o,template:t}}var Ue=".bak",Ve=class extends Error{filePath;constructor(t){super(`Could not back up ${t}.`),this.name="FileBackupError",this.filePath=t;}};function Ye(e){if(!L.existsSync(e))return null;let t=`${e}${Ue}`;try{return L.renameSync(e,t),t}catch{return null}}function Me(e){let t=`${e}${Ue}`;if(!L.existsSync(t))return false;try{return L.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function qe(e){let t=`${e}${Ue}`;if(!L.existsSync(t))return false;try{return L.unlinkSync(t),!0}catch{return false}}async function pn(e,t){if(!L.existsSync(e))return t();if(!Ye(e))throw new Ve(e);let o=()=>Me(e);process.on("exit",o);try{let n=await t();return process.removeListener("exit",o),qe(e),n}catch(n){throw process.removeListener("exit",o),Me(e),n}}var ns=z.object({cwd:z.string(),name:z.string().optional(),preset:z.union([z.boolean(),z.string()]).optional(),components:z.array(z.string()).optional(),yes:z.boolean(),defaults:z.boolean(),force:z.boolean(),reinstall:z.boolean().optional(),silent:z.boolean(),isNewProject:z.boolean().default(false),cssVariables:z.boolean().default(true),rtl:z.boolean().optional(),pointer:z.boolean().optional(),base:z.enum(a).optional(),template:z.string().optional(),monorepo:z.boolean().optional(),existingConfig:z.record(z.unknown()).optional(),installStyleIndex:z.boolean().default(true),registryBaseConfig:c.deepPartial().optional(),menuColor:z.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:z.enum(["subtle","bold"]).optional(),iconLibrary:z.string().optional()});function is(e,t){return t.rtl?e.searchParams.set("rtl","true"):t.rtl===false&&e.searchParams.delete("rtl"),t.pointer?e.searchParams.set("pointer","true"):t.pointer===false&&e.searchParams.delete("pointer"),e}var dn=new Command().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, radix, aria)").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.",true).option("-d, --defaults","use default configuration: --template=next --preset=base-nova",false).option("-f, --force","force overwrite of existing configuration.",false).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.",false).option("--css-variables","use css variables for theming.",true).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$1,t$1)=>{let r,o=[],n=()=>{r&&Me(r.replace(Ue,""));};process.on("exit",n);try{let i$1=ns.parse({...t$1,reinstall:t$1.reinstall,cwd:T__default.resolve(t$1.cwd)}),s$1=new Map(Object.entries(K)),l;if(i$1.defaults&&(i$1.template=i$1.template||"next",i$1.base=i$1.base||"base",i$1.reinstall=i$1.reinstall??!1),i$1.template&&!(i$1.template in q)&&(f.error(`Invalid template: ${e.info(i$1.template)}. Available templates: ${Object.keys(q).map(g=>e.info(g)).join(", ")}.`),f.break(),process.exit(1)),typeof i$1.preset=="string"&&!N$1(i$1.preset)&&!t(i$1.preset)){let g=Array.from(s$1.keys());s$1.has(i$1.preset)||(f.error(`Invalid preset: ${e.info(i$1.preset)}. Available presets: ${g.join(", ")}`),f.break(),process.exit(1));}let c=i$1.cwd,m=L.existsSync(T__default.resolve(c,"components.json"));if(!i$1.monorepo&&!m&&await g(c)){let g=await za$1(c);if(!g||g.framework.name==="manual"){let u=await h(c);u.length>0&&(i("init",u),process.exit(1));}}if(m&&!i$1.force){let{overwrite:g}=await de({type:"confirm",name:"overwrite",message:`A ${e.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});g||(f.info(` To start over, remove the ${e.info("components.json")} file and run ${e.info("init")} again.`),f.break(),process.exit(1)),i$1.force=!0;}let d;if(m){try{d=await L.readJson(T__default.resolve(c,"components.json"));}catch{f.warn(`Could not parse the existing ${e.info("components.json")}. Unable to detect the current base.`);}d&&(i$1.existingConfig=d);let g=i$1.reinstall;if(g===void 0){let{reinstall:u}=await de({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});g=u;}if(g&&(o=await Ca$1(c),o.length)){f.break(),f.log(" The following components will be re-installed and overwritten:");for(let u=0;u<o.length;u+=8)f.log(` - ${o.slice(u,u+8).join(", ")}`);f.break();}}if(i$1.preset===void 0&&e$1.length===0&&!i$1.defaults){let g=L.existsSync(T__default.resolve(c,"package.json"));if(!i$1.template&&!g){let{template:u}=await de({type:"select",name:"template",message:"Select a template",choices:Object.entries(q).map(([w,k])=>({title:k.title,value:w,description:k.description,disabled:i$1.monorepo&&w==="laravel"}))});u||process.exit(1),i$1.template=u;}if(!i$1.template&&g){let u=await za$1(c),w=_e(u?.framework.name);w&&(i$1.template=w);}if(i$1.template==="laravel"&&!g&&(f.break(),f.log(` Please create a new app with ${e.info("laravel new --react")} first then run ${e.info("shadcn init")}.`),f.log(` See ${e.info(`${a$1}/docs/installation/laravel`)} for more information.`),f.break(),process.exit(0)),i$1.monorepo===void 0&&!g&&i$1.template&&q[i$1.template]?.monorepo){let{monorepo:u}=await de({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});i$1.monorepo=u;}i$1.base||(i$1.base=await De()),i$1.preset=!0;}if(i$1.preset!==void 0){let g=i$1.preset===!0?!0:i$1.preset;if(g===!0){let u=await Ke({rtl:i$1.rtl??!1,template:i$1.template,base:i$1.base,pointer:i$1.pointer});e$1=[u.url,...e$1],l=u.base;}if(typeof g=="string"){let u;if(N$1(g)){let w=new URL(g);is(w,i$1),w.pathname==="/init"&&g.startsWith(a$1)&&w.searchParams.set("track","1"),u=w.toString();let k=w.searchParams.get("base");l=b(k)?k:void 0;}else if(t(g)){let w=s(g);w||(f.error(`Invalid preset code: ${e.info(g)}`),f.break(),process.exit(1)),u=fe({...w,base:"base",rtl:i$1.rtl??!1},{template:i$1.template,preset:g,pointer:i$1.pointer}),l=void 0;}else {let w=s$1.get(g);if(!w)throw new Error(`Unknown preset: ${g}`);u=fe({...w,base:i$1.base??"base",rtl:i$1.rtl??w.rtl},{template:i$1.template,pointer:i$1.pointer}),l=void 0;}e$1=[u,...e$1];}}let p=i$1.base??l??(typeof d?.style=="string"?Z(d.style):void 0),y=m&&!d;if(!p)if(e$1.length>0&&!y)p="base";else {let g=await De();p=g,i$1.base=g;}if(i$1.defaults&&!e$1.some(N$1)&&(e$1=[fe({...K.nova,base:p,rtl:i$1.rtl??!1},{template:i$1.template,pointer:i$1.pointer}),...e$1]),e$1.length>0&&N$1(e$1[0])){let g=new URL(e$1[0]);g.searchParams.set("base",p),e$1[0]=g.toString();}if(d?.style){let g=await cs(d.style,p);if(g!==p&&(p=g,e$1.length>0&&N$1(e$1[0]))){let u=new URL(e$1[0]);u.searchParams.set("base",g),e$1[0]=u.toString();}}if(o.length&&(e$1=[...e$1,...o]),i$1.components=e$1,await Ma$1(i$1.cwd),e$1.length>0){let g=T__default.resolve(c,"components.json");m&&(r=Ye(g)??void 0,r||f.warn(`Could not back up ${e.info("components.json")}.`));let{registryBaseConfig:u,installStyleIndex:w,url:k}=await Ce(e$1[0],c,{registries:d?.registries});e$1[0]=k,w||(i$1.installStyleIndex=!1),u&&(i$1.registryBaseConfig=u);}await Be(i$1),f.break(),f.log(`Project initialization completed.
88
- You may now add components.`),process.removeListener("exit",n),qe(T__default.resolve(c,"components.json")),f.break();}catch(i){process.removeListener("exit",n),n(),f.break(),ia(i);}finally{Q();}});async function Be(e$1){let t,r,o,n=e$1.template,i=n?ve(q[n],{monorepo:e$1.monorepo}):void 0;if(e$1.monorepo&&i?.init&&L.existsSync(T__default.resolve(e$1.cwd,"package.json")))t=await za$1(e$1.cwd);else if(e$1.skipPreflight)t=await za$1(e$1.cwd);else {let x=await zo(e$1);if(x.errors["1"]){let{projectPath:j,template:O}=await Ot(e$1);j||process.exit(1),e$1.cwd=j,e$1.isNewProject=true,o=O,t=await za$1(e$1.cwd);}else t=x.projectInfo;}r=await Aa$1(e$1.cwd,t);let l=o??n,c=l?ve(q[l],{monorepo:e$1.monorepo}):void 0,m=[...e$1.installStyleIndex?["index"]:[],...e$1.components??[],...c?["button"]:[]],d=o?c?.postInit:void 0;if(c?.init){let x=await c.init({projectPath:e$1.cwd,components:m,registryBaseConfig:e$1.registryBaseConfig,rtl:e$1.rtl??false,menuColor:e$1.menuColor,menuAccent:e$1.menuAccent,iconLibrary:e$1.iconLibrary,silent:e$1.silent});return d&&await d({projectPath:e$1.cwd}),x}let p=r?await as(r,e$1):await ss(await W(e$1.cwd));if(!e$1.yes){let{proceed:x}=await de({type:"confirm",name:"proceed",message:`Write configuration to ${e.info("components.json")}. Proceed?`,initial:true});x||process.exit(1);}let y=await X(e$1.cwd,p),{config:g}=await B(m,y,{silent:true});g.registries&&(p.registries=g.registries);let u=C("Writing components.json.").start(),w=T__default.resolve(e$1.cwd,"components.json"),k=`${w}${Ue}`,b=(x,j)=>{let{registries:O,...X}=Yo(x,j);return {...X,registries:O}};if(L.existsSync(k)){let x=await L.readJson(k);e$1.force?x.registries&&(p.registries={...x.registries,...p.registries||{}}):p=b(x,p);}e$1.registryBaseConfig&&(p=b(p,e$1.registryBaseConfig)),e$1.rtl!==void 0&&(p.rtl=e$1.rtl),p.registries=Object.fromEntries(Object.entries(p.registries||{}).filter(([x])=>!Object.keys(b$1).includes(x))),await promises.writeFile(w,`${JSON.stringify(p,null,2)}
89
- `,"utf8"),u.succeed();let R=await X(e$1.cwd,p),S=await Y$1(R);if(S){let x={};if(p.menuColor&&(x.menuColor=p.menuColor),p.menuAccent&&(x.menuAccent=p.menuAccent),p.rtl!==void 0&&(x.rtl=p.rtl),p.iconLibrary&&(x.iconLibrary=p.iconLibrary),Object.keys(x).length>0)for(let j of Object.keys(S)){let O=S[j];if(O.resolvedPaths.cwd===R.resolvedPaths.cwd)continue;let X=T__default.resolve(O.resolvedPaths.cwd,"components.json");if(L.existsSync(X)){let Bi=await L.readJson(X);await L.writeJson(X,{...Bi,...x},{spaces:2});}}}return V.clearCaches(),await La$1(m,R,{overwrite:true,overwriteCssVars:e$1.reinstall||void 0,silent:e$1.silent,isNewProject:e$1.isNewProject||t?.framework.name==="next-app"}),d&&await d({projectPath:e$1.cwd}),R}async function ss(e$1=null){let[t,r]=await Promise.all([oa$1(),qa$1()]);f.info("");let o=await de([{type:"toggle",name:"typescript",message:`Would you like to use ${e.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${e.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 ${e.info("base color")}?`,choices:r.map(s=>({title:s.label,value:s.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${e.info("global CSS")} file?`,initial:e$1?.tailwind.css??T$1},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${e.info("CSS variables")} for theming?`,initial:e$1?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${e.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${e.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??U},{type:"text",name:"components",message:`Configure the import alias for ${e.info("components")}:`,initial:e$1?.aliases.components??R},{type:"toggle",name:"rsc",message:`Are you using ${e.info("React Server Components")}?`,initial:e$1?.rsc??true,active:"yes",inactive:"no"}]);o.style||process.exit(1);let n=e$1&&e$1.aliases.components===o.components?e$1.aliases:void 0,i=mn(o.components,n);return c.parse({$schema:"https://ui.shadcn.com/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 as(e$1,t){let r=e$1.style,o="neutral",n=e$1.tailwind.cssVariables,i=e$1.iconLibrary??"lucide";if(!t.defaults){let[s,l]=await Promise.all([oa$1(),Ba$1(e$1)]);r=(await de([{type:l==="v4"||r?null:"select",name:"style",message:`Which ${e.info("style")} would you like to use?`,choices:s.map(m=>({title:m.name==="new-york"?"New York (Recommended)":m.label,value:m.name})),initial:0}])).style??r??"new-york";}return n=t.cssVariables,c.parse({$schema:e$1?.$schema,style:r,tailwind:{...e$1?.tailwind,baseColor:o,cssVariables:n},rsc:e$1?.rsc,tsx:e$1?.tsx,iconLibrary:i,rtl:t.rtl??e$1?.rtl??false,aliases:e$1?.aliases})}async function cs(e$1,t){let r=Z(e$1);if(t===r)return t;f.warn(` You are switching from ${e.info(r)} to ${e.info(t)}.`),f.warn(` Components outside the ${e.info("ui")} directory that depend on ${e.info(r)} primitives may need manual updates.`),f.break();let{proceed:o}=await de({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:false});return o?t:r}async function gn(e$1){let t={};if(!L.existsSync(e$1.cwd)||!L.existsSync(T__default.resolve(e$1.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!L.existsSync(T__default.resolve(e$1.cwd,"components.json"))){if(await g(e$1.cwd)){let r=await h(e$1.cwd);r.length>0&&(i("add [component]",r),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await W(e$1.cwd);return {errors:t,config:r}}catch{f.break(),f.error(`An invalid ${e.info("components.json")} file was found at ${e.info(e$1.cwd)}.
90
- Before you can add components, you must create a valid ${e.info("components.json")} file by running the ${e.info("init")} command.`),f.error(`Learn more at ${e.info(`${a$1}/docs/components-json`)}.`),f.break(),process.exit(1);}}async function yn(e,t,r={}){let o={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return o;let n=await ea$1(e,$(t));if(!n)throw new Error("Failed to fetch components from registry.");r.skipFonts||(n=await Ja$1(n,t));let i=Da$1([n]);return o.dependencies=Array.from(new Set(n.dependencies??[])),o.devDependencies=Array.from(new Set(n.devDependencies??[])),o.docs=n.docs??null,await fs(n,t,o,r,i),await ps(n,t,o,r),ds(n,t,o),r.skipFonts||us(n,o),o}async function fs(e,t,r,o,n){let i=e.files;if(!i?.length)return;let[s,l]=await Promise.all([za$1(t.resolvedPaths.cwd),t.tailwind.baseColor?ra(t.tailwind.baseColor):Promise.resolve(void 0)]),c;try{c=loadConfig(t.resolvedPaths.cwd);}catch{c={resultType:"failed"};}let m=new Project({compilerOptions:{}}),d=L$1(i,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name});for(let p=0;p<i.length;p++){let y=i[p];if(!y.content)continue;let g=J(y,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name,commonRoot:K$1(i.map(j=>j.path),y.path),fileIndex:p});if(!g)continue;t.tsx||(g=g.replace(/\.tsx?$/,j=>j===".tsx"?".jsx":".js"));let u=existsSync(g),w=T__default.relative(t.resolvedPaths.cwd,g),k=y.type==="registry:file"||y.type==="registry:item",b=B$1(g)||k?y.content:await H({filename:y.path,raw:y.content,config:t,baseColor:l,transformJsx:!t.tsx,isRemote:false,supportedFontMarkers:n},[D,E,a$2,G,c$3,g$1,I,d$1,f$1,F]),R=B$1(g)||k?b:await M({config:t,content:b,filePaths:d,project:m,projectInfo:s,resolvedPath:g,tsConfig:c}),S="create",x;u&&(x=await promises.readFile(g,"utf-8"),A(x,R)?S="skip":S="overwrite"),r.files.push({path:w,action:S,content:R,...S==="overwrite"&&{existingContent:x},type:y.type??"registry:ui"});}}async function ps(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,l=existsSync(s),c=T__default.relative(t.resolvedPaths.cwd,s),m=l?await promises.readFile(s,"utf8"):"",d=m;i&&(d=await Fa$1(d,e.cssVars,t,{overwriteCssVars:o.overwriteCssVars})),n&&(d=await Ha$1(d,e.css));let p=0;if(e.cssVars)for(let y of Object.values(e.cssVars))y&&(p+=Object.keys(y).length);r.css={path:c,content:d,...l&&{existingContent:m},action:l?"update":"create",cssVarsCount:p};}function ds(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let o=T__default.join(t.resolvedPaths.cwd,".env.local"),n=existsSync(o),i=T__default.relative(t.resolvedPaths.cwd,o);r.envVars={path:i,variables:e.envVars,action:n?"update":"create"};}function us(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});}var ue=5,ys=dim("\u250C"+"\u2500".repeat(46)),ws=dim("\u2514"+"\u2500".repeat(46)),ks={create:"+",overwrite:"~",skip:"="},bs={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function Ze(e){return e==="create"?green(e):e==="overwrite"||e==="update"?yellow(e):dim(e)}function Qe(e){return `${bold("\u250C")} ${bold(`shadcn add ${e.join(", ")}`)} ${dim("(dry run)")}`}function bn(e,t){return e===t||e.includes(t)||e.endsWith(t)}function Se(e,t,r=o=>o){e.push(`${dim("\u2502")} ${ys}`);for(let o of t)e.push(`${dim("\u2502")} ${dim("\u2502")} ${r(o)}`);e.push(`${dim("\u2502")} ${ws}`);}function Cn(e,t,r={}){return r.diff?typeof r.diff=="string"?xs(e,t,r.diff):vs(e,t):r.view?typeof r.view=="string"?Ss(e,t,r.view):Rs(e,t):Cs(e,t)}function Cs(e,t){let r=[];r.push(Qe(t)),r.push(dim("\u2502")),Is(e,r),wn("Dependencies",e.dependencies,r),wn("Dev Dependencies",e.devDependencies,r),Ps(e,r),$s(e,r),Es(e,r);let o=e.files.filter(i=>i.action==="overwrite").length;o>0&&(r.push(yellow(`\u26A0 ${o} ${o===1?"file":"files"} will be overwritten.`)),r.push(dim("\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(`${dim("\u2502")} ${dim(n.join(", "))}`),r.push(dim("\u2502"))),r.push(`${dim("\u2502")} ${dim("Run with --diff to view changes.")}`),r.push(`${dim("\u2502")} ${dim("Run with --view to view file contents.")}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
91
- `)}function xs(e,t,r){let o=[];o.push(Qe(t)),o.push(dim("\u2502"));let n=vn(e.files,r),i=e.css&&bn(e.css.path,r);if(n.length===0&&!i)o.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),o.push(dim("\u2502"));else {for(let s of n)xn(s,o);if(i&&e.css){if(o.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${Ze(e.css.action)}${dim(")")}`),e.css.action==="create"||!e.css.existingContent)Se(o,e.css.content.split(`
92
- `),s=>green(`+${s}`));else {let s=Rn(e.css.existingContent,e.css.content,e.css.path,{fullContext:true});Se(o,s);}o.push(dim("\u2502"));}}return o.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),o.join(`
93
- `)}function vs(e,t){let r=[];r.push(Qe(t)),r.push(dim("\u2502"));let o=e.files.slice(0,ue);if(o.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No changes.")}`),r.push(dim("\u2502"));else {for(let s of o)xn(s,r);e.files.length>ue&&r.push(dim("\u2502"));}let n=e.files.length;return n>ue&&r.push(` ${dim(`Showing ${ue} of ${n} files. Use --diff <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
94
- `)}function Rs(e,t){let r=[];r.push(Qe(t)),r.push(dim("\u2502"));let o=e.files.slice(0,ue);if(o.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No files.")}`),r.push(dim("\u2502"));else {for(let s of o){let l=s.content.split(`
95
- `);r.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${Ze(s.action)}${dim(")")} ${dim(`${l.length} lines`)}`),Se(r,l),r.push(dim("\u2502"));}e.files.length>ue&&r.push(dim("\u2502"));}let n=e.files.length;return n>ue&&r.push(` ${dim(`Showing ${ue} of ${n} files. Use --view <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
96
- `)}function xn(e,t){if(t.push(`${dim("\u251C")} ${bold(e.path)} ${dim("(")}${Ze(e.action)}${dim(")")}`),e.action==="skip")t.push(`${dim("\u2502")} ${dim("No changes.")}`);else if(e.action==="create")Se(t,e.content.split(`
97
- `),r=>green(`+${r}`));else {let r=Rn(e.existingContent,e.content,e.path);Se(t,r);}t.push(dim("\u2502"));}function Ss(e,t,r){let o=[];o.push(Qe(t)),o.push(dim("\u2502"));let n=vn(e.files,r),i=e.css&&bn(e.css.path,r);if(n.length===0&&!i)o.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),o.push(dim("\u2502"));else {for(let s of n){let l=s.content.split(`
98
- `);o.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${Ze(s.action)}${dim(")")} ${dim(`${l.length} lines`)}`),Se(o,l),o.push(dim("\u2502"));}if(i&&e.css){let s=e.css.content.split(`
99
- `);o.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${Ze(e.css.action)}${dim(")")} ${dim(`${s.length} lines`)}`),Se(o,s),o.push(dim("\u2502"));}}return o.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),o.join(`
100
- `)}function Is(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(green(`+${r.create} new`)),r.overwrite>0&&o.push(yellow(`~${r.overwrite} overwrite`)),r.skip>0&&o.push(dim(`=${r.skip} skip`));let n=o.length>0?` ${o.join(dim(", "))}`:"";t.push(`${dim("\u251C")} ${bold("Files")} ${dim(`(${e.files.length})`)}${n}`);let i=Math.max(...e.files.map(s=>s.path.length));for(let s of e.files){let l=ks[s.action],c=bs[s.action],m=" ".repeat(Math.max(1,i-s.path.length+2)),d=s.action==="create"?green:s.action==="overwrite"?yellow:dim,p=s.action==="skip"?dim(s.path):s.path;t.push(`${dim("\u2502")} ${d(l)} ${p}${m}${d(c)}`);}t.push(dim("\u2502"));}function wn(e,t,r){if(t.length){r.push(`${dim("\u251C")} ${bold(e)} ${dim(`(${t.length})`)}`);for(let o of t)r.push(`${dim("\u2502")} ${green("+")} ${o}`);r.push(dim("\u2502"));}}function Ps(e,t){e.css&&(t.push(`${dim("\u251C")} ${bold("CSS")}`),e.css.cssVarsCount>0?t.push(`${dim("\u2502")} ${green("+")} ${e.css.cssVarsCount} CSS variables added to ${cyan(e.css.path)}`):t.push(`${dim("\u2502")} ${green("+")} Updated ${cyan(e.css.path)}`),t.push(dim("\u2502")));}function $s(e,t){if(!e.envVars)return;let r=Object.keys(e.envVars.variables);t.push(`${dim("\u251C")} ${bold("Environment Variables")}`);for(let o of r)t.push(`${dim("\u2502")} ${green("+")} ${o}`);t.push(dim("\u2502"));}function Es(e,t){if(e.fonts.length){t.push(`${dim("\u251C")} ${bold("Fonts")}`);for(let r of e.fonts)t.push(`${dim("\u2502")} ${green("+")} ${r.name} ${dim(`(${r.provider})`)}`);t.push(dim("\u2502"));}}function vn(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 Rn(e,t,r,o={}){if(Os(e,t))return [dim(" Formatting-only changes (spacing, quotes, semicolons).")];let n=kn(e),i=kn(t),s=o.fullContext?Math.max(n.split(`
86
+ `}]}});var X={next:sn,vite:pn,start:mn,"react-router":cn,astro:tn,laravel:rn};function _e(e){if(e){for(let[t,r]of Object.entries(X))if(r.frameworks.includes(e))return t}}function un(e,t){let r=t?.lib??Ot(e,"lib");return {ui:t?.ui??Ot(e,"ui"),lib:r,hooks:t?.hooks??Ot(e,"hooks"),utils:t?.utils??Ot(e,"utils",r)}}function Ot(e,t,r){let o=e||R;if(t==="ui")return `${o}/ui`;if(t==="utils"){let n=r||dn(o,"lib");return n?`${n}/utils`:S}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}`:""}async function At(e$1){let t=e$1.template&&e$1.template in X?e$1.template:"next",r=ve(X[t],{monorepo:e$1.monorepo}),o=e$1.name??r.defaultProjectName,n=e$1.components?.length===1&&!!e$1.components[0].match(/\/chat\/b\//);if(n&&(t="next"),!e$1.force){let{type:c,name:m}=await de([{type:e$1.template||n?null:"select",name:"type",message:`The path ${e.info(e$1.cwd)} does not contain a package.json file.
87
+ Would you like to start a new project?`,choices:Object.entries(X).map(([d,p])=>({title:p.title,value:d,description:p.description})),initial:0},{type:e$1.name?null:"text",name:"name",message:"What is your project named?",initial:o,format:d=>d.trim(),validate:d=>d.length>128?"Name should be less than 128 characters.":true}]);t=c??t,o=m??o;}let i=ve(X[t],{monorepo:e$1.monorepo}),s=await fa(e$1.cwd,{withFallback:true}),l=j__default.join(e$1.cwd,o);try{await L.access(e$1.cwd,L.constants.W_OK);}catch{f.break(),f.error(`The path ${e.info(e$1.cwd)} is not writable.`),f.error(`It is likely you do not have write permissions for this folder or the path ${e.info(e$1.cwd)} does not exist.`),f.break(),process.exit(1);}return L.existsSync(j__default.resolve(e$1.cwd,o,"package.json"))&&(f.break(),f.error(`A project with the name ${e.info(o)} already exists.`),f.error("Please choose a different name and try again."),f.break(),process.exit(1)),await i.scaffold({projectPath:l,packageManager:s,cwd:e$1.cwd}),{projectPath:l,projectName:o,template:t}}var Ue=".bak",Ve=class extends Error{filePath;constructor(t){super(`Could not back up ${t}.`),this.name="FileBackupError",this.filePath=t;}};function qe(e){if(!L.existsSync(e))return null;let t=`${e}${Ue}`;try{return L.renameSync(e,t),t}catch{return null}}function Me(e){let t=`${e}${Ue}`;if(!L.existsSync(t))return false;try{return L.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function Xe(e){let t=`${e}${Ue}`;if(!L.existsSync(t))return false;try{return L.unlinkSync(t),!0}catch{return false}}async function hn(e,t){if(!L.existsSync(e))return t();if(!qe(e))throw new Ve(e);let o=()=>Me(e);process.on("exit",o);try{let n=await t();return process.removeListener("exit",o),Xe(e),n}catch(n){throw process.removeListener("exit",o),Me(e),n}}var ss=z.object({cwd:z.string(),name:z.string().optional(),preset:z.union([z.boolean(),z.string()]).optional(),components:z.array(z.string()).optional(),yes:z.boolean(),defaults:z.boolean(),force:z.boolean(),reinstall:z.boolean().optional(),silent:z.boolean(),isNewProject:z.boolean().default(false),cssVariables:z.boolean().default(true),rtl:z.boolean().optional(),pointer:z.boolean().optional(),base:z.enum(a).optional(),template:z.string().optional(),monorepo:z.boolean().optional(),existingConfig:z.record(z.unknown()).optional(),installStyleIndex:z.boolean().default(true),registryBaseConfig:c.deepPartial().optional(),menuColor:z.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:z.enum(["subtle","bold"]).optional(),iconLibrary:z.string().optional()});function as(e,t){return t.rtl?e.searchParams.set("rtl","true"):t.rtl===false&&e.searchParams.delete("rtl"),t.pointer?e.searchParams.set("pointer","true"):t.pointer===false&&e.searchParams.delete("pointer"),e}var yn=new Command().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, radix, aria)").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.",true).option("-d, --defaults","use default configuration: --template=next --preset=base-nova",false).option("-f, --force","force overwrite of existing configuration.",false).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.",false).option("--css-variables","use css variables for theming.",true).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$1,t$1)=>{let r,o=[],n=()=>{r&&Me(r.replace(Ue,""));};process.on("exit",n);try{let i$1=ss.parse({...t$1,reinstall:t$1.reinstall,cwd:j__default.resolve(t$1.cwd)}),s$1=new Map(Object.entries(Y)),l;if(i$1.defaults&&(i$1.template=i$1.template||"next",i$1.base=i$1.base||"base",i$1.reinstall=i$1.reinstall??!1),i$1.template&&!(i$1.template in X)&&(f.error(`Invalid template: ${e.info(i$1.template)}. Available templates: ${Object.keys(X).map(g=>e.info(g)).join(", ")}.`),f.break(),process.exit(1)),typeof i$1.preset=="string"&&!N(i$1.preset)&&!t(i$1.preset)){let g=Array.from(s$1.keys());s$1.has(i$1.preset)||(f.error(`Invalid preset: ${e.info(i$1.preset)}. Available presets: ${g.join(", ")}`),f.break(),process.exit(1));}let c=i$1.cwd,m=L.existsSync(j__default.resolve(c,"components.json"));if(!i$1.monorepo&&!m&&await g(c)){let g=await Aa$1(c);if(!g||g.framework.name==="manual"){let h$1=await h(c);h$1.length>0&&(i("init",h$1),process.exit(1));}}if(m&&!i$1.force){let{overwrite:g}=await de({type:"confirm",name:"overwrite",message:`A ${e.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});g||(f.info(` To start over, remove the ${e.info("components.json")} file and run ${e.info("init")} again.`),f.break(),process.exit(1)),i$1.force=!0;}let d;if(m){try{d=await L.readJson(j__default.resolve(c,"components.json"));}catch{f.warn(`Could not parse the existing ${e.info("components.json")}. Unable to detect the current base.`);}d&&(i$1.existingConfig=d);let g=i$1.reinstall;if(g===void 0){let{reinstall:h}=await de({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});g=h;}if(g&&(o=await Da$1(c),o.length)){f.break(),f.log(" The following components will be re-installed and overwritten:");for(let h=0;h<o.length;h+=8)f.log(` - ${o.slice(h,h+8).join(", ")}`);f.break();}}if(i$1.preset===void 0&&e$1.length===0&&!i$1.defaults){let g=L.existsSync(j__default.resolve(c,"package.json"));if(!i$1.template&&!g){let{template:h}=await de({type:"select",name:"template",message:"Select a template",choices:Object.entries(X).map(([w,k])=>({title:k.title,value:w,description:k.description,disabled:i$1.monorepo&&w==="laravel"}))});h||process.exit(1),i$1.template=h;}if(!i$1.template&&g){let h=await Aa$1(c),w=_e(h?.framework.name);w&&(i$1.template=w);}if(i$1.template==="laravel"&&!g&&(f.break(),f.log(` Please create a new app with ${e.info("laravel new --react")} first then run ${e.info("shadcn init")}.`),f.log(` See ${e.info(`${a$1}/docs/installation/laravel`)} for more information.`),f.break(),process.exit(0)),i$1.monorepo===void 0&&!g&&i$1.template&&X[i$1.template]?.monorepo){let{monorepo:h}=await de({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});i$1.monorepo=h;}i$1.base||(i$1.base=await De()),i$1.preset=!0;}if(i$1.preset!==void 0){let g=i$1.preset===!0?!0:i$1.preset;if(g===!0){let h=await Ye({rtl:i$1.rtl??!1,template:i$1.template,base:i$1.base,pointer:i$1.pointer});e$1=[h.url,...e$1],l=h.base;}if(typeof g=="string"){let h;if(N(g)){let w=new URL(g);as(w,i$1),w.pathname==="/init"&&g.startsWith(a$1)&&w.searchParams.set("track","1"),h=w.toString();let k=w.searchParams.get("base");l=b(k)?k:void 0;}else if(t(g)){let w=s(g);w||(f.error(`Invalid preset code: ${e.info(g)}`),f.break(),process.exit(1)),h=fe({...w,base:"base",rtl:i$1.rtl??!1},{template:i$1.template,preset:g,pointer:i$1.pointer}),l=void 0;}else {let w=s$1.get(g);if(!w)throw new Error(`Unknown preset: ${g}`);h=fe({...w,base:i$1.base??"base",rtl:i$1.rtl??w.rtl},{template:i$1.template,pointer:i$1.pointer}),l=void 0;}e$1=[h,...e$1];}}let p=i$1.base??l??(typeof d?.style=="string"?Z(d.style):void 0),u=m&&!d;if(!p)if(e$1.length>0&&!u)p="base";else {let g=await De();p=g,i$1.base=g;}if(i$1.defaults&&!e$1.some(N)&&(e$1=[fe({...Y.nova,base:p,rtl:i$1.rtl??!1},{template:i$1.template,pointer:i$1.pointer}),...e$1]),e$1.length>0&&N(e$1[0])){let g=new URL(e$1[0]);g.searchParams.set("base",p),e$1[0]=g.toString();}if(d?.style){let g=await ms(d.style,p);if(g!==p&&(p=g,e$1.length>0&&N(e$1[0]))){let h=new URL(e$1[0]);h.searchParams.set("base",g),e$1[0]=h.toString();}}if(o.length&&(e$1=[...e$1,...o]),i$1.components=e$1,await Na$1(i$1.cwd),e$1.length>0){let g=j__default.resolve(c,"components.json");m&&(r=qe(g)??void 0,r||f.warn(`Could not back up ${e.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:w,url:k}=await Ce(e$1[0],c,{registries:d?.registries});e$1[0]=k,w||(i$1.installStyleIndex=!1),h&&(i$1.registryBaseConfig=h);}await Be(i$1),f.break(),f.log(`Project initialization completed.
88
+ You may now add components.`),process.removeListener("exit",n),Xe(j__default.resolve(c,"components.json")),f.break();}catch(i){process.removeListener("exit",n),n(),f.break(),ia$1(i);}finally{Q();}});async function Be(e$1){let t,r,o,n=e$1.template,i=n?ve(X[n],{monorepo:e$1.monorepo}):void 0;if(e$1.monorepo&&i?.init&&L.existsSync(j__default.resolve(e$1.cwd,"package.json")))t=await Aa$1(e$1.cwd);else if(e$1.skipPreflight)t=await Aa$1(e$1.cwd);else {let C=await Yo(e$1);if(C.errors["1"]){let{projectPath:O,template:H}=await At(e$1);O||process.exit(1),e$1.cwd=O,e$1.isNewProject=true,o=H,t=await Aa$1(e$1.cwd);}else t=C.projectInfo;}r=await Ba$1(e$1.cwd,t);let l=o??n,c=l?ve(X[l],{monorepo:e$1.monorepo}):void 0,m=[...e$1.installStyleIndex?["index"]:[],...e$1.components??[],...c?["button"]:[]],d=o?c?.postInit:void 0;if(c?.init){let C=await c.init({projectPath:e$1.cwd,components:m,registryBaseConfig:e$1.registryBaseConfig,rtl:e$1.rtl??false,menuColor:e$1.menuColor,menuAccent:e$1.menuAccent,iconLibrary:e$1.iconLibrary,silent:e$1.silent});return d&&await d({projectPath:e$1.cwd}),C}let p=r?await ls(r,e$1):await cs(await W(e$1.cwd));if(!e$1.yes){let{proceed:C}=await de({type:"confirm",name:"proceed",message:`Write configuration to ${e.info("components.json")}. Proceed?`,initial:true});C||process.exit(1);}let u=await X$1(e$1.cwd,p),{discoveredRegistries:g,packageJsonRegistries:h}=await U(m,u,{silent:true,writeFile:false});Object.keys(g).length>0&&(p.registries={...p.registries,...g});let w=C("Writing components.json.").start(),k=j__default.resolve(e$1.cwd,"components.json"),b=`${k}${Ue}`,S=(C,O)=>{let{registries:H,...Ge}=Qo(C,O);return {...Ge,registries:H}};if(L.existsSync(b)){let C=await L.readJson(b);e$1.force?C.registries&&(p.registries={...C.registries,...p.registries||{}}):p=S(C,p);}e$1.registryBaseConfig&&(p=S(p,e$1.registryBaseConfig)),e$1.rtl!==void 0&&(p.rtl=e$1.rtl),p.registries=Object.fromEntries(Object.entries(p.registries||{}).filter(([C])=>!Object.keys(b$1).includes(C))),await promises.writeFile(k,`${JSON.stringify(p,null,2)}
89
+ `,"utf8"),w.succeed();let v=await X$1(e$1.cwd,p);Object.keys(h).length>0&&(v.registries={...v.registries,...h});let F=await Y$1(v);if(F){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 O of Object.keys(F)){let H=F[O];if(H.resolvedPaths.cwd===v.resolvedPaths.cwd)continue;let Ge=j__default.resolve(H.resolvedPaths.cwd,"components.json");if(L.existsSync(Ge)){let zi=await L.readJson(Ge);await L.writeJson(Ge,{...zi,...C},{spaces:2});}}}return V.clearCaches(),await Ma$1(m,v,{overwrite:true,overwriteCssVars:e$1.reinstall||void 0,silent:e$1.silent,isNewProject:e$1.isNewProject||t?.framework.name==="next-app"}),d&&await d({projectPath:e$1.cwd}),v}async function cs(e$1=null){let[t,r]=await Promise.all([pa(),ra$1()]);f.info("");let o=await de([{type:"toggle",name:"typescript",message:`Would you like to use ${e.info("TypeScript")} (recommended)?`,initial:e$1?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${e.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 ${e.info("base color")}?`,choices:r.map(s=>({title:s.label,value:s.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${e.info("global CSS")} file?`,initial:e$1?.tailwind.css??T$1},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${e.info("CSS variables")} for theming?`,initial:e$1?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${e.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${e.info("tailwind.config.js")} located?`,initial:e$1?.tailwind.config??U$1},{type:"text",name:"components",message:`Configure the import alias for ${e.info("components")}:`,initial:e$1?.aliases.components??R},{type:"toggle",name:"rsc",message:`Are you using ${e.info("React Server Components")}?`,initial:e$1?.rsc??true,active:"yes",inactive:"no"}]);o.style||process.exit(1);let n=e$1&&e$1.aliases.components===o.components?e$1.aliases:void 0,i=un(o.components,n);return c.parse({$schema:"https://ui.shadcn.com/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 ls(e$1,t){let r=e$1.style,o="neutral",n=e$1.tailwind.cssVariables,i=e$1.iconLibrary??"lucide";if(!t.defaults){let[s,l]=await Promise.all([pa(),Ca$1(e$1)]);r=(await de([{type:l==="v4"||r?null:"select",name:"style",message:`Which ${e.info("style")} would you like to use?`,choices:s.map(m=>({title:m.name==="new-york"?"New York (Recommended)":m.label,value:m.name})),initial:0}])).style??r??"new-york";}return n=t.cssVariables,c.parse({$schema:e$1?.$schema,style:r,tailwind:{...e$1?.tailwind,baseColor:o,cssVariables:n},rsc:e$1?.rsc,tsx:e$1?.tsx,iconLibrary:i,rtl:t.rtl??e$1?.rtl??false,aliases:e$1?.aliases})}async function ms(e$1,t){let r=Z(e$1);if(t===r)return t;f.warn(` You are switching from ${e.info(r)} to ${e.info(t)}.`),f.warn(` Components outside the ${e.info("ui")} directory that depend on ${e.info(r)} primitives may need manual updates.`),f.break();let{proceed:o}=await de({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:false});return o?t:r}async function kn(e$1){let t={};if(!L.existsSync(e$1.cwd)||!L.existsSync(j__default.resolve(e$1.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!L.existsSync(j__default.resolve(e$1.cwd,"components.json"))){if(await g(e$1.cwd)){let r=await h(e$1.cwd);r.length>0&&(i("add [component]",r),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await W(e$1.cwd);return {errors:t,config:r}}catch{f.break(),f.error(`An invalid ${e.info("components.json")} file was found at ${e.info(e$1.cwd)}.
90
+ Before you can add components, you must create a valid ${e.info("components.json")} file by running the ${e.info("init")} command.`),f.error(`Learn more at ${e.info(`${a$1}/docs/components-json`)}.`),f.break(),process.exit(1);}}async function Cn(e,t,r={}){let o={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return o;let n=await ea$1(e,$(t));if(!n)throw new Error("Failed to fetch components from registry.");r.skipFonts||(n=await Ka$1(n,t));let i=Ea([n]);return o.dependencies=Array.from(new Set(n.dependencies??[])),o.devDependencies=Array.from(new Set(n.devDependencies??[])),o.docs=n.docs??null,await ds(n,t,o,r,i),await us(n,t,o,r),gs(n,t,o),r.skipFonts||hs(n,o),o}async function ds(e,t,r,o,n){let i=e.files;if(!i?.length)return;let[s,l]=await Promise.all([Aa$1(t.resolvedPaths.cwd),t.tailwind.baseColor?sa(t.tailwind.baseColor):Promise.resolve(void 0)]),c;try{c=loadConfig(t.resolvedPaths.cwd);}catch{c={resultType:"failed"};}let m=new Project({compilerOptions:{}}),d=L$1(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 g=J(u,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name,commonRoot:K(i.map(C=>C.path),u.path),fileIndex:p});if(!g)continue;t.tsx||(g=g.replace(/\.tsx?$/,C=>C===".tsx"?".jsx":".js"));let h=existsSync(g),w=j__default.relative(t.resolvedPaths.cwd,g),k=u.type==="registry:file"||u.type==="registry:item",b=B(g)||k?u.content:await H({filename:u.path,raw:u.content,config:t,baseColor:l,transformJsx:!t.tsx,isRemote:false,supportedFontMarkers:n},[D,E,a$2,G,c$3,g$1,I,d$1,f$1,F]),S=B(g)||k?b:await M({config:t,content:b,filePaths:d,project:m,projectInfo:s,resolvedPath:g,tsConfig:c}),v="create",F$1;h&&(F$1=await promises.readFile(g,"utf-8"),A(F$1,S)?v="skip":v="overwrite"),r.files.push({path:w,action:v,content:S,...v==="overwrite"&&{existingContent:F$1},type:u.type??"registry:ui"});}}async function us(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,l=existsSync(s),c=j__default.relative(t.resolvedPaths.cwd,s),m=l?await promises.readFile(s,"utf8"):"",d=m;i&&(d=await Ga$1(d,e.cssVars,t,{overwriteCssVars:o.overwriteCssVars})),n&&(d=await Ia$1(d,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:c,content:d,...l&&{existingContent:m},action:l?"update":"create",cssVarsCount:p};}function gs(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let o=j__default.join(t.resolvedPaths.cwd,".env.local"),n=existsSync(o),i=j__default.relative(t.resolvedPaths.cwd,o);r.envVars={path:i,variables:e.envVars,action:n?"update":"create"};}function hs(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});}var ue=5,ks=dim("\u250C"+"\u2500".repeat(46)),bs=dim("\u2514"+"\u2500".repeat(46)),Cs={create:"+",overwrite:"~",skip:"="},xs={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function Qe(e){return e==="create"?green(e):e==="overwrite"||e==="update"?yellow(e):dim(e)}function et(e){return `${bold("\u250C")} ${bold(`shadcn add ${e.join(", ")}`)} ${dim("(dry run)")}`}function Rn(e,t){return e===t||e.includes(t)||e.endsWith(t)}function Se(e,t,r=o=>o){e.push(`${dim("\u2502")} ${ks}`);for(let o of t)e.push(`${dim("\u2502")} ${dim("\u2502")} ${r(o)}`);e.push(`${dim("\u2502")} ${bs}`);}function Sn(e,t,r={}){return r.diff?typeof r.diff=="string"?Rs(e,t,r.diff):Ss(e,t):r.view?typeof r.view=="string"?Ps(e,t,r.view):Is(e,t):vs(e,t)}function vs(e,t){let r=[];r.push(et(t)),r.push(dim("\u2502")),$s(e,r),xn("Dependencies",e.dependencies,r),xn("Dev Dependencies",e.devDependencies,r),Es(e,r),js(e,r),Ts(e,r);let o=e.files.filter(i=>i.action==="overwrite").length;o>0&&(r.push(yellow(`\u26A0 ${o} ${o===1?"file":"files"} will be overwritten.`)),r.push(dim("\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(`${dim("\u2502")} ${dim(n.join(", "))}`),r.push(dim("\u2502"))),r.push(`${dim("\u2502")} ${dim("Run with --diff to view changes.")}`),r.push(`${dim("\u2502")} ${dim("Run with --view to view file contents.")}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
91
+ `)}function Rs(e,t,r){let o=[];o.push(et(t)),o.push(dim("\u2502"));let n=Pn(e.files,r),i=e.css&&Rn(e.css.path,r);if(n.length===0&&!i)o.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),o.push(dim("\u2502"));else {for(let s of n)In(s,o);if(i&&e.css){if(o.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${Qe(e.css.action)}${dim(")")}`),e.css.action==="create"||!e.css.existingContent)Se(o,e.css.content.split(`
92
+ `),s=>green(`+${s}`));else {let s=$n(e.css.existingContent,e.css.content,e.css.path,{fullContext:true});Se(o,s);}o.push(dim("\u2502"));}}return o.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),o.join(`
93
+ `)}function Ss(e,t){let r=[];r.push(et(t)),r.push(dim("\u2502"));let o=e.files.slice(0,ue);if(o.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No changes.")}`),r.push(dim("\u2502"));else {for(let s of o)In(s,r);e.files.length>ue&&r.push(dim("\u2502"));}let n=e.files.length;return n>ue&&r.push(` ${dim(`Showing ${ue} of ${n} files. Use --diff <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
94
+ `)}function Is(e,t){let r=[];r.push(et(t)),r.push(dim("\u2502"));let o=e.files.slice(0,ue);if(o.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No files.")}`),r.push(dim("\u2502"));else {for(let s of o){let l=s.content.split(`
95
+ `);r.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${Qe(s.action)}${dim(")")} ${dim(`${l.length} lines`)}`),Se(r,l),r.push(dim("\u2502"));}e.files.length>ue&&r.push(dim("\u2502"));}let n=e.files.length;return n>ue&&r.push(` ${dim(`Showing ${ue} of ${n} files. Use --view <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
96
+ `)}function In(e,t){if(t.push(`${dim("\u251C")} ${bold(e.path)} ${dim("(")}${Qe(e.action)}${dim(")")}`),e.action==="skip")t.push(`${dim("\u2502")} ${dim("No changes.")}`);else if(e.action==="create")Se(t,e.content.split(`
97
+ `),r=>green(`+${r}`));else {let r=$n(e.existingContent,e.content,e.path);Se(t,r);}t.push(dim("\u2502"));}function Ps(e,t,r){let o=[];o.push(et(t)),o.push(dim("\u2502"));let n=Pn(e.files,r),i=e.css&&Rn(e.css.path,r);if(n.length===0&&!i)o.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),o.push(dim("\u2502"));else {for(let s of n){let l=s.content.split(`
98
+ `);o.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${Qe(s.action)}${dim(")")} ${dim(`${l.length} lines`)}`),Se(o,l),o.push(dim("\u2502"));}if(i&&e.css){let s=e.css.content.split(`
99
+ `);o.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${Qe(e.css.action)}${dim(")")} ${dim(`${s.length} lines`)}`),Se(o,s),o.push(dim("\u2502"));}}return o.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),o.join(`
100
+ `)}function $s(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(green(`+${r.create} new`)),r.overwrite>0&&o.push(yellow(`~${r.overwrite} overwrite`)),r.skip>0&&o.push(dim(`=${r.skip} skip`));let n=o.length>0?` ${o.join(dim(", "))}`:"";t.push(`${dim("\u251C")} ${bold("Files")} ${dim(`(${e.files.length})`)}${n}`);let i=Math.max(...e.files.map(s=>s.path.length));for(let s of e.files){let l=Cs[s.action],c=xs[s.action],m=" ".repeat(Math.max(1,i-s.path.length+2)),d=s.action==="create"?green:s.action==="overwrite"?yellow:dim,p=s.action==="skip"?dim(s.path):s.path;t.push(`${dim("\u2502")} ${d(l)} ${p}${m}${d(c)}`);}t.push(dim("\u2502"));}function xn(e,t,r){if(t.length){r.push(`${dim("\u251C")} ${bold(e)} ${dim(`(${t.length})`)}`);for(let o of t)r.push(`${dim("\u2502")} ${green("+")} ${o}`);r.push(dim("\u2502"));}}function Es(e,t){e.css&&(t.push(`${dim("\u251C")} ${bold("CSS")}`),e.css.cssVarsCount>0?t.push(`${dim("\u2502")} ${green("+")} ${e.css.cssVarsCount} CSS variables added to ${cyan(e.css.path)}`):t.push(`${dim("\u2502")} ${green("+")} Updated ${cyan(e.css.path)}`),t.push(dim("\u2502")));}function js(e,t){if(!e.envVars)return;let r=Object.keys(e.envVars.variables);t.push(`${dim("\u251C")} ${bold("Environment Variables")}`);for(let o of r)t.push(`${dim("\u2502")} ${green("+")} ${o}`);t.push(dim("\u2502"));}function Ts(e,t){if(e.fonts.length){t.push(`${dim("\u251C")} ${bold("Fonts")}`);for(let r of e.fonts)t.push(`${dim("\u2502")} ${green("+")} ${r.name} ${dim(`(${r.provider})`)}`);t.push(dim("\u2502"));}}function Pn(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 $n(e,t,r,o={}){if(Ls(e,t))return [dim(" Formatting-only changes (spacing, quotes, semicolons).")];let n=vn(e),i=vn(t),s=o.fullContext?Math.max(n.split(`
101
101
  `).length,i.split(`
102
102
  `).length):3,l=structuredPatch(`a/${r}`,`b/${r}`,n,i,"","",{context:s});if(!l.hunks.length)return [dim(" No changes.")];let c=[dim(`--- a/${r}`),dim(`+++ b/${r}`)],m=t.split(`
103
- `);for(let d of l.hunks){let{entries:p}=js(d,m);if(!p.some(k=>k.kind!=="context"))continue;let g=p.filter(k=>k.kind==="context").length,u=p.filter(k=>k.kind==="removed").length,w=p.filter(k=>k.kind==="added").length;c.push(cyan(`@@ -${d.oldStart},${g+u} +${d.newStart},${g+w} @@`));for(let k of p)c.push(k.formatted);}return c}function js(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 l=[];for(;n<e.lines.length&&e.lines[n].startsWith("+");)l.push(e.lines[n].slice(1)),n++;for(;n<e.lines.length&&e.lines[n].startsWith("\\");)n++;o=Ts(s,l,t,o,r);}else if(i.startsWith("+")){let s=t[o]??i.slice(1);r.push({kind:"added",formatted:green(`+${s}`)}),o++,n++;}else if(i.startsWith("\\"))n++;else {let s=t[o]??i.slice(1);r.push({kind:"context",formatted:dim(` ${s}`)}),o++,n++;}}return {entries:r,newLineIndex:o}}function Ts(e,t,r,o,n){if(As(e,t)){for(let c=0;c<t.length;c++){let m=r[o]??t[c];n.push({kind:"context",formatted:dim(` ${m}`)}),o++;}return o}let i=Ns(e),s=i.map(Lt),l=new Set;for(let c=0;c<t.length;c++){let m=r[o]??t[c],d=Lt(t[c]),p=s.findIndex((y,g)=>!l.has(g)&&y===d);if(p!==-1)l.add(p),n.push({kind:"context",formatted:dim(` ${m}`)});else {let y=s.findIndex((g,u)=>!l.has(u));if(y!==-1){l.add(y);let{oldHighlighted:g,newHighlighted:u}=Fs(i[y],m);n.push({kind:"removed",formatted:g}),n.push({kind:"added",formatted:u});}else n.push({kind:"added",formatted:green(`+${m}`)});}o++;}for(let c=0;c<i.length;c++)l.has(c)||n.push({kind:"removed",formatted:red(`-${i[c]}`)});return o}function kn(e){return e.split(`
103
+ `);for(let d of l.hunks){let{entries:p}=Ns(d,m);if(!p.some(k=>k.kind!=="context"))continue;let g=p.filter(k=>k.kind==="context").length,h=p.filter(k=>k.kind==="removed").length,w=p.filter(k=>k.kind==="added").length;c.push(cyan(`@@ -${d.oldStart},${g+h} +${d.newStart},${g+w} @@`));for(let k of p)c.push(k.formatted);}return c}function Ns(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 l=[];for(;n<e.lines.length&&e.lines[n].startsWith("+");)l.push(e.lines[n].slice(1)),n++;for(;n<e.lines.length&&e.lines[n].startsWith("\\");)n++;o=Fs(s,l,t,o,r);}else if(i.startsWith("+")){let s=t[o]??i.slice(1);r.push({kind:"added",formatted:green(`+${s}`)}),o++,n++;}else if(i.startsWith("\\"))n++;else {let s=t[o]??i.slice(1);r.push({kind:"context",formatted:dim(` ${s}`)}),o++,n++;}}return {entries:r,newLineIndex:o}}function Fs(e,t,r,o,n){if(Ds(e,t)){for(let c=0;c<t.length;c++){let m=r[o]??t[c];n.push({kind:"context",formatted:dim(` ${m}`)}),o++;}return o}let i=Os(e),s=i.map(Dt),l=new Set;for(let c=0;c<t.length;c++){let m=r[o]??t[c],d=Dt(t[c]),p=s.findIndex((u,g)=>!l.has(g)&&u===d);if(p!==-1)l.add(p),n.push({kind:"context",formatted:dim(` ${m}`)});else {let u=s.findIndex((g,h)=>!l.has(h));if(u!==-1){l.add(u);let{oldHighlighted:g,newHighlighted:h}=As(i[u],m);n.push({kind:"removed",formatted:g}),n.push({kind:"added",formatted:h});}else n.push({kind:"added",formatted:green(`+${m}`)});}o++;}for(let c=0;c<i.length;c++)l.has(c)||n.push({kind:"removed",formatted:red(`-${i[c]}`)});return o}function vn(e){return e.split(`
104
104
  `).map(t=>{let r=t.match(/^(\s*)/)?.[1]??"",o=t.slice(r.length);return r+o.replace(/['"]/g,'"').replace(/;$/g,"")}).join(`
105
- `)}function Ns(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 Fs(e,t){let r=diffWords(e,t),o="-",n="+";for(let i of r)i.added?n+=bold(green(i.value)):i.removed?o+=bold(red(i.value)):(o+=red(i.value),n+=green(i.value));return {oldHighlighted:o,newHighlighted:n}}function Lt(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function Os(e,t){let r=o=>o.split(`
106
- `).map(Lt).filter(n=>n.length>0).join(" ");return r(e)===r(t)}function As(e,t){let r=o=>o.map(Lt).filter(n=>n.length>0).join(" ");return r(e)===r(t)}async function In(e,t){let r=T__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await Ie__default.stat(r)).isFile())return;let[o]=await ka$1([e],{config:t});if(!o?.meta?.importSpecifier||!o?.meta?.moduleSpecifier)return;let n=`import { ${o?.meta?.importSpecifier} } from "${o.meta.moduleSpecifier}"
105
+ `)}function Os(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 As(e,t){let r=diffWords(e,t),o="-",n="+";for(let i of r)i.added?n+=bold(green(i.value)):i.removed?o+=bold(red(i.value)):(o+=red(i.value),n+=green(i.value));return {oldHighlighted:o,newHighlighted:n}}function Dt(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function Ls(e,t){let r=o=>o.split(`
106
+ `).map(Dt).filter(n=>n.length>0).join(" ");return r(e)===r(t)}function Ds(e,t){let r=o=>o.map(Dt).filter(n=>n.length>0).join(" ");return r(e)===r(t)}async function jn(e,t){let r=j__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await Ie__default.stat(r)).isFile())return;let[o]=await ka$1([e],{config:t});if(!o?.meta?.importSpecifier||!o?.meta?.moduleSpecifier)return;let n=`import { ${o?.meta?.importSpecifier} } from "${o.meta.moduleSpecifier}"
107
107
 
108
108
  export default function Page() {
109
109
  return <${o?.meta?.importSpecifier} />
110
- }`;await Ie__default.writeFile(r,n,"utf8");}var Vs=z.object({components:z.array(z.string()).optional(),yes:z.boolean(),overwrite:z.boolean(),cwd:z.string(),all:z.boolean(),path:z.string().optional(),silent:z.boolean(),dryRun:z.boolean(),diff:z.union([z.string(),z.literal(true)]).optional(),view:z.union([z.string(),z.literal(true)]).optional()}),$n=new Command().name("add").description("add a component to your project").argument("[components...]","item addresses to add").option("-y, --yes","skip confirmation prompt.",false).option("-o, --overwrite","overwrite existing files.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",false).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",false).option("--dry-run","preview changes without writing files.",false).option("--diff [path]","show diff for a file.").option("--view [path]","show file contents.").action(async(e$1,t)=>{try{let r=Vs.parse({components:e$1,...t,cwd:T__default.resolve(t.cwd)});await Ma$1(r.cwd);let o=r.dryRun||r.diff||r.view,n=await W(r.cwd),i=!!n;n||(n=_({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let s=!1;if(e$1.length>0){let{config:b,newRegistries:R}=await B(e$1,n,{silent:r.silent,writeFile:!1});n=b,s=R.length>0;}let l=await za$1(r.cwd),{base:c}=c$1(n.style);i&&l?.tailwindVersion==="v4"&&Dt(e$1,c);let m,d=!0;if(e$1.length>0&&(i||!c$2.some(b=>b.name===e$1[0]))){let[b]=await ka$1([e$1[0]],{config:n});if(m=b?.type,d=m!=="registry:theme"&&m!=="registry:style"&&m!=="registry:base",O(b)&&!o){await La$1(e$1,n,r);return}if(!r.yes&&!o&&(m==="registry:style"||m==="registry:theme")){f.break();let{confirm:R}=await de({type:"confirm",name:"confirm",message:e.warn(`You are about to install a new ${m.replace("registry:","")}.
111
- Existing CSS variables and components will be overwritten. Continue?`)});R||(f.break(),f.log("Installation cancelled."),f.break(),process.exit(1));}}r.components?.length||(r.components=await Ms(r,n.style)),!e$1.length&&l?.tailwindVersion==="v4"&&Dt(r.components??[],c);let{errors:y,config:g}=await gn(r),u=!1;if(y["3"]){let{proceed:b}=await de({type:"confirm",name:"proceed",message:`You need to create a ${e.info("components.json")} file to add components. Proceed?`,initial:!0});b||(f.break(),process.exit(1));let R=_e(l?.framework.name),S=await De();Dt(r.components??[],S);let{url:x}=await Ke({rtl:!1,base:S,template:R}),{registryBaseConfig:j,installStyleIndex:O,url:X}=await Ce(x,r.cwd);g=await Be({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!s,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:O,components:[X,...r.components??[]],registryBaseConfig:j}),u=!0;}let w=!1;if(y["1"]){let b=await De();Dt(r.components??[],b);let{projectPath:R,template:S}=await Ot({cwd:r.cwd,force:r.overwrite,components:r.components});R||(f.break(),process.exit(1)),r.cwd=R;let{url:x}=await Ke({rtl:!1,base:b,template:S}),{registryBaseConfig:j,installStyleIndex:O,url:X}=await Ce(x,r.cwd);g=await Be({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!s&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:O,components:[X,...r.components??[]],registryBaseConfig:j}),u=!0,w=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//);}if(!g)throw new Error(`Failed to read config at ${e.info(r.cwd)}.`);let{config:k}=await B(r.components,g,{silent:r.silent||s,writeFile:!o});if(g=k,o){let b=C("Resolving items.",{silent:r.silent}).start(),R=await yn(r.components,g,{overwrite:r.overwrite});b.stop(),f.log(Cn(R,r.components,{diff:r.diff,view:r.view}));return}u||await La$1(r.components,g,r),w&&await In(r.components[0],g);}catch(r){f.break(),ia(r);}finally{Q();}});async function Ms(e,t){let r=await na();if(!r)return f.break(),ia(new Error("Failed to fetch registry index.")),[];let{base:o}=c$1(t);if(e.all)return r.map(s=>s.name).filter(s=>Pn(s,o));if(e.components?.length)return e.components;let{components:n}=await de({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:r.filter(s=>s.type==="registry:ui"&&Pn(s.name,o)).map(s=>({title:s.name,value:s.name,selected:e.all?true:e.components?.includes(s.name)}))});n?.length||(f.warn("No components selected. Exiting."),f.info(""),process.exit(1));let i=z.array(z.string()).safeParse(n);return i.success?i.data:(f.error(""),ia(new Error("Something went wrong. Please try again.")),[])}function Dt(e$1,t){let r=c$2.filter(o=>e$1.includes(o.name)&&En(o.name,t));r.length&&(f.break(),r.forEach(o=>{f.warn(e.warn(o.message));}),f.break(),process.exit(1));}function En(e,t){let r=c$2.find(o=>o.name===e);return !!r&&(!r.availableIn||!t||!r.availableIn.includes(t))}function Pn(e,t){if(En(e,t))return false;let r=d.find(o=>o.name===e);return !r||!t||!r.hiddenIn.includes(t)}async function jn(e$1){let t={};if(!L.existsSync(e$1.cwd)||!L.existsSync(T__default.resolve(e$1.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!L.existsSync(T__default.resolve(e$1.cwd,"components.json"))){if(await g(e$1.cwd)){let r=await h(e$1.cwd),o=[];for(let n of r){let i=await za$1(T__default.resolve(e$1.cwd,n.name));i?.framework&&i.framework.name!=="manual"&&o.push(n);}o.length>0&&(i("apply --preset <preset>",o,{cwdFlag:"-c"}),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await W(e$1.cwd);return {errors:t,config:r}}catch{f.break(),f.error(`An invalid ${e.info("components.json")} file was found at ${e.info(e$1.cwd)}.
112
- Before you can apply a preset, you must create a valid ${e.info("components.json")} file by running the ${e.info("init")} command.`),f.error(`Learn more at ${e.info(`${a$1}/docs/components-json`)}.`),f.break(),process.exit(1);}}var Ws=z.object({cwd:z.string(),positionalPreset:z.string().optional(),preset:z.string().optional(),only:z.union([z.boolean(),z.string()]).optional(),yes:z.boolean(),silent:z.boolean()}),Fn=["theme","font"],Je=class extends Error{constructor(t){super(t),this.name="ApplyOnlyError";}},_t=class extends Error{constructor(t){super(t),this.name="ApplyWorkspaceSyncError";}},On=new Command().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.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e$1,t)=>{try{let r=Ws.parse({...t,cwd:T__default.resolve(t.cwd),positionalPreset:e$1}),o=Js(r),n=Tn(r.only);Gs({preset:o,only:n});let i=await jn(r);i.errors["1"]&&(f.break(),f.error(`The ${e.info("apply")} command only works in an existing project.`),f.error(`Run ${e.info(Nn(o))} first.`),f.break(),process.exit(1)),i.errors["3"]&&(f.break(),f.error(`No ${e.info("components.json")} found at ${e.info(r.cwd)}.`),f.error(`Run ${e.info(Nn(o))} first.`),f.break(),process.exit(1));let s=i.config;s||process.exit(1);let l=s.rtl??!1,c=await qs(r.cwd);if(!o){let w=cr({command:"init",template:c,base:Z(s.style),rtl:l});await lr({createUrl:w,followUp:`Then run ${e.info("shadcn apply --preset <preset>")} with the preset code or preset URL from ui.shadcn.com.`,prompt:!r.yes}),process.exit(0);}Ys(o);let m=n??Tn(zs(o)),d=!m,p=d?await Ca$1(r.cwd):[];if(!r.yes){if(f.break(),m?f.warn(e.warn("Applying the selected preset parts will update your project configuration and styles.")):f.warn(e.warn("Applying a new preset will overwrite existing UI components, fonts, and CSS variables.")),f.warn("Commit or stash your changes before continuing so you can easily go back."),d)if(f.break(),f.log(" The following components will be re-installed:"),p.length)for(let k=0;k<p.length;k+=8)f.log(` - ${p.slice(k,k+8).join(", ")}`);else f.log(" - No installed UI components were detected.");f.break();let{proceed:w}=await de({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});w||(f.break(),process.exit(1));}await Ma$1(r.cwd);let y=Z(s.style),g=Qs(o,y,{template:c,rtl:l,only:m?.join(",")}),u=await pn(T__default.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:w,installStyleIndex:k,url:b}=await Ce(g,r.cwd,{registries:s.registries}),R=Ks({registryBaseConfig:w,existingConfig:s,only:m});return await Be({cwd:r.cwd,yes:!0,force:!1,reinstall:d,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:k,registryBaseConfig:R,existingConfig:s,components:[b,...p]})});await Xs(u,{only:m}),f.break(),f.log("Preset applied successfully."),f.break();}catch(r){if(r instanceof Je){for(let o of r.message.split(`
113
- `))f.error(o);f.break(),process.exit(1);}r instanceof Ve&&(f.error(`Could not back up ${e.info("components.json")}. Aborting.`),f.break(),process.exit(1)),r instanceof _t&&(f.error(r.message),f.break(),process.exit(1)),f.break(),ia(r);}finally{Q();}});function Js(e$1){let t=e$1.positionalPreset?.trim(),r=e$1.preset?.trim();return t&&r&&t!==r&&(f.error(`Received two different preset values. Use either the positional preset or ${e.info("--preset")}, or pass the same value to both.`),f.break(),process.exit(1)),r??t}function zs(e){if(!N$1(e))return;let t=new URL(e);if(t.pathname==="/init")return t.searchParams.get("only")??void 0}function Tn(e){if(!(e===void 0||e===false)){if(e===true)throw new Je(["Missing value for --only.",`Use one or more of: ${Fn.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
114
- `));return Hs(e)}}function Hs(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 Je([`Invalid value for --only: ${e}.`,`Use one or more of: ${Fn.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
115
- `));return Array.from(new Set(r.map(n=>t[n])))}function Gs(e){if(!(!e.only||e.preset))throw new Je(["Missing preset for --only.","Use: shadcn apply <preset> --only theme,font."].join(`
116
- `))}function Ks(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 Ys(e$1){if(N$1(e$1)||t(e$1))return;let t$1=Object.keys(K);t$1.includes(e$1)||(f.error(`Invalid preset: ${e.info(e$1)}.
110
+ }`;await Ie__default.writeFile(r,n,"utf8");}var Us=z.object({components:z.array(z.string()).optional(),yes:z.boolean(),overwrite:z.boolean(),cwd:z.string(),all:z.boolean(),path:z.string().optional(),silent:z.boolean(),dryRun:z.boolean(),diff:z.union([z.string(),z.literal(true)]).optional(),view:z.union([z.string(),z.literal(true)]).optional()}),Nn=new Command().name("add").description("add a component to your project").argument("[components...]","item addresses to add").option("-y, --yes","skip confirmation prompt.",false).option("-o, --overwrite","overwrite existing files.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",false).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",false).option("--dry-run","preview changes without writing files.",false).option("--diff [path]","show diff for a file.").option("--view [path]","show file contents.").action(async(e$1,t)=>{try{let r=Us.parse({components:e$1,...t,cwd:j__default.resolve(t.cwd)});await Na$1(r.cwd);let o=r.dryRun||r.diff||r.view,n=await W(r.cwd),i=!!n;n||(n=_({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let s=!1;if(e$1.length>0){let{config:b,newRegistries:S}=await U(e$1,n,{silent:r.silent,writeFile:!1});n=b,s=S.length>0;}let l=await Aa$1(r.cwd),{base:c}=c$1(n.style);i&&l?.tailwindVersion==="v4"&&_t(e$1,c);let m,d=!0;if(e$1.length>0&&(i||!c$2.some(b=>b.name===e$1[0]))){let[b]=await ka$1([e$1[0]],{config:n});if(m=b?.type,d=m!=="registry:theme"&&m!=="registry:style"&&m!=="registry:base",O(b)&&!o){await Ma$1(e$1,n,r);return}if(!r.yes&&!o&&(m==="registry:style"||m==="registry:theme")){f.break();let{confirm:S}=await de({type:"confirm",name:"confirm",message:e.warn(`You are about to install a new ${m.replace("registry:","")}.
111
+ Existing CSS variables and components will be overwritten. Continue?`)});S||(f.break(),f.log("Installation cancelled."),f.break(),process.exit(1));}}r.components?.length||(r.components=await Bs(r,n.style)),!e$1.length&&l?.tailwindVersion==="v4"&&_t(r.components??[],c);let{errors:u,config:g}=await kn(r),h=!1;if(u["3"]){let{proceed:b}=await de({type:"confirm",name:"proceed",message:`You need to create a ${e.info("components.json")} file to add components. Proceed?`,initial:!0});b||(f.break(),process.exit(1));let S=_e(l?.framework.name),v=await De();_t(r.components??[],v);let{url:F}=await Ye({rtl:!1,base:v,template:S}),{registryBaseConfig:C,installStyleIndex:O,url:H}=await Ce(F,r.cwd);g=await Be({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!s,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:O,components:[H,...r.components??[]],registryBaseConfig:C}),h=!0;}let w=!1;if(u["1"]){let b=await De();_t(r.components??[],b);let{projectPath:S,template:v}=await At({cwd:r.cwd,force:r.overwrite,components:r.components});S||(f.break(),process.exit(1)),r.cwd=S;let{url:F}=await Ye({rtl:!1,base:b,template:v}),{registryBaseConfig:C,installStyleIndex:O,url:H}=await Ce(F,r.cwd);g=await Be({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!s&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:O,components:[H,...r.components??[]],registryBaseConfig:C}),h=!0,w=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//);}if(!g)throw new Error(`Failed to read config at ${e.info(r.cwd)}.`);let{config:k}=await U(r.components,g,{silent:r.silent||s,writeFile:!o});if(g=k,o){let b=C("Resolving items.",{silent:r.silent}).start(),S=await Cn(r.components,g,{overwrite:r.overwrite});b.stop(),f.log(Sn(S,r.components,{diff:r.diff,view:r.view}));return}h||await Ma$1(r.components,g,r),w&&await jn(r.components[0],g);}catch(r){f.break(),ia$1(r);}finally{Q();}});async function Bs(e,t){let r=await oa();if(!r)return f.break(),ia$1(new Error("Failed to fetch registry index.")),[];let{base:o}=c$1(t);if(e.all)return r.map(s=>s.name).filter(s=>Tn(s,o));if(e.components?.length)return e.components;let{components:n}=await de({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:r.filter(s=>s.type==="registry:ui"&&Tn(s.name,o)).map(s=>({title:s.name,value:s.name,selected:e.all?true:e.components?.includes(s.name)}))});n?.length||(f.warn("No components selected. Exiting."),f.info(""),process.exit(1));let i=z.array(z.string()).safeParse(n);return i.success?i.data:(f.error(""),ia$1(new Error("Something went wrong. Please try again.")),[])}function _t(e$1,t){let r=c$2.filter(o=>e$1.includes(o.name)&&Fn(o.name,t));r.length&&(f.break(),r.forEach(o=>{f.warn(e.warn(o.message));}),f.break(),process.exit(1));}function Fn(e,t){let r=c$2.find(o=>o.name===e);return !!r&&(!r.availableIn||!t||!r.availableIn.includes(t))}function Tn(e,t){if(Fn(e,t))return false;let r=d.find(o=>o.name===e);return !r||!t||!r.hiddenIn.includes(t)}async function On(e$1){let t={};if(!L.existsSync(e$1.cwd)||!L.existsSync(j__default.resolve(e$1.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!L.existsSync(j__default.resolve(e$1.cwd,"components.json"))){if(await g(e$1.cwd)){let r=await h(e$1.cwd),o=[];for(let n of r){let i=await Aa$1(j__default.resolve(e$1.cwd,n.name));i?.framework&&i.framework.name!=="manual"&&o.push(n);}o.length>0&&(i("apply --preset <preset>",o,{cwdFlag:"-c"}),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await W(e$1.cwd);return {errors:t,config:r}}catch{f.break(),f.error(`An invalid ${e.info("components.json")} file was found at ${e.info(e$1.cwd)}.
112
+ Before you can apply a preset, you must create a valid ${e.info("components.json")} file by running the ${e.info("init")} command.`),f.error(`Learn more at ${e.info(`${a$1}/docs/components-json`)}.`),f.break(),process.exit(1);}}var zs=z.object({cwd:z.string(),positionalPreset:z.string().optional(),preset:z.string().optional(),only:z.union([z.boolean(),z.string()]).optional(),yes:z.boolean(),silent:z.boolean()}),Dn=["theme","font"],We=class extends Error{constructor(t){super(t),this.name="ApplyOnlyError";}},Vt=class extends Error{constructor(t){super(t),this.name="ApplyWorkspaceSyncError";}},_n=new Command().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.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e$1,t)=>{try{let r=zs.parse({...t,cwd:j__default.resolve(t.cwd),positionalPreset:e$1}),o=Hs(r),n=An(r.only);Ys({preset:o,only:n});let i=await On(r);i.errors["1"]&&(f.break(),f.error(`The ${e.info("apply")} command only works in an existing project.`),f.error(`Run ${e.info(Ln(o))} first.`),f.break(),process.exit(1)),i.errors["3"]&&(f.break(),f.error(`No ${e.info("components.json")} found at ${e.info(r.cwd)}.`),f.error(`Run ${e.info(Ln(o))} first.`),f.break(),process.exit(1));let s=i.config;s||process.exit(1);let l=s.rtl??!1,c=await Zs(r.cwd);if(!o){let w=mr({command:"init",template:c,base:Z(s.style),rtl:l});await fr({createUrl:w,followUp:`Then run ${e.info("shadcn apply --preset <preset>")} with the preset code or preset URL from ui.shadcn.com.`,prompt:!r.yes}),process.exit(0);}Xs(o);let m=n??An(Gs(o)),d=!m,p=d?await Da$1(r.cwd):[];if(!r.yes){if(f.break(),m?f.warn(e.warn("Applying the selected preset parts will update your project configuration and styles.")):f.warn(e.warn("Applying a new preset will overwrite existing UI components, fonts, and CSS variables.")),f.warn("Commit or stash your changes before continuing so you can easily go back."),d)if(f.break(),f.log(" The following components will be re-installed:"),p.length)for(let k=0;k<p.length;k+=8)f.log(` - ${p.slice(k,k+8).join(", ")}`);else f.log(" - No installed UI components were detected.");f.break();let{proceed:w}=await de({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});w||(f.break(),process.exit(1));}await Na$1(r.cwd);let u=Z(s.style),g=ta(o,u,{template:c,rtl:l,only:m?.join(",")}),h=await hn(j__default.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:w,installStyleIndex:k,url:b}=await Ce(g,r.cwd,{registries:s.registries}),S=qs({registryBaseConfig:w,existingConfig:s,only:m});return await Be({cwd:r.cwd,yes:!0,force:!1,reinstall:d,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:k,registryBaseConfig:S,existingConfig:s,components:[b,...p]})});await Qs(h,{only:m}),f.break(),f.log("Preset applied successfully."),f.break();}catch(r){if(r instanceof We){for(let o of r.message.split(`
113
+ `))f.error(o);f.break(),process.exit(1);}r instanceof Ve&&(f.error(`Could not back up ${e.info("components.json")}. Aborting.`),f.break(),process.exit(1)),r instanceof Vt&&(f.error(r.message),f.break(),process.exit(1)),f.break(),ia$1(r);}finally{Q();}});function Hs(e$1){let t=e$1.positionalPreset?.trim(),r=e$1.preset?.trim();return t&&r&&t!==r&&(f.error(`Received two different preset values. Use either the positional preset or ${e.info("--preset")}, or pass the same value to both.`),f.break(),process.exit(1)),r??t}function Gs(e){if(!N(e))return;let t=new URL(e);if(t.pathname==="/init")return t.searchParams.get("only")??void 0}function An(e){if(!(e===void 0||e===false)){if(e===true)throw new We(["Missing value for --only.",`Use one or more of: ${Dn.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
114
+ `));return Ks(e)}}function Ks(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 We([`Invalid value for --only: ${e}.`,`Use one or more of: ${Dn.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
115
+ `));return Array.from(new Set(r.map(n=>t[n])))}function Ys(e){if(!(!e.only||e.preset))throw new We(["Missing preset for --only.","Use: shadcn apply <preset> --only theme,font."].join(`
116
+ `))}function qs(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 Xs(e$1){if(N(e$1)||t(e$1))return;let t$1=Object.keys(Y);t$1.includes(e$1)||(f.error(`Invalid preset: ${e.info(e$1)}.
117
117
  Use one of the available presets: ${t$1.join(", ")}
118
- or build your own at ${e.info(`${a$1}/create`)}`),f.break(),process.exit(1));}async function qs(e){let t=await za$1(e);return _e(t?.framework.name)}async function Xs(e,t){if(t?.only&&!t.only.includes("theme"))return;let r=await Zs(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=T__default.resolve(i.resolvedPaths.cwd,"components.json");await L.pathExists(s)&&n.push({configPath:s,existingConfig:await L.readJson(s)});}try{for(let i of n)if(!Ye(i.configPath))throw new Ve(i.configPath);for(let i of n)await L.writeJson(i.configPath,{...i.existingConfig,...o,tailwind:{...i.existingConfig.tailwind,...o.tailwind}},{spaces:2});for(let i of n)qe(i.configPath);}catch(i){for(let s of [...n].reverse())Me(s.configPath);throw new _t(`Failed to sync linked workspace configs.${i instanceof Error?` ${i.message}`:""}`)}}async function Zs(e){let t=await Y$1(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 Qs(e$1,t$1,r={}){if(N$1(e$1)){let n=new URL(e$1);return n.pathname==="/init"&&e$1.startsWith(a$1)&&n.searchParams.set("track","1"),n.searchParams.set("base",t$1),n.searchParams.set("rtl",String(r.rtl??false)),r.only&&n.searchParams.set("only",r.only),n.toString()}if(t(e$1)){let n=s(e$1);return n||(f.error(`Invalid preset code: ${e.info(e$1)}`),f.break(),process.exit(1)),fe({...n,base:t$1,rtl:r.rtl??false},{preset:e$1,template:r.template,only:r.only})}let o=K[e$1];return fe({...o,base:t$1,rtl:r.rtl??o.rtl},{template:r.template,only:r.only})}function ea(e){return /[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function Nn(e){return e?`shadcn init --preset ${ea(e)}`:"shadcn init"}async function Dn(e$1){let t={},r={cwd:e$1.cwd,registryFile:T__default.resolve(e$1.cwd,e$1.registryFile),outputDir:T__default.resolve(e$1.cwd,e$1.outputDir)};return L.existsSync(r.registryFile)||(t["13"]=true),await L.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(f.break(),f.error(`The path ${e.info(r.registryFile)} does not exist.`)),f.break(),process.exit(1)),{errors:t,resolvePaths:r}}var oa=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string()}),_n=new Command().name("build").description("build components for a shadcn 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=oa.parse({cwd:T.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:o}=await Dn(r),n=await Pa(o.registryFile,{cwd:o.cwd}),i=n.registry,s=n.usesInclude?T.dirname(o.registryFile):o.cwd,l=Qa$1(n,s,o.cwd),c=C("Building registry...");for(let m of i.items){c.start(`Building ${m.name}...`);let d=await Ra$1(m,n,s,o.cwd),p=T.resolve(o.outputDir,`${d.name}.json`);await Ie.mkdir(T.dirname(p),{recursive:!0}),await Ie.writeFile(p,JSON.stringify(d,null,2));}n.usesInclude?await Ie.writeFile(T.resolve(o.outputDir,"registry.json"),JSON.stringify(l,null,2)):await Ie.copyFile(o.registryFile,T.resolve(o.outputDir,"registry.json")),c.succeed("Building registry.");}catch(r){f.break(),ia(r);}});var aa=z.object({component:z.string().optional(),yes:z.boolean(),cwd:z.string(),path:z.string().optional()}),Mn=new Command().name("diff").description("[DEPRECATED] Use `add [component] --diff` instead.").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e$1,t)=>{try{let r=aa.parse({component:e$1,...t}),o=T__default.resolve(r.cwd);existsSync(o)||(f.error(`The path ${o} does not exist. Please try again.`),process.exit(1));let n=await W(o);if(!n){if(await g(o)){let c=await h(o);c.length>0&&(i("diff [component]",c),process.exit(1));}f.warn(`Configuration is missing. Please run ${e.success("init")} to create a components.json file.`),process.exit(1);}let i$1=await na();if(i$1||(ia(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let c=n.resolvedPaths.components,m=i$1.filter(p=>{for(let y of p.files??[]){let g=T__default.resolve(c,typeof y=="string"?y:y.path);if(existsSync(g))return !0}return !1}),d=[];for(let p of m){let y=await Vn(p,n);y.length&&d.push({name:p.name,changes:y});}d.length||(f.info("No updates found."),process.exit(0)),f.info("The following components have updates available:");for(let p of d){f.info(`- ${p.name}`);for(let y of p.changes)f.info(` - ${y.filePath}`);}f.break(),f.info(`Run ${e.success("diff <component>")} to see the changes.`),process.exit(0);}let s=i$1.find(c=>c.name===r.component);s||(f.error(`The component ${e.success(r.component)} does not exist.`),process.exit(1));let l=await Vn(s,n);l.length||(f.info(`No updates found for ${r.component}.`),process.exit(0));for(let c of l)f.info(`- ${c.filePath}`),await ca(c.patch),f.info("");}catch(r){ia(r);}});async function Vn(e,t){let r=await ta(t.style,[e]),o=await ra(t.tailwind.baseColor),n=Da$1(r);if(!r)return [];let i=[];for(let s of r){let l=await ua(t,s);if(l)for(let c of s.files??[]){let m=T__default.resolve(l,typeof c=="string"?c:c.path);if(!existsSync(m))continue;let d=await promises.readFile(m,"utf8");if(typeof c=="string"||!c.content)continue;let p=await H({filename:c.path,raw:c.content,config:t,baseColor:o,supportedFontMarkers:n},[D,E,a$2,G,c$3,g$1,d$1,f$1,F]),y=diffLines(p,d);y.length>1&&i.push({filePath:m,patch:y});}}return i}async function ca(e$1){e$1.forEach(t=>{if(t)return t.added?process.stdout.write(e.success(t.value)):t.removed?process.stdout.write(e.error(t.value)):process.stdout.write(t.value)});}var Un="https://ui.shadcn.com",Bn=new Command().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: base, radix, or aria. defaults to project base.").option("--json","output as JSON.",false).action(async(e$1,t)=>{try{let r=T__default.resolve(t.cwd),o=await W(r),n=fa(t.base,o?.style),i=await na();i||(f.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let c of e$1){let m=i.find(p=>p.name===c);m||(f.error(`Component ${e.info(c)} not found in the shadcn registry.`),process.exit(1));let d=m.meta?.links?.[n];if(!d||Object.keys(d).length===0){f.warn(`No documentation links available for ${e.info(c)}.`);continue}s.push({component:c,base:n,links:pa(d)});}if(t.json){console.log(JSON.stringify({base:n,results:s},null,2));return}let l=Math.max(...s.flatMap(c=>Object.keys(c.links).map(m=>m.length)));for(let{component:c,links:m}of s){f.log(e.info(c));for(let[d,p]of Object.entries(m))f.log(` - ${d.padEnd(l+2)}${p}`);f.break();}}catch(r){ia(r);}});function fa(e,t){let r=e??Z(t);if(!b(r))throw new Error(`Invalid base: ${String(r)}. Expected one of: ${a.join(", ")}.`);return r}function pa(e){return Object.fromEntries(Object.entries(e).map(([t,r])=>[t,r.startsWith(Un)?`${a$1}${r.slice(Un.length)}`:r]))}var Wn=/@import\s+["']shadcn\/tailwind\.css["'];?\s*\n?/,ga=z.object({cwd:z.string(),yes:z.boolean(),silent:z.boolean()}),Jn=new Command().name("eject").description("inline shadcn/tailwind.css and remove the shadcn dependency").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-y, --yes","skip confirmation prompt.",false).option("-s, --silent","mute output.",false).action(async e=>{try{let t=ga.parse({cwd:T__default.resolve(e.cwd),yes:e.yes,silent:e.silent});await ha(t);}catch(t){ia(t);}});async function ha(e$1){if(!L.existsSync(T__default.resolve(e$1.cwd,"components.json"))){if(await g(e$1.cwd)){let d=await h(e$1.cwd);d.length>0&&(i("eject",d),process.exit(1));}f.break(),f.error(`No ${e.info("components.json")} found. Run ${e.info("shadcn init")} first.`),f.error(`Learn more at ${e.info(`${a$1}/docs/components-json`)}.`),f.break(),process.exit(1);}let t=await W(e$1.cwd);t?.resolvedPaths.tailwindCss||(f.break(),f.error("Could not resolve the Tailwind CSS file from components.json."),f.break(),process.exit(1));let r=t.resolvedPaths.tailwindCss,o=T__default.relative(e$1.cwd,r),n=await promises.readFile(r,"utf8");Wn.test(n)||(f.break(),f.error(`Could not find ${e.info('@import "shadcn/tailwind.css"')} in ${e.info(o)}.`),f.error("Nothing to eject."),f.break(),process.exit(1));let i$1=z$1(e$1.cwd,false),s=ya(i$1),l=ka(e$1.cwd),c=await promises.readFile(l,"utf8");if(e$1.silent||(f.break(),f.warn("This action is not reversible. Future shadcn CLI updates to tailwind.css will not apply automatically."),f.break()),!e$1.yes){f.log("This will:"),f.log(` - Inline ${e.info("shadcn/tailwind.css")} into ${e.info(o)}`),f.log(` - Remove the ${e.info("shadcn")} dependency`),f.break();let{proceed:d}=await de({type:"confirm",name:"proceed",message:"Proceed?",initial:false});d||process.exit(0);}let m=C(`Inlining ${e.info("shadcn/tailwind.css")}.`,{silent:e$1.silent})?.start();if(n=n.replace(Wn,()=>`/* ejected from shadcn@${s} */
118
+ or build your own at ${e.info(`${a$1}/create`)}`),f.break(),process.exit(1));}async function Zs(e){let t=await Aa$1(e);return _e(t?.framework.name)}async function Qs(e,t){if(t?.only&&!t.only.includes("theme"))return;let r=await ea(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=j__default.resolve(i.resolvedPaths.cwd,"components.json");await L.pathExists(s)&&n.push({configPath:s,existingConfig:await L.readJson(s)});}try{for(let i of n)if(!qe(i.configPath))throw new Ve(i.configPath);for(let i of n)await L.writeJson(i.configPath,{...i.existingConfig,...o,tailwind:{...i.existingConfig.tailwind,...o.tailwind}},{spaces:2});for(let i of n)Xe(i.configPath);}catch(i){for(let s of [...n].reverse())Me(s.configPath);throw new Vt(`Failed to sync linked workspace configs.${i instanceof Error?` ${i.message}`:""}`)}}async function ea(e){let t=await Y$1(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 ta(e$1,t$1,r={}){if(N(e$1)){let n=new URL(e$1);return n.pathname==="/init"&&e$1.startsWith(a$1)&&n.searchParams.set("track","1"),n.searchParams.set("base",t$1),n.searchParams.set("rtl",String(r.rtl??false)),r.only&&n.searchParams.set("only",r.only),n.toString()}if(t(e$1)){let n=s(e$1);return n||(f.error(`Invalid preset code: ${e.info(e$1)}`),f.break(),process.exit(1)),fe({...n,base:t$1,rtl:r.rtl??false},{preset:e$1,template:r.template,only:r.only})}let o=Y[e$1];return fe({...o,base:t$1,rtl:r.rtl??o.rtl},{template:r.template,only:r.only})}function ra(e){return /[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function Ln(e){return e?`shadcn init --preset ${ra(e)}`:"shadcn init"}async function Un(e$1){let t={},r={cwd:e$1.cwd,registryFile:j__default.resolve(e$1.cwd,e$1.registryFile),outputDir:j__default.resolve(e$1.cwd,e$1.outputDir)};return L.existsSync(r.registryFile)||(t["13"]=true),await L.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(f.break(),f.error(`The path ${e.info(r.registryFile)} does not exist.`)),f.break(),process.exit(1)),{errors:t,resolvePaths:r}}var ia=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string()}),Bn=new Command().name("build").description("build components for a shadcn 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=ia.parse({cwd:j.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:o}=await Un(r),n=await Qa$1(o.registryFile,{cwd:o.cwd}),i=n.registry,s=n.usesInclude?j.dirname(o.registryFile):o.cwd,l=Ra$1(n,s,o.cwd),c=C("Building registry...");for(let m of i.items){c.start(`Building ${m.name}...`);let d=await Sa$1(m,n,s,o.cwd),p=j.resolve(o.outputDir,`${d.name}.json`);await Ie.mkdir(j.dirname(p),{recursive:!0}),await Ie.writeFile(p,JSON.stringify(d,null,2));}n.usesInclude?await Ie.writeFile(j.resolve(o.outputDir,"registry.json"),JSON.stringify(l,null,2)):await Ie.copyFile(o.registryFile,j.resolve(o.outputDir,"registry.json")),c.succeed("Building registry.");}catch(r){f.break(),ia$1(r);}});var la=z.object({component:z.string().optional(),yes:z.boolean(),cwd:z.string(),path:z.string().optional()}),Wn=new Command().name("diff").description("[DEPRECATED] Use `add [component] --diff` instead.").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e$1,t)=>{try{let r=la.parse({component:e$1,...t}),o=j__default.resolve(r.cwd);existsSync(o)||(f.error(`The path ${o} does not exist. Please try again.`),process.exit(1));let n=await W(o);if(!n){if(await g(o)){let c=await h(o);c.length>0&&(i("diff [component]",c),process.exit(1));}f.warn(`Configuration is missing. Please run ${e.success("init")} to create a components.json file.`),process.exit(1);}let i$1=await oa();if(i$1||(ia$1(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let c=n.resolvedPaths.components,m=i$1.filter(p=>{for(let u of p.files??[]){let g=j__default.resolve(c,typeof u=="string"?u:u.path);if(existsSync(g))return !0}return !1}),d=[];for(let p of m){let u=await Jn(p,n);u.length&&d.push({name:p.name,changes:u});}d.length||(f.info("No updates found."),process.exit(0)),f.info("The following components have updates available:");for(let p of d){f.info(`- ${p.name}`);for(let u of p.changes)f.info(` - ${u.filePath}`);}f.break(),f.info(`Run ${e.success("diff <component>")} to see the changes.`),process.exit(0);}let s=i$1.find(c=>c.name===r.component);s||(f.error(`The component ${e.success(r.component)} does not exist.`),process.exit(1));let l=await Jn(s,n);l.length||(f.info(`No updates found for ${r.component}.`),process.exit(0));for(let c of l)f.info(`- ${c.filePath}`),await ma(c.patch),f.info("");}catch(r){ia$1(r);}});async function Jn(e,t){let r=await ua$1(t.style,[e]),o=await sa(t.tailwind.baseColor),n=Ea(r);if(!r)return [];let i=[];for(let s of r){let l=await va$1(t,s);if(l)for(let c of s.files??[]){let m=j__default.resolve(l,typeof c=="string"?c:c.path);if(!existsSync(m))continue;let d=await promises.readFile(m,"utf8");if(typeof c=="string"||!c.content)continue;let p=await H({filename:c.path,raw:c.content,config:t,baseColor:o,supportedFontMarkers:n},[D,E,a$2,G,c$3,g$1,d$1,f$1,F]),u=diffLines(p,d);u.length>1&&i.push({filePath:m,patch:u});}}return i}async function ma(e$1){e$1.forEach(t=>{if(t)return t.added?process.stdout.write(e.success(t.value)):t.removed?process.stdout.write(e.error(t.value)):process.stdout.write(t.value)});}var zn="https://ui.shadcn.com",Hn=new Command().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: base, radix, or aria. defaults to project base.").option("--json","output as JSON.",false).action(async(e$1,t)=>{try{let r=j__default.resolve(t.cwd),o=await W(r),n=da(t.base,o?.style),i=await oa();i||(f.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let c of e$1){let m=i.find(p=>p.name===c);m||(f.error(`Component ${e.info(c)} not found in the shadcn registry.`),process.exit(1));let d=m.meta?.links?.[n];if(!d||Object.keys(d).length===0){f.warn(`No documentation links available for ${e.info(c)}.`);continue}s.push({component:c,base:n,links:ua(d)});}if(t.json){console.log(JSON.stringify({base:n,results:s},null,2));return}let l=Math.max(...s.flatMap(c=>Object.keys(c.links).map(m=>m.length)));for(let{component:c,links:m}of s){f.log(e.info(c));for(let[d,p]of Object.entries(m))f.log(` - ${d.padEnd(l+2)}${p}`);f.break();}}catch(r){ia$1(r);}});function da(e,t){let r=e??Z(t);if(!b(r))throw new Error(`Invalid base: ${String(r)}. Expected one of: ${a.join(", ")}.`);return r}function ua(e){return Object.fromEntries(Object.entries(e).map(([t,r])=>[t,r.startsWith(zn)?`${a$1}${r.slice(zn.length)}`:r]))}var Gn=/@import\s+["']shadcn\/tailwind\.css["'];?\s*\n?/,ya=z.object({cwd:z.string(),yes:z.boolean(),silent:z.boolean()}),Kn=new Command().name("eject").description("inline shadcn/tailwind.css and remove the shadcn dependency").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-y, --yes","skip confirmation prompt.",false).option("-s, --silent","mute output.",false).action(async e=>{try{let t=ya.parse({cwd:j__default.resolve(e.cwd),yes:e.yes,silent:e.silent});await wa(t);}catch(t){ia$1(t);}});async function wa(e$1){if(!L.existsSync(j__default.resolve(e$1.cwd,"components.json"))){if(await g(e$1.cwd)){let d=await h(e$1.cwd);d.length>0&&(i("eject",d),process.exit(1));}f.break(),f.error(`No ${e.info("components.json")} found. Run ${e.info("shadcn init")} first.`),f.error(`Learn more at ${e.info(`${a$1}/docs/components-json`)}.`),f.break(),process.exit(1);}let t=await W(e$1.cwd);t?.resolvedPaths.tailwindCss||(f.break(),f.error("Could not resolve the Tailwind CSS file from components.json."),f.break(),process.exit(1));let r=t.resolvedPaths.tailwindCss,o=j__default.relative(e$1.cwd,r),n=await promises.readFile(r,"utf8");Gn.test(n)||(f.break(),f.error(`Could not find ${e.info('@import "shadcn/tailwind.css"')} in ${e.info(o)}.`),f.error("Nothing to eject."),f.break(),process.exit(1));let i$1=z$1(e$1.cwd,false),s=ka(i$1),l=Ca(e$1.cwd),c=await promises.readFile(l,"utf8");if(e$1.silent||(f.break(),f.warn("This action is not reversible. Future shadcn CLI updates to tailwind.css will not apply automatically."),f.break()),!e$1.yes){f.log("This will:"),f.log(` - Inline ${e.info("shadcn/tailwind.css")} into ${e.info(o)}`),f.log(` - Remove the ${e.info("shadcn")} dependency`),f.break();let{proceed:d}=await de({type:"confirm",name:"proceed",message:"Proceed?",initial:false});d||process.exit(0);}let m=C(`Inlining ${e.info("shadcn/tailwind.css")}.`,{silent:e$1.silent})?.start();if(n=n.replace(Gn,()=>`/* ejected from shadcn@${s} */
119
119
  ${c.trim()}
120
120
 
121
- `),await promises.writeFile(r,n,"utf8"),m?.succeed(),wa(i$1)){let d=C(`Removing ${e.info("shadcn")}.`,{silent:e$1.silent})?.start();await ba(e$1.cwd),d?.succeed();}else e$1.silent||f.warn(`The ${e.info("shadcn")} package was not found in package.json. Skipped removal.`);f.break(),f.log(`Ejected ${e.info("shadcn/tailwind.css")} into ${e.info(o)}.`),f.break();}function ya(e){return e?(e.dependencies?.shadcn??e.devDependencies?.shadcn??"unknown").replace(/^[\^~]/,"").trim():"unknown"}function wa(e){return e?!!(e.dependencies?.shadcn||e.devDependencies?.shadcn):false}function ka(e){let t=T__default.join(e,"node_modules/shadcn/dist/tailwind.css");if(L.existsSync(t))return t;let r=process.argv[1]?T__default.dirname(T__default.resolve(process.argv[1])):e;for(let o of [T__default.join(r,"tailwind.css"),T__default.join(r,"dist","tailwind.css"),T__default.join(r,"src","tailwind.css"),T__default.join(process.cwd(),"src/tailwind.css"),T__default.join(process.cwd(),"dist/tailwind.css")])if(L.existsSync(o))return o;throw new Error("Could not resolve shadcn/tailwind.css.")}async function ba(e){switch(await fa$1(e)){case "npm":await execa("npm",["uninstall","shadcn"],{cwd:e});break;case "pnpm":await execa("pnpm",["remove","shadcn"],{cwd:e});break;case "yarn":await execa("yarn",["remove","shadcn"],{cwd:e});break;case "bun":await execa("bun",["remove","shadcn"],{cwd:e});break;case "deno":{let r=T__default.join(e,"package.json"),o=await L.readJson(r);for(let n of ["dependencies","devDependencies"])o[n]?.shadcn&&delete o[n].shadcn;await L.writeJson(r,o,{spaces:2});break}}}var Ca=["50","100","200","300","400","500","600","700","800","900","950"],xa=["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"],va={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)"}},Ra={"220.9 39.3% 11%":"gray","210 20% 98%":"gray","12 76% 61%":"gray","220 70% 50%":"gray"},Hn=new Map;for(let e of xa)for(let t of Ca)Hn.set(Kn(va[e][t]),e);function Gn(e){let t=Kn(e);return t?Hn.get(t)??Ra[t]??null:null}function Kn(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=vr(n[0],{percentage:true}),s=vr(n[1]),l=vr(n[2]);return `oklch(${i} ${s} ${l})`}function vr(e,t={}){return t.percentage&&e.endsWith("%")?zn(Number.parseFloat(e)/100):zn(Number.parseFloat(e))}function zn(e){return Number.isNaN(e)?"":Number(e.toFixed(12)).toString()}var ja=new Set(e$1),Ta=new Set(i$1),Na=new Set(m),Fa=new Set(n),Oa=new Set(j),Aa=new Set(k),La=new Set(f$2),Da=new Set(["eb-garamond","instrument-serif","lora","merriweather","playfair-display","noto-serif","roboto-slab"]),_a=new Set(["jetbrains-mono","geist-mono"]),ot=["--font-sans","--font-serif","--font-mono"],Qn=new Set(ot),Va=[...ot,"--font-heading"],ei=new Set(Va),Yn={appliedBodyVariable:null,variables:{}},Ma={0:"none","0rem":"none","0.45rem":"small","0.625rem":"default","0.875rem":"large"};async function Jt(e,t){let r$1=Ba(e.style);if(!r$1)return {code:null,fallbacks:[],values:null};let o=K[r$1],n=await Ua(e.resolvedPaths.tailwindCss),i=Bt(ja,e.tailwind.baseColor),s=za(n),l=Ha(n),c=Bt(Ta,e.iconLibrary),m=qn(n,Yn),d=m??o.font,p=Xn(n,d,Yn);if(!m||!p){let R=t;if(t===void 0)try{R=await za$1(e.resolvedPaths.cwd,{configCssFile:e.tailwind.css});}catch{R=null;}let S=await Xa(e,R);m??=qn(n,S),d=m??o.font,p??=Xn(n,d,S);}let y=Ka(p??o.fontHeading,d,o.fontHeading),g=Ga(n.rootVars["--radius"]),u=Bt(Na,e.menuAccent),w=Bt(Fa,e.menuColor),k={style:r$1,baseColor:i??o.baseColor,theme:s??o.theme,chartColor:l??o.chartColor,iconLibrary:c??o.iconLibrary,font:d,fontHeading:y,radius:g??o.radius,menuAccent:u??o.menuAccent,menuColor:w??o.menuColor},b=[!i&&"baseColor",!s&&"theme",!l&&"chartColor",!c&&"iconLibrary",!m&&"font",!p&&"fontHeading",!g&&"radius",!u&&"menuAccent",!w&&"menuColor"].filter(Boolean);return {code:r(k),fallbacks:b,values:k}}async function Ua(e){let t={darkVars:{},imports:[],rootVars:{},themeVars:{}};if(!e)return t;try{let r=await promises.readFile(e,"utf8");return Wa(r)}catch{return t}}function Ba(e){let t=c$1(e).style;return !t||!(t in K)?null:t}function Wa(e){let t=Pa$1.parse(e),r={darkVars:{},imports:[],rootVars:{},themeVars:{}};return t.walkAtRules("import",o=>{let n=Ja(o.params);n&&r.imports.push(n);}),t.walkRules(o=>{let n=o.selector.split(",").map(i=>i.trim()).filter(Boolean);n.includes(":root")&&Rr(o,r.rootVars),n.includes(".dark")&&Rr(o,r.darkVars);}),t.walkAtRules("theme",o=>{o.params.trim()==="inline"&&Rr(o,r.themeVars);}),r}function Rr(e,t){for(let r of e.nodes??[])r.type!=="decl"||!r.prop.startsWith("--")||(t[r.prop]=r.value.trim());}function Ja(e){let t=e.trim();return (t.match(/^url\((['"]?)(.+?)\1\)$/)??t.match(/^(['"])(.+?)\1$/))?.[2]??null}function za(e){let t=Wt(e.rootVars["--primary"]);if(!t)return null;let r=e.darkVars["--primary"];return r?Wt(r)===t?t:null:t}function Ha(e){let t=Wt(e.rootVars["--chart-1"]);if(!t)return null;let r=e.darkVars["--chart-1"];return r?Wt(r)===t?t:null:t}function Wt(e){let t=Gn(e);return !t||!La.has(t)?null:t}function Ga(e){if(!e)return null;let t=zt(e);return Ma[t]??null}function qn(e,t){for(let r of ot){let o=ri(e,r);if(o)return o}for(let r of ot){let o=Ya(e.imports,r);if(o)return o}return qa(t)}function Xn(e,t,r){let o=Sr(e,"--font-heading"),n=o?ni(o):null;if(n)return n===t?"inherit":n;let i=r.variables["--font-heading"],s=ti(e,"--font-heading");if(!s)return i&&i!==t?i:null;let l=Ir(s);if(l&&Qn.has(l)){let c=ri(e,l),m=r.variables[l],d=c??m??null;return !d||d===t?"inherit":d}return l==="--font-heading"?i?i===t?"inherit":i:null:i&&i!==t?i:null}function Ka(e,t,r){let o=e===t?"inherit":e;return Aa.has(o)?o:r}function Sr(e,t,r=new Set){if(r.has(t))return null;r.add(t);let o=ti(e,t);if(!o)return null;let n=Ir(o);return n?ei.has(n)?Sr(e,n,r):null:o}function ti(e,t){let r=e.themeVars[t];return r&&Ir(r)!==t?r:e.rootVars[t]??r??null}function Ir(e){return zt(e).match(/^var\((--[a-z0-9-]+)\)$/)?.[1]??null}function ri(e,t){let r=Sr(e,t),o=r?ni(r):null;return o||null}function Ya(e,t){let r=e.flatMap(o=>{let n=ic(o);return n&&ac(n)===t?[n]:[]});return r.length===1?r[0]:null}function qa(e){if(e.appliedBodyVariable&&e.variables[e.appliedBodyVariable])return e.variables[e.appliedBodyVariable]??null;let t=ot.map(r=>e.variables[r]).filter(Boolean).filter((r,o,n)=>n.indexOf(r)===o);return t.length===1?t[0]:null}async function Xa(e,t){let r={appliedBodyVariable:null,variables:{}};if(!t||t.framework.name!=="next-app"&&t.framework.name!=="next-pages")return r;let o=Za(e,t);if(!o)return r;try{let n=await promises.readFile(o,"utf8");return Qa(n,t.framework.name)}catch{return r}}function Za(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=T__default.join(e.resolvedPaths.cwd,n);if(existsSync(i))return i}return null}function Qa(e,t){let o=new Project({compilerOptions:{}}).createSourceFile("font-source.tsx",e,{overwrite:true,scriptKind:ScriptKind.TSX}),n=new Map;for(let l of o.getImportDeclarations())if(l.getModuleSpecifierValue()==="next/font/google")for(let c of l.getNamedImports()){let m=c.getName(),d=c.getAliasNode()?.getText()??m,p=sc(m);p&&n.set(d,p);}let i={},s=new Map;for(let l of o.getVariableStatements())for(let c of l.getDeclarations()){let m=c.getInitializer();if(!m?.isKind(SyntaxKind.CallExpression))continue;let d=n.get(m.getExpression().getText());if(!d)continue;let p=ec(m);p&&(s.set(c.getName(),p),i[p]=d);}return {appliedBodyVariable:tc(o,s,t),variables:i}}function ec(e){let t=e.getArguments()[0];if(!t||!Node.isObjectLiteralExpression(t))return null;let r=t.getProperty("variable");if(!r||!Node.isPropertyAssignment(r))return null;let o=r.getInitializer();if(!o)return null;let n=oi(o.getText());return ei.has(n)?n:null}function tc(e,t,r){let o=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement).filter(i=>r==="next-app"?i.getTagNameNode().getText()==="html":true),n=new Set;for(let i of o){let s=i.getAttribute("className");if(!s||!Node.isJsxAttribute(s))continue;let l=s.getInitializer();if(!l)continue;let c=rc(l,t),m=oc(l);if(m&&c.includes(m))return m;c.length===1&&n.add(c[0]);}return n.size===1?Array.from(n)[0]:null}function rc(e,t){let r=Node.isJsxExpression(e)?[e.getExpression(),...e.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression)].filter(Boolean):[],o=new Set;for(let n of r){if(!n||!Node.isPropertyAccessExpression(n)||n.getName()!=="variable")continue;let i=n.getExpression().getText(),s=t.get(i);s&&Qn.has(s)&&o.add(s);}return Array.from(o)}function oc(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=[];(Node.isStringLiteral(e)||Node.isNoSubstitutionTemplateLiteral(e))&&t.push(e.getLiteralValue());for(let r of e.getDescendantsOfKind(SyntaxKind.StringLiteral))t.push(r.getLiteralValue());for(let r of e.getDescendantsOfKind(SyntaxKind.NoSubstitutionTemplateLiteral))t.push(r.getLiteralValue());return t.length>0?t.join(" "):e.getText()}function oi(e){return e.replace(/^['"]|['"]$/g,"")}function ni(e){if(!e)return null;let t=oi(e.split(",")[0]?.trim()??"").replace(/\s+variable$/i,"").trim();return t?Pr(t.replace(/\s+/g,"-")):null}function ic(e){if(!e)return null;let t=zt(e),r="@fontsource-variable/";return t.startsWith(r)?Pr(t.slice(r.length)):null}function sc(e){return e?Pr(e.replace(/_/g,"-")):null}function Pr(e){let t=zt(e);return Oa.has(t)?t:null}function ac(e){return _a.has(e)?"--font-mono":Da.has(e)?"--font-serif":"--font-sans"}function zt(e){return e?e.trim().replace(/\s+/g," ").replace(/\s*,\s*/g,", ").replace(/"/g,"'").toLowerCase():""}function Bt(e,t){return t&&e.has(t)?t:null}var si=`${a$1}/code/apps/v4/registry/bases`,ai=new Command().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.",false).action(async e=>{try{let t=T__default.resolve(e.cwd);if(!existsSync(T__default.resolve(t,"components.json"))&&await g(t)){let l=await h(t);l.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:l.map(c=>c.name)},null,2)):i("info",l),process.exit(1));}let r=await za$1(t),o=await W(t),n=await Ca$1(t),i$1=Z(o?.style),s=await fc(r,o,n,i$1);if(e.json){console.log(JSON.stringify(s,null,2));return}pc(s);}catch(t){ia(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 fc(e,t,r,o){let n=t?await Jt(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??false,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:`${a$1}/docs`,components:`${a$1}/docs/components/${o}/[component].md`,ui:`${si}/${o}/ui/[component].tsx`,examples:`${si}/${o}/examples/[component]-example.tsx`,schema:`${a$1}/schema.json`}}}function pc(e$1){f.log(e.info("Project")),e$1.project?he({framework:`${e$1.project.framework} (${e$1.project.frameworkName})`,frameworkVersion:e$1.project.frameworkVersion??"-",srcDirectory:e$1.project.srcDirectory?"Yes":"No",rsc:e$1.project.rsc?"Yes":"No",typescript:e$1.project.typescript?"Yes":"No",tailwindVersion:e$1.project.tailwindVersion??"-",tailwindConfig:e$1.project.tailwindConfig??"-",tailwindCss:e$1.project.tailwindCss??"-",importAlias:e$1.project.importAlias??"-"}):f.log(" No project info detected."),f.break(),f.log(e.info("Configuration")),e$1.config?(he({style:e$1.config.style,base:e$1.config.base,rsc:e$1.config.rsc?"Yes":"No",typescript:e$1.config.typescript?"Yes":"No",iconLibrary:e$1.config.iconLibrary??"-",rtl:e$1.config.rtl?"Yes":"No",menuColor:e$1.config.menuColor??"-",menuAccent:e$1.config.menuAccent??"-"}),f.break(),Ht(e$1.preset),f.break(),f.log(e.info("Aliases")),he({components:e$1.config.aliases.components,utils:e$1.config.aliases.utils,ui:e$1.config.aliases.ui??"-",lib:e$1.config.aliases.lib??"-",hooks:e$1.config.aliases.hooks??"-"}),f.break(),f.log(e.info("Resolved Paths")),he({cwd:e$1.config.resolvedPaths.cwd,tailwindConfig:e$1.config.resolvedPaths.tailwindConfig??"-",tailwindCss:e$1.config.resolvedPaths.tailwindCss??"-",utils:e$1.config.resolvedPaths.utils,components:e$1.config.resolvedPaths.components,lib:e$1.config.resolvedPaths.lib,hooks:e$1.config.resolvedPaths.hooks,ui:e$1.config.resolvedPaths.ui}),Object.keys(e$1.config.registries).length>0&&(f.break(),f.log("registries:"),he(e$1.config.registries))):f.log(" No components.json found."),f.break(),f.log(e.info("Installed Components")),e$1.components.length>0?f.log(` ${e$1.components.join(", ")}`):f.log(" No components installed."),f.break(),f.log(e.info("Links")),he(e$1.links),f.break();}function Ht(e$1,t={}){if(f.log(e.info("Preset")),!e$1?.code)he({code:"-"});else {let r=e$1.fallbacks??[],o=(n,i)=>{let s=r.includes(n)?"*":"";return `${i??"-"}${s}`};he({code:e$1.code,version:e$1.code[0],style:e$1.values?.style??"-",baseColor:o("baseColor",e$1.values?.baseColor),theme:o("theme",e$1.values?.theme),chartColor:o("chartColor",e$1.values?.chartColor),iconLibrary:o("iconLibrary",e$1.values?.iconLibrary),font:o("font",e$1.values?.font),fontHeading:o("fontHeading",e$1.values?.fontHeading),radius:o("radius",e$1.values?.radius),menuAccent:o("menuAccent",e$1.values?.menuAccent),menuColor:o("menuColor",e$1.values?.menuColor),url:`${a$1}/create?preset=${e$1.code}`}),r.length>0&&(f.log(""),f.log(t.fallbackNote??" * Uses preset defaults for values not available as options on shadcn/create."));}}function he(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,o]of Object.entries(e))f.log(` ${r.padEnd(t+2)}${o}`);}var $e="latest",Kt=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${$e}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${$e}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${$e}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
121
+ `),await promises.writeFile(r,n,"utf8"),m?.succeed(),ba(i$1)){let d=C(`Removing ${e.info("shadcn")}.`,{silent:e$1.silent})?.start();await xa(e$1.cwd),d?.succeed();}else e$1.silent||f.warn(`The ${e.info("shadcn")} package was not found in package.json. Skipped removal.`);f.break(),f.log(`Ejected ${e.info("shadcn/tailwind.css")} into ${e.info(o)}.`),f.break();}function ka(e){return e?(e.dependencies?.shadcn??e.devDependencies?.shadcn??"unknown").replace(/^[\^~]/,"").trim():"unknown"}function ba(e){return e?!!(e.dependencies?.shadcn||e.devDependencies?.shadcn):false}function Ca(e){let t=j__default.join(e,"node_modules/shadcn/dist/tailwind.css");if(L.existsSync(t))return t;let r=process.argv[1]?j__default.dirname(j__default.resolve(process.argv[1])):e;for(let o of [j__default.join(r,"tailwind.css"),j__default.join(r,"dist","tailwind.css"),j__default.join(r,"src","tailwind.css"),j__default.join(process.cwd(),"src/tailwind.css"),j__default.join(process.cwd(),"dist/tailwind.css")])if(L.existsSync(o))return o;throw new Error("Could not resolve shadcn/tailwind.css.")}async function xa(e){switch(await fa(e)){case "npm":await execa("npm",["uninstall","shadcn"],{cwd:e});break;case "pnpm":await execa("pnpm",["remove","shadcn"],{cwd:e});break;case "yarn":await execa("yarn",["remove","shadcn"],{cwd:e});break;case "bun":await execa("bun",["remove","shadcn"],{cwd:e});break;case "deno":{let r=j__default.join(e,"package.json"),o=await L.readJson(r);for(let n of ["dependencies","devDependencies"])o[n]?.shadcn&&delete o[n].shadcn;await L.writeJson(r,o,{spaces:2});break}}}var va=["50","100","200","300","400","500","600","700","800","900","950"],Ra=["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"],Sa={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)"}},Ia={"220.9 39.3% 11%":"gray","210 20% 98%":"gray","12 76% 61%":"gray","220 70% 50%":"gray"},qn=new Map;for(let e of Ra)for(let t of va)qn.set(Zn(Sa[e][t]),e);function Xn(e){let t=Zn(e);return t?qn.get(t)??Ia[t]??null:null}function Zn(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=Sr(n[0],{percentage:true}),s=Sr(n[1]),l=Sr(n[2]);return `oklch(${i} ${s} ${l})`}function Sr(e,t={}){return t.percentage&&e.endsWith("%")?Yn(Number.parseFloat(e)/100):Yn(Number.parseFloat(e))}function Yn(e){return Number.isNaN(e)?"":Number(e.toFixed(12)).toString()}var Na=new Set(e$1),Fa=new Set(i$1),Oa=new Set(m),Aa=new Set(n),La=new Set(j$1),Da=new Set(k),_a=new Set(f$2),Va=new Set(["eb-garamond","instrument-serif","lora","merriweather","playfair-display","noto-serif","roboto-slab"]),Ma=new Set(["jetbrains-mono","geist-mono"]),nt=["--font-sans","--font-serif","--font-mono"],oi=new Set(nt),Ua=[...nt,"--font-heading"],ni=new Set(Ua),Qn={appliedBodyVariable:null,variables:{}},Ba={0:"none","0rem":"none","0.45rem":"small","0.625rem":"default","0.875rem":"large"};async function zt(e,t){let r$1=Wa(e.style);if(!r$1)return {code:null,fallbacks:[],values:null};let o=Y[r$1],n=await Ja(e.resolvedPaths.tailwindCss),i=Jt(Na,e.tailwind.baseColor),s=Ga(n),l=Ka(n),c=Jt(Fa,e.iconLibrary),m=ei(n,Qn),d=m??o.font,p=ti(n,d,Qn);if(!m||!p){let S=t;if(t===void 0)try{S=await Aa$1(e.resolvedPaths.cwd,{configCssFile:e.tailwind.css});}catch{S=null;}let v=await Qa(e,S);m??=ei(n,v),d=m??o.font,p??=ti(n,d,v);}let u=qa(p??o.fontHeading,d,o.fontHeading),g=Ya(n.rootVars["--radius"]),h=Jt(Oa,e.menuAccent),w=Jt(Aa,e.menuColor),k={style:r$1,baseColor:i??o.baseColor,theme:s??o.theme,chartColor:l??o.chartColor,iconLibrary:c??o.iconLibrary,font:d,fontHeading:u,radius:g??o.radius,menuAccent:h??o.menuAccent,menuColor:w??o.menuColor},b=[!i&&"baseColor",!s&&"theme",!l&&"chartColor",!c&&"iconLibrary",!m&&"font",!p&&"fontHeading",!g&&"radius",!h&&"menuAccent",!w&&"menuColor"].filter(Boolean);return {code:r(k),fallbacks:b,values:k}}async function Ja(e){let t={darkVars:{},imports:[],rootVars:{},themeVars:{}};if(!e)return t;try{let r=await promises.readFile(e,"utf8");return za(r)}catch{return t}}function Wa(e){let t=c$1(e).style;return !t||!(t in Y)?null:t}function za(e){let t=Ea$1.parse(e),r={darkVars:{},imports:[],rootVars:{},themeVars:{}};return t.walkAtRules("import",o=>{let n=Ha(o.params);n&&r.imports.push(n);}),t.walkRules(o=>{let n=o.selector.split(",").map(i=>i.trim()).filter(Boolean);n.includes(":root")&&Ir(o,r.rootVars),n.includes(".dark")&&Ir(o,r.darkVars);}),t.walkAtRules("theme",o=>{o.params.trim()==="inline"&&Ir(o,r.themeVars);}),r}function Ir(e,t){for(let r of e.nodes??[])r.type!=="decl"||!r.prop.startsWith("--")||(t[r.prop]=r.value.trim());}function Ha(e){let t=e.trim();return (t.match(/^url\((['"]?)(.+?)\1\)$/)??t.match(/^(['"])(.+?)\1$/))?.[2]??null}function Ga(e){let t=Wt(e.rootVars["--primary"]);if(!t)return null;let r=e.darkVars["--primary"];return r?Wt(r)===t?t:null:t}function Ka(e){let t=Wt(e.rootVars["--chart-1"]);if(!t)return null;let r=e.darkVars["--chart-1"];return r?Wt(r)===t?t:null:t}function Wt(e){let t=Xn(e);return !t||!_a.has(t)?null:t}function Ya(e){if(!e)return null;let t=Ht(e);return Ba[t]??null}function ei(e,t){for(let r of nt){let o=si(e,r);if(o)return o}for(let r of nt){let o=Xa(e.imports,r);if(o)return o}return Za(t)}function ti(e,t,r){let o=Pr(e,"--font-heading"),n=o?ci(o):null;if(n)return n===t?"inherit":n;let i=r.variables["--font-heading"],s=ii(e,"--font-heading");if(!s)return i&&i!==t?i:null;let l=$r(s);if(l&&oi.has(l)){let c=si(e,l),m=r.variables[l],d=c??m??null;return !d||d===t?"inherit":d}return l==="--font-heading"?i?i===t?"inherit":i:null:i&&i!==t?i:null}function qa(e,t,r){let o=e===t?"inherit":e;return Da.has(o)?o:r}function Pr(e,t,r=new Set){if(r.has(t))return null;r.add(t);let o=ii(e,t);if(!o)return null;let n=$r(o);return n?ni.has(n)?Pr(e,n,r):null:o}function ii(e,t){let r=e.themeVars[t];return r&&$r(r)!==t?r:e.rootVars[t]??r??null}function $r(e){return Ht(e).match(/^var\((--[a-z0-9-]+)\)$/)?.[1]??null}function si(e,t){let r=Pr(e,t),o=r?ci(r):null;return o||null}function Xa(e,t){let r=e.flatMap(o=>{let n=ac(o);return n&&lc(n)===t?[n]:[]});return r.length===1?r[0]:null}function Za(e){if(e.appliedBodyVariable&&e.variables[e.appliedBodyVariable])return e.variables[e.appliedBodyVariable]??null;let t=nt.map(r=>e.variables[r]).filter(Boolean).filter((r,o,n)=>n.indexOf(r)===o);return t.length===1?t[0]:null}async function Qa(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 promises.readFile(o,"utf8");return tc(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=j__default.join(e.resolvedPaths.cwd,n);if(existsSync(i))return i}return null}function tc(e,t){let o=new Project({compilerOptions:{}}).createSourceFile("font-source.tsx",e,{overwrite:true,scriptKind:ScriptKind.TSX}),n=new Map;for(let l of o.getImportDeclarations())if(l.getModuleSpecifierValue()==="next/font/google")for(let c of l.getNamedImports()){let m=c.getName(),d=c.getAliasNode()?.getText()??m,p=cc(m);p&&n.set(d,p);}let i={},s=new Map;for(let l of o.getVariableStatements())for(let c of l.getDeclarations()){let m=c.getInitializer();if(!m?.isKind(SyntaxKind.CallExpression))continue;let d=n.get(m.getExpression().getText());if(!d)continue;let p=rc(m);p&&(s.set(c.getName(),p),i[p]=d);}return {appliedBodyVariable:oc(o,s,t),variables:i}}function rc(e){let t=e.getArguments()[0];if(!t||!Node.isObjectLiteralExpression(t))return null;let r=t.getProperty("variable");if(!r||!Node.isPropertyAssignment(r))return null;let o=r.getInitializer();if(!o)return null;let n=ai(o.getText());return ni.has(n)?n:null}function oc(e,t,r){let o=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement).filter(i=>r==="next-app"?i.getTagNameNode().getText()==="html":true),n=new Set;for(let i of o){let s=i.getAttribute("className");if(!s||!Node.isJsxAttribute(s))continue;let l=s.getInitializer();if(!l)continue;let c=nc(l,t),m=ic(l);if(m&&c.includes(m))return m;c.length===1&&n.add(c[0]);}return n.size===1?Array.from(n)[0]:null}function nc(e,t){let r=Node.isJsxExpression(e)?[e.getExpression(),...e.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression)].filter(Boolean):[],o=new Set;for(let n of r){if(!n||!Node.isPropertyAccessExpression(n)||n.getName()!=="variable")continue;let i=n.getExpression().getText(),s=t.get(i);s&&oi.has(s)&&o.add(s);}return Array.from(o)}function ic(e){let t=sc(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 sc(e){let t=[];(Node.isStringLiteral(e)||Node.isNoSubstitutionTemplateLiteral(e))&&t.push(e.getLiteralValue());for(let r of e.getDescendantsOfKind(SyntaxKind.StringLiteral))t.push(r.getLiteralValue());for(let r of e.getDescendantsOfKind(SyntaxKind.NoSubstitutionTemplateLiteral))t.push(r.getLiteralValue());return t.length>0?t.join(" "):e.getText()}function ai(e){return e.replace(/^['"]|['"]$/g,"")}function ci(e){if(!e)return null;let t=ai(e.split(",")[0]?.trim()??"").replace(/\s+variable$/i,"").trim();return t?Er(t.replace(/\s+/g,"-")):null}function ac(e){if(!e)return null;let t=Ht(e),r="@fontsource-variable/";return t.startsWith(r)?Er(t.slice(r.length)):null}function cc(e){return e?Er(e.replace(/_/g,"-")):null}function Er(e){let t=Ht(e);return La.has(t)?t:null}function lc(e){return Ma.has(e)?"--font-mono":Va.has(e)?"--font-serif":"--font-sans"}function Ht(e){return e?e.trim().replace(/\s+/g," ").replace(/\s*,\s*/g,", ").replace(/"/g,"'").toLowerCase():""}function Jt(e,t){return t&&e.has(t)?t:null}var mi=`${a$1}/code/apps/v4/registry/bases`,fi=new Command().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.",false).action(async e=>{try{let t=j__default.resolve(e.cwd);if(!existsSync(j__default.resolve(t,"components.json"))&&await g(t)){let l=await h(t);l.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:l.map(c=>c.name)},null,2)):i("info",l),process.exit(1));}let r=await Aa$1(t),o=await W(t),n=await Da$1(t),i$1=Z(o?.style),s=await dc(r,o,n,i$1);if(e.json){console.log(JSON.stringify(s,null,2));return}uc(s);}catch(t){ia$1(t);}});function pc(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 dc(e,t,r,o){let n=t?await zt(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??false,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:pc(t.registries)}:null,preset:n,components:r,links:{docs:`${a$1}/docs`,components:`${a$1}/docs/components/${o}/[component].md`,ui:`${mi}/${o}/ui/[component].tsx`,examples:`${mi}/${o}/examples/[component]-example.tsx`,schema:`${a$1}/schema.json`}}}function uc(e$1){f.log(e.info("Project")),e$1.project?he({framework:`${e$1.project.framework} (${e$1.project.frameworkName})`,frameworkVersion:e$1.project.frameworkVersion??"-",srcDirectory:e$1.project.srcDirectory?"Yes":"No",rsc:e$1.project.rsc?"Yes":"No",typescript:e$1.project.typescript?"Yes":"No",tailwindVersion:e$1.project.tailwindVersion??"-",tailwindConfig:e$1.project.tailwindConfig??"-",tailwindCss:e$1.project.tailwindCss??"-",importAlias:e$1.project.importAlias??"-"}):f.log(" No project info detected."),f.break(),f.log(e.info("Configuration")),e$1.config?(he({style:e$1.config.style,base:e$1.config.base,rsc:e$1.config.rsc?"Yes":"No",typescript:e$1.config.typescript?"Yes":"No",iconLibrary:e$1.config.iconLibrary??"-",rtl:e$1.config.rtl?"Yes":"No",menuColor:e$1.config.menuColor??"-",menuAccent:e$1.config.menuAccent??"-"}),f.break(),Gt(e$1.preset),f.break(),f.log(e.info("Aliases")),he({components:e$1.config.aliases.components,utils:e$1.config.aliases.utils,ui:e$1.config.aliases.ui??"-",lib:e$1.config.aliases.lib??"-",hooks:e$1.config.aliases.hooks??"-"}),f.break(),f.log(e.info("Resolved Paths")),he({cwd:e$1.config.resolvedPaths.cwd,tailwindConfig:e$1.config.resolvedPaths.tailwindConfig??"-",tailwindCss:e$1.config.resolvedPaths.tailwindCss??"-",utils:e$1.config.resolvedPaths.utils,components:e$1.config.resolvedPaths.components,lib:e$1.config.resolvedPaths.lib,hooks:e$1.config.resolvedPaths.hooks,ui:e$1.config.resolvedPaths.ui}),Object.keys(e$1.config.registries).length>0&&(f.break(),f.log("registries:"),he(e$1.config.registries))):f.log(" No components.json found."),f.break(),f.log(e.info("Installed Components")),e$1.components.length>0?f.log(` ${e$1.components.join(", ")}`):f.log(" No components installed."),f.break(),f.log(e.info("Links")),he(e$1.links),f.break();}function Gt(e$1,t={}){if(f.log(e.info("Preset")),!e$1?.code)he({code:"-"});else {let r=e$1.fallbacks??[],o=(n,i)=>{let s=r.includes(n)?"*":"";return `${i??"-"}${s}`};he({code:e$1.code,version:e$1.code[0],style:e$1.values?.style??"-",baseColor:o("baseColor",e$1.values?.baseColor),theme:o("theme",e$1.values?.theme),chartColor:o("chartColor",e$1.values?.chartColor),iconLibrary:o("iconLibrary",e$1.values?.iconLibrary),font:o("font",e$1.values?.font),fontHeading:o("fontHeading",e$1.values?.fontHeading),radius:o("radius",e$1.values?.radius),menuAccent:o("menuAccent",e$1.values?.menuAccent),menuColor:o("menuColor",e$1.values?.menuColor),url:`${a$1}/create?preset=${e$1.code}`}),r.length>0&&(f.log(""),f.log(t.fallbackNote??" * Uses preset defaults for values not available as options on shadcn/create."));}}function he(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,o]of Object.entries(e))f.log(` ${r.padEnd(t+2)}${o}`);}var $e="latest",Yt=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${$e}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${$e}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${$e}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
122
122
  command = "npx"
123
123
  args = ["shadcn@${$e}", "mcp"]
124
- `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${$e}`,"mcp"],enabled:true}}}}],Gt=[`shadcn@${$e}`],Er=new Command().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 Ma$1(e.cwd);let t=new StdioServerTransport;await a$3.connect(t);}catch(t){f.break(),ia(t);}}),wc=$r.object({client:$r.enum(["claude","cursor","vscode","codex","opencode"]),cwd:$r.string()});Er.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Kt.map(e=>e.name).join(", ")})`).action(async(e$1,t)=>{try{let o=(t.parent?.opts()||{}).cwd||process.cwd(),n=e$1.client;if(!n){let m=await de({type:"select",name:"client",message:"Which MCP client are you using?",choices:Kt.map(d=>({title:d.label,value:d.name}))});m.client||(f.break(),process.exit(1)),n=m.client;}let i=wc.parse({client:n,cwd:o}),s=await W(i.cwd);if(i.client==="codex"){if(s)await Ia([],Gt,s,{silent:!1});else {let m=await fa$1(i.cwd),d=m==="npm"?"install":"add",p=m==="npm"?"--save-dev":"-D",y=C("Installing dependencies...").start();await execa(m,[d,p,...Gt],{cwd:i.cwd}),y.succeed("Installing dependencies.");}f.break(),f.log("To configure the shadcn MCP server in Codex:"),f.break(),f.log(`1. Open or create the file ${e.info("~/.codex/config.toml")}`),f.log("2. Add the following configuration:"),f.log(),f.info(`[mcp_servers.shadcn]
124
+ `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${$e}`,"mcp"],enabled:true}}}}],Kt=[`shadcn@${$e}`],Tr=new Command().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 Na$1(e.cwd);let t=new StdioServerTransport;await a$3.connect(t);}catch(t){f.break(),ia$1(t);}}),bc=jr.object({client:jr.enum(["claude","cursor","vscode","codex","opencode"]),cwd:jr.string()});Tr.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Yt.map(e=>e.name).join(", ")})`).action(async(e$1,t)=>{try{let o=(t.parent?.opts()||{}).cwd||process.cwd(),n=e$1.client;if(!n){let m=await de({type:"select",name:"client",message:"Which MCP client are you using?",choices:Yt.map(d=>({title:d.label,value:d.name}))});m.client||(f.break(),process.exit(1)),n=m.client;}let i=bc.parse({client:n,cwd:o}),s=await W(i.cwd);if(i.client==="codex"){if(s)await Ja$1([],Kt,s,{silent:!1});else {let m=await fa(i.cwd),d=m==="npm"?"install":"add",p=m==="npm"?"--save-dev":"-D",u=C("Installing dependencies...").start();await execa(m,[d,p,...Kt],{cwd:i.cwd}),u.succeed("Installing dependencies.");}f.break(),f.log("To configure the shadcn MCP server in Codex:"),f.break(),f.log(`1. Open or create the file ${e.info("~/.codex/config.toml")}`),f.log("2. Add the following configuration:"),f.log(),f.info(`[mcp_servers.shadcn]
125
125
  command = "npx"
126
- args = ["shadcn@${$e}", "mcp"]`),f.break(),f.info("3. Restart Codex to load the MCP server"),f.break(),process.exit(0);}let l=C("Configuring MCP server...").start(),c=await bc(i);if(l.succeed("Configuring MCP server."),s)await Ia([],Gt,s,{silent:!1});else {let m=await fa$1(i.cwd),d=m==="npm"?"install":"add",p=m==="npm"?"--save-dev":"-D",y=C("Installing dependencies...").start();await execa(m,[d,p,...Gt],{cwd:i.cwd}),y.succeed("Installing dependencies.");}f.break(),f.success(`Configuration saved to ${c}.`),f.break();}catch(r){ia(r);}});var kc=(e,t)=>t;async function bc(e){let{client:t,cwd:r}=e,o=Kt.find(c=>c.name===t);if(!o)throw new Error(`Unknown client: ${t}. Available clients: ${Kt.map(c=>c.name).join(", ")}`);let n=T__default.join(r,o.configPath),i=T__default.dirname(n);await L.ensureDir(i);let s={};try{let c=await promises.readFile(n,"utf-8");s=JSON.parse(c);}catch{}let l=Yo(s,o.config,{arrayMerge:kc});return await promises.writeFile(n,JSON.stringify(l,null,2)+`
127
- `,"utf-8"),o.configPath}var Ee={...a$4,radix:{name:"radix",title:"Radix Icons",packages:["@radix-ui/react-icons"],import:"import { ICON } from '@radix-ui/react-icons'",usage:"<ICON />",export:"@radix-ui/react-icons"}};async function di(e$1,t={}){let r,o;if(t.path){if(o=e$1.resolvedPaths.cwd,t.path.includes("*"))r=await jr(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else {let g=T__default.resolve(o,t.path),u=await promises.stat(g).catch(()=>null);if(!u)throw new Error(`File not found: ${t.path}`);if(u.isDirectory())o=g,r=await jr("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else if(u.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$1.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$1.resolvedPaths.ui,r=await jr("**/*.{js,ts,jsx,tsx}",{cwd:o});}let n=await pa$1();if(Object.keys(n).length===0)throw new Error("Something went wrong fetching the registry icons.");let i=Object.entries(Ee).map(([y,g])=>({title:g.title,value:y}));for(let y of [t.from,t.to])if(y&&!(y in Ee))throw new Error(`Unknown icon library: ${y}. Available libraries: ${Object.keys(Ee).join(", ")}.`);let s=t.from,l=t.to;if(!s||!l){let y=i.findIndex(u=>u.value===e$1.iconLibrary),g=await de([{type:s?null:"select",name:"sourceLibrary",message:`Which icon library would you like to ${e.info("migrate from")}?`,choices:i,initial:y===-1?0:y},{type:l?null:"select",name:"targetLibrary",message:`Which icon library would you like to ${e.info("migrate to")}?`,choices:i}]);s=s??g.sourceLibrary,l=l??g.targetLibrary;}if((!s||!l)&&(f.info("Migration cancelled."),process.exit(0)),s===l)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");let c=Ee[s],m=Ee[l];if(!t.yes){let y=t.path?t.path:`./${T__default.relative(e$1.resolvedPaths.cwd,o)}`,{confirm:g}=await de({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${e.info(r.length)} files in ${e.info(y)} from ${e.info(c.title)} to ${e.info(m.title)}. Continue?`});g||(f.info("Migration cancelled."),process.exit(0));}await Ia([...m.packages],[],e$1,{silent:false});let d=C("Migrating icons...")?.start(),p=new Map;if(await Promise.all(r.map(async y=>{d.text=`Migrating ${y}...`;let g=T__default.join(o,y),u=await promises.readFile(g,"utf-8"),{content:w,skipped:k}=await Ic(u,s,l,n);for(let b of k)p.has(b.icon)||p.set(b.icon,b.reason);await promises.writeFile(g,w);})),d.succeed("Migration complete."),t.path||await Sc(e$1,l),p.size>0){f.break(),f.warn(`Skipped ${p.size} icon${p.size===1?"":"s"}. These were left untouched:`);for(let[y,g]of Array.from(p))f.warn(` - ${y}: ${g}`);}}async function Sc(e$1,t){let r=T__default.resolve(e$1.resolvedPaths.cwd,"components.json");if(!L.existsSync(r))return;let o=await L.readJson(r);o.iconLibrary!==t&&(o.iconLibrary=t,await L.writeJson(r,o,{spaces:2}),f.info(`Updated ${e.info("iconLibrary")} in components.json to ${e.info(t)}.`));}async function Ic(e,t,r,o){let n=Ee[t],i=Ee[r],s=b$2(n.import),l=c$4(n.usage),c=c$4(i.usage);if(!s)throw new Error(`Could not resolve the icon import for ${n.title}.`);let m=Pc(o,t),d=[],p=await promises.mkdtemp(T__default.join(tmpdir(),"shadcn-")),y=new Project({compilerOptions:{}}),g=T__default.join(p,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),u=y.createSourceFile(g,e,{scriptKind:ScriptKind.TSX}),w=[];for(let k of u.getImportDeclarations()??[])if(!(k.getModuleSpecifier()?.getLiteralValue()!==s||k.isTypeOnly())){for(let b of [...k.getNamedImports()??[]]){if(b.isTypeOnly())continue;let R=b.getName(),S=b.getAliasNode()?.getText()??R,x=m.get(R),j=x?o[x]?.[r]:void 0;if(!j){d.push({icon:R,reason:`no ${i.title} equivalent found`});continue}let O=$c(u,S,l);if(O.complex){d.push({icon:R,reason:"unsupported usage (e.g. referenced outside JSX)"});continue}if(c.componentName!=="ICON"&&(O.references>0||O.paired>0)){d.push({icon:R,reason:`cannot be wrapped in <${c.componentName} />`});continue}b.remove(),Ec(u,S,j,l,c),w.includes(j)||w.push(j);}k.getNamedImports()?.length===0&&!k.getDefaultImport()&&!k.getNamespaceImport()&&k.remove();}if(l.componentName!=="ICON"&&w.length>0&&Tc(u,n.import,l),w.length>0)for(let k of a$5(i.import)){let b=k.namedImports.flatMap(S=>S==="ICON"?w:[S]);!k.namedImports.includes("ICON")&&u.getImportDeclarations().some(S=>S.getModuleSpecifier()?.getLiteralValue()===k.moduleSpecifier&&S.getNamedImports().some(x=>b.includes(x.getName())))||u.addImportDeclaration({moduleSpecifier:k.moduleSpecifier,namedImports:b.map(S=>({name:S}))});}return {content:u.getText(),skipped:d}}function Pc(e,t){let r=new Map;for(let[o,n]of Object.entries(e)){let i=n[t];i&&!r.has(i)&&r.set(i,o);}if(t==="lucide")for(let[o,n]of Array.from(r)){let i=o.endsWith("Icon")?o.slice(0,-4):`${o}Icon`;i&&!r.has(i)&&r.set(i,n);}return r}function $c(e,t,r){let o={selfClosing:0,paired:0,references:0,complex:false};for(let n of e.getDescendantsOfKind(SyntaxKind.Identifier)){if(n.getText()!==t||n.getFirstAncestorByKind(SyntaxKind.ImportDeclaration))continue;let i=n.getParent(),s=i?.getKind();if(r.componentName==="ICON"){s===SyntaxKind.JsxSelfClosingElement?o.selfClosing++:s===SyntaxKind.JsxOpeningElement?o.paired++:s===SyntaxKind.JsxClosingElement||(s===SyntaxKind.JsxExpression&&i?.getParent()?.getKind()===SyntaxKind.JsxAttribute?o.references++:o.complex=true);continue}let l=n.getFirstAncestorByKind(SyntaxKind.JsxAttribute),c=n.getFirstAncestorByKind(SyntaxKind.JsxSelfClosingElement);s===SyntaxKind.JsxExpression&&l?.getNameNode().getText()===r.iconAttribute&&c?.getTagNameNode()?.getText()===r.componentName?o.selfClosing++:o.complex=true;}return o}function Ec(e,t,r,o,n){if(o.componentName==="ICON"){for(let i of e.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement))i.getTagNameNode()?.getText()===t&&pi(i,r,o,n);for(let i of e.getDescendantsOfKind(SyntaxKind.JsxElement)){let s=i.getOpeningElement();s.getTagNameNode()?.getText()===t&&(jc(s,o,n),s.getTagNameNode()?.replaceWithText(r),i.getClosingElement().getTagNameNode()?.replaceWithText(r));}for(let i of e.getDescendantsOfKind(SyntaxKind.Identifier)){if(i.getText()!==t||i.getFirstAncestorByKind(SyntaxKind.ImportDeclaration))continue;let s=i.getParent();s?.getKind()===SyntaxKind.JsxExpression&&s?.getParent()?.getKind()===SyntaxKind.JsxAttribute&&i.replaceWithText(r);}return}for(let i of e.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement)){if(i.getTagNameNode()?.getText()!==o.componentName||!o.iconAttribute)continue;let s=i.getAttribute(o.iconAttribute);!s||s.getKind()!==SyntaxKind.JsxAttribute||s.asKindOrThrow(SyntaxKind.JsxAttribute).getInitializer()?.getText()!==`{${t}}`||pi(i,r,o,n,{excludeAttribute:o.iconAttribute});}}function pi(e,t,r,o,n={}){let i=r.componentName==="ICON"&&Object.keys(r.attributes).length===0,s=o.componentName==="ICON"&&Object.keys(o.attributes).length===0;if(i&&s){e.getTagNameNode()?.replaceWithText(t);return}let l=e.getAttributes().filter(p=>{if(p.getKind()!==SyntaxKind.JsxAttribute)return true;let y=p.asKindOrThrow(SyntaxKind.JsxAttribute),g=y.getNameNode().getText();return g===n.excludeAttribute?false:r.attributes[g]!==(y.getInitializer()?.getText()??"")}).map(p=>p.getText()),c=new Set(e.getAttributes().filter(p=>p.getKind()===SyntaxKind.JsxAttribute).map(p=>p.asKindOrThrow(SyntaxKind.JsxAttribute).getNameNode().getText())),m=Object.entries(o.attributes).filter(([p])=>!c.has(p)).map(([p,y])=>`${p}=${y}`),d=o.componentName==="ICON"?[t,...m,...l]:[o.componentName,`${o.iconAttribute}={${t}}`,...m,...l];e.replaceWithText(`<${d.join(" ")} />`);}function jc(e,t,r){for(let[o,n]of Object.entries(t.attributes)){let i=e.getAttribute(o);i?.getKind()===SyntaxKind.JsxAttribute&&(i.asKindOrThrow(SyntaxKind.JsxAttribute).getInitializer()?.getText()??"")===n&&i.remove();}for(let[o,n]of Object.entries(r.attributes))e.getAttribute(o)||e.addAttribute({name:o,initializer:n});}function Tc(e,t,r){let o=r.componentName;if(e.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).some(s=>s.getTagNameNode()?.getText()===o)||e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement).some(s=>s.getTagNameNode()?.getText()===o))return;let i=a$5(t).filter(s=>!s.namedImports.includes("ICON")).map(s=>s.moduleSpecifier);for(let s of e.getImportDeclarations()??[])if(i.includes(s.getModuleSpecifier()?.getLiteralValue()??"")){for(let l of [...s.getNamedImports()??[]])l.getName()===o&&l.remove();s.getNamedImports()?.length===0&&!s.getDefaultImport()&&!s.getNamespaceImport()&&s.remove();}}function Fc(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Oc(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 l=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=s.match(/^(\w+)\s+as\s+(\w+)$/);if(l){let m=l[1],d=l[2];o==="slot"&&m==="Slot"&&!d?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:m,alias:d,isType:true});}else if(c){let m=c[1],d=c[2];o==="slot"&&m==="Slot"&&d==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:m,alias:d,isType:t});}else o==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t});}}async function ui(e$1,t={}){let r,o;if(t.path){if(o=e$1.resolvedPaths.cwd,t.path.includes("*"))r=await jr(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else {let c=T__default.resolve(o,t.path),m=await promises.stat(c).catch(()=>null);if(!m)throw new Error(`File not found: ${t.path}`);if(m.isDirectory())o=c,r=await jr("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,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$1.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$1.resolvedPaths.ui,r=await jr("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true});}if(!t.yes){let l=t.path?t.path:`./${T__default.relative(e$1.resolvedPaths.cwd,o)}`,{confirm:c}=await de({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${e.info(r.length)} file(s) in ${e.info(l)} to ${e.info("radix-ui")}. Continue?`});c||(f.info("Migration cancelled."),process.exit(0));}let n=C("Migrating imports...")?.start(),i=new Set;await Promise.all(r.map(async l=>{n.text=`Migrating ${l}...`;let c=T__default.join(o,l),m=await promises.readFile(c,"utf-8"),{content:d,replacedPackages:p}=await Ac(m);p.forEach(y=>i.add(y)),await promises.writeFile(c,d);})),n.succeed("Migrating imports.");let s=C("Updating package.json...")?.start();try{let l=z$1(e$1.resolvedPaths.cwd,!1);if(!l){s.fail("Could not read package.json"),f.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(i);if(c.length>0){if(l.dependencies||(l.dependencies={}),l.dependencies?.["radix-ui"]||l.devDependencies?.["radix-ui"])s.succeed("radix-ui already in package.json.");else {l.dependencies["radix-ui"]="latest";let d=T__default.join(e$1.resolvedPaths.cwd,"package.json");await promises.writeFile(d,JSON.stringify(l,null,2)+`
128
- `),s.succeed("Updated package.json."),await Ia(["radix-ui"],[],e$1,{silent:!1});}f.info(""),f.info("Migration complete. The following packages may be removed if no longer in use:"),f.info(e.info(c.join(", "))),f.info("Please review your codebase before removing.");}else s.succeed("No packages found in source files.");}catch{s.fail("Failed to update package.json"),f.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Ac(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],o=[],n=[],i='"',s=false,l=e,c;for(;(c=t.exec(e))!==null;){let[u,w,k,b,R,S,x]=c;if(S==="icons"||S.startsWith("icons/"))continue;o.push(u),o.length===1&&(i=R,s=x===";"),n.push(`@radix-ui/react-${S}`);let j=!!w;if(k){let O=Fc(S);r.push({name:O,alias:k,isType:j});}else b&&Oc(b,j,r,S);}if(r.length===0)return {content:e,replacedPackages:[]};let m=r.filter((u,w,k)=>w===k.findIndex(b=>b.name===u.name&&b.alias===u.alias&&b.isType===u.isType)),p=`import { ${m.map(u=>{let w=u.isType?"type ":"";return u.alias?`${w}${u.name} as ${u.alias}`:`${w}${u.name}`}).join(", ")} } from ${i}radix-ui${i}${s?";":""}`;l=o.reduce((u,w,k)=>u.replace(w,k===0?p:""),l),l=l.replace(/\n\s*\n\s*\n/g,`
129
-
130
- `),m.some(u=>u.name==="Slot"&&u.alias==="SlotPrimitive")&&(l=l.split(`
131
- `).map(k=>{if(k.trim().startsWith("import "))return k;let b=k;return b=b.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),b=b.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),b=b.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),b=b.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),b=b.replace(/\bSlot\b/g,(R,S,x)=>{let j=x.substring(0,S),O=(j.match(/"/g)||[]).length,X=(j.match(/'/g)||[]).length;return O%2!==0||X%2!==0?R:"__SLOT_PLACEHOLDER__"}),b=b.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),b}).join(`
132
- `));let g=Array.from(new Set(n));return {content:l,replacedPackages:g}}var Dc=["sidebar.tsx","pagination.tsx","calendar.tsx"],_c=`${a$1}/docs/rtl#manual-migration-optional`;async function gi(e$1,t={}){let r,o;if(t.path){if(o=e$1.resolvedPaths.cwd,t.path.includes("*"))r=await jr(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else {let m=T__default.resolve(o,t.path),d=await promises.stat(m).catch(()=>null);if(!d)throw new Error(`File not found: ${t.path}`);if(d.isDirectory())o=m,r=await jr("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else if(d.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$1.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$1.resolvedPaths.ui,r=await jr("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true});}if(!t.yes){let c=t.path?t.path:`./${T__default.relative(e$1.resolvedPaths.cwd,o)}`,{confirm:m}=await de({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${e.info(r.length)} file(s) in ${e.info(c)} to RTL. Continue?`});m||(f.info("Migration cancelled."),process.exit(0));}let n=C("Updating components.json...").start();try{let c=T__default.resolve(e$1.resolvedPaths.cwd,"components.json"),m=JSON.parse(await promises.readFile(c,"utf-8"));m.rtl=!0,await promises.writeFile(c,JSON.stringify(m,null,2)+`
133
- `),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=C("Migrating files to RTL...").start(),s=0,l=[];if(await Promise.all(r.map(async c=>{i.text=`Migrating ${c}...`;let m=T__default.join(o,c),d=await promises.readFile(m,"utf-8"),p=await e$2(d,true);p!==d&&(await promises.writeFile(m,p),s++);let y=T__default.basename(c);Dc.includes(y)&&l.push(c);})),i.succeed(`Migration complete. ${s} file(s) transformed.`),l.length>0){f.break(),f.warn("The following components may need manual RTL adjustments:");for(let c of l)f.info(` - ${c}`);f.break(),f.info(`See ${e.info(_c)} for more information.`);}}async function yi(e$1){let t={};if(!L.existsSync(e$1.cwd)||!L.existsSync(T__default.resolve(e$1.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!L.existsSync(T__default.resolve(e$1.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await W(e$1.cwd);return {errors:t,config:r}}catch{f.break(),f.error(`An invalid ${e.info("components.json")} file was found at ${e.info(e$1.cwd)}.
134
- Before you can run a migration, you must create a valid ${e.info("components.json")} file by running the ${e.info("init")} command.`),f.error(`Learn more at ${e.info(`${a$1}/docs/components-json`)}.`),f.break(),process.exit(1);}}var wi=[{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)."}],Uc=z.object({cwd:z.string(),list:z.boolean(),yes:z.boolean(),from:z.string().optional(),to:z.string().optional(),migration:z.string().refine(e=>e&&wi.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional(),path:z.string().optional()}),ki=new Command().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.",false).option("-y, --yes","skip confirmation prompt.",false).option("-f, --from <library>","the icon library to migrate from (icons migration only).").option("-t, --to <library>","the icon library to migrate to (icons migration only).").action(async(e,t,r)=>{try{let o=Uc.parse({cwd:T__default.resolve(r.cwd),migration:e,path:t,list:r.list,yes:r.yes,from:r.from,to:r.to});if(o.list||!o.migration){f.info("Available migrations:");for(let s of wi)f.info(`- ${s.name}: ${s.description}`);return}if(!o.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:n,config:i}=await yi(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 di(i,{from:o.from,to:o.to,path:o.path,yes:o.yes}),o.migration==="radix"&&await ui(i,{yes:o.yes,path:o.path}),o.migration==="rtl"&&await gi(i,{yes:o.yes,path:o.path});}catch(o){f.break(),ia(o);}});function Jc(e){return `${a$1}/create?preset=${e}`}function Ar(e){let t=s(e);if(!t)throw new Error(`Invalid preset code: ${e}`);let r=[],o=t.chartColor??h$1[t.theme]??t.theme;return t.chartColor||r.push("chartColor"),{code:e,version:e[0],values:{...t,chartColor:o},derived:r,url:Jc(e)}}function zc(e){Ht({code:e.code,fallbacks:e.derived,values:e.values},{fallbackNote:" * Compatibility value for older preset versions."});}var Hc=new Command().name("decode").description("decode a preset code").argument("<code>","the preset code to decode").option("--json","output as JSON.",false).action((e,t)=>{try{let r=Ar(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}zc(r);}catch(r){Zt(r);}}),Gc=new Command().name("url").description("get the create URL for a preset code").argument("<code>","the preset code").action(e=>{try{f.log(Ar(e).url);}catch(t){Zt(t);}}),Kc=new Command().name("open").description("open a preset code in the browser").argument("<code>","the preset code").action(async e=>{let t;try{t=Ar(e).url;}catch(r){Zt(r);return}f.break(),f.log(` Opening ${t} in your browser.`),f.break();try{await Hi(t);}catch(r){let o=r instanceof Error?r.message:String(r);Zt(new Error(`Failed to open preset URL: ${o}`));}}),Yc=new Command().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.",false).action(async e=>{try{let t=T__default.resolve(e.cwd);if(!existsSync(T__default.resolve(t,"components.json"))&&await g(t)){let i$1=await h(t);i$1.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$1.map(s=>s.name)},null,2)):i("preset resolve",i$1),process.exit(1));}let r=await W(t);if(!r){if(e.json){console.log(JSON.stringify(null,null,2));return}f.log("No components.json found.");return}let o=await za$1(t),n=await Jt(r,o);if(e.json){console.log(JSON.stringify(n.code?n:null,null,2));return}Ht(n);}catch(t){ia(t);}}),Lr=new Command().name("preset").description("manage presets").addCommand(Hc).addCommand(Yc).addCommand(Gc).addCommand(Kc).action(()=>{Lr.outputHelp();});function Zt(e){e instanceof Error&&f.error(e.message),process.exit(1);}var Zc=z.object({cwd:z.string(),silent:z.boolean()}),xi=new Command().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.",false).action(async(e,t)=>{try{let r=Zc.parse({cwd:T__default.resolve(t.cwd),silent:t.silent}),o=e.length>0?e:await tl({silent:r.silent});await el(o,r.cwd,{silent:r.silent});}catch(r){f.break(),ia(r);}});function Qc(e$1){let[t,...r]=e$1.split("="),o=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${e.info(t)}. Registry names must start with @ (e.g., @acme).`);return {namespace:t,url:o}}function Vr(e,t,r){return `${e} ${e===1?t:r}`}async function el(e$1,t,r){let o=T__default.resolve(t,"components.json");if(!L.existsSync(o))throw new Error(`No ${e.info("components.json")} found. Run ${e.info("shadcn init")} first.`);let n=e$1.map(Qc),i=n.filter(u=>!u.url),s=[];if(i.length>0){let u=C("Fetching registries.",{silent:r.silent}).start(),w=await va$1();if(!w)throw u.fail(),new Error("Failed to fetch registries.");u.succeed(),s=w;}let l={};for(let{namespace:u,url:w}of n){if(u in b$1){f.warn(`${e.info(u)} is a built-in registry and cannot be added.`);continue}if(w){if(!w.includes("{name}"))throw new Error(`Invalid registry URL for ${e.info(u)}. URL must include {name} placeholder. Example: ${e.info(`${u}=https://example.com/r/{name}.json`)}`);l[u]=w;}else {let k=s.find(b=>b.name===u);if(!k)throw new Error(`Registry ${e.info(u)} not found. Provide a URL: ${e.info(`${u}=https://.../{name}.json`)}`);l[u]=k.url;}}if(Object.keys(l).length===0)return {addedRegistries:[]};let c=await L.readJson(o),m=c.registries||{},d={},p=[];for(let[u,w]of Object.entries(l))m[u]?p.push(u):d[u]=w;if(Object.keys(d).length===0){if(p.length>0&&!r.silent){C(`Skipped ${Vr(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let u of p)f.log(` - ${u}`);}else r.silent||f.info("No new registries to add.");return}let y={...c,registries:{...m,...d}},g=C("Updating components.json.",{silent:r.silent}).start();if(await L.writeJson(o,y,{spaces:2}),g.succeed(),!r.silent){let u=Object.keys(d);C(`Added ${Vr(u.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let w of u)f.log(` - ${w}`);if(p.length>0){C(`Skipped ${Vr(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let w of p)f.log(` - ${w}`);}}}async function tl(e){let t=C("Fetching registries.",{silent:e.silent}).start(),r=await va$1();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 de({type:"autocompleteMultiselect",name:"selected",message:"Which registries would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:o.map(i=>({title:i.name,description:i.description,value:i.name}))});return n?.length||(f.warn("No registries selected. Exiting."),f.info(""),process.exit(1)),n}var vi=32,rl=f$3.options.filter(e=>e!=="registry:example"&&e!=="registry:internal"),ol=z.record(z.string(),z.unknown()),nl=z.array(z.string()),il=z.array(z.unknown());async function Si(e){let t=T.resolve(e.cwd),r=T.resolve(t,e.registryFile),o={cwd:t,rootFile:r,usesInclude:false,diagnostics:[],registryFiles:new Set,checkedRegistryFiles:new Set,itemsChecked:0,itemSourcesByItem:new Map,firstIncludedFrom:new Map};if(T.basename(r)!=="registry.json"&&N(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 shadcn registry validate."}),!Wr(r,t))return N(o,{registryFile:r,message:`Root registry file must stay inside ${He(t,t)}.`,suggestion:"Run the command from the registry root or pass a registry.json file inside --cwd."}),Ur(o);let n=await Pi(r,o);if(!n)return Ur(o);o.usesInclude=!!n.include?.length,sl(n,r,o);let i=await Ii(r,n,o,[]);return cl(i,o),await ll(i,o),Ur(o)}async function Ii(e,t,r,o){if(o.length>=vi)return N(r,{registryFile:e,message:`Registry include tree is too deep. The maximum include depth is ${vi}.`,suggestion:"Flatten part of the registry include tree or reduce nested include depth."}),[];if(o.includes(e))return N(r,{registryFile:e,message:`Registry include cycle detected: ${hl([...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 N(r,{registryFile:e,message:`Registry file included more than once. First included from ${He(i,r.cwd)}, then included from ${He(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=T.dirname(e),l=[...o,e],c=[];for(let d of t.include??[]){let p=al(d,e,s,r);if(!p)continue;let y=await Pi(p,r);if(!y)continue;let g=await Ii(p,y,r,l);c.push(...g);}let m=!r.usesInclude&&e===r.rootFile?r.cwd:s;return t.items.forEach((d,p)=>{r.itemSourcesByItem.set(d,{registryFile:e,registryDir:m,itemIndex:p});}),[...c,...t.items]}async function Pi(e,t){t.checkedRegistryFiles.add(e);let r;try{r=await Ie.readFile(e,"utf-8");}catch{return N(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 N(t,{registryFile:e,message:"Registry file contains invalid JSON.",suggestion:"Fix the JSON syntax in the registry.json file."}),null}return pl(o,e,t)}function sl(e,t,r){!e.name&&!e.hasName&&N(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&&N(r,{registryFile:t,message:'Root registry.json must define "homepage".',suggestion:'Add a top-level "homepage" field to the root registry.json.'});}function al(e,t,r,o){if(N$1(e))return N(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(T.isAbsolute(e))return N(o,{registryFile:t,includePath:e,message:`Include "${e}" must be relative.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;if($i(e))return N(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(T.basename(e)!=="registry.json")return N(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=T.resolve(r,e);return Wr(n,o.cwd)?n:(N(o,{registryFile:t,includePath:e,message:`Include "${e}" must stay inside ${He(o.cwd,o.cwd)}.`,suggestion:"Keep included registry.json files inside the registry root."}),null)}function cl(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);N(t,{registryFile:s?.registryFile??t.rootFile,itemName:o.name,itemIndex:s?.itemIndex,message:`Duplicate registry item name "${o.name}". First defined at ${yl(i,t.cwd)}.`,suggestion:"Rename one of these items so each name is unique across the resolved registry."});}}async function ll(e,t){let r=gl(t);for(let o of e){let n=t.itemSourcesByItem.get(o),i={...fl(o,t,r),$schema:"https://ui.shadcn.com/schema/registry-item.json"};for(let l=0;l<(o.files?.length??0);l++){let c=o.files?.[l];if(!c||!n)continue;let m=ml(o,c.path,n,t);if(m)try{await Ie.readFile(m,"utf-8");}catch{N(t,{registryFile:n.registryFile,itemName:o.name,itemIndex:n.itemIndex,filePath:c.path,message:`File "${c.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=n$1.safeParse(i);s.success||at(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 ml(e,t,r,o){if(N$1(t))return N(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(T.isAbsolute(t))return N(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($i(t))return N(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=T.resolve(r.registryDir,t);return Wr(n,r.registryDir)?n:(N(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 fl(e,t,r){let o=t.itemSourcesByItem.get(e);return {...e,files:e.files?.map(n=>{let i=T.resolve(o?.registryDir??t.cwd,n.path);return {...n,path:T.relative(r,i).split(T.sep).join("/")}})}}function pl(e,t,r){let o=ol.safeParse(e);if(!o.success)return at(o.error,t,r,{suggestion:"Update the registry.json file so it matches the schema."}),null;let n=o.data,i={$schema:Mr(n,"$schema",t,r),name:Mr(n,"name",t,r),homepage:Mr(n,"homepage",t,r),hasName:n.name!==void 0,hasHomepage:n.homepage!==void 0,items:[]};if(n.include!==void 0){let s=nl.safeParse(n.include);s.success?i.include=s.data:at(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=il.safeParse(n.items);s.success?(r.itemsChecked+=s.data.length,i.items=dl(s.data,t,r)):at(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&&N(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 dl(e,t,r){let o=[];return e.forEach((n,i)=>{let s=n$1.safeParse(n);if(!s.success){at(s.error,t,r,{itemName:ul(n),itemIndex:i,suggestion:"Update the registry item so it matches the registry item schema."});return}o.push(s.data);}),o}function Mr(e,t,r,o){let n=e[t];if(n!==void 0){if(typeof n=="string")return n;N(o,{registryFile:r,message:`${t}: Expected string, received ${typeof n}.`,suggestion:`Update "${t}" so it is a string.`});}}function ul(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e.name;return typeof t=="string"?t:void 0}function at(e,t,r,o){for(let n of e.errors)N(r,{registryFile:t,itemName:o.itemName,itemIndex:o.itemIndex,message:wl(n,o.pathPrefix),suggestion:o.suggestion});}function N(e,t){e.diagnostics.push(t);}function Ur(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 gl(e){return e.usesInclude?T.dirname(e.rootFile):e.cwd}function $i(e){return e.split(/[\\/]+/).includes("..")}function Wr(e,t){let r=T.relative(t,e);return !!r&&!r.startsWith("..")&&!T.isAbsolute(r)}function hl(e){return e.map(t=>He(t,T.dirname(e[0]))).join(" -> ")}function yl(e,t){return e?`${He(e.registryFile,t)} items[${e.itemIndex}]`:"unknown source"}function Ri(e){return e.length?e.join("."):"(root)"}function wl(e,t=[]){let r=[...t,...e.path];return e.code===z.ZodIssueCode.invalid_union_discriminator&&e.path.at(-1)==="type"?`${Ri(r)}: Invalid registry item type. Expected ${rl.map(o=>`"${o}"`).join(" | ")}.`:`${Ri(r)}: ${e.message}`}function He(e,t){let r=T.relative(t,e);return r&&!r.startsWith("..")&&!T.isAbsolute(r)?r.split(T.sep).join("/"):r?e:"."}var bl=z.object({cwd:z.string(),registryFile:z.string()}),Ni=new Command().name("validate").description("validate a shadcn registry").argument("[registry]","registry address to validate. Supports registry.json paths and GitHub sources.","./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=bl.parse({cwd:T.resolve(t.cwd),registryFile:e}),n=await Sl(e,o.cwd);r=C("Validating registry.").start();let i=n?await ca$1(n):await Si(o);Cl(i,r),i.valid||(process.exitCode=1);}catch(o){r?.fail("Registry validation failed."),f.break(),ia(o);}});function Cl(e$1,t){if(e$1.valid){t.succeed("Registry is valid."),Ei(e$1,{success:true});return}t.fail("Registry validation failed."),Ei(e$1),f.break();for(let[r,o]of Array.from(xl(e$1))){f.log(e.info(Fi(r,e$1.cwd)));for(let n of o)f.error(` - ${vl(n)}`),n.suggestion&&f.log(` ${n.suggestion}`);f.break();}}function Ei(e,t={}){let r=`Checked ${ji(e.registryFiles,"registry file","registry files")} and ${ji(e.items,"item","items")}.`;t.success?Rl(r):f.log(` ${r}`);for(let o of e.registryFilePaths)f.log(` - ${Fi(o,e.cwd)}`);}function xl(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 vl(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 Fi(e,t){let r=T.relative(t,e);return r&&!r.startsWith("..")&&!T.isAbsolute(r)?r.split(T.sep).join("/"):r?e:"."}function Rl(e){C(e).succeed();}function ji(e,t,r){return `${e} ${e===1?t:r}`}async function Sl(e,t){return Il(e)||await Pl(T.resolve(t,e))?null:P(e)}function Il(e){return e.startsWith(".")||T.isAbsolute(e)||e.endsWith(".json")}async function Pl(e){try{return await Ie.access(e),!0}catch{return false}}var Oi=new Command().name("registry").description("manage registries").addCommand(xi).addCommand(Ni);var jl=z.object({cwd:z.string(),query:z.string().optional(),types:z.array(z.string()).optional(),limit:z.number().optional(),offset:z.number().optional()}),Di=new Command().name("search").alias("list").description("search items from registries").argument("[registries...]","the registry addresses to search. Supports namespaces, GitHub sources and URLs. When omitted, searches all registries configured in components.json.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-t, --type <type>","filter by item type, e.g. ui, block, hook. Comma-separated for multiple.").option("-l, --limit <number>","maximum number of items to display","100").option("-o, --offset <number>","number of items to skip","0").option("--json","output as JSON.",false).action(async(e$1,t)=>{try{let r=jl.parse({cwd:T__default.resolve(t.cwd),query:t.query,types:t.type?t.type.split(",").map(u=>u.trim()).filter(Boolean):void 0,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});if(r.types?.length){let u=Wa$1(r.types);u.length>0&&(f.break(),f.error(`Unknown ${u.length===1?"type":"types"}: ${u.map(w=>e.info(w)).join(", ")}.`),f.error(`Valid types: ${Va$1.join(", ")}.`),f.break(),process.exit(1));}await Ma$1(r.cwd);let o=_({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n=$(o),i=T__default.resolve(r.cwd,"components.json"),s=L.existsSync(i);if(s){let u=await L.readJson(i),w=c.partial().parse(u);n=$({...o,...w});}let l=n;try{let u=await W(r.cwd);u&&(l=$(u));}catch{}let c$1=e$1.length===0;c$1&&!s&&(f.break(),f.error(`Provide a registry or namespace to search, e.g. ${e.info("shadcn search @shadcn")}.`),f.break(),f.error(`If you have a ${e.info("components.json")} with registries configured, run ${e.info("shadcn search")} with no arguments to search all of them.`),f.break(),process.exit(1));let{config:m,newRegistries:d}=await B(e$1.filter(u=>u.startsWith("@")&&!l.registries?.[u]&&!(u in b$1)).map(u=>`${u}/registry`),l,{silent:!0,writeFile:!1});d.length>0&&(l.registries=m.registries);let p=Ta$1(e$1,l);c$1&&p.length===0&&(f.break(),f.error(`No registries are configured in ${e.info("components.json")}.`),f.error(`Provide a registry or namespace to search, e.g. ${e.info("shadcn search @shadcn")}.`),f.break(),process.exit(1)),c$1||aa$1(p,l);let y=await Ua$1(p,{query:r.query,types:r.types,limit:r.limit,offset:r.offset,config:l,continueOnError:c$1}),g=c$1&&y.errors?.length===p.length;t.json?console.log(JSON.stringify(y,null,2)):Xa$1(y,{query:r.query,types:r.types,registries:p}),process.exit(g?1:0);}catch(r){ia(r);}finally{Q();}});var Nl=z.object({cwd:z.string()}),Ui=new Command().name("view").description("view items from the registry").argument("<items...>","item addresses to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Nl.parse({cwd:T__default.resolve(t.cwd)});await Ma$1(r.cwd);let o=$({}),n=T__default.resolve(r.cwd,"components.json");if(L.existsSync(n)){let m=await L.readJson(n),d=c.partial().parse(m);o=$(d);}let i=o;try{let m=await W(r.cwd);m&&(i=$(m));}catch{}let{config:s,newRegistries:l}=await B(e,i,{silent:!0,writeFile:!1});l.length>0&&(i.registries=s.registries),aa$1(e,i);let c$1=await ka$1(e,{config:i});console.log(JSON.stringify(c$1,null,2)),process.exit(0);}catch(r){ia(r);}finally{Q();}});process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Ol(){let e=new Command().name("shadcn").description("build your component library").version(ha$1.version||"1.0.0","-v, --version","display the version number");e.addCommand(dn).addCommand(On).addCommand($n).addCommand(Mn).addCommand(Bn).addCommand(Ui).addCommand(Di).addCommand(ki).addCommand(Jn).addCommand(ai).addCommand(_n).addCommand(Er).addCommand(Lr).addCommand(Oi),e.parse();}Ol();
126
+ args = ["shadcn@${$e}", "mcp"]`),f.break(),f.info("3. Restart Codex to load the MCP server"),f.break(),process.exit(0);}let l=C("Configuring MCP server...").start(),c=await xc(i);if(l.succeed("Configuring MCP server."),s)await Ja$1([],Kt,s,{silent:!1});else {let m=await fa(i.cwd),d=m==="npm"?"install":"add",p=m==="npm"?"--save-dev":"-D",u=C("Installing dependencies...").start();await execa(m,[d,p,...Kt],{cwd:i.cwd}),u.succeed("Installing dependencies.");}f.break(),f.success(`Configuration saved to ${c}.`),f.break();}catch(r){ia$1(r);}});var Cc=(e,t)=>t;async function xc(e){let{client:t,cwd:r}=e,o=Yt.find(c=>c.name===t);if(!o)throw new Error(`Unknown client: ${t}. Available clients: ${Yt.map(c=>c.name).join(", ")}`);let n=j__default.join(r,o.configPath),i=j__default.dirname(n);await L.ensureDir(i);let s={};try{let c=await promises.readFile(n,"utf-8");s=JSON.parse(c);}catch{}let l=Qo(s,o.config,{arrayMerge:Cc});return await promises.writeFile(n,JSON.stringify(l,null,2)+`
127
+ `,"utf-8"),o.configPath}var Ee={...a$4,radix:{name:"radix",title:"Radix Icons",packages:["@radix-ui/react-icons"],import:"import { ICON } from '@radix-ui/react-icons'",usage:"<ICON />",export:"@radix-ui/react-icons"}};async function yi(e$1,t={}){let r,o;if(t.path){if(o=e$1.resolvedPaths.cwd,t.path.includes("*"))r=await Nr(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else {let g=j__default.resolve(o,t.path),h=await promises.stat(g).catch(()=>null);if(!h)throw new Error(`File not found: ${t.path}`);if(h.isDirectory())o=g,r=await Nr("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else if(h.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$1.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$1.resolvedPaths.ui,r=await Nr("**/*.{js,ts,jsx,tsx}",{cwd:o});}let n=await qa$1();if(Object.keys(n).length===0)throw new Error("Something went wrong fetching the registry icons.");let i=Object.entries(Ee).map(([u,g])=>({title:g.title,value:u}));for(let u of [t.from,t.to])if(u&&!(u in Ee))throw new Error(`Unknown icon library: ${u}. Available libraries: ${Object.keys(Ee).join(", ")}.`);let s=t.from,l=t.to;if(!s||!l){let u=i.findIndex(h=>h.value===e$1.iconLibrary),g=await de([{type:s?null:"select",name:"sourceLibrary",message:`Which icon library would you like to ${e.info("migrate from")}?`,choices:i,initial:u===-1?0:u},{type:l?null:"select",name:"targetLibrary",message:`Which icon library would you like to ${e.info("migrate to")}?`,choices:i}]);s=s??g.sourceLibrary,l=l??g.targetLibrary;}if((!s||!l)&&(f.info("Migration cancelled."),process.exit(0)),s===l)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");let c=Ee[s],m=Ee[l];if(!t.yes){let u=t.path?t.path:`./${j__default.relative(e$1.resolvedPaths.cwd,o)}`,{confirm:g}=await de({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${e.info(r.length)} files in ${e.info(u)} from ${e.info(c.title)} to ${e.info(m.title)}. Continue?`});g||(f.info("Migration cancelled."),process.exit(0));}await Ja$1([...m.packages],[],e$1,{silent:false});let d=C("Migrating icons...")?.start(),p=new Map;if(await Promise.all(r.map(async u=>{d.text=`Migrating ${u}...`;let g=j__default.join(o,u),h=await promises.readFile(g,"utf-8"),{content:w,skipped:k}=await $c(h,s,l,n);for(let b of k)p.has(b.icon)||p.set(b.icon,b.reason);await promises.writeFile(g,w);})),d.succeed("Migration complete."),t.path||await Pc(e$1,l),p.size>0){f.break(),f.warn(`Skipped ${p.size} icon${p.size===1?"":"s"}. These were left untouched:`);for(let[u,g]of Array.from(p))f.warn(` - ${u}: ${g}`);}}async function Pc(e$1,t){let r=j__default.resolve(e$1.resolvedPaths.cwd,"components.json");if(!L.existsSync(r))return;let o=await L.readJson(r);o.iconLibrary!==t&&(o.iconLibrary=t,await L.writeJson(r,o,{spaces:2}),f.info(`Updated ${e.info("iconLibrary")} in components.json to ${e.info(t)}.`));}async function $c(e,t,r,o){let n=Ee[t],i=Ee[r],s=b$2(n.import),l=c$4(n.usage),c=c$4(i.usage);if(!s)throw new Error(`Could not resolve the icon import for ${n.title}.`);let m=Ec(o,t),d=[],p=await promises.mkdtemp(j__default.join(tmpdir(),"shadcn-")),u=new Project({compilerOptions:{}}),g=j__default.join(p,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),h=u.createSourceFile(g,e,{scriptKind:ScriptKind.TSX}),w=[];for(let k of h.getImportDeclarations()??[])if(!(k.getModuleSpecifier()?.getLiteralValue()!==s||k.isTypeOnly())){for(let b of [...k.getNamedImports()??[]]){if(b.isTypeOnly())continue;let S=b.getName(),v=b.getAliasNode()?.getText()??S,F=m.get(S),C=F?o[F]?.[r]:void 0;if(!C){d.push({icon:S,reason:`no ${i.title} equivalent found`});continue}let O=jc(h,v,l);if(O.complex){d.push({icon:S,reason:"unsupported usage (e.g. referenced outside JSX)"});continue}if(c.componentName!=="ICON"&&(O.references>0||O.paired>0)){d.push({icon:S,reason:`cannot be wrapped in <${c.componentName} />`});continue}b.remove(),Tc(h,v,C,l,c),w.includes(C)||w.push(C);}k.getNamedImports()?.length===0&&!k.getDefaultImport()&&!k.getNamespaceImport()&&k.remove();}if(l.componentName!=="ICON"&&w.length>0&&Fc(h,n.import,l),w.length>0)for(let k of a$5(i.import)){let b=k.namedImports.flatMap(v=>v==="ICON"?w:[v]);!k.namedImports.includes("ICON")&&h.getImportDeclarations().some(v=>v.getModuleSpecifier()?.getLiteralValue()===k.moduleSpecifier&&v.getNamedImports().some(F=>b.includes(F.getName())))||h.addImportDeclaration({moduleSpecifier:k.moduleSpecifier,namedImports:b.map(v=>({name:v}))});}return {content:h.getText(),skipped:d}}function Ec(e,t){let r=new Map;for(let[o,n]of Object.entries(e)){let i=n[t];i&&!r.has(i)&&r.set(i,o);}if(t==="lucide")for(let[o,n]of Array.from(r)){let i=o.endsWith("Icon")?o.slice(0,-4):`${o}Icon`;i&&!r.has(i)&&r.set(i,n);}return r}function jc(e,t,r){let o={selfClosing:0,paired:0,references:0,complex:false};for(let n of e.getDescendantsOfKind(SyntaxKind.Identifier)){if(n.getText()!==t||n.getFirstAncestorByKind(SyntaxKind.ImportDeclaration))continue;let i=n.getParent(),s=i?.getKind();if(r.componentName==="ICON"){s===SyntaxKind.JsxSelfClosingElement?o.selfClosing++:s===SyntaxKind.JsxOpeningElement?o.paired++:s===SyntaxKind.JsxClosingElement||(s===SyntaxKind.JsxExpression&&i?.getParent()?.getKind()===SyntaxKind.JsxAttribute?o.references++:o.complex=true);continue}let l=n.getFirstAncestorByKind(SyntaxKind.JsxAttribute),c=n.getFirstAncestorByKind(SyntaxKind.JsxSelfClosingElement);s===SyntaxKind.JsxExpression&&l?.getNameNode().getText()===r.iconAttribute&&c?.getTagNameNode()?.getText()===r.componentName?o.selfClosing++:o.complex=true;}return o}function Tc(e,t,r,o,n){if(o.componentName==="ICON"){for(let i of e.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement))i.getTagNameNode()?.getText()===t&&hi(i,r,o,n);for(let i of e.getDescendantsOfKind(SyntaxKind.JsxElement)){let s=i.getOpeningElement();s.getTagNameNode()?.getText()===t&&(Nc(s,o,n),s.getTagNameNode()?.replaceWithText(r),i.getClosingElement().getTagNameNode()?.replaceWithText(r));}for(let i of e.getDescendantsOfKind(SyntaxKind.Identifier)){if(i.getText()!==t||i.getFirstAncestorByKind(SyntaxKind.ImportDeclaration))continue;let s=i.getParent();s?.getKind()===SyntaxKind.JsxExpression&&s?.getParent()?.getKind()===SyntaxKind.JsxAttribute&&i.replaceWithText(r);}return}for(let i of e.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement)){if(i.getTagNameNode()?.getText()!==o.componentName||!o.iconAttribute)continue;let s=i.getAttribute(o.iconAttribute);!s||s.getKind()!==SyntaxKind.JsxAttribute||s.asKindOrThrow(SyntaxKind.JsxAttribute).getInitializer()?.getText()!==`{${t}}`||hi(i,r,o,n,{excludeAttribute:o.iconAttribute});}}function hi(e,t,r,o,n={}){let i=r.componentName==="ICON"&&Object.keys(r.attributes).length===0,s=o.componentName==="ICON"&&Object.keys(o.attributes).length===0;if(i&&s){e.getTagNameNode()?.replaceWithText(t);return}let l=e.getAttributes().filter(p=>{if(p.getKind()!==SyntaxKind.JsxAttribute)return true;let u=p.asKindOrThrow(SyntaxKind.JsxAttribute),g=u.getNameNode().getText();return g===n.excludeAttribute?false:r.attributes[g]!==(u.getInitializer()?.getText()??"")}).map(p=>p.getText()),c=new Set(e.getAttributes().filter(p=>p.getKind()===SyntaxKind.JsxAttribute).map(p=>p.asKindOrThrow(SyntaxKind.JsxAttribute).getNameNode().getText())),m=Object.entries(o.attributes).filter(([p])=>!c.has(p)).map(([p,u])=>`${p}=${u}`),d=o.componentName==="ICON"?[t,...m,...l]:[o.componentName,`${o.iconAttribute}={${t}}`,...m,...l];e.replaceWithText(`<${d.join(" ")} />`);}function Nc(e,t,r){for(let[o,n]of Object.entries(t.attributes)){let i=e.getAttribute(o);i?.getKind()===SyntaxKind.JsxAttribute&&(i.asKindOrThrow(SyntaxKind.JsxAttribute).getInitializer()?.getText()??"")===n&&i.remove();}for(let[o,n]of Object.entries(r.attributes))e.getAttribute(o)||e.addAttribute({name:o,initializer:n});}function Fc(e,t,r){let o=r.componentName;if(e.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).some(s=>s.getTagNameNode()?.getText()===o)||e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement).some(s=>s.getTagNameNode()?.getText()===o))return;let i=a$5(t).filter(s=>!s.namedImports.includes("ICON")).map(s=>s.moduleSpecifier);for(let s of e.getImportDeclarations()??[])if(i.includes(s.getModuleSpecifier()?.getLiteralValue()??"")){for(let l of [...s.getNamedImports()??[]])l.getName()===o&&l.remove();s.getNamedImports()?.length===0&&!s.getDefaultImport()&&!s.getNamespaceImport()&&s.remove();}}function Ac(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Lc(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 l=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=s.match(/^(\w+)\s+as\s+(\w+)$/);if(l){let m=l[1],d=l[2];o==="slot"&&m==="Slot"&&!d?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:m,alias:d,isType:true});}else if(c){let m=c[1],d=c[2];o==="slot"&&m==="Slot"&&d==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:m,alias:d,isType:t});}else o==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t});}}async function wi(e$1,t={}){let r,o;if(t.path){if(o=e$1.resolvedPaths.cwd,t.path.includes("*"))r=await Nr(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"],suppressErrors:true});else {let c=j__default.resolve(o,t.path),m=await promises.stat(c).catch(()=>null);if(!m)throw new Error(`File not found: ${t.path}`);if(m.isDirectory())o=c,r=await Nr("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"],suppressErrors:true});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$1.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$1.resolvedPaths.ui,r=await Nr("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,suppressErrors:true});}if(!t.yes){let l=t.path?t.path:`./${j__default.relative(e$1.resolvedPaths.cwd,o)}`,{confirm:c}=await de({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${e.info(r.length)} file(s) in ${e.info(l)} to ${e.info("radix-ui")}. Continue?`});c||(f.info("Migration cancelled."),process.exit(0));}let n=C("Migrating imports...")?.start(),i=new Set;await Promise.all(r.map(async l=>{n.text=`Migrating ${l}...`;let c=j__default.join(o,l),m=await promises.readFile(c,"utf-8"),{content:d,replacedPackages:p}=await Dc(m);p.forEach(u=>i.add(u)),await promises.writeFile(c,d);})),n.succeed("Migrating imports.");let s=C("Updating package.json...")?.start();try{let l=z$1(e$1.resolvedPaths.cwd,!1);if(!l){s.fail("Could not read package.json"),f.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(i);if(c.length>0){if(l.dependencies||(l.dependencies={}),l.dependencies?.["radix-ui"]||l.devDependencies?.["radix-ui"])s.succeed("radix-ui already in package.json.");else {l.dependencies["radix-ui"]="latest";let d=j__default.join(e$1.resolvedPaths.cwd,"package.json");await promises.writeFile(d,JSON.stringify(l,null,2)+`
128
+ `),s.succeed("Updated package.json."),await Ja$1(["radix-ui"],[],e$1,{silent:!1});}f.info(""),f.info("Migration complete. The following packages may be removed if no longer in use:"),f.info(e.info(c.join(", "))),f.info("Please review your codebase before removing.");}else s.succeed("No packages found in source files.");}catch{s.fail("Failed to update package.json"),f.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Dc(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],o=[],n=[],i='"',s=false,l=e,c;for(;(c=t.exec(e))!==null;){let[h,w,k,b,S,v,F]=c;if(v==="icons"||v.startsWith("icons/"))continue;o.push(h),o.length===1&&(i=S,s=F===";"),n.push(`@radix-ui/react-${v}`);let C=!!w;if(k){let O=Ac(v);r.push({name:O,alias:k,isType:C});}else b&&Lc(b,C,r,v);}if(r.length===0)return {content:e,replacedPackages:[]};let m=r.filter((h,w,k)=>w===k.findIndex(b=>b.name===h.name&&b.alias===h.alias&&b.isType===h.isType)),p=`import { ${m.map(h=>{let w=h.isType?"type ":"";return h.alias?`${w}${h.name} as ${h.alias}`:`${w}${h.name}`}).join(", ")} } from ${i}radix-ui${i}${s?";":""}`;l=o.reduce((h,w,k)=>h.replace(w,k===0?p:""),l),l=l.replace(/\n\s*\n\s*\n/g,`
129
+
130
+ `),m.some(h=>h.name==="Slot"&&h.alias==="SlotPrimitive")&&(l=l.split(`
131
+ `).map(k=>{if(k.trim().startsWith("import "))return k;let b=k;return b=b.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),b=b.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),b=b.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),b=b.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),b=b.replace(/\bSlot\b/g,(S,v,F)=>{let C=F.substring(0,v),O=(C.match(/"/g)||[]).length,H=(C.match(/'/g)||[]).length;return O%2!==0||H%2!==0?S:"__SLOT_PLACEHOLDER__"}),b=b.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),b}).join(`
132
+ `));let g=Array.from(new Set(n));return {content:l,replacedPackages:g}}var Vc=["sidebar.tsx","pagination.tsx","calendar.tsx"],Mc=`${a$1}/docs/rtl#manual-migration-optional`;async function ki(e$1,t={}){let r,o;if(t.path){if(o=e$1.resolvedPaths.cwd,t.path.includes("*"))r=await Nr(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"],suppressErrors:true});else {let m=j__default.resolve(o,t.path),d=await promises.stat(m).catch(()=>null);if(!d)throw new Error(`File not found: ${t.path}`);if(d.isDirectory())o=m,r=await Nr("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"],suppressErrors:true});else if(d.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$1.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$1.resolvedPaths.ui,r=await Nr("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,suppressErrors:true});}if(!t.yes){let c=t.path?t.path:`./${j__default.relative(e$1.resolvedPaths.cwd,o)}`,{confirm:m}=await de({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${e.info(r.length)} file(s) in ${e.info(c)} to RTL. Continue?`});m||(f.info("Migration cancelled."),process.exit(0));}let n=C("Updating components.json...").start();try{let c=j__default.resolve(e$1.resolvedPaths.cwd,"components.json"),m=JSON.parse(await promises.readFile(c,"utf-8"));m.rtl=!0,await promises.writeFile(c,JSON.stringify(m,null,2)+`
133
+ `),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=C("Migrating files to RTL...").start(),s=0,l=[];if(await Promise.all(r.map(async c=>{i.text=`Migrating ${c}...`;let m=j__default.join(o,c),d=await promises.readFile(m,"utf-8"),p=await e$2(d,true);p!==d&&(await promises.writeFile(m,p),s++);let u=j__default.basename(c);Vc.includes(u)&&l.push(c);})),i.succeed(`Migration complete. ${s} file(s) transformed.`),l.length>0){f.break(),f.warn("The following components may need manual RTL adjustments:");for(let c of l)f.info(` - ${c}`);f.break(),f.info(`See ${e.info(Mc)} for more information.`);}}async function Ci(e$1){let t={};if(!L.existsSync(e$1.cwd)||!L.existsSync(j__default.resolve(e$1.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!L.existsSync(j__default.resolve(e$1.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await W(e$1.cwd);return {errors:t,config:r}}catch{f.break(),f.error(`An invalid ${e.info("components.json")} file was found at ${e.info(e$1.cwd)}.
134
+ Before you can run a migration, you must create a valid ${e.info("components.json")} file by running the ${e.info("init")} command.`),f.error(`Learn more at ${e.info(`${a$1}/docs/components-json`)}.`),f.break(),process.exit(1);}}var xi=[{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)."}],Jc=z.object({cwd:z.string(),list:z.boolean(),yes:z.boolean(),from:z.string().optional(),to:z.string().optional(),migration:z.string().refine(e=>e&&xi.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional(),path:z.string().optional()}),vi=new Command().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.",false).option("-y, --yes","skip confirmation prompt.",false).option("-f, --from <library>","the icon library to migrate from (icons migration only).").option("-t, --to <library>","the icon library to migrate to (icons migration only).").action(async(e,t,r)=>{try{let o=Jc.parse({cwd:j__default.resolve(r.cwd),migration:e,path:t,list:r.list,yes:r.yes,from:r.from,to:r.to});if(o.list||!o.migration){f.info("Available migrations:");for(let s of xi)f.info(`- ${s.name}: ${s.description}`);return}if(!o.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:n,config:i}=await Ci(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 yi(i,{from:o.from,to:o.to,path:o.path,yes:o.yes}),o.migration==="radix"&&await wi(i,{yes:o.yes,path:o.path}),o.migration==="rtl"&&await ki(i,{yes:o.yes,path:o.path});}catch(o){f.break(),ia$1(o);}});function Hc(e){return `${a$1}/create?preset=${e}`}function Dr(e){let t=s(e);if(!t)throw new Error(`Invalid preset code: ${e}`);let r=[],o=t.chartColor??h$1[t.theme]??t.theme;return t.chartColor||r.push("chartColor"),{code:e,version:e[0],values:{...t,chartColor:o},derived:r,url:Hc(e)}}function Gc(e){Gt({code:e.code,fallbacks:e.derived,values:e.values},{fallbackNote:" * Compatibility value for older preset versions."});}var Kc=new Command().name("decode").description("decode a preset code").argument("<code>","the preset code to decode").option("--json","output as JSON.",false).action((e,t)=>{try{let r=Dr(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}Gc(r);}catch(r){Qt(r);}}),Yc=new Command().name("url").description("get the create URL for a preset code").argument("<code>","the preset code").action(e=>{try{f.log(Dr(e).url);}catch(t){Qt(t);}}),qc=new Command().name("open").description("open a preset code in the browser").argument("<code>","the preset code").action(async e=>{let t;try{t=Dr(e).url;}catch(r){Qt(r);return}f.break(),f.log(` Opening ${t} in your browser.`),f.break();try{await Ki(t);}catch(r){let o=r instanceof Error?r.message:String(r);Qt(new Error(`Failed to open preset URL: ${o}`));}}),Xc=new Command().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.",false).action(async e=>{try{let t=j__default.resolve(e.cwd);if(!existsSync(j__default.resolve(t,"components.json"))&&await g(t)){let i$1=await h(t);i$1.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$1.map(s=>s.name)},null,2)):i("preset resolve",i$1),process.exit(1));}let r=await W(t);if(!r){if(e.json){console.log(JSON.stringify(null,null,2));return}f.log("No components.json found.");return}let o=await Aa$1(t),n=await zt(r,o);if(e.json){console.log(JSON.stringify(n.code?n:null,null,2));return}Gt(n);}catch(t){ia$1(t);}}),_r=new Command().name("preset").description("manage presets").addCommand(Kc).addCommand(Xc).addCommand(Yc).addCommand(qc).action(()=>{_r.outputHelp();});function Qt(e){e instanceof Error&&f.error(e.message),process.exit(1);}var el=z.object({cwd:z.string(),silent:z.boolean()}),Si=new Command().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.",false).action(async(e,t)=>{try{let r=el.parse({cwd:j__default.resolve(t.cwd),silent:t.silent}),o=e.length>0?e:await ol({silent:r.silent});await rl(o,r.cwd,{silent:r.silent});}catch(r){f.break(),ia$1(r);}});function tl(e$1){let[t,...r]=e$1.split("="),o=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${e.info(t)}. Registry names must start with @ (e.g., @acme).`);return {namespace:t,url:o}}function Ur(e,t,r){return `${e} ${e===1?t:r}`}async function rl(e$1,t,r){let o=["components.json","package.json"].map(w=>j__default.resolve(t,w)).find(w=>L.existsSync(w));if(!o)throw new Error(`No ${e.info("components.json")} or ${e.info("package.json")} found. Run ${e.info("shadcn init")} first.`);let n=j__default.basename(o),i=e$1.map(tl),s=i.filter(w=>!w.url),l=[];if(s.length>0){let w=C("Fetching registries.",{silent:r.silent}).start(),k=await wa$1();if(!k)throw w.fail(),new Error("Failed to fetch registries.");w.succeed(),l=k;}let c={};for(let{namespace:w,url:k}of i){if(w in b$1){f.warn(`${e.info(w)} is a built-in registry and cannot be added.`);continue}if(k){if(!k.includes("{name}"))throw new Error(`Invalid registry URL for ${e.info(w)}. URL must include {name} placeholder. Example: ${e.info(`${w}=https://example.com/r/{name}.json`)}`);c[w]=k;}else {let b=l.find(S=>S.name===w);if(!b)throw new Error(`Registry ${e.info(w)} not found. Provide a URL: ${e.info(`${w}=https://.../{name}.json`)}`);c[w]=b.url;}}if(Object.keys(c).length===0)return {addedRegistries:[]};let m=await L.readJson(o),d=m.registries||{},p={},u=[];for(let[w,k]of Object.entries(c))d[w]?u.push(w):p[w]=k;if(Object.keys(p).length===0){if(u.length>0&&!r.silent){C(`Skipped ${Ur(u.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let w of u)f.log(` - ${w}`);}else r.silent||f.info("No new registries to add.");return}let g={...m,registries:{...d,...p}},h=C(`Updating ${n}.`,{silent:r.silent}).start();if(await L.writeJson(o,g,{spaces:2}),h.succeed(),!r.silent){let w=Object.keys(p);C(`Added ${Ur(w.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let k of w)f.log(` - ${k}`);if(u.length>0){C(`Skipped ${Ur(u.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let k of u)f.log(` - ${k}`);}}}async function ol(e){let t=C("Fetching registries.",{silent:e.silent}).start(),r=await wa$1();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 de({type:"autocompleteMultiselect",name:"selected",message:"Which registries would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:o.map(i=>({title:i.name,description:i.description,value:i.name}))});return n?.length||(f.warn("No registries selected. Exiting."),f.info(""),process.exit(1)),n}var Ii=32,nl=f$3.options.filter(e=>e!=="registry:example"&&e!=="registry:internal"),il=z.record(z.string(),z.unknown()),sl=z.array(z.string()),al=z.array(z.unknown());async function $i(e){let t=j.resolve(e.cwd),r=j.resolve(t,e.registryFile),o={cwd:t,rootFile:r,usesInclude:false,diagnostics:[],registryFiles:new Set,checkedRegistryFiles:new Set,itemsChecked:0,itemSourcesByItem:new Map,firstIncludedFrom:new Map};if(j.basename(r)!=="registry.json"&&T(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 shadcn registry validate."}),!Hr(r,t))return T(o,{registryFile:r,message:`Root registry file must stay inside ${He(t,t)}.`,suggestion:"Run the command from the registry root or pass a registry.json file inside --cwd."}),Wr(o);let n=await ji(r,o);if(!n)return Wr(o);o.usesInclude=!!n.include?.length,cl(n,r,o);let i=await Ei(r,n,o,[]);return ml(i,o),await fl(i,o),Wr(o)}async function Ei(e,t,r,o){if(o.length>=Ii)return T(r,{registryFile:e,message:`Registry include tree is too deep. The maximum include depth is ${Ii}.`,suggestion:"Flatten part of the registry include tree or reduce nested include depth."}),[];if(o.includes(e))return T(r,{registryFile:e,message:`Registry include cycle detected: ${wl([...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 T(r,{registryFile:e,message:`Registry file included more than once. First included from ${He(i,r.cwd)}, then included from ${He(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=j.dirname(e),l=[...o,e],c=[];for(let d of t.include??[]){let p=ll(d,e,s,r);if(!p)continue;let u=await ji(p,r);if(!u)continue;let g=await Ei(p,u,r,l);c.push(...g);}let m=!r.usesInclude&&e===r.rootFile?r.cwd:s;return t.items.forEach((d,p)=>{r.itemSourcesByItem.set(d,{registryFile:e,registryDir:m,itemIndex:p});}),[...c,...t.items]}async function ji(e,t){t.checkedRegistryFiles.add(e);let r;try{r=await Ie.readFile(e,"utf-8");}catch{return T(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 T(t,{registryFile:e,message:"Registry file contains invalid JSON.",suggestion:"Fix the JSON syntax in the registry.json file."}),null}return ul(o,e,t)}function cl(e,t,r){!e.name&&!e.hasName&&T(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&&T(r,{registryFile:t,message:'Root registry.json must define "homepage".',suggestion:'Add a top-level "homepage" field to the root registry.json.'});}function ll(e,t,r,o){if(N(e))return T(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(j.isAbsolute(e))return T(o,{registryFile:t,includePath:e,message:`Include "${e}" must be relative.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;if(Ti(e))return T(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(j.basename(e)!=="registry.json")return T(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=j.resolve(r,e);return Hr(n,o.cwd)?n:(T(o,{registryFile:t,includePath:e,message:`Include "${e}" must stay inside ${He(o.cwd,o.cwd)}.`,suggestion:"Keep included registry.json files inside the registry root."}),null)}function ml(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);T(t,{registryFile:s?.registryFile??t.rootFile,itemName:o.name,itemIndex:s?.itemIndex,message:`Duplicate registry item name "${o.name}". First defined at ${kl(i,t.cwd)}.`,suggestion:"Rename one of these items so each name is unique across the resolved registry."});}}async function fl(e,t){let r=yl(t);for(let o of e){let n=t.itemSourcesByItem.get(o),i={...dl(o,t,r),$schema:"https://ui.shadcn.com/schema/registry-item.json"};for(let l=0;l<(o.files?.length??0);l++){let c=o.files?.[l];if(!c||!n)continue;let m=pl(o,c.path,n,t);if(m)try{await Ie.readFile(m,"utf-8");}catch{T(t,{registryFile:n.registryFile,itemName:o.name,itemIndex:n.itemIndex,filePath:c.path,message:`File "${c.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=n$1.safeParse(i);s.success||ct(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 pl(e,t,r,o){if(N(t))return T(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(j.isAbsolute(t))return T(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(Ti(t))return T(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=j.resolve(r.registryDir,t);return Hr(n,r.registryDir)?n:(T(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 dl(e,t,r){let o=t.itemSourcesByItem.get(e);return {...e,files:e.files?.map(n=>{let i=j.resolve(o?.registryDir??t.cwd,n.path);return {...n,path:j.relative(r,i).split(j.sep).join("/")}})}}function ul(e,t,r){let o=il.safeParse(e);if(!o.success)return ct(o.error,t,r,{suggestion:"Update the registry.json file so it matches the schema."}),null;let n=o.data,i={$schema:Jr(n,"$schema",t,r),name:Jr(n,"name",t,r),homepage:Jr(n,"homepage",t,r),hasName:n.name!==void 0,hasHomepage:n.homepage!==void 0,items:[]};if(n.include!==void 0){let s=sl.safeParse(n.include);s.success?i.include=s.data:ct(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=al.safeParse(n.items);s.success?(r.itemsChecked+=s.data.length,i.items=gl(s.data,t,r)):ct(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&&T(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 gl(e,t,r){let o=[];return e.forEach((n,i)=>{let s=n$1.safeParse(n);if(!s.success){ct(s.error,t,r,{itemName:hl(n),itemIndex:i,suggestion:"Update the registry item so it matches the registry item schema."});return}o.push(s.data);}),o}function Jr(e,t,r,o){let n=e[t];if(n!==void 0){if(typeof n=="string")return n;T(o,{registryFile:r,message:`${t}: Expected string, received ${typeof n}.`,suggestion:`Update "${t}" so it is a string.`});}}function hl(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e.name;return typeof t=="string"?t:void 0}function ct(e,t,r,o){for(let n of e.errors)T(r,{registryFile:t,itemName:o.itemName,itemIndex:o.itemIndex,message:bl(n,o.pathPrefix),suggestion:o.suggestion});}function T(e,t){e.diagnostics.push(t);}function Wr(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 yl(e){return e.usesInclude?j.dirname(e.rootFile):e.cwd}function Ti(e){return e.split(/[\\/]+/).includes("..")}function Hr(e,t){let r=j.relative(t,e);return !!r&&!r.startsWith("..")&&!j.isAbsolute(r)}function wl(e){return e.map(t=>He(t,j.dirname(e[0]))).join(" -> ")}function kl(e,t){return e?`${He(e.registryFile,t)} items[${e.itemIndex}]`:"unknown source"}function Pi(e){return e.length?e.join("."):"(root)"}function bl(e,t=[]){let r=[...t,...e.path];return e.code===z.ZodIssueCode.invalid_union_discriminator&&e.path.at(-1)==="type"?`${Pi(r)}: Invalid registry item type. Expected ${nl.map(o=>`"${o}"`).join(" | ")}.`:`${Pi(r)}: ${e.message}`}function He(e,t){let r=j.relative(t,e);return r&&!r.startsWith("..")&&!j.isAbsolute(r)?r.split(j.sep).join("/"):r?e:"."}var xl=z.object({cwd:z.string(),registryFile:z.string()}),Ai=new Command().name("validate").description("validate a shadcn registry").argument("[registry]","registry address to validate. Supports registry.json paths and GitHub sources.","./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=xl.parse({cwd:j.resolve(t.cwd),registryFile:e}),n=await Pl(e,o.cwd);r=C("Validating registry.").start();let i=n?await ca(n):await $i(o);vl(i,r),i.valid||(process.exitCode=1);}catch(o){r?.fail("Registry validation failed."),f.break(),ia$1(o);}});function vl(e$1,t){if(e$1.valid){t.succeed("Registry is valid."),Ni(e$1,{success:true});return}t.fail("Registry validation failed."),Ni(e$1),f.break();for(let[r,o]of Array.from(Rl(e$1))){f.log(e.info(Li(r,e$1.cwd)));for(let n of o)f.error(` - ${Sl(n)}`),n.suggestion&&f.log(` ${n.suggestion}`);f.break();}}function Ni(e,t={}){let r=`Checked ${Fi(e.registryFiles,"registry file","registry files")} and ${Fi(e.items,"item","items")}.`;t.success?Il(r):f.log(` ${r}`);for(let o of e.registryFilePaths)f.log(` - ${Li(o,e.cwd)}`);}function Rl(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 Sl(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 Li(e,t){let r=j.relative(t,e);return r&&!r.startsWith("..")&&!j.isAbsolute(r)?r.split(j.sep).join("/"):r?e:"."}function Il(e){C(e).succeed();}function Fi(e,t,r){return `${e} ${e===1?t:r}`}async function Pl(e,t){return $l(e)||await El(j.resolve(t,e))?null:P(e)}function $l(e){return e.startsWith(".")||j.isAbsolute(e)||e.endsWith(".json")}async function El(e){try{return await Ie.access(e),!0}catch{return false}}var Di=new Command().name("registry").description("manage registries").addCommand(Si).addCommand(Ai);var Nl=z.object({cwd:z.string(),query:z.string().optional(),types:z.array(z.string()).optional(),limit:z.number().optional(),offset:z.number().optional()}),Mi=new Command().name("search").alias("list").description("search items from registries").argument("[registries...]","the registry addresses to search. Supports namespaces, GitHub sources and URLs. When omitted, searches all registries configured in components.json.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-t, --type <type>","filter by item type, e.g. ui, block, hook. Comma-separated for multiple.").option("-l, --limit <number>","maximum number of items to display","100").option("-o, --offset <number>","number of items to skip","0").option("--json","output as JSON.",false).action(async(e$1,t)=>{try{let r=Nl.parse({cwd:j__default.resolve(t.cwd),query:t.query,types:t.type?t.type.split(",").map(h=>h.trim()).filter(Boolean):void 0,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});if(r.types?.length){let h=Xa$1(r.types);h.length>0&&(f.break(),f.error(`Unknown ${h.length===1?"type":"types"}: ${h.map(w=>e.info(w)).join(", ")}.`),f.error(`Valid types: ${Wa$1.join(", ")}.`),f.break(),process.exit(1));}await Na$1(r.cwd);let o=_({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n=$(o),i=j__default.resolve(r.cwd,"components.json"),s=L.existsSync(i);if(s){let h=await L.readJson(i),w=c.partial().parse(h);n=$({...o,...w});}let l=n;try{let h=await W(r.cwd);h&&(l=$(h));}catch{}let c$1=e$1.length===0;c$1&&!s&&(f.break(),f.error(`Provide a registry or namespace to search, e.g. ${e.info("shadcn search @shadcn")}.`),f.break(),f.error(`If you have a ${e.info("components.json")} with registries configured, run ${e.info("shadcn search")} with no arguments to search all of them.`),f.break(),process.exit(1));let{config:m,newRegistries:d}=await U(e$1.filter(h=>h.startsWith("@")&&!l.registries?.[h]&&!(h in b$1)).map(h=>`${h}/registry`),l,{silent:!0,writeFile:!1});d.length>0&&(l.registries=m.registries);let p=Ua$1(e$1,l);c$1&&p.length===0&&(f.break(),f.error(`No registries are configured in ${e.info("components.json")}.`),f.error(`Provide a registry or namespace to search, e.g. ${e.info("shadcn search @shadcn")}.`),f.break(),process.exit(1)),c$1||aa(p,l);let u=await Va$1(p,{query:r.query,types:r.types,limit:r.limit,offset:r.offset,config:l,continueOnError:c$1}),g=c$1&&u.errors?.length===p.length;t.json?console.log(JSON.stringify(u,null,2)):Ya$1(u,{query:r.query,types:r.types,registries:p}),process.exit(g?1:0);}catch(r){ia$1(r);}finally{Q();}});var Ol=z.object({cwd:z.string()}),Wi=new Command().name("view").description("view items from the registry").argument("<items...>","item addresses to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Ol.parse({cwd:j__default.resolve(t.cwd)});await Na$1(r.cwd);let o=$({}),n=j__default.resolve(r.cwd,"components.json");if(L.existsSync(n)){let m=await L.readJson(n),d=c.partial().parse(m);o=$(d);}let i=o;try{let m=await W(r.cwd);m&&(i=$(m));}catch{}let{config:s,newRegistries:l}=await U(e,i,{silent:!0,writeFile:!1});l.length>0&&(i.registries=s.registries),aa(e,i);let c$1=await ka$1(e,{config:i});console.log(JSON.stringify(c$1,null,2)),process.exit(0);}catch(r){ia$1(r);}finally{Q();}});process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Ll(){let e=new Command().name("shadcn").description("build your component library").version(ha.version||"1.0.0","-v, --version","display the version number");e.addCommand(yn).addCommand(_n).addCommand(Nn).addCommand(Wn).addCommand(Hn).addCommand(Wi).addCommand(Mi).addCommand(vi).addCommand(Kn).addCommand(fi).addCommand(Bn).addCommand(Tr).addCommand(_r).addCommand(Di),e.parse();}Ll();