shadcn 4.3.0 → 4.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,50 +1,50 @@
1
1
  #!/usr/bin/env node
2
- import {b as b$1,a as a$2}from'./chunk-C7EWIKNS.js';import {r,q}from'./chunk-XEZLDAV3.js';import {b,a,G as G$1,ra as ra$1,ua as ua$1,c as c$1,$,V,sa,N,O,w,d,P,M as M$1,fa as fa$1,ha as ha$1,K,L,I,J as J$1,ta as ta$1,T as T$1,ba,H as H$1,e,ea,S,ka as ka$1,ia,la,B as B$1,x,y,A,z as z$2,ma as ma$1,U,W,va,_,X,na as na$1,ga,qa,q as q$1,Z,k,R,Y as Y$1,Q,D as D$1,E,F,s,C,r as r$1,t,v,u}from'./chunk-BT5UJFAL.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-BT5UJFAL.js';import {c,o,n}from'./chunk-HW2MEAJZ.js';import {a as a$1,c as c$2,g,d as d$1,f,e as e$1}from'./chunk-WLJDV6SE.js';import {a as a$3}from'./chunk-CHWMSXYA.js';import*as oe from'path';import oe__default,{join}from'path';import {promises,existsSync}from'fs';import br from'fast-glob';import T from'fs-extra';import _o from'open';import he from'prompts';import bn from'dedent';import Mo,{tmpdir}from'os';import {execa}from'execa';import k$1 from'postcss';import Yo from'postcss/lib/at-rule';import hr,{z as z$1}from'zod';import {twMerge}from'tailwind-merge';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import wn from'deepmerge';import {Command}from'commander';import {diffLines,structuredPatch,diffWords}from'diff';import {dim,yellow,bold,green,cyan,red}from'kleur/colors';import*as je from'fs/promises';import je__default from'fs/promises';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';var No=["next.config.*","vite.config.*","astro.config.*","remix.config.*","nuxt.config.*","svelte.config.*","gatsby-config.*","angular.json"];async function J(e){if(T.existsSync(oe__default.resolve(e,"pnpm-workspace.yaml")))return true;let t=oe__default.resolve(e,"package.json");if(T.existsSync(t))try{if((await T.readJson(t)).workspaces)return !0}catch{}return !!(T.existsSync(oe__default.resolve(e,"lerna.json"))||T.existsSync(oe__default.resolve(e,"nx.json")))}async function G(e){let t=await Ao(e);if(!t.length)return [];let r=await br(t,{cwd:e,onlyDirectories:true,ignore:["**/node_modules/**"]}),n=[];for(let i of r){let o=oe__default.resolve(e,i);if(!T.existsSync(oe__default.resolve(o,"package.json")))continue;let s=T.existsSync(oe__default.resolve(o,"components.json")),c=No.some(a=>br.sync(a,{cwd:o,dot:true}).length>0);(s||c)&&n.push({name:i,hasConfig:s});}return n}function H(e,t,r){let n=r?.cwdFlag??"-c";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(n)} flag:`),b.break();for(let i of t)b.log(` shadcn ${e} ${n} ${i.name}`);b.break();}async function Ao(e){let t=[],r=oe__default.resolve(e,"pnpm-workspace.yaml");if(T.existsSync(r)){let i=await T.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=oe__default.resolve(e,"package.json");if(T.existsSync(n))try{let i=await T.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 rn(e){let t={};if(!T.existsSync(e.cwd)||!T.existsSync(oe__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=w("Preflight checks.",{silent:e.silent}).start();T.existsSync(oe__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$1(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 J(e.cwd)){let p=await G(e.cwd);p.length>0&&(H("init",p),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$2}from'./chunk-KJ7WG52C.js';import {r,q}from'./chunk-XEZLDAV3.js';import {b,a,G as G$1,ra as ra$1,ua as ua$1,c as c$1,$,V,sa,N,O,w,d,P,M as M$1,fa as fa$1,ha as ha$1,K,L,I,J as J$1,ta as ta$1,T as T$1,ba,H as H$1,e,ea,S,ka as ka$1,ia,la,B as B$1,x,y,A,z as z$2,ma as ma$1,U,W,va,_,X,na as na$1,ga,qa,q as q$1,Z,k,R,Y as Y$1,Q,D as D$1,E,F,s,C,r as r$1,t,v,u}from'./chunk-42UQOK2K.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-42UQOK2K.js';import {c,o,n}from'./chunk-HW2MEAJZ.js';import {a as a$1,c as c$2,g,d as d$1,f,e as e$1}from'./chunk-WLJDV6SE.js';import {a as a$3}from'./chunk-CHWMSXYA.js';import*as ie from'path';import ie__default,{join}from'path';import {promises,existsSync}from'fs';import br from'fast-glob';import T from'fs-extra';import _o from'open';import ye from'prompts';import bn from'dedent';import Mo,{tmpdir}from'os';import {execa}from'execa';import $$1 from'postcss';import Yo from'postcss/lib/at-rule';import hr,{z as z$1}from'zod';import {twMerge}from'tailwind-merge';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import wn from'deepmerge';import {Command}from'commander';import {diffLines,structuredPatch,diffWords}from'diff';import {dim,yellow,bold,green,cyan,red}from'kleur/colors';import*as Ee from'fs/promises';import Ee__default from'fs/promises';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';var No=["next.config.*","vite.config.*","astro.config.*","remix.config.*","nuxt.config.*","svelte.config.*","gatsby-config.*","angular.json"];async function J(e){if(T.existsSync(ie__default.resolve(e,"pnpm-workspace.yaml")))return true;let t=ie__default.resolve(e,"package.json");if(T.existsSync(t))try{if((await T.readJson(t)).workspaces)return !0}catch{}return !!(T.existsSync(ie__default.resolve(e,"lerna.json"))||T.existsSync(ie__default.resolve(e,"nx.json")))}async function G(e){let t=await Ao(e);if(!t.length)return [];let r=await br(t,{cwd:e,onlyDirectories:true,ignore:["**/node_modules/**"]}),n=[];for(let i of r){let o=ie__default.resolve(e,i);if(!T.existsSync(ie__default.resolve(o,"package.json")))continue;let s=T.existsSync(ie__default.resolve(o,"components.json")),c=No.some(a=>br.sync(a,{cwd:o,dot:true}).length>0);(s||c)&&n.push({name:i,hasConfig:s});}return n}function H(e,t,r){let n=r?.cwdFlag??"-c";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(n)} flag:`),b.break();for(let i of t)b.log(` shadcn ${e} ${n} ${i.name}`);b.break();}async function Ao(e){let t=[],r=ie__default.resolve(e,"pnpm-workspace.yaml");if(T.existsSync(r)){let i=await T.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=ie__default.resolve(e,"package.json");if(T.existsSync(n))try{let i=await T.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 rn(e){let t={};if(!T.existsSync(e.cwd)||!T.existsSync(ie__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=w("Preflight checks.",{silent:e.silent}).start();T.existsSync(ie__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$1(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 J(e.cwd)){let f=await G(e.cwd);f.length>0&&(H("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 nn(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:p}=q$1(a);p&&!d[p]&&r.add(p),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 M(e,t,r={}){r={silent:false,writeFile:true,...r};let i=(await nn(e,t)).filter(p=>!t.registries?.[p]&&!Object.keys(d).includes(p));if(i.length===0)return {config:t,newRegistries:[]};let o=await na$1({useCache:process.env.NODE_ENV!=="development"});if(!o)return {config:t,newRegistries:[]};let s={};for(let p of i)o[p]&&(s[p]=o[p]);if(Object.keys(s).length===0)return {config:t,newRegistries:[]};let c$1=Object.fromEntries(Object.entries(t.registries||{}).filter(([p])=>!Object.keys(d).includes(p))),a={...t,registries:{...c$1,...s}};if(r.writeFile){let{resolvedPaths:p,...l}=a,d=w("Updating components.json.",{silent:r.silent}).start(),m=c.parse(l);await T.writeFile(oe__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(m,null,2)+`
6
- `,"utf-8"),d.succeed();}return {config:a,newRegistries:Object.keys(s)}}var le={nova:{title:"Nova",description:"Lucide / Geist",style:"nova",baseColor:"neutral",theme:"neutral",iconLibrary:"lucide",font:"geist",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},vega:{title:"Vega",description:"Lucide / Inter",style:"vega",baseColor:"neutral",theme:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},maia:{title:"Maia",description:"Hugeicons / Figtree",style:"maia",baseColor:"neutral",theme:"neutral",iconLibrary:"hugeicons",font:"figtree",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},lyra:{title:"Lyra",description:"Phosphor / JetBrains Mono",style:"lyra",baseColor:"neutral",theme:"neutral",iconLibrary:"phosphor",font:"jetbrains-mono",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},mira:{title:"Mira",description:"Hugeicons / Inter",style:"mira",baseColor:"neutral",theme:"neutral",iconLibrary:"hugeicons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},luma:{title:"Luma",description:"Lucide / Inter",style:"luma",baseColor:"neutral",theme:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},sera:{title:"Sera",description:"Lucide / Noto Sans + Playfair Display",style:"sera",baseColor:"taupe",theme:"taupe",iconLibrary:"lucide",font:"noto-sans",fontHeading:"playfair-display",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false}};function er(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()}async function tr(e){if(b.break(),b.log(` Build your custom preset on ${a.info(e.createUrl)}`),b.log(` ${e.followUp}`),b.break(),e.prompt===false)return;let{proceed:t}=await he({type:"confirm",name:"proceed",message:"Open in browser?",initial:true});t&&await _o(e.createUrl);}function fe(e,t){let r=new URLSearchParams({base:e.base,style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,font:e.font,rtl:String(e.rtl??false),menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return e.chartColor&&r.set("chartColor",e.chartColor),e.fontHeading&&e.fontHeading!=="inherit"&&r.set("fontHeading",e.fontHeading),t?.preset&&r.set("preset",t.preset),t?.template&&r.set("template",t.template),r.set("track","1"),`${c$1}/init?${r.toString()}`}async function De(){let{base:e}=await he({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 Ke(e){let t=Object.entries(le),{selectedPreset:r}=await he({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=er({command:"init",rtl:e.rtl,base:e.base,...e.template&&{template:e.template}});await tr({createUrl:i,followUp:`Then ${a.info("copy and run the command")} from ui.shadcn.com.`}),process.exit(0);}let n=le[r];return n||process.exit(1),{url:fe({...n,base:e.base,rtl:e.rtl},{template:e.template}),base:e.base}}async function Ce(e,t,r){let n=U(T$1({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:i}=await M([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(Vo(e)){let a=new URL(e);a.searchParams.delete("track"),c=a.toString();}return {registryBaseConfig:s,installStyleIndex:o?.extends!=="none",url:c}}function Vo(e){try{return new URL(e).pathname==="/init"&&e.startsWith(c$1)}catch{return false}}var Uo=process.env.SHADCN_GITHUB_URL??"https://github.com/shadcn-ui/ui.git";function B(e){return {...e,frameworks:e.frameworks??[],scaffold:e.scaffold??sn({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??Jo}}function Se(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=sn({title:e.title,templateDir:r.templateDir}),n}function Wo(e){switch(e){case "pnpm":return ["--no-frozen-lockfile"];default:return []}}async function Bo(e,t){if(t==="pnpm")return;let r=oe__default.join(e,"pnpm-workspace.yaml"),n=oe__default.join(e,"package.json"),i=oe__default.join(e,"pnpm-lock.yaml");T.existsSync(i)&&await T.remove(i);let o=T.existsSync(r);if(T.existsSync(n)){let s=await T.readFile(n,"utf8"),c=JSON.parse(s);if(o?c.packageManager=await zo(t):delete c.packageManager,o){let a=await T.readFile(r,"utf8"),p=[];for(let l of a.split(`
7
- `)){let d=l.match(/^\s*-\s*["']?(.+?)["']?\s*$/);d&&p.push(d[1]);}c.workspaces=p,await T.remove(r);}await T.writeFile(n,JSON.stringify(c,null,2)+`
8
- `);}o&&t==="npm"&&await on(e);}async function zo(e){try{let{stdout:t}=await execa(e,["--version"]);return `${e}@${t.trim()}`}catch{return `${e}@*`}}async function on(e){let t=await T.readdir(e,{withFileTypes:true});for(let r of t){if(r.name==="node_modules")continue;let n=oe__default.join(e,r.name);if(r.isDirectory())await on(n);else if(r.name==="package.json"){let i=await T.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[p,l]of Object.entries(a))typeof l=="string"&&l.startsWith("workspace:")&&(a[p]="*",s=true);}s&&await T.writeFile(n,JSON.stringify(o,null,2)+`
9
- `);}}}function sn({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 p=oe__default.resolve(o,t);await T.copy(p,r,{filter:l=>!l.includes("node_modules")});}else {let p=oe__default.join(Mo.tmpdir(),`shadcn-template-${Date.now()}`);await execa("git",["clone","--depth","1","--filter=blob:none","--sparse",Uo,p]),await execa("git",["-C",p,"sparse-checkout","set",`templates/${t}`]);let l=oe__default.resolve(p,"templates",t);await T.move(l,r),await T.remove(p);}await Bo(r,n);let c=["install",...Wo(n)];await execa(n,c,{cwd:r});let a=oe__default.join(r,"package.json");if(T.existsSync(a)){let p=await T.readFile(a,"utf8"),l=JSON.parse(p);l.name=oe__default.basename(r),await T.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 Jo({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{}}var an={"--font-heading":"cn-font-heading"};function Go(e){return e.startsWith("--")?e:`--${e}`}function ke(e){let t=new Set;for(let r of e){for(let n of r.fonts??[]){let i=n.font?.variable;if(!i)continue;let o=an[i];o&&t.add(o);}for(let n of Object.values(r.cssVars??{}))for(let i of Object.keys(n??{})){let o=an[Go(i)];o&&t.add(o);}}return Array.from(t)}function cn(e,t){if(e.includes("\0"))return false;let r;try{r=e;let m="";for(;r!==m&&r.includes("%");)m=r,r=decodeURIComponent(r);}catch{return false}let n=oe__default.normalize(r.replace(/\\/g,"/")),i=oe__default.normalize(t),o=m=>m.replace(/\[\.\.\..*?\]/g,"").includes("..");if(o(n)||o(r)||o(e))return false;let s=m=>m.replace(/\[\.\.\..*?\]/g,""),c=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(m=>m.test(c)||m.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(oe__default.isAbsolute(n))return n.startsWith(i+oe__default.sep);let d=oe__default.resolve(i,n);return d.startsWith(i+oe__default.sep)||d===i}async function It(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=oe__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 qe(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 qe(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=[Ko(t)];n.cleanupDefaultNextStyles&&i.push(pn()),n.tailwindVersion==="v4"&&(i=[],i.push(Qo({params:"dark (&:is(.dark *))"})),n.cleanupDefaultNextStyles&&i.push(pn()),i.push(Xo(t,{overwriteCssVars:n.overwriteCssVars})),i.push(Zo(t)),n.tailwindConfig&&(i.push(ei(n.tailwindConfig)),i.push(ri(n.tailwindConfig)),i.push(ti(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 Ko(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 Yo||(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}`;qo(r,o,i);});}}}function fn(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 pn(){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()),fn(e);let r=e.nodes.find(n=>n.type==="atrule"&&n.params==="(prefers-color-scheme: dark)");r&&(fn(r),r.nodes.length===0&&r.remove());}}}function qo(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(p=>p.type==="decl"&&p.prop===s);a?a.replaceWith(c):n?.append(c);});}function Xo(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=Pt(r);Object.entries(i).forEach(([a,p])=>{let l=`--${a.replace(/^--/,"")}`,d=k$1.decl({prop:l,value:p,raws:{semicolon:true}}),m=c?.nodes?.find(h=>h.type==="decl"&&h.prop===l);t.overwriteCssVars?m?m.replaceWith(d):c?.append(d):m||c?.append(d);});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 p=`--${c.replace(/^--/,"")}`;p==="--sidebar-background"&&(p="--sidebar"),mn(a)&&(a=`hsl(${a})`);let l=k$1.decl({prop:p,value:a,raws:{semicolon:true}}),d=s?.nodes.find(m=>m.type==="decl"&&m.prop===p);t.overwriteCssVars?d?d.replaceWith(l):s?.append(l):d||s?.append(l);});});}}}function Zo(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=Pt(t),i=n.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--"));for(let o of r){let s=Object.values(e).find(d=>d[o])?.[o];if(!s)continue;if(o==="radius"){let d={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[m,h]of Object.entries(d)){let g=k$1.decl({prop:`--radius-${m}`,value:h,raws:{semicolon:true}});n?.nodes?.find(w=>w.type==="decl"&&w.prop===g.prop)||n?.append(g);}continue}let c=mn(s)||oi(s)?`--color-${o.replace(/^--/,"")}`:`--${o.replace(/^--/,"")}`;c==="--color-sidebar-background"&&(c="--color-sidebar");let a=`var(--${o})`;c==="--color-sidebar"&&(a="var(--sidebar)");let p=k$1.decl({prop:c,value:a,raws:{semicolon:true}});n?.nodes?.find(d=>d.type==="decl"&&d.prop===p.prop)||(i?.length?n?.insertAfter(i[i.length-1],p):n?.append(p));}}}}function Pt(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 Qo({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 ei(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let n=ni(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(p=>p.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 ti(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=Pt(t),n=r.nodes?.filter(o=>o.type==="atrule"&&o.name==="keyframes"),i=z$1.record(z$1.string(),z$1.record(z$1.string(),z$1.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(p=>p.type==="atrule"&&p.name==="keyframes"&&p.params===o))continue;let a=k$1.atRule({name:"keyframes",params:o,nodes:[],raws:{semicolon:true,between:" ",before:`
19
- `}});for(let[p,l]of Object.entries(c.data)){let d=k$1.rule({selector:p,nodes:Object.entries(l).map(([m,h])=>k$1.decl({prop:m,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 nn(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 M(e,t,r={}){r={silent:false,writeFile:true,...r};let i=(await nn(e,t)).filter(f=>!t.registries?.[f]&&!Object.keys(d).includes(f));if(i.length===0)return {config:t,newRegistries:[]};let o=await na$1({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,...p}=a,m=w("Updating components.json.",{silent:r.silent}).start(),d=c.parse(p);await T.writeFile(ie__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 fe={nova:{title:"Nova",description:"Lucide / Geist",style:"nova",baseColor:"neutral",theme:"neutral",iconLibrary:"lucide",font:"geist",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},vega:{title:"Vega",description:"Lucide / Inter",style:"vega",baseColor:"neutral",theme:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},maia:{title:"Maia",description:"Hugeicons / Figtree",style:"maia",baseColor:"neutral",theme:"neutral",iconLibrary:"hugeicons",font:"figtree",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},lyra:{title:"Lyra",description:"Phosphor / JetBrains Mono",style:"lyra",baseColor:"neutral",theme:"neutral",iconLibrary:"phosphor",font:"jetbrains-mono",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},mira:{title:"Mira",description:"Hugeicons / Inter",style:"mira",baseColor:"neutral",theme:"neutral",iconLibrary:"hugeicons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},luma:{title:"Luma",description:"Lucide / Inter",style:"luma",baseColor:"neutral",theme:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},sera:{title:"Sera",description:"Lucide / Noto Sans + Playfair Display",style:"sera",baseColor:"taupe",theme:"taupe",iconLibrary:"lucide",font:"noto-sans",fontHeading:"playfair-display",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false}};function er(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()}async function tr(e){if(b.break(),b.log(` Build your custom preset on ${a.info(e.createUrl)}`),b.log(` ${e.followUp}`),b.break(),e.prompt===false)return;let{proceed:t}=await ye({type:"confirm",name:"proceed",message:"Open in browser?",initial:true});t&&await _o(e.createUrl);}function pe(e,t){let r=new URLSearchParams({base:e.base,style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,font:e.font,rtl:String(e.rtl??false),menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return e.chartColor&&r.set("chartColor",e.chartColor),e.fontHeading&&e.fontHeading!=="inherit"&&r.set("fontHeading",e.fontHeading),t?.preset&&r.set("preset",t.preset),t?.template&&r.set("template",t.template),r.set("track","1"),`${c$1}/init?${r.toString()}`}async function Le(){let{base:e}=await ye({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 Ke(e){let t=Object.entries(fe),{selectedPreset:r}=await ye({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=er({command:"init",rtl:e.rtl,base:e.base,...e.template&&{template:e.template}});await tr({createUrl:i,followUp:`Then ${a.info("copy and run the command")} from ui.shadcn.com.`}),process.exit(0);}let n=fe[r];return n||process.exit(1),{url:pe({...n,base:e.base,rtl:e.rtl},{template:e.template}),base:e.base}}async function Re(e,t,r){let n=U(T$1({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:i}=await M([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(Vo(e)){let a=new URL(e);a.searchParams.delete("track"),c=a.toString();}return {registryBaseConfig:s,installStyleIndex:o?.extends!=="none",url:c}}function Vo(e){try{return new URL(e).pathname==="/init"&&e.startsWith(c$1)}catch{return false}}var Uo=process.env.SHADCN_GITHUB_URL??"https://github.com/shadcn-ui/ui.git";function B(e){return {...e,frameworks:e.frameworks??[],scaffold:e.scaffold??sn({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??Jo}}function ke(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=sn({title:e.title,templateDir:r.templateDir}),n}function Wo(e){switch(e){case "pnpm":return ["--no-frozen-lockfile"];default:return []}}async function Bo(e,t){if(t==="pnpm")return;let r=ie__default.join(e,"pnpm-workspace.yaml"),n=ie__default.join(e,"package.json"),i=ie__default.join(e,"pnpm-lock.yaml");T.existsSync(i)&&await T.remove(i);let o=T.existsSync(r);if(T.existsSync(n)){let s=await T.readFile(n,"utf8"),c=JSON.parse(s);if(o?c.packageManager=await zo(t):delete c.packageManager,o){let a=await T.readFile(r,"utf8"),f=[];for(let p of a.split(`
7
+ `)){let m=p.match(/^\s*-\s*["']?(.+?)["']?\s*$/);m&&f.push(m[1]);}c.workspaces=f,await T.remove(r);}await T.writeFile(n,JSON.stringify(c,null,2)+`
8
+ `);}o&&t==="npm"&&await on(e);}async function zo(e){try{let{stdout:t}=await execa(e,["--version"]);return `${e}@${t.trim()}`}catch{return `${e}@*`}}async function on(e){let t=await T.readdir(e,{withFileTypes:true});for(let r of t){if(r.name==="node_modules")continue;let n=ie__default.join(e,r.name);if(r.isDirectory())await on(n);else if(r.name==="package.json"){let i=await T.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,p]of Object.entries(a))typeof p=="string"&&p.startsWith("workspace:")&&(a[f]="*",s=true);}s&&await T.writeFile(n,JSON.stringify(o,null,2)+`
9
+ `);}}}function sn({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=ie__default.resolve(o,t);await T.copy(f,r,{filter:p=>!p.includes("node_modules")});}else {let f=ie__default.join(Mo.tmpdir(),`shadcn-template-${Date.now()}`);await execa("git",["clone","--depth","1","--filter=blob:none","--sparse",Uo,f]),await execa("git",["-C",f,"sparse-checkout","set",`templates/${t}`]);let p=ie__default.resolve(f,"templates",t);await T.move(p,r),await T.remove(f);}await Bo(r,n);let c=["install",...Wo(n)];await execa(n,c,{cwd:r});let a=ie__default.join(r,"package.json");if(T.existsSync(a)){let f=await T.readFile(a,"utf8"),p=JSON.parse(f);p.name=ie__default.basename(r),await T.writeFile(a,JSON.stringify(p,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 Jo({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{}}var an={"--font-heading":"cn-font-heading"};function Go(e){return e.startsWith("--")?e:`--${e}`}function $e(e){let t=new Set;for(let r of e){for(let n of r.fonts??[]){let i=n.font?.variable;if(!i)continue;let o=an[i];o&&t.add(o);}for(let n of Object.values(r.cssVars??{}))for(let i of Object.keys(n??{})){let o=an[Go(i)];o&&t.add(o);}}return Array.from(t)}function cn(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=ie__default.normalize(r.replace(/\\/g,"/")),i=ie__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(ie__default.isAbsolute(n))return n.startsWith(i+ie__default.sep);let m=ie__default.resolve(i,n);return m.startsWith(i+ie__default.sep)||m===i}async function It(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=ie__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 qe(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 qe(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=[Ko(t)];n.cleanupDefaultNextStyles&&i.push(pn()),n.tailwindVersion==="v4"&&(i=[],i.push(Qo({params:"dark (&:is(.dark *))"})),n.cleanupDefaultNextStyles&&i.push(pn()),i.push(Xo(t,{overwriteCssVars:n.overwriteCssVars})),i.push(Zo(t)),n.tailwindConfig&&(i.push(ei(n.tailwindConfig)),i.push(ri(n.tailwindConfig)),i.push(ti(n.tailwindConfig))));let s=(await $$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 Ko(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 Yo||(r=$$1.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
13
+ `,between:" "}}),t.append(r),t.insertBefore(r,$$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([n,i])=>{let o=n==="light"?":root":`.${n}`;qo(r,o,i);});}}}function fn(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 pn(){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()),fn(e);let r=e.nodes.find(n=>n.type==="atrule"&&n.params==="(prefers-color-scheme: dark)");r&&(fn(r),r.nodes.length===0&&r.remove());}}}function qo(e,t,r){let n=e.nodes?.find(i=>i.type==="rule"&&i.selector===t);n||Object.keys(r).length>0&&(n=$$1.rule({selector:t,raws:{between:" ",before:`
14
+ `}}),e.append(n)),Object.entries(r).forEach(([i,o])=>{let s=`--${i.replace(/^--/,"")}`,c=$$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 Xo(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=Pt(r);Object.entries(i).forEach(([a,f])=>{let p=`--${a.replace(/^--/,"")}`,m=$$1.decl({prop:p,value:f,raws:{semicolon:true}}),d=c?.nodes?.find(h=>h.type==="decl"&&h.prop===p);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=$$1.rule({selector:o,nodes:[],raws:{semicolon:true,between:" ",before:`
15
+ `}}),r.append(s),r.insertBefore(s,$$1.comment({text:"---break---"}))),Object.entries(i).forEach(([c,a])=>{let f=`--${c.replace(/^--/,"")}`;f==="--sidebar-background"&&(f="--sidebar"),mn(a)&&(a=`hsl(${a})`);let p=$$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(p):s?.append(p):m||s?.append(p);});});}}}function Zo(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=Pt(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=$$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=mn(s)||oi(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=$$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 Pt(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=$$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
16
+ `}}),e.append(t),e.insertBefore(t,$$1.comment({text:"---break---"}))),t}function Qo({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=$$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,$$1.comment({text:"---break---"}));}}}}function ei(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let n=ni(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=$$1.atRule({name:"plugin",params:`${n}${c}${n}`,raws:{semicolon:true,before:`
18
+ `}});t.insertAfter(o,a),t.insertBefore(a,$$1.comment({text:"---break---"}));}}}}function ti(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=Pt(t),n=r.nodes?.filter(o=>o.type==="atrule"&&o.name==="keyframes"),i=z$1.record(z$1.string(),z$1.record(z$1.string(),z$1.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=$$1.atRule({name:"keyframes",params:o,nodes:[],raws:{semicolon:true,between:" ",before:`
19
+ `}});for(let[f,p]of Object.entries(c.data)){let m=$$1.rule({selector:f,nodes:Object.entries(p).map(([d,h])=>$$1.decl({prop:d,value:h,raws:{semicolon:true,before:`
20
20
  `,between:": "}})),raws:{semicolon:true,between:" ",before:`
21
- `}});a.append(d);}r.append(a),r.insertBefore(a,k$1.comment({text:"---break---"}));}}}}function ri(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Pt(t),n=r.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--animate-")),i=z$1.record(z$1.string(),z$1.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(p=>p.prop===c))continue;let a=k$1.decl({prop:c,value:s,raws:{semicolon:true,between:": ",before:`
22
- `}});r.append(a);}}}}function ni(e){return e.nodes[0].toString().includes("'")?"single":"double"}function mn(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 oi(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function Xe(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=oe__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 qe(a$1,r.cssVars,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars})),n&&(a$1=await rr(a$1,e)),await promises.writeFile(o,a$1,"utf8"),c.succeed();}async function rr(e,t){let r=[ai(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 ai(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}}),p=t.nodes?.filter(l=>l.type==="atrule"&&l.name==="import");if(p&&p.length>0){let l=p[p.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
- `}}),d=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="import"),m=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="plugin");if(m&&m.length>0){let h=m[m.length-1];t.insertAfter(h,l);}else if(d&&d.length>0){let h=d[d.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),p;if(a?(p=k$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
28
- `}}),a.replaceWith(p)):(p=k$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
29
- `}}),c.append(p)),typeof n=="object")for(let[l,d]of Object.entries(n))$e(p,l,d);}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,p]of Object.entries(n))if(typeof p=="string"){let l=c.nodes?.find(m=>m.type==="decl"&&m.prop===a),d=k$1.decl({prop:a,value:p,raws:{semicolon:true,before:`
30
- `}});l?l.replaceWith(d):c.append(d);}else if(a.startsWith("@")&&typeof p=="object"&&p!==null&&Object.keys(p).length===0){let l=a.match(/@([a-zA-Z-]+)\s*(.*)/);if(l){let[,d,m]=l;if(!c.nodes?.find(g=>g.type==="atrule"&&g.name===d&&g.params===m)){let g=k$1.atRule({name:d,params:m,raws:{semicolon:true,before:`
31
- `}});c.append(g);}}}else typeof p=="object"&&$e(c,a,p);}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[p,l]of Object.entries(n))if(typeof l=="string"){let d=k$1.decl({prop:p,value:l,raws:{semicolon:true,before:`
33
- `}});a.append(d);}else if(p.startsWith("@")&&typeof l=="object"&&l!==null&&Object.keys(l).length===0){let d=p.match(/@([a-zA-Z-]+)\s*(.*)/);if(d){let[,m,h]=d;if(!a.nodes?.find(w=>w.type==="atrule"&&w.name===m&&w.params===h)){let w=k$1.atRule({name:m,params:h,raws:{semicolon:true,before:`
34
- `}});a.append(w);}}}else typeof l=="object"&&$e(a,p,l);}}else o==="property"?$e(t,r,n):un(t,o,s,n);}else $e(t,r,n);}}}function un(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,p]=c;un(i,a,p,s);}}else $e(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:`
36
- `}});s.nodes.forEach(a=>{if(a.type==="decl"){let p=a.clone();p.raws.before=`
37
- `,c.append(p);}}),c.nodes?.length&&i.append(c);}}catch(o){throw console.error("Error parsing at-rule content:",n,o),o}}function $e(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 d=n.nodes?.find(m=>m.type==="atrule"&&m.name==="apply");if(d){d.params=twMerge(d.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;$e(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=`
21
+ `}});a.append(m);}r.append(a),r.insertBefore(a,$$1.comment({text:"---break---"}));}}}}function ri(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Pt(t),n=r.nodes?.filter(o=>o.type==="decl"&&o.prop.startsWith("--animate-")),i=z$1.record(z$1.string(),z$1.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=$$1.decl({prop:c,value:s,raws:{semicolon:true,between:": ",before:`
22
+ `}});r.append(a);}}}}function ni(e){return e.nodes[0].toString().includes("'")?"single":"double"}function mn(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 oi(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function Xe(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=ie__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 qe(a$1,r.cssVars,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars})),n&&(a$1=await rr(a$1,e)),await promises.writeFile(o,a$1,"utf8"),c.succeed();}async function rr(e,t){let r=[ai(t)],n=await $$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 ai(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=$$1.atRule({name:"import",params:s,raws:{semicolon:true}}),f=t.nodes?.filter(p=>p.type==="atrule"&&p.name==="import");if(f&&f.length>0){let p=f[f.length-1];a.raws.before=`
25
+ `,t.insertAfter(p,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=p=>p.startsWith('"')&&p.endsWith('"')||p.startsWith("'")&&p.endsWith("'")?p.slice(1,-1):p;if(!t.nodes?.find(p=>p.type!=="atrule"||p.name!=="plugin"?false:a(p.params)===a(s))){let p=$$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,p);}else if(m&&m.length>0){let h=m[m.length-1];t.insertAfter(h,p),t.insertBefore(p,$$1.comment({text:"---break---"})),t.insertAfter(p,$$1.comment({text:"---break---"}));}else t.prepend(p),t.insertBefore(p,$$1.comment({text:"---break---"})),t.insertAfter(p,$$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=$$1.atRule({name:o,params:s,raws:{semicolon:true}});t.append(a),t.insertBefore(a,$$1.comment({text:"---break---"}));}}else if(o==="keyframes"){let c=t.nodes?.find(p=>p.type==="atrule"&&p.name==="theme"&&p.params==="inline");c||(c=$$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
27
+ `}}),t.append(c),t.insertBefore(c,$$1.comment({text:"---break---"})));let a=c.nodes?.find(p=>p.type==="atrule"&&p.name==="keyframes"&&p.params===s),f;if(a?(f=$$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
28
+ `}}),a.replaceWith(f)):(f=$$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
29
+ `}}),c.append(f)),typeof n=="object")for(let[p,m]of Object.entries(n))Ie(f,p,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 p=c.nodes?.find(d=>d.type==="decl"&&d.prop===a),m=$$1.decl({prop:a,value:f,raws:{semicolon:true,before:`
30
+ `}});p?p.replaceWith(m):c.append(m);}else if(a.startsWith("@")&&typeof f=="object"&&f!==null&&Object.keys(f).length===0){let p=a.match(/@([a-zA-Z-]+)\s*(.*)/);if(p){let[,m,d]=p;if(!c.nodes?.find(g=>g.type==="atrule"&&g.name===m&&g.params===d)){let g=$$1.atRule({name:m,params:d,raws:{semicolon:true,before:`
31
+ `}});c.append(g);}}}else typeof f=="object"&&Ie(c,a,f);}else {let a=$$1.atRule({name:o,params:s,raws:{semicolon:true,between:" ",before:`
32
+ `}});if(t.append(a),t.insertBefore(a,$$1.comment({text:"---break---"})),typeof n=="object")for(let[f,p]of Object.entries(n))if(typeof p=="string"){let m=$$1.decl({prop:f,value:p,raws:{semicolon:true,before:`
33
+ `}});a.append(m);}else if(f.startsWith("@")&&typeof p=="object"&&p!==null&&Object.keys(p).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=$$1.atRule({name:d,params:h,raws:{semicolon:true,before:`
34
+ `}});a.append(w);}}}else typeof p=="object"&&Ie(a,f,p);}}else o==="property"?Ie(t,r,n):un(t,o,s,n);}else Ie(t,r,n);}}}function un(e,t,r,n){let i=e.nodes?.find(o=>o.type==="atrule"&&o.name===t&&o.params===r);if(i||(i=$$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
35
+ `}}),e.append(i),e.insertBefore(i,$$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;un(i,a,f,s);}}else Ie(i,o,s);else if(typeof n=="string")try{let s=$$1.parse(`.temp{${n}}`).first;if(s&&s.nodes){let c=$$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
36
+ `}});s.nodes.forEach(a=>{if(a.type==="decl"){let f=a.clone();f.raws.before=`
37
+ `,c.append(f);}}),c.nodes?.length&&i.append(c);}}catch(o){throw console.error("Error parsing at-rule content:",n,o),o}}function Ie(e,t,r){let n=e.nodes?.find(i=>i.type==="rule"&&i.selector===t);if(n||(n=$$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(p=>p.type==="atrule"&&p.name===c&&p.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 p=$$1.atRule({name:c,params:a,raws:{semicolon:true,before:`
39
+ `}});n.append(p);}}}else if(typeof o=="string"){let s=$$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;Ie(e,s,o);}}else if(typeof r=="string")try{let o=$$1.parse(`.temp{${r}}`).first;o&&o.nodes&&o.nodes.forEach(s=>{if(s.type==="decl"){let c=s.clone();c.raws.before=`
41
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 fi(r),s="";if(li(r)&&o==="npm")if(n.silent)s="force";else {i.stopAndPersist(),b.warn(`
42
42
  It looks like you are using React 19.
43
43
  Some packages may fail to install due to peer dependency issues in npm (see ${c$1}/react-19).
44
- `);let c=await he([{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 pi(o,e,t,r.resolvedPaths.cwd,s),i?.succeed();}function li(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 fi(e){return qa(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$2(e.resolvedPaths.cwd)}async function pi(e,t,r,n,i){if(e==="npm")return mi(t,r,n,i);if(e==="deno")return di(t,r,n);if(e==="expo")return ui(t,r,n);t?.length&&await execa(e,["add",...t],{cwd:n}),r?.length&&await execa(e,["add","-D",...r],{cwd:n});}async function mi(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 di(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 ui(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 or(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=oe__default.join(i,".env.local"),s=t(i);s&&(o=s);let c=existsSync(o),a$1=oe__default.basename(o),p=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
45
- `),l=[],d=null,m=null;if(c){let h=await promises.readFile(o,"utf-8"),g=v(h,p);if(l=u(h,p),l.length>0){if(await promises.writeFile(o,g,"utf-8"),d=oe__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,p+`
46
- `,"utf-8"),m=oe__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:d,envFileCreated:m}}var vi=new Set(["--font-sans","--font-serif","--font-mono"]);async function Qe(e,t){if(!e.fonts?.length)return e;let r=await ra$1(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 o=i.name.replace("font-",""),s=i.font.dependency??`@fontsource-variable/${o}`;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??$i(o.font.variable);if(!s)continue;let 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(p=>p.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 et(e,t,r){if(!e?.length)return;let n=await ra$1(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 Ci(e,t,n),i?.succeed("Updating fonts.");}catch(o){throw i?.fail("Failed to update fonts."),o}}async function Ci(e,t,r){let n=await Ri(t,r);if(!n)return;let i=await promises.readFile(n,"utf-8"),o=await Si(i,e,t);o!==i&&await promises.writeFile(n,o,"utf-8");}async function Ri(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=oe__default.join(r,c);if(existsSync(a))return a}return null}async function Si(e,t,r){let i=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),o=t.filter(d=>d.font.provider==="google"),s=[],c=[];for(let d of o){let m=d.font.import;if(!m)continue;let h=i.getImportDeclaration(v=>v.getModuleSpecifierValue()==="next/font/google"),g=false;h?(g=h.getNamedImports().some($=>$.getName()===m),g||h.addNamedImport(m)):i.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[m]});let w=Pi(m,d.font.variable),C=ki(d),b=Fi(i,d.font.variable),j=w;if(!(g&&!b&&Et(d.font.variable)&&!Oi(i,m))){if(b)b.setInitializer(`${m}(${C})`),b.getName()!==w&&b.rename(w),j=w;else {let v=Ni(i);i.insertVariableStatement(v,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:w,initializer:`${m}(${C})`}]}).appendWhitespace(`
47
- `);}s.push(j),Ii(d)&&c.push(d.font.variable.replace("--",""));}}let a=new Set(["font-sans","font-serif","font-mono"]),p=[...c].reverse().find(d=>a.has(d)),l=c.filter(d=>!a.has(d));return p&&l.unshift(p),s.length>0&&Ai(i,s,l,r),i.getFullText()}function ki(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 Et(e){return vi.has(e)}function $i(e){return Et(e)?"html":null}function Ii(e){return !e.font.selector&&Et(e.font.variable)}function Pi(e,t){let r=ji(e);return Et(t)?r:`${r}${Ei(t.replace(/^--font-/,""))}`}function ji(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Ei(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Fi(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 Oi(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 s=o;if(s.getExpression().getText()!==t)continue;let c=s.getArguments();if(!c.length)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes("--font-heading"))return true}return false}function Ni(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Ai(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`),p=[...c,...a],l=o.getAttribute("className");if(!l){Ze(e,n),o.addAttribute({name:"className",initializer:`{cn(${p.join(", ")})}`});return}if(l.getKind()!==SyntaxKind.JsxAttribute)return;let d=l.asKindOrThrow(SyntaxKind.JsxAttribute),m=d.getInitializer();if(!m)return;if(m.getKind()===SyntaxKind.StringLiteral){let h=m.getText().slice(1,-1);Ze(e,n),d.setInitializer(`{cn("${h}", ${p.join(", ")})}`);}else if(m.getKind()===SyntaxKind.JsxExpression){let h=m.asKindOrThrow(SyntaxKind.JsxExpression),g=h.getExpression();if(!g)return;let w=g.getText();if(w.startsWith("cn(")){let C=a.every(R=>w.includes(R)),b=r.every(R=>w.includes(`"${R}"`)),j=["font-sans","font-serif","font-mono"].filter(R=>!r.includes(R)).some(R=>w.includes(`"${R}"`));if(C&&b&&!j)continue;let v=Di(w,a);v=Li(v);let $=_i(v,p);h.replaceWithText(`{${$}}`);}else if(/^\w+\.variable$/.test(w)){if(a.includes(w)&&r.length===0)continue;Ze(e,n);let b=(w.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(b?`{cn(${w}, ${p.join(", ")})}`:`{cn(${p.join(", ")})}`);}else if(w.startsWith("`")&&w.endsWith("`")){let C=Ti(w);Ze(e,n);let b=new Set(p),j=new Set(["font-sans","font-serif","font-mono"].map($=>`"${$}"`)),v=C.filter($=>!b.has($)&&!j.has($));h.replaceWithText(`{cn(${[...v,...p].join(", ")})}`);}else Ze(e,n),h.replaceWithText(`{cn(${w}, ${p.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 Ti(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 Di(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 Li(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 _i(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function se(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 Ui(e,t,n,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Mi(e,t,{...r,skipFonts:r.skipFonts})}async function Mi(e,t,r){if(!e.length)return;let n=w("Checking registry.",{silent:r.silent})?.start(),i=await _(e,U(t));if(!i)return n?.fail(),$(new Error("Failed to fetch components from registry."));try{yn(i.files??[],t.resolvedPaths.cwd);}catch(a){return n?.fail(),$(a)}n?.succeed();let o=await ta$1(t);r.skipFonts||(i=await Qe(i,t));let s=ke([i]);await D(i.dependencies,i.devDependencies,t,{silent:r.silent}),await Y$1(i.tailwind?.config,t,{silent:r.silent,tailwindVersion:o}),await or(i.envVars,t,{silent:r.silent}),r.skipFonts||await et(i.fonts,t,{silent:r.silent}),await D$1(i.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let c=i.cssVars?r.overwriteCssVars??await hn(e,t):void 0;await Xe(i.css,t,{silent:r.silent,cssVars:i.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:c,tailwindVersion:o,tailwindConfig:i.tailwind?.config}),i.docs&&b.info(i.docs);}async function Ui(e,t,r,n){if(!e.length)return;let i=w("Checking registry.",{silent:n.silent})?.start(),o=await _(e,U(t));if(!o)return i?.fail(),$(new Error("Failed to fetch components from registry."));try{yn(o.files??[],t.resolvedPaths.cwd);}catch(R){return i?.fail(),$(R)}i?.succeed();let s=[],c=[],a=[],p=w("Installing components.")?.start(),l=r.ui,d=await ta$1(l),m=R(t.resolvedPaths.cwd,l.resolvedPaths.ui);o=await Qe(o,t);let h=ke([o]);await D(o.dependencies,o.devDependencies,l,{silent:true}),o.tailwind?.config&&(await Y$1(o.tailwind?.config,l,{silent:true,tailwindVersion:d}),c.push(oe__default.relative(m,l.resolvedPaths.tailwindConfig))),o.envVars&&await or(o.envVars,l,{silent:true}),await et(o.fonts,t,{silent:true});let g=new Map;for(let R of o.files??[]){let _=R.type||"registry:ui";g.has(_)||g.set(_,[]),g.get(_).push(R);}let w$1={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"};for(let R$1 of Array.from(g.keys())){let _=g.get(R$1),be=w$1[R$1],Je=be&&r[be]?r[be]:t,ct=R(t.resolvedPaths.cwd,Je.resolvedPaths.ui||Je.resolvedPaths.cwd),Jt=await Q(ct,Je.resolvedPaths.cwd)??Je.resolvedPaths.cwd,Gt=await D$1(_,Je,{overwrite:n.overwrite,silent:true,rootSpinner:p,isRemote:n.isRemote,isWorkspace:true,path:n.path,supportedFontMarkers:h});s.push(...Gt.filesCreated.map(Ge=>oe__default.relative(ct,oe__default.join(Jt,Ge)))),c.push(...Gt.filesUpdated.map(Ge=>oe__default.relative(ct,oe__default.join(Jt,Ge)))),a.push(...Gt.filesSkipped.map(Ge=>oe__default.relative(ct,oe__default.join(Jt,Ge))));}let C=o.cssVars?n.overwriteCssVars??await hn(e,t):void 0;await Xe(o.css,l,{silent:true,cssVars:o.cssVars,overwriteCssVars:C,tailwindVersion:d,tailwindConfig:o.tailwind?.config}),(o.cssVars||o.css)&&c.push(oe__default.relative(m,l.resolvedPaths.tailwindCss)),p?.succeed();let b$1=Array.from(new Set(s)).sort(),j=Array.from(new Set(c.filter(R=>!s.includes(R)))).sort(),v=Array.from(new Set(a)).sort();if(!(b$1.length||j.length)&&!v.length&&w("No files updated.",{silent:n.silent})?.info(),b$1.length){w(`Created ${b$1.length} ${b$1.length===1?"file":"files"}:`,{silent:n.silent})?.succeed();for(let R of b$1)b.log(` - ${R}`);}if(j.length){w(`Updated ${j.length} ${j.length===1?"file":"files"}:`,{silent:n.silent})?.info();for(let R of j)b.log(` - ${R}`);}if(v.length){w(`Skipped ${v.length} ${v.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info();for(let R of v)b.log(` - ${R}`);}o.docs&&b.info(o.docs);}async function hn(e,t){let r=await ba(e,{config:t});return z$1.array(n).parse(r).some(i=>i.type==="registry:theme"||i.type==="registry:style"||i.type==="registry:font"||i.type==="registry:base")}function yn(e,t){for(let r of e)if(r?.target&&!cn(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}async function ge(e){let t=oe__default.resolve(e.projectPath,"packages/ui"),r=oe__default.resolve(e.projectPath,"apps/web"),n=oe__default.resolve(t,"components.json"),i=await T.readJson(n);e.registryBaseConfig&&(i=wn(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 T.writeJson(n,i,{spaces:2});let o=oe__default.resolve(r,"components.json"),s=await T.readJson(o);e.registryBaseConfig&&(s=wn(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 T.writeJson(o,s,{spaces:2});let c$1=await O(t,c.parse(i)),{config:a}=await M(e.components,c$1,{silent:true});await se(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let p=await O(r,c.parse(s)),l=await _(e.components,U(a));if(l?.fonts?.length){let m={},h=new Set;for(let g of l.fonts){let w=g.name.replace(/^font-heading-/,"").replace("font-",""),C=g.font.dependency??`@fontsource-variable/${w}`;m[g.font.variable]=g.font.family,h.add(C);}await D(Array.from(h),[],c$1,{silent:true}),await It({theme:m},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await Xe(Object.fromEntries(Array.from(h).map(g=>[`@import "${g}"`,{}])),c$1,{silent:e.silent});}let d=c$1.iconLibrary;if(d&&d in a$3){let m=[...a$3[d].packages];await D(m,[],c$1,{silent:true}),await D(m,[],p,{silent:true});}return p}var xn=B({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:bn`---
44
+ `);let c=await ye([{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 pi(o,e,t,r.resolvedPaths.cwd,s),i?.succeed();}function li(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 fi(e){return qa(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$2(e.resolvedPaths.cwd)}async function pi(e,t,r,n,i){if(e==="npm")return mi(t,r,n,i);if(e==="deno")return di(t,r,n);if(e==="expo")return ui(t,r,n);t?.length&&await execa(e,["add",...t],{cwd:n}),r?.length&&await execa(e,["add","-D",...r],{cwd:n});}async function mi(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 di(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 ui(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 or(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=ie__default.join(i,".env.local"),s=t(i);s&&(o=s);let c=existsSync(o),a$1=ie__default.basename(o),f=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
45
+ `),p=[],m=null,d=null;if(c){let h=await promises.readFile(o,"utf-8"),g=v(h,f);if(p=u(h,f),p.length>0){if(await promises.writeFile(o,g,"utf-8"),m=ie__default.relative(i,o),n?.succeed(`Added the following variables to ${a.info(a$1)}:`),!r.silent)for(let w of p)b.log(` ${a.success("+")} ${w}`);}else n?.stop();}else if(await promises.writeFile(o,f+`
46
+ `,"utf-8"),d=ie__default.relative(i,o),p=Object.keys(e),n?.succeed(`Added the following variables to ${a.info(a$1)}:`),!r.silent)for(let h of p)b.log(` ${a.success("+")} ${h}`);return !r.silent&&p.length>0&&b.break(),{envVarsAdded:p,envFileUpdated:m,envFileCreated:d}}var vi=new Set(["--font-sans","--font-serif","--font-mono"]);async function Qe(e,t){if(!e.fonts?.length)return e;let r=await ra$1(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 o=i.name.replace("font-",""),s=i.font.dependency??`@fontsource-variable/${o}`;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??$i(o.font.variable);if(!s)continue;let 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 et(e,t,r){if(!e?.length)return;let n=await ra$1(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 Ci(e,t,n),i?.succeed("Updating fonts.");}catch(o){throw i?.fail("Failed to update fonts."),o}}async function Ci(e,t,r){let n=await Ri(t,r);if(!n)return;let i=await promises.readFile(n,"utf-8"),o=await Si(i,e,t);o!==i&&await promises.writeFile(n,o,"utf-8");}async function Ri(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=ie__default.join(r,c);if(existsSync(a))return a}return null}async function Si(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(k=>k.getModuleSpecifierValue()==="next/font/google"),g=false;h?(g=h.getNamedImports().some(C=>C.getName()===d),g||h.addNamedImport(d)):i.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[d]});let w=Pi(d,m.font.variable),v=ki(m),x=Fi(i,m.font.variable),P=w;if(!(g&&!x&&Et(m.font.variable)&&!Oi(i,d))){if(x)x.setInitializer(`${d}(${v})`),x.getName()!==w&&x.rename(w),P=w;else {let k=Ni(i);i.insertVariableStatement(k,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:w,initializer:`${d}(${v})`}]}).appendWhitespace(`
47
+ `);}s.push(P),Ii(m)&&c.push(m.font.variable.replace("--",""));}}let a=new Set(["font-sans","font-serif","font-mono"]),f=[...c].reverse().find(m=>a.has(m)),p=c.filter(m=>!a.has(m));return f&&p.unshift(f),s.length>0&&Ai(i,s,p,r),i.getFullText()}function ki(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 Et(e){return vi.has(e)}function $i(e){return Et(e)?"html":null}function Ii(e){return !e.font.selector&&Et(e.font.variable)}function Pi(e,t){let r=ji(e);return Et(t)?r:`${r}${Ei(t.replace(/^--font-/,""))}`}function ji(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Ei(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Fi(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 Oi(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 s=o;if(s.getExpression().getText()!==t)continue;let c=s.getArguments();if(!c.length)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes("--font-heading"))return true}return false}function Ni(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Ai(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],p=o.getAttribute("className");if(!p){Ze(e,n),o.addAttribute({name:"className",initializer:`{cn(${f.join(", ")})}`});return}if(p.getKind()!==SyntaxKind.JsxAttribute)return;let m=p.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 v=a.every(R=>w.includes(R)),x=r.every(R=>w.includes(`"${R}"`)),P=["font-sans","font-serif","font-mono"].filter(R=>!r.includes(R)).some(R=>w.includes(`"${R}"`));if(v&&x&&!P)continue;let k=Di(w,a);k=Li(k);let C=_i(k,f);h.replaceWithText(`{${C}}`);}else if(/^\w+\.variable$/.test(w)){if(a.includes(w)&&r.length===0)continue;Ze(e,n);let x=(w.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(x?`{cn(${w}, ${f.join(", ")})}`:`{cn(${f.join(", ")})}`);}else if(w.startsWith("`")&&w.endsWith("`")){let v=Ti(w);Ze(e,n);let x=new Set(f),P=new Set(["font-sans","font-serif","font-mono"].map(C=>`"${C}"`)),k=v.filter(C=>!x.has(C)&&!P.has(C));h.replaceWithText(`{cn(${[...k,...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 Ti(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 Di(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 Li(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 _i(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function ae(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 Ui(e,t,n,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Mi(e,t,{...r,skipFonts:r.skipFonts})}async function Mi(e,t,r){if(!e.length)return;let n=w("Checking registry.",{silent:r.silent})?.start(),i=await _(e,U(t));if(!i)return n?.fail(),$(new Error("Failed to fetch components from registry."));try{yn(i.files??[],t.resolvedPaths.cwd);}catch(a){return n?.fail(),$(a)}n?.succeed();let o=await ta$1(t);r.skipFonts||(i=await Qe(i,t));let s=$e([i]);await D(i.dependencies,i.devDependencies,t,{silent:r.silent}),await Y$1(i.tailwind?.config,t,{silent:r.silent,tailwindVersion:o}),await or(i.envVars,t,{silent:r.silent}),r.skipFonts||await et(i.fonts,t,{silent:r.silent}),await D$1(i.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let c=i.cssVars?r.overwriteCssVars??await hn(e,t):void 0;await Xe(i.css,t,{silent:r.silent,cssVars:i.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:c,tailwindVersion:o,tailwindConfig:i.tailwind?.config}),i.docs&&b.info(i.docs);}async function Ui(e,t,r,n){if(!e.length)return;let i=w("Checking registry.",{silent:n.silent})?.start(),o=await _(e,U(t));if(!o)return i?.fail(),$(new Error("Failed to fetch components from registry."));try{yn(o.files??[],t.resolvedPaths.cwd);}catch(R){return i?.fail(),$(R)}i?.succeed();let s=[],c=[],a=[],f=w("Installing components.")?.start(),p=r.ui,m=await ta$1(p),d=R(t.resolvedPaths.cwd,p.resolvedPaths.ui);o=await Qe(o,t);let h=$e([o]);await D(o.dependencies,o.devDependencies,p,{silent:true}),o.tailwind?.config&&(await Y$1(o.tailwind?.config,p,{silent:true,tailwindVersion:m}),c.push(ie__default.relative(d,p.resolvedPaths.tailwindConfig))),o.envVars&&await or(o.envVars,p,{silent:true}),await et(o.fonts,t,{silent:true});let g=new Map;for(let R of o.files??[]){let L=R.type||"registry:ui";g.has(L)||g.set(L,[]),g.get(L).push(R);}let w$1={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"};for(let R$1 of Array.from(g.keys())){let L=g.get(R$1),K=w$1[R$1],xe=K&&r[K]?r[K]:t,ct=R(t.resolvedPaths.cwd,xe.resolvedPaths.ui||xe.resolvedPaths.cwd),Jt=await Q(ct,xe.resolvedPaths.cwd)??xe.resolvedPaths.cwd,Gt=await D$1(L,xe,{overwrite:n.overwrite,silent:true,rootSpinner:f,isRemote:n.isRemote,isWorkspace:true,path:n.path,supportedFontMarkers:h});s.push(...Gt.filesCreated.map(Ge=>ie__default.relative(ct,ie__default.join(Jt,Ge)))),c.push(...Gt.filesUpdated.map(Ge=>ie__default.relative(ct,ie__default.join(Jt,Ge)))),a.push(...Gt.filesSkipped.map(Ge=>ie__default.relative(ct,ie__default.join(Jt,Ge))));}let v=o.cssVars?n.overwriteCssVars??await hn(e,t):void 0;await Xe(o.css,p,{silent:true,cssVars:o.cssVars,overwriteCssVars:v,tailwindVersion:m,tailwindConfig:o.tailwind?.config}),(o.cssVars||o.css)&&c.push(ie__default.relative(d,p.resolvedPaths.tailwindCss)),f?.succeed();let x=Array.from(new Set(s)).sort(),P=Array.from(new Set(c.filter(R=>!s.includes(R)))).sort(),k=Array.from(new Set(a)).sort();if(!(x.length||P.length)&&!k.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(P.length){w(`Updated ${P.length} ${P.length===1?"file":"files"}:`,{silent:n.silent})?.info();for(let R of P)b.log(` - ${R}`);}if(k.length){w(`Skipped ${k.length} ${k.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info();for(let R of k)b.log(` - ${R}`);}o.docs&&b.info(o.docs);}async function hn(e,t){let r=await ba(e,{config:t});return z$1.array(n).parse(r).some(i=>i.type==="registry:theme"||i.type==="registry:style"||i.type==="registry:font"||i.type==="registry:base")}function yn(e,t){for(let r of e)if(r?.target&&!cn(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}async function he(e){let t=ie__default.resolve(e.projectPath,"packages/ui"),r=ie__default.resolve(e.projectPath,"apps/web"),n=ie__default.resolve(t,"components.json"),i=await T.readJson(n);e.registryBaseConfig&&(i=wn(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 T.writeJson(n,i,{spaces:2});let o=ie__default.resolve(r,"components.json"),s=await T.readJson(o);e.registryBaseConfig&&(s=wn(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 T.writeJson(o,s,{spaces:2});let c$1=await O(t,c.parse(i)),{config:a}=await M(e.components,c$1,{silent:true});await ae(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let f=await O(r,c.parse(s)),p=await _(e.components,U(a));if(p?.fonts?.length){let d={},h=new Set;for(let g of p.fonts){let w=g.name.replace(/^font-heading-/,"").replace("font-",""),v=g.font.dependency??`@fontsource-variable/${w}`;d[g.font.variable]=g.font.family,h.add(v);}await D(Array.from(h),[],c$1,{silent:true}),await It({theme:d},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await Xe(Object.fromEntries(Array.from(h).map(g=>[`@import "${g}"`,{}])),c$1,{silent:e.silent});}let m=c$1.iconLibrary;if(m&&m in a$3){let d=[...a$3[m].packages];await D(d,[],c$1,{silent:true}),await D(d,[],f,{silent:true});}return f}var xn=B({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:bn`---
48
48
  import Layout from "@/layouts/main.astro"
49
49
  import { ComponentExample } from "@/components/component-example"
50
50
  ---
@@ -52,7 +52,7 @@ import { ComponentExample } from "@/components/component-example"
52
52
  <Layout>
53
53
  <ComponentExample client:load />
54
54
  </Layout>
55
- `}],monorepo:{templateDir:"astro-monorepo",init:ge,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:bn`---
55
+ `}],monorepo:{templateDir:"astro-monorepo",init:he,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:bn`---
56
56
  import "@workspace/ui/globals.css"
57
57
  import { ComponentExample } from "@/components/component-example"
58
58
  ---
@@ -72,7 +72,7 @@ import { ComponentExample } from "@/components/component-example"
72
72
  export default function Page() {
73
73
  return <ComponentExample />;
74
74
  }
75
- `}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=oe__default.resolve(e.projectPath,"packages/ui"),r=oe__default.resolve(e.projectPath,"apps/web"),n=oe__default.resolve(t,"components.json"),i=await T.readJson(n);e.registryBaseConfig&&(i=wn(i,e.registryBaseConfig)),i.tailwind.baseColor="neutral",e.rtl&&(i.rtl=true),await T.writeJson(n,i,{spaces:2});let o=oe__default.resolve(r,"components.json"),s=await T.readJson(o);e.registryBaseConfig&&(s=wn(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),await T.writeJson(o,s,{spaces:2});let c$1=await O(t,c.parse(i)),{config:a}=await M(e.components,c$1,{silent:true});await se(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let p=await O(r,c.parse(s)),l=await _(e.components,U(a));if(l?.fonts?.length){let m={};for(let h of l.fonts)m[h.font.variable]=`var(${h.font.variable})`;await It({theme:m},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await et(l.fonts,p,{silent:e.silent});}let d=c$1.iconLibrary;if(d&&d in a$3){let m=[...a$3[d].packages];await D(m,[],c$1,{silent:true}),await D(m,[],p,{silent:true});}return p},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:bn`import { ComponentExample } from "@/components/component-example";
75
+ `}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=ie__default.resolve(e.projectPath,"packages/ui"),r=ie__default.resolve(e.projectPath,"apps/web"),n=ie__default.resolve(t,"components.json"),i=await T.readJson(n);e.registryBaseConfig&&(i=wn(i,e.registryBaseConfig)),i.tailwind.baseColor="neutral",e.rtl&&(i.rtl=true),await T.writeJson(n,i,{spaces:2});let o=ie__default.resolve(r,"components.json"),s=await T.readJson(o);e.registryBaseConfig&&(s=wn(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),await T.writeJson(o,s,{spaces:2});let c$1=await O(t,c.parse(i)),{config:a}=await M(e.components,c$1,{silent:true});await ae(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let f=await O(r,c.parse(s)),p=await _(e.components,U(a));if(p?.fonts?.length){let d={};for(let h of p.fonts)d[h.font.variable]=`var(${h.font.variable})`;await It({theme:d},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await et(p.fonts,f,{silent:e.silent});}let m=c$1.iconLibrary;if(m&&m in a$3){let d=[...a$3[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:bn`import { ComponentExample } from "@/components/component-example";
76
76
 
77
77
  export default function Page() {
78
78
  return <ComponentExample />;
@@ -82,7 +82,7 @@ export default function Page() {
82
82
  export default function Home() {
83
83
  return <ComponentExample />;
84
84
  }
85
- `}],monorepo:{templateDir:"react-router-monorepo",init:ge,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:bn`import { ComponentExample } from "@/components/component-example";
85
+ `}],monorepo:{templateDir:"react-router-monorepo",init:he,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:bn`import { ComponentExample } from "@/components/component-example";
86
86
 
87
87
  export default function Home() {
88
88
  return <ComponentExample />;
@@ -97,7 +97,7 @@ function App() {
97
97
  <ComponentExample />
98
98
  );
99
99
  }
100
- `}],monorepo:{templateDir:"start-monorepo",init:ge,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:bn`import { createFileRoute } from "@tanstack/react-router";
100
+ `}],monorepo:{templateDir:"start-monorepo",init:he,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:bn`import { createFileRoute } from "@tanstack/react-router";
101
101
  import { ComponentExample } from "@/components/component-example";
102
102
 
103
103
  export const Route = createFileRoute("/")({ component: App });
@@ -114,52 +114,52 @@ export function App() {
114
114
  }
115
115
 
116
116
  export default App;
117
- `}],monorepo:{templateDir:"vite-monorepo",init:ge,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:bn`import { ComponentExample } from "@/components/component-example";
117
+ `}],monorepo:{templateDir:"vite-monorepo",init:he,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:bn`import { ComponentExample } from "@/components/component-example";
118
118
 
119
119
  export function App() {
120
120
  return <ComponentExample />;
121
121
  }
122
122
 
123
123
  export default App;
124
- `}]}});var z={next:Sn,vite:En,start:Pn,"react-router":$n,astro:xn,laravel:vn};function _e(e){if(e){for(let[t,r]of Object.entries(z))if(r.frameworks.includes(e))return t}}async function Tt(e){let t=e.template&&e.template in z?e.template:"next",r=Se(z[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:p}=await he([{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(z).map(([l,d])=>({title:d.title,value:l,description:d.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=p??n;}let o=Se(z[t],{monorepo:e.monorepo}),s=await a$2(e.cwd,{withFallback:true}),c=oe__default.join(e.cwd,n);try{await T.access(e.cwd,T.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 T.existsSync(oe__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 Y(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 Ve=".bak";function sr(e){if(!T.existsSync(e))return null;let t=`${e}${Ve}`;try{return T.renameSync(e,t),t}catch(r){return console.error(`Failed to create backup of ${e}: ${r}`),null}}function Dt(e){let t=`${e}${Ve}`;if(!T.existsSync(t))return false;try{return T.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function ar(e){let t=`${e}${Ve}`;if(!T.existsSync(t))return false;try{return T.unlinkSync(t),!0}catch{return false}}async function On(e,t,r={}){if(!T.existsSync(e))return t();if(!sr(e))throw r.onBackupFailure?.(e),new Error(`Could not back up ${e}.`);let i=()=>Dt(e);process.on("exit",i);try{let o=await t();return process.removeListener("exit",i),ar(e),o}catch(o){throw process.removeListener("exit",i),Dt(e),o}}var Yi=z$1.object({cwd:z$1.string(),name:z$1.string().optional(),preset:z$1.union([z$1.boolean(),z$1.string()]).optional(),components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),defaults:z$1.boolean(),force:z$1.boolean(),reinstall:z$1.boolean().optional(),silent:z$1.boolean(),isNewProject:z$1.boolean().default(false),cssVariables:z$1.boolean().default(true),rtl:z$1.boolean().optional(),base:z$1.enum(["radix","base"]).optional(),template:z$1.string().optional(),monorepo:z$1.boolean().optional(),existingConfig:z$1.record(z$1.unknown()).optional(),installStyleIndex:z$1.boolean().default(true),registryBaseConfig:c.deepPartial().optional(),menuColor:z$1.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:z$1.enum(["subtle","bold"]).optional(),iconLibrary:z$1.string().optional()}),Nn=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$1,n=[],i=()=>{r$1&&Dt(r$1.replace(Ve,""));};process.on("exit",i);try{let o=Yi.parse({...t,reinstall:t.reinstall,cwd:oe__default.resolve(t.cwd)}),s=new Map(Object.entries(le)),c;if(o.defaults&&(o.template=o.template||"next",o.base=o.base||"base",o.reinstall=o.reinstall??!1),o.template&&!(o.template in z)&&(b.error(`Invalid template: ${a.info(o.template)}. Available templates: ${Object.keys(z).map(m=>a.info(m)).join(", ")}.`),b.break(),process.exit(1)),typeof o.preset=="string"&&!G$1(o.preset)&&!r(o.preset)){let m=Array.from(s.keys());s.has(o.preset)||(b.error(`Invalid preset: ${a.info(o.preset)}. Available presets: ${m.join(", ")}`),b.break(),process.exit(1));}let a$1=o.cwd,p=T.existsSync(oe__default.resolve(a$1,"components.json"));if(!o.monorepo&&!p&&await J(a$1)){let m=await ra$1(a$1);if(!m||m.framework.name==="manual"){let h=await G(a$1);h.length>0&&(H("init",h),process.exit(1));}}if(p&&!o.force){let{overwrite:m}=await he({type:"confirm",name:"overwrite",message:`A ${a.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});m||(b.info(` To start over, remove the ${a.info("components.json")} file and run ${a.info("init")} again.`),b.break(),process.exit(1)),o.force=!0;}let l;if(p){try{l=await T.readJson(oe__default.resolve(a$1,"components.json"));}catch{}l&&(o.existingConfig=l);let m=o.reinstall;if(m===void 0){let{reinstall:h}=await he({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});m=h;}if(m&&(n=await ua$1(a$1),n.length)){b.break(),b.log(" The following components will be re-installed and overwritten:");for(let h=0;h<n.length;h+=8)b.log(` - ${n.slice(h,h+8).join(", ")}`);b.break();}}if(o.preset===void 0&&e.length===0&&!o.defaults){let m=T.existsSync(oe__default.resolve(a$1,"package.json"));if(!o.template&&!m){let{template:h}=await he({type:"select",name:"template",message:"Select a template",choices:Object.entries(z).map(([g,w])=>({title:w.title,value:g,description:w.description,disabled:o.monorepo&&g==="laravel"}))});h||process.exit(1),o.template=h;}if(!o.template&&m){let h=await ra$1(a$1),g=_e(h?.framework.name);g&&(o.template=g);}if(o.template==="laravel"&&!m&&(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.monorepo===void 0&&!m&&o.template&&z[o.template]?.monorepo){let{monorepo:h}=await he({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});o.monorepo=h;}o.base||(o.base=await De()),o.preset=!0;}if(o.preset!==void 0){let m=o.preset===!0?!0:o.preset;if(m===!0){let h=await Ke({rtl:o.rtl??!1,template:o.template,base:o.base});e=[h.url,...e],c=h.base;}if(typeof m=="string"){let h;if(G$1(m)){let g=new URL(m);o.rtl?g.searchParams.set("rtl","true"):o.rtl===!1&&g.searchParams.delete("rtl"),g.pathname==="/init"&&m.startsWith(c$1)&&g.searchParams.set("track","1"),h=g.toString(),c=g.searchParams.get("base")??void 0;}else if(r(m)){let g=q(m);g||(b.error(`Invalid preset code: ${a.info(m)}`),b.break(),process.exit(1)),h=fe({...g,base:"radix",rtl:o.rtl??!1},{template:o.template,preset:m}),c=void 0;}else {let g=s.get(m);if(!g)throw new Error(`Unknown preset: ${m}`);h=fe({...g,base:o.base??"radix",rtl:o.rtl??g.rtl},{template:o.template}),c=void 0;}e=[h,...e];}}let d=o.base??c??(l?.style?l.style.startsWith("base-")?"base":"radix":"");if(!d)if(e.length>0)d="radix";else {let m=await De();d=m,o.base=m;}if(o.defaults&&!e.some(G$1)&&(e=[fe({...le.nova,base:d,rtl:o.rtl??!1},{template:o.template}),...e]),e.length>0&&G$1(e[0])){let m=new URL(e[0]);m.searchParams.set("base",d),e[0]=m.toString();}if(l?.style){let m=await Xi(l.style,d);if(m!==d&&(d=m,e.length>0&&G$1(e[0]))){let h=new URL(e[0]);h.searchParams.set("base",m),e[0]=h.toString();}}if(n.length&&(e=[...e,...n]),o.components=e,await Y(o.cwd),e.length>0){let m=oe__default.resolve(a$1,"components.json");p&&(r$1=sr(m)??void 0,r$1||b.warn(`Could not back up ${a.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:g,url:w}=await Ce(e[0],a$1,{registries:l?.registries});e[0]=w,g||(o.installStyleIndex=!1),h&&(o.registryBaseConfig=h);}await Me(o),b.break(),b.log(`Project initialization completed.
126
- You may now add components.`),process.removeListener("exit",i),ar(oe__default.resolve(a$1,"components.json")),b.break();}catch(o){process.removeListener("exit",i),i(),b.break(),$(o);}finally{V();}});async function Me(e){let t,r,n=e.template,i=n?Se(z[n],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&T.existsSync(oe__default.resolve(e.cwd,"package.json")))t=await ra$1(e.cwd);else if(e.skipPreflight)t=await ra$1(e.cwd);else {let v=await rn(e);if(v.errors["1"]){let{projectPath:$,template:R}=await Tt(e);$||process.exit(1),e.cwd=$,e.isNewProject=true,r=R,t=await ra$1(e.cwd);}else t=v.projectInfo;}let s=r??n,c=s?Se(z[s],{monorepo:e.monorepo}):void 0,a$1=[...e.installStyleIndex?["index"]:[],...e.components??[],...c?["button"]:[]];if(c?.init){let v=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}),v}let p=await sa(e.cwd,t),l=p?await qi(p,e):await Ki(await N(e.cwd));if(!e.yes){let{proceed:v}=await he({type:"confirm",name:"proceed",message:`Write configuration to ${a.info("components.json")}. Proceed?`,initial:true});v||process.exit(1);}let d$1=await O(e.cwd,l),{config:m}=await M(a$1,d$1,{silent:true});m.registries&&(l.registries=m.registries);let h=w("Writing components.json.").start(),g=oe__default.resolve(e.cwd,"components.json"),w$1=`${g}${Ve}`,C=(v,$)=>{let{registries:R,..._}=wn(v,$);return {..._,registries:R}};if(T.existsSync(w$1)){let v=await T.readJson(w$1);e.force?v.registries&&(l.registries={...v.registries,...l.registries||{}}):l=C(v,l);}e.registryBaseConfig&&(l=C(l,e.registryBaseConfig)),e.rtl!==void 0&&(l.rtl=e.rtl),l.registries=Object.fromEntries(Object.entries(l.registries||{}).filter(([v])=>!Object.keys(d).includes(v))),await promises.writeFile(g,`${JSON.stringify(l,null,2)}
127
- `,"utf8"),h.succeed();let b=await O(e.cwd,l),j=await P(b);if(j){let v={};if(l.menuColor&&(v.menuColor=l.menuColor),l.menuAccent&&(v.menuAccent=l.menuAccent),l.rtl!==void 0&&(v.rtl=l.rtl),l.iconLibrary&&(v.iconLibrary=l.iconLibrary),Object.keys(v).length>0)for(let $ of Object.keys(j)){let R=j[$];if(R.resolvedPaths.cwd===b.resolvedPaths.cwd)continue;let _=oe__default.resolve(R.resolvedPaths.cwd,"components.json");if(T.existsSync(_)){let be=await T.readJson(_);await T.writeJson(_,{...be,...v},{spaces:2});}}}return M$1.clearCaches(),await se(a$1,b,{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}),b}async function Ki(e=null){let[t,r]=await Promise.all([fa$1(),ha$1()]);b.info("");let n=await he([{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},{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$1},{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 qi(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$1(),ta$1(e)]);r=(await he([{type:c==="v4"||r?null:"select",name:"style",message:`Which ${a.info("style")} would you like to use?`,choices:s.map(p=>({title:p.name==="new-york"?"New York (Recommended)":p.label,value:p.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 Xi(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 he({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:false});return n?t:r}async function Tn(e){let t={};if(!T.existsSync(e.cwd)||!T.existsSync(oe__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!T.existsSync(oe__default.resolve(e.cwd,"components.json"))){if(await J(e.cwd)){let r=await G(e.cwd);r.length>0&&(H("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 Ln(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(t));if(!i)throw new Error("Failed to fetch components from registry.");r.skipFonts||(i=await Qe(i,t));let o=ke([i]);return n.dependencies=Array.from(new Set(i.dependencies??[])),n.devDependencies=Array.from(new Set(i.devDependencies??[])),n.docs=i.docs??null,await Zi(i,t,n,r,o),await Qi(i,t,n,r),es(i,t,n),r.skipFonts||ts(i,n),n}async function Zi(e,t,r,n,i){let o=e.files;if(!o?.length)return;let[s$1,c]=await Promise.all([ra$1(t.resolvedPaths.cwd),t.tailwind.baseColor?ia(t.tailwind.baseColor):Promise.resolve(void 0)]);for(let a=0;a<o.length;a++){let p=o[a];if(!p.content)continue;let l=E(p,t,{isSrcDir:s$1?.isSrcDir,framework:s$1?.framework.name,commonRoot:F(o.map(b=>b.path),p.path),fileIndex:a});if(!l)continue;t.tsx||(l=l.replace(/\.tsx?$/,b=>b===".tsx"?".jsx":".js"));let d=existsSync(l),m=oe__default.relative(t.resolvedPaths.cwd,l),h=p.type==="registry:file"||p.type==="registry:item",g$1=s(l)||h?p.content:await B$1({filename:p.path,raw:p.content,config:t,baseColor:c,transformJsx:!t.tsx,isRemote:false,supportedFontMarkers:i},[x,y,a$1,A,c$2,g,C,d$1,f,z$2]),w="create",C$1;d&&(C$1=await promises.readFile(l,"utf-8"),r$1(C$1,g$1)?w="skip":w="overwrite"),r.files.push({path:m,action:w,content:g$1,...w==="overwrite"&&{existingContent:C$1},type:p.type??"registry:ui"});}}async function Qi(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=oe__default.relative(t.resolvedPaths.cwd,s),p=c?await promises.readFile(s,"utf8"):"",l=p;o&&(l=await qe(l,e.cssVars,t,{overwriteCssVars:n.overwriteCssVars})),i&&(l=await rr(l,e.css));let d=0;if(e.cssVars)for(let m of Object.values(e.cssVars))m&&(d+=Object.keys(m).length);r.css={path:a,content:l,...c&&{existingContent:p},action:c?"update":"create",cssVarsCount:d};}function es(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let n=oe__default.join(t.resolvedPaths.cwd,".env.local"),i=existsSync(n),o=oe__default.relative(t.resolvedPaths.cwd,n);r.envVars={path:o,variables:e.envVars,action:i?"update":"create"};}function ts(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 ye=5,os=dim("\u250C"+"\u2500".repeat(46)),is=dim("\u2514"+"\u2500".repeat(46)),ss={create:"+",overwrite:"~",skip:"="},as={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function tt(e){return e==="create"?green(e):e==="overwrite"||e==="update"?yellow(e):dim(e)}function rt(e){return `${bold("\u250C")} ${bold(`shadcn add ${e.join(", ")}`)} ${dim("(dry run)")}`}function Mn(e,t){return e===t||e.includes(t)||e.endsWith(t)}function Pe(e,t,r=n=>n){e.push(`${dim("\u2502")} ${os}`);for(let n of t)e.push(`${dim("\u2502")} ${dim("\u2502")} ${r(n)}`);e.push(`${dim("\u2502")} ${is}`);}function Un(e,t,r={}){return r.diff?typeof r.diff=="string"?ls(e,t,r.diff):fs(e,t):r.view?typeof r.view=="string"?ms(e,t,r.view):ps(e,t):cs(e,t)}function cs(e,t){let r=[];r.push(rt(t)),r.push(dim("\u2502")),ds(e,r),_n("Dependencies",e.dependencies,r),_n("Dev Dependencies",e.devDependencies,r),us(e,r),gs(e,r),hs(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 ls(e,t,r){let n=[];n.push(rt(t)),n.push(dim("\u2502"));let i=Bn(e.files,r),o=e.css&&Mn(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)Wn(s,n);if(o&&e.css){if(n.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${tt(e.css.action)}${dim(")")}`),e.css.action==="create"||!e.css.existingContent)Pe(n,e.css.content.split(`
130
- `),s=>green(`+${s}`));else {let s=zn(e.css.existingContent,e.css.content,e.css.path,{fullContext:true});Pe(n,s);}n.push(dim("\u2502"));}}return n.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),n.join(`
131
- `)}function fs(e,t){let r=[];r.push(rt(t)),r.push(dim("\u2502"));let n=e.files.slice(0,ye);if(n.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No changes.")}`),r.push(dim("\u2502"));else {for(let s of n)Wn(s,r);e.files.length>ye&&r.push(dim("\u2502"));}let i=e.files.length;return i>ye&&r.push(` ${dim(`Showing ${ye} 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 ps(e,t){let r=[];r.push(rt(t)),r.push(dim("\u2502"));let n=e.files.slice(0,ye);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("(")}${tt(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),Pe(r,c),r.push(dim("\u2502"));}e.files.length>ye&&r.push(dim("\u2502"));}let i=e.files.length;return i>ye&&r.push(` ${dim(`Showing ${ye} 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 Wn(e,t){if(t.push(`${dim("\u251C")} ${bold(e.path)} ${dim("(")}${tt(e.action)}${dim(")")}`),e.action==="skip")t.push(`${dim("\u2502")} ${dim("No changes.")}`);else if(e.action==="create")Pe(t,e.content.split(`
135
- `),r=>green(`+${r}`));else {let r=zn(e.existingContent,e.content,e.path);Pe(t,r);}t.push(dim("\u2502"));}function ms(e,t,r){let n=[];n.push(rt(t)),n.push(dim("\u2502"));let i=Bn(e.files,r),o=e.css&&Mn(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("(")}${tt(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),Pe(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("(")}${tt(e.css.action)}${dim(")")} ${dim(`${s.length} lines`)}`),Pe(n,s),n.push(dim("\u2502"));}}return n.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),n.join(`
138
- `)}function ds(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=ss[s.action],a=as[s.action],p=" ".repeat(Math.max(1,o-s.path.length+2)),l=s.action==="create"?green:s.action==="overwrite"?yellow:dim,d=s.action==="skip"?dim(s.path):s.path;t.push(`${dim("\u2502")} ${l(c)} ${d}${p}${l(a)}`);}t.push(dim("\u2502"));}function _n(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 us(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 gs(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 hs(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 Bn(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 zn(e,t,r,n={}){if(vs(e,t))return [dim(" Formatting-only changes (spacing, quotes, semicolons).")];let i=Vn(e),o=Vn(t),s=n.fullContext?Math.max(i.split(`
124
+ `}]}});var z={next:Sn,vite:En,start:Pn,"react-router":$n,astro:xn,laravel:vn};function Ve(e){if(e){for(let[t,r]of Object.entries(z))if(r.frameworks.includes(e))return t}}async function Tt(e){let t=e.template&&e.template in z?e.template:"next",r=ke(z[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 ye([{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(z).map(([p,m])=>({title:m.title,value:p,description:m.description})),initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:n,format:p=>p.trim(),validate:p=>p.length>128?"Name should be less than 128 characters.":true}]);t=a$1??t,n=f??n;}let o=ke(z[t],{monorepo:e.monorepo}),s=await a$2(e.cwd,{withFallback:true}),c=ie__default.join(e.cwd,n);try{await T.access(e.cwd,T.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 T.existsSync(ie__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 Y(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 Me=".bak";function sr(e){if(!T.existsSync(e))return null;let t=`${e}${Me}`;try{return T.renameSync(e,t),t}catch(r){return console.error(`Failed to create backup of ${e}: ${r}`),null}}function Dt(e){let t=`${e}${Me}`;if(!T.existsSync(t))return false;try{return T.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function ar(e){let t=`${e}${Me}`;if(!T.existsSync(t))return false;try{return T.unlinkSync(t),!0}catch{return false}}async function On(e,t,r={}){if(!T.existsSync(e))return t();if(!sr(e))throw r.onBackupFailure?.(e),new Error(`Could not back up ${e}.`);let i=()=>Dt(e);process.on("exit",i);try{let o=await t();return process.removeListener("exit",i),ar(e),o}catch(o){throw process.removeListener("exit",i),Dt(e),o}}var Yi=z$1.object({cwd:z$1.string(),name:z$1.string().optional(),preset:z$1.union([z$1.boolean(),z$1.string()]).optional(),components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),defaults:z$1.boolean(),force:z$1.boolean(),reinstall:z$1.boolean().optional(),silent:z$1.boolean(),isNewProject:z$1.boolean().default(false),cssVariables:z$1.boolean().default(true),rtl:z$1.boolean().optional(),base:z$1.enum(["radix","base"]).optional(),template:z$1.string().optional(),monorepo:z$1.boolean().optional(),existingConfig:z$1.record(z$1.unknown()).optional(),installStyleIndex:z$1.boolean().default(true),registryBaseConfig:c.deepPartial().optional(),menuColor:z$1.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:z$1.enum(["subtle","bold"]).optional(),iconLibrary:z$1.string().optional()}),Nn=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$1,n=[],i=()=>{r$1&&Dt(r$1.replace(Me,""));};process.on("exit",i);try{let o=Yi.parse({...t,reinstall:t.reinstall,cwd:ie__default.resolve(t.cwd)}),s=new Map(Object.entries(fe)),c;if(o.defaults&&(o.template=o.template||"next",o.base=o.base||"base",o.reinstall=o.reinstall??!1),o.template&&!(o.template in z)&&(b.error(`Invalid template: ${a.info(o.template)}. Available templates: ${Object.keys(z).map(d=>a.info(d)).join(", ")}.`),b.break(),process.exit(1)),typeof o.preset=="string"&&!G$1(o.preset)&&!r(o.preset)){let d=Array.from(s.keys());s.has(o.preset)||(b.error(`Invalid preset: ${a.info(o.preset)}. Available presets: ${d.join(", ")}`),b.break(),process.exit(1));}let a$1=o.cwd,f=T.existsSync(ie__default.resolve(a$1,"components.json"));if(!o.monorepo&&!f&&await J(a$1)){let d=await ra$1(a$1);if(!d||d.framework.name==="manual"){let h=await G(a$1);h.length>0&&(H("init",h),process.exit(1));}}if(f&&!o.force){let{overwrite:d}=await ye({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.force=!0;}let p;if(f){try{p=await T.readJson(ie__default.resolve(a$1,"components.json"));}catch{}p&&(o.existingConfig=p);let d=o.reinstall;if(d===void 0){let{reinstall:h}=await ye({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});d=h;}if(d&&(n=await ua$1(a$1),n.length)){b.break(),b.log(" The following components will be re-installed and overwritten:");for(let h=0;h<n.length;h+=8)b.log(` - ${n.slice(h,h+8).join(", ")}`);b.break();}}if(o.preset===void 0&&e.length===0&&!o.defaults){let d=T.existsSync(ie__default.resolve(a$1,"package.json"));if(!o.template&&!d){let{template:h}=await ye({type:"select",name:"template",message:"Select a template",choices:Object.entries(z).map(([g,w])=>({title:w.title,value:g,description:w.description,disabled:o.monorepo&&g==="laravel"}))});h||process.exit(1),o.template=h;}if(!o.template&&d){let h=await ra$1(a$1),g=Ve(h?.framework.name);g&&(o.template=g);}if(o.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.monorepo===void 0&&!d&&o.template&&z[o.template]?.monorepo){let{monorepo:h}=await ye({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});o.monorepo=h;}o.base||(o.base=await Le()),o.preset=!0;}if(o.preset!==void 0){let d=o.preset===!0?!0:o.preset;if(d===!0){let h=await Ke({rtl:o.rtl??!1,template:o.template,base:o.base});e=[h.url,...e],c=h.base;}if(typeof d=="string"){let h;if(G$1(d)){let g=new URL(d);o.rtl?g.searchParams.set("rtl","true"):o.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(r(d)){let g=q(d);g||(b.error(`Invalid preset code: ${a.info(d)}`),b.break(),process.exit(1)),h=pe({...g,base:"radix",rtl:o.rtl??!1},{template:o.template,preset:d}),c=void 0;}else {let g=s.get(d);if(!g)throw new Error(`Unknown preset: ${d}`);h=pe({...g,base:o.base??"radix",rtl:o.rtl??g.rtl},{template:o.template}),c=void 0;}e=[h,...e];}}let m=o.base??c??(p?.style?p.style.startsWith("base-")?"base":"radix":"");if(!m)if(e.length>0)m="radix";else {let d=await Le();m=d,o.base=d;}if(o.defaults&&!e.some(G$1)&&(e=[pe({...fe.nova,base:m,rtl:o.rtl??!1},{template:o.template}),...e]),e.length>0&&G$1(e[0])){let d=new URL(e[0]);d.searchParams.set("base",m),e[0]=d.toString();}if(p?.style){let d=await Xi(p.style,m);if(d!==m&&(m=d,e.length>0&&G$1(e[0]))){let h=new URL(e[0]);h.searchParams.set("base",d),e[0]=h.toString();}}if(n.length&&(e=[...e,...n]),o.components=e,await Y(o.cwd),e.length>0){let d=ie__default.resolve(a$1,"components.json");f&&(r$1=sr(d)??void 0,r$1||b.warn(`Could not back up ${a.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:g,url:w}=await Re(e[0],a$1,{registries:p?.registries});e[0]=w,g||(o.installStyleIndex=!1),h&&(o.registryBaseConfig=h);}await Ue(o),b.break(),b.log(`Project initialization completed.
126
+ You may now add components.`),process.removeListener("exit",i),ar(ie__default.resolve(a$1,"components.json")),b.break();}catch(o){process.removeListener("exit",i),i(),b.break(),$(o);}finally{V();}});async function Ue(e){let t,r,n=e.template,i=n?ke(z[n],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&T.existsSync(ie__default.resolve(e.cwd,"package.json")))t=await ra$1(e.cwd);else if(e.skipPreflight)t=await ra$1(e.cwd);else {let C=await rn(e);if(C.errors["1"]){let{projectPath:R,template:L}=await Tt(e);R||process.exit(1),e.cwd=R,e.isNewProject=true,r=L,t=await ra$1(e.cwd);}else t=C.projectInfo;}let s=!!r,c=r??n,a$1=c?ke(z[c],{monorepo:e.monorepo}):void 0,f=[...e.installStyleIndex?["index"]:[],...e.components??[],...a$1?["button"]:[]];if(a$1?.init){let C=await a$1.init({projectPath:e.cwd,components:f,registryBaseConfig:e.registryBaseConfig,rtl:e.rtl??false,menuColor:e.menuColor,menuAccent:e.menuAccent,iconLibrary:e.iconLibrary,silent:e.silent});return s&&await a$1.postInit({projectPath:e.cwd}),C}let p=await sa(e.cwd,t),m=p?await qi(p,e):await Ki(await N(e.cwd));if(!e.yes){let{proceed:C}=await ye({type:"confirm",name:"proceed",message:`Write configuration to ${a.info("components.json")}. Proceed?`,initial:true});C||process.exit(1);}let d$1=await O(e.cwd,m),{config:h}=await M(f,d$1,{silent:true});h.registries&&(m.registries=h.registries);let g=w("Writing components.json.").start(),w$1=ie__default.resolve(e.cwd,"components.json"),v=`${w$1}${Me}`,x=(C,R)=>{let{registries:L,...K}=wn(C,R);return {...K,registries:L}};if(T.existsSync(v)){let C=await T.readJson(v);e.force?C.registries&&(m.registries={...C.registries,...m.registries||{}}):m=x(C,m);}e.registryBaseConfig&&(m=x(m,e.registryBaseConfig)),e.rtl!==void 0&&(m.rtl=e.rtl),m.registries=Object.fromEntries(Object.entries(m.registries||{}).filter(([C])=>!Object.keys(d).includes(C))),await promises.writeFile(w$1,`${JSON.stringify(m,null,2)}
127
+ `,"utf8"),g.succeed();let P$1=await O(e.cwd,m),k=await P(P$1);if(k){let C={};if(m.menuColor&&(C.menuColor=m.menuColor),m.menuAccent&&(C.menuAccent=m.menuAccent),m.rtl!==void 0&&(C.rtl=m.rtl),m.iconLibrary&&(C.iconLibrary=m.iconLibrary),Object.keys(C).length>0)for(let R of Object.keys(k)){let L=k[R];if(L.resolvedPaths.cwd===P$1.resolvedPaths.cwd)continue;let K=ie__default.resolve(L.resolvedPaths.cwd,"components.json");if(T.existsSync(K)){let xe=await T.readJson(K);await T.writeJson(K,{...xe,...C},{spaces:2});}}}return M$1.clearCaches(),await ae(f,P$1,{overwrite:true,overwriteCssVars:e.reinstall||void 0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),a$1&&s&&await a$1.postInit({projectPath:e.cwd}),P$1}async function Ki(e=null){let[t,r]=await Promise.all([fa$1(),ha$1()]);b.info("");let n=await ye([{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},{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$1},{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 qi(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$1(),ta$1(e)]);r=(await ye([{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 Xi(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 ye({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:false});return n?t:r}async function Tn(e){let t={};if(!T.existsSync(e.cwd)||!T.existsSync(ie__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!T.existsSync(ie__default.resolve(e.cwd,"components.json"))){if(await J(e.cwd)){let r=await G(e.cwd);r.length>0&&(H("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 Ln(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(t));if(!i)throw new Error("Failed to fetch components from registry.");r.skipFonts||(i=await Qe(i,t));let o=$e([i]);return n.dependencies=Array.from(new Set(i.dependencies??[])),n.devDependencies=Array.from(new Set(i.devDependencies??[])),n.docs=i.docs??null,await Zi(i,t,n,r,o),await Qi(i,t,n,r),es(i,t,n),r.skipFonts||ts(i,n),n}async function Zi(e,t,r,n,i){let o=e.files;if(!o?.length)return;let[s$1,c]=await Promise.all([ra$1(t.resolvedPaths.cwd),t.tailwind.baseColor?ia(t.tailwind.baseColor):Promise.resolve(void 0)]);for(let a=0;a<o.length;a++){let f$1=o[a];if(!f$1.content)continue;let p=E(f$1,t,{isSrcDir:s$1?.isSrcDir,framework:s$1?.framework.name,commonRoot:F(o.map(x=>x.path),f$1.path),fileIndex:a});if(!p)continue;t.tsx||(p=p.replace(/\.tsx?$/,x=>x===".tsx"?".jsx":".js"));let m=existsSync(p),d=ie__default.relative(t.resolvedPaths.cwd,p),h=f$1.type==="registry:file"||f$1.type==="registry:item",g$1=s(p)||h?f$1.content:await B$1({filename:f$1.path,raw:f$1.content,config:t,baseColor:c,transformJsx:!t.tsx,isRemote:false,supportedFontMarkers:i},[x,y,a$1,A,c$2,g,C,d$1,f,z$2]),w="create",v;m&&(v=await promises.readFile(p,"utf-8"),r$1(v,g$1)?w="skip":w="overwrite"),r.files.push({path:d,action:w,content:g$1,...w==="overwrite"&&{existingContent:v},type:f$1.type??"registry:ui"});}}async function Qi(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=ie__default.relative(t.resolvedPaths.cwd,s),f=c?await promises.readFile(s,"utf8"):"",p=f;o&&(p=await qe(p,e.cssVars,t,{overwriteCssVars:n.overwriteCssVars})),i&&(p=await rr(p,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:p,...c&&{existingContent:f},action:c?"update":"create",cssVarsCount:m};}function es(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let n=ie__default.join(t.resolvedPaths.cwd,".env.local"),i=existsSync(n),o=ie__default.relative(t.resolvedPaths.cwd,n);r.envVars={path:o,variables:e.envVars,action:i?"update":"create"};}function ts(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 we=5,os=dim("\u250C"+"\u2500".repeat(46)),is=dim("\u2514"+"\u2500".repeat(46)),ss={create:"+",overwrite:"~",skip:"="},as={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function tt(e){return e==="create"?green(e):e==="overwrite"||e==="update"?yellow(e):dim(e)}function rt(e){return `${bold("\u250C")} ${bold(`shadcn add ${e.join(", ")}`)} ${dim("(dry run)")}`}function Mn(e,t){return e===t||e.includes(t)||e.endsWith(t)}function je(e,t,r=n=>n){e.push(`${dim("\u2502")} ${os}`);for(let n of t)e.push(`${dim("\u2502")} ${dim("\u2502")} ${r(n)}`);e.push(`${dim("\u2502")} ${is}`);}function Un(e,t,r={}){return r.diff?typeof r.diff=="string"?ls(e,t,r.diff):fs(e,t):r.view?typeof r.view=="string"?ms(e,t,r.view):ps(e,t):cs(e,t)}function cs(e,t){let r=[];r.push(rt(t)),r.push(dim("\u2502")),ds(e,r),_n("Dependencies",e.dependencies,r),_n("Dev Dependencies",e.devDependencies,r),us(e,r),gs(e,r),hs(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 ls(e,t,r){let n=[];n.push(rt(t)),n.push(dim("\u2502"));let i=Bn(e.files,r),o=e.css&&Mn(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)Wn(s,n);if(o&&e.css){if(n.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${tt(e.css.action)}${dim(")")}`),e.css.action==="create"||!e.css.existingContent)je(n,e.css.content.split(`
130
+ `),s=>green(`+${s}`));else {let s=zn(e.css.existingContent,e.css.content,e.css.path,{fullContext:true});je(n,s);}n.push(dim("\u2502"));}}return n.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),n.join(`
131
+ `)}function fs(e,t){let r=[];r.push(rt(t)),r.push(dim("\u2502"));let n=e.files.slice(0,we);if(n.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No changes.")}`),r.push(dim("\u2502"));else {for(let s of n)Wn(s,r);e.files.length>we&&r.push(dim("\u2502"));}let i=e.files.length;return i>we&&r.push(` ${dim(`Showing ${we} 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 ps(e,t){let r=[];r.push(rt(t)),r.push(dim("\u2502"));let n=e.files.slice(0,we);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("(")}${tt(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),je(r,c),r.push(dim("\u2502"));}e.files.length>we&&r.push(dim("\u2502"));}let i=e.files.length;return i>we&&r.push(` ${dim(`Showing ${we} 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 Wn(e,t){if(t.push(`${dim("\u251C")} ${bold(e.path)} ${dim("(")}${tt(e.action)}${dim(")")}`),e.action==="skip")t.push(`${dim("\u2502")} ${dim("No changes.")}`);else if(e.action==="create")je(t,e.content.split(`
135
+ `),r=>green(`+${r}`));else {let r=zn(e.existingContent,e.content,e.path);je(t,r);}t.push(dim("\u2502"));}function ms(e,t,r){let n=[];n.push(rt(t)),n.push(dim("\u2502"));let i=Bn(e.files,r),o=e.css&&Mn(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("(")}${tt(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),je(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("(")}${tt(e.css.action)}${dim(")")} ${dim(`${s.length} lines`)}`),je(n,s),n.push(dim("\u2502"));}}return n.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),n.join(`
138
+ `)}function ds(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=ss[s.action],a=as[s.action],f=" ".repeat(Math.max(1,o-s.path.length+2)),p=s.action==="create"?green:s.action==="overwrite"?yellow:dim,m=s.action==="skip"?dim(s.path):s.path;t.push(`${dim("\u2502")} ${p(c)} ${m}${f}${p(a)}`);}t.push(dim("\u2502"));}function _n(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 us(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 gs(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 hs(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 Bn(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 zn(e,t,r,n={}){if(vs(e,t))return [dim(" Formatting-only changes (spacing, quotes, semicolons).")];let i=Vn(e),o=Vn(t),s=n.fullContext?Math.max(i.split(`
139
139
  `).length,o.split(`
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}`)],p=t.split(`
141
- `);for(let l of c.hunks){let{entries:d}=ys(l,p);if(!d.some(C=>C.kind!=="context"))continue;let h=d.filter(C=>C.kind==="context").length,g=d.filter(C=>C.kind==="removed").length,w=d.filter(C=>C.kind==="added").length;a.push(cyan(`@@ -${l.oldStart},${h+g} +${l.newStart},${h+w} @@`));for(let C of d)a.push(C.formatted);}return a}function ys(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=ws(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 ws(e,t,r,n,i){if(Cs(e,t)){for(let a=0;a<t.length;a++){let p=r[n]??t[a];i.push({kind:"context",formatted:dim(` ${p}`)}),n++;}return n}let o=bs(e),s=o.map(_t),c=new Set;for(let a=0;a<t.length;a++){let p=r[n]??t[a],l=_t(t[a]),d=s.findIndex((m,h)=>!c.has(h)&&m===l);if(d!==-1)c.add(d),i.push({kind:"context",formatted:dim(` ${p}`)});else {let m=s.findIndex((h,g)=>!c.has(g));if(m!==-1){c.add(m);let{oldHighlighted:h,newHighlighted:g}=xs(o[m],p);i.push({kind:"removed",formatted:h}),i.push({kind:"added",formatted:g});}else i.push({kind:"added",formatted:green(`+${p}`)});}n++;}for(let a=0;a<o.length;a++)c.has(a)||i.push({kind:"removed",formatted:red(`-${o[a]}`)});return n}function Vn(e){return e.split(`
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(`
141
+ `);for(let p of c.hunks){let{entries:m}=ys(p,f);if(!m.some(v=>v.kind!=="context"))continue;let h=m.filter(v=>v.kind==="context").length,g=m.filter(v=>v.kind==="removed").length,w=m.filter(v=>v.kind==="added").length;a.push(cyan(`@@ -${p.oldStart},${h+g} +${p.newStart},${h+w} @@`));for(let v of m)a.push(v.formatted);}return a}function ys(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=ws(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 ws(e,t,r,n,i){if(Cs(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=bs(e),s=o.map(_t),c=new Set;for(let a=0;a<t.length;a++){let f=r[n]??t[a],p=_t(t[a]),m=s.findIndex((d,h)=>!c.has(h)&&d===p);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}=xs(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 Vn(e){return e.split(`
142
142
  `).map(t=>{let r=t.match(/^(\s*)/)?.[1]??"",n=t.slice(r.length);return r+n.replace(/['"]/g,'"').replace(/;$/g,"")}).join(`
143
143
  `)}function bs(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 xs(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 _t(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function vs(e,t){let r=n=>n.split(`
144
- `).map(_t).filter(i=>i.length>0).join(" ");return r(e)===r(t)}function Cs(e,t){let r=n=>n.map(_t).filter(i=>i.length>0).join(" ");return r(e)===r(t)}async function Gn(e,t){let r=oe__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await je__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}"
144
+ `).map(_t).filter(i=>i.length>0).join(" ");return r(e)===r(t)}function Cs(e,t){let r=n=>n.map(_t).filter(i=>i.length>0).join(" ");return r(e)===r(t)}async function Gn(e,t){let r=ie__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await Ee__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}"
145
145
 
146
146
  export default function Page() {
147
147
  return <${n?.meta?.importSpecifier} />
148
- }`;await je__default.writeFile(r,i,"utf8");}var $s=z$1.object({components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),overwrite:z$1.boolean(),cwd:z$1.string(),all:z$1.boolean(),path:z$1.string().optional(),silent:z$1.boolean(),dryRun:z$1.boolean(),diff:z$1.union([z$1.string(),z$1.literal(true)]).optional(),view:z$1.union([z$1.string(),z$1.literal(true)]).optional()}),Hn=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=$s.parse({components:e$1,...t,cwd:oe__default.resolve(t.cwd)});await Y(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 M(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 se(e$1,i,r);return}if(!r.yes&&!n&&(s==="registry:style"||s==="registry:theme")){b.break();let{confirm:w}=await he({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$1(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:p,config:l}=await Tn(r),d=!1;if(p["3"]){let{proceed:g}=await he({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=_e(a$1?.framework.name),C=await De(),{url:b$1}=await Ke({rtl:!1,base:C,template:w}),{registryBaseConfig:j,installStyleIndex:v,url:$}=await Ce(b$1,r.cwd);l=await Me({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!o,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:v,components:[$,...r.components??[]],registryBaseConfig:j}),d=!0;}let m=!1;if(p["1"]){let{projectPath:g,template:w}=await Tt({cwd:r.cwd,force:r.overwrite,components:r.components});g||(b.break(),process.exit(1)),r.cwd=g;let C=await De(),{url:b$1}=await Ke({rtl:!1,base:C,template:w}),{registryBaseConfig:j,installStyleIndex:v,url:$}=await Ce(b$1,r.cwd);l=await Me({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!o&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:v,components:[$,...r.components??[]],registryBaseConfig:j}),d=!0,m=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 M(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 Ln(r.components,l,{overwrite:r.overwrite});g.stop(),b.log(Un(w$1,r.components,{diff:r.diff,view:r.view}));return}d||await se(r.components,l,r),m&&await Gn(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 he({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$1.array(z$1.string()).safeParse(r);return n.success?n.data:(b.error(""),$(new Error("Something went wrong. Please try again.")),[])}async function Kn(e){let t={};if(!T.existsSync(e.cwd)||!T.existsSync(oe__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!T.existsSync(oe__default.resolve(e.cwd,"components.json"))){if(await J(e.cwd)){let r=await G(e.cwd);r.length>0&&(H("apply --preset <preset>",r,{cwdFlag:"-c"}),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)}.
150
- Before you can apply a preset, 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 Es=z$1.object({cwd:z$1.string(),positionalPreset:z$1.string().optional(),preset:z$1.string().optional(),yes:z$1.boolean(),silent:z$1.boolean()}),Zn=new Command().name("apply").description("apply a preset to an existing project").argument("[preset]","the preset to apply").option("--preset <preset>","preset configuration to apply").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e,t)=>{try{let r=Es.parse({...t,cwd:oe__default.resolve(t.cwd),positionalPreset:e}),n=Fs(r),i=await Kn(r);i.errors["1"]&&(b.break(),b.error(`The ${a.info("apply")} command only works in an existing project.`),b.error(`Run ${a.info(Xn(n))} first.`),b.break(),process.exit(1)),i.errors["3"]&&(b.break(),b.error(`No ${a.info("components.json")} found at ${a.info(r.cwd)}.`),b.error(`Run ${a.info(Xn(n))} first.`),b.break(),process.exit(1));let o=i.config;o||process.exit(1);let s=o.rtl??!1,c=await Ns(r.cwd);if(!n){let d=er({command:"init",template:c,base:S(o.style),rtl:s});await tr({createUrl:d,followUp:`Then run ${a.info("shadcn apply --preset <preset>")} with the preset code or preset URL from ui.shadcn.com.`,prompt:!r.yes}),process.exit(0);}Os(n);let a$1=await ua$1(r.cwd);if(!r.yes){if(b.break(),b.warn(a.warn("Applying a new preset will overwrite existing UI components, fonts, and CSS variables.")),b.warn("Commit or stash your changes before continuing so you can easily go back."),b.break(),b.log(" The following components will be re-installed:"),a$1.length)for(let m=0;m<a$1.length;m+=8)b.log(` - ${a$1.slice(m,m+8).join(", ")}`);else b.log(" - No installed UI components were detected.");b.break();let{proceed:d}=await he({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});d||(b.break(),process.exit(1));}await Y(r.cwd);let p=S(o.style),l=As(n,p,{template:c,rtl:s});await On(oe__default.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:d,installStyleIndex:m,url:h}=await Ce(l,r.cwd,{registries:o.registries});await Me({cwd:r.cwd,yes:!0,force:!1,reinstall:!0,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:m,registryBaseConfig:d,existingConfig:o,components:[h,...a$1]});},{onBackupFailure:()=>{b.error(`Could not back up ${a.info("components.json")}. Aborting.`);}}),b.break(),b.log("Preset applied successfully."),b.break();}catch(r){b.break(),$(r);}finally{V();}});function Fs(e){let t=e.positionalPreset?.trim(),r=e.preset?.trim();return t&&r&&t!==r&&(b.error(`Received two different preset values. Use either the positional preset or ${a.info("--preset")}, or pass the same value to both.`),b.break(),process.exit(1)),r??t}function Os(e){if(G$1(e)||r(e))return;let t=Object.keys(le);t.includes(e)||(b.error(`Invalid preset: ${a.info(e)}.
148
+ }`;await Ee__default.writeFile(r,i,"utf8");}var $s=z$1.object({components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),overwrite:z$1.boolean(),cwd:z$1.string(),all:z$1.boolean(),path:z$1.string().optional(),silent:z$1.boolean(),dryRun:z$1.boolean(),diff:z$1.union([z$1.string(),z$1.literal(true)]).optional(),view:z$1.union([z$1.string(),z$1.literal(true)]).optional()}),Hn=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=$s.parse({components:e$1,...t,cwd:ie__default.resolve(t.cwd)});await Y(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 M(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 ae(e$1,i,r);return}if(!r.yes&&!n&&(s==="registry:style"||s==="registry:theme")){b.break();let{confirm:w}=await ye({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$1(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:p}=await Tn(r),m=!1;if(f["3"]){let{proceed:g}=await ye({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=Ve(a$1?.framework.name),v=await Le(),{url:x}=await Ke({rtl:!1,base:v,template:w}),{registryBaseConfig:P,installStyleIndex:k,url:C}=await Re(x,r.cwd);p=await Ue({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!o,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:k,components:[C,...r.components??[]],registryBaseConfig:P}),m=!0;}let d=!1;if(f["1"]){let{projectPath:g,template:w}=await Tt({cwd:r.cwd,force:r.overwrite,components:r.components});g||(b.break(),process.exit(1)),r.cwd=g;let v=await Le(),{url:x}=await Ke({rtl:!1,base:v,template:w}),{registryBaseConfig:P,installStyleIndex:k,url:C}=await Re(x,r.cwd);p=await Ue({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!o&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:k,components:[C,...r.components??[]],registryBaseConfig:P}),m=!0,d=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//);}if(!p)throw new Error(`Failed to read config at ${a.info(r.cwd)}.`);let{config:h}=await M(r.components,p,{silent:r.silent||o,writeFile:!n});if(p=h,n){let g=w("Resolving items.",{silent:r.silent}).start(),w$1=await Ln(r.components,p,{overwrite:r.overwrite});g.stop(),b.log(Un(w$1,r.components,{diff:r.diff,view:r.view}));return}m||await ae(r.components,p,r),d&&await Gn(r.components[0],p);}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 ye({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$1.array(z$1.string()).safeParse(r);return n.success?n.data:(b.error(""),$(new Error("Something went wrong. Please try again.")),[])}async function Kn(e){let t={};if(!T.existsSync(e.cwd)||!T.existsSync(ie__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!T.existsSync(ie__default.resolve(e.cwd,"components.json"))){if(await J(e.cwd)){let r=await G(e.cwd);r.length>0&&(H("apply --preset <preset>",r,{cwdFlag:"-c"}),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)}.
150
+ Before you can apply a preset, 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 Es=z$1.object({cwd:z$1.string(),positionalPreset:z$1.string().optional(),preset:z$1.string().optional(),yes:z$1.boolean(),silent:z$1.boolean()}),Zn=new Command().name("apply").description("apply a preset to an existing project").argument("[preset]","the preset to apply").option("--preset <preset>","preset configuration to apply").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e,t)=>{try{let r=Es.parse({...t,cwd:ie__default.resolve(t.cwd),positionalPreset:e}),n=Fs(r),i=await Kn(r);i.errors["1"]&&(b.break(),b.error(`The ${a.info("apply")} command only works in an existing project.`),b.error(`Run ${a.info(Xn(n))} first.`),b.break(),process.exit(1)),i.errors["3"]&&(b.break(),b.error(`No ${a.info("components.json")} found at ${a.info(r.cwd)}.`),b.error(`Run ${a.info(Xn(n))} first.`),b.break(),process.exit(1));let o=i.config;o||process.exit(1);let s=o.rtl??!1,c=await Ns(r.cwd);if(!n){let m=er({command:"init",template:c,base:S(o.style),rtl:s});await tr({createUrl:m,followUp:`Then run ${a.info("shadcn apply --preset <preset>")} with the preset code or preset URL from ui.shadcn.com.`,prompt:!r.yes}),process.exit(0);}Os(n);let a$1=await ua$1(r.cwd);if(!r.yes){if(b.break(),b.warn(a.warn("Applying a new preset will overwrite existing UI components, fonts, and CSS variables.")),b.warn("Commit or stash your changes before continuing so you can easily go back."),b.break(),b.log(" The following components will be re-installed:"),a$1.length)for(let d=0;d<a$1.length;d+=8)b.log(` - ${a$1.slice(d,d+8).join(", ")}`);else b.log(" - No installed UI components were detected.");b.break();let{proceed:m}=await ye({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});m||(b.break(),process.exit(1));}await Y(r.cwd);let f=S(o.style),p=As(n,f,{template:c,rtl:s});await On(ie__default.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:m,installStyleIndex:d,url:h}=await Re(p,r.cwd,{registries:o.registries});await Ue({cwd:r.cwd,yes:!0,force:!1,reinstall:!0,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:d,registryBaseConfig:m,existingConfig:o,components:[h,...a$1]});},{onBackupFailure:()=>{b.error(`Could not back up ${a.info("components.json")}. Aborting.`);}}),b.break(),b.log("Preset applied successfully."),b.break();}catch(r){b.break(),$(r);}finally{V();}});function Fs(e){let t=e.positionalPreset?.trim(),r=e.preset?.trim();return t&&r&&t!==r&&(b.error(`Received two different preset values. Use either the positional preset or ${a.info("--preset")}, or pass the same value to both.`),b.break(),process.exit(1)),r??t}function Os(e){if(G$1(e)||r(e))return;let t=Object.keys(fe);t.includes(e)||(b.error(`Invalid preset: ${a.info(e)}.
151
151
  Use one of the available presets: ${t.join(", ")}
152
- or build your own at ${a.info(`${c$1}/create`)}`),b.break(),process.exit(1));}async function Ns(e){let t=await ra$1(e);return _e(t?.framework.name)}function As(e,t,r$1={}){if(G$1(e)){let i=new URL(e);return i.pathname==="/init"&&e.startsWith(c$1)&&i.searchParams.set("track","1"),i.searchParams.set("base",t),i.searchParams.set("rtl",String(r$1.rtl??false)),i.toString()}if(r(e)){let i=q(e);return i||(b.error(`Invalid preset code: ${a.info(e)}`),b.break(),process.exit(1)),fe({...i,base:t,rtl:r$1.rtl??false},{preset:e,template:r$1.template})}let n=le[e];return fe({...n,base:t,rtl:r$1.rtl??n.rtl},{template:r$1.template})}function Ts(e){return /[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function Xn(e){return e?`shadcn init --preset ${Ts(e)}`:"shadcn init"}async function ro(e){let t={},r={cwd:e.cwd,registryFile:oe__default.resolve(e.cwd,e.registryFile),outputDir:oe__default.resolve(e.cwd,e.outputDir)};return T.existsSync(r.registryFile)||(t["13"]=true),await T.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 Ls=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),no=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=Ls.parse({cwd:oe.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:n$1}=await ro(r),i=await je.readFile(n$1.registryFile,"utf-8"),o$1=o.safeParse(JSON.parse(i));o$1.success||(b.error(`Invalid registry file found at ${a.info(n$1.registryFile)}.`),process.exit(1));let s=w("Building registry...");for(let c of o$1.data.items){s.start(`Building ${c.name}...`),c.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let p of c.files??[])p.content=await je.readFile(oe.resolve(n$1.cwd,p.path),"utf-8");let a$1=n.safeParse(c);if(!a$1.success){b.error(`Invalid registry item found for ${a.info(c.name)}.`);continue}await je.writeFile(oe.resolve(n$1.outputDir,`${a$1.data.name}.json`),JSON.stringify(a$1.data,null,2));}await je.copyFile(n$1.registryFile,oe.resolve(n$1.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){b.break(),$(r);}});var Us=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),io=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=Us.parse({component:e,...t}),n=oe__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 J(n)){let a=await G(n);a.length>0&&(H("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,p=o.filter(d=>{for(let m of d.files??[]){let h=oe__default.resolve(a$1,typeof m=="string"?m:m.path);if(existsSync(h))return !0}return !1}),l=[];for(let d of p){let m=await oo(d,i);m.length&&l.push({name:d.name,changes:m});}l.length||(b.info("No updates found."),process.exit(0)),b.info("The following components have updates available:");for(let d of l){b.info(`- ${d.name}`);for(let m of d.changes)b.info(` - ${m.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 oo(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 Ws(a.patch),b.info("");}catch(r){$(r);}});async function oo(e,t){let r=await ka$1(t.style,[e]),n=await ia(t.tailwind.baseColor),i=ke(r);if(!r)return [];let o=[];for(let s of r){let c=await la(t,s);if(c)for(let a of s.files??[]){let p=oe__default.resolve(c,typeof a=="string"?a:a.path);if(!existsSync(p))continue;let l=await promises.readFile(p,"utf8");if(typeof a=="string"||!a.content)continue;let d=await B$1({filename:a.path,raw:a.content,config:t,baseColor:n,supportedFontMarkers:i},[x,y,a$1,A,c$2,g,d$1,f,z$2]),m=diffLines(d,l);m.length>1&&o.push({filePath:p,patch:m});}}return o}async function Ws(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 so=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=oe__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 p=o.find(d=>d.name===a$1);p||(b.error(`Component ${a.info(a$1)} not found in the shadcn registry.`),process.exit(1));let l=p.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(p=>p.length)));for(let{component:a$1,links:p}of s){b.log(a.info(a$1));for(let[l,d]of Object.entries(p))b.log(` - ${l.padEnd(c+2)}${d}`);b.break();}}catch(r){$(r);}});var co="https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases",lo=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=oe__default.resolve(e.cwd);if(!existsSync(oe__default.resolve(t,"components.json"))&&await J(t)){let c=await G(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)):H("info",c),process.exit(1));}let r=await ra$1(t),n=await N(t),i=await ua$1(t),o=S(n?.style),s=Ys(r,n,i,o);if(e.json){console.log(JSON.stringify(s,null,2));return}Ks(s);}catch(t){$(t);}});function Hs(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 Ys(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:Hs(t.registries)}:null,components:r,links:{docs:`${c$1}/docs`,components:`${c$1}/docs/components/${n}/[component].md`,ui:`${co}/${n}/ui/[component].tsx`,examples:`${co}/${n}/examples/[component]-example.tsx`,schema:"https://ui.shadcn.com/schema.json"}}}function Ks(e){b.log(a.info("Project")),e.project?Be({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?(Be({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")),Be({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")),Be({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:"),Be(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")),Be(e.links),b.break();}function Be(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 Ee="latest",Ut=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Ee}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Ee}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${Ee}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
152
+ or build your own at ${a.info(`${c$1}/create`)}`),b.break(),process.exit(1));}async function Ns(e){let t=await ra$1(e);return Ve(t?.framework.name)}function As(e,t,r$1={}){if(G$1(e)){let i=new URL(e);return i.pathname==="/init"&&e.startsWith(c$1)&&i.searchParams.set("track","1"),i.searchParams.set("base",t),i.searchParams.set("rtl",String(r$1.rtl??false)),i.toString()}if(r(e)){let i=q(e);return i||(b.error(`Invalid preset code: ${a.info(e)}`),b.break(),process.exit(1)),pe({...i,base:t,rtl:r$1.rtl??false},{preset:e,template:r$1.template})}let n=fe[e];return pe({...n,base:t,rtl:r$1.rtl??n.rtl},{template:r$1.template})}function Ts(e){return /[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function Xn(e){return e?`shadcn init --preset ${Ts(e)}`:"shadcn init"}async function ro(e){let t={},r={cwd:e.cwd,registryFile:ie__default.resolve(e.cwd,e.registryFile),outputDir:ie__default.resolve(e.cwd,e.outputDir)};return T.existsSync(r.registryFile)||(t["13"]=true),await T.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 Ls=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),no=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=Ls.parse({cwd:ie.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:n$1}=await ro(r),i=await Ee.readFile(n$1.registryFile,"utf-8"),o$1=o.safeParse(JSON.parse(i));o$1.success||(b.error(`Invalid registry file found at ${a.info(n$1.registryFile)}.`),process.exit(1));let s=w("Building registry...");for(let c of o$1.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 Ee.readFile(ie.resolve(n$1.cwd,f.path),"utf-8");let a$1=n.safeParse(c);if(!a$1.success){b.error(`Invalid registry item found for ${a.info(c.name)}.`);continue}await Ee.writeFile(ie.resolve(n$1.outputDir,`${a$1.data.name}.json`),JSON.stringify(a$1.data,null,2));}await Ee.copyFile(n$1.registryFile,ie.resolve(n$1.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){b.break(),$(r);}});var Us=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),io=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=Us.parse({component:e,...t}),n=ie__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 J(n)){let a=await G(n);a.length>0&&(H("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=ie__default.resolve(a$1,typeof d=="string"?d:d.path);if(existsSync(h))return !0}return !1}),p=[];for(let m of f){let d=await oo(m,i);d.length&&p.push({name:m.name,changes:d});}p.length||(b.info("No updates found."),process.exit(0)),b.info("The following components have updates available:");for(let m of p){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 oo(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 Ws(a.patch),b.info("");}catch(r){$(r);}});async function oo(e,t){let r=await ka$1(t.style,[e]),n=await ia(t.tailwind.baseColor),i=$e(r);if(!r)return [];let o=[];for(let s of r){let c=await la(t,s);if(c)for(let a of s.files??[]){let f$1=ie__default.resolve(c,typeof a=="string"?a:a.path);if(!existsSync(f$1))continue;let p=await promises.readFile(f$1,"utf8");if(typeof a=="string"||!a.content)continue;let m=await B$1({filename:a.path,raw:a.content,config:t,baseColor:n,supportedFontMarkers:i},[x,y,a$1,A,c$2,g,d$1,f,z$2]),d=diffLines(m,p);d.length>1&&o.push({filePath:f$1,patch:d});}}return o}async function Ws(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 so=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=ie__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 p=f.meta?.links?.[i];if(!p||Object.keys(p).length===0){b.warn(`No documentation links available for ${a.info(a$1)}.`);continue}s.push({component:a$1,base:i,links:p});}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[p,m]of Object.entries(f))b.log(` - ${p.padEnd(c+2)}${m}`);b.break();}}catch(r){$(r);}});var co="https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases",lo=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=ie__default.resolve(e.cwd);if(!existsSync(ie__default.resolve(t,"components.json"))&&await J(t)){let c=await G(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)):H("info",c),process.exit(1));}let r=await ra$1(t),n=await N(t),i=await ua$1(t),o=S(n?.style),s=Ys(r,n,i,o);if(e.json){console.log(JSON.stringify(s,null,2));return}Ks(s);}catch(t){$(t);}});function Hs(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 Ys(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:Hs(t.registries)}:null,components:r,links:{docs:`${c$1}/docs`,components:`${c$1}/docs/components/${n}/[component].md`,ui:`${co}/${n}/ui/[component].tsx`,examples:`${co}/${n}/examples/[component]-example.tsx`,schema:"https://ui.shadcn.com/schema.json"}}}function Ks(e){b.log(a.info("Project")),e.project?ze({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?(ze({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")),ze({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")),ze({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:"),ze(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")),ze(e.links),b.break();}function ze(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 Fe="latest",Ut=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Fe}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Fe}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${Fe}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
153
153
  command = "npx"
154
- args = ["shadcn@${Ee}", "mcp"]
155
- `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${Ee}`,"mcp"],enabled:true}}}}],Mt=[`shadcn@${Ee}`],yr=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 Y(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){b.break(),$(t);}}),ta=hr.object({client:hr.enum(["claude","cursor","vscode","codex","opencode"]),cwd:hr.string()});yr.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Ut.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let n=(t.parent?.opts()||{}).cwd||process.cwd(),i=e.client;if(!i){let p=await he({type:"select",name:"client",message:"Which MCP client are you using?",choices:Ut.map(l=>({title:l.label,value:l.name}))});p.client||(b.break(),process.exit(1)),i=p.client;}let o=ta.parse({client:i,cwd:n}),s=await N(o.cwd);if(o.client==="codex"){if(s)await D([],Mt,s,{silent:!1});else {let p=await a$2(o.cwd),l=p==="npm"?"install":"add",d=p==="npm"?"--save-dev":"-D",m=w("Installing dependencies...").start();await execa(p,[l,d,...Mt],{cwd:o.cwd}),m.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]
154
+ args = ["shadcn@${Fe}", "mcp"]
155
+ `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${Fe}`,"mcp"],enabled:true}}}}],Mt=[`shadcn@${Fe}`],yr=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 Y(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){b.break(),$(t);}}),ta=hr.object({client:hr.enum(["claude","cursor","vscode","codex","opencode"]),cwd:hr.string()});yr.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Ut.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 ye({type:"select",name:"client",message:"Which MCP client are you using?",choices:Ut.map(p=>({title:p.label,value:p.name}))});f.client||(b.break(),process.exit(1)),i=f.client;}let o=ta.parse({client:i,cwd:n}),s=await N(o.cwd);if(o.client==="codex"){if(s)await D([],Mt,s,{silent:!1});else {let f=await a$2(o.cwd),p=f==="npm"?"install":"add",m=f==="npm"?"--save-dev":"-D",d=w("Installing dependencies...").start();await execa(f,[p,m,...Mt],{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]
156
156
  command = "npx"
157
- args = ["shadcn@${Ee}", "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$1=await na(o);if(c.succeed("Configuring MCP server."),s)await D([],Mt,s,{silent:!1});else {let p=await a$2(o.cwd),l=p==="npm"?"install":"add",d=p==="npm"?"--save-dev":"-D",m=w("Installing dependencies...").start();await execa(p,[l,d,...Mt],{cwd:o.cwd}),m.succeed("Installing dependencies.");}b.break(),b.success(`Configuration saved to ${a$1}.`),b.break();}catch(r){$(r);}});var ra=(e,t)=>t;async function na(e){let{client:t,cwd:r}=e,n=Ut.find(a=>a.name===t);if(!n)throw new Error(`Unknown client: ${t}. Available clients: ${Ut.map(a=>a.name).join(", ")}`);let i=oe__default.join(r,n.configPath),o=oe__default.dirname(i);await T.ensureDir(o);let s={};try{let a=await promises.readFile(i,"utf-8");s=JSON.parse(a);}catch{}let c=wn(s,n.config,{arrayMerge:ra});return await promises.writeFile(i,JSON.stringify(c,null,2)+`
158
- `,"utf-8"),n.configPath}var we={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 go(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([br("**/*.{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(we).map(([l,d])=>({title:d.name,value:l})),o=await he([{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 we&&o.targetLibrary in we))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=we[o.sourceLibrary],c=we[o.targetLibrary],{confirm:a$1}=await he({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} files in ${a.info(`./${oe__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 p=w("Migrating icons...")?.start();await Promise.all(r.map(async l=>{p.text=`Migrating ${l}...`;let d=oe__default.join(t,l),m=await promises.readFile(d,"utf-8"),h=await fa(m,o.sourceLibrary,o.targetLibrary,n);await promises.writeFile(d,h);})),p.succeed("Migration complete.");}async function fa(e,t,r,n){let i=we[t]?.import,o=we[r]?.import,s=await promises.mkdtemp(oe__default.join(tmpdir(),"shadcn-")),c=new Project({compilerOptions:{}}),a=oe__default.join(s,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),p=c.createSourceFile(a,e,{scriptKind:ScriptKind.TSX}),l=[];for(let d of p.getImportDeclarations()??[])if(d.getModuleSpecifier()?.getText()===`"${i}"`){for(let m of d.getNamedImports()??[]){let h=m.getName(),g=Object.values(n).find(w=>w[t]===h)?.[r];!g||l.includes(g)||(l.push(g),m.remove(),p.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(w=>w.getTagNameNode()?.getText()===h).forEach(w=>w.getTagNameNode()?.replaceWithText(g)));}d.getNamedImports()?.length===0&&d.remove();}return l.length>0&&p.addImportDeclaration({moduleSpecifier:o,namedImports:l.map(d=>({name:d}))}),await p.getText()}function ma(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function da(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 p=c[1],l=c[2];n==="slot"&&p==="Slot"&&!l?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:p,alias:l,isType:true});}else if(a){let p=a[1],l=a[2];n==="slot"&&p==="Slot"&&l==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:p,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 ho(e,t={}){let r,n;if(t.path){if(n=e.resolvedPaths.cwd,t.path.includes("*"))r=await br(t.path,{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else {let a=oe__default.resolve(n,t.path),p=await promises.stat(a).catch(()=>null);if(!p)throw new Error(`File not found: ${t.path}`);if(p.isDirectory())n=a,r=await br("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else if(p.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 br("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true});}if(!t.yes){let c=t.path?t.path:`./${oe__default.relative(e.resolvedPaths.cwd,n)}`,{confirm:a$1}=await he({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=oe__default.join(n,c),p=await promises.readFile(a,"utf-8"),{content:l,replacedPackages:d}=await ua(p);d.forEach(m=>o.add(m)),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=oe__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(l,JSON.stringify(c,null,2)+`
159
- `),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 ua(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,C,b,j,v,$]=a;if(v==="icons"||v.startsWith("icons/"))continue;n.push(g),n.length===1&&(o=j,s=$===";"),i.push(`@radix-ui/react-${v}`);let R=!!w;if(C){let _=ma(v);r.push({name:_,alias:C,isType:R});}else b&&da(b,R,r,v);}if(r.length===0)return {content:e,replacedPackages:[]};let p=r.filter((g,w,C)=>w===C.findIndex(b=>b.name===g.name&&b.alias===g.alias&&b.isType===g.isType)),d=`import { ${p.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,C)=>g.replace(w,C===0?d:""),c),c=c.replace(/\n\s*\n\s*\n/g,`
160
-
161
- `),p.some(g=>g.name==="Slot"&&g.alias==="SlotPrimitive")&&(c=c.split(`
162
- `).map(C=>{if(C.trim().startsWith("import "))return C;let b=C;return b=b.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),b=b.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),b=b.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),b=b.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),b=b.replace(/\bSlot\b/g,(j,v,$)=>{let R=$.substring(0,v),_=(R.match(/"/g)||[]).length,be=(R.match(/'/g)||[]).length;return _%2!==0||be%2!==0?j:"__SLOT_PLACEHOLDER__"}),b=b.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),b}).join(`
163
- `));let h=Array.from(new Set(i));return {content:c,replacedPackages:h}}var ha=["sidebar.tsx","pagination.tsx","calendar.tsx"],ya=`${c$1}/docs/rtl#manual-migration-optional`;async function yo(e,t={}){let r,n;if(t.path){if(n=e.resolvedPaths.cwd,t.path.includes("*"))r=await br(t.path,{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else {let p=oe__default.resolve(n,t.path),l=await promises.stat(p).catch(()=>null);if(!l)throw new Error(`File not found: ${t.path}`);if(l.isDirectory())n=p,r=await br("**/*.{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 br("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true});}if(!t.yes){let a$1=t.path?t.path:`./${oe__default.relative(e.resolvedPaths.cwd,n)}`,{confirm:p}=await he({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} file(s) in ${a.info(a$1)} to RTL. Continue?`});p||(b.info("Migration cancelled."),process.exit(0));}let i=w("Updating components.json...").start();try{let a=oe__default.resolve(e.resolvedPaths.cwd,"components.json"),p=JSON.parse(await promises.readFile(a,"utf-8"));p.rtl=!0,await promises.writeFile(a,JSON.stringify(p,null,2)+`
164
- `),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 p=oe__default.join(n,a),l=await promises.readFile(p,"utf-8"),d=await e$1(l,true);d!==l&&(await promises.writeFile(p,d),s++);let m=oe__default.basename(a);ha.includes(m)&&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(ya)} for more information.`);}}async function bo(e){let t={};if(!T.existsSync(e.cwd)||!T.existsSync(oe__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!T.existsSync(oe__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)}.
165
- 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 xo=[{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)."}],xa=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),migration:z$1.string().refine(e=>e&&xo.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional(),path:z$1.string().optional()}),vo=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=xa.parse({cwd:oe__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 xo)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 bo(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 go(o),n.migration==="radix"&&await ho(o,{yes:n.yes,path:n.path}),n.migration==="rtl"&&await yo(o,{yes:n.yes,path:n.path});}catch(n){b.break(),$(n);}});var Ra=z$1.object({cwd:z$1.string(),silent:z$1.boolean()}),Ro=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=Ra.parse({cwd:oe__default.resolve(t.cwd),silent:t.silent}),n=e.length>0?e:await $a({silent:r.silent});await ka(n,r.cwd,{silent:r.silent});}catch(r){b.break(),$(r);}});function Sa(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 Sr(e,t,r){return `${e} ${e===1?t:r}`}async function ka(e,t,r){let n=oe__default.resolve(t,"components.json");if(!T.existsSync(n))throw new Error(`No ${a.info("components.json")} found. Run ${a.info("shadcn init")} first.`);let i=e.map(Sa),o=i.filter(g=>!g.url),s=[];if(o.length>0){let g=w("Fetching registries.",{silent:r.silent}).start(),w$1=await ma$1();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 C=s.find(b=>b.name===g);if(!C)throw new Error(`Registry ${a.info(g)} not found. Provide a URL: ${a.info(`${g}=https://.../{name}.json`)}`);c[g]=C.url;}}if(Object.keys(c).length===0)return {addedRegistries:[]};let a$1=await T.readJson(n),p=a$1.registries||{},l={},d$1=[];for(let[g,w]of Object.entries(c))p[g]?d$1.push(g):l[g]=w;if(Object.keys(l).length===0){if(d$1.length>0&&!r.silent){w(`Skipped ${Sr(d$1.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let g of d$1)b.log(` - ${g}`);}else r.silent||b.info("No new registries to add.");return}let m={...a$1,registries:{...p,...l}},h=w("Updating components.json.",{silent:r.silent}).start();if(await T.writeJson(n,m,{spaces:2}),h.succeed(),!r.silent){let g=Object.keys(l);w(`Added ${Sr(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let w of g)b.log(` - ${w}`);if(d$1.length>0){w(`Skipped ${Sr(d$1.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let w of d$1)b.log(` - ${w}`);}}}async function $a(e){let t=w("Fetching registries.",{silent:e.silent}).start(),r=await ma$1();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 he({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 So=new Command().name("registry").description("manage registries").addCommand(Ro);var ja=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),Io=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=ja.parse({cwd:oe__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 Y(r.cwd);let n=T$1({style:"new-york",resolvedPaths:{cwd:r.cwd}}),i=U(n),o=oe__default.resolve(r.cwd,"components.json");if(T.existsSync(o)){let l=await T.readJson(o),d=c.partial().parse(l);i=U({...n,...d});}let s=i;try{let l=await N(r.cwd);l&&(s=U(l));}catch{}let{config:c$1,newRegistries:a}=await M(e.map(l=>`${l}/registry`),s,{silent:!0,writeFile:!1});a.length>0&&(s.registries=c$1.registries),W(e,s);let p=await va(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(p,null,2)),process.exit(0);}catch(r){$(r);}finally{V();}});var Fa=z$1.object({cwd:z$1.string()}),Fo=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=Fa.parse({cwd:oe__default.resolve(t.cwd)});await Y(r.cwd);let n=U({}),i=oe__default.resolve(r.cwd,"components.json");if(T.existsSync(i)){let p=await T.readJson(i),l=c.partial().parse(p);n=U(l);}let o=n;try{let p=await N(r.cwd);p&&(o=U(p));}catch{}let{config:s,newRegistries:c$1}=await M(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 Oo={version:"4.3.0"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Aa(){let e=new Command().name("shadcn").description("build your component library").version(Oo.version,"-v, --version","display the version number");e.addCommand(Nn).addCommand(Zn).addCommand(Hn).addCommand(io).addCommand(so).addCommand(Fo).addCommand(Io).addCommand(vo).addCommand(lo).addCommand(no).addCommand(yr).addCommand(So),e.parse();}Aa();
157
+ args = ["shadcn@${Fe}", "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$1=await na(o);if(c.succeed("Configuring MCP server."),s)await D([],Mt,s,{silent:!1});else {let f=await a$2(o.cwd),p=f==="npm"?"install":"add",m=f==="npm"?"--save-dev":"-D",d=w("Installing dependencies...").start();await execa(f,[p,m,...Mt],{cwd:o.cwd}),d.succeed("Installing dependencies.");}b.break(),b.success(`Configuration saved to ${a$1}.`),b.break();}catch(r){$(r);}});var ra=(e,t)=>t;async function na(e){let{client:t,cwd:r}=e,n=Ut.find(a=>a.name===t);if(!n)throw new Error(`Unknown client: ${t}. Available clients: ${Ut.map(a=>a.name).join(", ")}`);let i=ie__default.join(r,n.configPath),o=ie__default.dirname(i);await T.ensureDir(o);let s={};try{let a=await promises.readFile(i,"utf-8");s=JSON.parse(a);}catch{}let c=wn(s,n.config,{arrayMerge:ra});return await promises.writeFile(i,JSON.stringify(c,null,2)+`
158
+ `,"utf-8"),n.configPath}var be={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 go(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([br("**/*.{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(be).map(([p,m])=>({title:m.name,value:p})),o=await ye([{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 be&&o.targetLibrary in be))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=be[o.sourceLibrary],c=be[o.targetLibrary],{confirm:a$1}=await ye({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} files in ${a.info(`./${ie__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 p=>{f.text=`Migrating ${p}...`;let m=ie__default.join(t,p),d=await promises.readFile(m,"utf-8"),h=await fa(d,o.sourceLibrary,o.targetLibrary,n);await promises.writeFile(m,h);})),f.succeed("Migration complete.");}async function fa(e,t,r,n){let i=be[t]?.import,o=be[r]?.import,s=await promises.mkdtemp(ie__default.join(tmpdir(),"shadcn-")),c=new Project({compilerOptions:{}}),a=ie__default.join(s,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),f=c.createSourceFile(a,e,{scriptKind:ScriptKind.TSX}),p=[];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||p.includes(g)||(p.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 p.length>0&&f.addImportDeclaration({moduleSpecifier:o,namedImports:p.map(m=>({name:m}))}),await f.getText()}function ma(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function da(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],p=c[2];n==="slot"&&f==="Slot"&&!p?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:f,alias:p,isType:true});}else if(a){let f=a[1],p=a[2];n==="slot"&&f==="Slot"&&p==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:f,alias:p,isType:t});}else n==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t});}}async function ho(e,t={}){let r,n;if(t.path){if(n=e.resolvedPaths.cwd,t.path.includes("*"))r=await br(t.path,{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else {let a=ie__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 br("**/*.{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 br("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true});}if(!t.yes){let c=t.path?t.path:`./${ie__default.relative(e.resolvedPaths.cwd,n)}`,{confirm:a$1}=await ye({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=ie__default.join(n,c),f=await promises.readFile(a,"utf-8"),{content:p,replacedPackages:m}=await ua(f);m.forEach(d=>o.add(d)),await promises.writeFile(a,p);})),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 p=ie__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(p,JSON.stringify(c,null,2)+`
159
+ `),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 ua(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,v,x,P,k,C]=a;if(k==="icons"||k.startsWith("icons/"))continue;n.push(g),n.length===1&&(o=P,s=C===";"),i.push(`@radix-ui/react-${k}`);let R=!!w;if(v){let L=ma(k);r.push({name:L,alias:v,isType:R});}else x&&da(x,R,r,k);}if(r.length===0)return {content:e,replacedPackages:[]};let f=r.filter((g,w,v)=>w===v.findIndex(x=>x.name===g.name&&x.alias===g.alias&&x.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,v)=>g.replace(w,v===0?m:""),c),c=c.replace(/\n\s*\n\s*\n/g,`
160
+
161
+ `),f.some(g=>g.name==="Slot"&&g.alias==="SlotPrimitive")&&(c=c.split(`
162
+ `).map(v=>{if(v.trim().startsWith("import "))return v;let x=v;return x=x.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),x=x.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),x=x.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),x=x.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),x=x.replace(/\bSlot\b/g,(P,k,C)=>{let R=C.substring(0,k),L=(R.match(/"/g)||[]).length,K=(R.match(/'/g)||[]).length;return L%2!==0||K%2!==0?P:"__SLOT_PLACEHOLDER__"}),x=x.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),x}).join(`
163
+ `));let h=Array.from(new Set(i));return {content:c,replacedPackages:h}}var ha=["sidebar.tsx","pagination.tsx","calendar.tsx"],ya=`${c$1}/docs/rtl#manual-migration-optional`;async function yo(e,t={}){let r,n;if(t.path){if(n=e.resolvedPaths.cwd,t.path.includes("*"))r=await br(t.path,{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else {let f=ie__default.resolve(n,t.path),p=await promises.stat(f).catch(()=>null);if(!p)throw new Error(`File not found: ${t.path}`);if(p.isDirectory())n=f,r=await br("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true,ignore:["**/node_modules/**"]});else if(p.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 br("**/*.{js,ts,jsx,tsx}",{cwd:n,onlyFiles:true});}if(!t.yes){let a$1=t.path?t.path:`./${ie__default.relative(e.resolvedPaths.cwd,n)}`,{confirm:f}=await ye({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=ie__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)+`
164
+ `),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=ie__default.join(n,a),p=await promises.readFile(f,"utf-8"),m=await e$1(p,true);m!==p&&(await promises.writeFile(f,m),s++);let d=ie__default.basename(a);ha.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(ya)} for more information.`);}}async function bo(e){let t={};if(!T.existsSync(e.cwd)||!T.existsSync(ie__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!T.existsSync(ie__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)}.
165
+ 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 xo=[{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)."}],xa=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),migration:z$1.string().refine(e=>e&&xo.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional(),path:z$1.string().optional()}),vo=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=xa.parse({cwd:ie__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 xo)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 bo(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 go(o),n.migration==="radix"&&await ho(o,{yes:n.yes,path:n.path}),n.migration==="rtl"&&await yo(o,{yes:n.yes,path:n.path});}catch(n){b.break(),$(n);}});var Ra=z$1.object({cwd:z$1.string(),silent:z$1.boolean()}),Ro=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=Ra.parse({cwd:ie__default.resolve(t.cwd),silent:t.silent}),n=e.length>0?e:await $a({silent:r.silent});await ka(n,r.cwd,{silent:r.silent});}catch(r){b.break(),$(r);}});function Sa(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 Sr(e,t,r){return `${e} ${e===1?t:r}`}async function ka(e,t,r){let n=ie__default.resolve(t,"components.json");if(!T.existsSync(n))throw new Error(`No ${a.info("components.json")} found. Run ${a.info("shadcn init")} first.`);let i=e.map(Sa),o=i.filter(g=>!g.url),s=[];if(o.length>0){let g=w("Fetching registries.",{silent:r.silent}).start(),w$1=await ma$1();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 v=s.find(x=>x.name===g);if(!v)throw new Error(`Registry ${a.info(g)} not found. Provide a URL: ${a.info(`${g}=https://.../{name}.json`)}`);c[g]=v.url;}}if(Object.keys(c).length===0)return {addedRegistries:[]};let a$1=await T.readJson(n),f=a$1.registries||{},p={},m=[];for(let[g,w]of Object.entries(c))f[g]?m.push(g):p[g]=w;if(Object.keys(p).length===0){if(m.length>0&&!r.silent){w(`Skipped ${Sr(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,...p}},h=w("Updating components.json.",{silent:r.silent}).start();if(await T.writeJson(n,d$1,{spaces:2}),h.succeed(),!r.silent){let g=Object.keys(p);w(`Added ${Sr(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let w of g)b.log(` - ${w}`);if(m.length>0){w(`Skipped ${Sr(m.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let w of m)b.log(` - ${w}`);}}}async function $a(e){let t=w("Fetching registries.",{silent:e.silent}).start(),r=await ma$1();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 ye({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 So=new Command().name("registry").description("manage registries").addCommand(Ro);var ja=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),Io=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=ja.parse({cwd:ie__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 Y(r.cwd);let n=T$1({style:"new-york",resolvedPaths:{cwd:r.cwd}}),i=U(n),o=ie__default.resolve(r.cwd,"components.json");if(T.existsSync(o)){let p=await T.readJson(o),m=c.partial().parse(p);i=U({...n,...m});}let s=i;try{let p=await N(r.cwd);p&&(s=U(p));}catch{}let{config:c$1,newRegistries:a}=await M(e.map(p=>`${p}/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 Fa=z$1.object({cwd:z$1.string()}),Fo=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=Fa.parse({cwd:ie__default.resolve(t.cwd)});await Y(r.cwd);let n=U({}),i=ie__default.resolve(r.cwd,"components.json");if(T.existsSync(i)){let f=await T.readJson(i),p=c.partial().parse(f);n=U(p);}let o=n;try{let f=await N(r.cwd);f&&(o=U(f));}catch{}let{config:s,newRegistries:c$1}=await M(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 Oo={version:"4.3.1"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Aa(){let e=new Command().name("shadcn").description("build your component library").version(Oo.version,"-v, --version","display the version number");e.addCommand(Nn).addCommand(Zn).addCommand(Hn).addCommand(io).addCommand(so).addCommand(Fo).addCommand(Io).addCommand(vo).addCommand(lo).addCommand(no).addCommand(yr).addCommand(So),e.parse();}Aa();