shadcn 4.2.0 → 4.2.1-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +428 -89
- package/package.json +20 -20
- package/LICENSE.md +0 -21
package/dist/index.js
CHANGED
|
@@ -1,50 +1,50 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {b as b$1,a as a$2}from'./chunk-C7EWIKNS.js';import {r,q}from'./chunk-F4TYWGJP.js';import {b,a,G as G$1,ra as ra$1,ua as ua$1,c as c$1,$,V,sa,N,O,w,d,P,M as M$1,fa as fa$1,ha as
|
|
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
|
|
4
|
-
Visit ${a.info(
|
|
5
|
-
Once configured, you can use the cli to add components.`),b.break(),process.exit(1);}
|
|
6
|
-
`,"utf-8"),
|
|
7
|
-
`)){let
|
|
8
|
-
`);}
|
|
9
|
-
`);}}}function
|
|
10
|
-
`);}i?.succeed(`Creating a new ${e} project.`);}catch(
|
|
11
|
-
|
|
12
|
-
`)),s}function
|
|
13
|
-
`,between:" "}}),t.append(r),t.insertBefore(r,
|
|
14
|
-
`}}),e.append(
|
|
15
|
-
`}}),r.append(s),r.insertBefore(s,
|
|
16
|
-
`}}),e.append(t),e.insertBefore(t,
|
|
17
|
-
`}});if(
|
|
18
|
-
`}});t.insertAfter(
|
|
19
|
-
`}});for(let[
|
|
2
|
+
import {b as b$1,a as a$2}from'./chunk-C7EWIKNS.js';import {r,q,c as c$3,g as g$1,k,l,h,i,d as d$2,p}from'./chunk-F4TYWGJP.js';import {b,a,G as G$1,ra as ra$1,ua as ua$1,c as c$1,$,V,sa as sa$1,N,O as O$1,w,d,P,M as M$1,fa as fa$1,ha,K as K$1,L,I,J as J$1,ta,T,ba,H as H$1,e,ea,S,ka,ia,la as la$1,B as B$1,x,y,A,z as z$2,ma,U,W,va as va$1,_ as _$1,X,na,ga,qa as qa$1,q as q$1,Z,k as k$1,R,Y as Y$1,Q,D,E,F,s,C,r as r$1,t,v,u}from'./chunk-BT5UJFAL.js';export{ka as fetchTree,la as getItemTargetPath,pa as getPreset,oa as getPresets,ma as getRegistries,da as getRegistriesConfig,na as getRegistriesIndex,aa as getRegistry,ia as getRegistryBaseColor,ha as getRegistryBaseColors,ga as getRegistryIcons,ba as getRegistryItems,fa as getRegistryStyles,ea as getShadcnRegistryIndex,ca as resolveRegistryItems,ja as resolveTree}from'./chunk-BT5UJFAL.js';import {c,o,n}from'./chunk-HW2MEAJZ.js';import {a as a$1,c as c$2,g,d as d$1,f,e as e$1}from'./chunk-WLJDV6SE.js';import {a as a$3}from'./chunk-CHWMSXYA.js';import*as ie from'path';import ie__default,{join}from'path';import {promises,existsSync}from'fs';import Ir from'fast-glob';import O from'fs-extra';import di from'open';import he from'prompts';import _o from'dedent';import hi,{tmpdir}from'os';import {execa}from'execa';import P$1 from'postcss';import Ri from'postcss/lib/at-rule';import Sr,{z as z$1}from'zod';import {twMerge}from'tailwind-merge';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind,Node}from'ts-morph';import Oo from'deepmerge';import {Command}from'commander';import {diffLines,structuredPatch,diffWords}from'diff';import {dim,yellow,bold,green,cyan,red}from'kleur/colors';import*as Fe from'fs/promises';import Fe__default from'fs/promises';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';var li=["next.config.*","vite.config.*","astro.config.*","remix.config.*","nuxt.config.*","svelte.config.*","gatsby-config.*","angular.json"];async function G(e){if(O.existsSync(ie__default.resolve(e,"pnpm-workspace.yaml")))return true;let t=ie__default.resolve(e,"package.json");if(O.existsSync(t))try{if((await O.readJson(t)).workspaces)return !0}catch{}return !!(O.existsSync(ie__default.resolve(e,"lerna.json"))||O.existsSync(ie__default.resolve(e,"nx.json")))}async function H(e){let t=await fi(e);if(!t.length)return [];let r=await Ir(t,{cwd:e,onlyDirectories:true,ignore:["**/node_modules/**"]}),o=[];for(let i of r){let n=ie__default.resolve(e,i);if(!O.existsSync(ie__default.resolve(n,"package.json")))continue;let s=O.existsSync(ie__default.resolve(n,"components.json")),c=li.some(a=>Ir.sync(a,{cwd:n,dot:true}).length>0);(s||c)&&o.push({name:i,hasConfig:s});}return o}function Y(e,t,r){let o=r?.cwdFlag??"-c";b.break(),b.log(`It looks like you are running ${a.info(e)} from a monorepo root.`),b.log(`To use shadcn in a specific workspace, use the ${a.info(o)} flag:`),b.break();for(let i of t)b.log(` shadcn ${e} ${o} ${i.name}`);b.break();}async function fi(e){let t=[],r=ie__default.resolve(e,"pnpm-workspace.yaml");if(O.existsSync(r)){let i=await O.readFile(r,"utf8"),n=Array.from(i.matchAll(/^\s*-\s*["']?([^"'\n#]+)["']?\s*$/gm));for(let s of n)t.push(s[1].trim());}let o=ie__default.resolve(e,"package.json");if(O.existsSync(o))try{let i=await O.readJson(o),n=Array.isArray(i.workspaces)?i.workspaces:i.workspaces?.packages;Array.isArray(n)&&t.push(...n.filter(s=>!s.startsWith("!")));}catch{}return Array.from(new Set(t))}async function bo(e){let t={};if(!O.existsSync(e.cwd)||!O.existsSync(ie__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=w("Preflight checks.",{silent:e.silent}).start();O.existsSync(ie__default.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),b.break(),b.error(`A ${a.info("components.json")} file already exists at ${a.info(e.cwd)}.
|
|
3
|
+
To start over, remove the ${a.info("components.json")} file and run ${a.info("init")} again.`),b.break(),process.exit(1)),r?.succeed();let o=w("Verifying framework.",{silent:e.silent}).start(),i=e.existingConfig?.tailwind,n=await ra$1(e.cwd,{configCssFile:typeof i?.css=="string"?i.css:void 0});if(!n||n?.framework.name==="manual"){if(t["7"]=true,o?.fail(),!e.monorepo&&await G(e.cwd)){let f=await H(e.cwd);f.length>0&&(Y("init",f),process.exit(1));}b.break(),n?.framework.links.installation&&b.error(`We could not detect a supported framework at ${a.info(e.cwd)}.
|
|
4
|
+
Visit ${a.info(n?.framework.links.installation)} to manually configure your project.
|
|
5
|
+
Once configured, you can use the cli to add components.`),b.break(),process.exit(1);}o?.succeed(`Verifying framework. Found ${a.info(n.framework.label)}.`);let s="Validating Tailwind CSS.";n.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${a.info("v4")}.`);let c=w(s,{silent:e.silent}).start();n.tailwindVersion==="v3"&&(!n?.tailwindConfigFile||!n?.tailwindCssFile)?(t["5"]=true,c?.fail()):n.tailwindVersion==="v4"&&!n?.tailwindCssFile?(t["5"]=true,c?.fail()):n.tailwindVersion?c?.succeed():(t["5"]=true,c?.fail());let a$1=w("Validating import alias.",{silent:e.silent}).start();return n?.aliasPrefix?a$1?.succeed():(t["6"]=true,a$1?.fail()),Object.keys(t).length>0&&(t["5"]&&(b.break(),b.error(`No Tailwind CSS configuration found at ${a.info(e.cwd)}.`),b.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),b.error("Install Tailwind CSS then try again."),n?.framework.links.tailwind&&b.error(`Visit ${a.info(n?.framework.links.tailwind)} to get started.`)),t["6"]&&(b.break(),b.error("No import alias found in your tsconfig.json file."),n?.framework.links.installation&&b.error(`Visit ${a.info(n?.framework.links.installation)} to learn how to set an import alias.`)),b.break(),process.exit(1)),{errors:t,projectInfo:n}}async function xo(e,t){let r=new Set,o=new Set,i=[...e];for(;i.length>0;){let n=i.shift();if(o.has(n))continue;o.add(n);let{registry:s}=q$1(n);s&&!d[s]&&r.add(s);try{let[c]=await Z([n],t,{useCache:!0});if(c?.registryDependencies)for(let a of c.registryDependencies){let{registry:f}=q$1(a);f&&!d[f]&&r.add(f),o.has(a)||i.push(a);}}catch(c){if(c instanceof k$1){let{registry:a}=q$1(n);a&&!d[a]&&r.add(a);continue}continue}}return Array.from(r)}async function M(e,t,r={}){r={silent:false,writeFile:true,...r};let i=(await xo(e,t)).filter(f=>!t.registries?.[f]&&!Object.keys(d).includes(f));if(i.length===0)return {config:t,newRegistries:[]};let n=await na({useCache:process.env.NODE_ENV!=="development"});if(!n)return {config:t,newRegistries:[]};let s={};for(let f of i)n[f]&&(s[f]=n[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(),u=c.parse(l);await O.writeFile(ie__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
|
|
6
|
+
`,"utf-8"),m.succeed();}return {config:a,newRegistries:Object.keys(s)}}var B={nova:{title:"Nova",description:"Lucide / Geist",style:"nova",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"geist",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},vega:{title:"Vega",description:"Lucide / Inter",style:"vega",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},maia:{title:"Maia",description:"Hugeicons / Figtree",style:"maia",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"figtree",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},lyra:{title:"Lyra",description:"Phosphor / JetBrains Mono",style:"lyra",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"phosphor",font:"jetbrains-mono",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},mira:{title:"Mira",description:"Hugeicons / Inter",style:"mira",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},luma:{title:"Luma",description:"Lucide / Inter",style:"luma",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false}};function ir(e){let t=new URL(`${c$1}/create`),{rtl:r,...o}=e??{};for(let[i,n]of Object.entries(o))n!==void 0&&t.searchParams.set(i,String(n));return r&&t.searchParams.set("rtl","true"),t.toString()}async function sr(e){if(b.break(),b.log(` Build your custom preset on ${a.info(e.createUrl)}`),b.log(` ${e.followUp}`),b.break(),e.prompt===false)return;let{proceed:t}=await he({type:"confirm",name:"proceed",message:"Open in browser?",initial:true});t&&await di(e.createUrl);}function fe(e,t){let r=new URLSearchParams({base:e.base,style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,font:e.font,rtl:String(e.rtl??false),menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return e.chartColor&&e.chartColor!=="neutral"&&r.set("chartColor",e.chartColor),e.fontHeading&&e.fontHeading!=="inherit"&&r.set("fontHeading",e.fontHeading),t?.preset&&r.set("preset",t.preset),t?.template&&r.set("template",t.template),r.set("track","1"),`${c$1}/init?${r.toString()}`}async function Le(){let{base:e}=await he({type:"select",name:"base",message:`Select a ${a.info("component library")}`,choices:[{title:"Radix",value:"radix"},{title:"Base",value:"base"}]});return e||process.exit(1),e}async function qe(e){let t=Object.entries(B),{selectedPreset:r}=await he({type:"select",name:"selectedPreset",message:`Which ${a.info("preset")} would you like to use?`,choices:[...t.map(([i,n])=>({title:n.title,description:n.description,value:i})),{title:"Custom",description:`Build your own at ${a.info(`${c$1}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let i=ir({command:"init",rtl:e.rtl,base:e.base,...e.template&&{template:e.template}});await sr({createUrl:i,followUp:`Then ${a.info("copy and run the command")} from ui.shadcn.com.`}),process.exit(0);}let o=B[r];return o||process.exit(1),{url:fe({...o,base:e.base,rtl:e.rtl},{template:e.template}),base:e.base}}async function ve(e,t,r){let o=U(T({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:i}=await M([e],o,{silent:true,writeFile:false});o=i,X(e,o);let[n]=await ba([e],{config:o,useCache:true}),s=n?.type==="registry:base"&&n.config?n.config:void 0,c=e;if(gi(e)){let a=new URL(e);a.searchParams.delete("track"),c=a.toString();}return {registryBaseConfig:s,installStyleIndex:n?.extends!=="none",url:c}}function gi(e){try{return new URL(e).pathname==="/init"&&e.startsWith(c$1)}catch{return false}}var yi=process.env.SHADCN_GITHUB_URL??"https://github.com/shadcn-ui/ui.git";function z(e){return {...e,frameworks:e.frameworks??[],scaffold:e.scaffold??vo({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??xi}}function Se(e,{monorepo:t}){if(!t||!e.monorepo)return e;let r=e.monorepo,o={...e,templateDir:r.templateDir,defaultProjectName:r.defaultProjectName??r.templateDir,init:r.init??e.init,files:r.files??e.files};return o.scaffold=vo({title:e.title,templateDir:r.templateDir}),o}function wi(e){switch(e){case "pnpm":return ["--no-frozen-lockfile"];default:return []}}async function ki(e,t){if(t==="pnpm")return;let r=ie__default.join(e,"pnpm-workspace.yaml"),o=ie__default.join(e,"package.json"),i=ie__default.join(e,"pnpm-lock.yaml");O.existsSync(i)&&await O.remove(i);let n=O.existsSync(r);if(O.existsSync(o)){let s=await O.readFile(o,"utf8"),c=JSON.parse(s);if(n?c.packageManager=await bi(t):delete c.packageManager,n){let a=await O.readFile(r,"utf8"),f=[];for(let l of a.split(`
|
|
7
|
+
`)){let m=l.match(/^\s*-\s*["']?(.+?)["']?\s*$/);m&&f.push(m[1]);}c.workspaces=f,await O.remove(r);}await O.writeFile(o,JSON.stringify(c,null,2)+`
|
|
8
|
+
`);}n&&t==="npm"&&await Co(e);}async function bi(e){try{let{stdout:t}=await execa(e,["--version"]);return `${e}@${t.trim()}`}catch{return `${e}@*`}}async function Co(e){let t=await O.readdir(e,{withFileTypes:true});for(let r of t){if(r.name==="node_modules")continue;let o=ie__default.join(e,r.name);if(r.isDirectory())await Co(o);else if(r.name==="package.json"){let i=await O.readFile(o,"utf8");if(!i.includes("workspace:"))continue;let n=JSON.parse(i),s=false;for(let c of ["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let a=n[c];if(a)for(let[f,l]of Object.entries(a))typeof l=="string"&&l.startsWith("workspace:")&&(a[f]="*",s=true);}s&&await O.writeFile(o,JSON.stringify(n,null,2)+`
|
|
9
|
+
`);}}}function vo({title:e,templateDir:t}){return async({projectPath:r,packageManager:o})=>{let i=w(`Creating a new ${e} project. This may take a few minutes.`).start();try{let n=process.env.SHADCN_TEMPLATE_DIR;if(n){let f=ie__default.resolve(n,t);await O.copy(f,r,{filter:l=>!l.includes("node_modules")});}else {let f=ie__default.join(hi.tmpdir(),`shadcn-template-${Date.now()}`);await execa("git",["clone","--depth","1","--filter=blob:none","--sparse",yi,f]),await execa("git",["-C",f,"sparse-checkout","set",`templates/${t}`]);let l=ie__default.resolve(f,"templates",t);await O.move(l,r),await O.remove(f);}await ki(r,o);let c=["install",...wi(o)];await execa(o,c,{cwd:r});let a=ie__default.join(r,"package.json");if(O.existsSync(a)){let f=await O.readFile(a,"utf8"),l=JSON.parse(f);l.name=ie__default.basename(r),await O.writeFile(a,JSON.stringify(l,null,2)+`
|
|
10
|
+
`);}i?.succeed(`Creating a new ${e} project.`);}catch(n){i?.fail(`Something went wrong creating a new ${e} project.`),$(n);}}}async function xi({projectPath:e}){try{await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","feat: initial commit"],{cwd:e});}catch{}}var Ro={"--font-heading":"cn-font-heading"};function Ci(e){return e.startsWith("--")?e:`--${e}`}function Pe(e){let t=new Set;for(let r of e){for(let o of r.fonts??[]){let i=o.font?.variable;if(!i)continue;let n=Ro[i];n&&t.add(n);}for(let o of Object.values(r.cssVars??{}))for(let i of Object.keys(o??{})){let n=Ro[Ci(i)];n&&t.add(n);}}return Array.from(t)}function So(e,t){if(e.includes("\0"))return false;let r;try{r=e;let u="";for(;r!==u&&r.includes("%");)u=r,r=decodeURIComponent(r);}catch{return false}let o=ie__default.normalize(r.replace(/\\/g,"/")),i=ie__default.normalize(t),n=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(n(o)||n(r)||n(e))return false;let s=u=>u.replace(/\[\.\.\..*?\]/g,""),c=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(c)||u.test(a))||(e.includes("~")||r.includes("~"))&&(e.includes("../")||r.includes("../")))return false;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(t.toLowerCase()):false;if(ie__default.isAbsolute(o))return o.startsWith(i+ie__default.sep);let m=ie__default.resolve(i,o);return m.startsWith(i+ie__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 o=t.resolvedPaths.tailwindCss,i=ie__default.relative(t.resolvedPaths.cwd,o),n=w(`Updating CSS variables in ${a.info(i)}`,{silent:r.silent}).start(),s=await promises.readFile(o,"utf8"),c=await Xe(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars});await promises.writeFile(o,c,"utf8"),n.succeed();}async function Xe(e,t,r,o={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false}){o={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,...o};let i=[Si(t)];o.cleanupDefaultNextStyles&&i.push(Io()),o.tailwindVersion==="v4"&&(i=[],i.push(Ei({params:"dark (&:is(.dark *))"})),o.cleanupDefaultNextStyles&&i.push(Io()),i.push($i(t,{overwriteCssVars:o.overwriteCssVars})),i.push(Ii(t)),o.tailwindConfig&&(i.push(Fi(o.tailwindConfig)),i.push(Ti(o.tailwindConfig)),i.push(ji(o.tailwindConfig))));let s=(await P$1(i).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),o.tailwindVersion==="v4"&&(s=s.replace(/(\n\s*\n)+/g,`
|
|
11
|
+
|
|
12
|
+
`)),s}function Si(e){return {postcssPlugin:"update-css-vars",Once(t){let r=t.nodes.find(o=>o.type==="atrule"&&o.name==="layer"&&o.params==="base");r instanceof Ri||(r=P$1.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:`
|
|
13
|
+
`,between:" "}}),t.append(r),t.insertBefore(r,P$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([o,i])=>{let n=o==="light"?":root":`.${o}`;Pi(r,n,i);});}}}function $o(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector===":root");if(t){let r=["--background","--foreground"];t.nodes.filter(o=>o.type==="decl"&&r.includes(o.prop)).forEach(o=>o.remove()),t.nodes.length===0&&t.remove();}}function Io(){return {postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(o=>o.type==="rule"&&o.selector==="body");t&&(t.nodes.find(o=>o.type==="decl"&&o.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(o.value))?.remove(),t.nodes.find(o=>o.type==="decl"&&o.prop==="background"&&(o.value.startsWith("linear-gradient")||o.value==="var(--background)"))?.remove(),t.nodes.find(o=>o.type==="decl"&&o.prop==="font-family"&&o.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),$o(e);let r=e.nodes.find(o=>o.type==="atrule"&&o.params==="(prefers-color-scheme: dark)");r&&($o(r),r.nodes.length===0&&r.remove());}}}function Pi(e,t,r){let o=e.nodes?.find(i=>i.type==="rule"&&i.selector===t);o||Object.keys(r).length>0&&(o=P$1.rule({selector:t,raws:{between:" ",before:`
|
|
14
|
+
`}}),e.append(o)),Object.entries(r).forEach(([i,n])=>{let s=`--${i.replace(/^--/,"")}`,c=P$1.decl({prop:s,value:n,raws:{semicolon:true}}),a=o?.nodes.find(f=>f.type==="decl"&&f.prop===s);a?a.replaceWith(c):o?.append(c);});}function $i(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([o,i])=>{let n=o==="light"?":root":`.${o}`;if(o==="theme"){n="@theme";let c=jt(r);Object.entries(i).forEach(([a,f])=>{let l=`--${a.replace(/^--/,"")}`,m=P$1.decl({prop:l,value:f,raws:{semicolon:true}}),u=c?.nodes?.find(h=>h.type==="decl"&&h.prop===l);t.overwriteCssVars?u?u.replaceWith(m):c?.append(m):u||c?.append(m);});return}let s=r.nodes?.find(c=>c.type==="rule"&&c.selector===n);!s&&Object.keys(i).length>0&&(s=P$1.rule({selector:n,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
15
|
+
`}}),r.append(s),r.insertBefore(s,P$1.comment({text:"---break---"}))),Object.entries(i).forEach(([c,a])=>{let f=`--${c.replace(/^--/,"")}`;f==="--sidebar-background"&&(f="--sidebar"),Eo(a)&&(a=`hsl(${a})`);let l=P$1.decl({prop:f,value:a,raws:{semicolon:true}}),m=s?.nodes.find(u=>u.type==="decl"&&u.prop===f);t.overwriteCssVars?m?m.replaceWith(l):s?.append(l):m||s?.append(l);});});}}}function Ii(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(n=>Object.keys(e[n]||{}))));if(!r.length)return;let o=jt(t),i=o.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--"));for(let n of r){let s=Object.values(e).find(m=>m[n])?.[n];if(!s)continue;if(n==="radius"){let m={sm:"calc(var(--radius) * 0.6)",md:"calc(var(--radius) * 0.8)",lg:"var(--radius)",xl:"calc(var(--radius) * 1.4)","2xl":"calc(var(--radius) * 1.8)","3xl":"calc(var(--radius) * 2.2)","4xl":"calc(var(--radius) * 2.6)"};for(let[u,h]of Object.entries(m)){let g=P$1.decl({prop:`--radius-${u}`,value:h,raws:{semicolon:true}});o?.nodes?.find(w=>w.type==="decl"&&w.prop===g.prop)||o?.append(g);}continue}let c=Eo(s)||Ai(s)?`--color-${n.replace(/^--/,"")}`:`--${n.replace(/^--/,"")}`;c==="--color-sidebar-background"&&(c="--color-sidebar");let a=`var(--${n})`;c==="--color-sidebar"&&(a="var(--sidebar)");let f=P$1.decl({prop:c,value:a,raws:{semicolon:true}});o?.nodes?.find(m=>m.type==="decl"&&m.prop===f.prop)||(i?.length?o?.insertAfter(i[i.length-1],f):o?.append(f));}}}}function jt(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=P$1.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
16
|
+
`}}),e.append(t),e.insertBefore(t,P$1.comment({text:"---break---"}))),t}function Ei({params:e}){return {postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(o=>o.type==="atrule"&&o.name==="custom-variant")){let o=t.nodes.filter(n=>n.type==="atrule"&&n.name==="import"),i=P$1.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:`
|
|
17
|
+
`}});if(o.length>0){let n=o[o.length-1];t.insertAfter(n,i);}else t.insertAfter(t.nodes[0],i);t.insertBefore(i,P$1.comment({text:"---break---"}));}}}}function Fi(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let o=Ni(t)==="single"?"'":'"',i=t.nodes.filter(s=>s.type==="atrule"&&s.name==="plugin"),n=i[i.length-1]||t.nodes[0];for(let s of e.plugins){let c=s.replace(/^require\(["']|["']\)$/g,"");if(i.some(f=>f.params.replace(/["']/g,"")===c))continue;let a=P$1.atRule({name:"plugin",params:`${o}${c}${o}`,raws:{semicolon:true,before:`
|
|
18
|
+
`}});t.insertAfter(n,a),t.insertBefore(a,P$1.comment({text:"---break---"}));}}}}function ji(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=jt(t),o=r.nodes?.filter(n=>n.type==="atrule"&&n.name==="keyframes"),i=z$1.record(z$1.string(),z$1.record(z$1.string(),z$1.string()));for(let[n,s]of Object.entries(e.theme.extend.keyframes)){if(typeof n!="string")continue;let c=i.safeParse(s);if(!c.success||o?.find(f=>f.type==="atrule"&&f.name==="keyframes"&&f.params===n))continue;let a=P$1.atRule({name:"keyframes",params:n,nodes:[],raws:{semicolon:true,between:" ",before:`
|
|
19
|
+
`}});for(let[f,l]of Object.entries(c.data)){let m=P$1.rule({selector:f,nodes:Object.entries(l).map(([u,h])=>P$1.decl({prop:u,value:h,raws:{semicolon:true,before:`
|
|
20
20
|
`,between:": "}})),raws:{semicolon:true,between:" ",before:`
|
|
21
|
-
`}});a.append(
|
|
22
|
-
`}});r.append(a);}}}}function
|
|
23
|
-
|
|
24
|
-
`),i=i.trimEnd(),i}function
|
|
25
|
-
`,t.insertAfter(l,a);}else !t.nodes||t.nodes.length,a.raws.before="",t.prepend(a);}}else if(
|
|
26
|
-
`}}),
|
|
27
|
-
`}}),t.append(c),t.insertBefore(c,
|
|
28
|
-
`}}),a.replaceWith(
|
|
29
|
-
`}}),c.append(
|
|
30
|
-
`}});l?l.replaceWith(
|
|
31
|
-
`}});c.append(g);}}}else typeof
|
|
32
|
-
`}});if(t.append(a),t.insertBefore(a,
|
|
33
|
-
`}});a.append(
|
|
34
|
-
`}});a.append(w);}}}else typeof l=="object"&&$e(a,
|
|
35
|
-
`}}),e.append(i),e.insertBefore(i,
|
|
36
|
-
`}});s.nodes.forEach(a=>{if(a.type==="decl"){let
|
|
37
|
-
`,c.append(
|
|
38
|
-
`}}),e.append(
|
|
39
|
-
`}});
|
|
40
|
-
`}}),c=
|
|
41
|
-
`,
|
|
21
|
+
`}});a.append(m);}r.append(a),r.insertBefore(a,P$1.comment({text:"---break---"}));}}}}function Ti(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=jt(t),o=r.nodes?.filter(n=>n.type==="decl"&&n.prop.startsWith("--animate-")),i=z$1.record(z$1.string(),z$1.string()).safeParse(e.theme.extend.animation);if(i.success)for(let[n,s]of Object.entries(i.data)){let c=`--animate-${n}`;if(o?.find(f=>f.prop===c))continue;let a=P$1.decl({prop:c,value:s,raws:{semicolon:true,between:": ",before:`
|
|
22
|
+
`}});r.append(a);}}}}function Ni(e){return e.nodes[0].toString().includes("'")?"single":"double"}function Eo(e){if(e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch"))return false;let t=e.split(" ");return t.length===3&&t.slice(1,3).every(r=>r.includes("%"))}function Ai(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function Ze(e,t,r){let o=e&&Object.keys(e).length>0,i=Object.keys(r.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!o&&!i)return;r={silent:false,...r};let n=t.resolvedPaths.tailwindCss,s=ie__default.relative(t.resolvedPaths.cwd,n),c=w(`Updating ${a.info(s)}`,{silent:r.silent}).start(),a$1=await promises.readFile(n,"utf8");i&&(a$1=await Xe(a$1,r.cssVars,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars})),o&&(a$1=await ar(a$1,e)),await promises.writeFile(n,a$1,"utf8"),c.succeed();}async function ar(e,t){let r=[Di(t)],o=await P$1(r).process(e,{from:void 0}),i=o.css,n=o.root;if(n.nodes&&n.nodes.length>0){let s=n.nodes[n.nodes.length-1];s.type==="atrule"&&!s.nodes&&!i.trimEnd().endsWith(";")&&(i=i.trimEnd()+";");}return i=i.replace(/\/\* ---break--- \*\//g,""),i=i.replace(/(\n\s*\n)+/g,`
|
|
23
|
+
|
|
24
|
+
`),i=i.trimEnd(),i}function Di(e){return {postcssPlugin:"update-css",Once(t){for(let[r,o]of Object.entries(e))if(r.startsWith("@")){let i=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!i)continue;let[,n,s]=i;if(n==="import"){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name==="import"&&a.params===s)){let a=P$1.atRule({name:"import",params:s,raws:{semicolon:true}}),f=t.nodes?.filter(l=>l.type==="atrule"&&l.name==="import");if(f&&f.length>0){let l=f[f.length-1];a.raws.before=`
|
|
25
|
+
`,t.insertAfter(l,a);}else !t.nodes||t.nodes.length,a.raws.before="",t.prepend(a);}}else if(n==="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=P$1.atRule({name:"plugin",params:c,raws:{semicolon:true,before:`
|
|
26
|
+
`}}),m=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="import"),u=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="plugin");if(u&&u.length>0){let h=u[u.length-1];t.insertAfter(h,l);}else if(m&&m.length>0){let h=m[m.length-1];t.insertAfter(h,l),t.insertBefore(l,P$1.comment({text:"---break---"})),t.insertAfter(l,P$1.comment({text:"---break---"}));}else t.prepend(l),t.insertBefore(l,P$1.comment({text:"---break---"})),t.insertAfter(l,P$1.comment({text:"---break---"}));}}else if(typeof o=="object"&&Object.keys(o).length===0){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name===n&&a.params===s)){let a=P$1.atRule({name:n,params:s,raws:{semicolon:true}});t.append(a),t.insertBefore(a,P$1.comment({text:"---break---"}));}}else if(n==="keyframes"){let c=t.nodes?.find(l=>l.type==="atrule"&&l.name==="theme"&&l.params==="inline");c||(c=P$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:`
|
|
27
|
+
`}}),t.append(c),t.insertBefore(c,P$1.comment({text:"---break---"})));let a=c.nodes?.find(l=>l.type==="atrule"&&l.name==="keyframes"&&l.params===s),f;if(a?(f=P$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
|
|
28
|
+
`}}),a.replaceWith(f)):(f=P$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:`
|
|
29
|
+
`}}),c.append(f)),typeof o=="object")for(let[l,m]of Object.entries(o))$e(f,l,m);}else if(n==="utility"){let c=t.nodes?.find(a=>a.type==="atrule"&&a.name===n&&a.params===s);if(c){if(typeof o=="object")for(let[a,f]of Object.entries(o))if(typeof f=="string"){let l=c.nodes?.find(u=>u.type==="decl"&&u.prop===a),m=P$1.decl({prop:a,value:f,raws:{semicolon:true,before:`
|
|
30
|
+
`}});l?l.replaceWith(m):c.append(m);}else if(a.startsWith("@")&&typeof f=="object"&&f!==null&&Object.keys(f).length===0){let l=a.match(/@([a-zA-Z-]+)\s*(.*)/);if(l){let[,m,u]=l;if(!c.nodes?.find(g=>g.type==="atrule"&&g.name===m&&g.params===u)){let g=P$1.atRule({name:m,params:u,raws:{semicolon:true,before:`
|
|
31
|
+
`}});c.append(g);}}}else typeof f=="object"&&$e(c,a,f);}else {let a=P$1.atRule({name:n,params:s,raws:{semicolon:true,between:" ",before:`
|
|
32
|
+
`}});if(t.append(a),t.insertBefore(a,P$1.comment({text:"---break---"})),typeof o=="object")for(let[f,l]of Object.entries(o))if(typeof l=="string"){let m=P$1.decl({prop:f,value:l,raws:{semicolon:true,before:`
|
|
33
|
+
`}});a.append(m);}else if(f.startsWith("@")&&typeof l=="object"&&l!==null&&Object.keys(l).length===0){let m=f.match(/@([a-zA-Z-]+)\s*(.*)/);if(m){let[,u,h]=m;if(!a.nodes?.find(w=>w.type==="atrule"&&w.name===u&&w.params===h)){let w=P$1.atRule({name:u,params:h,raws:{semicolon:true,before:`
|
|
34
|
+
`}});a.append(w);}}}else typeof l=="object"&&$e(a,f,l);}}else n==="property"?$e(t,r,o):jo(t,n,s,o);}else $e(t,r,o);}}}function jo(e,t,r,o){let i=e.nodes?.find(n=>n.type==="atrule"&&n.name===t&&n.params===r);if(i||(i=P$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:`
|
|
35
|
+
`}}),e.append(i),e.insertBefore(i,P$1.comment({text:"---break---"}))),typeof o=="object")for(let[n,s]of Object.entries(o))if(n.startsWith("@")){let c=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(c){let[,a,f]=c;jo(i,a,f,s);}}else $e(i,n,s);else if(typeof o=="string")try{let s=P$1.parse(`.temp{${o}}`).first;if(s&&s.nodes){let c=P$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
|
|
36
|
+
`}});s.nodes.forEach(a=>{if(a.type==="decl"){let f=a.clone();f.raws.before=`
|
|
37
|
+
`,c.append(f);}}),c.nodes?.length&&i.append(c);}}catch(n){throw console.error("Error parsing at-rule content:",o,n),n}}function $e(e,t,r){let o=e.nodes?.find(i=>i.type==="rule"&&i.selector===t);if(o||(o=P$1.rule({selector:t,raws:{semicolon:true,between:" ",before:`
|
|
38
|
+
`}}),e.append(o)),typeof r=="object"){for(let[i,n]of Object.entries(r))if(i.startsWith("@")&&typeof n=="object"&&n!==null&&Object.keys(n).length===0){let s=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,a]=s;if(!o.nodes?.find(l=>l.type==="atrule"&&l.name===c&&l.params===a)){if(c==="apply"){let m=o.nodes?.find(u=>u.type==="atrule"&&u.name==="apply");if(m){m.params=twMerge(m.params,a);continue}}let l=P$1.atRule({name:c,params:a,raws:{semicolon:true,before:`
|
|
39
|
+
`}});o.append(l);}}}else if(typeof n=="string"){let s=P$1.decl({prop:i,value:n,raws:{semicolon:true,before:`
|
|
40
|
+
`}}),c=o.nodes?.find(a=>a.type==="decl"&&a.prop===i);c?c.replaceWith(s):o.append(s);}else if(typeof n=="object"){let s=i.startsWith("&")?t.replace(/^([^:]+)/,`$1${i.substring(1)}`):i;$e(e,s,n);}}else if(typeof r=="string")try{let n=P$1.parse(`.temp{${r}}`).first;n&&n.nodes&&n.nodes.forEach(s=>{if(s.type==="decl"){let c=s.clone();c.raws.before=`
|
|
41
|
+
`,o?.append(c);}});}catch(i){throw console.error("Error parsing rule content:",t,r,i),i}}async function _(e,t,r,o){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;o={silent:false,...o};let i=w("Installing dependencies.",{silent:o.silent})?.start(),n=await Mi(r),s="";if(Vi(r)&&n==="npm")if(o.silent)s="force";else {i.stopAndPersist(),b.warn(`
|
|
42
42
|
It looks like you are using React 19.
|
|
43
43
|
Some packages may fail to install due to peer dependency issues in npm (see ${c$1}/react-19).
|
|
44
|
-
`);let c=await he([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);c&&(s=c.flag);}i?.start(),await
|
|
45
|
-
`),l=[],
|
|
46
|
-
`,"utf-8"),
|
|
47
|
-
`);}s.push(j),Ii(d)&&c.push(d.font.variable.replace("--",""));}}let a=new Set(["font-sans","font-serif","font-mono"]),p=[...c].reverse().find(d=>a.has(d)),l=c.filter(d=>!a.has(d));return p&&l.unshift(p),s.length>0&&Ti(i,s,l,r),i.getFullText()}function ki(e){let t={};return e.font.subsets?.length&&(t.subsets=e.font.subsets),e.font.weight?.length&&(t.weight=e.font.weight),t.variable=e.font.variable,JSON.stringify(t).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'")}function Et(e){return vi.has(e)}function $i(e){return Et(e)?"html":null}function Ii(e){return !e.font.selector&&Et(e.font.variable)}function Pi(e,t){let r=ji(e);return Et(t)?r:`${r}${Ei(t.replace(/^--font-/,""))}`}function ji(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Ei(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Fi(e,t){let r=e.getVariableStatements();for(let n of r)for(let i of n.getDeclarations()){let o=i.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let c=o.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return i}return null}function Oi(e,t){let r=e.getVariableStatements();for(let n of r)for(let i of n.getDeclarations()){let o=i.getInitializer();if(!o||o.getKind()!==SyntaxKind.CallExpression)continue;let s=o;if(s.getExpression().getText()!==t)continue;let c=s.getArguments();if(!c.length)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes("--font-heading"))return true}return false}function Ni(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Ti(e,t,r,n){let i=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let o of i){if(o.getTagNameNode().getText()!=="html")continue;let c=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),p=[...c,...a],l=o.getAttribute("className");if(!l){Ze(e,n),o.addAttribute({name:"className",initializer:`{cn(${p.join(", ")})}`});return}if(l.getKind()!==SyntaxKind.JsxAttribute)return;let d=l.asKindOrThrow(SyntaxKind.JsxAttribute),m=d.getInitializer();if(!m)return;if(m.getKind()===SyntaxKind.StringLiteral){let h=m.getText().slice(1,-1);Ze(e,n),d.setInitializer(`{cn("${h}", ${p.join(", ")})}`);}else if(m.getKind()===SyntaxKind.JsxExpression){let h=m.asKindOrThrow(SyntaxKind.JsxExpression),g=h.getExpression();if(!g)return;let w=g.getText();if(w.startsWith("cn(")){let C=a.every(R=>w.includes(R)),b=r.every(R=>w.includes(`"${R}"`)),j=["font-sans","font-serif","font-mono"].filter(R=>!r.includes(R)).some(R=>w.includes(`"${R}"`));if(C&&b&&!j)continue;let v=Di(w,a);v=Li(v);let $=_i(v,p);h.replaceWithText(`{${$}}`);}else if(/^\w+\.variable$/.test(w)){if(a.includes(w)&&r.length===0)continue;Ze(e,n);let b=(w.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(b?`{cn(${w}, ${p.join(", ")})}`:`{cn(${p.join(", ")})}`);}else if(w.startsWith("`")&&w.endsWith("`")){let C=Ai(w);Ze(e,n);let b=new Set(p),j=new Set(["font-sans","font-serif","font-mono"].map($=>`"${$}"`)),v=C.filter($=>!b.has($)&&!j.has($));h.replaceWithText(`{cn(${[...v,...p].join(", ")})}`);}else Ze(e,n),h.replaceWithText(`{cn(${w}, ${p.join(", ")})}`);}}}function Ze(e,t){if(!e.getImportDeclaration(n=>n.getNamedImports().some(o=>o.getName()==="cn"))){let n=e.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));n?n.getNamedImports().some(o=>o.getName()==="cn")||n.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]});}}function Ai(e){let t=[],r=[],i=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let o of i)if(o)if(o.startsWith("${")&&o.endsWith("}")){let s=o.slice(2,-1).trim();s&&r.push(s);}else {let s=o.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`);}return [...t,...r]}function Di(e,t){let r=e;for(let n of t)r=r.replace(new RegExp(`,?\\s*${n.replace(".","\\.")}`,"g"),"").replace(/cn\(\s*,/,"cn(");return r}function Li(e){let t=e;for(let r of ["font-sans","font-serif","font-mono"])t=t.replace(new RegExp(`,?\\s*"${r}"`,"g"),"").replace(/cn\(\s*,/,"cn(");return t}function _i(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function se(e,t,r){r={overwrite:false,silent:false,isNewProject:false,...r};let n=await P(t);return n&&n.ui&&n.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await Ui(e,t,n,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Mi(e,t,{...r,skipFonts:r.skipFonts})}async function Mi(e,t,r){if(!e.length)return;let n=w("Checking registry.",{silent:r.silent})?.start(),i=await _(e,U(t));if(!i)return n?.fail(),$(new Error("Failed to fetch components from registry."));try{yn(i.files??[],t.resolvedPaths.cwd);}catch(a){return n?.fail(),$(a)}n?.succeed();let o=await ta$1(t);r.skipFonts||(i=await Qe(i,t));let s=ke([i]);await D(i.dependencies,i.devDependencies,t,{silent:r.silent}),await Y$1(i.tailwind?.config,t,{silent:r.silent,tailwindVersion:o}),await or(i.envVars,t,{silent:r.silent}),r.skipFonts||await et(i.fonts,t,{silent:r.silent}),await D$1(i.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let c=i.cssVars?r.overwriteCssVars??await hn(e,t):void 0;await Xe(i.css,t,{silent:r.silent,cssVars:i.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:c,tailwindVersion:o,tailwindConfig:i.tailwind?.config}),i.docs&&b.info(i.docs);}async function Ui(e,t,r,n){if(!e.length)return;let i=w("Checking registry.",{silent:n.silent})?.start(),o=await _(e,U(t));if(!o)return i?.fail(),$(new Error("Failed to fetch components from registry."));try{yn(o.files??[],t.resolvedPaths.cwd);}catch(R){return i?.fail(),$(R)}i?.succeed();let s=[],c=[],a=[],p=w("Installing components.")?.start(),l=r.ui,d=await ta$1(l),m=R(t.resolvedPaths.cwd,l.resolvedPaths.ui);o=await Qe(o,t);let h=ke([o]);await D(o.dependencies,o.devDependencies,l,{silent:true}),o.tailwind?.config&&(await Y$1(o.tailwind?.config,l,{silent:true,tailwindVersion:d}),c.push(oe__default.relative(m,l.resolvedPaths.tailwindConfig))),o.envVars&&await or(o.envVars,l,{silent:true}),await et(o.fonts,t,{silent:true});let g=new Map;for(let R of o.files??[]){let _=R.type||"registry:ui";g.has(_)||g.set(_,[]),g.get(_).push(R);}let w$1={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"};for(let R$1 of Array.from(g.keys())){let _=g.get(R$1),be=w$1[R$1],Je=be&&r[be]?r[be]:t,ct=R(t.resolvedPaths.cwd,Je.resolvedPaths.ui||Je.resolvedPaths.cwd),Jt=await Q(ct,Je.resolvedPaths.cwd)??Je.resolvedPaths.cwd,Gt=await D$1(_,Je,{overwrite:n.overwrite,silent:true,rootSpinner:p,isRemote:n.isRemote,isWorkspace:true,path:n.path,supportedFontMarkers:h});s.push(...Gt.filesCreated.map(Ge=>oe__default.relative(ct,oe__default.join(Jt,Ge)))),c.push(...Gt.filesUpdated.map(Ge=>oe__default.relative(ct,oe__default.join(Jt,Ge)))),a.push(...Gt.filesSkipped.map(Ge=>oe__default.relative(ct,oe__default.join(Jt,Ge))));}let C=o.cssVars?n.overwriteCssVars??await hn(e,t):void 0;await Xe(o.css,l,{silent:true,cssVars:o.cssVars,overwriteCssVars:C,tailwindVersion:d,tailwindConfig:o.tailwind?.config}),(o.cssVars||o.css)&&c.push(oe__default.relative(m,l.resolvedPaths.tailwindCss)),p?.succeed();let b$1=Array.from(new Set(s)).sort(),j=Array.from(new Set(c.filter(R=>!s.includes(R)))).sort(),v=Array.from(new Set(a)).sort();if(!(b$1.length||j.length)&&!v.length&&w("No files updated.",{silent:n.silent})?.info(),b$1.length){w(`Created ${b$1.length} ${b$1.length===1?"file":"files"}:`,{silent:n.silent})?.succeed();for(let R of b$1)b.log(` - ${R}`);}if(j.length){w(`Updated ${j.length} ${j.length===1?"file":"files"}:`,{silent:n.silent})?.info();for(let R of j)b.log(` - ${R}`);}if(v.length){w(`Skipped ${v.length} ${v.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info();for(let R of v)b.log(` - ${R}`);}o.docs&&b.info(o.docs);}async function hn(e,t){let r=await ba(e,{config:t});return z$1.array(n).parse(r).some(i=>i.type==="registry:theme"||i.type==="registry:style"||i.type==="registry:font"||i.type==="registry:base")}function yn(e,t){for(let r of e)if(r?.target&&!cn(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}async function ge(e){let t=oe__default.resolve(e.projectPath,"packages/ui"),r=oe__default.resolve(e.projectPath,"apps/web"),n=oe__default.resolve(t,"components.json"),i=await A.readJson(n);e.registryBaseConfig&&(i=wn(i,e.registryBaseConfig)),i.tailwind.baseColor="neutral",e.rtl&&(i.rtl=true),e.menuColor&&(i.menuColor=e.menuColor),e.menuAccent&&(i.menuAccent=e.menuAccent),e.iconLibrary&&(i.iconLibrary=e.iconLibrary),await A.writeJson(n,i,{spaces:2});let o=oe__default.resolve(r,"components.json"),s=await A.readJson(o);e.registryBaseConfig&&(s=wn(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),e.menuColor&&(s.menuColor=e.menuColor),e.menuAccent&&(s.menuAccent=e.menuAccent),e.iconLibrary&&(s.iconLibrary=e.iconLibrary),await A.writeJson(o,s,{spaces:2});let c$1=await O(t,c.parse(i)),{config:a}=await M(e.components,c$1,{silent:true});await se(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let p=await O(r,c.parse(s)),l=await _(e.components,U(a));if(l?.fonts?.length){let m={},h=new Set;for(let g of l.fonts){let w=g.name.replace(/^font-heading-/,"").replace("font-",""),C=g.font.dependency??`@fontsource-variable/${w}`;m[g.font.variable]=g.font.family,h.add(C);}await D(Array.from(h),[],c$1,{silent:true}),await It({theme:m},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await Xe(Object.fromEntries(Array.from(h).map(g=>[`@import "${g}"`,{}])),c$1,{silent:e.silent});}let d=c$1.iconLibrary;if(d&&d in a$3){let m=[...a$3[d].packages];await D(m,[],c$1,{silent:true}),await D(m,[],p,{silent:true});}return p}var xn=B({name:"astro",title:"Astro",defaultProjectName:"astro-app",templateDir:"astro-app",frameworks:["astro"],create:async()=>{},files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:bn`---
|
|
44
|
+
`);let c=await he([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);c&&(s=c.flag);}i?.start(),await Ui(n,e,t,r.resolvedPaths.cwd,s),i?.succeed();}function Vi(e){let t=qa$1(e.resolvedPaths.cwd,false);if(!t?.dependencies?.react)return false;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),o=t.dependencies["react-day-picker"]?.startsWith("8");return r&&o}async function Mi(e){return qa$1(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":a$2(e.resolvedPaths.cwd)}async function Ui(e,t,r,o,i){if(e==="npm")return Wi(t,r,o,i);if(e==="deno")return Bi(t,r,o);if(e==="expo")return zi(t,r,o);t?.length&&await execa(e,["add",...t],{cwd:o}),r?.length&&await execa(e,["add","-D",...r],{cwd:o});}async function Wi(e,t,r,o){e.length&&await execa("npm",["install",...o?[`--${o}`]:[],...e],{cwd:r}),t.length&&await execa("npm",["install",...o?[`--${o}`]:[],"-D",...t],{cwd:r});}async function Bi(e,t,r){e?.length&&await execa("deno",["add",...e.map(o=>`npm:${o}`)],{cwd:r}),t?.length&&await execa("deno",["add","-D",...t.map(o=>`npm:${o}`)],{cwd:r});}async function zi(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 lr(e,t$1,r){if(!e||Object.keys(e).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let o=w("Adding environment variables.",{silent:r.silent})?.start(),i=t$1.resolvedPaths.cwd,n=ie__default.join(i,".env.local"),s=t(i);s&&(n=s);let c=existsSync(n),a$1=ie__default.basename(n),f=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
|
|
45
|
+
`),l=[],m=null,u$1=null;if(c){let h=await promises.readFile(n,"utf-8"),g=v(h,f);if(l=u(h,f),l.length>0){if(await promises.writeFile(n,g,"utf-8"),m=ie__default.relative(i,n),o?.succeed(`Added the following variables to ${a.info(a$1)}:`),!r.silent)for(let w of l)b.log(` ${a.success("+")} ${w}`);}else o?.stop();}else if(await promises.writeFile(n,f+`
|
|
46
|
+
`,"utf-8"),u$1=ie__default.relative(i,n),l=Object.keys(e),o?.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:u$1}}var Xi=new Set(["--font-sans","--font-serif","--font-mono"]);async function et(e,t){if(!e.fonts?.length)return e;let r=await ra$1(t.resolvedPaths.cwd);if(!r)return e;e.cssVars??={},e.cssVars.theme??={};let o=r.framework.name==="next-app"||r.framework.name==="next-pages";for(let i of e.fonts)if(o)e.cssVars.theme[i.font.variable]=`var(${i.font.variable})`;else {let n=i.name.replace("font-",""),s=i.font.dependency??`@fontsource-variable/${n}`;e.dependencies??=[],e.dependencies.push(s),e.css??={},e.css[`@import "${s}"`]={},e.cssVars.theme[i.font.variable]=i.font.family;}if(e.fonts.length>0){let i=new Map;for(let n of e.fonts){let s=n.font.selector??rs(n.font.variable);if(!s)continue;let c=n.font.variable.replace("--","");i.has(s)||i.set(s,[]),i.get(s).push(c);}e.css??={},e.css["@layer base"]??={};for(let[n,s]of Array.from(i.entries())){let c=s.join(" ");e.css["@layer base"][n]??={};let a=Object.keys(e.css["@layer base"][n]).find(f=>f.startsWith("@apply "));a?(delete e.css["@layer base"][n][a],e.css["@layer base"][n][`${a} ${c}`]={}):e.css["@layer base"][n][`@apply ${c}`]={};}}return e}async function tt(e,t,r){if(!e?.length)return;let o=await ra$1(t.resolvedPaths.cwd);if(!o||o.framework.name!=="next-app"&&o.framework.name!=="next-pages")return;let i=w("Updating fonts.",{silent:r.silent})?.start();try{await Zi(e,t,o),i?.succeed("Updating fonts.");}catch(n){throw i?.fail("Failed to update fonts."),n}}async function Zi(e,t,r){let o=await Qi(t,r);if(!o)return;let i=await promises.readFile(o,"utf-8"),n=await es(i,e,t);n!==i&&await promises.writeFile(o,n,"utf-8");}async function Qi(e,t){let r=e.resolvedPaths.cwd,o=t.isSrcDir,n=t.isTsx?"tsx":"jsx",s=o?[`src/app/layout.${n}`,`app/layout.${n}`]:[`app/layout.${n}`];for(let c of s){let a=ie__default.join(r,c);if(existsSync(a))return a}return null}async function es(e,t,r){let i=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),n=t.filter(m=>m.font.provider==="google"),s=[],c=[];for(let m of n){let u=m.font.import;if(!u)continue;let h=i.getImportDeclaration(x=>x.getModuleSpecifierValue()==="next/font/google"),g=false;h?(g=h.getNamedImports().some($=>$.getName()===u),g||h.addNamedImport(u)):i.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[u]});let w=ns(u,m.font.variable),C=ts(m),k=as(i,m.font.variable),E=w;if(!(g&&!k&&Nt(m.font.variable)&&!cs(i,u))){if(k)k.setInitializer(`${u}(${C})`),k.getName()!==w&&k.rename(w),E=w;else {let x=ls(i);i.insertVariableStatement(x,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:w,initializer:`${u}(${C})`}]}).appendWhitespace(`
|
|
47
|
+
`);}s.push(E),os(m)&&c.push(m.font.variable.replace("--",""));}}let a=new Set(["font-sans","font-serif","font-mono"]),f=[...c].reverse().find(m=>a.has(m)),l=c.filter(m=>!a.has(m));return f&&l.unshift(f),s.length>0&&fs(i,s,l,r),i.getFullText()}function ts(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 Nt(e){return Xi.has(e)}function rs(e){return Nt(e)?"html":null}function os(e){return !e.font.selector&&Nt(e.font.variable)}function ns(e,t){let r=is(e);return Nt(t)?r:`${r}${ss(t.replace(/^--font-/,""))}`}function is(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ss(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function as(e,t){let r=e.getVariableStatements();for(let o of r)for(let i of o.getDeclarations()){let n=i.getInitializer();if(!n||n.getKind()!==SyntaxKind.CallExpression)continue;let c=n.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return i}return null}function cs(e,t){let r=e.getVariableStatements();for(let o of r)for(let i of o.getDeclarations()){let n=i.getInitializer();if(!n||n.getKind()!==SyntaxKind.CallExpression)continue;let s=n;if(s.getExpression().getText()!==t)continue;let c=s.getArguments();if(!c.length)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes("--font-heading"))return true}return false}function ls(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function fs(e,t,r,o){let i=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let n of i){if(n.getTagNameNode().getText()!=="html")continue;let c=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),f=[...c,...a],l=n.getAttribute("className");if(!l){Qe(e,o),n.addAttribute({name:"className",initializer:`{cn(${f.join(", ")})}`});return}if(l.getKind()!==SyntaxKind.JsxAttribute)return;let m=l.asKindOrThrow(SyntaxKind.JsxAttribute),u=m.getInitializer();if(!u)return;if(u.getKind()===SyntaxKind.StringLiteral){let h=u.getText().slice(1,-1);Qe(e,o),m.setInitializer(`{cn("${h}", ${f.join(", ")})}`);}else if(u.getKind()===SyntaxKind.JsxExpression){let h=u.asKindOrThrow(SyntaxKind.JsxExpression),g=h.getExpression();if(!g)return;let w=g.getText();if(w.startsWith("cn(")){let C=a.every(v=>w.includes(v)),k=r.every(v=>w.includes(`"${v}"`)),E=["font-sans","font-serif","font-mono"].filter(v=>!r.includes(v)).some(v=>w.includes(`"${v}"`));if(C&&k&&!E)continue;let x=ms(w,a);x=us(x);let $=ds(x,f);h.replaceWithText(`{${$}}`);}else if(/^\w+\.variable$/.test(w)){if(a.includes(w)&&r.length===0)continue;Qe(e,o);let k=(w.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(k?`{cn(${w}, ${f.join(", ")})}`:`{cn(${f.join(", ")})}`);}else if(w.startsWith("`")&&w.endsWith("`")){let C=ps(w);Qe(e,o);let k=new Set(f),E=new Set(["font-sans","font-serif","font-mono"].map($=>`"${$}"`)),x=C.filter($=>!k.has($)&&!E.has($));h.replaceWithText(`{cn(${[...x,...f].join(", ")})}`);}else Qe(e,o),h.replaceWithText(`{cn(${w}, ${f.join(", ")})}`);}}}function Qe(e,t){if(!e.getImportDeclaration(o=>o.getNamedImports().some(n=>n.getName()==="cn"))){let o=e.getImportDeclaration(i=>i.getModuleSpecifierValue().includes("/lib/utils"));o?o.getNamedImports().some(n=>n.getName()==="cn")||o.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]});}}function ps(e){let t=[],r=[],i=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let n of i)if(n)if(n.startsWith("${")&&n.endsWith("}")){let s=n.slice(2,-1).trim();s&&r.push(s);}else {let s=n.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`);}return [...t,...r]}function ms(e,t){let r=e;for(let o of t)r=r.replace(new RegExp(`,?\\s*${o.replace(".","\\.")}`,"g"),"").replace(/cn\(\s*,/,"cn(");return r}function us(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 ds(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function ae(e,t,r){r={overwrite:false,silent:false,isNewProject:false,...r};let o=await P(t);return o&&o.ui&&o.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await ys(e,t,o,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await hs(e,t,{...r,skipFonts:r.skipFonts})}async function hs(e,t,r){if(!e.length)return;let o=w("Checking registry.",{silent:r.silent})?.start(),i=await _$1(e,U(t));if(!i)return o?.fail(),$(new Error("Failed to fetch components from registry."));try{Ao(i.files??[],t.resolvedPaths.cwd);}catch(a){return o?.fail(),$(a)}o?.succeed();let n=await ta(t);r.skipFonts||(i=await et(i,t));let s=Pe([i]);await _(i.dependencies,i.devDependencies,t,{silent:r.silent}),await Y$1(i.tailwind?.config,t,{silent:r.silent,tailwindVersion:n}),await lr(i.envVars,t,{silent:r.silent}),r.skipFonts||await tt(i.fonts,t,{silent:r.silent}),await D(i.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let c=i.cssVars?r.overwriteCssVars??await No(e,t):void 0;await Ze(i.css,t,{silent:r.silent,cssVars:i.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:c,tailwindVersion:n,tailwindConfig:i.tailwind?.config}),i.docs&&b.info(i.docs);}async function ys(e,t,r,o){if(!e.length)return;let i=w("Checking registry.",{silent:o.silent})?.start(),n=await _$1(e,U(t));if(!n)return i?.fail(),$(new Error("Failed to fetch components from registry."));try{Ao(n.files??[],t.resolvedPaths.cwd);}catch(v){return i?.fail(),$(v)}i?.succeed();let s=[],c=[],a=[],f=w("Installing components.")?.start(),l=r.ui,m=await ta(l),u=R(t.resolvedPaths.cwd,l.resolvedPaths.ui);n=await et(n,t);let h=Pe([n]);await _(n.dependencies,n.devDependencies,l,{silent:true}),n.tailwind?.config&&(await Y$1(n.tailwind?.config,l,{silent:true,tailwindVersion:m}),c.push(ie__default.relative(u,l.resolvedPaths.tailwindConfig))),n.envVars&&await lr(n.envVars,l,{silent:true}),await tt(n.fonts,t,{silent:true});let g=new Map;for(let v of n.files??[]){let L=v.type||"registry:ui";g.has(L)||g.set(L,[]),g.get(L).push(v);}let w$1={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"};for(let v of Array.from(g.keys())){let L=g.get(v),be=w$1[v],Ge=be&&r[be]?r[be]:t,pt=R(t.resolvedPaths.cwd,Ge.resolvedPaths.ui||Ge.resolvedPaths.cwd),qt=await Q(pt,Ge.resolvedPaths.cwd)??Ge.resolvedPaths.cwd,Xt=await D(L,Ge,{overwrite:o.overwrite,silent:true,rootSpinner:f,isRemote:o.isRemote,isWorkspace:true,path:o.path,supportedFontMarkers:h});s.push(...Xt.filesCreated.map(He=>ie__default.relative(pt,ie__default.join(qt,He)))),c.push(...Xt.filesUpdated.map(He=>ie__default.relative(pt,ie__default.join(qt,He)))),a.push(...Xt.filesSkipped.map(He=>ie__default.relative(pt,ie__default.join(qt,He))));}let C=n.cssVars?o.overwriteCssVars??await No(e,t):void 0;await Ze(n.css,l,{silent:true,cssVars:n.cssVars,overwriteCssVars:C,tailwindVersion:m,tailwindConfig:n.tailwind?.config}),(n.cssVars||n.css)&&c.push(ie__default.relative(u,l.resolvedPaths.tailwindCss)),f?.succeed();let k=Array.from(new Set(s)).sort(),E=Array.from(new Set(c.filter(v=>!s.includes(v)))).sort(),x=Array.from(new Set(a)).sort();if(!(k.length||E.length)&&!x.length&&w("No files updated.",{silent:o.silent})?.info(),k.length){w(`Created ${k.length} ${k.length===1?"file":"files"}:`,{silent:o.silent})?.succeed();for(let v of k)b.log(` - ${v}`);}if(E.length){w(`Updated ${E.length} ${E.length===1?"file":"files"}:`,{silent:o.silent})?.info();for(let v of E)b.log(` - ${v}`);}if(x.length){w(`Skipped ${x.length} ${x.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:o.silent})?.info();for(let v of x)b.log(` - ${v}`);}n.docs&&b.info(n.docs);}async function No(e,t){let r=await ba(e,{config:t});return z$1.array(n).parse(r).some(i=>i.type==="registry:theme"||i.type==="registry:style"||i.type==="registry:font"||i.type==="registry:base")}function Ao(e,t){for(let r of e)if(r?.target&&!So(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}async function ge(e){let t=ie__default.resolve(e.projectPath,"packages/ui"),r=ie__default.resolve(e.projectPath,"apps/web"),o=ie__default.resolve(t,"components.json"),i=await O.readJson(o);e.registryBaseConfig&&(i=Oo(i,e.registryBaseConfig)),i.tailwind.baseColor="neutral",e.rtl&&(i.rtl=true),e.menuColor&&(i.menuColor=e.menuColor),e.menuAccent&&(i.menuAccent=e.menuAccent),e.iconLibrary&&(i.iconLibrary=e.iconLibrary),await O.writeJson(o,i,{spaces:2});let n=ie__default.resolve(r,"components.json"),s=await O.readJson(n);e.registryBaseConfig&&(s=Oo(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),e.menuColor&&(s.menuColor=e.menuColor),e.menuAccent&&(s.menuAccent=e.menuAccent),e.iconLibrary&&(s.iconLibrary=e.iconLibrary),await O.writeJson(n,s,{spaces:2});let c$1=await O$1(t,c.parse(i)),{config:a}=await M(e.components,c$1,{silent:true});await ae(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 u={},h=new Set;for(let g of l.fonts){let w=g.name.replace(/^font-heading-/,"").replace("font-",""),C=g.font.dependency??`@fontsource-variable/${w}`;u[g.font.variable]=g.font.family,h.add(C);}await _(Array.from(h),[],c$1,{silent:true}),await Ft({theme:u},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await Ze(Object.fromEntries(Array.from(h).map(g=>[`@import "${g}"`,{}])),c$1,{silent:e.silent});}let m=c$1.iconLibrary;if(m&&m in a$3){let u=[...a$3[m].packages];await _(u,[],c$1,{silent:true}),await _(u,[],f,{silent:true});}return f}var Do=z({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:_o`---
|
|
48
48
|
import Layout from "@/layouts/main.astro"
|
|
49
49
|
import { ComponentExample } from "@/components/component-example"
|
|
50
50
|
---
|
|
@@ -52,7 +52,7 @@ import { ComponentExample } from "@/components/component-example"
|
|
|
52
52
|
<Layout>
|
|
53
53
|
<ComponentExample client:load />
|
|
54
54
|
</Layout>
|
|
55
|
-
`}],monorepo:{templateDir:"astro-monorepo",init:ge,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:
|
|
55
|
+
`}],monorepo:{templateDir:"astro-monorepo",init:ge,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:_o`---
|
|
56
56
|
import "@workspace/ui/globals.css"
|
|
57
57
|
import { ComponentExample } from "@/components/component-example"
|
|
58
58
|
---
|
|
@@ -67,27 +67,27 @@ import { ComponentExample } from "@/components/component-example"
|
|
|
67
67
|
<ComponentExample client:load />
|
|
68
68
|
</body>
|
|
69
69
|
</html>
|
|
70
|
-
`}]}});var
|
|
70
|
+
`}]}});var Lo=z({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 Uo=z({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:_o`import { ComponentExample } from "@/components/component-example";
|
|
71
71
|
|
|
72
72
|
export default function Page() {
|
|
73
73
|
return <ComponentExample />;
|
|
74
74
|
}
|
|
75
|
-
`}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=
|
|
75
|
+
`}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=ie__default.resolve(e.projectPath,"packages/ui"),r=ie__default.resolve(e.projectPath,"apps/web"),o=ie__default.resolve(t,"components.json"),i=await O.readJson(o);e.registryBaseConfig&&(i=Oo(i,e.registryBaseConfig)),i.tailwind.baseColor="neutral",e.rtl&&(i.rtl=true),await O.writeJson(o,i,{spaces:2});let n=ie__default.resolve(r,"components.json"),s=await O.readJson(n);e.registryBaseConfig&&(s=Oo(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),await O.writeJson(n,s,{spaces:2});let c$1=await O$1(t,c.parse(i)),{config:a}=await M(e.components,c$1,{silent:true});await ae(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 u={};for(let h of l.fonts)u[h.font.variable]=`var(${h.font.variable})`;await Ft({theme:u},c$1,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await tt(l.fonts,f,{silent:e.silent});}let m=c$1.iconLibrary;if(m&&m in a$3){let u=[...a$3[m].packages];await _(u,[],c$1,{silent:true}),await _(u,[],f,{silent:true});}return f},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:_o`import { ComponentExample } from "@/components/component-example";
|
|
76
76
|
|
|
77
77
|
export default function Page() {
|
|
78
78
|
return <ComponentExample />;
|
|
79
79
|
}
|
|
80
|
-
`}]}});var
|
|
80
|
+
`}]}});var Bo=z({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:_o`import { ComponentExample } from "@/components/component-example";
|
|
81
81
|
|
|
82
82
|
export default function Home() {
|
|
83
83
|
return <ComponentExample />;
|
|
84
84
|
}
|
|
85
|
-
`}],monorepo:{templateDir:"react-router-monorepo",init:ge,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:
|
|
85
|
+
`}],monorepo:{templateDir:"react-router-monorepo",init:ge,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:_o`import { ComponentExample } from "@/components/component-example";
|
|
86
86
|
|
|
87
87
|
export default function Home() {
|
|
88
88
|
return <ComponentExample />;
|
|
89
89
|
}
|
|
90
|
-
`}]}});var
|
|
90
|
+
`}]}});var Jo=z({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:_o`import { createFileRoute } from "@tanstack/react-router";
|
|
91
91
|
import { ComponentExample } from "@/components/component-example";
|
|
92
92
|
|
|
93
93
|
export const Route = createFileRoute("/")({ component: App });
|
|
@@ -97,7 +97,7 @@ function App() {
|
|
|
97
97
|
<ComponentExample />
|
|
98
98
|
);
|
|
99
99
|
}
|
|
100
|
-
`}],monorepo:{templateDir:"start-monorepo",init:ge,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:
|
|
100
|
+
`}],monorepo:{templateDir:"start-monorepo",init:ge,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:_o`import { createFileRoute } from "@tanstack/react-router";
|
|
101
101
|
import { ComponentExample } from "@/components/component-example";
|
|
102
102
|
|
|
103
103
|
export const Route = createFileRoute("/")({ component: App });
|
|
@@ -107,59 +107,398 @@ function App() {
|
|
|
107
107
|
<ComponentExample />
|
|
108
108
|
);
|
|
109
109
|
}
|
|
110
|
-
`}]}});var
|
|
110
|
+
`}]}});var Ho=z({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:_o`import { ComponentExample } from "@/components/component-example";
|
|
111
111
|
|
|
112
112
|
export function App() {
|
|
113
113
|
return <ComponentExample />;
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
export default App;
|
|
117
|
-
`}],monorepo:{templateDir:"vite-monorepo",init:ge,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:
|
|
117
|
+
`}],monorepo:{templateDir:"vite-monorepo",init:ge,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:_o`import { ComponentExample } from "@/components/component-example";
|
|
118
118
|
|
|
119
119
|
export function App() {
|
|
120
120
|
return <ComponentExample />;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
export default App;
|
|
124
|
-
`}]}});var
|
|
125
|
-
Would you like to start a new project?`,choices:Object.entries(
|
|
126
|
-
You may now add components.`),process.removeListener("exit",i),
|
|
127
|
-
`,"utf8"),h.succeed();let
|
|
128
|
-
Before you can add components, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}async function
|
|
129
|
-
`)}function
|
|
130
|
-
`),s=>green(`+${s}`));else {let s=
|
|
131
|
-
`)}function
|
|
132
|
-
`)}function
|
|
133
|
-
`);r.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${
|
|
134
|
-
`)}function
|
|
135
|
-
`),r=>green(`+${r}`));else {let r=
|
|
136
|
-
`);
|
|
137
|
-
`);
|
|
138
|
-
`)}function
|
|
139
|
-
`).length,
|
|
140
|
-
`).length):3,c=structuredPatch(`a/${r}`,`b/${r}`,i,
|
|
141
|
-
`);for(let l of c.hunks){let{entries:
|
|
142
|
-
`).map(t=>{let r=t.match(/^(\s*)/)?.[1]??"",
|
|
143
|
-
`)}function
|
|
144
|
-
`).map(
|
|
124
|
+
`}]}});var J={next:Uo,vite:Ho,start:Jo,"react-router":Bo,astro:Do,laravel:Lo};function Me(e){if(e){for(let[t,r]of Object.entries(J))if(r.frameworks.includes(e))return t}}async function Lt(e){let t=e.template&&e.template in J?e.template:"next",r=Se(J[t],{monorepo:e.monorepo}),o=e.name??r.defaultProjectName,i=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(i&&(t="next"),!e.force){let{type:a$1,name:f}=await he([{type:e.template||i?null:"select",name:"type",message:`The path ${a.info(e.cwd)} does not contain a package.json file.
|
|
125
|
+
Would you like to start a new project?`,choices:Object.entries(J).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:o,format:l=>l.trim(),validate:l=>l.length>128?"Name should be less than 128 characters.":true}]);t=a$1??t,o=f??o;}let n=Se(J[t],{monorepo:e.monorepo}),s=await a$2(e.cwd,{withFallback:true}),c=ie__default.join(e.cwd,o);try{await O.access(e.cwd,O.constants.W_OK);}catch{b.break(),b.error(`The path ${a.info(e.cwd)} is not writable.`),b.error(`It is likely you do not have write permissions for this folder or the path ${a.info(e.cwd)} does not exist.`),b.break(),process.exit(1);}return O.existsSync(ie__default.resolve(e.cwd,o,"package.json"))&&(b.break(),b.error(`A project with the name ${a.info(o)} already exists.`),b.error("Please choose a different name and try again."),b.break(),process.exit(1)),await n.scaffold({projectPath:c,packageManager:s,cwd:e.cwd}),{projectPath:c,projectName:o,template:t}}async function K(e=process.cwd()){try{let{config:t}=await import('@dotenvx/dotenvx'),r=[".env.local",".env.development.local",".env.development",".env"];for(let o of r){let i=join(e,o);existsSync(i)&&t({path:i,overload:!1,quiet:!0});}}catch(t){b.warn("Failed to load env files:",t);}}var Ue=".bak";function pr(e){if(!O.existsSync(e))return null;let t=`${e}${Ue}`;try{return O.renameSync(e,t),t}catch(r){return console.error(`Failed to create backup of ${e}: ${r}`),null}}function Vt(e){let t=`${e}${Ue}`;if(!O.existsSync(t))return false;try{return O.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function mr(e){let t=`${e}${Ue}`;if(!O.existsSync(t))return false;try{return O.unlinkSync(t),!0}catch{return false}}async function Ko(e,t,r={}){if(!O.existsSync(e))return t();if(!pr(e))throw r.onBackupFailure?.(e),new Error(`Could not back up ${e}.`);let i=()=>Vt(e);process.on("exit",i);try{let n=await t();return process.removeListener("exit",i),mr(e),n}catch(n){throw process.removeListener("exit",i),Vt(e),n}}var Rs=z$1.object({cwd:z$1.string(),name:z$1.string().optional(),preset:z$1.union([z$1.boolean(),z$1.string()]).optional(),components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),defaults:z$1.boolean(),force:z$1.boolean(),reinstall:z$1.boolean().optional(),silent:z$1.boolean(),isNewProject:z$1.boolean().default(false),cssVariables:z$1.boolean().default(true),rtl:z$1.boolean().optional(),base:z$1.enum(["radix","base"]).optional(),template:z$1.string().optional(),monorepo:z$1.boolean().optional(),existingConfig:z$1.record(z$1.unknown()).optional(),installStyleIndex:z$1.boolean().default(true),registryBaseConfig:c.deepPartial().optional(),menuColor:z$1.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:z$1.enum(["subtle","bold"]).optional(),iconLibrary:z$1.string().optional()}),qo=new Command().name("init").alias("create").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, react-router, laravel, astro)").option("-b, --base <base>","the component library to use. (radix, base)").option("--monorepo","scaffold a monorepo project.").option("--no-monorepo","skip the monorepo prompt.").option("-p, --preset [name]","use a preset configuration").option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults","use default configuration: --template=next --preset=base-nova",false).option("-f, --force","force overwrite of existing configuration.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-n, --name <name>","the name for the new project.").option("-s, --silent","mute output.",false).option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").option("--rtl","enable RTL support.").option("--no-rtl","disable RTL support.").option("--reinstall","re-install existing UI components.").option("--no-reinstall","do not re-install existing UI components.").action(async(e,t)=>{let r$1,o=[],i=()=>{r$1&&Vt(r$1.replace(Ue,""));};process.on("exit",i);try{let n=Rs.parse({...t,reinstall:t.reinstall,cwd:ie__default.resolve(t.cwd)}),s=new Map(Object.entries(B)),c;if(n.defaults&&(n.template=n.template||"next",n.base=n.base||"base",n.reinstall=n.reinstall??!1),n.template&&!(n.template in J)&&(b.error(`Invalid template: ${a.info(n.template)}. Available templates: ${Object.keys(J).map(u=>a.info(u)).join(", ")}.`),b.break(),process.exit(1)),typeof n.preset=="string"&&!G$1(n.preset)&&!r(n.preset)){let u=Array.from(s.keys());s.has(n.preset)||(b.error(`Invalid preset: ${a.info(n.preset)}. Available presets: ${u.join(", ")}`),b.break(),process.exit(1));}let a$1=n.cwd,f=O.existsSync(ie__default.resolve(a$1,"components.json"));if(!n.monorepo&&!f&&await G(a$1)){let u=await ra$1(a$1);if(!u||u.framework.name==="manual"){let h=await H(a$1);h.length>0&&(Y("init",h),process.exit(1));}}if(f&&!n.force){let{overwrite:u}=await he({type:"confirm",name:"overwrite",message:`A ${a.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});u||(b.info(` To start over, remove the ${a.info("components.json")} file and run ${a.info("init")} again.`),b.break(),process.exit(1)),n.force=!0;}let l;if(f){try{l=await O.readJson(ie__default.resolve(a$1,"components.json"));}catch{}l&&(n.existingConfig=l);let u=n.reinstall;if(u===void 0){let{reinstall:h}=await he({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});u=h;}if(u&&(o=await ua$1(a$1),o.length)){b.break(),b.log(" The following components will be re-installed and overwritten:");for(let h=0;h<o.length;h+=8)b.log(` - ${o.slice(h,h+8).join(", ")}`);b.break();}}if(n.preset===void 0&&e.length===0&&!n.defaults){let u=O.existsSync(ie__default.resolve(a$1,"package.json"));if(!n.template&&!u){let{template:h}=await he({type:"select",name:"template",message:"Select a template",choices:Object.entries(J).map(([g,w])=>({title:w.title,value:g,description:w.description,disabled:n.monorepo&&g==="laravel"}))});h||process.exit(1),n.template=h;}if(!n.template&&u){let h=await ra$1(a$1),g=Me(h?.framework.name);g&&(n.template=g);}if(n.template==="laravel"&&!u&&(b.break(),b.log(` Please create a new app with ${a.info("laravel new --react")} first then run ${a.info("shadcn init")}.`),b.log(` See ${a.info(`${c$1}/docs/installation/laravel`)} for more information.`),b.break(),process.exit(0)),n.monorepo===void 0&&!u&&n.template&&J[n.template]?.monorepo){let{monorepo:h}=await he({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});n.monorepo=h;}n.base||(n.base=await Le()),n.preset=!0;}if(n.preset!==void 0){let u=n.preset===!0?!0:n.preset;if(u===!0){let h=await qe({rtl:n.rtl??!1,template:n.template,base:n.base});e=[h.url,...e],c=h.base;}if(typeof u=="string"){let h;if(G$1(u)){let g=new URL(u);n.rtl?g.searchParams.set("rtl","true"):n.rtl===!1&&g.searchParams.delete("rtl"),g.pathname==="/init"&&u.startsWith(c$1)&&g.searchParams.set("track","1"),h=g.toString(),c=g.searchParams.get("base")??void 0;}else if(r(u)){let g=q(u);g||(b.error(`Invalid preset code: ${a.info(u)}`),b.break(),process.exit(1)),h=fe({...g,base:"radix",rtl:n.rtl??!1},{template:n.template,preset:u}),c=void 0;}else {let g=s.get(u);if(!g)throw new Error(`Unknown preset: ${u}`);h=fe({...g,base:n.base??"radix",rtl:n.rtl??g.rtl},{template:n.template}),c=void 0;}e=[h,...e];}}let m=n.base??c??(l?.style?l.style.startsWith("base-")?"base":"radix":"");if(!m)if(e.length>0)m="radix";else {let u=await Le();m=u,n.base=u;}if(n.defaults&&!e.some(G$1)&&(e=[fe({...B.nova,base:m,rtl:n.rtl??!1},{template:n.template}),...e]),e.length>0&&G$1(e[0])){let u=new URL(e[0]);u.searchParams.set("base",m),e[0]=u.toString();}if(l?.style){let u=await $s(l.style,m);if(u!==m&&(m=u,e.length>0&&G$1(e[0]))){let h=new URL(e[0]);h.searchParams.set("base",u),e[0]=h.toString();}}if(o.length&&(e=[...e,...o]),n.components=e,await K(n.cwd),e.length>0){let u=ie__default.resolve(a$1,"components.json");f&&(r$1=pr(u)??void 0,r$1||b.warn(`Could not back up ${a.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:g,url:w}=await ve(e[0],a$1,{registries:l?.registries});e[0]=w,g||(n.installStyleIndex=!1),h&&(n.registryBaseConfig=h);}await We(n),b.break(),b.log(`Project initialization completed.
|
|
126
|
+
You may now add components.`),process.removeListener("exit",i),mr(ie__default.resolve(a$1,"components.json")),b.break();}catch(n){process.removeListener("exit",i),i(),b.break(),$(n);}finally{V();}});async function We(e){let t,r,o=e.template,i=o?Se(J[o],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&O.existsSync(ie__default.resolve(e.cwd,"package.json")))t=await ra$1(e.cwd);else if(e.skipPreflight)t=await ra$1(e.cwd);else {let x=await bo(e);if(x.errors["1"]){let{projectPath:$,template:v}=await Lt(e);$||process.exit(1),e.cwd=$,e.isNewProject=true,r=v,t=await ra$1(e.cwd);}else t=x.projectInfo;}let s=r??o,c=s?Se(J[s],{monorepo:e.monorepo}):void 0,a$1=[...e.installStyleIndex?["index"]:[],...e.components??[],...c?["button"]:[]];if(c?.init){let x=await c.init({projectPath:e.cwd,components:a$1,registryBaseConfig:e.registryBaseConfig,rtl:e.rtl??false,menuColor:e.menuColor,menuAccent:e.menuAccent,iconLibrary:e.iconLibrary,silent:e.silent});return await c.postInit({projectPath:e.cwd}),x}let f=await sa$1(e.cwd,t),l=f?await Ps(f,e):await Ss(await N(e.cwd));if(!e.yes){let{proceed:x}=await he({type:"confirm",name:"proceed",message:`Write configuration to ${a.info("components.json")}. Proceed?`,initial:true});x||process.exit(1);}let m=await O$1(e.cwd,l),{config:u}=await M(a$1,m,{silent:true});u.registries&&(l.registries=u.registries);let h=w("Writing components.json.").start(),g=ie__default.resolve(e.cwd,"components.json"),w$1=`${g}${Ue}`,C=(x,$)=>{let{registries:v,...L}=Oo(x,$);return {...L,registries:v}};if(O.existsSync(w$1)){let x=await O.readJson(w$1);e.force?x.registries&&(l.registries={...x.registries,...l.registries||{}}):l=C(x,l);}e.registryBaseConfig&&(l=C(l,e.registryBaseConfig)),e.rtl!==void 0&&(l.rtl=e.rtl),l.registries=Object.fromEntries(Object.entries(l.registries||{}).filter(([x])=>!Object.keys(d).includes(x))),await promises.writeFile(g,`${JSON.stringify(l,null,2)}
|
|
127
|
+
`,"utf8"),h.succeed();let k=await O$1(e.cwd,l),E=await P(k);if(E){let x={};if(l.menuColor&&(x.menuColor=l.menuColor),l.menuAccent&&(x.menuAccent=l.menuAccent),l.rtl!==void 0&&(x.rtl=l.rtl),l.iconLibrary&&(x.iconLibrary=l.iconLibrary),Object.keys(x).length>0)for(let $ of Object.keys(E)){let v=E[$];if(v.resolvedPaths.cwd===k.resolvedPaths.cwd)continue;let L=ie__default.resolve(v.resolvedPaths.cwd,"components.json");if(O.existsSync(L)){let be=await O.readJson(L);await O.writeJson(L,{...be,...x},{spaces:2});}}}return M$1.clearCaches(),await ae(a$1,k,{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}),k}async function Ss(e=null){let[t,r]=await Promise.all([fa$1(),ha()]);b.info("");let o=await he([{type:"toggle",name:"typescript",message:`Would you like to use ${a.info("TypeScript")} (recommended)?`,initial:e?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${a.info("style")} would you like to use?`,choices:t.map(i=>({title:i.label,value:i.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${a.info("base color")}?`,choices:r.map(i=>({title:i.label,value:i.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${a.info("global CSS")} file?`,initial:e?.tailwind.css??K$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 o.style||process.exit(1),c.parse({$schema:"https://ui.shadcn.com/schema.json",style:o.style,tailwind:{config:o.tailwindConfig,css:o.tailwindCss,baseColor:o.tailwindBaseColor,cssVariables:o.tailwindCssVariables,prefix:o.tailwindPrefix},rsc:o.rsc,tsx:o.typescript,aliases:{utils:o.utils,components:o.components,lib:o.components.replace(/\/components$/,"lib"),hooks:o.components.replace(/\/components$/,"hooks")}})}async function Ps(e,t){let r=e.style,o="neutral",i=e.tailwind.cssVariables,n=e.iconLibrary??"lucide";if(!t.defaults){let[s,c]=await Promise.all([fa$1(),ta(e)]);r=(await he([{type:c==="v4"||r?null:"select",name:"style",message:`Which ${a.info("style")} would you like to use?`,choices:s.map(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:o,cssVariables:i},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:n,rtl:t.rtl??e?.rtl??false,aliases:e?.aliases})}async function $s(e,t){let r=e.startsWith("base-")?"base":"radix";if(t===r)return t;b.warn(` You are switching from ${a.info(r)} to ${a.info(t)}.`),b.warn(` Components outside the ${a.info("ui")} directory that depend on ${a.info(r)} primitives may need manual updates.`),b.break();let{proceed:o}=await he({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:false});return o?t:r}async function Zo(e){let t={};if(!O.existsSync(e.cwd)||!O.existsSync(ie__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!O.existsSync(ie__default.resolve(e.cwd,"components.json"))){if(await G(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)}.
|
|
128
|
+
Before you can add components, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}async function en(e,t,r={}){let o={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return o;let i=await _$1(e,U(t));if(!i)throw new Error("Failed to fetch components from registry.");r.skipFonts||(i=await et(i,t));let n=Pe([i]);return o.dependencies=Array.from(new Set(i.dependencies??[])),o.devDependencies=Array.from(new Set(i.devDependencies??[])),o.docs=i.docs??null,await Is(i,t,o,r,n),await Es(i,t,o,r),Fs(i,t,o),r.skipFonts||js(i,o),o}async function Is(e,t,r,o,i){let n=e.files;if(!n?.length)return;let[s$1,c]=await Promise.all([ra$1(t.resolvedPaths.cwd),t.tailwind.baseColor?ia(t.tailwind.baseColor):Promise.resolve(void 0)]);for(let a=0;a<n.length;a++){let f$1=n[a];if(!f$1.content)continue;let l=E(f$1,t,{isSrcDir:s$1?.isSrcDir,framework:s$1?.framework.name,commonRoot:F(n.map(k=>k.path),f$1.path),fileIndex:a});if(!l)continue;t.tsx||(l=l.replace(/\.tsx?$/,k=>k===".tsx"?".jsx":".js"));let m=existsSync(l),u=ie__default.relative(t.resolvedPaths.cwd,l),h=f$1.type==="registry:file"||f$1.type==="registry:item",g$1=s(l)||h?f$1.content:await B$1({filename:f$1.path,raw:f$1.content,config:t,baseColor:c,transformJsx:!t.tsx,isRemote:false,supportedFontMarkers:i},[x,y,a$1,A,c$2,g,C,d$1,f,z$2]),w="create",C$1;m&&(C$1=await promises.readFile(l,"utf-8"),r$1(C$1,g$1)?w="skip":w="overwrite"),r.files.push({path:u,action:w,content:g$1,...w==="overwrite"&&{existingContent:C$1},type:f$1.type??"registry:ui"});}}async function Es(e,t,r,o){let i=e.css&&Object.keys(e.css).length>0,n=Object.keys(e.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!i&&!n)return;let s=t.resolvedPaths.tailwindCss,c=existsSync(s),a=ie__default.relative(t.resolvedPaths.cwd,s),f=c?await promises.readFile(s,"utf8"):"",l=f;n&&(l=await Xe(l,e.cssVars,t,{overwriteCssVars:o.overwriteCssVars})),i&&(l=await ar(l,e.css));let m=0;if(e.cssVars)for(let u of Object.values(e.cssVars))u&&(m+=Object.keys(u).length);r.css={path:a,content:l,...c&&{existingContent:f},action:c?"update":"create",cssVarsCount:m};}function Fs(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let o=ie__default.join(t.resolvedPaths.cwd,".env.local"),i=existsSync(o),n=ie__default.relative(t.resolvedPaths.cwd,o);r.envVars={path:n,variables:e.envVars,action:i?"update":"create"};}function js(e,t){if(e.fonts?.length)for(let r of e.fonts)t.fonts.push({name:r.font.family,provider:r.font.provider==="google"?"Google Fonts":r.font.provider});}var ye=5,As=dim("\u250C"+"\u2500".repeat(46)),Os=dim("\u2514"+"\u2500".repeat(46)),_s={create:"+",overwrite:"~",skip:"="},Ds={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function rt(e){return e==="create"?green(e):e==="overwrite"||e==="update"?yellow(e):dim(e)}function ot(e){return `${bold("\u250C")} ${bold(`shadcn add ${e.join(", ")}`)} ${dim("(dry run)")}`}function on(e,t){return e===t||e.includes(t)||e.endsWith(t)}function Ee(e,t,r=o=>o){e.push(`${dim("\u2502")} ${As}`);for(let o of t)e.push(`${dim("\u2502")} ${dim("\u2502")} ${r(o)}`);e.push(`${dim("\u2502")} ${Os}`);}function nn(e,t,r={}){return r.diff?typeof r.diff=="string"?Vs(e,t,r.diff):Ms(e,t):r.view?typeof r.view=="string"?Ws(e,t,r.view):Us(e,t):Ls(e,t)}function Ls(e,t){let r=[];r.push(ot(t)),r.push(dim("\u2502")),Bs(e,r),tn("Dependencies",e.dependencies,r),tn("Dev Dependencies",e.devDependencies,r),zs(e,r),Js(e,r),Gs(e,r);let o=e.files.filter(n=>n.action==="overwrite").length;o>0&&(r.push(yellow(`\u26A0 ${o} ${o===1?"file":"files"} will be overwritten.`)),r.push(dim("\u2502")));let i=[];return e.files.length>0&&i.push(`${e.files.length} ${e.files.length===1?"file":"files"}`),e.dependencies.length>0&&i.push(`${e.dependencies.length} ${e.dependencies.length===1?"dep":"deps"}`),e.css?.cssVarsCount&&i.push(`${e.css.cssVarsCount} CSS vars`),i.length>0&&(r.push(`${dim("\u2502")} ${dim(i.join(", "))}`),r.push(dim("\u2502"))),r.push(`${dim("\u2502")} ${dim("Run with --diff to view changes.")}`),r.push(`${dim("\u2502")} ${dim("Run with --view to view file contents.")}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
|
|
129
|
+
`)}function Vs(e,t,r){let o=[];o.push(ot(t)),o.push(dim("\u2502"));let i=an(e.files,r),n=e.css&&on(e.css.path,r);if(i.length===0&&!n)o.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),o.push(dim("\u2502"));else {for(let s of i)sn(s,o);if(n&&e.css){if(o.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${rt(e.css.action)}${dim(")")}`),e.css.action==="create"||!e.css.existingContent)Ee(o,e.css.content.split(`
|
|
130
|
+
`),s=>green(`+${s}`));else {let s=cn(e.css.existingContent,e.css.content,e.css.path,{fullContext:true});Ee(o,s);}o.push(dim("\u2502"));}}return o.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),o.join(`
|
|
131
|
+
`)}function Ms(e,t){let r=[];r.push(ot(t)),r.push(dim("\u2502"));let o=e.files.slice(0,ye);if(o.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No changes.")}`),r.push(dim("\u2502"));else {for(let s of o)sn(s,r);e.files.length>ye&&r.push(dim("\u2502"));}let i=e.files.length;return i>ye&&r.push(` ${dim(`Showing ${ye} of ${i} files. Use --diff <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
|
|
132
|
+
`)}function Us(e,t){let r=[];r.push(ot(t)),r.push(dim("\u2502"));let o=e.files.slice(0,ye);if(o.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No files.")}`),r.push(dim("\u2502"));else {for(let s of o){let c=s.content.split(`
|
|
133
|
+
`);r.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${rt(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),Ee(r,c),r.push(dim("\u2502"));}e.files.length>ye&&r.push(dim("\u2502"));}let i=e.files.length;return i>ye&&r.push(` ${dim(`Showing ${ye} of ${i} files. Use --view <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
|
|
134
|
+
`)}function sn(e,t){if(t.push(`${dim("\u251C")} ${bold(e.path)} ${dim("(")}${rt(e.action)}${dim(")")}`),e.action==="skip")t.push(`${dim("\u2502")} ${dim("No changes.")}`);else if(e.action==="create")Ee(t,e.content.split(`
|
|
135
|
+
`),r=>green(`+${r}`));else {let r=cn(e.existingContent,e.content,e.path);Ee(t,r);}t.push(dim("\u2502"));}function Ws(e,t,r){let o=[];o.push(ot(t)),o.push(dim("\u2502"));let i=an(e.files,r),n=e.css&&on(e.css.path,r);if(i.length===0&&!n)o.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),o.push(dim("\u2502"));else {for(let s of i){let c=s.content.split(`
|
|
136
|
+
`);o.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${rt(s.action)}${dim(")")} ${dim(`${c.length} lines`)}`),Ee(o,c),o.push(dim("\u2502"));}if(n&&e.css){let s=e.css.content.split(`
|
|
137
|
+
`);o.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${rt(e.css.action)}${dim(")")} ${dim(`${s.length} lines`)}`),Ee(o,s),o.push(dim("\u2502"));}}return o.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),o.join(`
|
|
138
|
+
`)}function Bs(e,t){if(e.files.length===0)return;let r={create:0,overwrite:0,skip:0};for(let s of e.files)r[s.action]++;let o=[];r.create>0&&o.push(green(`+${r.create} new`)),r.overwrite>0&&o.push(yellow(`~${r.overwrite} overwrite`)),r.skip>0&&o.push(dim(`=${r.skip} skip`));let i=o.length>0?` ${o.join(dim(", "))}`:"";t.push(`${dim("\u251C")} ${bold("Files")} ${dim(`(${e.files.length})`)}${i}`);let n=Math.max(...e.files.map(s=>s.path.length));for(let s of e.files){let c=_s[s.action],a=Ds[s.action],f=" ".repeat(Math.max(1,n-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 tn(e,t,r){if(t.length){r.push(`${dim("\u251C")} ${bold(e)} ${dim(`(${t.length})`)}`);for(let o of t)r.push(`${dim("\u2502")} ${green("+")} ${o}`);r.push(dim("\u2502"));}}function zs(e,t){e.css&&(t.push(`${dim("\u251C")} ${bold("CSS")}`),e.css.cssVarsCount>0?t.push(`${dim("\u2502")} ${green("+")} ${e.css.cssVarsCount} CSS variables added to ${cyan(e.css.path)}`):t.push(`${dim("\u2502")} ${green("+")} Updated ${cyan(e.css.path)}`),t.push(dim("\u2502")));}function Js(e,t){if(!e.envVars)return;let r=Object.keys(e.envVars.variables);t.push(`${dim("\u251C")} ${bold("Environment Variables")}`);for(let o of r)t.push(`${dim("\u2502")} ${green("+")} ${o}`);t.push(dim("\u2502"));}function Gs(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(o=>o.path===t);return r.length>0?r:e.filter(o=>o.path.includes(t)||o.path.replace(/\\/g,"/").includes(t))}function cn(e,t,r,o={}){if(Xs(e,t))return [dim(" Formatting-only changes (spacing, quotes, semicolons).")];let i=rn(e),n=rn(t),s=o.fullContext?Math.max(i.split(`
|
|
139
|
+
`).length,n.split(`
|
|
140
|
+
`).length):3,c=structuredPatch(`a/${r}`,`b/${r}`,i,n,"","",{context:s});if(!c.hunks.length)return [dim(" No changes.")];let a=[dim(`--- a/${r}`),dim(`+++ b/${r}`)],f=t.split(`
|
|
141
|
+
`);for(let l of c.hunks){let{entries:m}=Hs(l,f);if(!m.some(C=>C.kind!=="context"))continue;let h=m.filter(C=>C.kind==="context").length,g=m.filter(C=>C.kind==="removed").length,w=m.filter(C=>C.kind==="added").length;a.push(cyan(`@@ -${l.oldStart},${h+g} +${l.newStart},${h+w} @@`));for(let C of m)a.push(C.formatted);}return a}function Hs(e,t){let r=[],o=e.newStart-1,i=0;for(;i<e.lines.length;){let n=e.lines[i];if(n.startsWith("-")){let s=[];for(;i<e.lines.length&&e.lines[i].startsWith("-");)s.push(e.lines[i].slice(1)),i++;for(;i<e.lines.length&&e.lines[i].startsWith("\\");)i++;let c=[];for(;i<e.lines.length&&e.lines[i].startsWith("+");)c.push(e.lines[i].slice(1)),i++;for(;i<e.lines.length&&e.lines[i].startsWith("\\");)i++;o=Ys(s,c,t,o,r);}else if(n.startsWith("+")){let s=t[o]??n.slice(1);r.push({kind:"added",formatted:green(`+${s}`)}),o++,i++;}else if(n.startsWith("\\"))i++;else {let s=t[o]??n.slice(1);r.push({kind:"context",formatted:dim(` ${s}`)}),o++,i++;}}return {entries:r,newLineIndex:o}}function Ys(e,t,r,o,i){if(Zs(e,t)){for(let a=0;a<t.length;a++){let f=r[o]??t[a];i.push({kind:"context",formatted:dim(` ${f}`)}),o++;}return o}let n=Ks(e),s=n.map(Ut),c=new Set;for(let a=0;a<t.length;a++){let f=r[o]??t[a],l=Ut(t[a]),m=s.findIndex((u,h)=>!c.has(h)&&u===l);if(m!==-1)c.add(m),i.push({kind:"context",formatted:dim(` ${f}`)});else {let u=s.findIndex((h,g)=>!c.has(g));if(u!==-1){c.add(u);let{oldHighlighted:h,newHighlighted:g}=qs(n[u],f);i.push({kind:"removed",formatted:h}),i.push({kind:"added",formatted:g});}else i.push({kind:"added",formatted:green(`+${f}`)});}o++;}for(let a=0;a<n.length;a++)c.has(a)||i.push({kind:"removed",formatted:red(`-${n[a]}`)});return o}function rn(e){return e.split(`
|
|
142
|
+
`).map(t=>{let r=t.match(/^(\s*)/)?.[1]??"",o=t.slice(r.length);return r+o.replace(/['"]/g,'"').replace(/;$/g,"")}).join(`
|
|
143
|
+
`)}function Ks(e){let t=[];for(let r=0;r<e.length;r++){let o=e[r];for(;r+1<e.length&&o.trimEnd().endsWith(":");)r++,o=o.trimEnd()+" "+e[r].trim();t.push(o);}return t}function qs(e,t){let r=diffWords(e,t),o="-",i="+";for(let n of r)n.added?i+=bold(green(n.value)):n.removed?o+=bold(red(n.value)):(o+=red(n.value),i+=green(n.value));return {oldHighlighted:o,newHighlighted:i}}function Ut(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function Xs(e,t){let r=o=>o.split(`
|
|
144
|
+
`).map(Ut).filter(i=>i.length>0).join(" ");return r(e)===r(t)}function Zs(e,t){let r=o=>o.map(Ut).filter(i=>i.length>0).join(" ");return r(e)===r(t)}async function fn(e,t){let r=ie__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await Fe__default.stat(r)).isFile())return;let[o]=await ba([e],{config:t});if(!o?.meta?.importSpecifier||!o?.meta?.moduleSpecifier)return;let i=`import { ${o?.meta?.importSpecifier} } from "${o.meta.moduleSpecifier}"
|
|
145
145
|
|
|
146
146
|
export default function Page() {
|
|
147
|
-
return <${
|
|
148
|
-
}`;await
|
|
149
|
-
Existing CSS variables and components will be overwritten. Continue?`)});w||(b.break(),b.log("Installation cancelled."),b.break(),process.exit(1));}}r.components?.length||(r.components=await
|
|
150
|
-
Before you can apply a preset, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}var
|
|
147
|
+
return <${o?.meta?.importSpecifier} />
|
|
148
|
+
}`;await Fe__default.writeFile(r,i,"utf8");}var ra=z$1.object({components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),overwrite:z$1.boolean(),cwd:z$1.string(),all:z$1.boolean(),path:z$1.string().optional(),silent:z$1.boolean(),dryRun:z$1.boolean(),diff:z$1.union([z$1.string(),z$1.literal(true)]).optional(),view:z$1.union([z$1.string(),z$1.literal(true)]).optional()}),pn=new Command().name("add").description("add a component to your project").argument("[components...]","names, url or local path to component").option("-y, --yes","skip confirmation prompt.",false).option("-o, --overwrite","overwrite existing files.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",false).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",false).option("--dry-run","preview changes without writing files.",false).option("--diff [path]","show diff for a file.").option("--view [path]","show file contents.").action(async(e$1,t)=>{try{let r=ra.parse({components:e$1,...t,cwd:ie__default.resolve(t.cwd)});await K(r.cwd);let o=r.dryRun||r.diff||r.view,i=await N(r.cwd);i||(i=T({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let n=!1;if(e$1.length>0){let{config:g,newRegistries:w}=await M(e$1,i,{silent:r.silent,writeFile:!1});i=g,n=w.length>0;}let s,c=!0;if(e$1.length>0){let[g]=await ba([e$1[0]],{config:i});if(s=g?.type,c=s!=="registry:theme"&&s!=="registry:style"&&s!=="registry:base",H$1(g)&&!o){await ae(e$1,i,r);return}if(!r.yes&&!o&&(s==="registry:style"||s==="registry:theme")){b.break();let{confirm:w}=await he({type:"confirm",name:"confirm",message:a.warn(`You are about to install a new ${s.replace("registry:","")}.
|
|
149
|
+
Existing CSS variables and components will be overwritten. Continue?`)});w||(b.break(),b.log("Installation cancelled."),b.break(),process.exit(1));}}r.components?.length||(r.components=await oa(r));let a$1=await ra$1(r.cwd);if(a$1?.tailwindVersion==="v4"){let g=e.filter(w=>r.components?.includes(w.name));g?.length&&(b.break(),g.forEach(w=>{b.warn(a.warn(w.message));}),b.break(),process.exit(1));}let{errors:f,config:l}=await Zo(r),m=!1;if(f["3"]){let{proceed:g}=await he({type:"confirm",name:"proceed",message:`You need to create a ${a.info("components.json")} file to add components. Proceed?`,initial:!0});g||(b.break(),process.exit(1));let w=Me(a$1?.framework.name),C=await Le(),{url:k}=await qe({rtl:!1,base:C,template:w}),{registryBaseConfig:E,installStyleIndex:x,url:$}=await ve(k,r.cwd);l=await We({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!n,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:x,components:[$,...r.components??[]],registryBaseConfig:E}),m=!0;}let u=!1;if(f["1"]){let{projectPath:g,template:w}=await Lt({cwd:r.cwd,force:r.overwrite,components:r.components});g||(b.break(),process.exit(1)),r.cwd=g;let C=await Le(),{url:k}=await qe({rtl:!1,base:C,template:w}),{registryBaseConfig:E,installStyleIndex:x,url:$}=await ve(k,r.cwd);l=await We({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!n&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:x,components:[$,...r.components??[]],registryBaseConfig:E}),m=!0,u=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//);}if(!l)throw new Error(`Failed to read config at ${a.info(r.cwd)}.`);let{config:h}=await M(r.components,l,{silent:r.silent||n,writeFile:!o});if(l=h,o){let g=w("Resolving items.",{silent:r.silent}).start(),w$1=await en(r.components,l,{overwrite:r.overwrite});g.stop(),b.log(nn(w$1,r.components,{diff:r.diff,view:r.view}));return}m||await ae(r.components,l,r),u&&await fn(r.components[0],l);}catch(r){b.break(),$(r);}finally{V();}});async function oa(e$1){let t=await ea();if(!t)return b.break(),$(new Error("Failed to fetch registry index.")),[];if(e$1.all)return t.map(i=>i.name).filter(i=>!e.some(n=>n.name===i));if(e$1.components?.length)return e$1.components;let{components:r}=await he({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:t.filter(i=>i.type==="registry:ui"&&!e.some(n=>n.name===i.name)).map(i=>({title:i.name,value:i.name,selected:e$1.all?true:e$1.components?.includes(i.name)}))});r?.length||(b.warn("No components selected. Exiting."),b.info(""),process.exit(1));let o=z$1.array(z$1.string()).safeParse(r);return o.success?o.data:(b.error(""),$(new Error("Something went wrong. Please try again.")),[])}async function un(e){let t={};if(!O.existsSync(e.cwd)||!O.existsSync(ie__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!O.existsSync(ie__default.resolve(e.cwd,"components.json"))){if(await G(e.cwd)){let r=await H(e.cwd);r.length>0&&(Y("apply --preset <preset>",r,{cwdFlag:"-c"}),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await N(e.cwd);return {errors:t,config:r}}catch{b.break(),b.error(`An invalid ${a.info("components.json")} file was found at ${a.info(e.cwd)}.
|
|
150
|
+
Before you can apply a preset, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}var sa=z$1.object({cwd:z$1.string(),positionalPreset:z$1.string().optional(),preset:z$1.string().optional(),yes:z$1.boolean(),silent:z$1.boolean()}),hn=new Command().name("apply").description("apply a preset to an existing project").argument("[preset]","the preset to apply").option("--preset <preset>","preset configuration to apply").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e,t)=>{try{let r=sa.parse({...t,cwd:ie__default.resolve(t.cwd),positionalPreset:e}),o=aa(r),i=await un(r);i.errors["1"]&&(b.break(),b.error(`The ${a.info("apply")} command only works in an existing project.`),b.error(`Run ${a.info(gn(o))} first.`),b.break(),process.exit(1)),i.errors["3"]&&(b.break(),b.error(`No ${a.info("components.json")} found at ${a.info(r.cwd)}.`),b.error(`Run ${a.info(gn(o))} first.`),b.break(),process.exit(1));let n=i.config;n||process.exit(1);let s=n.rtl??!1,c=await la(r.cwd);if(!o){let m=ir({command:"init",template:c,base:S(n.style),rtl:s});await sr({createUrl:m,followUp:`Then run ${a.info("shadcn apply --preset <preset>")} with the preset code or preset URL from ui.shadcn.com.`,prompt:!r.yes}),process.exit(0);}ca(o);let a$1=await ua$1(r.cwd);if(!r.yes){if(b.break(),b.warn(a.warn("Applying a new preset will overwrite existing UI components, fonts, and CSS variables.")),b.warn("Commit or stash your changes before continuing so you can easily go back."),b.break(),b.log(" The following components will be re-installed:"),a$1.length)for(let u=0;u<a$1.length;u+=8)b.log(` - ${a$1.slice(u,u+8).join(", ")}`);else b.log(" - No installed UI components were detected.");b.break();let{proceed:m}=await he({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});m||(b.break(),process.exit(1));}await K(r.cwd);let f=S(n.style),l=fa(o,f,{template:c,rtl:s});await Ko(ie__default.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:m,installStyleIndex:u,url:h}=await ve(l,r.cwd,{registries:n.registries});await We({cwd:r.cwd,yes:!0,force:!1,reinstall:!0,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:u,registryBaseConfig:m,existingConfig:n,components:[h,...a$1]});},{onBackupFailure:()=>{b.error(`Could not back up ${a.info("components.json")}. Aborting.`);}}),b.break(),b.log("Preset applied successfully."),b.break();}catch(r){b.break(),$(r);}finally{V();}});function aa(e){let t=e.positionalPreset?.trim(),r=e.preset?.trim();return t&&r&&t!==r&&(b.error(`Received two different preset values. Use either the positional preset or ${a.info("--preset")}, or pass the same value to both.`),b.break(),process.exit(1)),r??t}function ca(e){if(G$1(e)||r(e))return;let t=Object.keys(B);t.includes(e)||(b.error(`Invalid preset: ${a.info(e)}.
|
|
151
151
|
Use one of the available presets: ${t.join(", ")}
|
|
152
|
-
or build your own at ${a.info(`${c$1}/create`)}`),b.break(),process.exit(1));}async function Ns(e){let t=await ra$1(e);return _e(t?.framework.name)}function Ts(e,t,r$1={}){if(G$1(e)){let i=new URL(e);return i.pathname==="/init"&&e.startsWith(c$1)&&i.searchParams.set("track","1"),i.searchParams.set("base",t),i.searchParams.set("rtl",String(r$1.rtl??false)),i.toString()}if(r(e)){let i=q(e);return i||(b.error(`Invalid preset code: ${a.info(e)}`),b.break(),process.exit(1)),fe({...i,base:t,rtl:r$1.rtl??false},{preset:e,template:r$1.template})}let n=le[e];return fe({...n,base:t,rtl:r$1.rtl??n.rtl},{template:r$1.template})}function As(e){return /[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function Xn(e){return e?`shadcn init --preset ${As(e)}`:"shadcn init"}async function ro(e){let t={},r={cwd:e.cwd,registryFile:oe__default.resolve(e.cwd,e.registryFile),outputDir:oe__default.resolve(e.cwd,e.outputDir)};return A.existsSync(r.registryFile)||(t["13"]=true),await A.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(b.break(),b.error(`The path ${a.info(r.registryFile)} does not exist.`)),b.break(),process.exit(1)),{errors:t,resolvePaths:r}}var Ls=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),no=new Command().name("build").description("build components for a shadcn registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Ls.parse({cwd:oe.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:n$1}=await ro(r),i=await je.readFile(n$1.registryFile,"utf-8"),o$1=o.safeParse(JSON.parse(i));o$1.success||(b.error(`Invalid registry file found at ${a.info(n$1.registryFile)}.`),process.exit(1));let s=w("Building registry...");for(let c of o$1.data.items){s.start(`Building ${c.name}...`),c.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let p of c.files??[])p.content=await je.readFile(oe.resolve(n$1.cwd,p.path),"utf-8");let a$1=n.safeParse(c);if(!a$1.success){b.error(`Invalid registry item found for ${a.info(c.name)}.`);continue}await je.writeFile(oe.resolve(n$1.outputDir,`${a$1.data.name}.json`),JSON.stringify(a$1.data,null,2));}await je.copyFile(n$1.registryFile,oe.resolve(n$1.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){b.break(),$(r);}});var Us=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),io=new Command().name("diff").description("[DEPRECATED] Use `add [component] --diff` instead.").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Us.parse({component:e,...t}),n=oe__default.resolve(r.cwd);existsSync(n)||(b.error(`The path ${n} does not exist. Please try again.`),process.exit(1));let i=await N(n);if(!i){if(await J(n)){let a=await G(n);a.length>0&&(H("diff [component]",a),process.exit(1));}b.warn(`Configuration is missing. Please run ${a.success("init")} to create a components.json file.`),process.exit(1);}let o=await ea();if(o||($(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a$1=i.resolvedPaths.components,p=o.filter(d=>{for(let m of d.files??[]){let h=oe__default.resolve(a$1,typeof m=="string"?m:m.path);if(existsSync(h))return !0}return !1}),l=[];for(let d of p){let m=await oo(d,i);m.length&&l.push({name:d.name,changes:m});}l.length||(b.info("No updates found."),process.exit(0)),b.info("The following components have updates available:");for(let d of l){b.info(`- ${d.name}`);for(let m of d.changes)b.info(` - ${m.filePath}`);}b.break(),b.info(`Run ${a.success("diff <component>")} to see the changes.`),process.exit(0);}let s=o.find(a=>a.name===r.component);s||(b.error(`The component ${a.success(r.component)} does not exist.`),process.exit(1));let c=await oo(s,i);c.length||(b.info(`No updates found for ${r.component}.`),process.exit(0));for(let a of c)b.info(`- ${a.filePath}`),await Ws(a.patch),b.info("");}catch(r){$(r);}});async function oo(e,t){let r=await ka$1(t.style,[e]),n=await ia(t.tailwind.baseColor),i=ke(r);if(!r)return [];let o=[];for(let s of r){let c=await la(t,s);if(c)for(let a of s.files??[]){let p=oe__default.resolve(c,typeof a=="string"?a:a.path);if(!existsSync(p))continue;let l=await promises.readFile(p,"utf8");if(typeof a=="string"||!a.content)continue;let d=await B$1({filename:a.path,raw:a.content,config:t,baseColor:n,supportedFontMarkers:i},[x,y,a$1,A$1,c$2,g,d$1,f,z$2]),m=diffLines(d,l);m.length>1&&o.push({filePath:p,patch:m});}}return o}async function Ws(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(a.success(t.value)):t.removed?process.stdout.write(a.error(t.value)):process.stdout.write(t.value)});}var so=new Command().name("docs").description("get docs, api references and usage examples for components").argument("<components...>","component names").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-b, --base <base>","the base to use either 'base' or 'radix'. defaults to project base.").option("--json","output as JSON.",false).action(async(e,t)=>{try{let r=oe__default.resolve(t.cwd),n=await N(r),i=t.base??S(n?.style),o=await ea();o||(b.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let a$1 of e){let p=o.find(d=>d.name===a$1);p||(b.error(`Component ${a.info(a$1)} not found in the shadcn registry.`),process.exit(1));let l=p.meta?.links?.[i];if(!l||Object.keys(l).length===0){b.warn(`No documentation links available for ${a.info(a$1)}.`);continue}s.push({component:a$1,base:i,links:l});}if(t.json){console.log(JSON.stringify({base:i,results:s},null,2));return}let c=Math.max(...s.flatMap(a=>Object.keys(a.links).map(p=>p.length)));for(let{component:a$1,links:p}of s){b.log(a.info(a$1));for(let[l,d]of Object.entries(p))b.log(` - ${l.padEnd(c+2)}${d}`);b.break();}}catch(r){$(r);}});var co="https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases",lo=new Command().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",false).action(async e=>{try{let t=oe__default.resolve(e.cwd);if(!existsSync(oe__default.resolve(t,"components.json"))&&await J(t)){let c=await G(t);c.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running info from a monorepo root. Use the -c flag to specify a workspace.",targets:c.map(a=>a.name)},null,2)):H("info",c),process.exit(1));}let r=await ra$1(t),n=await N(t),i=await ua$1(t),o=S(n?.style),s=Ys(r,n,i,o);if(e.json){console.log(JSON.stringify(s,null,2));return}Ks(s);}catch(t){$(t);}});function Hs(e){if(!e)return {};let t={};for(let[r,n]of Object.entries(e))t[r]=typeof n=="string"?n:n.url;return t}function Ys(e,t,r,n){return {project:e?{framework:e.framework.label,frameworkName:e.framework.name,frameworkVersion:e.frameworkVersion??null,srcDirectory:e.isSrcDir,rsc:e.isRSC,typescript:e.isTsx,tailwindVersion:e.tailwindVersion??null,tailwindConfig:e.tailwindConfigFile??null,tailwindCss:e.tailwindCssFile??null,importAlias:e.aliasPrefix??null}:null,config:t?{style:t.style,base:n,rsc:t.rsc,typescript:t.tsx,iconLibrary:t.iconLibrary??null,rtl:t.rtl??false,menuColor:t.menuColor??null,menuAccent:t.menuAccent??null,aliases:{components:t.aliases.components,utils:t.aliases.utils,ui:t.aliases.ui??null,lib:t.aliases.lib??null,hooks:t.aliases.hooks??null},resolvedPaths:{cwd:t.resolvedPaths.cwd,tailwindConfig:t.resolvedPaths.tailwindConfig||null,tailwindCss:t.resolvedPaths.tailwindCss||null,utils:t.resolvedPaths.utils,components:t.resolvedPaths.components,lib:t.resolvedPaths.lib,hooks:t.resolvedPaths.hooks,ui:t.resolvedPaths.ui},registries:Hs(t.registries)}:null,components:r,links:{docs:`${c$1}/docs`,components:`${c$1}/docs/components/${n}/[component].md`,ui:`${co}/${n}/ui/[component].tsx`,examples:`${co}/${n}/examples/[component]-example.tsx`,schema:"https://ui.shadcn.com/schema.json"}}}function Ks(e){b.log(a.info("Project")),e.project?Be({framework:`${e.project.framework} (${e.project.frameworkName})`,frameworkVersion:e.project.frameworkVersion??"-",srcDirectory:e.project.srcDirectory?"Yes":"No",rsc:e.project.rsc?"Yes":"No",typescript:e.project.typescript?"Yes":"No",tailwindVersion:e.project.tailwindVersion??"-",tailwindConfig:e.project.tailwindConfig??"-",tailwindCss:e.project.tailwindCss??"-",importAlias:e.project.importAlias??"-"}):b.log(" No project info detected."),b.break(),b.log(a.info("Configuration")),e.config?(Be({style:e.config.style,base:e.config.base,rsc:e.config.rsc?"Yes":"No",typescript:e.config.typescript?"Yes":"No",iconLibrary:e.config.iconLibrary??"-",rtl:e.config.rtl?"Yes":"No",menuColor:e.config.menuColor??"-",menuAccent:e.config.menuAccent??"-"}),b.break(),b.log(a.info("Aliases")),Be({components:e.config.aliases.components,utils:e.config.aliases.utils,ui:e.config.aliases.ui??"-",lib:e.config.aliases.lib??"-",hooks:e.config.aliases.hooks??"-"}),b.break(),b.log(a.info("Resolved Paths")),Be({cwd:e.config.resolvedPaths.cwd,tailwindConfig:e.config.resolvedPaths.tailwindConfig??"-",tailwindCss:e.config.resolvedPaths.tailwindCss??"-",utils:e.config.resolvedPaths.utils,components:e.config.resolvedPaths.components,lib:e.config.resolvedPaths.lib,hooks:e.config.resolvedPaths.hooks,ui:e.config.resolvedPaths.ui}),Object.keys(e.config.registries).length>0&&(b.break(),b.log("registries:"),Be(e.config.registries))):b.log(" No components.json found."),b.break(),b.log(a.info("Installed Components")),e.components.length>0?b.log(` ${e.components.join(", ")}`):b.log(" No components installed."),b.break(),b.log(a.info("Links")),Be(e.links),b.break();}function Be(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,n]of Object.entries(e))b.log(` ${r.padEnd(t+2)}${n}`);}var Ee="latest",Ut=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Ee}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Ee}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${Ee}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
|
|
152
|
+
or build your own at ${a.info(`${c$1}/create`)}`),b.break(),process.exit(1));}async function la(e){let t=await ra$1(e);return Me(t?.framework.name)}function fa(e,t,r$1={}){if(G$1(e)){let i=new URL(e);return i.pathname==="/init"&&e.startsWith(c$1)&&i.searchParams.set("track","1"),i.searchParams.set("base",t),i.searchParams.set("rtl",String(r$1.rtl??false)),i.toString()}if(r(e)){let i=q(e);return i||(b.error(`Invalid preset code: ${a.info(e)}`),b.break(),process.exit(1)),fe({...i,base:t,rtl:r$1.rtl??false},{preset:e,template:r$1.template})}let o=B[e];return fe({...o,base:t,rtl:r$1.rtl??o.rtl},{template:r$1.template})}function pa(e){return /[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function gn(e){return e?`shadcn init --preset ${pa(e)}`:"shadcn init"}async function bn(e){let t={},r={cwd:e.cwd,registryFile:ie__default.resolve(e.cwd,e.registryFile),outputDir:ie__default.resolve(e.cwd,e.outputDir)};return O.existsSync(r.registryFile)||(t["13"]=true),await O.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(b.break(),b.error(`The path ${a.info(r.registryFile)} does not exist.`)),b.break(),process.exit(1)),{errors:t,resolvePaths:r}}var ua=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),xn=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=ua.parse({cwd:ie.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:o$1}=await bn(r),i=await Fe.readFile(o$1.registryFile,"utf-8"),n$1=o.safeParse(JSON.parse(i));n$1.success||(b.error(`Invalid registry file found at ${a.info(o$1.registryFile)}.`),process.exit(1));let s=w("Building registry...");for(let c of n$1.data.items){s.start(`Building ${c.name}...`),c.$schema="https://ui.shadcn.com/schema/registry-item.json";for(let f of c.files??[])f.content=await Fe.readFile(ie.resolve(o$1.cwd,f.path),"utf-8");let a$1=n.safeParse(c);if(!a$1.success){b.error(`Invalid registry item found for ${a.info(c.name)}.`);continue}await Fe.writeFile(ie.resolve(o$1.outputDir,`${a$1.data.name}.json`),JSON.stringify(a$1.data,null,2));}await Fe.copyFile(o$1.registryFile,ie.resolve(o$1.outputDir,"registry.json")),s.succeed("Building registry.");}catch(r){b.break(),$(r);}});var ya=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),vn=new Command().name("diff").description("[DEPRECATED] Use `add [component] --diff` instead.").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=ya.parse({component:e,...t}),o=ie__default.resolve(r.cwd);existsSync(o)||(b.error(`The path ${o} does not exist. Please try again.`),process.exit(1));let i=await N(o);if(!i){if(await G(o)){let a=await H(o);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 n=await ea();if(n||($(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a$1=i.resolvedPaths.components,f=n.filter(m=>{for(let u of m.files??[]){let h=ie__default.resolve(a$1,typeof u=="string"?u:u.path);if(existsSync(h))return !0}return !1}),l=[];for(let m of f){let u=await Cn(m,i);u.length&&l.push({name:m.name,changes:u});}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 u of m.changes)b.info(` - ${u.filePath}`);}b.break(),b.info(`Run ${a.success("diff <component>")} to see the changes.`),process.exit(0);}let s=n.find(a=>a.name===r.component);s||(b.error(`The component ${a.success(r.component)} does not exist.`),process.exit(1));let c=await Cn(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 wa(a.patch),b.info("");}catch(r){$(r);}});async function Cn(e,t){let r=await ka(t.style,[e]),o=await ia(t.tailwind.baseColor),i=Pe(r);if(!r)return [];let n=[];for(let s of r){let c=await la$1(t,s);if(c)for(let a of s.files??[]){let f$1=ie__default.resolve(c,typeof a=="string"?a:a.path);if(!existsSync(f$1))continue;let l=await promises.readFile(f$1,"utf8");if(typeof a=="string"||!a.content)continue;let m=await B$1({filename:a.path,raw:a.content,config:t,baseColor:o,supportedFontMarkers:i},[x,y,a$1,A,c$2,g,d$1,f,z$2]),u=diffLines(m,l);u.length>1&&n.push({filePath:f$1,patch:u});}}return n}async function wa(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 Rn=new Command().name("docs").description("get docs, api references and usage examples for components").argument("<components...>","component names").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-b, --base <base>","the base to use either 'base' or 'radix'. defaults to project base.").option("--json","output as JSON.",false).action(async(e,t)=>{try{let r=ie__default.resolve(t.cwd),o=await N(r),i=t.base??S(o?.style),n=await ea();n||(b.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let a$1 of e){let f=n.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 xa=["50","100","200","300","400","500","600","700","800","900","950"],Ca=["red","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose","slate","gray","zinc","neutral","stone","mauve","olive","mist","taupe"];function va(e){return JSON.parse(e)}var Ra=va(String.raw`{
|
|
153
|
+
"red": {
|
|
154
|
+
"50": "oklch(97.1% 0.013 17.38)",
|
|
155
|
+
"100": "oklch(93.6% 0.032 17.717)",
|
|
156
|
+
"200": "oklch(88.5% 0.062 18.334)",
|
|
157
|
+
"300": "oklch(80.8% 0.114 19.571)",
|
|
158
|
+
"400": "oklch(70.4% 0.191 22.216)",
|
|
159
|
+
"500": "oklch(63.7% 0.237 25.331)",
|
|
160
|
+
"600": "oklch(57.7% 0.245 27.325)",
|
|
161
|
+
"700": "oklch(50.5% 0.213 27.518)",
|
|
162
|
+
"800": "oklch(44.4% 0.177 26.899)",
|
|
163
|
+
"900": "oklch(39.6% 0.141 25.723)",
|
|
164
|
+
"950": "oklch(25.8% 0.092 26.042)"
|
|
165
|
+
},
|
|
166
|
+
"orange": {
|
|
167
|
+
"50": "oklch(98% 0.016 73.684)",
|
|
168
|
+
"100": "oklch(95.4% 0.038 75.164)",
|
|
169
|
+
"200": "oklch(90.1% 0.076 70.697)",
|
|
170
|
+
"300": "oklch(83.7% 0.128 66.29)",
|
|
171
|
+
"400": "oklch(75% 0.183 55.934)",
|
|
172
|
+
"500": "oklch(70.5% 0.213 47.604)",
|
|
173
|
+
"600": "oklch(64.6% 0.222 41.116)",
|
|
174
|
+
"700": "oklch(55.3% 0.195 38.402)",
|
|
175
|
+
"800": "oklch(47% 0.157 37.304)",
|
|
176
|
+
"900": "oklch(40.8% 0.123 38.172)",
|
|
177
|
+
"950": "oklch(26.6% 0.079 36.259)"
|
|
178
|
+
},
|
|
179
|
+
"amber": {
|
|
180
|
+
"50": "oklch(98.7% 0.022 95.277)",
|
|
181
|
+
"100": "oklch(96.2% 0.059 95.617)",
|
|
182
|
+
"200": "oklch(92.4% 0.12 95.746)",
|
|
183
|
+
"300": "oklch(87.9% 0.169 91.605)",
|
|
184
|
+
"400": "oklch(82.8% 0.189 84.429)",
|
|
185
|
+
"500": "oklch(76.9% 0.188 70.08)",
|
|
186
|
+
"600": "oklch(66.6% 0.179 58.318)",
|
|
187
|
+
"700": "oklch(55.5% 0.163 48.998)",
|
|
188
|
+
"800": "oklch(47.3% 0.137 46.201)",
|
|
189
|
+
"900": "oklch(41.4% 0.112 45.904)",
|
|
190
|
+
"950": "oklch(27.9% 0.077 45.635)"
|
|
191
|
+
},
|
|
192
|
+
"yellow": {
|
|
193
|
+
"50": "oklch(98.7% 0.026 102.212)",
|
|
194
|
+
"100": "oklch(97.3% 0.071 103.193)",
|
|
195
|
+
"200": "oklch(94.5% 0.129 101.54)",
|
|
196
|
+
"300": "oklch(90.5% 0.182 98.111)",
|
|
197
|
+
"400": "oklch(85.2% 0.199 91.936)",
|
|
198
|
+
"500": "oklch(79.5% 0.184 86.047)",
|
|
199
|
+
"600": "oklch(68.1% 0.162 75.834)",
|
|
200
|
+
"700": "oklch(55.4% 0.135 66.442)",
|
|
201
|
+
"800": "oklch(47.6% 0.114 61.907)",
|
|
202
|
+
"900": "oklch(42.1% 0.095 57.708)",
|
|
203
|
+
"950": "oklch(28.6% 0.066 53.813)"
|
|
204
|
+
},
|
|
205
|
+
"lime": {
|
|
206
|
+
"50": "oklch(98.6% 0.031 120.757)",
|
|
207
|
+
"100": "oklch(96.7% 0.067 122.328)",
|
|
208
|
+
"200": "oklch(93.8% 0.127 124.321)",
|
|
209
|
+
"300": "oklch(89.7% 0.196 126.665)",
|
|
210
|
+
"400": "oklch(84.1% 0.238 128.85)",
|
|
211
|
+
"500": "oklch(76.8% 0.233 130.85)",
|
|
212
|
+
"600": "oklch(64.8% 0.2 131.684)",
|
|
213
|
+
"700": "oklch(53.2% 0.157 131.589)",
|
|
214
|
+
"800": "oklch(45.3% 0.124 130.933)",
|
|
215
|
+
"900": "oklch(40.5% 0.101 131.063)",
|
|
216
|
+
"950": "oklch(27.4% 0.072 132.109)"
|
|
217
|
+
},
|
|
218
|
+
"green": {
|
|
219
|
+
"50": "oklch(98.2% 0.018 155.826)",
|
|
220
|
+
"100": "oklch(96.2% 0.044 156.743)",
|
|
221
|
+
"200": "oklch(92.5% 0.084 155.995)",
|
|
222
|
+
"300": "oklch(87.1% 0.15 154.449)",
|
|
223
|
+
"400": "oklch(79.2% 0.209 151.711)",
|
|
224
|
+
"500": "oklch(72.3% 0.219 149.579)",
|
|
225
|
+
"600": "oklch(62.7% 0.194 149.214)",
|
|
226
|
+
"700": "oklch(52.7% 0.154 150.069)",
|
|
227
|
+
"800": "oklch(44.8% 0.119 151.328)",
|
|
228
|
+
"900": "oklch(39.3% 0.095 152.535)",
|
|
229
|
+
"950": "oklch(26.6% 0.065 152.934)"
|
|
230
|
+
},
|
|
231
|
+
"emerald": {
|
|
232
|
+
"50": "oklch(97.9% 0.021 166.113)",
|
|
233
|
+
"100": "oklch(95% 0.052 163.051)",
|
|
234
|
+
"200": "oklch(90.5% 0.093 164.15)",
|
|
235
|
+
"300": "oklch(84.5% 0.143 164.978)",
|
|
236
|
+
"400": "oklch(76.5% 0.177 163.223)",
|
|
237
|
+
"500": "oklch(69.6% 0.17 162.48)",
|
|
238
|
+
"600": "oklch(59.6% 0.145 163.225)",
|
|
239
|
+
"700": "oklch(50.8% 0.118 165.612)",
|
|
240
|
+
"800": "oklch(43.2% 0.095 166.913)",
|
|
241
|
+
"900": "oklch(37.8% 0.077 168.94)",
|
|
242
|
+
"950": "oklch(26.2% 0.051 172.552)"
|
|
243
|
+
},
|
|
244
|
+
"teal": {
|
|
245
|
+
"50": "oklch(98.4% 0.014 180.72)",
|
|
246
|
+
"100": "oklch(95.3% 0.051 180.801)",
|
|
247
|
+
"200": "oklch(91% 0.096 180.426)",
|
|
248
|
+
"300": "oklch(85.5% 0.138 181.071)",
|
|
249
|
+
"400": "oklch(77.7% 0.152 181.912)",
|
|
250
|
+
"500": "oklch(70.4% 0.14 182.503)",
|
|
251
|
+
"600": "oklch(60% 0.118 184.704)",
|
|
252
|
+
"700": "oklch(51.1% 0.096 186.391)",
|
|
253
|
+
"800": "oklch(43.7% 0.078 188.216)",
|
|
254
|
+
"900": "oklch(38.6% 0.063 188.416)",
|
|
255
|
+
"950": "oklch(27.7% 0.046 192.524)"
|
|
256
|
+
},
|
|
257
|
+
"cyan": {
|
|
258
|
+
"50": "oklch(98.4% 0.019 200.873)",
|
|
259
|
+
"100": "oklch(95.6% 0.045 203.388)",
|
|
260
|
+
"200": "oklch(91.7% 0.08 205.041)",
|
|
261
|
+
"300": "oklch(86.5% 0.127 207.078)",
|
|
262
|
+
"400": "oklch(78.9% 0.154 211.53)",
|
|
263
|
+
"500": "oklch(71.5% 0.143 215.221)",
|
|
264
|
+
"600": "oklch(60.9% 0.126 221.723)",
|
|
265
|
+
"700": "oklch(52% 0.105 223.128)",
|
|
266
|
+
"800": "oklch(45% 0.085 224.283)",
|
|
267
|
+
"900": "oklch(39.8% 0.07 227.392)",
|
|
268
|
+
"950": "oklch(30.2% 0.056 229.695)"
|
|
269
|
+
},
|
|
270
|
+
"sky": {
|
|
271
|
+
"50": "oklch(97.7% 0.013 236.62)",
|
|
272
|
+
"100": "oklch(95.1% 0.026 236.824)",
|
|
273
|
+
"200": "oklch(90.1% 0.058 230.902)",
|
|
274
|
+
"300": "oklch(82.8% 0.111 230.318)",
|
|
275
|
+
"400": "oklch(74.6% 0.16 232.661)",
|
|
276
|
+
"500": "oklch(68.5% 0.169 237.323)",
|
|
277
|
+
"600": "oklch(58.8% 0.158 241.966)",
|
|
278
|
+
"700": "oklch(50% 0.134 242.749)",
|
|
279
|
+
"800": "oklch(44.3% 0.11 240.79)",
|
|
280
|
+
"900": "oklch(39.1% 0.09 240.876)",
|
|
281
|
+
"950": "oklch(29.3% 0.066 243.157)"
|
|
282
|
+
},
|
|
283
|
+
"blue": {
|
|
284
|
+
"50": "oklch(97% 0.014 254.604)",
|
|
285
|
+
"100": "oklch(93.2% 0.032 255.585)",
|
|
286
|
+
"200": "oklch(88.2% 0.059 254.128)",
|
|
287
|
+
"300": "oklch(80.9% 0.105 251.813)",
|
|
288
|
+
"400": "oklch(70.7% 0.165 254.624)",
|
|
289
|
+
"500": "oklch(62.3% 0.214 259.815)",
|
|
290
|
+
"600": "oklch(54.6% 0.245 262.881)",
|
|
291
|
+
"700": "oklch(48.8% 0.243 264.376)",
|
|
292
|
+
"800": "oklch(42.4% 0.199 265.638)",
|
|
293
|
+
"900": "oklch(37.9% 0.146 265.522)",
|
|
294
|
+
"950": "oklch(28.2% 0.091 267.935)"
|
|
295
|
+
},
|
|
296
|
+
"indigo": {
|
|
297
|
+
"50": "oklch(96.2% 0.018 272.314)",
|
|
298
|
+
"100": "oklch(93% 0.034 272.788)",
|
|
299
|
+
"200": "oklch(87% 0.065 274.039)",
|
|
300
|
+
"300": "oklch(78.5% 0.115 274.713)",
|
|
301
|
+
"400": "oklch(67.3% 0.182 276.935)",
|
|
302
|
+
"500": "oklch(58.5% 0.233 277.117)",
|
|
303
|
+
"600": "oklch(51.1% 0.262 276.966)",
|
|
304
|
+
"700": "oklch(45.7% 0.24 277.023)",
|
|
305
|
+
"800": "oklch(39.8% 0.195 277.366)",
|
|
306
|
+
"900": "oklch(35.9% 0.144 278.697)",
|
|
307
|
+
"950": "oklch(25.7% 0.09 281.288)"
|
|
308
|
+
},
|
|
309
|
+
"violet": {
|
|
310
|
+
"50": "oklch(96.9% 0.016 293.756)",
|
|
311
|
+
"100": "oklch(94.3% 0.029 294.588)",
|
|
312
|
+
"200": "oklch(89.4% 0.057 293.283)",
|
|
313
|
+
"300": "oklch(81.1% 0.111 293.571)",
|
|
314
|
+
"400": "oklch(70.2% 0.183 293.541)",
|
|
315
|
+
"500": "oklch(60.6% 0.25 292.717)",
|
|
316
|
+
"600": "oklch(54.1% 0.281 293.009)",
|
|
317
|
+
"700": "oklch(49.1% 0.27 292.581)",
|
|
318
|
+
"800": "oklch(43.2% 0.232 292.759)",
|
|
319
|
+
"900": "oklch(38% 0.189 293.745)",
|
|
320
|
+
"950": "oklch(28.3% 0.141 291.089)"
|
|
321
|
+
},
|
|
322
|
+
"purple": {
|
|
323
|
+
"50": "oklch(97.7% 0.014 308.299)",
|
|
324
|
+
"100": "oklch(94.6% 0.033 307.174)",
|
|
325
|
+
"200": "oklch(90.2% 0.063 306.703)",
|
|
326
|
+
"300": "oklch(82.7% 0.119 306.383)",
|
|
327
|
+
"400": "oklch(71.4% 0.203 305.504)",
|
|
328
|
+
"500": "oklch(62.7% 0.265 303.9)",
|
|
329
|
+
"600": "oklch(55.8% 0.288 302.321)",
|
|
330
|
+
"700": "oklch(49.6% 0.265 301.924)",
|
|
331
|
+
"800": "oklch(43.8% 0.218 303.724)",
|
|
332
|
+
"900": "oklch(38.1% 0.176 304.987)",
|
|
333
|
+
"950": "oklch(29.1% 0.149 302.717)"
|
|
334
|
+
},
|
|
335
|
+
"fuchsia": {
|
|
336
|
+
"50": "oklch(97.7% 0.017 320.058)",
|
|
337
|
+
"100": "oklch(95.2% 0.037 318.852)",
|
|
338
|
+
"200": "oklch(90.3% 0.076 319.62)",
|
|
339
|
+
"300": "oklch(83.3% 0.145 321.434)",
|
|
340
|
+
"400": "oklch(74% 0.238 322.16)",
|
|
341
|
+
"500": "oklch(66.7% 0.295 322.15)",
|
|
342
|
+
"600": "oklch(59.1% 0.293 322.896)",
|
|
343
|
+
"700": "oklch(51.8% 0.253 323.949)",
|
|
344
|
+
"800": "oklch(45.2% 0.211 324.591)",
|
|
345
|
+
"900": "oklch(40.1% 0.17 325.612)",
|
|
346
|
+
"950": "oklch(29.3% 0.136 325.661)"
|
|
347
|
+
},
|
|
348
|
+
"pink": {
|
|
349
|
+
"50": "oklch(97.1% 0.014 343.198)",
|
|
350
|
+
"100": "oklch(94.8% 0.028 342.258)",
|
|
351
|
+
"200": "oklch(89.9% 0.061 343.231)",
|
|
352
|
+
"300": "oklch(82.3% 0.12 346.018)",
|
|
353
|
+
"400": "oklch(71.8% 0.202 349.761)",
|
|
354
|
+
"500": "oklch(65.6% 0.241 354.308)",
|
|
355
|
+
"600": "oklch(59.2% 0.249 0.584)",
|
|
356
|
+
"700": "oklch(52.5% 0.223 3.958)",
|
|
357
|
+
"800": "oklch(45.9% 0.187 3.815)",
|
|
358
|
+
"900": "oklch(40.8% 0.153 2.432)",
|
|
359
|
+
"950": "oklch(28.4% 0.109 3.907)"
|
|
360
|
+
},
|
|
361
|
+
"rose": {
|
|
362
|
+
"50": "oklch(96.9% 0.015 12.422)",
|
|
363
|
+
"100": "oklch(94.1% 0.03 12.58)",
|
|
364
|
+
"200": "oklch(89.2% 0.058 10.001)",
|
|
365
|
+
"300": "oklch(81% 0.117 11.638)",
|
|
366
|
+
"400": "oklch(71.2% 0.194 13.428)",
|
|
367
|
+
"500": "oklch(64.5% 0.246 16.439)",
|
|
368
|
+
"600": "oklch(58.6% 0.253 17.585)",
|
|
369
|
+
"700": "oklch(51.4% 0.222 16.935)",
|
|
370
|
+
"800": "oklch(45.5% 0.188 13.697)",
|
|
371
|
+
"900": "oklch(41% 0.159 10.272)",
|
|
372
|
+
"950": "oklch(27.1% 0.105 12.094)"
|
|
373
|
+
},
|
|
374
|
+
"slate": {
|
|
375
|
+
"50": "oklch(98.4% 0.003 247.858)",
|
|
376
|
+
"100": "oklch(96.8% 0.007 247.896)",
|
|
377
|
+
"200": "oklch(92.9% 0.013 255.508)",
|
|
378
|
+
"300": "oklch(86.9% 0.022 252.894)",
|
|
379
|
+
"400": "oklch(70.4% 0.04 256.788)",
|
|
380
|
+
"500": "oklch(55.4% 0.046 257.417)",
|
|
381
|
+
"600": "oklch(44.6% 0.043 257.281)",
|
|
382
|
+
"700": "oklch(37.2% 0.044 257.287)",
|
|
383
|
+
"800": "oklch(27.9% 0.041 260.031)",
|
|
384
|
+
"900": "oklch(20.8% 0.042 265.755)",
|
|
385
|
+
"950": "oklch(12.9% 0.042 264.695)"
|
|
386
|
+
},
|
|
387
|
+
"gray": {
|
|
388
|
+
"50": "oklch(98.5% 0.002 247.839)",
|
|
389
|
+
"100": "oklch(96.7% 0.003 264.542)",
|
|
390
|
+
"200": "oklch(92.8% 0.006 264.531)",
|
|
391
|
+
"300": "oklch(87.2% 0.01 258.338)",
|
|
392
|
+
"400": "oklch(70.7% 0.022 261.325)",
|
|
393
|
+
"500": "oklch(55.1% 0.027 264.364)",
|
|
394
|
+
"600": "oklch(44.6% 0.03 256.802)",
|
|
395
|
+
"700": "oklch(37.3% 0.034 259.733)",
|
|
396
|
+
"800": "oklch(27.8% 0.033 256.848)",
|
|
397
|
+
"900": "oklch(21% 0.034 264.665)",
|
|
398
|
+
"950": "oklch(13% 0.028 261.692)"
|
|
399
|
+
},
|
|
400
|
+
"zinc": {
|
|
401
|
+
"50": "oklch(98.5% 0 0)",
|
|
402
|
+
"100": "oklch(96.7% 0.001 286.375)",
|
|
403
|
+
"200": "oklch(92% 0.004 286.32)",
|
|
404
|
+
"300": "oklch(87.1% 0.006 286.286)",
|
|
405
|
+
"400": "oklch(70.5% 0.015 286.067)",
|
|
406
|
+
"500": "oklch(55.2% 0.016 285.938)",
|
|
407
|
+
"600": "oklch(44.2% 0.017 285.786)",
|
|
408
|
+
"700": "oklch(37% 0.013 285.805)",
|
|
409
|
+
"800": "oklch(27.4% 0.006 286.033)",
|
|
410
|
+
"900": "oklch(21% 0.006 285.885)",
|
|
411
|
+
"950": "oklch(14.1% 0.005 285.823)"
|
|
412
|
+
},
|
|
413
|
+
"neutral": {
|
|
414
|
+
"50": "oklch(98.5% 0 0)",
|
|
415
|
+
"100": "oklch(97% 0 0)",
|
|
416
|
+
"200": "oklch(92.2% 0 0)",
|
|
417
|
+
"300": "oklch(87% 0 0)",
|
|
418
|
+
"400": "oklch(70.8% 0 0)",
|
|
419
|
+
"500": "oklch(55.6% 0 0)",
|
|
420
|
+
"600": "oklch(43.9% 0 0)",
|
|
421
|
+
"700": "oklch(37.1% 0 0)",
|
|
422
|
+
"800": "oklch(26.9% 0 0)",
|
|
423
|
+
"900": "oklch(20.5% 0 0)",
|
|
424
|
+
"950": "oklch(14.5% 0 0)"
|
|
425
|
+
},
|
|
426
|
+
"stone": {
|
|
427
|
+
"50": "oklch(98.5% 0.001 106.423)",
|
|
428
|
+
"100": "oklch(97% 0.001 106.424)",
|
|
429
|
+
"200": "oklch(92.3% 0.003 48.717)",
|
|
430
|
+
"300": "oklch(86.9% 0.005 56.366)",
|
|
431
|
+
"400": "oklch(70.9% 0.01 56.259)",
|
|
432
|
+
"500": "oklch(55.3% 0.013 58.071)",
|
|
433
|
+
"600": "oklch(44.4% 0.011 73.639)",
|
|
434
|
+
"700": "oklch(37.4% 0.01 67.558)",
|
|
435
|
+
"800": "oklch(26.8% 0.007 34.298)",
|
|
436
|
+
"900": "oklch(21.6% 0.006 56.043)",
|
|
437
|
+
"950": "oklch(14.7% 0.004 49.25)"
|
|
438
|
+
},
|
|
439
|
+
"mauve": {
|
|
440
|
+
"50": "oklch(98.5% 0 0)",
|
|
441
|
+
"100": "oklch(96% 0.003 325.6)",
|
|
442
|
+
"200": "oklch(92.2% 0.005 325.62)",
|
|
443
|
+
"300": "oklch(86.5% 0.012 325.68)",
|
|
444
|
+
"400": "oklch(71.1% 0.019 323.02)",
|
|
445
|
+
"500": "oklch(54.2% 0.034 322.5)",
|
|
446
|
+
"600": "oklch(43.5% 0.029 321.78)",
|
|
447
|
+
"700": "oklch(36.4% 0.029 323.89)",
|
|
448
|
+
"800": "oklch(26.3% 0.024 320.12)",
|
|
449
|
+
"900": "oklch(21.2% 0.019 322.12)",
|
|
450
|
+
"950": "oklch(14.5% 0.008 326)"
|
|
451
|
+
},
|
|
452
|
+
"olive": {
|
|
453
|
+
"50": "oklch(98.8% 0.003 106.5)",
|
|
454
|
+
"100": "oklch(96.6% 0.005 106.5)",
|
|
455
|
+
"200": "oklch(93% 0.007 106.5)",
|
|
456
|
+
"300": "oklch(88% 0.011 106.6)",
|
|
457
|
+
"400": "oklch(73.7% 0.021 106.9)",
|
|
458
|
+
"500": "oklch(58% 0.031 107.3)",
|
|
459
|
+
"600": "oklch(46.6% 0.025 107.3)",
|
|
460
|
+
"700": "oklch(39.4% 0.023 107.4)",
|
|
461
|
+
"800": "oklch(28.6% 0.016 107.4)",
|
|
462
|
+
"900": "oklch(22.8% 0.013 107.4)",
|
|
463
|
+
"950": "oklch(15.3% 0.006 107.1)"
|
|
464
|
+
},
|
|
465
|
+
"mist": {
|
|
466
|
+
"50": "oklch(98.7% 0.002 197.1)",
|
|
467
|
+
"100": "oklch(96.3% 0.002 197.1)",
|
|
468
|
+
"200": "oklch(92.5% 0.005 214.3)",
|
|
469
|
+
"300": "oklch(87.2% 0.007 219.6)",
|
|
470
|
+
"400": "oklch(72.3% 0.014 214.4)",
|
|
471
|
+
"500": "oklch(56% 0.021 213.5)",
|
|
472
|
+
"600": "oklch(45% 0.017 213.2)",
|
|
473
|
+
"700": "oklch(37.8% 0.015 216)",
|
|
474
|
+
"800": "oklch(27.5% 0.011 216.9)",
|
|
475
|
+
"900": "oklch(21.8% 0.008 223.9)",
|
|
476
|
+
"950": "oklch(14.8% 0.004 228.8)"
|
|
477
|
+
},
|
|
478
|
+
"taupe": {
|
|
479
|
+
"50": "oklch(98.6% 0.002 67.8)",
|
|
480
|
+
"100": "oklch(96% 0.002 17.2)",
|
|
481
|
+
"200": "oklch(92.2% 0.005 34.3)",
|
|
482
|
+
"300": "oklch(86.8% 0.007 39.5)",
|
|
483
|
+
"400": "oklch(71.4% 0.014 41.2)",
|
|
484
|
+
"500": "oklch(54.7% 0.021 43.1)",
|
|
485
|
+
"600": "oklch(43.8% 0.017 39.3)",
|
|
486
|
+
"700": "oklch(36.7% 0.016 35.7)",
|
|
487
|
+
"800": "oklch(26.8% 0.011 36.5)",
|
|
488
|
+
"900": "oklch(21.4% 0.009 43.1)",
|
|
489
|
+
"950": "oklch(14.7% 0.004 49.3)"
|
|
490
|
+
}
|
|
491
|
+
}`),Sa={"220.9 39.3% 11%":"gray","210 20% 98%":"gray","12 76% 61%":"gray","220 70% 50%":"gray"},Pn=new Map;for(let e of Ca)for(let t of xa)Pn.set(In(Ra[e][t]),e);function $n(e){let t=In(e);return t?Pn.get(t)??Sa[t]??null:null}function In(e){if(!e)return "";let t=e.trim().replace(/\s+/g," ").toLowerCase();if(!t.startsWith("oklch(")||!t.endsWith(")"))return t;let r=t.slice(6,-1).trim(),[o]=r.split(/\s*\/\s*/),i=o.split(/\s+/);if(i.length<3)return t;let n=xr(i[0],{percentage:true}),s=xr(i[1]),c=xr(i[2]);return `oklch(${n} ${s} ${c})`}function xr(e,t={}){return t.percentage&&e.endsWith("%")?Sn(Number.parseFloat(e)/100):Sn(Number.parseFloat(e))}function Sn(e){return Number.isNaN(e)?"":Number(e.toFixed(12)).toString()}var ja=new Set(c$3),Ta=new Set(g$1),Na=new Set(k),Aa=new Set(l),Oa=new Set(h),_a=new Set(i),Da=new Set(d$2),La=new Set(["lora","merriweather","playfair-display","noto-serif","roboto-slab"]),Va=new Set(["jetbrains-mono","geist-mono"]),at=["--font-sans","--font-serif","--font-mono"],Fn=new Set(at),Ma=[...at,"--font-heading"],jn=new Set(Ma),Ua={0:"none","0rem":"none","0.45rem":"small","0.625rem":"default","0.875rem":"large"};async function Tn(e,t){let r=Ba(e.style);if(!r)return {code:null,values:null};let o=B[r],i=await Wa(e.resolvedPaths.tailwindCss),n=t;if(t===void 0)try{n=await ra$1(e.resolvedPaths.cwd,{configCssFile:e.tailwind.css});}catch{n=null;}let s=await ec(e,n),c=Ka(i,s)??o.font,a=Xa(qa(i,c,s)??o.fontHeading,c,o.fontHeading),f={style:r,baseColor:pc(e.tailwind.baseColor)??o.baseColor,theme:Ga(i)??o.theme,chartColor:Ha(i)??o.chartColor,iconLibrary:mc(e.iconLibrary)??o.iconLibrary,font:c,fontHeading:a,radius:Ya(i.rootVars["--radius"])??o.radius,menuAccent:uc(e.menuAccent)??o.menuAccent,menuColor:dc(e.menuColor)??o.menuColor};return {code:p(f),values:f}}async function Wa(e){let t={darkVars:{},imports:[],rootVars:{},themeVars:{}};if(!e)return t;try{let r=await promises.readFile(e,"utf8");return za(r)}catch{return t}}function Ba(e){if(!e)return null;let t=e.replace(/^(base|radix)-/,"");return t in B?t:null}function za(e){let t=P$1.parse(e),r={darkVars:{},imports:[],rootVars:{},themeVars:{}};return t.walkAtRules("import",o=>{let i=Ja(o.params);i&&r.imports.push(i);}),t.walkRules(o=>{let i=o.selector.split(",").map(n=>n.trim()).filter(Boolean);i.includes(":root")&&Cr(o,r.rootVars),i.includes(".dark")&&Cr(o,r.darkVars);}),t.walkAtRules("theme",o=>{o.params.trim()==="inline"&&Cr(o,r.themeVars);}),r}function Cr(e,t){for(let r of e.nodes??[])r.type!=="decl"||!r.prop.startsWith("--")||(t[r.prop]=r.value.trim());}function Ja(e){let t=e.trim();return (t.match(/^url\((['"]?)(.+?)\1\)$/)??t.match(/^(['"])(.+?)\1$/))?.[2]??null}function Ga(e){let t=Bt(e.rootVars["--primary"]);if(!t)return null;let r=e.darkVars["--primary"];return r?Bt(r)===t?t:null:t}function Ha(e){let t=Bt(e.rootVars["--chart-1"]);if(!t)return null;let r=e.darkVars["--chart-1"];return r?Bt(r)===t?t:null:t}function Bt(e){let t=$n(e);return !t||!Da.has(t)?null:t}function Ya(e){if(!e)return null;let t=zt(e);return Ua[t]??null}function Ka(e,t){for(let r of at){let o=On(e,r);if(o)return o}for(let r of at){let o=Za(e.imports,r);if(o)return o}return Qa(t)}function qa(e,t,r){let o=vr(e,"--font-heading"),i=o?Dn(o):null;if(i)return i===t?"inherit":i;let n=r.variables["--font-heading"],s=Nn(e,"--font-heading");if(!s)return n&&n!==t?n:null;let c=An(s);if(c&&Fn.has(c)){let a=On(e,c),f=r.variables[c],l=a??f??null;return !l||l===t?"inherit":l}return c==="--font-heading"?!n||n===t?"inherit":n:n&&n!==t?n:null}function Xa(e,t,r){let o=e===t?"inherit":e;return _a.has(o)?o:r}function vr(e,t,r=new Set){if(r.has(t))return null;r.add(t);let o=Nn(e,t);if(!o)return null;let i=An(o);return i?jn.has(i)?vr(e,i,r):null:o}function Nn(e,t){return e.themeVars[t]??e.rootVars[t]??null}function An(e){return zt(e).match(/^var\((--[a-z0-9-]+)\)$/)?.[1]??null}function On(e,t){let r=vr(e,t),o=r?Dn(r):null;return o||null}function Za(e,t){let r=e.flatMap(o=>{let i=cc(o);return i&&fc(i)===t?[i]:[]});return r.length===1?r[0]:null}function Qa(e){if(e.appliedBodyVariable&&e.variables[e.appliedBodyVariable])return e.variables[e.appliedBodyVariable]??null;let t=at.map(r=>e.variables[r]).filter(Boolean).filter((r,o,i)=>i.indexOf(r)===o);return t.length===1?t[0]:null}async function ec(e,t){let r={appliedBodyVariable:null,variables:{}};if(!t||t.framework.name!=="next-app"&&t.framework.name!=="next-pages")return r;let o=tc(e,t);if(!o)return r;try{let i=await promises.readFile(o,"utf8");return rc(i,t.framework.name)}catch{return r}}function tc(e,t){let r=t.isTsx?"tsx":"jsx",o=t.framework.name==="next-app"?t.isSrcDir?[`src/app/layout.${r}`,`app/layout.${r}`]:[`app/layout.${r}`]:t.isSrcDir?[`src/pages/_app.${r}`,`pages/_app.${r}`]:[`pages/_app.${r}`];for(let i of o){let n=ie__default.join(e.resolvedPaths.cwd,i);if(existsSync(n))return n}return null}function rc(e,t){let o=new Project({compilerOptions:{}}).createSourceFile("font-source.tsx",e,{overwrite:true,scriptKind:ScriptKind.TSX}),i=new Map;for(let c of o.getImportDeclarations())if(c.getModuleSpecifierValue()==="next/font/google")for(let a of c.getNamedImports()){let f=a.getName(),l=a.getAliasNode()?.getText()??f,m=lc(f);m&&i.set(l,m);}let n={},s=new Map;for(let c of o.getVariableStatements())for(let a of c.getDeclarations()){let f=a.getInitializer();if(!f?.isKind(SyntaxKind.CallExpression))continue;let l=i.get(f.getExpression().getText());if(!l)continue;let m=oc(f);m&&(s.set(a.getName(),m),n[m]=l);}return {appliedBodyVariable:nc(o,s,t),variables:n}}function oc(e){let t=e.getArguments()[0];if(!t||!Node.isObjectLiteralExpression(t))return null;let r=t.getProperty("variable");if(!r||!Node.isPropertyAssignment(r))return null;let o=r.getInitializer();if(!o)return null;let i=_n(o.getText());return jn.has(i)?i:null}function nc(e,t,r){let o=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement).filter(n=>r==="next-app"?n.getTagNameNode().getText()==="html":true),i=new Set;for(let n of o){let s=n.getAttribute("className");if(!s||!Node.isJsxAttribute(s))continue;let c=s.getInitializer();if(!c)continue;let a=ic(c,t),f=sc(c);if(f&&a.includes(f))return f;a.length===1&&i.add(a[0]);}return i.size===1?Array.from(i)[0]:null}function ic(e,t){let r=Node.isJsxExpression(e)?[e.getExpression(),...e.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression)].filter(Boolean):[],o=new Set;for(let i of r){if(!i||!Node.isPropertyAccessExpression(i)||i.getName()!=="variable")continue;let n=i.getExpression().getText(),s=t.get(n);s&&Fn.has(s)&&o.add(s);}return Array.from(o)}function sc(e){let t=ac(e);return /\bfont-sans\b/.test(t)?"--font-sans":/\bfont-serif\b/.test(t)?"--font-serif":/\bfont-mono\b/.test(t)?"--font-mono":null}function ac(e){let t=[];(Node.isStringLiteral(e)||Node.isNoSubstitutionTemplateLiteral(e))&&t.push(e.getLiteralValue());for(let r of e.getDescendantsOfKind(SyntaxKind.StringLiteral))t.push(r.getLiteralValue());for(let r of e.getDescendantsOfKind(SyntaxKind.NoSubstitutionTemplateLiteral))t.push(r.getLiteralValue());return t.length>0?t.join(" "):e.getText()}function _n(e){return e.replace(/^['"]|['"]$/g,"")}function Dn(e){if(!e)return null;let t=_n(e.split(",")[0]?.trim()??"").replace(/\s+variable$/i,"").trim();return t?Rr(t.replace(/\s+/g,"-")):null}function cc(e){if(!e)return null;let t=zt(e),r="@fontsource-variable/";return t.startsWith(r)?Rr(t.slice(r.length)):null}function lc(e){return e?Rr(e.replace(/_/g,"-")):null}function Rr(e){let t=zt(e);return Oa.has(t)?t:null}function fc(e){return Va.has(e)?"--font-mono":La.has(e)?"--font-serif":"--font-sans"}function zt(e){return e?e.trim().replace(/\s+/g," ").replace(/\s*,\s*/g,", ").replace(/"/g,"'").toLowerCase():""}function pc(e){return ja.has(e??"")?e:null}function mc(e){return Ta.has(e??"")?e:null}function uc(e){return Na.has(e??"")?e:null}function dc(e){return Aa.has(e??"")?e:null}var Vn="https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases",Mn=new Command().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",false).action(async e=>{try{let t=ie__default.resolve(e.cwd);if(!existsSync(ie__default.resolve(t,"components.json"))&&await G(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$1(t),o=await N(t),i=await ua$1(t),n=S(o?.style),s=await wc(r,o,i,n);if(e.json){console.log(JSON.stringify(s,null,2));return}kc(s);}catch(t){$(t);}});function yc(e){if(!e)return {};let t={};for(let[r,o]of Object.entries(e))t[r]=typeof o=="string"?o:o.url;return t}async function wc(e,t,r,o){let i=t?await Tn(t,e):null;return {project:e?{framework:e.framework.label,frameworkName:e.framework.name,frameworkVersion:e.frameworkVersion??null,srcDirectory:e.isSrcDir,rsc:e.isRSC,typescript:e.isTsx,tailwindVersion:e.tailwindVersion??null,tailwindConfig:e.tailwindConfigFile??null,tailwindCss:e.tailwindCssFile??null,importAlias:e.aliasPrefix??null}:null,config:t?{style:t.style,base:o,rsc:t.rsc,typescript:t.tsx,iconLibrary:t.iconLibrary??null,rtl:t.rtl??false,menuColor:t.menuColor??null,menuAccent:t.menuAccent??null,aliases:{components:t.aliases.components,utils:t.aliases.utils,ui:t.aliases.ui??null,lib:t.aliases.lib??null,hooks:t.aliases.hooks??null},resolvedPaths:{cwd:t.resolvedPaths.cwd,tailwindConfig:t.resolvedPaths.tailwindConfig||null,tailwindCss:t.resolvedPaths.tailwindCss||null,utils:t.resolvedPaths.utils,components:t.resolvedPaths.components,lib:t.resolvedPaths.lib,hooks:t.resolvedPaths.hooks,ui:t.resolvedPaths.ui},registries:yc(t.registries)}:null,preset:i,components:r,links:{docs:`${c$1}/docs`,components:`${c$1}/docs/components/${o}/[component].md`,ui:`${Vn}/${o}/ui/[component].tsx`,examples:`${Vn}/${o}/examples/[component]-example.tsx`,schema:"https://ui.shadcn.com/schema.json"}}}function kc(e){b.log(a.info("Project")),e.project?we({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?(we({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("Preset")),e.preset?.code?we({"--preset":e.preset.code,url:`${c$1}/create?preset=${e.preset.code}`,style:e.preset.values?.style??"-",baseColor:e.preset.values?.baseColor??"-",theme:e.preset.values?.theme??"-",chartColor:e.preset.values?.chartColor??"-",iconLibrary:e.preset.values?.iconLibrary??"-",font:e.preset.values?.font??"-",fontHeading:e.preset.values?.fontHeading??"-",radius:e.preset.values?.radius??"-",menuAccent:e.preset.values?.menuAccent??"-",menuColor:e.preset.values?.menuColor??"-"}):we({"--preset":"-"}),b.break(),b.log(a.info("Aliases")),we({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")),we({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:"),we(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")),we(e.links),b.break();}function we(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,o]of Object.entries(e))b.log(` ${r.padEnd(t+2)}${o}`);}var Te="latest",Gt=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Te}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${Te}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${Te}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
|
|
153
492
|
command = "npx"
|
|
154
|
-
args = ["shadcn@${
|
|
155
|
-
`},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${
|
|
493
|
+
args = ["shadcn@${Te}", "mcp"]
|
|
494
|
+
`},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${Te}`,"mcp"],enabled:true}}}}],Jt=[`shadcn@${Te}`],Pr=new Command().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await K(e.cwd);let t=new StdioServerTransport;await b$1.connect(t);}catch(t){b.break(),$(t);}}),Sc=Sr.object({client:Sr.enum(["claude","cursor","vscode","codex","opencode"]),cwd:Sr.string()});Pr.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${Gt.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let o=(t.parent?.opts()||{}).cwd||process.cwd(),i=e.client;if(!i){let f=await he({type:"select",name:"client",message:"Which MCP client are you using?",choices:Gt.map(l=>({title:l.label,value:l.name}))});f.client||(b.break(),process.exit(1)),i=f.client;}let n=Sc.parse({client:i,cwd:o}),s=await N(n.cwd);if(n.client==="codex"){if(s)await _([],Jt,s,{silent:!1});else {let f=await a$2(n.cwd),l=f==="npm"?"install":"add",m=f==="npm"?"--save-dev":"-D",u=w("Installing dependencies...").start();await execa(f,[l,m,...Jt],{cwd:n.cwd}),u.succeed("Installing dependencies.");}b.break(),b.log("To configure the shadcn MCP server in Codex:"),b.break(),b.log(`1. Open or create the file ${a.info("~/.codex/config.toml")}`),b.log("2. Add the following configuration:"),b.log(),b.info(`[mcp_servers.shadcn]
|
|
156
495
|
command = "npx"
|
|
157
|
-
args = ["shadcn@${
|
|
158
|
-
`,"utf-8"),
|
|
159
|
-
`),s.succeed("Updated package.json."),await
|
|
160
|
-
|
|
161
|
-
`),
|
|
162
|
-
`).map(C=>{if(C.trim().startsWith("import "))return C;let
|
|
163
|
-
`));let h=Array.from(new Set(i));return {content:c,replacedPackages:h}}var
|
|
164
|
-
`),i.succeed("Updated components.json.");}catch{throw i.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let
|
|
165
|
-
Before you can run a migration, you must create a valid ${a.info("components.json")} file by running the ${a.info("init")} command.`),b.error(`Learn more at ${a.info(`${c$1}/docs/components-json`)}.`),b.break(),process.exit(1);}}var
|
|
496
|
+
args = ["shadcn@${Te}", "mcp"]`),b.break(),b.info("3. Restart Codex to load the MCP server"),b.break(),process.exit(0);}let c=w("Configuring MCP server...").start(),a$1=await $c(n);if(c.succeed("Configuring MCP server."),s)await _([],Jt,s,{silent:!1});else {let f=await a$2(n.cwd),l=f==="npm"?"install":"add",m=f==="npm"?"--save-dev":"-D",u=w("Installing dependencies...").start();await execa(f,[l,m,...Jt],{cwd:n.cwd}),u.succeed("Installing dependencies.");}b.break(),b.success(`Configuration saved to ${a$1}.`),b.break();}catch(r){$(r);}});var Pc=(e,t)=>t;async function $c(e){let{client:t,cwd:r}=e,o=Gt.find(a=>a.name===t);if(!o)throw new Error(`Unknown client: ${t}. Available clients: ${Gt.map(a=>a.name).join(", ")}`);let i=ie__default.join(r,o.configPath),n=ie__default.dirname(i);await O.ensureDir(n);let s={};try{let a=await promises.readFile(i,"utf-8");s=JSON.parse(a);}catch{}let c=Oo(s,o.config,{arrayMerge:Pc});return await promises.writeFile(i,JSON.stringify(c,null,2)+`
|
|
497
|
+
`,"utf-8"),o.configPath}var ke={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 Jn(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t=e.resolvedPaths.ui,[r,o]=await Promise.all([Ir("**/*.{js,ts,jsx,tsx}",{cwd:t}),ga()]);if(Object.keys(o).length===0)throw new Error("Something went wrong fetching the registry icons.");let i=Object.entries(ke).map(([l,m])=>({title:m.name,value:l})),n=await he([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${a.info("migrate from")}?`,choices:i},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${a.info("migrate to")}?`,choices:i}]);if(n.sourceLibrary===n.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(n.sourceLibrary in ke&&n.targetLibrary in ke))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=ke[n.sourceLibrary],c=ke[n.targetLibrary],{confirm:a$1}=await he({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} files in ${a.info(`./${ie__default.relative(e.resolvedPaths.cwd,t)}`)} from ${a.info(s.name)} to ${a.info(c.name)}. Continue?`});a$1||(b.info("Migration cancelled."),process.exit(0)),c.package&&await _([c.package],[],e,{silent:false});let f=w("Migrating icons...")?.start();await Promise.all(r.map(async l=>{f.text=`Migrating ${l}...`;let m=ie__default.join(t,l),u=await promises.readFile(m,"utf-8"),h=await Ac(u,n.sourceLibrary,n.targetLibrary,o);await promises.writeFile(m,h);})),f.succeed("Migration complete.");}async function Ac(e,t,r,o){let i=ke[t]?.import,n=ke[r]?.import,s=await promises.mkdtemp(ie__default.join(tmpdir(),"shadcn-")),c=new Project({compilerOptions:{}}),a=ie__default.join(s,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),f=c.createSourceFile(a,e,{scriptKind:ScriptKind.TSX}),l=[];for(let m of f.getImportDeclarations()??[])if(m.getModuleSpecifier()?.getText()===`"${i}"`){for(let u of m.getNamedImports()??[]){let h=u.getName(),g=Object.values(o).find(w=>w[t]===h)?.[r];!g||l.includes(g)||(l.push(g),u.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:n,namedImports:l.map(m=>({name:m}))}),await f.getText()}function _c(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function Dc(e,t,r,o){let n=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of n){let c=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),a=s.match(/^(\w+)\s+as\s+(\w+)$/);if(c){let f=c[1],l=c[2];o==="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];o==="slot"&&f==="Slot"&&l==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:f,alias:l,isType:t});}else o==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t});}}async function Gn(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await Ir(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else {let a=ie__default.resolve(o,t.path),f=await promises.stat(a).catch(()=>null);if(!f)throw new Error(`File not found: ${t.path}`);if(f.isDirectory())o=a,r=await Ir("**/*.{js,ts,jsx,tsx}",{cwd:o,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.");o=e.resolvedPaths.ui,r=await Ir("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true});}if(!t.yes){let c=t.path?t.path:`./${ie__default.relative(e.resolvedPaths.cwd,o)}`,{confirm:a$1}=await he({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} file(s) in ${a.info(c)} to ${a.info("radix-ui")}. Continue?`});a$1||(b.info("Migration cancelled."),process.exit(0));}let i=w("Migrating imports...")?.start(),n=new Set;await Promise.all(r.map(async c=>{i.text=`Migrating ${c}...`;let a=ie__default.join(o,c),f=await promises.readFile(a,"utf-8"),{content:l,replacedPackages:m}=await Lc(f);m.forEach(u=>n.add(u)),await promises.writeFile(a,l);})),i.succeed("Migrating imports.");let s=w("Updating package.json...")?.start();try{let c=qa$1(e.resolvedPaths.cwd,!1);if(!c){s.fail("Could not read package.json"),b.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let a$1=Array.from(n);if(a$1.length>0){if(c.dependencies||(c.dependencies={}),c.dependencies?.["radix-ui"]||c.devDependencies?.["radix-ui"])s.succeed("radix-ui already in package.json.");else {c.dependencies["radix-ui"]="latest";let l=ie__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(l,JSON.stringify(c,null,2)+`
|
|
498
|
+
`),s.succeed("Updated package.json."),await _(["radix-ui"],[],e,{silent:!1});}b.info(""),b.info("Migration complete. The following packages may be removed if no longer in use:"),b.info(a.info(a$1.join(", "))),b.info("Please review your codebase before removing.");}else s.succeed("No packages found in source files.");}catch{s.fail("Failed to update package.json"),b.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function Lc(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],o=[],i=[],n='"',s=false,c=e,a;for(;(a=t.exec(e))!==null;){let[g,w,C,k,E,x,$]=a;if(x==="icons"||x.startsWith("icons/"))continue;o.push(g),o.length===1&&(n=E,s=$===";"),i.push(`@radix-ui/react-${x}`);let v=!!w;if(C){let L=_c(x);r.push({name:L,alias:C,isType:v});}else k&&Dc(k,v,r,x);}if(r.length===0)return {content:e,replacedPackages:[]};let f=r.filter((g,w,C)=>w===C.findIndex(k=>k.name===g.name&&k.alias===g.alias&&k.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 ${n}radix-ui${n}${s?";":""}`;c=o.reduce((g,w,C)=>g.replace(w,C===0?m:""),c),c=c.replace(/\n\s*\n\s*\n/g,`
|
|
499
|
+
|
|
500
|
+
`),f.some(g=>g.name==="Slot"&&g.alias==="SlotPrimitive")&&(c=c.split(`
|
|
501
|
+
`).map(C=>{if(C.trim().startsWith("import "))return C;let k=C;return k=k.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),k=k.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),k=k.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),k=k.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),k=k.replace(/\bSlot\b/g,(E,x,$)=>{let v=$.substring(0,x),L=(v.match(/"/g)||[]).length,be=(v.match(/'/g)||[]).length;return L%2!==0||be%2!==0?E:"__SLOT_PLACEHOLDER__"}),k=k.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),k}).join(`
|
|
502
|
+
`));let h=Array.from(new Set(i));return {content:c,replacedPackages:h}}var Mc=["sidebar.tsx","pagination.tsx","calendar.tsx"],Uc=`${c$1}/docs/rtl#manual-migration-optional`;async function Hn(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await Ir(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else {let f=ie__default.resolve(o,t.path),l=await promises.stat(f).catch(()=>null);if(!l)throw new Error(`File not found: ${t.path}`);if(l.isDirectory())o=f,r=await Ir("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else if(l.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else {if(!e.resolvedPaths.ui)throw new Error("Could not find a valid `ui` path in your `components.json`. Please provide a path or glob pattern.");o=e.resolvedPaths.ui,r=await Ir("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true});}if(!t.yes){let a$1=t.path?t.path:`./${ie__default.relative(e.resolvedPaths.cwd,o)}`,{confirm:f}=await he({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${a.info(r.length)} file(s) in ${a.info(a$1)} to RTL. Continue?`});f||(b.info("Migration cancelled."),process.exit(0));}let i=w("Updating components.json...").start();try{let a=ie__default.resolve(e.resolvedPaths.cwd,"components.json"),f=JSON.parse(await promises.readFile(a,"utf-8"));f.rtl=!0,await promises.writeFile(a,JSON.stringify(f,null,2)+`
|
|
503
|
+
`),i.succeed("Updated components.json.");}catch{throw i.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let n=w("Migrating files to RTL...").start(),s=0,c=[];if(await Promise.all(r.map(async a=>{n.text=`Migrating ${a}...`;let f=ie__default.join(o,a),l=await promises.readFile(f,"utf-8"),m=await e$1(l,true);m!==l&&(await promises.writeFile(f,m),s++);let u=ie__default.basename(a);Mc.includes(u)&&c.push(a);})),n.succeed(`Migration complete. ${s} file(s) transformed.`),c.length>0){b.break(),b.warn("The following components may need manual RTL adjustments:");for(let a of c)b.info(` - ${a}`);b.break(),b.info(`See ${a.info(Uc)} for more information.`);}}async function Kn(e){let t={};if(!O.existsSync(e.cwd)||!O.existsSync(ie__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!O.existsSync(ie__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await N(e.cwd);return {errors:t,config:r}}catch{b.break(),b.error(`An invalid ${a.info("components.json")} file was found at ${a.info(e.cwd)}.
|
|
504
|
+
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 qn=[{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)."}],zc=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),migration:z$1.string().refine(e=>e&&qn.some(t=>t.name===e),{message:"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations."}).optional(),path:z$1.string().optional()}),Xn=new Command().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").argument("[path]","optional path or glob pattern to migrate.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-l, --list","list all migrations.",false).option("-y, --yes","skip confirmation prompt.",false).action(async(e,t,r)=>{try{let o=zc.parse({cwd:ie__default.resolve(r.cwd),migration:e,path:t,list:r.list,yes:r.yes});if(o.list||!o.migration){b.info("Available migrations:");for(let s of qn)b.info(`- ${s.name}: ${s.description}`);return}if(!o.migration)throw new Error("You must specify a migration. Run `shadcn migrate --list` to see available migrations.");let{errors:i,config:n}=await Kn(o);if(i["1"]||i["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!n)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");o.migration==="icons"&&await Jn(n),o.migration==="radix"&&await Gn(n,{yes:o.yes,path:o.path}),o.migration==="rtl"&&await Hn(n,{yes:o.yes,path:o.path});}catch(o){b.break(),$(o);}});var Hc=z$1.object({cwd:z$1.string(),silent:z$1.boolean()}),Qn=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=Hc.parse({cwd:ie__default.resolve(t.cwd),silent:t.silent}),o=e.length>0?e:await qc({silent:r.silent});await Kc(o,r.cwd,{silent:r.silent});}catch(r){b.break(),$(r);}});function Yc(e){let[t,...r]=e.split("="),o=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${a.info(t)}. Registry names must start with @ (e.g., @acme).`);return {namespace:t,url:o}}function Nr(e,t,r){return `${e} ${e===1?t:r}`}async function Kc(e,t,r){let o=ie__default.resolve(t,"components.json");if(!O.existsSync(o))throw new Error(`No ${a.info("components.json")} found. Run ${a.info("shadcn init")} first.`);let i=e.map(Yc),n=i.filter(g=>!g.url),s=[];if(n.length>0){let g=w("Fetching registries.",{silent:r.silent}).start(),w$1=await ma();if(!w$1)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),s=w$1;}let c={};for(let{namespace:g,url:w}of i){if(g in d){b.warn(`${a.info(g)} is a built-in registry and cannot be added.`);continue}if(w){if(!w.includes("{name}"))throw new Error(`Invalid registry URL for ${a.info(g)}. URL must include {name} placeholder. Example: ${a.info(`${g}=https://example.com/r/{name}.json`)}`);c[g]=w;}else {let C=s.find(k=>k.name===g);if(!C)throw new Error(`Registry ${a.info(g)} not found. Provide a URL: ${a.info(`${g}=https://.../{name}.json`)}`);c[g]=C.url;}}if(Object.keys(c).length===0)return {addedRegistries:[]};let a$1=await O.readJson(o),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 u={...a$1,registries:{...f,...l}},h=w("Updating components.json.",{silent:r.silent}).start();if(await O.writeJson(o,u,{spaces:2}),h.succeed(),!r.silent){let g=Object.keys(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 qc(e){let t=w("Fetching registries.",{silent:e.silent}).start(),r=await ma();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let o=[...r].sort((n,s)=>n.name.localeCompare(s.name)),{selected:i}=await he({type:"autocompleteMultiselect",name:"selected",message:"Which registries would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:o.map(n=>({title:n.name,description:n.description,value:n.name}))});return i?.length||(b.warn("No registries selected. Exiting."),b.info(""),process.exit(1)),i}var ei=new Command().name("registry").description("manage registries").addCommand(Qn);var Qc=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),oi=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=Qc.parse({cwd:ie__default.resolve(t.cwd),query:t.query,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});await K(r.cwd);let o=T({style:"new-york",resolvedPaths:{cwd:r.cwd}}),i=U(o),n=ie__default.resolve(r.cwd,"components.json");if(O.existsSync(n)){let l=await O.readJson(n),m=c.partial().parse(l);i=U({...o,...m});}let s=i;try{let l=await N(r.cwd);l&&(s=U(l));}catch{}let{config:c$1,newRegistries:a}=await M(e.map(l=>`${l}/registry`),s,{silent:!0,writeFile:!1});a.length>0&&(s.registries=c$1.registries),W(e,s);let f=await va$1(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(f,null,2)),process.exit(0);}catch(r){$(r);}finally{V();}});var tl=z$1.object({cwd:z$1.string()}),ai=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=tl.parse({cwd:ie__default.resolve(t.cwd)});await K(r.cwd);let o=U({}),i=ie__default.resolve(r.cwd,"components.json");if(O.existsSync(i)){let f=await O.readJson(i),l=c.partial().parse(f);o=U(l);}let n=o;try{let f=await N(r.cwd);f&&(n=U(f));}catch{}let{config:s,newRegistries:c$1}=await M(e,n,{silent:!0,writeFile:!1});c$1.length>0&&(n.registries=s.registries),W(e,n);let a=await ba(e,{config:n});console.log(JSON.stringify(a,null,2)),process.exit(0);}catch(r){$(r);}finally{V();}});var ci={version:"4.2.1-beta.0"};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function nl(){let e=new Command().name("shadcn").description("build your component library").version(ci.version,"-v, --version","display the version number");e.addCommand(qo).addCommand(hn).addCommand(pn).addCommand(vn).addCommand(Rn).addCommand(ai).addCommand(oi).addCommand(Xn).addCommand(Mn).addCommand(xn).addCommand(Pr).addCommand(ei),e.parse();}nl();
|