shadcn 4.0.5 → 4.0.6

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.
Files changed (2) hide show
  1. package/dist/index.js +79 -75
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,46 +1,50 @@
1
1
  #!/usr/bin/env node
2
- import {b as b$1,a as a$1}from'./chunk-IBHWVXMI.js';import {o,n}from'./chunk-ISTYEIAA.js';import {b,a,G,ra,ua,c as c$1,$,V,sa,N,O,w,d,P,M,fa,ha,K as K$1,L as L$1,I,J,ta as ta$1,T as T$1,ba,H as H$1,e,ea,ka,ia,la,B as B$1,S,ma,U as U$1,W as W$1,va,_,X,na,ga,qa,q as q$1,Z,k,R,Y as Y$1,Q,D,E,F,s,x,y,A,C,z as z$1,r,t,v,u}from'./chunk-TVMYBJXJ.js';export{ka as fetchTree,la as getItemTargetPath,pa as getPreset,oa as getPresets,ma as getRegistries,da as getRegistriesConfig,na as getRegistriesIndex,aa as getRegistry,ia as getRegistryBaseColor,ha as getRegistryBaseColors,ga as getRegistryIcons,ba as getRegistryItems,fa as getRegistryStyles,ea as getShadcnRegistryIndex,ca as resolveRegistryItems,ja as resolveTree}from'./chunk-TVMYBJXJ.js';import {c,o as o$1,n as n$1}from'./chunk-BFLSSWBX.js';import {e as e$1,a as a$3,c as c$2,f,d as d$1}from'./chunk-JPE2JKEP.js';import {a as a$2}from'./chunk-CHWMSXYA.js';import*as ee from'path';import ee__default,{join}from'path';import {promises,existsSync}from'fs';import Qt from'fast-glob';import B from'fs-extra';import Ro from'open';import fe from'prompts';import an from'dedent';import $o,{tmpdir}from'os';import {execa}from'execa';import S$1 from'postcss';import Eo from'postcss/lib/at-rule';import qt,{z}from'zod';import {twMerge}from'tailwind-merge';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import sn from'deepmerge';import {Command}from'commander';import {diffLines,structuredPatch,diffWords}from'diff';import {dim,yellow,bold,green,cyan,red}from'kleur/colors';import*as xe from'fs/promises';import xe__default from'fs/promises';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';var wo=["next.config.*","vite.config.*","astro.config.*","remix.config.*","nuxt.config.*","svelte.config.*","gatsby-config.*","angular.json"];async function H(e){if(B.existsSync(ee__default.resolve(e,"pnpm-workspace.yaml")))return true;let t=ee__default.resolve(e,"package.json");if(B.existsSync(t))try{if((await B.readJson(t)).workspaces)return !0}catch{}return !!(B.existsSync(ee__default.resolve(e,"lerna.json"))||B.existsSync(ee__default.resolve(e,"nx.json")))}async function Y(e){let t=await bo(e);if(!t.length)return [];let r=await Qt(t,{cwd:e,onlyDirectories:true,ignore:["**/node_modules/**"]}),n=[];for(let i of r){let o=ee__default.resolve(e,i);if(!B.existsSync(ee__default.resolve(o,"package.json")))continue;let s=B.existsSync(ee__default.resolve(o,"components.json")),c=wo.some(a=>Qt.sync(a,{cwd:o,dot:true}).length>0);(s||c)&&n.push({name:i,hasConfig:s});}return n}function K(e,t){b.break(),b.log(`It looks like you are running ${a.info(e)} from a monorepo root.`),b.log(`To use shadcn in a specific workspace, use the ${a.info("-c")} flag:`),b.break();for(let r of t)b.log(` shadcn ${e} -c ${r.name}`);b.break();}async function bo(e){let t=[],r=ee__default.resolve(e,"pnpm-workspace.yaml");if(B.existsSync(r)){let i=await B.readFile(r,"utf8"),o=Array.from(i.matchAll(/^\s*-\s*["']?([^"'\n#]+)["']?\s*$/gm));for(let s of o)t.push(s[1].trim());}let n=ee__default.resolve(e,"package.json");if(B.existsSync(n))try{let i=await B.readJson(n),o=Array.isArray(i.workspaces)?i.workspaces:i.workspaces?.packages;Array.isArray(o)&&t.push(...o.filter(s=>!s.startsWith("!")));}catch{}return Array.from(new Set(t))}async function Jr(e){let t={};if(!B.existsSync(e.cwd)||!B.existsSync(ee__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=w("Preflight checks.",{silent:e.silent}).start();B.existsSync(ee__default.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),b.break(),b.error(`A ${a.info("components.json")} file already exists at ${a.info(e.cwd)}.
3
- To start over, remove the ${a.info("components.json")} file and run ${a.info("init")} again.`),b.break(),process.exit(1)),r?.succeed();let n=w("Verifying framework.",{silent:e.silent}).start(),i=e.existingConfig?.tailwind,o=await ra(e.cwd,{configCssFile:typeof i?.css=="string"?i.css:void 0});if(!o||o?.framework.name==="manual"){if(t["7"]=true,n?.fail(),!e.monorepo&&await H(e.cwd)){let f=await Y(e.cwd);f.length>0&&(K("init",f),process.exit(1));}b.break(),o?.framework.links.installation&&b.error(`We could not detect a supported framework at ${a.info(e.cwd)}.
2
+ import {b as b$1,a as a$1}from'./chunk-IBHWVXMI.js';import {b,a,G,ra,ua,c as c$1,$,V,sa,N,O,w,d,P,M,fa,ha,K as K$1,L,I,J,ta as ta$1,T,ba,H,e,ea,ka,ia,la,B as B$1,S,ma,U as U$1,W,va,_ as _$1,X as X$1,na,ga,qa,q as q$1,Z,k,R,Y as Y$1,Q,D as D$1,E,F,s,x,y,A as A$1,C,z as z$1,r,t,v,u}from'./chunk-TVMYBJXJ.js';export{ka as fetchTree,la as getItemTargetPath,pa as getPreset,oa as getPresets,ma as getRegistries,da as getRegistriesConfig,na as getRegistriesIndex,aa as getRegistry,ia as getRegistryBaseColor,ha as getRegistryBaseColors,ga as getRegistryIcons,ba as getRegistryItems,fa as getRegistryStyles,ea as getShadcnRegistryIndex,ca as resolveRegistryItems,ja as resolveTree}from'./chunk-TVMYBJXJ.js';import {c,o as o$1,n as n$1}from'./chunk-BFLSSWBX.js';import {o,n}from'./chunk-ISTYEIAA.js';import {e as e$1,a as a$3,c as c$2,f,d as d$1}from'./chunk-JPE2JKEP.js';import {a as a$2}from'./chunk-CHWMSXYA.js';import*as te from'path';import te__default,{join}from'path';import {promises,existsSync}from'fs';import Qt from'fast-glob';import A from'fs-extra';import So from'open';import pe from'prompts';import cn from'dedent';import Io,{tmpdir}from'os';import {execa}from'execa';import k$1 from'postcss';import Oo from'postcss/lib/at-rule';import qt,{z}from'zod';import {twMerge}from'tailwind-merge';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import an from'deepmerge';import {Command}from'commander';import {diffLines,structuredPatch,diffWords}from'diff';import {dim,yellow,bold,green,cyan,red}from'kleur/colors';import*as ve from'fs/promises';import ve__default from'fs/promises';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';var bo=["next.config.*","vite.config.*","astro.config.*","remix.config.*","nuxt.config.*","svelte.config.*","gatsby-config.*","angular.json"];async function Y(e){if(A.existsSync(te__default.resolve(e,"pnpm-workspace.yaml")))return true;let t=te__default.resolve(e,"package.json");if(A.existsSync(t))try{if((await A.readJson(t)).workspaces)return !0}catch{}return !!(A.existsSync(te__default.resolve(e,"lerna.json"))||A.existsSync(te__default.resolve(e,"nx.json")))}async function K(e){let t=await xo(e);if(!t.length)return [];let r=await Qt(t,{cwd:e,onlyDirectories:true,ignore:["**/node_modules/**"]}),n=[];for(let i of r){let o=te__default.resolve(e,i);if(!A.existsSync(te__default.resolve(o,"package.json")))continue;let s=A.existsSync(te__default.resolve(o,"components.json")),c=bo.some(a=>Qt.sync(a,{cwd:o,dot:true}).length>0);(s||c)&&n.push({name:i,hasConfig:s});}return n}function q(e,t){b.break(),b.log(`It looks like you are running ${a.info(e)} from a monorepo root.`),b.log(`To use shadcn in a specific workspace, use the ${a.info("-c")} flag:`),b.break();for(let r of t)b.log(` shadcn ${e} -c ${r.name}`);b.break();}async function xo(e){let t=[],r=te__default.resolve(e,"pnpm-workspace.yaml");if(A.existsSync(r)){let i=await A.readFile(r,"utf8"),o=Array.from(i.matchAll(/^\s*-\s*["']?([^"'\n#]+)["']?\s*$/gm));for(let s of o)t.push(s[1].trim());}let n=te__default.resolve(e,"package.json");if(A.existsSync(n))try{let i=await A.readJson(n),o=Array.isArray(i.workspaces)?i.workspaces:i.workspaces?.packages;Array.isArray(o)&&t.push(...o.filter(s=>!s.startsWith("!")));}catch{}return Array.from(new Set(t))}async function Jr(e){let t={};if(!A.existsSync(e.cwd)||!A.existsSync(te__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=w("Preflight checks.",{silent:e.silent}).start();A.existsSync(te__default.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),b.break(),b.error(`A ${a.info("components.json")} file already exists at ${a.info(e.cwd)}.
3
+ To start over, remove the ${a.info("components.json")} file and run ${a.info("init")} again.`),b.break(),process.exit(1)),r?.succeed();let n=w("Verifying framework.",{silent:e.silent}).start(),i=e.existingConfig?.tailwind,o=await ra(e.cwd,{configCssFile:typeof i?.css=="string"?i.css:void 0});if(!o||o?.framework.name==="manual"){if(t["7"]=true,n?.fail(),!e.monorepo&&await Y(e.cwd)){let f=await K(e.cwd);f.length>0&&(q("init",f),process.exit(1));}b.break(),o?.framework.links.installation&&b.error(`We could not detect a supported framework at ${a.info(e.cwd)}.
4
4
  Visit ${a.info(o?.framework.links.installation)} to manually configure your project.
5
- Once configured, you can use the cli to add components.`),b.break(),process.exit(1);}n?.succeed(`Verifying framework. Found ${a.info(o.framework.label)}.`);let s="Validating Tailwind CSS.";o.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${a.info("v4")}.`);let c=w(s,{silent:e.silent}).start();o.tailwindVersion==="v3"&&(!o?.tailwindConfigFile||!o?.tailwindCssFile)?(t["5"]=true,c?.fail()):o.tailwindVersion==="v4"&&!o?.tailwindCssFile?(t["5"]=true,c?.fail()):o.tailwindVersion?c?.succeed():(t["5"]=true,c?.fail());let a$1=w("Validating import alias.",{silent:e.silent}).start();return o?.aliasPrefix?a$1?.succeed():(t["6"]=true,a$1?.fail()),Object.keys(t).length>0&&(t["5"]&&(b.break(),b.error(`No Tailwind CSS configuration found at ${a.info(e.cwd)}.`),b.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),b.error("Install Tailwind CSS then try again."),o?.framework.links.tailwind&&b.error(`Visit ${a.info(o?.framework.links.tailwind)} to get started.`)),t["6"]&&(b.break(),b.error("No import alias found in your tsconfig.json file."),o?.framework.links.installation&&b.error(`Visit ${a.info(o?.framework.links.installation)} to learn how to set an import alias.`)),b.break(),process.exit(1)),{errors:t,projectInfo:o}}async function Gr(e,t){let r=new Set,n=new Set,i=[...e];for(;i.length>0;){let o=i.shift();if(n.has(o))continue;n.add(o);let{registry:s}=q$1(o);s&&!d[s]&&r.add(s);try{let[c]=await Z([o],t,{useCache:!0});if(c?.registryDependencies)for(let a of c.registryDependencies){let{registry:f}=q$1(a);f&&!d[f]&&r.add(f),n.has(a)||i.push(a);}}catch(c){if(c instanceof k){let{registry:a}=q$1(o);a&&!d[a]&&r.add(a);continue}continue}}return Array.from(r)}async function L(e,t,r={}){r={silent:false,writeFile:true,...r};let i=(await Gr(e,t)).filter(f=>!t.registries?.[f]&&!Object.keys(d).includes(f));if(i.length===0)return {config:t,newRegistries:[]};let o=await na({useCache:process.env.NODE_ENV!=="development"});if(!o)return {config:t,newRegistries:[]};let s={};for(let f of i)o[f]&&(s[f]=o[f]);if(Object.keys(s).length===0)return {config:t,newRegistries:[]};let c$1=Object.fromEntries(Object.entries(t.registries||{}).filter(([f])=>!Object.keys(d).includes(f))),a={...t,registries:{...c$1,...s}};if(r.writeFile){let{resolvedPaths:f,...l}=a,m=w("Updating components.json.",{silent:r.silent}).start(),d=c.parse(l);await B.writeFile(ee__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(d,null,2)+`
6
- `,"utf-8"),m.succeed();}return {config:a,newRegistries:Object.keys(s)}}var _e={nova:{title:"Nova",description:"Lucide / Geist",style:"nova",baseColor:"neutral",theme:"neutral",iconLibrary:"lucide",font:"geist",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},vega:{title:"Vega",description:"Lucide / Inter",style:"vega",baseColor:"neutral",theme:"neutral",iconLibrary:"lucide",font:"inter",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},maia:{title:"Maia",description:"Hugeicons / Figtree",style:"maia",baseColor:"neutral",theme:"neutral",iconLibrary:"hugeicons",font:"figtree",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},lyra:{title:"Lyra",description:"Phosphor / JetBrains Mono",style:"lyra",baseColor:"neutral",theme:"neutral",iconLibrary:"phosphor",font:"jetbrains-mono",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},mira:{title:"Mira",description:"Hugeicons / Inter",style:"mira",baseColor:"neutral",theme:"neutral",iconLibrary:"hugeicons",font:"inter",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false}};function ko(e){let t=new URL(`${c$1}/create`),{rtl:r,...n}=e??{};for(let[i,o]of Object.entries(n))o!==void 0&&t.searchParams.set(i,String(o));return r&&t.searchParams.set("rtl","true"),t.toString()}function Ve(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 t?.template&&r.set("template",t.template),r.set("track","1"),`${c$1}/init?${r.toString()}`}async function $e(){let{base:e}=await fe({type:"select",name:"base",message:`Select a ${a.info("component library")}`,choices:[{title:"Radix",value:"radix"},{title:"Base",value:"base"}]});return e||process.exit(1),e}async function Me(e){let t=Object.entries(_e),{selectedPreset:r}=await fe({type:"select",name:"selectedPreset",message:`Which ${a.info("preset")} would you like to use?`,choices:[...t.map(([i,o])=>({title:o.title,description:o.description,value:i})),{title:"Custom",description:`Build your own at ${a.info(`${c$1}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let i=ko({command:"init",rtl:e.rtl,base:e.base,...e.template&&{template:e.template}});b.break(),b.log(` Build your custom preset on ${a.info(i)}`),b.log(` Then ${a.info("copy and run the command")} from ui.shadcn.com.`),b.break();let{proceed:o}=await fe({type:"confirm",name:"proceed",message:"Open in browser?",initial:true});o&&await Ro(i),process.exit(0);}let n=_e[r];return n||process.exit(1),{url:Ve({...n,base:e.base,rtl:e.rtl},{template:e.template}),base:e.base}}async function We(e,t,r){let n=U$1(T$1({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:i}=await L([e],n,{silent:true,writeFile:false});n=i,X(e,n);let[o]=await ba([e],{config:n,useCache:true}),s=o?.type==="registry:base"&&o.config?o.config:void 0,c=e;if(So(e)){let a=new URL(e);a.searchParams.delete("track"),c=a.toString();}return {registryBaseConfig:s,installStyleIndex:o?.extends!=="none",url:c}}function So(e){try{return new URL(e).pathname==="/init"&&e.startsWith(c$1)}catch{return false}}var Io=process.env.SHADCN_GITHUB_URL??"https://github.com/shadcn-ui/ui.git";function W(e){return {...e,frameworks:e.frameworks??[],scaffold:e.scaffold??Hr({title:e.title,templateDir:e.templateDir,installArgs:e.installArgs}),postInit:e.postInit??Po}}function ge(e,{monorepo:t}){if(!t||!e.monorepo)return e;let r=e.monorepo,n={...e,templateDir:r.templateDir,defaultProjectName:r.defaultProjectName??r.templateDir,packageManager:r.packageManager??e.packageManager,installArgs:r.installArgs??e.installArgs,init:r.init??e.init,files:r.files??e.files};return n.scaffold=Hr({title:e.title,templateDir:r.templateDir,installArgs:n.installArgs}),n}function Hr({title:e,templateDir:t,installArgs:r}){return async({projectPath:n,packageManager:i})=>{let o=w(`Creating a new ${e} project. This may take a few minutes.`).start();try{let s=process.env.SHADCN_TEMPLATE_DIR;if(s){let f=ee__default.resolve(s,t);await B.copy(f,n,{filter:l=>!l.includes("node_modules")});}else {let f=ee__default.join($o.tmpdir(),`shadcn-template-${Date.now()}`);await execa("git",["clone","--depth","1","--filter=blob:none","--sparse",Io,f]),await execa("git",["-C",f,"sparse-checkout","set",`templates/${t}`]);let l=ee__default.resolve(f,"templates",t);await B.move(l,n),await B.remove(f);}if(i!=="pnpm"){let f=ee__default.join(n,"pnpm-lock.yaml");B.existsSync(f)&&await B.remove(f);}let c=["install",...r??[]];await execa(i,c,{cwd:n});let a=ee__default.join(n,"package.json");if(B.existsSync(a)){let f=await B.readFile(a,"utf8"),l=JSON.parse(f);l.name=ee__default.basename(n),await B.writeFile(a,JSON.stringify(l,null,2));}o?.succeed(`Creating a new ${e} project.`);}catch(s){o?.fail(`Something went wrong creating a new ${e} project.`),$(s);}}}async function Po({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{}}function Yr(e,t){if(e.includes("\0"))return false;let r;try{r=e;let d="";for(;r!==d&&r.includes("%");)d=r,r=decodeURIComponent(r);}catch{return false}let n=ee__default.normalize(r.replace(/\\/g,"/")),i=ee__default.normalize(t),o=d=>d.replace(/\[\.\.\..*?\]/g,"").includes("..");if(o(n)||o(r)||o(e))return false;let s=d=>d.replace(/\[\.\.\..*?\]/g,""),c=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(d=>d.test(c)||d.test(a))||(e.includes("~")||r.includes("~"))&&(e.includes("../")||r.includes("../")))return false;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(t.toLowerCase()):false;if(ee__default.isAbsolute(n))return n.startsWith(i+ee__default.sep);let m=ee__default.resolve(i,n);return m.startsWith(i+ee__default.sep)||m===i}async function pt(e,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,...r};let n=t.resolvedPaths.tailwindCss,i=ee__default.relative(t.resolvedPaths.cwd,n),o=w(`Updating CSS variables in ${a.info(i)}`,{silent:r.silent}).start(),s=await promises.readFile(n,"utf8"),c=await Ue(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars});await promises.writeFile(n,c,"utf8"),o.succeed();}async function Ue(e,t,r,n={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false}){n={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,...n};let i=[Ao(t)];n.cleanupDefaultNextStyles&&i.push(Xr()),n.tailwindVersion==="v4"&&(i=[],i.push(To({params:"dark (&:is(.dark *))"})),n.cleanupDefaultNextStyles&&i.push(Xr()),i.push(Fo(t,{overwriteCssVars:n.overwriteCssVars})),i.push(Oo(t)),n.tailwindConfig&&(i.push(Do(n.tailwindConfig)),i.push(_o(n.tailwindConfig)),i.push(Lo(n.tailwindConfig))));let s=(await S$1(i).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),n.tailwindVersion==="v4"&&(s=s.replace(/(\n\s*\n)+/g,`
7
-
8
- `)),s}function Ao(e){return {postcssPlugin:"update-css-vars",Once(t){let r=t.nodes.find(n=>n.type==="atrule"&&n.name==="layer"&&n.params==="base");r instanceof Eo||(r=S$1.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
9
- `,between:" "}}),t.append(r),t.insertBefore(r,S$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([n,i])=>{let o=n==="light"?":root":`.${n}`;No(r,o,i);});}}}function qr(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector===":root");if(t){let r=["--background","--foreground"];t.nodes.filter(n=>n.type==="decl"&&r.includes(n.prop)).forEach(n=>n.remove()),t.nodes.length===0&&t.remove();}}function Xr(){return {postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(n=>n.type==="rule"&&n.selector==="body");t&&(t.nodes.find(n=>n.type==="decl"&&n.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(n.value))?.remove(),t.nodes.find(n=>n.type==="decl"&&n.prop==="background"&&(n.value.startsWith("linear-gradient")||n.value==="var(--background)"))?.remove(),t.nodes.find(n=>n.type==="decl"&&n.prop==="font-family"&&n.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),qr(e);let r=e.nodes.find(n=>n.type==="atrule"&&n.params==="(prefers-color-scheme: dark)");r&&(qr(r),r.nodes.length===0&&r.remove());}}}function No(e,t,r){let n=e.nodes?.find(i=>i.type==="rule"&&i.selector===t);n||Object.keys(r).length>0&&(n=S$1.rule({selector:t,raws:{between:" ",before:`
10
- `}}),e.append(n)),Object.entries(r).forEach(([i,o])=>{let s=`--${i.replace(/^--/,"")}`,c=S$1.decl({prop:s,value:o,raws:{semicolon:true}}),a=n?.nodes.find(f=>f.type==="decl"&&f.prop===s);a?a.replaceWith(c):n?.append(c);});}function Fo(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([n,i])=>{let o=n==="light"?":root":`.${n}`;if(n==="theme"){o="@theme";let c=mt(r);Object.entries(i).forEach(([a,f])=>{let l=`--${a.replace(/^--/,"")}`,m=S$1.decl({prop:l,value:f,raws:{semicolon:true}}),d=c?.nodes?.find(h=>h.type==="decl"&&h.prop===l);t.overwriteCssVars?d?d.replaceWith(m):c?.append(m):d||c?.append(m);});return}let s=r.nodes?.find(c=>c.type==="rule"&&c.selector===o);!s&&Object.keys(i).length>0&&(s=S$1.rule({selector:o,nodes:[],raws:{semicolon:true,between:" ",before:`
11
- `}}),r.append(s),r.insertBefore(s,S$1.comment({text:"---break---"}))),Object.entries(i).forEach(([c,a])=>{let f=`--${c.replace(/^--/,"")}`;f==="--sidebar-background"&&(f="--sidebar"),Zr(a)&&(a=`hsl(${a})`);let l=S$1.decl({prop:f,value:a,raws:{semicolon:true}}),m=s?.nodes.find(d=>d.type==="decl"&&d.prop===f);t.overwriteCssVars?m?m.replaceWith(l):s?.append(l):m||s?.append(l);});});}}}function Oo(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(o=>Object.keys(e[o]||{}))));if(!r.length)return;let n=mt(t),i=n.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--"));for(let o of r){let s=Object.values(e).find(m=>m[o])?.[o];if(!s)continue;if(o==="radius"){let m={sm:"calc(var(--radius) * 0.6)",md:"calc(var(--radius) * 0.8)",lg:"var(--radius)",xl:"calc(var(--radius) * 1.4)","2xl":"calc(var(--radius) * 1.8)","3xl":"calc(var(--radius) * 2.2)","4xl":"calc(var(--radius) * 2.6)"};for(let[d,h]of Object.entries(m)){let g=S$1.decl({prop:`--radius-${d}`,value:h,raws:{semicolon:true}});n?.nodes?.find(w=>w.type==="decl"&&w.prop===g.prop)||n?.append(g);}continue}let c=Zr(s)||Mo(s)?`--color-${o.replace(/^--/,"")}`:`--${o.replace(/^--/,"")}`;c==="--color-sidebar-background"&&(c="--color-sidebar");let a=`var(--${o})`;c==="--color-sidebar"&&(a="var(--sidebar)");let f=S$1.decl({prop:c,value:a,raws:{semicolon:true}});n?.nodes?.find(m=>m.type==="decl"&&m.prop===f.prop)||(i?.length?n?.insertAfter(i[i.length-1],f):n?.append(f));}}}}function mt(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=S$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
12
- `}}),e.append(t),e.insertBefore(t,S$1.comment({text:"---break---"}))),t}function To({params:e}){return {postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(n=>n.type==="atrule"&&n.name==="custom-variant")){let n=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),i=S$1.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:`
13
- `}});if(n.length>0){let o=n[n.length-1];t.insertAfter(o,i);}else t.insertAfter(t.nodes[0],i);t.insertBefore(i,S$1.comment({text:"---break---"}));}}}}function Do(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let n=Vo(t)==="single"?"'":'"',i=t.nodes.filter(s=>s.type==="atrule"&&s.name==="plugin"),o=i[i.length-1]||t.nodes[0];for(let s of e.plugins){let c=s.replace(/^require\(["']|["']\)$/g,"");if(i.some(f=>f.params.replace(/["']/g,"")===c))continue;let a=S$1.atRule({name:"plugin",params:`${n}${c}${n}`,raws:{semicolon:true,before:`
14
- `}});t.insertAfter(o,a),t.insertBefore(a,S$1.comment({text:"---break---"}));}}}}function Lo(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=mt(t),n=r.nodes?.filter(o=>o.type==="atrule"&&o.name==="keyframes"),i=z.record(z.string(),z.record(z.string(),z.string()));for(let[o,s]of Object.entries(e.theme.extend.keyframes)){if(typeof o!="string")continue;let c=i.safeParse(s);if(!c.success||n?.find(f=>f.type==="atrule"&&f.name==="keyframes"&&f.params===o))continue;let a=S$1.atRule({name:"keyframes",params:o,nodes:[],raws:{semicolon:true,between:" ",before:`
15
- `}});for(let[f,l]of Object.entries(c.data)){let m=S$1.rule({selector:f,nodes:Object.entries(l).map(([d,h])=>S$1.decl({prop:d,value:h,raws:{semicolon:true,before:`
5
+ Once configured, you can use the cli to add components.`),b.break(),process.exit(1);}n?.succeed(`Verifying framework. Found ${a.info(o.framework.label)}.`);let s="Validating Tailwind CSS.";o.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${a.info("v4")}.`);let c=w(s,{silent:e.silent}).start();o.tailwindVersion==="v3"&&(!o?.tailwindConfigFile||!o?.tailwindCssFile)?(t["5"]=true,c?.fail()):o.tailwindVersion==="v4"&&!o?.tailwindCssFile?(t["5"]=true,c?.fail()):o.tailwindVersion?c?.succeed():(t["5"]=true,c?.fail());let a$1=w("Validating import alias.",{silent:e.silent}).start();return o?.aliasPrefix?a$1?.succeed():(t["6"]=true,a$1?.fail()),Object.keys(t).length>0&&(t["5"]&&(b.break(),b.error(`No Tailwind CSS configuration found at ${a.info(e.cwd)}.`),b.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),b.error("Install Tailwind CSS then try again."),o?.framework.links.tailwind&&b.error(`Visit ${a.info(o?.framework.links.tailwind)} to get started.`)),t["6"]&&(b.break(),b.error("No import alias found in your tsconfig.json file."),o?.framework.links.installation&&b.error(`Visit ${a.info(o?.framework.links.installation)} to learn how to set an import alias.`)),b.break(),process.exit(1)),{errors:t,projectInfo:o}}async function Gr(e,t){let r=new Set,n=new Set,i=[...e];for(;i.length>0;){let o=i.shift();if(n.has(o))continue;n.add(o);let{registry:s}=q$1(o);s&&!d[s]&&r.add(s);try{let[c]=await Z([o],t,{useCache:!0});if(c?.registryDependencies)for(let a of c.registryDependencies){let{registry:f}=q$1(a);f&&!d[f]&&r.add(f),n.has(a)||i.push(a);}}catch(c){if(c instanceof k){let{registry:a}=q$1(o);a&&!d[a]&&r.add(a);continue}continue}}return Array.from(r)}async function _(e,t,r={}){r={silent:false,writeFile:true,...r};let i=(await Gr(e,t)).filter(f=>!t.registries?.[f]&&!Object.keys(d).includes(f));if(i.length===0)return {config:t,newRegistries:[]};let o=await na({useCache:process.env.NODE_ENV!=="development"});if(!o)return {config:t,newRegistries:[]};let s={};for(let f of i)o[f]&&(s[f]=o[f]);if(Object.keys(s).length===0)return {config:t,newRegistries:[]};let c$1=Object.fromEntries(Object.entries(t.registries||{}).filter(([f])=>!Object.keys(d).includes(f))),a={...t,registries:{...c$1,...s}};if(r.writeFile){let{resolvedPaths:f,...l}=a,m=w("Updating components.json.",{silent:r.silent}).start(),d=c.parse(l);await A.writeFile(te__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(d,null,2)+`
6
+ `,"utf-8"),m.succeed();}return {config:a,newRegistries:Object.keys(s)}}var _e={nova:{title:"Nova",description:"Lucide / Geist",style:"nova",baseColor:"neutral",theme:"neutral",iconLibrary:"lucide",font:"geist",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},vega:{title:"Vega",description:"Lucide / Inter",style:"vega",baseColor:"neutral",theme:"neutral",iconLibrary:"lucide",font:"inter",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},maia:{title:"Maia",description:"Hugeicons / Figtree",style:"maia",baseColor:"neutral",theme:"neutral",iconLibrary:"hugeicons",font:"figtree",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},lyra:{title:"Lyra",description:"Phosphor / JetBrains Mono",style:"lyra",baseColor:"neutral",theme:"neutral",iconLibrary:"phosphor",font:"jetbrains-mono",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},mira:{title:"Mira",description:"Hugeicons / Inter",style:"mira",baseColor:"neutral",theme:"neutral",iconLibrary:"hugeicons",font:"inter",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false}};function ko(e){let t=new URL(`${c$1}/create`),{rtl:r,...n}=e??{};for(let[i,o]of Object.entries(n))o!==void 0&&t.searchParams.set(i,String(o));return r&&t.searchParams.set("rtl","true"),t.toString()}function Ve(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 t?.template&&r.set("template",t.template),r.set("track","1"),`${c$1}/init?${r.toString()}`}async function Ie(){let{base:e}=await pe({type:"select",name:"base",message:`Select a ${a.info("component library")}`,choices:[{title:"Radix",value:"radix"},{title:"Base",value:"base"}]});return e||process.exit(1),e}async function We(e){let t=Object.entries(_e),{selectedPreset:r}=await pe({type:"select",name:"selectedPreset",message:`Which ${a.info("preset")} would you like to use?`,choices:[...t.map(([i,o])=>({title:o.title,description:o.description,value:i})),{title:"Custom",description:`Build your own at ${a.info(`${c$1}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let i=ko({command:"init",rtl:e.rtl,base:e.base,...e.template&&{template:e.template}});b.break(),b.log(` Build your custom preset on ${a.info(i)}`),b.log(` Then ${a.info("copy and run the command")} from ui.shadcn.com.`),b.break();let{proceed:o}=await pe({type:"confirm",name:"proceed",message:"Open in browser?",initial:true});o&&await So(i),process.exit(0);}let n=_e[r];return n||process.exit(1),{url:Ve({...n,base:e.base,rtl:e.rtl},{template:e.template}),base:e.base}}async function Me(e,t,r){let n=U$1(T({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:i}=await _([e],n,{silent:true,writeFile:false});n=i,X$1(e,n);let[o]=await ba([e],{config:n,useCache:true}),s=o?.type==="registry:base"&&o.config?o.config:void 0,c=e;if($o(e)){let a=new URL(e);a.searchParams.delete("track"),c=a.toString();}return {registryBaseConfig:s,installStyleIndex:o?.extends!=="none",url:c}}function $o(e){try{return new URL(e).pathname==="/init"&&e.startsWith(c$1)}catch{return false}}var Po=process.env.SHADCN_GITHUB_URL??"https://github.com/shadcn-ui/ui.git";function U(e){return {...e,frameworks:e.frameworks??[],scaffold:e.scaffold??Yr({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??No}}function he(e,{monorepo:t}){if(!t||!e.monorepo)return e;let r=e.monorepo,n={...e,templateDir:r.templateDir,defaultProjectName:r.defaultProjectName??r.templateDir,init:r.init??e.init,files:r.files??e.files};return n.scaffold=Yr({title:e.title,templateDir:r.templateDir}),n}function jo(e){switch(e){case "pnpm":return ["--no-frozen-lockfile"];default:return []}}async function Eo(e,t){if(t==="pnpm")return;let r=te__default.join(e,"pnpm-workspace.yaml"),n=te__default.join(e,"package.json"),i=te__default.join(e,"pnpm-lock.yaml");A.existsSync(i)&&await A.remove(i);let o=A.existsSync(r);if(A.existsSync(n)){let s=await A.readFile(n,"utf8"),c=JSON.parse(s);if(delete c.packageManager,o){let a=await A.readFile(r,"utf8"),f=[];for(let l of a.split(`
7
+ `)){let m=l.match(/^\s*-\s*["']?(.+?)["']?\s*$/);m&&f.push(m[1]);}c.workspaces=f,await A.remove(r);}await A.writeFile(n,JSON.stringify(c,null,2)+`
8
+ `);}o&&t==="npm"&&await Hr(e);}async function Hr(e){let t=await A.readdir(e,{withFileTypes:true});for(let r of t){if(r.name==="node_modules")continue;let n=te__default.join(e,r.name);if(r.isDirectory())await Hr(n);else if(r.name==="package.json"){let i=await A.readFile(n,"utf8");if(!i.includes("workspace:"))continue;let o=JSON.parse(i),s=false;for(let c of ["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let a=o[c];if(a)for(let[f,l]of Object.entries(a))typeof l=="string"&&l.startsWith("workspace:")&&(a[f]="*",s=true);}s&&await A.writeFile(n,JSON.stringify(o,null,2)+`
9
+ `);}}}function Yr({title:e,templateDir:t}){return async({projectPath:r,packageManager:n})=>{let i=w(`Creating a new ${e} project. This may take a few minutes.`).start();try{let o=process.env.SHADCN_TEMPLATE_DIR;if(o){let f=te__default.resolve(o,t);await A.copy(f,r,{filter:l=>!l.includes("node_modules")});}else {let f=te__default.join(Io.tmpdir(),`shadcn-template-${Date.now()}`);await execa("git",["clone","--depth","1","--filter=blob:none","--sparse",Po,f]),await execa("git",["-C",f,"sparse-checkout","set",`templates/${t}`]);let l=te__default.resolve(f,"templates",t);await A.move(l,r),await A.remove(f);}await Eo(r,n);let c=["install",...jo(n)];await execa(n,c,{cwd:r});let a=te__default.join(r,"package.json");if(A.existsSync(a)){let f=await A.readFile(a,"utf8"),l=JSON.parse(f);l.name=te__default.basename(r),await A.writeFile(a,JSON.stringify(l,null,2)+`
10
+ `);}i?.succeed(`Creating a new ${e} project.`);}catch(o){i?.fail(`Something went wrong creating a new ${e} project.`),$(o);}}}async function No({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{}}function Kr(e,t){if(e.includes("\0"))return false;let r;try{r=e;let d="";for(;r!==d&&r.includes("%");)d=r,r=decodeURIComponent(r);}catch{return false}let n=te__default.normalize(r.replace(/\\/g,"/")),i=te__default.normalize(t),o=d=>d.replace(/\[\.\.\..*?\]/g,"").includes("..");if(o(n)||o(r)||o(e))return false;let s=d=>d.replace(/\[\.\.\..*?\]/g,""),c=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(d=>d.test(c)||d.test(a))||(e.includes("~")||r.includes("~"))&&(e.includes("../")||r.includes("../")))return false;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(t.toLowerCase()):false;if(te__default.isAbsolute(n))return n.startsWith(i+te__default.sep);let m=te__default.resolve(i,n);return m.startsWith(i+te__default.sep)||m===i}async function pt(e,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,...r};let n=t.resolvedPaths.tailwindCss,i=te__default.relative(t.resolvedPaths.cwd,n),o=w(`Updating CSS variables in ${a.info(i)}`,{silent:r.silent}).start(),s=await promises.readFile(n,"utf8"),c=await Ue(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars});await promises.writeFile(n,c,"utf8"),o.succeed();}async function Ue(e,t,r,n={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false}){n={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,...n};let i=[To(t)];n.cleanupDefaultNextStyles&&i.push(Zr()),n.tailwindVersion==="v4"&&(i=[],i.push(_o({params:"dark (&:is(.dark *))"})),n.cleanupDefaultNextStyles&&i.push(Zr()),i.push(Do(t,{overwriteCssVars:n.overwriteCssVars})),i.push(Lo(t)),n.tailwindConfig&&(i.push(Vo(n.tailwindConfig)),i.push(Mo(n.tailwindConfig)),i.push(Wo(n.tailwindConfig))));let s=(await k$1(i).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),n.tailwindVersion==="v4"&&(s=s.replace(/(\n\s*\n)+/g,`
11
+
12
+ `)),s}function To(e){return {postcssPlugin:"update-css-vars",Once(t){let r=t.nodes.find(n=>n.type==="atrule"&&n.name==="layer"&&n.params==="base");r instanceof Oo||(r=k$1.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
13
+ `,between:" "}}),t.append(r),t.insertBefore(r,k$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([n,i])=>{let o=n==="light"?":root":`.${n}`;Ao(r,o,i);});}}}function Xr(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector===":root");if(t){let r=["--background","--foreground"];t.nodes.filter(n=>n.type==="decl"&&r.includes(n.prop)).forEach(n=>n.remove()),t.nodes.length===0&&t.remove();}}function Zr(){return {postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(n=>n.type==="rule"&&n.selector==="body");t&&(t.nodes.find(n=>n.type==="decl"&&n.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(n.value))?.remove(),t.nodes.find(n=>n.type==="decl"&&n.prop==="background"&&(n.value.startsWith("linear-gradient")||n.value==="var(--background)"))?.remove(),t.nodes.find(n=>n.type==="decl"&&n.prop==="font-family"&&n.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),Xr(e);let r=e.nodes.find(n=>n.type==="atrule"&&n.params==="(prefers-color-scheme: dark)");r&&(Xr(r),r.nodes.length===0&&r.remove());}}}function Ao(e,t,r){let n=e.nodes?.find(i=>i.type==="rule"&&i.selector===t);n||Object.keys(r).length>0&&(n=k$1.rule({selector:t,raws:{between:" ",before:`
14
+ `}}),e.append(n)),Object.entries(r).forEach(([i,o])=>{let s=`--${i.replace(/^--/,"")}`,c=k$1.decl({prop:s,value:o,raws:{semicolon:true}}),a=n?.nodes.find(f=>f.type==="decl"&&f.prop===s);a?a.replaceWith(c):n?.append(c);});}function Do(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([n,i])=>{let o=n==="light"?":root":`.${n}`;if(n==="theme"){o="@theme";let c=mt(r);Object.entries(i).forEach(([a,f])=>{let l=`--${a.replace(/^--/,"")}`,m=k$1.decl({prop:l,value:f,raws:{semicolon:true}}),d=c?.nodes?.find(h=>h.type==="decl"&&h.prop===l);t.overwriteCssVars?d?d.replaceWith(m):c?.append(m):d||c?.append(m);});return}let s=r.nodes?.find(c=>c.type==="rule"&&c.selector===o);!s&&Object.keys(i).length>0&&(s=k$1.rule({selector:o,nodes:[],raws:{semicolon:true,between:" ",before:`
15
+ `}}),r.append(s),r.insertBefore(s,k$1.comment({text:"---break---"}))),Object.entries(i).forEach(([c,a])=>{let f=`--${c.replace(/^--/,"")}`;f==="--sidebar-background"&&(f="--sidebar"),Qr(a)&&(a=`hsl(${a})`);let l=k$1.decl({prop:f,value:a,raws:{semicolon:true}}),m=s?.nodes.find(d=>d.type==="decl"&&d.prop===f);t.overwriteCssVars?m?m.replaceWith(l):s?.append(l):m||s?.append(l);});});}}}function Lo(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(o=>Object.keys(e[o]||{}))));if(!r.length)return;let n=mt(t),i=n.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--"));for(let o of r){let s=Object.values(e).find(m=>m[o])?.[o];if(!s)continue;if(o==="radius"){let m={sm:"calc(var(--radius) * 0.6)",md:"calc(var(--radius) * 0.8)",lg:"var(--radius)",xl:"calc(var(--radius) * 1.4)","2xl":"calc(var(--radius) * 1.8)","3xl":"calc(var(--radius) * 2.2)","4xl":"calc(var(--radius) * 2.6)"};for(let[d,h]of Object.entries(m)){let g=k$1.decl({prop:`--radius-${d}`,value:h,raws:{semicolon:true}});n?.nodes?.find(w=>w.type==="decl"&&w.prop===g.prop)||n?.append(g);}continue}let c=Qr(s)||Bo(s)?`--color-${o.replace(/^--/,"")}`:`--${o.replace(/^--/,"")}`;c==="--color-sidebar-background"&&(c="--color-sidebar");let a=`var(--${o})`;c==="--color-sidebar"&&(a="var(--sidebar)");let f=k$1.decl({prop:c,value:a,raws:{semicolon:true}});n?.nodes?.find(m=>m.type==="decl"&&m.prop===f.prop)||(i?.length?n?.insertAfter(i[i.length-1],f):n?.append(f));}}}}function mt(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=k$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
16
+ `}}),e.append(t),e.insertBefore(t,k$1.comment({text:"---break---"}))),t}function _o({params:e}){return {postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(n=>n.type==="atrule"&&n.name==="custom-variant")){let n=t.nodes.filter(o=>o.type==="atrule"&&o.name==="import"),i=k$1.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:`
17
+ `}});if(n.length>0){let o=n[n.length-1];t.insertAfter(o,i);}else t.insertAfter(t.nodes[0],i);t.insertBefore(i,k$1.comment({text:"---break---"}));}}}}function Vo(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let n=Uo(t)==="single"?"'":'"',i=t.nodes.filter(s=>s.type==="atrule"&&s.name==="plugin"),o=i[i.length-1]||t.nodes[0];for(let s of e.plugins){let c=s.replace(/^require\(["']|["']\)$/g,"");if(i.some(f=>f.params.replace(/["']/g,"")===c))continue;let a=k$1.atRule({name:"plugin",params:`${n}${c}${n}`,raws:{semicolon:true,before:`
18
+ `}});t.insertAfter(o,a),t.insertBefore(a,k$1.comment({text:"---break---"}));}}}}function Wo(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=mt(t),n=r.nodes?.filter(o=>o.type==="atrule"&&o.name==="keyframes"),i=z.record(z.string(),z.record(z.string(),z.string()));for(let[o,s]of Object.entries(e.theme.extend.keyframes)){if(typeof o!="string")continue;let c=i.safeParse(s);if(!c.success||n?.find(f=>f.type==="atrule"&&f.name==="keyframes"&&f.params===o))continue;let a=k$1.atRule({name:"keyframes",params:o,nodes:[],raws:{semicolon:true,between:" ",before:`
19
+ `}});for(let[f,l]of Object.entries(c.data)){let m=k$1.rule({selector:f,nodes:Object.entries(l).map(([d,h])=>k$1.decl({prop:d,value:h,raws:{semicolon:true,before:`
16
20
  `,between:": "}})),raws:{semicolon:true,between:" ",before:`
17
- `}});a.append(m);}r.append(a),r.insertBefore(a,S$1.comment({text:"---break---"}));}}}}function _o(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=mt(t),n=r.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--animate-")),i=z.record(z.string(),z.string()).safeParse(e.theme.extend.animation);if(i.success)for(let[o,s]of Object.entries(i.data)){let c=`--animate-${o}`;if(n?.find(f=>f.prop===c))continue;let a=S$1.decl({prop:c,value:s,raws:{semicolon:true,between:": ",before:`
18
- `}});r.append(a);}}}}function Vo(e){return e.nodes[0].toString().includes("'")?"single":"double"}function Zr(e){if(e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch"))return false;let t=e.split(" ");return t.length===3&&t.slice(1,3).every(r=>r.includes("%"))}function Mo(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function ze(e,t,r){let n=e&&Object.keys(e).length>0,i=Object.keys(r.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!n&&!i)return;r={silent:false,...r};let o=t.resolvedPaths.tailwindCss,s=ee__default.relative(t.resolvedPaths.cwd,o),c=w(`Updating ${a.info(s)}`,{silent:r.silent}).start(),a$1=await promises.readFile(o,"utf8");i&&(a$1=await Ue(a$1,r.cssVars,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars})),n&&(a$1=await Vt(a$1,e)),await promises.writeFile(o,a$1,"utf8"),c.succeed();}async function Vt(e,t){let r=[zo(t)],n=await S$1(r).process(e,{from:void 0}),i=n.css,o=n.root;if(o.nodes&&o.nodes.length>0){let s=o.nodes[o.nodes.length-1];s.type==="atrule"&&!s.nodes&&!i.trimEnd().endsWith(";")&&(i=i.trimEnd()+";");}return i=i.replace(/\/\* ---break--- \*\//g,""),i=i.replace(/(\n\s*\n)+/g,`
19
-
20
- `),i=i.trimEnd(),i}function zo(e){return {postcssPlugin:"update-css",Once(t){for(let[r,n]of Object.entries(e))if(r.startsWith("@")){let i=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!i)continue;let[,o,s]=i;if(o==="import"){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name==="import"&&a.params===s)){let a=S$1.atRule({name:"import",params:s,raws:{semicolon:true}}),f=t.nodes?.filter(l=>l.type==="atrule"&&l.name==="import");if(f&&f.length>0){let l=f[f.length-1];a.raws.before=`
21
- `,t.insertAfter(l,a);}else !t.nodes||t.nodes.length,a.raws.before="",t.prepend(a);}}else if(o==="plugin"){let c=s;s&&!s.startsWith('"')&&!s.startsWith("'")&&(c=`"${s}"`);let a=l=>l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'")?l.slice(1,-1):l;if(!t.nodes?.find(l=>l.type!=="atrule"||l.name!=="plugin"?false:a(l.params)===a(s))){let l=S$1.atRule({name:"plugin",params:c,raws:{semicolon:true,before:`
22
- `}}),m=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="import"),d=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="plugin");if(d&&d.length>0){let h=d[d.length-1];t.insertAfter(h,l);}else if(m&&m.length>0){let h=m[m.length-1];t.insertAfter(h,l),t.insertBefore(l,S$1.comment({text:"---break---"})),t.insertAfter(l,S$1.comment({text:"---break---"}));}else t.prepend(l),t.insertBefore(l,S$1.comment({text:"---break---"})),t.insertAfter(l,S$1.comment({text:"---break---"}));}}else if(typeof n=="object"&&Object.keys(n).length===0){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name===o&&a.params===s)){let a=S$1.atRule({name:o,params:s,raws:{semicolon:true}});t.append(a),t.insertBefore(a,S$1.comment({text:"---break---"}));}}else if(o==="keyframes"){let c=t.nodes?.find(l=>l.type==="atrule"&&l.name==="theme"&&l.params==="inline");c||(c=S$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
23
- `}}),t.append(c),t.insertBefore(c,S$1.comment({text:"---break---"})));let a=c.nodes?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===s),f;if(a?(f=S$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
24
- `}}),a.replaceWith(f)):(f=S$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
25
- `}}),c.append(f)),typeof n=="object")for(let[l,m]of Object.entries(n))he(f,l,m);}else if(o==="utility"){let c=t.nodes?.find(a=>a.type==="atrule"&&a.name===o&&a.params===s);if(c){if(typeof n=="object")for(let[a,f]of Object.entries(n))if(typeof f=="string"){let l=c.nodes?.find(d=>d.type==="decl"&&d.prop===a),m=S$1.decl({prop:a,value:f,raws:{semicolon:true,before:`
26
- `}});l?l.replaceWith(m):c.append(m);}else if(a.startsWith("@")&&typeof f=="object"&&f!==null&&Object.keys(f).length===0){let l=a.match(/@([a-zA-Z-]+)\s*(.*)/);if(l){let[,m,d]=l;if(!c.nodes?.find(g=>g.type==="atrule"&&g.name===m&&g.params===d)){let g=S$1.atRule({name:m,params:d,raws:{semicolon:true,before:`
27
- `}});c.append(g);}}}else typeof f=="object"&&he(c,a,f);}else {let a=S$1.atRule({name:o,params:s,raws:{semicolon:true,between:" ",before:`
28
- `}});if(t.append(a),t.insertBefore(a,S$1.comment({text:"---break---"})),typeof n=="object")for(let[f,l]of Object.entries(n))if(typeof l=="string"){let m=S$1.decl({prop:f,value:l,raws:{semicolon:true,before:`
29
- `}});a.append(m);}else if(f.startsWith("@")&&typeof l=="object"&&l!==null&&Object.keys(l).length===0){let m=f.match(/@([a-zA-Z-]+)\s*(.*)/);if(m){let[,d,h]=m;if(!a.nodes?.find(w=>w.type==="atrule"&&w.name===d&&w.params===h)){let w=S$1.atRule({name:d,params:h,raws:{semicolon:true,before:`
30
- `}});a.append(w);}}}else typeof l=="object"&&he(a,f,l);}}else o==="property"?he(t,r,n):en(t,o,s,n);}else he(t,r,n);}}}function en(e,t,r,n){let i=e.nodes?.find(o=>o.type==="atrule"&&o.name===t&&o.params===r);if(i||(i=S$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
31
- `}}),e.append(i),e.insertBefore(i,S$1.comment({text:"---break---"}))),typeof n=="object")for(let[o,s]of Object.entries(n))if(o.startsWith("@")){let c=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(c){let[,a,f]=c;en(i,a,f,s);}}else he(i,o,s);else if(typeof n=="string")try{let s=S$1.parse(`.temp{${n}}`).first;if(s&&s.nodes){let c=S$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
21
+ `}});a.append(m);}r.append(a),r.insertBefore(a,k$1.comment({text:"---break---"}));}}}}function Mo(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=mt(t),n=r.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--animate-")),i=z.record(z.string(),z.string()).safeParse(e.theme.extend.animation);if(i.success)for(let[o,s]of Object.entries(i.data)){let c=`--animate-${o}`;if(n?.find(f=>f.prop===c))continue;let a=k$1.decl({prop:c,value:s,raws:{semicolon:true,between:": ",before:`
22
+ `}});r.append(a);}}}}function Uo(e){return e.nodes[0].toString().includes("'")?"single":"double"}function Qr(e){if(e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch"))return false;let t=e.split(" ");return t.length===3&&t.slice(1,3).every(r=>r.includes("%"))}function Bo(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function Be(e,t,r){let n=e&&Object.keys(e).length>0,i=Object.keys(r.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!n&&!i)return;r={silent:false,...r};let o=t.resolvedPaths.tailwindCss,s=te__default.relative(t.resolvedPaths.cwd,o),c=w(`Updating ${a.info(s)}`,{silent:r.silent}).start(),a$1=await promises.readFile(o,"utf8");i&&(a$1=await Ue(a$1,r.cssVars,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars})),n&&(a$1=await Vt(a$1,e)),await promises.writeFile(o,a$1,"utf8"),c.succeed();}async function Vt(e,t){let r=[Go(t)],n=await k$1(r).process(e,{from:void 0}),i=n.css,o=n.root;if(o.nodes&&o.nodes.length>0){let s=o.nodes[o.nodes.length-1];s.type==="atrule"&&!s.nodes&&!i.trimEnd().endsWith(";")&&(i=i.trimEnd()+";");}return i=i.replace(/\/\* ---break--- \*\//g,""),i=i.replace(/(\n\s*\n)+/g,`
23
+
24
+ `),i=i.trimEnd(),i}function Go(e){return {postcssPlugin:"update-css",Once(t){for(let[r,n]of Object.entries(e))if(r.startsWith("@")){let i=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!i)continue;let[,o,s]=i;if(o==="import"){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name==="import"&&a.params===s)){let a=k$1.atRule({name:"import",params:s,raws:{semicolon:true}}),f=t.nodes?.filter(l=>l.type==="atrule"&&l.name==="import");if(f&&f.length>0){let l=f[f.length-1];a.raws.before=`
25
+ `,t.insertAfter(l,a);}else !t.nodes||t.nodes.length,a.raws.before="",t.prepend(a);}}else if(o==="plugin"){let c=s;s&&!s.startsWith('"')&&!s.startsWith("'")&&(c=`"${s}"`);let a=l=>l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'")?l.slice(1,-1):l;if(!t.nodes?.find(l=>l.type!=="atrule"||l.name!=="plugin"?false:a(l.params)===a(s))){let l=k$1.atRule({name:"plugin",params:c,raws:{semicolon:true,before:`
26
+ `}}),m=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="import"),d=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="plugin");if(d&&d.length>0){let h=d[d.length-1];t.insertAfter(h,l);}else if(m&&m.length>0){let h=m[m.length-1];t.insertAfter(h,l),t.insertBefore(l,k$1.comment({text:"---break---"})),t.insertAfter(l,k$1.comment({text:"---break---"}));}else t.prepend(l),t.insertBefore(l,k$1.comment({text:"---break---"})),t.insertAfter(l,k$1.comment({text:"---break---"}));}}else if(typeof n=="object"&&Object.keys(n).length===0){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name===o&&a.params===s)){let a=k$1.atRule({name:o,params:s,raws:{semicolon:true}});t.append(a),t.insertBefore(a,k$1.comment({text:"---break---"}));}}else if(o==="keyframes"){let c=t.nodes?.find(l=>l.type==="atrule"&&l.name==="theme"&&l.params==="inline");c||(c=k$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
27
+ `}}),t.append(c),t.insertBefore(c,k$1.comment({text:"---break---"})));let a=c.nodes?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===s),f;if(a?(f=k$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
28
+ `}}),a.replaceWith(f)):(f=k$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
29
+ `}}),c.append(f)),typeof n=="object")for(let[l,m]of Object.entries(n))ye(f,l,m);}else if(o==="utility"){let c=t.nodes?.find(a=>a.type==="atrule"&&a.name===o&&a.params===s);if(c){if(typeof n=="object")for(let[a,f]of Object.entries(n))if(typeof f=="string"){let l=c.nodes?.find(d=>d.type==="decl"&&d.prop===a),m=k$1.decl({prop:a,value:f,raws:{semicolon:true,before:`
30
+ `}});l?l.replaceWith(m):c.append(m);}else if(a.startsWith("@")&&typeof f=="object"&&f!==null&&Object.keys(f).length===0){let l=a.match(/@([a-zA-Z-]+)\s*(.*)/);if(l){let[,m,d]=l;if(!c.nodes?.find(g=>g.type==="atrule"&&g.name===m&&g.params===d)){let g=k$1.atRule({name:m,params:d,raws:{semicolon:true,before:`
31
+ `}});c.append(g);}}}else typeof f=="object"&&ye(c,a,f);}else {let a=k$1.atRule({name:o,params:s,raws:{semicolon:true,between:" ",before:`
32
+ `}});if(t.append(a),t.insertBefore(a,k$1.comment({text:"---break---"})),typeof n=="object")for(let[f,l]of Object.entries(n))if(typeof l=="string"){let m=k$1.decl({prop:f,value:l,raws:{semicolon:true,before:`
33
+ `}});a.append(m);}else if(f.startsWith("@")&&typeof l=="object"&&l!==null&&Object.keys(l).length===0){let m=f.match(/@([a-zA-Z-]+)\s*(.*)/);if(m){let[,d,h]=m;if(!a.nodes?.find(w=>w.type==="atrule"&&w.name===d&&w.params===h)){let w=k$1.atRule({name:d,params:h,raws:{semicolon:true,before:`
34
+ `}});a.append(w);}}}else typeof l=="object"&&ye(a,f,l);}}else o==="property"?ye(t,r,n):tn(t,o,s,n);}else ye(t,r,n);}}}function tn(e,t,r,n){let i=e.nodes?.find(o=>o.type==="atrule"&&o.name===t&&o.params===r);if(i||(i=k$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
35
+ `}}),e.append(i),e.insertBefore(i,k$1.comment({text:"---break---"}))),typeof n=="object")for(let[o,s]of Object.entries(n))if(o.startsWith("@")){let c=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(c){let[,a,f]=c;tn(i,a,f,s);}}else ye(i,o,s);else if(typeof n=="string")try{let s=k$1.parse(`.temp{${n}}`).first;if(s&&s.nodes){let c=k$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
32
36
  `}});s.nodes.forEach(a=>{if(a.type==="decl"){let f=a.clone();f.raws.before=`
33
- `,c.append(f);}}),c.nodes?.length&&i.append(c);}}catch(o){throw console.error("Error parsing at-rule content:",n,o),o}}function he(e,t,r){let n=e.nodes?.find(i=>i.type==="rule"&&i.selector===t);if(n||(n=S$1.rule({selector:t,raws:{semicolon:true,between:" ",before:`
34
- `}}),e.append(n)),typeof r=="object"){for(let[i,o]of Object.entries(r))if(i.startsWith("@")&&typeof o=="object"&&o!==null&&Object.keys(o).length===0){let s=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,a]=s;if(!n.nodes?.find(l=>l.type==="atrule"&&l.name===c&&l.params===a)){if(c==="apply"){let m=n.nodes?.find(d=>d.type==="atrule"&&d.name==="apply");if(m){m.params=twMerge(m.params,a);continue}}let l=S$1.atRule({name:c,params:a,raws:{semicolon:true,before:`
35
- `}});n.append(l);}}}else if(typeof o=="string"){let s=S$1.decl({prop:i,value:o,raws:{semicolon:true,before:`
36
- `}}),c=n.nodes?.find(a=>a.type==="decl"&&a.prop===i);c?c.replaceWith(s):n.append(s);}else if(typeof o=="object"){let s=i.startsWith("&")?t.replace(/^([^:]+)/,`$1${i.substring(1)}`):i;he(e,s,o);}}else if(typeof r=="string")try{let o=S$1.parse(`.temp{${r}}`).first;o&&o.nodes&&o.nodes.forEach(s=>{if(s.type==="decl"){let c=s.clone();c.raws.before=`
37
- `,n?.append(c);}});}catch(i){throw console.error("Error parsing rule content:",t,r,i),i}}async function T(e,t,r,n){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;n={silent:false,...n};let i=w("Installing dependencies.",{silent:n.silent})?.start(),o=await Go(r),s="";if(Jo(r)&&o==="npm")if(n.silent)s="force";else {i.stopAndPersist(),b.warn(`
37
+ `,c.append(f);}}),c.nodes?.length&&i.append(c);}}catch(o){throw console.error("Error parsing at-rule content:",n,o),o}}function ye(e,t,r){let n=e.nodes?.find(i=>i.type==="rule"&&i.selector===t);if(n||(n=k$1.rule({selector:t,raws:{semicolon:true,between:" ",before:`
38
+ `}}),e.append(n)),typeof r=="object"){for(let[i,o]of Object.entries(r))if(i.startsWith("@")&&typeof o=="object"&&o!==null&&Object.keys(o).length===0){let s=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,a]=s;if(!n.nodes?.find(l=>l.type==="atrule"&&l.name===c&&l.params===a)){if(c==="apply"){let m=n.nodes?.find(d=>d.type==="atrule"&&d.name==="apply");if(m){m.params=twMerge(m.params,a);continue}}let l=k$1.atRule({name:c,params:a,raws:{semicolon:true,before:`
39
+ `}});n.append(l);}}}else if(typeof o=="string"){let s=k$1.decl({prop:i,value:o,raws:{semicolon:true,before:`
40
+ `}}),c=n.nodes?.find(a=>a.type==="decl"&&a.prop===i);c?c.replaceWith(s):n.append(s);}else if(typeof o=="object"){let s=i.startsWith("&")?t.replace(/^([^:]+)/,`$1${i.substring(1)}`):i;ye(e,s,o);}}else if(typeof r=="string")try{let o=k$1.parse(`.temp{${r}}`).first;o&&o.nodes&&o.nodes.forEach(s=>{if(s.type==="decl"){let c=s.clone();c.raws.before=`
41
+ `,n?.append(c);}});}catch(i){throw console.error("Error parsing rule content:",t,r,i),i}}async function D(e,t,r,n){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;n={silent:false,...n};let i=w("Installing dependencies.",{silent:n.silent})?.start(),o=await Ko(r),s="";if(Yo(r)&&o==="npm")if(n.silent)s="force";else {i.stopAndPersist(),b.warn(`
38
42
  It looks like you are using React 19.
39
43
  Some packages may fail to install due to peer dependency issues in npm (see ${c$1}/react-19).
40
- `);let c=await fe([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);c&&(s=c.flag);}i?.start(),await Ho(o,e,t,r.resolvedPaths.cwd,s),i?.succeed();}function Jo(e){let t=qa(e.resolvedPaths.cwd,false);if(!t?.dependencies?.react)return false;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),n=t.dependencies["react-day-picker"]?.startsWith("8");return r&&n}async function Go(e){return qa(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$1(e.resolvedPaths.cwd)}async function Ho(e,t,r,n,i){if(e==="npm")return Yo(t,r,n,i);if(e==="deno")return Ko(t,r,n);if(e==="expo")return qo(t,r,n);t?.length&&await execa(e,["add",...t],{cwd:n}),r?.length&&await execa(e,["add","-D",...r],{cwd:n});}async function Yo(e,t,r,n){e.length&&await execa("npm",["install",...n?[`--${n}`]:[],...e],{cwd:r}),t.length&&await execa("npm",["install",...n?[`--${n}`]:[],"-D",...t],{cwd:r});}async function Ko(e,t,r){e?.length&&await execa("deno",["add",...e.map(n=>`npm:${n}`)],{cwd:r}),t?.length&&await execa("deno",["add","-D",...t.map(n=>`npm:${n}`)],{cwd:r});}async function qo(e,t,r){e.length&&await execa("npx",["expo","install",...e],{cwd:r}),t.length&&await execa("npx",["expo","install","-- -D",...t],{cwd:r});}async function Wt(e,t$1,r){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let n=w("Adding environment variables.",{silent:r.silent})?.start(),i=t$1.resolvedPaths.cwd,o=ee__default.join(i,".env.local"),s=t(i);s&&(o=s);let c=existsSync(o),a$1=ee__default.basename(o),f=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
41
- `),l=[],m=null,d=null;if(c){let h=await promises.readFile(o,"utf-8"),g=v(h,f);if(l=u(h,f),l.length>0){if(await promises.writeFile(o,g,"utf-8"),m=ee__default.relative(i,o),n?.succeed(`Added the following variables to ${a.info(a$1)}:`),!r.silent)for(let w of l)b.log(` ${a.success("+")} ${w}`);}else n?.stop();}else if(await promises.writeFile(o,f+`
42
- `,"utf-8"),d=ee__default.relative(i,o),l=Object.keys(e),n?.succeed(`Added the following variables to ${a.info(a$1)}:`),!r.silent)for(let h of l)b.log(` ${a.success("+")} ${h}`);return !r.silent&&l.length>0&&b.break(),{envVarsAdded:l,envFileUpdated:m,envFileCreated:d}}async function Je(e,t){if(!e.fonts?.length)return e;let r=await ra(t.resolvedPaths.cwd);if(!r)return e;e.cssVars??={},e.cssVars.theme??={};let n=r.framework.name==="next-app"||r.framework.name==="next-pages";for(let i of e.fonts)if(n)e.cssVars.theme[i.font.variable]=`var(${i.font.variable})`;else {let s=`@fontsource-variable/${i.name.replace("font-","")}`;e.dependencies??=[],e.dependencies.push(s),e.css??={},e.css[`@import "${s}"`]={},e.cssVars.theme[i.font.variable]=i.font.family;}if(e.fonts.length>0){let i=new Map;for(let o of e.fonts){let s=o.font.selector??"html",c=o.font.variable.replace("--","");i.has(s)||i.set(s,[]),i.get(s).push(c);}e.css??={},e.css["@layer base"]??={};for(let[o,s]of Array.from(i.entries())){let c=s.join(" ");e.css["@layer base"][o]??={};let a=Object.keys(e.css["@layer base"][o]).find(f=>f.startsWith("@apply "));a?(delete e.css["@layer base"][o][a],e.css["@layer base"][o][`${a} ${c}`]={}):e.css["@layer base"][o][`@apply ${c}`]={};}}return e}async function Ge(e,t,r){if(!e?.length)return;let n=await ra(t.resolvedPaths.cwd);if(!n||n.framework.name!=="next-app"&&n.framework.name!=="next-pages")return;let i=w("Updating fonts.",{silent:r.silent})?.start();try{await ni(e,t,n),i?.succeed("Updating fonts.");}catch(o){throw i?.fail("Failed to update fonts."),o}}async function ni(e,t,r){let n=await oi(t,r);if(!n)return;let i=await promises.readFile(n,"utf-8"),o=await ii(i,e,t);o!==i&&await promises.writeFile(n,o,"utf-8");}async function oi(e,t){let r=e.resolvedPaths.cwd,n=t.isSrcDir,o=t.isTsx?"tsx":"jsx",s=n?[`src/app/layout.${o}`,`app/layout.${o}`]:[`app/layout.${o}`];for(let c of s){let a=ee__default.join(r,c);if(existsSync(a))return a}return null}async function ii(e,t,r){let i=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),o=t.filter(m=>m.font.provider==="google"),s=[],c=[];for(let m of o){let d=m.font.import;if(!d)continue;let h=i.getImportDeclaration(v=>v.getModuleSpecifierValue()==="next/font/google");if(h){if(h.getNamedImports().some(C=>C.getName()===d)){let C=rn(i,m.font.variable);C&&(s.push(C.getName()),m.font.selector||c.push(m.font.variable.replace("--","")));continue}h.addNamedImport(d);}else i.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[d]});let g=ai(d),w=si(m),x=rn(i,m.font.variable);if(x)x.setInitializer(`${d}(${w})`),x.getName()!==g&&x.rename(g);else {let v=ci(i);i.insertVariableStatement(v,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:g,initializer:`${d}(${w})`}]}).appendWhitespace(`
43
- `);}s.push(g),m.font.selector||c.push(m.font.variable.replace("--",""));}let a=new Set(["font-sans","font-serif","font-mono"]),f=[...c].reverse().find(m=>a.has(m)),l=c.filter(m=>!a.has(m));return f&&l.unshift(f),s.length>0&&li(i,s,l,r),i.getFullText()}function si(e){let t={};return e.font.subsets?.length&&(t.subsets=e.font.subsets),e.font.weight?.length&&(t.weight=e.font.weight),t.variable=e.font.variable,JSON.stringify(t).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'")}function ai(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function rn(e,t){let r=e.getVariableStatements();for(let n of r)for(let i of n.getDeclarations()){let o=i.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let c=o.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return i}return null}function ci(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function li(e,t,r,n){let i=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let o of i){if(o.getTagNameNode().getText()!=="html")continue;let c=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),f=[...c,...a],l=o.getAttribute("className");if(!l){Be(e,n),o.addAttribute({name:"className",initializer:`{cn(${f.join(", ")})}`});return}if(l.getKind()!==SyntaxKind.JsxAttribute)return;let m=l.asKindOrThrow(SyntaxKind.JsxAttribute),d=m.getInitializer();if(!d)return;if(d.getKind()===SyntaxKind.StringLiteral){let h=d.getText().slice(1,-1);Be(e,n),m.setInitializer(`{cn("${h}", ${f.join(", ")})}`);}else if(d.getKind()===SyntaxKind.JsxExpression){let h=d.asKindOrThrow(SyntaxKind.JsxExpression),g=h.getExpression();if(!g)return;let w=g.getText();if(w.startsWith("cn(")){let x=a.every($=>w.includes($)),v=r.every($=>w.includes(`"${$}"`)),P=["font-sans","font-serif","font-mono"].filter($=>!r.includes($)).some($=>w.includes(`"${$}"`));if(x&&v&&!P)continue;let C=pi(w,a);C=mi(C);let R=di(C,f);h.replaceWithText(`{${R}}`);}else if(/^\w+\.variable$/.test(w)){if(a.includes(w)&&r.length===0)continue;Be(e,n),h.replaceWithText(`{cn(${f.join(", ")})}`);}else if(w.startsWith("`")&&w.endsWith("`")){let x=fi(w);Be(e,n);let v=new Set(f),P=new Set(["font-sans","font-serif","font-mono"].map(R=>`"${R}"`)),C=x.filter(R=>!v.has(R)&&!P.has(R));h.replaceWithText(`{cn(${[...C,...f].join(", ")})}`);}else Be(e,n),h.replaceWithText(`{cn(${w}, ${f.join(", ")})}`);}}}function Be(e,t){if(!e.getImportDeclaration(n=>n.getNamedImports().some(o=>o.getName()==="cn"))){let n=e.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));n?n.getNamedImports().some(o=>o.getName()==="cn")||n.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]});}}function fi(e){let t=[],r=[],i=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let o of i)if(o)if(o.startsWith("${")&&o.endsWith("}")){let s=o.slice(2,-1).trim();s&&r.push(s);}else {let s=o.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`);}return [...t,...r]}function pi(e,t){let r=e;for(let n of t)r=r.replace(new RegExp(`,?\\s*${n.replace(".","\\.")}`,"g"),"").replace(/cn\(\s*,/,"cn(");return r}function mi(e){let t=e;for(let r of ["font-sans","font-serif","font-mono"])t=t.replace(new RegExp(`,?\\s*"${r}"`,"g"),"").replace(/cn\(\s*,/,"cn(");return t}function di(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function te(e,t,r){r={overwrite:false,silent:false,isNewProject:false,...r};let n=await P(t);return n&&n.ui&&n.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await hi(e,t,n,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await gi(e,t,{...r,skipFonts:r.skipFonts})}async function gi(e,t,r){if(!e.length)return;let n=w("Checking registry.",{silent:r.silent})?.start(),i=await _(e,U$1(t));if(!i)return n?.fail(),$(new Error("Failed to fetch components from registry."));try{on(i.files??[],t.resolvedPaths.cwd);}catch(c){return n?.fail(),$(c)}n?.succeed();let o=await ta$1(t);r.skipFonts||(i=await Je(i,t)),await T(i.dependencies,i.devDependencies,t,{silent:r.silent}),await Y$1(i.tailwind?.config,t,{silent:r.silent,tailwindVersion:o}),await Wt(i.envVars,t,{silent:r.silent}),r.skipFonts||await Ge(i.fonts,t,{silent:r.silent}),await D(i.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path});let s=i.cssVars?r.overwriteCssVars??await nn(e,t):void 0;await ze(i.css,t,{silent:r.silent,cssVars:i.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:s,tailwindVersion:o,tailwindConfig:i.tailwind?.config}),i.docs&&b.info(i.docs);}async function hi(e,t,r,n){if(!e.length)return;let i=w("Checking registry.",{silent:n.silent})?.start(),o=await _(e,U$1(t));if(!o)return i?.fail(),$(new Error("Failed to fetch components from registry."));try{on(o.files??[],t.resolvedPaths.cwd);}catch(R){return i?.fail(),$(R)}i?.succeed();let s=[],c=[],a=[],f=w("Installing components.")?.start(),l=r.ui,m=await ta$1(l),d=R(t.resolvedPaths.cwd,l.resolvedPaths.ui);o=await Je(o,t),await T(o.dependencies,o.devDependencies,l,{silent:true}),o.tailwind?.config&&(await Y$1(o.tailwind?.config,l,{silent:true,tailwindVersion:m}),c.push(ee__default.relative(d,l.resolvedPaths.tailwindConfig))),o.envVars&&await Wt(o.envVars,l,{silent:true}),await Ge(o.fonts,t,{silent:true});let h=new Map;for(let R of o.files??[]){let $=R.type||"registry:ui";h.has($)||h.set($,[]),h.get($).push(R);}let g={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"};for(let R$1 of Array.from(h.keys())){let $=h.get(R$1),M=g[R$1],X=M&&r[M]?r[M]:t,et=R(t.resolvedPaths.cwd,X.resolvedPaths.ui||X.resolvedPaths.cwd),jt=await Q(et,X.resolvedPaths.cwd)??X.resolvedPaths.cwd,Et=await D($,X,{overwrite:n.overwrite,silent:true,rootSpinner:f,isRemote:n.isRemote,isWorkspace:true,path:n.path});s.push(...Et.filesCreated.map(Te=>ee__default.relative(et,ee__default.join(jt,Te)))),c.push(...Et.filesUpdated.map(Te=>ee__default.relative(et,ee__default.join(jt,Te)))),a.push(...Et.filesSkipped.map(Te=>ee__default.relative(et,ee__default.join(jt,Te))));}let w$1=o.cssVars?n.overwriteCssVars??await nn(e,t):void 0;await ze(o.css,l,{silent:true,cssVars:o.cssVars,overwriteCssVars:w$1,tailwindVersion:m,tailwindConfig:o.tailwind?.config}),(o.cssVars||o.css)&&c.push(ee__default.relative(d,l.resolvedPaths.tailwindCss)),f?.succeed();let x=Array.from(new Set(s)).sort(),v=Array.from(new Set(c.filter(R=>!s.includes(R)))).sort(),P=Array.from(new Set(a)).sort();if(!(x.length||v.length)&&!P.length&&w("No files updated.",{silent:n.silent})?.info(),x.length){w(`Created ${x.length} ${x.length===1?"file":"files"}:`,{silent:n.silent})?.succeed();for(let R of x)b.log(` - ${R}`);}if(v.length){w(`Updated ${v.length} ${v.length===1?"file":"files"}:`,{silent:n.silent})?.info();for(let R of v)b.log(` - ${R}`);}if(P.length){w(`Skipped ${P.length} ${P.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info();for(let R of P)b.log(` - ${R}`);}o.docs&&b.info(o.docs);}async function nn(e,t){let r=await ba(e,{config:t});return z.array(n$1).parse(r).some(i=>i.type==="registry:theme"||i.type==="registry:style"||i.type==="registry:font"||i.type==="registry:base")}function on(e,t){for(let r of e)if(r?.target&&!Yr(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}async function le(e){let t=ee__default.resolve(e.projectPath,"packages/ui"),r=ee__default.resolve(e.projectPath,"apps/web"),n=ee__default.resolve(t,"components.json"),i=await B.readJson(n);e.registryBaseConfig&&(i=sn(i,e.registryBaseConfig)),i.tailwind.baseColor="neutral",e.rtl&&(i.rtl=true),e.menuColor&&(i.menuColor=e.menuColor),e.menuAccent&&(i.menuAccent=e.menuAccent),e.iconLibrary&&(i.iconLibrary=e.iconLibrary),await B.writeJson(n,i,{spaces:2});let o=ee__default.resolve(r,"components.json"),s=await B.readJson(o);e.registryBaseConfig&&(s=sn(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 B.writeJson(o,s,{spaces:2});let c$1=await O(t,c.parse(i)),{config:a}=await L(e.components,c$1,{silent:true});await te(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let f=await O(r,c.parse(s)),l=await _(e.components,U$1(a));if(l?.fonts?.length){let[d]=l.fonts,g=`@fontsource-variable/${d.name.replace("font-","")}`;await T([g],[],c$1,{silent:true}),await pt({theme:{[d.font.variable]:d.font.family}},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await ze({[`@import "${g}"`]:{}},c$1,{silent:e.silent});}let m=c$1.iconLibrary;if(m&&m in a$2){let d=[...a$2[m].packages];await T(d,[],c$1,{silent:true}),await T(d,[],f,{silent:true});}return f}var cn=W({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:an`---
44
+ `);let c=await pe([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);c&&(s=c.flag);}i?.start(),await qo(o,e,t,r.resolvedPaths.cwd,s),i?.succeed();}function Yo(e){let t=qa(e.resolvedPaths.cwd,false);if(!t?.dependencies?.react)return false;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),n=t.dependencies["react-day-picker"]?.startsWith("8");return r&&n}async function Ko(e){return qa(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$1(e.resolvedPaths.cwd)}async function qo(e,t,r,n,i){if(e==="npm")return Xo(t,r,n,i);if(e==="deno")return Zo(t,r,n);if(e==="expo")return Qo(t,r,n);t?.length&&await execa(e,["add",...t],{cwd:n}),r?.length&&await execa(e,["add","-D",...r],{cwd:n});}async function Xo(e,t,r,n){e.length&&await execa("npm",["install",...n?[`--${n}`]:[],...e],{cwd:r}),t.length&&await execa("npm",["install",...n?[`--${n}`]:[],"-D",...t],{cwd:r});}async function Zo(e,t,r){e?.length&&await execa("deno",["add",...e.map(n=>`npm:${n}`)],{cwd:r}),t?.length&&await execa("deno",["add","-D",...t.map(n=>`npm:${n}`)],{cwd:r});}async function Qo(e,t,r){e.length&&await execa("npx",["expo","install",...e],{cwd:r}),t.length&&await execa("npx",["expo","install","-- -D",...t],{cwd:r});}async function Mt(e,t$1,r){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let n=w("Adding environment variables.",{silent:r.silent})?.start(),i=t$1.resolvedPaths.cwd,o=te__default.join(i,".env.local"),s=t(i);s&&(o=s);let c=existsSync(o),a$1=te__default.basename(o),f=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
45
+ `),l=[],m=null,d=null;if(c){let h=await promises.readFile(o,"utf-8"),g=v(h,f);if(l=u(h,f),l.length>0){if(await promises.writeFile(o,g,"utf-8"),m=te__default.relative(i,o),n?.succeed(`Added the following variables to ${a.info(a$1)}:`),!r.silent)for(let w of l)b.log(` ${a.success("+")} ${w}`);}else n?.stop();}else if(await promises.writeFile(o,f+`
46
+ `,"utf-8"),d=te__default.relative(i,o),l=Object.keys(e),n?.succeed(`Added the following variables to ${a.info(a$1)}:`),!r.silent)for(let h of l)b.log(` ${a.success("+")} ${h}`);return !r.silent&&l.length>0&&b.break(),{envVarsAdded:l,envFileUpdated:m,envFileCreated:d}}async function Je(e,t){if(!e.fonts?.length)return e;let r=await ra(t.resolvedPaths.cwd);if(!r)return e;e.cssVars??={},e.cssVars.theme??={};let n=r.framework.name==="next-app"||r.framework.name==="next-pages";for(let i of e.fonts)if(n)e.cssVars.theme[i.font.variable]=`var(${i.font.variable})`;else {let s=`@fontsource-variable/${i.name.replace("font-","")}`;e.dependencies??=[],e.dependencies.push(s),e.css??={},e.css[`@import "${s}"`]={},e.cssVars.theme[i.font.variable]=i.font.family;}if(e.fonts.length>0){let i=new Map;for(let o of e.fonts){let s=o.font.selector??"html",c=o.font.variable.replace("--","");i.has(s)||i.set(s,[]),i.get(s).push(c);}e.css??={},e.css["@layer base"]??={};for(let[o,s]of Array.from(i.entries())){let c=s.join(" ");e.css["@layer base"][o]??={};let a=Object.keys(e.css["@layer base"][o]).find(f=>f.startsWith("@apply "));a?(delete e.css["@layer base"][o][a],e.css["@layer base"][o][`${a} ${c}`]={}):e.css["@layer base"][o][`@apply ${c}`]={};}}return e}async function Ge(e,t,r){if(!e?.length)return;let n=await ra(t.resolvedPaths.cwd);if(!n||n.framework.name!=="next-app"&&n.framework.name!=="next-pages")return;let i=w("Updating fonts.",{silent:r.silent})?.start();try{await si(e,t,n),i?.succeed("Updating fonts.");}catch(o){throw i?.fail("Failed to update fonts."),o}}async function si(e,t,r){let n=await ai(t,r);if(!n)return;let i=await promises.readFile(n,"utf-8"),o=await ci(i,e,t);o!==i&&await promises.writeFile(n,o,"utf-8");}async function ai(e,t){let r=e.resolvedPaths.cwd,n=t.isSrcDir,o=t.isTsx?"tsx":"jsx",s=n?[`src/app/layout.${o}`,`app/layout.${o}`]:[`app/layout.${o}`];for(let c of s){let a=te__default.join(r,c);if(existsSync(a))return a}return null}async function ci(e,t,r){let i=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),o=t.filter(m=>m.font.provider==="google"),s=[],c=[];for(let m of o){let d=m.font.import;if(!d)continue;let h=i.getImportDeclaration(v=>v.getModuleSpecifierValue()==="next/font/google");if(h){if(h.getNamedImports().some(C=>C.getName()===d)){let C=nn(i,m.font.variable);C&&(s.push(C.getName()),m.font.selector||c.push(m.font.variable.replace("--","")));continue}h.addNamedImport(d);}else i.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[d]});let g=fi(d),w=li(m),x=nn(i,m.font.variable);if(x)x.setInitializer(`${d}(${w})`),x.getName()!==g&&x.rename(g);else {let v=pi(i);i.insertVariableStatement(v,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:g,initializer:`${d}(${w})`}]}).appendWhitespace(`
47
+ `);}s.push(g),m.font.selector||c.push(m.font.variable.replace("--",""));}let a=new Set(["font-sans","font-serif","font-mono"]),f=[...c].reverse().find(m=>a.has(m)),l=c.filter(m=>!a.has(m));return f&&l.unshift(f),s.length>0&&mi(i,s,l,r),i.getFullText()}function li(e){let t={};return e.font.subsets?.length&&(t.subsets=e.font.subsets),e.font.weight?.length&&(t.weight=e.font.weight),t.variable=e.font.variable,JSON.stringify(t).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'")}function fi(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function nn(e,t){let r=e.getVariableStatements();for(let n of r)for(let i of n.getDeclarations()){let o=i.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let c=o.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return i}return null}function pi(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function mi(e,t,r,n){let i=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let o of i){if(o.getTagNameNode().getText()!=="html")continue;let c=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),f=[...c,...a],l=o.getAttribute("className");if(!l){ze(e,n),o.addAttribute({name:"className",initializer:`{cn(${f.join(", ")})}`});return}if(l.getKind()!==SyntaxKind.JsxAttribute)return;let m=l.asKindOrThrow(SyntaxKind.JsxAttribute),d=m.getInitializer();if(!d)return;if(d.getKind()===SyntaxKind.StringLiteral){let h=d.getText().slice(1,-1);ze(e,n),m.setInitializer(`{cn("${h}", ${f.join(", ")})}`);}else if(d.getKind()===SyntaxKind.JsxExpression){let h=d.asKindOrThrow(SyntaxKind.JsxExpression),g=h.getExpression();if(!g)return;let w=g.getText();if(w.startsWith("cn(")){let x=a.every($=>w.includes($)),v=r.every($=>w.includes(`"${$}"`)),P=["font-sans","font-serif","font-mono"].filter($=>!r.includes($)).some($=>w.includes(`"${$}"`));if(x&&v&&!P)continue;let C=ui(w,a);C=gi(C);let R=hi(C,f);h.replaceWithText(`{${R}}`);}else if(/^\w+\.variable$/.test(w)){if(a.includes(w)&&r.length===0)continue;ze(e,n),h.replaceWithText(`{cn(${f.join(", ")})}`);}else if(w.startsWith("`")&&w.endsWith("`")){let x=di(w);ze(e,n);let v=new Set(f),P=new Set(["font-sans","font-serif","font-mono"].map(R=>`"${R}"`)),C=x.filter(R=>!v.has(R)&&!P.has(R));h.replaceWithText(`{cn(${[...C,...f].join(", ")})}`);}else ze(e,n),h.replaceWithText(`{cn(${w}, ${f.join(", ")})}`);}}}function ze(e,t){if(!e.getImportDeclaration(n=>n.getNamedImports().some(o=>o.getName()==="cn"))){let n=e.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));n?n.getNamedImports().some(o=>o.getName()==="cn")||n.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]});}}function di(e){let t=[],r=[],i=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let o of i)if(o)if(o.startsWith("${")&&o.endsWith("}")){let s=o.slice(2,-1).trim();s&&r.push(s);}else {let s=o.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`);}return [...t,...r]}function ui(e,t){let r=e;for(let n of t)r=r.replace(new RegExp(`,?\\s*${n.replace(".","\\.")}`,"g"),"").replace(/cn\(\s*,/,"cn(");return r}function gi(e){let t=e;for(let r of ["font-sans","font-serif","font-mono"])t=t.replace(new RegExp(`,?\\s*"${r}"`,"g"),"").replace(/cn\(\s*,/,"cn(");return t}function hi(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function ne(e,t,r){r={overwrite:false,silent:false,isNewProject:false,...r};let n=await P(t);return n&&n.ui&&n.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await bi(e,t,n,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await wi(e,t,{...r,skipFonts:r.skipFonts})}async function wi(e,t,r){if(!e.length)return;let n=w("Checking registry.",{silent:r.silent})?.start(),i=await _$1(e,U$1(t));if(!i)return n?.fail(),$(new Error("Failed to fetch components from registry."));try{sn(i.files??[],t.resolvedPaths.cwd);}catch(c){return n?.fail(),$(c)}n?.succeed();let o=await ta$1(t);r.skipFonts||(i=await Je(i,t)),await D(i.dependencies,i.devDependencies,t,{silent:r.silent}),await Y$1(i.tailwind?.config,t,{silent:r.silent,tailwindVersion:o}),await Mt(i.envVars,t,{silent:r.silent}),r.skipFonts||await Ge(i.fonts,t,{silent:r.silent}),await D$1(i.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path});let s=i.cssVars?r.overwriteCssVars??await on(e,t):void 0;await Be(i.css,t,{silent:r.silent,cssVars:i.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:s,tailwindVersion:o,tailwindConfig:i.tailwind?.config}),i.docs&&b.info(i.docs);}async function bi(e,t,r,n){if(!e.length)return;let i=w("Checking registry.",{silent:n.silent})?.start(),o=await _$1(e,U$1(t));if(!o)return i?.fail(),$(new Error("Failed to fetch components from registry."));try{sn(o.files??[],t.resolvedPaths.cwd);}catch(R){return i?.fail(),$(R)}i?.succeed();let s=[],c=[],a=[],f=w("Installing components.")?.start(),l=r.ui,m=await ta$1(l),d=R(t.resolvedPaths.cwd,l.resolvedPaths.ui);o=await Je(o,t),await D(o.dependencies,o.devDependencies,l,{silent:true}),o.tailwind?.config&&(await Y$1(o.tailwind?.config,l,{silent:true,tailwindVersion:m}),c.push(te__default.relative(d,l.resolvedPaths.tailwindConfig))),o.envVars&&await Mt(o.envVars,l,{silent:true}),await Ge(o.fonts,t,{silent:true});let h=new Map;for(let R of o.files??[]){let $=R.type||"registry:ui";h.has($)||h.set($,[]),h.get($).push(R);}let g={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"};for(let R$1 of Array.from(h.keys())){let $=h.get(R$1),M=g[R$1],Z=M&&r[M]?r[M]:t,et=R(t.resolvedPaths.cwd,Z.resolvedPaths.ui||Z.resolvedPaths.cwd),jt=await Q(et,Z.resolvedPaths.cwd)??Z.resolvedPaths.cwd,Et=await D$1($,Z,{overwrite:n.overwrite,silent:true,rootSpinner:f,isRemote:n.isRemote,isWorkspace:true,path:n.path});s.push(...Et.filesCreated.map(Ae=>te__default.relative(et,te__default.join(jt,Ae)))),c.push(...Et.filesUpdated.map(Ae=>te__default.relative(et,te__default.join(jt,Ae)))),a.push(...Et.filesSkipped.map(Ae=>te__default.relative(et,te__default.join(jt,Ae))));}let w$1=o.cssVars?n.overwriteCssVars??await on(e,t):void 0;await Be(o.css,l,{silent:true,cssVars:o.cssVars,overwriteCssVars:w$1,tailwindVersion:m,tailwindConfig:o.tailwind?.config}),(o.cssVars||o.css)&&c.push(te__default.relative(d,l.resolvedPaths.tailwindCss)),f?.succeed();let x=Array.from(new Set(s)).sort(),v=Array.from(new Set(c.filter(R=>!s.includes(R)))).sort(),P=Array.from(new Set(a)).sort();if(!(x.length||v.length)&&!P.length&&w("No files updated.",{silent:n.silent})?.info(),x.length){w(`Created ${x.length} ${x.length===1?"file":"files"}:`,{silent:n.silent})?.succeed();for(let R of x)b.log(` - ${R}`);}if(v.length){w(`Updated ${v.length} ${v.length===1?"file":"files"}:`,{silent:n.silent})?.info();for(let R of v)b.log(` - ${R}`);}if(P.length){w(`Skipped ${P.length} ${P.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info();for(let R of P)b.log(` - ${R}`);}o.docs&&b.info(o.docs);}async function on(e,t){let r=await ba(e,{config:t});return z.array(n$1).parse(r).some(i=>i.type==="registry:theme"||i.type==="registry:style"||i.type==="registry:font"||i.type==="registry:base")}function sn(e,t){for(let r of e)if(r?.target&&!Kr(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}async function fe(e){let t=te__default.resolve(e.projectPath,"packages/ui"),r=te__default.resolve(e.projectPath,"apps/web"),n=te__default.resolve(t,"components.json"),i=await A.readJson(n);e.registryBaseConfig&&(i=an(i,e.registryBaseConfig)),i.tailwind.baseColor="neutral",e.rtl&&(i.rtl=true),e.menuColor&&(i.menuColor=e.menuColor),e.menuAccent&&(i.menuAccent=e.menuAccent),e.iconLibrary&&(i.iconLibrary=e.iconLibrary),await A.writeJson(n,i,{spaces:2});let o=te__default.resolve(r,"components.json"),s=await A.readJson(o);e.registryBaseConfig&&(s=an(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 A.writeJson(o,s,{spaces:2});let c$1=await O(t,c.parse(i)),{config:a}=await _(e.components,c$1,{silent:true});await ne(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let f=await O(r,c.parse(s)),l=await _$1(e.components,U$1(a));if(l?.fonts?.length){let[d]=l.fonts,g=`@fontsource-variable/${d.name.replace("font-","")}`;await D([g],[],c$1,{silent:true}),await pt({theme:{[d.font.variable]:d.font.family}},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await Be({[`@import "${g}"`]:{}},c$1,{silent:e.silent});}let m=c$1.iconLibrary;if(m&&m in a$2){let d=[...a$2[m].packages];await D(d,[],c$1,{silent:true}),await D(d,[],f,{silent:true});}return f}var ln=U({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:cn`---
44
48
  import Layout from "@/layouts/main.astro"
45
49
  import { ComponentExample } from "@/components/component-example"
46
50
  ---
@@ -48,7 +52,7 @@ import { ComponentExample } from "@/components/component-example"
48
52
  <Layout>
49
53
  <ComponentExample client:load />
50
54
  </Layout>
51
- `}],monorepo:{templateDir:"astro-monorepo",packageManager:"pnpm",installArgs:["--no-frozen-lockfile"],init:le,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:an`---
55
+ `}],monorepo:{templateDir:"astro-monorepo",init:fe,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:cn`---
52
56
  import "@workspace/ui/globals.css"
53
57
  import { ComponentExample } from "@/components/component-example"
54
58
  ---
@@ -63,27 +67,27 @@ import { ComponentExample } from "@/components/component-example"
63
67
  <ComponentExample client:load />
64
68
  </body>
65
69
  </html>
66
- `}]}});var ln=W({name:"laravel",title:"Laravel",description:"Requires `laravel new`",defaultProjectName:"laravel-app",templateDir:"laravel-app",frameworks:["laravel"],scaffold:async()=>{b.break(),b.log(` Please create a new app with ${a.info("laravel new --react")} first then run ${a.info("shadcn init")}.`),b.log(` See ${a.info(`${c$1}/docs/installation/laravel`)} for more information.`),b.break(),process.exit(0);},create:async()=>{}});var mn=W({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:an`import { ComponentExample } from "@/components/component-example";
70
+ `}]}});var fn=U({name:"laravel",title:"Laravel",description:"Requires `laravel new`",defaultProjectName:"laravel-app",templateDir:"laravel-app",frameworks:["laravel"],scaffold:async()=>{b.break(),b.log(` Please create a new app with ${a.info("laravel new --react")} first then run ${a.info("shadcn init")}.`),b.log(` See ${a.info(`${c$1}/docs/installation/laravel`)} for more information.`),b.break(),process.exit(0);},create:async()=>{}});var dn=U({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:cn`import { ComponentExample } from "@/components/component-example";
67
71
 
68
72
  export default function Page() {
69
73
  return <ComponentExample />;
70
74
  }
71
- `}],monorepo:{templateDir:"next-monorepo",packageManager:"pnpm",installArgs:["--no-frozen-lockfile"],init:async e=>{let t=ee__default.resolve(e.projectPath,"packages/ui"),r=ee__default.resolve(e.projectPath,"apps/web"),n=ee__default.resolve(t,"components.json"),i=await B.readJson(n);e.registryBaseConfig&&(i=sn(i,e.registryBaseConfig)),i.tailwind.baseColor="neutral",e.rtl&&(i.rtl=true),await B.writeJson(n,i,{spaces:2});let o=ee__default.resolve(r,"components.json"),s=await B.readJson(o);e.registryBaseConfig&&(s=sn(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),await B.writeJson(o,s,{spaces:2});let c$1=await O(t,c.parse(i)),{config:a}=await L(e.components,c$1,{silent:true});await te(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let f=await O(r,c.parse(s)),l=await _(e.components,U$1(a));if(l?.fonts?.length){let d={};for(let h of l.fonts)d[h.font.variable]=`var(${h.font.variable})`;await pt({theme:d},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await Ge(l.fonts,f,{silent:e.silent});}let m=c$1.iconLibrary;if(m&&m in a$2){let d=[...a$2[m].packages];await T(d,[],c$1,{silent:true}),await T(d,[],f,{silent:true});}return f},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:an`import { ComponentExample } from "@/components/component-example";
75
+ `}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=te__default.resolve(e.projectPath,"packages/ui"),r=te__default.resolve(e.projectPath,"apps/web"),n=te__default.resolve(t,"components.json"),i=await A.readJson(n);e.registryBaseConfig&&(i=an(i,e.registryBaseConfig)),i.tailwind.baseColor="neutral",e.rtl&&(i.rtl=true),await A.writeJson(n,i,{spaces:2});let o=te__default.resolve(r,"components.json"),s=await A.readJson(o);e.registryBaseConfig&&(s=an(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),await A.writeJson(o,s,{spaces:2});let c$1=await O(t,c.parse(i)),{config:a}=await _(e.components,c$1,{silent:true});await ne(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let f=await O(r,c.parse(s)),l=await _$1(e.components,U$1(a));if(l?.fonts?.length){let d={};for(let h of l.fonts)d[h.font.variable]=`var(${h.font.variable})`;await pt({theme:d},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await Ge(l.fonts,f,{silent:e.silent});}let m=c$1.iconLibrary;if(m&&m in a$2){let d=[...a$2[m].packages];await D(d,[],c$1,{silent:true}),await D(d,[],f,{silent:true});}return f},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:cn`import { ComponentExample } from "@/components/component-example";
72
76
 
73
77
  export default function Page() {
74
78
  return <ComponentExample />;
75
79
  }
76
- `}]}});var un=W({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:an`import { ComponentExample } from "@/components/component-example";
80
+ `}]}});var gn=U({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:cn`import { ComponentExample } from "@/components/component-example";
77
81
 
78
82
  export default function Home() {
79
83
  return <ComponentExample />;
80
84
  }
81
- `}],monorepo:{templateDir:"react-router-monorepo",packageManager:"pnpm",installArgs:["--no-frozen-lockfile"],init:le,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:an`import { ComponentExample } from "@/components/component-example";
85
+ `}],monorepo:{templateDir:"react-router-monorepo",init:fe,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:cn`import { ComponentExample } from "@/components/component-example";
82
86
 
83
87
  export default function Home() {
84
88
  return <ComponentExample />;
85
89
  }
86
- `}]}});var hn=W({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:an`import { createFileRoute } from "@tanstack/react-router";
90
+ `}]}});var yn=U({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:cn`import { createFileRoute } from "@tanstack/react-router";
87
91
  import { ComponentExample } from "@/components/component-example";
88
92
 
89
93
  export const Route = createFileRoute("/")({ component: App });
@@ -93,7 +97,7 @@ function App() {
93
97
  <ComponentExample />
94
98
  );
95
99
  }
96
- `}],monorepo:{templateDir:"start-monorepo",packageManager:"pnpm",installArgs:["--no-frozen-lockfile"],init:le,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:an`import { createFileRoute } from "@tanstack/react-router";
100
+ `}],monorepo:{templateDir:"start-monorepo",init:fe,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:cn`import { createFileRoute } from "@tanstack/react-router";
97
101
  import { ComponentExample } from "@/components/component-example";
98
102
 
99
103
  export const Route = createFileRoute("/")({ component: App });
@@ -103,56 +107,56 @@ function App() {
103
107
  <ComponentExample />
104
108
  );
105
109
  }
106
- `}]}});var wn=W({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:an`import { ComponentExample } from "@/components/component-example";
110
+ `}]}});var bn=U({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:cn`import { ComponentExample } from "@/components/component-example";
107
111
 
108
112
  export function App() {
109
113
  return <ComponentExample />;
110
114
  }
111
115
 
112
116
  export default App;
113
- `}],monorepo:{templateDir:"vite-monorepo",packageManager:"pnpm",installArgs:["--no-frozen-lockfile"],init:le,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:an`import { ComponentExample } from "@/components/component-example";
117
+ `}],monorepo:{templateDir:"vite-monorepo",init:fe,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:cn`import { ComponentExample } from "@/components/component-example";
114
118
 
115
119
  export function App() {
116
120
  return <ComponentExample />;
117
121
  }
118
122
 
119
123
  export default App;
120
- `}]}});var U={next:mn,vite:wn,start:hn,"react-router":un,astro:cn,laravel:ln};function wt(e){if(e){for(let[t,r]of Object.entries(U))if(r.frameworks.includes(e))return t}}async function bt(e){let t=e.template&&e.template in U?e.template:"next",r=ge(U[t],{monorepo:e.monorepo}),n=e.name??r.defaultProjectName,i=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(i&&(t="next"),!e.force){let{type:a$1,name:f}=await fe([{type:e.template||i?null:"select",name:"type",message:`The path ${a.info(e.cwd)} does not contain a package.json file.
121
- Would you like to start a new project?`,choices:Object.entries(U).map(([l,m])=>({title:m.title,value:l,description:m.description})),initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:n,format:l=>l.trim(),validate:l=>l.length>128?"Name should be less than 128 characters.":true}]);t=a$1??t,n=f??n;}let o=ge(U[t],{monorepo:e.monorepo}),s=o.packageManager??await a$1(e.cwd,{withFallback:true}),c=ee__default.join(e.cwd,n);try{await B.access(e.cwd,B.constants.W_OK);}catch{b.break(),b.error(`The path ${a.info(e.cwd)} is not writable.`),b.error(`It is likely you do not have write permissions for this folder or the path ${a.info(e.cwd)} does not exist.`),b.break(),process.exit(1);}return B.existsSync(ee__default.resolve(e.cwd,n,"package.json"))&&(b.break(),b.error(`A project with the name ${a.info(n)} already exists.`),b.error("Please choose a different name and try again."),b.break(),process.exit(1)),await o.scaffold({projectPath:c,packageManager:s,cwd:e.cwd}),{projectPath:c,projectName:n,template:t}}async function q(e=process.cwd()){try{let{config:t}=await import('@dotenvx/dotenvx'),r=[".env.local",".env.development.local",".env.development",".env"];for(let n of r){let i=join(e,n);existsSync(i)&&t({path:i,overload:!1,quiet:!0});}}catch(t){b.warn("Failed to load env files:",t);}}var Ae=".bak";function xn(e){if(!B.existsSync(e))return null;let t=`${e}${Ae}`;try{return B.renameSync(e,t),t}catch(r){return console.error(`Failed to create backup of ${e}: ${r}`),null}}function vn(e){let t=`${e}${Ae}`;if(!B.existsSync(t))return false;try{return B.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function Cn(e){let t=`${e}${Ae}`;if(!B.existsSync(t))return false;try{return B.unlinkSync(t),!0}catch{return false}}var Ri=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(),base:z.enum(["radix","base"]).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()}),Rn=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. (radix, base)").option("--monorepo","scaffold a monorepo project.").option("--no-monorepo","skip the monorepo prompt.").option("-p, --preset [name]","use a preset configuration").option("-y, --yes","skip confirmation prompt.",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("--reinstall","re-install existing UI components.").option("--no-reinstall","do not re-install existing UI components.").action(async(e,t)=>{let r,n$1=[],i=()=>{r&&vn(r.replace(Ae,""));};process.on("exit",i);try{let o$1=Ri.parse({...t,reinstall:t.reinstall,cwd:ee__default.resolve(t.cwd)}),s=new Map(Object.entries(_e)),c;if(o$1.defaults&&(o$1.template=o$1.template||"next",o$1.base=o$1.base||"base",o$1.reinstall=o$1.reinstall??!1),o$1.template&&!(o$1.template in U)&&(b.error(`Invalid template: ${a.info(o$1.template)}. Available templates: ${Object.keys(U).map(d=>a.info(d)).join(", ")}.`),b.break(),process.exit(1)),typeof o$1.preset=="string"&&!G(o$1.preset)&&!o(o$1.preset)){let d=Array.from(s.keys());s.has(o$1.preset)||(b.error(`Invalid preset: ${a.info(o$1.preset)}. Available presets: ${d.join(", ")}`),b.break(),process.exit(1));}let a$1=o$1.cwd,f=B.existsSync(ee__default.resolve(a$1,"components.json"));if(!o$1.monorepo&&!f&&await H(a$1)){let d=await ra(a$1);if(!d||d.framework.name==="manual"){let h=await Y(a$1);h.length>0&&(K("init",h),process.exit(1));}}if(f&&!o$1.force){let{overwrite:d}=await fe({type:"confirm",name:"overwrite",message:`A ${a.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});d||(b.info(` To start over, remove the ${a.info("components.json")} file and run ${a.info("init")} again.`),b.break(),process.exit(1)),o$1.force=!0;}let l;if(f){try{l=await B.readJson(ee__default.resolve(a$1,"components.json"));}catch{}l&&(o$1.existingConfig=l);let d=o$1.reinstall;if(d===void 0){let{reinstall:h}=await fe({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});d=h;}if(d&&(n$1=await ua(a$1),n$1.length)){b.break(),b.log(" The following components will be re-installed and overwritten:");for(let h=0;h<n$1.length;h+=8)b.log(` - ${n$1.slice(h,h+8).join(", ")}`);b.break();}}if(o$1.preset===void 0&&e.length===0&&!o$1.defaults){let d=B.existsSync(ee__default.resolve(a$1,"package.json"));if(!o$1.template&&!d){let{template:h}=await fe({type:"select",name:"template",message:"Select a template",choices:Object.entries(U).map(([g,w])=>({title:w.title,value:g,description:w.description,disabled:o$1.monorepo&&g==="laravel"}))});h||process.exit(1),o$1.template=h;}if(!o$1.template&&d){let h=await ra(a$1),g=wt(h?.framework.name);g&&(o$1.template=g);}if(o$1.template==="laravel"&&!d&&(b.break(),b.log(` Please create a new app with ${a.info("laravel new --react")} first then run ${a.info("shadcn init")}.`),b.log(` See ${a.info(`${c$1}/docs/installation/laravel`)} for more information.`),b.break(),process.exit(0)),o$1.monorepo===void 0&&!d&&o$1.template&&U[o$1.template]?.monorepo){let{monorepo:h}=await fe({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});o$1.monorepo=h;}o$1.base||(o$1.base=await $e()),o$1.preset=!0;}if(o$1.preset!==void 0){let d=o$1.preset===!0?!0:o$1.preset;if(d===!0){let h=await Me({rtl:o$1.rtl??!1,template:o$1.template,base:o$1.base});e=[h.url,...e],c=h.base;}if(typeof d=="string"){let h;if(G(d)){let g=new URL(d);o$1.rtl?g.searchParams.set("rtl","true"):o$1.rtl===!1&&g.searchParams.delete("rtl"),g.pathname==="/init"&&d.startsWith(c$1)&&g.searchParams.set("track","1"),h=g.toString(),c=g.searchParams.get("base")??void 0;}else if(o(d)){let g=n(d);g||(b.error(`Invalid preset code: ${a.info(d)}`),b.break(),process.exit(1)),h=Ve({...g,base:"radix",rtl:o$1.rtl??!1},{template:o$1.template}),c=void 0;}else {let g=s.get(d);if(!g)throw new Error(`Unknown preset: ${d}`);h=Ve({...g,base:o$1.base??"radix",rtl:o$1.rtl??g.rtl},{template:o$1.template}),c=void 0;}e=[h,...e];}}let m=o$1.base??c??(l?.style?l.style.startsWith("base-")?"base":"radix":"");if(!m)if(e.length>0)m="radix";else {let d=await $e();m=d,o$1.base=d;}if(o$1.defaults&&!e.some(G)&&(e=[Ve({..._e.nova,base:m,rtl:o$1.rtl??!1},{template:o$1.template}),...e]),e.length>0&&G(e[0])){let d=new URL(e[0]);d.searchParams.set("base",m),e[0]=d.toString();}if(l?.style){let d=await $i(l.style,m);if(d!==m&&(m=d,e.length>0&&G(e[0]))){let h=new URL(e[0]);h.searchParams.set("base",d),e[0]=h.toString();}}if(n$1.length&&(e=[...e,...n$1]),o$1.components=e,await q(o$1.cwd),e.length>0){let d=ee__default.resolve(a$1,"components.json");f&&(r=xn(d)??void 0,r||b.warn(`Could not back up ${a.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:g,url:w}=await We(e[0],a$1,{registries:l?.registries});e[0]=w,g||(o$1.installStyleIndex=!1),h&&(o$1.registryBaseConfig=h);}await xt(o$1),b.break(),b.log(`Project initialization completed.
122
- You may now add components.`),process.removeListener("exit",i),Cn(ee__default.resolve(a$1,"components.json")),b.break();}catch(o){process.removeListener("exit",i),i(),b.break(),$(o);}finally{V();}});async function xt(e){let t,r,n=e.template,i=n?ge(U[n],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&B.existsSync(ee__default.resolve(e.cwd,"package.json")))t=await ra(e.cwd);else if(e.skipPreflight)t=await ra(e.cwd);else {let C=await Jr(e);if(C.errors["1"]){let{projectPath:R,template:$}=await bt(e);R||process.exit(1),e.cwd=R,e.isNewProject=true,r=$,t=await ra(e.cwd);}else t=C.projectInfo;}let s=r??n,c=s?ge(U[s],{monorepo:e.monorepo}):void 0,a$1=[...e.installStyleIndex?["index"]:[],...e.components??[],...c?["button"]:[]];if(c?.init){let C=await c.init({projectPath:e.cwd,components:a$1,registryBaseConfig:e.registryBaseConfig,rtl:e.rtl??false,menuColor:e.menuColor,menuAccent:e.menuAccent,iconLibrary:e.iconLibrary,silent:e.silent});return await c.postInit({projectPath:e.cwd}),C}let f=await sa(e.cwd,t),l=f?await Si(f,e):await ki(await N(e.cwd));if(!e.yes){let{proceed:C}=await fe({type:"confirm",name:"proceed",message:`Write configuration to ${a.info("components.json")}. Proceed?`,initial:true});C||process.exit(1);}let m=await O(e.cwd,l),{config:d$1}=await L(a$1,m,{silent:true});d$1.registries&&(l.registries=d$1.registries);let h=w("Writing components.json.").start(),g=ee__default.resolve(e.cwd,"components.json"),w$1=`${g}${Ae}`,x=(C,R)=>{let{registries:$,...M}=sn(C,R);return {...M,registries:$}};if(B.existsSync(w$1)){let C=await B.readJson(w$1);e.force?C.registries&&(l.registries={...C.registries,...l.registries||{}}):l=x(C,l);}e.registryBaseConfig&&(l=x(l,e.registryBaseConfig)),e.rtl!==void 0&&(l.rtl=e.rtl),l.registries=Object.fromEntries(Object.entries(l.registries||{}).filter(([C])=>!Object.keys(d).includes(C))),await promises.writeFile(g,`${JSON.stringify(l,null,2)}
123
- `,"utf8"),h.succeed();let v=await O(e.cwd,l),P$1=await P(v);if(P$1){let C={};if(l.menuColor&&(C.menuColor=l.menuColor),l.menuAccent&&(C.menuAccent=l.menuAccent),l.rtl!==void 0&&(C.rtl=l.rtl),l.iconLibrary&&(C.iconLibrary=l.iconLibrary),Object.keys(C).length>0)for(let R of Object.keys(P$1)){let $=P$1[R];if($.resolvedPaths.cwd===v.resolvedPaths.cwd)continue;let M=ee__default.resolve($.resolvedPaths.cwd,"components.json");if(B.existsSync(M)){let X=await B.readJson(M);await B.writeJson(M,{...X,...C},{spaces:2});}}}return M.clearCaches(),await te(a$1,v,{overwrite:true,overwriteCssVars:e.reinstall||void 0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),c&&await c.postInit({projectPath:e.cwd}),v}async function ki(e=null){let[t,r]=await Promise.all([fa(),ha()]);b.info("");let n=await fe([{type:"toggle",name:"typescript",message:`Would you like to use ${a.info("TypeScript")} (recommended)?`,initial:e?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${a.info("style")} would you like to use?`,choices:t.map(i=>({title:i.label,value:i.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${a.info("base color")}?`,choices:r.map(i=>({title:i.label,value:i.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${a.info("global CSS")} file?`,initial:e?.tailwind.css??K$1},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${a.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${a.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${a.info("tailwind.config.js")} located?`,initial:e?.tailwind.config??L$1},{type:"text",name:"components",message:`Configure the import alias for ${a.info("components")}:`,initial:e?.aliases.components??I},{type:"text",name:"utils",message:`Configure the import alias for ${a.info("utils")}:`,initial:e?.aliases.utils??J},{type:"toggle",name:"rsc",message:`Are you using ${a.info("React Server Components")}?`,initial:e?.rsc??true,active:"yes",inactive:"no"}]);return n.style||process.exit(1),c.parse({$schema:"https://ui.shadcn.com/schema.json",style:n.style,tailwind:{config:n.tailwindConfig,css:n.tailwindCss,baseColor:n.tailwindBaseColor,cssVariables:n.tailwindCssVariables,prefix:n.tailwindPrefix},rsc:n.rsc,tsx:n.typescript,aliases:{utils:n.utils,components:n.components,lib:n.components.replace(/\/components$/,"lib"),hooks:n.components.replace(/\/components$/,"hooks")}})}async function Si(e,t){let r=e.style,n="neutral",i=e.tailwind.cssVariables,o=e.iconLibrary??"lucide";if(!t.defaults){let[s,c]=await Promise.all([fa(),ta$1(e)]);r=(await fe([{type:c==="v4"||r?null:"select",name:"style",message:`Which ${a.info("style")} would you like to use?`,choices:s.map(f=>({title:f.name==="new-york"?"New York (Recommended)":f.label,value:f.name})),initial:0}])).style??r??"new-york";}return i=t.cssVariables,c.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:n,cssVariables:i},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:o,rtl:t.rtl??e?.rtl??false,aliases:e?.aliases})}async function $i(e,t){let r=e.startsWith("base-")?"base":"radix";if(t===r)return t;b.warn(` You are switching from ${a.info(r)} to ${a.info(t)}.`),b.warn(` Components outside the ${a.info("ui")} directory that depend on ${a.info(r)} primitives may need manual updates.`),b.break();let{proceed:n}=await fe({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:false});return n?t:r}async function Sn(e){let t={};if(!B.existsSync(e.cwd)||!B.existsSync(ee__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!B.existsSync(ee__default.resolve(e.cwd,"components.json"))){if(await H(e.cwd)){let r=await Y(e.cwd);r.length>0&&(K("add [component]",r),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await N(e.cwd);return {errors:t,config:r}}catch{b.break(),b.error(`An invalid ${a.info("components.json")} file was found at ${a.info(e.cwd)}.
124
- Before you can add components, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}async function In(e,t,r={}){let n={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return n;let i=await _(e,U$1(t));if(!i)throw new Error("Failed to fetch components from registry.");return r.skipFonts||(i=await Je(i,t)),n.dependencies=Array.from(new Set(i.dependencies??[])),n.devDependencies=Array.from(new Set(i.devDependencies??[])),n.docs=i.docs??null,await Ii(i,t,n),await Pi(i,t,n,r),ji(i,t,n),r.skipFonts||Ei(i,n),n}async function Ii(e,t,r$1,n){let i=e.files;if(!i?.length)return;let[o,s$1]=await Promise.all([ra(t.resolvedPaths.cwd),t.tailwind.baseColor?ia(t.tailwind.baseColor):Promise.resolve(void 0)]);for(let c=0;c<i.length;c++){let a=i[c];if(!a.content)continue;let f$1=E(a,t,{isSrcDir:o?.isSrcDir,framework:o?.framework.name,commonRoot:F(i.map(x=>x.path),a.path),fileIndex:c});if(!f$1)continue;t.tsx||(f$1=f$1.replace(/\.tsx?$/,x=>x===".tsx"?".jsx":".js"));let l=existsSync(f$1),m=ee__default.relative(t.resolvedPaths.cwd,f$1),d=a.type==="registry:file"||a.type==="registry:item",h=s(f$1)||d?a.content:await B$1({filename:a.path,raw:a.content,config:t,baseColor:s$1,transformJsx:!t.tsx,isRemote:false},[x,y,a$3,A,c$2,f,C,d$1,z$1]),g="create",w;l&&(w=await promises.readFile(f$1,"utf-8"),r(w,h)?g="skip":g="overwrite"),r$1.files.push({path:m,action:g,content:h,...g==="overwrite"&&{existingContent:w},type:a.type??"registry:ui"});}}async function Pi(e,t,r,n){let i=e.css&&Object.keys(e.css).length>0,o=Object.keys(e.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!i&&!o)return;let s=t.resolvedPaths.tailwindCss,c=existsSync(s),a=ee__default.relative(t.resolvedPaths.cwd,s),f=c?await promises.readFile(s,"utf8"):"",l=f;o&&(l=await Ue(l,e.cssVars,t,{overwriteCssVars:n.overwriteCssVars})),i&&(l=await Vt(l,e.css));let m=0;if(e.cssVars)for(let d of Object.values(e.cssVars))d&&(m+=Object.keys(d).length);r.css={path:a,content:l,...c&&{existingContent:f},action:c?"update":"create",cssVarsCount:m};}function ji(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let n=ee__default.join(t.resolvedPaths.cwd,".env.local"),i=existsSync(n),o=ee__default.relative(t.resolvedPaths.cwd,n);r.envVars={path:o,variables:e.envVars,action:i?"update":"create"};}function Ei(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 pe=5,Fi=dim("\u250C"+"\u2500".repeat(46)),Oi=dim("\u2514"+"\u2500".repeat(46)),Ti={create:"+",overwrite:"~",skip:"="},Di={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function He(e){return e==="create"?green(e):e==="overwrite"||e==="update"?yellow(e):dim(e)}function Ye(e){return `${bold("\u250C")} ${bold(`shadcn add ${e.join(", ")}`)} ${dim("(dry run)")}`}function En(e,t){return e===t||e.includes(t)||e.endsWith(t)}function be(e,t,r=n=>n){e.push(`${dim("\u2502")} ${Fi}`);for(let n of t)e.push(`${dim("\u2502")} ${dim("\u2502")} ${r(n)}`);e.push(`${dim("\u2502")} ${Oi}`);}function An(e,t,r={}){return r.diff?typeof r.diff=="string"?_i(e,t,r.diff):Vi(e,t):r.view?typeof r.view=="string"?Wi(e,t,r.view):Mi(e,t):Li(e,t)}function Li(e,t){let r=[];r.push(Ye(t)),r.push(dim("\u2502")),Ui(e,r),Pn("Dependencies",e.dependencies,r),Pn("Dev Dependencies",e.devDependencies,r),zi(e,r),Bi(e,r),Ji(e,r);let n=e.files.filter(o=>o.action==="overwrite").length;n>0&&(r.push(yellow(`\u26A0 ${n} ${n===1?"file":"files"} will be overwritten.`)),r.push(dim("\u2502")));let i=[];return e.files.length>0&&i.push(`${e.files.length} ${e.files.length===1?"file":"files"}`),e.dependencies.length>0&&i.push(`${e.dependencies.length} ${e.dependencies.length===1?"dep":"deps"}`),e.css?.cssVarsCount&&i.push(`${e.css.cssVarsCount} CSS vars`),i.length>0&&(r.push(`${dim("\u2502")} ${dim(i.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(`
125
- `)}function _i(e,t,r){let n=[];n.push(Ye(t)),n.push(dim("\u2502"));let i=Fn(e.files,r),o=e.css&&En(e.css.path,r);if(i.length===0&&!o)n.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),n.push(dim("\u2502"));else {for(let s of i)Nn(s,n);if(o&&e.css){if(n.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${He(e.css.action)}${dim(")")}`),e.css.action==="create"||!e.css.existingContent)be(n,e.css.content.split(`
126
- `),s=>green(`+${s}`));else {let s=On(e.css.existingContent,e.css.content,e.css.path,{fullContext:true});be(n,s);}n.push(dim("\u2502"));}}return n.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),n.join(`
127
- `)}function Vi(e,t){let r=[];r.push(Ye(t)),r.push(dim("\u2502"));let n=e.files.slice(0,pe);if(n.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No changes.")}`),r.push(dim("\u2502"));else {for(let s of n)Nn(s,r);e.files.length>pe&&r.push(dim("\u2502"));}let i=e.files.length;return i>pe&&r.push(` ${dim(`Showing ${pe} of ${i} files. Use --diff <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
128
- `)}function Mi(e,t){let r=[];r.push(Ye(t)),r.push(dim("\u2502"));let n=e.files.slice(0,pe);if(n.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No files.")}`),r.push(dim("\u2502"));else {for(let s of n){let c=s.content.split(`
129
- `);r.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${He(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),be(r,c),r.push(dim("\u2502"));}e.files.length>pe&&r.push(dim("\u2502"));}let i=e.files.length;return i>pe&&r.push(` ${dim(`Showing ${pe} of ${i} files. Use --view <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
130
- `)}function Nn(e,t){if(t.push(`${dim("\u251C")} ${bold(e.path)} ${dim("(")}${He(e.action)}${dim(")")}`),e.action==="skip")t.push(`${dim("\u2502")} ${dim("No changes.")}`);else if(e.action==="create")be(t,e.content.split(`
131
- `),r=>green(`+${r}`));else {let r=On(e.existingContent,e.content,e.path);be(t,r);}t.push(dim("\u2502"));}function Wi(e,t,r){let n=[];n.push(Ye(t)),n.push(dim("\u2502"));let i=Fn(e.files,r),o=e.css&&En(e.css.path,r);if(i.length===0&&!o)n.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),n.push(dim("\u2502"));else {for(let s of i){let c=s.content.split(`
132
- `);n.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${He(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),be(n,c),n.push(dim("\u2502"));}if(o&&e.css){let s=e.css.content.split(`
133
- `);n.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${He(e.css.action)}${dim(")")} ${dim(`${s.length} lines`)}`),be(n,s),n.push(dim("\u2502"));}}return n.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),n.join(`
134
- `)}function Ui(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 n=[];r.create>0&&n.push(green(`+${r.create} new`)),r.overwrite>0&&n.push(yellow(`~${r.overwrite} overwrite`)),r.skip>0&&n.push(dim(`=${r.skip} skip`));let i=n.length>0?` ${n.join(dim(", "))}`:"";t.push(`${dim("\u251C")} ${bold("Files")} ${dim(`(${e.files.length})`)}${i}`);let o=Math.max(...e.files.map(s=>s.path.length));for(let s of e.files){let c=Ti[s.action],a=Di[s.action],f=" ".repeat(Math.max(1,o-s.path.length+2)),l=s.action==="create"?green:s.action==="overwrite"?yellow:dim,m=s.action==="skip"?dim(s.path):s.path;t.push(`${dim("\u2502")} ${l(c)} ${m}${f}${l(a)}`);}t.push(dim("\u2502"));}function Pn(e,t,r){if(t.length){r.push(`${dim("\u251C")} ${bold(e)} ${dim(`(${t.length})`)}`);for(let n of t)r.push(`${dim("\u2502")} ${green("+")} ${n}`);r.push(dim("\u2502"));}}function zi(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 Bi(e,t){if(!e.envVars)return;let r=Object.keys(e.envVars.variables);t.push(`${dim("\u251C")} ${bold("Environment Variables")}`);for(let n of r)t.push(`${dim("\u2502")} ${green("+")} ${n}`);t.push(dim("\u2502"));}function Ji(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 Fn(e,t){let r=e.filter(n=>n.path===t);return r.length>0?r:e.filter(n=>n.path.includes(t)||n.path.replace(/\\/g,"/").includes(t))}function On(e,t,r,n={}){if(qi(e,t))return [dim(" Formatting-only changes (spacing, quotes, semicolons).")];let i=jn(e),o=jn(t),s=n.fullContext?Math.max(i.split(`
124
+ `}]}});var B={next:dn,vite:bn,start:yn,"react-router":gn,astro:ln,laravel:fn};function wt(e){if(e){for(let[t,r]of Object.entries(B))if(r.frameworks.includes(e))return t}}async function bt(e){let t=e.template&&e.template in B?e.template:"next",r=he(B[t],{monorepo:e.monorepo}),n=e.name??r.defaultProjectName,i=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(i&&(t="next"),!e.force){let{type:a$1,name:f}=await pe([{type:e.template||i?null:"select",name:"type",message:`The path ${a.info(e.cwd)} does not contain a package.json file.
125
+ Would you like to start a new project?`,choices:Object.entries(B).map(([l,m])=>({title:m.title,value:l,description:m.description})),initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:n,format:l=>l.trim(),validate:l=>l.length>128?"Name should be less than 128 characters.":true}]);t=a$1??t,n=f??n;}let o=he(B[t],{monorepo:e.monorepo}),s=await a$1(e.cwd,{withFallback:true}),c=te__default.join(e.cwd,n);try{await A.access(e.cwd,A.constants.W_OK);}catch{b.break(),b.error(`The path ${a.info(e.cwd)} is not writable.`),b.error(`It is likely you do not have write permissions for this folder or the path ${a.info(e.cwd)} does not exist.`),b.break(),process.exit(1);}return A.existsSync(te__default.resolve(e.cwd,n,"package.json"))&&(b.break(),b.error(`A project with the name ${a.info(n)} already exists.`),b.error("Please choose a different name and try again."),b.break(),process.exit(1)),await o.scaffold({projectPath:c,packageManager:s,cwd:e.cwd}),{projectPath:c,projectName:n,template:t}}async function X(e=process.cwd()){try{let{config:t}=await import('@dotenvx/dotenvx'),r=[".env.local",".env.development.local",".env.development",".env"];for(let n of r){let i=join(e,n);existsSync(i)&&t({path:i,overload:!1,quiet:!0});}}catch(t){b.warn("Failed to load env files:",t);}}var Ne=".bak";function vn(e){if(!A.existsSync(e))return null;let t=`${e}${Ne}`;try{return A.renameSync(e,t),t}catch(r){return console.error(`Failed to create backup of ${e}: ${r}`),null}}function Cn(e){let t=`${e}${Ne}`;if(!A.existsSync(t))return false;try{return A.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function Rn(e){let t=`${e}${Ne}`;if(!A.existsSync(t))return false;try{return A.unlinkSync(t),!0}catch{return false}}var $i=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(),base:z.enum(["radix","base"]).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()}),Sn=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. (radix, base)").option("--monorepo","scaffold a monorepo project.").option("--no-monorepo","skip the monorepo prompt.").option("-p, --preset [name]","use a preset configuration").option("-y, --yes","skip confirmation prompt.",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("--reinstall","re-install existing UI components.").option("--no-reinstall","do not re-install existing UI components.").action(async(e,t)=>{let r,n$1=[],i=()=>{r&&Cn(r.replace(Ne,""));};process.on("exit",i);try{let o$1=$i.parse({...t,reinstall:t.reinstall,cwd:te__default.resolve(t.cwd)}),s=new Map(Object.entries(_e)),c;if(o$1.defaults&&(o$1.template=o$1.template||"next",o$1.base=o$1.base||"base",o$1.reinstall=o$1.reinstall??!1),o$1.template&&!(o$1.template in B)&&(b.error(`Invalid template: ${a.info(o$1.template)}. Available templates: ${Object.keys(B).map(d=>a.info(d)).join(", ")}.`),b.break(),process.exit(1)),typeof o$1.preset=="string"&&!G(o$1.preset)&&!o(o$1.preset)){let d=Array.from(s.keys());s.has(o$1.preset)||(b.error(`Invalid preset: ${a.info(o$1.preset)}. Available presets: ${d.join(", ")}`),b.break(),process.exit(1));}let a$1=o$1.cwd,f=A.existsSync(te__default.resolve(a$1,"components.json"));if(!o$1.monorepo&&!f&&await Y(a$1)){let d=await ra(a$1);if(!d||d.framework.name==="manual"){let h=await K(a$1);h.length>0&&(q("init",h),process.exit(1));}}if(f&&!o$1.force){let{overwrite:d}=await pe({type:"confirm",name:"overwrite",message:`A ${a.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});d||(b.info(` To start over, remove the ${a.info("components.json")} file and run ${a.info("init")} again.`),b.break(),process.exit(1)),o$1.force=!0;}let l;if(f){try{l=await A.readJson(te__default.resolve(a$1,"components.json"));}catch{}l&&(o$1.existingConfig=l);let d=o$1.reinstall;if(d===void 0){let{reinstall:h}=await pe({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});d=h;}if(d&&(n$1=await ua(a$1),n$1.length)){b.break(),b.log(" The following components will be re-installed and overwritten:");for(let h=0;h<n$1.length;h+=8)b.log(` - ${n$1.slice(h,h+8).join(", ")}`);b.break();}}if(o$1.preset===void 0&&e.length===0&&!o$1.defaults){let d=A.existsSync(te__default.resolve(a$1,"package.json"));if(!o$1.template&&!d){let{template:h}=await pe({type:"select",name:"template",message:"Select a template",choices:Object.entries(B).map(([g,w])=>({title:w.title,value:g,description:w.description,disabled:o$1.monorepo&&g==="laravel"}))});h||process.exit(1),o$1.template=h;}if(!o$1.template&&d){let h=await ra(a$1),g=wt(h?.framework.name);g&&(o$1.template=g);}if(o$1.template==="laravel"&&!d&&(b.break(),b.log(` Please create a new app with ${a.info("laravel new --react")} first then run ${a.info("shadcn init")}.`),b.log(` See ${a.info(`${c$1}/docs/installation/laravel`)} for more information.`),b.break(),process.exit(0)),o$1.monorepo===void 0&&!d&&o$1.template&&B[o$1.template]?.monorepo){let{monorepo:h}=await pe({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});o$1.monorepo=h;}o$1.base||(o$1.base=await Ie()),o$1.preset=!0;}if(o$1.preset!==void 0){let d=o$1.preset===!0?!0:o$1.preset;if(d===!0){let h=await We({rtl:o$1.rtl??!1,template:o$1.template,base:o$1.base});e=[h.url,...e],c=h.base;}if(typeof d=="string"){let h;if(G(d)){let g=new URL(d);o$1.rtl?g.searchParams.set("rtl","true"):o$1.rtl===!1&&g.searchParams.delete("rtl"),g.pathname==="/init"&&d.startsWith(c$1)&&g.searchParams.set("track","1"),h=g.toString(),c=g.searchParams.get("base")??void 0;}else if(o(d)){let g=n(d);g||(b.error(`Invalid preset code: ${a.info(d)}`),b.break(),process.exit(1)),h=Ve({...g,base:"radix",rtl:o$1.rtl??!1},{template:o$1.template}),c=void 0;}else {let g=s.get(d);if(!g)throw new Error(`Unknown preset: ${d}`);h=Ve({...g,base:o$1.base??"radix",rtl:o$1.rtl??g.rtl},{template:o$1.template}),c=void 0;}e=[h,...e];}}let m=o$1.base??c??(l?.style?l.style.startsWith("base-")?"base":"radix":"");if(!m)if(e.length>0)m="radix";else {let d=await Ie();m=d,o$1.base=d;}if(o$1.defaults&&!e.some(G)&&(e=[Ve({..._e.nova,base:m,rtl:o$1.rtl??!1},{template:o$1.template}),...e]),e.length>0&&G(e[0])){let d=new URL(e[0]);d.searchParams.set("base",m),e[0]=d.toString();}if(l?.style){let d=await ji(l.style,m);if(d!==m&&(m=d,e.length>0&&G(e[0]))){let h=new URL(e[0]);h.searchParams.set("base",d),e[0]=h.toString();}}if(n$1.length&&(e=[...e,...n$1]),o$1.components=e,await X(o$1.cwd),e.length>0){let d=te__default.resolve(a$1,"components.json");f&&(r=vn(d)??void 0,r||b.warn(`Could not back up ${a.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:g,url:w}=await Me(e[0],a$1,{registries:l?.registries});e[0]=w,g||(o$1.installStyleIndex=!1),h&&(o$1.registryBaseConfig=h);}await xt(o$1),b.break(),b.log(`Project initialization completed.
126
+ You may now add components.`),process.removeListener("exit",i),Rn(te__default.resolve(a$1,"components.json")),b.break();}catch(o){process.removeListener("exit",i),i(),b.break(),$(o);}finally{V();}});async function xt(e){let t,r,n=e.template,i=n?he(B[n],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&A.existsSync(te__default.resolve(e.cwd,"package.json")))t=await ra(e.cwd);else if(e.skipPreflight)t=await ra(e.cwd);else {let C=await Jr(e);if(C.errors["1"]){let{projectPath:R,template:$}=await bt(e);R||process.exit(1),e.cwd=R,e.isNewProject=true,r=$,t=await ra(e.cwd);}else t=C.projectInfo;}let s=r??n,c=s?he(B[s],{monorepo:e.monorepo}):void 0,a$1=[...e.installStyleIndex?["index"]:[],...e.components??[],...c?["button"]:[]];if(c?.init){let C=await c.init({projectPath:e.cwd,components:a$1,registryBaseConfig:e.registryBaseConfig,rtl:e.rtl??false,menuColor:e.menuColor,menuAccent:e.menuAccent,iconLibrary:e.iconLibrary,silent:e.silent});return await c.postInit({projectPath:e.cwd}),C}let f=await sa(e.cwd,t),l=f?await Pi(f,e):await Ii(await N(e.cwd));if(!e.yes){let{proceed:C}=await pe({type:"confirm",name:"proceed",message:`Write configuration to ${a.info("components.json")}. Proceed?`,initial:true});C||process.exit(1);}let m=await O(e.cwd,l),{config:d$1}=await _(a$1,m,{silent:true});d$1.registries&&(l.registries=d$1.registries);let h=w("Writing components.json.").start(),g=te__default.resolve(e.cwd,"components.json"),w$1=`${g}${Ne}`,x=(C,R)=>{let{registries:$,...M}=an(C,R);return {...M,registries:$}};if(A.existsSync(w$1)){let C=await A.readJson(w$1);e.force?C.registries&&(l.registries={...C.registries,...l.registries||{}}):l=x(C,l);}e.registryBaseConfig&&(l=x(l,e.registryBaseConfig)),e.rtl!==void 0&&(l.rtl=e.rtl),l.registries=Object.fromEntries(Object.entries(l.registries||{}).filter(([C])=>!Object.keys(d).includes(C))),await promises.writeFile(g,`${JSON.stringify(l,null,2)}
127
+ `,"utf8"),h.succeed();let v=await O(e.cwd,l),P$1=await P(v);if(P$1){let C={};if(l.menuColor&&(C.menuColor=l.menuColor),l.menuAccent&&(C.menuAccent=l.menuAccent),l.rtl!==void 0&&(C.rtl=l.rtl),l.iconLibrary&&(C.iconLibrary=l.iconLibrary),Object.keys(C).length>0)for(let R of Object.keys(P$1)){let $=P$1[R];if($.resolvedPaths.cwd===v.resolvedPaths.cwd)continue;let M=te__default.resolve($.resolvedPaths.cwd,"components.json");if(A.existsSync(M)){let Z=await A.readJson(M);await A.writeJson(M,{...Z,...C},{spaces:2});}}}return M.clearCaches(),await ne(a$1,v,{overwrite:true,overwriteCssVars:e.reinstall||void 0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),c&&await c.postInit({projectPath:e.cwd}),v}async function Ii(e=null){let[t,r]=await Promise.all([fa(),ha()]);b.info("");let n=await pe([{type:"toggle",name:"typescript",message:`Would you like to use ${a.info("TypeScript")} (recommended)?`,initial:e?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${a.info("style")} would you like to use?`,choices:t.map(i=>({title:i.label,value:i.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${a.info("base color")}?`,choices:r.map(i=>({title:i.label,value:i.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${a.info("global CSS")} file?`,initial:e?.tailwind.css??K$1},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${a.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${a.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${a.info("tailwind.config.js")} located?`,initial:e?.tailwind.config??L},{type:"text",name:"components",message:`Configure the import alias for ${a.info("components")}:`,initial:e?.aliases.components??I},{type:"text",name:"utils",message:`Configure the import alias for ${a.info("utils")}:`,initial:e?.aliases.utils??J},{type:"toggle",name:"rsc",message:`Are you using ${a.info("React Server Components")}?`,initial:e?.rsc??true,active:"yes",inactive:"no"}]);return n.style||process.exit(1),c.parse({$schema:"https://ui.shadcn.com/schema.json",style:n.style,tailwind:{config:n.tailwindConfig,css:n.tailwindCss,baseColor:n.tailwindBaseColor,cssVariables:n.tailwindCssVariables,prefix:n.tailwindPrefix},rsc:n.rsc,tsx:n.typescript,aliases:{utils:n.utils,components:n.components,lib:n.components.replace(/\/components$/,"lib"),hooks:n.components.replace(/\/components$/,"hooks")}})}async function Pi(e,t){let r=e.style,n="neutral",i=e.tailwind.cssVariables,o=e.iconLibrary??"lucide";if(!t.defaults){let[s,c]=await Promise.all([fa(),ta$1(e)]);r=(await pe([{type:c==="v4"||r?null:"select",name:"style",message:`Which ${a.info("style")} would you like to use?`,choices:s.map(f=>({title:f.name==="new-york"?"New York (Recommended)":f.label,value:f.name})),initial:0}])).style??r??"new-york";}return i=t.cssVariables,c.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:n,cssVariables:i},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:o,rtl:t.rtl??e?.rtl??false,aliases:e?.aliases})}async function ji(e,t){let r=e.startsWith("base-")?"base":"radix";if(t===r)return t;b.warn(` You are switching from ${a.info(r)} to ${a.info(t)}.`),b.warn(` Components outside the ${a.info("ui")} directory that depend on ${a.info(r)} primitives may need manual updates.`),b.break();let{proceed:n}=await pe({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:false});return n?t:r}async function $n(e){let t={};if(!A.existsSync(e.cwd)||!A.existsSync(te__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!A.existsSync(te__default.resolve(e.cwd,"components.json"))){if(await Y(e.cwd)){let r=await K(e.cwd);r.length>0&&(q("add [component]",r),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await N(e.cwd);return {errors:t,config:r}}catch{b.break(),b.error(`An invalid ${a.info("components.json")} file was found at ${a.info(e.cwd)}.
128
+ Before you can add components, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}async function Pn(e,t,r={}){let n={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return n;let i=await _$1(e,U$1(t));if(!i)throw new Error("Failed to fetch components from registry.");return r.skipFonts||(i=await Je(i,t)),n.dependencies=Array.from(new Set(i.dependencies??[])),n.devDependencies=Array.from(new Set(i.devDependencies??[])),n.docs=i.docs??null,await Ei(i,t,n),await Ni(i,t,n,r),Fi(i,t,n),r.skipFonts||Oi(i,n),n}async function Ei(e,t,r$1,n){let i=e.files;if(!i?.length)return;let[o,s$1]=await Promise.all([ra(t.resolvedPaths.cwd),t.tailwind.baseColor?ia(t.tailwind.baseColor):Promise.resolve(void 0)]);for(let c=0;c<i.length;c++){let a=i[c];if(!a.content)continue;let f$1=E(a,t,{isSrcDir:o?.isSrcDir,framework:o?.framework.name,commonRoot:F(i.map(x=>x.path),a.path),fileIndex:c});if(!f$1)continue;t.tsx||(f$1=f$1.replace(/\.tsx?$/,x=>x===".tsx"?".jsx":".js"));let l=existsSync(f$1),m=te__default.relative(t.resolvedPaths.cwd,f$1),d=a.type==="registry:file"||a.type==="registry:item",h=s(f$1)||d?a.content:await B$1({filename:a.path,raw:a.content,config:t,baseColor:s$1,transformJsx:!t.tsx,isRemote:false},[x,y,a$3,A$1,c$2,f,C,d$1,z$1]),g="create",w;l&&(w=await promises.readFile(f$1,"utf-8"),r(w,h)?g="skip":g="overwrite"),r$1.files.push({path:m,action:g,content:h,...g==="overwrite"&&{existingContent:w},type:a.type??"registry:ui"});}}async function Ni(e,t,r,n){let i=e.css&&Object.keys(e.css).length>0,o=Object.keys(e.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!i&&!o)return;let s=t.resolvedPaths.tailwindCss,c=existsSync(s),a=te__default.relative(t.resolvedPaths.cwd,s),f=c?await promises.readFile(s,"utf8"):"",l=f;o&&(l=await Ue(l,e.cssVars,t,{overwriteCssVars:n.overwriteCssVars})),i&&(l=await Vt(l,e.css));let m=0;if(e.cssVars)for(let d of Object.values(e.cssVars))d&&(m+=Object.keys(d).length);r.css={path:a,content:l,...c&&{existingContent:f},action:c?"update":"create",cssVarsCount:m};}function Fi(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let n=te__default.join(t.resolvedPaths.cwd,".env.local"),i=existsSync(n),o=te__default.relative(t.resolvedPaths.cwd,n);r.envVars={path:o,variables:e.envVars,action:i?"update":"create"};}function Oi(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 me=5,Di=dim("\u250C"+"\u2500".repeat(46)),Li=dim("\u2514"+"\u2500".repeat(46)),_i={create:"+",overwrite:"~",skip:"="},Vi={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function He(e){return e==="create"?green(e):e==="overwrite"||e==="update"?yellow(e):dim(e)}function Ye(e){return `${bold("\u250C")} ${bold(`shadcn add ${e.join(", ")}`)} ${dim("(dry run)")}`}function Nn(e,t){return e===t||e.includes(t)||e.endsWith(t)}function xe(e,t,r=n=>n){e.push(`${dim("\u2502")} ${Di}`);for(let n of t)e.push(`${dim("\u2502")} ${dim("\u2502")} ${r(n)}`);e.push(`${dim("\u2502")} ${Li}`);}function Fn(e,t,r={}){return r.diff?typeof r.diff=="string"?Mi(e,t,r.diff):Ui(e,t):r.view?typeof r.view=="string"?zi(e,t,r.view):Bi(e,t):Wi(e,t)}function Wi(e,t){let r=[];r.push(Ye(t)),r.push(dim("\u2502")),Ji(e,r),jn("Dependencies",e.dependencies,r),jn("Dev Dependencies",e.devDependencies,r),Gi(e,r),Hi(e,r),Yi(e,r);let n=e.files.filter(o=>o.action==="overwrite").length;n>0&&(r.push(yellow(`\u26A0 ${n} ${n===1?"file":"files"} will be overwritten.`)),r.push(dim("\u2502")));let i=[];return e.files.length>0&&i.push(`${e.files.length} ${e.files.length===1?"file":"files"}`),e.dependencies.length>0&&i.push(`${e.dependencies.length} ${e.dependencies.length===1?"dep":"deps"}`),e.css?.cssVarsCount&&i.push(`${e.css.cssVarsCount} CSS vars`),i.length>0&&(r.push(`${dim("\u2502")} ${dim(i.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(`
129
+ `)}function Mi(e,t,r){let n=[];n.push(Ye(t)),n.push(dim("\u2502"));let i=Tn(e.files,r),o=e.css&&Nn(e.css.path,r);if(i.length===0&&!o)n.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),n.push(dim("\u2502"));else {for(let s of i)On(s,n);if(o&&e.css){if(n.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${He(e.css.action)}${dim(")")}`),e.css.action==="create"||!e.css.existingContent)xe(n,e.css.content.split(`
130
+ `),s=>green(`+${s}`));else {let s=An(e.css.existingContent,e.css.content,e.css.path,{fullContext:true});xe(n,s);}n.push(dim("\u2502"));}}return n.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),n.join(`
131
+ `)}function Ui(e,t){let r=[];r.push(Ye(t)),r.push(dim("\u2502"));let n=e.files.slice(0,me);if(n.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No changes.")}`),r.push(dim("\u2502"));else {for(let s of n)On(s,r);e.files.length>me&&r.push(dim("\u2502"));}let i=e.files.length;return i>me&&r.push(` ${dim(`Showing ${me} of ${i} files. Use --diff <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
132
+ `)}function Bi(e,t){let r=[];r.push(Ye(t)),r.push(dim("\u2502"));let n=e.files.slice(0,me);if(n.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No files.")}`),r.push(dim("\u2502"));else {for(let s of n){let c=s.content.split(`
133
+ `);r.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${He(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),xe(r,c),r.push(dim("\u2502"));}e.files.length>me&&r.push(dim("\u2502"));}let i=e.files.length;return i>me&&r.push(` ${dim(`Showing ${me} of ${i} files. Use --view <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
134
+ `)}function On(e,t){if(t.push(`${dim("\u251C")} ${bold(e.path)} ${dim("(")}${He(e.action)}${dim(")")}`),e.action==="skip")t.push(`${dim("\u2502")} ${dim("No changes.")}`);else if(e.action==="create")xe(t,e.content.split(`
135
+ `),r=>green(`+${r}`));else {let r=An(e.existingContent,e.content,e.path);xe(t,r);}t.push(dim("\u2502"));}function zi(e,t,r){let n=[];n.push(Ye(t)),n.push(dim("\u2502"));let i=Tn(e.files,r),o=e.css&&Nn(e.css.path,r);if(i.length===0&&!o)n.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),n.push(dim("\u2502"));else {for(let s of i){let c=s.content.split(`
136
+ `);n.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${He(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),xe(n,c),n.push(dim("\u2502"));}if(o&&e.css){let s=e.css.content.split(`
137
+ `);n.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${He(e.css.action)}${dim(")")} ${dim(`${s.length} lines`)}`),xe(n,s),n.push(dim("\u2502"));}}return n.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),n.join(`
138
+ `)}function Ji(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 n=[];r.create>0&&n.push(green(`+${r.create} new`)),r.overwrite>0&&n.push(yellow(`~${r.overwrite} overwrite`)),r.skip>0&&n.push(dim(`=${r.skip} skip`));let i=n.length>0?` ${n.join(dim(", "))}`:"";t.push(`${dim("\u251C")} ${bold("Files")} ${dim(`(${e.files.length})`)}${i}`);let o=Math.max(...e.files.map(s=>s.path.length));for(let s of e.files){let c=_i[s.action],a=Vi[s.action],f=" ".repeat(Math.max(1,o-s.path.length+2)),l=s.action==="create"?green:s.action==="overwrite"?yellow:dim,m=s.action==="skip"?dim(s.path):s.path;t.push(`${dim("\u2502")} ${l(c)} ${m}${f}${l(a)}`);}t.push(dim("\u2502"));}function jn(e,t,r){if(t.length){r.push(`${dim("\u251C")} ${bold(e)} ${dim(`(${t.length})`)}`);for(let n of t)r.push(`${dim("\u2502")} ${green("+")} ${n}`);r.push(dim("\u2502"));}}function Gi(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 Hi(e,t){if(!e.envVars)return;let r=Object.keys(e.envVars.variables);t.push(`${dim("\u251C")} ${bold("Environment Variables")}`);for(let n of r)t.push(`${dim("\u2502")} ${green("+")} ${n}`);t.push(dim("\u2502"));}function Yi(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 Tn(e,t){let r=e.filter(n=>n.path===t);return r.length>0?r:e.filter(n=>n.path.includes(t)||n.path.replace(/\\/g,"/").includes(t))}function An(e,t,r,n={}){if(Qi(e,t))return [dim(" Formatting-only changes (spacing, quotes, semicolons).")];let i=En(e),o=En(t),s=n.fullContext?Math.max(i.split(`
135
139
  `).length,o.split(`
136
140
  `).length):3,c=structuredPatch(`a/${r}`,`b/${r}`,i,o,"","",{context:s});if(!c.hunks.length)return [dim(" No changes.")];let a=[dim(`--- a/${r}`),dim(`+++ b/${r}`)],f=t.split(`
137
- `);for(let l of c.hunks){let{entries:m}=Gi(l,f);if(!m.some(x=>x.kind!=="context"))continue;let h=m.filter(x=>x.kind==="context").length,g=m.filter(x=>x.kind==="removed").length,w=m.filter(x=>x.kind==="added").length;a.push(cyan(`@@ -${l.oldStart},${h+g} +${l.newStart},${h+w} @@`));for(let x of m)a.push(x.formatted);}return a}function Gi(e,t){let r=[],n=e.newStart-1,i=0;for(;i<e.lines.length;){let o=e.lines[i];if(o.startsWith("-")){let s=[];for(;i<e.lines.length&&e.lines[i].startsWith("-");)s.push(e.lines[i].slice(1)),i++;for(;i<e.lines.length&&e.lines[i].startsWith("\\");)i++;let c=[];for(;i<e.lines.length&&e.lines[i].startsWith("+");)c.push(e.lines[i].slice(1)),i++;for(;i<e.lines.length&&e.lines[i].startsWith("\\");)i++;n=Hi(s,c,t,n,r);}else if(o.startsWith("+")){let s=t[n]??o.slice(1);r.push({kind:"added",formatted:green(`+${s}`)}),n++,i++;}else if(o.startsWith("\\"))i++;else {let s=t[n]??o.slice(1);r.push({kind:"context",formatted:dim(` ${s}`)}),n++,i++;}}return {entries:r,newLineIndex:n}}function Hi(e,t,r,n,i){if(Xi(e,t)){for(let a=0;a<t.length;a++){let f=r[n]??t[a];i.push({kind:"context",formatted:dim(` ${f}`)}),n++;}return n}let o=Yi(e),s=o.map(Ct),c=new Set;for(let a=0;a<t.length;a++){let f=r[n]??t[a],l=Ct(t[a]),m=s.findIndex((d,h)=>!c.has(h)&&d===l);if(m!==-1)c.add(m),i.push({kind:"context",formatted:dim(` ${f}`)});else {let d=s.findIndex((h,g)=>!c.has(g));if(d!==-1){c.add(d);let{oldHighlighted:h,newHighlighted:g}=Ki(o[d],f);i.push({kind:"removed",formatted:h}),i.push({kind:"added",formatted:g});}else i.push({kind:"added",formatted:green(`+${f}`)});}n++;}for(let a=0;a<o.length;a++)c.has(a)||i.push({kind:"removed",formatted:red(`-${o[a]}`)});return n}function jn(e){return e.split(`
141
+ `);for(let l of c.hunks){let{entries:m}=Ki(l,f);if(!m.some(x=>x.kind!=="context"))continue;let h=m.filter(x=>x.kind==="context").length,g=m.filter(x=>x.kind==="removed").length,w=m.filter(x=>x.kind==="added").length;a.push(cyan(`@@ -${l.oldStart},${h+g} +${l.newStart},${h+w} @@`));for(let x of m)a.push(x.formatted);}return a}function Ki(e,t){let r=[],n=e.newStart-1,i=0;for(;i<e.lines.length;){let o=e.lines[i];if(o.startsWith("-")){let s=[];for(;i<e.lines.length&&e.lines[i].startsWith("-");)s.push(e.lines[i].slice(1)),i++;for(;i<e.lines.length&&e.lines[i].startsWith("\\");)i++;let c=[];for(;i<e.lines.length&&e.lines[i].startsWith("+");)c.push(e.lines[i].slice(1)),i++;for(;i<e.lines.length&&e.lines[i].startsWith("\\");)i++;n=qi(s,c,t,n,r);}else if(o.startsWith("+")){let s=t[n]??o.slice(1);r.push({kind:"added",formatted:green(`+${s}`)}),n++,i++;}else if(o.startsWith("\\"))i++;else {let s=t[n]??o.slice(1);r.push({kind:"context",formatted:dim(` ${s}`)}),n++,i++;}}return {entries:r,newLineIndex:n}}function qi(e,t,r,n,i){if(es(e,t)){for(let a=0;a<t.length;a++){let f=r[n]??t[a];i.push({kind:"context",formatted:dim(` ${f}`)}),n++;}return n}let o=Xi(e),s=o.map(Ct),c=new Set;for(let a=0;a<t.length;a++){let f=r[n]??t[a],l=Ct(t[a]),m=s.findIndex((d,h)=>!c.has(h)&&d===l);if(m!==-1)c.add(m),i.push({kind:"context",formatted:dim(` ${f}`)});else {let d=s.findIndex((h,g)=>!c.has(g));if(d!==-1){c.add(d);let{oldHighlighted:h,newHighlighted:g}=Zi(o[d],f);i.push({kind:"removed",formatted:h}),i.push({kind:"added",formatted:g});}else i.push({kind:"added",formatted:green(`+${f}`)});}n++;}for(let a=0;a<o.length;a++)c.has(a)||i.push({kind:"removed",formatted:red(`-${o[a]}`)});return n}function En(e){return e.split(`
138
142
  `).map(t=>{let r=t.match(/^(\s*)/)?.[1]??"",n=t.slice(r.length);return r+n.replace(/['"]/g,'"').replace(/;$/g,"")}).join(`
139
- `)}function Yi(e){let t=[];for(let r=0;r<e.length;r++){let n=e[r];for(;r+1<e.length&&n.trimEnd().endsWith(":");)r++,n=n.trimEnd()+" "+e[r].trim();t.push(n);}return t}function Ki(e,t){let r=diffWords(e,t),n="-",i="+";for(let o of r)o.added?i+=bold(green(o.value)):o.removed?n+=bold(red(o.value)):(n+=red(o.value),i+=green(o.value));return {oldHighlighted:n,newHighlighted:i}}function Ct(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function qi(e,t){let r=n=>n.split(`
140
- `).map(Ct).filter(i=>i.length>0).join(" ");return r(e)===r(t)}function Xi(e,t){let r=n=>n.map(Ct).filter(i=>i.length>0).join(" ");return r(e)===r(t)}async function Dn(e,t){let r=ee__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await xe__default.stat(r)).isFile())return;let[n]=await ba([e],{config:t});if(!n?.meta?.importSpecifier||!n?.meta?.moduleSpecifier)return;let i=`import { ${n?.meta?.importSpecifier} } from "${n.meta.moduleSpecifier}"
143
+ `)}function Xi(e){let t=[];for(let r=0;r<e.length;r++){let n=e[r];for(;r+1<e.length&&n.trimEnd().endsWith(":");)r++,n=n.trimEnd()+" "+e[r].trim();t.push(n);}return t}function Zi(e,t){let r=diffWords(e,t),n="-",i="+";for(let o of r)o.added?i+=bold(green(o.value)):o.removed?n+=bold(red(o.value)):(n+=red(o.value),i+=green(o.value));return {oldHighlighted:n,newHighlighted:i}}function Ct(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function Qi(e,t){let r=n=>n.split(`
144
+ `).map(Ct).filter(i=>i.length>0).join(" ");return r(e)===r(t)}function es(e,t){let r=n=>n.map(Ct).filter(i=>i.length>0).join(" ");return r(e)===r(t)}async function Ln(e,t){let r=te__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await ve__default.stat(r)).isFile())return;let[n]=await ba([e],{config:t});if(!n?.meta?.importSpecifier||!n?.meta?.moduleSpecifier)return;let i=`import { ${n?.meta?.importSpecifier} } from "${n.meta.moduleSpecifier}"
141
145
 
142
146
  export default function Page() {
143
147
  return <${n?.meta?.importSpecifier} />
144
- }`;await xe__default.writeFile(r,i,"utf8");}var ts=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()}),Ln=new Command().name("add").description("add a component to your project").argument("[components...]","names, url or local path to component").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=ts.parse({components:e$1,...t,cwd:ee__default.resolve(t.cwd)});await q(r.cwd);let n=r.dryRun||r.diff||r.view,i=await N(r.cwd);i||(i=T$1({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let o=!1;if(e$1.length>0){let{config:g,newRegistries:w}=await L(e$1,i,{silent:r.silent,writeFile:!1});i=g,o=w.length>0;}let s,c=!0;if(e$1.length>0){let[g]=await ba([e$1[0]],{config:i});if(s=g?.type,c=s!=="registry:theme"&&s!=="registry:style"&&s!=="registry:base",H$1(g)&&!n){await te(e$1,i,r);return}if(!r.yes&&!n&&(s==="registry:style"||s==="registry:theme")){b.break();let{confirm:w}=await fe({type:"confirm",name:"confirm",message:a.warn(`You are about to install a new ${s.replace("registry:","")}.
145
- Existing CSS variables and components will be overwritten. Continue?`)});w||(b.break(),b.log("Installation cancelled."),b.break(),process.exit(1));}}r.components?.length||(r.components=await rs(r));let a$1=await ra(r.cwd);if(a$1?.tailwindVersion==="v4"){let g=e.filter(w=>r.components?.includes(w.name));g?.length&&(b.break(),g.forEach(w=>{b.warn(a.warn(w.message));}),b.break(),process.exit(1));}let{errors:f,config:l}=await Sn(r),m=!1;if(f["3"]){let{proceed:g}=await fe({type:"confirm",name:"proceed",message:`You need to create a ${a.info("components.json")} file to add components. Proceed?`,initial:!0});g||(b.break(),process.exit(1));let w=wt(a$1?.framework.name),x=await $e(),{url:v}=await Me({rtl:!1,base:x,template:w}),{registryBaseConfig:P,installStyleIndex:C,url:R}=await We(v,r.cwd);l=await xt({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!o,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:C,components:[R,...r.components??[]],registryBaseConfig:P}),m=!0;}let d=!1;if(f["1"]){let{projectPath:g,template:w}=await bt({cwd:r.cwd,force:r.overwrite,components:r.components});g||(b.break(),process.exit(1)),r.cwd=g;let x=await $e(),{url:v}=await Me({rtl:!1,base:x,template:w}),{registryBaseConfig:P,installStyleIndex:C,url:R}=await We(v,r.cwd);l=await xt({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!o&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:C,components:[R,...r.components??[]],registryBaseConfig:P}),m=!0,d=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//);}if(!l)throw new Error(`Failed to read config at ${a.info(r.cwd)}.`);let{config:h}=await L(r.components,l,{silent:r.silent||o,writeFile:!n});if(l=h,n){let g=w("Resolving items.",{silent:r.silent}).start(),w$1=await In(r.components,l,{overwrite:r.overwrite});g.stop(),b.log(An(w$1,r.components,{diff:r.diff,view:r.view}));return}m||await te(r.components,l,r),d&&await Dn(r.components[0],l);}catch(r){b.break(),$(r);}finally{V();}});async function rs(e$1){let t=await ea();if(!t)return b.break(),$(new Error("Failed to fetch registry index.")),[];if(e$1.all)return t.map(i=>i.name).filter(i=>!e.some(o=>o.name===i));if(e$1.components?.length)return e$1.components;let{components:r}=await fe({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:t.filter(i=>i.type==="registry:ui"&&!e.some(o=>o.name===i.name)).map(i=>({title:i.name,value:i.name,selected:e$1.all?true:e$1.components?.includes(i.name)}))});r?.length||(b.warn("No components selected. Exiting."),b.info(""),process.exit(1));let n=z.array(z.string()).safeParse(r);return n.success?n.data:(b.error(""),$(new Error("Something went wrong. Please try again.")),[])}async function Wn(e){let t={},r={cwd:e.cwd,registryFile:ee__default.resolve(e.cwd,e.registryFile),outputDir:ee__default.resolve(e.cwd,e.outputDir)};return B.existsSync(r.registryFile)||(t["13"]=true),await B.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(b.break(),b.error(`The path ${a.info(r.registryFile)} does not exist.`)),b.break(),process.exit(1)),{errors:t,resolvePaths:r}}var os=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string()}),Un=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=os.parse({cwd:ee.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:n}=await Wn(r),i=await xe.readFile(n.registryFile,"utf-8"),o=o$1.safeParse(JSON.parse(i));o.success||(b.error(`Invalid registry file found at ${a.info(n.registryFile)}.`),process.exit(1));let s=w("Building registry...");for(let c of o.data.items){s.start(`Building ${c.name}...`),c.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let f of c.files??[])f.content=await xe.readFile(ee.resolve(n.cwd,f.path),"utf-8");let a$1=n$1.safeParse(c);if(!a$1.success){b.error(`Invalid registry item found for ${a.info(c.name)}.`);continue}await xe.writeFile(ee.resolve(n.outputDir,`${a$1.data.name}.json`),JSON.stringify(a$1.data,null,2));}await xe.copyFile(n.registryFile,ee.resolve(n.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){b.break(),$(r);}});var cs=z.object({component:z.string().optional(),yes:z.boolean(),cwd:z.string(),path:z.string().optional()}),Bn=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,t)=>{try{let r=cs.parse({component:e,...t}),n=ee__default.resolve(r.cwd);existsSync(n)||(b.error(`The path ${n} does not exist. Please try again.`),process.exit(1));let i=await N(n);if(!i){if(await H(n)){let a=await Y(n);a.length>0&&(K("diff [component]",a),process.exit(1));}b.warn(`Configuration is missing. Please run ${a.success("init")} to create a components.json file.`),process.exit(1);}let o=await ea();if(o||($(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a$1=i.resolvedPaths.components,f=o.filter(m=>{for(let d of m.files??[]){let h=ee__default.resolve(a$1,typeof d=="string"?d:d.path);if(existsSync(h))return !0}return !1}),l=[];for(let m of f){let d=await zn(m,i);d.length&&l.push({name:m.name,changes:d});}l.length||(b.info("No updates found."),process.exit(0)),b.info("The following components have updates available:");for(let m of l){b.info(`- ${m.name}`);for(let d of m.changes)b.info(` - ${d.filePath}`);}b.break(),b.info(`Run ${a.success("diff <component>")} to see the changes.`),process.exit(0);}let s=o.find(a=>a.name===r.component);s||(b.error(`The component ${a.success(r.component)} does not exist.`),process.exit(1));let c=await zn(s,i);c.length||(b.info(`No updates found for ${r.component}.`),process.exit(0));for(let a of c)b.info(`- ${a.filePath}`),await ls(a.patch),b.info("");}catch(r){$(r);}});async function zn(e,t){let r=await ka(t.style,[e]),n=await ia(t.tailwind.baseColor);if(!r)return [];let i=[];for(let o of r){let s=await la(t,o);if(s)for(let c of o.files??[]){let a=ee__default.resolve(s,typeof c=="string"?c:c.path);if(!existsSync(a))continue;let f=await promises.readFile(a,"utf8");if(typeof c=="string"||!c.content)continue;let l=await B$1({filename:c.path,raw:c.content,config:t,baseColor:n}),m=diffLines(l,f);m.length>1&&i.push({filePath:a,patch:m});}}return i}async function ls(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(a.success(t.value)):t.removed?process.stdout.write(a.error(t.value)):process.stdout.write(t.value)});}var Jn=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 either 'base' or 'radix'. defaults to project base.").option("--json","output as JSON.",false).action(async(e,t)=>{try{let r=ee__default.resolve(t.cwd),n=await N(r),i=t.base??S(n?.style),o=await ea();o||(b.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let a$1 of e){let f=o.find(m=>m.name===a$1);f||(b.error(`Component ${a.info(a$1)} not found in the shadcn registry.`),process.exit(1));let l=f.meta?.links?.[i];if(!l||Object.keys(l).length===0){b.warn(`No documentation links available for ${a.info(a$1)}.`);continue}s.push({component:a$1,base:i,links:l});}if(t.json){console.log(JSON.stringify({base:i,results:s},null,2));return}let c=Math.max(...s.flatMap(a=>Object.keys(a.links).map(f=>f.length)));for(let{component:a$1,links:f}of s){b.log(a.info(a$1));for(let[l,m]of Object.entries(f))b.log(` - ${l.padEnd(c+2)}${m}`);b.break();}}catch(r){$(r);}});var Hn="https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases",Yn=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=ee__default.resolve(e.cwd);if(!existsSync(ee__default.resolve(t,"components.json"))&&await H(t)){let c=await Y(t);c.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running info from a monorepo root. Use the -c flag to specify a workspace.",targets:c.map(a=>a.name)},null,2)):K("info",c),process.exit(1));}let r=await ra(t),n=await N(t),i=await ua(t),o=S(n?.style),s=gs(r,n,i,o);if(e.json){console.log(JSON.stringify(s,null,2));return}hs(s);}catch(t){$(t);}});function us(e){if(!e)return {};let t={};for(let[r,n]of Object.entries(e))t[r]=typeof n=="string"?n:n.url;return t}function gs(e,t,r,n){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:n,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:us(t.registries)}:null,components:r,links:{docs:`${c$1}/docs`,components:`${c$1}/docs/components/${n}/[component].md`,ui:`${Hn}/${n}/ui/[component].tsx`,examples:`${Hn}/${n}/examples/[component]-example.tsx`,schema:"https://ui.shadcn.com/schema.json"}}}function hs(e){b.log(a.info("Project")),e.project?Fe({framework:`${e.project.framework} (${e.project.frameworkName})`,frameworkVersion:e.project.frameworkVersion??"-",srcDirectory:e.project.srcDirectory?"Yes":"No",rsc:e.project.rsc?"Yes":"No",typescript:e.project.typescript?"Yes":"No",tailwindVersion:e.project.tailwindVersion??"-",tailwindConfig:e.project.tailwindConfig??"-",tailwindCss:e.project.tailwindCss??"-",importAlias:e.project.importAlias??"-"}):b.log(" No project info detected."),b.break(),b.log(a.info("Configuration")),e.config?(Fe({style:e.config.style,base:e.config.base,rsc:e.config.rsc?"Yes":"No",typescript:e.config.typescript?"Yes":"No",iconLibrary:e.config.iconLibrary??"-",rtl:e.config.rtl?"Yes":"No",menuColor:e.config.menuColor??"-",menuAccent:e.config.menuAccent??"-"}),b.break(),b.log(a.info("Aliases")),Fe({components:e.config.aliases.components,utils:e.config.aliases.utils,ui:e.config.aliases.ui??"-",lib:e.config.aliases.lib??"-",hooks:e.config.aliases.hooks??"-"}),b.break(),b.log(a.info("Resolved Paths")),Fe({cwd:e.config.resolvedPaths.cwd,tailwindConfig:e.config.resolvedPaths.tailwindConfig??"-",tailwindCss:e.config.resolvedPaths.tailwindCss??"-",utils:e.config.resolvedPaths.utils,components:e.config.resolvedPaths.components,lib:e.config.resolvedPaths.lib,hooks:e.config.resolvedPaths.hooks,ui:e.config.resolvedPaths.ui}),Object.keys(e.config.registries).length>0&&(b.break(),b.log("registries:"),Fe(e.config.registries))):b.log(" No components.json found."),b.break(),b.log(a.info("Installed Components")),e.components.length>0?b.log(` ${e.components.join(", ")}`):b.log(" No components installed."),b.break(),b.log(a.info("Links")),Fe(e.links),b.break();}function Fe(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,n]of Object.entries(e))b.log(` ${r.padEnd(t+2)}${n}`);}var ve="latest",St=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${ve}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${ve}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${ve}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
148
+ }`;await ve__default.writeFile(r,i,"utf8");}var os=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...]","names, url or local path to component").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=os.parse({components:e$1,...t,cwd:te__default.resolve(t.cwd)});await X(r.cwd);let n=r.dryRun||r.diff||r.view,i=await N(r.cwd);i||(i=T({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let o=!1;if(e$1.length>0){let{config:g,newRegistries:w}=await _(e$1,i,{silent:r.silent,writeFile:!1});i=g,o=w.length>0;}let s,c=!0;if(e$1.length>0){let[g]=await ba([e$1[0]],{config:i});if(s=g?.type,c=s!=="registry:theme"&&s!=="registry:style"&&s!=="registry:base",H(g)&&!n){await ne(e$1,i,r);return}if(!r.yes&&!n&&(s==="registry:style"||s==="registry:theme")){b.break();let{confirm:w}=await pe({type:"confirm",name:"confirm",message:a.warn(`You are about to install a new ${s.replace("registry:","")}.
149
+ Existing CSS variables and components will be overwritten. Continue?`)});w||(b.break(),b.log("Installation cancelled."),b.break(),process.exit(1));}}r.components?.length||(r.components=await is(r));let a$1=await ra(r.cwd);if(a$1?.tailwindVersion==="v4"){let g=e.filter(w=>r.components?.includes(w.name));g?.length&&(b.break(),g.forEach(w=>{b.warn(a.warn(w.message));}),b.break(),process.exit(1));}let{errors:f,config:l}=await $n(r),m=!1;if(f["3"]){let{proceed:g}=await pe({type:"confirm",name:"proceed",message:`You need to create a ${a.info("components.json")} file to add components. Proceed?`,initial:!0});g||(b.break(),process.exit(1));let w=wt(a$1?.framework.name),x=await Ie(),{url:v}=await We({rtl:!1,base:x,template:w}),{registryBaseConfig:P,installStyleIndex:C,url:R}=await Me(v,r.cwd);l=await xt({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!o,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:C,components:[R,...r.components??[]],registryBaseConfig:P}),m=!0;}let d=!1;if(f["1"]){let{projectPath:g,template:w}=await bt({cwd:r.cwd,force:r.overwrite,components:r.components});g||(b.break(),process.exit(1)),r.cwd=g;let x=await Ie(),{url:v}=await We({rtl:!1,base:x,template:w}),{registryBaseConfig:P,installStyleIndex:C,url:R}=await Me(v,r.cwd);l=await xt({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!o&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:C,components:[R,...r.components??[]],registryBaseConfig:P}),m=!0,d=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//);}if(!l)throw new Error(`Failed to read config at ${a.info(r.cwd)}.`);let{config:h}=await _(r.components,l,{silent:r.silent||o,writeFile:!n});if(l=h,n){let g=w("Resolving items.",{silent:r.silent}).start(),w$1=await Pn(r.components,l,{overwrite:r.overwrite});g.stop(),b.log(Fn(w$1,r.components,{diff:r.diff,view:r.view}));return}m||await ne(r.components,l,r),d&&await Ln(r.components[0],l);}catch(r){b.break(),$(r);}finally{V();}});async function is(e$1){let t=await ea();if(!t)return b.break(),$(new Error("Failed to fetch registry index.")),[];if(e$1.all)return t.map(i=>i.name).filter(i=>!e.some(o=>o.name===i));if(e$1.components?.length)return e$1.components;let{components:r}=await pe({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:t.filter(i=>i.type==="registry:ui"&&!e.some(o=>o.name===i.name)).map(i=>({title:i.name,value:i.name,selected:e$1.all?true:e$1.components?.includes(i.name)}))});r?.length||(b.warn("No components selected. Exiting."),b.info(""),process.exit(1));let n=z.array(z.string()).safeParse(r);return n.success?n.data:(b.error(""),$(new Error("Something went wrong. Please try again.")),[])}async function Un(e){let t={},r={cwd:e.cwd,registryFile:te__default.resolve(e.cwd,e.registryFile),outputDir:te__default.resolve(e.cwd,e.outputDir)};return A.existsSync(r.registryFile)||(t["13"]=true),await A.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(b.break(),b.error(`The path ${a.info(r.registryFile)} does not exist.`)),b.break(),process.exit(1)),{errors:t,resolvePaths:r}}var as=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=as.parse({cwd:te.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:n}=await Un(r),i=await ve.readFile(n.registryFile,"utf-8"),o=o$1.safeParse(JSON.parse(i));o.success||(b.error(`Invalid registry file found at ${a.info(n.registryFile)}.`),process.exit(1));let s=w("Building registry...");for(let c of o.data.items){s.start(`Building ${c.name}...`),c.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let f of c.files??[])f.content=await ve.readFile(te.resolve(n.cwd,f.path),"utf-8");let a$1=n$1.safeParse(c);if(!a$1.success){b.error(`Invalid registry item found for ${a.info(c.name)}.`);continue}await ve.writeFile(te.resolve(n.outputDir,`${a$1.data.name}.json`),JSON.stringify(a$1.data,null,2));}await ve.copyFile(n.registryFile,te.resolve(n.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){b.break(),$(r);}});var ps=z.object({component:z.string().optional(),yes:z.boolean(),cwd:z.string(),path:z.string().optional()}),Jn=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,t)=>{try{let r=ps.parse({component:e,...t}),n=te__default.resolve(r.cwd);existsSync(n)||(b.error(`The path ${n} does not exist. Please try again.`),process.exit(1));let i=await N(n);if(!i){if(await Y(n)){let a=await K(n);a.length>0&&(q("diff [component]",a),process.exit(1));}b.warn(`Configuration is missing. Please run ${a.success("init")} to create a components.json file.`),process.exit(1);}let o=await ea();if(o||($(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a$1=i.resolvedPaths.components,f=o.filter(m=>{for(let d of m.files??[]){let h=te__default.resolve(a$1,typeof d=="string"?d:d.path);if(existsSync(h))return !0}return !1}),l=[];for(let m of f){let d=await zn(m,i);d.length&&l.push({name:m.name,changes:d});}l.length||(b.info("No updates found."),process.exit(0)),b.info("The following components have updates available:");for(let m of l){b.info(`- ${m.name}`);for(let d of m.changes)b.info(` - ${d.filePath}`);}b.break(),b.info(`Run ${a.success("diff <component>")} to see the changes.`),process.exit(0);}let s=o.find(a=>a.name===r.component);s||(b.error(`The component ${a.success(r.component)} does not exist.`),process.exit(1));let c=await zn(s,i);c.length||(b.info(`No updates found for ${r.component}.`),process.exit(0));for(let a of c)b.info(`- ${a.filePath}`),await ms(a.patch),b.info("");}catch(r){$(r);}});async function zn(e,t){let r=await ka(t.style,[e]),n=await ia(t.tailwind.baseColor);if(!r)return [];let i=[];for(let o of r){let s=await la(t,o);if(s)for(let c of o.files??[]){let a=te__default.resolve(s,typeof c=="string"?c:c.path);if(!existsSync(a))continue;let f=await promises.readFile(a,"utf8");if(typeof c=="string"||!c.content)continue;let l=await B$1({filename:c.path,raw:c.content,config:t,baseColor:n}),m=diffLines(l,f);m.length>1&&i.push({filePath:a,patch:m});}}return i}async function ms(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(a.success(t.value)):t.removed?process.stdout.write(a.error(t.value)):process.stdout.write(t.value)});}var Gn=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 either 'base' or 'radix'. defaults to project base.").option("--json","output as JSON.",false).action(async(e,t)=>{try{let r=te__default.resolve(t.cwd),n=await N(r),i=t.base??S(n?.style),o=await ea();o||(b.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let a$1 of e){let f=o.find(m=>m.name===a$1);f||(b.error(`Component ${a.info(a$1)} not found in the shadcn registry.`),process.exit(1));let l=f.meta?.links?.[i];if(!l||Object.keys(l).length===0){b.warn(`No documentation links available for ${a.info(a$1)}.`);continue}s.push({component:a$1,base:i,links:l});}if(t.json){console.log(JSON.stringify({base:i,results:s},null,2));return}let c=Math.max(...s.flatMap(a=>Object.keys(a.links).map(f=>f.length)));for(let{component:a$1,links:f}of s){b.log(a.info(a$1));for(let[l,m]of Object.entries(f))b.log(` - ${l.padEnd(c+2)}${m}`);b.break();}}catch(r){$(r);}});var Yn="https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases",Kn=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=te__default.resolve(e.cwd);if(!existsSync(te__default.resolve(t,"components.json"))&&await Y(t)){let c=await K(t);c.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running info from a monorepo root. Use the -c flag to specify a workspace.",targets:c.map(a=>a.name)},null,2)):q("info",c),process.exit(1));}let r=await ra(t),n=await N(t),i=await ua(t),o=S(n?.style),s=ws(r,n,i,o);if(e.json){console.log(JSON.stringify(s,null,2));return}bs(s);}catch(t){$(t);}});function ys(e){if(!e)return {};let t={};for(let[r,n]of Object.entries(e))t[r]=typeof n=="string"?n:n.url;return t}function ws(e,t,r,n){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:n,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:ys(t.registries)}:null,components:r,links:{docs:`${c$1}/docs`,components:`${c$1}/docs/components/${n}/[component].md`,ui:`${Yn}/${n}/ui/[component].tsx`,examples:`${Yn}/${n}/examples/[component]-example.tsx`,schema:"https://ui.shadcn.com/schema.json"}}}function bs(e){b.log(a.info("Project")),e.project?Oe({framework:`${e.project.framework} (${e.project.frameworkName})`,frameworkVersion:e.project.frameworkVersion??"-",srcDirectory:e.project.srcDirectory?"Yes":"No",rsc:e.project.rsc?"Yes":"No",typescript:e.project.typescript?"Yes":"No",tailwindVersion:e.project.tailwindVersion??"-",tailwindConfig:e.project.tailwindConfig??"-",tailwindCss:e.project.tailwindCss??"-",importAlias:e.project.importAlias??"-"}):b.log(" No project info detected."),b.break(),b.log(a.info("Configuration")),e.config?(Oe({style:e.config.style,base:e.config.base,rsc:e.config.rsc?"Yes":"No",typescript:e.config.typescript?"Yes":"No",iconLibrary:e.config.iconLibrary??"-",rtl:e.config.rtl?"Yes":"No",menuColor:e.config.menuColor??"-",menuAccent:e.config.menuAccent??"-"}),b.break(),b.log(a.info("Aliases")),Oe({components:e.config.aliases.components,utils:e.config.aliases.utils,ui:e.config.aliases.ui??"-",lib:e.config.aliases.lib??"-",hooks:e.config.aliases.hooks??"-"}),b.break(),b.log(a.info("Resolved Paths")),Oe({cwd:e.config.resolvedPaths.cwd,tailwindConfig:e.config.resolvedPaths.tailwindConfig??"-",tailwindCss:e.config.resolvedPaths.tailwindCss??"-",utils:e.config.resolvedPaths.utils,components:e.config.resolvedPaths.components,lib:e.config.resolvedPaths.lib,hooks:e.config.resolvedPaths.hooks,ui:e.config.resolvedPaths.ui}),Object.keys(e.config.registries).length>0&&(b.break(),b.log("registries:"),Oe(e.config.registries))):b.log(" No components.json found."),b.break(),b.log(a.info("Installed Components")),e.components.length>0?b.log(` ${e.components.join(", ")}`):b.log(" No components installed."),b.break(),b.log(a.info("Links")),Oe(e.links),b.break();}function Oe(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,n]of Object.entries(e))b.log(` ${r.padEnd(t+2)}${n}`);}var Ce="latest",kt=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Ce}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Ce}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${Ce}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
146
150
  command = "npx"
147
- args = ["shadcn@${ve}", "mcp"]
148
- `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${ve}`,"mcp"],enabled:true}}}}],kt=[`shadcn@${ve}`],Xt=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 q(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){b.break(),$(t);}}),Cs=qt.object({client:qt.enum(["claude","cursor","vscode","codex","opencode"]),cwd:qt.string()});Xt.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${St.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let n=(t.parent?.opts()||{}).cwd||process.cwd(),i=e.client;if(!i){let f=await fe({type:"select",name:"client",message:"Which MCP client are you using?",choices:St.map(l=>({title:l.label,value:l.name}))});f.client||(b.break(),process.exit(1)),i=f.client;}let o=Cs.parse({client:i,cwd:n}),s=await N(o.cwd);if(o.client==="codex"){if(s)await T([],kt,s,{silent:!1});else {let f=await a$1(o.cwd),l=f==="npm"?"install":"add",m=f==="npm"?"--save-dev":"-D",d=w("Installing dependencies...").start();await execa(f,[l,m,...kt],{cwd:o.cwd}),d.succeed("Installing dependencies.");}b.break(),b.log("To configure the shadcn MCP server in Codex:"),b.break(),b.log(`1. Open or create the file ${a.info("~/.codex/config.toml")}`),b.log("2. Add the following configuration:"),b.log(),b.info(`[mcp_servers.shadcn]
151
+ args = ["shadcn@${Ce}", "mcp"]
152
+ `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${Ce}`,"mcp"],enabled:true}}}}],St=[`shadcn@${Ce}`],Xt=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 X(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){b.break(),$(t);}}),ks=qt.object({client:qt.enum(["claude","cursor","vscode","codex","opencode"]),cwd:qt.string()});Xt.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${kt.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let n=(t.parent?.opts()||{}).cwd||process.cwd(),i=e.client;if(!i){let f=await pe({type:"select",name:"client",message:"Which MCP client are you using?",choices:kt.map(l=>({title:l.label,value:l.name}))});f.client||(b.break(),process.exit(1)),i=f.client;}let o=ks.parse({client:i,cwd:n}),s=await N(o.cwd);if(o.client==="codex"){if(s)await D([],St,s,{silent:!1});else {let f=await a$1(o.cwd),l=f==="npm"?"install":"add",m=f==="npm"?"--save-dev":"-D",d=w("Installing dependencies...").start();await execa(f,[l,m,...St],{cwd:o.cwd}),d.succeed("Installing dependencies.");}b.break(),b.log("To configure the shadcn MCP server in Codex:"),b.break(),b.log(`1. Open or create the file ${a.info("~/.codex/config.toml")}`),b.log("2. Add the following configuration:"),b.log(),b.info(`[mcp_servers.shadcn]
149
153
  command = "npx"
150
- args = ["shadcn@${ve}", "mcp"]`),b.break(),b.info("3. Restart Codex to load the MCP server"),b.break(),process.exit(0);}let c=w("Configuring MCP server...").start(),a$2=await ks(o);if(c.succeed("Configuring MCP server."),s)await T([],kt,s,{silent:!1});else {let f=await a$1(o.cwd),l=f==="npm"?"install":"add",m=f==="npm"?"--save-dev":"-D",d=w("Installing dependencies...").start();await execa(f,[l,m,...kt],{cwd:o.cwd}),d.succeed("Installing dependencies.");}b.break(),b.success(`Configuration saved to ${a$2}.`),b.break();}catch(r){$(r);}});var Rs=(e,t)=>t;async function ks(e){let{client:t,cwd:r}=e,n=St.find(a=>a.name===t);if(!n)throw new Error(`Unknown client: ${t}. Available clients: ${St.map(a=>a.name).join(", ")}`);let i=ee__default.join(r,n.configPath),o=ee__default.dirname(i);await B.ensureDir(o);let s={};try{let a=await promises.readFile(i,"utf-8");s=JSON.parse(a);}catch{}let c=sn(s,n.config,{arrayMerge:Rs});return await promises.writeFile(i,JSON.stringify(c,null,2)+`
151
- `,"utf-8"),n.configPath}var me={lucide:{name:"lucide-react",package:"lucide-react",import:"lucide-react"},radix:{name:"@radix-ui/react-icons",package:"@radix-ui/react-icons",import:"@radix-ui/react-icons"}};async function Qn(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t=e.resolvedPaths.ui,[r,n]=await Promise.all([Qt("**/*.{js,ts,jsx,tsx}",{cwd:t}),ga()]);if(Object.keys(n).length===0)throw new Error("Something went wrong fetching the registry icons.");let i=Object.entries(me).map(([l,m])=>({title:m.name,value:l})),o=await fe([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${a.info("migrate from")}?`,choices:i},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${a.info("migrate to")}?`,choices:i}]);if(o.sourceLibrary===o.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(o.sourceLibrary in me&&o.targetLibrary in me))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=me[o.sourceLibrary],c=me[o.targetLibrary],{confirm:a$1}=await fe({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} files in ${a.info(`./${ee__default.relative(e.resolvedPaths.cwd,t)}`)} from ${a.info(s.name)} to ${a.info(c.name)}. Continue?`});a$1||(b.info("Migration cancelled."),process.exit(0)),c.package&&await T([c.package],[],e,{silent:false});let f=w("Migrating icons...")?.start();await Promise.all(r.map(async l=>{f.text=`Migrating ${l}...`;let m=ee__default.join(t,l),d=await promises.readFile(m,"utf-8"),h=await As(d,o.sourceLibrary,o.targetLibrary,n);await promises.writeFile(m,h);})),f.succeed("Migration complete.");}async function As(e,t,r,n){let i=me[t]?.import,o=me[r]?.import,s=await promises.mkdtemp(ee__default.join(tmpdir(),"shadcn-")),c=new Project({compilerOptions:{}}),a=ee__default.join(s,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),f=c.createSourceFile(a,e,{scriptKind:ScriptKind.TSX}),l=[];for(let m of f.getImportDeclarations()??[])if(m.getModuleSpecifier()?.getText()===`"${i}"`){for(let d of m.getNamedImports()??[]){let h=d.getName(),g=Object.values(n).find(w=>w[t]===h)?.[r];!g||l.includes(g)||(l.push(g),d.remove(),f.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(w=>w.getTagNameNode()?.getText()===h).forEach(w=>w.getTagNameNode()?.replaceWithText(g)));}m.getNamedImports()?.length===0&&m.remove();}return l.length>0&&f.addImportDeclaration({moduleSpecifier:o,namedImports:l.map(m=>({name:m}))}),await f.getText()}function Fs(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Os(e,t,r,n){let o=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of o){let c=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),a=s.match(/^(\w+)\s+as\s+(\w+)$/);if(c){let f=c[1],l=c[2];n==="slot"&&f==="Slot"&&!l?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:f,alias:l,isType:true});}else if(a){let f=a[1],l=a[2];n==="slot"&&f==="Slot"&&l==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:f,alias:l,isType:t});}else n==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t});}}async function eo(e,t={}){let r,n;if(t.path){if(n=e.resolvedPaths.cwd,t.path.includes("*"))r=await Qt(t.path,{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else {let a=ee__default.resolve(n,t.path),f=await promises.stat(a).catch(()=>null);if(!f)throw new Error(`File not found: ${t.path}`);if(f.isDirectory())n=a,r=await Qt("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else if(f.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else {if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");n=e.resolvedPaths.ui,r=await Qt("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true});}if(!t.yes){let c=t.path?t.path:`./${ee__default.relative(e.resolvedPaths.cwd,n)}`,{confirm:a$1}=await fe({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} file(s) in ${a.info(c)} to ${a.info("radix-ui")}. Continue?`});a$1||(b.info("Migration cancelled."),process.exit(0));}let i=w("Migrating imports...")?.start(),o=new Set;await Promise.all(r.map(async c=>{i.text=`Migrating ${c}...`;let a=ee__default.join(n,c),f=await promises.readFile(a,"utf-8"),{content:l,replacedPackages:m}=await Ts(f);m.forEach(d=>o.add(d)),await promises.writeFile(a,l);})),i.succeed("Migrating imports.");let s=w("Updating package.json...")?.start();try{let c=qa(e.resolvedPaths.cwd,!1);if(!c){s.fail("Could not read package.json"),b.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let a$1=Array.from(o);if(a$1.length>0){if(c.dependencies||(c.dependencies={}),c.dependencies?.["radix-ui"]||c.devDependencies?.["radix-ui"])s.succeed("radix-ui already in package.json.");else {c.dependencies["radix-ui"]="latest";let l=ee__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(l,JSON.stringify(c,null,2)+`
152
- `),s.succeed("Updated package.json."),await T(["radix-ui"],[],e,{silent:!1});}b.info(""),b.info("Migration complete. The following packages may be removed if no longer in use:"),b.info(a.info(a$1.join(", "))),b.info("Please review your codebase before removing.");}else s.succeed("No packages found in source files.");}catch{s.fail("Failed to update package.json"),b.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Ts(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],n=[],i=[],o='"',s=false,c=e,a;for(;(a=t.exec(e))!==null;){let[g,w,x,v,P,C,R]=a;if(C==="icons"||C.startsWith("icons/"))continue;n.push(g),n.length===1&&(o=P,s=R===";"),i.push(`@radix-ui/react-${C}`);let $=!!w;if(x){let M=Fs(C);r.push({name:M,alias:x,isType:$});}else v&&Os(v,$,r,C);}if(r.length===0)return {content:e,replacedPackages:[]};let f=r.filter((g,w,x)=>w===x.findIndex(v=>v.name===g.name&&v.alias===g.alias&&v.isType===g.isType)),m=`import { ${f.map(g=>{let w=g.isType?"type ":"";return g.alias?`${w}${g.name} as ${g.alias}`:`${w}${g.name}`}).join(", ")} } from ${o}radix-ui${o}${s?";":""}`;c=n.reduce((g,w,x)=>g.replace(w,x===0?m:""),c),c=c.replace(/\n\s*\n\s*\n/g,`
154
+ args = ["shadcn@${Ce}", "mcp"]`),b.break(),b.info("3. Restart Codex to load the MCP server"),b.break(),process.exit(0);}let c=w("Configuring MCP server...").start(),a$2=await Is(o);if(c.succeed("Configuring MCP server."),s)await D([],St,s,{silent:!1});else {let f=await a$1(o.cwd),l=f==="npm"?"install":"add",m=f==="npm"?"--save-dev":"-D",d=w("Installing dependencies...").start();await execa(f,[l,m,...St],{cwd:o.cwd}),d.succeed("Installing dependencies.");}b.break(),b.success(`Configuration saved to ${a$2}.`),b.break();}catch(r){$(r);}});var $s=(e,t)=>t;async function Is(e){let{client:t,cwd:r}=e,n=kt.find(a=>a.name===t);if(!n)throw new Error(`Unknown client: ${t}. Available clients: ${kt.map(a=>a.name).join(", ")}`);let i=te__default.join(r,n.configPath),o=te__default.dirname(i);await A.ensureDir(o);let s={};try{let a=await promises.readFile(i,"utf-8");s=JSON.parse(a);}catch{}let c=an(s,n.config,{arrayMerge:$s});return await promises.writeFile(i,JSON.stringify(c,null,2)+`
155
+ `,"utf-8"),n.configPath}var de={lucide:{name:"lucide-react",package:"lucide-react",import:"lucide-react"},radix:{name:"@radix-ui/react-icons",package:"@radix-ui/react-icons",import:"@radix-ui/react-icons"}};async function eo(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t=e.resolvedPaths.ui,[r,n]=await Promise.all([Qt("**/*.{js,ts,jsx,tsx}",{cwd:t}),ga()]);if(Object.keys(n).length===0)throw new Error("Something went wrong fetching the registry icons.");let i=Object.entries(de).map(([l,m])=>({title:m.name,value:l})),o=await pe([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${a.info("migrate from")}?`,choices:i},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${a.info("migrate to")}?`,choices:i}]);if(o.sourceLibrary===o.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(o.sourceLibrary in de&&o.targetLibrary in de))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=de[o.sourceLibrary],c=de[o.targetLibrary],{confirm:a$1}=await pe({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} files in ${a.info(`./${te__default.relative(e.resolvedPaths.cwd,t)}`)} from ${a.info(s.name)} to ${a.info(c.name)}. Continue?`});a$1||(b.info("Migration cancelled."),process.exit(0)),c.package&&await D([c.package],[],e,{silent:false});let f=w("Migrating icons...")?.start();await Promise.all(r.map(async l=>{f.text=`Migrating ${l}...`;let m=te__default.join(t,l),d=await promises.readFile(m,"utf-8"),h=await Ts(d,o.sourceLibrary,o.targetLibrary,n);await promises.writeFile(m,h);})),f.succeed("Migration complete.");}async function Ts(e,t,r,n){let i=de[t]?.import,o=de[r]?.import,s=await promises.mkdtemp(te__default.join(tmpdir(),"shadcn-")),c=new Project({compilerOptions:{}}),a=te__default.join(s,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),f=c.createSourceFile(a,e,{scriptKind:ScriptKind.TSX}),l=[];for(let m of f.getImportDeclarations()??[])if(m.getModuleSpecifier()?.getText()===`"${i}"`){for(let d of m.getNamedImports()??[]){let h=d.getName(),g=Object.values(n).find(w=>w[t]===h)?.[r];!g||l.includes(g)||(l.push(g),d.remove(),f.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(w=>w.getTagNameNode()?.getText()===h).forEach(w=>w.getTagNameNode()?.replaceWithText(g)));}m.getNamedImports()?.length===0&&m.remove();}return l.length>0&&f.addImportDeclaration({moduleSpecifier:o,namedImports:l.map(m=>({name:m}))}),await f.getText()}function Ds(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Ls(e,t,r,n){let o=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of o){let c=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),a=s.match(/^(\w+)\s+as\s+(\w+)$/);if(c){let f=c[1],l=c[2];n==="slot"&&f==="Slot"&&!l?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:f,alias:l,isType:true});}else if(a){let f=a[1],l=a[2];n==="slot"&&f==="Slot"&&l==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:f,alias:l,isType:t});}else n==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t});}}async function to(e,t={}){let r,n;if(t.path){if(n=e.resolvedPaths.cwd,t.path.includes("*"))r=await Qt(t.path,{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else {let a=te__default.resolve(n,t.path),f=await promises.stat(a).catch(()=>null);if(!f)throw new Error(`File not found: ${t.path}`);if(f.isDirectory())n=a,r=await Qt("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else if(f.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else {if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");n=e.resolvedPaths.ui,r=await Qt("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true});}if(!t.yes){let c=t.path?t.path:`./${te__default.relative(e.resolvedPaths.cwd,n)}`,{confirm:a$1}=await pe({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} file(s) in ${a.info(c)} to ${a.info("radix-ui")}. Continue?`});a$1||(b.info("Migration cancelled."),process.exit(0));}let i=w("Migrating imports...")?.start(),o=new Set;await Promise.all(r.map(async c=>{i.text=`Migrating ${c}...`;let a=te__default.join(n,c),f=await promises.readFile(a,"utf-8"),{content:l,replacedPackages:m}=await _s(f);m.forEach(d=>o.add(d)),await promises.writeFile(a,l);})),i.succeed("Migrating imports.");let s=w("Updating package.json...")?.start();try{let c=qa(e.resolvedPaths.cwd,!1);if(!c){s.fail("Could not read package.json"),b.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let a$1=Array.from(o);if(a$1.length>0){if(c.dependencies||(c.dependencies={}),c.dependencies?.["radix-ui"]||c.devDependencies?.["radix-ui"])s.succeed("radix-ui already in package.json.");else {c.dependencies["radix-ui"]="latest";let l=te__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(l,JSON.stringify(c,null,2)+`
156
+ `),s.succeed("Updated package.json."),await D(["radix-ui"],[],e,{silent:!1});}b.info(""),b.info("Migration complete. The following packages may be removed if no longer in use:"),b.info(a.info(a$1.join(", "))),b.info("Please review your codebase before removing.");}else s.succeed("No packages found in source files.");}catch{s.fail("Failed to update package.json"),b.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function _s(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],n=[],i=[],o='"',s=false,c=e,a;for(;(a=t.exec(e))!==null;){let[g,w,x,v,P,C,R]=a;if(C==="icons"||C.startsWith("icons/"))continue;n.push(g),n.length===1&&(o=P,s=R===";"),i.push(`@radix-ui/react-${C}`);let $=!!w;if(x){let M=Ds(C);r.push({name:M,alias:x,isType:$});}else v&&Ls(v,$,r,C);}if(r.length===0)return {content:e,replacedPackages:[]};let f=r.filter((g,w,x)=>w===x.findIndex(v=>v.name===g.name&&v.alias===g.alias&&v.isType===g.isType)),m=`import { ${f.map(g=>{let w=g.isType?"type ":"";return g.alias?`${w}${g.name} as ${g.alias}`:`${w}${g.name}`}).join(", ")} } from ${o}radix-ui${o}${s?";":""}`;c=n.reduce((g,w,x)=>g.replace(w,x===0?m:""),c),c=c.replace(/\n\s*\n\s*\n/g,`
153
157
 
154
158
  `),f.some(g=>g.name==="Slot"&&g.alias==="SlotPrimitive")&&(c=c.split(`
155
- `).map(x=>{if(x.trim().startsWith("import "))return x;let v=x;return v=v.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bSlot\b/g,(P,C,R)=>{let $=R.substring(0,C),M=($.match(/"/g)||[]).length,X=($.match(/'/g)||[]).length;return M%2!==0||X%2!==0?P:"__SLOT_PLACEHOLDER__"}),v=v.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),v}).join(`
156
- `));let h=Array.from(new Set(i));return {content:c,replacedPackages:h}}var Ls=["sidebar.tsx","pagination.tsx","calendar.tsx"],_s=`${c$1}/docs/rtl#manual-migration-optional`;async function to(e,t={}){let r,n;if(t.path){if(n=e.resolvedPaths.cwd,t.path.includes("*"))r=await Qt(t.path,{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else {let f=ee__default.resolve(n,t.path),l=await promises.stat(f).catch(()=>null);if(!l)throw new Error(`File not found: ${t.path}`);if(l.isDirectory())n=f,r=await Qt("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else if(l.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else {if(!e.resolvedPaths.ui)throw new Error("Could not find a valid `ui` path in your `components.json`. Please provide a path or glob pattern.");n=e.resolvedPaths.ui,r=await Qt("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true});}if(!t.yes){let a$1=t.path?t.path:`./${ee__default.relative(e.resolvedPaths.cwd,n)}`,{confirm:f}=await fe({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} file(s) in ${a.info(a$1)} to RTL. Continue?`});f||(b.info("Migration cancelled."),process.exit(0));}let i=w("Updating components.json...").start();try{let a=ee__default.resolve(e.resolvedPaths.cwd,"components.json"),f=JSON.parse(await promises.readFile(a,"utf-8"));f.rtl=!0,await promises.writeFile(a,JSON.stringify(f,null,2)+`
157
- `),i.succeed("Updated components.json.");}catch{throw i.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let o=w("Migrating files to RTL...").start(),s=0,c=[];if(await Promise.all(r.map(async a=>{o.text=`Migrating ${a}...`;let f=ee__default.join(n,a),l=await promises.readFile(f,"utf-8"),m=await e$1(l,true);m!==l&&(await promises.writeFile(f,m),s++);let d=ee__default.basename(a);Ls.includes(d)&&c.push(a);})),o.succeed(`Migration complete. ${s} file(s) transformed.`),c.length>0){b.break(),b.warn("The following components may need manual RTL adjustments:");for(let a of c)b.info(` - ${a}`);b.break(),b.info(`See ${a.info(_s)} for more information.`);}}async function no(e){let t={};if(!B.existsSync(e.cwd)||!B.existsSync(ee__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!B.existsSync(ee__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await N(e.cwd);return {errors:t,config:r}}catch{b.break(),b.error(`An invalid ${a.info("components.json")} file was found at ${a.info(e.cwd)}.
158
- Before you can run a migration, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}var oo=[{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)."}],Ws=z.object({cwd:z.string(),list:z.boolean(),yes:z.boolean(),migration:z.string().refine(e=>e&&oo.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()}),io=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).action(async(e,t,r)=>{try{let n=Ws.parse({cwd:ee__default.resolve(r.cwd),migration:e,path:t,list:r.list,yes:r.yes});if(n.list||!n.migration){b.info("Available migrations:");for(let s of oo)b.info(`- ${s.name}: ${s.description}`);return}if(!n.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:i,config:o}=await no(n);if(i["1"]||i["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!o)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");n.migration==="icons"&&await Qn(o),n.migration==="radix"&&await eo(o,{yes:n.yes,path:n.path}),n.migration==="rtl"&&await to(o,{yes:n.yes,path:n.path});}catch(n){b.break(),$(n);}});var Bs=z.object({cwd:z.string(),silent:z.boolean()}),ao=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=Bs.parse({cwd:ee__default.resolve(t.cwd),silent:t.silent}),n=e.length>0?e:await Hs({silent:r.silent});await Gs(n,r.cwd,{silent:r.silent});}catch(r){b.break(),$(r);}});function Js(e){let[t,...r]=e.split("="),n=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${a.info(t)}. Registry names must start with @ (e.g., @acme).`);return {namespace:t,url:n}}function or(e,t,r){return `${e} ${e===1?t:r}`}async function Gs(e,t,r){let n=ee__default.resolve(t,"components.json");if(!B.existsSync(n))throw new Error(`No ${a.info("components.json")} found. Run ${a.info("shadcn init")} first.`);let i=e.map(Js),o=i.filter(g=>!g.url),s=[];if(o.length>0){let g=w("Fetching registries.",{silent:r.silent}).start(),w$1=await ma();if(!w$1)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),s=w$1;}let c={};for(let{namespace:g,url:w}of i){if(g in d){b.warn(`${a.info(g)} is a built-in registry and cannot be added.`);continue}if(w){if(!w.includes("{name}"))throw new Error(`Invalid registry URL for ${a.info(g)}. URL must include {name} placeholder. Example: ${a.info(`${g}=https://example.com/r/{name}.json`)}`);c[g]=w;}else {let x=s.find(v=>v.name===g);if(!x)throw new Error(`Registry ${a.info(g)} not found. Provide a URL: ${a.info(`${g}=https://.../{name}.json`)}`);c[g]=x.url;}}if(Object.keys(c).length===0)return {addedRegistries:[]};let a$1=await B.readJson(n),f=a$1.registries||{},l={},m=[];for(let[g,w]of Object.entries(c))f[g]?m.push(g):l[g]=w;if(Object.keys(l).length===0){if(m.length>0&&!r.silent){w(`Skipped ${or(m.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let g of m)b.log(` - ${g}`);}else r.silent||b.info("No new registries to add.");return}let d$1={...a$1,registries:{...f,...l}},h=w("Updating components.json.",{silent:r.silent}).start();if(await B.writeJson(n,d$1,{spaces:2}),h.succeed(),!r.silent){let g=Object.keys(l);w(`Added ${or(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let w of g)b.log(` - ${w}`);if(m.length>0){w(`Skipped ${or(m.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let w of m)b.log(` - ${w}`);}}}async function Hs(e){let t=w("Fetching registries.",{silent:e.silent}).start(),r=await ma();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let n=[...r].sort((o,s)=>o.name.localeCompare(s.name)),{selected:i}=await fe({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:n.map(o=>({title:o.name,description:o.description,value:o.name}))});return i?.length||(b.warn("No registries selected. Exiting."),b.info(""),process.exit(1)),i}var co=new Command().name("registry").description("manage registries").addCommand(ao);var qs=z.object({cwd:z.string(),query:z.string().optional(),limit:z.number().optional(),offset:z.number().optional()}),po=new Command().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry names or urls to search items from. Names must be prefixed with @.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-l, --limit <number>","maximum number of items to display per registry","100").option("-o, --offset <number>","number of items to skip","0").action(async(e,t)=>{try{let r=qs.parse({cwd:ee__default.resolve(t.cwd),query:t.query,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});await q(r.cwd);let n=T$1({style:"new-york",resolvedPaths:{cwd:r.cwd}}),i=U$1(n),o=ee__default.resolve(r.cwd,"components.json");if(B.existsSync(o)){let l=await B.readJson(o),m=c.partial().parse(l);i=U$1({...n,...m});}let s=i;try{let l=await N(r.cwd);l&&(s=U$1(l));}catch{}let{config:c$1,newRegistries:a}=await L(e.map(l=>`${l}/registry`),s,{silent:!0,writeFile:!1});a.length>0&&(s.registries=c$1.registries),W$1(e,s);let f=await va(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(f,null,2)),process.exit(0);}catch(r){$(r);}finally{V();}});var Zs=z.object({cwd:z.string()}),ho=new Command().name("view").description("view items from the registry").argument("<items...>","the item names or URLs to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Zs.parse({cwd:ee__default.resolve(t.cwd)});await q(r.cwd);let n=U$1({}),i=ee__default.resolve(r.cwd,"components.json");if(B.existsSync(i)){let f=await B.readJson(i),l=c.partial().parse(f);n=U$1(l);}let o=n;try{let f=await N(r.cwd);f&&(o=U$1(f));}catch{}let{config:s,newRegistries:c$1}=await L(e,o,{silent:!0,writeFile:!1});c$1.length>0&&(o.registries=s.registries),W$1(e,o);let a=await ba(e,{config:o});console.log(JSON.stringify(a,null,2)),process.exit(0);}catch(r){$(r);}finally{V();}});var yo={version:"4.0.5"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function ta(){let e=new Command().name("shadcn").description("build your component library").version(yo.version,"-v, --version","display the version number");e.addCommand(Rn).addCommand(Ln).addCommand(Bn).addCommand(Jn).addCommand(ho).addCommand(po).addCommand(io).addCommand(Yn).addCommand(Un).addCommand(Xt).addCommand(co),e.parse();}ta();
159
+ `).map(x=>{if(x.trim().startsWith("import "))return x;let v=x;return v=v.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bSlot\b/g,(P,C,R)=>{let $=R.substring(0,C),M=($.match(/"/g)||[]).length,Z=($.match(/'/g)||[]).length;return M%2!==0||Z%2!==0?P:"__SLOT_PLACEHOLDER__"}),v=v.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),v}).join(`
160
+ `));let h=Array.from(new Set(i));return {content:c,replacedPackages:h}}var Ws=["sidebar.tsx","pagination.tsx","calendar.tsx"],Ms=`${c$1}/docs/rtl#manual-migration-optional`;async function ro(e,t={}){let r,n;if(t.path){if(n=e.resolvedPaths.cwd,t.path.includes("*"))r=await Qt(t.path,{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else {let f=te__default.resolve(n,t.path),l=await promises.stat(f).catch(()=>null);if(!l)throw new Error(`File not found: ${t.path}`);if(l.isDirectory())n=f,r=await Qt("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else if(l.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else {if(!e.resolvedPaths.ui)throw new Error("Could not find a valid `ui` path in your `components.json`. Please provide a path or glob pattern.");n=e.resolvedPaths.ui,r=await Qt("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true});}if(!t.yes){let a$1=t.path?t.path:`./${te__default.relative(e.resolvedPaths.cwd,n)}`,{confirm:f}=await pe({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} file(s) in ${a.info(a$1)} to RTL. Continue?`});f||(b.info("Migration cancelled."),process.exit(0));}let i=w("Updating components.json...").start();try{let a=te__default.resolve(e.resolvedPaths.cwd,"components.json"),f=JSON.parse(await promises.readFile(a,"utf-8"));f.rtl=!0,await promises.writeFile(a,JSON.stringify(f,null,2)+`
161
+ `),i.succeed("Updated components.json.");}catch{throw i.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let o=w("Migrating files to RTL...").start(),s=0,c=[];if(await Promise.all(r.map(async a=>{o.text=`Migrating ${a}...`;let f=te__default.join(n,a),l=await promises.readFile(f,"utf-8"),m=await e$1(l,true);m!==l&&(await promises.writeFile(f,m),s++);let d=te__default.basename(a);Ws.includes(d)&&c.push(a);})),o.succeed(`Migration complete. ${s} file(s) transformed.`),c.length>0){b.break(),b.warn("The following components may need manual RTL adjustments:");for(let a of c)b.info(` - ${a}`);b.break(),b.info(`See ${a.info(Ms)} for more information.`);}}async function oo(e){let t={};if(!A.existsSync(e.cwd)||!A.existsSync(te__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!A.existsSync(te__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await N(e.cwd);return {errors:t,config:r}}catch{b.break(),b.error(`An invalid ${a.info("components.json")} file was found at ${a.info(e.cwd)}.
162
+ Before you can run a migration, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}var io=[{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)."}],zs=z.object({cwd:z.string(),list:z.boolean(),yes:z.boolean(),migration:z.string().refine(e=>e&&io.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()}),so=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).action(async(e,t,r)=>{try{let n=zs.parse({cwd:te__default.resolve(r.cwd),migration:e,path:t,list:r.list,yes:r.yes});if(n.list||!n.migration){b.info("Available migrations:");for(let s of io)b.info(`- ${s.name}: ${s.description}`);return}if(!n.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:i,config:o}=await oo(n);if(i["1"]||i["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!o)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");n.migration==="icons"&&await eo(o),n.migration==="radix"&&await to(o,{yes:n.yes,path:n.path}),n.migration==="rtl"&&await ro(o,{yes:n.yes,path:n.path});}catch(n){b.break(),$(n);}});var Hs=z.object({cwd:z.string(),silent:z.boolean()}),co=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=Hs.parse({cwd:te__default.resolve(t.cwd),silent:t.silent}),n=e.length>0?e:await qs({silent:r.silent});await Ks(n,r.cwd,{silent:r.silent});}catch(r){b.break(),$(r);}});function Ys(e){let[t,...r]=e.split("="),n=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${a.info(t)}. Registry names must start with @ (e.g., @acme).`);return {namespace:t,url:n}}function or(e,t,r){return `${e} ${e===1?t:r}`}async function Ks(e,t,r){let n=te__default.resolve(t,"components.json");if(!A.existsSync(n))throw new Error(`No ${a.info("components.json")} found. Run ${a.info("shadcn init")} first.`);let i=e.map(Ys),o=i.filter(g=>!g.url),s=[];if(o.length>0){let g=w("Fetching registries.",{silent:r.silent}).start(),w$1=await ma();if(!w$1)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),s=w$1;}let c={};for(let{namespace:g,url:w}of i){if(g in d){b.warn(`${a.info(g)} is a built-in registry and cannot be added.`);continue}if(w){if(!w.includes("{name}"))throw new Error(`Invalid registry URL for ${a.info(g)}. URL must include {name} placeholder. Example: ${a.info(`${g}=https://example.com/r/{name}.json`)}`);c[g]=w;}else {let x=s.find(v=>v.name===g);if(!x)throw new Error(`Registry ${a.info(g)} not found. Provide a URL: ${a.info(`${g}=https://.../{name}.json`)}`);c[g]=x.url;}}if(Object.keys(c).length===0)return {addedRegistries:[]};let a$1=await A.readJson(n),f=a$1.registries||{},l={},m=[];for(let[g,w]of Object.entries(c))f[g]?m.push(g):l[g]=w;if(Object.keys(l).length===0){if(m.length>0&&!r.silent){w(`Skipped ${or(m.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let g of m)b.log(` - ${g}`);}else r.silent||b.info("No new registries to add.");return}let d$1={...a$1,registries:{...f,...l}},h=w("Updating components.json.",{silent:r.silent}).start();if(await A.writeJson(n,d$1,{spaces:2}),h.succeed(),!r.silent){let g=Object.keys(l);w(`Added ${or(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let w of g)b.log(` - ${w}`);if(m.length>0){w(`Skipped ${or(m.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let w of m)b.log(` - ${w}`);}}}async function qs(e){let t=w("Fetching registries.",{silent:e.silent}).start(),r=await ma();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let n=[...r].sort((o,s)=>o.name.localeCompare(s.name)),{selected:i}=await pe({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:n.map(o=>({title:o.name,description:o.description,value:o.name}))});return i?.length||(b.warn("No registries selected. Exiting."),b.info(""),process.exit(1)),i}var lo=new Command().name("registry").description("manage registries").addCommand(co);var Qs=z.object({cwd:z.string(),query:z.string().optional(),limit:z.number().optional(),offset:z.number().optional()}),mo=new Command().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry names or urls to search items from. Names must be prefixed with @.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-l, --limit <number>","maximum number of items to display per registry","100").option("-o, --offset <number>","number of items to skip","0").action(async(e,t)=>{try{let r=Qs.parse({cwd:te__default.resolve(t.cwd),query:t.query,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});await X(r.cwd);let n=T({style:"new-york",resolvedPaths:{cwd:r.cwd}}),i=U$1(n),o=te__default.resolve(r.cwd,"components.json");if(A.existsSync(o)){let l=await A.readJson(o),m=c.partial().parse(l);i=U$1({...n,...m});}let s=i;try{let l=await N(r.cwd);l&&(s=U$1(l));}catch{}let{config:c$1,newRegistries:a}=await _(e.map(l=>`${l}/registry`),s,{silent:!0,writeFile:!1});a.length>0&&(s.registries=c$1.registries),W(e,s);let f=await va(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(f,null,2)),process.exit(0);}catch(r){$(r);}finally{V();}});var ta=z.object({cwd:z.string()}),yo=new Command().name("view").description("view items from the registry").argument("<items...>","the item names or URLs to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=ta.parse({cwd:te__default.resolve(t.cwd)});await X(r.cwd);let n=U$1({}),i=te__default.resolve(r.cwd,"components.json");if(A.existsSync(i)){let f=await A.readJson(i),l=c.partial().parse(f);n=U$1(l);}let o=n;try{let f=await N(r.cwd);f&&(o=U$1(f));}catch{}let{config:s,newRegistries:c$1}=await _(e,o,{silent:!0,writeFile:!1});c$1.length>0&&(o.registries=s.registries),W(e,o);let a=await ba(e,{config:o});console.log(JSON.stringify(a,null,2)),process.exit(0);}catch(r){$(r);}finally{V();}});var wo={version:"4.0.6"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function oa(){let e=new Command().name("shadcn").description("build your component library").version(wo.version,"-v, --version","display the version number");e.addCommand(Sn).addCommand(_n).addCommand(Jn).addCommand(Gn).addCommand(yo).addCommand(mo).addCommand(so).addCommand(Kn).addCommand(Bn).addCommand(Xt).addCommand(lo),e.parse();}oa();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shadcn",
3
- "version": "4.0.5",
3
+ "version": "4.0.6",
4
4
  "description": "Add components to your apps.",
5
5
  "publishConfig": {
6
6
  "access": "public"