shadcn 4.0.1 → 4.0.2

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