shadcn 4.21.3 → 4.21.4

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.d.ts CHANGED
@@ -17,27 +17,27 @@ declare function fetchTree(style: string, tree: z.infer<typeof registryIndexSche
17
17
  $schema?: string | undefined;
18
18
  tailwind?: {
19
19
  config?: {
20
- content?: string[] | undefined;
21
20
  theme?: Record<string, any> | undefined;
21
+ content?: string[] | undefined;
22
22
  plugins?: string[] | undefined;
23
23
  } | undefined;
24
24
  } | undefined;
25
25
  config?: {
26
- $schema?: string | undefined;
26
+ menuColor?: "default" | "inverted" | "default-translucent" | "inverted-translucent" | undefined;
27
+ menuAccent?: "subtle" | "bold" | undefined;
28
+ iconLibrary?: string | undefined;
27
29
  style?: string | undefined;
30
+ $schema?: string | undefined;
28
31
  rsc?: boolean | undefined;
29
32
  tsx?: boolean | undefined;
30
33
  tailwind?: {
34
+ baseColor?: string | undefined;
31
35
  config?: string | undefined;
32
36
  css?: string | undefined;
33
- baseColor?: string | undefined;
34
37
  cssVariables?: boolean | undefined;
35
38
  prefix?: string | undefined;
36
39
  } | undefined;
37
- iconLibrary?: string | undefined;
38
40
  rtl?: boolean | undefined;
39
- menuColor?: "default" | "inverted" | "default-translucent" | "inverted-translucent" | undefined;
40
- menuAccent?: "subtle" | "bold" | undefined;
41
41
  aliases?: {
42
42
  components?: string | undefined;
43
43
  utils?: string | undefined;
@@ -80,8 +80,6 @@ declare function fetchTree(style: string, tree: z.infer<typeof registryIndexSche
80
80
  docs?: string | undefined;
81
81
  categories?: string[] | undefined;
82
82
  } | {
83
- type: "registry:font";
84
- name: string;
85
83
  font: {
86
84
  family: string;
87
85
  provider: "google";
@@ -92,11 +90,13 @@ declare function fetchTree(style: string, tree: z.infer<typeof registryIndexSche
92
90
  selector?: string | undefined;
93
91
  dependency?: string | undefined;
94
92
  };
93
+ type: "registry:font";
94
+ name: string;
95
95
  $schema?: string | undefined;
96
96
  tailwind?: {
97
97
  config?: {
98
- content?: string[] | undefined;
99
98
  theme?: Record<string, any> | undefined;
99
+ content?: string[] | undefined;
100
100
  plugins?: string[] | undefined;
101
101
  } | undefined;
102
102
  } | undefined;
@@ -134,8 +134,8 @@ declare function fetchTree(style: string, tree: z.infer<typeof registryIndexSche
134
134
  $schema?: string | undefined;
135
135
  tailwind?: {
136
136
  config?: {
137
- content?: string[] | undefined;
138
137
  theme?: Record<string, any> | undefined;
138
+ content?: string[] | undefined;
139
139
  plugins?: string[] | undefined;
140
140
  } | undefined;
141
141
  } | undefined;
package/dist/index.js CHANGED
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
- import {b,c,a as a$1}from'./chunk-3W6BGJGE.js';import {a}from'./chunk-SILUCKGE.js';import*as X from'path';import X__default from'path';import {promises,existsSync}from'fs';import {SHADCN_URL,BUILTIN_REGISTRIES,DEPRECATED_COMPONENTS,COMPONENTS_HIDDEN_FROM_SELECTION,BASE_COLORS}from'@shadcn/registry/internal/registry/constants';import {isMonorepoRoot,getMonorepoTargets,formatMonorepoMessage,parsePnpmWorkspacePackages}from'@shadcn/registry/internal/utils/get-monorepo-info';import {getProjectInfo,getProjectComponents,getProjectConfig,getProjectTailwindVersionFromConfig}from'@shadcn/registry/internal/utils/get-project-info';import {highlighter}from'@shadcn/registry/internal/utils/highlighter';import {logger}from'@shadcn/registry/internal/utils/logger';import {spinner}from'@shadcn/registry/internal/utils/spinner';import F from'fs-extra';import {getRegistryBaseColors,getRegistryItems,getShadcnRegistryIndex,getRegistryBaseColor,getItemTargetPath,getRegistries,getPackageJsonRegistries,getRegistriesIndex}from'@shadcn/registry/internal/registry/api';export*from'@shadcn/registry/internal/registry/api';import {resolveRegistryNamespaces}from'@shadcn/registry/internal/registry/namespaces';import {buildUrlAndHeadersForRegistryItem}from'@shadcn/registry/internal/registry/builder';import {configWithDefaults}from'@shadcn/registry/internal/registry/config';import {getBase,getConfig,resolveConfigPaths,getWorkspaceConfig,explorer,DEFAULT_TAILWIND_CSS,DEFAULT_TAILWIND_CONFIG,DEFAULT_COMPONENTS,createConfig,DEFAULT_UTILS}from'@shadcn/registry/internal/utils/get-config';import Bs from'open';import ae from'prompts';import Eo from'dedent';import Zs,{tmpdir}from'os';import {RegistryError}from'@shadcn/registry/internal/registry/errors';import {getPackageManager,getPackageRunnerCommand,getPackageManagerFromUserAgent}from'@shadcn/registry/internal/utils/get-package-manager';import Ur,{z as z$1}from'zod';import {execa}from'execa';import {iconLibraries}from'@shadcn/registry/internal/icons/libraries';import {resolveRegistryTree}from'@shadcn/registry/internal/registry/resolver';import {addComponents}from'@shadcn/registry/internal/utils/add-components';import {updateCss,transformCss}from'@shadcn/registry/internal/utils/updaters/update-css';import {updateCssVars,transformCssVars as transformCssVars$1,isLocalHSLValue}from'@shadcn/registry/internal/utils/updaters/update-css-vars';import {updateDependencies,installDependencies,removeDependencies}from'@shadcn/registry/internal/utils/updaters/update-dependencies';import {rawConfigSchema,stylesSchema,registryItemSchema,iconsSchema}from'@shadcn/registry/schema';import $o from'deepmerge';import {updateFonts,massageTreeForFonts}from'@shadcn/registry/internal/utils/updaters/update-fonts';import {fetchRegistry}from'@shadcn/registry/internal/registry/fetcher';import {PRESET_BASES,isPresetCode,isPresetBase,decodePreset,parsePresetStyle,PRESET_BASE_COLORS,PRESET_ICON_LIBRARIES,PRESET_MENU_ACCENTS,PRESET_MENU_COLORS,PRESET_FONTS,PRESET_FONT_HEADINGS,PRESET_THEMES,encodePreset,V1_CHART_COLOR_MAP}from'@shadcn/registry/internal/preset/preset';import {clearRegistryContext}from'@shadcn/registry/internal/registry/context';import {isUrl,isUniversalRegistryItem}from'@shadcn/registry/internal/registry/utils';import {loadEnvFiles}from'@shadcn/registry/internal/utils/env-loader';import {Command}from'commander';import {isContentSame}from'@shadcn/registry/internal/utils/compare';import {isEnvFile}from'@shadcn/registry/internal/utils/env-helpers';import {getSupportedFontMarkers}from'@shadcn/registry/internal/utils/font-markers';import {transform}from'@shadcn/registry/internal/utils/transformers/index';import {transformAsChild}from'@shadcn/registry/internal/utils/transformers/transform-aschild';import {transformCleanup}from'@shadcn/registry/internal/utils/transformers/transform-cleanup';import {transformCssVars}from'@shadcn/registry/internal/utils/transformers/transform-css-vars';import {transformFont}from'@shadcn/registry/internal/utils/transformers/transform-font';import {transformIcons}from'@shadcn/registry/internal/utils/transformers/transform-icons';import {transformImport}from'@shadcn/registry/internal/utils/transformers/transform-import';import {transformMenu}from'@shadcn/registry/internal/utils/transformers/transform-menu';import {transformRsc}from'@shadcn/registry/internal/utils/transformers/transform-rsc';import {transformRtl,transformDirection}from'@shadcn/registry/internal/utils/transformers/transform-rtl';import {transformTwPrefixes}from'@shadcn/registry/internal/utils/transformers/transform-tw-prefix';import {getPlannedFilePaths,resolveFilePath,findCommonRoot,rewriteResolvedImportsInContent}from'@shadcn/registry/internal/utils/updaters/update-files';import {Project,ScriptKind,SyntaxKind,Node}from'ts-morph';import {loadConfig}from'tsconfig-paths';import {diffLines,structuredPatch,diffWords}from'diff';import {dim,yellow,bold,green,cyan,red}from'kleur/colors';import*as be from'fs/promises';import be__default from'fs/promises';import {readRegistryWithIncludes,createRegistryCatalog,createRegistryItem}from'@shadcn/registry/internal/registry/loader';import {getPackageInfo}from'@shadcn/registry/internal/utils/get-package-info';import fp from'postcss';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import to from'fast-glob';import {randomBytes}from'crypto';import {resolveGitHubRegistrySource}from'@shadcn/registry/internal/registry/address';import {validateGitHubRegistrySource}from'@shadcn/registry/internal/registry/github';import {validateRegistry}from'@shadcn/registry/internal/registry/validate';import {findUnknownSearchTypes,SEARCHABLE_TYPES,resolveSearchRegistries,searchRegistries,printSearchResults}from'@shadcn/registry/internal/registry/search';import {validateRegistryConfigForItems}from'@shadcn/registry/internal/registry/validator';async function bo(e){let t={};if(!F.existsSync(e.cwd)||!F.existsSync(X__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=spinner("Preflight checks.",{silent:e.silent}).start();F.existsSync(X__default.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),logger.break(),logger.error(`A ${highlighter.info("components.json")} file already exists at ${highlighter.info(e.cwd)}.
2
+ import {b,c,a as a$1}from'./chunk-3W6BGJGE.js';import {a}from'./chunk-SILUCKGE.js';import*as X from'path';import X__default from'path';import {promises,existsSync}from'fs';import {SHADCN_URL,BUILTIN_REGISTRIES,DEPRECATED_COMPONENTS,COMPONENTS_HIDDEN_FROM_SELECTION,BASE_COLORS}from'@shadcn/registry/internal/registry/constants';import {isMonorepoRoot,getMonorepoTargets,formatMonorepoMessage,parsePnpmWorkspacePackages}from'@shadcn/registry/internal/utils/get-monorepo-info';import {getProjectInfo,getProjectComponents,getProjectConfig,getProjectTailwindVersionFromConfig}from'@shadcn/registry/internal/utils/get-project-info';import {highlighter}from'@shadcn/registry/internal/utils/highlighter';import {logger}from'@shadcn/registry/internal/utils/logger';import {spinner}from'@shadcn/registry/internal/utils/spinner';import F from'fs-extra';import {getRegistryBaseColors,getRegistryItems,getShadcnRegistryIndex,getRegistryBaseColor,getItemTargetPath,getRegistries,getPackageJsonRegistries,getRegistriesIndex}from'@shadcn/registry/internal/registry/api';export*from'@shadcn/registry/internal/registry/api';import {resolveRegistryNamespaces}from'@shadcn/registry/internal/registry/namespaces';import {buildUrlAndHeadersForRegistryItem}from'@shadcn/registry/internal/registry/builder';import {configWithDefaults}from'@shadcn/registry/internal/registry/config';import {getBase,getConfig,resolveConfigPaths,getWorkspaceConfig,explorer,DEFAULT_TAILWIND_CSS,DEFAULT_TAILWIND_CONFIG,DEFAULT_COMPONENTS,createConfig,DEFAULT_UTILS}from'@shadcn/registry/internal/utils/get-config';import Bs from'open';import ae from'prompts';import Eo from'dedent';import Zs,{tmpdir}from'os';import {RegistryError}from'@shadcn/registry/internal/registry/errors';import {getPackageManager,getPackageRunnerCommand,getPackageManagerFromUserAgent}from'@shadcn/registry/internal/utils/get-package-manager';import Ur,{z as z$1}from'zod';import {execa}from'execa';import {iconLibraries}from'@shadcn/registry/internal/icons/libraries';import {resolveRegistryTree}from'@shadcn/registry/internal/registry/resolver';import {addComponents}from'@shadcn/registry/internal/utils/add-components';import {updateCss,transformCss}from'@shadcn/registry/internal/utils/updaters/update-css';import {updateCssVars,transformCssVars as transformCssVars$1,isLocalHSLValue}from'@shadcn/registry/internal/utils/updaters/update-css-vars';import {updateDependencies,installDependencies,removeDependencies}from'@shadcn/registry/internal/utils/updaters/update-dependencies';import {rawConfigSchema,stylesSchema,registryItemSchema,iconsSchema}from'@shadcn/registry/schema';import $o from'deepmerge';import {updateFonts,massageTreeForFonts}from'@shadcn/registry/internal/utils/updaters/update-fonts';import {fetchRegistry}from'@shadcn/registry/internal/registry/fetcher';import {PRESET_BASES,isPresetCode,isPresetBase,decodePreset,parsePresetStyle,PRESET_BASE_COLORS,PRESET_ICON_LIBRARIES,PRESET_MENU_ACCENTS,PRESET_MENU_COLORS,PRESET_FONTS,PRESET_FONT_HEADINGS,PRESET_THEMES,encodePreset,V1_CHART_COLOR_MAP}from'@shadcn/registry/internal/preset/preset';import {clearRegistryContext}from'@shadcn/registry/internal/registry/context';import {isUrl,isUniversalRegistryItem}from'@shadcn/registry/internal/registry/utils';import {loadEnvFiles}from'@shadcn/registry/internal/utils/env-loader';import {Command}from'commander';import {isContentSame}from'@shadcn/registry/internal/utils/compare';import {isEnvFile}from'@shadcn/registry/internal/utils/env-helpers';import {getSupportedFontMarkers}from'@shadcn/registry/internal/utils/font-markers';import {transform}from'@shadcn/registry/internal/utils/transformers/index';import {transformAsChild}from'@shadcn/registry/internal/utils/transformers/transform-aschild';import {transformCleanup}from'@shadcn/registry/internal/utils/transformers/transform-cleanup';import {transformCssVars}from'@shadcn/registry/internal/utils/transformers/transform-css-vars';import {transformFont}from'@shadcn/registry/internal/utils/transformers/transform-font';import {transformIcons}from'@shadcn/registry/internal/utils/transformers/transform-icons';import {transformImport}from'@shadcn/registry/internal/utils/transformers/transform-import';import {transformMenu}from'@shadcn/registry/internal/utils/transformers/transform-menu';import {transformRsc}from'@shadcn/registry/internal/utils/transformers/transform-rsc';import {transformRtl,transformDirection}from'@shadcn/registry/internal/utils/transformers/transform-rtl';import {transformTwPrefixes}from'@shadcn/registry/internal/utils/transformers/transform-tw-prefix';import {getPlannedFilePaths,resolveFilePath,findCommonRoot,rewriteResolvedImportsInContent}from'@shadcn/registry/internal/utils/updaters/update-files';import {loadConfig}from'tsconfig-paths';import {diffLines,structuredPatch,diffWords}from'diff';import {dim,yellow,bold,green,cyan,red}from'kleur/colors';import*as be from'fs/promises';import be__default from'fs/promises';import {readRegistryWithIncludes,createRegistryCatalog,createRegistryItem}from'@shadcn/registry/internal/registry/loader';import {getPackageInfo}from'@shadcn/registry/internal/utils/get-package-info';import lp from'postcss';import {Project,ScriptKind,SyntaxKind,Node}from'ts-morph';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import to from'fast-glob';import {randomBytes}from'crypto';import {resolveGitHubRegistrySource}from'@shadcn/registry/internal/registry/address';import {validateGitHubRegistrySource}from'@shadcn/registry/internal/registry/github';import {validateRegistry}from'@shadcn/registry/internal/registry/validate';import {findUnknownSearchTypes,SEARCHABLE_TYPES,resolveSearchRegistries,searchRegistries,printSearchResults}from'@shadcn/registry/internal/registry/search';import {validateRegistryConfigForItems}from'@shadcn/registry/internal/registry/validator';async function bo(e){let t={};if(!F.existsSync(e.cwd)||!F.existsSync(X__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,projectInfo:null};let r=spinner("Preflight checks.",{silent:e.silent}).start();F.existsSync(X__default.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),logger.break(),logger.error(`A ${highlighter.info("components.json")} file already exists at ${highlighter.info(e.cwd)}.
3
3
  To start over, remove the ${highlighter.info("components.json")} file and run ${highlighter.info("init")} again.`),logger.break(),process.exit(1)),r?.succeed();let o=spinner("Verifying framework.",{silent:e.silent}).start(),n=e.existingConfig?.tailwind,i=await getProjectInfo(e.cwd,{configCssFile:typeof n?.css=="string"?n.css:void 0});if(!i||i?.framework.name==="manual"){if(t["7"]=true,o?.fail(),!e.monorepo&&await isMonorepoRoot(e.cwd)){let l=await getMonorepoTargets(e.cwd);l.length>0&&(formatMonorepoMessage("init",l),process.exit(1));}logger.break(),i?.framework.links.installation&&logger.error(`We could not detect a supported framework at ${highlighter.info(e.cwd)}.
4
4
  Visit ${highlighter.info(i?.framework.links.installation)} to manually configure your project.
5
5
  Once configured, you can use the cli to add components.`),logger.break(),process.exit(1);}o?.succeed(`Verifying framework. Found ${highlighter.info(i.framework.label)}.`);let s="Validating Tailwind CSS.";i.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${highlighter.info("v4")}.`);let a=spinner(s,{silent:e.silent}).start();i.tailwindVersion==="v3"&&(!i?.tailwindConfigFile||!i?.tailwindCssFile)?(t["5"]=true,a?.fail()):i.tailwindVersion==="v4"&&!i?.tailwindCssFile?(t["5"]=true,a?.fail()):i.tailwindVersion?a?.succeed():(t["5"]=true,a?.fail());let c=spinner("Validating import alias.",{silent:e.silent}).start();return i?.aliasPrefix?c?.succeed():(t["6"]=true,c?.fail()),Object.keys(t).length>0&&(t["5"]&&(logger.break(),logger.error(`No Tailwind CSS configuration found at ${highlighter.info(e.cwd)}.`),logger.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),logger.error("Install Tailwind CSS then try again."),i?.framework.links.tailwind&&logger.error(`Visit ${highlighter.info(i?.framework.links.tailwind)} to get started.`)),t["6"]&&(logger.break(),logger.error(`Could not find valid path aliases or package imports for ${highlighter.info("init")}.`),logger.error(`Configure path aliases in ${highlighter.info("tsconfig.json")} or imports in ${highlighter.info("package.json")}, then run ${highlighter.info("init")} again.`),logger.error(`Learn more at ${highlighter.info(`${SHADCN_URL}/docs/installation/manual#configure-import-aliases`)}.`)),logger.break(),process.exit(1)),{errors:t,projectInfo:i}}async function _(e,t,r={}){r={silent:false,writeFile:true,...r};let n=(await resolveRegistryNamespaces(e,t)).filter(m=>!t.registries?.[m]&&!Object.keys(BUILTIN_REGISTRIES).includes(m));if(n.length===0)return {config:t,newRegistries:[],discoveredRegistries:{},packageJsonRegistries:{}};let i=await getPackageJsonRegistries(t.resolvedPaths.cwd),s={},a=[];for(let m of n)i[m]?s[m]=i[m]:a.push(m);let c={};if(a.length>0){let m=await getRegistriesIndex({useCache:process.env.NODE_ENV!=="development"});if(m)for(let d of a)m[d]&&(c[d]=m[d]);}let l={...s,...c};if(Object.keys(l).length===0)return {config:t,newRegistries:[],discoveredRegistries:{},packageJsonRegistries:{}};let p=Object.fromEntries(Object.entries(t.registries||{}).filter(([m])=>!Object.keys(BUILTIN_REGISTRIES).includes(m))),f={...t,registries:{...p,...l}};if(r.writeFile&&Object.keys(c).length>0){let m=X__default.resolve(t.resolvedPaths.cwd,"components.json");if(F.existsSync(m)){let d=spinner("Updating components.json.",{silent:r.silent}).start(),u=await F.readJson(m),g={...u,registries:{...u.registries,...c}};await F.writeFile(m,JSON.stringify(g,null,2)+`
6
- `,"utf-8"),d.succeed();}}return {config:f,newRegistries:Object.keys(l),discoveredRegistries:c,packageJsonRegistries:s}}var J={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 pr(e){let t=new URL(`${SHADCN_URL}/create`),{rtl:r,pointer:o,...n}=e??{};for(let[i,s]of Object.entries(n))s!==void 0&&t.searchParams.set(i,String(s));return r&&t.searchParams.set("rtl","true"),o&&t.searchParams.set("pointer","true"),t.toString()}async function mr(e){if(logger.break(),logger.log(` Build your custom preset on ${highlighter.info(e.createUrl)}`),logger.log(` ${e.followUp}`),logger.break(),e.prompt===false)return;let{proceed:t}=await ae({type:"confirm",name:"proceed",message:"Open in browser?",initial:true});t&&await Bs(e.createUrl);}function ne(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"),`${SHADCN_URL}/init?${r.toString()}`}async function Ne(){let{base:e}=await ae({type:"select",name:"base",message:`Select a ${highlighter.info("component library")}`,choices:[{title:"Base UI (Recommended)",value:"base"},{title:"React Aria",value:"aria"},{title:"Radix UI",value:"radix"}]});return e||process.exit(1),e}async function qe(e){let t=Object.entries(J),{selectedPreset:r}=await ae({type:"select",name:"selectedPreset",message:`Which ${highlighter.info("preset")} would you like to use?`,choices:[...t.map(([n,i])=>({title:i.title,description:i.description,value:n})),{title:"Custom",description:`Build your own at ${highlighter.info(`${SHADCN_URL}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let n=pr({command:"init",rtl:e.rtl,pointer:e.pointer,base:e.base,...e.template&&{template:e.template}});await mr({createUrl:n,followUp:`Then ${highlighter.info("copy and run the command")} from ui.shadcn.com.`}),process.exit(0);}let o=J[r];return o||process.exit(1),{url:ne({...o,base:e.base,rtl:e.rtl},{template:e.template,pointer:e.pointer}),base:e.base}}async function he(e,t,r){let o=configWithDefaults(createConfig({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:n}=await _([e],o,{silent:true,writeFile:false});o=n,buildUrlAndHeadersForRegistryItem(e,o);let[i]=await getRegistryItems([e],{config:o,useCache:true}),s=i?.type==="registry:base"&&i.config?i.config:void 0,a=e;if(Us(e)){let c=new URL(e);c.searchParams.delete("track"),a=c.toString();}return {registryBaseConfig:s,installStyleIndex:i?.extends!=="none",url:a}}function Us(e){try{return new URL(e).pathname==="/init"&&e.startsWith(SHADCN_URL)}catch{return false}}var Ct={version:"4.21.3"};function C(e){if(logger.break(),logger.error("Something went wrong. Please check the error below for more details."),logger.error("If the problem persists, please open an issue on GitHub."),logger.error(""),typeof e=="string"&&(logger.error(e),Xe()),e instanceof RegistryError&&(e.message&&(logger.error(e.cause?"Error:":"Message:"),logger.error(e.message)),e.cause&&(logger.error(`
6
+ `,"utf-8"),d.succeed();}}return {config:f,newRegistries:Object.keys(l),discoveredRegistries:c,packageJsonRegistries:s}}var J={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 pr(e){let t=new URL(`${SHADCN_URL}/create`),{rtl:r,pointer:o,...n}=e??{};for(let[i,s]of Object.entries(n))s!==void 0&&t.searchParams.set(i,String(s));return r&&t.searchParams.set("rtl","true"),o&&t.searchParams.set("pointer","true"),t.toString()}async function mr(e){if(logger.break(),logger.log(` Build your custom preset on ${highlighter.info(e.createUrl)}`),logger.log(` ${e.followUp}`),logger.break(),e.prompt===false)return;let{proceed:t}=await ae({type:"confirm",name:"proceed",message:"Open in browser?",initial:true});t&&await Bs(e.createUrl);}function ne(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"),`${SHADCN_URL}/init?${r.toString()}`}async function Ne(){let{base:e}=await ae({type:"select",name:"base",message:`Select a ${highlighter.info("component library")}`,choices:[{title:"Base UI (Recommended)",value:"base"},{title:"React Aria",value:"aria"},{title:"Radix UI",value:"radix"}]});return e||process.exit(1),e}async function qe(e){let t=Object.entries(J),{selectedPreset:r}=await ae({type:"select",name:"selectedPreset",message:`Which ${highlighter.info("preset")} would you like to use?`,choices:[...t.map(([n,i])=>({title:i.title,description:i.description,value:n})),{title:"Custom",description:`Build your own at ${highlighter.info(`${SHADCN_URL}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let n=pr({command:"init",rtl:e.rtl,pointer:e.pointer,base:e.base,...e.template&&{template:e.template}});await mr({createUrl:n,followUp:`Then ${highlighter.info("copy and run the command")} from ui.shadcn.com.`}),process.exit(0);}let o=J[r];return o||process.exit(1),{url:ne({...o,base:e.base,rtl:e.rtl},{template:e.template,pointer:e.pointer}),base:e.base}}async function he(e,t,r){let o=configWithDefaults(createConfig({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:n}=await _([e],o,{silent:true,writeFile:false});o=n,buildUrlAndHeadersForRegistryItem(e,o);let[i]=await getRegistryItems([e],{config:o,useCache:true}),s=i?.type==="registry:base"&&i.config?i.config:void 0,a=e;if(Us(e)){let c=new URL(e);c.searchParams.delete("track"),a=c.toString();}return {registryBaseConfig:s,installStyleIndex:i?.extends!=="none",url:a}}function Us(e){try{return new URL(e).pathname==="/init"&&e.startsWith(SHADCN_URL)}catch{return false}}var Ct={version:"4.21.4"};function k(e){if(logger.break(),logger.error("Something went wrong. Please check the error below for more details."),logger.error("If the problem persists, please open an issue on GitHub."),logger.error(""),typeof e=="string"&&(logger.error(e),Xe()),e instanceof RegistryError&&(e.message&&(logger.error(e.cause?"Error:":"Message:"),logger.error(e.message)),e.cause&&(logger.error(`
7
7
  Message:`),logger.error(e.cause)),e.suggestion&&(logger.error(`
8
8
  Suggestion:`),logger.error(e.suggestion)),Xe()),e instanceof z$1.ZodError){logger.error("Validation failed:");for(let[t,r]of Object.entries(e.flatten().fieldErrors))logger.error(`- ${highlighter.info(t)}: ${r}`);Xe();}e instanceof Error&&(logger.error(e.message),Xe()),Xe();}function Ys(e){let t=e.match(/^(\d+)\.(\d+)\.\d+/);if(!t)return null;let r=Number.parseInt(t[1],10),o=Number.parseInt(t[2],10);return o===0?null:`${r}.${o-1}.0`}function qs(e=Ct.version,t=process.argv.slice(2)){let r=Ys(e);return r?[...getPackageRunnerCommand(getPackageManagerFromUserAgent()).split(" "),`shadcn@${r}`,...t].map(Xs).join(" "):null}function Xe(){let e=qs();e&&(logger.error(""),logger.error("You can also try a previous version to see if that works:"),logger.error(e)),logger.break(),process.exit(1);}function Xs(e){return /^[a-zA-Z0-9_./:@%+=,-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}var ta=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??ia}}function we(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 ra(e){switch(e){case "pnpm":return ["--no-frozen-lockfile"];case "yarn":return ["--no-immutable"];case "npm":return ["--no-audit","--no-fund"];default:return []}}async function oa(e,t){if(t==="pnpm")return;let r=X__default.join(e,"pnpm-workspace.yaml"),o=X__default.join(e,"package.json"),n=X__default.join(e,"pnpm-lock.yaml");F.existsSync(n)&&await F.remove(n);let i=F.existsSync(r),s=i?parsePnpmWorkspacePackages(await F.readFile(r,"utf8")):[],a=s.length>0;if(F.existsSync(o)){let c=await F.readFile(o,"utf8"),l=JSON.parse(c);a?l.packageManager=await na(t):delete l.packageManager,a&&(l.workspaces=s),await F.writeFile(o,JSON.stringify(l,null,2)+`
9
9
  `);}i&&await F.remove(r),a&&t==="npm"&&await So(e);}async function na(e){try{let{stdout:t}=await execa(e,["--version"]);return `${e}@${t.trim()}`}catch{return `${e}@*`}}async function So(e){let t=await F.readdir(e,{withFileTypes:true});for(let r of t){if(r.name==="node_modules")continue;let o=X__default.join(e,r.name);if(r.isDirectory())await So(o);else if(r.name==="package.json"){let n=await F.readFile(o,"utf8");if(!n.includes("workspace:"))continue;let i=JSON.parse(n),s=false;for(let a of ["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let c=i[a];if(c)for(let[l,p]of Object.entries(c))typeof p=="string"&&p.startsWith("workspace:")&&(c[l]="*",s=true);}s&&await F.writeFile(o,JSON.stringify(i,null,2)+`
10
10
  `);}}}function vo({title:e,templateDir:t}){return async({projectPath:r,packageManager:o})=>{let n=spinner(`Creating a new ${e} project. This may take a few minutes.`).start();try{let i=process.env.SHADCN_TEMPLATE_DIR;if(i){let l=X__default.resolve(i,t);await F.copy(l,r,{filter:p=>!p.includes("node_modules")});}else {let l=X__default.join(Zs.tmpdir(),`shadcn-template-${Date.now()}`);await execa("git",["clone","--depth","1","--filter=blob:none","--sparse",ta,l]),await execa("git",["-C",l,"sparse-checkout","set",`templates/${t}`]);let p=X__default.resolve(l,"templates",t);await F.move(p,r),await F.remove(l);}await oa(r,o);let a=["install",...ra(o)];await execa(o,a,{cwd:r});let c=X__default.join(r,"package.json");if(F.existsSync(c)){let l=await F.readFile(c,"utf8"),p=JSON.parse(l);p.name=X__default.basename(r),await F.writeFile(c,JSON.stringify(p,null,2)+`
11
- `);}n?.succeed(`Creating a new ${e} project.`);}catch(i){n?.fail(`Something went wrong creating a new ${e} project.`),C(i);}}}async function ia({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{}}async function ie(e){let t=X__default.resolve(e.projectPath,"packages/ui"),r=X__default.resolve(e.projectPath,"apps/web"),o=X__default.resolve(t,"components.json"),n=await F.readJson(o);e.registryBaseConfig&&(n=$o(n,e.registryBaseConfig)),n.tailwind.baseColor="neutral",e.rtl&&(n.rtl=true),e.menuColor&&(n.menuColor=e.menuColor),e.menuAccent&&(n.menuAccent=e.menuAccent),e.iconLibrary&&(n.iconLibrary=e.iconLibrary),await F.writeJson(o,n,{spaces:2});let i=X__default.resolve(r,"components.json"),s=await F.readJson(i);e.registryBaseConfig&&(s=$o(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 F.writeJson(i,s,{spaces:2});let a=await resolveConfigPaths(t,rawConfigSchema.parse(n)),{config:c}=await _(e.components,a,{silent:true});await addComponents(e.components,c,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let l=await resolveConfigPaths(r,rawConfigSchema.parse(s)),p=await resolveRegistryTree(e.components,configWithDefaults(c));if(p?.fonts?.length){let m={},d=new Set;for(let u of p.fonts){let g=u.name.replace(/^font-heading-/,"").replace("font-",""),y=u.font.dependency??`@fontsource-variable/${g}`;m[u.font.variable]=u.font.family,d.add(y);}await updateDependencies(Array.from(d),[],a,{silent:true}),await updateCssVars({theme:m},a,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await updateCss(Object.fromEntries(Array.from(d).map(u=>[`@import "${u}"`,{}])),a,{silent:e.silent});}let f=a.iconLibrary;if(f&&f in iconLibraries){let m=[...iconLibraries[f].packages];await updateDependencies(m,[],a,{silent:true}),await updateDependencies(m,[],l,{silent:true});}return l}var No=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:Eo`---
11
+ `);}n?.succeed(`Creating a new ${e} project.`);}catch(i){n?.fail(`Something went wrong creating a new ${e} project.`),k(i);}}}async function ia({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{}}async function ie(e){let t=X__default.resolve(e.projectPath,"packages/ui"),r=X__default.resolve(e.projectPath,"apps/web"),o=X__default.resolve(t,"components.json"),n=await F.readJson(o);e.registryBaseConfig&&(n=$o(n,e.registryBaseConfig)),n.tailwind.baseColor="neutral",e.rtl&&(n.rtl=true),e.menuColor&&(n.menuColor=e.menuColor),e.menuAccent&&(n.menuAccent=e.menuAccent),e.iconLibrary&&(n.iconLibrary=e.iconLibrary),await F.writeJson(o,n,{spaces:2});let i=X__default.resolve(r,"components.json"),s=await F.readJson(i);e.registryBaseConfig&&(s=$o(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 F.writeJson(i,s,{spaces:2});let a=await resolveConfigPaths(t,rawConfigSchema.parse(n)),{config:c}=await _(e.components,a,{silent:true});await addComponents(e.components,c,{overwrite:true,silent:e.silent,isNewProject:true,skipFonts:true});let l=await resolveConfigPaths(r,rawConfigSchema.parse(s)),p=await resolveRegistryTree(e.components,configWithDefaults(c));if(p?.fonts?.length){let m={},d=new Set;for(let u of p.fonts){let g=u.name.replace(/^font-heading-/,"").replace("font-",""),y=u.font.dependency??`@fontsource-variable/${g}`;m[u.font.variable]=u.font.family,d.add(y);}await updateDependencies(Array.from(d),[],a,{silent:true}),await updateCssVars({theme:m},a,{silent:e.silent,overwriteCssVars:false,tailwindVersion:"v4"}),await updateCss(Object.fromEntries(Array.from(d).map(u=>[`@import "${u}"`,{}])),a,{silent:e.silent});}let f=a.iconLibrary;if(f&&f in iconLibraries){let m=[...iconLibraries[f].packages];await updateDependencies(m,[],a,{silent:true}),await updateDependencies(m,[],l,{silent:true});}return l}var No=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:Eo`---
12
12
  import Layout from "@/layouts/main.astro"
13
13
  import { ComponentExample } from "@/components/component-example"
14
14
  ---
@@ -87,52 +87,52 @@ export function App() {
87
87
  export default App;
88
88
  `}]}});var H={next:_o,vite:Jo,start:Uo,"react-router":Vo,astro:No,laravel:To};function Te(e){if(e){for(let[t,r]of Object.entries(H))if(r.frameworks.includes(e))return t}}function Ho(e,t){let r=t?.lib??$t(e,"lib");return {ui:t?.ui??$t(e,"ui"),lib:r,hooks:t?.hooks??$t(e,"hooks"),utils:t?.utils??$t(e,"utils",r)}}function $t(e,t,r){let o=e||DEFAULT_COMPONENTS;if(t==="ui")return `${o}/ui`;if(t==="utils"){let n=r||zo(o,"lib");return n?`${n}/utils`:DEFAULT_UTILS}return zo(o,t)}function zo(e,t){return e==="components"?t:e.endsWith("/components")?`${e.slice(0,-11)}/${t}`:e.endsWith("components")&&!e.includes("/")?`${e.slice(0,-10)}${t}`:""}async function Nt(e){let t=e.template&&e.template in H?e.template:"next",r=we(H[t],{monorepo:e.monorepo}),o=e.name??r.defaultProjectName,n=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(n&&(t="next"),!e.force){let{type:c,name:l}=await ae([{type:e.template||n?null:"select",name:"type",message:`The path ${highlighter.info(e.cwd)} does not contain a package.json file.
89
89
  Would you like to start a new project?`,choices:Object.entries(H).map(([p,f])=>({title:f.title,value:p,description:f.description})),initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:o,format:p=>p.trim(),validate:p=>p.length>128?"Name should be less than 128 characters.":true}]);t=c??t,o=l??o;}let i=we(H[t],{monorepo:e.monorepo}),s=await getPackageManager(e.cwd,{withFallback:true}),a=X__default.join(e.cwd,o);try{await F.access(e.cwd,F.constants.W_OK);}catch{logger.break(),logger.error(`The path ${highlighter.info(e.cwd)} is not writable.`),logger.error(`It is likely you do not have write permissions for this folder or the path ${highlighter.info(e.cwd)} does not exist.`),logger.break(),process.exit(1);}return F.existsSync(X__default.resolve(e.cwd,o,"package.json"))&&(logger.break(),logger.error(`A project with the name ${highlighter.info(o)} already exists.`),logger.error("Please choose a different name and try again."),logger.break(),process.exit(1)),await i.scaffold({projectPath:a,packageManager:s,cwd:e.cwd}),{projectPath:a,projectName:o,template:t}}var Fe=".bak",je=class extends Error{filePath;constructor(t){super(`Could not back up ${t}.`),this.name="FileBackupError",this.filePath=t;}};function Ze(e){if(!F.existsSync(e))return null;let t=`${e}${Fe}`;try{return F.renameSync(e,t),t}catch{return null}}function Oe(e){let t=`${e}${Fe}`;if(!F.existsSync(t))return false;try{return F.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),false}}function Qe(e){let t=`${e}${Fe}`;if(!F.existsSync(t))return false;try{return F.unlinkSync(t),!0}catch{return false}}async function Ko(e,t){if(!F.existsSync(e))return t();if(!Ze(e))throw new je(e);let o=()=>Oe(e);process.on("exit",o);try{let n=await t();return process.removeListener("exit",o),Qe(e),n}catch(n){throw process.removeListener("exit",o),Oe(e),n}}async function yr(){try{let[e]=await fetchRegistry(["styles/index.json"]);return stylesSchema.parse(e)}catch(e){return logger.error(`
90
- `),C(e),[]}}async function Yo(){try{let[e]=await fetchRegistry(["icons/index.json"]);return iconsSchema.parse(e)}catch(e){return C(e),{}}}async function qo(e,t){try{let r=t.map(n=>`styles/${e}/${n.name}.json`);return (await fetchRegistry(r)).map(n=>registryItemSchema.parse(n))}catch(r){return C(r),[]}}var Ya=z$1.object({cwd:z$1.string(),name:z$1.string().optional(),preset:z$1.union([z$1.boolean(),z$1.string()]).optional(),components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),defaults:z$1.boolean(),force:z$1.boolean(),reinstall:z$1.boolean().optional(),silent:z$1.boolean(),isNewProject:z$1.boolean().default(false),cssVariables:z$1.boolean().default(true),rtl:z$1.boolean().optional(),pointer:z$1.boolean().optional(),base:z$1.enum(PRESET_BASES).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:rawConfigSchema.deepPartial().optional(),menuColor:z$1.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:z$1.enum(["subtle","bold"]).optional(),iconLibrary:z$1.string().optional()});function qa(e,t){return t.rtl?e.searchParams.set("rtl","true"):t.rtl===false&&e.searchParams.delete("rtl"),t.pointer?e.searchParams.set("pointer","true"):t.pointer===false&&e.searchParams.delete("pointer"),e}var tn=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. (base, radix, aria)").option("--monorepo","scaffold a monorepo project.").option("--no-monorepo","skip the monorepo prompt.").option("-p, --preset [name]","use a preset configuration").option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults","use default configuration: --template=next --preset=base-nova",false).option("-f, --force","force overwrite of existing configuration.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-n, --name <name>","the name for the new project.").option("-s, --silent","mute output.",false).option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").option("--rtl","enable RTL support.").option("--no-rtl","disable RTL support.").option("--pointer","enable pointer cursor for buttons.").option("--no-pointer","disable pointer cursor for buttons.").option("--reinstall","re-install existing UI components.").option("--no-reinstall","do not re-install existing UI components.").action(async(e,t)=>{let r,o=[],n=()=>{r&&Oe(r.replace(Fe,""));};process.on("exit",n);try{let i=Ya.parse({...t,reinstall:t.reinstall,cwd:X__default.resolve(t.cwd)}),s=new Map(Object.entries(J)),a;if(i.defaults&&(i.template=i.template||"next",i.base=i.base||"base",i.reinstall=i.reinstall??!1),i.template&&!(i.template in H)&&(logger.error(`Invalid template: ${highlighter.info(i.template)}. Available templates: ${Object.keys(H).map(d=>highlighter.info(d)).join(", ")}.`),logger.break(),process.exit(1)),typeof i.preset=="string"&&!isUrl(i.preset)&&!isPresetCode(i.preset)){let d=Array.from(s.keys());s.has(i.preset)||(logger.error(`Invalid preset: ${highlighter.info(i.preset)}. Available presets: ${d.join(", ")}`),logger.break(),process.exit(1));}let c=i.cwd,l=F.existsSync(X__default.resolve(c,"components.json"));if(!i.monorepo&&!l&&await isMonorepoRoot(c)){let d=await getProjectInfo(c);if(!d||d.framework.name==="manual"){let u=await getMonorepoTargets(c);u.length>0&&(formatMonorepoMessage("init",u),process.exit(1));}}if(l&&!i.force){let{overwrite:d}=await ae({type:"confirm",name:"overwrite",message:`A ${highlighter.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});d||(logger.info(` To start over, remove the ${highlighter.info("components.json")} file and run ${highlighter.info("init")} again.`),logger.break(),process.exit(1)),i.force=!0;}let p;if(l){try{p=await F.readJson(X__default.resolve(c,"components.json"));}catch{logger.warn(`Could not parse the existing ${highlighter.info("components.json")}. Unable to detect the current base.`);}p&&(i.existingConfig=p);let d=i.reinstall;if(d===void 0){let{reinstall:u}=await ae({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});d=u;}if(d&&(o=await getProjectComponents(c),o.length)){logger.break(),logger.log(" The following components will be re-installed and overwritten:");for(let u=0;u<o.length;u+=8)logger.log(` - ${o.slice(u,u+8).join(", ")}`);logger.break();}}if(i.preset===void 0&&e.length===0&&!i.defaults){let d=F.existsSync(X__default.resolve(c,"package.json"));if(!i.template&&!d){let{template:u}=await ae({type:"select",name:"template",message:"Select a template",choices:Object.entries(H).map(([g,y])=>({title:y.title,value:g,description:y.description,disabled:i.monorepo&&g==="laravel"}))});u||process.exit(1),i.template=u;}if(!i.template&&d){let u=await getProjectInfo(c),g=Te(u?.framework.name);g&&(i.template=g);}if(i.template==="laravel"&&!d&&(logger.break(),logger.log(` Please create a new app with ${highlighter.info("laravel new --react")} first then run ${highlighter.info("shadcn init")}.`),logger.log(` See ${highlighter.info(`${SHADCN_URL}/docs/installation/laravel`)} for more information.`),logger.break(),process.exit(0)),i.monorepo===void 0&&!d&&i.template&&H[i.template]?.monorepo){let{monorepo:u}=await ae({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});i.monorepo=u;}i.base||(i.base=await Ne()),i.preset=!0;}if(i.preset!==void 0){let d=i.preset===!0?!0:i.preset;if(d===!0){let u=await qe({rtl:i.rtl??!1,template:i.template,base:i.base,pointer:i.pointer});e=[u.url,...e],a=u.base;}if(typeof d=="string"){let u;if(isUrl(d)){let g=new URL(d);qa(g,i),g.pathname==="/init"&&d.startsWith(SHADCN_URL)&&g.searchParams.set("track","1"),u=g.toString();let y=g.searchParams.get("base");a=isPresetBase(y)?y:void 0;}else if(isPresetCode(d)){let g=decodePreset(d);g||(logger.error(`Invalid preset code: ${highlighter.info(d)}`),logger.break(),process.exit(1)),u=ne({...g,base:"base",rtl:i.rtl??!1},{template:i.template,preset:d,pointer:i.pointer}),a=void 0;}else {let g=s.get(d);if(!g)throw new Error(`Unknown preset: ${d}`);u=ne({...g,base:i.base??"base",rtl:i.rtl??g.rtl},{template:i.template,pointer:i.pointer}),a=void 0;}e=[u,...e];}}let f=i.base??a??(typeof p?.style=="string"?getBase(p.style):void 0),m=l&&!p;if(!f)if(e.length>0&&!m)f="base";else {let d=await Ne();f=d,i.base=d;}if(i.defaults&&!e.some(isUrl)&&(e=[ne({...J.nova,base:f,rtl:i.rtl??!1},{template:i.template,pointer:i.pointer}),...e]),e.length>0&&isUrl(e[0])){let d=new URL(e[0]);d.searchParams.set("base",f),e[0]=d.toString();}if(p?.style){let d=await Qa(p.style,f);if(d!==f&&(f=d,e.length>0&&isUrl(e[0]))){let u=new URL(e[0]);u.searchParams.set("base",d),e[0]=u.toString();}}if(o.length&&(e=[...e,...o]),i.components=e,await loadEnvFiles(i.cwd),e.length>0){let d=X__default.resolve(c,"components.json");l&&(r=Ze(d)??void 0,r||logger.warn(`Could not back up ${highlighter.info("components.json")}.`));let{registryBaseConfig:u,installStyleIndex:g,url:y}=await he(e[0],c,{registries:p?.registries});e[0]=y,g||(i.installStyleIndex=!1),u&&(i.registryBaseConfig=u);}await Ae(i),logger.break(),logger.log(`Project initialization completed.
91
- You may now add components.`),process.removeListener("exit",n),Qe(X__default.resolve(c,"components.json")),logger.break();}catch(i){process.removeListener("exit",n),n(),logger.break(),C(i);}finally{clearRegistryContext();}});async function Ae(e){let t,r,o,n=e.template,i=n?we(H[n],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&F.existsSync(X__default.resolve(e.cwd,"package.json")))t=await getProjectInfo(e.cwd);else if(e.skipPreflight)t=await getProjectInfo(e.cwd);else {let b=await bo(e);if(b.errors["1"]){let{projectPath:T,template:W}=await Nt(e);T||process.exit(1),e.cwd=T,e.isNewProject=true,o=W,t=await getProjectInfo(e.cwd);}else t=b.projectInfo;}r=await getProjectConfig(e.cwd,t);let a=o??n,c=a?we(H[a],{monorepo:e.monorepo}):void 0,l=[...e.installStyleIndex?["index"]:[],...e.components??[],...c?["button"]:[]],p=o?c?.postInit:void 0;if(c?.init){let b=await c.init({projectPath:e.cwd,components:l,registryBaseConfig:e.registryBaseConfig,rtl:e.rtl??false,menuColor:e.menuColor,menuAccent:e.menuAccent,iconLibrary:e.iconLibrary,silent:e.silent});return p&&await p({projectPath:e.cwd}),b}let f=r?await Za(r,e):await Xa(await getConfig(e.cwd));if(!e.yes){let{proceed:b}=await ae({type:"confirm",name:"proceed",message:`Write configuration to ${highlighter.info("components.json")}. Proceed?`,initial:true});b||process.exit(1);}let m=await resolveConfigPaths(e.cwd,f),{discoveredRegistries:d,packageJsonRegistries:u}=await _(l,m,{silent:true,writeFile:false});Object.keys(d).length>0&&(f.registries={...f.registries,...d});let g=spinner("Writing components.json.").start(),y=X__default.resolve(e.cwd,"components.json"),w=`${y}${Fe}`,x=(b,T)=>{let{registries:W,...Ke}=$o(b,T);return {...Ke,registries:W}};if(F.existsSync(w)){let b=await F.readJson(w);e.force?b.registries&&(f.registries={...b.registries,...f.registries||{}}):f=x(b,f);}e.registryBaseConfig&&(f=x(f,e.registryBaseConfig)),e.rtl!==void 0&&(f.rtl=e.rtl),f.registries=Object.fromEntries(Object.entries(f.registries||{}).filter(([b])=>!Object.keys(BUILTIN_REGISTRIES).includes(b))),await promises.writeFile(y,`${JSON.stringify(f,null,2)}
92
- `,"utf8"),g.succeed();let k=await resolveConfigPaths(e.cwd,f);Object.keys(u).length>0&&(k.registries={...k.registries,...u});let N=await getWorkspaceConfig(k);if(N){let b={};if(f.menuColor&&(b.menuColor=f.menuColor),f.menuAccent&&(b.menuAccent=f.menuAccent),f.rtl!==void 0&&(b.rtl=f.rtl),f.iconLibrary&&(b.iconLibrary=f.iconLibrary),Object.keys(b).length>0)for(let T of Object.keys(N)){let W=N[T];if(W.resolvedPaths.cwd===k.resolvedPaths.cwd)continue;let Ke=X__default.resolve(W.resolvedPaths.cwd,"components.json");if(F.existsSync(Ke)){let Rs=await F.readJson(Ke);await F.writeJson(Ke,{...Rs,...b},{spaces:2});}}}return explorer.clearCaches(),await addComponents(l,k,{overwrite:true,overwriteCssVars:e.reinstall||void 0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),p&&await p({projectPath:e.cwd}),k}async function Xa(e=null){let[t,r]=await Promise.all([yr(),getRegistryBaseColors()]);logger.info("");let o=await ae([{type:"toggle",name:"typescript",message:`Would you like to use ${highlighter.info("TypeScript")} (recommended)?`,initial:e?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${highlighter.info("style")} would you like to use?`,choices:t.map(s=>({title:s.label,value:s.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${highlighter.info("base color")}?`,choices:r.map(s=>({title:s.label,value:s.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${highlighter.info("global CSS")} file?`,initial:e?.tailwind.css??DEFAULT_TAILWIND_CSS},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${highlighter.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${highlighter.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${highlighter.info("tailwind.config.js")} located?`,initial:e?.tailwind.config??DEFAULT_TAILWIND_CONFIG},{type:"text",name:"components",message:`Configure the import alias for ${highlighter.info("components")}:`,initial:e?.aliases.components??DEFAULT_COMPONENTS},{type:"toggle",name:"rsc",message:`Are you using ${highlighter.info("React Server Components")}?`,initial:e?.rsc??true,active:"yes",inactive:"no"}]);o.style||process.exit(1);let n=e&&e.aliases.components===o.components?e.aliases:void 0,i=Ho(o.components,n);return rawConfigSchema.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:{components:o.components,ui:i.ui,lib:i.lib,hooks:i.hooks,utils:i.utils}})}async function Za(e,t){let r=e.style,o="neutral",n=e.tailwind.cssVariables,i=e.iconLibrary??"lucide";if(!t.defaults){let[s,a]=await Promise.all([yr(),getProjectTailwindVersionFromConfig(e)]);r=(await ae([{type:a==="v4"||r?null:"select",name:"style",message:`Which ${highlighter.info("style")} would you like to use?`,choices:s.map(l=>({title:l.name==="new-york"?"New York (Recommended)":l.label,value:l.name})),initial:0}])).style??r??"new-york";}return n=t.cssVariables,rawConfigSchema.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:o,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:i,rtl:t.rtl??e?.rtl??false,aliases:e?.aliases})}async function Qa(e,t){let r=getBase(e);if(t===r)return t;logger.warn(` You are switching from ${highlighter.info(r)} to ${highlighter.info(t)}.`),logger.warn(` Components outside the ${highlighter.info("ui")} directory that depend on ${highlighter.info(r)} primitives may need manual updates.`),logger.break();let{proceed:o}=await ae({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:false});return o?t:r}async function on(e){let t={};if(!F.existsSync(e.cwd)||!F.existsSync(X__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!F.existsSync(X__default.resolve(e.cwd,"components.json"))){if(await isMonorepoRoot(e.cwd)){let r=await getMonorepoTargets(e.cwd);r.length>0&&(formatMonorepoMessage("add [component]",r),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await getConfig(e.cwd);return {errors:t,config:r}}catch{logger.break(),logger.error(`An invalid ${highlighter.info("components.json")} file was found at ${highlighter.info(e.cwd)}.
93
- Before you can add components, you must create a valid ${highlighter.info("components.json")} file by running the ${highlighter.info("init")} command.`),logger.error(`Learn more at ${highlighter.info(`${SHADCN_URL}/docs/components-json`)}.`),logger.break(),process.exit(1);}}async function an(e,t,r={}){let o={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return o;let n=await resolveRegistryTree(e,configWithDefaults(t));if(!n)throw new Error("Failed to fetch components from registry.");r.skipFonts||(n=await massageTreeForFonts(n,t));let i=getSupportedFontMarkers([n]);return o.dependencies=Array.from(new Set(n.dependencies??[])),o.devDependencies=Array.from(new Set(n.devDependencies??[])),o.docs=n.docs??null,await Tc(n,t,o,r,i),await jc(n,t,o,r),Oc(n,t,o),r.skipFonts||Fc(n,o),o}async function Tc(e,t,r,o,n){let i=e.files;if(!i?.length)return;let[s,a]=await Promise.all([getProjectInfo(t.resolvedPaths.cwd),t.tailwind.baseColor?getRegistryBaseColor(t.tailwind.baseColor):Promise.resolve(void 0)]),c;try{c=loadConfig(t.resolvedPaths.cwd);}catch{c={resultType:"failed"};}let l=new Project({compilerOptions:{}}),p=getPlannedFilePaths(i,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name});for(let f=0;f<i.length;f++){let m=i[f];if(!m.content)continue;let d=resolveFilePath(m,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name,commonRoot:findCommonRoot(i.map(b=>b.path),m.path),fileIndex:f});if(!d)continue;t.tsx||(d=d.replace(/\.tsx?$/,b=>b===".tsx"?".jsx":".js"));let u=existsSync(d),g=X__default.relative(t.resolvedPaths.cwd,d),y=m.type==="registry:file"||m.type==="registry:item",w=isEnvFile(d)||y?m.content:await transform({filename:m.path,raw:m.content,config:t,baseColor:a,transformJsx:!t.tsx,isRemote:false,supportedFontMarkers:n},[transformImport,transformRsc,transformCssVars,transformTwPrefixes,transformIcons,transformMenu,transformAsChild,transformRtl,transformFont,transformCleanup]),x=isEnvFile(d)||y?w:await rewriteResolvedImportsInContent({config:t,content:w,filePaths:p,project:l,projectInfo:s,resolvedPath:d,tsConfig:c}),k="create",N;u&&(N=await promises.readFile(d,"utf-8"),isContentSame(N,x)?k="skip":k="overwrite"),r.files.push({path:g,action:k,content:x,...k==="overwrite"&&{existingContent:N},type:m.type??"registry:ui"});}}async function jc(e,t,r,o){let n=e.css&&Object.keys(e.css).length>0,i=Object.keys(e.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!n&&!i)return;let s=t.resolvedPaths.tailwindCss,a=existsSync(s),c=X__default.relative(t.resolvedPaths.cwd,s),l=a?await promises.readFile(s,"utf8"):"",p=l;i&&(p=await transformCssVars$1(p,e.cssVars,t,{overwriteCssVars:o.overwriteCssVars})),n&&(p=await transformCss(p,e.css));let f=0;if(e.cssVars)for(let m of Object.values(e.cssVars))m&&(f+=Object.keys(m).length);r.css={path:c,content:p,...a&&{existingContent:l},action:a?"update":"create",cssVarsCount:f};}function Oc(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let o=X__default.join(t.resolvedPaths.cwd,".env.local"),n=existsSync(o),i=X__default.relative(t.resolvedPaths.cwd,o);r.envVars={path:i,variables:e.envVars,action:n?"update":"create"};}function Fc(e,t){if(e.fonts?.length)for(let r of e.fonts)t.fonts.push({name:r.font.family,provider:r.font.provider==="google"?"Google Fonts":r.font.provider});}var ce=5,Dc=dim("\u250C"+"\u2500".repeat(46)),_c=dim("\u2514"+"\u2500".repeat(46)),Mc={create:"+",overwrite:"~",skip:"="},Vc={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function nt(e){return e==="create"?green(e):e==="overwrite"||e==="update"?yellow(e):dim(e)}function it(e){return `${bold("\u250C")} ${bold(`shadcn add ${e.join(", ")}`)} ${dim("(dry run)")}`}function fn(e,t){return e===t||e.includes(t)||e.endsWith(t)}function ke(e,t,r=o=>o){e.push(`${dim("\u2502")} ${Dc}`);for(let o of t)e.push(`${dim("\u2502")} ${dim("\u2502")} ${r(o)}`);e.push(`${dim("\u2502")} ${_c}`);}function pn(e,t,r={}){return r.diff?typeof r.diff=="string"?Uc(e,t,r.diff):Wc(e,t):r.view?typeof r.view=="string"?zc(e,t,r.view):Jc(e,t):Bc(e,t)}function Bc(e,t){let r=[];r.push(it(t)),r.push(dim("\u2502")),Hc(e,r),cn("Dependencies",e.dependencies,r),cn("Dev Dependencies",e.devDependencies,r),Gc(e,r),Kc(e,r),Yc(e,r);let o=e.files.filter(i=>i.action==="overwrite").length;o>0&&(r.push(yellow(`\u26A0 ${o} ${o===1?"file":"files"} will be overwritten.`)),r.push(dim("\u2502")));let n=[];return e.files.length>0&&n.push(`${e.files.length} ${e.files.length===1?"file":"files"}`),e.dependencies.length>0&&n.push(`${e.dependencies.length} ${e.dependencies.length===1?"dep":"deps"}`),e.css?.cssVarsCount&&n.push(`${e.css.cssVarsCount} CSS vars`),n.length>0&&(r.push(`${dim("\u2502")} ${dim(n.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(`
94
- `)}function Uc(e,t,r){let o=[];o.push(it(t)),o.push(dim("\u2502"));let n=dn(e.files,r),i=e.css&&fn(e.css.path,r);if(n.length===0&&!i)o.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),o.push(dim("\u2502"));else {for(let s of n)mn(s,o);if(i&&e.css){if(o.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${nt(e.css.action)}${dim(")")}`),e.css.action==="create"||!e.css.existingContent)ke(o,e.css.content.split(`
90
+ `),k(e),[]}}async function Yo(){try{let[e]=await fetchRegistry(["icons/index.json"]);return iconsSchema.parse(e)}catch(e){return k(e),{}}}async function qo(e,t){try{let r=t.map(n=>`styles/${e}/${n.name}.json`);return (await fetchRegistry(r)).map(n=>registryItemSchema.parse(n))}catch(r){return k(r),[]}}var Ya=z$1.object({cwd:z$1.string(),name:z$1.string().optional(),preset:z$1.union([z$1.boolean(),z$1.string()]).optional(),components:z$1.array(z$1.string()).optional(),yes:z$1.boolean(),defaults:z$1.boolean(),force:z$1.boolean(),reinstall:z$1.boolean().optional(),silent:z$1.boolean(),isNewProject:z$1.boolean().default(false),cssVariables:z$1.boolean().default(true),rtl:z$1.boolean().optional(),pointer:z$1.boolean().optional(),base:z$1.enum(PRESET_BASES).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:rawConfigSchema.deepPartial().optional(),menuColor:z$1.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:z$1.enum(["subtle","bold"]).optional(),iconLibrary:z$1.string().optional()});function qa(e,t){return t.rtl?e.searchParams.set("rtl","true"):t.rtl===false&&e.searchParams.delete("rtl"),t.pointer?e.searchParams.set("pointer","true"):t.pointer===false&&e.searchParams.delete("pointer"),e}var tn=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. (base, radix, aria)").option("--monorepo","scaffold a monorepo project.").option("--no-monorepo","skip the monorepo prompt.").option("-p, --preset [name]","use a preset configuration").option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults","use default configuration: --template=next --preset=base-nova",false).option("-f, --force","force overwrite of existing configuration.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-n, --name <name>","the name for the new project.").option("-s, --silent","mute output.",false).option("--css-variables","use css variables for theming.",true).option("--no-css-variables","do not use css variables for theming.").option("--rtl","enable RTL support.").option("--no-rtl","disable RTL support.").option("--pointer","enable pointer cursor for buttons.").option("--no-pointer","disable pointer cursor for buttons.").option("--reinstall","re-install existing UI components.").option("--no-reinstall","do not re-install existing UI components.").action(async(e,t)=>{let r,o=[],n=()=>{r&&Oe(r.replace(Fe,""));};process.on("exit",n);try{let i=Ya.parse({...t,reinstall:t.reinstall,cwd:X__default.resolve(t.cwd)}),s=new Map(Object.entries(J)),a;if(i.defaults&&(i.template=i.template||"next",i.base=i.base||"base",i.reinstall=i.reinstall??!1),i.template&&!(i.template in H)&&(logger.error(`Invalid template: ${highlighter.info(i.template)}. Available templates: ${Object.keys(H).map(d=>highlighter.info(d)).join(", ")}.`),logger.break(),process.exit(1)),typeof i.preset=="string"&&!isUrl(i.preset)&&!isPresetCode(i.preset)){let d=Array.from(s.keys());s.has(i.preset)||(logger.error(`Invalid preset: ${highlighter.info(i.preset)}. Available presets: ${d.join(", ")}`),logger.break(),process.exit(1));}let c=i.cwd,l=F.existsSync(X__default.resolve(c,"components.json"));if(!i.monorepo&&!l&&await isMonorepoRoot(c)){let d=await getProjectInfo(c);if(!d||d.framework.name==="manual"){let u=await getMonorepoTargets(c);u.length>0&&(formatMonorepoMessage("init",u),process.exit(1));}}if(l&&!i.force){let{overwrite:d}=await ae({type:"confirm",name:"overwrite",message:`A ${highlighter.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});d||(logger.info(` To start over, remove the ${highlighter.info("components.json")} file and run ${highlighter.info("init")} again.`),logger.break(),process.exit(1)),i.force=!0;}let p;if(l){try{p=await F.readJson(X__default.resolve(c,"components.json"));}catch{logger.warn(`Could not parse the existing ${highlighter.info("components.json")}. Unable to detect the current base.`);}p&&(i.existingConfig=p);let d=i.reinstall;if(d===void 0){let{reinstall:u}=await ae({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});d=u;}if(d&&(o=await getProjectComponents(c),o.length)){logger.break(),logger.log(" The following components will be re-installed and overwritten:");for(let u=0;u<o.length;u+=8)logger.log(` - ${o.slice(u,u+8).join(", ")}`);logger.break();}}if(i.preset===void 0&&e.length===0&&!i.defaults){let d=F.existsSync(X__default.resolve(c,"package.json"));if(!i.template&&!d){let{template:u}=await ae({type:"select",name:"template",message:"Select a template",choices:Object.entries(H).map(([g,y])=>({title:y.title,value:g,description:y.description,disabled:i.monorepo&&g==="laravel"}))});u||process.exit(1),i.template=u;}if(!i.template&&d){let u=await getProjectInfo(c),g=Te(u?.framework.name);g&&(i.template=g);}if(i.template==="laravel"&&!d&&(logger.break(),logger.log(` Please create a new app with ${highlighter.info("laravel new --react")} first then run ${highlighter.info("shadcn init")}.`),logger.log(` See ${highlighter.info(`${SHADCN_URL}/docs/installation/laravel`)} for more information.`),logger.break(),process.exit(0)),i.monorepo===void 0&&!d&&i.template&&H[i.template]?.monorepo){let{monorepo:u}=await ae({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});i.monorepo=u;}i.base||(i.base=await Ne()),i.preset=!0;}if(i.preset!==void 0){let d=i.preset===!0?!0:i.preset;if(d===!0){let u=await qe({rtl:i.rtl??!1,template:i.template,base:i.base,pointer:i.pointer});e=[u.url,...e],a=u.base;}if(typeof d=="string"){let u;if(isUrl(d)){let g=new URL(d);qa(g,i),g.pathname==="/init"&&d.startsWith(SHADCN_URL)&&g.searchParams.set("track","1"),u=g.toString();let y=g.searchParams.get("base");a=isPresetBase(y)?y:void 0;}else if(isPresetCode(d)){let g=decodePreset(d);g||(logger.error(`Invalid preset code: ${highlighter.info(d)}`),logger.break(),process.exit(1)),u=ne({...g,base:"base",rtl:i.rtl??!1},{template:i.template,preset:d,pointer:i.pointer}),a=void 0;}else {let g=s.get(d);if(!g)throw new Error(`Unknown preset: ${d}`);u=ne({...g,base:i.base??"base",rtl:i.rtl??g.rtl},{template:i.template,pointer:i.pointer}),a=void 0;}e=[u,...e];}}let f=i.base??a??(typeof p?.style=="string"?getBase(p.style):void 0),m=l&&!p;if(!f)if(e.length>0&&!m)f="base";else {let d=await Ne();f=d,i.base=d;}if(i.defaults&&!e.some(isUrl)&&(e=[ne({...J.nova,base:f,rtl:i.rtl??!1},{template:i.template,pointer:i.pointer}),...e]),e.length>0&&isUrl(e[0])){let d=new URL(e[0]);d.searchParams.set("base",f),e[0]=d.toString();}if(p?.style){let d=await Qa(p.style,f);if(d!==f&&(f=d,e.length>0&&isUrl(e[0]))){let u=new URL(e[0]);u.searchParams.set("base",d),e[0]=u.toString();}}if(o.length&&(e=[...e,...o]),i.components=e,await loadEnvFiles(i.cwd),e.length>0){let d=X__default.resolve(c,"components.json");l&&(r=Ze(d)??void 0,r||logger.warn(`Could not back up ${highlighter.info("components.json")}.`));let{registryBaseConfig:u,installStyleIndex:g,url:y}=await he(e[0],c,{registries:p?.registries});e[0]=y,g||(i.installStyleIndex=!1),u&&(i.registryBaseConfig=u);}await Ae(i),logger.break(),logger.log(`Project initialization completed.
91
+ You may now add components.`),process.removeListener("exit",n),Qe(X__default.resolve(c,"components.json")),logger.break();}catch(i){process.removeListener("exit",n),n(),logger.break(),k(i);}finally{clearRegistryContext();}});async function Ae(e){let t,r,o,n=e.template,i=n?we(H[n],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&F.existsSync(X__default.resolve(e.cwd,"package.json")))t=await getProjectInfo(e.cwd);else if(e.skipPreflight)t=await getProjectInfo(e.cwd);else {let C=await bo(e);if(C.errors["1"]){let{projectPath:T,template:W}=await Nt(e);T||process.exit(1),e.cwd=T,e.isNewProject=true,o=W,t=await getProjectInfo(e.cwd);}else t=C.projectInfo;}r=await getProjectConfig(e.cwd,t);let a=o??n,c=a?we(H[a],{monorepo:e.monorepo}):void 0,l=[...e.installStyleIndex?["index"]:[],...e.components??[],...c?["button"]:[]],p=o?c?.postInit:void 0;if(c?.init){let C=await c.init({projectPath:e.cwd,components:l,registryBaseConfig:e.registryBaseConfig,rtl:e.rtl??false,menuColor:e.menuColor,menuAccent:e.menuAccent,iconLibrary:e.iconLibrary,silent:e.silent});return p&&await p({projectPath:e.cwd}),C}let f=r?await Za(r,e):await Xa(await getConfig(e.cwd));if(!e.yes){let{proceed:C}=await ae({type:"confirm",name:"proceed",message:`Write configuration to ${highlighter.info("components.json")}. Proceed?`,initial:true});C||process.exit(1);}let m=await resolveConfigPaths(e.cwd,f),{discoveredRegistries:d,packageJsonRegistries:u}=await _(l,m,{silent:true,writeFile:false});Object.keys(d).length>0&&(f.registries={...f.registries,...d});let g=spinner("Writing components.json.").start(),y=X__default.resolve(e.cwd,"components.json"),w=`${y}${Fe}`,x=(C,T)=>{let{registries:W,...Ke}=$o(C,T);return {...Ke,registries:W}};if(F.existsSync(w)){let C=await F.readJson(w);e.force?C.registries&&(f.registries={...C.registries,...f.registries||{}}):f=x(C,f);}e.registryBaseConfig&&(f=x(f,e.registryBaseConfig)),e.rtl!==void 0&&(f.rtl=e.rtl),f.registries=Object.fromEntries(Object.entries(f.registries||{}).filter(([C])=>!Object.keys(BUILTIN_REGISTRIES).includes(C))),await promises.writeFile(y,`${JSON.stringify(f,null,2)}
92
+ `,"utf8"),g.succeed();let b=await resolveConfigPaths(e.cwd,f);Object.keys(u).length>0&&(b.registries={...b.registries,...u});let N=await getWorkspaceConfig(b);if(N){let C={};if(f.menuColor&&(C.menuColor=f.menuColor),f.menuAccent&&(C.menuAccent=f.menuAccent),f.rtl!==void 0&&(C.rtl=f.rtl),f.iconLibrary&&(C.iconLibrary=f.iconLibrary),Object.keys(C).length>0)for(let T of Object.keys(N)){let W=N[T];if(W.resolvedPaths.cwd===b.resolvedPaths.cwd)continue;let Ke=X__default.resolve(W.resolvedPaths.cwd,"components.json");if(F.existsSync(Ke)){let Rs=await F.readJson(Ke);await F.writeJson(Ke,{...Rs,...C},{spaces:2});}}}return explorer.clearCaches(),await addComponents(l,b,{overwrite:true,overwriteCssVars:e.reinstall||void 0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),p&&await p({projectPath:e.cwd}),b}async function Xa(e=null){let[t,r]=await Promise.all([yr(),getRegistryBaseColors()]);logger.info("");let o=await ae([{type:"toggle",name:"typescript",message:`Would you like to use ${highlighter.info("TypeScript")} (recommended)?`,initial:e?.tsx??true,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${highlighter.info("style")} would you like to use?`,choices:t.map(s=>({title:s.label,value:s.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${highlighter.info("base color")}?`,choices:r.map(s=>({title:s.label,value:s.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${highlighter.info("global CSS")} file?`,initial:e?.tailwind.css??DEFAULT_TAILWIND_CSS},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${highlighter.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables??true,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${highlighter.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${highlighter.info("tailwind.config.js")} located?`,initial:e?.tailwind.config??DEFAULT_TAILWIND_CONFIG},{type:"text",name:"components",message:`Configure the import alias for ${highlighter.info("components")}:`,initial:e?.aliases.components??DEFAULT_COMPONENTS},{type:"toggle",name:"rsc",message:`Are you using ${highlighter.info("React Server Components")}?`,initial:e?.rsc??true,active:"yes",inactive:"no"}]);o.style||process.exit(1);let n=e&&e.aliases.components===o.components?e.aliases:void 0,i=Ho(o.components,n);return rawConfigSchema.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:{components:o.components,ui:i.ui,lib:i.lib,hooks:i.hooks,utils:i.utils}})}async function Za(e,t){let r=e.style,o="neutral",n=e.tailwind.cssVariables,i=e.iconLibrary??"lucide";if(!t.defaults){let[s,a]=await Promise.all([yr(),getProjectTailwindVersionFromConfig(e)]);r=(await ae([{type:a==="v4"||r?null:"select",name:"style",message:`Which ${highlighter.info("style")} would you like to use?`,choices:s.map(l=>({title:l.name==="new-york"?"New York (Recommended)":l.label,value:l.name})),initial:0}])).style??r??"new-york";}return n=t.cssVariables,rawConfigSchema.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:o,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:i,rtl:t.rtl??e?.rtl??false,aliases:e?.aliases})}async function Qa(e,t){let r=getBase(e);if(t===r)return t;logger.warn(` You are switching from ${highlighter.info(r)} to ${highlighter.info(t)}.`),logger.warn(` Components outside the ${highlighter.info("ui")} directory that depend on ${highlighter.info(r)} primitives may need manual updates.`),logger.break();let{proceed:o}=await ae({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:false});return o?t:r}async function on(e){let t={};if(!F.existsSync(e.cwd)||!F.existsSync(X__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!F.existsSync(X__default.resolve(e.cwd,"components.json"))){if(await isMonorepoRoot(e.cwd)){let r=await getMonorepoTargets(e.cwd);r.length>0&&(formatMonorepoMessage("add [component]",r),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await getConfig(e.cwd);return {errors:t,config:r}}catch{logger.break(),logger.error(`An invalid ${highlighter.info("components.json")} file was found at ${highlighter.info(e.cwd)}.
93
+ Before you can add components, you must create a valid ${highlighter.info("components.json")} file by running the ${highlighter.info("init")} command.`),logger.error(`Learn more at ${highlighter.info(`${SHADCN_URL}/docs/components-json`)}.`),logger.break(),process.exit(1);}}async function an(e,t,r={}){let o={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return o;let n=await resolveRegistryTree(e,configWithDefaults(t));if(!n)throw new Error("Failed to fetch components from registry.");r.skipFonts||(n=await massageTreeForFonts(n,t));let i=getSupportedFontMarkers([n]);return o.dependencies=Array.from(new Set(n.dependencies??[])),o.devDependencies=Array.from(new Set(n.devDependencies??[])),o.docs=n.docs??null,await Nc(n,t,o,r,i),await Tc(n,t,o,r),jc(n,t,o),r.skipFonts||Oc(n,o),o}async function Nc(e,t,r,o,n){let i=e.files;if(!i?.length)return;let[s,a]=await Promise.all([getProjectInfo(t.resolvedPaths.cwd),t.tailwind.baseColor?getRegistryBaseColor(t.tailwind.baseColor):Promise.resolve(void 0)]),c;try{c=loadConfig(t.resolvedPaths.cwd);}catch{c={resultType:"failed"};}let l=getPlannedFilePaths(i,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name});for(let p=0;p<i.length;p++){let f=i[p];if(!f.content)continue;let m=resolveFilePath(f,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name,commonRoot:findCommonRoot(i.map(N=>N.path),f.path),fileIndex:p});if(!m)continue;t.tsx||(m=m.replace(/\.tsx?$/,N=>N===".tsx"?".jsx":".js"));let d=existsSync(m),u=X__default.relative(t.resolvedPaths.cwd,m),g=f.type==="registry:file"||f.type==="registry:item",y=isEnvFile(m)||g?f.content:await transform({filename:f.path,raw:f.content,config:t,baseColor:a,transformJsx:!t.tsx,isRemote:false,supportedFontMarkers:n},[transformImport,transformRsc,transformCssVars,transformTwPrefixes,transformIcons,transformMenu,transformAsChild,transformRtl,transformFont,transformCleanup]),w=isEnvFile(m)||g?y:await rewriteResolvedImportsInContent({config:t,content:y,filePaths:l,projectInfo:s,resolvedPath:m,tsConfig:c}),x="create",b;d&&(b=await promises.readFile(m,"utf-8"),isContentSame(b,w)?x="skip":x="overwrite"),r.files.push({path:u,action:x,content:w,...x==="overwrite"&&{existingContent:b},type:f.type??"registry:ui"});}}async function Tc(e,t,r,o){let n=e.css&&Object.keys(e.css).length>0,i=Object.keys(e.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!n&&!i)return;let s=t.resolvedPaths.tailwindCss,a=existsSync(s),c=X__default.relative(t.resolvedPaths.cwd,s),l=a?await promises.readFile(s,"utf8"):"",p=l;i&&(p=await transformCssVars$1(p,e.cssVars,t,{overwriteCssVars:o.overwriteCssVars})),n&&(p=await transformCss(p,e.css));let f=0;if(e.cssVars)for(let m of Object.values(e.cssVars))m&&(f+=Object.keys(m).length);r.css={path:c,content:p,...a&&{existingContent:l},action:a?"update":"create",cssVarsCount:f};}function jc(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let o=X__default.join(t.resolvedPaths.cwd,".env.local"),n=existsSync(o),i=X__default.relative(t.resolvedPaths.cwd,o);r.envVars={path:i,variables:e.envVars,action:n?"update":"create"};}function Oc(e,t){if(e.fonts?.length)for(let r of e.fonts)t.fonts.push({name:r.font.family,provider:r.font.provider==="google"?"Google Fonts":r.font.provider});}var ce=5,Lc=dim("\u250C"+"\u2500".repeat(46)),Dc=dim("\u2514"+"\u2500".repeat(46)),_c={create:"+",overwrite:"~",skip:"="},Mc={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function nt(e){return e==="create"?green(e):e==="overwrite"||e==="update"?yellow(e):dim(e)}function it(e){return `${bold("\u250C")} ${bold(`shadcn add ${e.join(", ")}`)} ${dim("(dry run)")}`}function fn(e,t){return e===t||e.includes(t)||e.endsWith(t)}function ke(e,t,r=o=>o){e.push(`${dim("\u2502")} ${Lc}`);for(let o of t)e.push(`${dim("\u2502")} ${dim("\u2502")} ${r(o)}`);e.push(`${dim("\u2502")} ${Dc}`);}function pn(e,t,r={}){return r.diff?typeof r.diff=="string"?Bc(e,t,r.diff):Uc(e,t):r.view?typeof r.view=="string"?Jc(e,t,r.view):Wc(e,t):Vc(e,t)}function Vc(e,t){let r=[];r.push(it(t)),r.push(dim("\u2502")),zc(e,r),cn("Dependencies",e.dependencies,r),cn("Dev Dependencies",e.devDependencies,r),Hc(e,r),Gc(e,r),Kc(e,r);let o=e.files.filter(i=>i.action==="overwrite").length;o>0&&(r.push(yellow(`\u26A0 ${o} ${o===1?"file":"files"} will be overwritten.`)),r.push(dim("\u2502")));let n=[];return e.files.length>0&&n.push(`${e.files.length} ${e.files.length===1?"file":"files"}`),e.dependencies.length>0&&n.push(`${e.dependencies.length} ${e.dependencies.length===1?"dep":"deps"}`),e.css?.cssVarsCount&&n.push(`${e.css.cssVarsCount} CSS vars`),n.length>0&&(r.push(`${dim("\u2502")} ${dim(n.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(`
94
+ `)}function Bc(e,t,r){let o=[];o.push(it(t)),o.push(dim("\u2502"));let n=dn(e.files,r),i=e.css&&fn(e.css.path,r);if(n.length===0&&!i)o.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),o.push(dim("\u2502"));else {for(let s of n)mn(s,o);if(i&&e.css){if(o.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${nt(e.css.action)}${dim(")")}`),e.css.action==="create"||!e.css.existingContent)ke(o,e.css.content.split(`
95
95
  `),s=>green(`+${s}`));else {let s=un(e.css.existingContent,e.css.content,e.css.path,{fullContext:true});ke(o,s);}o.push(dim("\u2502"));}}return o.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),o.join(`
96
- `)}function Wc(e,t){let r=[];r.push(it(t)),r.push(dim("\u2502"));let o=e.files.slice(0,ce);if(o.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No changes.")}`),r.push(dim("\u2502"));else {for(let s of o)mn(s,r);e.files.length>ce&&r.push(dim("\u2502"));}let n=e.files.length;return n>ce&&r.push(` ${dim(`Showing ${ce} of ${n} files. Use --diff <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
97
- `)}function Jc(e,t){let r=[];r.push(it(t)),r.push(dim("\u2502"));let o=e.files.slice(0,ce);if(o.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No files.")}`),r.push(dim("\u2502"));else {for(let s of o){let a=s.content.split(`
96
+ `)}function Uc(e,t){let r=[];r.push(it(t)),r.push(dim("\u2502"));let o=e.files.slice(0,ce);if(o.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No changes.")}`),r.push(dim("\u2502"));else {for(let s of o)mn(s,r);e.files.length>ce&&r.push(dim("\u2502"));}let n=e.files.length;return n>ce&&r.push(` ${dim(`Showing ${ce} of ${n} files. Use --diff <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
97
+ `)}function Wc(e,t){let r=[];r.push(it(t)),r.push(dim("\u2502"));let o=e.files.slice(0,ce);if(o.length===0&&!e.css)r.push(`${dim("\u2502")} ${dim("No files.")}`),r.push(dim("\u2502"));else {for(let s of o){let a=s.content.split(`
98
98
  `);r.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${nt(s.action)}${dim(")")} ${dim(`${a.length} lines`)}`),ke(r,a),r.push(dim("\u2502"));}e.files.length>ce&&r.push(dim("\u2502"));}let n=e.files.length;return n>ce&&r.push(` ${dim(`Showing ${ce} of ${n} files. Use --view <path> to view a specific file.`)}`),r.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),r.join(`
99
99
  `)}function mn(e,t){if(t.push(`${dim("\u251C")} ${bold(e.path)} ${dim("(")}${nt(e.action)}${dim(")")}`),e.action==="skip")t.push(`${dim("\u2502")} ${dim("No changes.")}`);else if(e.action==="create")ke(t,e.content.split(`
100
- `),r=>green(`+${r}`));else {let r=un(e.existingContent,e.content,e.path);ke(t,r);}t.push(dim("\u2502"));}function zc(e,t,r){let o=[];o.push(it(t)),o.push(dim("\u2502"));let n=dn(e.files,r),i=e.css&&fn(e.css.path,r);if(n.length===0&&!i)o.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),o.push(dim("\u2502"));else {for(let s of n){let a=s.content.split(`
100
+ `),r=>green(`+${r}`));else {let r=un(e.existingContent,e.content,e.path);ke(t,r);}t.push(dim("\u2502"));}function Jc(e,t,r){let o=[];o.push(it(t)),o.push(dim("\u2502"));let n=dn(e.files,r),i=e.css&&fn(e.css.path,r);if(n.length===0&&!i)o.push(`${dim("\u2502")} ${yellow(`No file matching "${r}" found.`)}`),o.push(dim("\u2502"));else {for(let s of n){let a=s.content.split(`
101
101
  `);o.push(`${dim("\u251C")} ${bold(s.path)} ${dim("(")}${nt(s.action)}${dim(")")} ${dim(`${a.length} lines`)}`),ke(o,a),o.push(dim("\u2502"));}if(i&&e.css){let s=e.css.content.split(`
102
102
  `);o.push(`${dim("\u251C")} ${bold(e.css.path)} ${dim("(")}${nt(e.css.action)}${dim(")")} ${dim(`${s.length} lines`)}`),ke(o,s),o.push(dim("\u2502"));}}return o.push(`${dim("\u2514")} ${dim("Run without --dry-run to apply.")}`),o.join(`
103
- `)}function Hc(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 n=o.length>0?` ${o.join(dim(", "))}`:"";t.push(`${dim("\u251C")} ${bold("Files")} ${dim(`(${e.files.length})`)}${n}`);let i=Math.max(...e.files.map(s=>s.path.length));for(let s of e.files){let a=Mc[s.action],c=Vc[s.action],l=" ".repeat(Math.max(1,i-s.path.length+2)),p=s.action==="create"?green:s.action==="overwrite"?yellow:dim,f=s.action==="skip"?dim(s.path):s.path;t.push(`${dim("\u2502")} ${p(a)} ${f}${l}${p(c)}`);}t.push(dim("\u2502"));}function cn(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 Gc(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 Kc(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 Yc(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 dn(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 un(e,t,r,o={}){if(el(e,t))return [dim(" Formatting-only changes (spacing, quotes, semicolons).")];let n=ln(e),i=ln(t),s=o.fullContext?Math.max(n.split(`
103
+ `)}function zc(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 n=o.length>0?` ${o.join(dim(", "))}`:"";t.push(`${dim("\u251C")} ${bold("Files")} ${dim(`(${e.files.length})`)}${n}`);let i=Math.max(...e.files.map(s=>s.path.length));for(let s of e.files){let a=_c[s.action],c=Mc[s.action],l=" ".repeat(Math.max(1,i-s.path.length+2)),p=s.action==="create"?green:s.action==="overwrite"?yellow:dim,f=s.action==="skip"?dim(s.path):s.path;t.push(`${dim("\u2502")} ${p(a)} ${f}${l}${p(c)}`);}t.push(dim("\u2502"));}function cn(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 Hc(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 Gc(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 Kc(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 dn(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 un(e,t,r,o={}){if(Qc(e,t))return [dim(" Formatting-only changes (spacing, quotes, semicolons).")];let n=ln(e),i=ln(t),s=o.fullContext?Math.max(n.split(`
104
104
  `).length,i.split(`
105
105
  `).length):3,a=structuredPatch(`a/${r}`,`b/${r}`,n,i,"","",{context:s});if(!a.hunks.length)return [dim(" No changes.")];let c=[dim(`--- a/${r}`),dim(`+++ b/${r}`)],l=t.split(`
106
- `);for(let p of a.hunks){let{entries:f}=qc(p,l);if(!f.some(y=>y.kind!=="context"))continue;let d=f.filter(y=>y.kind==="context").length,u=f.filter(y=>y.kind==="removed").length,g=f.filter(y=>y.kind==="added").length;c.push(cyan(`@@ -${p.oldStart},${d+u} +${p.newStart},${d+g} @@`));for(let y of f)c.push(y.formatted);}return c}function qc(e,t){let r=[],o=e.newStart-1,n=0;for(;n<e.lines.length;){let i=e.lines[n];if(i.startsWith("-")){let s=[];for(;n<e.lines.length&&e.lines[n].startsWith("-");)s.push(e.lines[n].slice(1)),n++;for(;n<e.lines.length&&e.lines[n].startsWith("\\");)n++;let a=[];for(;n<e.lines.length&&e.lines[n].startsWith("+");)a.push(e.lines[n].slice(1)),n++;for(;n<e.lines.length&&e.lines[n].startsWith("\\");)n++;o=Xc(s,a,t,o,r);}else if(i.startsWith("+")){let s=t[o]??i.slice(1);r.push({kind:"added",formatted:green(`+${s}`)}),o++,n++;}else if(i.startsWith("\\"))n++;else {let s=t[o]??i.slice(1);r.push({kind:"context",formatted:dim(` ${s}`)}),o++,n++;}}return {entries:r,newLineIndex:o}}function Xc(e,t,r,o,n){if(tl(e,t)){for(let c=0;c<t.length;c++){let l=r[o]??t[c];n.push({kind:"context",formatted:dim(` ${l}`)}),o++;}return o}let i=Zc(e),s=i.map(Ot),a=new Set;for(let c=0;c<t.length;c++){let l=r[o]??t[c],p=Ot(t[c]),f=s.findIndex((m,d)=>!a.has(d)&&m===p);if(f!==-1)a.add(f),n.push({kind:"context",formatted:dim(` ${l}`)});else {let m=s.findIndex((d,u)=>!a.has(u));if(m!==-1){a.add(m);let{oldHighlighted:d,newHighlighted:u}=Qc(i[m],l);n.push({kind:"removed",formatted:d}),n.push({kind:"added",formatted:u});}else n.push({kind:"added",formatted:green(`+${l}`)});}o++;}for(let c=0;c<i.length;c++)a.has(c)||n.push({kind:"removed",formatted:red(`-${i[c]}`)});return o}function ln(e){return e.split(`
106
+ `);for(let p of a.hunks){let{entries:f}=Yc(p,l);if(!f.some(y=>y.kind!=="context"))continue;let d=f.filter(y=>y.kind==="context").length,u=f.filter(y=>y.kind==="removed").length,g=f.filter(y=>y.kind==="added").length;c.push(cyan(`@@ -${p.oldStart},${d+u} +${p.newStart},${d+g} @@`));for(let y of f)c.push(y.formatted);}return c}function Yc(e,t){let r=[],o=e.newStart-1,n=0;for(;n<e.lines.length;){let i=e.lines[n];if(i.startsWith("-")){let s=[];for(;n<e.lines.length&&e.lines[n].startsWith("-");)s.push(e.lines[n].slice(1)),n++;for(;n<e.lines.length&&e.lines[n].startsWith("\\");)n++;let a=[];for(;n<e.lines.length&&e.lines[n].startsWith("+");)a.push(e.lines[n].slice(1)),n++;for(;n<e.lines.length&&e.lines[n].startsWith("\\");)n++;o=qc(s,a,t,o,r);}else if(i.startsWith("+")){let s=t[o]??i.slice(1);r.push({kind:"added",formatted:green(`+${s}`)}),o++,n++;}else if(i.startsWith("\\"))n++;else {let s=t[o]??i.slice(1);r.push({kind:"context",formatted:dim(` ${s}`)}),o++,n++;}}return {entries:r,newLineIndex:o}}function qc(e,t,r,o,n){if(el(e,t)){for(let c=0;c<t.length;c++){let l=r[o]??t[c];n.push({kind:"context",formatted:dim(` ${l}`)}),o++;}return o}let i=Xc(e),s=i.map(Ot),a=new Set;for(let c=0;c<t.length;c++){let l=r[o]??t[c],p=Ot(t[c]),f=s.findIndex((m,d)=>!a.has(d)&&m===p);if(f!==-1)a.add(f),n.push({kind:"context",formatted:dim(` ${l}`)});else {let m=s.findIndex((d,u)=>!a.has(u));if(m!==-1){a.add(m);let{oldHighlighted:d,newHighlighted:u}=Zc(i[m],l);n.push({kind:"removed",formatted:d}),n.push({kind:"added",formatted:u});}else n.push({kind:"added",formatted:green(`+${l}`)});}o++;}for(let c=0;c<i.length;c++)a.has(c)||n.push({kind:"removed",formatted:red(`-${i[c]}`)});return o}function ln(e){return e.split(`
107
107
  `).map(t=>{let r=t.match(/^(\s*)/)?.[1]??"",o=t.slice(r.length);return r+o.replace(/['"]/g,'"').replace(/;$/g,"")}).join(`
108
- `)}function Zc(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 Qc(e,t){let r=diffWords(e,t),o="-",n="+";for(let i of r)i.added?n+=bold(green(i.value)):i.removed?o+=bold(red(i.value)):(o+=red(i.value),n+=green(i.value));return {oldHighlighted:o,newHighlighted:n}}function Ot(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function el(e,t){let r=o=>o.split(`
109
- `).map(Ot).filter(n=>n.length>0).join(" ");return r(e)===r(t)}function tl(e,t){let r=o=>o.map(Ot).filter(n=>n.length>0).join(" ");return r(e)===r(t)}async function hn(e,t){let r=X__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await be__default.stat(r)).isFile())return;let[o]=await getRegistryItems([e],{config:t});if(!o?.meta?.importSpecifier||!o?.meta?.moduleSpecifier)return;let n=`import { ${o?.meta?.importSpecifier} } from "${o.meta.moduleSpecifier}"
108
+ `)}function Xc(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 Zc(e,t){let r=diffWords(e,t),o="-",n="+";for(let i of r)i.added?n+=bold(green(i.value)):i.removed?o+=bold(red(i.value)):(o+=red(i.value),n+=green(i.value));return {oldHighlighted:o,newHighlighted:n}}function Ot(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function Qc(e,t){let r=o=>o.split(`
109
+ `).map(Ot).filter(n=>n.length>0).join(" ");return r(e)===r(t)}function el(e,t){let r=o=>o.map(Ot).filter(n=>n.length>0).join(" ");return r(e)===r(t)}async function hn(e,t){let r=X__default.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await be__default.stat(r)).isFile())return;let[o]=await getRegistryItems([e],{config:t});if(!o?.meta?.importSpecifier||!o?.meta?.moduleSpecifier)return;let n=`import { ${o?.meta?.importSpecifier} } from "${o.meta.moduleSpecifier}"
110
110
 
111
111
  export default function Page() {
112
112
  return <${o?.meta?.importSpecifier} />
113
- }`;await be__default.writeFile(r,n,"utf8");}var hl=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()}),kn=new Command().name("add").description("add a component to your project").argument("[components...]","item addresses to add").option("-y, --yes","skip confirmation prompt.",false).option("-o, --overwrite","overwrite existing files.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",false).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",false).option("--dry-run","preview changes without writing files.",false).option("--diff [path]","show diff for a file.").option("--view [path]","show file contents.").action(async(e,t)=>{try{let r=hl.parse({components:e,...t,cwd:X__default.resolve(t.cwd)});await loadEnvFiles(r.cwd);let o=r.dryRun||r.diff||r.view,n=await getConfig(r.cwd),i=!!n;n||(n=createConfig({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let s=!1;if(e.length>0){let{config:w,newRegistries:x}=await _(e,n,{silent:r.silent,writeFile:!1});n=w,s=x.length>0;}let a=await getProjectInfo(r.cwd),{base:c}=parsePresetStyle(n.style);i&&a?.tailwindVersion==="v4"&&Ft(e,c);let l,p=!0;if(e.length>0&&(i||!DEPRECATED_COMPONENTS.some(w=>w.name===e[0]))){let[w]=await getRegistryItems([e[0]],{config:n});if(l=w?.type,p=l!=="registry:theme"&&l!=="registry:style"&&l!=="registry:base",isUniversalRegistryItem(w)&&!o){await addComponents(e,n,r);return}if(!r.yes&&!o&&(l==="registry:style"||l==="registry:theme")){logger.break();let{confirm:x}=await ae({type:"confirm",name:"confirm",message:highlighter.warn(`You are about to install a new ${l.replace("registry:","")}.
114
- Existing CSS variables and components will be overwritten. Continue?`)});x||(logger.break(),logger.log("Installation cancelled."),logger.break(),process.exit(1));}}r.components?.length||(r.components=await yl(r,n.style)),!e.length&&a?.tailwindVersion==="v4"&&Ft(r.components??[],c);let{errors:m,config:d}=await on(r),u=!1;if(m["3"]){let{proceed:w}=await ae({type:"confirm",name:"proceed",message:`You need to create a ${highlighter.info("components.json")} file to add components. Proceed?`,initial:!0});w||(logger.break(),process.exit(1));let x=Te(a?.framework.name),k=await Ne();Ft(r.components??[],k);let{url:N}=await qe({rtl:!1,base:k,template:x}),{registryBaseConfig:b,installStyleIndex:T,url:W}=await he(N,r.cwd);d=await Ae({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!s,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:T,components:[W,...r.components??[]],registryBaseConfig:b}),u=!0;}let g=!1;if(m["1"]){let w=await Ne();Ft(r.components??[],w);let{projectPath:x,template:k}=await Nt({cwd:r.cwd,force:r.overwrite,components:r.components});x||(logger.break(),process.exit(1)),r.cwd=x;let{url:N}=await qe({rtl:!1,base:w,template:k}),{registryBaseConfig:b,installStyleIndex:T,url:W}=await he(N,r.cwd);d=await Ae({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!s&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:T,components:[W,...r.components??[]],registryBaseConfig:b}),u=!0,g=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//);}if(!d)throw new Error(`Failed to read config at ${highlighter.info(r.cwd)}.`);let{config:y}=await _(r.components,d,{silent:r.silent||s,writeFile:!o});if(d=y,o){let w=spinner("Resolving items.",{silent:r.silent}).start(),x=await an(r.components,d,{overwrite:r.overwrite});w.stop(),logger.log(pn(x,r.components,{diff:r.diff,view:r.view}));return}u||await addComponents(r.components,d,r),g&&await hn(r.components[0],d);}catch(r){logger.break(),C(r);}finally{clearRegistryContext();}});async function yl(e,t){let r=await getShadcnRegistryIndex();if(!r)return logger.break(),C(new Error("Failed to fetch registry index.")),[];let{base:o}=parsePresetStyle(t);if(e.all)return r.map(s=>s.name).filter(s=>wn(s,o));if(e.components?.length)return e.components;let{components:n}=await ae({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:r.filter(s=>s.type==="registry:ui"&&wn(s.name,o)).map(s=>({title:s.name,value:s.name,selected:e.all?true:e.components?.includes(s.name)}))});n?.length||(logger.warn("No components selected. Exiting."),logger.info(""),process.exit(1));let i=z$1.array(z$1.string()).safeParse(n);return i.success?i.data:(logger.error(""),C(new Error("Something went wrong. Please try again.")),[])}function Ft(e,t){let r=DEPRECATED_COMPONENTS.filter(o=>e.includes(o.name)&&bn(o.name,t));r.length&&(logger.break(),r.forEach(o=>{logger.warn(highlighter.warn(o.message));}),logger.break(),process.exit(1));}function bn(e,t){let r=DEPRECATED_COMPONENTS.find(o=>o.name===e);return !!r&&(!r.availableIn||!t||!r.availableIn.includes(t))}function wn(e,t){if(bn(e,t))return false;let r=COMPONENTS_HIDDEN_FROM_SELECTION.find(o=>o.name===e);return !r||!t||!r.hiddenIn.includes(t)}async function Cn(e){let t={};if(!F.existsSync(e.cwd)||!F.existsSync(X__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!F.existsSync(X__default.resolve(e.cwd,"components.json"))){if(await isMonorepoRoot(e.cwd)){let r=await getMonorepoTargets(e.cwd),o=[];for(let n of r){let i=await getProjectInfo(X__default.resolve(e.cwd,n.name));i?.framework&&i.framework.name!=="manual"&&o.push(n);}o.length>0&&(formatMonorepoMessage("apply --preset <preset>",o,{cwdFlag:"-c"}),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await getConfig(e.cwd);return {errors:t,config:r}}catch{logger.break(),logger.error(`An invalid ${highlighter.info("components.json")} file was found at ${highlighter.info(e.cwd)}.
115
- Before you can apply a preset, you must create a valid ${highlighter.info("components.json")} file by running the ${highlighter.info("init")} command.`),logger.error(`Learn more at ${highlighter.info(`${SHADCN_URL}/docs/components-json`)}.`),logger.break(),process.exit(1);}}var jl=z$1.object({cwd:z$1.string(),positionalPreset:z$1.string().optional(),preset:z$1.string().optional(),only:z$1.union([z$1.boolean(),z$1.string()]).optional(),yes:z$1.boolean(),silent:z$1.boolean()}),$n=["theme","font"],De=class extends Error{constructor(t){super(t),this.name="ApplyOnlyError";}},Dt=class extends Error{constructor(t){super(t),this.name="ApplyWorkspaceSyncError";}},En=new Command().name("apply").description("apply a preset to an existing project").argument("[preset]","the preset to apply").option("--preset <preset>","preset configuration to apply").option("--only [parts]","apply only parts of a preset: theme, font").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e,t)=>{try{let r=jl.parse({...t,cwd:X__default.resolve(t.cwd),positionalPreset:e}),o=Ol(r),n=vn(r.only);Ll({preset:o,only:n});let i=await Cn(r);i.errors["1"]&&(logger.break(),logger.error(`The ${highlighter.info("apply")} command only works in an existing project.`),logger.error(`Run ${highlighter.info(Rn(o))} first.`),logger.break(),process.exit(1)),i.errors["3"]&&(logger.break(),logger.error(`No ${highlighter.info("components.json")} found at ${highlighter.info(r.cwd)}.`),logger.error(`Run ${highlighter.info(Rn(o))} first.`),logger.break(),process.exit(1));let s=i.config;s||process.exit(1);let a=s.rtl??!1,c=await Ml(r.cwd);if(!o){let g=pr({command:"init",template:c,base:getBase(s.style),rtl:a});await mr({createUrl:g,followUp:`Then run ${highlighter.info("shadcn apply --preset <preset>")} with the preset code or preset URL from ui.shadcn.com.`,prompt:!r.yes}),process.exit(0);}_l(o);let l=n??vn(Fl(o)),p=!l,f=p?await getProjectComponents(r.cwd):[];if(!r.yes){if(logger.break(),l?logger.warn(highlighter.warn("Applying the selected preset parts will update your project configuration and styles.")):logger.warn(highlighter.warn("Applying a new preset will overwrite existing UI components, fonts, and CSS variables.")),logger.warn("Commit or stash your changes before continuing so you can easily go back."),p)if(logger.break(),logger.log(" The following components will be re-installed:"),f.length)for(let y=0;y<f.length;y+=8)logger.log(` - ${f.slice(y,y+8).join(", ")}`);else logger.log(" - No installed UI components were detected.");logger.break();let{proceed:g}=await ae({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});g||(logger.break(),process.exit(1));}await loadEnvFiles(r.cwd);let m=getBase(s.style),d=Ul(o,m,{template:c,rtl:a,only:l?.join(",")}),u=await Ko(X__default.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:g,installStyleIndex:y,url:w}=await he(d,r.cwd,{registries:s.registries}),x=Dl({registryBaseConfig:g,existingConfig:s,only:l});return await Ae({cwd:r.cwd,yes:!0,force:!1,reinstall:p,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:y,registryBaseConfig:x,existingConfig:s,components:[w,...f]})});await Vl(u,{only:l}),logger.break(),logger.log("Preset applied successfully."),logger.break();}catch(r){if(r instanceof De){for(let o of r.message.split(`
116
- `))logger.error(o);logger.break(),process.exit(1);}r instanceof je&&(logger.error(`Could not back up ${highlighter.info("components.json")}. Aborting.`),logger.break(),process.exit(1)),r instanceof Dt&&(logger.error(r.message),logger.break(),process.exit(1)),logger.break(),C(r);}finally{clearRegistryContext();}});function Ol(e){let t=e.positionalPreset?.trim(),r=e.preset?.trim();return t&&r&&t!==r&&(logger.error(`Received two different preset values. Use either the positional preset or ${highlighter.info("--preset")}, or pass the same value to both.`),logger.break(),process.exit(1)),r??t}function Fl(e){if(!isUrl(e))return;let t=new URL(e);if(t.pathname==="/init")return t.searchParams.get("only")??void 0}function vn(e){if(!(e===void 0||e===false)){if(e===true)throw new De(["Missing value for --only.",`Use one or more of: ${$n.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
117
- `));return Al(e)}}function Al(e){let t={theme:"theme",font:"font",fonts:"font"},r=e.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean),o=r.filter(n=>!t[n]);if(!r.length||o.length)throw new De([`Invalid value for --only: ${e}.`,`Use one or more of: ${$n.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
118
- `));return Array.from(new Set(r.map(n=>t[n])))}function Ll(e){if(!(!e.only||e.preset))throw new De(["Missing preset for --only.","Use: shadcn apply <preset> --only theme,font."].join(`
119
- `))}function Dl(e){if(!e.only||e.only.includes("theme"))return e.registryBaseConfig;let t=typeof e.existingConfig.tailwind=="object"&&e.existingConfig.tailwind!==null?e.existingConfig.tailwind:{},r=typeof e.registryBaseConfig?.tailwind=="object"&&e.registryBaseConfig.tailwind!==null?e.registryBaseConfig.tailwind:{},o={...e.registryBaseConfig,tailwind:{...t,...r}};return e.existingConfig.menuColor&&(o.menuColor=e.existingConfig.menuColor),e.existingConfig.menuAccent&&(o.menuAccent=e.existingConfig.menuAccent),o}function _l(e){if(isUrl(e)||isPresetCode(e))return;let t=Object.keys(J);t.includes(e)||(logger.error(`Invalid preset: ${highlighter.info(e)}.
113
+ }`;await be__default.writeFile(r,n,"utf8");}var gl=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()}),kn=new Command().name("add").description("add a component to your project").argument("[components...]","item addresses to add").option("-y, --yes","skip confirmation prompt.",false).option("-o, --overwrite","overwrite existing files.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",false).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",false).option("--dry-run","preview changes without writing files.",false).option("--diff [path]","show diff for a file.").option("--view [path]","show file contents.").action(async(e,t)=>{try{let r=gl.parse({components:e,...t,cwd:X__default.resolve(t.cwd)});await loadEnvFiles(r.cwd);let o=r.dryRun||r.diff||r.view,n=await getConfig(r.cwd),i=!!n;n||(n=createConfig({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let s=!1;if(e.length>0){let{config:w,newRegistries:x}=await _(e,n,{silent:r.silent,writeFile:!1});n=w,s=x.length>0;}let a=await getProjectInfo(r.cwd),{base:c}=parsePresetStyle(n.style);i&&a?.tailwindVersion==="v4"&&Ft(e,c);let l,p=!0;if(e.length>0&&(i||!DEPRECATED_COMPONENTS.some(w=>w.name===e[0]))){let[w]=await getRegistryItems([e[0]],{config:n});if(l=w?.type,p=l!=="registry:theme"&&l!=="registry:style"&&l!=="registry:base",isUniversalRegistryItem(w)&&!o){await addComponents(e,n,r);return}if(!r.yes&&!o&&(l==="registry:style"||l==="registry:theme")){logger.break();let{confirm:x}=await ae({type:"confirm",name:"confirm",message:highlighter.warn(`You are about to install a new ${l.replace("registry:","")}.
114
+ Existing CSS variables and components will be overwritten. Continue?`)});x||(logger.break(),logger.log("Installation cancelled."),logger.break(),process.exit(1));}}r.components?.length||(r.components=await hl(r,n.style)),!e.length&&a?.tailwindVersion==="v4"&&Ft(r.components??[],c);let{errors:m,config:d}=await on(r),u=!1;if(m["3"]){let{proceed:w}=await ae({type:"confirm",name:"proceed",message:`You need to create a ${highlighter.info("components.json")} file to add components. Proceed?`,initial:!0});w||(logger.break(),process.exit(1));let x=Te(a?.framework.name),b=await Ne();Ft(r.components??[],b);let{url:N}=await qe({rtl:!1,base:b,template:x}),{registryBaseConfig:C,installStyleIndex:T,url:W}=await he(N,r.cwd);d=await Ae({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!s,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:T,components:[W,...r.components??[]],registryBaseConfig:C}),u=!0;}let g=!1;if(m["1"]){let w=await Ne();Ft(r.components??[],w);let{projectPath:x,template:b}=await Nt({cwd:r.cwd,force:r.overwrite,components:r.components});x||(logger.break(),process.exit(1)),r.cwd=x;let{url:N}=await qe({rtl:!1,base:w,template:b}),{registryBaseConfig:C,installStyleIndex:T,url:W}=await he(N,r.cwd);d=await Ae({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!s&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:T,components:[W,...r.components??[]],registryBaseConfig:C}),u=!0,g=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//);}if(!d)throw new Error(`Failed to read config at ${highlighter.info(r.cwd)}.`);let{config:y}=await _(r.components,d,{silent:r.silent||s,writeFile:!o});if(d=y,o){let w=spinner("Resolving items.",{silent:r.silent}).start(),x=await an(r.components,d,{overwrite:r.overwrite});w.stop(),logger.log(pn(x,r.components,{diff:r.diff,view:r.view}));return}u||await addComponents(r.components,d,r),g&&await hn(r.components[0],d);}catch(r){logger.break(),k(r);}finally{clearRegistryContext();}});async function hl(e,t){let r=await getShadcnRegistryIndex();if(!r)return logger.break(),k(new Error("Failed to fetch registry index.")),[];let{base:o}=parsePresetStyle(t);if(e.all)return r.map(s=>s.name).filter(s=>wn(s,o));if(e.components?.length)return e.components;let{components:n}=await ae({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:r.filter(s=>s.type==="registry:ui"&&wn(s.name,o)).map(s=>({title:s.name,value:s.name,selected:e.all?true:e.components?.includes(s.name)}))});n?.length||(logger.warn("No components selected. Exiting."),logger.info(""),process.exit(1));let i=z$1.array(z$1.string()).safeParse(n);return i.success?i.data:(logger.error(""),k(new Error("Something went wrong. Please try again.")),[])}function Ft(e,t){let r=DEPRECATED_COMPONENTS.filter(o=>e.includes(o.name)&&bn(o.name,t));r.length&&(logger.break(),r.forEach(o=>{logger.warn(highlighter.warn(o.message));}),logger.break(),process.exit(1));}function bn(e,t){let r=DEPRECATED_COMPONENTS.find(o=>o.name===e);return !!r&&(!r.availableIn||!t||!r.availableIn.includes(t))}function wn(e,t){if(bn(e,t))return false;let r=COMPONENTS_HIDDEN_FROM_SELECTION.find(o=>o.name===e);return !r||!t||!r.hiddenIn.includes(t)}async function Cn(e){let t={};if(!F.existsSync(e.cwd)||!F.existsSync(X__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!F.existsSync(X__default.resolve(e.cwd,"components.json"))){if(await isMonorepoRoot(e.cwd)){let r=await getMonorepoTargets(e.cwd),o=[];for(let n of r){let i=await getProjectInfo(X__default.resolve(e.cwd,n.name));i?.framework&&i.framework.name!=="manual"&&o.push(n);}o.length>0&&(formatMonorepoMessage("apply --preset <preset>",o,{cwdFlag:"-c"}),process.exit(1));}return t["3"]=true,{errors:t,config:null}}try{let r=await getConfig(e.cwd);return {errors:t,config:r}}catch{logger.break(),logger.error(`An invalid ${highlighter.info("components.json")} file was found at ${highlighter.info(e.cwd)}.
115
+ Before you can apply a preset, you must create a valid ${highlighter.info("components.json")} file by running the ${highlighter.info("init")} command.`),logger.error(`Learn more at ${highlighter.info(`${SHADCN_URL}/docs/components-json`)}.`),logger.break(),process.exit(1);}}var Tl=z$1.object({cwd:z$1.string(),positionalPreset:z$1.string().optional(),preset:z$1.string().optional(),only:z$1.union([z$1.boolean(),z$1.string()]).optional(),yes:z$1.boolean(),silent:z$1.boolean()}),$n=["theme","font"],De=class extends Error{constructor(t){super(t),this.name="ApplyOnlyError";}},Dt=class extends Error{constructor(t){super(t),this.name="ApplyWorkspaceSyncError";}},En=new Command().name("apply").description("apply a preset to an existing project").argument("[preset]","the preset to apply").option("--preset <preset>","preset configuration to apply").option("--only [parts]","apply only parts of a preset: theme, font").option("-y, --yes","skip confirmation prompt.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e,t)=>{try{let r=Tl.parse({...t,cwd:X__default.resolve(t.cwd),positionalPreset:e}),o=jl(r),n=vn(r.only);Al({preset:o,only:n});let i=await Cn(r);i.errors["1"]&&(logger.break(),logger.error(`The ${highlighter.info("apply")} command only works in an existing project.`),logger.error(`Run ${highlighter.info(Rn(o))} first.`),logger.break(),process.exit(1)),i.errors["3"]&&(logger.break(),logger.error(`No ${highlighter.info("components.json")} found at ${highlighter.info(r.cwd)}.`),logger.error(`Run ${highlighter.info(Rn(o))} first.`),logger.break(),process.exit(1));let s=i.config;s||process.exit(1);let a=s.rtl??!1,c=await _l(r.cwd);if(!o){let g=pr({command:"init",template:c,base:getBase(s.style),rtl:a});await mr({createUrl:g,followUp:`Then run ${highlighter.info("shadcn apply --preset <preset>")} with the preset code or preset URL from ui.shadcn.com.`,prompt:!r.yes}),process.exit(0);}Dl(o);let l=n??vn(Ol(o)),p=!l,f=p?await getProjectComponents(r.cwd):[];if(!r.yes){if(logger.break(),l?logger.warn(highlighter.warn("Applying the selected preset parts will update your project configuration and styles.")):logger.warn(highlighter.warn("Applying a new preset will overwrite existing UI components, fonts, and CSS variables.")),logger.warn("Commit or stash your changes before continuing so you can easily go back."),p)if(logger.break(),logger.log(" The following components will be re-installed:"),f.length)for(let y=0;y<f.length;y+=8)logger.log(` - ${f.slice(y,y+8).join(", ")}`);else logger.log(" - No installed UI components were detected.");logger.break();let{proceed:g}=await ae({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});g||(logger.break(),process.exit(1));}await loadEnvFiles(r.cwd);let m=getBase(s.style),d=Bl(o,m,{template:c,rtl:a,only:l?.join(",")}),u=await Ko(X__default.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:g,installStyleIndex:y,url:w}=await he(d,r.cwd,{registries:s.registries}),x=Ll({registryBaseConfig:g,existingConfig:s,only:l});return await Ae({cwd:r.cwd,yes:!0,force:!1,reinstall:p,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:y,registryBaseConfig:x,existingConfig:s,components:[w,...f]})});await Ml(u,{only:l}),logger.break(),logger.log("Preset applied successfully."),logger.break();}catch(r){if(r instanceof De){for(let o of r.message.split(`
116
+ `))logger.error(o);logger.break(),process.exit(1);}r instanceof je&&(logger.error(`Could not back up ${highlighter.info("components.json")}. Aborting.`),logger.break(),process.exit(1)),r instanceof Dt&&(logger.error(r.message),logger.break(),process.exit(1)),logger.break(),k(r);}finally{clearRegistryContext();}});function jl(e){let t=e.positionalPreset?.trim(),r=e.preset?.trim();return t&&r&&t!==r&&(logger.error(`Received two different preset values. Use either the positional preset or ${highlighter.info("--preset")}, or pass the same value to both.`),logger.break(),process.exit(1)),r??t}function Ol(e){if(!isUrl(e))return;let t=new URL(e);if(t.pathname==="/init")return t.searchParams.get("only")??void 0}function vn(e){if(!(e===void 0||e===false)){if(e===true)throw new De(["Missing value for --only.",`Use one or more of: ${$n.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
117
+ `));return Fl(e)}}function Fl(e){let t={theme:"theme",font:"font",fonts:"font"},r=e.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean),o=r.filter(n=>!t[n]);if(!r.length||o.length)throw new De([`Invalid value for --only: ${e}.`,`Use one or more of: ${$n.join(", ")}.`,"Example: shadcn apply <preset> --only theme,font."].join(`
118
+ `));return Array.from(new Set(r.map(n=>t[n])))}function Al(e){if(!(!e.only||e.preset))throw new De(["Missing preset for --only.","Use: shadcn apply <preset> --only theme,font."].join(`
119
+ `))}function Ll(e){if(!e.only||e.only.includes("theme"))return e.registryBaseConfig;let t=typeof e.existingConfig.tailwind=="object"&&e.existingConfig.tailwind!==null?e.existingConfig.tailwind:{},r=typeof e.registryBaseConfig?.tailwind=="object"&&e.registryBaseConfig.tailwind!==null?e.registryBaseConfig.tailwind:{},o={...e.registryBaseConfig,tailwind:{...t,...r}};return e.existingConfig.menuColor&&(o.menuColor=e.existingConfig.menuColor),e.existingConfig.menuAccent&&(o.menuAccent=e.existingConfig.menuAccent),o}function Dl(e){if(isUrl(e)||isPresetCode(e))return;let t=Object.keys(J);t.includes(e)||(logger.error(`Invalid preset: ${highlighter.info(e)}.
120
120
  Use one of the available presets: ${t.join(", ")}
121
- or build your own at ${highlighter.info(`${SHADCN_URL}/create`)}`),logger.break(),process.exit(1));}async function Ml(e){let t=await getProjectInfo(e);return Te(t?.framework.name)}async function Vl(e,t){if(t?.only&&!t.only.includes("theme"))return;let r=await Bl(e);if(!r.length)return;let o={style:e.style,tailwind:{baseColor:e.tailwind.baseColor,cssVariables:e.tailwind.cssVariables},...e.iconLibrary?{iconLibrary:e.iconLibrary}:{},...e.rtl!==void 0?{rtl:e.rtl}:{},...e.menuColor?{menuColor:e.menuColor}:{},...e.menuAccent?{menuAccent:e.menuAccent}:{}},n=[];for(let i of r){let s=X__default.resolve(i.resolvedPaths.cwd,"components.json");await F.pathExists(s)&&n.push({configPath:s,existingConfig:await F.readJson(s)});}try{for(let i of n)if(!Ze(i.configPath))throw new je(i.configPath);for(let i of n)await F.writeJson(i.configPath,{...i.existingConfig,...o,tailwind:{...i.existingConfig.tailwind,...o.tailwind}},{spaces:2});for(let i of n)Qe(i.configPath);}catch(i){for(let s of [...n].reverse())Oe(s.configPath);throw new Dt(`Failed to sync linked workspace configs.${i instanceof Error?` ${i.message}`:""}`)}}async function Bl(e){let t=await getWorkspaceConfig(e);if(!t)return [];let r=new Map;for(let o of Object.values(t))o.resolvedPaths.cwd!==e.resolvedPaths.cwd&&r.set(o.resolvedPaths.cwd,o);return Array.from(r.values()).sort((o,n)=>o.resolvedPaths.cwd.localeCompare(n.resolvedPaths.cwd))}function Ul(e,t,r={}){if(isUrl(e)){let n=new URL(e);return n.pathname==="/init"&&e.startsWith(SHADCN_URL)&&n.searchParams.set("track","1"),n.searchParams.set("base",t),n.searchParams.set("rtl",String(r.rtl??false)),r.only&&n.searchParams.set("only",r.only),n.toString()}if(isPresetCode(e)){let n=decodePreset(e);return n||(logger.error(`Invalid preset code: ${highlighter.info(e)}`),logger.break(),process.exit(1)),ne({...n,base:t,rtl:r.rtl??false},{preset:e,template:r.template,only:r.only})}let o=J[e];return ne({...o,base:t,rtl:r.rtl??o.rtl},{template:r.template,only:r.only})}function Wl(e){return /[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function Rn(e){return e?`shadcn init --preset ${Wl(e)}`:"shadcn init"}async function jn(e){let t={},r={cwd:e.cwd,registryFile:X__default.resolve(e.cwd,e.registryFile),outputDir:X__default.resolve(e.cwd,e.outputDir)};return F.existsSync(r.registryFile)||(t["13"]=true),await F.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(logger.break(),logger.error(`The path ${highlighter.info(r.registryFile)} does not exist.`)),logger.break(),process.exit(1)),{errors:t,resolvePaths:r}}var Zl=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),On=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=Zl.parse({cwd:X.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:o}=await jn(r),n=await readRegistryWithIncludes(o.registryFile,{cwd:o.cwd}),i=n.registry,s=n.usesInclude?X.dirname(o.registryFile):o.cwd,a=createRegistryCatalog(n,s,o.cwd),c=spinner("Building registry...");for(let l of i.items){c.start(`Building ${l.name}...`);let p=await createRegistryItem(l,n,s,o.cwd),f=X.resolve(o.outputDir,`${p.name}.json`);await be.mkdir(X.dirname(f),{recursive:!0}),await be.writeFile(f,JSON.stringify(p,null,2));}n.usesInclude?await be.writeFile(X.resolve(o.outputDir,"registry.json"),JSON.stringify(a,null,2)):await be.copyFile(o.registryFile,X.resolve(o.outputDir,"registry.json")),c.succeed("Building registry.");}catch(r){logger.break(),C(r);}});var bf=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),An=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=bf.parse({component:e,...t}),o=X__default.resolve(r.cwd);existsSync(o)||(logger.error(`The path ${o} does not exist. Please try again.`),process.exit(1));let n=await getConfig(o);if(!n){if(await isMonorepoRoot(o)){let c=await getMonorepoTargets(o);c.length>0&&(formatMonorepoMessage("diff [component]",c),process.exit(1));}logger.warn(`Configuration is missing. Please run ${highlighter.success("init")} to create a components.json file.`),process.exit(1);}let i=await getShadcnRegistryIndex();if(i||(C(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let c=n.resolvedPaths.components,l=i.filter(f=>{for(let m of f.files??[]){let d=X__default.resolve(c,typeof m=="string"?m:m.path);if(existsSync(d))return !0}return !1}),p=[];for(let f of l){let m=await Fn(f,n);m.length&&p.push({name:f.name,changes:m});}p.length||(logger.info("No updates found."),process.exit(0)),logger.info("The following components have updates available:");for(let f of p){logger.info(`- ${f.name}`);for(let m of f.changes)logger.info(` - ${m.filePath}`);}logger.break(),logger.info(`Run ${highlighter.success("diff <component>")} to see the changes.`),process.exit(0);}let s=i.find(c=>c.name===r.component);s||(logger.error(`The component ${highlighter.success(r.component)} does not exist.`),process.exit(1));let a=await Fn(s,n);a.length||(logger.info(`No updates found for ${r.component}.`),process.exit(0));for(let c of a)logger.info(`- ${c.filePath}`),await Cf(c.patch),logger.info("");}catch(r){C(r);}});async function Fn(e,t){let r=await qo(t.style,[e]),o=await getRegistryBaseColor(t.tailwind.baseColor),n=getSupportedFontMarkers(r);if(!r)return [];let i=[];for(let s of r){let a=await getItemTargetPath(t,s);if(a)for(let c of s.files??[]){let l=X__default.resolve(a,typeof c=="string"?c:c.path);if(!existsSync(l))continue;let p=await promises.readFile(l,"utf8");if(typeof c=="string"||!c.content)continue;let f=await transform({filename:c.path,raw:c.content,config:t,baseColor:o,supportedFontMarkers:n},[transformImport,transformRsc,transformCssVars,transformTwPrefixes,transformIcons,transformMenu,transformRtl,transformFont,transformCleanup]),m=diffLines(f,p);m.length>1&&i.push({filePath:l,patch:m});}}return i}async function Cf(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(highlighter.success(t.value)):t.removed?process.stdout.write(highlighter.error(t.value)):process.stdout.write(t.value)});}var Fr="https://ui.shadcn.com",Ln=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: base, radix, or aria. defaults to project base.").option("--json","output as JSON.",false).action(async(e,t)=>{try{let r=X__default.resolve(t.cwd),o=await getConfig(r),n=Tf(t.base,o?.style),i=await getShadcnRegistryIndex();i||(logger.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let c of e){let l=i.find(f=>f.name===c);l||(logger.error(`Component ${highlighter.info(c)} not found in the shadcn registry.`),process.exit(1));let p=l.meta?.links?.[n];if(!p||Object.keys(p).length===0){logger.warn(`No documentation links available for ${highlighter.info(c)}.`);continue}s.push({component:c,base:n,links:jf(p)});}if(t.json){console.log(JSON.stringify({base:n,results:s},null,2));return}let a=Math.max(...s.flatMap(c=>Object.keys(c.links).map(l=>l.length)));for(let{component:c,links:l}of s){logger.log(highlighter.info(c));for(let[p,f]of Object.entries(l))logger.log(` - ${p.padEnd(a+2)}${f}`);logger.break();}}catch(r){C(r);}});function Tf(e,t){let r=e??getBase(t);if(!isPresetBase(r))throw new Error(`Invalid base: ${String(r)}. Expected one of: ${PRESET_BASES.join(", ")}.`);return r}function jf(e){return Object.fromEntries(Object.entries(e).map(([t,r])=>[t,r===Fr||r.startsWith(`${Fr}/`)?`${SHADCN_URL}${r.slice(Fr.length)}`:r]))}var _n=/@import\s+["']shadcn\/tailwind\.css["'];?\s*\n?/,Uf=z$1.object({cwd:z$1.string(),yes:z$1.boolean(),silent:z$1.boolean()}),Mn=new Command().name("eject").description("inline shadcn/tailwind.css and remove the shadcn dependency").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-y, --yes","skip confirmation prompt.",false).option("-s, --silent","mute output.",false).action(async e=>{try{let t=Uf.parse({cwd:X__default.resolve(e.cwd),yes:e.yes,silent:e.silent});await Wf(t);}catch(t){C(t);}});async function Wf(e){if(!F.existsSync(X__default.resolve(e.cwd,"components.json"))){if(await isMonorepoRoot(e.cwd)){let p=await getMonorepoTargets(e.cwd);p.length>0&&(formatMonorepoMessage("eject",p),process.exit(1));}logger.break(),logger.error(`No ${highlighter.info("components.json")} found. Run ${highlighter.info("shadcn init")} first.`),logger.error(`Learn more at ${highlighter.info(`${SHADCN_URL}/docs/components-json`)}.`),logger.break(),process.exit(1);}let t=await getConfig(e.cwd);t?.resolvedPaths.tailwindCss||(logger.break(),logger.error("Could not resolve the Tailwind CSS file from components.json."),logger.break(),process.exit(1));let r=t.resolvedPaths.tailwindCss,o=X__default.relative(e.cwd,r),n=await promises.readFile(r,"utf8");_n.test(n)||(logger.break(),logger.error(`Could not find ${highlighter.info('@import "shadcn/tailwind.css"')} in ${highlighter.info(o)}.`),logger.error("Nothing to eject."),logger.break(),process.exit(1));let i=getPackageInfo(e.cwd,false),s=Jf(i),a=Hf(e.cwd),c=await promises.readFile(a,"utf8");if(e.silent||(logger.break(),logger.warn("This action is not reversible. Future shadcn CLI updates to tailwind.css will not apply automatically."),logger.break()),!e.yes){logger.log("This will:"),logger.log(` - Inline ${highlighter.info("shadcn/tailwind.css")} into ${highlighter.info(o)}`),logger.log(` - Remove the ${highlighter.info("shadcn")} dependency`),logger.break();let{proceed:p}=await ae({type:"confirm",name:"proceed",message:"Proceed?",initial:false});p||process.exit(0);}let l=spinner(`Inlining ${highlighter.info("shadcn/tailwind.css")}.`,{silent:e.silent})?.start();if(n=n.replace(_n,()=>`/* ejected from shadcn@${s} */
121
+ or build your own at ${highlighter.info(`${SHADCN_URL}/create`)}`),logger.break(),process.exit(1));}async function _l(e){let t=await getProjectInfo(e);return Te(t?.framework.name)}async function Ml(e,t){if(t?.only&&!t.only.includes("theme"))return;let r=await Vl(e);if(!r.length)return;let o={style:e.style,tailwind:{baseColor:e.tailwind.baseColor,cssVariables:e.tailwind.cssVariables},...e.iconLibrary?{iconLibrary:e.iconLibrary}:{},...e.rtl!==void 0?{rtl:e.rtl}:{},...e.menuColor?{menuColor:e.menuColor}:{},...e.menuAccent?{menuAccent:e.menuAccent}:{}},n=[];for(let i of r){let s=X__default.resolve(i.resolvedPaths.cwd,"components.json");await F.pathExists(s)&&n.push({configPath:s,existingConfig:await F.readJson(s)});}try{for(let i of n)if(!Ze(i.configPath))throw new je(i.configPath);for(let i of n)await F.writeJson(i.configPath,{...i.existingConfig,...o,tailwind:{...i.existingConfig.tailwind,...o.tailwind}},{spaces:2});for(let i of n)Qe(i.configPath);}catch(i){for(let s of [...n].reverse())Oe(s.configPath);throw new Dt(`Failed to sync linked workspace configs.${i instanceof Error?` ${i.message}`:""}`)}}async function Vl(e){let t=await getWorkspaceConfig(e);if(!t)return [];let r=new Map;for(let o of Object.values(t))o.resolvedPaths.cwd!==e.resolvedPaths.cwd&&r.set(o.resolvedPaths.cwd,o);return Array.from(r.values()).sort((o,n)=>o.resolvedPaths.cwd.localeCompare(n.resolvedPaths.cwd))}function Bl(e,t,r={}){if(isUrl(e)){let n=new URL(e);return n.pathname==="/init"&&e.startsWith(SHADCN_URL)&&n.searchParams.set("track","1"),n.searchParams.set("base",t),n.searchParams.set("rtl",String(r.rtl??false)),r.only&&n.searchParams.set("only",r.only),n.toString()}if(isPresetCode(e)){let n=decodePreset(e);return n||(logger.error(`Invalid preset code: ${highlighter.info(e)}`),logger.break(),process.exit(1)),ne({...n,base:t,rtl:r.rtl??false},{preset:e,template:r.template,only:r.only})}let o=J[e];return ne({...o,base:t,rtl:r.rtl??o.rtl},{template:r.template,only:r.only})}function Ul(e){return /[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function Rn(e){return e?`shadcn init --preset ${Ul(e)}`:"shadcn init"}async function jn(e){let t={},r={cwd:e.cwd,registryFile:X__default.resolve(e.cwd,e.registryFile),outputDir:X__default.resolve(e.cwd,e.outputDir)};return F.existsSync(r.registryFile)||(t["13"]=true),await F.mkdir(r.outputDir,{recursive:true}),Object.keys(t).length>0&&(t["13"]&&(logger.break(),logger.error(`The path ${highlighter.info(r.registryFile)} does not exist.`)),logger.break(),process.exit(1)),{errors:t,resolvePaths:r}}var Xl=z$1.object({cwd:z$1.string(),registryFile:z$1.string(),outputDir:z$1.string()}),On=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=Xl.parse({cwd:X.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:o}=await jn(r),n=await readRegistryWithIncludes(o.registryFile,{cwd:o.cwd}),i=n.registry,s=n.usesInclude?X.dirname(o.registryFile):o.cwd,a=createRegistryCatalog(n,s,o.cwd),c=spinner("Building registry...");for(let l of i.items){c.start(`Building ${l.name}...`);let p=await createRegistryItem(l,n,s,o.cwd),f=X.resolve(o.outputDir,`${p.name}.json`);await be.mkdir(X.dirname(f),{recursive:!0}),await be.writeFile(f,JSON.stringify(p,null,2));}n.usesInclude?await be.writeFile(X.resolve(o.outputDir,"registry.json"),JSON.stringify(a,null,2)):await be.copyFile(o.registryFile,X.resolve(o.outputDir,"registry.json")),c.succeed("Building registry.");}catch(r){logger.break(),k(r);}});var kf=z$1.object({component:z$1.string().optional(),yes:z$1.boolean(),cwd:z$1.string(),path:z$1.string().optional()}),An=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=kf.parse({component:e,...t}),o=X__default.resolve(r.cwd);existsSync(o)||(logger.error(`The path ${o} does not exist. Please try again.`),process.exit(1));let n=await getConfig(o);if(!n){if(await isMonorepoRoot(o)){let c=await getMonorepoTargets(o);c.length>0&&(formatMonorepoMessage("diff [component]",c),process.exit(1));}logger.warn(`Configuration is missing. Please run ${highlighter.success("init")} to create a components.json file.`),process.exit(1);}let i=await getShadcnRegistryIndex();if(i||(k(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let c=n.resolvedPaths.components,l=i.filter(f=>{for(let m of f.files??[]){let d=X__default.resolve(c,typeof m=="string"?m:m.path);if(existsSync(d))return !0}return !1}),p=[];for(let f of l){let m=await Fn(f,n);m.length&&p.push({name:f.name,changes:m});}p.length||(logger.info("No updates found."),process.exit(0)),logger.info("The following components have updates available:");for(let f of p){logger.info(`- ${f.name}`);for(let m of f.changes)logger.info(` - ${m.filePath}`);}logger.break(),logger.info(`Run ${highlighter.success("diff <component>")} to see the changes.`),process.exit(0);}let s=i.find(c=>c.name===r.component);s||(logger.error(`The component ${highlighter.success(r.component)} does not exist.`),process.exit(1));let a=await Fn(s,n);a.length||(logger.info(`No updates found for ${r.component}.`),process.exit(0));for(let c of a)logger.info(`- ${c.filePath}`),await bf(c.patch),logger.info("");}catch(r){k(r);}});async function Fn(e,t){let r=await qo(t.style,[e]),o=await getRegistryBaseColor(t.tailwind.baseColor),n=getSupportedFontMarkers(r);if(!r)return [];let i=[];for(let s of r){let a=await getItemTargetPath(t,s);if(a)for(let c of s.files??[]){let l=X__default.resolve(a,typeof c=="string"?c:c.path);if(!existsSync(l))continue;let p=await promises.readFile(l,"utf8");if(typeof c=="string"||!c.content)continue;let f=await transform({filename:c.path,raw:c.content,config:t,baseColor:o,supportedFontMarkers:n},[transformImport,transformRsc,transformCssVars,transformTwPrefixes,transformIcons,transformMenu,transformRtl,transformFont,transformCleanup]),m=diffLines(f,p);m.length>1&&i.push({filePath:l,patch:m});}}return i}async function bf(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(highlighter.success(t.value)):t.removed?process.stdout.write(highlighter.error(t.value)):process.stdout.write(t.value)});}var Fr="https://ui.shadcn.com",Ln=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: base, radix, or aria. defaults to project base.").option("--json","output as JSON.",false).action(async(e,t)=>{try{let r=X__default.resolve(t.cwd),o=await getConfig(r),n=Nf(t.base,o?.style),i=await getShadcnRegistryIndex();i||(logger.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let c of e){let l=i.find(f=>f.name===c);l||(logger.error(`Component ${highlighter.info(c)} not found in the shadcn registry.`),process.exit(1));let p=l.meta?.links?.[n];if(!p||Object.keys(p).length===0){logger.warn(`No documentation links available for ${highlighter.info(c)}.`);continue}s.push({component:c,base:n,links:Tf(p)});}if(t.json){console.log(JSON.stringify({base:n,results:s},null,2));return}let a=Math.max(...s.flatMap(c=>Object.keys(c.links).map(l=>l.length)));for(let{component:c,links:l}of s){logger.log(highlighter.info(c));for(let[p,f]of Object.entries(l))logger.log(` - ${p.padEnd(a+2)}${f}`);logger.break();}}catch(r){k(r);}});function Nf(e,t){let r=e??getBase(t);if(!isPresetBase(r))throw new Error(`Invalid base: ${String(r)}. Expected one of: ${PRESET_BASES.join(", ")}.`);return r}function Tf(e){return Object.fromEntries(Object.entries(e).map(([t,r])=>[t,r===Fr||r.startsWith(`${Fr}/`)?`${SHADCN_URL}${r.slice(Fr.length)}`:r]))}var _n=/@import\s+["']shadcn\/tailwind\.css["'];?\s*\n?/,Bf=z$1.object({cwd:z$1.string(),yes:z$1.boolean(),silent:z$1.boolean()}),Mn=new Command().name("eject").description("inline shadcn/tailwind.css and remove the shadcn dependency").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-y, --yes","skip confirmation prompt.",false).option("-s, --silent","mute output.",false).action(async e=>{try{let t=Bf.parse({cwd:X__default.resolve(e.cwd),yes:e.yes,silent:e.silent});await Uf(t);}catch(t){k(t);}});async function Uf(e){if(!F.existsSync(X__default.resolve(e.cwd,"components.json"))){if(await isMonorepoRoot(e.cwd)){let p=await getMonorepoTargets(e.cwd);p.length>0&&(formatMonorepoMessage("eject",p),process.exit(1));}logger.break(),logger.error(`No ${highlighter.info("components.json")} found. Run ${highlighter.info("shadcn init")} first.`),logger.error(`Learn more at ${highlighter.info(`${SHADCN_URL}/docs/components-json`)}.`),logger.break(),process.exit(1);}let t=await getConfig(e.cwd);t?.resolvedPaths.tailwindCss||(logger.break(),logger.error("Could not resolve the Tailwind CSS file from components.json."),logger.break(),process.exit(1));let r=t.resolvedPaths.tailwindCss,o=X__default.relative(e.cwd,r),n=await promises.readFile(r,"utf8");_n.test(n)||(logger.break(),logger.error(`Could not find ${highlighter.info('@import "shadcn/tailwind.css"')} in ${highlighter.info(o)}.`),logger.error("Nothing to eject."),logger.break(),process.exit(1));let i=getPackageInfo(e.cwd,false),s=Wf(i),a=zf(e.cwd),c=await promises.readFile(a,"utf8");if(e.silent||(logger.break(),logger.warn("This action is not reversible. Future shadcn CLI updates to tailwind.css will not apply automatically."),logger.break()),!e.yes){logger.log("This will:"),logger.log(` - Inline ${highlighter.info("shadcn/tailwind.css")} into ${highlighter.info(o)}`),logger.log(` - Remove the ${highlighter.info("shadcn")} dependency`),logger.break();let{proceed:p}=await ae({type:"confirm",name:"proceed",message:"Proceed?",initial:false});p||process.exit(0);}let l=spinner(`Inlining ${highlighter.info("shadcn/tailwind.css")}.`,{silent:e.silent})?.start();if(n=n.replace(_n,()=>`/* ejected from shadcn@${s} */
122
122
  ${c.trim()}
123
123
 
124
- `),await promises.writeFile(r,n,"utf8"),l?.succeed(),zf(i)){let p=spinner(`Removing ${highlighter.info("shadcn")}.`,{silent:e.silent})?.start();await Gf(e.cwd),p?.succeed();}else e.silent||logger.warn(`The ${highlighter.info("shadcn")} package was not found in package.json. Skipped removal.`);logger.break(),logger.log(`Ejected ${highlighter.info("shadcn/tailwind.css")} into ${highlighter.info(o)}.`),logger.break();}function Jf(e){return e?(e.dependencies?.shadcn??e.devDependencies?.shadcn??"unknown").replace(/^[\^~]/,"").trim():"unknown"}function zf(e){return e?!!(e.dependencies?.shadcn||e.devDependencies?.shadcn):false}function Hf(e){let t=X__default.join(e,"node_modules/shadcn/dist/tailwind.css");if(F.existsSync(t))return t;let r=process.argv[1]?X__default.dirname(X__default.resolve(process.argv[1])):e;for(let o of [X__default.join(r,"tailwind.css"),X__default.join(r,"dist","tailwind.css"),X__default.join(r,"src","tailwind.css"),X__default.join(process.cwd(),"src/tailwind.css"),X__default.join(process.cwd(),"dist/tailwind.css")])if(F.existsSync(o))return o;throw new Error("Could not resolve shadcn/tailwind.css.")}async function Gf(e){switch(await getPackageManager(e)){case "npm":await execa("npm",["uninstall","shadcn"],{cwd:e});break;case "pnpm":await execa("pnpm",["remove","shadcn"],{cwd:e});break;case "yarn":await execa("yarn",["remove","shadcn"],{cwd:e});break;case "bun":await execa("bun",["remove","shadcn"],{cwd:e});break;case "deno":{let r=X__default.join(e,"package.json"),o=await F.readJson(r);for(let n of ["dependencies","devDependencies"])o[n]?.shadcn&&delete o[n].shadcn;await F.writeJson(r,o,{spaces:2});break}}}var Kf=["50","100","200","300","400","500","600","700","800","900","950"],Yf=["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"],qf={red:{50:"oklch(97.1% 0.013 17.38)",100:"oklch(93.6% 0.032 17.717)",200:"oklch(88.5% 0.062 18.334)",300:"oklch(80.8% 0.114 19.571)",400:"oklch(70.4% 0.191 22.216)",500:"oklch(63.7% 0.237 25.331)",600:"oklch(57.7% 0.245 27.325)",700:"oklch(50.5% 0.213 27.518)",800:"oklch(44.4% 0.177 26.899)",900:"oklch(39.6% 0.141 25.723)",950:"oklch(25.8% 0.092 26.042)"},orange:{50:"oklch(98% 0.016 73.684)",100:"oklch(95.4% 0.038 75.164)",200:"oklch(90.1% 0.076 70.697)",300:"oklch(83.7% 0.128 66.29)",400:"oklch(75% 0.183 55.934)",500:"oklch(70.5% 0.213 47.604)",600:"oklch(64.6% 0.222 41.116)",700:"oklch(55.3% 0.195 38.402)",800:"oklch(47% 0.157 37.304)",900:"oklch(40.8% 0.123 38.172)",950:"oklch(26.6% 0.079 36.259)"},amber:{50:"oklch(98.7% 0.022 95.277)",100:"oklch(96.2% 0.059 95.617)",200:"oklch(92.4% 0.12 95.746)",300:"oklch(87.9% 0.169 91.605)",400:"oklch(82.8% 0.189 84.429)",500:"oklch(76.9% 0.188 70.08)",600:"oklch(66.6% 0.179 58.318)",700:"oklch(55.5% 0.163 48.998)",800:"oklch(47.3% 0.137 46.201)",900:"oklch(41.4% 0.112 45.904)",950:"oklch(27.9% 0.077 45.635)"},yellow:{50:"oklch(98.7% 0.026 102.212)",100:"oklch(97.3% 0.071 103.193)",200:"oklch(94.5% 0.129 101.54)",300:"oklch(90.5% 0.182 98.111)",400:"oklch(85.2% 0.199 91.936)",500:"oklch(79.5% 0.184 86.047)",600:"oklch(68.1% 0.162 75.834)",700:"oklch(55.4% 0.135 66.442)",800:"oklch(47.6% 0.114 61.907)",900:"oklch(42.1% 0.095 57.708)",950:"oklch(28.6% 0.066 53.813)"},lime:{50:"oklch(98.6% 0.031 120.757)",100:"oklch(96.7% 0.067 122.328)",200:"oklch(93.8% 0.127 124.321)",300:"oklch(89.7% 0.196 126.665)",400:"oklch(84.1% 0.238 128.85)",500:"oklch(76.8% 0.233 130.85)",600:"oklch(64.8% 0.2 131.684)",700:"oklch(53.2% 0.157 131.589)",800:"oklch(45.3% 0.124 130.933)",900:"oklch(40.5% 0.101 131.063)",950:"oklch(27.4% 0.072 132.109)"},green:{50:"oklch(98.2% 0.018 155.826)",100:"oklch(96.2% 0.044 156.743)",200:"oklch(92.5% 0.084 155.995)",300:"oklch(87.1% 0.15 154.449)",400:"oklch(79.2% 0.209 151.711)",500:"oklch(72.3% 0.219 149.579)",600:"oklch(62.7% 0.194 149.214)",700:"oklch(52.7% 0.154 150.069)",800:"oklch(44.8% 0.119 151.328)",900:"oklch(39.3% 0.095 152.535)",950:"oklch(26.6% 0.065 152.934)"},emerald:{50:"oklch(97.9% 0.021 166.113)",100:"oklch(95% 0.052 163.051)",200:"oklch(90.5% 0.093 164.15)",300:"oklch(84.5% 0.143 164.978)",400:"oklch(76.5% 0.177 163.223)",500:"oklch(69.6% 0.17 162.48)",600:"oklch(59.6% 0.145 163.225)",700:"oklch(50.8% 0.118 165.612)",800:"oklch(43.2% 0.095 166.913)",900:"oklch(37.8% 0.077 168.94)",950:"oklch(26.2% 0.051 172.552)"},teal:{50:"oklch(98.4% 0.014 180.72)",100:"oklch(95.3% 0.051 180.801)",200:"oklch(91% 0.096 180.426)",300:"oklch(85.5% 0.138 181.071)",400:"oklch(77.7% 0.152 181.912)",500:"oklch(70.4% 0.14 182.503)",600:"oklch(60% 0.118 184.704)",700:"oklch(51.1% 0.096 186.391)",800:"oklch(43.7% 0.078 188.216)",900:"oklch(38.6% 0.063 188.416)",950:"oklch(27.7% 0.046 192.524)"},cyan:{50:"oklch(98.4% 0.019 200.873)",100:"oklch(95.6% 0.045 203.388)",200:"oklch(91.7% 0.08 205.041)",300:"oklch(86.5% 0.127 207.078)",400:"oklch(78.9% 0.154 211.53)",500:"oklch(71.5% 0.143 215.221)",600:"oklch(60.9% 0.126 221.723)",700:"oklch(52% 0.105 223.128)",800:"oklch(45% 0.085 224.283)",900:"oklch(39.8% 0.07 227.392)",950:"oklch(30.2% 0.056 229.695)"},sky:{50:"oklch(97.7% 0.013 236.62)",100:"oklch(95.1% 0.026 236.824)",200:"oklch(90.1% 0.058 230.902)",300:"oklch(82.8% 0.111 230.318)",400:"oklch(74.6% 0.16 232.661)",500:"oklch(68.5% 0.169 237.323)",600:"oklch(58.8% 0.158 241.966)",700:"oklch(50% 0.134 242.749)",800:"oklch(44.3% 0.11 240.79)",900:"oklch(39.1% 0.09 240.876)",950:"oklch(29.3% 0.066 243.157)"},blue:{50:"oklch(97% 0.014 254.604)",100:"oklch(93.2% 0.032 255.585)",200:"oklch(88.2% 0.059 254.128)",300:"oklch(80.9% 0.105 251.813)",400:"oklch(70.7% 0.165 254.624)",500:"oklch(62.3% 0.214 259.815)",600:"oklch(54.6% 0.245 262.881)",700:"oklch(48.8% 0.243 264.376)",800:"oklch(42.4% 0.199 265.638)",900:"oklch(37.9% 0.146 265.522)",950:"oklch(28.2% 0.091 267.935)"},indigo:{50:"oklch(96.2% 0.018 272.314)",100:"oklch(93% 0.034 272.788)",200:"oklch(87% 0.065 274.039)",300:"oklch(78.5% 0.115 274.713)",400:"oklch(67.3% 0.182 276.935)",500:"oklch(58.5% 0.233 277.117)",600:"oklch(51.1% 0.262 276.966)",700:"oklch(45.7% 0.24 277.023)",800:"oklch(39.8% 0.195 277.366)",900:"oklch(35.9% 0.144 278.697)",950:"oklch(25.7% 0.09 281.288)"},violet:{50:"oklch(96.9% 0.016 293.756)",100:"oklch(94.3% 0.029 294.588)",200:"oklch(89.4% 0.057 293.283)",300:"oklch(81.1% 0.111 293.571)",400:"oklch(70.2% 0.183 293.541)",500:"oklch(60.6% 0.25 292.717)",600:"oklch(54.1% 0.281 293.009)",700:"oklch(49.1% 0.27 292.581)",800:"oklch(43.2% 0.232 292.759)",900:"oklch(38% 0.189 293.745)",950:"oklch(28.3% 0.141 291.089)"},purple:{50:"oklch(97.7% 0.014 308.299)",100:"oklch(94.6% 0.033 307.174)",200:"oklch(90.2% 0.063 306.703)",300:"oklch(82.7% 0.119 306.383)",400:"oklch(71.4% 0.203 305.504)",500:"oklch(62.7% 0.265 303.9)",600:"oklch(55.8% 0.288 302.321)",700:"oklch(49.6% 0.265 301.924)",800:"oklch(43.8% 0.218 303.724)",900:"oklch(38.1% 0.176 304.987)",950:"oklch(29.1% 0.149 302.717)"},fuchsia:{50:"oklch(97.7% 0.017 320.058)",100:"oklch(95.2% 0.037 318.852)",200:"oklch(90.3% 0.076 319.62)",300:"oklch(83.3% 0.145 321.434)",400:"oklch(74% 0.238 322.16)",500:"oklch(66.7% 0.295 322.15)",600:"oklch(59.1% 0.293 322.896)",700:"oklch(51.8% 0.253 323.949)",800:"oklch(45.2% 0.211 324.591)",900:"oklch(40.1% 0.17 325.612)",950:"oklch(29.3% 0.136 325.661)"},pink:{50:"oklch(97.1% 0.014 343.198)",100:"oklch(94.8% 0.028 342.258)",200:"oklch(89.9% 0.061 343.231)",300:"oklch(82.3% 0.12 346.018)",400:"oklch(71.8% 0.202 349.761)",500:"oklch(65.6% 0.241 354.308)",600:"oklch(59.2% 0.249 0.584)",700:"oklch(52.5% 0.223 3.958)",800:"oklch(45.9% 0.187 3.815)",900:"oklch(40.8% 0.153 2.432)",950:"oklch(28.4% 0.109 3.907)"},rose:{50:"oklch(96.9% 0.015 12.422)",100:"oklch(94.1% 0.03 12.58)",200:"oklch(89.2% 0.058 10.001)",300:"oklch(81% 0.117 11.638)",400:"oklch(71.2% 0.194 13.428)",500:"oklch(64.5% 0.246 16.439)",600:"oklch(58.6% 0.253 17.585)",700:"oklch(51.4% 0.222 16.935)",800:"oklch(45.5% 0.188 13.697)",900:"oklch(41% 0.159 10.272)",950:"oklch(27.1% 0.105 12.094)"},slate:{50:"oklch(98.4% 0.003 247.858)",100:"oklch(96.8% 0.007 247.896)",200:"oklch(92.9% 0.013 255.508)",300:"oklch(86.9% 0.022 252.894)",400:"oklch(70.4% 0.04 256.788)",500:"oklch(55.4% 0.046 257.417)",600:"oklch(44.6% 0.043 257.281)",700:"oklch(37.2% 0.044 257.287)",800:"oklch(27.9% 0.041 260.031)",900:"oklch(20.8% 0.042 265.755)",950:"oklch(12.9% 0.042 264.695)"},gray:{50:"oklch(98.5% 0.002 247.839)",100:"oklch(96.7% 0.003 264.542)",200:"oklch(92.8% 0.006 264.531)",300:"oklch(87.2% 0.01 258.338)",400:"oklch(70.7% 0.022 261.325)",500:"oklch(55.1% 0.027 264.364)",600:"oklch(44.6% 0.03 256.802)",700:"oklch(37.3% 0.034 259.733)",800:"oklch(27.8% 0.033 256.848)",900:"oklch(21% 0.034 264.665)",950:"oklch(13% 0.028 261.692)"},zinc:{50:"oklch(98.5% 0 0)",100:"oklch(96.7% 0.001 286.375)",200:"oklch(92% 0.004 286.32)",300:"oklch(87.1% 0.006 286.286)",400:"oklch(70.5% 0.015 286.067)",500:"oklch(55.2% 0.016 285.938)",600:"oklch(44.2% 0.017 285.786)",700:"oklch(37% 0.013 285.805)",800:"oklch(27.4% 0.006 286.033)",900:"oklch(21% 0.006 285.885)",950:"oklch(14.1% 0.005 285.823)"},neutral:{50:"oklch(98.5% 0 0)",100:"oklch(97% 0 0)",200:"oklch(92.2% 0 0)",300:"oklch(87% 0 0)",400:"oklch(70.8% 0 0)",500:"oklch(55.6% 0 0)",600:"oklch(43.9% 0 0)",700:"oklch(37.1% 0 0)",800:"oklch(26.9% 0 0)",900:"oklch(20.5% 0 0)",950:"oklch(14.5% 0 0)"},stone:{50:"oklch(98.5% 0.001 106.423)",100:"oklch(97% 0.001 106.424)",200:"oklch(92.3% 0.003 48.717)",300:"oklch(86.9% 0.005 56.366)",400:"oklch(70.9% 0.01 56.259)",500:"oklch(55.3% 0.013 58.071)",600:"oklch(44.4% 0.011 73.639)",700:"oklch(37.4% 0.01 67.558)",800:"oklch(26.8% 0.007 34.298)",900:"oklch(21.6% 0.006 56.043)",950:"oklch(14.7% 0.004 49.25)"},mauve:{50:"oklch(98.5% 0 0)",100:"oklch(96% 0.003 325.6)",200:"oklch(92.2% 0.005 325.62)",300:"oklch(86.5% 0.012 325.68)",400:"oklch(71.1% 0.019 323.02)",500:"oklch(54.2% 0.034 322.5)",600:"oklch(43.5% 0.029 321.78)",700:"oklch(36.4% 0.029 323.89)",800:"oklch(26.3% 0.024 320.12)",900:"oklch(21.2% 0.019 322.12)",950:"oklch(14.5% 0.008 326)"},olive:{50:"oklch(98.8% 0.003 106.5)",100:"oklch(96.6% 0.005 106.5)",200:"oklch(93% 0.007 106.5)",300:"oklch(88% 0.011 106.6)",400:"oklch(73.7% 0.021 106.9)",500:"oklch(58% 0.031 107.3)",600:"oklch(46.6% 0.025 107.3)",700:"oklch(39.4% 0.023 107.4)",800:"oklch(28.6% 0.016 107.4)",900:"oklch(22.8% 0.013 107.4)",950:"oklch(15.3% 0.006 107.1)"},mist:{50:"oklch(98.7% 0.002 197.1)",100:"oklch(96.3% 0.002 197.1)",200:"oklch(92.5% 0.005 214.3)",300:"oklch(87.2% 0.007 219.6)",400:"oklch(72.3% 0.014 214.4)",500:"oklch(56% 0.021 213.5)",600:"oklch(45% 0.017 213.2)",700:"oklch(37.8% 0.015 216)",800:"oklch(27.5% 0.011 216.9)",900:"oklch(21.8% 0.008 223.9)",950:"oklch(14.8% 0.004 228.8)"},taupe:{50:"oklch(98.6% 0.002 67.8)",100:"oklch(96% 0.002 17.2)",200:"oklch(92.2% 0.005 34.3)",300:"oklch(86.8% 0.007 39.5)",400:"oklch(71.4% 0.014 41.2)",500:"oklch(54.7% 0.021 43.1)",600:"oklch(43.8% 0.017 39.3)",700:"oklch(36.7% 0.016 35.7)",800:"oklch(26.8% 0.011 36.5)",900:"oklch(21.4% 0.009 43.1)",950:"oklch(14.7% 0.004 49.3)"}},Xf={"220.9 39.3% 11%":"gray","210 20% 98%":"gray","12 76% 61%":"gray","220 70% 50%":"gray"},Bn=new Map;for(let e of Yf)for(let t of Kf)Bn.set(Wn(qf[e][t]),e);function Un(e){let t=Wn(e);return t?Bn.get(t)??Xf[t]??null:null}function Wn(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*/),n=o.split(/\s+/);if(n.length<3)return t;let i=Lr(n[0],{percentage:true}),s=Lr(n[1]),a=Lr(n[2]);return `oklch(${i} ${s} ${a})`}function Lr(e,t={}){return t.percentage&&e.endsWith("%")?Vn(Number.parseFloat(e)/100):Vn(Number.parseFloat(e))}function Vn(e){return Number.isNaN(e)?"":Number(e.toFixed(12)).toString()}var dp=new Set(PRESET_BASE_COLORS),up=new Set(PRESET_ICON_LIBRARIES),gp=new Set(PRESET_MENU_ACCENTS),hp=new Set(PRESET_MENU_COLORS),yp=new Set(PRESET_FONTS),wp=new Set(PRESET_FONT_HEADINGS),xp=new Set(PRESET_THEMES),kp=new Set(["eb-garamond","instrument-serif","lora","merriweather","playfair-display","noto-serif","roboto-slab"]),bp=new Set(["jetbrains-mono","geist-mono"]),pt=["--font-sans","--font-serif","--font-mono"],Kn=new Set(pt),Cp=[...pt,"--font-heading"],Yn=new Set(Cp),Jn={appliedBodyVariable:null,variables:{}},Sp={0:"none","0rem":"none","0.45rem":"small","0.625rem":"default","0.875rem":"large"};async function Wt(e,t){let r=Rp(e.style);if(!r)return {code:null,fallbacks:[],values:null};let o=J[r],n=await vp(e.resolvedPaths.tailwindCss),i=Bt(dp,e.tailwind.baseColor),s=$p(n),a=Ep(n),c=Bt(up,e.iconLibrary),l=zn(n,Jn),p=l??o.font,f=Hn(n,p,Jn);if(!l||!f){let x=t;if(t===void 0)try{x=await getProjectInfo(e.resolvedPaths.cwd,{configCssFile:e.tailwind.css});}catch{x=null;}let k=await Fp(e,x);l??=zn(n,k),p=l??o.font,f??=Hn(n,p,k);}let m=Tp(f??o.fontHeading,p,o.fontHeading),d=Np(n.rootVars["--radius"]),u=Bt(gp,e.menuAccent),g=Bt(hp,e.menuColor),y={style:r,baseColor:i??o.baseColor,theme:s??o.theme,chartColor:a??o.chartColor,iconLibrary:c??o.iconLibrary,font:p,fontHeading:m,radius:d??o.radius,menuAccent:u??o.menuAccent,menuColor:g??o.menuColor},w=[!i&&"baseColor",!s&&"theme",!a&&"chartColor",!c&&"iconLibrary",!l&&"font",!f&&"fontHeading",!d&&"radius",!u&&"menuAccent",!g&&"menuColor"].filter(Boolean);return {code:encodePreset(y),fallbacks:w,values:y}}async function vp(e){let t={darkVars:{},imports:[],rootVars:{},themeVars:{}};if(!e)return t;try{let r=await promises.readFile(e,"utf8");return Pp(r)}catch{return t}}function Rp(e){let t=parsePresetStyle(e).style;return !t||!(t in J)?null:t}function Pp(e){let t=fp.parse(e),r={darkVars:{},imports:[],rootVars:{},themeVars:{}};return t.walkAtRules("import",o=>{let n=Ip(o.params);n&&r.imports.push(n);}),t.walkRules(o=>{let n=o.selector.split(",").map(i=>i.trim()).filter(Boolean);n.includes(":root")&&Dr(o,r.rootVars),n.includes(".dark")&&Dr(o,r.darkVars);}),t.walkAtRules("theme",o=>{o.params.trim()==="inline"&&Dr(o,r.themeVars);}),r}function Dr(e,t){for(let r of e.nodes??[])r.type!=="decl"||!r.prop.startsWith("--")||(t[r.prop]=r.value.trim());}function Ip(e){let t=e.trim();return (t.match(/^url\((['"]?)(.+?)\1\)$/)??t.match(/^(['"])(.+?)\1$/))?.[2]??null}function $p(e){let t=Ut(e.rootVars["--primary"]);if(!t)return null;let r=e.darkVars["--primary"];return r?Ut(r)===t?t:null:t}function Ep(e){let t=Ut(e.rootVars["--chart-1"]);if(!t)return null;let r=e.darkVars["--chart-1"];return r?Ut(r)===t?t:null:t}function Ut(e){let t=Un(e);return !t||!xp.has(t)?null:t}function Np(e){if(!e)return null;let t=Jt(e);return Sp[t]??null}function zn(e,t){for(let r of pt){let o=Xn(e,r);if(o)return o}for(let r of pt){let o=jp(e.imports,r);if(o)return o}return Op(t)}function Hn(e,t,r){let o=_r(e,"--font-heading"),n=o?Qn(o):null;if(n)return n===t?"inherit":n;let i=r.variables["--font-heading"],s=qn(e,"--font-heading");if(!s)return i&&i!==t?i:null;let a=Mr(s);if(a&&Kn.has(a)){let c=Xn(e,a),l=r.variables[a],p=c??l??null;return !p||p===t?"inherit":p}return a==="--font-heading"?i?i===t?"inherit":i:null:i&&i!==t?i:null}function Tp(e,t,r){let o=e===t?"inherit":e;return wp.has(o)?o:r}function _r(e,t,r=new Set){if(r.has(t))return null;r.add(t);let o=qn(e,t);if(!o)return null;let n=Mr(o);return n?Yn.has(n)?_r(e,n,r):null:o}function qn(e,t){let r=e.themeVars[t];return r&&Mr(r)!==t?r:e.rootVars[t]??r??null}function Mr(e){return Jt(e).match(/^var\((--[a-z0-9-]+)\)$/)?.[1]??null}function Xn(e,t){let r=_r(e,t),o=r?Qn(r):null;return o||null}function jp(e,t){let r=e.flatMap(o=>{let n=Up(o);return n&&Jp(n)===t?[n]:[]});return r.length===1?r[0]:null}function Op(e){if(e.appliedBodyVariable&&e.variables[e.appliedBodyVariable])return e.variables[e.appliedBodyVariable]??null;let t=pt.map(r=>e.variables[r]).filter(Boolean).filter((r,o,n)=>n.indexOf(r)===o);return t.length===1?t[0]:null}async function Fp(e,t){let r={appliedBodyVariable:null,variables:{}};if(!t||t.framework.name!=="next-app"&&t.framework.name!=="next-pages")return r;let o=Ap(e,t);if(!o)return r;try{let n=await promises.readFile(o,"utf8");return Lp(n,t.framework.name)}catch{return r}}function Ap(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 n of o){let i=X__default.join(e.resolvedPaths.cwd,n);if(existsSync(i))return i}return null}function Lp(e,t){let o=new Project({compilerOptions:{}}).createSourceFile("font-source.tsx",e,{overwrite:true,scriptKind:ScriptKind.TSX}),n=new Map;for(let a of o.getImportDeclarations())if(a.getModuleSpecifierValue()==="next/font/google")for(let c of a.getNamedImports()){let l=c.getName(),p=c.getAliasNode()?.getText()??l,f=Wp(l);f&&n.set(p,f);}let i={},s=new Map;for(let a of o.getVariableStatements())for(let c of a.getDeclarations()){let l=c.getInitializer();if(!l?.isKind(SyntaxKind.CallExpression))continue;let p=n.get(l.getExpression().getText());if(!p)continue;let f=Dp(l);f&&(s.set(c.getName(),f),i[f]=p);}return {appliedBodyVariable:_p(o,s,t),variables:i}}function Dp(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 n=Zn(o.getText());return Yn.has(n)?n:null}function _p(e,t,r){let o=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement).filter(i=>r==="next-app"?i.getTagNameNode().getText()==="html":true),n=new Set;for(let i of o){let s=i.getAttribute("className");if(!s||!Node.isJsxAttribute(s))continue;let a=s.getInitializer();if(!a)continue;let c=Mp(a,t),l=Vp(a);if(l&&c.includes(l))return l;c.length===1&&n.add(c[0]);}return n.size===1?Array.from(n)[0]:null}function Mp(e,t){let r=Node.isJsxExpression(e)?[e.getExpression(),...e.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression)].filter(Boolean):[],o=new Set;for(let n of r){if(!n||!Node.isPropertyAccessExpression(n)||n.getName()!=="variable")continue;let i=n.getExpression().getText(),s=t.get(i);s&&Kn.has(s)&&o.add(s);}return Array.from(o)}function Vp(e){let t=Bp(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 Bp(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 Zn(e){return e.replace(/^['"]|['"]$/g,"")}function Qn(e){if(!e)return null;let t=Zn(e.split(",")[0]?.trim()??"").replace(/\s+variable$/i,"").trim();return t?Vr(t.replace(/\s+/g,"-")):null}function Up(e){if(!e)return null;let t=Jt(e),r="@fontsource-variable/";return t.startsWith(r)?Vr(t.slice(r.length)):null}function Wp(e){return e?Vr(e.replace(/_/g,"-")):null}function Vr(e){let t=Jt(e);return yp.has(t)?t:null}function Jp(e){return bp.has(e)?"--font-mono":kp.has(e)?"--font-serif":"--font-sans"}function Jt(e){return e?e.trim().replace(/\s+/g," ").replace(/\s*,\s*/g,", ").replace(/"/g,"'").toLowerCase():""}function Bt(e,t){return t&&e.has(t)?t:null}var ti=`${SHADCN_URL}/code/apps/v4/registry/bases`,ri=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=X__default.resolve(e.cwd);if(!existsSync(X__default.resolve(t,"components.json"))&&await isMonorepoRoot(t)){let a=await getMonorepoTargets(t);a.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:a.map(c=>c.name)},null,2)):formatMonorepoMessage("info",a),process.exit(1));}let r=await getProjectInfo(t),o=await getConfig(t),n=await getProjectComponents(t),i=getBase(o?.style),s=await tm(r,o,n,i);if(e.json){console.log(JSON.stringify(s,null,2));return}rm(s);}catch(t){C(t);}});function em(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 tm(e,t,r,o){let n=t?await Wt(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:em(t.registries)}:null,preset:n,components:r,links:{docs:`${SHADCN_URL}/docs`,components:`${SHADCN_URL}/docs/components/${o}/[component].md`,ui:`${ti}/${o}/ui/[component].tsx`,examples:`${ti}/${o}/examples/[component]-example.tsx`,schema:`${SHADCN_URL}/schema.json`}}}function rm(e){logger.log(highlighter.info("Project")),e.project?fe({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??"-"}):logger.log(" No project info detected."),logger.break(),logger.log(highlighter.info("Configuration")),e.config?(fe({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??"-"}),logger.break(),zt(e.preset),logger.break(),logger.log(highlighter.info("Aliases")),fe({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??"-"}),logger.break(),logger.log(highlighter.info("Resolved Paths")),fe({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&&(logger.break(),logger.log("registries:"),fe(e.config.registries))):logger.log(" No components.json found."),logger.break(),logger.log(highlighter.info("Installed Components")),e.components.length>0?logger.log(` ${e.components.join(", ")}`):logger.log(" No components installed."),logger.break(),logger.log(highlighter.info("Links")),fe(e.links),logger.break();}function zt(e,t={}){if(logger.log(highlighter.info("Preset")),!e?.code)fe({code:"-"});else {let r=e.fallbacks??[],o=(n,i)=>{let s=r.includes(n)?"*":"";return `${i??"-"}${s}`};fe({code:e.code,version:e.code[0],style:e.values?.style??"-",baseColor:o("baseColor",e.values?.baseColor),theme:o("theme",e.values?.theme),chartColor:o("chartColor",e.values?.chartColor),iconLibrary:o("iconLibrary",e.values?.iconLibrary),font:o("font",e.values?.font),fontHeading:o("fontHeading",e.values?.fontHeading),radius:o("radius",e.values?.radius),menuAccent:o("menuAccent",e.values?.menuAccent),menuColor:o("menuColor",e.values?.menuColor),url:`${SHADCN_URL}/create?preset=${e.code}`}),r.length>0&&(logger.log(""),logger.log(t.fallbackNote??" * Uses preset defaults for values not available as options on shadcn/create."));}}function fe(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,o]of Object.entries(e))logger.log(` ${r.padEnd(t+2)}${o}`);}var ve="latest",Gt=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${ve}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${ve}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${ve}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
124
+ `),await promises.writeFile(r,n,"utf8"),l?.succeed(),Jf(i)){let p=spinner(`Removing ${highlighter.info("shadcn")}.`,{silent:e.silent})?.start();await Hf(e.cwd),p?.succeed();}else e.silent||logger.warn(`The ${highlighter.info("shadcn")} package was not found in package.json. Skipped removal.`);logger.break(),logger.log(`Ejected ${highlighter.info("shadcn/tailwind.css")} into ${highlighter.info(o)}.`),logger.break();}function Wf(e){return e?(e.dependencies?.shadcn??e.devDependencies?.shadcn??"unknown").replace(/^[\^~]/,"").trim():"unknown"}function Jf(e){return e?!!(e.dependencies?.shadcn||e.devDependencies?.shadcn):false}function zf(e){let t=X__default.join(e,"node_modules/shadcn/dist/tailwind.css");if(F.existsSync(t))return t;let r=process.argv[1]?X__default.dirname(X__default.resolve(process.argv[1])):e;for(let o of [X__default.join(r,"tailwind.css"),X__default.join(r,"dist","tailwind.css"),X__default.join(r,"src","tailwind.css"),X__default.join(process.cwd(),"src/tailwind.css"),X__default.join(process.cwd(),"dist/tailwind.css")])if(F.existsSync(o))return o;throw new Error("Could not resolve shadcn/tailwind.css.")}async function Hf(e){switch(await getPackageManager(e)){case "npm":await execa("npm",["uninstall","shadcn"],{cwd:e});break;case "pnpm":await execa("pnpm",["remove","shadcn"],{cwd:e});break;case "yarn":await execa("yarn",["remove","shadcn"],{cwd:e});break;case "bun":await execa("bun",["remove","shadcn"],{cwd:e});break;case "deno":{let r=X__default.join(e,"package.json"),o=await F.readJson(r);for(let n of ["dependencies","devDependencies"])o[n]?.shadcn&&delete o[n].shadcn;await F.writeJson(r,o,{spaces:2});break}}}var Gf=["50","100","200","300","400","500","600","700","800","900","950"],Kf=["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"],Yf={red:{50:"oklch(97.1% 0.013 17.38)",100:"oklch(93.6% 0.032 17.717)",200:"oklch(88.5% 0.062 18.334)",300:"oklch(80.8% 0.114 19.571)",400:"oklch(70.4% 0.191 22.216)",500:"oklch(63.7% 0.237 25.331)",600:"oklch(57.7% 0.245 27.325)",700:"oklch(50.5% 0.213 27.518)",800:"oklch(44.4% 0.177 26.899)",900:"oklch(39.6% 0.141 25.723)",950:"oklch(25.8% 0.092 26.042)"},orange:{50:"oklch(98% 0.016 73.684)",100:"oklch(95.4% 0.038 75.164)",200:"oklch(90.1% 0.076 70.697)",300:"oklch(83.7% 0.128 66.29)",400:"oklch(75% 0.183 55.934)",500:"oklch(70.5% 0.213 47.604)",600:"oklch(64.6% 0.222 41.116)",700:"oklch(55.3% 0.195 38.402)",800:"oklch(47% 0.157 37.304)",900:"oklch(40.8% 0.123 38.172)",950:"oklch(26.6% 0.079 36.259)"},amber:{50:"oklch(98.7% 0.022 95.277)",100:"oklch(96.2% 0.059 95.617)",200:"oklch(92.4% 0.12 95.746)",300:"oklch(87.9% 0.169 91.605)",400:"oklch(82.8% 0.189 84.429)",500:"oklch(76.9% 0.188 70.08)",600:"oklch(66.6% 0.179 58.318)",700:"oklch(55.5% 0.163 48.998)",800:"oklch(47.3% 0.137 46.201)",900:"oklch(41.4% 0.112 45.904)",950:"oklch(27.9% 0.077 45.635)"},yellow:{50:"oklch(98.7% 0.026 102.212)",100:"oklch(97.3% 0.071 103.193)",200:"oklch(94.5% 0.129 101.54)",300:"oklch(90.5% 0.182 98.111)",400:"oklch(85.2% 0.199 91.936)",500:"oklch(79.5% 0.184 86.047)",600:"oklch(68.1% 0.162 75.834)",700:"oklch(55.4% 0.135 66.442)",800:"oklch(47.6% 0.114 61.907)",900:"oklch(42.1% 0.095 57.708)",950:"oklch(28.6% 0.066 53.813)"},lime:{50:"oklch(98.6% 0.031 120.757)",100:"oklch(96.7% 0.067 122.328)",200:"oklch(93.8% 0.127 124.321)",300:"oklch(89.7% 0.196 126.665)",400:"oklch(84.1% 0.238 128.85)",500:"oklch(76.8% 0.233 130.85)",600:"oklch(64.8% 0.2 131.684)",700:"oklch(53.2% 0.157 131.589)",800:"oklch(45.3% 0.124 130.933)",900:"oklch(40.5% 0.101 131.063)",950:"oklch(27.4% 0.072 132.109)"},green:{50:"oklch(98.2% 0.018 155.826)",100:"oklch(96.2% 0.044 156.743)",200:"oklch(92.5% 0.084 155.995)",300:"oklch(87.1% 0.15 154.449)",400:"oklch(79.2% 0.209 151.711)",500:"oklch(72.3% 0.219 149.579)",600:"oklch(62.7% 0.194 149.214)",700:"oklch(52.7% 0.154 150.069)",800:"oklch(44.8% 0.119 151.328)",900:"oklch(39.3% 0.095 152.535)",950:"oklch(26.6% 0.065 152.934)"},emerald:{50:"oklch(97.9% 0.021 166.113)",100:"oklch(95% 0.052 163.051)",200:"oklch(90.5% 0.093 164.15)",300:"oklch(84.5% 0.143 164.978)",400:"oklch(76.5% 0.177 163.223)",500:"oklch(69.6% 0.17 162.48)",600:"oklch(59.6% 0.145 163.225)",700:"oklch(50.8% 0.118 165.612)",800:"oklch(43.2% 0.095 166.913)",900:"oklch(37.8% 0.077 168.94)",950:"oklch(26.2% 0.051 172.552)"},teal:{50:"oklch(98.4% 0.014 180.72)",100:"oklch(95.3% 0.051 180.801)",200:"oklch(91% 0.096 180.426)",300:"oklch(85.5% 0.138 181.071)",400:"oklch(77.7% 0.152 181.912)",500:"oklch(70.4% 0.14 182.503)",600:"oklch(60% 0.118 184.704)",700:"oklch(51.1% 0.096 186.391)",800:"oklch(43.7% 0.078 188.216)",900:"oklch(38.6% 0.063 188.416)",950:"oklch(27.7% 0.046 192.524)"},cyan:{50:"oklch(98.4% 0.019 200.873)",100:"oklch(95.6% 0.045 203.388)",200:"oklch(91.7% 0.08 205.041)",300:"oklch(86.5% 0.127 207.078)",400:"oklch(78.9% 0.154 211.53)",500:"oklch(71.5% 0.143 215.221)",600:"oklch(60.9% 0.126 221.723)",700:"oklch(52% 0.105 223.128)",800:"oklch(45% 0.085 224.283)",900:"oklch(39.8% 0.07 227.392)",950:"oklch(30.2% 0.056 229.695)"},sky:{50:"oklch(97.7% 0.013 236.62)",100:"oklch(95.1% 0.026 236.824)",200:"oklch(90.1% 0.058 230.902)",300:"oklch(82.8% 0.111 230.318)",400:"oklch(74.6% 0.16 232.661)",500:"oklch(68.5% 0.169 237.323)",600:"oklch(58.8% 0.158 241.966)",700:"oklch(50% 0.134 242.749)",800:"oklch(44.3% 0.11 240.79)",900:"oklch(39.1% 0.09 240.876)",950:"oklch(29.3% 0.066 243.157)"},blue:{50:"oklch(97% 0.014 254.604)",100:"oklch(93.2% 0.032 255.585)",200:"oklch(88.2% 0.059 254.128)",300:"oklch(80.9% 0.105 251.813)",400:"oklch(70.7% 0.165 254.624)",500:"oklch(62.3% 0.214 259.815)",600:"oklch(54.6% 0.245 262.881)",700:"oklch(48.8% 0.243 264.376)",800:"oklch(42.4% 0.199 265.638)",900:"oklch(37.9% 0.146 265.522)",950:"oklch(28.2% 0.091 267.935)"},indigo:{50:"oklch(96.2% 0.018 272.314)",100:"oklch(93% 0.034 272.788)",200:"oklch(87% 0.065 274.039)",300:"oklch(78.5% 0.115 274.713)",400:"oklch(67.3% 0.182 276.935)",500:"oklch(58.5% 0.233 277.117)",600:"oklch(51.1% 0.262 276.966)",700:"oklch(45.7% 0.24 277.023)",800:"oklch(39.8% 0.195 277.366)",900:"oklch(35.9% 0.144 278.697)",950:"oklch(25.7% 0.09 281.288)"},violet:{50:"oklch(96.9% 0.016 293.756)",100:"oklch(94.3% 0.029 294.588)",200:"oklch(89.4% 0.057 293.283)",300:"oklch(81.1% 0.111 293.571)",400:"oklch(70.2% 0.183 293.541)",500:"oklch(60.6% 0.25 292.717)",600:"oklch(54.1% 0.281 293.009)",700:"oklch(49.1% 0.27 292.581)",800:"oklch(43.2% 0.232 292.759)",900:"oklch(38% 0.189 293.745)",950:"oklch(28.3% 0.141 291.089)"},purple:{50:"oklch(97.7% 0.014 308.299)",100:"oklch(94.6% 0.033 307.174)",200:"oklch(90.2% 0.063 306.703)",300:"oklch(82.7% 0.119 306.383)",400:"oklch(71.4% 0.203 305.504)",500:"oklch(62.7% 0.265 303.9)",600:"oklch(55.8% 0.288 302.321)",700:"oklch(49.6% 0.265 301.924)",800:"oklch(43.8% 0.218 303.724)",900:"oklch(38.1% 0.176 304.987)",950:"oklch(29.1% 0.149 302.717)"},fuchsia:{50:"oklch(97.7% 0.017 320.058)",100:"oklch(95.2% 0.037 318.852)",200:"oklch(90.3% 0.076 319.62)",300:"oklch(83.3% 0.145 321.434)",400:"oklch(74% 0.238 322.16)",500:"oklch(66.7% 0.295 322.15)",600:"oklch(59.1% 0.293 322.896)",700:"oklch(51.8% 0.253 323.949)",800:"oklch(45.2% 0.211 324.591)",900:"oklch(40.1% 0.17 325.612)",950:"oklch(29.3% 0.136 325.661)"},pink:{50:"oklch(97.1% 0.014 343.198)",100:"oklch(94.8% 0.028 342.258)",200:"oklch(89.9% 0.061 343.231)",300:"oklch(82.3% 0.12 346.018)",400:"oklch(71.8% 0.202 349.761)",500:"oklch(65.6% 0.241 354.308)",600:"oklch(59.2% 0.249 0.584)",700:"oklch(52.5% 0.223 3.958)",800:"oklch(45.9% 0.187 3.815)",900:"oklch(40.8% 0.153 2.432)",950:"oklch(28.4% 0.109 3.907)"},rose:{50:"oklch(96.9% 0.015 12.422)",100:"oklch(94.1% 0.03 12.58)",200:"oklch(89.2% 0.058 10.001)",300:"oklch(81% 0.117 11.638)",400:"oklch(71.2% 0.194 13.428)",500:"oklch(64.5% 0.246 16.439)",600:"oklch(58.6% 0.253 17.585)",700:"oklch(51.4% 0.222 16.935)",800:"oklch(45.5% 0.188 13.697)",900:"oklch(41% 0.159 10.272)",950:"oklch(27.1% 0.105 12.094)"},slate:{50:"oklch(98.4% 0.003 247.858)",100:"oklch(96.8% 0.007 247.896)",200:"oklch(92.9% 0.013 255.508)",300:"oklch(86.9% 0.022 252.894)",400:"oklch(70.4% 0.04 256.788)",500:"oklch(55.4% 0.046 257.417)",600:"oklch(44.6% 0.043 257.281)",700:"oklch(37.2% 0.044 257.287)",800:"oklch(27.9% 0.041 260.031)",900:"oklch(20.8% 0.042 265.755)",950:"oklch(12.9% 0.042 264.695)"},gray:{50:"oklch(98.5% 0.002 247.839)",100:"oklch(96.7% 0.003 264.542)",200:"oklch(92.8% 0.006 264.531)",300:"oklch(87.2% 0.01 258.338)",400:"oklch(70.7% 0.022 261.325)",500:"oklch(55.1% 0.027 264.364)",600:"oklch(44.6% 0.03 256.802)",700:"oklch(37.3% 0.034 259.733)",800:"oklch(27.8% 0.033 256.848)",900:"oklch(21% 0.034 264.665)",950:"oklch(13% 0.028 261.692)"},zinc:{50:"oklch(98.5% 0 0)",100:"oklch(96.7% 0.001 286.375)",200:"oklch(92% 0.004 286.32)",300:"oklch(87.1% 0.006 286.286)",400:"oklch(70.5% 0.015 286.067)",500:"oklch(55.2% 0.016 285.938)",600:"oklch(44.2% 0.017 285.786)",700:"oklch(37% 0.013 285.805)",800:"oklch(27.4% 0.006 286.033)",900:"oklch(21% 0.006 285.885)",950:"oklch(14.1% 0.005 285.823)"},neutral:{50:"oklch(98.5% 0 0)",100:"oklch(97% 0 0)",200:"oklch(92.2% 0 0)",300:"oklch(87% 0 0)",400:"oklch(70.8% 0 0)",500:"oklch(55.6% 0 0)",600:"oklch(43.9% 0 0)",700:"oklch(37.1% 0 0)",800:"oklch(26.9% 0 0)",900:"oklch(20.5% 0 0)",950:"oklch(14.5% 0 0)"},stone:{50:"oklch(98.5% 0.001 106.423)",100:"oklch(97% 0.001 106.424)",200:"oklch(92.3% 0.003 48.717)",300:"oklch(86.9% 0.005 56.366)",400:"oklch(70.9% 0.01 56.259)",500:"oklch(55.3% 0.013 58.071)",600:"oklch(44.4% 0.011 73.639)",700:"oklch(37.4% 0.01 67.558)",800:"oklch(26.8% 0.007 34.298)",900:"oklch(21.6% 0.006 56.043)",950:"oklch(14.7% 0.004 49.25)"},mauve:{50:"oklch(98.5% 0 0)",100:"oklch(96% 0.003 325.6)",200:"oklch(92.2% 0.005 325.62)",300:"oklch(86.5% 0.012 325.68)",400:"oklch(71.1% 0.019 323.02)",500:"oklch(54.2% 0.034 322.5)",600:"oklch(43.5% 0.029 321.78)",700:"oklch(36.4% 0.029 323.89)",800:"oklch(26.3% 0.024 320.12)",900:"oklch(21.2% 0.019 322.12)",950:"oklch(14.5% 0.008 326)"},olive:{50:"oklch(98.8% 0.003 106.5)",100:"oklch(96.6% 0.005 106.5)",200:"oklch(93% 0.007 106.5)",300:"oklch(88% 0.011 106.6)",400:"oklch(73.7% 0.021 106.9)",500:"oklch(58% 0.031 107.3)",600:"oklch(46.6% 0.025 107.3)",700:"oklch(39.4% 0.023 107.4)",800:"oklch(28.6% 0.016 107.4)",900:"oklch(22.8% 0.013 107.4)",950:"oklch(15.3% 0.006 107.1)"},mist:{50:"oklch(98.7% 0.002 197.1)",100:"oklch(96.3% 0.002 197.1)",200:"oklch(92.5% 0.005 214.3)",300:"oklch(87.2% 0.007 219.6)",400:"oklch(72.3% 0.014 214.4)",500:"oklch(56% 0.021 213.5)",600:"oklch(45% 0.017 213.2)",700:"oklch(37.8% 0.015 216)",800:"oklch(27.5% 0.011 216.9)",900:"oklch(21.8% 0.008 223.9)",950:"oklch(14.8% 0.004 228.8)"},taupe:{50:"oklch(98.6% 0.002 67.8)",100:"oklch(96% 0.002 17.2)",200:"oklch(92.2% 0.005 34.3)",300:"oklch(86.8% 0.007 39.5)",400:"oklch(71.4% 0.014 41.2)",500:"oklch(54.7% 0.021 43.1)",600:"oklch(43.8% 0.017 39.3)",700:"oklch(36.7% 0.016 35.7)",800:"oklch(26.8% 0.011 36.5)",900:"oklch(21.4% 0.009 43.1)",950:"oklch(14.7% 0.004 49.3)"}},qf={"220.9 39.3% 11%":"gray","210 20% 98%":"gray","12 76% 61%":"gray","220 70% 50%":"gray"},Bn=new Map;for(let e of Kf)for(let t of Gf)Bn.set(Wn(Yf[e][t]),e);function Un(e){let t=Wn(e);return t?Bn.get(t)??qf[t]??null:null}function Wn(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*/),n=o.split(/\s+/);if(n.length<3)return t;let i=Lr(n[0],{percentage:true}),s=Lr(n[1]),a=Lr(n[2]);return `oklch(${i} ${s} ${a})`}function Lr(e,t={}){return t.percentage&&e.endsWith("%")?Vn(Number.parseFloat(e)/100):Vn(Number.parseFloat(e))}function Vn(e){return Number.isNaN(e)?"":Number(e.toFixed(12)).toString()}var mp=new Set(PRESET_BASE_COLORS),dp=new Set(PRESET_ICON_LIBRARIES),up=new Set(PRESET_MENU_ACCENTS),gp=new Set(PRESET_MENU_COLORS),hp=new Set(PRESET_FONTS),yp=new Set(PRESET_FONT_HEADINGS),wp=new Set(PRESET_THEMES),xp=new Set(["eb-garamond","instrument-serif","lora","merriweather","playfair-display","noto-serif","roboto-slab"]),kp=new Set(["jetbrains-mono","geist-mono"]),pt=["--font-sans","--font-serif","--font-mono"],Kn=new Set(pt),bp=[...pt,"--font-heading"],Yn=new Set(bp),Jn={appliedBodyVariable:null,variables:{}},Cp={0:"none","0rem":"none","0.45rem":"small","0.625rem":"default","0.875rem":"large"};async function Wt(e,t){let r=vp(e.style);if(!r)return {code:null,fallbacks:[],values:null};let o=J[r],n=await Sp(e.resolvedPaths.tailwindCss),i=Bt(mp,e.tailwind.baseColor),s=Ip(n),a=$p(n),c=Bt(dp,e.iconLibrary),l=zn(n,Jn),p=l??o.font,f=Hn(n,p,Jn);if(!l||!f){let x=t;if(t===void 0)try{x=await getProjectInfo(e.resolvedPaths.cwd,{configCssFile:e.tailwind.css});}catch{x=null;}let b=await Op(e,x);l??=zn(n,b),p=l??o.font,f??=Hn(n,p,b);}let m=Np(f??o.fontHeading,p,o.fontHeading),d=Ep(n.rootVars["--radius"]),u=Bt(up,e.menuAccent),g=Bt(gp,e.menuColor),y={style:r,baseColor:i??o.baseColor,theme:s??o.theme,chartColor:a??o.chartColor,iconLibrary:c??o.iconLibrary,font:p,fontHeading:m,radius:d??o.radius,menuAccent:u??o.menuAccent,menuColor:g??o.menuColor},w=[!i&&"baseColor",!s&&"theme",!a&&"chartColor",!c&&"iconLibrary",!l&&"font",!f&&"fontHeading",!d&&"radius",!u&&"menuAccent",!g&&"menuColor"].filter(Boolean);return {code:encodePreset(y),fallbacks:w,values:y}}async function Sp(e){let t={darkVars:{},imports:[],rootVars:{},themeVars:{}};if(!e)return t;try{let r=await promises.readFile(e,"utf8");return Rp(r)}catch{return t}}function vp(e){let t=parsePresetStyle(e).style;return !t||!(t in J)?null:t}function Rp(e){let t=lp.parse(e),r={darkVars:{},imports:[],rootVars:{},themeVars:{}};return t.walkAtRules("import",o=>{let n=Pp(o.params);n&&r.imports.push(n);}),t.walkRules(o=>{let n=o.selector.split(",").map(i=>i.trim()).filter(Boolean);n.includes(":root")&&Dr(o,r.rootVars),n.includes(".dark")&&Dr(o,r.darkVars);}),t.walkAtRules("theme",o=>{o.params.trim()==="inline"&&Dr(o,r.themeVars);}),r}function Dr(e,t){for(let r of e.nodes??[])r.type!=="decl"||!r.prop.startsWith("--")||(t[r.prop]=r.value.trim());}function Pp(e){let t=e.trim();return (t.match(/^url\((['"]?)(.+?)\1\)$/)??t.match(/^(['"])(.+?)\1$/))?.[2]??null}function Ip(e){let t=Ut(e.rootVars["--primary"]);if(!t)return null;let r=e.darkVars["--primary"];return r?Ut(r)===t?t:null:t}function $p(e){let t=Ut(e.rootVars["--chart-1"]);if(!t)return null;let r=e.darkVars["--chart-1"];return r?Ut(r)===t?t:null:t}function Ut(e){let t=Un(e);return !t||!wp.has(t)?null:t}function Ep(e){if(!e)return null;let t=Jt(e);return Cp[t]??null}function zn(e,t){for(let r of pt){let o=Xn(e,r);if(o)return o}for(let r of pt){let o=Tp(e.imports,r);if(o)return o}return jp(t)}function Hn(e,t,r){let o=_r(e,"--font-heading"),n=o?Qn(o):null;if(n)return n===t?"inherit":n;let i=r.variables["--font-heading"],s=qn(e,"--font-heading");if(!s)return i&&i!==t?i:null;let a=Mr(s);if(a&&Kn.has(a)){let c=Xn(e,a),l=r.variables[a],p=c??l??null;return !p||p===t?"inherit":p}return a==="--font-heading"?i?i===t?"inherit":i:null:i&&i!==t?i:null}function Np(e,t,r){let o=e===t?"inherit":e;return yp.has(o)?o:r}function _r(e,t,r=new Set){if(r.has(t))return null;r.add(t);let o=qn(e,t);if(!o)return null;let n=Mr(o);return n?Yn.has(n)?_r(e,n,r):null:o}function qn(e,t){let r=e.themeVars[t];return r&&Mr(r)!==t?r:e.rootVars[t]??r??null}function Mr(e){return Jt(e).match(/^var\((--[a-z0-9-]+)\)$/)?.[1]??null}function Xn(e,t){let r=_r(e,t),o=r?Qn(r):null;return o||null}function Tp(e,t){let r=e.flatMap(o=>{let n=Bp(o);return n&&Wp(n)===t?[n]:[]});return r.length===1?r[0]:null}function jp(e){if(e.appliedBodyVariable&&e.variables[e.appliedBodyVariable])return e.variables[e.appliedBodyVariable]??null;let t=pt.map(r=>e.variables[r]).filter(Boolean).filter((r,o,n)=>n.indexOf(r)===o);return t.length===1?t[0]:null}async function Op(e,t){let r={appliedBodyVariable:null,variables:{}};if(!t||t.framework.name!=="next-app"&&t.framework.name!=="next-pages")return r;let o=Fp(e,t);if(!o)return r;try{let n=await promises.readFile(o,"utf8");return Ap(n,t.framework.name)}catch{return r}}function Fp(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 n of o){let i=X__default.join(e.resolvedPaths.cwd,n);if(existsSync(i))return i}return null}function Ap(e,t){let o=new Project({compilerOptions:{}}).createSourceFile("font-source.tsx",e,{overwrite:true,scriptKind:ScriptKind.TSX}),n=new Map;for(let a of o.getImportDeclarations())if(a.getModuleSpecifierValue()==="next/font/google")for(let c of a.getNamedImports()){let l=c.getName(),p=c.getAliasNode()?.getText()??l,f=Up(l);f&&n.set(p,f);}let i={},s=new Map;for(let a of o.getVariableStatements())for(let c of a.getDeclarations()){let l=c.getInitializer();if(!l?.isKind(SyntaxKind.CallExpression))continue;let p=n.get(l.getExpression().getText());if(!p)continue;let f=Lp(l);f&&(s.set(c.getName(),f),i[f]=p);}return {appliedBodyVariable:Dp(o,s,t),variables:i}}function Lp(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 n=Zn(o.getText());return Yn.has(n)?n:null}function Dp(e,t,r){let o=e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement).filter(i=>r==="next-app"?i.getTagNameNode().getText()==="html":true),n=new Set;for(let i of o){let s=i.getAttribute("className");if(!s||!Node.isJsxAttribute(s))continue;let a=s.getInitializer();if(!a)continue;let c=_p(a,t),l=Mp(a);if(l&&c.includes(l))return l;c.length===1&&n.add(c[0]);}return n.size===1?Array.from(n)[0]:null}function _p(e,t){let r=Node.isJsxExpression(e)?[e.getExpression(),...e.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression)].filter(Boolean):[],o=new Set;for(let n of r){if(!n||!Node.isPropertyAccessExpression(n)||n.getName()!=="variable")continue;let i=n.getExpression().getText(),s=t.get(i);s&&Kn.has(s)&&o.add(s);}return Array.from(o)}function Mp(e){let t=Vp(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 Vp(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 Zn(e){return e.replace(/^['"]|['"]$/g,"")}function Qn(e){if(!e)return null;let t=Zn(e.split(",")[0]?.trim()??"").replace(/\s+variable$/i,"").trim();return t?Vr(t.replace(/\s+/g,"-")):null}function Bp(e){if(!e)return null;let t=Jt(e),r="@fontsource-variable/";return t.startsWith(r)?Vr(t.slice(r.length)):null}function Up(e){return e?Vr(e.replace(/_/g,"-")):null}function Vr(e){let t=Jt(e);return hp.has(t)?t:null}function Wp(e){return kp.has(e)?"--font-mono":xp.has(e)?"--font-serif":"--font-sans"}function Jt(e){return e?e.trim().replace(/\s+/g," ").replace(/\s*,\s*/g,", ").replace(/"/g,"'").toLowerCase():""}function Bt(e,t){return t&&e.has(t)?t:null}var ti=`${SHADCN_URL}/code/apps/v4/registry/bases`,ri=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=X__default.resolve(e.cwd);if(!existsSync(X__default.resolve(t,"components.json"))&&await isMonorepoRoot(t)){let a=await getMonorepoTargets(t);a.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:a.map(c=>c.name)},null,2)):formatMonorepoMessage("info",a),process.exit(1));}let r=await getProjectInfo(t),o=await getConfig(t),n=await getProjectComponents(t),i=getBase(o?.style),s=await em(r,o,n,i);if(e.json){console.log(JSON.stringify(s,null,2));return}tm(s);}catch(t){k(t);}});function Qp(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 em(e,t,r,o){let n=t?await Wt(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:Qp(t.registries)}:null,preset:n,components:r,links:{docs:`${SHADCN_URL}/docs`,components:`${SHADCN_URL}/docs/components/${o}/[component].md`,ui:`${ti}/${o}/ui/[component].tsx`,examples:`${ti}/${o}/examples/[component]-example.tsx`,schema:`${SHADCN_URL}/schema.json`}}}function tm(e){logger.log(highlighter.info("Project")),e.project?fe({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??"-"}):logger.log(" No project info detected."),logger.break(),logger.log(highlighter.info("Configuration")),e.config?(fe({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??"-"}),logger.break(),zt(e.preset),logger.break(),logger.log(highlighter.info("Aliases")),fe({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??"-"}),logger.break(),logger.log(highlighter.info("Resolved Paths")),fe({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&&(logger.break(),logger.log("registries:"),fe(e.config.registries))):logger.log(" No components.json found."),logger.break(),logger.log(highlighter.info("Installed Components")),e.components.length>0?logger.log(` ${e.components.join(", ")}`):logger.log(" No components installed."),logger.break(),logger.log(highlighter.info("Links")),fe(e.links),logger.break();}function zt(e,t={}){if(logger.log(highlighter.info("Preset")),!e?.code)fe({code:"-"});else {let r=e.fallbacks??[],o=(n,i)=>{let s=r.includes(n)?"*":"";return `${i??"-"}${s}`};fe({code:e.code,version:e.code[0],style:e.values?.style??"-",baseColor:o("baseColor",e.values?.baseColor),theme:o("theme",e.values?.theme),chartColor:o("chartColor",e.values?.chartColor),iconLibrary:o("iconLibrary",e.values?.iconLibrary),font:o("font",e.values?.font),fontHeading:o("fontHeading",e.values?.fontHeading),radius:o("radius",e.values?.radius),menuAccent:o("menuAccent",e.values?.menuAccent),menuColor:o("menuColor",e.values?.menuColor),url:`${SHADCN_URL}/create?preset=${e.code}`}),r.length>0&&(logger.log(""),logger.log(t.fallbackNote??" * Uses preset defaults for values not available as options on shadcn/create."));}}function fe(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,o]of Object.entries(e))logger.log(` ${r.padEnd(t+2)}${o}`);}var ve="latest",Gt=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${ve}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{shadcn:{command:"npx",args:[`shadcn@${ve}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{shadcn:{command:"npx",args:[`shadcn@${ve}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.shadcn]
125
125
  command = "npx"
126
126
  args = ["shadcn@${ve}", "mcp"]
127
- `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${ve}`,"mcp"],enabled:true}}}}],Ht=[`shadcn@${ve}`],Wr=new Command().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await loadEnvFiles(e.cwd);let t=new StdioServerTransport;await a.connect(t);}catch(t){logger.break(),C(t);}}),pm=Ur.object({client:Ur.enum(["claude","cursor","vscode","codex","opencode"]),cwd:Ur.string()});Wr.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(),n=e.client;if(!n){let l=await ae({type:"select",name:"client",message:"Which MCP client are you using?",choices:Gt.map(p=>({title:p.label,value:p.name}))});l.client||(logger.break(),process.exit(1)),n=l.client;}let i=pm.parse({client:n,cwd:o}),s=await getConfig(i.cwd);if(i.client==="codex"){if(s)await updateDependencies([],Ht,s,{silent:!1});else {let l=await getPackageManager(i.cwd),p=l==="npm"?"install":"add",f=l==="npm"?"--save-dev":"-D",m=spinner("Installing dependencies...").start();await execa(l,[p,f,...Ht],{cwd:i.cwd}),m.succeed("Installing dependencies.");}logger.break(),logger.log("To configure the shadcn MCP server in Codex:"),logger.break(),logger.log(`1. Open or create the file ${highlighter.info("~/.codex/config.toml")}`),logger.log("2. Add the following configuration:"),logger.log(),logger.info(`[mcp_servers.shadcn]
127
+ `},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{shadcn:{type:"local",command:["npx",`shadcn@${ve}`,"mcp"],enabled:true}}}}],Ht=[`shadcn@${ve}`],Wr=new Command().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await loadEnvFiles(e.cwd);let t=new StdioServerTransport;await a.connect(t);}catch(t){logger.break(),k(t);}}),fm=Ur.object({client:Ur.enum(["claude","cursor","vscode","codex","opencode"]),cwd:Ur.string()});Wr.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(),n=e.client;if(!n){let l=await ae({type:"select",name:"client",message:"Which MCP client are you using?",choices:Gt.map(p=>({title:p.label,value:p.name}))});l.client||(logger.break(),process.exit(1)),n=l.client;}let i=fm.parse({client:n,cwd:o}),s=await getConfig(i.cwd);if(i.client==="codex"){if(s)await updateDependencies([],Ht,s,{silent:!1});else {let l=await getPackageManager(i.cwd),p=l==="npm"?"install":"add",f=l==="npm"?"--save-dev":"-D",m=spinner("Installing dependencies...").start();await execa(l,[p,f,...Ht],{cwd:i.cwd}),m.succeed("Installing dependencies.");}logger.break(),logger.log("To configure the shadcn MCP server in Codex:"),logger.break(),logger.log(`1. Open or create the file ${highlighter.info("~/.codex/config.toml")}`),logger.log("2. Add the following configuration:"),logger.log(),logger.info(`[mcp_servers.shadcn]
128
128
  command = "npx"
129
- args = ["shadcn@${ve}", "mcp"]`),logger.break(),logger.info("3. Restart Codex to load the MCP server"),logger.break(),process.exit(0);}let a=spinner("Configuring MCP server...").start(),c=await dm(i);if(a.succeed("Configuring MCP server."),s)await updateDependencies([],Ht,s,{silent:!1});else {let l=await getPackageManager(i.cwd),p=l==="npm"?"install":"add",f=l==="npm"?"--save-dev":"-D",m=spinner("Installing dependencies...").start();await execa(l,[p,f,...Ht],{cwd:i.cwd}),m.succeed("Installing dependencies.");}logger.break(),logger.success(`Configuration saved to ${c}.`),logger.break();}catch(r){C(r);}});var mm=(e,t)=>t;async function dm(e){let{client:t,cwd:r}=e,o=Gt.find(c=>c.name===t);if(!o)throw new Error(`Unknown client: ${t}. Available clients: ${Gt.map(c=>c.name).join(", ")}`);let n=X__default.join(r,o.configPath),i=X__default.dirname(n);await F.ensureDir(i);let s={};try{let c=await promises.readFile(n,"utf-8");s=JSON.parse(c);}catch{}let a=$o(s,o.config,{arrayMerge:mm});return await promises.writeFile(n,JSON.stringify(a,null,2)+`
130
- `,"utf-8"),o.configPath}async function di(e,t={}){if(!e.resolvedPaths.tailwindCss)throw new Error("We could not find a valid CSS file in your `components.json` file. Please ensure you have a valid `tailwind.css` path in your `components.json` file.");if(!e.tailwind.cssVariables)throw new Error("The `base-color` migration requires CSS variables. Your `components.json` has `cssVariables: false`, which uses inline Tailwind color classes instead of theme variables.");let r=BASE_COLORS.map(w=>({title:w.label,value:w.name})),o=BASE_COLORS.map(w=>w.name);if(t.to&&!o.includes(t.to))throw new Error(`Unknown base color: ${t.to}. Available base colors: ${o.join(", ")}.`);let n=t.from||e.tailwind.baseColor,i=t.to;if(!n||!i){let w=r.findIndex(k=>k.value===e.tailwind.baseColor),x=await ae([{type:n?null:"select",name:"sourceBaseColor",message:`Which base color would you like to ${highlighter.info("migrate from")}?`,choices:r,initial:w===-1?0:w},{type:i?null:"select",name:"targetBaseColor",message:`Which base color would you like to ${highlighter.info("migrate to")}?`,choices:r}]);n=n||x.sourceBaseColor,i=i||x.targetBaseColor;}if((!n||!i)&&(logger.info("Migration cancelled."),process.exit(0)),n===i)throw new Error("You cannot migrate to the same base color. Please choose a different base color.");if(!t.yes){let w=`./${X__default.relative(e.resolvedPaths.cwd,e.resolvedPaths.tailwindCss)}`,{confirm:x}=await ae({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${highlighter.info(w)} from ${highlighter.info(n)} to ${highlighter.info(i)}. Continue?`});x||(logger.info("Migration cancelled."),process.exit(0));}let s=await getRegistryBaseColor(n),a=await getRegistryBaseColor(i);if(!s)throw new Error(`Unknown base color: ${n}.`);if(!a)throw new Error("Something went wrong fetching the base colors.");let l=(await getProjectInfo(e.resolvedPaths.cwd))?.tailwindVersion??"v4",p=pi(s,l),f=pi(a,l),m=spinner("Migrating base color...")?.start(),d=await promises.readFile(e.resolvedPaths.tailwindCss,"utf-8"),{cssVars:u,skipped:g}=km(d,p,f,l);(Object.keys(u.light).length>0||Object.keys(u.dark).length>0)&&await updateCssVars(u,e,{overwriteCssVars:true,tailwindVersion:l,silent:true}),m.succeed("Migration complete."),await Sm(e,i);let y=new Map;for(let{token:w,reason:x}of g)y.has(w)||y.set(w,x);if(y.size>0){logger.break(),logger.warn(`Skipped ${y.size} token${y.size===1?"":"s"}. These were left untouched:`);for(let[w,x]of Array.from(y))logger.warn(` - ${w}: ${x}`);}}function km(e,t,r,o){let n=bm(e),i={},s={},a=[],c=[{mode:"light",selector:":root",target:i},{mode:"dark",selector:".dark",target:s}];for(let{mode:l,selector:p,target:f}of c)for(let[m,d]of Object.entries(t[l]??{})){let u=r[l]?.[m];if(u===void 0||Kt(d)===Kt(u))continue;let g=`--${m.replace(/^--/,"")}`,y=n[p][g];if(y===void 0){a.push({token:g,reason:"not found in your CSS"});continue}Kt(y)===Kt(Cm(d,o))?f[m]=u:a.push({token:g,reason:"does not match the source base color"});}return {cssVars:{light:i,dark:s},skipped:a}}function pi(e,t){return t==="v4"&&e.cssVarsV4?e.cssVarsV4:e.cssVars}function bm(e){let t={":root":{},".dark":{}};return fp.parse(e).walkRules(r=>{r.selector!==":root"&&r.selector!==".dark"||r.walkDecls(o=>{o.prop.startsWith("--")&&(t[r.selector][o.prop]=o.value);});}),t}function Cm(e,t){return t==="v4"&&isLocalHSLValue(e)?`hsl(${e})`:e}function Kt(e){return e.trim().replace(/\s+/g," ")}async function Sm(e,t){let r=X__default.resolve(e.resolvedPaths.cwd,"components.json");if(!F.existsSync(r))return;let o=await F.readJson(r);o.tailwind?.baseColor!==t&&(o.tailwind={...o.tailwind,baseColor:t},await F.writeJson(r,o,{spaces:2}),logger.info(`Updated ${highlighter.info("baseColor")} in components.json to ${highlighter.info(t)}.`));}var Pm="**/*.{js,jsx,ts,tsx,mjs,mts,cjs,cts,vue,svelte,astro}",Im=["**/node_modules/**","**/.git/**","**/.next/**","**/.nuxt/**","**/.svelte-kit/**","**/.astro/**","**/.output/**","**/.vercel/**","**/dist/**","**/build/**","**/out/**","**/coverage/**"];async function ui(e,t){if(!t)return zr(e);if(t.includes("*")){let n=await zr(e,t);if(!n.length)throw new Error(`No files found matching: ${t}`);return n}let r=X__default.resolve(e,t),o=await promises.stat(r).catch(()=>null);if(!o)throw new Error(`File not found: ${t}`);if(o.isFile())return [r];if(o.isDirectory()){let n=await zr(r);if(!n.length)throw new Error(`No files found matching: ${t}`);return n}throw new Error(`Unsupported path type: ${t}`)}function zr(e,t=Pm){return to(t,{cwd:e,absolute:true,onlyFiles:true,ignore:Im,suppressErrors:true,dot:true})}function Gr(e,t){let r=[],o=/<script\b([^>]*)>([\s\S]*?)<\/script(?:\s[^>]*)?>/gi,n;for(;(n=o.exec(e))!==null;){let i=n[1],s=n[2],a=n[0].indexOf(s),c=i.match(/\blang=["'](js|jsx|ts|tsx)["']/i)?.[1];r.push({start:n.index+a,end:n.index+a+s.length,filename:`${t}.${r.length}.${c?.toLowerCase()??"js"}`});}return r}function gi(e,t){let r=e.match(/^(?:\uFEFF)?---[\t ]*\r?\n([\s\S]*?)\r?\n---/);if(!r||r.index===void 0)return [];let o=r[1],n=r[0].indexOf(o);return [{start:r.index+n,end:r.index+n+o.length,filename:`${t}.frontmatter.ts`}]}function hi(e){let t=X__default.basename(e).replace(/[^a-zA-Z0-9_.-]/g,"-");return t.match(/\.(?:js|jsx|ts|tsx|mjs|mts|cjs|cts)$/)?`/${t}`:`/${t}.tsx`}function yi(e){switch(X__default.extname(e).toLowerCase()){case ".ts":case ".mts":case ".cts":return ScriptKind.TS;case ".tsx":return ScriptKind.TSX;case ".jsx":return ScriptKind.JSX;default:return ScriptKind.JS}}function bi(e,t,r){let o=Si(t).filter(a=>a.kind==="esm"),n=vi(t).filter(a=>a.kind==="esm"),i=0,s=[];for(let a of e.getFunctions()){let c=a.getNameNode();if(!c)continue;let l=wi(a);l&&s.push({statement:a,name:c,...l,isInlineExport:a.isExported()&&!a.isDefaultExport(),isDefaultExport:a.isDefaultExport()});}for(let a of e.getVariableStatements()){if(a.getDeclarations().length!==1)continue;let c=a.getDeclarations()[0],l=c.getNameNode(),p=c.getInitializer();if(!Node.isIdentifier(l)||!Node.isArrowFunction(p)&&!Node.isFunctionExpression(p))continue;let f=wi(p);f&&s.push({statement:a,name:l,...f,isInlineExport:a.isExported(),isDefaultExport:false});}for(let a of s){if(!$m(a.expression,a.restName,o,n))continue;let c=a.name.findReferencesAsNodes(),l=c.map(m=>m.getParentIfKind(SyntaxKind.ExportSpecifier)).filter(m=>m!==void 0);if(c.length!==l.length||!a.isInlineExport&&!a.isDefaultExport&&!l.length)continue;let p=new Set;a.isInlineExport&&p.add(a.name.getText()),a.isDefaultExport&&p.add("default");for(let m of l){p.add(m.getAliasNode()?.getText()??m.getNameNode().getText());let d=m.getExportDeclaration();d.getNamedExports().length===1?d.remove():m.remove();}let f=e.getStatements().findIndex(m=>m===a.statement);a.statement.remove(),e.insertExportDeclaration(Math.max(f,0),{moduleSpecifier:"cn",namedExports:Array.from(p).map(m=>({name:"cn",alias:m==="cn"?void 0:m}))}),r.add("clsx"),r.add("tailwind-merge"),i++;}return i}function wi(e){let t=e.getParameters();if(t.length!==1||!t[0].isRestParameter())return null;let r=t[0].getNameNode(),o=e.getBody();if(!Node.isIdentifier(r)||!o)return null;if(!Node.isBlock(o))return {expression:o,restName:r.getText()};let n=o.getStatements();if(n.length!==1||!Node.isReturnStatement(n[0]))return null;let i=n[0].getExpression();return i?{expression:i,restName:r.getText()}:null}function $m(e,t,r,o){if(!Node.isCallExpression(e)||!xi(e,o))return false;let n=e.getArguments();if(n.length!==1||!Node.isCallExpression(n[0])||!xi(n[0],r))return false;let i=n[0].getArguments();if(i.length!==1)return false;let s=i[0];return Node.isIdentifier(s)?s.getText()===t:Node.isSpreadElement(s)&&Node.isIdentifier(s.getExpression())&&s.getExpression().getText()===t}function Ci(e,t){let r=Si(t),o=vi(t),n=[];for(let i of e.getDescendantsOfKind(SyntaxKind.CallExpression)){let s=Kr(i,o);if(!s)continue;let a=false,c=i.getArguments().flatMap(l=>{let p=Kr(l,r);if(!p||p.kind!==s.kind)return [l.getText()];a=true;let f=Em(l);return f?[f]:[]});a&&n.push({outerCall:i,argumentsText:c.join(", "),kind:s.kind});}return n}function Si(e){return e.filter(t=>t.module.startsWith("clsx")&&(t.importedName==="default"||t.importedName==="clsx"))}function vi(e){return e.filter(t=>t.module==="tailwind-merge"&&t.importedName==="twMerge")}function xi(e,t){return Kr(e,t)!==null}function Kr(e,t){if(!Node.isCallExpression(e))return null;let r=e.getExpression();return Node.isIdentifier(r)?t.find(o=>o.localName===r.getText()&&o.identifier.findReferencesAsNodes().some(n=>n.getStart()===r.getStart()))??null:null}function Em(e){return Node.isCallExpression(e)?e.getArguments().map(t=>Node.isIdentifier(t)&&t.getFirstAncestor(n=>Node.isFunctionLikeDeclaration(n))?.getParameters().find(n=>n.isRestParameter()&&n.getNameNode().getText()===t.getText())?`...${t.getText()}`:t.getText()).join(", "):""}function Ii(e,t){let r=0;for(let o of e.getImportDeclarations())o.getModuleSpecifierValue()==="cnfast"&&(o.setModuleSpecifier("cn"),r++);for(let o of e.getExportDeclarations())o.getModuleSpecifierValue()==="cnfast"&&(o.setModuleSpecifier("cn"),r++);for(let o of e.getDescendantsOfKind(SyntaxKind.CallExpression)){let n=o.getExpression();if(n.getKind()!==SyntaxKind.ImportKeyword&&(!Node.isIdentifier(n)||n.getText()!=="require"))continue;let i=o.getArguments()[0];Node.isStringLiteral(i)&&i.getLiteralValue()==="cnfast"&&(i.replaceWithText('"cn"'),r++);}return r&&t.add("cnfast"),r}function dt(e){let t=e.getSymbol()?.compilerSymbol,r=e.getSourceFile().getDescendantsOfKind(SyntaxKind.Identifier).filter(n=>n!==e),o=r.filter(n=>t&&n.getSymbol()?.compilerSymbol===t);for(let n of e.findReferencesAsNodes()){let i=r.find(s=>s.getStart()===n.getStart()&&s.getText()===n.getText());i&&!o.includes(i)&&o.push(i);}return o}function qt(e,t){let r=dt(e);return t==="validators"&&r.some(n=>{let i=n.getParentIfKind(SyntaxKind.PropertyAccessExpression);if(i){let a=i.getParentIfKind(SyntaxKind.CallExpression);if(a!==void 0&&a.getExpression().getStart()===i.getStart())return true}let s=n.getParentIfKind(SyntaxKind.VariableDeclaration);return s!==void 0&&Node.isObjectBindingPattern(s.getNameNode())&&s.getInitializer()?.getStart()===n.getStart()})?"callable validators are not supported by cn":t==="createTailwindMerge"&&r.some(n=>{let i=n.getParentIfKind(SyntaxKind.CallExpression);return i!==void 0&&i.getExpression().getStart()===n.getStart()&&i.getArguments().length>1})?"variadic createTailwindMerge calls are not supported by cn":null}function $i(e,t,r){let o=new Set(e.getDescendantsOfKind(SyntaxKind.Identifier).map(i=>i.getText()));if(!o.has(t))return t;if(!o.has(r))return r;let n=2;for(;o.has(`${r}${n}`);)n++;return `${r}${n}`}function Xt(e){if(!Node.isCallExpression(e)||e.getExpression().getText()!=="require")return null;let t=e.getArguments();if(t.length!==1||!Node.isStringLiteral(t[0]))return null;let r=t[0].getLiteralValue();return Nm(r)?r:null}function Nm(e){return e==="clsx"||e==="clsx/lite"||e==="tailwind-merge"}function Ei(e){return [...Tm(e),...jm(e)]}function Tm(e){let t=[];for(let r of e.getImportDeclarations()){let o=r.getModuleSpecifierValue();if(!Om(o))continue;let n=r.getDefaultImport();n&&o.startsWith("clsx")&&t.push({identifier:n,localName:n.getText(),importedName:"default",module:o,kind:"esm"});for(let i of r.getNamedImports()){if(r.isTypeOnly()||i.isTypeOnly())continue;let s=i.getAliasNode()??i.getNameNode();Node.isIdentifier(s)&&t.push({identifier:s,localName:s.getText(),importedName:i.getName(),module:o,kind:"esm"});}}return t}function jm(e){let t=[];for(let r of e.getVariableDeclarations()){let o=r.getInitializer();if(!o||!Node.isCallExpression(o))continue;let n=Xt(o);if(!n)continue;let i=r.getNameNode();if(Node.isIdentifier(i)&&n.startsWith("clsx")){t.push({identifier:i,localName:i.getText(),importedName:"default",module:n,kind:"cjs"});continue}if(Node.isObjectBindingPattern(i))for(let s of i.getElements()){let a=s.getNameNode();Node.isIdentifier(a)&&t.push({identifier:a,localName:a.getText(),importedName:s.getPropertyNameNode()?.getText()??a.getText(),module:n,kind:"cjs"});}}return t}function Om(e){return e==="clsx"||e==="clsx/lite"||e==="tailwind-merge"}function Ti(e,t){let r=t==="cn"?"cn":`cn: ${t}`,o=e.getStatements(),n=0;for(;n<o.length;){let i=o[n];if(Node.isExpressionStatement(i)&&Node.isStringLiteral(i.getExpression())){n++;continue}break}e.insertStatements(n,`const { ${r} } = require("cn")`);}function ji(e,t){for(let r of Fm(t)){let o=e.getImportDeclarations().find(i=>i.getModuleSpecifierValue()===r.moduleSpecifier&&!i.getNamespaceImport()&&!i.isTypeOnly());o??=e.addImportDeclaration({moduleSpecifier:r.moduleSpecifier}),o.getNamedImports().some(i=>{let s=i.getAliasNode()?.getText()??i.getNameNode().getText();return i.getName()===r.importedName&&s===r.localName})||o.addNamedImport({name:r.importedName,alias:r.importedName===r.localName?void 0:r.localName,isTypeOnly:r.isTypeOnly});}}function Fm(e){return e.filter((t,r)=>e.findIndex(o=>o.moduleSpecifier===t.moduleSpecifier&&o.importedName===t.importedName&&o.localName===t.localName&&o.isTypeOnly===t.isTypeOnly)===r)}var Zt=["clsx","tailwind-merge","cnfast"],Oi=new Set(["twMerge","twJoin","ClassNameValue"]),Fi=new Map([["extendTailwindMerge","extendTailwindMerge"],["createTailwindMerge","createTwMerge"],["getDefaultConfig","defaultConfig"],["fromTheme","fromTheme"],["validators","validators"],["mergeConfigs","mergeConfigs"],["ConfigExtension","ConfigExtension"],["DefaultClassGroupIds","DefaultClassGroupIds"],["DefaultThemeGroupIds","DefaultThemeGroupIds"]]);function Li(e,t){Lm(e,t),Dm(e,t);}function Lm(e,t){for(let r of e.getDescendantsOfKind(SyntaxKind.CallExpression)){if(r.getExpression().getKind()!==SyntaxKind.ImportKeyword)continue;let o=r.getArguments()[0];if(!o||!Node.isStringLiteral(o))continue;let n=o.getLiteralValue();_i(n)&&t.push({packageName:Di(n),reason:"dynamic imports require manual migration"});}}function Dm(e,t){for(let r of e.getExportDeclarations()){let o=r.getModuleSpecifierValue();if(!o||!_i(o))continue;let n=Di(o),i=r.getNamedExports();if(!i.length){t.push({packageName:n,reason:"export-from declarations require manual migration"});continue}for(let s of i)t.push({packageName:n,symbol:s.getName(),reason:"export-from declarations require manual migration"});}}function qr(e){return Zt.filter(t=>{let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:from\\s*|import\\s*\\(|require\\s*\\()\\s*["']${r}(?:/lite)?["']`).test(e)})}function Xr(e){return e.filter((t,r)=>e.findIndex(o=>o.packageName===t.packageName&&o.symbol===t.symbol&&o.reason===t.reason)===r)}function Di(e){return e.startsWith("clsx")?"clsx":"tailwind-merge"}function _i(e){return e==="clsx"||e==="clsx/lite"||e==="tailwind-merge"}function Bi(e,t,r,o,n){let i=_m(e,t,r,o,n)+Mm(e,r,o);return Li(e,r),ji(e,t),i}function _m(e,t,r,o,n){let i=0;for(let s of [...e.getImportDeclarations()]){let a=s.getModuleSpecifierValue();if(!Bm(a))continue;let c=Ui(a),l=!!s.getImportClause(),p=s.getNamespaceImport();p&&r.push({packageName:c,symbol:p.getText(),reason:"namespace imports cannot be migrated safely"});let f=s.getDefaultImport();f&&(c==="clsx"?(Vi(f,n)&&t.push({moduleSpecifier:a==="clsx/lite"?"cn/lite":"cn",importedName:"clsx",localName:f.getText(),isTypeOnly:false}),s.removeDefaultImport(),o.add("clsx"),i++):r.push({packageName:c,symbol:f.getText(),reason:"tailwind-merge has no compatible default import mapping"}));for(let m of [...s.getNamedImports()]){let d=m.getName(),u=m.getAliasNode()?.getText()??m.getNameNode().getText(),g=s.isTypeOnly()||m.isTypeOnly(),y=Zr(a,d,g);if(!y){r.push({packageName:c,symbol:d,reason:d.startsWith("Experimental")||d==="experimentalParseClassName"?"experimentalParseClassName is not supported by cn":"no compatible cn export is available"});continue}let w=m.getAliasNode()??m.getNameNode();if(!Node.isIdentifier(w)){r.push({packageName:c,symbol:d,reason:"string-named imports cannot be migrated safely"});continue}let x=qt(w,d);if(x){r.push({packageName:c,symbol:d,reason:x});continue}Vi(w,n)&&t.push({...y,localName:u,isTypeOnly:g}),m.remove(),o.add(c),i++;}l&&!s.getDefaultImport()&&!s.getNamespaceImport()&&s.getNamedImports().length===0?s.remove():l||r.push({packageName:c,reason:"side-effect imports are left unchanged"});}return i}function Zr(e,t,r){if(e==="clsx")return {moduleSpecifier:"cn",importedName:t==="default"?"clsx":t};if(e==="clsx/lite")return (t==="clsx"||t==="default")&&!r?{moduleSpecifier:"cn/lite",importedName:"clsx"}:["ClassValue","ClassArray","ClassDictionary"].includes(t)?{moduleSpecifier:"cn",importedName:t}:null;if(Oi.has(t))return {moduleSpecifier:"cn",importedName:t};let o=Fi.get(t);return o?{moduleSpecifier:"cn/config",importedName:o}:null}function Mm(e,t,r){let o=0;for(let n of e.getVariableDeclarations()){let i=n.getInitializer();if(!i||!Node.isCallExpression(i))continue;let s=Xt(i);if(!s)continue;let a=Ui(s),c=n.getNameNode();if(Node.isIdentifier(c)&&s.startsWith("clsx")){dt(c).length?i.replaceWithText(`require(${JSON.stringify(s==="clsx/lite"?"cn/lite":"cn")}).clsx`):Mi(n),r.add("clsx"),o++;continue}if(!Node.isObjectBindingPattern(c)){t.push({packageName:a,reason:"this CommonJS require shape cannot be migrated safely"});continue}let l=c.getElements(),p=l.find(d=>{let u=d.getNameNode(),g=d.getPropertyNameNode()?.getText()??u.getText();return Node.isIdentifier(u)&&qt(u,g)});if(p){let d=p.getNameNode(),u=p.getPropertyNameNode()?.getText()??d.getText();t.push({packageName:a,symbol:u,reason:qt(d,u)});continue}if(l.every(d=>{let u=d.getNameNode();return Node.isIdentifier(u)&&!dt(u).length})){Mi(n),r.add(a),o++;continue}let f=l.map(d=>d.getPropertyNameNode()?.getText()??d.getNameNode().getText()),m=new Set(f.map(d=>Zr(s,d,false)?.moduleSpecifier??null));if(m.size!==1||m.has(null)){t.push({packageName:a,reason:"mixed or unsupported CommonJS exports require manual migration"});continue}i.getArguments()[0].replaceWithText(JSON.stringify(Array.from(m)[0]));for(let d of l){let u=d.getPropertyNameNode()?.getText()??d.getNameNode().getText(),g=Zr(s,u,false);g.importedName!==u&&d.replaceWithText(`${g.importedName}: ${d.getNameNode().getText()}`);}r.add(a),o++;}return o}function Mi(e){let t=e.getVariableStatement();t?.getDeclarations().length===1?t.remove():e.remove();}function Vi(e,t){return dt(e).length>0||Vm(t,e.getText())}function Vm(e,t){if(!e)return false;let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(^|[^a-zA-Z0-9_$])${r}(?=$|[^a-zA-Z0-9_$])`).test(e)}function Ui(e){return e.startsWith("clsx")?"clsx":"tailwind-merge"}function Bm(e){return e==="clsx"||e==="clsx/lite"||e==="tailwind-merge"}function Ji(){let e=new Project({useInMemoryFileSystem:true,compilerOptions:{allowJs:true}});return (t,r="source.tsx")=>{let o=X__default.extname(r).toLowerCase();return o===".vue"||o===".svelte"?Wi(t,Gr(t,r),e):o===".astro"?Wi(t,[...gi(t,r),...Gr(t,r)],e):zi(t,r,e)}}function zi(e,t,r,o=""){let n=r.createSourceFile(hi(t),e,{scriptKind:yi(t),overwrite:true}),i=e.slice(0,n.getStart());i&&n.replaceText([0,i.length],"");let s=[],a=[],c=new Set,l=Ii(n,c),p=Ei(n);l+=bi(n,p,c);let f=Ci(n,p);if(f.length){let u=$i(n,"cn","cnMerge");f.some(y=>y.kind==="esm")?s.push({moduleSpecifier:"cn",importedName:"cn",localName:u,isTypeOnly:false}):Ti(n,u);for(let{outerCall:y,argumentsText:w}of f.reverse())y.replaceWithText(`${u}(${w})`),l++;c.add("clsx"),c.add("tailwind-merge");}l+=Bi(n,s,a,c,o);let m=`${i}${n.getFullText()}`,d={content:m,changes:l,migratedPackages:Array.from(c),remainingPackages:qr(m),unsupported:Xr(a)};return r.removeSourceFile(n),d}function Wi(e,t,r){let o=e,n=0,i=new Set,s=[];for(let a of t.sort((c,l)=>l.start-c.start)){let c=o.slice(a.start,a.end),l=`${o.slice(0,a.start)}${o.slice(a.end)}`,p=zi(c,a.filename,r,l);o=`${o.slice(0,a.start)}${p.content}${o.slice(a.end)}`,n+=p.changes,p.migratedPackages.forEach(f=>i.add(f)),s.push(...p.unsupported);}return {content:o,changes:n,migratedPackages:Array.from(i),remainingPackages:qr(o),unsupported:Xr(s)}}async function eo(e){if(!F.existsSync(X__default.resolve(e.cwd,"package.json")))throw new Error("No `package.json` file found. Ensure you are at the root of your project.");let t=await ui(e.cwd,e.path),r=await Promise.all(t.map(f=>promises.readFile(f,"utf-8"))),o=Ji(),n=t.map((f,m)=>{let d=r[m];return {file:f,content:d,result:o(d,f)}}),i=n.filter(({content:f,result:m})=>f!==m.content),s=n.flatMap(({file:f,result:m})=>m.unsupported.map(d=>({...d,file:f}))),a=new Set(n.flatMap(({result:f})=>f.migratedPackages));if(!i.length){logger.info("No supported clsx, tailwind-merge or cnfast usage found."),Yi(s,e.cwd);return}if(qm(e.cwd,a),!e.yes){let{confirm:f}=await ae({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${highlighter.info(i.length)} file(s) to ${highlighter.info("cn")}${s.length?` and leave ${highlighter.warn(s.length)} item(s) for manual review`:""}. Continue?`});if(!f){logger.info("Migration cancelled.");return}}let c=spinner("Migrating to cn...")?.start();await installDependencies(e.cwd,["cn"]);for(let{file:f,result:m}of i)await promises.writeFile(f,m.content);c?.succeed(`Migrated ${i.length} file${i.length===1?"":"s"}.`);let l=new Set(n.flatMap(({result:f})=>f.remainingPackages)),p=e.path?[]:Zt.filter(f=>a.has(f)&&!l.has(f));if(p.length)try{await removeDependencies(e.cwd,p);}catch{logger.warn(`Could not remove ${p.join(", ")}. Remove them manually after reviewing the migration.`);}e.path&&logger.info("Kept clsx, tailwind-merge and cnfast dependencies because this was a scoped migration."),Yi(s,e.cwd);}function qm(e,t){if(!t.has("tailwind-merge"))return;let r=getPackageInfo(e,false),o=Gi(r,"tailwindcss"),n=Gi(r,"tailwind-merge");if((Ki(o)??4)<4||(Ki(n)??3)<3)throw new Error("The cn migration requires Tailwind CSS v4 and tailwind-merge v3. Tailwind CSS v3 projects should continue using tailwind-merge v2.")}function Gi(e,t){return e?.dependencies?.[t]??e?.devDependencies?.[t]??e?.optionalDependencies?.[t]??e?.peerDependencies?.[t]}function Ki(e){if(!e||/^(?:workspace|file|link|git|https?):/i.test(e))return null;let t=e.match(/(?:^|[^0-9])(\d+)(?:\.|$)/);return t?Number(t[1]):null}function Yi(e,t){if(e.length){logger.break(),logger.warn(`Manual review required for ${e.length} item${e.length===1?"":"s"}:`);for(let r of e){let o=r.file?X__default.relative(t,r.file):"unknown file",n=r.symbol?` (${r.symbol})`:"";logger.warn(` - ${o}${n}: ${r.reason}`);}}}var Ie={...iconLibraries,radix:{name:"radix",title:"Radix Icons",packages:["@radix-ui/react-icons"],import:"import { ICON } from '@radix-ui/react-icons'",usage:"<ICON />",export:"@radix-ui/react-icons"}};async function Qi(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await to(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else {let d=X__default.resolve(o,t.path),u=await promises.stat(d).catch(()=>null);if(!u)throw new Error(`File not found: ${t.path}`);if(u.isDirectory())o=d,r=await to("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else if(u.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 to("**/*.{js,ts,jsx,tsx}",{cwd:o});}let n=await Yo();if(Object.keys(n).length===0)throw new Error("Something went wrong fetching the registry icons.");let i=Object.entries(Ie).map(([m,d])=>({title:d.title,value:m}));for(let m of [t.from,t.to])if(m&&!(m in Ie))throw new Error(`Unknown icon library: ${m}. Available libraries: ${Object.keys(Ie).join(", ")}.`);let s=t.from,a=t.to;if(!s||!a){let m=i.findIndex(u=>u.value===e.iconLibrary),d=await ae([{type:s?null:"select",name:"sourceLibrary",message:`Which icon library would you like to ${highlighter.info("migrate from")}?`,choices:i,initial:m===-1?0:m},{type:a?null:"select",name:"targetLibrary",message:`Which icon library would you like to ${highlighter.info("migrate to")}?`,choices:i}]);s=s??d.sourceLibrary,a=a??d.targetLibrary;}if((!s||!a)&&(logger.info("Migration cancelled."),process.exit(0)),s===a)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");let c=Ie[s],l=Ie[a];if(!t.yes){let m=t.path?t.path:`./${X__default.relative(e.resolvedPaths.cwd,o)}`,{confirm:d}=await ae({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${highlighter.info(r.length)} files in ${highlighter.info(m)} from ${highlighter.info(c.title)} to ${highlighter.info(l.title)}. Continue?`});d||(logger.info("Migration cancelled."),process.exit(0));}await updateDependencies([...l.packages],[],e,{silent:false});let p=spinner("Migrating icons...")?.start(),f=new Map;if(await Promise.all(r.map(async m=>{p.text=`Migrating ${m}...`;let d=X__default.join(o,m),u=await promises.readFile(d,"utf-8"),{content:g,skipped:y}=await id(u,s,a,n);for(let w of y)f.has(w.icon)||f.set(w.icon,w.reason);await promises.writeFile(d,g);})),p.succeed("Migration complete."),t.path||await nd(e,a),f.size>0){logger.break(),logger.warn(`Skipped ${f.size} icon${f.size===1?"":"s"}. These were left untouched:`);for(let[m,d]of Array.from(f))logger.warn(` - ${m}: ${d}`);}}async function nd(e,t){let r=X__default.resolve(e.resolvedPaths.cwd,"components.json");if(!F.existsSync(r))return;let o=await F.readJson(r);o.iconLibrary!==t&&(o.iconLibrary=t,await F.writeJson(r,o,{spaces:2}),logger.info(`Updated ${highlighter.info("iconLibrary")} in components.json to ${highlighter.info(t)}.`));}async function id(e,t,r,o){let n=Ie[t],i=Ie[r],s=b(n.import),a=c(n.usage),c$1=c(i.usage);if(!s)throw new Error(`Could not resolve the icon import for ${n.title}.`);let l=sd(o,t),p=[],f=await promises.mkdtemp(X__default.join(tmpdir(),"shadcn-")),m=new Project({compilerOptions:{}}),d=X__default.join(f,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),u=m.createSourceFile(d,e,{scriptKind:ScriptKind.TSX}),g=[];for(let y of u.getImportDeclarations()??[])if(!(y.getModuleSpecifier()?.getLiteralValue()!==s||y.isTypeOnly())){for(let w of [...y.getNamedImports()??[]]){if(w.isTypeOnly())continue;let x=w.getName(),k=w.getAliasNode()?.getText()??x,N=l.get(x),b=N?o[N]?.[r]:void 0;if(!b){p.push({icon:x,reason:`no ${i.title} equivalent found`});continue}let T=ad(u,k,a);if(T.complex){p.push({icon:x,reason:"unsupported usage (e.g. referenced outside JSX)"});continue}if(c$1.componentName!=="ICON"&&(T.references>0||T.paired>0)){p.push({icon:x,reason:`cannot be wrapped in <${c$1.componentName} />`});continue}w.remove(),cd(u,k,b,a,c$1),g.includes(b)||g.push(b);}y.getNamedImports()?.length===0&&!y.getDefaultImport()&&!y.getNamespaceImport()&&y.remove();}if(a.componentName!=="ICON"&&g.length>0&&fd(u,n.import,a),g.length>0)for(let y of a$1(i.import)){let w=y.namedImports.flatMap(k=>k==="ICON"?g:[k]);!y.namedImports.includes("ICON")&&u.getImportDeclarations().some(k=>k.getModuleSpecifier()?.getLiteralValue()===y.moduleSpecifier&&k.getNamedImports().some(N=>w.includes(N.getName())))||u.addImportDeclaration({moduleSpecifier:y.moduleSpecifier,namedImports:w.map(k=>({name:k}))});}return {content:u.getText(),skipped:p}}function sd(e,t){let r=new Map;for(let[o,n]of Object.entries(e)){let i=n[t];i&&!r.has(i)&&r.set(i,o);}if(t==="lucide")for(let[o,n]of Array.from(r)){let i=o.endsWith("Icon")?o.slice(0,-4):`${o}Icon`;i&&!r.has(i)&&r.set(i,n);}return r}function ad(e,t,r){let o={selfClosing:0,paired:0,references:0,complex:false};for(let n of e.getDescendantsOfKind(SyntaxKind.Identifier)){if(n.getText()!==t||n.getFirstAncestorByKind(SyntaxKind.ImportDeclaration))continue;let i=n.getParent(),s=i?.getKind();if(r.componentName==="ICON"){s===SyntaxKind.JsxSelfClosingElement?o.selfClosing++:s===SyntaxKind.JsxOpeningElement?o.paired++:s===SyntaxKind.JsxClosingElement||(s===SyntaxKind.JsxExpression&&i?.getParent()?.getKind()===SyntaxKind.JsxAttribute?o.references++:o.complex=true);continue}let a=n.getFirstAncestorByKind(SyntaxKind.JsxAttribute),c=n.getFirstAncestorByKind(SyntaxKind.JsxSelfClosingElement);s===SyntaxKind.JsxExpression&&a?.getNameNode().getText()===r.iconAttribute&&c?.getTagNameNode()?.getText()===r.componentName?o.selfClosing++:o.complex=true;}return o}function cd(e,t,r,o,n){if(o.componentName==="ICON"){for(let i of e.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement))i.getTagNameNode()?.getText()===t&&Zi(i,r,o,n);for(let i of e.getDescendantsOfKind(SyntaxKind.JsxElement)){let s=i.getOpeningElement();s.getTagNameNode()?.getText()===t&&(ld(s,o,n),s.getTagNameNode()?.replaceWithText(r),i.getClosingElement().getTagNameNode()?.replaceWithText(r));}for(let i of e.getDescendantsOfKind(SyntaxKind.Identifier)){if(i.getText()!==t||i.getFirstAncestorByKind(SyntaxKind.ImportDeclaration))continue;let s=i.getParent();s?.getKind()===SyntaxKind.JsxExpression&&s?.getParent()?.getKind()===SyntaxKind.JsxAttribute&&i.replaceWithText(r);}return}for(let i of e.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement)){if(i.getTagNameNode()?.getText()!==o.componentName||!o.iconAttribute)continue;let s=i.getAttribute(o.iconAttribute);!s||s.getKind()!==SyntaxKind.JsxAttribute||s.asKindOrThrow(SyntaxKind.JsxAttribute).getInitializer()?.getText()!==`{${t}}`||Zi(i,r,o,n,{excludeAttribute:o.iconAttribute});}}function Zi(e,t,r,o,n={}){let i=r.componentName==="ICON"&&Object.keys(r.attributes).length===0,s=o.componentName==="ICON"&&Object.keys(o.attributes).length===0;if(i&&s){e.getTagNameNode()?.replaceWithText(t);return}let a=e.getAttributes().filter(f=>{if(f.getKind()!==SyntaxKind.JsxAttribute)return true;let m=f.asKindOrThrow(SyntaxKind.JsxAttribute),d=m.getNameNode().getText();return d===n.excludeAttribute?false:r.attributes[d]!==(m.getInitializer()?.getText()??"")}).map(f=>f.getText()),c=new Set(e.getAttributes().filter(f=>f.getKind()===SyntaxKind.JsxAttribute).map(f=>f.asKindOrThrow(SyntaxKind.JsxAttribute).getNameNode().getText())),l=Object.entries(o.attributes).filter(([f])=>!c.has(f)).map(([f,m])=>`${f}=${m}`),p=o.componentName==="ICON"?[t,...l,...a]:[o.componentName,`${o.iconAttribute}={${t}}`,...l,...a];e.replaceWithText(`<${p.join(" ")} />`);}function ld(e,t,r){for(let[o,n]of Object.entries(t.attributes)){let i=e.getAttribute(o);i?.getKind()===SyntaxKind.JsxAttribute&&(i.asKindOrThrow(SyntaxKind.JsxAttribute).getInitializer()?.getText()??"")===n&&i.remove();}for(let[o,n]of Object.entries(r.attributes))e.getAttribute(o)||e.addAttribute({name:o,initializer:n});}function fd(e,t,r){let o=r.componentName;if(e.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).some(s=>s.getTagNameNode()?.getText()===o)||e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement).some(s=>s.getTagNameNode()?.getText()===o))return;let i=a$1(t).filter(s=>!s.namedImports.includes("ICON")).map(s=>s.moduleSpecifier);for(let s of e.getImportDeclarations()??[])if(i.includes(s.getModuleSpecifier()?.getLiteralValue()??"")){for(let a of [...s.getNamedImports()??[]])a.getName()===o&&a.remove();s.getNamedImports()?.length===0&&!s.getDefaultImport()&&!s.getNamespaceImport()&&s.remove();}}function ud(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function gd(e,t,r,o){let i=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of i){let a=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=s.match(/^(\w+)\s+as\s+(\w+)$/);if(a){let l=a[1],p=a[2];o==="slot"&&l==="Slot"&&!p?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:l,alias:p,isType:true});}else if(c){let l=c[1],p=c[2];o==="slot"&&l==="Slot"&&p==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:l,alias:p,isType:t});}else o==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t});}}async function ts(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await to(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"],suppressErrors:true});else {let c=X__default.resolve(o,t.path),l=await promises.stat(c).catch(()=>null);if(!l)throw new Error(`File not found: ${t.path}`);if(l.isDirectory())o=c,r=await to("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"],suppressErrors:true});else if(l.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else {if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");o=e.resolvedPaths.ui,r=await to("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,suppressErrors:true});}if(!t.yes){let a=t.path?t.path:`./${X__default.relative(e.resolvedPaths.cwd,o)}`,{confirm:c}=await ae({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${highlighter.info(r.length)} file(s) in ${highlighter.info(a)} to ${highlighter.info("radix-ui")}. Continue?`});c||(logger.info("Migration cancelled."),process.exit(0));}let n=spinner("Migrating imports...")?.start(),i=new Set;await Promise.all(r.map(async a=>{n.text=`Migrating ${a}...`;let c=X__default.join(o,a),l=await promises.readFile(c,"utf-8"),{content:p,replacedPackages:f}=await hd(l);f.forEach(m=>i.add(m)),await promises.writeFile(c,p);})),n.succeed("Migrating imports.");let s=spinner("Updating package.json...")?.start();try{let a=getPackageInfo(e.resolvedPaths.cwd,!1);if(!a){s.fail("Could not read package.json"),logger.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(i);if(c.length>0){if(a.dependencies||(a.dependencies={}),a.dependencies?.["radix-ui"]||a.devDependencies?.["radix-ui"])s.succeed("radix-ui already in package.json.");else {a.dependencies["radix-ui"]="latest";let p=X__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(p,JSON.stringify(a,null,2)+`
131
- `),s.succeed("Updated package.json."),await updateDependencies(["radix-ui"],[],e,{silent:!1});}logger.info(""),logger.info("Migration complete. The following packages may be removed if no longer in use:"),logger.info(highlighter.info(c.join(", "))),logger.info("Please review your codebase before removing.");}else s.succeed("No packages found in source files.");}catch{s.fail("Failed to update package.json"),logger.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function hd(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],o=[],n=[],i='"',s=false,a=e,c;for(;(c=t.exec(e))!==null;){let[u,g,y,w,x,k,N]=c;if(k==="icons"||k.startsWith("icons/"))continue;o.push(u),o.length===1&&(i=x,s=N===";"),n.push(`@radix-ui/react-${k}`);let b=!!g;if(y){let T=ud(k);r.push({name:T,alias:y,isType:b});}else w&&gd(w,b,r,k);}if(r.length===0)return {content:e,replacedPackages:[]};let l=r.filter((u,g,y)=>g===y.findIndex(w=>w.name===u.name&&w.alias===u.alias&&w.isType===u.isType)),f=`import { ${l.map(u=>{let g=u.isType?"type ":"";return u.alias?`${g}${u.name} as ${u.alias}`:`${g}${u.name}`}).join(", ")} } from ${i}radix-ui${i}${s?";":""}`;a=o.reduce((u,g,y)=>u.replace(g,y===0?f:""),a),a=a.replace(/\n\s*\n\s*\n/g,`
129
+ args = ["shadcn@${ve}", "mcp"]`),logger.break(),logger.info("3. Restart Codex to load the MCP server"),logger.break(),process.exit(0);}let a=spinner("Configuring MCP server...").start(),c=await mm(i);if(a.succeed("Configuring MCP server."),s)await updateDependencies([],Ht,s,{silent:!1});else {let l=await getPackageManager(i.cwd),p=l==="npm"?"install":"add",f=l==="npm"?"--save-dev":"-D",m=spinner("Installing dependencies...").start();await execa(l,[p,f,...Ht],{cwd:i.cwd}),m.succeed("Installing dependencies.");}logger.break(),logger.success(`Configuration saved to ${c}.`),logger.break();}catch(r){k(r);}});var pm=(e,t)=>t;async function mm(e){let{client:t,cwd:r}=e,o=Gt.find(c=>c.name===t);if(!o)throw new Error(`Unknown client: ${t}. Available clients: ${Gt.map(c=>c.name).join(", ")}`);let n=X__default.join(r,o.configPath),i=X__default.dirname(n);await F.ensureDir(i);let s={};try{let c=await promises.readFile(n,"utf-8");s=JSON.parse(c);}catch{}let a=$o(s,o.config,{arrayMerge:pm});return await promises.writeFile(n,JSON.stringify(a,null,2)+`
130
+ `,"utf-8"),o.configPath}async function di(e,t={}){if(!e.resolvedPaths.tailwindCss)throw new Error("We could not find a valid CSS file in your `components.json` file. Please ensure you have a valid `tailwind.css` path in your `components.json` file.");if(!e.tailwind.cssVariables)throw new Error("The `base-color` migration requires CSS variables. Your `components.json` has `cssVariables: false`, which uses inline Tailwind color classes instead of theme variables.");let r=BASE_COLORS.map(w=>({title:w.label,value:w.name})),o=BASE_COLORS.map(w=>w.name);if(t.to&&!o.includes(t.to))throw new Error(`Unknown base color: ${t.to}. Available base colors: ${o.join(", ")}.`);let n=t.from||e.tailwind.baseColor,i=t.to;if(!n||!i){let w=r.findIndex(b=>b.value===e.tailwind.baseColor),x=await ae([{type:n?null:"select",name:"sourceBaseColor",message:`Which base color would you like to ${highlighter.info("migrate from")}?`,choices:r,initial:w===-1?0:w},{type:i?null:"select",name:"targetBaseColor",message:`Which base color would you like to ${highlighter.info("migrate to")}?`,choices:r}]);n=n||x.sourceBaseColor,i=i||x.targetBaseColor;}if((!n||!i)&&(logger.info("Migration cancelled."),process.exit(0)),n===i)throw new Error("You cannot migrate to the same base color. Please choose a different base color.");if(!t.yes){let w=`./${X__default.relative(e.resolvedPaths.cwd,e.resolvedPaths.tailwindCss)}`,{confirm:x}=await ae({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${highlighter.info(w)} from ${highlighter.info(n)} to ${highlighter.info(i)}. Continue?`});x||(logger.info("Migration cancelled."),process.exit(0));}let s=await getRegistryBaseColor(n),a=await getRegistryBaseColor(i);if(!s)throw new Error(`Unknown base color: ${n}.`);if(!a)throw new Error("Something went wrong fetching the base colors.");let l=(await getProjectInfo(e.resolvedPaths.cwd))?.tailwindVersion??"v4",p=pi(s,l),f=pi(a,l),m=spinner("Migrating base color...")?.start(),d=await promises.readFile(e.resolvedPaths.tailwindCss,"utf-8"),{cssVars:u,skipped:g}=xm(d,p,f,l);(Object.keys(u.light).length>0||Object.keys(u.dark).length>0)&&await updateCssVars(u,e,{overwriteCssVars:true,tailwindVersion:l,silent:true}),m.succeed("Migration complete."),await Cm(e,i);let y=new Map;for(let{token:w,reason:x}of g)y.has(w)||y.set(w,x);if(y.size>0){logger.break(),logger.warn(`Skipped ${y.size} token${y.size===1?"":"s"}. These were left untouched:`);for(let[w,x]of Array.from(y))logger.warn(` - ${w}: ${x}`);}}function xm(e,t,r,o){let n=km(e),i={},s={},a=[],c=[{mode:"light",selector:":root",target:i},{mode:"dark",selector:".dark",target:s}];for(let{mode:l,selector:p,target:f}of c)for(let[m,d]of Object.entries(t[l]??{})){let u=r[l]?.[m];if(u===void 0||Kt(d)===Kt(u))continue;let g=`--${m.replace(/^--/,"")}`,y=n[p][g];if(y===void 0){a.push({token:g,reason:"not found in your CSS"});continue}Kt(y)===Kt(bm(d,o))?f[m]=u:a.push({token:g,reason:"does not match the source base color"});}return {cssVars:{light:i,dark:s},skipped:a}}function pi(e,t){return t==="v4"&&e.cssVarsV4?e.cssVarsV4:e.cssVars}function km(e){let t={":root":{},".dark":{}};return lp.parse(e).walkRules(r=>{r.selector!==":root"&&r.selector!==".dark"||r.walkDecls(o=>{o.prop.startsWith("--")&&(t[r.selector][o.prop]=o.value);});}),t}function bm(e,t){return t==="v4"&&isLocalHSLValue(e)?`hsl(${e})`:e}function Kt(e){return e.trim().replace(/\s+/g," ")}async function Cm(e,t){let r=X__default.resolve(e.resolvedPaths.cwd,"components.json");if(!F.existsSync(r))return;let o=await F.readJson(r);o.tailwind?.baseColor!==t&&(o.tailwind={...o.tailwind,baseColor:t},await F.writeJson(r,o,{spaces:2}),logger.info(`Updated ${highlighter.info("baseColor")} in components.json to ${highlighter.info(t)}.`));}var Rm="**/*.{js,jsx,ts,tsx,mjs,mts,cjs,cts,vue,svelte,astro}",Pm=["**/node_modules/**","**/.git/**","**/.next/**","**/.nuxt/**","**/.svelte-kit/**","**/.astro/**","**/.output/**","**/.vercel/**","**/dist/**","**/build/**","**/out/**","**/coverage/**"];async function ui(e,t){if(!t)return zr(e);if(t.includes("*")){let n=await zr(e,t);if(!n.length)throw new Error(`No files found matching: ${t}`);return n}let r=X__default.resolve(e,t),o=await promises.stat(r).catch(()=>null);if(!o)throw new Error(`File not found: ${t}`);if(o.isFile())return [r];if(o.isDirectory()){let n=await zr(r);if(!n.length)throw new Error(`No files found matching: ${t}`);return n}throw new Error(`Unsupported path type: ${t}`)}function zr(e,t=Rm){return to(t,{cwd:e,absolute:true,onlyFiles:true,ignore:Pm,suppressErrors:true,dot:true})}function Gr(e,t){let r=[],o=/<script\b([^>]*)>([\s\S]*?)<\/script(?:\s[^>]*)?>/gi,n;for(;(n=o.exec(e))!==null;){let i=n[1],s=n[2],a=n[0].indexOf(s),c=i.match(/\blang=["'](js|jsx|ts|tsx)["']/i)?.[1];r.push({start:n.index+a,end:n.index+a+s.length,filename:`${t}.${r.length}.${c?.toLowerCase()??"js"}`});}return r}function gi(e,t){let r=e.match(/^(?:\uFEFF)?---[\t ]*\r?\n([\s\S]*?)\r?\n---/);if(!r||r.index===void 0)return [];let o=r[1],n=r[0].indexOf(o);return [{start:r.index+n,end:r.index+n+o.length,filename:`${t}.frontmatter.ts`}]}function hi(e){let t=X__default.basename(e).replace(/[^a-zA-Z0-9_.-]/g,"-");return t.match(/\.(?:js|jsx|ts|tsx|mjs|mts|cjs|cts)$/)?`/${t}`:`/${t}.tsx`}function yi(e){switch(X__default.extname(e).toLowerCase()){case ".ts":case ".mts":case ".cts":return ScriptKind.TS;case ".tsx":return ScriptKind.TSX;case ".jsx":return ScriptKind.JSX;default:return ScriptKind.JS}}function bi(e,t,r){let o=Si(t).filter(a=>a.kind==="esm"),n=vi(t).filter(a=>a.kind==="esm"),i=0,s=[];for(let a of e.getFunctions()){let c=a.getNameNode();if(!c)continue;let l=wi(a);l&&s.push({statement:a,name:c,...l,isInlineExport:a.isExported()&&!a.isDefaultExport(),isDefaultExport:a.isDefaultExport()});}for(let a of e.getVariableStatements()){if(a.getDeclarations().length!==1)continue;let c=a.getDeclarations()[0],l=c.getNameNode(),p=c.getInitializer();if(!Node.isIdentifier(l)||!Node.isArrowFunction(p)&&!Node.isFunctionExpression(p))continue;let f=wi(p);f&&s.push({statement:a,name:l,...f,isInlineExport:a.isExported(),isDefaultExport:false});}for(let a of s){if(!Im(a.expression,a.restName,o,n))continue;let c=a.name.findReferencesAsNodes(),l=c.map(m=>m.getParentIfKind(SyntaxKind.ExportSpecifier)).filter(m=>m!==void 0);if(c.length!==l.length||!a.isInlineExport&&!a.isDefaultExport&&!l.length)continue;let p=new Set;a.isInlineExport&&p.add(a.name.getText()),a.isDefaultExport&&p.add("default");for(let m of l){p.add(m.getAliasNode()?.getText()??m.getNameNode().getText());let d=m.getExportDeclaration();d.getNamedExports().length===1?d.remove():m.remove();}let f=e.getStatements().findIndex(m=>m===a.statement);a.statement.remove(),e.insertExportDeclaration(Math.max(f,0),{moduleSpecifier:"cn",namedExports:Array.from(p).map(m=>({name:"cn",alias:m==="cn"?void 0:m}))}),r.add("clsx"),r.add("tailwind-merge"),i++;}return i}function wi(e){let t=e.getParameters();if(t.length!==1||!t[0].isRestParameter())return null;let r=t[0].getNameNode(),o=e.getBody();if(!Node.isIdentifier(r)||!o)return null;if(!Node.isBlock(o))return {expression:o,restName:r.getText()};let n=o.getStatements();if(n.length!==1||!Node.isReturnStatement(n[0]))return null;let i=n[0].getExpression();return i?{expression:i,restName:r.getText()}:null}function Im(e,t,r,o){if(!Node.isCallExpression(e)||!xi(e,o))return false;let n=e.getArguments();if(n.length!==1||!Node.isCallExpression(n[0])||!xi(n[0],r))return false;let i=n[0].getArguments();if(i.length!==1)return false;let s=i[0];return Node.isIdentifier(s)?s.getText()===t:Node.isSpreadElement(s)&&Node.isIdentifier(s.getExpression())&&s.getExpression().getText()===t}function Ci(e,t){let r=Si(t),o=vi(t),n=[];for(let i of e.getDescendantsOfKind(SyntaxKind.CallExpression)){let s=Kr(i,o);if(!s)continue;let a=false,c=i.getArguments().flatMap(l=>{let p=Kr(l,r);if(!p||p.kind!==s.kind)return [l.getText()];a=true;let f=$m(l);return f?[f]:[]});a&&n.push({outerCall:i,argumentsText:c.join(", "),kind:s.kind});}return n}function Si(e){return e.filter(t=>t.module.startsWith("clsx")&&(t.importedName==="default"||t.importedName==="clsx"))}function vi(e){return e.filter(t=>t.module==="tailwind-merge"&&t.importedName==="twMerge")}function xi(e,t){return Kr(e,t)!==null}function Kr(e,t){if(!Node.isCallExpression(e))return null;let r=e.getExpression();return Node.isIdentifier(r)?t.find(o=>o.localName===r.getText()&&o.identifier.findReferencesAsNodes().some(n=>n.getStart()===r.getStart()))??null:null}function $m(e){return Node.isCallExpression(e)?e.getArguments().map(t=>Node.isIdentifier(t)&&t.getFirstAncestor(n=>Node.isFunctionLikeDeclaration(n))?.getParameters().find(n=>n.isRestParameter()&&n.getNameNode().getText()===t.getText())?`...${t.getText()}`:t.getText()).join(", "):""}function Ii(e,t){let r=0;for(let o of e.getImportDeclarations())o.getModuleSpecifierValue()==="cnfast"&&(o.setModuleSpecifier("cn"),r++);for(let o of e.getExportDeclarations())o.getModuleSpecifierValue()==="cnfast"&&(o.setModuleSpecifier("cn"),r++);for(let o of e.getDescendantsOfKind(SyntaxKind.CallExpression)){let n=o.getExpression();if(n.getKind()!==SyntaxKind.ImportKeyword&&(!Node.isIdentifier(n)||n.getText()!=="require"))continue;let i=o.getArguments()[0];Node.isStringLiteral(i)&&i.getLiteralValue()==="cnfast"&&(i.replaceWithText('"cn"'),r++);}return r&&t.add("cnfast"),r}function dt(e){let t=e.getSymbol()?.compilerSymbol,r=e.getSourceFile().getDescendantsOfKind(SyntaxKind.Identifier).filter(n=>n!==e),o=r.filter(n=>t&&n.getSymbol()?.compilerSymbol===t);for(let n of e.findReferencesAsNodes()){let i=r.find(s=>s.getStart()===n.getStart()&&s.getText()===n.getText());i&&!o.includes(i)&&o.push(i);}return o}function qt(e,t){let r=dt(e);return t==="validators"&&r.some(n=>{let i=n.getParentIfKind(SyntaxKind.PropertyAccessExpression);if(i){let a=i.getParentIfKind(SyntaxKind.CallExpression);if(a!==void 0&&a.getExpression().getStart()===i.getStart())return true}let s=n.getParentIfKind(SyntaxKind.VariableDeclaration);return s!==void 0&&Node.isObjectBindingPattern(s.getNameNode())&&s.getInitializer()?.getStart()===n.getStart()})?"callable validators are not supported by cn":t==="createTailwindMerge"&&r.some(n=>{let i=n.getParentIfKind(SyntaxKind.CallExpression);return i!==void 0&&i.getExpression().getStart()===n.getStart()&&i.getArguments().length>1})?"variadic createTailwindMerge calls are not supported by cn":null}function $i(e,t,r){let o=new Set(e.getDescendantsOfKind(SyntaxKind.Identifier).map(i=>i.getText()));if(!o.has(t))return t;if(!o.has(r))return r;let n=2;for(;o.has(`${r}${n}`);)n++;return `${r}${n}`}function Xt(e){if(!Node.isCallExpression(e)||e.getExpression().getText()!=="require")return null;let t=e.getArguments();if(t.length!==1||!Node.isStringLiteral(t[0]))return null;let r=t[0].getLiteralValue();return Em(r)?r:null}function Em(e){return e==="clsx"||e==="clsx/lite"||e==="tailwind-merge"}function Ei(e){return [...Nm(e),...Tm(e)]}function Nm(e){let t=[];for(let r of e.getImportDeclarations()){let o=r.getModuleSpecifierValue();if(!jm(o))continue;let n=r.getDefaultImport();n&&o.startsWith("clsx")&&t.push({identifier:n,localName:n.getText(),importedName:"default",module:o,kind:"esm"});for(let i of r.getNamedImports()){if(r.isTypeOnly()||i.isTypeOnly())continue;let s=i.getAliasNode()??i.getNameNode();Node.isIdentifier(s)&&t.push({identifier:s,localName:s.getText(),importedName:i.getName(),module:o,kind:"esm"});}}return t}function Tm(e){let t=[];for(let r of e.getVariableDeclarations()){let o=r.getInitializer();if(!o||!Node.isCallExpression(o))continue;let n=Xt(o);if(!n)continue;let i=r.getNameNode();if(Node.isIdentifier(i)&&n.startsWith("clsx")){t.push({identifier:i,localName:i.getText(),importedName:"default",module:n,kind:"cjs"});continue}if(Node.isObjectBindingPattern(i))for(let s of i.getElements()){let a=s.getNameNode();Node.isIdentifier(a)&&t.push({identifier:a,localName:a.getText(),importedName:s.getPropertyNameNode()?.getText()??a.getText(),module:n,kind:"cjs"});}}return t}function jm(e){return e==="clsx"||e==="clsx/lite"||e==="tailwind-merge"}function Ti(e,t){let r=t==="cn"?"cn":`cn: ${t}`,o=e.getStatements(),n=0;for(;n<o.length;){let i=o[n];if(Node.isExpressionStatement(i)&&Node.isStringLiteral(i.getExpression())){n++;continue}break}e.insertStatements(n,`const { ${r} } = require("cn")`);}function ji(e,t){for(let r of Om(t)){let o=e.getImportDeclarations().find(i=>i.getModuleSpecifierValue()===r.moduleSpecifier&&!i.getNamespaceImport()&&!i.isTypeOnly());o??=e.addImportDeclaration({moduleSpecifier:r.moduleSpecifier}),o.getNamedImports().some(i=>{let s=i.getAliasNode()?.getText()??i.getNameNode().getText();return i.getName()===r.importedName&&s===r.localName})||o.addNamedImport({name:r.importedName,alias:r.importedName===r.localName?void 0:r.localName,isTypeOnly:r.isTypeOnly});}}function Om(e){return e.filter((t,r)=>e.findIndex(o=>o.moduleSpecifier===t.moduleSpecifier&&o.importedName===t.importedName&&o.localName===t.localName&&o.isTypeOnly===t.isTypeOnly)===r)}var Zt=["clsx","tailwind-merge","cnfast"],Oi=new Set(["twMerge","twJoin","ClassNameValue"]),Fi=new Map([["extendTailwindMerge","extendTailwindMerge"],["createTailwindMerge","createTwMerge"],["getDefaultConfig","defaultConfig"],["fromTheme","fromTheme"],["validators","validators"],["mergeConfigs","mergeConfigs"],["ConfigExtension","ConfigExtension"],["DefaultClassGroupIds","DefaultClassGroupIds"],["DefaultThemeGroupIds","DefaultThemeGroupIds"]]);function Li(e,t){Am(e,t),Lm(e,t);}function Am(e,t){for(let r of e.getDescendantsOfKind(SyntaxKind.CallExpression)){if(r.getExpression().getKind()!==SyntaxKind.ImportKeyword)continue;let o=r.getArguments()[0];if(!o||!Node.isStringLiteral(o))continue;let n=o.getLiteralValue();_i(n)&&t.push({packageName:Di(n),reason:"dynamic imports require manual migration"});}}function Lm(e,t){for(let r of e.getExportDeclarations()){let o=r.getModuleSpecifierValue();if(!o||!_i(o))continue;let n=Di(o),i=r.getNamedExports();if(!i.length){t.push({packageName:n,reason:"export-from declarations require manual migration"});continue}for(let s of i)t.push({packageName:n,symbol:s.getName(),reason:"export-from declarations require manual migration"});}}function qr(e){return Zt.filter(t=>{let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:from\\s*|import\\s*\\(|require\\s*\\()\\s*["']${r}(?:/lite)?["']`).test(e)})}function Xr(e){return e.filter((t,r)=>e.findIndex(o=>o.packageName===t.packageName&&o.symbol===t.symbol&&o.reason===t.reason)===r)}function Di(e){return e.startsWith("clsx")?"clsx":"tailwind-merge"}function _i(e){return e==="clsx"||e==="clsx/lite"||e==="tailwind-merge"}function Bi(e,t,r,o,n){let i=Dm(e,t,r,o,n)+_m(e,r,o);return Li(e,r),ji(e,t),i}function Dm(e,t,r,o,n){let i=0;for(let s of [...e.getImportDeclarations()]){let a=s.getModuleSpecifierValue();if(!Vm(a))continue;let c=Ui(a),l=!!s.getImportClause(),p=s.getNamespaceImport();p&&r.push({packageName:c,symbol:p.getText(),reason:"namespace imports cannot be migrated safely"});let f=s.getDefaultImport();f&&(c==="clsx"?(Vi(f,n)&&t.push({moduleSpecifier:a==="clsx/lite"?"cn/lite":"cn",importedName:"clsx",localName:f.getText(),isTypeOnly:false}),s.removeDefaultImport(),o.add("clsx"),i++):r.push({packageName:c,symbol:f.getText(),reason:"tailwind-merge has no compatible default import mapping"}));for(let m of [...s.getNamedImports()]){let d=m.getName(),u=m.getAliasNode()?.getText()??m.getNameNode().getText(),g=s.isTypeOnly()||m.isTypeOnly(),y=Zr(a,d,g);if(!y){r.push({packageName:c,symbol:d,reason:d.startsWith("Experimental")||d==="experimentalParseClassName"?"experimentalParseClassName is not supported by cn":"no compatible cn export is available"});continue}let w=m.getAliasNode()??m.getNameNode();if(!Node.isIdentifier(w)){r.push({packageName:c,symbol:d,reason:"string-named imports cannot be migrated safely"});continue}let x=qt(w,d);if(x){r.push({packageName:c,symbol:d,reason:x});continue}Vi(w,n)&&t.push({...y,localName:u,isTypeOnly:g}),m.remove(),o.add(c),i++;}l&&!s.getDefaultImport()&&!s.getNamespaceImport()&&s.getNamedImports().length===0?s.remove():l||r.push({packageName:c,reason:"side-effect imports are left unchanged"});}return i}function Zr(e,t,r){if(e==="clsx")return {moduleSpecifier:"cn",importedName:t==="default"?"clsx":t};if(e==="clsx/lite")return (t==="clsx"||t==="default")&&!r?{moduleSpecifier:"cn/lite",importedName:"clsx"}:["ClassValue","ClassArray","ClassDictionary"].includes(t)?{moduleSpecifier:"cn",importedName:t}:null;if(Oi.has(t))return {moduleSpecifier:"cn",importedName:t};let o=Fi.get(t);return o?{moduleSpecifier:"cn/config",importedName:o}:null}function _m(e,t,r){let o=0;for(let n of e.getVariableDeclarations()){let i=n.getInitializer();if(!i||!Node.isCallExpression(i))continue;let s=Xt(i);if(!s)continue;let a=Ui(s),c=n.getNameNode();if(Node.isIdentifier(c)&&s.startsWith("clsx")){dt(c).length?i.replaceWithText(`require(${JSON.stringify(s==="clsx/lite"?"cn/lite":"cn")}).clsx`):Mi(n),r.add("clsx"),o++;continue}if(!Node.isObjectBindingPattern(c)){t.push({packageName:a,reason:"this CommonJS require shape cannot be migrated safely"});continue}let l=c.getElements(),p=l.find(d=>{let u=d.getNameNode(),g=d.getPropertyNameNode()?.getText()??u.getText();return Node.isIdentifier(u)&&qt(u,g)});if(p){let d=p.getNameNode(),u=p.getPropertyNameNode()?.getText()??d.getText();t.push({packageName:a,symbol:u,reason:qt(d,u)});continue}if(l.every(d=>{let u=d.getNameNode();return Node.isIdentifier(u)&&!dt(u).length})){Mi(n),r.add(a),o++;continue}let f=l.map(d=>d.getPropertyNameNode()?.getText()??d.getNameNode().getText()),m=new Set(f.map(d=>Zr(s,d,false)?.moduleSpecifier??null));if(m.size!==1||m.has(null)){t.push({packageName:a,reason:"mixed or unsupported CommonJS exports require manual migration"});continue}i.getArguments()[0].replaceWithText(JSON.stringify(Array.from(m)[0]));for(let d of l){let u=d.getPropertyNameNode()?.getText()??d.getNameNode().getText(),g=Zr(s,u,false);g.importedName!==u&&d.replaceWithText(`${g.importedName}: ${d.getNameNode().getText()}`);}r.add(a),o++;}return o}function Mi(e){let t=e.getVariableStatement();t?.getDeclarations().length===1?t.remove():e.remove();}function Vi(e,t){return dt(e).length>0||Mm(t,e.getText())}function Mm(e,t){if(!e)return false;let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(^|[^a-zA-Z0-9_$])${r}(?=$|[^a-zA-Z0-9_$])`).test(e)}function Ui(e){return e.startsWith("clsx")?"clsx":"tailwind-merge"}function Vm(e){return e==="clsx"||e==="clsx/lite"||e==="tailwind-merge"}function Ji(){let e=new Project({useInMemoryFileSystem:true,compilerOptions:{allowJs:true}});return (t,r="source.tsx")=>{let o=X__default.extname(r).toLowerCase();return o===".vue"||o===".svelte"?Wi(t,Gr(t,r),e):o===".astro"?Wi(t,[...gi(t,r),...Gr(t,r)],e):zi(t,r,e)}}function zi(e,t,r,o=""){let n=r.createSourceFile(hi(t),e,{scriptKind:yi(t),overwrite:true}),i=e.slice(0,n.getStart());i&&n.replaceText([0,i.length],"");let s=[],a=[],c=new Set,l=Ii(n,c),p=Ei(n);l+=bi(n,p,c);let f=Ci(n,p);if(f.length){let u=$i(n,"cn","cnMerge");f.some(y=>y.kind==="esm")?s.push({moduleSpecifier:"cn",importedName:"cn",localName:u,isTypeOnly:false}):Ti(n,u);for(let{outerCall:y,argumentsText:w}of f.reverse())y.replaceWithText(`${u}(${w})`),l++;c.add("clsx"),c.add("tailwind-merge");}l+=Bi(n,s,a,c,o);let m=`${i}${n.getFullText()}`,d={content:m,changes:l,migratedPackages:Array.from(c),remainingPackages:qr(m),unsupported:Xr(a)};return r.removeSourceFile(n),d}function Wi(e,t,r){let o=e,n=0,i=new Set,s=[];for(let a of t.sort((c,l)=>l.start-c.start)){let c=o.slice(a.start,a.end),l=`${o.slice(0,a.start)}${o.slice(a.end)}`,p=zi(c,a.filename,r,l);o=`${o.slice(0,a.start)}${p.content}${o.slice(a.end)}`,n+=p.changes,p.migratedPackages.forEach(f=>i.add(f)),s.push(...p.unsupported);}return {content:o,changes:n,migratedPackages:Array.from(i),remainingPackages:qr(o),unsupported:Xr(s)}}async function eo(e){if(!F.existsSync(X__default.resolve(e.cwd,"package.json")))throw new Error("No `package.json` file found. Ensure you are at the root of your project.");let t=await ui(e.cwd,e.path),r=await Promise.all(t.map(f=>promises.readFile(f,"utf-8"))),o=Ji(),n=t.map((f,m)=>{let d=r[m];return {file:f,content:d,result:o(d,f)}}),i=n.filter(({content:f,result:m})=>f!==m.content),s=n.flatMap(({file:f,result:m})=>m.unsupported.map(d=>({...d,file:f}))),a=new Set(n.flatMap(({result:f})=>f.migratedPackages));if(!i.length){logger.info("No supported clsx, tailwind-merge or cnfast usage found."),Yi(s,e.cwd);return}if(Ym(e.cwd,a),!e.yes){let{confirm:f}=await ae({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${highlighter.info(i.length)} file(s) to ${highlighter.info("cn")}${s.length?` and leave ${highlighter.warn(s.length)} item(s) for manual review`:""}. Continue?`});if(!f){logger.info("Migration cancelled.");return}}let c=spinner("Migrating to cn...")?.start();await installDependencies(e.cwd,["cn"]);for(let{file:f,result:m}of i)await promises.writeFile(f,m.content);c?.succeed(`Migrated ${i.length} file${i.length===1?"":"s"}.`);let l=new Set(n.flatMap(({result:f})=>f.remainingPackages)),p=e.path?[]:Zt.filter(f=>a.has(f)&&!l.has(f));if(p.length)try{await removeDependencies(e.cwd,p);}catch{logger.warn(`Could not remove ${p.join(", ")}. Remove them manually after reviewing the migration.`);}e.path&&logger.info("Kept clsx, tailwind-merge and cnfast dependencies because this was a scoped migration."),Yi(s,e.cwd);}function Ym(e,t){if(!t.has("tailwind-merge"))return;let r=getPackageInfo(e,false),o=Gi(r,"tailwindcss"),n=Gi(r,"tailwind-merge");if((Ki(o)??4)<4||(Ki(n)??3)<3)throw new Error("The cn migration requires Tailwind CSS v4 and tailwind-merge v3. Tailwind CSS v3 projects should continue using tailwind-merge v2.")}function Gi(e,t){return e?.dependencies?.[t]??e?.devDependencies?.[t]??e?.optionalDependencies?.[t]??e?.peerDependencies?.[t]}function Ki(e){if(!e||/^(?:workspace|file|link|git|https?):/i.test(e))return null;let t=e.match(/(?:^|[^0-9])(\d+)(?:\.|$)/);return t?Number(t[1]):null}function Yi(e,t){if(e.length){logger.break(),logger.warn(`Manual review required for ${e.length} item${e.length===1?"":"s"}:`);for(let r of e){let o=r.file?X__default.relative(t,r.file):"unknown file",n=r.symbol?` (${r.symbol})`:"";logger.warn(` - ${o}${n}: ${r.reason}`);}}}var Ie={...iconLibraries,radix:{name:"radix",title:"Radix Icons",packages:["@radix-ui/react-icons"],import:"import { ICON } from '@radix-ui/react-icons'",usage:"<ICON />",export:"@radix-ui/react-icons"}};async function Qi(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await to(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else {let d=X__default.resolve(o,t.path),u=await promises.stat(d).catch(()=>null);if(!u)throw new Error(`File not found: ${t.path}`);if(u.isDirectory())o=d,r=await to("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"]});else if(u.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 to("**/*.{js,ts,jsx,tsx}",{cwd:o});}let n=await Yo();if(Object.keys(n).length===0)throw new Error("Something went wrong fetching the registry icons.");let i=Object.entries(Ie).map(([m,d])=>({title:d.title,value:m}));for(let m of [t.from,t.to])if(m&&!(m in Ie))throw new Error(`Unknown icon library: ${m}. Available libraries: ${Object.keys(Ie).join(", ")}.`);let s=t.from,a=t.to;if(!s||!a){let m=i.findIndex(u=>u.value===e.iconLibrary),d=await ae([{type:s?null:"select",name:"sourceLibrary",message:`Which icon library would you like to ${highlighter.info("migrate from")}?`,choices:i,initial:m===-1?0:m},{type:a?null:"select",name:"targetLibrary",message:`Which icon library would you like to ${highlighter.info("migrate to")}?`,choices:i}]);s=s??d.sourceLibrary,a=a??d.targetLibrary;}if((!s||!a)&&(logger.info("Migration cancelled."),process.exit(0)),s===a)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");let c=Ie[s],l=Ie[a];if(!t.yes){let m=t.path?t.path:`./${X__default.relative(e.resolvedPaths.cwd,o)}`,{confirm:d}=await ae({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${highlighter.info(r.length)} files in ${highlighter.info(m)} from ${highlighter.info(c.title)} to ${highlighter.info(l.title)}. Continue?`});d||(logger.info("Migration cancelled."),process.exit(0));}await updateDependencies([...l.packages],[],e,{silent:false});let p=spinner("Migrating icons...")?.start(),f=new Map;if(await Promise.all(r.map(async m=>{p.text=`Migrating ${m}...`;let d=X__default.join(o,m),u=await promises.readFile(d,"utf-8"),{content:g,skipped:y}=await nd(u,s,a,n);for(let w of y)f.has(w.icon)||f.set(w.icon,w.reason);await promises.writeFile(d,g);})),p.succeed("Migration complete."),t.path||await od(e,a),f.size>0){logger.break(),logger.warn(`Skipped ${f.size} icon${f.size===1?"":"s"}. These were left untouched:`);for(let[m,d]of Array.from(f))logger.warn(` - ${m}: ${d}`);}}async function od(e,t){let r=X__default.resolve(e.resolvedPaths.cwd,"components.json");if(!F.existsSync(r))return;let o=await F.readJson(r);o.iconLibrary!==t&&(o.iconLibrary=t,await F.writeJson(r,o,{spaces:2}),logger.info(`Updated ${highlighter.info("iconLibrary")} in components.json to ${highlighter.info(t)}.`));}async function nd(e,t,r,o){let n=Ie[t],i=Ie[r],s=b(n.import),a=c(n.usage),c$1=c(i.usage);if(!s)throw new Error(`Could not resolve the icon import for ${n.title}.`);let l=id(o,t),p=[],f=await promises.mkdtemp(X__default.join(tmpdir(),"shadcn-")),m=new Project({compilerOptions:{}}),d=X__default.join(f,`shadcn-icons-${randomBytes(4).toString("hex")}.tsx`),u=m.createSourceFile(d,e,{scriptKind:ScriptKind.TSX}),g=[];for(let y of u.getImportDeclarations()??[])if(!(y.getModuleSpecifier()?.getLiteralValue()!==s||y.isTypeOnly())){for(let w of [...y.getNamedImports()??[]]){if(w.isTypeOnly())continue;let x=w.getName(),b=w.getAliasNode()?.getText()??x,N=l.get(x),C=N?o[N]?.[r]:void 0;if(!C){p.push({icon:x,reason:`no ${i.title} equivalent found`});continue}let T=sd(u,b,a);if(T.complex){p.push({icon:x,reason:"unsupported usage (e.g. referenced outside JSX)"});continue}if(c$1.componentName!=="ICON"&&(T.references>0||T.paired>0)){p.push({icon:x,reason:`cannot be wrapped in <${c$1.componentName} />`});continue}w.remove(),ad(u,b,C,a,c$1),g.includes(C)||g.push(C);}y.getNamedImports()?.length===0&&!y.getDefaultImport()&&!y.getNamespaceImport()&&y.remove();}if(a.componentName!=="ICON"&&g.length>0&&ld(u,n.import,a),g.length>0)for(let y of a$1(i.import)){let w=y.namedImports.flatMap(b=>b==="ICON"?g:[b]);!y.namedImports.includes("ICON")&&u.getImportDeclarations().some(b=>b.getModuleSpecifier()?.getLiteralValue()===y.moduleSpecifier&&b.getNamedImports().some(N=>w.includes(N.getName())))||u.addImportDeclaration({moduleSpecifier:y.moduleSpecifier,namedImports:w.map(b=>({name:b}))});}return {content:u.getText(),skipped:p}}function id(e,t){let r=new Map;for(let[o,n]of Object.entries(e)){let i=n[t];i&&!r.has(i)&&r.set(i,o);}if(t==="lucide")for(let[o,n]of Array.from(r)){let i=o.endsWith("Icon")?o.slice(0,-4):`${o}Icon`;i&&!r.has(i)&&r.set(i,n);}return r}function sd(e,t,r){let o={selfClosing:0,paired:0,references:0,complex:false};for(let n of e.getDescendantsOfKind(SyntaxKind.Identifier)){if(n.getText()!==t||n.getFirstAncestorByKind(SyntaxKind.ImportDeclaration))continue;let i=n.getParent(),s=i?.getKind();if(r.componentName==="ICON"){s===SyntaxKind.JsxSelfClosingElement?o.selfClosing++:s===SyntaxKind.JsxOpeningElement?o.paired++:s===SyntaxKind.JsxClosingElement||(s===SyntaxKind.JsxExpression&&i?.getParent()?.getKind()===SyntaxKind.JsxAttribute?o.references++:o.complex=true);continue}let a=n.getFirstAncestorByKind(SyntaxKind.JsxAttribute),c=n.getFirstAncestorByKind(SyntaxKind.JsxSelfClosingElement);s===SyntaxKind.JsxExpression&&a?.getNameNode().getText()===r.iconAttribute&&c?.getTagNameNode()?.getText()===r.componentName?o.selfClosing++:o.complex=true;}return o}function ad(e,t,r,o,n){if(o.componentName==="ICON"){for(let i of e.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement))i.getTagNameNode()?.getText()===t&&Zi(i,r,o,n);for(let i of e.getDescendantsOfKind(SyntaxKind.JsxElement)){let s=i.getOpeningElement();s.getTagNameNode()?.getText()===t&&(cd(s,o,n),s.getTagNameNode()?.replaceWithText(r),i.getClosingElement().getTagNameNode()?.replaceWithText(r));}for(let i of e.getDescendantsOfKind(SyntaxKind.Identifier)){if(i.getText()!==t||i.getFirstAncestorByKind(SyntaxKind.ImportDeclaration))continue;let s=i.getParent();s?.getKind()===SyntaxKind.JsxExpression&&s?.getParent()?.getKind()===SyntaxKind.JsxAttribute&&i.replaceWithText(r);}return}for(let i of e.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement)){if(i.getTagNameNode()?.getText()!==o.componentName||!o.iconAttribute)continue;let s=i.getAttribute(o.iconAttribute);!s||s.getKind()!==SyntaxKind.JsxAttribute||s.asKindOrThrow(SyntaxKind.JsxAttribute).getInitializer()?.getText()!==`{${t}}`||Zi(i,r,o,n,{excludeAttribute:o.iconAttribute});}}function Zi(e,t,r,o,n={}){let i=r.componentName==="ICON"&&Object.keys(r.attributes).length===0,s=o.componentName==="ICON"&&Object.keys(o.attributes).length===0;if(i&&s){e.getTagNameNode()?.replaceWithText(t);return}let a=e.getAttributes().filter(f=>{if(f.getKind()!==SyntaxKind.JsxAttribute)return true;let m=f.asKindOrThrow(SyntaxKind.JsxAttribute),d=m.getNameNode().getText();return d===n.excludeAttribute?false:r.attributes[d]!==(m.getInitializer()?.getText()??"")}).map(f=>f.getText()),c=new Set(e.getAttributes().filter(f=>f.getKind()===SyntaxKind.JsxAttribute).map(f=>f.asKindOrThrow(SyntaxKind.JsxAttribute).getNameNode().getText())),l=Object.entries(o.attributes).filter(([f])=>!c.has(f)).map(([f,m])=>`${f}=${m}`),p=o.componentName==="ICON"?[t,...l,...a]:[o.componentName,`${o.iconAttribute}={${t}}`,...l,...a];e.replaceWithText(`<${p.join(" ")} />`);}function cd(e,t,r){for(let[o,n]of Object.entries(t.attributes)){let i=e.getAttribute(o);i?.getKind()===SyntaxKind.JsxAttribute&&(i.asKindOrThrow(SyntaxKind.JsxAttribute).getInitializer()?.getText()??"")===n&&i.remove();}for(let[o,n]of Object.entries(r.attributes))e.getAttribute(o)||e.addAttribute({name:o,initializer:n});}function ld(e,t,r){let o=r.componentName;if(e.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).some(s=>s.getTagNameNode()?.getText()===o)||e.getDescendantsOfKind(SyntaxKind.JsxOpeningElement).some(s=>s.getTagNameNode()?.getText()===o))return;let i=a$1(t).filter(s=>!s.namedImports.includes("ICON")).map(s=>s.moduleSpecifier);for(let s of e.getImportDeclarations()??[])if(i.includes(s.getModuleSpecifier()?.getLiteralValue()??"")){for(let a of [...s.getNamedImports()??[]])a.getName()===o&&a.remove();s.getNamedImports()?.length===0&&!s.getDefaultImport()&&!s.getNamespaceImport()&&s.remove();}}function dd(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function ud(e,t,r,o){let i=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of i){let a=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),c=s.match(/^(\w+)\s+as\s+(\w+)$/);if(a){let l=a[1],p=a[2];o==="slot"&&l==="Slot"&&!p?r.push({name:"Slot",alias:"SlotPrimitive",isType:true}):r.push({name:l,alias:p,isType:true});}else if(c){let l=c[1],p=c[2];o==="slot"&&l==="Slot"&&p==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:l,alias:p,isType:t});}else o==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t});}}async function ts(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await to(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"],suppressErrors:true});else {let c=X__default.resolve(o,t.path),l=await promises.stat(c).catch(()=>null);if(!l)throw new Error(`File not found: ${t.path}`);if(l.isDirectory())o=c,r=await to("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"],suppressErrors:true});else if(l.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else {if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");o=e.resolvedPaths.ui,r=await to("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,suppressErrors:true});}if(!t.yes){let a=t.path?t.path:`./${X__default.relative(e.resolvedPaths.cwd,o)}`,{confirm:c}=await ae({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${highlighter.info(r.length)} file(s) in ${highlighter.info(a)} to ${highlighter.info("radix-ui")}. Continue?`});c||(logger.info("Migration cancelled."),process.exit(0));}let n=spinner("Migrating imports...")?.start(),i=new Set;await Promise.all(r.map(async a=>{n.text=`Migrating ${a}...`;let c=X__default.join(o,a),l=await promises.readFile(c,"utf-8"),{content:p,replacedPackages:f}=await gd(l);f.forEach(m=>i.add(m)),await promises.writeFile(c,p);})),n.succeed("Migrating imports.");let s=spinner("Updating package.json...")?.start();try{let a=getPackageInfo(e.resolvedPaths.cwd,!1);if(!a){s.fail("Could not read package.json"),logger.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let c=Array.from(i);if(c.length>0){if(a.dependencies||(a.dependencies={}),a.dependencies?.["radix-ui"]||a.devDependencies?.["radix-ui"])s.succeed("radix-ui already in package.json.");else {a.dependencies["radix-ui"]="latest";let p=X__default.join(e.resolvedPaths.cwd,"package.json");await promises.writeFile(p,JSON.stringify(a,null,2)+`
131
+ `),s.succeed("Updated package.json."),await updateDependencies(["radix-ui"],[],e,{silent:!1});}logger.info(""),logger.info("Migration complete. The following packages may be removed if no longer in use:"),logger.info(highlighter.info(c.join(", "))),logger.info("Please review your codebase before removing.");}else s.succeed("No packages found in source files.");}catch{s.fail("Failed to update package.json"),logger.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui");}}async function gd(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],o=[],n=[],i='"',s=false,a=e,c;for(;(c=t.exec(e))!==null;){let[u,g,y,w,x,b,N]=c;if(b==="icons"||b.startsWith("icons/"))continue;o.push(u),o.length===1&&(i=x,s=N===";"),n.push(`@radix-ui/react-${b}`);let C=!!g;if(y){let T=dd(b);r.push({name:T,alias:y,isType:C});}else w&&ud(w,C,r,b);}if(r.length===0)return {content:e,replacedPackages:[]};let l=r.filter((u,g,y)=>g===y.findIndex(w=>w.name===u.name&&w.alias===u.alias&&w.isType===u.isType)),f=`import { ${l.map(u=>{let g=u.isType?"type ":"";return u.alias?`${g}${u.name} as ${u.alias}`:`${g}${u.name}`}).join(", ")} } from ${i}radix-ui${i}${s?";":""}`;a=o.reduce((u,g,y)=>u.replace(g,y===0?f:""),a),a=a.replace(/\n\s*\n\s*\n/g,`
132
132
 
133
133
  `),l.some(u=>u.name==="Slot"&&u.alias==="SlotPrimitive")&&(a=a.split(`
134
- `).map(y=>{if(y.trim().startsWith("import "))return y;let w=y;return w=w.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),w=w.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),w=w.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),w=w.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),w=w.replace(/\bSlot\b/g,(x,k,N)=>{let b=N.substring(0,k),T=(b.match(/"/g)||[]).length,W=(b.match(/'/g)||[]).length;return T%2!==0||W%2!==0?x:"__SLOT_PLACEHOLDER__"}),w=w.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),w}).join(`
135
- `));let d=Array.from(new Set(n));return {content:a,replacedPackages:d}}var kd=["sidebar.tsx","pagination.tsx","calendar.tsx"],bd=`${SHADCN_URL}/docs/rtl#manual-migration-optional`;async function os(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await to(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"],suppressErrors:true});else {let l=X__default.resolve(o,t.path),p=await promises.stat(l).catch(()=>null);if(!p)throw new Error(`File not found: ${t.path}`);if(p.isDirectory())o=l,r=await to("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"],suppressErrors:true});else if(p.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else {if(!e.resolvedPaths.ui)throw new Error("Could not find a valid `ui` path in your `components.json`. Please provide a path or glob pattern.");o=e.resolvedPaths.ui,r=await to("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,suppressErrors:true});}if(!t.yes){let c=t.path?t.path:`./${X__default.relative(e.resolvedPaths.cwd,o)}`,{confirm:l}=await ae({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${highlighter.info(r.length)} file(s) in ${highlighter.info(c)} to RTL. Continue?`});l||(logger.info("Migration cancelled."),process.exit(0));}let n=spinner("Updating components.json...").start();try{let c=X__default.resolve(e.resolvedPaths.cwd,"components.json"),l=JSON.parse(await promises.readFile(c,"utf-8"));l.rtl=!0,await promises.writeFile(c,JSON.stringify(l,null,2)+`
136
- `),n.succeed("Updated components.json.");}catch{throw n.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let i=spinner("Migrating files to RTL...").start(),s=0,a=[];if(await Promise.all(r.map(async c=>{i.text=`Migrating ${c}...`;let l=X__default.join(o,c),p=await promises.readFile(l,"utf-8"),f=await transformDirection(p,true);f!==p&&(await promises.writeFile(l,f),s++);let m=X__default.basename(c);kd.includes(m)&&a.push(c);})),i.succeed(`Migration complete. ${s} file(s) transformed.`),a.length>0){logger.break(),logger.warn("The following components may need manual RTL adjustments:");for(let c of a)logger.info(` - ${c}`);logger.break(),logger.info(`See ${highlighter.info(bd)} for more information.`);}}async function is(e){let t={};if(!F.existsSync(e.cwd)||!F.existsSync(X__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!F.existsSync(X__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await getConfig(e.cwd);return {errors:t,config:r}}catch{logger.break(),logger.error(`An invalid ${highlighter.info("components.json")} file was found at ${highlighter.info(e.cwd)}.
137
- Before you can run a migration, you must create a valid ${highlighter.info("components.json")} file by running the ${highlighter.info("init")} command.`),logger.error(`Learn more at ${highlighter.info(`${SHADCN_URL}/docs/components-json`)}.`),logger.break(),process.exit(1);}}var ss=[{name:"cn",description:"migrate clsx and tailwind-merge to cn."},{name:"icons",description:"migrate your ui components to a different icon library."},{name:"base-color",description:"migrate your theme to a different base color."},{name:"radix",description:"migrate to radix-ui."},{name:"rtl",description:"migrate your components to support RTL (right-to-left)."}],Pd=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),from:z$1.string().optional(),to:z$1.string().optional(),migration:z$1.string().refine(e=>e&&ss.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()}),as=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).option("-f, --from <name>","the base color or icon library to migrate from.").option("-t, --to <name>","the base color or icon library to migrate to.").action(async(e,t,r)=>{try{let o=Pd.parse({cwd:X__default.resolve(r.cwd),migration:e,path:t,list:r.list,yes:r.yes,from:r.from,to:r.to});if(o.list||!o.migration){logger.info("Available migrations:");for(let s of ss)logger.info(`- ${s.name}: ${s.description}`);return}if(o.migration==="cn"){await eo({cwd:o.cwd,path:o.path,yes:o.yes});return}let{errors:n,config:i}=await is(o);if(n["1"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(n["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!i)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");o.migration==="icons"&&await Qi(i,{from:o.from,to:o.to,path:o.path,yes:o.yes}),o.migration==="base-color"&&await di(i,{from:o.from,to:o.to,yes:o.yes}),o.migration==="radix"&&await ts(i,{yes:o.yes,path:o.path}),o.migration==="rtl"&&await os(i,{yes:o.yes,path:o.path});}catch(o){logger.break(),C(o);}});function Dd(e){return `${SHADCN_URL}/create?preset=${e}`}function co(e){let t=decodePreset(e);if(!t)throw new Error(`Invalid preset code: ${e}`);let r=[],o=t.chartColor??V1_CHART_COLOR_MAP[t.theme]??t.theme;return t.chartColor||r.push("chartColor"),{code:e,version:e[0],values:{...t,chartColor:o},derived:r,url:Dd(e)}}function _d(e){zt({code:e.code,fallbacks:e.derived,values:e.values},{fallbackNote:" * Compatibility value for older preset versions."});}var Md=new Command().name("decode").description("decode a preset code").argument("<code>","the preset code to decode").option("--json","output as JSON.",false).action((e,t)=>{try{let r=co(e);if(t.json){console.log(JSON.stringify({code:r.code,version:r.version,values:r.values,derived:r.derived,url:r.url},null,2));return}_d(r);}catch(r){nr(r);}}),Vd=new Command().name("url").description("get the create URL for a preset code").argument("<code>","the preset code").action(e=>{try{logger.log(co(e).url);}catch(t){nr(t);}}),Bd=new Command().name("open").description("open a preset code in the browser").argument("<code>","the preset code").action(async e=>{let t;try{t=co(e).url;}catch(r){nr(r);return}logger.break(),logger.log(` Opening ${t} in your browser.`),logger.break();try{await Bs(t);}catch(r){let o=r instanceof Error?r.message:String(r);nr(new Error(`Failed to open preset URL: ${o}`));}}),Ud=new Command().name("resolve").alias("info").description("resolve a preset from your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",false).action(async e=>{try{let t=X__default.resolve(e.cwd);if(!existsSync(X__default.resolve(t,"components.json"))&&await isMonorepoRoot(t)){let i=await getMonorepoTargets(t);i.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running preset resolve from a monorepo root. Use the -c flag to specify a workspace.",targets:i.map(s=>s.name)},null,2)):formatMonorepoMessage("preset resolve",i),process.exit(1));}let r=await getConfig(t);if(!r){if(e.json){console.log(JSON.stringify(null,null,2));return}logger.log("No components.json found.");return}let o=await getProjectInfo(t),n=await Wt(r,o);if(e.json){console.log(JSON.stringify(n.code?n:null,null,2));return}zt(n);}catch(t){C(t);}}),lo=new Command().name("preset").description("manage presets").addCommand(Md).addCommand(Ud).addCommand(Vd).addCommand(Bd).action(()=>{lo.outputHelp();});function nr(e){e instanceof Error&&logger.error(e.message),process.exit(1);}var Hd=z$1.object({cwd:z$1.string(),silent:z$1.boolean()}),fs=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=Hd.parse({cwd:X__default.resolve(t.cwd),silent:t.silent}),o=e.length>0?e:await Yd({silent:r.silent});await Kd(o,r.cwd,{silent:r.silent});}catch(r){logger.break(),C(r);}});function Gd(e){let[t,...r]=e.split("="),o=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${highlighter.info(t)}. Registry names must start with @ (e.g., @acme).`);return {namespace:t,url:o}}function mo(e,t,r){return `${e} ${e===1?t:r}`}async function Kd(e,t,r){let o=["components.json","package.json"].map(g=>X__default.resolve(t,g)).find(g=>F.existsSync(g));if(!o)throw new Error(`No ${highlighter.info("components.json")} or ${highlighter.info("package.json")} found. Run ${highlighter.info("shadcn init")} first.`);let n=X__default.basename(o),i=e.map(Gd),s=i.filter(g=>!g.url),a=[];if(s.length>0){let g=spinner("Fetching registries.",{silent:r.silent}).start(),y=await getRegistries();if(!y)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),a=y;}let c={};for(let{namespace:g,url:y}of i){if(g in BUILTIN_REGISTRIES){logger.warn(`${highlighter.info(g)} is a built-in registry and cannot be added.`);continue}if(y){if(!y.includes("{name}"))throw new Error(`Invalid registry URL for ${highlighter.info(g)}. URL must include {name} placeholder. Example: ${highlighter.info(`${g}=https://example.com/r/{name}.json`)}`);c[g]=y;}else {let w=a.find(x=>x.name===g);if(!w)throw new Error(`Registry ${highlighter.info(g)} not found. Provide a URL: ${highlighter.info(`${g}=https://.../{name}.json`)}`);c[g]=w.url;}}if(Object.keys(c).length===0)return {addedRegistries:[]};let l=await F.readJson(o),p=l.registries||{},f={},m=[];for(let[g,y]of Object.entries(c))p[g]?m.push(g):f[g]=y;if(Object.keys(f).length===0){if(m.length>0&&!r.silent){spinner(`Skipped ${mo(m.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let g of m)logger.log(` - ${g}`);}else r.silent||logger.info("No new registries to add.");return}let d={...l,registries:{...p,...f}},u=spinner(`Updating ${n}.`,{silent:r.silent}).start();if(await F.writeJson(o,d,{spaces:2}),u.succeed(),!r.silent){let g=Object.keys(f);spinner(`Added ${mo(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let y of g)logger.log(` - ${y}`);if(m.length>0){spinner(`Skipped ${mo(m.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let y of m)logger.log(` - ${y}`);}}}async function Yd(e){let t=spinner("Fetching registries.",{silent:e.silent}).start(),r=await getRegistries();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let o=[...r].sort((i,s)=>i.name.localeCompare(s.name)),{selected:n}=await ae({type:"autocompleteMultiselect",name:"selected",message:"Which registries would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:o.map(i=>({title:i.name,description:i.description,value:i.name}))});return n?.length||(logger.warn("No registries selected. Exiting."),logger.info(""),process.exit(1)),n}var tu=z$1.object({cwd:z$1.string(),registryFile:z$1.string()}),gs=new Command().name("validate").description("validate a shadcn registry").argument("[registry]","registry address to validate. Supports registry.json paths and GitHub sources.","./registry.json").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{let r;try{let o=tu.parse({cwd:X.resolve(t.cwd),registryFile:e}),n=await su(e,o.cwd);r=spinner("Validating registry.").start();let i=n?await validateGitHubRegistrySource(n):await validateRegistry(o);ru(i,r),i.valid||(process.exitCode=1);}catch(o){r?.fail("Registry validation failed."),logger.break(),C(o);}});function ru(e,t){if(e.valid){t.succeed("Registry is valid."),ps(e,{success:true});return}t.fail("Registry validation failed."),ps(e),logger.break();for(let[r,o]of Array.from(ou(e))){logger.log(highlighter.info(hs(r,e.cwd)));for(let n of o)logger.error(` - ${nu(n)}`),n.suggestion&&logger.log(` ${n.suggestion}`);logger.break();}}function ps(e,t={}){let r=`Checked ${ms(e.registryFiles,"registry file","registry files")} and ${ms(e.items,"item","items")}.`;t.success?iu(r):logger.log(` ${r}`);for(let o of e.registryFilePaths)logger.log(` - ${hs(o,e.cwd)}`);}function ou(e){let t=new Map;for(let r of e.diagnostics){let o=t.get(r.registryFile)??[];o.push(r),t.set(r.registryFile,o);}return t}function nu(e){let t=[];return e.itemIndex!==void 0&&t.push(`items[${e.itemIndex}]`),e.itemName&&t.push(`"${e.itemName}"`),e.includePath&&t.push(`include "${e.includePath}"`),e.filePath&&t.push(`file "${e.filePath}"`),t.length?`${t.join(" ")}: ${e.message}`:e.message}function hs(e,t){let r=X.relative(t,e);return r&&!r.startsWith("..")&&!X.isAbsolute(r)?r.split(X.sep).join("/"):r?e:"."}function iu(e){spinner(e).succeed();}function ms(e,t,r){return `${e} ${e===1?t:r}`}async function su(e,t){return au(e)||await cu(X.resolve(t,e))?null:resolveGitHubRegistrySource(e)}function au(e){return e.startsWith(".")||X.isAbsolute(e)||e.endsWith(".json")}async function cu(e){try{return await be.access(e),!0}catch{return false}}var ys=new Command().name("registry").description("manage registries").addCommand(fs).addCommand(gs);var Su=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),types:z$1.array(z$1.string()).optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),ks=new Command().name("search").alias("list").description("search items from registries").argument("[registries...]","the registry addresses to search. Supports namespaces, GitHub sources and URLs. When omitted, searches all registries configured in components.json.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-t, --type <type>","filter by item type, e.g. ui, block, hook. Comma-separated for multiple.").option("-l, --limit <number>","maximum number of items to display","100").option("-o, --offset <number>","number of items to skip","0").option("--json","output as JSON.",false).action(async(e,t)=>{try{let r=Su.parse({cwd:X__default.resolve(t.cwd),query:t.query,types:t.type?t.type.split(",").map(u=>u.trim()).filter(Boolean):void 0,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});if(r.types?.length){let u=findUnknownSearchTypes(r.types);u.length>0&&(logger.break(),logger.error(`Unknown ${u.length===1?"type":"types"}: ${u.map(g=>highlighter.info(g)).join(", ")}.`),logger.error(`Valid types: ${SEARCHABLE_TYPES.join(", ")}.`),logger.break(),process.exit(1));}await loadEnvFiles(r.cwd);let o=createConfig({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n=configWithDefaults(o),i=X__default.resolve(r.cwd,"components.json"),s=F.existsSync(i);if(s){let u=await F.readJson(i),g=rawConfigSchema.partial().parse(u);n=configWithDefaults({...o,...g});}let a=n;try{let u=await getConfig(r.cwd);u&&(a=configWithDefaults(u));}catch{}let c=e.length===0;c&&!s&&(logger.break(),logger.error(`Provide a registry or namespace to search, e.g. ${highlighter.info("shadcn search @shadcn")}.`),logger.break(),logger.error(`If you have a ${highlighter.info("components.json")} with registries configured, run ${highlighter.info("shadcn search")} with no arguments to search all of them.`),logger.break(),process.exit(1));let{config:l,newRegistries:p}=await _(e.filter(u=>u.startsWith("@")&&!a.registries?.[u]&&!(u in BUILTIN_REGISTRIES)).map(u=>`${u}/registry`),a,{silent:!0,writeFile:!1});p.length>0&&(a.registries=l.registries);let f=resolveSearchRegistries(e,a);c&&f.length===0&&(logger.break(),logger.error(`No registries are configured in ${highlighter.info("components.json")}.`),logger.error(`Provide a registry or namespace to search, e.g. ${highlighter.info("shadcn search @shadcn")}.`),logger.break(),process.exit(1)),c||validateRegistryConfigForItems(f,a);let m=await searchRegistries(f,{query:r.query,types:r.types,limit:r.limit,offset:r.offset,config:a,continueOnError:c}),d=c&&m.errors?.length===f.length;t.json?console.log(JSON.stringify(m,null,2)):printSearchResults(m,{query:r.query,types:r.types,registries:f}),process.exit(d?1:0);}catch(r){C(r);}finally{clearRegistryContext();}});var Tu=z$1.object({cwd:z$1.string()}),vs=new Command().name("view").description("view items from the registry").argument("<items...>","item addresses to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Tu.parse({cwd:X__default.resolve(t.cwd)});await loadEnvFiles(r.cwd);let o=configWithDefaults({}),n=X__default.resolve(r.cwd,"components.json");if(F.existsSync(n)){let l=await F.readJson(n),p=rawConfigSchema.partial().parse(l);o=configWithDefaults(p);}let i=o;try{let l=await getConfig(r.cwd);l&&(i=configWithDefaults(l));}catch{}let{config:s,newRegistries:a}=await _(e,i,{silent:!0,writeFile:!1});a.length>0&&(i.registries=s.registries),validateRegistryConfigForItems(e,i);let c=await getRegistryItems(e,{config:i});console.log(JSON.stringify(c,null,2)),process.exit(0);}catch(r){C(r);}finally{clearRegistryContext();}});process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Ou(){let e=new Command().name("shadcn").description("build your component library").version(Ct.version,"-v, --version","display the version number");e.addCommand(tn).addCommand(En).addCommand(kn).addCommand(An).addCommand(Ln).addCommand(vs).addCommand(ks).addCommand(as).addCommand(Mn).addCommand(ri).addCommand(On).addCommand(Wr).addCommand(lo).addCommand(ys),e.parse();}Ou();
134
+ `).map(y=>{if(y.trim().startsWith("import "))return y;let w=y;return w=w.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),w=w.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),w=w.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),w=w.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),w=w.replace(/\bSlot\b/g,(x,b,N)=>{let C=N.substring(0,b),T=(C.match(/"/g)||[]).length,W=(C.match(/'/g)||[]).length;return T%2!==0||W%2!==0?x:"__SLOT_PLACEHOLDER__"}),w=w.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),w}).join(`
135
+ `));let d=Array.from(new Set(n));return {content:a,replacedPackages:d}}var xd=["sidebar.tsx","pagination.tsx","calendar.tsx"],kd=`${SHADCN_URL}/docs/rtl#manual-migration-optional`;async function os(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await to(t.path,{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"],suppressErrors:true});else {let l=X__default.resolve(o,t.path),p=await promises.stat(l).catch(()=>null);if(!p)throw new Error(`File not found: ${t.path}`);if(p.isDirectory())o=l,r=await to("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,ignore:["**/node_modules/**"],suppressErrors:true});else if(p.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else {if(!e.resolvedPaths.ui)throw new Error("Could not find a valid `ui` path in your `components.json`. Please provide a path or glob pattern.");o=e.resolvedPaths.ui,r=await to("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:true,suppressErrors:true});}if(!t.yes){let c=t.path?t.path:`./${X__default.relative(e.resolvedPaths.cwd,o)}`,{confirm:l}=await ae({type:"confirm",name:"confirm",initial:true,message:`We will migrate ${highlighter.info(r.length)} file(s) in ${highlighter.info(c)} to RTL. Continue?`});l||(logger.info("Migration cancelled."),process.exit(0));}let n=spinner("Updating components.json...").start();try{let c=X__default.resolve(e.resolvedPaths.cwd,"components.json"),l=JSON.parse(await promises.readFile(c,"utf-8"));l.rtl=!0,await promises.writeFile(c,JSON.stringify(l,null,2)+`
136
+ `),n.succeed("Updated components.json.");}catch{throw n.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let i=spinner("Migrating files to RTL...").start(),s=0,a=[];if(await Promise.all(r.map(async c=>{i.text=`Migrating ${c}...`;let l=X__default.join(o,c),p=await promises.readFile(l,"utf-8"),f=await transformDirection(p,true);f!==p&&(await promises.writeFile(l,f),s++);let m=X__default.basename(c);xd.includes(m)&&a.push(c);})),i.succeed(`Migration complete. ${s} file(s) transformed.`),a.length>0){logger.break(),logger.warn("The following components may need manual RTL adjustments:");for(let c of a)logger.info(` - ${c}`);logger.break(),logger.info(`See ${highlighter.info(kd)} for more information.`);}}async function is(e){let t={};if(!F.existsSync(e.cwd)||!F.existsSync(X__default.resolve(e.cwd,"package.json")))return t["1"]=true,{errors:t,config:null};if(!F.existsSync(X__default.resolve(e.cwd,"components.json")))return t["3"]=true,{errors:t,config:null};try{let r=await getConfig(e.cwd);return {errors:t,config:r}}catch{logger.break(),logger.error(`An invalid ${highlighter.info("components.json")} file was found at ${highlighter.info(e.cwd)}.
137
+ Before you can run a migration, you must create a valid ${highlighter.info("components.json")} file by running the ${highlighter.info("init")} command.`),logger.error(`Learn more at ${highlighter.info(`${SHADCN_URL}/docs/components-json`)}.`),logger.break(),process.exit(1);}}var ss=[{name:"cn",description:"migrate clsx and tailwind-merge to cn."},{name:"icons",description:"migrate your ui components to a different icon library."},{name:"base-color",description:"migrate your theme to a different base color."},{name:"radix",description:"migrate to radix-ui."},{name:"rtl",description:"migrate your components to support RTL (right-to-left)."}],Rd=z$1.object({cwd:z$1.string(),list:z$1.boolean(),yes:z$1.boolean(),from:z$1.string().optional(),to:z$1.string().optional(),migration:z$1.string().refine(e=>e&&ss.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()}),as=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).option("-f, --from <name>","the base color or icon library to migrate from.").option("-t, --to <name>","the base color or icon library to migrate to.").action(async(e,t,r)=>{try{let o=Rd.parse({cwd:X__default.resolve(r.cwd),migration:e,path:t,list:r.list,yes:r.yes,from:r.from,to:r.to});if(o.list||!o.migration){logger.info("Available migrations:");for(let s of ss)logger.info(`- ${s.name}: ${s.description}`);return}if(o.migration==="cn"){await eo({cwd:o.cwd,path:o.path,yes:o.yes});return}let{errors:n,config:i}=await is(o);if(n["1"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(n["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!i)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");o.migration==="icons"&&await Qi(i,{from:o.from,to:o.to,path:o.path,yes:o.yes}),o.migration==="base-color"&&await di(i,{from:o.from,to:o.to,yes:o.yes}),o.migration==="radix"&&await ts(i,{yes:o.yes,path:o.path}),o.migration==="rtl"&&await os(i,{yes:o.yes,path:o.path});}catch(o){logger.break(),k(o);}});function Ld(e){return `${SHADCN_URL}/create?preset=${e}`}function co(e){let t=decodePreset(e);if(!t)throw new Error(`Invalid preset code: ${e}`);let r=[],o=t.chartColor??V1_CHART_COLOR_MAP[t.theme]??t.theme;return t.chartColor||r.push("chartColor"),{code:e,version:e[0],values:{...t,chartColor:o},derived:r,url:Ld(e)}}function Dd(e){zt({code:e.code,fallbacks:e.derived,values:e.values},{fallbackNote:" * Compatibility value for older preset versions."});}var _d=new Command().name("decode").description("decode a preset code").argument("<code>","the preset code to decode").option("--json","output as JSON.",false).action((e,t)=>{try{let r=co(e);if(t.json){console.log(JSON.stringify({code:r.code,version:r.version,values:r.values,derived:r.derived,url:r.url},null,2));return}Dd(r);}catch(r){nr(r);}}),Md=new Command().name("url").description("get the create URL for a preset code").argument("<code>","the preset code").action(e=>{try{logger.log(co(e).url);}catch(t){nr(t);}}),Vd=new Command().name("open").description("open a preset code in the browser").argument("<code>","the preset code").action(async e=>{let t;try{t=co(e).url;}catch(r){nr(r);return}logger.break(),logger.log(` Opening ${t} in your browser.`),logger.break();try{await Bs(t);}catch(r){let o=r instanceof Error?r.message:String(r);nr(new Error(`Failed to open preset URL: ${o}`));}}),Bd=new Command().name("resolve").alias("info").description("resolve a preset from your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",false).action(async e=>{try{let t=X__default.resolve(e.cwd);if(!existsSync(X__default.resolve(t,"components.json"))&&await isMonorepoRoot(t)){let i=await getMonorepoTargets(t);i.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running preset resolve from a monorepo root. Use the -c flag to specify a workspace.",targets:i.map(s=>s.name)},null,2)):formatMonorepoMessage("preset resolve",i),process.exit(1));}let r=await getConfig(t);if(!r){if(e.json){console.log(JSON.stringify(null,null,2));return}logger.log("No components.json found.");return}let o=await getProjectInfo(t),n=await Wt(r,o);if(e.json){console.log(JSON.stringify(n.code?n:null,null,2));return}zt(n);}catch(t){k(t);}}),lo=new Command().name("preset").description("manage presets").addCommand(_d).addCommand(Bd).addCommand(Md).addCommand(Vd).action(()=>{lo.outputHelp();});function nr(e){e instanceof Error&&logger.error(e.message),process.exit(1);}var zd=z$1.object({cwd:z$1.string(),silent:z$1.boolean()}),fs=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=zd.parse({cwd:X__default.resolve(t.cwd),silent:t.silent}),o=e.length>0?e:await Kd({silent:r.silent});await Gd(o,r.cwd,{silent:r.silent});}catch(r){logger.break(),k(r);}});function Hd(e){let[t,...r]=e.split("="),o=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${highlighter.info(t)}. Registry names must start with @ (e.g., @acme).`);return {namespace:t,url:o}}function mo(e,t,r){return `${e} ${e===1?t:r}`}async function Gd(e,t,r){let o=["components.json","package.json"].map(g=>X__default.resolve(t,g)).find(g=>F.existsSync(g));if(!o)throw new Error(`No ${highlighter.info("components.json")} or ${highlighter.info("package.json")} found. Run ${highlighter.info("shadcn init")} first.`);let n=X__default.basename(o),i=e.map(Hd),s=i.filter(g=>!g.url),a=[];if(s.length>0){let g=spinner("Fetching registries.",{silent:r.silent}).start(),y=await getRegistries();if(!y)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),a=y;}let c={};for(let{namespace:g,url:y}of i){if(g in BUILTIN_REGISTRIES){logger.warn(`${highlighter.info(g)} is a built-in registry and cannot be added.`);continue}if(y){if(!y.includes("{name}"))throw new Error(`Invalid registry URL for ${highlighter.info(g)}. URL must include {name} placeholder. Example: ${highlighter.info(`${g}=https://example.com/r/{name}.json`)}`);c[g]=y;}else {let w=a.find(x=>x.name===g);if(!w)throw new Error(`Registry ${highlighter.info(g)} not found. Provide a URL: ${highlighter.info(`${g}=https://.../{name}.json`)}`);c[g]=w.url;}}if(Object.keys(c).length===0)return {addedRegistries:[]};let l=await F.readJson(o),p=l.registries||{},f={},m=[];for(let[g,y]of Object.entries(c))p[g]?m.push(g):f[g]=y;if(Object.keys(f).length===0){if(m.length>0&&!r.silent){spinner(`Skipped ${mo(m.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let g of m)logger.log(` - ${g}`);}else r.silent||logger.info("No new registries to add.");return}let d={...l,registries:{...p,...f}},u=spinner(`Updating ${n}.`,{silent:r.silent}).start();if(await F.writeJson(o,d,{spaces:2}),u.succeed(),!r.silent){let g=Object.keys(f);spinner(`Added ${mo(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let y of g)logger.log(` - ${y}`);if(m.length>0){spinner(`Skipped ${mo(m.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let y of m)logger.log(` - ${y}`);}}}async function Kd(e){let t=spinner("Fetching registries.",{silent:e.silent}).start(),r=await getRegistries();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let o=[...r].sort((i,s)=>i.name.localeCompare(s.name)),{selected:n}=await ae({type:"autocompleteMultiselect",name:"selected",message:"Which registries would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:false,choices:o.map(i=>({title:i.name,description:i.description,value:i.name}))});return n?.length||(logger.warn("No registries selected. Exiting."),logger.info(""),process.exit(1)),n}var eu=z$1.object({cwd:z$1.string(),registryFile:z$1.string()}),gs=new Command().name("validate").description("validate a shadcn registry").argument("[registry]","registry address to validate. Supports registry.json paths and GitHub sources.","./registry.json").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{let r;try{let o=eu.parse({cwd:X.resolve(t.cwd),registryFile:e}),n=await iu(e,o.cwd);r=spinner("Validating registry.").start();let i=n?await validateGitHubRegistrySource(n):await validateRegistry(o);tu(i,r),i.valid||(process.exitCode=1);}catch(o){r?.fail("Registry validation failed."),logger.break(),k(o);}});function tu(e,t){if(e.valid){t.succeed("Registry is valid."),ps(e,{success:true});return}t.fail("Registry validation failed."),ps(e),logger.break();for(let[r,o]of Array.from(ru(e))){logger.log(highlighter.info(hs(r,e.cwd)));for(let n of o)logger.error(` - ${ou(n)}`),n.suggestion&&logger.log(` ${n.suggestion}`);logger.break();}}function ps(e,t={}){let r=`Checked ${ms(e.registryFiles,"registry file","registry files")} and ${ms(e.items,"item","items")}.`;t.success?nu(r):logger.log(` ${r}`);for(let o of e.registryFilePaths)logger.log(` - ${hs(o,e.cwd)}`);}function ru(e){let t=new Map;for(let r of e.diagnostics){let o=t.get(r.registryFile)??[];o.push(r),t.set(r.registryFile,o);}return t}function ou(e){let t=[];return e.itemIndex!==void 0&&t.push(`items[${e.itemIndex}]`),e.itemName&&t.push(`"${e.itemName}"`),e.includePath&&t.push(`include "${e.includePath}"`),e.filePath&&t.push(`file "${e.filePath}"`),t.length?`${t.join(" ")}: ${e.message}`:e.message}function hs(e,t){let r=X.relative(t,e);return r&&!r.startsWith("..")&&!X.isAbsolute(r)?r.split(X.sep).join("/"):r?e:"."}function nu(e){spinner(e).succeed();}function ms(e,t,r){return `${e} ${e===1?t:r}`}async function iu(e,t){return su(e)||await au(X.resolve(t,e))?null:resolveGitHubRegistrySource(e)}function su(e){return e.startsWith(".")||X.isAbsolute(e)||e.endsWith(".json")}async function au(e){try{return await be.access(e),!0}catch{return false}}var ys=new Command().name("registry").description("manage registries").addCommand(fs).addCommand(gs);var Cu=z$1.object({cwd:z$1.string(),query:z$1.string().optional(),types:z$1.array(z$1.string()).optional(),limit:z$1.number().optional(),offset:z$1.number().optional()}),ks=new Command().name("search").alias("list").description("search items from registries").argument("[registries...]","the registry addresses to search. Supports namespaces, GitHub sources and URLs. When omitted, searches all registries configured in components.json.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-t, --type <type>","filter by item type, e.g. ui, block, hook. Comma-separated for multiple.").option("-l, --limit <number>","maximum number of items to display","100").option("-o, --offset <number>","number of items to skip","0").option("--json","output as JSON.",false).action(async(e,t)=>{try{let r=Cu.parse({cwd:X__default.resolve(t.cwd),query:t.query,types:t.type?t.type.split(",").map(u=>u.trim()).filter(Boolean):void 0,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});if(r.types?.length){let u=findUnknownSearchTypes(r.types);u.length>0&&(logger.break(),logger.error(`Unknown ${u.length===1?"type":"types"}: ${u.map(g=>highlighter.info(g)).join(", ")}.`),logger.error(`Valid types: ${SEARCHABLE_TYPES.join(", ")}.`),logger.break(),process.exit(1));}await loadEnvFiles(r.cwd);let o=createConfig({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n=configWithDefaults(o),i=X__default.resolve(r.cwd,"components.json"),s=F.existsSync(i);if(s){let u=await F.readJson(i),g=rawConfigSchema.partial().parse(u);n=configWithDefaults({...o,...g});}let a=n;try{let u=await getConfig(r.cwd);u&&(a=configWithDefaults(u));}catch{}let c=e.length===0;c&&!s&&(logger.break(),logger.error(`Provide a registry or namespace to search, e.g. ${highlighter.info("shadcn search @shadcn")}.`),logger.break(),logger.error(`If you have a ${highlighter.info("components.json")} with registries configured, run ${highlighter.info("shadcn search")} with no arguments to search all of them.`),logger.break(),process.exit(1));let{config:l,newRegistries:p}=await _(e.filter(u=>u.startsWith("@")&&!a.registries?.[u]&&!(u in BUILTIN_REGISTRIES)).map(u=>`${u}/registry`),a,{silent:!0,writeFile:!1});p.length>0&&(a.registries=l.registries);let f=resolveSearchRegistries(e,a);c&&f.length===0&&(logger.break(),logger.error(`No registries are configured in ${highlighter.info("components.json")}.`),logger.error(`Provide a registry or namespace to search, e.g. ${highlighter.info("shadcn search @shadcn")}.`),logger.break(),process.exit(1)),c||validateRegistryConfigForItems(f,a);let m=await searchRegistries(f,{query:r.query,types:r.types,limit:r.limit,offset:r.offset,config:a,continueOnError:c}),d=c&&m.errors?.length===f.length;t.json?console.log(JSON.stringify(m,null,2)):printSearchResults(m,{query:r.query,types:r.types,registries:f}),process.exit(d?1:0);}catch(r){k(r);}finally{clearRegistryContext();}});var Nu=z$1.object({cwd:z$1.string()}),vs=new Command().name("view").description("view items from the registry").argument("<items...>","item addresses to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Nu.parse({cwd:X__default.resolve(t.cwd)});await loadEnvFiles(r.cwd);let o=configWithDefaults({}),n=X__default.resolve(r.cwd,"components.json");if(F.existsSync(n)){let l=await F.readJson(n),p=rawConfigSchema.partial().parse(l);o=configWithDefaults(p);}let i=o;try{let l=await getConfig(r.cwd);l&&(i=configWithDefaults(l));}catch{}let{config:s,newRegistries:a}=await _(e,i,{silent:!0,writeFile:!1});a.length>0&&(i.registries=s.registries),validateRegistryConfigForItems(e,i);let c=await getRegistryItems(e,{config:i});console.log(JSON.stringify(c,null,2)),process.exit(0);}catch(r){k(r);}finally{clearRegistryContext();}});process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function ju(){let e=new Command().name("shadcn").description("build your component library").version(Ct.version,"-v, --version","display the version number");e.addCommand(tn).addCommand(En).addCommand(kn).addCommand(An).addCommand(Ln).addCommand(vs).addCommand(ks).addCommand(as).addCommand(Mn).addCommand(ri).addCommand(On).addCommand(Wr).addCommand(lo).addCommand(ys),e.parse();}ju();
138
138
  export{qo as fetchTree,Yo as getRegistryIcons,yr as getRegistryStyles};
@@ -1,3 +1,3 @@
1
- import '@shadcn/registry/internal/preset/preset';
2
1
  import '@shadcn/registry';
3
2
  import '@shadcn/registry/schema';
3
+ import '@shadcn/registry/internal/preset/preset';
@@ -1,11 +1,12 @@
1
- import { z } from 'zod';
1
+ import { TransformOpts } from '@shadcn/registry/internal/utils/transformers/index';
2
2
  import { SourceFile } from 'ts-morph';
3
- export { transformFont } from '@shadcn/registry/internal/utils/transformers/transform-font';
4
- export { transformIcons } from '@shadcn/registry/internal/utils/transformers/transform-icons';
5
- export { transformMenu } from '@shadcn/registry/internal/utils/transformers/transform-menu';
6
- import { Transformer } from '@shadcn/registry/internal/utils/transformers/index';
3
+ import { z } from 'zod';
7
4
  export { transformDirection } from '@shadcn/registry/internal/utils/transformers/transform-rtl';
8
5
 
6
+ type SourceFileTransformer = (opts: TransformOpts & {
7
+ sourceFile: SourceFile;
8
+ }) => Promise<SourceFile>;
9
+
9
10
  declare const styleMapSchema: z.ZodRecord<z.ZodString, z.ZodString>;
10
11
  type StyleMap = z.infer<typeof styleMapSchema>;
11
12
  declare function createStyleMap(input: string): Record<string, string>;
@@ -19,6 +20,10 @@ declare function transformStyle(source: string, { styleMap, transformers, }: {
19
20
  transformers?: TransformerStyle<SourceFile>[];
20
21
  }): Promise<string>;
21
22
 
22
- declare const transformRender: Transformer;
23
+ declare const transformRenderSourceFile: SourceFileTransformer;
24
+
25
+ declare const transformFont: SourceFileTransformer;
26
+ declare const transformIcons: SourceFileTransformer;
27
+ declare const transformMenu: SourceFileTransformer;
23
28
 
24
- export { createStyleMap, transformRender, transformStyle };
29
+ export { createStyleMap, transformFont, transformIcons, transformMenu, transformRenderSourceFile as transformRender, transformStyle };
@@ -1 +1 @@
1
- import v from'postcss';import K from'postcss-selector-parser';import {z}from'zod';import {Project,ScriptKind,SyntaxKind,Node}from'ts-morph';import {twMerge}from'cn';export{transformFont}from'@shadcn/registry/internal/utils/transformers/transform-font';export{transformIcons}from'@shadcn/registry/internal/utils/transformers/transform-icons';export{transformMenu}from'@shadcn/registry/internal/utils/transformers/transform-menu';export{transformDirection}from'@shadcn/registry/internal/utils/transformers/transform-rtl';var b="cn-",R=z.record(z.string().startsWith(b),z.string());function W(t){let e=v.parse(t),r={};return e.walkRules(n=>{let s=n.selectors??[];if(s.length===0)return;let o=k(n);if(o)for(let l of s){let c=D(l);K(i=>{i.each(u=>{let f=B(u);if(!f)return;let g=f.value;g.startsWith(b)&&(r[g]=r[g]?`${o} ${r[g]}`:o);});}).processSync(c);}}),R.parse(r)}function D(t){return t.replace(/\s*&\s*/g,"").trim()}function k(t){let e=[];for(let r of t.nodes||[])if(r.type==="atrule"&&r.name==="apply"){let n=r.params.trim();n&&e.push(n);}return e.length===0?null:e.join(" ")}function B(t){let e=[];return t.walkClasses(r=>{r.value.startsWith(b)&&e.push(r);}),e.length===0?null:e[e.length-1]}var A=new Set(["cn-menu-target","cn-menu-translucent","cn-logical-sides","cn-rtl-flip","cn-font-heading"]);function p(t){return Node.isStringLiteral(t)||Node.isNoSubstitutionTemplateLiteral(t)}var M=async({sourceFile:t,styleMap:e})=>{let r=new Set;return q(t,e,r),G(t,e,r),_(t,e,r),Y(t,e,r),t};function _(t,e,r){t.forEachDescendant(n=>{if(!Node.isPropertyAssignment(n)||n.getNameNode().getText()!=="className")return;let s=n.getInitializer();!s||!Node.isCallExpression(s)||S(s)&&I(s,e,r);});}function $(t,e,r){let n=t.getLiteralText(),s=E(n);if(s.length===0)return;let o=s.filter(i=>!r.has(i));if(o.length===0){let i=m(n);t.setLiteralValue(i);return}let c=o.filter(i=>!A.has(i)).map(i=>e[i]).filter(i=>!!i);if(c.length>0){let i=c.join(" "),u=m(h(i,n));t.setLiteralValue(u),o.forEach(f=>r.add(f));}else {let i=m(n);t.setLiteralValue(i);}}function q(t,e,r){t.forEachDescendant(n=>{if(!Node.isCallExpression(n))return;let s=n.getExpression();if(!Node.isIdentifier(s)||s.getText()!=="cva")return;let o=n.getArguments()[0];Node.isStringLiteral(o)&&$(o,e,r);let l=n.getArguments()[1];if(!l||!Node.isObjectLiteralExpression(l))return;let c=l.getProperties().find(u=>Node.isPropertyAssignment(u)&&Node.isIdentifier(u.getNameNode())&&u.getNameNode().getText()==="variants");if(!c||!Node.isPropertyAssignment(c))return;let i=c.getInitializer();!i||!Node.isObjectLiteralExpression(i)||i.getProperties().forEach(u=>{if(!Node.isPropertyAssignment(u))return;let f=u.getInitializer();!f||!Node.isObjectLiteralExpression(f)||f.getProperties().forEach(g=>{if(!Node.isPropertyAssignment(g))return;let x=g.getInitializer();x&&Node.isStringLiteral(x)&&$(x,e,r);});});});}function G(t,e,r){t.forEachDescendant(n=>{if(!Node.isJsxAttribute(n)||n.getNameNode().getText()!=="className")return;let s=n.getInitializer();if(!s)return;let o=H(s);if(o.length>0){o.forEach(g=>I(g,e,r));return}let l=Q(s);if(l.length===0)return;let c=n.getParent()?.getParent();if(!c||!Node.isJsxOpeningElement(c)&&!Node.isJsxSelfClosingElement(c))return;let i=l.filter(g=>!r.has(g));if(i.length===0){P(s);return}let f=i.filter(g=>!A.has(g)).map(g=>e[g]).filter(g=>!!g);if(f.length>0){let g=f.join(" ");U(c,g);}else P(s);});}function H(t){if(!Node.isJsxExpression(t))return [];let e=t.getExpression();if(!e||Node.isCallExpression(e)&&S(e))return [];let r=[];return e.forEachDescendant(n=>{Node.isCallExpression(n)&&S(n)&&r.push(n);}),r}function Q(t){let e=[];if(p(t))return E(t.getLiteralText());if(!Node.isJsxExpression(t))return e;let r=t.getExpression();if(!r)return e;if(p(r))return E(r.getLiteralText());if(Node.isCallExpression(r)&&S(r))for(let n of r.getArguments())p(n)&&e.push(...E(n.getLiteralText()));return e}function P(t){if(p(t)){let r=m(t.getLiteralText());t.setLiteralValue(r);return}if(!Node.isJsxExpression(t))return;let e=t.getExpression();if(e){if(p(e)){let r=m(e.getLiteralText());e.setLiteralValue(r);return}if(Node.isCallExpression(e)&&S(e)){for(let r of e.getArguments())if(p(r)){let n=m(r.getLiteralText());r.setLiteralValue(n);}N(e);}}}function E(t){let e=t.matchAll(/\bcn-[\w-]+\b/g);return Array.from(e,r=>r[0])}function m(t){return t.replace(/\bcn-[\w-]+\b/g,e=>A.has(e)?e:"").replace(/\s+/g," ").trim()}function N(t){if(!S(t))return;let e=t.getArguments(),r=e.filter(n=>p(n)?n.getLiteralText().trim()!=="":true);if(r.length!==e.length){let n=r.map(o=>o.getText()),s=t.getParent();s&&Node.isJsxExpression(s)?s.replaceWithText(`{cn(${n.join(", ")})}`):t.replaceWithText(`cn(${n.join(", ")})`);}}function U(t,e){if(!Node.isJsxOpeningElement(t)&&!Node.isJsxSelfClosingElement(t))return;let r=t.getAttributes().find(o=>Node.isJsxAttribute(o)&&o.getNameNode().getText()==="className");if(!r||!Node.isJsxAttribute(r)){t.addAttribute({name:"className",initializer:`{cn(${JSON.stringify(e)})}`});return}let n=r.getInitializer();if(!n){r.setInitializer(`{cn(${JSON.stringify(e)})}`);return}if(p(n)){let o=n.getLiteralText(),l=m(h(e,o));n.setLiteralValue(l);return}if(!Node.isJsxExpression(n))return;let s=n.getExpression();if(!s){r.setInitializer(`{cn(${JSON.stringify(e)})}`);return}if(p(s)){let o=s.getLiteralText(),l=m(h(e,o));s.setLiteralValue(l);return}if(Node.isCallExpression(s)&&S(s)){let o=s.getArguments()[0];if(p(o)){let i=o.getLiteralText(),u=m(h(e,i));o.setLiteralValue(u);for(let f=1;f<s.getArguments().length;f++){let g=s.getArguments()[f];if(p(g)){let x=g.getLiteralText(),y=m(x);y!==x&&g.setLiteralValue(y);}}N(s);return}let l=s.getArguments().map(i=>{if(p(i)){let u=m(i.getLiteralText());return u?JSON.stringify(u):null}return i.getText()}).filter(i=>i!==null),c=[JSON.stringify(e),...l];r.setInitializer(`{cn(${c.join(", ")})}`);return}r.setInitializer(`{cn(${JSON.stringify(e)}, ${s.getText()})}`);}function h(t,e){return twMerge(t,e)}function S(t){let e=t.getExpression();return Node.isIdentifier(e)&&e.getText()==="cn"}function Y(t,e,r){t.forEachDescendant(n=>{if(!Node.isCallExpression(n))return;let s=n.getExpression();if(!(!Node.isIdentifier(s)||s.getText()!=="mergeProps"))for(let o of n.getArguments()){if(!Node.isObjectLiteralExpression(o))continue;let l=o.getProperties().find(i=>Node.isPropertyAssignment(i)&&Node.isIdentifier(i.getNameNode())&&i.getNameNode().getText()==="className");if(!l||!Node.isPropertyAssignment(l))continue;let c=l.getInitializer();c&&Node.isCallExpression(c)&&S(c)&&I(c,e,r,true);}});}function I(t,e,r,n=false){let s=Z(t);if(s.length===0)return;let o=s.filter(i=>!r.has(i));if(o.length===0){w(t);return}let c=o.filter(i=>!A.has(i)).map(i=>e[i]).filter(i=>!!i);if(c.length===0){w(t);return}tt(t,c.join(" ")),n&&o.forEach(i=>r.add(i));}function Z(t){let e=[];for(let r of t.getArguments())p(r)&&e.push(...E(r.getLiteralText()));return e}function w(t){for(let e of t.getArguments())if(p(e)){let r=m(e.getLiteralText());e.setLiteralValue(r);}N(t);}function tt(t,e){let r=t.getArguments()[0];if(p(r)){let l=r.getLiteralText(),c=m(h(e,l));r.setLiteralValue(c);for(let i=1;i<t.getArguments().length;i++){let u=t.getArguments()[i];if(p(u)){let f=u.getLiteralText(),g=m(f);g!==f&&u.setLiteralValue(g);}}N(t);return}let n=t.getArguments().map(l=>{if(p(l)){let c=m(l.getLiteralText());return c?JSON.stringify(c):null}return l.getText()}).filter(l=>l!==null),s=[JSON.stringify(e),...n];t.getParent()&&t.replaceWithText(`cn(${s.join(", ")})`);}async function nt(t,{styleMap:e,transformers:r=[M]}){let s=new Project({useInMemoryFileSystem:true}).createSourceFile("component.tsx",t,{scriptKind:ScriptKind.TSX,overwrite:true});for(let o of r)await o({sourceFile:s,styleMap:e});return s.getText()}var st=async({sourceFile:t,config:e})=>{if(!e.style?.startsWith("base-"))return t;let r=[],n=t.getDescendantsOfKind(SyntaxKind.JsxElement);for(let s of n){let o=s.getOpeningElement(),l=o.getAttribute("render");if(!l)continue;let i=s.getJsxChildren().map(d=>d.getText()).join("").trim();if(!i||l.getKind()!==SyntaxKind.JsxAttribute)continue;let f=l.asKindOrThrow(SyntaxKind.JsxAttribute).getInitializer();if(!f||f.getKind()!==SyntaxKind.JsxExpression)continue;let x=f.asKindOrThrow(SyntaxKind.JsxExpression).getExpression();if(!x||x.getKind()!==SyntaxKind.JsxSelfClosingElement)continue;let y=x.asKindOrThrow(SyntaxKind.JsxSelfClosingElement),C=y.getTagNameNode().getText(),J=y.getAttributes().map(d=>d.getText()).join(" "),j=J?`{<${C} ${J}>${i}</${C}>}`:`{<${C}>${i}</${C}>}`,F=o.getTagNameNode().getText(),O=o.getAttributes().filter(d=>d.getKind()===SyntaxKind.JsxAttribute?d.asKindOrThrow(SyntaxKind.JsxAttribute).getNameNode().getText()!=="render":true).map(d=>d.getText()).join(" "),V=O?`${O} render=${j}`:`render=${j}`,z=`<${F} ${V} />`;r.push({elementStart:s.getStart(),elementEnd:s.getEnd(),newText:z});}for(let s of r.reverse()){let o=t.getFullText(),l=o.substring(0,s.elementStart)+s.newText+o.substring(s.elementEnd);t.replaceWithText(l);}return t};export{W as createStyleMap,st as transformRender,nt as transformStyle};
1
+ import {transformFont}from'@shadcn/registry/internal/utils/transformers/transform-font';import {transformIcons}from'@shadcn/registry/internal/utils/transformers/transform-icons';import {transformMenu}from'@shadcn/registry/internal/utils/transformers/transform-menu';import'path';import {Project,ScriptKind,SyntaxKind,Node}from'ts-morph';import q from'postcss';import G from'postcss-selector-parser';import {z as z$1}from'zod';import {twMerge}from'cn';export{transformDirection}from'@shadcn/registry/internal/utils/transformers/transform-rtl';function A(e){return async({sourceFile:t,...r})=>(X(t,await e(t.getFullText(),r)),t)}function X(e,t){let r=e.getFullText();t!==r&&e.applyTextChanges([{span:{start:0,length:r.length},newText:t}]);}var I="cn-",H=z$1.record(z$1.string().startsWith(I),z$1.string());function Q(e){let t=q.parse(e),r={};return t.walkRules(n=>{let s=n.selectors??[];if(s.length===0)return;let o=Y(n);if(o)for(let l of s){let c=U(l);G(i=>{i.each(g=>{let u=Z(g);if(!u)return;let f=u.value;f.startsWith(I)&&(r[f]=r[f]?`${o} ${r[f]}`:o);});}).processSync(c);}}),H.parse(r)}function U(e){return e.replace(/\s*&\s*/g,"").trim()}function Y(e){let t=[];for(let r of e.nodes||[])if(r.type==="atrule"&&r.name==="apply"){let n=r.params.trim();n&&t.push(n);}return t.length===0?null:t.join(" ")}function Z(e){let t=[];return e.walkClasses(r=>{r.value.startsWith(I)&&t.push(r);}),t.length===0?null:t[t.length-1]}var N=new Set(["cn-menu-target","cn-menu-translucent","cn-logical-sides","cn-rtl-flip","cn-font-heading"]);function m(e){return Node.isStringLiteral(e)||Node.isNoSubstitutionTemplateLiteral(e)}var z=async({sourceFile:e,styleMap:t})=>{let r=new Set;return re(e,t,r),ne(e,t,r),te(e,t,r),ae(e,t,r),e};function te(e,t,r){e.forEachDescendant(n=>{if(!Node.isPropertyAssignment(n)||n.getNameNode().getText()!=="className")return;let s=n.getInitializer();!s||!Node.isCallExpression(s)||d(s)&&j(s,t,r);});}function M(e,t,r){let n=e.getLiteralText(),s=h(n);if(s.length===0)return;let o=s.filter(i=>!r.has(i));if(o.length===0){let i=p(n);e.setLiteralValue(i);return}let c=o.filter(i=>!N.has(i)).map(i=>t[i]).filter(i=>!!i);if(c.length>0){let i=c.join(" "),g=p(E(i,n));e.setLiteralValue(g),o.forEach(u=>r.add(u));}else {let i=p(n);e.setLiteralValue(i);}}function re(e,t,r){e.forEachDescendant(n=>{if(!Node.isCallExpression(n))return;let s=n.getExpression();if(!Node.isIdentifier(s)||s.getText()!=="cva")return;let o=n.getArguments()[0];Node.isStringLiteral(o)&&M(o,t,r);let l=n.getArguments()[1];if(!l||!Node.isObjectLiteralExpression(l))return;let c=l.getProperties().find(g=>Node.isPropertyAssignment(g)&&Node.isIdentifier(g.getNameNode())&&g.getNameNode().getText()==="variants");if(!c||!Node.isPropertyAssignment(c))return;let i=c.getInitializer();!i||!Node.isObjectLiteralExpression(i)||i.getProperties().forEach(g=>{if(!Node.isPropertyAssignment(g))return;let u=g.getInitializer();!u||!Node.isObjectLiteralExpression(u)||u.getProperties().forEach(f=>{if(!Node.isPropertyAssignment(f))return;let x=f.getInitializer();x&&Node.isStringLiteral(x)&&M(x,t,r);});});});}function ne(e,t,r){e.forEachDescendant(n=>{if(!Node.isJsxAttribute(n)||n.getNameNode().getText()!=="className")return;let s=n.getInitializer();if(!s)return;let o=se(s);if(o.length>0){o.forEach(f=>j(f,t,r));return}let l=ie(s);if(l.length===0)return;let c=n.getParent()?.getParent();if(!c||!Node.isJsxOpeningElement(c)&&!Node.isJsxSelfClosingElement(c))return;let i=l.filter(f=>!r.has(f));if(i.length===0){V(s);return}let u=i.filter(f=>!N.has(f)).map(f=>t[f]).filter(f=>!!f);if(u.length>0){let f=u.join(" ");oe(c,f);}else V(s);});}function se(e){if(!Node.isJsxExpression(e))return [];let t=e.getExpression();if(!t||Node.isCallExpression(t)&&d(t))return [];let r=[];return t.forEachDescendant(n=>{Node.isCallExpression(n)&&d(n)&&r.push(n);}),r}function ie(e){let t=[];if(m(e))return h(e.getLiteralText());if(!Node.isJsxExpression(e))return t;let r=e.getExpression();if(!r)return t;if(m(r))return h(r.getLiteralText());if(Node.isCallExpression(r)&&d(r))for(let n of r.getArguments())m(n)&&t.push(...h(n.getLiteralText()));return t}function V(e){if(m(e)){let r=p(e.getLiteralText());e.setLiteralValue(r);return}if(!Node.isJsxExpression(e))return;let t=e.getExpression();if(t){if(m(t)){let r=p(t.getLiteralText());t.setLiteralValue(r);return}if(Node.isCallExpression(t)&&d(t)){for(let r of t.getArguments())if(m(r)){let n=p(r.getLiteralText());r.setLiteralValue(n);}L(t);}}}function h(e){let t=e.matchAll(/\bcn-[\w-]+\b/g);return Array.from(t,r=>r[0])}function p(e){return e.replace(/\bcn-[\w-]+\b/g,t=>N.has(t)?t:"").replace(/\s+/g," ").trim()}function L(e){if(!d(e))return;let t=e.getArguments(),r=t.filter(n=>m(n)?n.getLiteralText().trim()!=="":true);if(r.length!==t.length){let n=r.map(o=>o.getText()),s=e.getParent();s&&Node.isJsxExpression(s)?s.replaceWithText(`{cn(${n.join(", ")})}`):e.replaceWithText(`cn(${n.join(", ")})`);}}function oe(e,t){if(!Node.isJsxOpeningElement(e)&&!Node.isJsxSelfClosingElement(e))return;let r=e.getAttributes().find(o=>Node.isJsxAttribute(o)&&o.getNameNode().getText()==="className");if(!r||!Node.isJsxAttribute(r)){e.addAttribute({name:"className",initializer:`{cn(${JSON.stringify(t)})}`});return}let n=r.getInitializer();if(!n){r.setInitializer(`{cn(${JSON.stringify(t)})}`);return}if(m(n)){let o=n.getLiteralText(),l=p(E(t,o));n.setLiteralValue(l);return}if(!Node.isJsxExpression(n))return;let s=n.getExpression();if(!s){r.setInitializer(`{cn(${JSON.stringify(t)})}`);return}if(m(s)){let o=s.getLiteralText(),l=p(E(t,o));s.setLiteralValue(l);return}if(Node.isCallExpression(s)&&d(s)){let o=s.getArguments()[0];if(m(o)){let i=o.getLiteralText(),g=p(E(t,i));o.setLiteralValue(g);for(let u=1;u<s.getArguments().length;u++){let f=s.getArguments()[u];if(m(f)){let x=f.getLiteralText(),y=p(x);y!==x&&f.setLiteralValue(y);}}L(s);return}let l=s.getArguments().map(i=>{if(m(i)){let g=p(i.getLiteralText());return g?JSON.stringify(g):null}return i.getText()}).filter(i=>i!==null),c=[JSON.stringify(t),...l];r.setInitializer(`{cn(${c.join(", ")})}`);return}r.setInitializer(`{cn(${JSON.stringify(t)}, ${s.getText()})}`);}function E(e,t){return twMerge(e,t)}function d(e){let t=e.getExpression();return Node.isIdentifier(t)&&t.getText()==="cn"}function ae(e,t,r){e.forEachDescendant(n=>{if(!Node.isCallExpression(n))return;let s=n.getExpression();if(!(!Node.isIdentifier(s)||s.getText()!=="mergeProps"))for(let o of n.getArguments()){if(!Node.isObjectLiteralExpression(o))continue;let l=o.getProperties().find(i=>Node.isPropertyAssignment(i)&&Node.isIdentifier(i.getNameNode())&&i.getNameNode().getText()==="className");if(!l||!Node.isPropertyAssignment(l))continue;let c=l.getInitializer();c&&Node.isCallExpression(c)&&d(c)&&j(c,t,r,true);}});}function j(e,t,r,n=false){let s=le(e);if(s.length===0)return;let o=s.filter(i=>!r.has(i));if(o.length===0){v(e);return}let c=o.filter(i=>!N.has(i)).map(i=>t[i]).filter(i=>!!i);if(c.length===0){v(e);return}ce(e,c.join(" ")),n&&o.forEach(i=>r.add(i));}function le(e){let t=[];for(let r of e.getArguments())m(r)&&t.push(...h(r.getLiteralText()));return t}function v(e){for(let t of e.getArguments())if(m(t)){let r=p(t.getLiteralText());t.setLiteralValue(r);}L(e);}function ce(e,t){let r=e.getArguments()[0];if(m(r)){let l=r.getLiteralText(),c=p(E(t,l));r.setLiteralValue(c);for(let i=1;i<e.getArguments().length;i++){let g=e.getArguments()[i];if(m(g)){let u=g.getLiteralText(),f=p(u);f!==u&&g.setLiteralValue(f);}}L(e);return}let n=e.getArguments().map(l=>{if(m(l)){let c=p(l.getLiteralText());return c?JSON.stringify(c):null}return l.getText()}).filter(l=>l!==null),s=[JSON.stringify(t),...n];e.getParent()&&e.replaceWithText(`cn(${s.join(", ")})`);}async function ge(e,{styleMap:t,transformers:r=[z]}){let s=new Project({useInMemoryFileSystem:true}).createSourceFile("component.tsx",e,{scriptKind:ScriptKind.TSX,overwrite:true});for(let o of r)await o({sourceFile:s,styleMap:t});return s.getText()}var K=async({sourceFile:e,config:t})=>{if(!t.style?.startsWith("base-"))return e;let r=[],n=e.getDescendantsOfKind(SyntaxKind.JsxElement);for(let s of n){let o=s.getOpeningElement(),l=o.getAttribute("render");if(!l)continue;let i=s.getJsxChildren().map(S=>S.getText()).join("").trim();if(!i||l.getKind()!==SyntaxKind.JsxAttribute)continue;let u=l.asKindOrThrow(SyntaxKind.JsxAttribute).getInitializer();if(!u||u.getKind()!==SyntaxKind.JsxExpression)continue;let x=u.asKindOrThrow(SyntaxKind.JsxExpression).getExpression();if(!x||x.getKind()!==SyntaxKind.JsxSelfClosingElement)continue;let y=x.asKindOrThrow(SyntaxKind.JsxSelfClosingElement),C=y.getTagNameNode().getText(),J=y.getAttributes().map(S=>S.getText()).join(" "),O=J?`{<${C} ${J}>${i}</${C}>}`:`{<${C}>${i}</${C}>}`,R=o.getTagNameNode().getText(),P=o.getAttributes().filter(S=>S.getKind()===SyntaxKind.JsxAttribute?S.asKindOrThrow(SyntaxKind.JsxAttribute).getNameNode().getText()!=="render":true).map(S=>S.getText()).join(" "),W=P?`${P} render=${O}`:`render=${O}`,D=`<${R} ${W} />`;r.push({elementStart:s.getStart(),elementEnd:s.getEnd(),newText:D});}for(let s of r.reverse()){let o=e.getFullText(),l=o.substring(0,s.elementStart)+s.newText+o.substring(s.elementEnd);e.replaceWithText(l);}return e};var ze=A(transformFont),Ke=A(transformIcons),Re=A(transformMenu);export{Q as createStyleMap,ze as transformFont,Ke as transformIcons,Re as transformMenu,K as transformRender,ge as transformStyle};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shadcn",
3
- "version": "4.21.3",
3
+ "version": "4.21.4",
4
4
  "description": "Add components to your apps.",
5
5
  "homepage": "https://ui.shadcn.com",
6
6
  "publishConfig": {
@@ -99,7 +99,7 @@
99
99
  "validate-npm-package-name": "^7.0.1",
100
100
  "zod": "^3.24.1",
101
101
  "zod-to-json-schema": "^3.24.6",
102
- "@shadcn/registry": "0.1.2"
102
+ "@shadcn/registry": "0.1.3"
103
103
  },
104
104
  "devDependencies": {
105
105
  "@antfu/ni": "^25.0.0",