reborn-ui 0.1.73 → 0.1.76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +14 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/registry/components/reborn-back-top.json +2 -1
- package/registry/components/reborn-badge.json +2 -1
- package/registry/components/reborn-button.json +4 -2
- package/registry/components/reborn-checkbox.json +4 -2
- package/registry/components/reborn-chip.json +2 -1
- package/registry/components/reborn-collapse.json +2 -1
- package/registry/components/reborn-form.json +4 -2
- package/registry/components/reborn-image.json +2 -1
- package/registry/components/reborn-input-number.json +2 -1
- package/registry/components/reborn-input.json +4 -2
- package/registry/components/reborn-sticky.json +2 -1
- package/registry/components/reborn-switch.json +2 -1
- package/registry/components/reborn-tabs.json +2 -1
- package/registry/components/reborn-textarea.json +2 -1
- package/registry/registry.json +37 -19
- package/registry/components/animated-beam.json +0 -22
- package/registry/components/aurora-background.json +0 -22
- package/registry/components/bending-gallery.json +0 -24
- package/registry/components/bg-black-hole.json +0 -20
- package/registry/components/bg-bubbles.json +0 -24
- package/registry/components/bg-falling-stars.json +0 -22
- package/registry/components/bg-neural.json +0 -20
- package/registry/components/bg-particle-whirlpool.json +0 -24
- package/registry/components/bg-silk.json +0 -22
- package/registry/components/bg-singularity.json +0 -22
- package/registry/components/bg-stars.json +0 -24
- package/registry/components/bg-stractium.json +0 -22
- package/registry/components/bg-thunderstorm.json +0 -22
- package/registry/components/border-beam.json +0 -22
- package/registry/components/card-spotlight.json +0 -22
- package/registry/components/carousel-3d.json +0 -25
- package/registry/components/confetti.json +0 -34
- package/registry/components/cosmic-portal.json +0 -24
- package/registry/components/file-tree.json +0 -52
- package/registry/components/flickering-grid.json +0 -22
- package/registry/components/fluid-cursor.json +0 -22
- package/registry/components/github-globe.json +0 -29
- package/registry/components/globe.json +0 -25
- package/registry/components/glow-border.json +0 -22
- package/registry/components/glowing-effect.json +0 -24
- package/registry/components/icon-cloud.json +0 -22
- package/registry/components/image-trail-cursor.json +0 -28
- package/registry/components/infinite-grid.json +0 -53
- package/registry/components/interactive-grid-pattern.json +0 -22
- package/registry/components/lamp-effect.json +0 -22
- package/registry/components/light-speed.json +0 -37
- package/registry/components/liquid-background.json +0 -24
- package/registry/components/liquid-glass.json +0 -22
- package/registry/components/liquid-logo.json +0 -30
- package/registry/components/logo-cloud.json +0 -42
- package/registry/components/logo-origami.json +0 -34
- package/registry/components/orbit.json +0 -22
- package/registry/components/particle-image.json +0 -30
- package/registry/components/particles-bg.json +0 -24
- package/registry/components/pattern-background.json +0 -24
- package/registry/components/sleek-line-cursor.json +0 -18
- package/registry/components/smooth-cursor.json +0 -35
- package/registry/components/snowfall-bg.json +0 -24
- package/registry/components/spline.json +0 -35
- package/registry/components/tailed-cursor.json +0 -20
- package/registry/components/tetris.json +0 -25
- package/registry/components/video-text.json +0 -22
- package/registry/components/vortex.json +0 -24
- package/registry/components/warp-background.json +0 -34
- package/registry/components/wavy-background.json +0 -24
- package/registry/components/world-map.json +0 -25
package/dist/index.js
CHANGED
|
@@ -451,7 +451,19 @@ function buildCommand() {
|
|
|
451
451
|
if (ext === ".vue") {
|
|
452
452
|
files.push({ path: rel, content, target: "web" });
|
|
453
453
|
} else {
|
|
454
|
-
|
|
454
|
+
let target;
|
|
455
|
+
if (uniappSourceDir) {
|
|
456
|
+
const parts = rel.split("/");
|
|
457
|
+
const uniappFile = path5.join(uniappSourceDir, name, ...parts);
|
|
458
|
+
if (fssync.existsSync(uniappFile)) {
|
|
459
|
+
target = "web";
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
if (target) {
|
|
463
|
+
files.push({ path: rel, content, target });
|
|
464
|
+
} else {
|
|
465
|
+
files.push({ path: rel, content });
|
|
466
|
+
}
|
|
455
467
|
}
|
|
456
468
|
if (ext === ".ts" || ext === ".js" || ext === ".vue") {
|
|
457
469
|
for (const dep of extractNpmDependenciesFromText(content)) {
|
|
@@ -1087,7 +1099,7 @@ function initCommand() {
|
|
|
1087
1099
|
// package.json
|
|
1088
1100
|
var package_default = {
|
|
1089
1101
|
name: "reborn-ui",
|
|
1090
|
-
version: "0.1.
|
|
1102
|
+
version: "0.1.76",
|
|
1091
1103
|
description: "A CLI for Reborn UI",
|
|
1092
1104
|
author: "1997liuyh-boop",
|
|
1093
1105
|
license: "MIT",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/utils/fs.ts","../src/utils/pm.ts","../src/utils/registry.ts","../src/utils/ui.ts","../src/commands/build.ts","../src/utils/imports.ts","../src/utils/transformers.ts","../src/commands/init.ts","../src/utils/templates.ts","../src/generated/templates.ts","../package.json"],"sourcesContent":["import { Command } from \"commander\";\r\nimport { addCommand } from \"./commands/add.js\";\r\nimport { buildCommand } from \"./commands/build.js\";\r\nimport { initCommand } from \"./commands/init.js\";\r\nimport packageJson from \"../package.json\" assert { type: \"json\" };\r\n\r\nconst program = new Command()\r\n .name(\"reborn-ui\")\r\n .description(\"Reborn UI - 组件安装与 registry 辅助 CLI\")\r\n .version(packageJson.version);\r\n\r\nprogram.addCommand(initCommand());\r\nprogram.addCommand(addCommand());\r\nprogram.addCommand(buildCommand());\r\n\r\nawait program.parseAsync(process.argv);\r\n\r\n\r\n","import path from \"node:path\";\r\nimport { Command } from \"commander\";\r\nimport prompts from \"prompts\";\r\nimport type { PackageManager, RegistryComponent } from \"../types.js\";\r\nimport { ensureDir, pathExists, writeTextFile } from \"../utils/fs.js\";\r\nimport {\r\n detectPackageManager,\r\n readPackageJson,\r\n} from \"../utils/pm.js\";\r\nimport { defaultConfig, loadConfigCompat, loadRegistry } from \"../utils/registry.js\";\r\nimport cliProgress from \"cli-progress\";\r\nimport chalk from \"chalk\";\r\nimport { successLog } from \"../utils/ui.js\";\r\n\r\nfunction rewriteImports(params: {\r\n content: string;\r\n aliasSymbol: string;\r\n}) {\r\n const { content, aliasSymbol } = params;\r\n if (!aliasSymbol || aliasSymbol === \"@\") return content;\r\n\r\n // 仅替换项目根目录映射符号:把 \"@/xxx\" -> \"<aliasSymbol>/xxx\"\r\n // 注意:不要影响 scoped package(@scope/name),这里只替换 \"@/\" 前缀。\r\n return content.replaceAll(\"@/\", `${aliasSymbol}/`);\r\n}\r\n\r\nasync function writeComponentFiles(params: {\r\n cwd: string;\r\n componentsDir: string;\r\n aliasSymbol: string;\r\n component: RegistryComponent;\r\n overwrite?: boolean;\r\n onProgress?: () => void;\r\n platform: \"web\" | \"uniapp\";\r\n}) {\r\n const { cwd, componentsDir, aliasSymbol, component, overwrite, onProgress, platform } = params;\r\n const baseDir = path.join(cwd, componentsDir, component.name);\r\n await ensureDir(baseDir);\r\n\r\n for (const f of component.files) {\r\n // 过滤逻辑:\r\n // 1. 如果 f.target 存在且不等于 platform,跳过\r\n // 2. 如果 f.target 不存在,视为通用文件,不跳过\r\n if (f.target && f.target !== platform) {\r\n continue;\r\n }\r\n\r\n const target = path.join(baseDir, ...f.path.split(\"/\"));\r\n if (!overwrite && (await pathExists(target))) {\r\n onProgress?.();\r\n continue;\r\n }\r\n const nextContent = rewriteImports({ content: f.content, aliasSymbol });\r\n await writeTextFile(target, nextContent);\r\n onProgress?.();\r\n // 增加一个极小的延迟,让进度条看起来在“跑”\r\n await new Promise(r => setTimeout(r, 10));\r\n }\r\n\r\n return baseDir;\r\n}\r\n\r\nexport function addCommand() {\r\n const cmd = new Command(\"add\")\r\n .description(\"向项目中添加组件与相关依赖\")\r\n .argument(\"[components...]\", \"组件名(可多个)\")\r\n .option(\"--cwd <path>\", \"目标项目目录\", process.cwd())\r\n .option(\"--pm <pm>\", \"包管理器:pnpm|npm|yarn|bun\")\r\n .option(\"--yes\", \"跳过交互\", false)\r\n .option(\"--overwrite\", \"覆盖已存在文件\", false)\r\n .option(\"--config <path>\", \"配置文件路径(相对 cwd)\", \"components.json\")\r\n .option(\"--registry <pkgOrPath>\", \"覆盖配置里的 registry\")\r\n .option(\"--components-dir <path>\", \"覆盖配置里的 componentsDir\")\r\n .option(\"--lib-dir <path>\", \"覆盖配置里的 libDir\")\r\n .option(\"--alias-symbol <symbol>\", \"覆盖配置里的 aliasSymbol(默认 @)\")\r\n .action(async (components: string[], opts) => {\r\n const cwd = path.resolve(opts.cwd);\r\n const pm: PackageManager =\r\n opts.pm ?? (await detectPackageManager(cwd));\r\n\r\n const cfg = (await loadConfigCompat(cwd, opts.config)) ?? defaultConfig();\r\n if (opts.registry) cfg.registry = opts.registry;\r\n if (opts.componentsDir) cfg.componentsDir = opts.componentsDir;\r\n if (opts.libDir) cfg.libDir = opts.libDir;\r\n if (opts.aliasSymbol) cfg.aliasSymbol = opts.aliasSymbol;\r\n\r\n const registry = await loadRegistry({ cwd, registry: cfg.registry });\r\n\r\n let targets = components ?? [];\r\n if (!targets.length) {\r\n if (opts.yes) {\r\n throw new Error(\"未指定组件名;请传入组件参数或去掉 --yes 以交互选择。\");\r\n }\r\n const choices = registry.components?.map((c) => ({\r\n title: c.name,\r\n value: c.name,\r\n }));\r\n const res = await prompts(\r\n [\r\n {\r\n type: \"multiselect\",\r\n name: \"selected\",\r\n message: \"选择要添加的组件\",\r\n choices,\r\n min: 1,\r\n },\r\n ],\r\n {\r\n onCancel: () => {\r\n throw new Error(\"已取消\");\r\n },\r\n },\r\n );\r\n targets = res.selected ?? [];\r\n }\r\n\r\n // 询问平台 (Web / UniApp)\r\n const { platform } = await prompts({\r\n type: \"select\",\r\n name: \"platform\",\r\n message: \"选择目标平台\",\r\n choices: [\r\n { title: \"Web (默认)\", value: \"web\" },\r\n { title: \"UniApp\", value: \"uniapp\" },\r\n ],\r\n initial: 0,\r\n });\r\n\r\n if (!platform) {\r\n throw new Error(\"已取消\");\r\n }\r\n\r\n const totalFiles = targets.reduce((acc, name) => {\r\n const c = registry.components.find((x) => x.name === name);\r\n return acc + (c?.files.length ?? 0);\r\n }, 0);\r\n\r\n const bar = new cliProgress.SingleBar({\r\n format: '正在写入文件 |' + chalk.cyan('{bar}') + '| {percentage}% || {value}/{total} 文件',\r\n barCompleteChar: '\\u2588',\r\n barIncompleteChar: '\\u2591',\r\n hideCursor: true\r\n });\r\n\r\n bar.start(totalFiles, 0);\r\n\r\n for (const name of targets) {\r\n const c = registry.components.find((x) => x.name === name);\r\n if (!c) {\r\n bar.stop();\r\n throw new Error(`registry 中不存在该组件:${name}`);\r\n }\r\n\r\n await writeComponentFiles({\r\n cwd,\r\n componentsDir: cfg.componentsDir,\r\n aliasSymbol: cfg.aliasSymbol ?? \"@\",\r\n component: c,\r\n overwrite: opts.overwrite,\r\n onProgress: () => bar.increment(),\r\n platform,\r\n });\r\n }\r\n bar.stop();\r\n\r\n console.log(\"\");\r\n for (const name of targets) {\r\n successLog(`组件 ${chalk.bold(name)} 已成功添加到项目`);\r\n }\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(`\\n${chalk.bold.green('DONE')} 已完成 ${targets.length} 个组件的添加(pm=${pm})`);\r\n });\r\n\r\n return cmd;\r\n}\r\n\r\n\r\n","import { createHash } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function pathExists(p: string) {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dirPath: string) {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n const raw = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n}\n\nexport async function writeJsonFile(filePath: string, data: unknown) {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport async function writeTextFile(filePath: string, content: string) {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, \"utf8\");\n}\n\nexport async function listFilesRecursive(\n dirPath: string,\n opts?: { ignoreDirNames?: Set<string> },\n) {\n const ignoreDirNames =\n opts?.ignoreDirNames ??\n new Set([\"node_modules\", \".git\", \".nuxt\", \"dist\", \".output\"]);\n\n const out: string[] = [];\n\n async function walk(current: string) {\n const entries = await fs.readdir(current, { withFileTypes: true });\n for (const entry of entries) {\n const p = path.join(current, entry.name);\n if (entry.isDirectory()) {\n if (ignoreDirNames.has(entry.name)) continue;\n await walk(p);\n } else if (entry.isFile()) {\n out.push(p);\n }\n }\n }\n\n await walk(dirPath);\n return out;\n}\n\nexport async function copyDirRecursive(params: {\n fromDir: string;\n toDir: string;\n overwrite?: boolean;\n ignoreFileNames?: Set<string>;\n}) {\n const { fromDir, toDir, overwrite } = params;\n const ignoreFileNames = params.ignoreFileNames ?? new Set([\".DS_Store\"]);\n\n const entries = await fs.readdir(fromDir, { withFileTypes: true });\n await ensureDir(toDir);\n\n for (const entry of entries) {\n if (ignoreFileNames.has(entry.name)) continue;\n const from = path.join(fromDir, entry.name);\n const to = path.join(toDir, entry.name);\n\n if (entry.isDirectory()) {\n await copyDirRecursive({ fromDir: from, toDir: to, overwrite, ignoreFileNames });\n continue;\n }\n\n if (!entry.isFile()) continue;\n\n if (!overwrite) {\n try {\n await fs.access(to);\n continue; // 已存在则跳过\n } catch {\n // not exists\n }\n }\n\n await ensureDir(path.dirname(to));\n await fs.copyFile(from, to);\n }\n}\n\nexport function sha1(text: string) {\n return createHash(\"sha1\").update(text).digest(\"hex\");\n}\n\n\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { execa } from \"execa\";\r\nimport type { PackageManager } from \"../types.js\";\r\nimport { pathExists, readJsonFile, writeJsonFile } from \"./fs.js\";\r\n\r\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\r\n if (await pathExists(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\r\n if (await pathExists(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\r\n if (await pathExists(path.join(cwd, \"package-lock.json\"))) return \"npm\";\r\n if (await pathExists(path.join(cwd, \"bun.lockb\"))) return \"bun\";\r\n return \"pnpm\";\r\n}\r\n\r\nexport async function readPackageJson(\r\n cwd: string,\r\n): Promise<Record<string, any> & { dependencies?: Record<string, string>; devDependencies?: Record<string, string> }> {\r\n return await readJsonFile(path.join(cwd, \"package.json\"));\r\n}\r\n\r\nexport async function writePackageJson(cwd: string, pkg: unknown) {\r\n await writeJsonFile(path.join(cwd, \"package.json\"), pkg);\r\n}\r\n\r\nexport function getMissingDeps(\r\n pkg: { dependencies?: Record<string, string>; devDependencies?: Record<string, string> },\r\n deps: string[],\r\n) {\r\n const existing = new Set([\r\n ...Object.keys(pkg.dependencies ?? {}),\r\n ...Object.keys(pkg.devDependencies ?? {}),\r\n ]);\r\n return deps.filter((d) => !existing.has(d));\r\n}\r\n\r\nexport async function installDeps(params: {\r\n cwd: string;\r\n pm: PackageManager;\r\n deps: string[];\r\n dev?: boolean;\r\n}) {\r\n const { cwd, pm, deps, dev } = params;\r\n if (!deps.length) return;\r\n\r\n const args: string[] = [];\r\n if (pm === \"pnpm\") args.push(\"add\");\r\n else if (pm === \"npm\") args.push(\"install\");\r\n else if (pm === \"yarn\") args.push(\"add\");\r\n else if (pm === \"bun\") args.push(\"add\");\r\n\r\n if (dev) {\r\n if (pm === \"npm\") args.push(\"--save-dev\");\r\n else args.push(\"-D\");\r\n }\r\n\r\n args.push(...deps);\r\n\r\n await execa(pm, args, { cwd, stdio: \"inherit\" });\r\n}\r\n\r\nexport async function ensureJsonFile(cwd: string, relPath: string, defaultJson: unknown) {\r\n const p = path.join(cwd, relPath);\r\n if (await pathExists(p)) return;\r\n await fs.mkdir(path.dirname(p), { recursive: true });\r\n await fs.writeFile(p, JSON.stringify(defaultJson, null, 2) + \"\\n\", \"utf8\");\r\n}\r\n\r\n\r\n","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport type { CliConfig, RegistryFile } from \"../types.js\";\nimport { pathExists, readJsonFile } from \"./fs.js\";\n\nexport const DEFAULT_CONFIG_PATH = \"components.json\";\n\nfunction findNearestPackageRoot(from: string) {\n // from: import.meta.url\n let dir = path.dirname(fileURLToPath(from));\n while (true) {\n if (fs.existsSync(path.join(dir, \"package.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return dir;\n dir = parent;\n }\n}\n\nexport function defaultConfig(): CliConfig {\n return {\n schemaVersion: 1,\n componentsDir: \"components\",\n libDir: \"lib\",\n composablesDir: \"composables\",\n // 默认使用 CLI 包内置的 registry(随 reborn-ui 一起发布)\n registry: \"builtin\",\n // 项目根目录映射别名符号(默认 @)\n aliasSymbol: \"@\",\n };\n}\n\nexport async function loadConfig(cwd: string, configPath = DEFAULT_CONFIG_PATH) {\n const abs = path.isAbsolute(configPath)\n ? configPath\n : path.join(cwd, configPath);\n if (!(await pathExists(abs))) return null;\n return await readJsonFile<CliConfig>(abs);\n}\n\nexport function resolveRegistryJsonPath(params: { cwd: string; registry: string }) {\n const { cwd, registry } = params;\n\n // 0) 内置 registry\n if (!registry || registry === \"builtin\") {\n // 注意:CLI 经过打包后可能变成单文件(例如 dist/index.js),\n // import.meta.url 的相对基准会变化,不能用固定的 ../../registry/...\n // 这里通过向上查找最近的 package.json 来定位包根目录。\n const pkgRoot = findNearestPackageRoot(import.meta.url);\n return path.join(pkgRoot, \"registry\", \"registry.json\");\n }\n\n // 1) 如果是文件路径(包含分隔符或 .json),优先当成路径处理\n const looksLikePath =\n registry.includes(\"/\") ||\n registry.includes(\"\\\\\") ||\n registry.endsWith(\".json\");\n\n if (looksLikePath) {\n const abs = path.isAbsolute(registry) ? registry : path.join(cwd, registry);\n return abs;\n }\n\n // 2) 当成包名处理:默认读取 <pkg>/registry/registry.json\n const require = createRequire(import.meta.url);\n // 不显式绑定 cwd,避免 npx 场景下找不到 registry 包\n return require.resolve(`${registry}/registry/registry.json`);\n}\n\nexport async function loadRegistry(params: { cwd: string; registry: string }) {\n const jsonPath = resolveRegistryJsonPath(params);\n return await readJsonFile<RegistryFile>(jsonPath);\n}\n\n// 兼容旧配置文件名:shadcn-docs.json\nexport async function loadConfigCompat(cwd: string, configPath?: string) {\n if (configPath) return await loadConfig(cwd, configPath);\n const primary = await loadConfig(cwd, DEFAULT_CONFIG_PATH);\n if (primary) return primary;\n return await loadConfig(cwd, \"shadcn-docs.json\");\n}\n\n\n","import chalk from 'chalk';\r\nimport figlet from 'figlet';\r\n\r\n/**\r\n * 模拟打字机效果\r\n * @param text 要显示的文本\r\n * @param delay 每字符延迟时间 (ms)\r\n * @param newline 是否在结束时换行\r\n */\r\nexport async function typewriter(text: string, delay: number = 15, newline: boolean = true) {\r\n for (const char of text) {\r\n process.stdout.write(char);\r\n if (delay > 0) {\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n }\r\n }\r\n if (newline) {\r\n process.stdout.write('\\n');\r\n }\r\n}\r\n\r\n/**\r\n * 显示 ASCII Logo\r\n */\r\nexport async function showLogo(text: string = 'Reborn UI') {\r\n return new Promise<void>((resolve) => {\r\n figlet.text(text, {\r\n font: 'Slant',\r\n horizontalLayout: 'default',\r\n verticalLayout: 'default',\r\n width: 80,\r\n whitespaceBreak: true\r\n }, async (err, data) => {\r\n if (err) {\r\n console.log(gradientText(text));\r\n resolve();\r\n return;\r\n }\r\n if (data) {\r\n const lines = data.split('\\n');\r\n for (const line of lines) {\r\n console.log(gradientText(line));\r\n await new Promise(r => setTimeout(r, 20)); // 每行显示间隔,增加动感\r\n }\r\n }\r\n resolve();\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 带有样式的成功提示\r\n */\r\nexport function successLog(message: string) {\r\n console.log(`${chalk.green('✔')} ${message}`);\r\n}\r\n\r\n/**\r\n * 带有样式的警告提示\r\n */\r\nexport function warnLog(message: string) {\r\n console.log(`${chalk.yellow('⚠')} ${message}`);\r\n}\r\n\r\n/**\r\n * 带有样式的错误提示\r\n */\r\nexport function errorLog(message: string) {\r\n console.log(`${chalk.red('✘')} ${message}`);\r\n}\r\n\r\n/**\r\n * 渐变色文本 (简单模拟,不依赖第三方复杂渐变库)\r\n */\r\nexport function gradientText(text: string) {\r\n const colors = [\r\n chalk.hex('#FF0080'),\r\n chalk.hex('#FF8C00'),\r\n chalk.hex('#40E0D0'),\r\n chalk.hex('#0080FF'),\r\n chalk.hex('#7B68EE'),\r\n ];\r\n\r\n let result = '';\r\n for (let i = 0; i < text.length; i++) {\r\n const color = colors[i % colors.length];\r\n result += color!(text[i]);\r\n }\r\n return result;\r\n}\r\n","import path from \"node:path\";\r\nimport fs from \"node:fs/promises\";\r\nimport fssync from \"node:fs\";\r\nimport { Command } from \"commander\";\r\nimport type { RegistryComponent, RegistryFile } from \"../types.js\";\r\nimport { listFilesRecursive, sha1, writeJsonFile } from \"../utils/fs.js\";\r\nimport { extractNpmDependenciesFromText } from \"../utils/imports.js\";\r\n\r\nfunction isAllowedFile(filePath: string) {\r\n const ext = path.extname(filePath).toLowerCase();\r\n return [\r\n \".vue\",\r\n \".ts\",\r\n \".js\",\r\n \".json\",\r\n \".css\",\r\n \".md\",\r\n \".svg\",\r\n ].includes(ext);\r\n}\r\n\r\nimport { transformToUniapp } from \"../utils/transformers.js\";\r\n\r\nfunction findWorkspaceRoot(startDir: string) {\r\n let current = path.resolve(startDir);\r\n for (; ;) {\r\n const marker = path.join(current, \"pnpm-workspace.yaml\");\r\n if (fssync.existsSync(marker)) return current;\r\n const parent = path.dirname(current);\r\n if (parent === current) return startDir;\r\n current = parent;\r\n }\r\n}\r\n\r\nexport function buildCommand() {\r\n const cmd = new Command(\"build\")\r\n .description(\"(内部)扫描组件源码并生成 registry JSON\")\r\n .option(\"--root <path>\", \"仓库根目录(默认自动向上查找 pnpm-workspace.yaml)\")\r\n .option(\r\n \"--source <path>\",\r\n \"组件源码目录(相对 root)\",\r\n \"app/components/reborn/ui\",\r\n )\r\n .option(\r\n \"--uniapp-source <path>\",\r\n \"UniApp 组件源码目录(相对 root),如果不提供则通过转换生成\",\r\n \"\",\r\n )\r\n .option(\r\n \"--out <path>\",\r\n \"输出 registry.json 路径(相对 root)\",\r\n \"packages/cli/registry/registry.json\",\r\n )\r\n .option(\r\n \"--also-out <path>\",\r\n \"额外再输出一份 registry.json(可重复传参)\",\r\n (val, acc: string[]) => {\r\n acc.push(val);\r\n return acc;\r\n },\r\n [],\r\n )\r\n .action(async (opts) => {\r\n const rootDir = opts.root\r\n ? path.resolve(opts.root)\r\n : findWorkspaceRoot(process.cwd());\r\n const sourceDir = path.join(rootDir, opts.source);\r\n const uniappSourceDir = opts.uniappSource \r\n ? path.join(rootDir, opts.uniappSource)\r\n : \"\";\r\n const outPath = path.join(rootDir, opts.out);\r\n const alsoOutPaths: string[] = (opts.alsoOut ?? [])?.map((p: string) =>\r\n path.join(rootDir, p),\r\n );\r\n\r\n const dirents = await fs.readdir(sourceDir, { withFileTypes: true });\r\n const componentDirs = dirents\r\n .filter((d) => d.isDirectory())\r\n ?.map((d) => path.join(sourceDir, d.name))\r\n .sort((a, b) => a.localeCompare(b));\r\n\r\n const components: RegistryComponent[] = [];\r\n\r\n for (const absComponentDir of componentDirs) {\r\n const name = path.basename(absComponentDir);\r\n const absFiles = (await listFilesRecursive(absComponentDir)).filter(\r\n isAllowedFile,\r\n );\r\n\r\n\r\n const files: RegistryComponent[\"files\"] = [];\r\n const depSet = new Set<string>();\r\n\r\n for (const absFile of absFiles) {\r\n const rel = path\r\n .relative(absComponentDir, absFile)\r\n .split(path.sep)\r\n .join(\"/\");\r\n const content = await fs.readFile(absFile, \"utf8\");\r\n\r\n const ext = path.extname(absFile).toLowerCase();\r\n\r\n // 1. Web 版本(原样)\r\n if (ext === \".vue\") {\r\n files.push({ path: rel, content, target: \"web\" });\r\n } else {\r\n files.push({ path: rel, content });\r\n }\r\n\r\n // 只从代码文件里抽依赖\r\n if (ext === \".ts\" || ext === \".js\" || ext === \".vue\") {\r\n for (const dep of extractNpmDependenciesFromText(content)) {\r\n depSet.add(dep);\r\n }\r\n }\r\n }\r\n\r\n // 2. UniApp 版本\r\n // 如果提供了 uniappSourceDir,从那里读取;否则通过转换生成\r\n if (uniappSourceDir) {\r\n const uniappComponentDir = path.join(uniappSourceDir, name);\r\n if (fssync.existsSync(uniappComponentDir)) {\r\n const uniappFiles = (await listFilesRecursive(uniappComponentDir)).filter(\r\n isAllowedFile,\r\n );\r\n \r\n for (const absFile of uniappFiles) {\r\n const rel = path\r\n .relative(uniappComponentDir, absFile)\r\n .split(path.sep)\r\n .join(\"/\");\r\n const content = await fs.readFile(absFile, \"utf8\");\r\n const ext = path.extname(absFile).toLowerCase();\r\n\r\n files.push({ path: rel, content, target: \"uniapp\" });\r\n\r\n // 抽取依赖\r\n if (ext === \".ts\" || ext === \".js\" || ext === \".vue\") {\r\n for (const dep of extractNpmDependenciesFromText(content)) {\r\n depSet.add(dep);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // 通过转换生成 UniApp 版本\r\n for (const absFile of absFiles) {\r\n const ext = path.extname(absFile).toLowerCase();\r\n if (ext === \".vue\") {\r\n const rel = path\r\n .relative(absComponentDir, absFile)\r\n .split(path.sep)\r\n .join(\"/\");\r\n const content = await fs.readFile(absFile, \"utf8\");\r\n files.push({\r\n path: rel,\r\n content: transformToUniapp(content),\r\n target: \"uniapp\",\r\n });\r\n }\r\n }\r\n }\r\n\r\n components.push({\r\n name,\r\n dependencies: [...depSet].sort(),\r\n files,\r\n });\r\n }\r\n\r\n const registry: RegistryFile = {\r\n schemaVersion: 1,\r\n generatedAt: new Date().toISOString(),\r\n source: {\r\n rootDir: rootDir.split(path.sep).join(\"/\"),\r\n componentsDir: opts.source,\r\n },\r\n components,\r\n };\r\n\r\n async function writeOut(targetRegistryPath: string) {\r\n const outComponentsDir = path.join(\r\n path.dirname(targetRegistryPath),\r\n \"components\",\r\n );\r\n await writeJsonFile(targetRegistryPath, registry);\r\n\r\n // 额外输出每个组件的 json,方便调试/按需读取\r\n await fs.mkdir(outComponentsDir, { recursive: true });\r\n for (const c of components) {\r\n await writeJsonFile(\r\n path.join(outComponentsDir, `${c.name}.json`),\r\n {\r\n ...c,\r\n fileCount: c.files.length,\r\n contentHash: sha1(JSON.stringify(c.files?.map((f) => f.content))),\r\n },\r\n );\r\n }\r\n }\r\n\r\n await writeOut(outPath);\r\n for (const p of alsoOutPaths) await writeOut(p);\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(\r\n `registry 已生成:${path.relative(process.cwd(), outPath)}(${components.length} 个组件)`,\r\n );\r\n });\r\n\r\n return cmd;\r\n}\r\n\r\n\r\n","const IMPORT_RE =\r\n /\\bfrom\\s+[\"']([^\"']+)[\"']|\\bimport\\(\\s*[\"']([^\"']+)[\"']\\s*\\)|\\brequire\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g;\r\n\r\nfunction normalizePackageName(specifier: string) {\r\n // ignore relative/alias/virtual\r\n if (\r\n specifier.startsWith(\".\") ||\r\n specifier.startsWith(\"/\") ||\r\n specifier.startsWith(\"@/\") ||\r\n specifier.startsWith(\"~/\") ||\r\n specifier.startsWith(\"#\") ||\r\n specifier.startsWith(\"virtual:\")\r\n ) {\r\n return null;\r\n }\r\n\r\n // scoped package: @scope/name[/...]\r\n if (specifier.startsWith(\"@\")) {\r\n const parts = specifier.split(\"/\");\r\n if (parts.length >= 2) return `${parts[0]}/${parts[1]}`;\r\n return specifier;\r\n }\r\n\r\n // normal package: name[/...]\r\n return specifier.split(\"/\")[0] ?? null;\r\n}\r\n\r\nexport function extractNpmDependenciesFromText(text: string) {\r\n const out = new Set<string>();\r\n\r\n for (const match of text.matchAll(IMPORT_RE)) {\r\n const spec = match[1] ?? match[2] ?? match[3];\r\n if (!spec) continue;\r\n const pkg = normalizePackageName(spec);\r\n if (!pkg) continue;\r\n out.add(pkg);\r\n }\r\n\r\n // 常见“框架自带/不应自动安装”的虚拟模块\r\n out.delete(\"nuxt\");\r\n out.delete(\"vue\");\r\n\r\n return [...out].sort();\r\n}\r\n\r\n\r\n","\r\nexport function transformToUniapp(code: string): string {\r\n // 1. 标签替换\r\n // div -> view\r\n // span, font -> text(注意:span可能嵌套,正则要注意)\r\n // ul, li -> view\r\n // img -> image\r\n // a -> navigator\r\n // select -> picker\r\n // iframe -> web-view\r\n\r\n let newCode = code;\r\n\r\n // 简单正则替换标签名\r\n const tagMap: Record<string, string> = {\r\n div: \"view\",\r\n span: \"text\",\r\n font: \"text\",\r\n ul: \"view\",\r\n li: \"view\",\r\n img: \"image\",\r\n a: \"navigator\",\r\n select: \"picker\",\r\n iframe: \"web-view\",\r\n };\r\n\r\n for (const [k, v] of Object.entries(tagMap)) {\r\n // 匹配 <tag ...> 和 </tag>\r\n // 1. <tag\r\n newCode = newCode.replace(new RegExp(`<${k}(\\\\s+|>)`, \"g\"), `<${v}$1`);\r\n // 2. </tag>\r\n newCode = newCode.replace(new RegExp(`<\\\\/${k}>`, \"g\"), `</${v}>`);\r\n }\r\n\r\n // 2. 特殊处理\r\n // input[type=\"search\"] -> type=\"text\" confirm-type=\"search\"\r\n newCode = newCode.replace(/type=[\"']search[\"']/g, 'confirm-type=\"search\"');\r\n\r\n return newCode;\r\n}\r\n","import path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport fssync from \"node:fs\";\nimport { Command } from \"commander\";\nimport prompts from \"prompts\";\nimport type { CliConfig, PackageManager } from \"../types.js\";\nimport { copyDirRecursive, ensureDir, listFilesRecursive, pathExists, writeJsonFile, writeTextFile } from \"../utils/fs.js\";\nimport { detectPackageManager } from \"../utils/pm.js\";\nimport { DEFAULT_CONFIG_PATH, defaultConfig, loadConfigCompat } from \"../utils/registry.js\";\nimport { findNearestPackageRoot } from \"../utils/templates.js\";\nimport { TEMPLATES } from \"../generated/templates.js\";\nimport { gradientText, showLogo, typewriter } from \"../utils/ui.js\";\n\nfunction looksLikeNuxtProject(cwd: string) {\n return Promise.all([\n pathExists(path.join(cwd, \"nuxt.config.ts\")),\n pathExists(path.join(cwd, \"nuxt.config.js\")),\n pathExists(path.join(cwd, \"nuxt.config.mjs\")),\n ]).then((arr) => arr.some(Boolean));\n}\n\nfunction findWorkspaceRoot(startDir: string) {\n let current = path.resolve(startDir);\n for (; ;) {\n const marker = path.join(current, \"pnpm-workspace.yaml\");\n if (fssync.existsSync(marker)) return current;\n const parent = path.dirname(current);\n if (parent === current) return startDir;\n current = parent;\n }\n}\n\n\n// function makeDefaultTailwindConfig removed in favor of template file\n\n\n\n\nfunction cnUtilsTs(params: { importPath?: string }) {\n // importPath 预留:如果用户想从别处导入 clsx/twMerge\n void params;\n return `import { type ClassValue, clsx } from \"clsx\";\\nimport { twMerge } from \"tailwind-merge\";\\n\\nexport function cn(...inputs: ClassValue[]) {\\n return twMerge(clsx(inputs));\\n}\\n`;\n}\n\nasync function rewriteAliasInDir(params: {\n cwd: string;\n targetDir: string;\n aliasSymbol: string;\n}) {\n const { cwd, targetDir, aliasSymbol } = params;\n if (!aliasSymbol || aliasSymbol === \"@\") return;\n const absDir = path.join(cwd, targetDir);\n if (!(await pathExists(absDir))) return;\n\n const files = await listFilesRecursive(absDir);\n for (const f of files) {\n const ext = path.extname(f).toLowerCase();\n // 只处理常见文本文件,避免误改二进制\n if (![\".ts\", \".tsx\", \".js\", \".jsx\", \".vue\", \".mjs\", \".cjs\"].includes(ext)) continue;\n const raw = await fs.readFile(f, \"utf8\");\n const next = raw.replaceAll(\"@/\", `${aliasSymbol}/`);\n if (next !== raw) await fs.writeFile(f, next, \"utf8\");\n }\n}\n\nasync function copyTemplates(params: {\n cwd: string;\n workspaceRoot: string;\n platform: \"web\" | \"uniapp\";\n cfg: CliConfig;\n overwrite?: boolean;\n}) {\n const { cwd, workspaceRoot, platform, cfg, overwrite } = params;\n\n // 1. 尝试从仓库源码目录拷贝(本地开发场景)\n const repoPaths = {\n web: {\n lib: path.join(workspaceRoot, \"app/lib\"),\n composables: path.join(workspaceRoot, \"app/composables\"),\n },\n uniapp: {\n lib: path.join(workspaceRoot, \"packages/uniapp-project/src/lib\"),\n composables: path.join(workspaceRoot, \"packages/uniapp-project/src/composables\"),\n },\n };\n\n const currentRepoPaths = repoPaths[platform];\n let copiedFromRepo = false;\n\n if (await pathExists(currentRepoPaths.lib)) {\n await copyDirRecursive({\n fromDir: currentRepoPaths.lib,\n toDir: path.join(cwd, cfg.libDir),\n overwrite,\n });\n copiedFromRepo = true;\n }\n\n if (await pathExists(currentRepoPaths.composables)) {\n await copyDirRecursive({\n fromDir: currentRepoPaths.composables,\n toDir: path.join(cwd, cfg.composablesDir),\n overwrite,\n ignoreFileNames: platform === \"web\" ? new Set([\"useComponentCode.ts\", \"useCopyToClipboard.ts\",\"getComponentCode.ts\",\"getUniappCode.ts\"]) : undefined,\n });\n copiedFromRepo = true;\n }\n\n // 2. 如果不是在仓库内运行(例如 npx),则使用生成的字符串模板\n if (!copiedFromRepo) {\n const platformTemplates = TEMPLATES[platform];\n for (const [relPath, content] of Object.entries(platformTemplates)) {\n let targetPath = \"\";\n if (relPath.startsWith(\"lib/\")) {\n targetPath = path.join(cwd, cfg.libDir, relPath.replace(\"lib/\", \"\"));\n } else if (relPath.startsWith(\"composables/\")) {\n targetPath = path.join(cwd, cfg.composablesDir, relPath.replace(\"composables/\", \"\"));\n }\n\n if (targetPath) {\n if (!overwrite && (await pathExists(targetPath))) continue;\n await writeTextFile(targetPath, content);\n }\n }\n }\n}\n\nexport function initCommand() {\n const cmd = new Command(\"init\")\n .description(\"初始化新项目\")\n .option(\"--cwd <path>\", \"目标项目目录\", process.cwd())\n .option(\"--pm <pm>\", \"包管理器:pnpm|npm|yarn|bun\")\n .option(\"--yes\", \"跳过交互,使用默认值\", false)\n .option(\"--overwrite\", \"覆盖已存在的模板文件(lib/composables)\", false)\n .option(\n \"--config <path>\",\n \"配置文件路径(相对 cwd)\",\n DEFAULT_CONFIG_PATH,\n )\n .option(\n \"--components-dir <path>\",\n \"组件写入目录\",\n defaultConfig().componentsDir,\n )\n .option(\n \"--lib-dir <path>\",\n \"lib 目录(cn/utils)\",\n defaultConfig().libDir,\n )\n .option(\n \"--composables-dir <path>\",\n \"composables 目录\",\n defaultConfig().composablesDir,\n )\n .option(\n \"--alias-symbol <symbol>\",\n \"项目根目录映射别名符号(默认 @)\",\n defaultConfig().aliasSymbol,\n )\n .option(\"--platform <platform>\", \"目标平台:web|uniapp\", \"web\")\n .option(\"--registry <pkgOrPath>\", \"registry 来源(默认 builtin)\", defaultConfig().registry)\n .action(async (opts) => {\n const cwd = path.resolve(opts.cwd);\n\n // eslint-disable-next-line no-console\n console.log(\n \"提示:项目中有部分依赖需要使用@/ 路径进行配置,请您安装到项目中配置好的路径下,请慎重选择文件位置\",\n );\n\n const pkgPath = path.join(cwd, \"package.json\");\n if (!(await pathExists(pkgPath))) {\n throw new Error(`未找到 package.json:${pkgPath}`);\n }\n\n const pm: PackageManager =\n opts.pm ?? (await detectPackageManager(cwd));\n\n const cfg: CliConfig = {\n schemaVersion: 1,\n componentsDir: opts.componentsDir,\n libDir: opts.libDir,\n composablesDir: opts.composablesDir,\n aliasSymbol: opts.aliasSymbol,\n registry: opts.registry,\n platform: opts.platform,\n };\n\n // 如果已存在 components.json,默认沿用(除非用户显式传参覆盖)\n const existing = await loadConfigCompat(cwd);\n if (existing) {\n cfg.componentsDir = opts.componentsDir ?? existing.componentsDir ?? cfg.componentsDir;\n cfg.libDir = opts.libDir ?? existing.libDir ?? cfg.libDir;\n cfg.composablesDir = opts.composablesDir ?? existing.composablesDir ?? cfg.composablesDir;\n cfg.aliasSymbol = opts.aliasSymbol ?? existing.aliasSymbol ?? cfg.aliasSymbol;\n cfg.registry = opts.registry ?? existing.registry ?? cfg.registry;\n cfg.platform = opts.platform ?? existing.platform ?? cfg.platform;\n }\n\n if (!opts.yes) {\n const nuxt = await looksLikeNuxtProject(cwd);\n const res = await prompts(\n [\n {\n type: \"select\",\n name: \"platform\",\n message: \"选择目标平台\",\n choices: [\n { title: \"Web (默认)\", value: \"web\" },\n { title: \"UniApp\", value: \"uniapp\" },\n ],\n initial: cfg.platform === \"uniapp\" ? 1 : 0,\n },\n {\n type: \"text\",\n name: \"componentsDir\",\n message: \"组件目录(componentsDir)\",\n initial: cfg.componentsDir,\n },\n {\n type: \"text\",\n name: \"libDir\",\n message: \"lib 目录(libDir,用于 cn/utils)\",\n initial: cfg.libDir,\n },\n {\n type: \"text\",\n name: \"composablesDir\",\n message: \"composables 目录(composablesDir)\",\n initial: cfg.composablesDir,\n },\n {\n type: \"text\",\n name: \"aliasSymbol\",\n message: \"基于项目根目录的“映射”的符号是?(aliasSymbol)\",\n initial: cfg.aliasSymbol ?? \"@\",\n },\n ],\n {\n onCancel: () => {\n throw new Error(\"已取消\");\n },\n },\n );\n\n cfg.platform = res.platform ?? cfg.platform;\n cfg.componentsDir = res.componentsDir ?? cfg.componentsDir;\n cfg.libDir = res.libDir ?? cfg.libDir;\n cfg.composablesDir = res.composablesDir ?? cfg.composablesDir;\n cfg.aliasSymbol = res.aliasSymbol ?? cfg.aliasSymbol;\n\n // 写配置\n const cfgPath = path.join(cwd, opts.config);\n await writeJsonFile(cfgPath, cfg);\n\n // 复制模板:lib/ + composables/\n const workspaceRoot = findWorkspaceRoot(findNearestPackageRoot(import.meta.url));\n await copyTemplates({\n cwd,\n workspaceRoot,\n platform: cfg.platform as \"web\" | \"uniapp\",\n cfg,\n overwrite: opts.overwrite,\n });\n\n // 仅替换 \"@/...\" 的别名符号,不改其它路径内容\n await rewriteAliasInDir({ cwd, targetDir: cfg.libDir, aliasSymbol: cfg.aliasSymbol ?? \"@\" });\n await rewriteAliasInDir({\n cwd,\n targetDir: cfg.composablesDir,\n aliasSymbol: cfg.aliasSymbol ?? \"@\",\n });\n\n // 兜底:如果用户模板里没有 utils.ts,则生成 cn\n const libUtilsPath = path.join(cwd, cfg.libDir, \"utils.ts\");\n if (!(await pathExists(libUtilsPath))) await writeTextFile(libUtilsPath, cnUtilsTs({}));\n\n console.log(`已写入配置:${path.relative(process.cwd(), cfgPath)};并生成 cn/utils(pm=${pm})`);\n console.log(\"请按照 https://tw.icebreaker.top/docs/quick-start/v4/uni-app-vite 指引进行项目配置初始化\");\n\n console.log(\"\");\n await showLogo();\n await typewriter(gradientText(\"感谢使用 Reborn UI ! ✨\"), 20);\n return;\n }\n\n // --yes:直接写默认配置\n const cfgPath = path.join(cwd, opts.config);\n await ensureDir(path.dirname(cfgPath));\n await fs.writeFile(cfgPath, JSON.stringify(cfg, null, 2) + \"\\n\", \"utf8\");\n\n // 复制模板逻辑\n const workspaceRoot = findWorkspaceRoot(findNearestPackageRoot(import.meta.url));\n await copyTemplates({\n cwd,\n workspaceRoot,\n platform: cfg.platform as \"web\" | \"uniapp\",\n cfg,\n overwrite: opts.overwrite,\n });\n\n // 仅替换 \"@/...\" 的别名符号,不改其它路径内容\n await rewriteAliasInDir({ cwd, targetDir: cfg.libDir, aliasSymbol: cfg.aliasSymbol ?? \"@\" });\n await rewriteAliasInDir({\n cwd,\n targetDir: cfg.composablesDir,\n aliasSymbol: cfg.aliasSymbol ?? \"@\",\n });\n\n // 兜底:如果用户模板里没有 utils.ts,则生成 cn\n const libUtilsPath = path.join(cwd, cfg.libDir, \"utils.ts\");\n if (!(await pathExists(libUtilsPath))) await writeTextFile(libUtilsPath, cnUtilsTs({}));\n\n // eslint-disable-next-line no-console\n console.log(`已初始化:${path.relative(process.cwd(), cfgPath)};并生成 cn/utils(pm=${pm})`);\n console.log(\"请按照 https://tw.icebreaker.top/docs/quick-start/v4/uni-app-vite 指引进行项目配置初始化\");\n\n console.log(\"\");\n await showLogo();\n await typewriter(gradientText(\"感谢使用 Reborn UI ! ✨\"), 2);\n });\n\n return cmd;\n}\n\n\n","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function findNearestPackageRoot(from: string) {\n // from: import.meta.url\n let dir = path.dirname(fileURLToPath(from));\n while (true) {\n if (fs.existsSync(path.join(dir, \"package.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return dir;\n dir = parent;\n }\n}\n\n\n\n\n\n\n","// 此文件由 sync-templates.ts 自动生成,请勿手动修改\nexport const TEMPLATES = {\n \"web\": {\n \"lib/tv.ts\": \"import { createTV } from \\\"tailwind-variants\\\";\\r\\nimport { twMergeConfig } from \\\"./utils\\\";\\r\\n\\r\\nexport const tv = createTV({\\r\\n twMergeConfig,\\r\\n});\\r\\nexport type { VariantProps } from \\\"tailwind-variants\\\";\\r\\n\",\n \"lib/utils.ts\": \"import type { ClassValue } from \\\"clsx\\\";\\r\\nimport { clsx } from \\\"clsx\\\";\\r\\nimport { extendTailwindMerge } from \\\"tailwind-merge\\\";\\r\\n\\r\\nexport const twMergeConfig = {\\r\\n extend: {\\r\\n classGroups: {\\r\\n \\\"font-size\\\": [{ text: [(value: string) => !isNaN(Number(value))] }],\\r\\n },\\r\\n },\\r\\n};\\r\\n\\r\\nconst customTwMerge = extendTailwindMerge(twMergeConfig);\\r\\n\\r\\nexport function cn(...inputs: ClassValue[]) {\\r\\n return customTwMerge(clsx(inputs));\\r\\n}\\r\\n\\r\\nexport type ObjectValues<T> = T[keyof T];\\r\\n\",\n \"composables/useFieldGroup.ts\": \"\\r\\nimport { ref } from 'vue'\\r\\n\\r\\nexport function useFieldGroup(props: any) {\\r\\n return {\\r\\n disabled: ref(undefined),\\r\\n isError: ref(undefined),\\r\\n orientation: ref(undefined),\\r\\n size: ref(undefined)\\r\\n }\\r\\n}\\r\\n\",\n \"composables/useMouseState.ts\": \"import { readonly, ref } from \\\"vue\\\";\\r\\n\\r\\nexport function useMouseState() {\\r\\n const isMouseEntered = ref(false);\\r\\n\\r\\n function setMouseEntered(value: boolean) {\\r\\n isMouseEntered.value = value;\\r\\n }\\r\\n\\r\\n return {\\r\\n isMouseEntered: readonly(isMouseEntered),\\r\\n setMouseEntered,\\r\\n };\\r\\n}\\r\\n\",\n \"composables/useNavigation.ts\": \"import type { ContentNavigationItem } from \\\"@nuxt/content\\\";\\r\\n\\r\\nexport function useNavigation(navigation?: Ref<ContentNavigationItem[]>) {\\r\\n const route = useRoute();\\r\\n\\r\\n const children = computed(() => {\\r\\n const nav = toValue(navigation);\\r\\n\\r\\n // Get the current path segments\\r\\n const pathSegments = route.path.split(\\\"/\\\").filter(Boolean);\\r\\n\\r\\n // Need at least one section (e.g., ['components', 'button'])\\r\\n if (pathSegments.length < 1) {\\r\\n return [];\\r\\n }\\r\\n\\r\\n // Build the top parent path (e.g., '/components')\\r\\n const topParentPath = `/${pathSegments[0]}`;\\r\\n\\r\\n // Find the matching top-level navigation item\\r\\n const topParent = nav?.find((item) => item.path === topParentPath);\\r\\n\\r\\n return topParent?.children || [];\\r\\n });\\r\\n\\r\\n const isFlatList = computed(() => {\\r\\n return children.value.every((child) => !child.children || child.children.length === 0);\\r\\n });\\r\\n\\r\\n const nav = computed(() => {\\r\\n if (isFlatList.value) {\\r\\n return [\\r\\n {\\r\\n title: \\\"Overview\\\",\\r\\n path: children.value.at(0)?.path || \\\"\\\",\\r\\n children: children.value,\\r\\n },\\r\\n ];\\r\\n }\\r\\n\\r\\n return children.value;\\r\\n });\\r\\n\\r\\n return {\\r\\n nav,\\r\\n };\\r\\n}\\r\\n\"\n },\n \"uniapp\": {\n \"lib/tv.ts\": \"// @ts-ignore\\r\\nimport type { TV } from \\\"tailwind-variants\\\";\\r\\nimport { create } from '@weapp-tailwindcss/variants-v3'\\r\\n\\r\\n// @ts-ignore\\r\\nconst isH5 = process.env.UNI_PLATFORM === 'h5'\\r\\n\\r\\nconst { tv: createTV } = create({\\r\\n // @ts-ignore\\r\\n escape: !isH5,\\r\\n // @ts-ignore\\r\\n unescape: !isH5,\\r\\n})\\r\\n\\r\\nconst textSizeKeys = ['20', '22', '24', '26', '28', '30', '32', '36', '40', '48', '52']\\r\\n\\r\\nconst twMergeConfig = {\\r\\n extend: {\\r\\n classGroups: {\\r\\n 'font-size': [{ text: textSizeKeys }],\\r\\n },\\r\\n },\\r\\n} as const\\r\\n\\r\\nexport const tv: TV = (options, config) =>\\r\\n createTV(options, {\\r\\n ...config,\\r\\n twMerge: config?.twMerge ?? true,\\r\\n twMergeConfig: {\\r\\n ...config?.twMergeConfig,\\r\\n ...twMergeConfig,\\r\\n },\\r\\n });\\r\\n\",\n \"lib/utils.ts\": \"import { type ClassValue, clsx } from 'clsx'\\r\\nimport { create } from '@weapp-tailwindcss/merge-v3'\\r\\n\\r\\n// @ts-ignore\\r\\nconst isH5 = process.env.UNI_PLATFORM === 'h5'\\r\\nconst { twMerge } = create({\\r\\n escape: !isH5,\\r\\n unescape: !isH5,\\r\\n // @ts-ignore\\r\\n extend: {\\r\\n classGroups: {\\r\\n 'font-size': [{ text: ['20', '22', '24', '26', '28', '30', '32', '36', '40', '48', '52'] }],\\r\\n },\\r\\n },\\r\\n})\\r\\n\\r\\nexport function cn(...inputs: ClassValue[]) {\\r\\n return twMerge(clsx(inputs))\\r\\n}\\r\\n\",\n \"composables/useDarkMode.ts\": \"export const useDarkMode = () => {\\r\\n const isDark = ref(false)\\r\\n\\r\\n const toggleDarkMode = () => {\\r\\n isDark.value = !isDark.value\\r\\n updateTheme()\\r\\n }\\r\\n\\r\\n const updateTheme = () => {\\r\\n const value = isDark.value\\r\\n uni.setStorageSync('darkMode', value)\\r\\n\\r\\n // #ifdef H5\\r\\n if (value) {\\r\\n document.documentElement.classList.add('dark')\\r\\n } else {\\r\\n document.documentElement.classList.remove('dark')\\r\\n }\\r\\n // #endif\\r\\n\\r\\n }\\r\\n\\r\\n const initTheme = () => {\\r\\n const saved = uni.getStorageSync('darkMode')\\r\\n if (saved !== '') {\\r\\n isDark.value = !!saved\\r\\n } else {\\r\\n isDark.value = false\\r\\n }\\r\\n updateTheme()\\r\\n }\\r\\n\\r\\n initTheme()\\r\\n\\r\\n return {\\r\\n isDark,\\r\\n toggleDarkMode\\r\\n }\\r\\n}\\r\\n\",\n \"composables/useFieldGroup.ts\": \"import { ref, provide, inject, computed, watch, onMounted, onUnmounted, getCurrentInstance } from 'vue';\\r\\nimport * as z from 'zod';\\r\\n\\r\\nexport type FormValidateError = {\\r\\n field: string;\\r\\n message: string;\\r\\n};\\r\\n\\r\\nexport interface UseFieldGroupProps {\\r\\n modelValue?: any;\\r\\n}\\r\\n\\r\\nexport function useFieldGroup() {\\r\\n\\r\\n // Data & Context\\r\\n const errors = ref(new Map<string, string>());\\r\\n const fields = ref(new Set<string>([]));\\r\\n const fieldInstances = ref<any[]>([]);\\r\\n\\r\\n // --- Field Management ---\\r\\n const addField = (field: any) => {\\r\\n fieldInstances.value.push(field);\\r\\n if (field.prop) {\\r\\n fields.value.add(field.prop);\\r\\n }\\r\\n };\\r\\n\\r\\n const removeField = (field: any) => {\\r\\n const index = fieldInstances.value.indexOf(field);\\r\\n if (index > -1) {\\r\\n fieldInstances.value.splice(index, 1);\\r\\n }\\r\\n if (field.prop) {\\r\\n fields.value.delete(field.prop);\\r\\n }\\r\\n };\\r\\n\\r\\n // --- Error Management ---\\r\\n const errorLock = ref(false);\\r\\n\\r\\n function setError(prop: string, error: string) {\\r\\n if (errorLock.value) return;\\r\\n if (prop !== \\\"\\\") errors.value.set(prop, error);\\r\\n }\\r\\n\\r\\n function removeError(prop: string) {\\r\\n if (prop !== \\\"\\\") errors.value.delete(prop);\\r\\n }\\r\\n\\r\\n function getError(prop: string): string {\\r\\n if (prop !== \\\"\\\") return errors.value.get(prop) ?? \\\"\\\";\\r\\n return \\\"\\\";\\r\\n }\\r\\n\\r\\n async function getErrors(): Promise<FormValidateError[]> {\\r\\n const errs = [] as FormValidateError[];\\r\\n errors.value.forEach((msg, field) => {\\r\\n errs.push({ field, message: msg });\\r\\n });\\r\\n return errs;\\r\\n }\\r\\n\\r\\n function clearValidate(fieldsToClear?: string | string[]) {\\r\\n if (fieldsToClear) {\\r\\n const propsArray = Array.isArray(fieldsToClear) ? fieldsToClear : [fieldsToClear];\\r\\n propsArray.forEach(prop => removeError(prop));\\r\\n } else {\\r\\n errors.value.clear();\\r\\n }\\r\\n }\\r\\n\\r\\n return {\\r\\n errors,\\r\\n fields,\\r\\n fieldInstances,\\r\\n addField,\\r\\n removeField,\\r\\n setError,\\r\\n removeError,\\r\\n getError, // Used by children\\r\\n getErrors, // Used by validate\\r\\n clearValidate\\r\\n };\\r\\n}\\r\\n\\r\\n\\r\\nexport interface UseFieldGroupItemProps {\\r\\n prop?: string;\\r\\n label?: string;\\r\\n labelPosition?: string;\\r\\n labelWidth?: string | number;\\r\\n ui?: any;\\r\\n}\\r\\n\\r\\nexport function useFieldGroupItem(props: UseFieldGroupItemProps) {\\r\\n const form = inject<any>('rebornForm', undefined);\\r\\n const instance = getCurrentInstance();\\r\\n\\r\\n\\r\\n const error = computed(() => {\\r\\n if (!form || !props.prop) return '';\\r\\n return form.getError ? form.getError(props.prop) : '';\\r\\n });\\r\\n\\r\\n const labelPosition = computed(() => {\\r\\n return props.labelPosition || form?.props?.labelPosition || 'left';\\r\\n });\\r\\n\\r\\n const labelWidth = computed(() => {\\r\\n if (labelPosition.value === 'top') return 'auto';\\r\\n return props.labelWidth || form?.props?.labelWidth || 'auto';\\r\\n });\\r\\n\\r\\n const size = computed(() => {\\r\\n const s = form?.props?.size;\\r\\n if (s && ['sm', 'md', 'lg'].includes(s)) {\\r\\n return s as \\\"sm\\\" | \\\"md\\\" | \\\"lg\\\";\\r\\n }\\r\\n return 'sm';\\r\\n });\\r\\n\\r\\n const getBoundingClientRect = (callback: (res: any) => void) => {\\r\\n uni.createSelectorQuery()\\r\\n .in(instance?.proxy)\\r\\n .select('.re-form-item')\\r\\n .boundingClientRect(callback)\\r\\n .exec();\\r\\n };\\r\\n\\r\\n // Watch for prop changes to update registration\\r\\n watch(() => props.prop, (newProp, oldProp) => {\\r\\n if (form) {\\r\\n if (oldProp) {\\r\\n form.removeField({ uid: instance?.uid, prop: oldProp });\\r\\n }\\r\\n if (newProp) {\\r\\n form.addField({ uid: instance?.uid, prop: newProp, getBoundingClientRect });\\r\\n }\\r\\n }\\r\\n });\\r\\n\\r\\n onMounted(() => {\\r\\n if (form && props.prop) {\\r\\n form.addField({ uid: instance?.uid, prop: props.prop, getBoundingClientRect });\\r\\n }\\r\\n });\\r\\n\\r\\n onUnmounted(() => {\\r\\n if (form && props.prop) {\\r\\n form.removeField({ uid: instance?.uid, prop: props.prop });\\r\\n }\\r\\n });\\r\\n\\r\\n return {\\r\\n form,\\r\\n error,\\r\\n labelPosition,\\r\\n labelWidth,\\r\\n size,\\r\\n getBoundingClientRect\\r\\n };\\r\\n}\\r\\n\\r\\n// Consumer for inner components (Input, Select, etc.)\\r\\nexport function useFormInject(props: any) {\\r\\n const form = inject<any>('rebornForm', null);\\r\\n const formItem = inject<any>('rebornFormItem', null);\\r\\n\\r\\n const size = computed(() => {\\r\\n return form?.props?.size || props.size;\\r\\n });\\r\\n\\r\\n const disabled = computed(() => {\\r\\n return form?.props?.disabled || props.disabled;\\r\\n });\\r\\n\\r\\n const orientation = computed(() => {\\r\\n return form?.props?.orientation || props.orientation;\\r\\n });\\r\\n\\r\\n const isError = computed(() => {\\r\\n return formItem?.isError?.value || false;\\r\\n });\\r\\n\\r\\n return {\\r\\n form,\\r\\n size,\\r\\n disabled,\\r\\n orientation,\\r\\n isError\\r\\n };\\r\\n}\\r\\n\"\n }\n} as const;\n\nexport type Platform = keyof typeof TEMPLATES;\n","{\n \"name\": \"reborn-ui\",\n \"version\": \"0.1.73\",\n \"description\": \"A CLI for Reborn UI\",\n \"author\": \"1997liuyh-boop\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/1997liuyh-boop/Reborn-UI.git\"\n },\n \"type\": \"module\",\n \"bin\": {\n \"reborn-ui\": \"dist/index.js\"\n },\n \"files\": [\n \"dist\",\n \"registry\",\n \"README.md\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"cli\": \"tsx src/index.ts\",\n \"build\": \"tsup\",\n \"dev\": \"tsx src/index.ts\",\n \"clean\": \"rimraf dist\",\n \"prepare\": \"tsup\",\n \"templates:sync\": \"tsx src/scripts/sync-templates.ts\",\n \"registry:build\": \"tsx src/index.ts build --root ../.. --uniapp-source packages/uniapp-project/src/components\",\n \"prepack\": \"npm run templates:sync && npm run build && npm run registry:build\",\n \"prepublishOnly\": \"npm run templates:sync && npm run build && npm run registry:build\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.6.2\",\n \"cli-progress\": \"^3.12.0\",\n \"commander\": \"^14.0.0\",\n \"execa\": \"^9.6.0\",\n \"figlet\": \"^1.9.4\",\n \"ora\": \"^9.0.0\",\n \"prompts\": \"^2.4.2\"\n },\n \"devDependencies\": {\n \"@types/cli-progress\": \"^3.11.6\",\n \"@types/figlet\": \"^1.7.0\",\n \"@types/node\": \"^22.10.7\",\n \"@types/prompts\": \"^2.4.9\",\n \"rimraf\": \"^6.0.1\",\n \"tsup\": \"^8.5.0\",\n \"tsx\": \"^4.20.0\",\n \"typescript\": \"^5.8.3\"\n }\n}\n"],"mappings":"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","names":["Command","path","fs","path","path","path","fs","path","fs","require","chalk","path","chalk","path","fs","Command","path","Command","fs","path","fs","fssync","Command","prompts","path","fs","fileURLToPath","findNearestPackageRoot","path","findWorkspaceRoot","fssync","fs","Command","prompts","cfgPath","workspaceRoot","findNearestPackageRoot","libUtilsPath","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/utils/fs.ts","../src/utils/pm.ts","../src/utils/registry.ts","../src/utils/ui.ts","../src/commands/build.ts","../src/utils/imports.ts","../src/utils/transformers.ts","../src/commands/init.ts","../src/utils/templates.ts","../src/generated/templates.ts","../package.json"],"sourcesContent":["import { Command } from \"commander\";\r\nimport { addCommand } from \"./commands/add.js\";\r\nimport { buildCommand } from \"./commands/build.js\";\r\nimport { initCommand } from \"./commands/init.js\";\r\nimport packageJson from \"../package.json\" assert { type: \"json\" };\r\n\r\nconst program = new Command()\r\n .name(\"reborn-ui\")\r\n .description(\"Reborn UI - 组件安装与 registry 辅助 CLI\")\r\n .version(packageJson.version);\r\n\r\nprogram.addCommand(initCommand());\r\nprogram.addCommand(addCommand());\r\nprogram.addCommand(buildCommand());\r\n\r\nawait program.parseAsync(process.argv);\r\n\r\n\r\n","import path from \"node:path\";\r\nimport { Command } from \"commander\";\r\nimport prompts from \"prompts\";\r\nimport type { PackageManager, RegistryComponent } from \"../types.js\";\r\nimport { ensureDir, pathExists, writeTextFile } from \"../utils/fs.js\";\r\nimport {\r\n detectPackageManager,\r\n readPackageJson,\r\n} from \"../utils/pm.js\";\r\nimport { defaultConfig, loadConfigCompat, loadRegistry } from \"../utils/registry.js\";\r\nimport cliProgress from \"cli-progress\";\r\nimport chalk from \"chalk\";\r\nimport { successLog } from \"../utils/ui.js\";\r\n\r\nfunction rewriteImports(params: {\r\n content: string;\r\n aliasSymbol: string;\r\n}) {\r\n const { content, aliasSymbol } = params;\r\n if (!aliasSymbol || aliasSymbol === \"@\") return content;\r\n\r\n // 仅替换项目根目录映射符号:把 \"@/xxx\" -> \"<aliasSymbol>/xxx\"\r\n // 注意:不要影响 scoped package(@scope/name),这里只替换 \"@/\" 前缀。\r\n return content.replaceAll(\"@/\", `${aliasSymbol}/`);\r\n}\r\n\r\nasync function writeComponentFiles(params: {\r\n cwd: string;\r\n componentsDir: string;\r\n aliasSymbol: string;\r\n component: RegistryComponent;\r\n overwrite?: boolean;\r\n onProgress?: () => void;\r\n platform: \"web\" | \"uniapp\";\r\n}) {\r\n const { cwd, componentsDir, aliasSymbol, component, overwrite, onProgress, platform } = params;\r\n const baseDir = path.join(cwd, componentsDir, component.name);\r\n await ensureDir(baseDir);\r\n\r\n for (const f of component.files) {\r\n // 过滤逻辑:\r\n // 1. 如果 f.target 存在且不等于 platform,跳过\r\n // 2. 如果 f.target 不存在,视为通用文件,不跳过\r\n if (f.target && f.target !== platform) {\r\n continue;\r\n }\r\n\r\n const target = path.join(baseDir, ...f.path.split(\"/\"));\r\n if (!overwrite && (await pathExists(target))) {\r\n onProgress?.();\r\n continue;\r\n }\r\n const nextContent = rewriteImports({ content: f.content, aliasSymbol });\r\n await writeTextFile(target, nextContent);\r\n onProgress?.();\r\n // 增加一个极小的延迟,让进度条看起来在“跑”\r\n await new Promise(r => setTimeout(r, 10));\r\n }\r\n\r\n return baseDir;\r\n}\r\n\r\nexport function addCommand() {\r\n const cmd = new Command(\"add\")\r\n .description(\"向项目中添加组件与相关依赖\")\r\n .argument(\"[components...]\", \"组件名(可多个)\")\r\n .option(\"--cwd <path>\", \"目标项目目录\", process.cwd())\r\n .option(\"--pm <pm>\", \"包管理器:pnpm|npm|yarn|bun\")\r\n .option(\"--yes\", \"跳过交互\", false)\r\n .option(\"--overwrite\", \"覆盖已存在文件\", false)\r\n .option(\"--config <path>\", \"配置文件路径(相对 cwd)\", \"components.json\")\r\n .option(\"--registry <pkgOrPath>\", \"覆盖配置里的 registry\")\r\n .option(\"--components-dir <path>\", \"覆盖配置里的 componentsDir\")\r\n .option(\"--lib-dir <path>\", \"覆盖配置里的 libDir\")\r\n .option(\"--alias-symbol <symbol>\", \"覆盖配置里的 aliasSymbol(默认 @)\")\r\n .action(async (components: string[], opts) => {\r\n const cwd = path.resolve(opts.cwd);\r\n const pm: PackageManager =\r\n opts.pm ?? (await detectPackageManager(cwd));\r\n\r\n const cfg = (await loadConfigCompat(cwd, opts.config)) ?? defaultConfig();\r\n if (opts.registry) cfg.registry = opts.registry;\r\n if (opts.componentsDir) cfg.componentsDir = opts.componentsDir;\r\n if (opts.libDir) cfg.libDir = opts.libDir;\r\n if (opts.aliasSymbol) cfg.aliasSymbol = opts.aliasSymbol;\r\n\r\n const registry = await loadRegistry({ cwd, registry: cfg.registry });\r\n\r\n let targets = components ?? [];\r\n if (!targets.length) {\r\n if (opts.yes) {\r\n throw new Error(\"未指定组件名;请传入组件参数或去掉 --yes 以交互选择。\");\r\n }\r\n const choices = registry.components?.map((c) => ({\r\n title: c.name,\r\n value: c.name,\r\n }));\r\n const res = await prompts(\r\n [\r\n {\r\n type: \"multiselect\",\r\n name: \"selected\",\r\n message: \"选择要添加的组件\",\r\n choices,\r\n min: 1,\r\n },\r\n ],\r\n {\r\n onCancel: () => {\r\n throw new Error(\"已取消\");\r\n },\r\n },\r\n );\r\n targets = res.selected ?? [];\r\n }\r\n\r\n // 询问平台 (Web / UniApp)\r\n const { platform } = await prompts({\r\n type: \"select\",\r\n name: \"platform\",\r\n message: \"选择目标平台\",\r\n choices: [\r\n { title: \"Web (默认)\", value: \"web\" },\r\n { title: \"UniApp\", value: \"uniapp\" },\r\n ],\r\n initial: 0,\r\n });\r\n\r\n if (!platform) {\r\n throw new Error(\"已取消\");\r\n }\r\n\r\n const totalFiles = targets.reduce((acc, name) => {\r\n const c = registry.components.find((x) => x.name === name);\r\n return acc + (c?.files.length ?? 0);\r\n }, 0);\r\n\r\n const bar = new cliProgress.SingleBar({\r\n format: '正在写入文件 |' + chalk.cyan('{bar}') + '| {percentage}% || {value}/{total} 文件',\r\n barCompleteChar: '\\u2588',\r\n barIncompleteChar: '\\u2591',\r\n hideCursor: true\r\n });\r\n\r\n bar.start(totalFiles, 0);\r\n\r\n for (const name of targets) {\r\n const c = registry.components.find((x) => x.name === name);\r\n if (!c) {\r\n bar.stop();\r\n throw new Error(`registry 中不存在该组件:${name}`);\r\n }\r\n\r\n await writeComponentFiles({\r\n cwd,\r\n componentsDir: cfg.componentsDir,\r\n aliasSymbol: cfg.aliasSymbol ?? \"@\",\r\n component: c,\r\n overwrite: opts.overwrite,\r\n onProgress: () => bar.increment(),\r\n platform,\r\n });\r\n }\r\n bar.stop();\r\n\r\n console.log(\"\");\r\n for (const name of targets) {\r\n successLog(`组件 ${chalk.bold(name)} 已成功添加到项目`);\r\n }\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(`\\n${chalk.bold.green('DONE')} 已完成 ${targets.length} 个组件的添加(pm=${pm})`);\r\n });\r\n\r\n return cmd;\r\n}\r\n\r\n\r\n","import { createHash } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function pathExists(p: string) {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dirPath: string) {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n const raw = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n}\n\nexport async function writeJsonFile(filePath: string, data: unknown) {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport async function writeTextFile(filePath: string, content: string) {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, \"utf8\");\n}\n\nexport async function listFilesRecursive(\n dirPath: string,\n opts?: { ignoreDirNames?: Set<string> },\n) {\n const ignoreDirNames =\n opts?.ignoreDirNames ??\n new Set([\"node_modules\", \".git\", \".nuxt\", \"dist\", \".output\"]);\n\n const out: string[] = [];\n\n async function walk(current: string) {\n const entries = await fs.readdir(current, { withFileTypes: true });\n for (const entry of entries) {\n const p = path.join(current, entry.name);\n if (entry.isDirectory()) {\n if (ignoreDirNames.has(entry.name)) continue;\n await walk(p);\n } else if (entry.isFile()) {\n out.push(p);\n }\n }\n }\n\n await walk(dirPath);\n return out;\n}\n\nexport async function copyDirRecursive(params: {\n fromDir: string;\n toDir: string;\n overwrite?: boolean;\n ignoreFileNames?: Set<string>;\n}) {\n const { fromDir, toDir, overwrite } = params;\n const ignoreFileNames = params.ignoreFileNames ?? new Set([\".DS_Store\"]);\n\n const entries = await fs.readdir(fromDir, { withFileTypes: true });\n await ensureDir(toDir);\n\n for (const entry of entries) {\n if (ignoreFileNames.has(entry.name)) continue;\n const from = path.join(fromDir, entry.name);\n const to = path.join(toDir, entry.name);\n\n if (entry.isDirectory()) {\n await copyDirRecursive({ fromDir: from, toDir: to, overwrite, ignoreFileNames });\n continue;\n }\n\n if (!entry.isFile()) continue;\n\n if (!overwrite) {\n try {\n await fs.access(to);\n continue; // 已存在则跳过\n } catch {\n // not exists\n }\n }\n\n await ensureDir(path.dirname(to));\n await fs.copyFile(from, to);\n }\n}\n\nexport function sha1(text: string) {\n return createHash(\"sha1\").update(text).digest(\"hex\");\n}\n\n\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { execa } from \"execa\";\r\nimport type { PackageManager } from \"../types.js\";\r\nimport { pathExists, readJsonFile, writeJsonFile } from \"./fs.js\";\r\n\r\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\r\n if (await pathExists(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\r\n if (await pathExists(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\r\n if (await pathExists(path.join(cwd, \"package-lock.json\"))) return \"npm\";\r\n if (await pathExists(path.join(cwd, \"bun.lockb\"))) return \"bun\";\r\n return \"pnpm\";\r\n}\r\n\r\nexport async function readPackageJson(\r\n cwd: string,\r\n): Promise<Record<string, any> & { dependencies?: Record<string, string>; devDependencies?: Record<string, string> }> {\r\n return await readJsonFile(path.join(cwd, \"package.json\"));\r\n}\r\n\r\nexport async function writePackageJson(cwd: string, pkg: unknown) {\r\n await writeJsonFile(path.join(cwd, \"package.json\"), pkg);\r\n}\r\n\r\nexport function getMissingDeps(\r\n pkg: { dependencies?: Record<string, string>; devDependencies?: Record<string, string> },\r\n deps: string[],\r\n) {\r\n const existing = new Set([\r\n ...Object.keys(pkg.dependencies ?? {}),\r\n ...Object.keys(pkg.devDependencies ?? {}),\r\n ]);\r\n return deps.filter((d) => !existing.has(d));\r\n}\r\n\r\nexport async function installDeps(params: {\r\n cwd: string;\r\n pm: PackageManager;\r\n deps: string[];\r\n dev?: boolean;\r\n}) {\r\n const { cwd, pm, deps, dev } = params;\r\n if (!deps.length) return;\r\n\r\n const args: string[] = [];\r\n if (pm === \"pnpm\") args.push(\"add\");\r\n else if (pm === \"npm\") args.push(\"install\");\r\n else if (pm === \"yarn\") args.push(\"add\");\r\n else if (pm === \"bun\") args.push(\"add\");\r\n\r\n if (dev) {\r\n if (pm === \"npm\") args.push(\"--save-dev\");\r\n else args.push(\"-D\");\r\n }\r\n\r\n args.push(...deps);\r\n\r\n await execa(pm, args, { cwd, stdio: \"inherit\" });\r\n}\r\n\r\nexport async function ensureJsonFile(cwd: string, relPath: string, defaultJson: unknown) {\r\n const p = path.join(cwd, relPath);\r\n if (await pathExists(p)) return;\r\n await fs.mkdir(path.dirname(p), { recursive: true });\r\n await fs.writeFile(p, JSON.stringify(defaultJson, null, 2) + \"\\n\", \"utf8\");\r\n}\r\n\r\n\r\n","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport type { CliConfig, RegistryFile } from \"../types.js\";\nimport { pathExists, readJsonFile } from \"./fs.js\";\n\nexport const DEFAULT_CONFIG_PATH = \"components.json\";\n\nfunction findNearestPackageRoot(from: string) {\n // from: import.meta.url\n let dir = path.dirname(fileURLToPath(from));\n while (true) {\n if (fs.existsSync(path.join(dir, \"package.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return dir;\n dir = parent;\n }\n}\n\nexport function defaultConfig(): CliConfig {\n return {\n schemaVersion: 1,\n componentsDir: \"components\",\n libDir: \"lib\",\n composablesDir: \"composables\",\n // 默认使用 CLI 包内置的 registry(随 reborn-ui 一起发布)\n registry: \"builtin\",\n // 项目根目录映射别名符号(默认 @)\n aliasSymbol: \"@\",\n };\n}\n\nexport async function loadConfig(cwd: string, configPath = DEFAULT_CONFIG_PATH) {\n const abs = path.isAbsolute(configPath)\n ? configPath\n : path.join(cwd, configPath);\n if (!(await pathExists(abs))) return null;\n return await readJsonFile<CliConfig>(abs);\n}\n\nexport function resolveRegistryJsonPath(params: { cwd: string; registry: string }) {\n const { cwd, registry } = params;\n\n // 0) 内置 registry\n if (!registry || registry === \"builtin\") {\n // 注意:CLI 经过打包后可能变成单文件(例如 dist/index.js),\n // import.meta.url 的相对基准会变化,不能用固定的 ../../registry/...\n // 这里通过向上查找最近的 package.json 来定位包根目录。\n const pkgRoot = findNearestPackageRoot(import.meta.url);\n return path.join(pkgRoot, \"registry\", \"registry.json\");\n }\n\n // 1) 如果是文件路径(包含分隔符或 .json),优先当成路径处理\n const looksLikePath =\n registry.includes(\"/\") ||\n registry.includes(\"\\\\\") ||\n registry.endsWith(\".json\");\n\n if (looksLikePath) {\n const abs = path.isAbsolute(registry) ? registry : path.join(cwd, registry);\n return abs;\n }\n\n // 2) 当成包名处理:默认读取 <pkg>/registry/registry.json\n const require = createRequire(import.meta.url);\n // 不显式绑定 cwd,避免 npx 场景下找不到 registry 包\n return require.resolve(`${registry}/registry/registry.json`);\n}\n\nexport async function loadRegistry(params: { cwd: string; registry: string }) {\n const jsonPath = resolveRegistryJsonPath(params);\n return await readJsonFile<RegistryFile>(jsonPath);\n}\n\n// 兼容旧配置文件名:shadcn-docs.json\nexport async function loadConfigCompat(cwd: string, configPath?: string) {\n if (configPath) return await loadConfig(cwd, configPath);\n const primary = await loadConfig(cwd, DEFAULT_CONFIG_PATH);\n if (primary) return primary;\n return await loadConfig(cwd, \"shadcn-docs.json\");\n}\n\n\n","import chalk from 'chalk';\r\nimport figlet from 'figlet';\r\n\r\n/**\r\n * 模拟打字机效果\r\n * @param text 要显示的文本\r\n * @param delay 每字符延迟时间 (ms)\r\n * @param newline 是否在结束时换行\r\n */\r\nexport async function typewriter(text: string, delay: number = 15, newline: boolean = true) {\r\n for (const char of text) {\r\n process.stdout.write(char);\r\n if (delay > 0) {\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n }\r\n }\r\n if (newline) {\r\n process.stdout.write('\\n');\r\n }\r\n}\r\n\r\n/**\r\n * 显示 ASCII Logo\r\n */\r\nexport async function showLogo(text: string = 'Reborn UI') {\r\n return new Promise<void>((resolve) => {\r\n figlet.text(text, {\r\n font: 'Slant',\r\n horizontalLayout: 'default',\r\n verticalLayout: 'default',\r\n width: 80,\r\n whitespaceBreak: true\r\n }, async (err, data) => {\r\n if (err) {\r\n console.log(gradientText(text));\r\n resolve();\r\n return;\r\n }\r\n if (data) {\r\n const lines = data.split('\\n');\r\n for (const line of lines) {\r\n console.log(gradientText(line));\r\n await new Promise(r => setTimeout(r, 20)); // 每行显示间隔,增加动感\r\n }\r\n }\r\n resolve();\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 带有样式的成功提示\r\n */\r\nexport function successLog(message: string) {\r\n console.log(`${chalk.green('✔')} ${message}`);\r\n}\r\n\r\n/**\r\n * 带有样式的警告提示\r\n */\r\nexport function warnLog(message: string) {\r\n console.log(`${chalk.yellow('⚠')} ${message}`);\r\n}\r\n\r\n/**\r\n * 带有样式的错误提示\r\n */\r\nexport function errorLog(message: string) {\r\n console.log(`${chalk.red('✘')} ${message}`);\r\n}\r\n\r\n/**\r\n * 渐变色文本 (简单模拟,不依赖第三方复杂渐变库)\r\n */\r\nexport function gradientText(text: string) {\r\n const colors = [\r\n chalk.hex('#FF0080'),\r\n chalk.hex('#FF8C00'),\r\n chalk.hex('#40E0D0'),\r\n chalk.hex('#0080FF'),\r\n chalk.hex('#7B68EE'),\r\n ];\r\n\r\n let result = '';\r\n for (let i = 0; i < text.length; i++) {\r\n const color = colors[i % colors.length];\r\n result += color!(text[i]);\r\n }\r\n return result;\r\n}\r\n","import path from \"node:path\";\r\nimport fs from \"node:fs/promises\";\r\nimport fssync from \"node:fs\";\r\nimport { Command } from \"commander\";\r\nimport type { RegistryComponent, RegistryFile } from \"../types.js\";\r\nimport { listFilesRecursive, sha1, writeJsonFile } from \"../utils/fs.js\";\r\nimport { extractNpmDependenciesFromText } from \"../utils/imports.js\";\r\n\r\nfunction isAllowedFile(filePath: string) {\r\n const ext = path.extname(filePath).toLowerCase();\r\n return [\r\n \".vue\",\r\n \".ts\",\r\n \".js\",\r\n \".json\",\r\n \".css\",\r\n \".md\",\r\n \".svg\",\r\n ].includes(ext);\r\n}\r\n\r\nimport { transformToUniapp } from \"../utils/transformers.js\";\r\n\r\nfunction findWorkspaceRoot(startDir: string) {\r\n let current = path.resolve(startDir);\r\n for (; ;) {\r\n const marker = path.join(current, \"pnpm-workspace.yaml\");\r\n if (fssync.existsSync(marker)) return current;\r\n const parent = path.dirname(current);\r\n if (parent === current) return startDir;\r\n current = parent;\r\n }\r\n}\r\n\r\nexport function buildCommand() {\r\n const cmd = new Command(\"build\")\r\n .description(\"(内部)扫描组件源码并生成 registry JSON\")\r\n .option(\"--root <path>\", \"仓库根目录(默认自动向上查找 pnpm-workspace.yaml)\")\r\n .option(\r\n \"--source <path>\",\r\n \"组件源码目录(相对 root)\",\r\n \"app/components/reborn/ui\",\r\n )\r\n .option(\r\n \"--uniapp-source <path>\",\r\n \"UniApp 组件源码目录(相对 root),如果不提供则通过转换生成\",\r\n \"\",\r\n )\r\n .option(\r\n \"--out <path>\",\r\n \"输出 registry.json 路径(相对 root)\",\r\n \"packages/cli/registry/registry.json\",\r\n )\r\n .option(\r\n \"--also-out <path>\",\r\n \"额外再输出一份 registry.json(可重复传参)\",\r\n (val, acc: string[]) => {\r\n acc.push(val);\r\n return acc;\r\n },\r\n [],\r\n )\r\n .action(async (opts) => {\r\n const rootDir = opts.root\r\n ? path.resolve(opts.root)\r\n : findWorkspaceRoot(process.cwd());\r\n const sourceDir = path.join(rootDir, opts.source);\r\n const uniappSourceDir = opts.uniappSource\r\n ? path.join(rootDir, opts.uniappSource)\r\n : \"\";\r\n const outPath = path.join(rootDir, opts.out);\r\n const alsoOutPaths: string[] = (opts.alsoOut ?? [])?.map((p: string) =>\r\n path.join(rootDir, p),\r\n );\r\n\r\n const dirents = await fs.readdir(sourceDir, { withFileTypes: true });\r\n const componentDirs = dirents\r\n .filter((d) => d.isDirectory())\r\n ?.map((d) => path.join(sourceDir, d.name))\r\n .sort((a, b) => a.localeCompare(b));\r\n\r\n const components: RegistryComponent[] = [];\r\n\r\n for (const absComponentDir of componentDirs) {\r\n const name = path.basename(absComponentDir);\r\n const absFiles = (await listFilesRecursive(absComponentDir)).filter(\r\n isAllowedFile,\r\n );\r\n\r\n\r\n const files: RegistryComponent[\"files\"] = [];\r\n const depSet = new Set<string>();\r\n\r\n for (const absFile of absFiles) {\r\n const rel = path\r\n .relative(absComponentDir, absFile)\r\n .split(path.sep)\r\n .join(\"/\");\r\n const content = await fs.readFile(absFile, \"utf8\");\r\n\r\n const ext = path.extname(absFile).toLowerCase();\r\n\r\n // 1. Web 版本(原样)\r\n if (ext === \".vue\") {\r\n files.push({ path: rel, content, target: \"web\" });\r\n } else {\r\n // Check for collision with UniApp source\r\n let target: \"web\" | \"uniapp\" | undefined;\r\n if (uniappSourceDir) {\r\n const parts = rel.split(\"/\");\r\n const uniappFile = path.join(uniappSourceDir, name, ...parts);\r\n if (fssync.existsSync(uniappFile)) {\r\n target = \"web\";\r\n }\r\n }\r\n if (target) {\r\n files.push({ path: rel, content, target });\r\n } else {\r\n files.push({ path: rel, content });\r\n }\r\n }\r\n\r\n // 只从代码文件里抽依赖\r\n if (ext === \".ts\" || ext === \".js\" || ext === \".vue\") {\r\n for (const dep of extractNpmDependenciesFromText(content)) {\r\n depSet.add(dep);\r\n }\r\n }\r\n }\r\n\r\n // 2. UniApp 版本\r\n // 如果提供了 uniappSourceDir,从那里读取;否则通过转换生成\r\n if (uniappSourceDir) {\r\n const uniappComponentDir = path.join(uniappSourceDir, name);\r\n if (fssync.existsSync(uniappComponentDir)) {\r\n const uniappFiles = (await listFilesRecursive(uniappComponentDir)).filter(\r\n isAllowedFile,\r\n );\r\n\r\n for (const absFile of uniappFiles) {\r\n const rel = path\r\n .relative(uniappComponentDir, absFile)\r\n .split(path.sep)\r\n .join(\"/\");\r\n const content = await fs.readFile(absFile, \"utf8\");\r\n const ext = path.extname(absFile).toLowerCase();\r\n\r\n files.push({ path: rel, content, target: \"uniapp\" });\r\n\r\n // 抽取依赖\r\n if (ext === \".ts\" || ext === \".js\" || ext === \".vue\") {\r\n for (const dep of extractNpmDependenciesFromText(content)) {\r\n depSet.add(dep);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // 通过转换生成 UniApp 版本\r\n for (const absFile of absFiles) {\r\n const ext = path.extname(absFile).toLowerCase();\r\n if (ext === \".vue\") {\r\n const rel = path\r\n .relative(absComponentDir, absFile)\r\n .split(path.sep)\r\n .join(\"/\");\r\n const content = await fs.readFile(absFile, \"utf8\");\r\n files.push({\r\n path: rel,\r\n content: transformToUniapp(content),\r\n target: \"uniapp\",\r\n });\r\n }\r\n }\r\n }\r\n\r\n components.push({\r\n name,\r\n dependencies: [...depSet].sort(),\r\n files,\r\n });\r\n }\r\n\r\n const registry: RegistryFile = {\r\n schemaVersion: 1,\r\n generatedAt: new Date().toISOString(),\r\n source: {\r\n rootDir: rootDir.split(path.sep).join(\"/\"),\r\n componentsDir: opts.source,\r\n },\r\n components,\r\n };\r\n\r\n async function writeOut(targetRegistryPath: string) {\r\n const outComponentsDir = path.join(\r\n path.dirname(targetRegistryPath),\r\n \"components\",\r\n );\r\n await writeJsonFile(targetRegistryPath, registry);\r\n\r\n // 额外输出每个组件的 json,方便调试/按需读取\r\n await fs.mkdir(outComponentsDir, { recursive: true });\r\n for (const c of components) {\r\n await writeJsonFile(\r\n path.join(outComponentsDir, `${c.name}.json`),\r\n {\r\n ...c,\r\n fileCount: c.files.length,\r\n contentHash: sha1(JSON.stringify(c.files?.map((f) => f.content))),\r\n },\r\n );\r\n }\r\n }\r\n\r\n await writeOut(outPath);\r\n for (const p of alsoOutPaths) await writeOut(p);\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(\r\n `registry 已生成:${path.relative(process.cwd(), outPath)}(${components.length} 个组件)`,\r\n );\r\n });\r\n\r\n return cmd;\r\n}\r\n\r\n\r\n","const IMPORT_RE =\r\n /\\bfrom\\s+[\"']([^\"']+)[\"']|\\bimport\\(\\s*[\"']([^\"']+)[\"']\\s*\\)|\\brequire\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g;\r\n\r\nfunction normalizePackageName(specifier: string) {\r\n // ignore relative/alias/virtual\r\n if (\r\n specifier.startsWith(\".\") ||\r\n specifier.startsWith(\"/\") ||\r\n specifier.startsWith(\"@/\") ||\r\n specifier.startsWith(\"~/\") ||\r\n specifier.startsWith(\"#\") ||\r\n specifier.startsWith(\"virtual:\")\r\n ) {\r\n return null;\r\n }\r\n\r\n // scoped package: @scope/name[/...]\r\n if (specifier.startsWith(\"@\")) {\r\n const parts = specifier.split(\"/\");\r\n if (parts.length >= 2) return `${parts[0]}/${parts[1]}`;\r\n return specifier;\r\n }\r\n\r\n // normal package: name[/...]\r\n return specifier.split(\"/\")[0] ?? null;\r\n}\r\n\r\nexport function extractNpmDependenciesFromText(text: string) {\r\n const out = new Set<string>();\r\n\r\n for (const match of text.matchAll(IMPORT_RE)) {\r\n const spec = match[1] ?? match[2] ?? match[3];\r\n if (!spec) continue;\r\n const pkg = normalizePackageName(spec);\r\n if (!pkg) continue;\r\n out.add(pkg);\r\n }\r\n\r\n // 常见“框架自带/不应自动安装”的虚拟模块\r\n out.delete(\"nuxt\");\r\n out.delete(\"vue\");\r\n\r\n return [...out].sort();\r\n}\r\n\r\n\r\n","\r\nexport function transformToUniapp(code: string): string {\r\n // 1. 标签替换\r\n // div -> view\r\n // span, font -> text(注意:span可能嵌套,正则要注意)\r\n // ul, li -> view\r\n // img -> image\r\n // a -> navigator\r\n // select -> picker\r\n // iframe -> web-view\r\n\r\n let newCode = code;\r\n\r\n // 简单正则替换标签名\r\n const tagMap: Record<string, string> = {\r\n div: \"view\",\r\n span: \"text\",\r\n font: \"text\",\r\n ul: \"view\",\r\n li: \"view\",\r\n img: \"image\",\r\n a: \"navigator\",\r\n select: \"picker\",\r\n iframe: \"web-view\",\r\n };\r\n\r\n for (const [k, v] of Object.entries(tagMap)) {\r\n // 匹配 <tag ...> 和 </tag>\r\n // 1. <tag\r\n newCode = newCode.replace(new RegExp(`<${k}(\\\\s+|>)`, \"g\"), `<${v}$1`);\r\n // 2. </tag>\r\n newCode = newCode.replace(new RegExp(`<\\\\/${k}>`, \"g\"), `</${v}>`);\r\n }\r\n\r\n // 2. 特殊处理\r\n // input[type=\"search\"] -> type=\"text\" confirm-type=\"search\"\r\n newCode = newCode.replace(/type=[\"']search[\"']/g, 'confirm-type=\"search\"');\r\n\r\n return newCode;\r\n}\r\n","import path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport fssync from \"node:fs\";\nimport { Command } from \"commander\";\nimport prompts from \"prompts\";\nimport type { CliConfig, PackageManager } from \"../types.js\";\nimport { copyDirRecursive, ensureDir, listFilesRecursive, pathExists, writeJsonFile, writeTextFile } from \"../utils/fs.js\";\nimport { detectPackageManager } from \"../utils/pm.js\";\nimport { DEFAULT_CONFIG_PATH, defaultConfig, loadConfigCompat } from \"../utils/registry.js\";\nimport { findNearestPackageRoot } from \"../utils/templates.js\";\nimport { TEMPLATES } from \"../generated/templates.js\";\nimport { gradientText, showLogo, typewriter } from \"../utils/ui.js\";\n\nfunction looksLikeNuxtProject(cwd: string) {\n return Promise.all([\n pathExists(path.join(cwd, \"nuxt.config.ts\")),\n pathExists(path.join(cwd, \"nuxt.config.js\")),\n pathExists(path.join(cwd, \"nuxt.config.mjs\")),\n ]).then((arr) => arr.some(Boolean));\n}\n\nfunction findWorkspaceRoot(startDir: string) {\n let current = path.resolve(startDir);\n for (; ;) {\n const marker = path.join(current, \"pnpm-workspace.yaml\");\n if (fssync.existsSync(marker)) return current;\n const parent = path.dirname(current);\n if (parent === current) return startDir;\n current = parent;\n }\n}\n\n\n// function makeDefaultTailwindConfig removed in favor of template file\n\n\n\n\nfunction cnUtilsTs(params: { importPath?: string }) {\n // importPath 预留:如果用户想从别处导入 clsx/twMerge\n void params;\n return `import { type ClassValue, clsx } from \"clsx\";\\nimport { twMerge } from \"tailwind-merge\";\\n\\nexport function cn(...inputs: ClassValue[]) {\\n return twMerge(clsx(inputs));\\n}\\n`;\n}\n\nasync function rewriteAliasInDir(params: {\n cwd: string;\n targetDir: string;\n aliasSymbol: string;\n}) {\n const { cwd, targetDir, aliasSymbol } = params;\n if (!aliasSymbol || aliasSymbol === \"@\") return;\n const absDir = path.join(cwd, targetDir);\n if (!(await pathExists(absDir))) return;\n\n const files = await listFilesRecursive(absDir);\n for (const f of files) {\n const ext = path.extname(f).toLowerCase();\n // 只处理常见文本文件,避免误改二进制\n if (![\".ts\", \".tsx\", \".js\", \".jsx\", \".vue\", \".mjs\", \".cjs\"].includes(ext)) continue;\n const raw = await fs.readFile(f, \"utf8\");\n const next = raw.replaceAll(\"@/\", `${aliasSymbol}/`);\n if (next !== raw) await fs.writeFile(f, next, \"utf8\");\n }\n}\n\nasync function copyTemplates(params: {\n cwd: string;\n workspaceRoot: string;\n platform: \"web\" | \"uniapp\";\n cfg: CliConfig;\n overwrite?: boolean;\n}) {\n const { cwd, workspaceRoot, platform, cfg, overwrite } = params;\n\n // 1. 尝试从仓库源码目录拷贝(本地开发场景)\n const repoPaths = {\n web: {\n lib: path.join(workspaceRoot, \"app/lib\"),\n composables: path.join(workspaceRoot, \"app/composables\"),\n },\n uniapp: {\n lib: path.join(workspaceRoot, \"packages/uniapp-project/src/lib\"),\n composables: path.join(workspaceRoot, \"packages/uniapp-project/src/composables\"),\n },\n };\n\n const currentRepoPaths = repoPaths[platform];\n let copiedFromRepo = false;\n\n if (await pathExists(currentRepoPaths.lib)) {\n await copyDirRecursive({\n fromDir: currentRepoPaths.lib,\n toDir: path.join(cwd, cfg.libDir),\n overwrite,\n });\n copiedFromRepo = true;\n }\n\n if (await pathExists(currentRepoPaths.composables)) {\n await copyDirRecursive({\n fromDir: currentRepoPaths.composables,\n toDir: path.join(cwd, cfg.composablesDir),\n overwrite,\n ignoreFileNames: platform === \"web\" ? new Set([\"useComponentCode.ts\", \"useCopyToClipboard.ts\",\"getComponentCode.ts\",\"getUniappCode.ts\"]) : undefined,\n });\n copiedFromRepo = true;\n }\n\n // 2. 如果不是在仓库内运行(例如 npx),则使用生成的字符串模板\n if (!copiedFromRepo) {\n const platformTemplates = TEMPLATES[platform];\n for (const [relPath, content] of Object.entries(platformTemplates)) {\n let targetPath = \"\";\n if (relPath.startsWith(\"lib/\")) {\n targetPath = path.join(cwd, cfg.libDir, relPath.replace(\"lib/\", \"\"));\n } else if (relPath.startsWith(\"composables/\")) {\n targetPath = path.join(cwd, cfg.composablesDir, relPath.replace(\"composables/\", \"\"));\n }\n\n if (targetPath) {\n if (!overwrite && (await pathExists(targetPath))) continue;\n await writeTextFile(targetPath, content);\n }\n }\n }\n}\n\nexport function initCommand() {\n const cmd = new Command(\"init\")\n .description(\"初始化新项目\")\n .option(\"--cwd <path>\", \"目标项目目录\", process.cwd())\n .option(\"--pm <pm>\", \"包管理器:pnpm|npm|yarn|bun\")\n .option(\"--yes\", \"跳过交互,使用默认值\", false)\n .option(\"--overwrite\", \"覆盖已存在的模板文件(lib/composables)\", false)\n .option(\n \"--config <path>\",\n \"配置文件路径(相对 cwd)\",\n DEFAULT_CONFIG_PATH,\n )\n .option(\n \"--components-dir <path>\",\n \"组件写入目录\",\n defaultConfig().componentsDir,\n )\n .option(\n \"--lib-dir <path>\",\n \"lib 目录(cn/utils)\",\n defaultConfig().libDir,\n )\n .option(\n \"--composables-dir <path>\",\n \"composables 目录\",\n defaultConfig().composablesDir,\n )\n .option(\n \"--alias-symbol <symbol>\",\n \"项目根目录映射别名符号(默认 @)\",\n defaultConfig().aliasSymbol,\n )\n .option(\"--platform <platform>\", \"目标平台:web|uniapp\", \"web\")\n .option(\"--registry <pkgOrPath>\", \"registry 来源(默认 builtin)\", defaultConfig().registry)\n .action(async (opts) => {\n const cwd = path.resolve(opts.cwd);\n\n // eslint-disable-next-line no-console\n console.log(\n \"提示:项目中有部分依赖需要使用@/ 路径进行配置,请您安装到项目中配置好的路径下,请慎重选择文件位置\",\n );\n\n const pkgPath = path.join(cwd, \"package.json\");\n if (!(await pathExists(pkgPath))) {\n throw new Error(`未找到 package.json:${pkgPath}`);\n }\n\n const pm: PackageManager =\n opts.pm ?? (await detectPackageManager(cwd));\n\n const cfg: CliConfig = {\n schemaVersion: 1,\n componentsDir: opts.componentsDir,\n libDir: opts.libDir,\n composablesDir: opts.composablesDir,\n aliasSymbol: opts.aliasSymbol,\n registry: opts.registry,\n platform: opts.platform,\n };\n\n // 如果已存在 components.json,默认沿用(除非用户显式传参覆盖)\n const existing = await loadConfigCompat(cwd);\n if (existing) {\n cfg.componentsDir = opts.componentsDir ?? existing.componentsDir ?? cfg.componentsDir;\n cfg.libDir = opts.libDir ?? existing.libDir ?? cfg.libDir;\n cfg.composablesDir = opts.composablesDir ?? existing.composablesDir ?? cfg.composablesDir;\n cfg.aliasSymbol = opts.aliasSymbol ?? existing.aliasSymbol ?? cfg.aliasSymbol;\n cfg.registry = opts.registry ?? existing.registry ?? cfg.registry;\n cfg.platform = opts.platform ?? existing.platform ?? cfg.platform;\n }\n\n if (!opts.yes) {\n const nuxt = await looksLikeNuxtProject(cwd);\n const res = await prompts(\n [\n {\n type: \"select\",\n name: \"platform\",\n message: \"选择目标平台\",\n choices: [\n { title: \"Web (默认)\", value: \"web\" },\n { title: \"UniApp\", value: \"uniapp\" },\n ],\n initial: cfg.platform === \"uniapp\" ? 1 : 0,\n },\n {\n type: \"text\",\n name: \"componentsDir\",\n message: \"组件目录(componentsDir)\",\n initial: cfg.componentsDir,\n },\n {\n type: \"text\",\n name: \"libDir\",\n message: \"lib 目录(libDir,用于 cn/utils)\",\n initial: cfg.libDir,\n },\n {\n type: \"text\",\n name: \"composablesDir\",\n message: \"composables 目录(composablesDir)\",\n initial: cfg.composablesDir,\n },\n {\n type: \"text\",\n name: \"aliasSymbol\",\n message: \"基于项目根目录的“映射”的符号是?(aliasSymbol)\",\n initial: cfg.aliasSymbol ?? \"@\",\n },\n ],\n {\n onCancel: () => {\n throw new Error(\"已取消\");\n },\n },\n );\n\n cfg.platform = res.platform ?? cfg.platform;\n cfg.componentsDir = res.componentsDir ?? cfg.componentsDir;\n cfg.libDir = res.libDir ?? cfg.libDir;\n cfg.composablesDir = res.composablesDir ?? cfg.composablesDir;\n cfg.aliasSymbol = res.aliasSymbol ?? cfg.aliasSymbol;\n\n // 写配置\n const cfgPath = path.join(cwd, opts.config);\n await writeJsonFile(cfgPath, cfg);\n\n // 复制模板:lib/ + composables/\n const workspaceRoot = findWorkspaceRoot(findNearestPackageRoot(import.meta.url));\n await copyTemplates({\n cwd,\n workspaceRoot,\n platform: cfg.platform as \"web\" | \"uniapp\",\n cfg,\n overwrite: opts.overwrite,\n });\n\n // 仅替换 \"@/...\" 的别名符号,不改其它路径内容\n await rewriteAliasInDir({ cwd, targetDir: cfg.libDir, aliasSymbol: cfg.aliasSymbol ?? \"@\" });\n await rewriteAliasInDir({\n cwd,\n targetDir: cfg.composablesDir,\n aliasSymbol: cfg.aliasSymbol ?? \"@\",\n });\n\n // 兜底:如果用户模板里没有 utils.ts,则生成 cn\n const libUtilsPath = path.join(cwd, cfg.libDir, \"utils.ts\");\n if (!(await pathExists(libUtilsPath))) await writeTextFile(libUtilsPath, cnUtilsTs({}));\n\n console.log(`已写入配置:${path.relative(process.cwd(), cfgPath)};并生成 cn/utils(pm=${pm})`);\n console.log(\"请按照 https://tw.icebreaker.top/docs/quick-start/v4/uni-app-vite 指引进行项目配置初始化\");\n\n console.log(\"\");\n await showLogo();\n await typewriter(gradientText(\"感谢使用 Reborn UI ! ✨\"), 20);\n return;\n }\n\n // --yes:直接写默认配置\n const cfgPath = path.join(cwd, opts.config);\n await ensureDir(path.dirname(cfgPath));\n await fs.writeFile(cfgPath, JSON.stringify(cfg, null, 2) + \"\\n\", \"utf8\");\n\n // 复制模板逻辑\n const workspaceRoot = findWorkspaceRoot(findNearestPackageRoot(import.meta.url));\n await copyTemplates({\n cwd,\n workspaceRoot,\n platform: cfg.platform as \"web\" | \"uniapp\",\n cfg,\n overwrite: opts.overwrite,\n });\n\n // 仅替换 \"@/...\" 的别名符号,不改其它路径内容\n await rewriteAliasInDir({ cwd, targetDir: cfg.libDir, aliasSymbol: cfg.aliasSymbol ?? \"@\" });\n await rewriteAliasInDir({\n cwd,\n targetDir: cfg.composablesDir,\n aliasSymbol: cfg.aliasSymbol ?? \"@\",\n });\n\n // 兜底:如果用户模板里没有 utils.ts,则生成 cn\n const libUtilsPath = path.join(cwd, cfg.libDir, \"utils.ts\");\n if (!(await pathExists(libUtilsPath))) await writeTextFile(libUtilsPath, cnUtilsTs({}));\n\n // eslint-disable-next-line no-console\n console.log(`已初始化:${path.relative(process.cwd(), cfgPath)};并生成 cn/utils(pm=${pm})`);\n console.log(\"请按照 https://tw.icebreaker.top/docs/quick-start/v4/uni-app-vite 指引进行项目配置初始化\");\n\n console.log(\"\");\n await showLogo();\n await typewriter(gradientText(\"感谢使用 Reborn UI ! ✨\"), 2);\n });\n\n return cmd;\n}\n\n\n","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function findNearestPackageRoot(from: string) {\n // from: import.meta.url\n let dir = path.dirname(fileURLToPath(from));\n while (true) {\n if (fs.existsSync(path.join(dir, \"package.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return dir;\n dir = parent;\n }\n}\n\n\n\n\n\n\n","// 此文件由 sync-templates.ts 自动生成,请勿手动修改\nexport const TEMPLATES = {\n \"web\": {\n \"lib/tv.ts\": \"import { createTV } from \\\"tailwind-variants\\\";\\r\\nimport { twMergeConfig } from \\\"./utils\\\";\\r\\n\\r\\nexport const tv = createTV({\\r\\n twMergeConfig,\\r\\n});\\r\\nexport type { VariantProps } from \\\"tailwind-variants\\\";\\r\\n\",\n \"lib/utils.ts\": \"import type { ClassValue } from \\\"clsx\\\";\\r\\nimport { clsx } from \\\"clsx\\\";\\r\\nimport { extendTailwindMerge } from \\\"tailwind-merge\\\";\\r\\n\\r\\nexport const twMergeConfig = {\\r\\n extend: {\\r\\n classGroups: {\\r\\n \\\"font-size\\\": [{ text: [(value: string) => !isNaN(Number(value))] }],\\r\\n },\\r\\n },\\r\\n};\\r\\n\\r\\nconst customTwMerge = extendTailwindMerge(twMergeConfig);\\r\\n\\r\\nexport function cn(...inputs: ClassValue[]) {\\r\\n return customTwMerge(clsx(inputs));\\r\\n}\\r\\n\\r\\nexport type ObjectValues<T> = T[keyof T];\\r\\n\",\n \"composables/useFieldGroup.ts\": \"\\r\\nimport { ref } from 'vue'\\r\\n\\r\\nexport function useFieldGroup(props: any) {\\r\\n return {\\r\\n disabled: ref(undefined),\\r\\n isError: ref(undefined),\\r\\n orientation: ref(undefined),\\r\\n size: ref(undefined)\\r\\n }\\r\\n}\\r\\n\",\n \"composables/useMouseState.ts\": \"import { readonly, ref } from \\\"vue\\\";\\r\\n\\r\\nexport function useMouseState() {\\r\\n const isMouseEntered = ref(false);\\r\\n\\r\\n function setMouseEntered(value: boolean) {\\r\\n isMouseEntered.value = value;\\r\\n }\\r\\n\\r\\n return {\\r\\n isMouseEntered: readonly(isMouseEntered),\\r\\n setMouseEntered,\\r\\n };\\r\\n}\\r\\n\",\n \"composables/useNavigation.ts\": \"import type { ContentNavigationItem } from \\\"@nuxt/content\\\";\\r\\n\\r\\nexport function useNavigation(navigation?: Ref<ContentNavigationItem[]>) {\\r\\n const route = useRoute();\\r\\n\\r\\n const children = computed(() => {\\r\\n const nav = toValue(navigation);\\r\\n\\r\\n // Get the current path segments\\r\\n const pathSegments = route.path.split(\\\"/\\\").filter(Boolean);\\r\\n\\r\\n // Need at least one section (e.g., ['components', 'button'])\\r\\n if (pathSegments.length < 1) {\\r\\n return [];\\r\\n }\\r\\n\\r\\n // Build the top parent path (e.g., '/components')\\r\\n const topParentPath = `/${pathSegments[0]}`;\\r\\n\\r\\n // Find the matching top-level navigation item\\r\\n const topParent = nav?.find((item) => item.path === topParentPath);\\r\\n\\r\\n return topParent?.children || [];\\r\\n });\\r\\n\\r\\n const isFlatList = computed(() => {\\r\\n return children.value.every((child) => !child.children || child.children.length === 0);\\r\\n });\\r\\n\\r\\n const nav = computed(() => {\\r\\n if (isFlatList.value) {\\r\\n return [\\r\\n {\\r\\n title: \\\"Overview\\\",\\r\\n path: children.value.at(0)?.path || \\\"\\\",\\r\\n children: children.value,\\r\\n },\\r\\n ];\\r\\n }\\r\\n\\r\\n return children.value;\\r\\n });\\r\\n\\r\\n return {\\r\\n nav,\\r\\n };\\r\\n}\\r\\n\"\n },\n \"uniapp\": {\n \"lib/tv.ts\": \"// @ts-ignore\\r\\nimport type { TV } from \\\"tailwind-variants\\\";\\r\\nimport { create } from '@weapp-tailwindcss/variants-v3'\\r\\n\\r\\n// @ts-ignore\\r\\nconst isH5 = process.env.UNI_PLATFORM === 'h5'\\r\\n\\r\\nconst { tv: createTV } = create({\\r\\n // @ts-ignore\\r\\n escape: !isH5,\\r\\n // @ts-ignore\\r\\n unescape: !isH5,\\r\\n})\\r\\n\\r\\nconst textSizeKeys = ['20', '22', '24', '26', '28', '30', '32', '36', '40', '48', '52']\\r\\n\\r\\nconst twMergeConfig = {\\r\\n extend: {\\r\\n classGroups: {\\r\\n 'font-size': [{ text: textSizeKeys }],\\r\\n },\\r\\n },\\r\\n} as const\\r\\n\\r\\nexport const tv: TV = (options, config) =>\\r\\n createTV(options, {\\r\\n ...config,\\r\\n twMerge: config?.twMerge ?? true,\\r\\n twMergeConfig: {\\r\\n ...config?.twMergeConfig,\\r\\n ...twMergeConfig,\\r\\n },\\r\\n });\\r\\n\",\n \"lib/utils.ts\": \"import { type ClassValue, clsx } from 'clsx'\\r\\nimport { create } from '@weapp-tailwindcss/merge-v3'\\r\\n\\r\\n// @ts-ignore\\r\\nconst isH5 = process.env.UNI_PLATFORM === 'h5'\\r\\nconst { twMerge } = create({\\r\\n escape: !isH5,\\r\\n unescape: !isH5,\\r\\n // @ts-ignore\\r\\n extend: {\\r\\n classGroups: {\\r\\n 'font-size': [{ text: ['20', '22', '24', '26', '28', '30', '32', '36', '40', '48', '52'] }],\\r\\n },\\r\\n },\\r\\n})\\r\\n\\r\\nexport function cn(...inputs: ClassValue[]) {\\r\\n return twMerge(clsx(inputs))\\r\\n}\\r\\n\",\n \"composables/useDarkMode.ts\": \"export const useDarkMode = () => {\\r\\n const isDark = ref(false)\\r\\n\\r\\n const toggleDarkMode = () => {\\r\\n isDark.value = !isDark.value\\r\\n updateTheme()\\r\\n }\\r\\n\\r\\n const updateTheme = () => {\\r\\n const value = isDark.value\\r\\n uni.setStorageSync('darkMode', value)\\r\\n\\r\\n // #ifdef H5\\r\\n if (value) {\\r\\n document.documentElement.classList.add('dark')\\r\\n } else {\\r\\n document.documentElement.classList.remove('dark')\\r\\n }\\r\\n // #endif\\r\\n\\r\\n }\\r\\n\\r\\n const initTheme = () => {\\r\\n const saved = uni.getStorageSync('darkMode')\\r\\n if (saved !== '') {\\r\\n isDark.value = !!saved\\r\\n } else {\\r\\n isDark.value = false\\r\\n }\\r\\n updateTheme()\\r\\n }\\r\\n\\r\\n initTheme()\\r\\n\\r\\n return {\\r\\n isDark,\\r\\n toggleDarkMode\\r\\n }\\r\\n}\\r\\n\",\n \"composables/useFieldGroup.ts\": \"import { ref, provide, inject, computed, watch, onMounted, onUnmounted, getCurrentInstance } from 'vue';\\r\\nimport * as z from 'zod';\\r\\n\\r\\nexport type FormValidateError = {\\r\\n field: string;\\r\\n message: string;\\r\\n};\\r\\n\\r\\nexport interface UseFieldGroupProps {\\r\\n modelValue?: any;\\r\\n}\\r\\n\\r\\nexport function useFieldGroup() {\\r\\n\\r\\n // Data & Context\\r\\n const errors = ref(new Map<string, string>());\\r\\n const fields = ref(new Set<string>([]));\\r\\n const fieldInstances = ref<any[]>([]);\\r\\n\\r\\n // --- Field Management ---\\r\\n const addField = (field: any) => {\\r\\n fieldInstances.value.push(field);\\r\\n if (field.prop) {\\r\\n fields.value.add(field.prop);\\r\\n }\\r\\n };\\r\\n\\r\\n const removeField = (field: any) => {\\r\\n const index = fieldInstances.value.indexOf(field);\\r\\n if (index > -1) {\\r\\n fieldInstances.value.splice(index, 1);\\r\\n }\\r\\n if (field.prop) {\\r\\n fields.value.delete(field.prop);\\r\\n }\\r\\n };\\r\\n\\r\\n // --- Error Management ---\\r\\n const errorLock = ref(false);\\r\\n\\r\\n function setError(prop: string, error: string) {\\r\\n if (errorLock.value) return;\\r\\n if (prop !== \\\"\\\") errors.value.set(prop, error);\\r\\n }\\r\\n\\r\\n function removeError(prop: string) {\\r\\n if (prop !== \\\"\\\") errors.value.delete(prop);\\r\\n }\\r\\n\\r\\n function getError(prop: string): string {\\r\\n if (prop !== \\\"\\\") return errors.value.get(prop) ?? \\\"\\\";\\r\\n return \\\"\\\";\\r\\n }\\r\\n\\r\\n async function getErrors(): Promise<FormValidateError[]> {\\r\\n const errs = [] as FormValidateError[];\\r\\n errors.value.forEach((msg, field) => {\\r\\n errs.push({ field, message: msg });\\r\\n });\\r\\n return errs;\\r\\n }\\r\\n\\r\\n function clearValidate(fieldsToClear?: string | string[]) {\\r\\n if (fieldsToClear) {\\r\\n const propsArray = Array.isArray(fieldsToClear) ? fieldsToClear : [fieldsToClear];\\r\\n propsArray.forEach(prop => removeError(prop));\\r\\n } else {\\r\\n errors.value.clear();\\r\\n }\\r\\n }\\r\\n\\r\\n return {\\r\\n errors,\\r\\n fields,\\r\\n fieldInstances,\\r\\n addField,\\r\\n removeField,\\r\\n setError,\\r\\n removeError,\\r\\n getError, // Used by children\\r\\n getErrors, // Used by validate\\r\\n clearValidate\\r\\n };\\r\\n}\\r\\n\\r\\n\\r\\nexport interface UseFieldGroupItemProps {\\r\\n prop?: string;\\r\\n label?: string;\\r\\n labelPosition?: string;\\r\\n labelWidth?: string | number;\\r\\n ui?: any;\\r\\n}\\r\\n\\r\\nexport function useFieldGroupItem(props: UseFieldGroupItemProps) {\\r\\n const form = inject<any>('rebornForm', undefined);\\r\\n const instance = getCurrentInstance();\\r\\n\\r\\n\\r\\n const error = computed(() => {\\r\\n if (!form || !props.prop) return '';\\r\\n return form.getError ? form.getError(props.prop) : '';\\r\\n });\\r\\n\\r\\n const labelPosition = computed(() => {\\r\\n return props.labelPosition || form?.props?.labelPosition || 'left';\\r\\n });\\r\\n\\r\\n const labelWidth = computed(() => {\\r\\n if (labelPosition.value === 'top') return 'auto';\\r\\n return props.labelWidth || form?.props?.labelWidth || 'auto';\\r\\n });\\r\\n\\r\\n const size = computed(() => {\\r\\n const s = form?.props?.size;\\r\\n if (s && ['sm', 'md', 'lg'].includes(s)) {\\r\\n return s as \\\"sm\\\" | \\\"md\\\" | \\\"lg\\\";\\r\\n }\\r\\n return 'sm';\\r\\n });\\r\\n\\r\\n const getBoundingClientRect = (callback: (res: any) => void) => {\\r\\n uni.createSelectorQuery()\\r\\n .in(instance?.proxy)\\r\\n .select('.re-form-item')\\r\\n .boundingClientRect(callback)\\r\\n .exec();\\r\\n };\\r\\n\\r\\n // Watch for prop changes to update registration\\r\\n watch(() => props.prop, (newProp, oldProp) => {\\r\\n if (form) {\\r\\n if (oldProp) {\\r\\n form.removeField({ uid: instance?.uid, prop: oldProp });\\r\\n }\\r\\n if (newProp) {\\r\\n form.addField({ uid: instance?.uid, prop: newProp, getBoundingClientRect });\\r\\n }\\r\\n }\\r\\n });\\r\\n\\r\\n onMounted(() => {\\r\\n if (form && props.prop) {\\r\\n form.addField({ uid: instance?.uid, prop: props.prop, getBoundingClientRect });\\r\\n }\\r\\n });\\r\\n\\r\\n onUnmounted(() => {\\r\\n if (form && props.prop) {\\r\\n form.removeField({ uid: instance?.uid, prop: props.prop });\\r\\n }\\r\\n });\\r\\n\\r\\n return {\\r\\n form,\\r\\n error,\\r\\n labelPosition,\\r\\n labelWidth,\\r\\n size,\\r\\n getBoundingClientRect\\r\\n };\\r\\n}\\r\\n\\r\\n// Consumer for inner components (Input, Select, etc.)\\r\\nexport function useFormInject(props: any) {\\r\\n const form = inject<any>('rebornForm', null);\\r\\n const formItem = inject<any>('rebornFormItem', null);\\r\\n\\r\\n const size = computed(() => {\\r\\n return form?.props?.size || props.size;\\r\\n });\\r\\n\\r\\n const disabled = computed(() => {\\r\\n return form?.props?.disabled || props.disabled;\\r\\n });\\r\\n\\r\\n const orientation = computed(() => {\\r\\n return form?.props?.orientation || props.orientation;\\r\\n });\\r\\n\\r\\n const isError = computed(() => {\\r\\n return formItem?.isError?.value || false;\\r\\n });\\r\\n\\r\\n return {\\r\\n form,\\r\\n size,\\r\\n disabled,\\r\\n orientation,\\r\\n isError\\r\\n };\\r\\n}\\r\\n\"\n }\n} as const;\n\nexport type Platform = keyof typeof TEMPLATES;\n","{\n \"name\": \"reborn-ui\",\n \"version\": \"0.1.76\",\n \"description\": \"A CLI for Reborn UI\",\n \"author\": \"1997liuyh-boop\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/1997liuyh-boop/Reborn-UI.git\"\n },\n \"type\": \"module\",\n \"bin\": {\n \"reborn-ui\": \"dist/index.js\"\n },\n \"files\": [\n \"dist\",\n \"registry\",\n \"README.md\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"cli\": \"tsx src/index.ts\",\n \"build\": \"tsup\",\n \"dev\": \"tsx src/index.ts\",\n \"clean\": \"rimraf dist\",\n \"prepare\": \"tsup\",\n \"templates:sync\": \"tsx src/scripts/sync-templates.ts\",\n \"registry:build\": \"tsx src/index.ts build --root ../.. --uniapp-source packages/uniapp-project/src/components\",\n \"prepack\": \"npm run templates:sync && npm run build && npm run registry:build\",\n \"prepublishOnly\": \"npm run templates:sync && npm run build && npm run registry:build\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.6.2\",\n \"cli-progress\": \"^3.12.0\",\n \"commander\": \"^14.0.0\",\n \"execa\": \"^9.6.0\",\n \"figlet\": \"^1.9.4\",\n \"ora\": \"^9.0.0\",\n \"prompts\": \"^2.4.2\"\n },\n \"devDependencies\": {\n \"@types/cli-progress\": \"^3.11.6\",\n \"@types/figlet\": \"^1.7.0\",\n \"@types/node\": \"^22.10.7\",\n \"@types/prompts\": \"^2.4.9\",\n \"rimraf\": \"^6.0.1\",\n \"tsup\": \"^8.5.0\",\n \"tsx\": \"^4.20.0\",\n \"typescript\": \"^5.8.3\"\n }\n}\n"],"mappings":"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","names":["Command","path","fs","path","path","path","fs","path","fs","require","chalk","path","chalk","path","fs","Command","path","Command","fs","path","fs","fssync","Command","prompts","path","fs","fileURLToPath","findNearestPackageRoot","path","findWorkspaceRoot","fssync","fs","Command","prompts","cfgPath","workspaceRoot","findNearestPackageRoot","libUtilsPath","Command"]}
|
package/package.json
CHANGED
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
"files": [
|
|
8
8
|
{
|
|
9
9
|
"path": "reborn-back-top.config.ts",
|
|
10
|
-
"content": "const color = ['primary', 'secondary', 'success', 'info', 'warning', 'error', 'neutral'] as const\r\nconst sizes = [\"sm\", \"md\", \"lg\"] as const;\r\nexport { color as backTopColors, sizes as backTopSizes };\r\nexport default {\r\n slots: {\r\n wrapper: \"fixed right-0 z-50 overflow-visible pointer-none transition-all duration-300 active:scale-95\",\r\n base: \"flex flex-row items-center justify-center text-white shadow-lg rounded-full pointer-events-auto cursor-pointer transition-transform duration-300\",\r\n icon: \"text-white\"\r\n },\r\n variants: {\r\n color: {\r\n primary: { base: 'bg-primary' },\r\n secondary: { base: 'bg-secondary' },\r\n success: { base: 'bg-success' },\r\n info: { base: 'bg-info' },\r\n warning: { base: 'bg-warning' },\r\n error: { base: 'bg-error' },\r\n neutral: { base: 'bg-neutral' }\r\n },\r\n size: {\r\n sm: { base: 'size-8', icon: 'text-26' },\r\n md: { base: 'size-10', icon: 'text-28' },\r\n lg: { base: 'size-12', icon: 'text-30' }\r\n },\r\n },\r\n defaultVariants: {\r\n color: 'primary' as const,\r\n size: 'md' as const\r\n }\r\n}\r\n"
|
|
10
|
+
"content": "const color = ['primary', 'secondary', 'success', 'info', 'warning', 'error', 'neutral'] as const\r\nconst sizes = [\"sm\", \"md\", \"lg\"] as const;\r\nexport { color as backTopColors, sizes as backTopSizes };\r\nexport default {\r\n slots: {\r\n wrapper: \"fixed right-0 z-50 overflow-visible pointer-none transition-all duration-300 active:scale-95\",\r\n base: \"flex flex-row items-center justify-center text-white shadow-lg rounded-full pointer-events-auto cursor-pointer transition-transform duration-300\",\r\n icon: \"text-white\"\r\n },\r\n variants: {\r\n color: {\r\n primary: { base: 'bg-primary' },\r\n secondary: { base: 'bg-secondary' },\r\n success: { base: 'bg-success' },\r\n info: { base: 'bg-info' },\r\n warning: { base: 'bg-warning' },\r\n error: { base: 'bg-error' },\r\n neutral: { base: 'bg-neutral' }\r\n },\r\n size: {\r\n sm: { base: 'size-8', icon: 'text-26' },\r\n md: { base: 'size-10', icon: 'text-28' },\r\n lg: { base: 'size-12', icon: 'text-30' }\r\n },\r\n },\r\n defaultVariants: {\r\n color: 'primary' as const,\r\n size: 'md' as const\r\n }\r\n}\r\n",
|
|
11
|
+
"target": "web"
|
|
11
12
|
},
|
|
12
13
|
{
|
|
13
14
|
"path": "RebornBackTop.vue",
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
"path": "reborn-badge.config.ts",
|
|
17
|
-
"content": "import type { VariantProps } from \"class-variance-authority\"\r\nimport { cva } from \"class-variance-authority\"\r\n\r\nexport { default as Badge } from \"./RebornBadge.vue\"\r\n\r\nexport const badgeVariants = cva(\r\n \"inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\r\n secondary:\r\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\r\n destructive:\r\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\r\n outline:\r\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n },\r\n },\r\n)\r\nexport type BadgeVariants = VariantProps<typeof badgeVariants>\r\n"
|
|
17
|
+
"content": "import type { VariantProps } from \"class-variance-authority\"\r\nimport { cva } from \"class-variance-authority\"\r\n\r\nexport { default as Badge } from \"./RebornBadge.vue\"\r\n\r\nexport const badgeVariants = cva(\r\n \"inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\r\n secondary:\r\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\r\n destructive:\r\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\r\n outline:\r\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n },\r\n },\r\n)\r\nexport type BadgeVariants = VariantProps<typeof badgeVariants>\r\n",
|
|
18
|
+
"target": "web"
|
|
18
19
|
},
|
|
19
20
|
{
|
|
20
21
|
"path": "RebornBadge.vue",
|
|
@@ -4,11 +4,13 @@
|
|
|
4
4
|
"files": [
|
|
5
5
|
{
|
|
6
6
|
"path": "index.ts",
|
|
7
|
-
"content": "export { default as RebornButton } from \"./RebornButton.vue\";\r\n"
|
|
7
|
+
"content": "export { default as RebornButton } from \"./RebornButton.vue\";\r\n",
|
|
8
|
+
"target": "web"
|
|
8
9
|
},
|
|
9
10
|
{
|
|
10
11
|
"path": "reborn-button.config.ts",
|
|
11
|
-
"content": "const color = [\"primary\", \"secondary\", \"success\", \"info\", \"warning\", \"error\", \"neutral\"] as const;\r\n\r\nconst variant = [\"solid\", \"outline\", \"soft\", \"subtle\"] as const;\r\n\r\nconst size = [\r\n \"xs\",\r\n \"sm\",\r\n \"default\", // Mapped to md\r\n \"md\",\r\n \"lg\",\r\n \"xl\",\r\n \"2xl\",\r\n \"icon-xs\",\r\n \"icon-sm\",\r\n \"icon\", // Mapped to icon-md\r\n \"icon-md\",\r\n \"icon-lg\",\r\n \"icon-xl\",\r\n \"icon-2xl\",\r\n] as const;\r\n\r\nexport { color as buttonColors, variant as buttonVariants, size as buttonSizes };\r\n\r\nexport default {\r\n slots: {\r\n base: \"inline-flex items-center justify-center gap-2 whitespace-nowrap transition-all cursor-pointer disabled:cursor-not-allowed disabled:opacity-70 disabled:bg-gray-4 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\r\n label: \"truncate\",\r\n leadingIcon: \"shrink-0\",\r\n leadingAvatar: \"shrink-0\",\r\n leadingAvatarSize: \"\",\r\n trailingIcon: \"shrink-0\",\r\n },\r\n variants: {\r\n fieldGroup: {\r\n horizontal:\r\n \"not-only:first:rounded-e-none not-only:last:rounded-s-none not-last:not-first:rounded-none focus-visible:z-[1]\",\r\n vertical:\r\n \"not-only:first:rounded-b-none not-only:last:rounded-t-none not-last:not-first:rounded-none focus-visible:z-[1]\",\r\n },\r\n color: {\r\n primary: \"\",\r\n secondary: \"\",\r\n success: \"\",\r\n info: \"\",\r\n warning: \"\",\r\n error: \"\",\r\n neutral: \"\",\r\n },\r\n variant: {\r\n solid: \"\",\r\n outline: \"\",\r\n soft: \"\",\r\n subtle: \"\",\r\n },\r\n size: {\r\n xs: {\r\n base: \"h-[var(--button-xs-height)] text-24 leading-[1.5] gap-1.5 px-3 has-[>svg]:px-2.5\",\r\n },\r\n sm: {\r\n base: \"h-[var(--button-sm-height)] text-24 leading-[1.5] gap-1.5 px-3 has-[>svg]:px-2.5\",\r\n },\r\n default: {\r\n base: \"h-[var(--button-base-height)] text-26 leading-[1.5] px-4 py-4 has-[>svg]:px-3\",\r\n },\r\n md: { base: \"h-[var(--button-base-height)] text-26 leading-[1.5] px-4 py-4 has-[>svg]:px-3\" },\r\n lg: { base: \"h-[var(--button-lg-height)] text-28 leading-[1.5] px-6 has-[>svg]:px-4\" },\r\n xl: { base: \"h-[var(--button-xl-height)] text-30 leading-[1.5] px-6 has-[>svg]:px-4\" },\r\n \"2xl\": { base: \"h-[var(--button-2xl-height)] text-32 leading-[1.5] px-6 has-[>svg]:px-4\" },\r\n \"icon-xs\": { base: \"\" },\r\n \"icon-sm\": { base: \"size-[var(--button-sm-height)]\" },\r\n icon: { base: \"size-[var(--button-base-height)]\" },\r\n \"icon-md\": { base: \"size-[var(--button-base-height)]\" },\r\n \"icon-lg\": { base: \"size-[var(--button-lg-height)]\" },\r\n \"icon-xl\": { base: \"size-[var(--button-xl-height)]\" },\r\n \"icon-2xl\": { base: \"size-[var(--button-2xl-height)]\" },\r\n },\r\n square: {\r\n true: { base: \"p-0\" },\r\n },\r\n },\r\n compoundVariants: [\r\n // Solid Variants\r\n {\r\n color: \"primary\" as (typeof color)[number],\r\n variant: \"solid\" as (typeof variant)[number],\r\n class: \"bg-primary text-white hover:bg-primary/75\",\r\n },\r\n {\r\n color: \"secondary\" as (typeof color)[number], // Secondary not in original, defaulting to Purple/Violet or Gray? User had Info=Gray. I'll make Secondary=Violet\r\n variant: \"solid\" as (typeof variant)[number],\r\n class: \"bg-secondary text-white hover:bg-secondary/75\",\r\n },\r\n {\r\n color: \"success\" as (typeof color)[number],\r\n variant: \"solid\" as (typeof variant)[number],\r\n class: \"bg-success text-white hover:bg-success/75\",\r\n },\r\n {\r\n color: \"info\" as (typeof color)[number], // User's original info was gray-8. I will keep that as explicit choice.\r\n variant: \"solid\" as (typeof variant)[number],\r\n class: \"bg-info text-white hover:bg-info/75\",\r\n },\r\n {\r\n color: \"warning\" as (typeof color)[number],\r\n variant: \"solid\" as (typeof variant)[number],\r\n class: \"bg-warning text-white hover:bg-warning/75\",\r\n },\r\n {\r\n color: \"error\" as (typeof color)[number], // User's original default was red.\r\n variant: \"solid\" as (typeof variant)[number],\r\n class: \"bg-error text-white hover:bg-error/75\",\r\n },\r\n {\r\n color: \"neutral\" as (typeof color)[number],\r\n variant: \"solid\" as (typeof variant)[number],\r\n class: \"bg-neutral text-white hover:bg-neutral/75\",\r\n },\r\n\r\n // Outline Variants\r\n {\r\n color: \"primary\" as (typeof color)[number],\r\n variant: \"outline\" as (typeof variant)[number],\r\n class:\r\n \"bg-transparent text-primary border border-primary hover:bg-primary/10 disabled:bg-gray-2 disabled:border-gray-4 disabled:text-gray-6\",\r\n },\r\n {\r\n color: \"secondary\" as (typeof color)[number],\r\n variant: \"outline\" as (typeof variant)[number],\r\n class:\r\n \"bg-transparent text-secondary border border-secondary hover:bg-secondary/10 disabled:bg-gray-2 disabled:border-gray-4 disabled:text-gray-6\",\r\n },\r\n {\r\n color: \"success\" as (typeof color)[number],\r\n variant: \"outline\" as (typeof variant)[number],\r\n class:\r\n \"bg-transparent text-success border border-success hover:bg-success/10 disabled:bg-gray-2 disabled:border-gray-4 disabled:text-gray-6\",\r\n },\r\n {\r\n color: \"info\" as (typeof color)[number],\r\n variant: \"outline\" as (typeof variant)[number],\r\n class:\r\n \"bg-transparent text-info border border-info hover:bg-info/10 disabled:bg-gray-2 disabled:border-gray-4 disabled:text-gray-6\",\r\n },\r\n {\r\n color: \"warning\" as (typeof color)[number],\r\n variant: \"outline\" as (typeof variant)[number],\r\n class:\r\n \"bg-transparent text-warning border border-warning hover:bg-warning/10 disabled:bg-gray-2 disabled:border-gray-4 disabled:text-gray-6\",\r\n },\r\n {\r\n color: \"error\" as (typeof color)[number],\r\n variant: \"outline\" as (typeof variant)[number],\r\n class:\r\n \"bg-transparent text-error border border-error hover:bg-error/10 disabled:bg-gray-2 disabled:border-gray-4 disabled:text-gray-6\",\r\n },\r\n {\r\n color: \"neutral\" as (typeof color)[number],\r\n variant: \"outline\" as (typeof variant)[number],\r\n class:\r\n \"bg-transparent text-neutral border border-neutral hover:bg-neutral/10 disabled:bg-gray-2 disabled:border-gray-4 disabled:text-gray-6\",\r\n },\r\n\r\n // Soft Variants (Freestyling as requested, using lighter 1/2 shades)\r\n {\r\n color: \"primary\" as (typeof color)[number],\r\n variant: \"soft\" as (typeof variant)[number],\r\n class: \"bg-primary/10 text-primary hover:bg-primary/20\",\r\n },\r\n {\r\n color: \"secondary\" as (typeof color)[number],\r\n variant: \"soft\" as (typeof variant)[number],\r\n class: \"bg-secondary/10 text-secondary hover:bg-secondary/20\",\r\n },\r\n {\r\n color: \"success\" as (typeof color)[number],\r\n variant: \"soft\" as (typeof variant)[number],\r\n class: \"bg-success/10 text-success hover:bg-success/20\",\r\n },\r\n {\r\n color: \"info\" as (typeof color)[number],\r\n variant: \"soft\" as (typeof variant)[number],\r\n class: \"bg-info/10 text-info hover:bg-info/20\",\r\n },\r\n {\r\n color: \"warning\" as (typeof color)[number],\r\n variant: \"soft\" as (typeof variant)[number],\r\n class: \"bg-warning/10 text-warning hover:bg-warning/20\",\r\n },\r\n {\r\n color: \"error\" as (typeof color)[number],\r\n variant: \"soft\" as (typeof variant)[number],\r\n class: \"bg-error/10 text-error hover:bg-error/20\",\r\n },\r\n {\r\n color: \"neutral\" as (typeof color)[number],\r\n variant: \"soft\" as (typeof variant)[number],\r\n class: \"bg-neutral/10 text-neutral hover:bg-neutral/20\",\r\n },\r\n\r\n // Subtle Variants (Transparent bg, colored text, hover light bg)\r\n {\r\n color: \"primary\" as (typeof color)[number],\r\n variant: \"subtle\" as (typeof variant)[number],\r\n // class: \"bg-transparent text-primary hover:bg-primary/10\",\r\n class: \"bg-primary/10 ring-1 ring-inset ring-primary text-primary hover:bg-primary/20\",\r\n },\r\n {\r\n color: \"secondary\" as (typeof color)[number],\r\n variant: \"subtle\" as (typeof variant)[number],\r\n class:\r\n \"bg-secondary/10 ring-1 ring-inset ring-secondary text-secondary hover:bg-secondary/20\",\r\n },\r\n {\r\n color: \"success\" as (typeof color)[number],\r\n variant: \"subtle\" as (typeof variant)[number],\r\n class: \"bg-success/10 ring-1 ring-inset ring-success text-success hover:bg-success/20\",\r\n },\r\n {\r\n color: \"info\" as (typeof color)[number],\r\n variant: \"subtle\" as (typeof variant)[number],\r\n class: \"bg-info/10 ring-1 ring-inset ring-info text-info hover:bg-info/20\",\r\n },\r\n {\r\n color: \"warning\" as (typeof color)[number],\r\n variant: \"subtle\" as (typeof variant)[number],\r\n class: \"bg-warning/10 ring-1 ring-inset ring-warning text-warning hover:bg-warning/20\",\r\n },\r\n {\r\n color: \"error\" as (typeof color)[number],\r\n variant: \"subtle\" as (typeof variant)[number],\r\n class: \"bg-error/10 ring-1 ring-inset ring-error text-error hover:bg-error/20\",\r\n },\r\n {\r\n color: \"neutral\" as (typeof color)[number],\r\n variant: \"subtle\" as (typeof variant)[number],\r\n class: \"bg-neutral/10 ring-1 ring-inset ring-neutral text-neutral hover:bg-neutral/20\",\r\n },\r\n ],\r\n defaultVariants: {\r\n color: \"primary\" as (typeof color)[number],\r\n variant: \"solid\" as (typeof variant)[number],\r\n size: \"md\" as (typeof size)[number],\r\n },\r\n};\r\n"
|
|
12
|
+
"content": "const color = [\"primary\", \"secondary\", \"success\", \"info\", \"warning\", \"error\", \"neutral\"] as const;\r\n\r\nconst variant = [\"solid\", \"outline\", \"soft\", \"subtle\"] as const;\r\n\r\nconst size = [\r\n \"xs\",\r\n \"sm\",\r\n \"default\", // Mapped to md\r\n \"md\",\r\n \"lg\",\r\n \"xl\",\r\n \"2xl\",\r\n \"icon-xs\",\r\n \"icon-sm\",\r\n \"icon\", // Mapped to icon-md\r\n \"icon-md\",\r\n \"icon-lg\",\r\n \"icon-xl\",\r\n \"icon-2xl\",\r\n] as const;\r\n\r\nexport { color as buttonColors, variant as buttonVariants, size as buttonSizes };\r\n\r\nexport default {\r\n slots: {\r\n base: \"inline-flex items-center justify-center gap-2 whitespace-nowrap transition-all cursor-pointer disabled:cursor-not-allowed disabled:opacity-70 disabled:bg-gray-4 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\r\n label: \"truncate\",\r\n leadingIcon: \"shrink-0\",\r\n leadingAvatar: \"shrink-0\",\r\n leadingAvatarSize: \"\",\r\n trailingIcon: \"shrink-0\",\r\n },\r\n variants: {\r\n fieldGroup: {\r\n horizontal:\r\n \"not-only:first:rounded-e-none not-only:last:rounded-s-none not-last:not-first:rounded-none focus-visible:z-[1]\",\r\n vertical:\r\n \"not-only:first:rounded-b-none not-only:last:rounded-t-none not-last:not-first:rounded-none focus-visible:z-[1]\",\r\n },\r\n color: {\r\n primary: \"\",\r\n secondary: \"\",\r\n success: \"\",\r\n info: \"\",\r\n warning: \"\",\r\n error: \"\",\r\n neutral: \"\",\r\n },\r\n variant: {\r\n solid: \"\",\r\n outline: \"\",\r\n soft: \"\",\r\n subtle: \"\",\r\n },\r\n size: {\r\n xs: {\r\n base: \"h-[var(--button-xs-height)] text-24 leading-[1.5] gap-1.5 px-3 has-[>svg]:px-2.5\",\r\n },\r\n sm: {\r\n base: \"h-[var(--button-sm-height)] text-24 leading-[1.5] gap-1.5 px-3 has-[>svg]:px-2.5\",\r\n },\r\n default: {\r\n base: \"h-[var(--button-base-height)] text-26 leading-[1.5] px-4 py-4 has-[>svg]:px-3\",\r\n },\r\n md: { base: \"h-[var(--button-base-height)] text-26 leading-[1.5] px-4 py-4 has-[>svg]:px-3\" },\r\n lg: { base: \"h-[var(--button-lg-height)] text-28 leading-[1.5] px-6 has-[>svg]:px-4\" },\r\n xl: { base: \"h-[var(--button-xl-height)] text-30 leading-[1.5] px-6 has-[>svg]:px-4\" },\r\n \"2xl\": { base: \"h-[var(--button-2xl-height)] text-32 leading-[1.5] px-6 has-[>svg]:px-4\" },\r\n \"icon-xs\": { base: \"\" },\r\n \"icon-sm\": { base: \"size-[var(--button-sm-height)]\" },\r\n icon: { base: \"size-[var(--button-base-height)]\" },\r\n \"icon-md\": { base: \"size-[var(--button-base-height)]\" },\r\n \"icon-lg\": { base: \"size-[var(--button-lg-height)]\" },\r\n \"icon-xl\": { base: \"size-[var(--button-xl-height)]\" },\r\n \"icon-2xl\": { base: \"size-[var(--button-2xl-height)]\" },\r\n },\r\n square: {\r\n true: { base: \"p-0\" },\r\n },\r\n },\r\n compoundVariants: [\r\n // Solid Variants\r\n {\r\n color: \"primary\" as (typeof color)[number],\r\n variant: \"solid\" as (typeof variant)[number],\r\n class: \"bg-primary text-white hover:bg-primary/75\",\r\n },\r\n {\r\n color: \"secondary\" as (typeof color)[number], // Secondary not in original, defaulting to Purple/Violet or Gray? User had Info=Gray. I'll make Secondary=Violet\r\n variant: \"solid\" as (typeof variant)[number],\r\n class: \"bg-secondary text-white hover:bg-secondary/75\",\r\n },\r\n {\r\n color: \"success\" as (typeof color)[number],\r\n variant: \"solid\" as (typeof variant)[number],\r\n class: \"bg-success text-white hover:bg-success/75\",\r\n },\r\n {\r\n color: \"info\" as (typeof color)[number], // User's original info was gray-8. I will keep that as explicit choice.\r\n variant: \"solid\" as (typeof variant)[number],\r\n class: \"bg-info text-white hover:bg-info/75\",\r\n },\r\n {\r\n color: \"warning\" as (typeof color)[number],\r\n variant: \"solid\" as (typeof variant)[number],\r\n class: \"bg-warning text-white hover:bg-warning/75\",\r\n },\r\n {\r\n color: \"error\" as (typeof color)[number], // User's original default was red.\r\n variant: \"solid\" as (typeof variant)[number],\r\n class: \"bg-error text-white hover:bg-error/75\",\r\n },\r\n {\r\n color: \"neutral\" as (typeof color)[number],\r\n variant: \"solid\" as (typeof variant)[number],\r\n class: \"bg-neutral text-white hover:bg-neutral/75\",\r\n },\r\n\r\n // Outline Variants\r\n {\r\n color: \"primary\" as (typeof color)[number],\r\n variant: \"outline\" as (typeof variant)[number],\r\n class:\r\n \"bg-transparent text-primary border border-primary hover:bg-primary/10 disabled:bg-gray-2 disabled:border-gray-4 disabled:text-gray-6\",\r\n },\r\n {\r\n color: \"secondary\" as (typeof color)[number],\r\n variant: \"outline\" as (typeof variant)[number],\r\n class:\r\n \"bg-transparent text-secondary border border-secondary hover:bg-secondary/10 disabled:bg-gray-2 disabled:border-gray-4 disabled:text-gray-6\",\r\n },\r\n {\r\n color: \"success\" as (typeof color)[number],\r\n variant: \"outline\" as (typeof variant)[number],\r\n class:\r\n \"bg-transparent text-success border border-success hover:bg-success/10 disabled:bg-gray-2 disabled:border-gray-4 disabled:text-gray-6\",\r\n },\r\n {\r\n color: \"info\" as (typeof color)[number],\r\n variant: \"outline\" as (typeof variant)[number],\r\n class:\r\n \"bg-transparent text-info border border-info hover:bg-info/10 disabled:bg-gray-2 disabled:border-gray-4 disabled:text-gray-6\",\r\n },\r\n {\r\n color: \"warning\" as (typeof color)[number],\r\n variant: \"outline\" as (typeof variant)[number],\r\n class:\r\n \"bg-transparent text-warning border border-warning hover:bg-warning/10 disabled:bg-gray-2 disabled:border-gray-4 disabled:text-gray-6\",\r\n },\r\n {\r\n color: \"error\" as (typeof color)[number],\r\n variant: \"outline\" as (typeof variant)[number],\r\n class:\r\n \"bg-transparent text-error border border-error hover:bg-error/10 disabled:bg-gray-2 disabled:border-gray-4 disabled:text-gray-6\",\r\n },\r\n {\r\n color: \"neutral\" as (typeof color)[number],\r\n variant: \"outline\" as (typeof variant)[number],\r\n class:\r\n \"bg-transparent text-neutral border border-neutral hover:bg-neutral/10 disabled:bg-gray-2 disabled:border-gray-4 disabled:text-gray-6\",\r\n },\r\n\r\n // Soft Variants (Freestyling as requested, using lighter 1/2 shades)\r\n {\r\n color: \"primary\" as (typeof color)[number],\r\n variant: \"soft\" as (typeof variant)[number],\r\n class: \"bg-primary/10 text-primary hover:bg-primary/20\",\r\n },\r\n {\r\n color: \"secondary\" as (typeof color)[number],\r\n variant: \"soft\" as (typeof variant)[number],\r\n class: \"bg-secondary/10 text-secondary hover:bg-secondary/20\",\r\n },\r\n {\r\n color: \"success\" as (typeof color)[number],\r\n variant: \"soft\" as (typeof variant)[number],\r\n class: \"bg-success/10 text-success hover:bg-success/20\",\r\n },\r\n {\r\n color: \"info\" as (typeof color)[number],\r\n variant: \"soft\" as (typeof variant)[number],\r\n class: \"bg-info/10 text-info hover:bg-info/20\",\r\n },\r\n {\r\n color: \"warning\" as (typeof color)[number],\r\n variant: \"soft\" as (typeof variant)[number],\r\n class: \"bg-warning/10 text-warning hover:bg-warning/20\",\r\n },\r\n {\r\n color: \"error\" as (typeof color)[number],\r\n variant: \"soft\" as (typeof variant)[number],\r\n class: \"bg-error/10 text-error hover:bg-error/20\",\r\n },\r\n {\r\n color: \"neutral\" as (typeof color)[number],\r\n variant: \"soft\" as (typeof variant)[number],\r\n class: \"bg-neutral/10 text-neutral hover:bg-neutral/20\",\r\n },\r\n\r\n // Subtle Variants (Transparent bg, colored text, hover light bg)\r\n {\r\n color: \"primary\" as (typeof color)[number],\r\n variant: \"subtle\" as (typeof variant)[number],\r\n // class: \"bg-transparent text-primary hover:bg-primary/10\",\r\n class: \"bg-primary/10 ring-1 ring-inset ring-primary text-primary hover:bg-primary/20\",\r\n },\r\n {\r\n color: \"secondary\" as (typeof color)[number],\r\n variant: \"subtle\" as (typeof variant)[number],\r\n class:\r\n \"bg-secondary/10 ring-1 ring-inset ring-secondary text-secondary hover:bg-secondary/20\",\r\n },\r\n {\r\n color: \"success\" as (typeof color)[number],\r\n variant: \"subtle\" as (typeof variant)[number],\r\n class: \"bg-success/10 ring-1 ring-inset ring-success text-success hover:bg-success/20\",\r\n },\r\n {\r\n color: \"info\" as (typeof color)[number],\r\n variant: \"subtle\" as (typeof variant)[number],\r\n class: \"bg-info/10 ring-1 ring-inset ring-info text-info hover:bg-info/20\",\r\n },\r\n {\r\n color: \"warning\" as (typeof color)[number],\r\n variant: \"subtle\" as (typeof variant)[number],\r\n class: \"bg-warning/10 ring-1 ring-inset ring-warning text-warning hover:bg-warning/20\",\r\n },\r\n {\r\n color: \"error\" as (typeof color)[number],\r\n variant: \"subtle\" as (typeof variant)[number],\r\n class: \"bg-error/10 ring-1 ring-inset ring-error text-error hover:bg-error/20\",\r\n },\r\n {\r\n color: \"neutral\" as (typeof color)[number],\r\n variant: \"subtle\" as (typeof variant)[number],\r\n class: \"bg-neutral/10 ring-1 ring-inset ring-neutral text-neutral hover:bg-neutral/20\",\r\n },\r\n ],\r\n defaultVariants: {\r\n color: \"primary\" as (typeof color)[number],\r\n variant: \"solid\" as (typeof variant)[number],\r\n size: \"md\" as (typeof size)[number],\r\n },\r\n};\r\n",
|
|
13
|
+
"target": "web"
|
|
12
14
|
},
|
|
13
15
|
{
|
|
14
16
|
"path": "RebornButton.vue",
|
|
@@ -6,11 +6,13 @@
|
|
|
6
6
|
"files": [
|
|
7
7
|
{
|
|
8
8
|
"path": "index.ts",
|
|
9
|
-
"content": "export { default as RebornCheckbox } from \"./RebornCheckbox.vue\";\r\n"
|
|
9
|
+
"content": "export { default as RebornCheckbox } from \"./RebornCheckbox.vue\";\r\n",
|
|
10
|
+
"target": "web"
|
|
10
11
|
},
|
|
11
12
|
{
|
|
12
13
|
"path": "reborn-checkbox.config.ts",
|
|
13
|
-
"content": "const size = [\"sm\", \"md\", \"lg\"] as const;\r\nconst color = [\"primary\", \"secondary\", \"success\", \"info\", \"warning\", \"error\", \"neutral\"] as const;\r\n\r\nexport { size as checkboxSizes, color as checkboxColors };\r\n\r\nexport default {\r\n slots: {\r\n wrapper: \"inline-flex items-center gap-3 cursor-pointer select-none\",\r\n input: \"peer sr-only\",\r\n control:\r\n \"flex items-center justify-center rounded-md border border-gray-4 bg-white text-white transition-colors ring-1 ring-transparent peer-focus-visible:ring-2 peer-focus-visible:ring-primary/40 peer-disabled:cursor-not-allowed peer-disabled:bg-gray-2 peer-disabled:border-gray-3 peer-checked:[&>*]:opacity-100 peer-checked:[&>*]:scale-100\",\r\n icon: \"size-4 opacity-0 scale-75 transition-all\",\r\n label: \"text-gray-8 dark:text-gray-2\",\r\n },\r\n variants: {\r\n size: {\r\n sm: {\r\n control: \"size-4\",\r\n label: \"text-[length:var(--text-size-24)]\",\r\n },\r\n md: {\r\n control: \"size-5\",\r\n label: \"text-[length:var(--text-size-26)]\",\r\n },\r\n lg: {\r\n control: \"size-6\",\r\n label: \"text-[length:var(--text-size-28)]\",\r\n },\r\n },\r\n color: {\r\n primary: {\r\n control: \"peer-checked:bg-primary peer-checked:border-primary\",\r\n icon: \"text-white\",\r\n },\r\n secondary: {\r\n control: \"peer-checked:bg-secondary peer-checked:border-secondary\",\r\n icon: \"text-white\",\r\n },\r\n success: {\r\n control: \"peer-checked:bg-success peer-checked:border-success\",\r\n icon: \"text-white\",\r\n },\r\n info: {\r\n control: \"peer-checked:bg-info peer-checked:border-info\",\r\n icon: \"text-white\",\r\n },\r\n warning: {\r\n control: \"peer-checked:bg-warning peer-checked:border-warning\",\r\n icon: \"text-white\",\r\n },\r\n error: {\r\n control: \"peer-checked:bg-error peer-checked:border-error\",\r\n icon: \"text-white\",\r\n },\r\n neutral: {\r\n control: \"peer-checked:bg-neutral peer-checked:border-neutral\",\r\n icon: \"text-white\",\r\n },\r\n },\r\n },\r\n defaultVariants: {\r\n size: \"md\" as (typeof size)[number],\r\n color: \"primary\" as (typeof color)[number],\r\n },\r\n};\r\n"
|
|
14
|
+
"content": "const size = [\"sm\", \"md\", \"lg\"] as const;\r\nconst color = [\"primary\", \"secondary\", \"success\", \"info\", \"warning\", \"error\", \"neutral\"] as const;\r\n\r\nexport { size as checkboxSizes, color as checkboxColors };\r\n\r\nexport default {\r\n slots: {\r\n wrapper: \"inline-flex items-center gap-3 cursor-pointer select-none\",\r\n input: \"peer sr-only\",\r\n control:\r\n \"flex items-center justify-center rounded-md border border-gray-4 bg-white text-white transition-colors ring-1 ring-transparent peer-focus-visible:ring-2 peer-focus-visible:ring-primary/40 peer-disabled:cursor-not-allowed peer-disabled:bg-gray-2 peer-disabled:border-gray-3 peer-checked:[&>*]:opacity-100 peer-checked:[&>*]:scale-100\",\r\n icon: \"size-4 opacity-0 scale-75 transition-all\",\r\n label: \"text-gray-8 dark:text-gray-2\",\r\n },\r\n variants: {\r\n size: {\r\n sm: {\r\n control: \"size-4\",\r\n label: \"text-[length:var(--text-size-24)]\",\r\n },\r\n md: {\r\n control: \"size-5\",\r\n label: \"text-[length:var(--text-size-26)]\",\r\n },\r\n lg: {\r\n control: \"size-6\",\r\n label: \"text-[length:var(--text-size-28)]\",\r\n },\r\n },\r\n color: {\r\n primary: {\r\n control: \"peer-checked:bg-primary peer-checked:border-primary\",\r\n icon: \"text-white\",\r\n },\r\n secondary: {\r\n control: \"peer-checked:bg-secondary peer-checked:border-secondary\",\r\n icon: \"text-white\",\r\n },\r\n success: {\r\n control: \"peer-checked:bg-success peer-checked:border-success\",\r\n icon: \"text-white\",\r\n },\r\n info: {\r\n control: \"peer-checked:bg-info peer-checked:border-info\",\r\n icon: \"text-white\",\r\n },\r\n warning: {\r\n control: \"peer-checked:bg-warning peer-checked:border-warning\",\r\n icon: \"text-white\",\r\n },\r\n error: {\r\n control: \"peer-checked:bg-error peer-checked:border-error\",\r\n icon: \"text-white\",\r\n },\r\n neutral: {\r\n control: \"peer-checked:bg-neutral peer-checked:border-neutral\",\r\n icon: \"text-white\",\r\n },\r\n },\r\n },\r\n defaultVariants: {\r\n size: \"md\" as (typeof size)[number],\r\n color: \"primary\" as (typeof color)[number],\r\n },\r\n};\r\n",
|
|
15
|
+
"target": "web"
|
|
14
16
|
},
|
|
15
17
|
{
|
|
16
18
|
"path": "RebornCheckbox.vue",
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
},
|
|
9
9
|
{
|
|
10
10
|
"path": "reborn-chip.config.ts",
|
|
11
|
-
"content": "const size = ['3xs', '2xs', 'xs', 'sm', 'md', 'lg', 'xl', '2xl', '3xl'] as const\r\nconst color = ['primary', 'secondary', 'success', 'info', 'warning', 'error', 'neutral'] as const\r\nconst position = ['top-right', 'bottom-right', 'top-left', 'bottom-left'] as const\r\n\r\nexport { size as chipSizes, color as chipColors, position as chipPositions }\r\n\r\nexport default {\r\n slots: {\r\n root: 'relative inline-flex items-center justify-center shrink-0 h-fit leading-none',\r\n base: 'absolute rounded-full flex items-center justify-center font-medium whitespace-nowrap ring-1',\r\n label: 'text-white'\r\n },\r\n variants: {\r\n color: {\r\n primary: { base: 'bg-primary ring-primary' },\r\n secondary: { base: 'bg-secondary ring-secondary' },\r\n success: { base: 'bg-success ring-success' },\r\n info: { base: 'bg-info ring-info' },\r\n warning: { base: 'bg-warning ring-warning' },\r\n error: { base: 'bg-error ring-error' },\r\n neutral: { base: 'bg-neutral ring-neutral' }\r\n },\r\n size: {\r\n '3xs': { base: 'h-[4px] min-w-[4px]', label: 'text-[4px]' },\r\n '2xs': { base: 'h-[5px] min-w-[5px]', label: 'text-[5px]' },\r\n xs: { base: 'h-[6px] min-w-[6px]', label: 'text-[6px]' },\r\n sm: { base: 'h-[7px] min-w-[7px]', label: 'text-[7px]' },\r\n md: { base: 'h-[8px] min-w-[8px]', label: 'text-[8px]' },\r\n lg: { base: 'h-[9px] min-w-[9px]', label: 'text-[9px]' },\r\n xl: { base: 'h-[10px] min-w-[10px]', label: 'text-[10px]' },\r\n '2xl': { base: 'h-[11px] min-w-[11px]', label: 'text-[11px]' },\r\n '3xl': { base: 'h-[12px] min-w-[12px]', label: 'text-[12px]' }\r\n },\r\n position: {\r\n 'top-right': { base: 'top-0 right-0' },\r\n 'bottom-right': { base: 'bottom-0 right-0' },\r\n 'top-left': { base: 'top-0 left-0' },\r\n 'bottom-left': { base: 'bottom-0 left-0' }\r\n },\r\n inset: {\r\n true: { base: '' },\r\n false: { base: '' }\r\n },\r\n standalone: {\r\n true: { base: 'absolute' },\r\n false: { base: '' }\r\n }\r\n },\r\n compoundVariants: [\r\n {\r\n inset: false,\r\n position: 'top-right' as const,\r\n class: { base: '-translate-y-1/2 translate-x-1/2 transform' }\r\n },\r\n {\r\n inset: false,\r\n position: 'bottom-right' as const,\r\n class: { base: 'translate-y-1/2 translate-x-1/2 transform' }\r\n },\r\n {\r\n inset: false,\r\n position: 'top-left' as const,\r\n class: { base: '-translate-y-1/2 -translate-x-1/2 transform' }\r\n },\r\n {\r\n inset: false,\r\n position: 'bottom-left' as const,\r\n class: { base: 'translate-y-1/2 -translate-x-1/2 transform' }\r\n }\r\n ],\r\n defaultVariants: {\r\n size: 'md' as const,\r\n color: 'primary' as const,\r\n position: 'top-right' as const,\r\n inset: false,\r\n standalone: false\r\n }\r\n}\r\n"
|
|
11
|
+
"content": "const size = ['3xs', '2xs', 'xs', 'sm', 'md', 'lg', 'xl', '2xl', '3xl'] as const\r\nconst color = ['primary', 'secondary', 'success', 'info', 'warning', 'error', 'neutral'] as const\r\nconst position = ['top-right', 'bottom-right', 'top-left', 'bottom-left'] as const\r\n\r\nexport { size as chipSizes, color as chipColors, position as chipPositions }\r\n\r\nexport default {\r\n slots: {\r\n root: 'relative inline-flex items-center justify-center shrink-0 h-fit leading-none',\r\n base: 'absolute rounded-full flex items-center justify-center font-medium whitespace-nowrap ring-1',\r\n label: 'text-white'\r\n },\r\n variants: {\r\n color: {\r\n primary: { base: 'bg-primary ring-primary' },\r\n secondary: { base: 'bg-secondary ring-secondary' },\r\n success: { base: 'bg-success ring-success' },\r\n info: { base: 'bg-info ring-info' },\r\n warning: { base: 'bg-warning ring-warning' },\r\n error: { base: 'bg-error ring-error' },\r\n neutral: { base: 'bg-neutral ring-neutral' }\r\n },\r\n size: {\r\n '3xs': { base: 'h-[4px] min-w-[4px]', label: 'text-[4px]' },\r\n '2xs': { base: 'h-[5px] min-w-[5px]', label: 'text-[5px]' },\r\n xs: { base: 'h-[6px] min-w-[6px]', label: 'text-[6px]' },\r\n sm: { base: 'h-[7px] min-w-[7px]', label: 'text-[7px]' },\r\n md: { base: 'h-[8px] min-w-[8px]', label: 'text-[8px]' },\r\n lg: { base: 'h-[9px] min-w-[9px]', label: 'text-[9px]' },\r\n xl: { base: 'h-[10px] min-w-[10px]', label: 'text-[10px]' },\r\n '2xl': { base: 'h-[11px] min-w-[11px]', label: 'text-[11px]' },\r\n '3xl': { base: 'h-[12px] min-w-[12px]', label: 'text-[12px]' }\r\n },\r\n position: {\r\n 'top-right': { base: 'top-0 right-0' },\r\n 'bottom-right': { base: 'bottom-0 right-0' },\r\n 'top-left': { base: 'top-0 left-0' },\r\n 'bottom-left': { base: 'bottom-0 left-0' }\r\n },\r\n inset: {\r\n true: { base: '' },\r\n false: { base: '' }\r\n },\r\n standalone: {\r\n true: { base: 'absolute' },\r\n false: { base: '' }\r\n }\r\n },\r\n compoundVariants: [\r\n {\r\n inset: false,\r\n position: 'top-right' as const,\r\n class: { base: '-translate-y-1/2 translate-x-1/2 transform' }\r\n },\r\n {\r\n inset: false,\r\n position: 'bottom-right' as const,\r\n class: { base: 'translate-y-1/2 translate-x-1/2 transform' }\r\n },\r\n {\r\n inset: false,\r\n position: 'top-left' as const,\r\n class: { base: '-translate-y-1/2 -translate-x-1/2 transform' }\r\n },\r\n {\r\n inset: false,\r\n position: 'bottom-left' as const,\r\n class: { base: 'translate-y-1/2 -translate-x-1/2 transform' }\r\n }\r\n ],\r\n defaultVariants: {\r\n size: 'md' as const,\r\n color: 'primary' as const,\r\n position: 'top-right' as const,\r\n inset: false,\r\n standalone: false\r\n }\r\n}\r\n",
|
|
12
|
+
"target": "web"
|
|
12
13
|
},
|
|
13
14
|
{
|
|
14
15
|
"path": "RebornChip.vue",
|