UNPKG

shadcn

Version:

Add components to your apps.

123 lines (107 loc) 157 kB
#!/usr/bin/env node import {a as a$2}from'./chunk-OY2PM3KO.js';import {r,q,c as c$3,g as g$2,k,l,h as h$1,i,d as d$2,p,f as f$3}from'./chunk-NUMOKWW5.js';import {e,d,Q as Q$1,f,Fa as Fa$1,g,h,Ia,a,oa as oa$1,ea as ea$1,Ga as Ga$1,Y,Z as Z$1,E,b,_ as _$1,X as X$1,ua as ua$1,wa,V,W,T,Ha as Ha$1,ca as ca$1,qa as qa$1,R,c as c$1,ta as ta$1,ba as ba$1,La,Ma as Ma$1,Na as Na$1,za as za$1,xa,Aa,J as J$1,F,G,I,H,y,la as la$1,Ba as Ba$1,ha as ha$1,S,da as da$1,fa as fa$1,Oa as Oa$1,ka as ka$1,ga as ga$1,Ca,va,na as na$1,x,ja as ja$1,p as p$1,aa as aa$1,ia as ia$1,$,L as L$1,U,O,M,N as N$1,A as A$1,K,P,z as z$1,i as i$1,B,D,C}from'./chunk-MKTVVRV2.js';export{za as fetchTree,Aa as getItemTargetPath,Ea as getPreset,Da as getPresets,Ba as getRegistries,sa as getRegistriesConfig,Ca as getRegistriesIndex,pa as getRegistry,xa as getRegistryBaseColor,wa as getRegistryBaseColors,va as getRegistryIcons,qa as getRegistryItems,ua as getRegistryStyles,ta as getShadcnRegistryIndex,ra as resolveRegistryItems,ya as resolveTree}from'./chunk-MKTVVRV2.js';import {c,f as f$2,n}from'./chunk-3ORLOMOE.js';import {a as a$1,c as c$2,g as g$1,d as d$1,f as f$1,e as e$1}from'./chunk-7SBJAAAY.js';import {a as a$3}from'./chunk-CHWMSXYA.js';import*as A from'path';import A__default,{join}from'path';import {promises,existsSync}from'fs';import L from'fs-extra';import ys from'open';import ve from'prompts';import xo from'dedent';import bs,{tmpdir}from'os';import {execa}from'execa';import P$1 from'postcss';import Ps from'postcss/lib/at-rule';import Xr,{z}from'zod';import {twMerge}from'tailwind-merge';import {Project,ScriptKind,SyntaxKind,VariableDeclarationKind,Node}from'ts-morph';import vo from'deepmerge';import {Command}from'commander';import {loadConfig}from'tsconfig-paths';import {diffLines,structuredPatch,diffWords}from'diff';import {dim,yellow,bold,green,cyan,red}from'kleur/colors';import*as bt from'fs/promises';import bt__default from'fs/promises';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {randomBytes}from'crypto';import tn from'fast-glob';async function ao(e$1){let t={};if(!L.existsSync(e$1.cwd)||!L.existsSync(A__default.resolve(e$1.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=E("Preflight checks.",{silent:e$1.silent}).start();L.existsSync(A__default.resolve(e$1.cwd,"components.json"))&&!e$1.force&&(r?.fail(),e.break(),e.error(`A ${d.info("components.json")} file already exists at ${d.info(e$1.cwd)}. To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),e.break(),process.exit(1)),r?.succeed();let n=E("Verifying framework.",{silent:e$1.silent}).start(),o=e$1.existingConfig?.tailwind,i=await Fa$1(e$1.cwd,{configCssFile:typeof o?.css=="string"?o.css:void 0});if(!i||i?.framework.name==="manual"){if(t["7"]=true,n?.fail(),!e$1.monorepo&&await f(e$1.cwd)){let f=await g(e$1.cwd);f.length>0&&(h("init",f),process.exit(1));}e.break(),i?.framework.links.installation&&e.error(`We could not detect a supported framework at ${d.info(e$1.cwd)}. Visit ${d.info(i?.framework.links.installation)} to manually configure your project. Once configured, you can use the cli to add components.`),e.break(),process.exit(1);}n?.succeed(`Verifying framework. Found ${d.info(i.framework.label)}.`);let s="Validating Tailwind CSS.";i.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${d.info("v4")}.`);let l=E(s,{silent:e$1.silent}).start();i.tailwindVersion==="v3"&&(!i?.tailwindConfigFile||!i?.tailwindCssFile)?(t["5"]=true,l?.fail()):i.tailwindVersion==="v4"&&!i?.tailwindCssFile?(t["5"]=true,l?.fail()):i.tailwindVersion?l?.succeed():(t["5"]=true,l?.fail());let a$1=E("Validating import alias.",{silent:e$1.silent}).start();return i?.aliasPrefix?a$1?.succeed():(t["6"]=true,a$1?.fail()),Object.keys(t).length>0&&(t["5"]&&(e.break(),e.error(`No Tailwind CSS configuration found at ${d.info(e$1.cwd)}.`),e.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),e.error("Install Tailwind CSS then try again."),i?.framework.links.tailwind&&e.error(`Visit ${d.info(i?.framework.links.tailwind)} to get started.`)),t["6"]&&(e.break(),e.error(`Could not find valid path aliases or package imports for ${d.info("init")}.`),e.error(`Configure path aliases in ${d.info("tsconfig.json")} or imports in ${d.info("package.json")}, then run ${d.info("init")} again.`),e.error(`Learn more at ${d.info(`${a}/docs/installation/manual#configure-import-aliases`)}.`)),e.break(),process.exit(1)),{errors:t,projectInfo:i}}async function co(e,t){let r=new Set,n=new Set,o=[...e];for(;o.length>0;){let i=o.shift();if(n.has(i))continue;n.add(i);let{registry:s}=x(i);s&&!b[s]&&r.add(s);try{let[l]=await ja$1([i],t,{useCache:!0});if(l?.registryDependencies)for(let a of l.registryDependencies){let{registry:f}=x(a);f&&!b[f]&&r.add(f),n.has(a)||o.push(a);}}catch(l){if(l instanceof p$1){let{registry:a}=x(i);a&&!b[a]&&r.add(a);continue}continue}}return Array.from(r)}async function J(e,t,r={}){r={silent:false,writeFile:true,...r};let o=(await co(e,t)).filter(f=>!t.registries?.[f]&&!Object.keys(b).includes(f));if(o.length===0)return {config:t,newRegistries:[]};let i=await Ca({useCache:process.env.NODE_ENV!=="development"});if(!i)return {config:t,newRegistries:[]};let s={};for(let f of o)i[f]&&(s[f]=i[f]);if(Object.keys(s).length===0)return {config:t,newRegistries:[]};let l=Object.fromEntries(Object.entries(t.registries||{}).filter(([f])=>!Object.keys(b).includes(f))),a={...t,registries:{...l,...s}};if(r.writeFile){let{resolvedPaths:f,...m}=a,p=E("Updating components.json.",{silent:r.silent}).start(),u=c.parse(m);await L.writeFile(A__default.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+` `,"utf-8"),p.succeed();}return {config:a,newRegistries:Object.keys(s)}}var Z={nova:{title:"Nova",description:"Lucide / Geist",style:"nova",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"geist",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},vega:{title:"Vega",description:"Lucide / Inter",style:"vega",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},maia:{title:"Maia",description:"Hugeicons / Figtree",style:"maia",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"figtree",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},lyra:{title:"Lyra",description:"Phosphor / JetBrains Mono",style:"lyra",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"phosphor",font:"jetbrains-mono",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},mira:{title:"Mira",description:"Hugeicons / Inter",style:"mira",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},luma:{title:"Luma",description:"Lucide / Inter",style:"luma",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},sera:{title:"Sera",description:"Lucide / Noto Sans + Playfair Display",style:"sera",baseColor:"taupe",theme:"taupe",chartColor:"taupe",iconLibrary:"lucide",font:"noto-sans",fontHeading:"playfair-display",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false},rhea:{title:"Rhea",description:"Lucide / Inter",style:"rhea",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:false}};function jr(e){let t=new URL(`${a}/create`),{rtl:r,pointer:n,...o}=e??{};for(let[i,s]of Object.entries(o))s!==void 0&&t.searchParams.set(i,String(s));return r&&t.searchParams.set("rtl","true"),n&&t.searchParams.set("pointer","true"),t.toString()}async function Er(e$1){if(e.break(),e.log(` Build your custom preset on ${d.info(e$1.createUrl)}`),e.log(` ${e$1.followUp}`),e.break(),e$1.prompt===false)return;let{proceed:t}=await ve({type:"confirm",name:"proceed",message:"Open in browser?",initial:true});t&&await ys(e$1.createUrl);}function ye(e,t){let r=new URLSearchParams({base:e.base,style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,font:e.font,rtl:String(e.rtl??false),menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return e.chartColor&&e.chartColor!=="neutral"&&r.set("chartColor",e.chartColor),e.fontHeading&&e.fontHeading!=="inherit"&&r.set("fontHeading",e.fontHeading),t?.preset&&r.set("preset",t.preset),t?.template&&r.set("template",t.template),t?.only&&r.set("only",t.only),t?.pointer&&r.set("pointer","true"),r.set("track","1"),`${a}/init?${r.toString()}`}async function qe(){let{base:e}=await ve({type:"select",name:"base",message:`Select a ${d.info("component library")}`,choices:[{title:"Radix",value:"radix"},{title:"Base",value:"base"}]});return e||process.exit(1),e}async function lt(e){let t=Object.entries(Z),{selectedPreset:r}=await ve({type:"select",name:"selectedPreset",message:`Which ${d.info("preset")} would you like to use?`,choices:[...t.map(([o,i])=>({title:i.title,description:i.description,value:o})),{title:"Custom",description:`Build your own at ${d.info(`${a}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let o=jr({command:"init",rtl:e.rtl,pointer:e.pointer,base:e.base,...e.template&&{template:e.template}});await Er({createUrl:o,followUp:`Then ${d.info("copy and run the command")} from ui.shadcn.com.`}),process.exit(0);}let n=Z[r];return n||process.exit(1),{url:ye({...n,base:e.base,rtl:e.rtl},{template:e.template,pointer:e.pointer}),base:e.base}}async function Te(e,t,r){let n=da$1(ca$1({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:o}=await J([e],n,{silent:true,writeFile:false});n=o,ga$1(e,n);let[i]=await qa$1([e],{config:n,useCache:true}),s=i?.type==="registry:base"&&i.config?i.config:void 0,l=e;if(ws(e)){let a=new URL(e);a.searchParams.delete("track"),l=a.toString();}return {registryBaseConfig:s,installStyleIndex:i?.extends!=="none",url:l}}function ws(e){try{return new URL(e).pathname==="/init"&&e.startsWith(a)}catch{return false}}var ks=process.env.SHADCN_GITHUB_URL??"https://github.com/shadcn-ui/ui.git";function X(e){return {...e,frameworks:e.frameworks??[],scaffold:e.scaffold??fo({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??xs}}function Ne(e,{monorepo:t}){if(!t||!e.monorepo)return e;let r=e.monorepo,n={...e,templateDir:r.templateDir,defaultProjectName:r.defaultProjectName??r.templateDir,init:r.init??e.init,files:r.files??e.files};return n.scaffold=fo({title:e.title,templateDir:r.templateDir}),n}function Cs(e){switch(e){case "pnpm":return ["--no-frozen-lockfile"];case "yarn":return ["--no-immutable"];default:return []}}async function Rs(e,t){if(t==="pnpm")return;let r=A__default.join(e,"pnpm-workspace.yaml"),n=A__default.join(e,"package.json"),o=A__default.join(e,"pnpm-lock.yaml");L.existsSync(o)&&await L.remove(o);let i=L.existsSync(r),s=i?i$1(await L.readFile(r,"utf8")):[],l=s.length>0;if(L.existsSync(n)){let a=await L.readFile(n,"utf8"),f=JSON.parse(a);l?f.packageManager=await vs(t):delete f.packageManager,l&&(f.workspaces=s),await L.writeFile(n,JSON.stringify(f,null,2)+` `);}i&&await L.remove(r),l&&t==="npm"&&await lo(e);}async function vs(e){try{let{stdout:t}=await execa(e,["--version"]);return `${e}@${t.trim()}`}catch{return `${e}@*`}}async function lo(e){let t=await L.readdir(e,{withFileTypes:true});for(let r of t){if(r.name==="node_modules")continue;let n=A__default.join(e,r.name);if(r.isDirectory())await lo(n);else if(r.name==="package.json"){let o=await L.readFile(n,"utf8");if(!o.includes("workspace:"))continue;let i=JSON.parse(o),s=false;for(let l of ["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let a=i[l];if(a)for(let[f,m]of Object.entries(a))typeof m=="string"&&m.startsWith("workspace:")&&(a[f]="*",s=true);}s&&await L.writeFile(n,JSON.stringify(i,null,2)+` `);}}}function fo({title:e,templateDir:t}){return async({projectPath:r,packageManager:n})=>{let o=E(`Creating a new ${e} project. This may take a few minutes.`).start();try{let i=process.env.SHADCN_TEMPLATE_DIR;if(i){let f=A__default.resolve(i,t);await L.copy(f,r,{filter:m=>!m.includes("node_modules")});}else {let f=A__default.join(bs.tmpdir(),`shadcn-template-${Date.now()}`);await execa("git",["clone","--depth","1","--filter=blob:none","--sparse",ks,f]),await execa("git",["-C",f,"sparse-checkout","set",`templates/${t}`]);let m=A__default.resolve(f,"templates",t);await L.move(m,r),await L.remove(f);}await Rs(r,n);let l=["install",...Cs(n)];await execa(n,l,{cwd:r});let a=A__default.join(r,"package.json");if(L.existsSync(a)){let f=await L.readFile(a,"utf8"),m=JSON.parse(f);m.name=A__default.basename(r),await L.writeFile(a,JSON.stringify(m,null,2)+` `);}o?.succeed(`Creating a new ${e} project.`);}catch(i){o?.fail(`Something went wrong creating a new ${e} project.`),oa$1(i);}}}async function xs({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 mo={"--font-heading":"cn-font-heading"};function Ss(e){return e.startsWith("--")?e:`--${e}`}function Oe(e){let t=new Set;for(let r of e){for(let n of r.fonts??[]){let o=n.font?.variable;if(!o)continue;let i=mo[o];i&&t.add(i);}for(let n of Object.values(r.cssVars??{}))for(let o of Object.keys(n??{})){let i=mo[Ss(o)];i&&t.add(i);}}return Array.from(t)}function po(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 n=A__default.normalize(r.replace(/\\/g,"/")),o=A__default.normalize(t),i=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(i(n)||i(r)||i(e))return false;let s=u=>u.replace(/\[\.\.\..*?\]/g,""),l=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(l)||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(A__default.isAbsolute(n))return n.startsWith(o+A__default.sep);let p=A__default.resolve(o,n);return p.startsWith(o+A__default.sep)||p===o}async function Jt(e,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:false,silent:false,tailwindVersion:"v3",overwriteCssVars:false,...r};let n=t.resolvedPaths.tailwindCss,o=A__default.relative(t.resolvedPaths.cwd,n),i=E(`Updating CSS variables in ${d.info(o)}`,{silent:r.silent}).start(),s=await promises.readFile(n,"utf8"),l=await ft(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars});await promises.writeFile(n,l,"utf8"),i.succeed();}async function ft(e,t,r,n={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false}){n={cleanupDefaultNextStyles:false,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:false,...n};let o=[$s(t)];n.cleanupDefaultNextStyles&&o.push(ho()),n.tailwindVersion==="v4"&&(o=[],o.push(Ts({params:"dark (&:is(.dark *))"})),n.cleanupDefaultNextStyles&&o.push(ho()),o.push(Es(t,{overwriteCssVars:n.overwriteCssVars})),o.push(Fs(t)),n.tailwindConfig&&(o.push(As(n.tailwindConfig)),o.push(Os(n.tailwindConfig)),o.push(Ns(n.tailwindConfig))));let s=(await P$1(o).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),n.tailwindVersion==="v4"&&(s=s.replace(/(\n\s*\n)+/g,` `)),s}function $s(e){return {postcssPlugin:"update-css-vars",Once(t){let r=t.nodes.find(n=>n.type==="atrule"&&n.name==="layer"&&n.params==="base");r instanceof Ps||(r=P$1.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:true,before:` `,between:" "}}),t.append(r),t.insertBefore(r,P$1.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([n,o])=>{let i=n==="light"?":root":`.${n}`;js(r,i,o);});}}}function go(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector===":root");if(t){let r=["--background","--foreground"];t.nodes.filter(n=>n.type==="decl"&&r.includes(n.prop)).forEach(n=>n.remove()),t.nodes.length===0&&t.remove();}}function ho(){return {postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(n=>n.type==="rule"&&n.selector==="body");t&&(t.nodes.find(n=>n.type==="decl"&&n.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(n.value))?.remove(),t.nodes.find(n=>n.type==="decl"&&n.prop==="background"&&(n.value.startsWith("linear-gradient")||n.value==="var(--background)"))?.remove(),t.nodes.find(n=>n.type==="decl"&&n.prop==="font-family"&&n.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),go(e);let r=e.nodes.find(n=>n.type==="atrule"&&n.params==="(prefers-color-scheme: dark)");r&&(go(r),r.nodes.length===0&&r.remove());}}}function js(e,t,r){let n=e.nodes?.find(o=>o.type==="rule"&&o.selector===t);n||Object.keys(r).length>0&&(n=P$1.rule({selector:t,raws:{between:" ",before:` `}}),e.append(n)),Object.entries(r).forEach(([o,i])=>{let s=`--${o.replace(/^--/,"")}`,l=P$1.decl({prop:s,value:i,raws:{semicolon:true}}),a=n?.nodes.find(f=>f.type==="decl"&&f.prop===s);a?a.replaceWith(l):n?.append(l);});}function Es(e,t){return {postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([n,o])=>{let i=n==="light"?":root":`.${n}`;if(n==="theme"){i="@theme";let l=Gt(r);Object.entries(o).forEach(([a,f])=>{let m=`--${a.replace(/^--/,"")}`,p=P$1.decl({prop:m,value:f,raws:{semicolon:true}}),u=l?.nodes?.find(h=>h.type==="decl"&&h.prop===m);t.overwriteCssVars?u?u.replaceWith(p):l?.append(p):u||l?.append(p);});return}let s=r.nodes?.find(l=>l.type==="rule"&&l.selector===i);!s&&Object.keys(o).length>0&&(s=P$1.rule({selector:i,nodes:[],raws:{semicolon:true,between:" ",before:` `}}),r.append(s),r.insertBefore(s,P$1.comment({text:"---break---"}))),Object.entries(o).forEach(([l,a])=>{let f=`--${l.replace(/^--/,"")}`;f==="--sidebar-background"&&(f="--sidebar"),yo(a)&&(a=`hsl(${a})`);let m=P$1.decl({prop:f,value:a,raws:{semicolon:true}}),p=s?.nodes.find(u=>u.type==="decl"&&u.prop===f);t.overwriteCssVars?p?p.replaceWith(m):s?.append(m):p||s?.append(m);});});}}}function Fs(e){return {postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(i=>Object.keys(e[i]||{}))));if(!r.length)return;let n=Gt(t),o=n.nodes?.filter(i=>i.type==="decl"&&i.prop.startsWith("--"));for(let i of r){let s=Object.values(e).find(p=>p[i])?.[i];if(!s)continue;if(i==="radius"){let p={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(p)){let g=P$1.decl({prop:`--radius-${u}`,value:h,raws:{semicolon:true}});n?.nodes?.find(y=>y.type==="decl"&&y.prop===g.prop)||n?.append(g);}continue}let l=yo(s)||Ds(s)?`--color-${i.replace(/^--/,"")}`:`--${i.replace(/^--/,"")}`;l==="--color-sidebar-background"&&(l="--color-sidebar");let a=`var(--${i})`;l==="--color-sidebar"&&(a="var(--sidebar)");let f=P$1.decl({prop:l,value:a,raws:{semicolon:true}});n?.nodes?.find(p=>p.type==="decl"&&p.prop===f.prop)||(o?.length?n?.insertAfter(o[o.length-1],f):n?.append(f));}}}}function Gt(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:` `}}),e.append(t),e.insertBefore(t,P$1.comment({text:"---break---"}))),t}function Ts({params:e}){return {postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(n=>n.type==="atrule"&&n.name==="custom-variant")){let n=t.nodes.filter(i=>i.type==="atrule"&&i.name==="import"),o=P$1.atRule({name:"custom-variant",params:e,raws:{semicolon:true,before:` `}});if(n.length>0){let i=n[n.length-1];t.insertAfter(i,o);}else t.insertAfter(t.nodes[0],o);t.insertBefore(o,P$1.comment({text:"---break---"}));}}}}function As(e){return {postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let n=Vs(t)==="single"?"'":'"',o=t.nodes.filter(s=>s.type==="atrule"&&s.name==="plugin"),i=o[o.length-1]||t.nodes[0];for(let s of e.plugins){let l=s.replace(/^require\(["']|["']\)$/g,"");if(o.some(f=>f.params.replace(/["']/g,"")===l))continue;let a=P$1.atRule({name:"plugin",params:`${n}${l}${n}`,raws:{semicolon:true,before:` `}});t.insertAfter(i,a),t.insertBefore(a,P$1.comment({text:"---break---"}));}}}}function Ns(e){return {postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=Gt(t),n=r.nodes?.filter(i=>i.type==="atrule"&&i.name==="keyframes"),o=z.record(z.string(),z.record(z.string(),z.string()));for(let[i,s]of Object.entries(e.theme.extend.keyframes)){if(typeof i!="string")continue;let l=o.safeParse(s);if(!l.success||n?.find(f=>f.type==="atrule"&&f.name==="keyframes"&&f.params===i))continue;let a=P$1.atRule({name:"keyframes",params:i,nodes:[],raws:{semicolon:true,between:" ",before:` `}});for(let[f,m]of Object.entries(l.data)){let p=P$1.rule({selector:f,nodes:Object.entries(m).map(([u,h])=>P$1.decl({prop:u,value:h,raws:{semicolon:true,before:` `,between:": "}})),raws:{semicolon:true,between:" ",before:` `}});a.append(p);}r.append(a),r.insertBefore(a,P$1.comment({text:"---break---"}));}}}}function Os(e){return {postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Gt(t),n=r.nodes?.filter(i=>i.type==="decl"&&i.prop.startsWith("--animate-")),o=z.record(z.string(),z.string()).safeParse(e.theme.extend.animation);if(o.success)for(let[i,s]of Object.entries(o.data)){let l=`--animate-${i}`;if(n?.find(f=>f.prop===l))continue;let a=P$1.decl({prop:l,value:s,raws:{semicolon:true,between:": ",before:` `}});r.append(a);}}}}function Vs(e){return e.nodes[0].toString().includes("'")?"single":"double"}function yo(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 Ds(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}async function mt(e,t,r){let n=e&&Object.keys(e).length>0,o=Object.keys(r.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!n&&!o)return;r={silent:false,...r};let i=t.resolvedPaths.tailwindCss,s=A__default.relative(t.resolvedPaths.cwd,i),l=E(`Updating ${d.info(s)}`,{silent:r.silent}).start(),a=await promises.readFile(i,"utf8");o&&(a=await ft(a,r.cssVars,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars})),n&&(a=await Fr(a,e)),await promises.writeFile(i,a,"utf8"),l.succeed();}async function Fr(e,t){let r=[Us(t)],n=await P$1(r).process(e,{from:void 0}),o=n.css,i=n.root;if(i.nodes&&i.nodes.length>0){let s=i.nodes[i.nodes.length-1];s.type==="atrule"&&!s.nodes&&!o.trimEnd().endsWith(";")&&(o=o.trimEnd()+";");}return o=o.replace(/\/\* ---break--- \*\//g,""),o=o.replace(/(\n\s*\n)+/g,` `),o=o.trimEnd(),o}function Us(e){return {postcssPlugin:"update-css",Once(t){for(let[r,n]of Object.entries(e))if(r.startsWith("@")){let o=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!o)continue;let[,i,s]=o;if(i==="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(m=>m.type==="atrule"&&m.name==="import");if(f&&f.length>0){let m=f[f.length-1];a.raws.before=` `,t.insertAfter(m,a);}else !t.nodes||t.nodes.length,a.raws.before="",t.prepend(a);}}else if(i==="plugin"){let l=s;s&&!s.startsWith('"')&&!s.startsWith("'")&&(l=`"${s}"`);let a=m=>m.startsWith('"')&&m.endsWith('"')||m.startsWith("'")&&m.endsWith("'")?m.slice(1,-1):m;if(!t.nodes?.find(m=>m.type!=="atrule"||m.name!=="plugin"?false:a(m.params)===a(s))){let m=P$1.atRule({name:"plugin",params:l,raws:{semicolon:true,before:` `}}),p=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,m);}else if(p&&p.length>0){let h=p[p.length-1];t.insertAfter(h,m),t.insertBefore(m,P$1.comment({text:"---break---"})),t.insertAfter(m,P$1.comment({text:"---break---"}));}else t.prepend(m),t.insertBefore(m,P$1.comment({text:"---break---"})),t.insertAfter(m,P$1.comment({text:"---break---"}));}}else if(typeof n=="object"&&Object.keys(n).length===0){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name===i&&a.params===s)){let a=P$1.atRule({name:i,params:s,raws:{semicolon:true}});t.append(a),t.insertBefore(a,P$1.comment({text:"---break---"}));}}else if(i==="keyframes"){let l=t.nodes?.find(m=>m.type==="atrule"&&m.name==="theme"&&m.params==="inline");l||(l=P$1.atRule({name:"theme",params:"inline",raws:{semicolon:true,between:" ",before:` `}}),t.append(l),t.insertBefore(l,P$1.comment({text:"---break---"})));let a=l.nodes?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===s),f;if(a?(f=P$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:` `}}),a.replaceWith(f)):(f=P$1.atRule({name:"keyframes",params:s,raws:{semicolon:true,between:" ",before:` `}}),l.append(f)),typeof n=="object")for(let[m,p]of Object.entries(n))Ve(f,m,p);}else if(i==="utility"){let l=t.nodes?.find(a=>a.type==="atrule"&&a.name===i&&a.params===s);if(l){if(typeof n=="object")for(let[a,f]of Object.entries(n))if(typeof f=="string"){let m=l.nodes?.find(u=>u.type==="decl"&&u.prop===a),p=P$1.decl({prop:a,value:f,raws:{semicolon:true,before:` `}});m?m.replaceWith(p):l.append(p);}else if(a.startsWith("@")&&typeof f=="object"&&f!==null&&Object.keys(f).length===0){let m=a.match(/@([a-zA-Z-]+)\s*(.*)/);if(m){let[,p,u]=m;if(!l.nodes?.find(g=>g.type==="atrule"&&g.name===p&&g.params===u)){let g=P$1.atRule({name:p,params:u,raws:{semicolon:true,before:` `}});l.append(g);}}}else typeof f=="object"&&Ve(l,a,f);}else {let a=P$1.atRule({name:i,params:s,raws:{semicolon:true,between:" ",before:` `}});if(t.append(a),t.insertBefore(a,P$1.comment({text:"---break---"})),typeof n=="object")for(let[f,m]of Object.entries(n))if(typeof m=="string"){let p=P$1.decl({prop:f,value:m,raws:{semicolon:true,before:` `}});a.append(p);}else if(f.startsWith("@")&&typeof m=="object"&&m!==null&&Object.keys(m).length===0){let p=f.match(/@([a-zA-Z-]+)\s*(.*)/);if(p){let[,u,h]=p;if(!a.nodes?.find(y=>y.type==="atrule"&&y.name===u&&y.params===h)){let y=P$1.atRule({name:u,params:h,raws:{semicolon:true,before:` `}});a.append(y);}}}else typeof m=="object"&&Ve(a,f,m);}}else i==="property"?Ve(t,r,n):bo(t,i,s,n);}else Ve(t,r,n);}}}function bo(e,t,r,n){let o=e.nodes?.find(i=>i.type==="atrule"&&i.name===t&&i.params===r);if(o||(o=P$1.atRule({name:t,params:r,raws:{semicolon:true,between:" ",before:` `}}),e.append(o),e.insertBefore(o,P$1.comment({text:"---break---"}))),typeof n=="object")for(let[i,s]of Object.entries(n))if(i.startsWith("@")){let l=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(l){let[,a,f]=l;bo(o,a,f,s);}}else Ve(o,i,s);else if(typeof n=="string")try{let s=P$1.parse(`.temp{${n}}`).first;if(s&&s.nodes){let l=P$1.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:` `}});s.nodes.forEach(a=>{if(a.type==="decl"){let f=a.clone();f.raws.before=` `,l.append(f);}}),l.nodes?.length&&o.append(l);}}catch(i){throw console.error("Error parsing at-rule content:",n,i),i}}function Ve(e,t,r){let n=e.nodes?.find(o=>o.type==="rule"&&o.selector===t);if(n||(n=P$1.rule({selector:t,raws:{semicolon:true,between:" ",before:` `}}),e.append(n)),typeof r=="object"){for(let[o,i]of Object.entries(r))if(o.startsWith("@")&&typeof i=="object"&&i!==null&&Object.keys(i).length===0){let s=o.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,l,a]=s;if(!n.nodes?.find(m=>m.type==="atrule"&&m.name===l&&m.params===a)){if(l==="apply"){let p=n.nodes?.find(u=>u.type==="atrule"&&u.name==="apply");if(p){p.params=twMerge(p.params,a);continue}}let m=P$1.atRule({name:l,params:a,raws:{semicolon:true,before:` `}});n.append(m);}}}else if(typeof i=="string"){let s=P$1.decl({prop:o,value:i,raws:{semicolon:true,before:` `}}),l=n.nodes?.find(a=>a.type==="decl"&&a.prop===o);l?l.replaceWith(s):n.append(s);}else if(typeof i=="object"){let s=o.startsWith("&")?t.replace(/^([^:]+)/,`$1${o.substring(1)}`):o;Ve(e,s,i);}}else if(typeof r=="string")try{let i=P$1.parse(`.temp{${r}}`).first;i&&i.nodes&&i.nodes.forEach(s=>{if(s.type==="decl"){let l=s.clone();l.raws.before=` `,n?.append(l);}});}catch(o){throw console.error("Error parsing rule content:",t,r,o),o}}async function _(e$1,t,r,n){if(e$1=Array.from(new Set(e$1)),t=Array.from(new Set(t)),!e$1?.length&&!t?.length)return;n={silent:false,...n};let o=E("Installing dependencies.",{silent:n.silent})?.start(),i=await Bs(r),s="";if(Ws(r)&&i==="npm")if(n.silent)s="force";else {o.stopAndPersist(),e.warn(` It looks like you are using React 19. Some packages may fail to install due to peer dependency issues in npm (see ${a}/react-19). `);let l=await ve([{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"}]}]);l&&(s=l.flag);}o?.start(),await zs(i,e$1,t,r.resolvedPaths.cwd,s),o?.succeed();}function Ws(e){let t=y(e.resolvedPaths.cwd,false);if(!t?.dependencies?.react)return false;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),n=t.dependencies["react-day-picker"]?.startsWith("8");return r&&n}async function Bs(e){return y(e.resolvedPaths.cwd,false)?.dependencies?.expo?"expo":la$1(e.resolvedPaths.cwd)}async function zs(e,t,r,n,o){if(e==="npm")return Hs(t,r,n,o);if(e==="deno")return Js(t,r,n);if(e==="expo")return Gs(t,r,n);t?.length&&await execa(e,["add",...t],{cwd:n}),r?.length&&await execa(e,["add","-D",...r],{cwd:n});}async function Hs(e,t,r,n){e.length&&await execa("npm",["install",...n?[`--${n}`]:[],...e],{cwd:r}),t.length&&await execa("npm",["install",...n?[`--${n}`]:[],"-D",...t],{cwd:r});}async function Js(e,t,r){e?.length&&await execa("deno",["add",...e.map(n=>`npm:${n}`)],{cwd:r}),t?.length&&await execa("deno",["add","-D",...t.map(n=>`npm:${n}`)],{cwd:r});}async function Gs(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 Ar(e$1,t,r){if(!e$1||Object.keys(e$1).length===0)return {envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:false,...r};let n=E("Adding environment variables.",{silent:r.silent})?.start(),o=t.resolvedPaths.cwd,i=A__default.join(o,".env.local"),s=B(o);s&&(i=s);let l=existsSync(i),a=A__default.basename(i),f=Object.entries(e$1).map(([h,g])=>`${h}=${g}`).join(` `),m=[],p=null,u=null;if(l){let h=await promises.readFile(i,"utf-8"),g=D(h,f);if(m=C(h,f),m.length>0){if(await promises.writeFile(i,g,"utf-8"),p=A__default.relative(o,i),n?.succeed(`Added the following variables to ${d.info(a)}:`),!r.silent)for(let y of m)e.log(` ${d.success("+")} ${y}`);}else n?.stop();}else if(await promises.writeFile(i,f+` `,"utf-8"),u=A__default.relative(o,i),m=Object.keys(e$1),n?.succeed(`Added the following variables to ${d.info(a)}:`),!r.silent)for(let h of m)e.log(` ${d.success("+")} ${h}`);return !r.silent&&m.length>0&&e.break(),{envVarsAdded:m,envFileUpdated:p,envFileCreated:u}}var ea=new Set(["--font-sans","--font-serif","--font-mono"]);async function ut(e,t){if(!e.fonts?.length)return e;let r=await Fa$1(t.resolvedPaths.cwd);if(!r)return e;e.cssVars??={},e.cssVars.theme??={};let n=r.framework.name==="next-app"||r.framework.name==="next-pages";for(let o of e.fonts)if(n)e.cssVars.theme[o.font.variable]=`var(${o.font.variable})`;else {let i=o.name.replace("font-",""),s=o.font.dependency??`@fontsource-variable/${i}`;e.dependencies??=[],e.dependencies.push(s),e.css??={},e.css[`@import "${s}"`]={},e.cssVars.theme[o.font.variable]=o.font.family;}if(e.fonts.length>0){let o=new Map;for(let i of e.fonts){let s=i.font.selector??ia(i.font.variable);if(!s)continue;let l=i.font.variable.replace("--","");o.has(s)||o.set(s,[]),o.get(s).push(l);}e.css??={},e.css["@layer base"]??={};for(let[i,s]of Array.from(o.entries())){let l=s.join(" ");e.css["@layer base"][i]??={};let a=Object.keys(e.css["@layer base"][i]).find(f=>f.startsWith("@apply "));a?(delete e.css["@layer base"][i][a],e.css["@layer base"][i][`${a} ${l}`]={}):e.css["@layer base"][i][`@apply ${l}`]={};}}return e}async function dt(e,t,r){if(!e?.length)return;let n=await Fa$1(t.resolvedPaths.cwd);if(!n||n.framework.name!=="next-app"&&n.framework.name!=="next-pages")return;let o=E("Updating fonts.",{silent:r.silent})?.start();try{await ta(e,t,n),o?.succeed("Updating fonts.");}catch(i){throw o?.fail("Failed to update fonts."),i}}async function ta(e,t,r){let n=await ra(t,r);if(!n)return;let o=await promises.readFile(n,"utf-8"),i=await na(o,e,t);i!==o&&await promises.writeFile(n,i,"utf-8");}async function ra(e,t){let r=e.resolvedPaths.cwd,n=t.isSrcDir,i=t.isTsx?"tsx":"jsx",s=n?[`src/app/layout.${i}`,`app/layout.${i}`]:[`app/layout.${i}`];for(let l of s){let a=A__default.join(r,l);if(existsSync(a))return a}return null}async function na(e,t,r){let o=new Project({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:ScriptKind.TSX}),i=t.filter(p=>p.font.provider==="google"),s=[],l=[];for(let p of i){let u=p.font.import;if(!u)continue;let h=o.getImportDeclaration(x=>x.getModuleSpecifierValue()==="next/font/google"),g=false;h?(g=h.getNamedImports().some(R=>R.getName()===u),g||h.addNamedImport(u)):o.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[u]});let y=aa(u,p.font.variable),k=oa(p),C=fa(o,p.font.variable),I=y;if(!(g&&!C&&Yt(p.font.variable)&&!ma(o,u))){if(C)C.setInitializer(`${u}(${k})`),C.getName()!==y&&C.rename(y),I=y;else {let x=pa(o);o.insertVariableStatement(x,{declarationKind:VariableDeclarationKind.Const,declarations:[{name:y,initializer:`${u}(${k})`}]}).appendWhitespace(` `);}s.push(I),sa(p)&&l.push(p.font.variable.replace("--",""));}}let a=new Set(["font-sans","font-serif","font-mono"]),f=[...l].reverse().find(p=>a.has(p)),m=l.filter(p=>!a.has(p));return f&&m.unshift(f),s.length>0&&ua(o,s,m,r),o.getFullText()}function oa(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 Yt(e){return ea.has(e)}function ia(e){return Yt(e)?"html":null}function sa(e){return !e.font.selector&&Yt(e.font.variable)}function aa(e,t){let r=ca(e);return Yt(t)?r:`${r}${la(t.replace(/^--font-/,""))}`}function ca(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function la(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function fa(e,t){let r=e.getVariableStatements();for(let n of r)for(let o of n.getDeclarations()){let i=o.getInitializer();if(!i||i.getKind()!==SyntaxKind.CallExpression)continue;let l=i.getArguments();if(l.length===0)continue;let a=l[0].getText();if(a.includes("variable:")&&a.includes(t))return o}return null}function ma(e,t){let r=e.getVariableStatements();for(let n of r)for(let o of n.getDeclarations()){let i=o.getInitializer();if(!i||i.getKind()!==SyntaxKind.CallExpression)continue;let s=i;if(s.getExpression().getText()!==t)continue;let l=s.getArguments();if(!l.length)continue;let a=l[0].getText();if(a.includes("variable:")&&a.includes("--font-heading"))return true}return false}function pa(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function ua(e,t,r,n){let o=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);for(let i of o){if(i.getTagNameNode().getText()!=="html")continue;let l=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),f=[...l,...a],m=i.getAttribute("className");if(!m){pt(e,n),i.addAttribute({name:"className",initializer:`{cn(${f.join(", ")})}`});return}if(m.getKind()!==SyntaxKind.JsxAttribute)return;let p=m.asKindOrThrow(SyntaxKind.JsxAttribute),u=p.getInitializer();if(!u)return;if(u.getKind()===SyntaxKind.StringLiteral){let h=u.getText().slice(1,-1);pt(e,n),p.setInitializer(`{cn("${h}", ${f.join(", ")})}`);}else if(u.getKind()===SyntaxKind.JsxExpression){let h=u.asKindOrThrow(SyntaxKind.JsxExpression),g=h.getExpression();if(!g)return;let y=g.getText();if(y.startsWith("cn(")){let k=a.every($=>y.includes($)),C=r.every($=>y.includes(`"${$}"`)),I=["font-sans","font-serif","font-mono"].filter($=>!r.includes($)).some($=>y.includes(`"${$}"`));if(k&&C&&!I)continue;let x=ga(y,a);x=ha(x);let R=ya(x,f);h.replaceWithText(`{${R}}`);}else if(/^\w+\.variable$/.test(y)){if(a.includes(y)&&r.length===0)continue;pt(e,n);let C=(y.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(C?`{cn(${y}, ${f.join(", ")})}`:`{cn(${f.join(", ")})}`);}else if(y.startsWith("`")&&y.endsWith("`")){let k=da(y);pt(e,n);let C=new Set(f),I=new Set(["font-sans","font-serif","font-mono"].map(R=>`"${R}"`)),x=k.filter(R=>!C.has(R)&&!I.has(R));h.replaceWithText(`{cn(${[...x,...f].join(", ")})}`);}else pt(e,n),h.replaceWithText(`{cn(${y}, ${f.join(", ")})}`);}}}function pt(e,t){if(!e.getImportDeclaration(n=>n.getNamedImports().some(i=>i.getName()==="cn"))){let n=e.getImportDeclaration(o=>o.getModuleSpecifierValue().includes("/lib/utils"));n?n.getNamedImports().some(i=>i.getName()==="cn")||n.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]});}}function da(e){let t=[],r=[],o=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let i of o)if(i)if(i.startsWith("${")&&i.endsWith("}")){let s=i.slice(2,-1).trim();s&&r.push(s);}else {let s=i.trim().split(/\s+/).filter(Boolean);for(let l of s)t.push(`"${l}"`);}return [...t,...r]}function ga(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 ha(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 ya(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}async function ue(e,t,r){r={overwrite:false,silent:false,isNewProject:false,...r};let n=await _$1(t);return n&&n.ui&&n.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await ka(e,t,n,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await ba(e,t,{...r,skipFonts:r.skipFonts})}async function ba(e$1,t,r){if(!e$1.length)return;let n=E("Checking registry.",{silent:r.silent})?.start(),o=await ka$1(e$1,da$1(t));if(!o)return n?.fail(),oa$1(new Error("Failed to fetch components from registry."));try{Ro(o.files??[],t.resolvedPaths.cwd);}catch(a){return n?.fail(),oa$1(a)}n?.succeed();let i=await Ha$1(t);r.skipFonts||(o=await ut(o,t));let s=Oe([o]);await _(o.dependencies,o.devDependencies,t,{silent:r.silent}),await ia$1(o.tailwind?.config,t,{silent:r.silent,tailwindVersion:i}),await Ar(o.envVars,t,{silent:r.silent}),r.skipFonts||await dt(o.fonts,t,{silent:r.silent}),await L$1(o.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let l=o.cssVars?r.overwriteCssVars??await Co(e$1,t):void 0;await mt(o.css,t,{silent:r.silent,cssVars:o.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:l,tailwindVersion:i,tailwindConfig:o.tailwind?.config}),o.docs&&e.info(o.docs);}async function ka(e$1,t,r,n){if(!e$1.length)return;let o=E("Checking registry.",{silent:n.silent})?.start(),i=await ka$1(e$1,da$1(t));if(!i)return o?.fail(),oa$1(new Error("Failed to fetch components from registry."));try{Ro(i.files??[],t.resolvedPaths.cwd);}catch(j){return o?.fail(),oa$1(j)}o?.succeed();let s=[],l=[],a=[],f=E("Installing components.")?.start(),m=r.ui,p=await Ha$1(m),u=aa$1(t.resolvedPaths.cwd,m.resolvedPaths.ui);i=await ut(i,t);let h=Oe([i]);await _(i.dependencies,i.devDependencies,m,{silent:true}),i.tailwind?.config&&(await ia$1(i.tailwind?.config,m,{silent:true,tailwindVersion:p}),l.push(A__default.relative(u,m.resolvedPaths.tailwindConfig))),i.envVars&&await Ar(i.envVars,m,{silent:true}),await dt(i.fonts,t,{silent:true});let g=["components","ui","lib","hooks"],y=new Map,k={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"},C=j=>g.includes(j),I=j=>{let ae=j?.match(/^@([^/]+)\//);return ae&&C(ae[1])?ae[1]:null},x=j=>I(j.target)??k[j.type||"registry:ui"]??"components",R=j=>j&&r[j]?r[j]:t;for(let j of i.files??[]){let ae=x(j);y.has(ae)||y.set(ae,[]),y.get(ae).push(j);}for(let j of Array.from(y.keys())){let ae=y.get(j),We=R(j),us=(i.files??[]).filter(je=>R(x(je)).resolvedPaths.cwd===We.resolvedPaths.cwd),jt=aa$1(t.resolvedPaths.cwd,We.resolvedPaths.ui||We.resolvedPaths.cwd),br=await $(jt,We.resolvedPaths.cwd)??We.resolvedPaths.cwd,kr=await L$1(ae,We,{overwrite:n.overwrite,silent:true,rootSpinner:f,isRemote:n.isRemote,isWorkspace:true,path:n.path,plannedFiles:us,supportedFontMarkers:h});s.push(...kr.filesCreated.map(je=>A__default.relative(jt,A__default.join(br,je)))),l.push(...kr.filesUpdated.map(je=>A__default.relative(jt,A__default.join(br,je)))),a.push(...kr.filesSkipped.map(je=>A__default.relative(jt,A__default.join(br,je))));}let $$1=i.cssVars?n.overwriteCssVars??await Co(e$1,t):void 0;await mt(i.css,m,{silent:true,cssVars:i.cssVars,overwriteCssVars:$$1,tailwindVersion:p,tailwindConfig:i.tailwind?.config}),(i.cssVars||i.css)&&l.push(A__default.relative(u,m.resolvedPaths.tailwindCss)),f?.succeed();let U=Array.from(new Set(s)).sort(),Y=Array.from(new Set(l.filter(j=>!s.includes(j)))).sort(),$e=Array.from(new Set(a)).sort();if(!(U.length||Y.length)&&!$e.length&&E("No files updated.",{silent:n.silent})?.info(),U.length){E(`Created ${U.length} ${U.length===1?"file":"files"}:`,{silent:n.silent})?.succeed();for(let j of U)e.log(` - ${j}`);}if(Y.length){E(`Updated ${Y.length} ${Y.length===1?"file":"files"}:`,{silent:n.silent})?.info();for(let j of Y)e.log(` - ${j}`);}if($e.length){E(`Skipped ${$e.length} ${$e.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info();for(let j of $e)e.log(` - ${j}`);}i.docs&&e.info(i.docs);}async function Co(e,t){let r=await qa$1(e,{config:t});return z.array(n).parse(r).some(o=>o.type==="registry:theme"||o.type==="registry:style"||o.type==="registry:font"||o.type==="registry:base")}function Ro(e,t){for(let r of e)if(r?.target&&!po(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}async function Re(e){let t=A__default.resolve(e.projectPath,"packages/ui"),r=A__default.resolve(e.projectPath,"apps/web"),n=A__default.resolve(t,"components.json"),o=await L.readJson(n);e.registryBaseConfig&&(o=vo(o,e.registryBaseConfig)),o.tailwind.baseColor="neutral",e.rtl&&(o.rtl=true),e.menuColor&&(o.menuColor=e.menuColor),e.menuAccent&&(o.menuAccent=e.menuAccent),e.iconLibrary&&(o.iconLibrary=e.iconLibrary),await L.writeJson(n,o,{spaces:2});let i=A__default.resolve(r,"components.json"),s=await L.readJson(i);e.registryBaseConfig&&(s=vo(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 L.writeJson(i,s,{spaces:2});let l=await Z$1(t,c.parse(o)),{config:a}=await J(e.components,l,{silent:true});await ue(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let f=await Z$1(r,c.parse(s)),m=await ka$1(e.components,da$1(a));if(m?.fonts?.length){let u={},h=new Set;for(let g of m.fonts){let y=g.name.replace(/^font-heading-/,"").replace("font-",""),k=g.font.dependency??`@fontsource-variable/${y}`;u[g.font.variable]=g.font.family,h.add(k);}await _(Array.from(h),[],l,{silent:true}),await Jt({theme:u},l,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await mt(Object.fromEntries(Array.from(h).map(g=>[`@import "${g}"`,{}])),l,{silent:e.silent});}let p=l.iconLibrary;if(p&&p in a$3){let u=[...a$3[p].packages];await _(u,[],l,{silent:true}),await _(u,[],f,{silent:true});}return f}var So=X({name:"astro",title:"Astro",defaultProjectName:"astro-app",templateDir:"astro-app",frameworks:["astro"],create:async()=>{},files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:xo`--- import Layout from "@/layouts/main.astro" import { ComponentExample } from "@/components/component-example" --- <Layout> <ComponentExample client:load /> </Layout> `}],monorepo:{templateDir:"astro-monorepo",init:Re,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:xo`--- import "@workspace/ui/globals.css" import { ComponentExample } from "@/components/component-example" --- <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width" /> <title>Astro App</title> </head> <body> <ComponentExample client:load /> </body> </html> `}]}});var Io=X({name:"laravel",title:"Laravel",description:"Requires `laravel new`",defaultProjectName:"laravel-app",templateDir:"laravel-app",frameworks:["laravel"],scaffold:async()=>{e.break(),e.log(` Please create a new app with ${d.info("laravel new --react")} first then run ${d.info("shadcn init")}.`),e.log(` See ${d.info(`${a}/docs/installation/laravel`)} for more information.`),e.break(),process.exit(0);},create:async()=>{}});var jo=X({name:"next",title:"Next.js",defaultProjectName:"next-app",templateDir:"next-app",frameworks:["next-app","next-pages"],create:async()=>{},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:xo`import { ComponentExample } from "@/components/component-example"; export default function Page() { return <ComponentExample />; } `}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=A__default.resolve(e.projectPath,"packages/ui"),r=A__default.resolve(e.projectPath,"apps/web"),n=A__default.resolve(t,"components.json"),o=await L.readJson(n);e.registryBaseConfig&&(o=vo(o,e.registryBaseConfig)),o.tailwind.baseColor="neutral",e.rtl&&(o.rtl=true),await L.writeJson(n,o,{spaces:2});let i=A__default.resolve(r,"components.json"),s=await L.readJson(i);e.registryBaseConfig&&(s=vo(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=true),await L.writeJson(i,s,{spaces:2});let l=await Z$1(t,c.parse(o)),{config:a}=await J(e.components,l,{silent:true});await ue(e.components,a,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let f=await Z$1(r,c.parse(s)),m=await ka$1(e.components,da$1(a));if(m?.fonts?.length){let u={};for(let h of m.fonts)u[h.font.variable]=`var(${h.font.variable})`;await Jt({theme:u},l,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await dt(m.fonts,f,{silent:e.silent});}let p=l.iconLibrary;if(p&&p in a$3){let u=[...a$3[p].packages];await _(u,[],l,{silent:true}),await _(u,[],f,{silent:true});}return f},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:xo`import { ComponentExample } from "@/components/component-example"; export default function Page() { return <ComponentExample />; } `}]}});var Fo=X({name:"react-router",title:"React Router",defaultProjectName:"react-router-app",templateDir:"react-router-app",frameworks:["react-router"],create:async()=>{},files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:xo`import { ComponentExample } from "@/components/component-example"; export default function Home() { return <ComponentExample />; } `}],monorepo:{templateDir:"react-router-monorepo",init:Re,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:xo`import { ComponentExample } from "@/components/component-example"; export default function Home() { return <ComponentExample />; } `}]}});var Ao=X({name:"start",title:"TanStack Start",defaultProjectName:"start-app",templateDir:"start-app",frameworks:["tanstack-start"],create:async()=>{},files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:xo`import { createFileRoute } from "@tanstack/react-router"; import { ComponentExample } from "@/components/component-example"; export const Route = createFileRoute("/")({ component: App }); function App() { return ( <ComponentExample /> ); } `}],monorepo:{templateDir:"start-monorepo",init:Re,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:xo`import { createFileRoute } from "@tanstack/react-router"; import { ComponentExample } from "@/components/component-example"; export const Route = createFileRoute("/")({ component: App }); function App() { return ( <ComponentExample /> ); } `}]}});var Oo=X({name:"vite",title:"Vite",defaultProjectName:"vite-app",templateDir:"vite-app",frameworks:["vite"],create:async()=>{},files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:xo`import { ComponentExample } from "@/components/component-example"; export function App() { return <ComponentExample />; } export default App; `}],monorepo:{templateDir:"vite-monorepo",init:Re,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:xo`import { ComponentExample } from "@/components/component-example"; export function App() { return <ComponentExample />; } export default App; `}]}});var Q={next:jo,vite:Oo,start:Ao,"react-router":Fo,astro:So,laravel:Io};function Xe(e){if(e){for(let[t,r]of Object.entries(Q))if(r.frameworks.includes(e))