shadcn 4.5.0 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +93 -93
  2. package/package.json +1 -1
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-KJ7WG52C.js';import {r,q}from'./chunk-XEZLDAV3.js';import {b,a,G as G$1,ra as ra$1,ua,c as c$1,$,V,sa,N,O,w,d,P,M,fa as fa$1,ha,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 as la$1,B as B$1,x,y,A,z as z$2,ma,U as U$1,W,va as va$1,_,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 xr from'fast-glob';import T from'fs-extra';import Mo from'open';import we from'prompts';import xn from'dedent';import Bo,{tmpdir}from'os';import {execa}from'execa';import $$1 from'postcss';import Xo from'postcss/lib/at-rule';import yr,{z as z$1}from'zod';import {twMerge}from'tailwind-merge';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind}from'ts-morph';import bn from'deepmerge';import {Command}from'commander';import {diffLines,structuredPatch,diffWords}from'diff';import {dim,yellow,bold,green,cyan,red}from'kleur/colors';import*as Fe from'fs/promises';import Fe__default from'fs/promises';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';var Do=["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 Lo(e);if(!t.length)return [];let r=await xr(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=Do.some(a=>xr.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 Lo(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 nn(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
- 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 on(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 U(e,t,r={}){r={silent:false,writeFile:true,...r};let i=(await on(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 pe={nova:{title:"Nova",description:"Lucide / Geist",style:"nova",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"geist",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},vega:{title:"Vega",description:"Lucide / Inter",style:"vega",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},maia:{title:"Maia",description:"Hugeicons / Figtree",style:"maia",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"figtree",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},lyra:{title:"Lyra",description:"Phosphor / JetBrains Mono",style:"lyra",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"phosphor",font:"jetbrains-mono",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},mira:{title:"Mira",description:"Hugeicons / Inter",style:"mira",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},luma:{title:"Luma",description:"Lucide / Inter",style:"luma",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},sera:{title:"Sera",description:"Lucide / Noto Sans + Playfair Display",style:"sera",baseColor:"taupe",theme:"taupe",chartColor:"taupe",iconLibrary:"lucide",font:"noto-sans",fontHeading:"playfair-display",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false}};function tr(e){let t=new URL(`${c$1}/create`),{rtl:r,pointer:n,...i}=e??{};for(let[o,s]of Object.entries(i))s!==void 0&&t.searchParams.set(o,String(s));return r&&t.searchParams.set("rtl","true"),n&&t.searchParams.set("pointer","true"),t.toString()}async function rr(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 we({type:"confirm",name:"proceed",message:"Open in browser?",initial:true});t&&await Mo(e.createUrl);}function me(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),t?.only&&r.set("only",t.only),t?.pointer&&r.set("pointer","true"),r.set("track","1"),`${c$1}/init?${r.toString()}`}async function _e(){let{base:e}=await we({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 qe(e){let t=Object.entries(pe),{selectedPreset:r}=await we({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=tr({command:"init",rtl:e.rtl,pointer:e.pointer,base:e.base,...e.template&&{template:e.template}});await rr({createUrl:i,followUp:`Then ${a.info("copy and run the command")} from ui.shadcn.com.`}),process.exit(0);}let n=pe[r];return n||process.exit(1),{url:me({...n,base:e.base,rtl:e.rtl},{template:e.template,pointer:e.pointer}),base:e.base}}async function Se(e,t,r){let n=U$1(T$1({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:i}=await U([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(Wo(e)){let a=new URL(e);a.searchParams.delete("track"),c=a.toString();}return {registryBaseConfig:s,installStyleIndex:o?.extends!=="none",url:c}}function Wo(e){try{return new URL(e).pathname==="/init"&&e.startsWith(c$1)}catch{return false}}var zo=process.env.SHADCN_GITHUB_URL??"https://github.com/shadcn-ui/ui.git";function B(e){return {...e,frameworks:e.frameworks??[],scaffold:e.scaffold??an({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??Yo}}function $e(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=an({title:e.title,templateDir:r.templateDir}),n}function Jo(e){switch(e){case "pnpm":return ["--no-frozen-lockfile"];default:return []}}async function Go(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 Ho(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 sn(e);}async function Ho(e){try{let{stdout:t}=await execa(e,["--version"]);return `${e}@${t.trim()}`}catch{return `${e}@*`}}async function sn(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 sn(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 an({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(Bo.tmpdir(),`shadcn-template-${Date.now()}`);await execa("git",["clone","--depth","1","--filter=blob:none","--sparse",zo,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 Go(r,n);let c=["install",...Jo(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 Yo({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 cn={"--font-heading":"cn-font-heading"};function Ko(e){return e.startsWith("--")?e:`--${e}`}function Ie(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=cn[i];o&&t.add(o);}for(let n of Object.values(r.cssVars??{}))for(let i of Object.keys(n??{})){let o=cn[Ko(i)];o&&t.add(o);}}return Array.from(t)}function ln(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 Pt(e,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,...r};let n=t.resolvedPaths.tailwindCss,i=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 Xe(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 Xe(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=[Zo(t)];n.cleanupDefaultNextStyles&&i.push(mn()),n.tailwindVersion==="v4"&&(i=[],i.push(ri({params:"dark (&:is(.dark *))"})),n.cleanupDefaultNextStyles&&i.push(mn()),i.push(ei(t,{overwriteCssVars:n.overwriteCssVars})),i.push(ti(t)),n.tailwindConfig&&(i.push(ni(n.tailwindConfig)),i.push(ii(n.tailwindConfig)),i.push(oi(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 Zo(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 Xo||(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 pn(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 mn(){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()),pn(e);let r=e.nodes.find(n=>n.type==="atrule"&&n.params==="(prefers-color-scheme: dark)");r&&(pn(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 ei(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=jt(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"),dn(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 ti(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=jt(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=dn(s)||ai(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 jt(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 ri({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 ni(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let n=si(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 oi(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=jt(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:`
2
+ import {b as b$1,a as a$2}from'./chunk-KJ7WG52C.js';import {r,q,c as c$3,g as g$1,k,l,h,i,d as d$2,p,f as f$1}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 as sa$1,N,O as O$1,w,d,P,M as M$1,fa as fa$1,ha as ha$1,K as K$1,L,I,J,ta as ta$1,T,ba,H as H$1,e,ea as ea$1,S,ka,ia as ia$1,la as la$1,B as B$1,x,y,A,z as z$1,ma as ma$1,U as U$1,W as W$1,va,_ as _$1,X,na as na$1,ga as ga$1,qa as qa$1,q as q$1,Z,k as k$1,R,Y as Y$1,Q,D,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 se from'path';import se__default,{join}from'path';import {promises,existsSync}from'fs';import Mr from'fast-glob';import O from'fs-extra';import Ai from'open';import we from'prompts';import Xo from'dedent';import Ti,{tmpdir}from'os';import {execa}from'execa';import I$1 from'postcss';import Wi from'postcss/lib/at-rule';import Lr,{z}from'zod';import {twMerge}from'tailwind-merge';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind,Node}from'ts-morph';import qo from'deepmerge';import {Command}from'commander';import {diffLines,structuredPatch,diffWords}from'diff';import {dim,yellow,bold,green,cyan,red}from'kleur/colors';import*as Ae from'fs/promises';import Ae__default from'fs/promises';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';var $i=["next.config.*","vite.config.*","astro.config.*","remix.config.*","nuxt.config.*","svelte.config.*","gatsby-config.*","angular.json"];async function U(e){if(O.existsSync(se__default.resolve(e,"pnpm-workspace.yaml")))return true;let t=se__default.resolve(e,"package.json");if(O.existsSync(t))try{if((await O.readJson(t)).workspaces)return !0}catch{}return !!(O.existsSync(se__default.resolve(e,"lerna.json"))||O.existsSync(se__default.resolve(e,"nx.json")))}async function W(e){let t=await Ii(e);if(!t.length)return [];let r=await Mr(t,{cwd:e,onlyDirectories:true,ignore:["**/node_modules/**"]}),o=[];for(let i of r){let n=se__default.resolve(e,i);if(!O.existsSync(se__default.resolve(n,"package.json")))continue;let s=O.existsSync(se__default.resolve(n,"components.json")),c=$i.some(a=>Mr.sync(a,{cwd:n,dot:true}).length>0);(s||c)&&o.push({name:i,hasConfig:s});}return o}function B(e,t,r){let o=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(o)} flag:`),b.break();for(let i of t)b.log(` shadcn ${e} ${o} ${i.name}`);b.break();}async function Ii(e){let t=[],r=se__default.resolve(e,"pnpm-workspace.yaml");if(O.existsSync(r)){let i=await O.readFile(r,"utf8"),n=Array.from(i.matchAll(/^\s*-\s*["']?([^"'\n#]+)["']?\s*$/gm));for(let s of n)t.push(s[1].trim());}let o=se__default.resolve(e,"package.json");if(O.existsSync(o))try{let i=await O.readJson(o),n=Array.isArray(i.workspaces)?i.workspaces:i.workspaces?.packages;Array.isArray(n)&&t.push(...n.filter(s=>!s.startsWith("!")));}catch{}return Array.from(new Set(t))}async function Oo(e){let t={};if(!O.existsSync(e.cwd)||!O.existsSync(se__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=w("Preflight checks.",{silent:e.silent}).start();O.existsSync(se__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 o=w("Verifying framework.",{silent:e.silent}).start(),i=e.existingConfig?.tailwind,n=await ra$1(e.cwd,{configCssFile:typeof i?.css=="string"?i.css:void 0});if(!n||n?.framework.name==="manual"){if(t["7"]=true,o?.fail(),!e.monorepo&&await U(e.cwd)){let l=await W(e.cwd);l.length>0&&(B("init",l),process.exit(1));}b.break(),n?.framework.links.installation&&b.error(`We could not detect a supported framework at ${a.info(e.cwd)}.
4
+ Visit ${a.info(n?.framework.links.installation)} to manually configure your project.
5
+ Once configured, you can use the cli to add components.`),b.break(),process.exit(1);}o?.succeed(`Verifying framework. Found ${a.info(n.framework.label)}.`);let s="Validating Tailwind CSS.";n.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${a.info("v4")}.`);let c=w(s,{silent:e.silent}).start();n.tailwindVersion==="v3"&&(!n?.tailwindConfigFile||!n?.tailwindCssFile)?(t["5"]=true,c?.fail()):n.tailwindVersion==="v4"&&!n?.tailwindCssFile?(t["5"]=true,c?.fail()):n.tailwindVersion?c?.succeed():(t["5"]=true,c?.fail());let a$1=w("Validating import alias.",{silent:e.silent}).start();return n?.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."),n?.framework.links.tailwind&&b.error(`Visit ${a.info(n?.framework.links.tailwind)} to get started.`)),t["6"]&&(b.break(),b.error("No import alias found in your tsconfig.json file."),n?.framework.links.installation&&b.error(`Visit ${a.info(n?.framework.links.installation)} to learn how to set an import alias.`)),b.break(),process.exit(1)),{errors:t,projectInfo:n}}async function _o(e,t){let r=new Set,o=new Set,i=[...e];for(;i.length>0;){let n=i.shift();if(o.has(n))continue;o.add(n);let{registry:s}=q$1(n);s&&!d[s]&&r.add(s);try{let[c]=await Z([n],t,{useCache:!0});if(c?.registryDependencies)for(let a of c.registryDependencies){let{registry:l}=q$1(a);l&&!d[l]&&r.add(l),o.has(a)||i.push(a);}}catch(c){if(c instanceof k$1){let{registry:a}=q$1(n);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 _o(e,t)).filter(l=>!t.registries?.[l]&&!Object.keys(d).includes(l));if(i.length===0)return {config:t,newRegistries:[]};let n=await na$1({useCache:process.env.NODE_ENV!=="development"});if(!n)return {config:t,newRegistries:[]};let s={};for(let l of i)n[l]&&(s[l]=n[l]);if(Object.keys(s).length===0)return {config:t,newRegistries:[]};let c$1=Object.fromEntries(Object.entries(t.registries||{}).filter(([l])=>!Object.keys(d).includes(l))),a={...t,registries:{...c$1,...s}};if(r.writeFile){let{resolvedPaths:l,...p}=a,m=w("Updating components.json.",{silent:r.silent}).start(),u=c.parse(p);await O.writeFile(se__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
6
+ `,"utf-8"),m.succeed();}return {config:a,newRegistries:Object.keys(s)}}var H={nova:{title:"Nova",description:"Lucide / Geist",style:"nova",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"geist",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},vega:{title:"Vega",description:"Lucide / Inter",style:"vega",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},maia:{title:"Maia",description:"Hugeicons / Figtree",style:"maia",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"figtree",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},lyra:{title:"Lyra",description:"Phosphor / JetBrains Mono",style:"lyra",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"phosphor",font:"jetbrains-mono",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},mira:{title:"Mira",description:"Hugeicons / Inter",style:"mira",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},luma:{title:"Luma",description:"Lucide / Inter",style:"luma",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},sera:{title:"Sera",description:"Lucide / Noto Sans + Playfair Display",style:"sera",baseColor:"taupe",theme:"taupe",chartColor:"taupe",iconLibrary:"lucide",font:"noto-sans",fontHeading:"playfair-display",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false}};function gr(e){let t=new URL(`${c$1}/create`),{rtl:r,pointer:o,...i}=e??{};for(let[n,s]of Object.entries(i))s!==void 0&&t.searchParams.set(n,String(s));return r&&t.searchParams.set("rtl","true"),o&&t.searchParams.set("pointer","true"),t.toString()}async function hr(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 we({type:"confirm",name:"proceed",message:"Open in browser?",initial:true});t&&await Ai(e.createUrl);}function me(e,t){let r=new URLSearchParams({base:e.base,style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,font:e.font,rtl:String(e.rtl??false),menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return e.chartColor&&e.chartColor!=="neutral"&&r.set("chartColor",e.chartColor),e.fontHeading&&e.fontHeading!=="inherit"&&r.set("fontHeading",e.fontHeading),t?.preset&&r.set("preset",t.preset),t?.template&&r.set("template",t.template),t?.only&&r.set("only",t.only),t?.pointer&&r.set("pointer","true"),r.set("track","1"),`${c$1}/init?${r.toString()}`}async function We(){let{base:e}=await we({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 tt(e){let t=Object.entries(H),{selectedPreset:r}=await we({type:"select",name:"selectedPreset",message:`Which ${a.info("preset")} would you like to use?`,choices:[...t.map(([i,n])=>({title:n.title,description:n.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=gr({command:"init",rtl:e.rtl,pointer:e.pointer,base:e.base,...e.template&&{template:e.template}});await hr({createUrl:i,followUp:`Then ${a.info("copy and run the command")} from ui.shadcn.com.`}),process.exit(0);}let o=H[r];return o||process.exit(1),{url:me({...o,base:e.base,rtl:e.rtl},{template:e.template,pointer:e.pointer}),base:e.base}}async function Se(e,t,r){let o=U$1(T({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:i}=await M([e],o,{silent:true,writeFile:false});o=i,X(e,o);let[n]=await ba([e],{config:o,useCache:true}),s=n?.type==="registry:base"&&n.config?n.config:void 0,c=e;if(Ni(e)){let a=new URL(e);a.searchParams.delete("track"),c=a.toString();}return {registryBaseConfig:s,installStyleIndex:n?.extends!=="none",url:c}}function Ni(e){try{return new URL(e).pathname==="/init"&&e.startsWith(c$1)}catch{return false}}var Oi=process.env.SHADCN_GITHUB_URL??"https://github.com/shadcn-ui/ui.git";function G(e){return {...e,frameworks:e.frameworks??[],scaffold:e.scaffold??Vo({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??Di}}function $e(e,{monorepo:t}){if(!t||!e.monorepo)return e;let r=e.monorepo,o={...e,templateDir:r.templateDir,defaultProjectName:r.defaultProjectName??r.templateDir,init:r.init??e.init,files:r.files??e.files};return o.scaffold=Vo({title:e.title,templateDir:r.templateDir}),o}function _i(e){switch(e){case "pnpm":return ["--no-frozen-lockfile"];default:return []}}async function Li(e,t){if(t==="pnpm")return;let r=se__default.join(e,"pnpm-workspace.yaml"),o=se__default.join(e,"package.json"),i=se__default.join(e,"pnpm-lock.yaml");O.existsSync(i)&&await O.remove(i);let n=O.existsSync(r);if(O.existsSync(o)){let s=await O.readFile(o,"utf8"),c=JSON.parse(s);if(n?c.packageManager=await Vi(t):delete c.packageManager,n){let a=await O.readFile(r,"utf8"),l=[];for(let p of a.split(`
7
+ `)){let m=p.match(/^\s*-\s*["']?(.+?)["']?\s*$/);m&&l.push(m[1]);}c.workspaces=l,await O.remove(r);}await O.writeFile(o,JSON.stringify(c,null,2)+`
8
+ `);}n&&t==="npm"&&await Lo(e);}async function Vi(e){try{let{stdout:t}=await execa(e,["--version"]);return `${e}@${t.trim()}`}catch{return `${e}@*`}}async function Lo(e){let t=await O.readdir(e,{withFileTypes:true});for(let r of t){if(r.name==="node_modules")continue;let o=se__default.join(e,r.name);if(r.isDirectory())await Lo(o);else if(r.name==="package.json"){let i=await O.readFile(o,"utf8");if(!i.includes("workspace:"))continue;let n=JSON.parse(i),s=false;for(let c of ["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let a=n[c];if(a)for(let[l,p]of Object.entries(a))typeof p=="string"&&p.startsWith("workspace:")&&(a[l]="*",s=true);}s&&await O.writeFile(o,JSON.stringify(n,null,2)+`
9
+ `);}}}function Vo({title:e,templateDir:t}){return async({projectPath:r,packageManager:o})=>{let i=w(`Creating a new ${e} project. This may take a few minutes.`).start();try{let n=process.env.SHADCN_TEMPLATE_DIR;if(n){let l=se__default.resolve(n,t);await O.copy(l,r,{filter:p=>!p.includes("node_modules")});}else {let l=se__default.join(Ti.tmpdir(),`shadcn-template-${Date.now()}`);await execa("git",["clone","--depth","1","--filter=blob:none","--sparse",Oi,l]),await execa("git",["-C",l,"sparse-checkout","set",`templates/${t}`]);let p=se__default.resolve(l,"templates",t);await O.move(p,r),await O.remove(l);}await Li(r,o);let c=["install",..._i(o)];await execa(o,c,{cwd:r});let a=se__default.join(r,"package.json");if(O.existsSync(a)){let l=await O.readFile(a,"utf8"),p=JSON.parse(l);p.name=se__default.basename(r),await O.writeFile(a,JSON.stringify(p,null,2)+`
10
+ `);}i?.succeed(`Creating a new ${e} project.`);}catch(n){i?.fail(`Something went wrong creating a new ${e} project.`),$(n);}}}async function Di({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 Do={"--font-heading":"cn-font-heading"};function Mi(e){return e.startsWith("--")?e:`--${e}`}function Ie(e){let t=new Set;for(let r of e){for(let o of r.fonts??[]){let i=o.font?.variable;if(!i)continue;let n=Do[i];n&&t.add(n);}for(let o of Object.values(r.cssVars??{}))for(let i of Object.keys(o??{})){let n=Do[Mi(i)];n&&t.add(n);}}return Array.from(t)}function Mo(e,t){if(e.includes("\0"))return false;let r;try{r=e;let u="";for(;r!==u&&r.includes("%");)u=r,r=decodeURIComponent(r);}catch{return false}let o=se__default.normalize(r.replace(/\\/g,"/")),i=se__default.normalize(t),n=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(n(o)||n(r)||n(e))return false;let s=u=>u.replace(/\[\.\.\..*?\]/g,""),c=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(c)||u.test(a))||(e.includes("~")||r.includes("~"))&&(e.includes("../")||r.includes("../")))return false;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(t.toLowerCase()):false;if(se__default.isAbsolute(o))return o.startsWith(i+se__default.sep);let m=se__default.resolve(i,o);return m.startsWith(i+se__default.sep)||m===i}async function _t(e,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,...r};let o=t.resolvedPaths.tailwindCss,i=se__default.relative(t.resolvedPaths.cwd,o),n=w(`Updating CSS variables in ${a.info(i)}`,{silent:r.silent}).start(),s=await promises.readFile(o,"utf8"),c=await rt(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars});await promises.writeFile(o,c,"utf8"),n.succeed();}async function rt(e,t,r,o={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false}){o={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,...o};let i=[Bi(t)];o.cleanupDefaultNextStyles&&i.push(Bo()),o.tailwindVersion==="v4"&&(i=[],i.push(Gi({params:"dark (&:is(.dark *))"})),o.cleanupDefaultNextStyles&&i.push(Bo()),i.push(Ji(t,{overwriteCssVars:o.overwriteCssVars})),i.push(Hi(t)),o.tailwindConfig&&(i.push(Yi(o.tailwindConfig)),i.push(qi(o.tailwindConfig)),i.push(Ki(o.tailwindConfig))));let s=(await I$1(i).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),o.tailwindVersion==="v4"&&(s=s.replace(/(\n\s*\n)+/g,`
11
+
12
+ `)),s}function Bi(e){return {postcssPlugin:"update-css-vars",Once(t){let r=t.nodes.find(o=>o.type==="atrule"&&o.name==="layer"&&o.params==="base");r instanceof Wi||(r=I$1.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
13
+ `,between:" "}}),t.append(r),t.insertBefore(r,I$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([o,i])=>{let n=o==="light"?":root":`.${o}`;zi(r,n,i);});}}}function Wo(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector===":root");if(t){let r=["--background","--foreground"];t.nodes.filter(o=>o.type==="decl"&&r.includes(o.prop)).forEach(o=>o.remove()),t.nodes.length===0&&t.remove();}}function Bo(){return {postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(o=>o.type==="rule"&&o.selector==="body");t&&(t.nodes.find(o=>o.type==="decl"&&o.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(o.value))?.remove(),t.nodes.find(o=>o.type==="decl"&&o.prop==="background"&&(o.value.startsWith("linear-gradient")||o.value==="var(--background)"))?.remove(),t.nodes.find(o=>o.type==="decl"&&o.prop==="font-family"&&o.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),Wo(e);let r=e.nodes.find(o=>o.type==="atrule"&&o.params==="(prefers-color-scheme: dark)");r&&(Wo(r),r.nodes.length===0&&r.remove());}}}function zi(e,t,r){let o=e.nodes?.find(i=>i.type==="rule"&&i.selector===t);o||Object.keys(r).length>0&&(o=I$1.rule({selector:t,raws:{between:" ",before:`
14
+ `}}),e.append(o)),Object.entries(r).forEach(([i,n])=>{let s=`--${i.replace(/^--/,"")}`,c=I$1.decl({prop:s,value:n,raws:{semicolon:true}}),a=o?.nodes.find(l=>l.type==="decl"&&l.prop===s);a?a.replaceWith(c):o?.append(c);});}function Ji(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([o,i])=>{let n=o==="light"?":root":`.${o}`;if(o==="theme"){n="@theme";let c=Lt(r);Object.entries(i).forEach(([a,l])=>{let p=`--${a.replace(/^--/,"")}`,m=I$1.decl({prop:p,value:l,raws:{semicolon:true}}),u=c?.nodes?.find(h=>h.type==="decl"&&h.prop===p);t.overwriteCssVars?u?u.replaceWith(m):c?.append(m):u||c?.append(m);});return}let s=r.nodes?.find(c=>c.type==="rule"&&c.selector===n);!s&&Object.keys(i).length>0&&(s=I$1.rule({selector:n,nodes:[],raws:{semicolon:true,between:" ",before:`
15
+ `}}),r.append(s),r.insertBefore(s,I$1.comment({text:"---break---"}))),Object.entries(i).forEach(([c,a])=>{let l=`--${c.replace(/^--/,"")}`;l==="--sidebar-background"&&(l="--sidebar"),zo(a)&&(a=`hsl(${a})`);let p=I$1.decl({prop:l,value:a,raws:{semicolon:true}}),m=s?.nodes.find(u=>u.type==="decl"&&u.prop===l);t.overwriteCssVars?m?m.replaceWith(p):s?.append(p):m||s?.append(p);});});}}}function Hi(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(n=>Object.keys(e[n]||{}))));if(!r.length)return;let o=Lt(t),i=o.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--"));for(let n of r){let s=Object.values(e).find(m=>m[n])?.[n];if(!s)continue;if(n==="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[u,h]of Object.entries(m)){let g=I$1.decl({prop:`--radius-${u}`,value:h,raws:{semicolon:true}});o?.nodes?.find(y=>y.type==="decl"&&y.prop===g.prop)||o?.append(g);}continue}let c=zo(s)||Zi(s)?`--color-${n.replace(/^--/,"")}`:`--${n.replace(/^--/,"")}`;c==="--color-sidebar-background"&&(c="--color-sidebar");let a=`var(--${n})`;c==="--color-sidebar"&&(a="var(--sidebar)");let l=I$1.decl({prop:c,value:a,raws:{semicolon:true}});o?.nodes?.find(m=>m.type==="decl"&&m.prop===l.prop)||(i?.length?o?.insertAfter(i[i.length-1],l):o?.append(l));}}}}function Lt(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=I$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
16
+ `}}),e.append(t),e.insertBefore(t,I$1.comment({text:"---break---"}))),t}function Gi({params:e}){return {postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(o=>o.type==="atrule"&&o.name==="custom-variant")){let o=t.nodes.filter(n=>n.type==="atrule"&&n.name==="import"),i=I$1.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:`
17
+ `}});if(o.length>0){let n=o[o.length-1];t.insertAfter(n,i);}else t.insertAfter(t.nodes[0],i);t.insertBefore(i,I$1.comment({text:"---break---"}));}}}}function Yi(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let o=Xi(t)==="single"?"'":'"',i=t.nodes.filter(s=>s.type==="atrule"&&s.name==="plugin"),n=i[i.length-1]||t.nodes[0];for(let s of e.plugins){let c=s.replace(/^require\(["']|["']\)$/g,"");if(i.some(l=>l.params.replace(/["']/g,"")===c))continue;let a=I$1.atRule({name:"plugin",params:`${o}${c}${o}`,raws:{semicolon:true,before:`
18
+ `}});t.insertAfter(n,a),t.insertBefore(a,I$1.comment({text:"---break---"}));}}}}function Ki(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=Lt(t),o=r.nodes?.filter(n=>n.type==="atrule"&&n.name==="keyframes"),i=z.record(z.string(),z.record(z.string(),z.string()));for(let[n,s]of Object.entries(e.theme.extend.keyframes)){if(typeof n!="string")continue;let c=i.safeParse(s);if(!c.success||o?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===n))continue;let a=I$1.atRule({name:"keyframes",params:n,nodes:[],raws:{semicolon:true,between:" ",before:`
19
+ `}});for(let[l,p]of Object.entries(c.data)){let m=I$1.rule({selector:l,nodes:Object.entries(p).map(([u,h])=>I$1.decl({prop:u,value:h,raws:{semicolon:true,before:`
20
20
  `,between:": "}})),raws:{semicolon:true,between:" ",before:`
21
- `}});a.append(m);}r.append(a),r.insertBefore(a,$$1.comment({text:"---break---"}));}}}}function ii(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=jt(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 si(e){return e.nodes[0].toString().includes("'")?"single":"double"}function dn(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 ai(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function Ze(e,t,r){let n=e&&Object.keys(e).length>0,i=Object.keys(r.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!n&&!i)return;r={silent:false,...r};let o=t.resolvedPaths.tailwindCss,s=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 Xe(a$1,r.cssVars,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars})),n&&(a$1=await nr(a$1,e)),await promises.writeFile(o,a$1,"utf8"),c.succeed();}async function nr(e,t){let r=[fi(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 fi(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))Pe(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"&&Pe(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"&&Pe(a,f,p);}}else o==="property"?Pe(t,r,n):gn(t,o,s,n);}else Pe(t,r,n);}}}function gn(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;gn(i,a,f,s);}}else Pe(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 Pe(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;Pe(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
- `,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 di(r),s="";if(mi(r)&&o==="npm")if(n.silent)s="force";else {i.stopAndPersist(),b.warn(`
21
+ `}});a.append(m);}r.append(a),r.insertBefore(a,I$1.comment({text:"---break---"}));}}}}function qi(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Lt(t),o=r.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--animate-")),i=z.record(z.string(),z.string()).safeParse(e.theme.extend.animation);if(i.success)for(let[n,s]of Object.entries(i.data)){let c=`--animate-${n}`;if(o?.find(l=>l.prop===c))continue;let a=I$1.decl({prop:c,value:s,raws:{semicolon:true,between:": ",before:`
22
+ `}});r.append(a);}}}}function Xi(e){return e.nodes[0].toString().includes("'")?"single":"double"}function zo(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 Zi(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function ot(e,t,r){let o=e&&Object.keys(e).length>0,i=Object.keys(r.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!o&&!i)return;r={silent:false,...r};let n=t.resolvedPaths.tailwindCss,s=se__default.relative(t.resolvedPaths.cwd,n),c=w(`Updating ${a.info(s)}`,{silent:r.silent}).start(),a$1=await promises.readFile(n,"utf8");i&&(a$1=await rt(a$1,r.cssVars,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars})),o&&(a$1=await yr(a$1,e)),await promises.writeFile(n,a$1,"utf8"),c.succeed();}async function yr(e,t){let r=[ts(t)],o=await I$1(r).process(e,{from:void 0}),i=o.css,n=o.root;if(n.nodes&&n.nodes.length>0){let s=n.nodes[n.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 ts(e){return {postcssPlugin:"update-css",Once(t){for(let[r,o]of Object.entries(e))if(r.startsWith("@")){let i=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!i)continue;let[,n,s]=i;if(n==="import"){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name==="import"&&a.params===s)){let a=I$1.atRule({name:"import",params:s,raws:{semicolon:true}}),l=t.nodes?.filter(p=>p.type==="atrule"&&p.name==="import");if(l&&l.length>0){let p=l[l.length-1];a.raws.before=`
25
+ `,t.insertAfter(p,a);}else !t.nodes||t.nodes.length,a.raws.before="",t.prepend(a);}}else if(n==="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=I$1.atRule({name:"plugin",params:c,raws:{semicolon:true,before:`
26
+ `}}),m=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="import"),u=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="plugin");if(u&&u.length>0){let h=u[u.length-1];t.insertAfter(h,p);}else if(m&&m.length>0){let h=m[m.length-1];t.insertAfter(h,p),t.insertBefore(p,I$1.comment({text:"---break---"})),t.insertAfter(p,I$1.comment({text:"---break---"}));}else t.prepend(p),t.insertBefore(p,I$1.comment({text:"---break---"})),t.insertAfter(p,I$1.comment({text:"---break---"}));}}else if(typeof o=="object"&&Object.keys(o).length===0){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name===n&&a.params===s)){let a=I$1.atRule({name:n,params:s,raws:{semicolon:true}});t.append(a),t.insertBefore(a,I$1.comment({text:"---break---"}));}}else if(n==="keyframes"){let c=t.nodes?.find(p=>p.type==="atrule"&&p.name==="theme"&&p.params==="inline");c||(c=I$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
27
+ `}}),t.append(c),t.insertBefore(c,I$1.comment({text:"---break---"})));let a=c.nodes?.find(p=>p.type==="atrule"&&p.name==="keyframes"&&p.params===s),l;if(a?(l=I$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
28
+ `}}),a.replaceWith(l)):(l=I$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
29
+ `}}),c.append(l)),typeof o=="object")for(let[p,m]of Object.entries(o))Ee(l,p,m);}else if(n==="utility"){let c=t.nodes?.find(a=>a.type==="atrule"&&a.name===n&&a.params===s);if(c){if(typeof o=="object")for(let[a,l]of Object.entries(o))if(typeof l=="string"){let p=c.nodes?.find(u=>u.type==="decl"&&u.prop===a),m=I$1.decl({prop:a,value:l,raws:{semicolon:true,before:`
30
+ `}});p?p.replaceWith(m):c.append(m);}else if(a.startsWith("@")&&typeof l=="object"&&l!==null&&Object.keys(l).length===0){let p=a.match(/@([a-zA-Z-]+)\s*(.*)/);if(p){let[,m,u]=p;if(!c.nodes?.find(g=>g.type==="atrule"&&g.name===m&&g.params===u)){let g=I$1.atRule({name:m,params:u,raws:{semicolon:true,before:`
31
+ `}});c.append(g);}}}else typeof l=="object"&&Ee(c,a,l);}else {let a=I$1.atRule({name:n,params:s,raws:{semicolon:true,between:" ",before:`
32
+ `}});if(t.append(a),t.insertBefore(a,I$1.comment({text:"---break---"})),typeof o=="object")for(let[l,p]of Object.entries(o))if(typeof p=="string"){let m=I$1.decl({prop:l,value:p,raws:{semicolon:true,before:`
33
+ `}});a.append(m);}else if(l.startsWith("@")&&typeof p=="object"&&p!==null&&Object.keys(p).length===0){let m=l.match(/@([a-zA-Z-]+)\s*(.*)/);if(m){let[,u,h]=m;if(!a.nodes?.find(y=>y.type==="atrule"&&y.name===u&&y.params===h)){let y=I$1.atRule({name:u,params:h,raws:{semicolon:true,before:`
34
+ `}});a.append(y);}}}else typeof p=="object"&&Ee(a,l,p);}}else n==="property"?Ee(t,r,o):Ho(t,n,s,o);}else Ee(t,r,o);}}}function Ho(e,t,r,o){let i=e.nodes?.find(n=>n.type==="atrule"&&n.name===t&&n.params===r);if(i||(i=I$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
35
+ `}}),e.append(i),e.insertBefore(i,I$1.comment({text:"---break---"}))),typeof o=="object")for(let[n,s]of Object.entries(o))if(n.startsWith("@")){let c=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(c){let[,a,l]=c;Ho(i,a,l,s);}}else Ee(i,n,s);else if(typeof o=="string")try{let s=I$1.parse(`.temp{${o}}`).first;if(s&&s.nodes){let c=I$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
36
+ `}});s.nodes.forEach(a=>{if(a.type==="decl"){let l=a.clone();l.raws.before=`
37
+ `,c.append(l);}}),c.nodes?.length&&i.append(c);}}catch(n){throw console.error("Error parsing at-rule content:",o,n),n}}function Ee(e,t,r){let o=e.nodes?.find(i=>i.type==="rule"&&i.selector===t);if(o||(o=I$1.rule({selector:t,raws:{semicolon:true,between:" ",before:`
38
+ `}}),e.append(o)),typeof r=="object"){for(let[i,n]of Object.entries(r))if(i.startsWith("@")&&typeof n=="object"&&n!==null&&Object.keys(n).length===0){let s=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,a]=s;if(!o.nodes?.find(p=>p.type==="atrule"&&p.name===c&&p.params===a)){if(c==="apply"){let m=o.nodes?.find(u=>u.type==="atrule"&&u.name==="apply");if(m){m.params=twMerge(m.params,a);continue}}let p=I$1.atRule({name:c,params:a,raws:{semicolon:true,before:`
39
+ `}});o.append(p);}}}else if(typeof n=="string"){let s=I$1.decl({prop:i,value:n,raws:{semicolon:true,before:`
40
+ `}}),c=o.nodes?.find(a=>a.type==="decl"&&a.prop===i);c?c.replaceWith(s):o.append(s);}else if(typeof n=="object"){let s=i.startsWith("&")?t.replace(/^([^:]+)/,`$1${i.substring(1)}`):i;Ee(e,s,n);}}else if(typeof r=="string")try{let n=I$1.parse(`.temp{${r}}`).first;n&&n.nodes&&n.nodes.forEach(s=>{if(s.type==="decl"){let c=s.clone();c.raws.before=`
41
+ `,o?.append(c);}});}catch(i){throw console.error("Error parsing rule content:",t,r,i),i}}async function _(e,t,r,o){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;o={silent:false,...o};let i=w("Installing dependencies.",{silent:o.silent})?.start(),n=await ns(r),s="";if(os(r)&&n==="npm")if(o.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 we([{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 ui(o,e,t,r.resolvedPaths.cwd,s),i?.succeed();}function mi(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 di(e){return qa(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$2(e.resolvedPaths.cwd)}async function ui(e,t,r,n,i){if(e==="npm")return gi(t,r,n,i);if(e==="deno")return hi(t,r,n);if(e==="expo")return yi(t,r,n);t?.length&&await execa(e,["add",...t],{cwd:n}),r?.length&&await execa(e,["add","-D",...r],{cwd:n});}async function gi(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 hi(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 yi(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 ir(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 Si=new Set(["--font-sans","--font-serif","--font-mono"]);async function et(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??ji(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 tt(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 ki(e,t,n),i?.succeed("Updating fonts.");}catch(o){throw i?.fail("Failed to update fonts."),o}}async function ki(e,t,r){let n=await $i(t,r);if(!n)return;let i=await promises.readFile(n,"utf-8"),o=await Ii(i,e,t);o!==i&&await promises.writeFile(n,o,"utf-8");}async function $i(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 Ii(e,t,r){let i=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),o=t.filter(m=>m.font.provider==="google"),s=[],c=[];for(let m of o){let d=m.font.import;if(!d)continue;let h=i.getImportDeclaration(k=>k.getModuleSpecifierValue()==="next/font/google"),g=false;h?(g=h.getNamedImports().some(v=>v.getName()===d),g||h.addNamedImport(d)):i.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[d]});let w=Fi(d,m.font.variable),C=Pi(m),b=Ni(i,m.font.variable),j=w;if(!(g&&!b&&Ft(m.font.variable)&&!Ti(i,d))){if(b)b.setInitializer(`${d}(${C})`),b.getName()!==w&&b.rename(w),j=w;else {let k=Di(i);i.insertVariableStatement(k,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:w,initializer:`${d}(${C})`}]}).appendWhitespace(`
47
- `);}s.push(j),Ei(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&&Li(i,s,p,r),i.getFullText()}function Pi(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 Ft(e){return Si.has(e)}function ji(e){return Ft(e)?"html":null}function Ei(e){return !e.font.selector&&Ft(e.font.variable)}function Fi(e,t){let r=Oi(e);return Ft(t)?r:`${r}${Ai(t.replace(/^--font-/,""))}`}function Oi(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Ai(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Ni(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 Ti(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 Di(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Li(e,t,r,n){let i=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let o of i){if(o.getTagNameNode().getText()!=="html")continue;let c=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),f=[...c,...a],p=o.getAttribute("className");if(!p){Qe(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);Qe(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 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 k=Vi(w,a);k=Ui(k);let v=Mi(k,f);h.replaceWithText(`{${v}}`);}else if(/^\w+\.variable$/.test(w)){if(a.includes(w)&&r.length===0)continue;Qe(e,n);let b=(w.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(b?`{cn(${w}, ${f.join(", ")})}`:`{cn(${f.join(", ")})}`);}else if(w.startsWith("`")&&w.endsWith("`")){let C=_i(w);Qe(e,n);let b=new Set(f),j=new Set(["font-sans","font-serif","font-mono"].map(v=>`"${v}"`)),k=C.filter(v=>!b.has(v)&&!j.has(v));h.replaceWithText(`{cn(${[...k,...f].join(", ")})}`);}else Qe(e,n),h.replaceWithText(`{cn(${w}, ${f.join(", ")})}`);}}}function Qe(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 _i(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 Vi(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 Ui(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 Mi(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 zi(e,t,n,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Bi(e,t,{...r,skipFonts:r.skipFonts})}async function Bi(e,t,r){if(!e.length)return;let n=w("Checking registry.",{silent:r.silent})?.start(),i=await _(e,U$1(t));if(!i)return n?.fail(),$(new Error("Failed to fetch components from registry."));try{wn(i.files??[],t.resolvedPaths.cwd);}catch(a){return n?.fail(),$(a)}n?.succeed();let o=await ta$1(t);r.skipFonts||(i=await et(i,t));let s=Ie([i]);await D(i.dependencies,i.devDependencies,t,{silent:r.silent}),await Y$1(i.tailwind?.config,t,{silent:r.silent,tailwindVersion:o}),await ir(i.envVars,t,{silent:r.silent}),r.skipFonts||await tt(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 yn(e,t):void 0;await Ze(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 zi(e,t,r,n){if(!e.length)return;let i=w("Checking registry.",{silent:n.silent})?.start(),o=await _(e,U$1(t));if(!o)return i?.fail(),$(new Error("Failed to fetch components from registry."));try{wn(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 et(o,t);let h=Ie([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 ir(o.envVars,p,{silent:true}),await tt(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],Ce=K&&r[K]?r[K]:t,lt=R(t.resolvedPaths.cwd,Ce.resolvedPaths.ui||Ce.resolvedPaths.cwd),Gt=await Q(lt,Ce.resolvedPaths.cwd)??Ce.resolvedPaths.cwd,Ht=await D$1(L,Ce,{overwrite:n.overwrite,silent:true,rootSpinner:f,isRemote:n.isRemote,isWorkspace:true,path:n.path,supportedFontMarkers:h});s.push(...Ht.filesCreated.map(He=>ie__default.relative(lt,ie__default.join(Gt,He)))),c.push(...Ht.filesUpdated.map(He=>ie__default.relative(lt,ie__default.join(Gt,He)))),a.push(...Ht.filesSkipped.map(He=>ie__default.relative(lt,ie__default.join(Gt,He))));}let C=o.cssVars?n.overwriteCssVars??await yn(e,t):void 0;await Ze(o.css,p,{silent:true,cssVars:o.cssVars,overwriteCssVars:C,tailwindVersion:m,tailwindConfig:o.tailwind?.config}),(o.cssVars||o.css)&&c.push(ie__default.relative(d,p.resolvedPaths.tailwindCss)),f?.succeed();let b$1=Array.from(new Set(s)).sort(),j=Array.from(new Set(c.filter(R=>!s.includes(R)))).sort(),k=Array.from(new Set(a)).sort();if(!(b$1.length||j.length)&&!k.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(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 yn(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 wn(e,t){for(let r of e)if(r?.target&&!ln(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}async function ye(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=bn(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=bn(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 U(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$1(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-",""),C=g.font.dependency??`@fontsource-variable/${w}`;d[g.font.variable]=g.font.family,h.add(C);}await D(Array.from(h),[],c$1,{silent:true}),await Pt({theme:d},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await Ze(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 Cn=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:xn`---
44
+ `);let c=await we([{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 is(n,e,t,r.resolvedPaths.cwd,s),i?.succeed();}function os(e){let t=qa$1(e.resolvedPaths.cwd,false);if(!t?.dependencies?.react)return false;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),o=t.dependencies["react-day-picker"]?.startsWith("8");return r&&o}async function ns(e){return qa$1(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$2(e.resolvedPaths.cwd)}async function is(e,t,r,o,i){if(e==="npm")return ss(t,r,o,i);if(e==="deno")return as(t,r,o);if(e==="expo")return cs(t,r,o);t?.length&&await execa(e,["add",...t],{cwd:o}),r?.length&&await execa(e,["add","-D",...r],{cwd:o});}async function ss(e,t,r,o){e.length&&await execa("npm",["install",...o?[`--${o}`]:[],...e],{cwd:r}),t.length&&await execa("npm",["install",...o?[`--${o}`]:[],"-D",...t],{cwd:r});}async function as(e,t,r){e?.length&&await execa("deno",["add",...e.map(o=>`npm:${o}`)],{cwd:r}),t?.length&&await execa("deno",["add","-D",...t.map(o=>`npm:${o}`)],{cwd:r});}async function cs(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 br(e,t$1,r){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let o=w("Adding environment variables.",{silent:r.silent})?.start(),i=t$1.resolvedPaths.cwd,n=se__default.join(i,".env.local"),s=t(i);s&&(n=s);let c=existsSync(n),a$1=se__default.basename(n),l=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
45
+ `),p=[],m=null,u$1=null;if(c){let h=await promises.readFile(n,"utf-8"),g=v(h,l);if(p=u(h,l),p.length>0){if(await promises.writeFile(n,g,"utf-8"),m=se__default.relative(i,n),o?.succeed(`Added the following variables to ${a.info(a$1)}:`),!r.silent)for(let y of p)b.log(` ${a.success("+")} ${y}`);}else o?.stop();}else if(await promises.writeFile(n,l+`
46
+ `,"utf-8"),u$1=se__default.relative(i,n),p=Object.keys(e),o?.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:u$1}}var gs=new Set(["--font-sans","--font-serif","--font-mono"]);async function it(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 o=r.framework.name==="next-app"||r.framework.name==="next-pages";for(let i of e.fonts)if(o)e.cssVars.theme[i.font.variable]=`var(${i.font.variable})`;else {let n=i.name.replace("font-",""),s=i.font.dependency??`@fontsource-variable/${n}`;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 n of e.fonts){let s=n.font.selector??ks(n.font.variable);if(!s)continue;let c=n.font.variable.replace("--","");i.has(s)||i.set(s,[]),i.get(s).push(c);}e.css??={},e.css["@layer base"]??={};for(let[n,s]of Array.from(i.entries())){let c=s.join(" ");e.css["@layer base"][n]??={};let a=Object.keys(e.css["@layer base"][n]).find(l=>l.startsWith("@apply "));a?(delete e.css["@layer base"][n][a],e.css["@layer base"][n][`${a} ${c}`]={}):e.css["@layer base"][n][`@apply ${c}`]={};}}return e}async function st(e,t,r){if(!e?.length)return;let o=await ra$1(t.resolvedPaths.cwd);if(!o||o.framework.name!=="next-app"&&o.framework.name!=="next-pages")return;let i=w("Updating fonts.",{silent:r.silent})?.start();try{await hs(e,t,o),i?.succeed("Updating fonts.");}catch(n){throw i?.fail("Failed to update fonts."),n}}async function hs(e,t,r){let o=await ys(t,r);if(!o)return;let i=await promises.readFile(o,"utf-8"),n=await ws(i,e,t);n!==i&&await promises.writeFile(o,n,"utf-8");}async function ys(e,t){let r=e.resolvedPaths.cwd,o=t.isSrcDir,n=t.isTsx?"tsx":"jsx",s=o?[`src/app/layout.${n}`,`app/layout.${n}`]:[`app/layout.${n}`];for(let c of s){let a=se__default.join(r,c);if(existsSync(a))return a}return null}async function ws(e,t,r){let i=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),n=t.filter(m=>m.font.provider==="google"),s=[],c=[];for(let m of n){let u=m.font.import;if(!u)continue;let h=i.getImportDeclaration(S=>S.getModuleSpecifierValue()==="next/font/google"),g=false;h?(g=h.getNamedImports().some(x=>x.getName()===u),g||h.addNamedImport(u)):i.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[u]});let y=xs(u,m.font.variable),b=bs(m),k=Ss(i,m.font.variable),$=y;if(!(g&&!k&&Dt(m.font.variable)&&!Ps(i,u))){if(k)k.setInitializer(`${u}(${b})`),k.getName()!==y&&k.rename(y),$=y;else {let S=$s(i);i.insertVariableStatement(S,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:y,initializer:`${u}(${b})`}]}).appendWhitespace(`
47
+ `);}s.push($),Cs(m)&&c.push(m.font.variable.replace("--",""));}}let a=new Set(["font-sans","font-serif","font-mono"]),l=[...c].reverse().find(m=>a.has(m)),p=c.filter(m=>!a.has(m));return l&&p.unshift(l),s.length>0&&Is(i,s,p,r),i.getFullText()}function bs(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 Dt(e){return gs.has(e)}function ks(e){return Dt(e)?"html":null}function Cs(e){return !e.font.selector&&Dt(e.font.variable)}function xs(e,t){let r=vs(e);return Dt(t)?r:`${r}${Rs(t.replace(/^--font-/,""))}`}function vs(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Rs(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Ss(e,t){let r=e.getVariableStatements();for(let o of r)for(let i of o.getDeclarations()){let n=i.getInitializer();if(!n||n.getKind()!==SyntaxKind.CallExpression)continue;let c=n.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return i}return null}function Ps(e,t){let r=e.getVariableStatements();for(let o of r)for(let i of o.getDeclarations()){let n=i.getInitializer();if(!n||n.getKind()!==SyntaxKind.CallExpression)continue;let s=n;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 $s(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Is(e,t,r,o){let i=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let n of i){if(n.getTagNameNode().getText()!=="html")continue;let c=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),l=[...c,...a],p=n.getAttribute("className");if(!p){nt(e,o),n.addAttribute({name:"className",initializer:`{cn(${l.join(", ")})}`});return}if(p.getKind()!==SyntaxKind.JsxAttribute)return;let m=p.asKindOrThrow(SyntaxKind.JsxAttribute),u=m.getInitializer();if(!u)return;if(u.getKind()===SyntaxKind.StringLiteral){let h=u.getText().slice(1,-1);nt(e,o),m.setInitializer(`{cn("${h}", ${l.join(", ")})}`);}else if(u.getKind()===SyntaxKind.JsxExpression){let h=u.asKindOrThrow(SyntaxKind.JsxExpression),g=h.getExpression();if(!g)return;let y=g.getText();if(y.startsWith("cn(")){let b=a.every(R=>y.includes(R)),k=r.every(R=>y.includes(`"${R}"`)),$=["font-sans","font-serif","font-mono"].filter(R=>!r.includes(R)).some(R=>y.includes(`"${R}"`));if(b&&k&&!$)continue;let S=js(y,a);S=Fs(S);let x=As(S,l);h.replaceWithText(`{${x}}`);}else if(/^\w+\.variable$/.test(y)){if(a.includes(y)&&r.length===0)continue;nt(e,o);let k=(y.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(k?`{cn(${y}, ${l.join(", ")})}`:`{cn(${l.join(", ")})}`);}else if(y.startsWith("`")&&y.endsWith("`")){let b=Es(y);nt(e,o);let k=new Set(l),$=new Set(["font-sans","font-serif","font-mono"].map(x=>`"${x}"`)),S=b.filter(x=>!k.has(x)&&!$.has(x));h.replaceWithText(`{cn(${[...S,...l].join(", ")})}`);}else nt(e,o),h.replaceWithText(`{cn(${y}, ${l.join(", ")})}`);}}}function nt(e,t){if(!e.getImportDeclaration(o=>o.getNamedImports().some(n=>n.getName()==="cn"))){let o=e.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));o?o.getNamedImports().some(n=>n.getName()==="cn")||o.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]});}}function Es(e){let t=[],r=[],i=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let n of i)if(n)if(n.startsWith("${")&&n.endsWith("}")){let s=n.slice(2,-1).trim();s&&r.push(s);}else {let s=n.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`);}return [...t,...r]}function js(e,t){let r=e;for(let o of t)r=r.replace(new RegExp(`,?\\s*${o.replace(".","\\.")}`,"g"),"").replace(/cn\(\s*,/,"cn(");return r}function Fs(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 As(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function ce(e,t,r){r={overwrite:false,silent:false,isNewProject:false,...r};let o=await P(t);return o&&o.ui&&o.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await Os(e,t,o,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Ts(e,t,{...r,skipFonts:r.skipFonts})}async function Ts(e,t,r){if(!e.length)return;let o=w("Checking registry.",{silent:r.silent})?.start(),i=await _$1(e,U$1(t));if(!i)return o?.fail(),$(new Error("Failed to fetch components from registry."));try{Ko(i.files??[],t.resolvedPaths.cwd);}catch(a){return o?.fail(),$(a)}o?.succeed();let n=await ta$1(t);r.skipFonts||(i=await it(i,t));let s=Ie([i]);await _(i.dependencies,i.devDependencies,t,{silent:r.silent}),await Y$1(i.tailwind?.config,t,{silent:r.silent,tailwindVersion:n}),await br(i.envVars,t,{silent:r.silent}),r.skipFonts||await st(i.fonts,t,{silent:r.silent}),await D(i.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let c=i.cssVars?r.overwriteCssVars??await Yo(e,t):void 0;await ot(i.css,t,{silent:r.silent,cssVars:i.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:c,tailwindVersion:n,tailwindConfig:i.tailwind?.config}),i.docs&&b.info(i.docs);}async function Os(e,t,r,o){if(!e.length)return;let i=w("Checking registry.",{silent:o.silent})?.start(),n=await _$1(e,U$1(t));if(!n)return i?.fail(),$(new Error("Failed to fetch components from registry."));try{Ko(n.files??[],t.resolvedPaths.cwd);}catch(R){return i?.fail(),$(R)}i?.succeed();let s=[],c=[],a=[],l=w("Installing components.")?.start(),p=r.ui,m=await ta$1(p),u=R(t.resolvedPaths.cwd,p.resolvedPaths.ui);n=await it(n,t);let h=Ie([n]);await _(n.dependencies,n.devDependencies,p,{silent:true}),n.tailwind?.config&&(await Y$1(n.tailwind?.config,p,{silent:true,tailwindVersion:m}),c.push(se__default.relative(u,p.resolvedPaths.tailwindConfig))),n.envVars&&await br(n.envVars,p,{silent:true}),await st(n.fonts,t,{silent:true});let g=new Map;for(let R of n.files??[]){let L=R.type||"registry:ui";g.has(L)||g.set(L,[]),g.get(L).push(R);}let y={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"};for(let R$1 of Array.from(g.keys())){let L=g.get(R$1),q=y[R$1],xe=q&&r[q]?r[q]:t,bt=R(t.resolvedPaths.cwd,xe.resolvedPaths.ui||xe.resolvedPaths.cwd),sr=await Q(bt,xe.resolvedPaths.cwd)??xe.resolvedPaths.cwd,ar=await D(L,xe,{overwrite:o.overwrite,silent:true,rootSpinner:l,isRemote:o.isRemote,isWorkspace:true,path:o.path,supportedFontMarkers:h});s.push(...ar.filesCreated.map(Ze=>se__default.relative(bt,se__default.join(sr,Ze)))),c.push(...ar.filesUpdated.map(Ze=>se__default.relative(bt,se__default.join(sr,Ze)))),a.push(...ar.filesSkipped.map(Ze=>se__default.relative(bt,se__default.join(sr,Ze))));}let b$1=n.cssVars?o.overwriteCssVars??await Yo(e,t):void 0;await ot(n.css,p,{silent:true,cssVars:n.cssVars,overwriteCssVars:b$1,tailwindVersion:m,tailwindConfig:n.tailwind?.config}),(n.cssVars||n.css)&&c.push(se__default.relative(u,p.resolvedPaths.tailwindCss)),l?.succeed();let k=Array.from(new Set(s)).sort(),$$1=Array.from(new Set(c.filter(R=>!s.includes(R)))).sort(),S=Array.from(new Set(a)).sort();if(!(k.length||$$1.length)&&!S.length&&w("No files updated.",{silent:o.silent})?.info(),k.length){w(`Created ${k.length} ${k.length===1?"file":"files"}:`,{silent:o.silent})?.succeed();for(let R of k)b.log(` - ${R}`);}if($$1.length){w(`Updated ${$$1.length} ${$$1.length===1?"file":"files"}:`,{silent:o.silent})?.info();for(let R of $$1)b.log(` - ${R}`);}if(S.length){w(`Skipped ${S.length} ${S.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:o.silent})?.info();for(let R of S)b.log(` - ${R}`);}n.docs&&b.info(n.docs);}async function Yo(e,t){let r=await ba(e,{config:t});return z.array(n).parse(r).some(i=>i.type==="registry:theme"||i.type==="registry:style"||i.type==="registry:font"||i.type==="registry:base")}function Ko(e,t){for(let r of e)if(r?.target&&!Mo(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}async function ye(e){let t=se__default.resolve(e.projectPath,"packages/ui"),r=se__default.resolve(e.projectPath,"apps/web"),o=se__default.resolve(t,"components.json"),i=await O.readJson(o);e.registryBaseConfig&&(i=qo(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 O.writeJson(o,i,{spaces:2});let n=se__default.resolve(r,"components.json"),s=await O.readJson(n);e.registryBaseConfig&&(s=qo(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),e.menuColor&&(s.menuColor=e.menuColor),e.menuAccent&&(s.menuAccent=e.menuAccent),e.iconLibrary&&(s.iconLibrary=e.iconLibrary),await O.writeJson(n,s,{spaces:2});let c$1=await O$1(t,c.parse(i)),{config:a}=await M(e.components,c$1,{silent:true});await ce(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let l=await O$1(r,c.parse(s)),p=await _$1(e.components,U$1(a));if(p?.fonts?.length){let u={},h=new Set;for(let g of p.fonts){let y=g.name.replace(/^font-heading-/,"").replace("font-",""),b=g.font.dependency??`@fontsource-variable/${y}`;u[g.font.variable]=g.font.family,h.add(b);}await _(Array.from(h),[],c$1,{silent:true}),await _t({theme:u},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await ot(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 u=[...a$3[m].packages];await _(u,[],c$1,{silent:true}),await _(u,[],l,{silent:true});}return l}var Zo=G({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:Xo`---
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:ye,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:xn`---
55
+ `}],monorepo:{templateDir:"astro-monorepo",init:ye,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:Xo`---
56
56
  import "@workspace/ui/globals.css"
57
57
  import { ComponentExample } from "@/components/component-example"
58
58
  ---
@@ -67,27 +67,27 @@ import { ComponentExample } from "@/components/component-example"
67
67
  <ComponentExample client:load />
68
68
  </body>
69
69
  </html>
70
- `}]}});var vn=B({name:"laravel",title:"Laravel",description:"Requires `laravel new`",defaultProjectName:"laravel-app",templateDir:"laravel-app",frameworks:["laravel"],scaffold:async()=>{b.break(),b.log(` Please create a new app with ${a.info("laravel new --react")} first then run ${a.info("shadcn init")}.`),b.log(` See ${a.info(`${c$1}/docs/installation/laravel`)} for more information.`),b.break(),process.exit(0);},create:async()=>{}});var kn=B({name:"next",title:"Next.js",defaultProjectName:"next-app",templateDir:"next-app",frameworks:["next-app","next-pages"],create:async()=>{},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:xn`import { ComponentExample } from "@/components/component-example";
70
+ `}]}});var Qo=G({name:"laravel",title:"Laravel",description:"Requires `laravel new`",defaultProjectName:"laravel-app",templateDir:"laravel-app",frameworks:["laravel"],scaffold:async()=>{b.break(),b.log(` Please create a new app with ${a.info("laravel new --react")} first then run ${a.info("shadcn init")}.`),b.log(` See ${a.info(`${c$1}/docs/installation/laravel`)} for more information.`),b.break(),process.exit(0);},create:async()=>{}});var rn=G({name:"next",title:"Next.js",defaultProjectName:"next-app",templateDir:"next-app",frameworks:["next-app","next-pages"],create:async()=>{},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:Xo`import { ComponentExample } from "@/components/component-example";
71
71
 
72
72
  export default function Page() {
73
73
  return <ComponentExample />;
74
74
  }
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=bn(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=bn(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 U(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$1(a));if(p?.fonts?.length){let d={};for(let h of p.fonts)d[h.font.variable]=`var(${h.font.variable})`;await Pt({theme:d},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await tt(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:xn`import { ComponentExample } from "@/components/component-example";
75
+ `}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=se__default.resolve(e.projectPath,"packages/ui"),r=se__default.resolve(e.projectPath,"apps/web"),o=se__default.resolve(t,"components.json"),i=await O.readJson(o);e.registryBaseConfig&&(i=qo(i,e.registryBaseConfig)),i.tailwind.baseColor="neutral",e.rtl&&(i.rtl=true),await O.writeJson(o,i,{spaces:2});let n=se__default.resolve(r,"components.json"),s=await O.readJson(n);e.registryBaseConfig&&(s=qo(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),await O.writeJson(n,s,{spaces:2});let c$1=await O$1(t,c.parse(i)),{config:a}=await M(e.components,c$1,{silent:true});await ce(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let l=await O$1(r,c.parse(s)),p=await _$1(e.components,U$1(a));if(p?.fonts?.length){let u={};for(let h of p.fonts)u[h.font.variable]=`var(${h.font.variable})`;await _t({theme:u},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await st(p.fonts,l,{silent:e.silent});}let m=c$1.iconLibrary;if(m&&m in a$3){let u=[...a$3[m].packages];await _(u,[],c$1,{silent:true}),await _(u,[],l,{silent:true});}return l},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:Xo`import { ComponentExample } from "@/components/component-example";
76
76
 
77
77
  export default function Page() {
78
78
  return <ComponentExample />;
79
79
  }
80
- `}]}});var In=B({name:"react-router",title:"React Router",defaultProjectName:"react-router-app",templateDir:"react-router-app",frameworks:["react-router"],create:async()=>{},files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:xn`import { ComponentExample } from "@/components/component-example";
80
+ `}]}});var nn=G({name:"react-router",title:"React Router",defaultProjectName:"react-router-app",templateDir:"react-router-app",frameworks:["react-router"],create:async()=>{},files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:Xo`import { ComponentExample } from "@/components/component-example";
81
81
 
82
82
  export default function Home() {
83
83
  return <ComponentExample />;
84
84
  }
85
- `}],monorepo:{templateDir:"react-router-monorepo",init:ye,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:xn`import { ComponentExample } from "@/components/component-example";
85
+ `}],monorepo:{templateDir:"react-router-monorepo",init:ye,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:Xo`import { ComponentExample } from "@/components/component-example";
86
86
 
87
87
  export default function Home() {
88
88
  return <ComponentExample />;
89
89
  }
90
- `}]}});var jn=B({name:"start",title:"TanStack Start",defaultProjectName:"start-app",templateDir:"start-app",frameworks:["tanstack-start"],create:async()=>{},files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:xn`import { createFileRoute } from "@tanstack/react-router";
90
+ `}]}});var an=G({name:"start",title:"TanStack Start",defaultProjectName:"start-app",templateDir:"start-app",frameworks:["tanstack-start"],create:async()=>{},files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:Xo`import { createFileRoute } from "@tanstack/react-router";
91
91
  import { ComponentExample } from "@/components/component-example";
92
92
 
93
93
  export const Route = createFileRoute("/")({ component: App });
@@ -97,7 +97,7 @@ function App() {
97
97
  <ComponentExample />
98
98
  );
99
99
  }
100
- `}],monorepo:{templateDir:"start-monorepo",init:ye,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:xn`import { createFileRoute } from "@tanstack/react-router";
100
+ `}],monorepo:{templateDir:"start-monorepo",init:ye,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:Xo`import { createFileRoute } from "@tanstack/react-router";
101
101
  import { ComponentExample } from "@/components/component-example";
102
102
 
103
103
  export const Route = createFileRoute("/")({ component: App });
@@ -107,63 +107,63 @@ function App() {
107
107
  <ComponentExample />
108
108
  );
109
109
  }
110
- `}]}});var Fn=B({name:"vite",title:"Vite",defaultProjectName:"vite-app",templateDir:"vite-app",frameworks:["vite"],create:async()=>{},files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:xn`import { ComponentExample } from "@/components/component-example";
110
+ `}]}});var ln=G({name:"vite",title:"Vite",defaultProjectName:"vite-app",templateDir:"vite-app",frameworks:["vite"],create:async()=>{},files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:Xo`import { ComponentExample } from "@/components/component-example";
111
111
 
112
112
  export function App() {
113
113
  return <ComponentExample />;
114
114
  }
115
115
 
116
116
  export default App;
117
- `}],monorepo:{templateDir:"vite-monorepo",init:ye,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:xn`import { ComponentExample } from "@/components/component-example";
117
+ `}],monorepo:{templateDir:"vite-monorepo",init:ye,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:Xo`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:kn,vite:Fn,start:jn,"react-router":In,astro:Cn,laravel:vn};function Ue(e){if(e){for(let[t,r]of Object.entries(z))if(r.frameworks.includes(e))return t}}async function Dt(e){let t=e.template&&e.template in z?e.template:"next",r=$e(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 we([{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=$e(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 ar(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 Lt(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 cr(e){let t=`${e}${Me}`;if(!T.existsSync(t))return false;try{return T.unlinkSync(t),!0}catch{return false}}async function An(e,t,r={}){if(!T.existsSync(e))return t();if(!ar(e))throw r.onBackupFailure?.(e),new Error(`Could not back up ${e}.`);let i=()=>Lt(e);process.on("exit",i);try{let o=await t();return process.removeListener("exit",i),cr(e),o}catch(o){throw process.removeListener("exit",i),Lt(e),o}}var Xi=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(),pointer: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()});function Zi(e,t){return t.rtl?e.searchParams.set("rtl","true"):t.rtl===false&&e.searchParams.delete("rtl"),t.pointer?e.searchParams.set("pointer","true"):t.pointer===false&&e.searchParams.delete("pointer"),e}var 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("--pointer","enable pointer cursor for buttons.").option("--no-pointer","disable pointer cursor for buttons.").option("--reinstall","re-install existing UI components.").option("--no-reinstall","do not re-install existing UI components.").action(async(e,t)=>{let r$1,n=[],i=()=>{r$1&&Lt(r$1.replace(Me,""));};process.on("exit",i);try{let o=Xi.parse({...t,reinstall:t.reinstall,cwd:ie__default.resolve(t.cwd)}),s=new Map(Object.entries(pe)),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 we({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 we({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});d=h;}if(d&&(n=await ua(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 we({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=Ue(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 we({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});o.monorepo=h;}o.base||(o.base=await _e()),o.preset=!0;}if(o.preset!==void 0){let d=o.preset===!0?!0:o.preset;if(d===!0){let h=await qe({rtl:o.rtl??!1,template:o.template,base:o.base,pointer:o.pointer});e=[h.url,...e],c=h.base;}if(typeof d=="string"){let h;if(G$1(d)){let g=new URL(d);Zi(g,o),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=me({...g,base:"radix",rtl:o.rtl??!1},{template:o.template,preset:d,pointer:o.pointer}),c=void 0;}else {let g=s.get(d);if(!g)throw new Error(`Unknown preset: ${d}`);h=me({...g,base:o.base??"radix",rtl:o.rtl??g.rtl},{template:o.template,pointer:o.pointer}),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 _e();m=d,o.base=d;}if(o.defaults&&!e.some(G$1)&&(e=[me({...pe.nova,base:m,rtl:o.rtl??!1},{template:o.template,pointer:o.pointer}),...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 ts(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=ar(d)??void 0,r$1||b.warn(`Could not back up ${a.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:g,url:w}=await Se(e[0],a$1,{registries:p?.registries});e[0]=w,g||(o.installStyleIndex=!1),h&&(o.registryBaseConfig=h);}await We(o),b.break(),b.log(`Project initialization completed.
126
- You may now add components.`),process.removeListener("exit",i),cr(ie__default.resolve(a$1,"components.json")),b.break();}catch(o){process.removeListener("exit",i),i(),b.break(),$(o);}finally{V();}});async function We(e){let t,r,n=e.template,i=n?$e(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 v=await nn(e);if(v.errors["1"]){let{projectPath:R,template:L}=await Dt(e);R||process.exit(1),e.cwd=R,e.isNewProject=true,r=L,t=await ra$1(e.cwd);}else t=v.projectInfo;}let s=!!r,c=r??n,a$1=c?$e(z[c],{monorepo:e.monorepo}):void 0,f=[...e.installStyleIndex?["index"]:[],...e.components??[],...a$1?["button"]:[]];if(a$1?.init){let v=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}),v}let p=await sa(e.cwd,t),m=p?await es(p,e):await Qi(await N(e.cwd));if(!e.yes){let{proceed:v}=await we({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,m),{config:h}=await U(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"),C=`${w$1}${Me}`,b=(v,R)=>{let{registries:L,...K}=bn(v,R);return {...K,registries:L}};if(T.existsSync(C)){let v=await T.readJson(C);e.force?v.registries&&(m.registries={...v.registries,...m.registries||{}}):m=b(v,m);}e.registryBaseConfig&&(m=b(m,e.registryBaseConfig)),e.rtl!==void 0&&(m.rtl=e.rtl),m.registries=Object.fromEntries(Object.entries(m.registries||{}).filter(([v])=>!Object.keys(d).includes(v))),await promises.writeFile(w$1,`${JSON.stringify(m,null,2)}
127
- `,"utf8"),g.succeed();let j=await O(e.cwd,m),k=await P(j);if(k){let v={};if(m.menuColor&&(v.menuColor=m.menuColor),m.menuAccent&&(v.menuAccent=m.menuAccent),m.rtl!==void 0&&(v.rtl=m.rtl),m.iconLibrary&&(v.iconLibrary=m.iconLibrary),Object.keys(v).length>0)for(let R of Object.keys(k)){let L=k[R];if(L.resolvedPaths.cwd===j.resolvedPaths.cwd)continue;let K=ie__default.resolve(L.resolvedPaths.cwd,"components.json");if(T.existsSync(K)){let Ce=await T.readJson(K);await T.writeJson(K,{...Ce,...v},{spaces:2});}}}return M.clearCaches(),await ae(f,j,{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}),j}async function Qi(e=null){let[t,r]=await Promise.all([fa$1(),ha()]);b.info("");let n=await we([{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 es(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 we([{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 ts(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 we({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:false});return n?t:r}async function Dn(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 _n(e,t,r={}){let n={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return n;let i=await _(e,U$1(t));if(!i)throw new Error("Failed to fetch components from registry.");r.skipFonts||(i=await et(i,t));let o=Ie([i]);return n.dependencies=Array.from(new Set(i.dependencies??[])),n.devDependencies=Array.from(new Set(i.devDependencies??[])),n.docs=i.docs??null,await rs(i,t,n,r,o),await ns(i,t,n,r),os(i,t,n),r.skipFonts||is(i,n),n}async function rs(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(b=>b.path),f$1.path),fileIndex:a});if(!p)continue;t.tsx||(p=p.replace(/\.tsx?$/,b=>b===".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",C$1;m&&(C$1=await promises.readFile(p,"utf-8"),r$1(C$1,g$1)?w="skip":w="overwrite"),r.files.push({path:d,action:w,content:g$1,...w==="overwrite"&&{existingContent:C$1},type:f$1.type??"registry:ui"});}}async function ns(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 Xe(p,e.cssVars,t,{overwriteCssVars:n.overwriteCssVars})),i&&(p=await nr(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 os(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 is(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 be=5,cs=dim("\u250C"+"\u2500".repeat(46)),ls=dim("\u2514"+"\u2500".repeat(46)),fs={create:"+",overwrite:"~",skip:"="},ps={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function rt(e){return e==="create"?green(e):e==="overwrite"||e==="update"?yellow(e):dim(e)}function nt(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 Ee(e,t,r=n=>n){e.push(`${dim("\u2502")} ${cs}`);for(let n of t)e.push(`${dim("\u2502")} ${dim("\u2502")} ${r(n)}`);e.push(`${dim("\u2502")} ${ls}`);}function Wn(e,t,r={}){return r.diff?typeof r.diff=="string"?ds(e,t,r.diff):us(e,t):r.view?typeof r.view=="string"?hs(e,t,r.view):gs(e,t):ms(e,t)}function ms(e,t){let r=[];r.push(nt(t)),r.push(dim("\u2502")),ys(e,r),Vn("Dependencies",e.dependencies,r),Vn("Dev Dependencies",e.devDependencies,r),ws(e,r),bs(e,r),xs(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 ds(e,t,r){let n=[];n.push(nt(t)),n.push(dim("\u2502"));let i=zn(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)Bn(s,n);if(o&&e.css){if(n.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${rt(e.css.action)}${dim(")")}`),e.css.action==="create"||!e.css.existingContent)Ee(n,e.css.content.split(`
130
- `),s=>green(`+${s}`));else {let s=Jn(e.css.existingContent,e.css.content,e.css.path,{fullContext:true});Ee(n,s);}n.push(dim("\u2502"));}}return n.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),n.join(`
131
- `)}function us(e,t){let r=[];r.push(nt(t)),r.push(dim("\u2502"));let n=e.files.slice(0,be);if(n.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No changes.")}`),r.push(dim("\u2502"));else {for(let s of n)Bn(s,r);e.files.length>be&&r.push(dim("\u2502"));}let i=e.files.length;return i>be&&r.push(` ${dim(`Showing ${be} 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 gs(e,t){let r=[];r.push(nt(t)),r.push(dim("\u2502"));let n=e.files.slice(0,be);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("(")}${rt(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),Ee(r,c),r.push(dim("\u2502"));}e.files.length>be&&r.push(dim("\u2502"));}let i=e.files.length;return i>be&&r.push(` ${dim(`Showing ${be} 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 Bn(e,t){if(t.push(`${dim("\u251C")} ${bold(e.path)} ${dim("(")}${rt(e.action)}${dim(")")}`),e.action==="skip")t.push(`${dim("\u2502")} ${dim("No changes.")}`);else if(e.action==="create")Ee(t,e.content.split(`
135
- `),r=>green(`+${r}`));else {let r=Jn(e.existingContent,e.content,e.path);Ee(t,r);}t.push(dim("\u2502"));}function hs(e,t,r){let n=[];n.push(nt(t)),n.push(dim("\u2502"));let i=zn(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("(")}${rt(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),Ee(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("(")}${rt(e.css.action)}${dim(")")} ${dim(`${s.length} lines`)}`),Ee(n,s),n.push(dim("\u2502"));}}return n.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),n.join(`
138
- `)}function ys(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=fs[s.action],a=ps[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 Vn(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 ws(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 bs(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 xs(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 zn(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 Jn(e,t,r,n={}){if(ks(e,t))return [dim(" Formatting-only changes (spacing, quotes, semicolons).")];let i=Un(e),o=Un(t),s=n.fullContext?Math.max(i.split(`
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}`)],f=t.split(`
141
- `);for(let p of c.hunks){let{entries:m}=Cs(p,f);if(!m.some(C=>C.kind!=="context"))continue;let h=m.filter(C=>C.kind==="context").length,g=m.filter(C=>C.kind==="removed").length,w=m.filter(C=>C.kind==="added").length;a.push(cyan(`@@ -${p.oldStart},${h+g} +${p.newStart},${h+w} @@`));for(let C of m)a.push(C.formatted);}return a}function Cs(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=vs(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 vs(e,t,r,n,i){if($s(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=Rs(e),s=o.map(Vt),c=new Set;for(let a=0;a<t.length;a++){let f=r[n]??t[a],p=Vt(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}=Ss(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 Un(e){return e.split(`
142
- `).map(t=>{let r=t.match(/^(\s*)/)?.[1]??"",n=t.slice(r.length);return r+n.replace(/['"]/g,'"').replace(/;$/g,"")}).join(`
143
- `)}function Rs(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 Ss(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 Vt(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function ks(e,t){let r=n=>n.split(`
144
- `).map(Vt).filter(i=>i.length>0).join(" ");return r(e)===r(t)}function $s(e,t){let r=n=>n.map(Vt).filter(i=>i.length>0).join(" ");return r(e)===r(t)}async function Hn(e,t){let r=ie__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await Fe__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}"
124
+ `}]}});var Y={next:rn,vite:ln,start:an,"react-router":nn,astro:Zo,laravel:Qo};function ze(e){if(e){for(let[t,r]of Object.entries(Y))if(r.frameworks.includes(e))return t}}async function zt(e){let t=e.template&&e.template in Y?e.template:"next",r=$e(Y[t],{monorepo:e.monorepo}),o=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:l}=await we([{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(Y).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:o,format:p=>p.trim(),validate:p=>p.length>128?"Name should be less than 128 characters.":true}]);t=a$1??t,o=l??o;}let n=$e(Y[t],{monorepo:e.monorepo}),s=await a$2(e.cwd,{withFallback:true}),c=se__default.join(e.cwd,o);try{await O.access(e.cwd,O.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 O.existsSync(se__default.resolve(e.cwd,o,"package.json"))&&(b.break(),b.error(`A project with the name ${a.info(o)} already exists.`),b.error("Please choose a different name and try again."),b.break(),process.exit(1)),await n.scaffold({projectPath:c,packageManager:s,cwd:e.cwd}),{projectPath:c,projectName:o,template:t}}async function K(e=process.cwd()){try{let{config:t}=await import('@dotenvx/dotenvx'),r=[".env.local",".env.development.local",".env.development",".env"];for(let o of r){let i=join(e,o);existsSync(i)&&t({path:i,overload:!1,quiet:!0});}}catch(t){b.warn("Failed to load env files:",t);}}var Ge=".bak",Je=class extends Error{filePath;constructor(t){super(`Could not back up ${t}.`),this.name="FileBackupError",this.filePath=t;}};function at(e){if(!O.existsSync(e))return null;let t=`${e}${Ge}`;try{return O.renameSync(e,t),t}catch{return null}}function He(e){let t=`${e}${Ge}`;if(!O.existsSync(t))return false;try{return O.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function ct(e){let t=`${e}${Ge}`;if(!O.existsSync(t))return false;try{return O.unlinkSync(t),!0}catch{return false}}async function pn(e,t){if(!O.existsSync(e))return t();if(!at(e))throw new Je(e);let o=()=>He(e);process.on("exit",o);try{let i=await t();return process.removeListener("exit",o),ct(e),i}catch(i){throw process.removeListener("exit",o),He(e),i}}var Ws=z.object({cwd:z.string(),name:z.string().optional(),preset:z.union([z.boolean(),z.string()]).optional(),components:z.array(z.string()).optional(),yes:z.boolean(),defaults:z.boolean(),force:z.boolean(),reinstall:z.boolean().optional(),silent:z.boolean(),isNewProject:z.boolean().default(false),cssVariables:z.boolean().default(true),rtl:z.boolean().optional(),pointer:z.boolean().optional(),base:z.enum(["radix","base"]).optional(),template:z.string().optional(),monorepo:z.boolean().optional(),existingConfig:z.record(z.unknown()).optional(),installStyleIndex:z.boolean().default(true),registryBaseConfig:c.deepPartial().optional(),menuColor:z.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:z.enum(["subtle","bold"]).optional(),iconLibrary:z.string().optional()});function Bs(e,t){return t.rtl?e.searchParams.set("rtl","true"):t.rtl===false&&e.searchParams.delete("rtl"),t.pointer?e.searchParams.set("pointer","true"):t.pointer===false&&e.searchParams.delete("pointer"),e}var mn=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("--pointer","enable pointer cursor for buttons.").option("--no-pointer","disable pointer cursor for buttons.").option("--reinstall","re-install existing UI components.").option("--no-reinstall","do not re-install existing UI components.").action(async(e,t)=>{let r$1,o=[],i=()=>{r$1&&He(r$1.replace(Ge,""));};process.on("exit",i);try{let n=Ws.parse({...t,reinstall:t.reinstall,cwd:se__default.resolve(t.cwd)}),s=new Map(Object.entries(H)),c;if(n.defaults&&(n.template=n.template||"next",n.base=n.base||"base",n.reinstall=n.reinstall??!1),n.template&&!(n.template in Y)&&(b.error(`Invalid template: ${a.info(n.template)}. Available templates: ${Object.keys(Y).map(u=>a.info(u)).join(", ")}.`),b.break(),process.exit(1)),typeof n.preset=="string"&&!G$1(n.preset)&&!r(n.preset)){let u=Array.from(s.keys());s.has(n.preset)||(b.error(`Invalid preset: ${a.info(n.preset)}. Available presets: ${u.join(", ")}`),b.break(),process.exit(1));}let a$1=n.cwd,l=O.existsSync(se__default.resolve(a$1,"components.json"));if(!n.monorepo&&!l&&await U(a$1)){let u=await ra$1(a$1);if(!u||u.framework.name==="manual"){let h=await W(a$1);h.length>0&&(B("init",h),process.exit(1));}}if(l&&!n.force){let{overwrite:u}=await we({type:"confirm",name:"overwrite",message:`A ${a.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});u||(b.info(` To start over, remove the ${a.info("components.json")} file and run ${a.info("init")} again.`),b.break(),process.exit(1)),n.force=!0;}let p;if(l){try{p=await O.readJson(se__default.resolve(a$1,"components.json"));}catch{}p&&(n.existingConfig=p);let u=n.reinstall;if(u===void 0){let{reinstall:h}=await we({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});u=h;}if(u&&(o=await ua$1(a$1),o.length)){b.break(),b.log(" The following components will be re-installed and overwritten:");for(let h=0;h<o.length;h+=8)b.log(` - ${o.slice(h,h+8).join(", ")}`);b.break();}}if(n.preset===void 0&&e.length===0&&!n.defaults){let u=O.existsSync(se__default.resolve(a$1,"package.json"));if(!n.template&&!u){let{template:h}=await we({type:"select",name:"template",message:"Select a template",choices:Object.entries(Y).map(([g,y])=>({title:y.title,value:g,description:y.description,disabled:n.monorepo&&g==="laravel"}))});h||process.exit(1),n.template=h;}if(!n.template&&u){let h=await ra$1(a$1),g=ze(h?.framework.name);g&&(n.template=g);}if(n.template==="laravel"&&!u&&(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)),n.monorepo===void 0&&!u&&n.template&&Y[n.template]?.monorepo){let{monorepo:h}=await we({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});n.monorepo=h;}n.base||(n.base=await We()),n.preset=!0;}if(n.preset!==void 0){let u=n.preset===!0?!0:n.preset;if(u===!0){let h=await tt({rtl:n.rtl??!1,template:n.template,base:n.base,pointer:n.pointer});e=[h.url,...e],c=h.base;}if(typeof u=="string"){let h;if(G$1(u)){let g=new URL(u);Bs(g,n),g.pathname==="/init"&&u.startsWith(c$1)&&g.searchParams.set("track","1"),h=g.toString(),c=g.searchParams.get("base")??void 0;}else if(r(u)){let g=q(u);g||(b.error(`Invalid preset code: ${a.info(u)}`),b.break(),process.exit(1)),h=me({...g,base:"radix",rtl:n.rtl??!1},{template:n.template,preset:u,pointer:n.pointer}),c=void 0;}else {let g=s.get(u);if(!g)throw new Error(`Unknown preset: ${u}`);h=me({...g,base:n.base??"radix",rtl:n.rtl??g.rtl},{template:n.template,pointer:n.pointer}),c=void 0;}e=[h,...e];}}let m=n.base??c??(p?.style?p.style.startsWith("base-")?"base":"radix":"");if(!m)if(e.length>0)m="radix";else {let u=await We();m=u,n.base=u;}if(n.defaults&&!e.some(G$1)&&(e=[me({...H.nova,base:m,rtl:n.rtl??!1},{template:n.template,pointer:n.pointer}),...e]),e.length>0&&G$1(e[0])){let u=new URL(e[0]);u.searchParams.set("base",m),e[0]=u.toString();}if(p?.style){let u=await Hs(p.style,m);if(u!==m&&(m=u,e.length>0&&G$1(e[0]))){let h=new URL(e[0]);h.searchParams.set("base",u),e[0]=h.toString();}}if(o.length&&(e=[...e,...o]),n.components=e,await K(n.cwd),e.length>0){let u=se__default.resolve(a$1,"components.json");l&&(r$1=at(u)??void 0,r$1||b.warn(`Could not back up ${a.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:g,url:y}=await Se(e[0],a$1,{registries:p?.registries});e[0]=y,g||(n.installStyleIndex=!1),h&&(n.registryBaseConfig=h);}await Ye(n),b.break(),b.log(`Project initialization completed.
126
+ You may now add components.`),process.removeListener("exit",i),ct(se__default.resolve(a$1,"components.json")),b.break();}catch(n){process.removeListener("exit",i),i(),b.break(),$(n);}finally{V();}});async function Ye(e){let t,r,o=e.template,i=o?$e(Y[o],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&O.existsSync(se__default.resolve(e.cwd,"package.json")))t=await ra$1(e.cwd);else if(e.skipPreflight)t=await ra$1(e.cwd);else {let x=await Oo(e);if(x.errors["1"]){let{projectPath:R,template:L}=await zt(e);R||process.exit(1),e.cwd=R,e.isNewProject=true,r=L,t=await ra$1(e.cwd);}else t=x.projectInfo;}let s=!!r,c=r??o,a$1=c?$e(Y[c],{monorepo:e.monorepo}):void 0,l=[...e.installStyleIndex?["index"]:[],...e.components??[],...a$1?["button"]:[]];if(a$1?.init){let x=await a$1.init({projectPath:e.cwd,components:l,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}),x}let p=await sa$1(e.cwd,t),m=p?await Js(p,e):await zs(await N(e.cwd));if(!e.yes){let{proceed:x}=await we({type:"confirm",name:"proceed",message:`Write configuration to ${a.info("components.json")}. Proceed?`,initial:true});x||process.exit(1);}let u=await O$1(e.cwd,m),{config:h}=await M(l,u,{silent:true});h.registries&&(m.registries=h.registries);let g=w("Writing components.json.").start(),y=se__default.resolve(e.cwd,"components.json"),b=`${y}${Ge}`,k=(x,R)=>{let{registries:L,...q}=qo(x,R);return {...q,registries:L}};if(O.existsSync(b)){let x=await O.readJson(b);e.force?x.registries&&(m.registries={...x.registries,...m.registries||{}}):m=k(x,m);}e.registryBaseConfig&&(m=k(m,e.registryBaseConfig)),e.rtl!==void 0&&(m.rtl=e.rtl),m.registries=Object.fromEntries(Object.entries(m.registries||{}).filter(([x])=>!Object.keys(d).includes(x))),await promises.writeFile(y,`${JSON.stringify(m,null,2)}
127
+ `,"utf8"),g.succeed();let $=await O$1(e.cwd,m),S=await P($);if(S){let x={};if(m.menuColor&&(x.menuColor=m.menuColor),m.menuAccent&&(x.menuAccent=m.menuAccent),m.rtl!==void 0&&(x.rtl=m.rtl),m.iconLibrary&&(x.iconLibrary=m.iconLibrary),Object.keys(x).length>0)for(let R of Object.keys(S)){let L=S[R];if(L.resolvedPaths.cwd===$.resolvedPaths.cwd)continue;let q=se__default.resolve(L.resolvedPaths.cwd,"components.json");if(O.existsSync(q)){let xe=await O.readJson(q);await O.writeJson(q,{...xe,...x},{spaces:2});}}}return M$1.clearCaches(),await ce(l,$,{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}),$}async function zs(e=null){let[t,r]=await Promise.all([fa$1(),ha$1()]);b.info("");let o=await we([{type:"toggle",name:"typescript",message:`Would you like to use ${a.info("TypeScript")} (recommended)?`,initial:e?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${a.info("style")} would you like to use?`,choices:t.map(i=>({title:i.label,value:i.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${a.info("base color")}?`,choices:r.map(i=>({title:i.label,value:i.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${a.info("global CSS")} file?`,initial:e?.tailwind.css??K$1},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${a.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${a.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${a.info("tailwind.config.js")} located?`,initial:e?.tailwind.config??L},{type:"text",name:"components",message:`Configure the import alias for ${a.info("components")}:`,initial:e?.aliases.components??I},{type:"text",name:"utils",message:`Configure the import alias for ${a.info("utils")}:`,initial:e?.aliases.utils??J},{type:"toggle",name:"rsc",message:`Are you using ${a.info("React Server Components")}?`,initial:e?.rsc??true,active:"yes",inactive:"no"}]);return o.style||process.exit(1),c.parse({$schema:"https://ui.shadcn.com/schema.json",style:o.style,tailwind:{config:o.tailwindConfig,css:o.tailwindCss,baseColor:o.tailwindBaseColor,cssVariables:o.tailwindCssVariables,prefix:o.tailwindPrefix},rsc:o.rsc,tsx:o.typescript,aliases:{utils:o.utils,components:o.components,lib:o.components.replace(/\/components$/,"lib"),hooks:o.components.replace(/\/components$/,"hooks")}})}async function Js(e,t){let r=e.style,o="neutral",i=e.tailwind.cssVariables,n=e.iconLibrary??"lucide";if(!t.defaults){let[s,c]=await Promise.all([fa$1(),ta$1(e)]);r=(await we([{type:c==="v4"||r?null:"select",name:"style",message:`Which ${a.info("style")} would you like to use?`,choices:s.map(l=>({title:l.name==="new-york"?"New York (Recommended)":l.label,value:l.name})),initial:0}])).style??r??"new-york";}return i=t.cssVariables,c.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:o,cssVariables:i},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:n,rtl:t.rtl??e?.rtl??false,aliases:e?.aliases})}async function Hs(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:o}=await we({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:false});return o?t:r}async function dn(e){let t={};if(!O.existsSync(e.cwd)||!O.existsSync(se__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!O.existsSync(se__default.resolve(e.cwd,"components.json"))){if(await U(e.cwd)){let r=await W(e.cwd);r.length>0&&(B("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 hn(e,t,r={}){let o={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return o;let i=await _$1(e,U$1(t));if(!i)throw new Error("Failed to fetch components from registry.");r.skipFonts||(i=await it(i,t));let n=Ie([i]);return o.dependencies=Array.from(new Set(i.dependencies??[])),o.devDependencies=Array.from(new Set(i.devDependencies??[])),o.docs=i.docs??null,await Gs(i,t,o,r,n),await Ys(i,t,o,r),Ks(i,t,o),r.skipFonts||qs(i,o),o}async function Gs(e,t,r,o,i){let n=e.files;if(!n?.length)return;let[s$1,c]=await Promise.all([ra$1(t.resolvedPaths.cwd),t.tailwind.baseColor?ia$1(t.tailwind.baseColor):Promise.resolve(void 0)]);for(let a=0;a<n.length;a++){let l=n[a];if(!l.content)continue;let p=E(l,t,{isSrcDir:s$1?.isSrcDir,framework:s$1?.framework.name,commonRoot:F(n.map(k=>k.path),l.path),fileIndex:a});if(!p)continue;t.tsx||(p=p.replace(/\.tsx?$/,k=>k===".tsx"?".jsx":".js"));let m=existsSync(p),u=se__default.relative(t.resolvedPaths.cwd,p),h=l.type==="registry:file"||l.type==="registry:item",g$1=s(p)||h?l.content:await B$1({filename:l.path,raw:l.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$1]),y$1="create",b;m&&(b=await promises.readFile(p,"utf-8"),r$1(b,g$1)?y$1="skip":y$1="overwrite"),r.files.push({path:u,action:y$1,content:g$1,...y$1==="overwrite"&&{existingContent:b},type:l.type??"registry:ui"});}}async function Ys(e,t,r,o){let i=e.css&&Object.keys(e.css).length>0,n=Object.keys(e.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!i&&!n)return;let s=t.resolvedPaths.tailwindCss,c=existsSync(s),a=se__default.relative(t.resolvedPaths.cwd,s),l=c?await promises.readFile(s,"utf8"):"",p=l;n&&(p=await rt(p,e.cssVars,t,{overwriteCssVars:o.overwriteCssVars})),i&&(p=await yr(p,e.css));let m=0;if(e.cssVars)for(let u of Object.values(e.cssVars))u&&(m+=Object.keys(u).length);r.css={path:a,content:p,...c&&{existingContent:l},action:c?"update":"create",cssVarsCount:m};}function Ks(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let o=se__default.join(t.resolvedPaths.cwd,".env.local"),i=existsSync(o),n=se__default.relative(t.resolvedPaths.cwd,o);r.envVars={path:n,variables:e.envVars,action:i?"update":"create"};}function qs(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 be=5,Qs=dim("\u250C"+"\u2500".repeat(46)),ea=dim("\u2514"+"\u2500".repeat(46)),ta={create:"+",overwrite:"~",skip:"="},ra={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function lt(e){return e==="create"?green(e):e==="overwrite"||e==="update"?yellow(e):dim(e)}function ft(e){return `${bold("\u250C")} ${bold(`shadcn add ${e.join(", ")}`)} ${dim("(dry run)")}`}function bn(e,t){return e===t||e.includes(t)||e.endsWith(t)}function Fe(e,t,r=o=>o){e.push(`${dim("\u2502")} ${Qs}`);for(let o of t)e.push(`${dim("\u2502")} ${dim("\u2502")} ${r(o)}`);e.push(`${dim("\u2502")} ${ea}`);}function kn(e,t,r={}){return r.diff?typeof r.diff=="string"?na(e,t,r.diff):ia(e,t):r.view?typeof r.view=="string"?aa(e,t,r.view):sa(e,t):oa(e,t)}function oa(e,t){let r=[];r.push(ft(t)),r.push(dim("\u2502")),ca(e,r),yn("Dependencies",e.dependencies,r),yn("Dev Dependencies",e.devDependencies,r),la(e,r),fa(e,r),pa(e,r);let o=e.files.filter(n=>n.action==="overwrite").length;o>0&&(r.push(yellow(`\u26A0 ${o} ${o===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 na(e,t,r){let o=[];o.push(ft(t)),o.push(dim("\u2502"));let i=xn(e.files,r),n=e.css&&bn(e.css.path,r);if(i.length===0&&!n)o.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),o.push(dim("\u2502"));else {for(let s of i)Cn(s,o);if(n&&e.css){if(o.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${lt(e.css.action)}${dim(")")}`),e.css.action==="create"||!e.css.existingContent)Fe(o,e.css.content.split(`
130
+ `),s=>green(`+${s}`));else {let s=vn(e.css.existingContent,e.css.content,e.css.path,{fullContext:true});Fe(o,s);}o.push(dim("\u2502"));}}return o.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),o.join(`
131
+ `)}function ia(e,t){let r=[];r.push(ft(t)),r.push(dim("\u2502"));let o=e.files.slice(0,be);if(o.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No changes.")}`),r.push(dim("\u2502"));else {for(let s of o)Cn(s,r);e.files.length>be&&r.push(dim("\u2502"));}let i=e.files.length;return i>be&&r.push(` ${dim(`Showing ${be} 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 sa(e,t){let r=[];r.push(ft(t)),r.push(dim("\u2502"));let o=e.files.slice(0,be);if(o.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No files.")}`),r.push(dim("\u2502"));else {for(let s of o){let c=s.content.split(`
133
+ `);r.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${lt(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),Fe(r,c),r.push(dim("\u2502"));}e.files.length>be&&r.push(dim("\u2502"));}let i=e.files.length;return i>be&&r.push(` ${dim(`Showing ${be} 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 Cn(e,t){if(t.push(`${dim("\u251C")} ${bold(e.path)} ${dim("(")}${lt(e.action)}${dim(")")}`),e.action==="skip")t.push(`${dim("\u2502")} ${dim("No changes.")}`);else if(e.action==="create")Fe(t,e.content.split(`
135
+ `),r=>green(`+${r}`));else {let r=vn(e.existingContent,e.content,e.path);Fe(t,r);}t.push(dim("\u2502"));}function aa(e,t,r){let o=[];o.push(ft(t)),o.push(dim("\u2502"));let i=xn(e.files,r),n=e.css&&bn(e.css.path,r);if(i.length===0&&!n)o.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),o.push(dim("\u2502"));else {for(let s of i){let c=s.content.split(`
136
+ `);o.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${lt(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),Fe(o,c),o.push(dim("\u2502"));}if(n&&e.css){let s=e.css.content.split(`
137
+ `);o.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${lt(e.css.action)}${dim(")")} ${dim(`${s.length} lines`)}`),Fe(o,s),o.push(dim("\u2502"));}}return o.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),o.join(`
138
+ `)}function ca(e,t){if(e.files.length===0)return;let r={create:0,overwrite:0,skip:0};for(let s of e.files)r[s.action]++;let o=[];r.create>0&&o.push(green(`+${r.create} new`)),r.overwrite>0&&o.push(yellow(`~${r.overwrite} overwrite`)),r.skip>0&&o.push(dim(`=${r.skip} skip`));let i=o.length>0?` ${o.join(dim(", "))}`:"";t.push(`${dim("\u251C")} ${bold("Files")} ${dim(`(${e.files.length})`)}${i}`);let n=Math.max(...e.files.map(s=>s.path.length));for(let s of e.files){let c=ta[s.action],a=ra[s.action],l=" ".repeat(Math.max(1,n-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}${l}${p(a)}`);}t.push(dim("\u2502"));}function yn(e,t,r){if(t.length){r.push(`${dim("\u251C")} ${bold(e)} ${dim(`(${t.length})`)}`);for(let o of t)r.push(`${dim("\u2502")} ${green("+")} ${o}`);r.push(dim("\u2502"));}}function la(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 fa(e,t){if(!e.envVars)return;let r=Object.keys(e.envVars.variables);t.push(`${dim("\u251C")} ${bold("Environment Variables")}`);for(let o of r)t.push(`${dim("\u2502")} ${green("+")} ${o}`);t.push(dim("\u2502"));}function pa(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 xn(e,t){let r=e.filter(o=>o.path===t);return r.length>0?r:e.filter(o=>o.path.includes(t)||o.path.replace(/\\/g,"/").includes(t))}function vn(e,t,r,o={}){if(ha(e,t))return [dim(" Formatting-only changes (spacing, quotes, semicolons).")];let i=wn(e),n=wn(t),s=o.fullContext?Math.max(i.split(`
139
+ `).length,n.split(`
140
+ `).length):3,c=structuredPatch(`a/${r}`,`b/${r}`,i,n,"","",{context:s});if(!c.hunks.length)return [dim(" No changes.")];let a=[dim(`--- a/${r}`),dim(`+++ b/${r}`)],l=t.split(`
141
+ `);for(let p of c.hunks){let{entries:m}=ma(p,l);if(!m.some(b=>b.kind!=="context"))continue;let h=m.filter(b=>b.kind==="context").length,g=m.filter(b=>b.kind==="removed").length,y=m.filter(b=>b.kind==="added").length;a.push(cyan(`@@ -${p.oldStart},${h+g} +${p.newStart},${h+y} @@`));for(let b of m)a.push(b.formatted);}return a}function ma(e,t){let r=[],o=e.newStart-1,i=0;for(;i<e.lines.length;){let n=e.lines[i];if(n.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++;o=ua(s,c,t,o,r);}else if(n.startsWith("+")){let s=t[o]??n.slice(1);r.push({kind:"added",formatted:green(`+${s}`)}),o++,i++;}else if(n.startsWith("\\"))i++;else {let s=t[o]??n.slice(1);r.push({kind:"context",formatted:dim(` ${s}`)}),o++,i++;}}return {entries:r,newLineIndex:o}}function ua(e,t,r,o,i){if(ya(e,t)){for(let a=0;a<t.length;a++){let l=r[o]??t[a];i.push({kind:"context",formatted:dim(` ${l}`)}),o++;}return o}let n=da(e),s=n.map(Ht),c=new Set;for(let a=0;a<t.length;a++){let l=r[o]??t[a],p=Ht(t[a]),m=s.findIndex((u,h)=>!c.has(h)&&u===p);if(m!==-1)c.add(m),i.push({kind:"context",formatted:dim(` ${l}`)});else {let u=s.findIndex((h,g)=>!c.has(g));if(u!==-1){c.add(u);let{oldHighlighted:h,newHighlighted:g}=ga(n[u],l);i.push({kind:"removed",formatted:h}),i.push({kind:"added",formatted:g});}else i.push({kind:"added",formatted:green(`+${l}`)});}o++;}for(let a=0;a<n.length;a++)c.has(a)||i.push({kind:"removed",formatted:red(`-${n[a]}`)});return o}function wn(e){return e.split(`
142
+ `).map(t=>{let r=t.match(/^(\s*)/)?.[1]??"",o=t.slice(r.length);return r+o.replace(/['"]/g,'"').replace(/;$/g,"")}).join(`
143
+ `)}function da(e){let t=[];for(let r=0;r<e.length;r++){let o=e[r];for(;r+1<e.length&&o.trimEnd().endsWith(":");)r++,o=o.trimEnd()+" "+e[r].trim();t.push(o);}return t}function ga(e,t){let r=diffWords(e,t),o="-",i="+";for(let n of r)n.added?i+=bold(green(n.value)):n.removed?o+=bold(red(n.value)):(o+=red(n.value),i+=green(n.value));return {oldHighlighted:o,newHighlighted:i}}function Ht(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function ha(e,t){let r=o=>o.split(`
144
+ `).map(Ht).filter(i=>i.length>0).join(" ");return r(e)===r(t)}function ya(e,t){let r=o=>o.map(Ht).filter(i=>i.length>0).join(" ");return r(e)===r(t)}async function Sn(e,t){let r=se__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await Ae__default.stat(r)).isFile())return;let[o]=await ba([e],{config:t});if(!o?.meta?.importSpecifier||!o?.meta?.moduleSpecifier)return;let i=`import { ${o?.meta?.importSpecifier} } from "${o.meta.moduleSpecifier}"
145
145
 
146
146
  export default function Page() {
147
- return <${n?.meta?.importSpecifier} />
148
- }`;await Fe__default.writeFile(r,i,"utf8");}var Es=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()}),Yn=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=Es.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 U(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 we({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 Fs(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 Dn(r),m=!1;if(f["3"]){let{proceed:g}=await we({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=Ue(a$1?.framework.name),C=await _e(),{url:b$1}=await qe({rtl:!1,base:C,template:w}),{registryBaseConfig:j,installStyleIndex:k,url:v}=await Se(b$1,r.cwd);p=await We({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!o,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:k,components:[v,...r.components??[]],registryBaseConfig:j}),m=!0;}let d=!1;if(f["1"]){let{projectPath:g,template:w}=await Dt({cwd:r.cwd,force:r.overwrite,components:r.components});g||(b.break(),process.exit(1)),r.cwd=g;let C=await _e(),{url:b$1}=await qe({rtl:!1,base:C,template:w}),{registryBaseConfig:j,installStyleIndex:k,url:v}=await Se(b$1,r.cwd);p=await We({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!o&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:k,components:[v,...r.components??[]],registryBaseConfig:j}),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 U(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 _n(r.components,p,{overwrite:r.overwrite});g.stop(),b.log(Wn(w$1,r.components,{diff:r.diff,view:r.view}));return}m||await ae(r.components,p,r),d&&await Hn(r.components[0],p);}catch(r){b.break(),$(r);}finally{V();}});async function Fs(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 we({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 qn(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 Ns=z$1.object({cwd:z$1.string(),positionalPreset:z$1.string().optional(),preset:z$1.string().optional(),only:z$1.union([z$1.boolean(),z$1.string()]).optional(),yes:z$1.boolean(),silent:z$1.boolean()}),eo=["theme","font"],ze=class extends Error{constructor(t){super(t),this.name="ApplyOnlyError";}},to=new Command().name("apply").description("apply a preset to an existing project").argument("[preset]","the preset to apply").option("--preset <preset>","preset configuration to apply").option("--only [parts]","apply only parts of a preset: theme, font").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e,t)=>{try{let r=Ns.parse({...t,cwd:ie__default.resolve(t.cwd),positionalPreset:e}),n=Ts(r),i=Zn(r.only);_s({preset:n,only:i});let o=await qn(r);o.errors["1"]&&(b.break(),b.error(`The ${a.info("apply")} command only works in an existing project.`),b.error(`Run ${a.info(Qn(n))} first.`),b.break(),process.exit(1)),o.errors["3"]&&(b.break(),b.error(`No ${a.info("components.json")} found at ${a.info(r.cwd)}.`),b.error(`Run ${a.info(Qn(n))} first.`),b.break(),process.exit(1));let s=o.config;s||process.exit(1);let c=s.rtl??!1,a$1=await Ms(r.cwd);if(!n){let g=tr({command:"init",template:a$1,base:S(s.style),rtl:c});await rr({createUrl:g,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);}Us(n);let f=i??Zn(Ds(n)),p=!f,m=p?await ua(r.cwd):[];if(!r.yes){if(b.break(),f?b.warn(a.warn("Applying the selected preset parts will update your project configuration and styles.")):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."),p)if(b.break(),b.log(" The following components will be re-installed:"),m.length)for(let w=0;w<m.length;w+=8)b.log(` - ${m.slice(w,w+8).join(", ")}`);else b.log(" - No installed UI components were detected.");b.break();let{proceed:g}=await we({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});g||(b.break(),process.exit(1));}await Y(r.cwd);let d=S(s.style),h=Ws(n,d,{template:a$1,rtl:c,only:f?.join(",")});await An(ie__default.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:g,installStyleIndex:w,url:C}=await Se(h,r.cwd,{registries:s.registries}),b=Vs({registryBaseConfig:g,existingConfig:s,only:f});await We({cwd:r.cwd,yes:!0,force:!1,reinstall:p,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:w,registryBaseConfig:b,existingConfig:s,components:[C,...m]});},{onBackupFailure:()=>{b.error(`Could not back up ${a.info("components.json")}. Aborting.`);}}),b.break(),b.log("Preset applied successfully."),b.break();}catch(r){if(r instanceof ze){for(let n of r.message.split(`
151
- `))b.error(n);b.break(),process.exit(1);}b.break(),$(r);}finally{V();}});function Ts(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 Ds(e){if(!G$1(e))return;let t=new URL(e);if(t.pathname==="/init")return t.searchParams.get("only")??void 0}function Zn(e){if(!(e===void 0||e===false)){if(e===true)throw new ze(["Missing value for --only.",`Use one or more of: ${eo.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
152
- `));return Ls(e)}}function Ls(e){let t={theme:"theme",font:"font",fonts:"font"},r=e.split(",").map(i=>i.trim().toLowerCase()).filter(Boolean),n=r.filter(i=>!t[i]);if(!r.length||n.length)throw new ze([`Invalid value for --only: ${e}.`,`Use one or more of: ${eo.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
153
- `));return Array.from(new Set(r.map(i=>t[i])))}function _s(e){if(!(!e.only||e.preset))throw new ze(["Missing preset for --only.","Use: shadcn apply <preset> --only theme,font."].join(`
154
- `))}function Vs(e){if(!e.only||e.only.includes("theme"))return e.registryBaseConfig;let t=typeof e.existingConfig.tailwind=="object"&&e.existingConfig.tailwind!==null?e.existingConfig.tailwind:{},r=typeof e.registryBaseConfig?.tailwind=="object"&&e.registryBaseConfig.tailwind!==null?e.registryBaseConfig.tailwind:{},n={...e.registryBaseConfig,tailwind:{...t,...r}};return e.existingConfig.menuColor&&(n.menuColor=e.existingConfig.menuColor),e.existingConfig.menuAccent&&(n.menuAccent=e.existingConfig.menuAccent),n}function Us(e){if(G$1(e)||r(e))return;let t=Object.keys(pe);t.includes(e)||(b.error(`Invalid preset: ${a.info(e)}.
147
+ return <${o?.meta?.importSpecifier} />
148
+ }`;await Ae__default.writeFile(r,i,"utf8");}var Ca=z.object({components:z.array(z.string()).optional(),yes:z.boolean(),overwrite:z.boolean(),cwd:z.string(),all:z.boolean(),path:z.string().optional(),silent:z.boolean(),dryRun:z.boolean(),diff:z.union([z.string(),z.literal(true)]).optional(),view:z.union([z.string(),z.literal(true)]).optional()}),Pn=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=Ca.parse({components:e$1,...t,cwd:se__default.resolve(t.cwd)});await K(r.cwd);let o=r.dryRun||r.diff||r.view,i=await N(r.cwd);i||(i=T({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let n=!1;if(e$1.length>0){let{config:g,newRegistries:y}=await M(e$1,i,{silent:r.silent,writeFile:!1});i=g,n=y.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)&&!o){await ce(e$1,i,r);return}if(!r.yes&&!o&&(s==="registry:style"||s==="registry:theme")){b.break();let{confirm:y}=await we({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?`)});y||(b.break(),b.log("Installation cancelled."),b.break(),process.exit(1));}}r.components?.length||(r.components=await xa(r));let a$1=await ra$1(r.cwd);if(a$1?.tailwindVersion==="v4"){let g=e.filter(y=>r.components?.includes(y.name));g?.length&&(b.break(),g.forEach(y=>{b.warn(a.warn(y.message));}),b.break(),process.exit(1));}let{errors:l,config:p}=await dn(r),m=!1;if(l["3"]){let{proceed:g}=await we({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 y=ze(a$1?.framework.name),b$1=await We(),{url:k}=await tt({rtl:!1,base:b$1,template:y}),{registryBaseConfig:$,installStyleIndex:S,url:x}=await Se(k,r.cwd);p=await Ye({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!n,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:S,components:[x,...r.components??[]],registryBaseConfig:$}),m=!0;}let u=!1;if(l["1"]){let{projectPath:g,template:y}=await zt({cwd:r.cwd,force:r.overwrite,components:r.components});g||(b.break(),process.exit(1)),r.cwd=g;let b$1=await We(),{url:k}=await tt({rtl:!1,base:b$1,template:y}),{registryBaseConfig:$,installStyleIndex:S,url:x}=await Se(k,r.cwd);p=await Ye({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!n&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:S,components:[x,...r.components??[]],registryBaseConfig:$}),m=!0,u=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||n,writeFile:!o});if(p=h,o){let g=w("Resolving items.",{silent:r.silent}).start(),y=await hn(r.components,p,{overwrite:r.overwrite});g.stop(),b.log(kn(y,r.components,{diff:r.diff,view:r.view}));return}m||await ce(r.components,p,r),u&&await Sn(r.components[0],p);}catch(r){b.break(),$(r);}finally{V();}});async function xa(e$1){let t=await ea$1();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(n=>n.name===i));if(e$1.components?.length)return e$1.components;let{components:r}=await we({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(n=>n.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 o=z.array(z.string()).safeParse(r);return o.success?o.data:(b.error(""),$(new Error("Something went wrong. Please try again.")),[])}async function $n(e){let t={};if(!O.existsSync(e.cwd)||!O.existsSync(se__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!O.existsSync(se__default.resolve(e.cwd,"components.json"))){if(await U(e.cwd)){let r=await W(e.cwd),o=[];for(let i of r){let n=await ra$1(se__default.resolve(e.cwd,i.name));n?.framework&&n.framework.name!=="manual"&&o.push(i);}o.length>0&&(B("apply --preset <preset>",o,{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 Sa=z.object({cwd:z.string(),positionalPreset:z.string().optional(),preset:z.string().optional(),only:z.union([z.boolean(),z.string()]).optional(),yes:z.boolean(),silent:z.boolean()}),jn=["theme","font"],qe=class extends Error{constructor(t){super(t),this.name="ApplyOnlyError";}},Gt=class extends Error{constructor(t){super(t),this.name="ApplyWorkspaceSyncError";}},Fn=new Command().name("apply").description("apply a preset to an existing project").argument("[preset]","the preset to apply").option("--preset <preset>","preset configuration to apply").option("--only [parts]","apply only parts of a preset: theme, font").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e,t)=>{try{let r=Sa.parse({...t,cwd:se__default.resolve(t.cwd),positionalPreset:e}),o=Pa(r),i=In(r.only);Ea({preset:o,only:i});let n=await $n(r);n.errors["1"]&&(b.break(),b.error(`The ${a.info("apply")} command only works in an existing project.`),b.error(`Run ${a.info(En(o))} first.`),b.break(),process.exit(1)),n.errors["3"]&&(b.break(),b.error(`No ${a.info("components.json")} found at ${a.info(r.cwd)}.`),b.error(`Run ${a.info(En(o))} first.`),b.break(),process.exit(1));let s=n.config;s||process.exit(1);let c=s.rtl??!1,a$1=await Aa(r.cwd);if(!o){let y=gr({command:"init",template:a$1,base:S(s.style),rtl:c});await hr({createUrl:y,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);}Fa(o);let l=i??In($a(o)),p=!l,m=p?await ua$1(r.cwd):[];if(!r.yes){if(b.break(),l?b.warn(a.warn("Applying the selected preset parts will update your project configuration and styles.")):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."),p)if(b.break(),b.log(" The following components will be re-installed:"),m.length)for(let b$1=0;b$1<m.length;b$1+=8)b.log(` - ${m.slice(b$1,b$1+8).join(", ")}`);else b.log(" - No installed UI components were detected.");b.break();let{proceed:y}=await we({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});y||(b.break(),process.exit(1));}await K(r.cwd);let u=S(s.style),h=Oa(o,u,{template:a$1,rtl:c,only:l?.join(",")}),g=await pn(se__default.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:y,installStyleIndex:b,url:k}=await Se(h,r.cwd,{registries:s.registries}),$=ja({registryBaseConfig:y,existingConfig:s,only:l});return await Ye({cwd:r.cwd,yes:!0,force:!1,reinstall:p,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:b,registryBaseConfig:$,existingConfig:s,components:[k,...m]})});await Na(g,{only:l}),b.break(),b.log("Preset applied successfully."),b.break();}catch(r){if(r instanceof qe){for(let o of r.message.split(`
151
+ `))b.error(o);b.break(),process.exit(1);}r instanceof Je&&(b.error(`Could not back up ${a.info("components.json")}. Aborting.`),b.break(),process.exit(1)),r instanceof Gt&&(b.error(r.message),b.break(),process.exit(1)),b.break(),$(r);}finally{V();}});function Pa(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 $a(e){if(!G$1(e))return;let t=new URL(e);if(t.pathname==="/init")return t.searchParams.get("only")??void 0}function In(e){if(!(e===void 0||e===false)){if(e===true)throw new qe(["Missing value for --only.",`Use one or more of: ${jn.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
152
+ `));return Ia(e)}}function Ia(e){let t={theme:"theme",font:"font",fonts:"font"},r=e.split(",").map(i=>i.trim().toLowerCase()).filter(Boolean),o=r.filter(i=>!t[i]);if(!r.length||o.length)throw new qe([`Invalid value for --only: ${e}.`,`Use one or more of: ${jn.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
153
+ `));return Array.from(new Set(r.map(i=>t[i])))}function Ea(e){if(!(!e.only||e.preset))throw new qe(["Missing preset for --only.","Use: shadcn apply <preset> --only theme,font."].join(`
154
+ `))}function ja(e){if(!e.only||e.only.includes("theme"))return e.registryBaseConfig;let t=typeof e.existingConfig.tailwind=="object"&&e.existingConfig.tailwind!==null?e.existingConfig.tailwind:{},r=typeof e.registryBaseConfig?.tailwind=="object"&&e.registryBaseConfig.tailwind!==null?e.registryBaseConfig.tailwind:{},o={...e.registryBaseConfig,tailwind:{...t,...r}};return e.existingConfig.menuColor&&(o.menuColor=e.existingConfig.menuColor),e.existingConfig.menuAccent&&(o.menuAccent=e.existingConfig.menuAccent),o}function Fa(e){if(G$1(e)||r(e))return;let t=Object.keys(H);t.includes(e)||(b.error(`Invalid preset: ${a.info(e)}.
155
155
  Use one of the available presets: ${t.join(", ")}
156
- or build your own at ${a.info(`${c$1}/create`)}`),b.break(),process.exit(1));}async function Ms(e){let t=await ra$1(e);return Ue(t?.framework.name)}function Ws(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)),r$1.only&&i.searchParams.set("only",r$1.only),i.toString()}if(r(e)){let i=q(e);return i||(b.error(`Invalid preset code: ${a.info(e)}`),b.break(),process.exit(1)),me({...i,base:t,rtl:r$1.rtl??false},{preset:e,template:r$1.template,only:r$1.only})}let n=pe[e];return me({...n,base:t,rtl:r$1.rtl??n.rtl},{template:r$1.template,only:r$1.only})}function Bs(e){return /[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function Qn(e){return e?`shadcn init --preset ${Bs(e)}`:"shadcn init"}async function io(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 Js=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),so=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=Js.parse({cwd:ie.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:n$1}=await io(r),i=await Fe.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 Fe.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 Fe.writeFile(ie.resolve(n$1.outputDir,`${a$1.data.name}.json`),JSON.stringify(a$1.data,null,2));}await Fe.copyFile(n$1.registryFile,ie.resolve(n$1.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){b.break(),$(r);}});var Ks=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),co=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=Ks.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 ao(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 ao(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 qs(a.patch),b.info("");}catch(r){$(r);}});async function ao(e,t){let r=await ka$1(t.style,[e]),n=await ia(t.tailwind.baseColor),i=Ie(r);if(!r)return [];let o=[];for(let s of r){let c=await la$1(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 qs(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 lo=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 po="https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases",mo=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(t),o=S(n?.style),s=ra(r,n,i,o);if(e.json){console.log(JSON.stringify(s,null,2));return}na(s);}catch(t){$(t);}});function ta(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 ra(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:ta(t.registries)}:null,components:r,links:{docs:`${c$1}/docs`,components:`${c$1}/docs/components/${n}/[component].md`,ui:`${po}/${n}/ui/[component].tsx`,examples:`${po}/${n}/examples/[component]-example.tsx`,schema:"https://ui.shadcn.com/schema.json"}}}function na(e){b.log(a.info("Project")),e.project?Je({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?(Je({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")),Je({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")),Je({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:"),Je(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")),Je(e.links),b.break();}function Je(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 Oe="latest",Wt=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Oe}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Oe}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${Oe}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
156
+ or build your own at ${a.info(`${c$1}/create`)}`),b.break(),process.exit(1));}async function Aa(e){let t=await ra$1(e);return ze(t?.framework.name)}async function Na(e,t){if(t?.only&&!t.only.includes("theme"))return;let r=await Ta(e);if(!r.length)return;let o={style:e.style,tailwind:{baseColor:e.tailwind.baseColor,cssVariables:e.tailwind.cssVariables},...e.iconLibrary?{iconLibrary:e.iconLibrary}:{},...e.rtl!==void 0?{rtl:e.rtl}:{},...e.menuColor?{menuColor:e.menuColor}:{},...e.menuAccent?{menuAccent:e.menuAccent}:{}},i=[];for(let n of r){let s=se__default.resolve(n.resolvedPaths.cwd,"components.json");await O.pathExists(s)&&i.push({configPath:s,existingConfig:await O.readJson(s)});}try{for(let n of i)if(!at(n.configPath))throw new Je(n.configPath);for(let n of i)await O.writeJson(n.configPath,{...n.existingConfig,...o,tailwind:{...n.existingConfig.tailwind,...o.tailwind}},{spaces:2});for(let n of i)ct(n.configPath);}catch(n){for(let s of [...i].reverse())He(s.configPath);throw new Gt(`Failed to sync linked workspace configs.${n instanceof Error?` ${n.message}`:""}`)}}async function Ta(e){let t=await P(e);if(!t)return [];let r=new Map;for(let o of Object.values(t))o.resolvedPaths.cwd!==e.resolvedPaths.cwd&&r.set(o.resolvedPaths.cwd,o);return Array.from(r.values()).sort((o,i)=>o.resolvedPaths.cwd.localeCompare(i.resolvedPaths.cwd))}function Oa(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)),r$1.only&&i.searchParams.set("only",r$1.only),i.toString()}if(r(e)){let i=q(e);return i||(b.error(`Invalid preset code: ${a.info(e)}`),b.break(),process.exit(1)),me({...i,base:t,rtl:r$1.rtl??false},{preset:e,template:r$1.template,only:r$1.only})}let o=H[e];return me({...o,base:t,rtl:r$1.rtl??o.rtl},{template:r$1.template,only:r$1.only})}function _a(e){return /[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function En(e){return e?`shadcn init --preset ${_a(e)}`:"shadcn init"}async function On(e){let t={},r={cwd:e.cwd,registryFile:se__default.resolve(e.cwd,e.registryFile),outputDir:se__default.resolve(e.cwd,e.outputDir)};return O.existsSync(r.registryFile)||(t["13"]=true),await O.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 Va=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string()}),_n=new Command().name("build").description("build components for a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Va.parse({cwd:se.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:o$1}=await On(r),i=await Ae.readFile(o$1.registryFile,"utf-8"),n$1=o.safeParse(JSON.parse(i));n$1.success||(b.error(`Invalid registry file found at ${a.info(o$1.registryFile)}.`),process.exit(1));let s=w("Building registry...");for(let c of n$1.data.items){s.start(`Building ${c.name}...`),c.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let l of c.files??[])l.content=await Ae.readFile(se.resolve(o$1.cwd,l.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 Ae.writeFile(se.resolve(o$1.outputDir,`${a$1.data.name}.json`),JSON.stringify(a$1.data,null,2));}await Ae.copyFile(o$1.registryFile,se.resolve(o$1.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){b.break(),$(r);}});var Wa=z.object({component:z.string().optional(),yes:z.boolean(),cwd:z.string(),path:z.string().optional()}),Vn=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=Wa.parse({component:e,...t}),o=se__default.resolve(r.cwd);existsSync(o)||(b.error(`The path ${o} does not exist. Please try again.`),process.exit(1));let i=await N(o);if(!i){if(await U(o)){let a=await W(o);a.length>0&&(B("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 n=await ea$1();if(n||($(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a$1=i.resolvedPaths.components,l=n.filter(m=>{for(let u of m.files??[]){let h=se__default.resolve(a$1,typeof u=="string"?u:u.path);if(existsSync(h))return !0}return !1}),p=[];for(let m of l){let u=await Ln(m,i);u.length&&p.push({name:m.name,changes:u});}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 u of m.changes)b.info(` - ${u.filePath}`);}b.break(),b.info(`Run ${a.success("diff <component>")} to see the changes.`),process.exit(0);}let s=n.find(a=>a.name===r.component);s||(b.error(`The component ${a.success(r.component)} does not exist.`),process.exit(1));let c=await Ln(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 Ba(a.patch),b.info("");}catch(r){$(r);}});async function Ln(e,t){let r=await ka(t.style,[e]),o=await ia$1(t.tailwind.baseColor),i=Ie(r);if(!r)return [];let n=[];for(let s of r){let c=await la$1(t,s);if(c)for(let a of s.files??[]){let l=se__default.resolve(c,typeof a=="string"?a:a.path);if(!existsSync(l))continue;let p=await promises.readFile(l,"utf8");if(typeof a=="string"||!a.content)continue;let m=await B$1({filename:a.path,raw:a.content,config:t,baseColor:o,supportedFontMarkers:i},[x,y,a$1,A,c$2,g,d$1,f,z$1]),u=diffLines(m,p);u.length>1&&n.push({filePath:l,patch:u});}}return n}async function Ba(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 Dn="https://ui.shadcn.com",Mn=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=se__default.resolve(t.cwd),o=await N(r),i=t.base??S(o?.style),n=await ea$1();n||(b.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let a$1 of e){let l=n.find(m=>m.name===a$1);l||(b.error(`Component ${a.info(a$1)} not found in the shadcn registry.`),process.exit(1));let p=l.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:Ha(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(l=>l.length)));for(let{component:a$1,links:l}of s){b.log(a.info(a$1));for(let[p,m]of Object.entries(l))b.log(` - ${p.padEnd(c+2)}${m}`);b.break();}}catch(r){$(r);}});function Ha(e){return Object.fromEntries(Object.entries(e).map(([t,r])=>[t,r.startsWith(Dn)?`${c$1}${r.slice(Dn.length)}`:r]))}var Ga=["50","100","200","300","400","500","600","700","800","900","950"],Ya=["red","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose","slate","gray","zinc","neutral","stone","mauve","olive","mist","taupe"],Ka={red:{50:"oklch(97.1% 0.013 17.38)",100:"oklch(93.6% 0.032 17.717)",200:"oklch(88.5% 0.062 18.334)",300:"oklch(80.8% 0.114 19.571)",400:"oklch(70.4% 0.191 22.216)",500:"oklch(63.7% 0.237 25.331)",600:"oklch(57.7% 0.245 27.325)",700:"oklch(50.5% 0.213 27.518)",800:"oklch(44.4% 0.177 26.899)",900:"oklch(39.6% 0.141 25.723)",950:"oklch(25.8% 0.092 26.042)"},orange:{50:"oklch(98% 0.016 73.684)",100:"oklch(95.4% 0.038 75.164)",200:"oklch(90.1% 0.076 70.697)",300:"oklch(83.7% 0.128 66.29)",400:"oklch(75% 0.183 55.934)",500:"oklch(70.5% 0.213 47.604)",600:"oklch(64.6% 0.222 41.116)",700:"oklch(55.3% 0.195 38.402)",800:"oklch(47% 0.157 37.304)",900:"oklch(40.8% 0.123 38.172)",950:"oklch(26.6% 0.079 36.259)"},amber:{50:"oklch(98.7% 0.022 95.277)",100:"oklch(96.2% 0.059 95.617)",200:"oklch(92.4% 0.12 95.746)",300:"oklch(87.9% 0.169 91.605)",400:"oklch(82.8% 0.189 84.429)",500:"oklch(76.9% 0.188 70.08)",600:"oklch(66.6% 0.179 58.318)",700:"oklch(55.5% 0.163 48.998)",800:"oklch(47.3% 0.137 46.201)",900:"oklch(41.4% 0.112 45.904)",950:"oklch(27.9% 0.077 45.635)"},yellow:{50:"oklch(98.7% 0.026 102.212)",100:"oklch(97.3% 0.071 103.193)",200:"oklch(94.5% 0.129 101.54)",300:"oklch(90.5% 0.182 98.111)",400:"oklch(85.2% 0.199 91.936)",500:"oklch(79.5% 0.184 86.047)",600:"oklch(68.1% 0.162 75.834)",700:"oklch(55.4% 0.135 66.442)",800:"oklch(47.6% 0.114 61.907)",900:"oklch(42.1% 0.095 57.708)",950:"oklch(28.6% 0.066 53.813)"},lime:{50:"oklch(98.6% 0.031 120.757)",100:"oklch(96.7% 0.067 122.328)",200:"oklch(93.8% 0.127 124.321)",300:"oklch(89.7% 0.196 126.665)",400:"oklch(84.1% 0.238 128.85)",500:"oklch(76.8% 0.233 130.85)",600:"oklch(64.8% 0.2 131.684)",700:"oklch(53.2% 0.157 131.589)",800:"oklch(45.3% 0.124 130.933)",900:"oklch(40.5% 0.101 131.063)",950:"oklch(27.4% 0.072 132.109)"},green:{50:"oklch(98.2% 0.018 155.826)",100:"oklch(96.2% 0.044 156.743)",200:"oklch(92.5% 0.084 155.995)",300:"oklch(87.1% 0.15 154.449)",400:"oklch(79.2% 0.209 151.711)",500:"oklch(72.3% 0.219 149.579)",600:"oklch(62.7% 0.194 149.214)",700:"oklch(52.7% 0.154 150.069)",800:"oklch(44.8% 0.119 151.328)",900:"oklch(39.3% 0.095 152.535)",950:"oklch(26.6% 0.065 152.934)"},emerald:{50:"oklch(97.9% 0.021 166.113)",100:"oklch(95% 0.052 163.051)",200:"oklch(90.5% 0.093 164.15)",300:"oklch(84.5% 0.143 164.978)",400:"oklch(76.5% 0.177 163.223)",500:"oklch(69.6% 0.17 162.48)",600:"oklch(59.6% 0.145 163.225)",700:"oklch(50.8% 0.118 165.612)",800:"oklch(43.2% 0.095 166.913)",900:"oklch(37.8% 0.077 168.94)",950:"oklch(26.2% 0.051 172.552)"},teal:{50:"oklch(98.4% 0.014 180.72)",100:"oklch(95.3% 0.051 180.801)",200:"oklch(91% 0.096 180.426)",300:"oklch(85.5% 0.138 181.071)",400:"oklch(77.7% 0.152 181.912)",500:"oklch(70.4% 0.14 182.503)",600:"oklch(60% 0.118 184.704)",700:"oklch(51.1% 0.096 186.391)",800:"oklch(43.7% 0.078 188.216)",900:"oklch(38.6% 0.063 188.416)",950:"oklch(27.7% 0.046 192.524)"},cyan:{50:"oklch(98.4% 0.019 200.873)",100:"oklch(95.6% 0.045 203.388)",200:"oklch(91.7% 0.08 205.041)",300:"oklch(86.5% 0.127 207.078)",400:"oklch(78.9% 0.154 211.53)",500:"oklch(71.5% 0.143 215.221)",600:"oklch(60.9% 0.126 221.723)",700:"oklch(52% 0.105 223.128)",800:"oklch(45% 0.085 224.283)",900:"oklch(39.8% 0.07 227.392)",950:"oklch(30.2% 0.056 229.695)"},sky:{50:"oklch(97.7% 0.013 236.62)",100:"oklch(95.1% 0.026 236.824)",200:"oklch(90.1% 0.058 230.902)",300:"oklch(82.8% 0.111 230.318)",400:"oklch(74.6% 0.16 232.661)",500:"oklch(68.5% 0.169 237.323)",600:"oklch(58.8% 0.158 241.966)",700:"oklch(50% 0.134 242.749)",800:"oklch(44.3% 0.11 240.79)",900:"oklch(39.1% 0.09 240.876)",950:"oklch(29.3% 0.066 243.157)"},blue:{50:"oklch(97% 0.014 254.604)",100:"oklch(93.2% 0.032 255.585)",200:"oklch(88.2% 0.059 254.128)",300:"oklch(80.9% 0.105 251.813)",400:"oklch(70.7% 0.165 254.624)",500:"oklch(62.3% 0.214 259.815)",600:"oklch(54.6% 0.245 262.881)",700:"oklch(48.8% 0.243 264.376)",800:"oklch(42.4% 0.199 265.638)",900:"oklch(37.9% 0.146 265.522)",950:"oklch(28.2% 0.091 267.935)"},indigo:{50:"oklch(96.2% 0.018 272.314)",100:"oklch(93% 0.034 272.788)",200:"oklch(87% 0.065 274.039)",300:"oklch(78.5% 0.115 274.713)",400:"oklch(67.3% 0.182 276.935)",500:"oklch(58.5% 0.233 277.117)",600:"oklch(51.1% 0.262 276.966)",700:"oklch(45.7% 0.24 277.023)",800:"oklch(39.8% 0.195 277.366)",900:"oklch(35.9% 0.144 278.697)",950:"oklch(25.7% 0.09 281.288)"},violet:{50:"oklch(96.9% 0.016 293.756)",100:"oklch(94.3% 0.029 294.588)",200:"oklch(89.4% 0.057 293.283)",300:"oklch(81.1% 0.111 293.571)",400:"oklch(70.2% 0.183 293.541)",500:"oklch(60.6% 0.25 292.717)",600:"oklch(54.1% 0.281 293.009)",700:"oklch(49.1% 0.27 292.581)",800:"oklch(43.2% 0.232 292.759)",900:"oklch(38% 0.189 293.745)",950:"oklch(28.3% 0.141 291.089)"},purple:{50:"oklch(97.7% 0.014 308.299)",100:"oklch(94.6% 0.033 307.174)",200:"oklch(90.2% 0.063 306.703)",300:"oklch(82.7% 0.119 306.383)",400:"oklch(71.4% 0.203 305.504)",500:"oklch(62.7% 0.265 303.9)",600:"oklch(55.8% 0.288 302.321)",700:"oklch(49.6% 0.265 301.924)",800:"oklch(43.8% 0.218 303.724)",900:"oklch(38.1% 0.176 304.987)",950:"oklch(29.1% 0.149 302.717)"},fuchsia:{50:"oklch(97.7% 0.017 320.058)",100:"oklch(95.2% 0.037 318.852)",200:"oklch(90.3% 0.076 319.62)",300:"oklch(83.3% 0.145 321.434)",400:"oklch(74% 0.238 322.16)",500:"oklch(66.7% 0.295 322.15)",600:"oklch(59.1% 0.293 322.896)",700:"oklch(51.8% 0.253 323.949)",800:"oklch(45.2% 0.211 324.591)",900:"oklch(40.1% 0.17 325.612)",950:"oklch(29.3% 0.136 325.661)"},pink:{50:"oklch(97.1% 0.014 343.198)",100:"oklch(94.8% 0.028 342.258)",200:"oklch(89.9% 0.061 343.231)",300:"oklch(82.3% 0.12 346.018)",400:"oklch(71.8% 0.202 349.761)",500:"oklch(65.6% 0.241 354.308)",600:"oklch(59.2% 0.249 0.584)",700:"oklch(52.5% 0.223 3.958)",800:"oklch(45.9% 0.187 3.815)",900:"oklch(40.8% 0.153 2.432)",950:"oklch(28.4% 0.109 3.907)"},rose:{50:"oklch(96.9% 0.015 12.422)",100:"oklch(94.1% 0.03 12.58)",200:"oklch(89.2% 0.058 10.001)",300:"oklch(81% 0.117 11.638)",400:"oklch(71.2% 0.194 13.428)",500:"oklch(64.5% 0.246 16.439)",600:"oklch(58.6% 0.253 17.585)",700:"oklch(51.4% 0.222 16.935)",800:"oklch(45.5% 0.188 13.697)",900:"oklch(41% 0.159 10.272)",950:"oklch(27.1% 0.105 12.094)"},slate:{50:"oklch(98.4% 0.003 247.858)",100:"oklch(96.8% 0.007 247.896)",200:"oklch(92.9% 0.013 255.508)",300:"oklch(86.9% 0.022 252.894)",400:"oklch(70.4% 0.04 256.788)",500:"oklch(55.4% 0.046 257.417)",600:"oklch(44.6% 0.043 257.281)",700:"oklch(37.2% 0.044 257.287)",800:"oklch(27.9% 0.041 260.031)",900:"oklch(20.8% 0.042 265.755)",950:"oklch(12.9% 0.042 264.695)"},gray:{50:"oklch(98.5% 0.002 247.839)",100:"oklch(96.7% 0.003 264.542)",200:"oklch(92.8% 0.006 264.531)",300:"oklch(87.2% 0.01 258.338)",400:"oklch(70.7% 0.022 261.325)",500:"oklch(55.1% 0.027 264.364)",600:"oklch(44.6% 0.03 256.802)",700:"oklch(37.3% 0.034 259.733)",800:"oklch(27.8% 0.033 256.848)",900:"oklch(21% 0.034 264.665)",950:"oklch(13% 0.028 261.692)"},zinc:{50:"oklch(98.5% 0 0)",100:"oklch(96.7% 0.001 286.375)",200:"oklch(92% 0.004 286.32)",300:"oklch(87.1% 0.006 286.286)",400:"oklch(70.5% 0.015 286.067)",500:"oklch(55.2% 0.016 285.938)",600:"oklch(44.2% 0.017 285.786)",700:"oklch(37% 0.013 285.805)",800:"oklch(27.4% 0.006 286.033)",900:"oklch(21% 0.006 285.885)",950:"oklch(14.1% 0.005 285.823)"},neutral:{50:"oklch(98.5% 0 0)",100:"oklch(97% 0 0)",200:"oklch(92.2% 0 0)",300:"oklch(87% 0 0)",400:"oklch(70.8% 0 0)",500:"oklch(55.6% 0 0)",600:"oklch(43.9% 0 0)",700:"oklch(37.1% 0 0)",800:"oklch(26.9% 0 0)",900:"oklch(20.5% 0 0)",950:"oklch(14.5% 0 0)"},stone:{50:"oklch(98.5% 0.001 106.423)",100:"oklch(97% 0.001 106.424)",200:"oklch(92.3% 0.003 48.717)",300:"oklch(86.9% 0.005 56.366)",400:"oklch(70.9% 0.01 56.259)",500:"oklch(55.3% 0.013 58.071)",600:"oklch(44.4% 0.011 73.639)",700:"oklch(37.4% 0.01 67.558)",800:"oklch(26.8% 0.007 34.298)",900:"oklch(21.6% 0.006 56.043)",950:"oklch(14.7% 0.004 49.25)"},mauve:{50:"oklch(98.5% 0 0)",100:"oklch(96% 0.003 325.6)",200:"oklch(92.2% 0.005 325.62)",300:"oklch(86.5% 0.012 325.68)",400:"oklch(71.1% 0.019 323.02)",500:"oklch(54.2% 0.034 322.5)",600:"oklch(43.5% 0.029 321.78)",700:"oklch(36.4% 0.029 323.89)",800:"oklch(26.3% 0.024 320.12)",900:"oklch(21.2% 0.019 322.12)",950:"oklch(14.5% 0.008 326)"},olive:{50:"oklch(98.8% 0.003 106.5)",100:"oklch(96.6% 0.005 106.5)",200:"oklch(93% 0.007 106.5)",300:"oklch(88% 0.011 106.6)",400:"oklch(73.7% 0.021 106.9)",500:"oklch(58% 0.031 107.3)",600:"oklch(46.6% 0.025 107.3)",700:"oklch(39.4% 0.023 107.4)",800:"oklch(28.6% 0.016 107.4)",900:"oklch(22.8% 0.013 107.4)",950:"oklch(15.3% 0.006 107.1)"},mist:{50:"oklch(98.7% 0.002 197.1)",100:"oklch(96.3% 0.002 197.1)",200:"oklch(92.5% 0.005 214.3)",300:"oklch(87.2% 0.007 219.6)",400:"oklch(72.3% 0.014 214.4)",500:"oklch(56% 0.021 213.5)",600:"oklch(45% 0.017 213.2)",700:"oklch(37.8% 0.015 216)",800:"oklch(27.5% 0.011 216.9)",900:"oklch(21.8% 0.008 223.9)",950:"oklch(14.8% 0.004 228.8)"},taupe:{50:"oklch(98.6% 0.002 67.8)",100:"oklch(96% 0.002 17.2)",200:"oklch(92.2% 0.005 34.3)",300:"oklch(86.8% 0.007 39.5)",400:"oklch(71.4% 0.014 41.2)",500:"oklch(54.7% 0.021 43.1)",600:"oklch(43.8% 0.017 39.3)",700:"oklch(36.7% 0.016 35.7)",800:"oklch(26.8% 0.011 36.5)",900:"oklch(21.4% 0.009 43.1)",950:"oklch(14.7% 0.004 49.3)"}},qa={"220.9 39.3% 11%":"gray","210 20% 98%":"gray","12 76% 61%":"gray","220 70% 50%":"gray"},Wn=new Map;for(let e of Ya)for(let t of Ga)Wn.set(zn(Ka[e][t]),e);function Bn(e){let t=zn(e);return t?Wn.get(t)??qa[t]??null:null}function zn(e){if(!e)return "";let t=e.trim().replace(/\s+/g," ").toLowerCase();if(!t.startsWith("oklch(")||!t.endsWith(")"))return t;let r=t.slice(6,-1).trim(),[o]=r.split(/\s*\/\s*/),i=o.split(/\s+/);if(i.length<3)return t;let n=Ar(i[0],{percentage:true}),s=Ar(i[1]),c=Ar(i[2]);return `oklch(${n} ${s} ${c})`}function Ar(e,t={}){return t.percentage&&e.endsWith("%")?Un(Number.parseFloat(e)/100):Un(Number.parseFloat(e))}function Un(e){return Number.isNaN(e)?"":Number(e.toFixed(12)).toString()}var rc=new Set(c$3),oc=new Set(g$1),nc=new Set(k),ic=new Set(l),sc=new Set(h),ac=new Set(i),cc=new Set(d$2),lc=new Set(["eb-garamond","instrument-serif","lora","merriweather","playfair-display","noto-serif","roboto-slab"]),fc=new Set(["jetbrains-mono","geist-mono"]),dt=["--font-sans","--font-serif","--font-mono"],Kn=new Set(dt),pc=[...dt,"--font-heading"],qn=new Set(pc),Jn={appliedBodyVariable:null,variables:{}},mc={0:"none","0rem":"none","0.45rem":"small","0.625rem":"default","0.875rem":"large"};async function Xt(e,t){let r=dc(e.style);if(!r)return {code:null,fallbacks:[],values:null};let o=H[r],i=await uc(e.resolvedPaths.tailwindCss),n=Kt(rc,e.tailwind.baseColor),s=yc(i),c=wc(i),a=Kt(oc,e.iconLibrary),l=Hn(i,Jn),p$1=l??o.font,m=Gn(i,p$1,Jn);if(!l||!m){let $=t;if(t===void 0)try{$=await ra$1(e.resolvedPaths.cwd,{configCssFile:e.tailwind.css});}catch{$=null;}let S=await vc(e,$);l??=Hn(i,S),p$1=l??o.font,m??=Gn(i,p$1,S);}let u=kc(m??o.fontHeading,p$1,o.fontHeading),h=bc(i.rootVars["--radius"]),g=Kt(nc,e.menuAccent),y=Kt(ic,e.menuColor),b={style:r,baseColor:n??o.baseColor,theme:s??o.theme,chartColor:c??o.chartColor,iconLibrary:a??o.iconLibrary,font:p$1,fontHeading:u,radius:h??o.radius,menuAccent:g??o.menuAccent,menuColor:y??o.menuColor},k=[!n&&"baseColor",!s&&"theme",!c&&"chartColor",!a&&"iconLibrary",!l&&"font",!m&&"fontHeading",!h&&"radius",!g&&"menuAccent",!y&&"menuColor"].filter(Boolean);return {code:p(b),fallbacks:k,values:b}}async function uc(e){let t={darkVars:{},imports:[],rootVars:{},themeVars:{}};if(!e)return t;try{let r=await promises.readFile(e,"utf8");return gc(r)}catch{return t}}function dc(e){if(!e)return null;let t=e.replace(/^(base|radix)-/,"");return t in H?t:null}function gc(e){let t=I$1.parse(e),r={darkVars:{},imports:[],rootVars:{},themeVars:{}};return t.walkAtRules("import",o=>{let i=hc(o.params);i&&r.imports.push(i);}),t.walkRules(o=>{let i=o.selector.split(",").map(n=>n.trim()).filter(Boolean);i.includes(":root")&&Nr(o,r.rootVars),i.includes(".dark")&&Nr(o,r.darkVars);}),t.walkAtRules("theme",o=>{o.params.trim()==="inline"&&Nr(o,r.themeVars);}),r}function Nr(e,t){for(let r of e.nodes??[])r.type!=="decl"||!r.prop.startsWith("--")||(t[r.prop]=r.value.trim());}function hc(e){let t=e.trim();return (t.match(/^url\((['"]?)(.+?)\1\)$/)??t.match(/^(['"])(.+?)\1$/))?.[2]??null}function yc(e){let t=qt(e.rootVars["--primary"]);if(!t)return null;let r=e.darkVars["--primary"];return r?qt(r)===t?t:null:t}function wc(e){let t=qt(e.rootVars["--chart-1"]);if(!t)return null;let r=e.darkVars["--chart-1"];return r?qt(r)===t?t:null:t}function qt(e){let t=Bn(e);return !t||!cc.has(t)?null:t}function bc(e){if(!e)return null;let t=Zt(e);return mc[t]??null}function Hn(e,t){for(let r of dt){let o=Zn(e,r);if(o)return o}for(let r of dt){let o=Cc(e.imports,r);if(o)return o}return xc(t)}function Gn(e,t,r){let o=Tr(e,"--font-heading"),i=o?ei(o):null;if(i)return i===t?"inherit":i;let n=r.variables["--font-heading"],s=Xn(e,"--font-heading");if(!s)return n&&n!==t?n:null;let c=Or(s);if(c&&Kn.has(c)){let a=Zn(e,c),l=r.variables[c],p=a??l??null;return !p||p===t?"inherit":p}return c==="--font-heading"?n?n===t?"inherit":n:null:n&&n!==t?n:null}function kc(e,t,r){let o=e===t?"inherit":e;return ac.has(o)?o:r}function Tr(e,t,r=new Set){if(r.has(t))return null;r.add(t);let o=Xn(e,t);if(!o)return null;let i=Or(o);return i?qn.has(i)?Tr(e,i,r):null:o}function Xn(e,t){let r=e.themeVars[t];return r&&Or(r)!==t?r:e.rootVars[t]??r??null}function Or(e){return Zt(e).match(/^var\((--[a-z0-9-]+)\)$/)?.[1]??null}function Zn(e,t){let r=Tr(e,t),o=r?ei(r):null;return o||null}function Cc(e,t){let r=e.flatMap(o=>{let i=Fc(o);return i&&Nc(i)===t?[i]:[]});return r.length===1?r[0]:null}function xc(e){if(e.appliedBodyVariable&&e.variables[e.appliedBodyVariable])return e.variables[e.appliedBodyVariable]??null;let t=dt.map(r=>e.variables[r]).filter(Boolean).filter((r,o,i)=>i.indexOf(r)===o);return t.length===1?t[0]:null}async function vc(e,t){let r={appliedBodyVariable:null,variables:{}};if(!t||t.framework.name!=="next-app"&&t.framework.name!=="next-pages")return r;let o=Rc(e,t);if(!o)return r;try{let i=await promises.readFile(o,"utf8");return Sc(i,t.framework.name)}catch{return r}}function Rc(e,t){let r=t.isTsx?"tsx":"jsx",o=t.framework.name==="next-app"?t.isSrcDir?[`src/app/layout.${r}`,`app/layout.${r}`]:[`app/layout.${r}`]:t.isSrcDir?[`src/pages/_app.${r}`,`pages/_app.${r}`]:[`pages/_app.${r}`];for(let i of o){let n=se__default.join(e.resolvedPaths.cwd,i);if(existsSync(n))return n}return null}function Sc(e,t){let o=new Project({compilerOptions:{}}).createSourceFile("font-source.tsx",e,{overwrite:true,scriptKind:ScriptKind.TSX}),i=new Map;for(let c of o.getImportDeclarations())if(c.getModuleSpecifierValue()==="next/font/google")for(let a of c.getNamedImports()){let l=a.getName(),p=a.getAliasNode()?.getText()??l,m=Ac(l);m&&i.set(p,m);}let n={},s=new Map;for(let c of o.getVariableStatements())for(let a of c.getDeclarations()){let l=a.getInitializer();if(!l?.isKind(SyntaxKind.CallExpression))continue;let p=i.get(l.getExpression().getText());if(!p)continue;let m=Pc(l);m&&(s.set(a.getName(),m),n[m]=p);}return {appliedBodyVariable:$c(o,s,t),variables:n}}function Pc(e){let t=e.getArguments()[0];if(!t||!Node.isObjectLiteralExpression(t))return null;let r=t.getProperty("variable");if(!r||!Node.isPropertyAssignment(r))return null;let o=r.getInitializer();if(!o)return null;let i=Qn(o.getText());return qn.has(i)?i:null}function $c(e,t,r){let o=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement).filter(n=>r==="next-app"?n.getTagNameNode().getText()==="html":true),i=new Set;for(let n of o){let s=n.getAttribute("className");if(!s||!Node.isJsxAttribute(s))continue;let c=s.getInitializer();if(!c)continue;let a=Ic(c,t),l=Ec(c);if(l&&a.includes(l))return l;a.length===1&&i.add(a[0]);}return i.size===1?Array.from(i)[0]:null}function Ic(e,t){let r=Node.isJsxExpression(e)?[e.getExpression(),...e.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression)].filter(Boolean):[],o=new Set;for(let i of r){if(!i||!Node.isPropertyAccessExpression(i)||i.getName()!=="variable")continue;let n=i.getExpression().getText(),s=t.get(n);s&&Kn.has(s)&&o.add(s);}return Array.from(o)}function Ec(e){let t=jc(e);return /\bfont-sans\b/.test(t)?"--font-sans":/\bfont-serif\b/.test(t)?"--font-serif":/\bfont-mono\b/.test(t)?"--font-mono":null}function jc(e){let t=[];(Node.isStringLiteral(e)||Node.isNoSubstitutionTemplateLiteral(e))&&t.push(e.getLiteralValue());for(let r of e.getDescendantsOfKind(SyntaxKind.StringLiteral))t.push(r.getLiteralValue());for(let r of e.getDescendantsOfKind(SyntaxKind.NoSubstitutionTemplateLiteral))t.push(r.getLiteralValue());return t.length>0?t.join(" "):e.getText()}function Qn(e){return e.replace(/^['"]|['"]$/g,"")}function ei(e){if(!e)return null;let t=Qn(e.split(",")[0]?.trim()??"").replace(/\s+variable$/i,"").trim();return t?_r(t.replace(/\s+/g,"-")):null}function Fc(e){if(!e)return null;let t=Zt(e),r="@fontsource-variable/";return t.startsWith(r)?_r(t.slice(r.length)):null}function Ac(e){return e?_r(e.replace(/_/g,"-")):null}function _r(e){let t=Zt(e);return sc.has(t)?t:null}function Nc(e){return fc.has(e)?"--font-mono":lc.has(e)?"--font-serif":"--font-sans"}function Zt(e){return e?e.trim().replace(/\s+/g," ").replace(/\s*,\s*/g,", ").replace(/"/g,"'").toLowerCase():""}function Kt(e,t){return t&&e.has(t)?t:null}var ri=`${c$1}/code/apps/v4/registry/bases`,oi=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=se__default.resolve(e.cwd);if(!existsSync(se__default.resolve(t,"components.json"))&&await U(t)){let c=await W(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)):B("info",c),process.exit(1));}let r=await ra$1(t),o=await N(t),i=await ua$1(t),n=S(o?.style),s=await Lc(r,o,i,n);if(e.json){console.log(JSON.stringify(s,null,2));return}Vc(s);}catch(t){$(t);}});function _c(e){if(!e)return {};let t={};for(let[r,o]of Object.entries(e))t[r]=typeof o=="string"?o:o.url;return t}async function Lc(e,t,r,o){let i=t?await Xt(t,e):null;return {project:e?{framework:e.framework.label,frameworkName:e.framework.name,frameworkVersion:e.frameworkVersion??null,srcDirectory:e.isSrcDir,rsc:e.isRSC,typescript:e.isTsx,tailwindVersion:e.tailwindVersion??null,tailwindConfig:e.tailwindConfigFile??null,tailwindCss:e.tailwindCssFile??null,importAlias:e.aliasPrefix??null}:null,config:t?{style:t.style,base:o,rsc:t.rsc,typescript:t.tsx,iconLibrary:t.iconLibrary??null,rtl:t.rtl??false,menuColor:t.menuColor??null,menuAccent:t.menuAccent??null,aliases:{components:t.aliases.components,utils:t.aliases.utils,ui:t.aliases.ui??null,lib:t.aliases.lib??null,hooks:t.aliases.hooks??null},resolvedPaths:{cwd:t.resolvedPaths.cwd,tailwindConfig:t.resolvedPaths.tailwindConfig||null,tailwindCss:t.resolvedPaths.tailwindCss||null,utils:t.resolvedPaths.utils,components:t.resolvedPaths.components,lib:t.resolvedPaths.lib,hooks:t.resolvedPaths.hooks,ui:t.resolvedPaths.ui},registries:_c(t.registries)}:null,preset:i,components:r,links:{docs:`${c$1}/docs`,components:`${c$1}/docs/components/${o}/[component].md`,ui:`${ri}/${o}/ui/[component].tsx`,examples:`${ri}/${o}/examples/[component]-example.tsx`,schema:`${c$1}/schema.json`}}}function Vc(e){b.log(a.info("Project")),e.project?ke({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?(ke({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(),Qt(e.preset),b.break(),b.log(a.info("Aliases")),ke({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")),ke({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:"),ke(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")),ke(e.links),b.break();}function Qt(e,t={}){if(b.log(a.info("Preset")),!e?.code)ke({code:"-"});else {let r=e.fallbacks??[],o=(i,n)=>{let s=r.includes(i)?"*":"";return `${n??"-"}${s}`};ke({code:e.code,version:e.code[0],style:e.values?.style??"-",baseColor:o("baseColor",e.values?.baseColor),theme:o("theme",e.values?.theme),chartColor:o("chartColor",e.values?.chartColor),iconLibrary:o("iconLibrary",e.values?.iconLibrary),font:o("font",e.values?.font),fontHeading:o("fontHeading",e.values?.fontHeading),radius:o("radius",e.values?.radius),menuAccent:o("menuAccent",e.values?.menuAccent),menuColor:o("menuColor",e.values?.menuColor),url:`${c$1}/create?preset=${e.code}`}),r.length>0&&(b.log(""),b.log(t.fallbackNote??" * Uses preset defaults for values not available as options on shadcn/create."));}}function ke(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,o]of Object.entries(e))b.log(` ${r.padEnd(t+2)}${o}`);}var Te="latest",tr=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Te}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Te}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${Te}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
157
157
  command = "npx"
158
- args = ["shadcn@${Oe}", "mcp"]
159
- `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${Oe}`,"mcp"],enabled:true}}}}],Mt=[`shadcn@${Oe}`],wr=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);}}),la=yr.object({client:yr.enum(["claude","cursor","vscode","codex","opencode"]),cwd:yr.string()});wr.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Wt.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 we({type:"select",name:"client",message:"Which MCP client are you using?",choices:Wt.map(p=>({title:p.label,value:p.name}))});f.client||(b.break(),process.exit(1)),i=f.client;}let o=la.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]
158
+ args = ["shadcn@${Te}", "mcp"]
159
+ `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${Te}`,"mcp"],enabled:true}}}}],er=[`shadcn@${Te}`],Vr=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 K(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){b.break(),$(t);}}),zc=Lr.object({client:Lr.enum(["claude","cursor","vscode","codex","opencode"]),cwd:Lr.string()});Vr.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${tr.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let o=(t.parent?.opts()||{}).cwd||process.cwd(),i=e.client;if(!i){let l=await we({type:"select",name:"client",message:"Which MCP client are you using?",choices:tr.map(p=>({title:p.label,value:p.name}))});l.client||(b.break(),process.exit(1)),i=l.client;}let n=zc.parse({client:i,cwd:o}),s=await N(n.cwd);if(n.client==="codex"){if(s)await _([],er,s,{silent:!1});else {let l=await a$2(n.cwd),p=l==="npm"?"install":"add",m=l==="npm"?"--save-dev":"-D",u=w("Installing dependencies...").start();await execa(l,[p,m,...er],{cwd:n.cwd}),u.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]
160
160
  command = "npx"
161
- args = ["shadcn@${Oe}", "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 pa(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 fa=(e,t)=>t;async function pa(e){let{client:t,cwd:r}=e,n=Wt.find(a=>a.name===t);if(!n)throw new Error(`Unknown client: ${t}. Available clients: ${Wt.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=bn(s,n.config,{arrayMerge:fa});return await promises.writeFile(i,JSON.stringify(c,null,2)+`
162
- `,"utf-8"),n.configPath}var xe={lucide:{name:"lucide-react",package:"lucide-react",import:"lucide-react"},radix:{name:"@radix-ui/react-icons",package:"@radix-ui/react-icons",import:"@radix-ui/react-icons"}};async function wo(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([xr("**/*.{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(xe).map(([p,m])=>({title:m.name,value:p})),o=await we([{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 xe&&o.targetLibrary in xe))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=xe[o.sourceLibrary],c=xe[o.targetLibrary],{confirm:a$1}=await we({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 wa(d,o.sourceLibrary,o.targetLibrary,n);await promises.writeFile(m,h);})),f.succeed("Migration complete.");}async function wa(e,t,r,n){let i=xe[t]?.import,o=xe[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 xa(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Ca(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 bo(e,t={}){let r,n;if(t.path){if(n=e.resolvedPaths.cwd,t.path.includes("*"))r=await xr(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 xr("**/*.{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 xr("**/*.{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 we({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 va(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)+`
163
- `),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 va(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,k,v]=a;if(k==="icons"||k.startsWith("icons/"))continue;n.push(g),n.length===1&&(o=j,s=v===";"),i.push(`@radix-ui/react-${k}`);let R=!!w;if(C){let L=xa(k);r.push({name:L,alias:C,isType:R});}else b&&Ca(b,R,r,k);}if(r.length===0)return {content:e,replacedPackages:[]};let f=r.filter((g,w,C)=>w===C.findIndex(b=>b.name===g.name&&b.alias===g.alias&&b.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,C)=>g.replace(w,C===0?m:""),c),c=c.replace(/\n\s*\n\s*\n/g,`
164
-
165
- `),f.some(g=>g.name==="Slot"&&g.alias==="SlotPrimitive")&&(c=c.split(`
166
- `).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,k,v)=>{let R=v.substring(0,k),L=(R.match(/"/g)||[]).length,K=(R.match(/'/g)||[]).length;return L%2!==0||K%2!==0?j:"__SLOT_PLACEHOLDER__"}),b=b.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),b}).join(`
167
- `));let h=Array.from(new Set(i));return {content:c,replacedPackages:h}}var Sa=["sidebar.tsx","pagination.tsx","calendar.tsx"],ka=`${c$1}/docs/rtl#manual-migration-optional`;async function xo(e,t={}){let r,n;if(t.path){if(n=e.resolvedPaths.cwd,t.path.includes("*"))r=await xr(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 xr("**/*.{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 xr("**/*.{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 we({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)+`
168
- `),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);Sa.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(ka)} for more information.`);}}async function vo(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)}.
169
- 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 Ro=[{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)."}],Pa=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),migration:z$1.string().refine(e=>e&&Ro.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()}),So=new Command().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").argument("[path]","optional path or glob pattern to migrate.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-l, --list","list all migrations.",false).option("-y, --yes","skip confirmation prompt.",false).action(async(e,t,r)=>{try{let n=Pa.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 Ro)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 vo(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 wo(o),n.migration==="radix"&&await bo(o,{yes:n.yes,path:n.path}),n.migration==="rtl"&&await xo(o,{yes:n.yes,path:n.path});}catch(n){b.break(),$(n);}});var Fa=z$1.object({cwd:z$1.string(),silent:z$1.boolean()}),$o=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=Fa.parse({cwd:ie__default.resolve(t.cwd),silent:t.silent}),n=e.length>0?e:await Na({silent:r.silent});await Aa(n,r.cwd,{silent:r.silent});}catch(r){b.break(),$(r);}});function Oa(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 kr(e,t,r){return `${e} ${e===1?t:r}`}async function Aa(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(Oa),o=i.filter(g=>!g.url),s=[];if(o.length>0){let g=w("Fetching registries.",{silent:r.silent}).start(),w$1=await ma();if(!w$1)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),s=w$1;}let c={};for(let{namespace:g,url:w}of i){if(g in d){b.warn(`${a.info(g)} is a built-in registry and cannot be added.`);continue}if(w){if(!w.includes("{name}"))throw new Error(`Invalid registry URL for ${a.info(g)}. URL must include {name} placeholder. Example: ${a.info(`${g}=https://example.com/r/{name}.json`)}`);c[g]=w;}else {let 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),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 ${kr(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 ${kr(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let w of g)b.log(` - ${w}`);if(m.length>0){w(`Skipped ${kr(m.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let w of m)b.log(` - ${w}`);}}}async function Na(e){let t=w("Fetching registries.",{silent:e.silent}).start(),r=await ma();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let n=[...r].sort((o,s)=>o.name.localeCompare(s.name)),{selected:i}=await we({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 Io=new Command().name("registry").description("manage registries").addCommand($o);var La=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),Eo=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=La.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$1(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$1({...n,...m});}let s=i;try{let p=await N(r.cwd);p&&(s=U$1(p));}catch{}let{config:c$1,newRegistries:a}=await U(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$1(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 Va=z$1.object({cwd:z$1.string()}),No=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=Va.parse({cwd:ie__default.resolve(t.cwd)});await Y(r.cwd);let n=U$1({}),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$1(p);}let o=n;try{let f=await N(r.cwd);f&&(o=U$1(f));}catch{}let{config:s,newRegistries:c$1}=await U(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 To={version:"4.5.0"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Wa(){let e=new Command().name("shadcn").description("build your component library").version(To.version,"-v, --version","display the version number");e.addCommand(Nn).addCommand(to).addCommand(Yn).addCommand(co).addCommand(lo).addCommand(No).addCommand(Eo).addCommand(So).addCommand(mo).addCommand(so).addCommand(wr).addCommand(Io),e.parse();}Wa();
161
+ args = ["shadcn@${Te}", "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 Hc(n);if(c.succeed("Configuring MCP server."),s)await _([],er,s,{silent:!1});else {let l=await a$2(n.cwd),p=l==="npm"?"install":"add",m=l==="npm"?"--save-dev":"-D",u=w("Installing dependencies...").start();await execa(l,[p,m,...er],{cwd:n.cwd}),u.succeed("Installing dependencies.");}b.break(),b.success(`Configuration saved to ${a$1}.`),b.break();}catch(r){$(r);}});var Jc=(e,t)=>t;async function Hc(e){let{client:t,cwd:r}=e,o=tr.find(a=>a.name===t);if(!o)throw new Error(`Unknown client: ${t}. Available clients: ${tr.map(a=>a.name).join(", ")}`);let i=se__default.join(r,o.configPath),n=se__default.dirname(i);await O.ensureDir(n);let s={};try{let a=await promises.readFile(i,"utf-8");s=JSON.parse(a);}catch{}let c=qo(s,o.config,{arrayMerge:Jc});return await promises.writeFile(i,JSON.stringify(c,null,2)+`
162
+ `,"utf-8"),o.configPath}var Ce={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 ci(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t=e.resolvedPaths.ui,[r,o]=await Promise.all([Mr("**/*.{js,ts,jsx,tsx}",{cwd:t}),ga$1()]);if(Object.keys(o).length===0)throw new Error("Something went wrong fetching the registry icons.");let i=Object.entries(Ce).map(([p,m])=>({title:m.name,value:p})),n=await we([{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(n.sourceLibrary===n.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(n.sourceLibrary in Ce&&n.targetLibrary in Ce))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=Ce[n.sourceLibrary],c=Ce[n.targetLibrary],{confirm:a$1}=await we({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} files in ${a.info(`./${se__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 _([c.package],[],e,{silent:false});let l=w("Migrating icons...")?.start();await Promise.all(r.map(async p=>{l.text=`Migrating ${p}...`;let m=se__default.join(t,p),u=await promises.readFile(m,"utf-8"),h=await Qc(u,n.sourceLibrary,n.targetLibrary,o);await promises.writeFile(m,h);})),l.succeed("Migration complete.");}async function Qc(e,t,r,o){let i=Ce[t]?.import,n=Ce[r]?.import,s=await promises.mkdtemp(se__default.join(tmpdir(),"shadcn-")),c=new Project({compilerOptions:{}}),a=se__default.join(s,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),l=c.createSourceFile(a,e,{scriptKind:ScriptKind.TSX}),p=[];for(let m of l.getImportDeclarations()??[])if(m.getModuleSpecifier()?.getText()===`"${i}"`){for(let u of m.getNamedImports()??[]){let h=u.getName(),g=Object.values(o).find(y=>y[t]===h)?.[r];!g||p.includes(g)||(p.push(g),u.remove(),l.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(y=>y.getTagNameNode()?.getText()===h).forEach(y=>y.getTagNameNode()?.replaceWithText(g)));}m.getNamedImports()?.length===0&&m.remove();}return p.length>0&&l.addImportDeclaration({moduleSpecifier:n,namedImports:p.map(m=>({name:m}))}),await l.getText()}function tl(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function rl(e,t,r,o){let n=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of n){let c=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),a=s.match(/^(\w+)\s+as\s+(\w+)$/);if(c){let l=c[1],p=c[2];o==="slot"&&l==="Slot"&&!p?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:l,alias:p,isType:true});}else if(a){let l=a[1],p=a[2];o==="slot"&&l==="Slot"&&p==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:l,alias:p,isType:t});}else o==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t});}}async function li(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await Mr(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else {let a=se__default.resolve(o,t.path),l=await promises.stat(a).catch(()=>null);if(!l)throw new Error(`File not found: ${t.path}`);if(l.isDirectory())o=a,r=await Mr("**/*.{js,ts,jsx,tsx}",{cwd:o,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("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");o=e.resolvedPaths.ui,r=await Mr("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true});}if(!t.yes){let c=t.path?t.path:`./${se__default.relative(e.resolvedPaths.cwd,o)}`,{confirm:a$1}=await we({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(),n=new Set;await Promise.all(r.map(async c=>{i.text=`Migrating ${c}...`;let a=se__default.join(o,c),l=await promises.readFile(a,"utf-8"),{content:p,replacedPackages:m}=await ol(l);m.forEach(u=>n.add(u)),await promises.writeFile(a,p);})),i.succeed("Migrating imports.");let s=w("Updating package.json...")?.start();try{let c=qa$1(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(n);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=se__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(p,JSON.stringify(c,null,2)+`
163
+ `),s.succeed("Updated package.json."),await _(["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 ol(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],o=[],i=[],n='"',s=false,c=e,a;for(;(a=t.exec(e))!==null;){let[g,y,b,k,$,S,x]=a;if(S==="icons"||S.startsWith("icons/"))continue;o.push(g),o.length===1&&(n=$,s=x===";"),i.push(`@radix-ui/react-${S}`);let R=!!y;if(b){let L=tl(S);r.push({name:L,alias:b,isType:R});}else k&&rl(k,R,r,S);}if(r.length===0)return {content:e,replacedPackages:[]};let l=r.filter((g,y,b)=>y===b.findIndex(k=>k.name===g.name&&k.alias===g.alias&&k.isType===g.isType)),m=`import { ${l.map(g=>{let y=g.isType?"type ":"";return g.alias?`${y}${g.name} as ${g.alias}`:`${y}${g.name}`}).join(", ")} } from ${n}radix-ui${n}${s?";":""}`;c=o.reduce((g,y,b)=>g.replace(y,b===0?m:""),c),c=c.replace(/\n\s*\n\s*\n/g,`
164
+
165
+ `),l.some(g=>g.name==="Slot"&&g.alias==="SlotPrimitive")&&(c=c.split(`
166
+ `).map(b=>{if(b.trim().startsWith("import "))return b;let k=b;return k=k.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),k=k.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),k=k.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),k=k.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),k=k.replace(/\bSlot\b/g,($,S,x)=>{let R=x.substring(0,S),L=(R.match(/"/g)||[]).length,q=(R.match(/'/g)||[]).length;return L%2!==0||q%2!==0?$:"__SLOT_PLACEHOLDER__"}),k=k.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),k}).join(`
167
+ `));let h=Array.from(new Set(i));return {content:c,replacedPackages:h}}var il=["sidebar.tsx","pagination.tsx","calendar.tsx"],sl=`${c$1}/docs/rtl#manual-migration-optional`;async function fi(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await Mr(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else {let l=se__default.resolve(o,t.path),p=await promises.stat(l).catch(()=>null);if(!p)throw new Error(`File not found: ${t.path}`);if(p.isDirectory())o=l,r=await Mr("**/*.{js,ts,jsx,tsx}",{cwd:o,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.");o=e.resolvedPaths.ui,r=await Mr("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true});}if(!t.yes){let a$1=t.path?t.path:`./${se__default.relative(e.resolvedPaths.cwd,o)}`,{confirm:l}=await we({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} file(s) in ${a.info(a$1)} to RTL. Continue?`});l||(b.info("Migration cancelled."),process.exit(0));}let i=w("Updating components.json...").start();try{let a=se__default.resolve(e.resolvedPaths.cwd,"components.json"),l=JSON.parse(await promises.readFile(a,"utf-8"));l.rtl=!0,await promises.writeFile(a,JSON.stringify(l,null,2)+`
168
+ `),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 n=w("Migrating files to RTL...").start(),s=0,c=[];if(await Promise.all(r.map(async a=>{n.text=`Migrating ${a}...`;let l=se__default.join(o,a),p=await promises.readFile(l,"utf-8"),m=await e$1(p,true);m!==p&&(await promises.writeFile(l,m),s++);let u=se__default.basename(a);il.includes(u)&&c.push(a);})),n.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(sl)} for more information.`);}}async function mi(e){let t={};if(!O.existsSync(e.cwd)||!O.existsSync(se__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!O.existsSync(se__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)}.
169
+ 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 ui=[{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)."}],ll=z.object({cwd:z.string(),list:z.boolean(),yes:z.boolean(),migration:z.string().refine(e=>e&&ui.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional(),path:z.string().optional()}),di=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 o=ll.parse({cwd:se__default.resolve(r.cwd),migration:e,path:t,list:r.list,yes:r.yes});if(o.list||!o.migration){b.info("Available migrations:");for(let s of ui)b.info(`- ${s.name}: ${s.description}`);return}if(!o.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:i,config:n}=await mi(o);if(i["1"]||i["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!n)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");o.migration==="icons"&&await ci(n),o.migration==="radix"&&await li(n,{yes:o.yes,path:o.path}),o.migration==="rtl"&&await fi(n,{yes:o.yes,path:o.path});}catch(o){b.break(),$(o);}});function ml(e){return `${c$1}/create?preset=${e}`}function Br(e){let t=q(e);if(!t)throw new Error(`Invalid preset code: ${e}`);let r=[],o=t.chartColor??f$1[t.theme]??t.theme;return t.chartColor||r.push("chartColor"),{code:e,version:e[0],values:{...t,chartColor:o},derived:r,url:ml(e)}}function ul(e){Qt({code:e.code,fallbacks:e.derived,values:e.values},{fallbackNote:" * Compatibility value for older preset versions."});}var dl=new Command().name("decode").description("decode a preset code").argument("<code>","the preset code to decode").option("--json","output as JSON.",false).action((e,t)=>{try{let r=Br(e);if(t.json){console.log(JSON.stringify({code:r.code,version:r.version,values:r.values,derived:r.derived,url:r.url},null,2));return}ul(r);}catch(r){ir(r);}}),gl=new Command().name("url").description("get the create URL for a preset code").argument("<code>","the preset code").action(e=>{try{b.log(Br(e).url);}catch(t){ir(t);}}),hl=new Command().name("open").description("open a preset code in the browser").argument("<code>","the preset code").action(async e=>{let t;try{t=Br(e).url;}catch(r){ir(r);return}b.break(),b.log(` Opening ${t} in your browser.`),b.break();try{await Ai(t);}catch(r){let o=r instanceof Error?r.message:String(r);ir(new Error(`Failed to open preset URL: ${o}`));}}),yl=new Command().name("resolve").alias("info").description("resolve a preset from your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",false).action(async e=>{try{let t=se__default.resolve(e.cwd);if(!existsSync(se__default.resolve(t,"components.json"))&&await U(t)){let n=await W(t);n.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running preset resolve from a monorepo root. Use the -c flag to specify a workspace.",targets:n.map(s=>s.name)},null,2)):B("preset resolve",n),process.exit(1));}let r=await N(t);if(!r){if(e.json){console.log(JSON.stringify(null,null,2));return}b.log("No components.json found.");return}let o=await ra$1(t),i=await Xt(r,o);if(e.json){console.log(JSON.stringify(i.code?i:null,null,2));return}Qt(i);}catch(t){$(t);}}),zr=new Command().name("preset").description("manage presets").addCommand(dl).addCommand(yl).addCommand(gl).addCommand(hl).action(()=>{zr.outputHelp();});function ir(e){e instanceof Error&&b.error(e.message),process.exit(1);}var kl=z.object({cwd:z.string(),silent:z.boolean()}),yi=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=kl.parse({cwd:se__default.resolve(t.cwd),silent:t.silent}),o=e.length>0?e:await vl({silent:r.silent});await xl(o,r.cwd,{silent:r.silent});}catch(r){b.break(),$(r);}});function Cl(e){let[t,...r]=e.split("="),o=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:o}}function Gr(e,t,r){return `${e} ${e===1?t:r}`}async function xl(e,t,r){let o=se__default.resolve(t,"components.json");if(!O.existsSync(o))throw new Error(`No ${a.info("components.json")} found. Run ${a.info("shadcn init")} first.`);let i=e.map(Cl),n=i.filter(g=>!g.url),s=[];if(n.length>0){let g=w("Fetching registries.",{silent:r.silent}).start(),y=await ma$1();if(!y)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),s=y;}let c={};for(let{namespace:g,url:y}of i){if(g in d){b.warn(`${a.info(g)} is a built-in registry and cannot be added.`);continue}if(y){if(!y.includes("{name}"))throw new Error(`Invalid registry URL for ${a.info(g)}. URL must include {name} placeholder. Example: ${a.info(`${g}=https://example.com/r/{name}.json`)}`);c[g]=y;}else {let b=s.find(k=>k.name===g);if(!b)throw new Error(`Registry ${a.info(g)} not found. Provide a URL: ${a.info(`${g}=https://.../{name}.json`)}`);c[g]=b.url;}}if(Object.keys(c).length===0)return {addedRegistries:[]};let a$1=await O.readJson(o),l=a$1.registries||{},p={},m=[];for(let[g,y]of Object.entries(c))l[g]?m.push(g):p[g]=y;if(Object.keys(p).length===0){if(m.length>0&&!r.silent){w(`Skipped ${Gr(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 u={...a$1,registries:{...l,...p}},h=w("Updating components.json.",{silent:r.silent}).start();if(await O.writeJson(o,u,{spaces:2}),h.succeed(),!r.silent){let g=Object.keys(p);w(`Added ${Gr(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let y of g)b.log(` - ${y}`);if(m.length>0){w(`Skipped ${Gr(m.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let y of m)b.log(` - ${y}`);}}}async function vl(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 o=[...r].sort((n,s)=>n.name.localeCompare(s.name)),{selected:i}=await we({type:"autocompleteMultiselect",name:"selected",message:"Which registries would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:o.map(n=>({title:n.name,description:n.description,value:n.name}))});return i?.length||(b.warn("No registries selected. Exiting."),b.info(""),process.exit(1)),i}var wi=new Command().name("registry").description("manage registries").addCommand(yi);var Pl=z.object({cwd:z.string(),query:z.string().optional(),limit:z.number().optional(),offset:z.number().optional()}),Ci=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=Pl.parse({cwd:se__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 K(r.cwd);let o=T({style:"new-york",resolvedPaths:{cwd:r.cwd}}),i=U$1(o),n=se__default.resolve(r.cwd,"components.json");if(O.existsSync(n)){let p=await O.readJson(n),m=c.partial().parse(p);i=U$1({...o,...m});}let s=i;try{let p=await N(r.cwd);p&&(s=U$1(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$1(e,s);let l=await va(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(l,null,2)),process.exit(0);}catch(r){$(r);}finally{V();}});var Il=z.object({cwd:z.string()}),Si=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=Il.parse({cwd:se__default.resolve(t.cwd)});await K(r.cwd);let o=U$1({}),i=se__default.resolve(r.cwd,"components.json");if(O.existsSync(i)){let l=await O.readJson(i),p=c.partial().parse(l);o=U$1(p);}let n=o;try{let l=await N(r.cwd);l&&(n=U$1(l));}catch{}let{config:s,newRegistries:c$1}=await M(e,n,{silent:!0,writeFile:!1});c$1.length>0&&(n.registries=s.registries),W$1(e,n);let a=await ba(e,{config:n});console.log(JSON.stringify(a,null,2)),process.exit(0);}catch(r){$(r);}finally{V();}});var Pi={version:"4.6.0"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Fl(){let e=new Command().name("shadcn").description("build your component library").version(Pi.version,"-v, --version","display the version number");e.addCommand(mn).addCommand(Fn).addCommand(Pn).addCommand(Vn).addCommand(Mn).addCommand(Si).addCommand(Ci).addCommand(di).addCommand(oi).addCommand(_n).addCommand(Vr).addCommand(zr).addCommand(wi),e.parse();}Fl();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shadcn",
3
- "version": "4.5.0",
3
+ "version": "4.6.0",
4
4
  "description": "Add components to your apps.",
5
5
  "publishConfig": {
6
6
  "access": "public"