behsseui 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,108 @@
1
+ # behsse-ui
2
+
3
+ CLI pour ajouter des composants behsseui dans vos projets.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g behsse-ui
9
+ # ou
10
+ pnpm add -g behsse-ui
11
+ # ou
12
+ yarn global add behsse-ui
13
+ ```
14
+
15
+ ## Utilisation
16
+
17
+ ### 1. Initialiser votre projet
18
+
19
+ Avant d'ajouter des composants, vous devez initialiser votre projet :
20
+
21
+ ```bash
22
+ behsseui init
23
+ ```
24
+
25
+ Cette commande va :
26
+ - Détecter automatiquement votre package manager (npm, pnpm, yarn, bun)
27
+ - Vous demander où installer les composants (par défaut : `./ui`)
28
+ - Installer les dépendances nécessaires :
29
+ - `class-variance-authority` - Pour gérer les variants des composants
30
+ - `clsx` - Pour manipuler les classes CSS
31
+ - `tailwind-merge` - Pour fusionner les classes Tailwind intelligemment
32
+ - Optionnellement installer et configurer Tailwind CSS
33
+ - Créer un fichier de configuration `behsseui.json`
34
+ - Créer un helper `cn()` dans votre dossier de composants
35
+
36
+ ### 2. Ajouter des composants
37
+
38
+ Une fois initialisé, vous pouvez ajouter des composants :
39
+
40
+ ```bash
41
+ behsseui add Button
42
+ ```
43
+
44
+ Le composant sera téléchargé et placé dans le dossier que vous avez configuré.
45
+
46
+ ### 3. Utiliser les composants
47
+
48
+ ```tsx
49
+ import { Button } from "./ui/Button";
50
+
51
+ export default function App() {
52
+ return (
53
+ <Button variant="default" size="lg">
54
+ Click me
55
+ </Button>
56
+ );
57
+ }
58
+ ```
59
+
60
+ ## Composants disponibles
61
+
62
+ - `Button` - Bouton avec variants (default, destructive, outline, secondary, ghost, link)
63
+
64
+ Plus de composants à venir...
65
+
66
+ ## Configuration
67
+
68
+ Le fichier `behsseui.json` à la racine de votre projet contient la configuration :
69
+
70
+ ```json
71
+ {
72
+ "$schema": "https://behsseui.dev/schema.json",
73
+ "componentsDir": "./ui",
74
+ "libDir": "./lib",
75
+ "tailwind": {
76
+ "css": "./app/globals.css"
77
+ },
78
+ "initialized": true
79
+ }
80
+ ```
81
+
82
+ ## Pourquoi cette approche ?
83
+
84
+ Contrairement aux bibliothèques de composants traditionnelles, behsseui copie le code directement dans votre projet. Cela vous donne :
85
+
86
+ - **Contrôle total** - Modifiez les composants selon vos besoins
87
+ - **Pas de dépendances cachées** - Toutes les dépendances sont visibles dans votre `package.json`
88
+ - **Pas de bloat** - Seulement les composants que vous utilisez
89
+ - **Apprentissage** - Voyez comment les composants sont construits
90
+
91
+ ## Dépendances
92
+
93
+ ### Obligatoires
94
+ - `class-variance-authority` - Gestion des variants
95
+ - `clsx` - Manipulation de classes
96
+ - `tailwind-merge` - Fusion intelligente de classes Tailwind
97
+
98
+ ### Optionnelles
99
+ - `tailwindcss` - Framework CSS (recommandé)
100
+ - `react` - v18.0.0 ou supérieur
101
+
102
+ ## Repository
103
+
104
+ [https://github.com/behsse/ui](https://github.com/behsse/ui)
105
+
106
+ ## License
107
+
108
+ MIT
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1,694 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/index.ts
4
+ import { Command as Command3 } from "commander";
5
+
6
+ // src/commands/init.ts
7
+ import { Command } from "commander";
8
+ import prompts from "prompts";
9
+ import chalk from "chalk";
10
+ import ora from "ora";
11
+ import { existsSync as existsSync4, mkdirSync, writeFileSync as writeFileSync3, unlinkSync } from "fs";
12
+ import { join as join6, dirname as dirname2 } from "path";
13
+
14
+ // src/utils/package-manager.ts
15
+ import { execSync } from "child_process";
16
+ import { existsSync } from "fs";
17
+ import { join } from "path";
18
+ function detectPackageManager() {
19
+ const cwd = process.cwd();
20
+ if (existsSync(join(cwd, "pnpm-lock.yaml"))) {
21
+ return "pnpm";
22
+ }
23
+ if (existsSync(join(cwd, "yarn.lock"))) {
24
+ return "yarn";
25
+ }
26
+ if (existsSync(join(cwd, "bun.lockb"))) {
27
+ return "bun";
28
+ }
29
+ if (existsSync(join(cwd, "package-lock.json"))) {
30
+ return "npm";
31
+ }
32
+ try {
33
+ execSync("pnpm --version", { stdio: "ignore" });
34
+ return "pnpm";
35
+ } catch {
36
+ }
37
+ try {
38
+ execSync("yarn --version", { stdio: "ignore" });
39
+ return "yarn";
40
+ } catch {
41
+ }
42
+ try {
43
+ execSync("bun --version", { stdio: "ignore" });
44
+ return "bun";
45
+ } catch {
46
+ }
47
+ return "npm";
48
+ }
49
+ function installDependencies(dependencies, packageManager, isDev = false) {
50
+ const devFlag = isDev ? "-D" : "";
51
+ const deps = dependencies.join(" ");
52
+ let command;
53
+ switch (packageManager) {
54
+ case "pnpm":
55
+ command = `pnpm add ${devFlag} ${deps}`;
56
+ break;
57
+ case "yarn":
58
+ command = `yarn add ${devFlag} ${deps}`;
59
+ break;
60
+ case "bun":
61
+ command = `bun add ${devFlag} ${deps}`;
62
+ break;
63
+ case "npm":
64
+ default:
65
+ command = `npm install ${isDev ? "--save-dev" : ""} ${deps}`;
66
+ break;
67
+ }
68
+ execSync(command, { stdio: "inherit" });
69
+ }
70
+
71
+ // src/utils/config.ts
72
+ import { existsSync as existsSync2, readFileSync, writeFileSync } from "fs";
73
+ import { join as join2 } from "path";
74
+ var CONFIG_FILE_NAME = "behsseui.json";
75
+ function getConfigPath() {
76
+ return join2(process.cwd(), CONFIG_FILE_NAME);
77
+ }
78
+ function isProjectInitialized() {
79
+ const configPath = getConfigPath();
80
+ if (!existsSync2(configPath)) {
81
+ return false;
82
+ }
83
+ try {
84
+ const config = readConfig();
85
+ return config.initialized === true;
86
+ } catch {
87
+ return false;
88
+ }
89
+ }
90
+ function readConfig() {
91
+ const configPath = getConfigPath();
92
+ if (!existsSync2(configPath)) {
93
+ throw new Error("Configuration file not found. Run 'behsseui init' first.");
94
+ }
95
+ const content = readFileSync(configPath, "utf-8");
96
+ return JSON.parse(content);
97
+ }
98
+ function writeConfig(config) {
99
+ const configPath = getConfigPath();
100
+ writeFileSync(configPath, JSON.stringify(config, null, 2), "utf-8");
101
+ }
102
+ function createDefaultConfig(componentsDir = "./ui", libDir = "./lib") {
103
+ return {
104
+ $schema: "https://behsseui.dev/schema.json",
105
+ componentsDir,
106
+ libDir,
107
+ tailwind: {
108
+ config: "./tailwind.config.js",
109
+ css: "./app/globals.css"
110
+ },
111
+ initialized: true
112
+ };
113
+ }
114
+
115
+ // src/utils/templates.ts
116
+ import { readFileSync as readFileSync2 } from "fs";
117
+ import { join as join3, dirname } from "path";
118
+ import { fileURLToPath } from "url";
119
+ var __filename = fileURLToPath(import.meta.url);
120
+ var __dirname = dirname(__filename);
121
+ function readTemplate(templateName) {
122
+ const templatePath = join3(__dirname, "templates", templateName);
123
+ return readFileSync2(templatePath, "utf-8");
124
+ }
125
+
126
+ // src/utils/framework.ts
127
+ import { existsSync as existsSync3, readFileSync as readFileSync3 } from "fs";
128
+ import { join as join4 } from "path";
129
+ function detectFramework() {
130
+ const cwd = process.cwd();
131
+ const packageJsonPath = join4(cwd, "package.json");
132
+ const info = {
133
+ framework: "unknown",
134
+ tailwindVersion: null,
135
+ typescriptVersion: null,
136
+ hasViteConfig: false,
137
+ hasNextConfig: false
138
+ };
139
+ info.hasViteConfig = existsSync3(join4(cwd, "vite.config.ts")) || existsSync3(join4(cwd, "vite.config.js")) || existsSync3(join4(cwd, "vite.config.mjs"));
140
+ info.hasNextConfig = existsSync3(join4(cwd, "next.config.js")) || existsSync3(join4(cwd, "next.config.mjs")) || existsSync3(join4(cwd, "next.config.ts"));
141
+ if (!existsSync3(packageJsonPath)) {
142
+ return info;
143
+ }
144
+ try {
145
+ const packageJson = JSON.parse(readFileSync3(packageJsonPath, "utf-8"));
146
+ const allDeps = {
147
+ ...packageJson.dependencies,
148
+ ...packageJson.devDependencies
149
+ };
150
+ if (allDeps.tailwindcss) {
151
+ info.tailwindVersion = allDeps.tailwindcss;
152
+ }
153
+ if (allDeps.typescript) {
154
+ info.typescriptVersion = allDeps.typescript;
155
+ }
156
+ if (allDeps.next) {
157
+ info.framework = "nextjs";
158
+ return info;
159
+ }
160
+ if (allDeps.vite || info.hasViteConfig) {
161
+ info.framework = "vite";
162
+ return info;
163
+ }
164
+ } catch (error) {
165
+ console.error("Error reading package.json:", error);
166
+ }
167
+ return info;
168
+ }
169
+ function getTailwindMajorVersion(version) {
170
+ if (!version) return null;
171
+ const cleanVersion = version.replace(/^[^\d]+/, "");
172
+ const majorVersion = parseInt(cleanVersion.split(".")[0], 10);
173
+ return isNaN(majorVersion) ? null : majorVersion;
174
+ }
175
+ function findViteConfig() {
176
+ const cwd = process.cwd();
177
+ const configs = ["vite.config.ts", "vite.config.js", "vite.config.mjs"];
178
+ for (const config of configs) {
179
+ if (existsSync3(join4(cwd, config))) {
180
+ return config;
181
+ }
182
+ }
183
+ return null;
184
+ }
185
+ function findTailwindConfig() {
186
+ const cwd = process.cwd();
187
+ const configs = [
188
+ "tailwind.config.ts",
189
+ "tailwind.config.js",
190
+ "tailwind.config.mjs",
191
+ "tailwind.config.cjs"
192
+ ];
193
+ for (const config of configs) {
194
+ if (existsSync3(join4(cwd, config))) {
195
+ return config;
196
+ }
197
+ }
198
+ return null;
199
+ }
200
+ function getTypeScriptMajorVersion(version) {
201
+ if (!version) return null;
202
+ const cleanVersion = version.replace(/^[^\d]+/, "");
203
+ const majorVersion = parseInt(cleanVersion.split(".")[0], 10);
204
+ return isNaN(majorVersion) ? null : majorVersion;
205
+ }
206
+
207
+ // src/utils/vite-config.ts
208
+ import { readFileSync as readFileSync4, writeFileSync as writeFileSync2 } from "fs";
209
+ import { join as join5 } from "path";
210
+ function addTailwindToViteConfig(configPath) {
211
+ const fullPath = join5(process.cwd(), configPath);
212
+ try {
213
+ let content = readFileSync4(fullPath, "utf-8");
214
+ if (content.includes("@tailwindcss/vite")) {
215
+ return false;
216
+ }
217
+ const viteImportRegex = /import\s+{[^}]+}\s+from\s+['"]vite['"]/;
218
+ const match = content.match(viteImportRegex);
219
+ if (match) {
220
+ const importStatement = '\nimport tailwindcss from "@tailwindcss/vite";';
221
+ content = content.replace(
222
+ viteImportRegex,
223
+ match[0] + importStatement
224
+ );
225
+ } else {
226
+ const firstImport = content.indexOf("import");
227
+ if (firstImport !== -1) {
228
+ const firstNewline = content.indexOf("\n", firstImport);
229
+ content = content.slice(0, firstNewline + 1) + 'import tailwindcss from "@tailwindcss/vite";\n' + content.slice(firstNewline + 1);
230
+ }
231
+ }
232
+ const pluginsRegex = /plugins:\s*\[([\s\S]*?)\]/;
233
+ const pluginsMatch = content.match(pluginsRegex);
234
+ if (pluginsMatch) {
235
+ const pluginsContent = pluginsMatch[1].trim();
236
+ let newPluginsContent;
237
+ if (pluginsContent === "") {
238
+ newPluginsContent = "tailwindcss()";
239
+ } else {
240
+ newPluginsContent = pluginsContent + ",\n tailwindcss()";
241
+ }
242
+ content = content.replace(
243
+ pluginsRegex,
244
+ `plugins: [
245
+ ${newPluginsContent}
246
+ ]`
247
+ );
248
+ } else {
249
+ const defineConfigRegex = /defineConfig\(\{/;
250
+ if (defineConfigRegex.test(content)) {
251
+ content = content.replace(
252
+ defineConfigRegex,
253
+ "defineConfig({\n plugins: [tailwindcss()],"
254
+ );
255
+ }
256
+ }
257
+ writeFileSync2(fullPath, content, "utf-8");
258
+ return true;
259
+ } catch (error) {
260
+ console.error("Error modifying vite.config:", error);
261
+ return false;
262
+ }
263
+ }
264
+
265
+ // src/commands/init.ts
266
+ var REQUIRED_DEPENDENCIES = [
267
+ "class-variance-authority",
268
+ "clsx",
269
+ "tailwind-merge"
270
+ ];
271
+ function ensureDirectory(path) {
272
+ if (!path || path.trim() === "") {
273
+ throw new Error("Invalid directory path");
274
+ }
275
+ const fullPath = join6(process.cwd(), path);
276
+ if (!existsSync4(fullPath)) {
277
+ mkdirSync(fullPath, { recursive: true });
278
+ }
279
+ }
280
+ function writeFileSecurely(relativePath, content, spinner) {
281
+ if (!relativePath || relativePath.trim() === "") {
282
+ throw new Error("Invalid file path");
283
+ }
284
+ const fullPath = join6(process.cwd(), relativePath);
285
+ const dir = dirname2(fullPath);
286
+ if (!existsSync4(dir)) {
287
+ mkdirSync(dir, { recursive: true });
288
+ }
289
+ writeFileSync3(fullPath, content, "utf-8");
290
+ spinner.text = `Fichier cr\xE9\xE9: ${relativePath}`;
291
+ }
292
+ async function setupTailwindForVite(spinner, packageManager) {
293
+ spinner.text = "Configuration de Tailwind CSS v4 pour Vite...";
294
+ const deps = ["tailwindcss@latest", "@tailwindcss/vite@latest"];
295
+ spinner.text = "Installation de Tailwind CSS v4...";
296
+ installDependencies(deps, packageManager, true);
297
+ const viteConfigPath = findViteConfig();
298
+ if (viteConfigPath) {
299
+ spinner.text = `Modification de ${viteConfigPath}...`;
300
+ const success = addTailwindToViteConfig(viteConfigPath);
301
+ if (success) {
302
+ spinner.text = `\u2713 ${viteConfigPath} modifi\xE9`;
303
+ } else {
304
+ console.log(
305
+ chalk.yellow(
306
+ `
307
+ \u26A0\uFE0F Impossible de modifier automatiquement ${viteConfigPath}.`
308
+ )
309
+ );
310
+ console.log(
311
+ chalk.dim(
312
+ `Ajoutez manuellement:
313
+ import tailwindcss from "@tailwindcss/vite";
314
+
315
+ plugins: [tailwindcss()]`
316
+ )
317
+ );
318
+ }
319
+ } else {
320
+ console.log(
321
+ chalk.yellow("\n\u26A0\uFE0F Fichier vite.config non trouv\xE9. Cr\xE9ez-le d'abord.")
322
+ );
323
+ }
324
+ }
325
+ async function setupTailwindForNextJs(spinner, packageManager) {
326
+ spinner.text = "Configuration de Tailwind CSS v4 pour Next.js...";
327
+ const deps = ["tailwindcss@latest", "@tailwindcss/postcss@latest", "postcss"];
328
+ spinner.text = "Installation de Tailwind CSS v4...";
329
+ installDependencies(deps, packageManager, true);
330
+ spinner.text = "Cr\xE9ation de postcss.config.mjs...";
331
+ const postcssTemplate = readTemplate("postcss.config.mjs.template");
332
+ writeFileSecurely("postcss.config.mjs", postcssTemplate, spinner);
333
+ }
334
+ function updateGlobalCss(cssPath, spinner) {
335
+ const fullPath = join6(process.cwd(), cssPath);
336
+ const cssTemplate = readTemplate("globals.css.template");
337
+ spinner.text = `Configuration de ${cssPath}...`;
338
+ if (existsSync4(fullPath)) {
339
+ unlinkSync(fullPath);
340
+ spinner.text = `Suppression de l'ancien ${cssPath}...`;
341
+ }
342
+ writeFileSecurely(cssPath, cssTemplate, spinner);
343
+ spinner.text = `\u2713 ${cssPath} cr\xE9\xE9 avec Tailwind v4`;
344
+ }
345
+ async function initProject() {
346
+ console.log(chalk.bold.cyan("\n\u2728 Initialisation de behsseui\n"));
347
+ if (isProjectInitialized()) {
348
+ const { overwrite } = await prompts({
349
+ type: "confirm",
350
+ name: "overwrite",
351
+ message: "Le projet est d\xE9j\xE0 initialis\xE9. Voulez-vous reconfigurer ?",
352
+ initial: false
353
+ });
354
+ if (!overwrite) {
355
+ console.log(chalk.yellow("\n\u26A0\uFE0F Initialisation annul\xE9e."));
356
+ process.exit(0);
357
+ }
358
+ }
359
+ const packageManager = detectPackageManager();
360
+ console.log(
361
+ chalk.dim(`\u{1F4E6} Package manager: ${chalk.bold(packageManager)}
362
+ `)
363
+ );
364
+ const frameworkInfo = detectFramework();
365
+ console.log(
366
+ chalk.dim(`\u{1F527} Framework: ${chalk.bold(frameworkInfo.framework)}
367
+ `)
368
+ );
369
+ if (frameworkInfo.framework === "unknown") {
370
+ console.log(
371
+ chalk.yellow(
372
+ "\u26A0\uFE0F Framework non d\xE9tect\xE9. Assurez-vous d'utiliser Vite ou Next.js."
373
+ )
374
+ );
375
+ const { continueAnyway } = await prompts({
376
+ type: "confirm",
377
+ name: "continueAnyway",
378
+ message: "Voulez-vous continuer quand m\xEAme ?",
379
+ initial: false
380
+ });
381
+ if (!continueAnyway) {
382
+ process.exit(0);
383
+ }
384
+ }
385
+ const typescriptVersion = getTypeScriptMajorVersion(
386
+ frameworkInfo.typescriptVersion
387
+ );
388
+ let needsTypeScriptUpgrade = false;
389
+ if (!frameworkInfo.typescriptVersion) {
390
+ console.log(
391
+ chalk.yellow(
392
+ "\u26A0\uFE0F TypeScript n'est pas install\xE9. behsseui n\xE9cessite TypeScript v5+."
393
+ )
394
+ );
395
+ needsTypeScriptUpgrade = true;
396
+ } else if (typescriptVersion && typescriptVersion < 5) {
397
+ console.log(
398
+ chalk.yellow(
399
+ `\u26A0\uFE0F TypeScript v${typescriptVersion} d\xE9tect\xE9. behsseui n\xE9cessite TypeScript v5+.`
400
+ )
401
+ );
402
+ needsTypeScriptUpgrade = true;
403
+ } else if (typescriptVersion && typescriptVersion >= 5) {
404
+ console.log(
405
+ chalk.green(
406
+ `\u2713 TypeScript v${typescriptVersion} d\xE9tect\xE9
407
+ `
408
+ )
409
+ );
410
+ }
411
+ const tailwindVersion = getTailwindMajorVersion(
412
+ frameworkInfo.tailwindVersion
413
+ );
414
+ if (tailwindVersion && tailwindVersion < 4) {
415
+ console.log(
416
+ chalk.yellow(
417
+ `\u26A0\uFE0F Tailwind CSS v${tailwindVersion} d\xE9tect\xE9. behsseui n\xE9cessite Tailwind v4.`
418
+ )
419
+ );
420
+ }
421
+ const oldTailwindConfig = findTailwindConfig();
422
+ if (oldTailwindConfig) {
423
+ console.log(
424
+ chalk.yellow(
425
+ `\u26A0\uFE0F Fichier de configuration Tailwind v3 d\xE9tect\xE9: ${oldTailwindConfig}`
426
+ )
427
+ );
428
+ console.log(
429
+ chalk.dim(
430
+ "Tailwind v4 n'utilise plus de fichier de configuration.\n"
431
+ )
432
+ );
433
+ }
434
+ const answers = await prompts([
435
+ {
436
+ type: oldTailwindConfig ? "confirm" : null,
437
+ name: "deleteOldTailwindConfig",
438
+ message: `Supprimer ${oldTailwindConfig} ? (Tailwind v4 n'en a plus besoin)`,
439
+ initial: true
440
+ },
441
+ {
442
+ type: needsTypeScriptUpgrade ? "confirm" : null,
443
+ name: "upgradeTypeScript",
444
+ message: frameworkInfo.typescriptVersion ? `Mettre \xE0 jour TypeScript vers v5+ (actuellement v${typescriptVersion}) ?` : "Installer TypeScript v5+ ?",
445
+ initial: true
446
+ },
447
+ {
448
+ type: "text",
449
+ name: "componentsDir",
450
+ message: "O\xF9 voulez-vous installer les composants ?",
451
+ initial: "./ui",
452
+ validate: (value) => value && value.trim() !== "" ? true : "Le chemin ne peut pas \xEAtre vide"
453
+ },
454
+ {
455
+ type: "text",
456
+ name: "tailwindCss",
457
+ message: "Chemin du fichier CSS global ?",
458
+ initial: frameworkInfo.framework === "nextjs" ? "./app/globals.css" : "./src/index.css",
459
+ validate: (value) => value && value.trim() !== "" ? true : "Le chemin ne peut pas \xEAtre vide"
460
+ },
461
+ {
462
+ type: "confirm",
463
+ name: "installTailwind",
464
+ message: tailwindVersion && tailwindVersion >= 4 ? "Tailwind v4 est d\xE9j\xE0 install\xE9. Reconfigurer ?" : "Installer et configurer Tailwind CSS v4 ?",
465
+ initial: !tailwindVersion || tailwindVersion < 4
466
+ }
467
+ ]);
468
+ if (!answers.componentsDir) {
469
+ console.log(chalk.red("\n\u274C Initialisation annul\xE9e."));
470
+ process.exit(0);
471
+ }
472
+ const spinner = ora("Configuration du projet...").start();
473
+ try {
474
+ spinner.text = `Cr\xE9ation du dossier ${answers.componentsDir}...`;
475
+ ensureDirectory(answers.componentsDir);
476
+ if (oldTailwindConfig && answers.deleteOldTailwindConfig) {
477
+ spinner.text = `Suppression de ${oldTailwindConfig}...`;
478
+ unlinkSync(join6(process.cwd(), oldTailwindConfig));
479
+ spinner.text = `\u2713 ${oldTailwindConfig} supprim\xE9`;
480
+ }
481
+ spinner.text = "Cr\xE9ation du fichier de configuration...";
482
+ const config = createDefaultConfig(answers.componentsDir);
483
+ config.tailwind.css = answers.tailwindCss;
484
+ delete config.tailwind.config;
485
+ writeConfig(config);
486
+ if (needsTypeScriptUpgrade && answers.upgradeTypeScript) {
487
+ spinner.text = "Mise \xE0 jour de TypeScript vers v5+...";
488
+ try {
489
+ installDependencies(["typescript@^5"], packageManager, true);
490
+ spinner.text = "\u2713 TypeScript mis \xE0 jour";
491
+ } catch (error) {
492
+ spinner.warn(
493
+ chalk.yellow("Erreur lors de la mise \xE0 jour de TypeScript")
494
+ );
495
+ console.log(
496
+ chalk.dim(
497
+ `
498
+ Installez manuellement:
499
+ ${packageManager === "npm" ? "npm install --save-dev" : `${packageManager} add -D`} typescript@^5
500
+ `
501
+ )
502
+ );
503
+ }
504
+ }
505
+ spinner.text = "Installation des d\xE9pendances...";
506
+ try {
507
+ installDependencies(REQUIRED_DEPENDENCIES, packageManager, true);
508
+ } catch (error) {
509
+ spinner.warn(
510
+ chalk.yellow(
511
+ "Erreur lors de l'installation automatique des d\xE9pendances"
512
+ )
513
+ );
514
+ console.log(
515
+ chalk.dim(
516
+ `
517
+ Installez manuellement:
518
+ ${packageManager === "npm" ? "npm install --save-dev" : `${packageManager} add -D`} ${REQUIRED_DEPENDENCIES.join(" ")}
519
+ `
520
+ )
521
+ );
522
+ }
523
+ if (answers.installTailwind) {
524
+ if (frameworkInfo.framework === "vite") {
525
+ await setupTailwindForVite(spinner, packageManager);
526
+ } else if (frameworkInfo.framework === "nextjs") {
527
+ await setupTailwindForNextJs(spinner, packageManager);
528
+ }
529
+ updateGlobalCss(answers.tailwindCss, spinner);
530
+ } else if (frameworkInfo.framework === "nextjs") {
531
+ const postcssConfigPath = join6(process.cwd(), "postcss.config.mjs");
532
+ if (!existsSync4(postcssConfigPath)) {
533
+ spinner.text = "Cr\xE9ation de postcss.config.mjs...";
534
+ const postcssTemplate = readTemplate("postcss.config.mjs.template");
535
+ writeFileSecurely("postcss.config.mjs", postcssTemplate, spinner);
536
+ spinner.text = "\u2713 postcss.config.mjs cr\xE9\xE9";
537
+ }
538
+ }
539
+ spinner.text = "Cr\xE9ation du helper cn() dans lib/...";
540
+ ensureDirectory("./lib");
541
+ const utilsTemplate = readTemplate("utils.ts.template");
542
+ const utilsPath = "./lib/utils.ts";
543
+ writeFileSecurely(utilsPath, utilsTemplate, spinner);
544
+ spinner.succeed(chalk.green("\u2705 Projet initialis\xE9 avec succ\xE8s !\n"));
545
+ console.log(chalk.bold("\u{1F4CB} Prochaines \xE9tapes:\n"));
546
+ console.log(
547
+ chalk.dim("1."),
548
+ "Utilisez le helper cn():",
549
+ chalk.gray(`import { cn } from "./lib/utils"`)
550
+ );
551
+ console.log(
552
+ chalk.dim("2."),
553
+ "Ajoutez des composants:",
554
+ chalk.cyan(`${packageManager} behsseui add Button`)
555
+ );
556
+ console.log(
557
+ chalk.dim("3."),
558
+ "Importez dans votre code:",
559
+ chalk.gray(`import { Button } from "${answers.componentsDir}/Button"`)
560
+ );
561
+ console.log(
562
+ chalk.dim("4."),
563
+ "Consultez la doc:",
564
+ chalk.blue("https://github.com/behsse/ui")
565
+ );
566
+ console.log();
567
+ if (frameworkInfo.framework === "vite" && answers.installTailwind) {
568
+ console.log(
569
+ chalk.dim(
570
+ `\u{1F4A1} Vite: V\xE9rifiez que tailwindcss() est dans vite.config plugins`
571
+ )
572
+ );
573
+ } else if (frameworkInfo.framework === "nextjs" && answers.installTailwind) {
574
+ console.log(
575
+ chalk.dim(`\u{1F4A1} Next.js: postcss.config.mjs a \xE9t\xE9 cr\xE9\xE9 automatiquement`)
576
+ );
577
+ }
578
+ console.log();
579
+ } catch (error) {
580
+ spinner.fail(chalk.red("\u274C Erreur lors de l'initialisation"));
581
+ console.error(error);
582
+ process.exit(1);
583
+ }
584
+ }
585
+ var init = new Command().name("init").description("Initialiser behsseui dans votre projet").action(initProject);
586
+
587
+ // src/commands/add.ts
588
+ import { Command as Command2 } from "commander";
589
+ import { existsSync as existsSync5, mkdirSync as mkdirSync2, writeFileSync as writeFileSync4 } from "fs";
590
+ import { join as join7 } from "path";
591
+ import chalk2 from "chalk";
592
+ import ora2 from "ora";
593
+ import https from "https";
594
+ var REGISTRY_URL = "https://raw.githubusercontent.com/behsse/ui/main/packages/components";
595
+ var COMPONENTS_MAP = {
596
+ Button: {
597
+ file: "Button.tsx",
598
+ dependencies: [
599
+ { file: "internals/Slot.tsx", subdir: "internals" }
600
+ // Slot doit être dans internals/
601
+ ]
602
+ }
603
+ // Ajoutez d'autres composants ici au fur et à mesure
604
+ };
605
+ function downloadFile(url) {
606
+ return new Promise((resolve, reject) => {
607
+ https.get(url, (res) => {
608
+ if (res.statusCode !== 200) {
609
+ reject(new Error(`Failed to download: ${res.statusCode}`));
610
+ return;
611
+ }
612
+ let data = "";
613
+ res.on("data", (chunk) => {
614
+ data += chunk;
615
+ });
616
+ res.on("end", () => {
617
+ resolve(data);
618
+ });
619
+ }).on("error", reject);
620
+ });
621
+ }
622
+ async function addComponent(componentName) {
623
+ if (!isProjectInitialized()) {
624
+ console.log(
625
+ chalk2.red(
626
+ "\n\u274C Le projet n'est pas initialis\xE9. Ex\xE9cutez d'abord 'behsseui init'.\n"
627
+ )
628
+ );
629
+ process.exit(1);
630
+ }
631
+ const spinner = ora2(`T\xE9l\xE9chargement du composant ${componentName}...`).start();
632
+ try {
633
+ if (!COMPONENTS_MAP[componentName]) {
634
+ spinner.fail(chalk2.red(`Le composant "${componentName}" n'existe pas.`));
635
+ console.log(
636
+ chalk2.yellow("\nComposants disponibles:"),
637
+ Object.keys(COMPONENTS_MAP).join(", ")
638
+ );
639
+ process.exit(1);
640
+ }
641
+ const componentConfig = COMPONENTS_MAP[componentName];
642
+ const config = readConfig();
643
+ const targetDir = join7(process.cwd(), config.componentsDir);
644
+ if (!existsSync5(targetDir)) {
645
+ mkdirSync2(targetDir, { recursive: true });
646
+ }
647
+ if (componentConfig.dependencies && componentConfig.dependencies.length > 0) {
648
+ spinner.text = `T\xE9l\xE9chargement des d\xE9pendances...`;
649
+ for (const dep of componentConfig.dependencies) {
650
+ const depUrl = `${REGISTRY_URL}/${dep.file}`;
651
+ const depContent = await downloadFile(depUrl);
652
+ const depTargetDir = dep.subdir ? join7(targetDir, dep.subdir) : targetDir;
653
+ if (!existsSync5(depTargetDir)) {
654
+ mkdirSync2(depTargetDir, { recursive: true });
655
+ }
656
+ const depFileName = dep.file.split("/").pop();
657
+ const depTargetPath = join7(depTargetDir, depFileName);
658
+ writeFileSync4(depTargetPath, depContent, "utf-8");
659
+ }
660
+ }
661
+ const componentUrl = `${REGISTRY_URL}/${componentConfig.file}`;
662
+ spinner.text = `T\xE9l\xE9chargement de ${componentName}...`;
663
+ const componentContent = await downloadFile(componentUrl);
664
+ const targetComponentPath = join7(targetDir, componentConfig.file);
665
+ writeFileSync4(targetComponentPath, componentContent, "utf-8");
666
+ spinner.succeed(
667
+ chalk2.green(
668
+ `\u2705 Composant ${componentName} ajout\xE9 avec succ\xE8s dans ${config.componentsDir}/`
669
+ )
670
+ );
671
+ console.log(
672
+ chalk2.cyan("\n\u{1F4E6} Vous pouvez maintenant l'importer dans votre projet:")
673
+ );
674
+ console.log(
675
+ chalk2.gray(
676
+ `import { ${componentName} } from "${config.componentsDir}/${componentConfig.file.replace(".tsx", "")}";`
677
+ )
678
+ );
679
+ console.log();
680
+ } catch (error) {
681
+ spinner.fail(chalk2.red("\u274C Erreur lors de l'installation du composant"));
682
+ console.error(error);
683
+ process.exit(1);
684
+ }
685
+ }
686
+ var add = new Command2().name("add").description("Ajouter un composant \xE0 votre projet").argument("<component>", "Nom du composant \xE0 ajouter").action(addComponent);
687
+
688
+ // src/index.ts
689
+ var program = new Command3();
690
+ program.name("behsseui").description("CLI pour ajouter des composants behsseui dans vos projets").version("0.0.2");
691
+ program.addCommand(init);
692
+ program.addCommand(add);
693
+ program.parse();
694
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/utils/package-manager.ts","../src/utils/config.ts","../src/utils/templates.ts","../src/utils/framework.ts","../src/utils/vite-config.ts","../src/commands/add.ts"],"sourcesContent":["import { Command } from \"commander\";\r\nimport { init } from \"./commands/init.js\";\r\nimport { add } from \"./commands/add.js\";\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name(\"behsseui\")\r\n .description(\"CLI pour ajouter des composants behsseui dans vos projets\")\r\n .version(\"0.0.2\");\r\n\r\n// Ajouter les commandes\r\nprogram.addCommand(init);\r\nprogram.addCommand(add);\r\n\r\nprogram.parse();\r\n","import { Command } from \"commander\";\r\nimport prompts from \"prompts\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, unlinkSync } from \"fs\";\r\nimport { join, dirname } from \"path\";\r\nimport {\r\n detectPackageManager,\r\n installDependencies,\r\n type PackageManager,\r\n} from \"../utils/package-manager.js\";\r\nimport {\r\n createDefaultConfig,\r\n isProjectInitialized,\r\n writeConfig,\r\n} from \"../utils/config.js\";\r\nimport { readTemplate } from \"../utils/templates.js\";\r\nimport {\r\n detectFramework,\r\n getTailwindMajorVersion,\r\n getTypeScriptMajorVersion,\r\n isTypeScriptV5OrHigher,\r\n findViteConfig,\r\n findTailwindConfig,\r\n} from \"../utils/framework.js\";\r\nimport { addTailwindToViteConfig } from \"../utils/vite-config.js\";\r\n\r\nconst REQUIRED_DEPENDENCIES = [\r\n \"class-variance-authority\",\r\n \"clsx\",\r\n \"tailwind-merge\",\r\n];\r\n\r\n/**\r\n * Crée un dossier de manière sécurisée\r\n */\r\nfunction ensureDirectory(path: string): void {\r\n if (!path || path.trim() === \"\") {\r\n throw new Error(\"Invalid directory path\");\r\n }\r\n\r\n const fullPath = join(process.cwd(), path);\r\n if (!existsSync(fullPath)) {\r\n mkdirSync(fullPath, { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * Écrit un fichier de manière sécurisée\r\n */\r\nfunction writeFileSecurely(\r\n relativePath: string,\r\n content: string,\r\n spinner: any\r\n): void {\r\n if (!relativePath || relativePath.trim() === \"\") {\r\n throw new Error(\"Invalid file path\");\r\n }\r\n\r\n const fullPath = join(process.cwd(), relativePath);\r\n const dir = dirname(fullPath);\r\n\r\n // S'assurer que le dossier parent existe\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n\r\n writeFileSync(fullPath, content, \"utf-8\");\r\n spinner.text = `Fichier créé: ${relativePath}`;\r\n}\r\n\r\n/**\r\n * Configure Tailwind CSS v4 pour Vite\r\n */\r\nasync function setupTailwindForVite(\r\n spinner: any,\r\n packageManager: PackageManager\r\n): Promise<void> {\r\n spinner.text = \"Configuration de Tailwind CSS v4 pour Vite...\";\r\n\r\n // Installer Tailwind v4 + plugin Vite\r\n const deps = [\"tailwindcss@latest\", \"@tailwindcss/vite@latest\"];\r\n spinner.text = \"Installation de Tailwind CSS v4...\";\r\n installDependencies(deps, packageManager, true);\r\n\r\n // Trouver et modifier vite.config\r\n const viteConfigPath = findViteConfig();\r\n if (viteConfigPath) {\r\n spinner.text = `Modification de ${viteConfigPath}...`;\r\n const success = addTailwindToViteConfig(viteConfigPath);\r\n if (success) {\r\n spinner.text = `✓ ${viteConfigPath} modifié`;\r\n } else {\r\n console.log(\r\n chalk.yellow(\r\n `\\n⚠️ Impossible de modifier automatiquement ${viteConfigPath}.`\r\n )\r\n );\r\n console.log(\r\n chalk.dim(\r\n `Ajoutez manuellement:\\nimport tailwindcss from \"@tailwindcss/vite\";\\n\\nplugins: [tailwindcss()]`\r\n )\r\n );\r\n }\r\n } else {\r\n console.log(\r\n chalk.yellow(\"\\n⚠️ Fichier vite.config non trouvé. Créez-le d'abord.\")\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Configure Tailwind CSS v4 pour Next.js\r\n */\r\nasync function setupTailwindForNextJs(\r\n spinner: any,\r\n packageManager: PackageManager\r\n): Promise<void> {\r\n spinner.text = \"Configuration de Tailwind CSS v4 pour Next.js...\";\r\n\r\n // Installer Tailwind v4 + PostCSS\r\n const deps = [\"tailwindcss@latest\", \"@tailwindcss/postcss@latest\", \"postcss\"];\r\n spinner.text = \"Installation de Tailwind CSS v4...\";\r\n installDependencies(deps, packageManager, true);\r\n\r\n // Créer postcss.config.mjs\r\n spinner.text = \"Création de postcss.config.mjs...\";\r\n const postcssTemplate = readTemplate(\"postcss.config.mjs.template\");\r\n writeFileSecurely(\"postcss.config.mjs\", postcssTemplate, spinner);\r\n}\r\n\r\n/**\r\n * Remplace le CSS global par le template Tailwind v4\r\n */\r\nfunction updateGlobalCss(cssPath: string, spinner: any): void {\r\n const fullPath = join(process.cwd(), cssPath);\r\n const cssTemplate = readTemplate(\"globals.css.template\");\r\n\r\n spinner.text = `Configuration de ${cssPath}...`;\r\n\r\n // Si le fichier existe, le supprimer d'abord\r\n if (existsSync(fullPath)) {\r\n unlinkSync(fullPath);\r\n spinner.text = `Suppression de l'ancien ${cssPath}...`;\r\n }\r\n\r\n // Créer le nouveau fichier avec le template\r\n writeFileSecurely(cssPath, cssTemplate, spinner);\r\n spinner.text = `✓ ${cssPath} créé avec Tailwind v4`;\r\n}\r\n\r\nasync function initProject() {\r\n console.log(chalk.bold.cyan(\"\\n✨ Initialisation de behsseui\\n\"));\r\n\r\n // Vérifier si déjà initialisé\r\n if (isProjectInitialized()) {\r\n const { overwrite } = await prompts({\r\n type: \"confirm\",\r\n name: \"overwrite\",\r\n message: \"Le projet est déjà initialisé. Voulez-vous reconfigurer ?\",\r\n initial: false,\r\n });\r\n\r\n if (!overwrite) {\r\n console.log(chalk.yellow(\"\\n⚠️ Initialisation annulée.\"));\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // Détecter le package manager\r\n const packageManager = detectPackageManager();\r\n console.log(\r\n chalk.dim(`📦 Package manager: ${chalk.bold(packageManager)}\\n`)\r\n );\r\n\r\n // Détecter le framework\r\n const frameworkInfo = detectFramework();\r\n console.log(\r\n chalk.dim(`🔧 Framework: ${chalk.bold(frameworkInfo.framework)}\\n`)\r\n );\r\n\r\n if (frameworkInfo.framework === \"unknown\") {\r\n console.log(\r\n chalk.yellow(\r\n \"⚠️ Framework non détecté. Assurez-vous d'utiliser Vite ou Next.js.\"\r\n )\r\n );\r\n const { continueAnyway } = await prompts({\r\n type: \"confirm\",\r\n name: \"continueAnyway\",\r\n message: \"Voulez-vous continuer quand même ?\",\r\n initial: false,\r\n });\r\n\r\n if (!continueAnyway) {\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // Vérifier la version de TypeScript\r\n const typescriptVersion = getTypeScriptMajorVersion(\r\n frameworkInfo.typescriptVersion\r\n );\r\n let needsTypeScriptUpgrade = false;\r\n\r\n if (!frameworkInfo.typescriptVersion) {\r\n console.log(\r\n chalk.yellow(\r\n \"⚠️ TypeScript n'est pas installé. behsseui nécessite TypeScript v5+.\"\r\n )\r\n );\r\n needsTypeScriptUpgrade = true;\r\n } else if (typescriptVersion && typescriptVersion < 5) {\r\n console.log(\r\n chalk.yellow(\r\n `⚠️ TypeScript v${typescriptVersion} détecté. behsseui nécessite TypeScript v5+.`\r\n )\r\n );\r\n needsTypeScriptUpgrade = true;\r\n } else if (typescriptVersion && typescriptVersion >= 5) {\r\n console.log(\r\n chalk.green(\r\n `✓ TypeScript v${typescriptVersion} détecté\\n`\r\n )\r\n );\r\n }\r\n\r\n // Vérifier la version de Tailwind\r\n const tailwindVersion = getTailwindMajorVersion(\r\n frameworkInfo.tailwindVersion\r\n );\r\n if (tailwindVersion && tailwindVersion < 4) {\r\n console.log(\r\n chalk.yellow(\r\n `⚠️ Tailwind CSS v${tailwindVersion} détecté. behsseui nécessite Tailwind v4.`\r\n )\r\n );\r\n }\r\n\r\n // Détecter l'ancien fichier tailwind.config (Tailwind v3)\r\n const oldTailwindConfig = findTailwindConfig();\r\n if (oldTailwindConfig) {\r\n console.log(\r\n chalk.yellow(\r\n `⚠️ Fichier de configuration Tailwind v3 détecté: ${oldTailwindConfig}`\r\n )\r\n );\r\n console.log(\r\n chalk.dim(\r\n \"Tailwind v4 n'utilise plus de fichier de configuration.\\n\"\r\n )\r\n );\r\n }\r\n\r\n // Questions de configuration\r\n const answers = await prompts([\r\n {\r\n type: oldTailwindConfig ? \"confirm\" : null,\r\n name: \"deleteOldTailwindConfig\",\r\n message: `Supprimer ${oldTailwindConfig} ? (Tailwind v4 n'en a plus besoin)`,\r\n initial: true,\r\n },\r\n {\r\n type: needsTypeScriptUpgrade ? \"confirm\" : null,\r\n name: \"upgradeTypeScript\",\r\n message: frameworkInfo.typescriptVersion\r\n ? `Mettre à jour TypeScript vers v5+ (actuellement v${typescriptVersion}) ?`\r\n : \"Installer TypeScript v5+ ?\",\r\n initial: true,\r\n },\r\n {\r\n type: \"text\",\r\n name: \"componentsDir\",\r\n message: \"Où voulez-vous installer les composants ?\",\r\n initial: \"./ui\",\r\n validate: (value) =>\r\n value && value.trim() !== \"\" ? true : \"Le chemin ne peut pas être vide\",\r\n },\r\n {\r\n type: \"text\",\r\n name: \"tailwindCss\",\r\n message: \"Chemin du fichier CSS global ?\",\r\n initial:\r\n frameworkInfo.framework === \"nextjs\"\r\n ? \"./app/globals.css\"\r\n : \"./src/index.css\",\r\n validate: (value) =>\r\n value && value.trim() !== \"\" ? true : \"Le chemin ne peut pas être vide\",\r\n },\r\n {\r\n type: \"confirm\",\r\n name: \"installTailwind\",\r\n message:\r\n tailwindVersion && tailwindVersion >= 4\r\n ? \"Tailwind v4 est déjà installé. Reconfigurer ?\"\r\n : \"Installer et configurer Tailwind CSS v4 ?\",\r\n initial: !tailwindVersion || tailwindVersion < 4,\r\n },\r\n ]);\r\n\r\n if (!answers.componentsDir) {\r\n console.log(chalk.red(\"\\n❌ Initialisation annulée.\"));\r\n process.exit(0);\r\n }\r\n\r\n const spinner = ora(\"Configuration du projet...\").start();\r\n\r\n try {\r\n // Créer le dossier des composants\r\n spinner.text = `Création du dossier ${answers.componentsDir}...`;\r\n ensureDirectory(answers.componentsDir);\r\n\r\n // Supprimer l'ancien tailwind.config si l'utilisateur a accepté\r\n if (oldTailwindConfig && answers.deleteOldTailwindConfig) {\r\n spinner.text = `Suppression de ${oldTailwindConfig}...`;\r\n unlinkSync(join(process.cwd(), oldTailwindConfig));\r\n spinner.text = `✓ ${oldTailwindConfig} supprimé`;\r\n }\r\n\r\n // Créer le fichier de configuration\r\n spinner.text = \"Création du fichier de configuration...\";\r\n const config = createDefaultConfig(answers.componentsDir);\r\n config.tailwind.css = answers.tailwindCss;\r\n // Plus besoin de tailwind.config pour v4\r\n delete config.tailwind.config;\r\n writeConfig(config);\r\n\r\n // Mettre à jour TypeScript si nécessaire\r\n if (needsTypeScriptUpgrade && answers.upgradeTypeScript) {\r\n spinner.text = \"Mise à jour de TypeScript vers v5+...\";\r\n try {\r\n installDependencies([\"typescript@^5\"], packageManager, true);\r\n spinner.text = \"✓ TypeScript mis à jour\";\r\n } catch (error) {\r\n spinner.warn(\r\n chalk.yellow(\"Erreur lors de la mise à jour de TypeScript\")\r\n );\r\n console.log(\r\n chalk.dim(\r\n `\\nInstallez manuellement:\\n${packageManager === \"npm\" ? \"npm install --save-dev\" : `${packageManager} add -D`} typescript@^5\\n`\r\n )\r\n );\r\n }\r\n }\r\n\r\n // Installer les dépendances requises\r\n spinner.text = \"Installation des dépendances...\";\r\n try {\r\n installDependencies(REQUIRED_DEPENDENCIES, packageManager, true);\r\n } catch (error) {\r\n spinner.warn(\r\n chalk.yellow(\r\n \"Erreur lors de l'installation automatique des dépendances\"\r\n )\r\n );\r\n console.log(\r\n chalk.dim(\r\n `\\nInstallez manuellement:\\n${packageManager === \"npm\" ? \"npm install --save-dev\" : `${packageManager} add -D`} ${REQUIRED_DEPENDENCIES.join(\" \")}\\n`\r\n )\r\n );\r\n }\r\n\r\n // Configurer Tailwind CSS v4\r\n if (answers.installTailwind) {\r\n if (frameworkInfo.framework === \"vite\") {\r\n await setupTailwindForVite(spinner, packageManager);\r\n } else if (frameworkInfo.framework === \"nextjs\") {\r\n await setupTailwindForNextJs(spinner, packageManager);\r\n }\r\n\r\n // Mettre à jour le CSS global\r\n updateGlobalCss(answers.tailwindCss, spinner);\r\n } else if (frameworkInfo.framework === \"nextjs\") {\r\n // Vérifier si postcss.config.mjs existe, sinon le créer\r\n const postcssConfigPath = join(process.cwd(), \"postcss.config.mjs\");\r\n if (!existsSync(postcssConfigPath)) {\r\n spinner.text = \"Création de postcss.config.mjs...\";\r\n const postcssTemplate = readTemplate(\"postcss.config.mjs.template\");\r\n writeFileSecurely(\"postcss.config.mjs\", postcssTemplate, spinner);\r\n spinner.text = \"✓ postcss.config.mjs créé\";\r\n }\r\n }\r\n\r\n // Créer le dossier lib/ et le fichier utils.ts pour cn() helper\r\n spinner.text = \"Création du helper cn() dans lib/...\";\r\n ensureDirectory(\"./lib\");\r\n const utilsTemplate = readTemplate(\"utils.ts.template\");\r\n const utilsPath = \"./lib/utils.ts\";\r\n writeFileSecurely(utilsPath, utilsTemplate, spinner);\r\n\r\n spinner.succeed(chalk.green(\"✅ Projet initialisé avec succès !\\n\"));\r\n\r\n // Afficher les prochaines étapes\r\n console.log(chalk.bold(\"📋 Prochaines étapes:\\n\"));\r\n console.log(\r\n chalk.dim(\"1.\"),\r\n \"Utilisez le helper cn():\",\r\n chalk.gray(`import { cn } from \"./lib/utils\"`)\r\n );\r\n console.log(\r\n chalk.dim(\"2.\"),\r\n \"Ajoutez des composants:\",\r\n chalk.cyan(`${packageManager} behsseui add Button`)\r\n );\r\n console.log(\r\n chalk.dim(\"3.\"),\r\n \"Importez dans votre code:\",\r\n chalk.gray(`import { Button } from \"${answers.componentsDir}/Button\"`)\r\n );\r\n console.log(\r\n chalk.dim(\"4.\"),\r\n \"Consultez la doc:\",\r\n chalk.blue(\"https://github.com/behsse/ui\")\r\n );\r\n console.log();\r\n\r\n // Informations spécifiques au framework\r\n if (frameworkInfo.framework === \"vite\" && answers.installTailwind) {\r\n console.log(\r\n chalk.dim(\r\n `💡 Vite: Vérifiez que tailwindcss() est dans vite.config plugins`\r\n )\r\n );\r\n } else if (\r\n frameworkInfo.framework === \"nextjs\" &&\r\n answers.installTailwind\r\n ) {\r\n console.log(\r\n chalk.dim(`💡 Next.js: postcss.config.mjs a été créé automatiquement`)\r\n );\r\n }\r\n console.log();\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"❌ Erreur lors de l'initialisation\"));\r\n console.error(error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport const init = new Command()\r\n .name(\"init\")\r\n .description(\"Initialiser behsseui dans votre projet\")\r\n .action(initProject);\r\n","import { execSync } from \"child_process\";\r\nimport { existsSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\nexport type PackageManager = \"npm\" | \"yarn\" | \"pnpm\" | \"bun\";\r\n\r\n/**\r\n * Détecte le package manager utilisé dans le projet\r\n */\r\nexport function detectPackageManager(): PackageManager {\r\n const cwd = process.cwd();\r\n\r\n // Vérifier les fichiers de lock\r\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) {\r\n return \"pnpm\";\r\n }\r\n if (existsSync(join(cwd, \"yarn.lock\"))) {\r\n return \"yarn\";\r\n }\r\n if (existsSync(join(cwd, \"bun.lockb\"))) {\r\n return \"bun\";\r\n }\r\n if (existsSync(join(cwd, \"package-lock.json\"))) {\r\n return \"npm\";\r\n }\r\n\r\n // Par défaut, vérifier ce qui est installé globalement\r\n try {\r\n execSync(\"pnpm --version\", { stdio: \"ignore\" });\r\n return \"pnpm\";\r\n } catch {}\r\n\r\n try {\r\n execSync(\"yarn --version\", { stdio: \"ignore\" });\r\n return \"yarn\";\r\n } catch {}\r\n\r\n try {\r\n execSync(\"bun --version\", { stdio: \"ignore\" });\r\n return \"bun\";\r\n } catch {}\r\n\r\n return \"npm\";\r\n}\r\n\r\n/**\r\n * Installe des dépendances avec le package manager détecté\r\n */\r\nexport function installDependencies(\r\n dependencies: string[],\r\n packageManager: PackageManager,\r\n isDev = false\r\n): void {\r\n const devFlag = isDev ? \"-D\" : \"\";\r\n const deps = dependencies.join(\" \");\r\n\r\n let command: string;\r\n switch (packageManager) {\r\n case \"pnpm\":\r\n command = `pnpm add ${devFlag} ${deps}`;\r\n break;\r\n case \"yarn\":\r\n command = `yarn add ${devFlag} ${deps}`;\r\n break;\r\n case \"bun\":\r\n command = `bun add ${devFlag} ${deps}`;\r\n break;\r\n case \"npm\":\r\n default:\r\n command = `npm install ${isDev ? \"--save-dev\" : \"\"} ${deps}`;\r\n break;\r\n }\r\n\r\n execSync(command, { stdio: \"inherit\" });\r\n}\r\n\r\n/**\r\n * Obtient la commande d'installation formatée pour affichage\r\n */\r\nexport function getInstallCommand(\r\n dependencies: string[],\r\n packageManager: PackageManager,\r\n isDev = false\r\n): string {\r\n const devFlag = isDev ? \"-D\" : \"\";\r\n const deps = dependencies.join(\" \");\r\n\r\n switch (packageManager) {\r\n case \"pnpm\":\r\n return `pnpm add ${devFlag} ${deps}`;\r\n case \"yarn\":\r\n return `yarn add ${devFlag} ${deps}`;\r\n case \"bun\":\r\n return `bun add ${devFlag} ${deps}`;\r\n case \"npm\":\r\n default:\r\n return `npm install ${isDev ? \"--save-dev\" : \"\"} ${deps}`;\r\n }\r\n}\r\n","import { existsSync, readFileSync, writeFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\nexport interface BehsseUIConfig {\r\n $schema?: string;\r\n componentsDir: string;\r\n libDir: string;\r\n tailwind: {\r\n config?: string; // Optional pour v4\r\n css: string;\r\n };\r\n initialized: boolean;\r\n}\r\n\r\nconst CONFIG_FILE_NAME = \"behsseui.json\";\r\n\r\n/**\r\n * Obtient le chemin du fichier de configuration\r\n */\r\nexport function getConfigPath(): string {\r\n return join(process.cwd(), CONFIG_FILE_NAME);\r\n}\r\n\r\n/**\r\n * Vérifie si le projet est initialisé\r\n */\r\nexport function isProjectInitialized(): boolean {\r\n const configPath = getConfigPath();\r\n if (!existsSync(configPath)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const config = readConfig();\r\n return config.initialized === true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Lit la configuration\r\n */\r\nexport function readConfig(): BehsseUIConfig {\r\n const configPath = getConfigPath();\r\n if (!existsSync(configPath)) {\r\n throw new Error(\"Configuration file not found. Run 'behsseui init' first.\");\r\n }\r\n\r\n const content = readFileSync(configPath, \"utf-8\");\r\n return JSON.parse(content);\r\n}\r\n\r\n/**\r\n * Écrit la configuration\r\n */\r\nexport function writeConfig(config: BehsseUIConfig): void {\r\n const configPath = getConfigPath();\r\n writeFileSync(configPath, JSON.stringify(config, null, 2), \"utf-8\");\r\n}\r\n\r\n/**\r\n * Crée la configuration par défaut\r\n */\r\nexport function createDefaultConfig(\r\n componentsDir = \"./ui\",\r\n libDir = \"./lib\"\r\n): BehsseUIConfig {\r\n return {\r\n $schema: \"https://behsseui.dev/schema.json\",\r\n componentsDir,\r\n libDir,\r\n tailwind: {\r\n config: \"./tailwind.config.js\",\r\n css: \"./app/globals.css\",\r\n },\r\n initialized: true,\r\n };\r\n}\r\n","import { readFileSync } from \"fs\";\r\nimport { join, dirname } from \"path\";\r\nimport { fileURLToPath } from \"url\";\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = dirname(__filename);\r\n\r\n/**\r\n * Lit un template depuis le dossier templates\r\n */\r\nexport function readTemplate(templateName: string): string {\r\n // Le fichier compilé est dans dist/index.js, donc __dirname pointe vers dist/\r\n // Les templates sont dans dist/templates/\r\n const templatePath = join(__dirname, \"templates\", templateName);\r\n return readFileSync(templatePath, \"utf-8\");\r\n}\r\n\r\n/**\r\n * Remplace les variables dans un template\r\n */\r\nexport function renderTemplate(\r\n template: string,\r\n variables: Record<string, string>\r\n): string {\r\n let result = template;\r\n for (const [key, value] of Object.entries(variables)) {\r\n result = result.replace(new RegExp(`{{${key}}}`, \"g\"), value);\r\n }\r\n return result;\r\n}\r\n","import { existsSync, readFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\nexport type Framework = \"nextjs\" | \"vite\" | \"unknown\";\r\n\r\nexport interface FrameworkInfo {\r\n framework: Framework;\r\n tailwindVersion: string | null;\r\n typescriptVersion: string | null;\r\n hasViteConfig: boolean;\r\n hasNextConfig: boolean;\r\n}\r\n\r\n/**\r\n * Détecte le framework utilisé dans le projet\r\n */\r\nexport function detectFramework(): FrameworkInfo {\r\n const cwd = process.cwd();\r\n const packageJsonPath = join(cwd, \"package.json\");\r\n\r\n const info: FrameworkInfo = {\r\n framework: \"unknown\",\r\n tailwindVersion: null,\r\n typescriptVersion: null,\r\n hasViteConfig: false,\r\n hasNextConfig: false,\r\n };\r\n\r\n // Vérifier les fichiers de config\r\n info.hasViteConfig =\r\n existsSync(join(cwd, \"vite.config.ts\")) ||\r\n existsSync(join(cwd, \"vite.config.js\")) ||\r\n existsSync(join(cwd, \"vite.config.mjs\"));\r\n\r\n info.hasNextConfig =\r\n existsSync(join(cwd, \"next.config.js\")) ||\r\n existsSync(join(cwd, \"next.config.mjs\")) ||\r\n existsSync(join(cwd, \"next.config.ts\"));\r\n\r\n // Lire le package.json\r\n if (!existsSync(packageJsonPath)) {\r\n return info;\r\n }\r\n\r\n try {\r\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\r\n const allDeps = {\r\n ...packageJson.dependencies,\r\n ...packageJson.devDependencies,\r\n };\r\n\r\n // Vérifier la version de Tailwind\r\n if (allDeps.tailwindcss) {\r\n info.tailwindVersion = allDeps.tailwindcss;\r\n }\r\n\r\n // Vérifier la version de TypeScript\r\n if (allDeps.typescript) {\r\n info.typescriptVersion = allDeps.typescript;\r\n }\r\n\r\n // Détecter Next.js\r\n if (allDeps.next) {\r\n info.framework = \"nextjs\";\r\n return info;\r\n }\r\n\r\n // Détecter Vite\r\n if (allDeps.vite || info.hasViteConfig) {\r\n info.framework = \"vite\";\r\n return info;\r\n }\r\n } catch (error) {\r\n console.error(\"Error reading package.json:\", error);\r\n }\r\n\r\n return info;\r\n}\r\n\r\n/**\r\n * Obtient la version majeure de Tailwind\r\n */\r\nexport function getTailwindMajorVersion(version: string | null): number | null {\r\n if (!version) return null;\r\n\r\n // Supprimer les caractères non numériques au début (^, ~, etc.)\r\n const cleanVersion = version.replace(/^[^\\d]+/, \"\");\r\n const majorVersion = parseInt(cleanVersion.split(\".\")[0], 10);\r\n\r\n return isNaN(majorVersion) ? null : majorVersion;\r\n}\r\n\r\n/**\r\n * Vérifie si Tailwind v4 est installé\r\n */\r\nexport function isTailwindV4(version: string | null): boolean {\r\n const major = getTailwindMajorVersion(version);\r\n return major !== null && major >= 4;\r\n}\r\n\r\n/**\r\n * Trouve le fichier vite.config\r\n */\r\nexport function findViteConfig(): string | null {\r\n const cwd = process.cwd();\r\n const configs = [\"vite.config.ts\", \"vite.config.js\", \"vite.config.mjs\"];\r\n\r\n for (const config of configs) {\r\n if (existsSync(join(cwd, config))) {\r\n return config;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Trouve le fichier tailwind.config (v3) s'il existe\r\n */\r\nexport function findTailwindConfig(): string | null {\r\n const cwd = process.cwd();\r\n const configs = [\r\n \"tailwind.config.ts\",\r\n \"tailwind.config.js\",\r\n \"tailwind.config.mjs\",\r\n \"tailwind.config.cjs\",\r\n ];\r\n\r\n for (const config of configs) {\r\n if (existsSync(join(cwd, config))) {\r\n return config;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Obtient la version majeure de TypeScript\r\n */\r\nexport function getTypeScriptMajorVersion(version: string | null): number | null {\r\n if (!version) return null;\r\n\r\n // Supprimer les caractères non numériques au début (^, ~, etc.)\r\n const cleanVersion = version.replace(/^[^\\d]+/, \"\");\r\n const majorVersion = parseInt(cleanVersion.split(\".\")[0], 10);\r\n\r\n return isNaN(majorVersion) ? null : majorVersion;\r\n}\r\n\r\n/**\r\n * Vérifie si TypeScript v5+ est installé\r\n */\r\nexport function isTypeScriptV5OrHigher(version: string | null): boolean {\r\n const major = getTypeScriptMajorVersion(version);\r\n return major !== null && major >= 5;\r\n}\r\n","import { readFileSync, writeFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\n\r\n/**\r\n * Ajoute le plugin Tailwind CSS à vite.config.ts\r\n */\r\nexport function addTailwindToViteConfig(configPath: string): boolean {\r\n const fullPath = join(process.cwd(), configPath);\r\n\r\n try {\r\n let content = readFileSync(fullPath, \"utf-8\");\r\n\r\n // Vérifier si tailwindcss est déjà importé\r\n if (content.includes(\"@tailwindcss/vite\")) {\r\n return false; // Déjà configuré\r\n }\r\n\r\n // Ajouter l'import\r\n // Chercher la ligne d'import de 'vite' pour ajouter après\r\n const viteImportRegex = /import\\s+{[^}]+}\\s+from\\s+['\"]vite['\"]/;\r\n const match = content.match(viteImportRegex);\r\n\r\n if (match) {\r\n const importStatement = '\\nimport tailwindcss from \"@tailwindcss/vite\";';\r\n content = content.replace(\r\n viteImportRegex,\r\n match[0] + importStatement\r\n );\r\n } else {\r\n // Si pas trouvé, ajouter en haut après les imports existants\r\n const firstImport = content.indexOf(\"import\");\r\n if (firstImport !== -1) {\r\n const firstNewline = content.indexOf(\"\\n\", firstImport);\r\n content =\r\n content.slice(0, firstNewline + 1) +\r\n 'import tailwindcss from \"@tailwindcss/vite\";\\n' +\r\n content.slice(firstNewline + 1);\r\n }\r\n }\r\n\r\n // Ajouter le plugin dans le tableau plugins\r\n // Chercher plugins: [...]\r\n const pluginsRegex = /plugins:\\s*\\[([\\s\\S]*?)\\]/;\r\n const pluginsMatch = content.match(pluginsRegex);\r\n\r\n if (pluginsMatch) {\r\n const pluginsContent = pluginsMatch[1].trim();\r\n let newPluginsContent: string;\r\n\r\n if (pluginsContent === \"\") {\r\n // Tableau vide\r\n newPluginsContent = \"tailwindcss()\";\r\n } else {\r\n // Ajouter tailwindcss() à la fin\r\n newPluginsContent = pluginsContent + \",\\n tailwindcss()\";\r\n }\r\n\r\n content = content.replace(\r\n pluginsRegex,\r\n `plugins: [\\n ${newPluginsContent}\\n ]`\r\n );\r\n } else {\r\n // Si pas de plugins, ajouter la propriété\r\n // Chercher defineConfig({\r\n const defineConfigRegex = /defineConfig\\(\\{/;\r\n if (defineConfigRegex.test(content)) {\r\n content = content.replace(\r\n defineConfigRegex,\r\n \"defineConfig({\\n plugins: [tailwindcss()],\"\r\n );\r\n }\r\n }\r\n\r\n writeFileSync(fullPath, content, \"utf-8\");\r\n return true;\r\n } catch (error) {\r\n console.error(\"Error modifying vite.config:\", error);\r\n return false;\r\n }\r\n}\r\n","import { Command } from \"commander\";\r\nimport { existsSync, mkdirSync, writeFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport https from \"https\";\r\nimport { isProjectInitialized, readConfig } from \"../utils/config.js\";\r\n\r\n// URL du registry des composants (GitHub raw)\r\nconst REGISTRY_URL =\r\n \"https://raw.githubusercontent.com/behsse/ui/main/packages/components\";\r\n\r\n// Mapping des composants disponibles et leurs dépendances\r\nconst COMPONENTS_MAP: Record<\r\n string,\r\n { file: string; dependencies?: Array<{ file: string; subdir?: string }> }\r\n> = {\r\n Button: {\r\n file: \"Button.tsx\",\r\n dependencies: [\r\n { file: \"internals/Slot.tsx\", subdir: \"internals\" }, // Slot doit être dans internals/\r\n ],\r\n },\r\n // Ajoutez d'autres composants ici au fur et à mesure\r\n};\r\n\r\n// Fonction pour télécharger un fichier depuis une URL\r\nfunction downloadFile(url: string): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n https\r\n .get(url, (res) => {\r\n if (res.statusCode !== 200) {\r\n reject(new Error(`Failed to download: ${res.statusCode}`));\r\n return;\r\n }\r\n\r\n let data = \"\";\r\n res.on(\"data\", (chunk) => {\r\n data += chunk;\r\n });\r\n res.on(\"end\", () => {\r\n resolve(data);\r\n });\r\n })\r\n .on(\"error\", reject);\r\n });\r\n}\r\n\r\nasync function addComponent(componentName: string) {\r\n // Vérifier si le projet est initialisé\r\n if (!isProjectInitialized()) {\r\n console.log(\r\n chalk.red(\r\n \"\\n❌ Le projet n'est pas initialisé. Exécutez d'abord 'behsseui init'.\\n\"\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const spinner = ora(`Téléchargement du composant ${componentName}...`).start();\r\n\r\n try {\r\n // Vérifier si le composant existe\r\n if (!COMPONENTS_MAP[componentName]) {\r\n spinner.fail(chalk.red(`Le composant \"${componentName}\" n'existe pas.`));\r\n console.log(\r\n chalk.yellow(\"\\nComposants disponibles:\"),\r\n Object.keys(COMPONENTS_MAP).join(\", \")\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const componentConfig = COMPONENTS_MAP[componentName];\r\n const config = readConfig();\r\n const targetDir = join(process.cwd(), config.componentsDir);\r\n\r\n // Créer le dossier principal si nécessaire\r\n if (!existsSync(targetDir)) {\r\n mkdirSync(targetDir, { recursive: true });\r\n }\r\n\r\n // Télécharger les dépendances d'abord\r\n if (componentConfig.dependencies && componentConfig.dependencies.length > 0) {\r\n spinner.text = `Téléchargement des dépendances...`;\r\n\r\n for (const dep of componentConfig.dependencies) {\r\n const depUrl = `${REGISTRY_URL}/${dep.file}`;\r\n const depContent = await downloadFile(depUrl);\r\n\r\n // Créer le sous-dossier si spécifié\r\n const depTargetDir = dep.subdir\r\n ? join(targetDir, dep.subdir)\r\n : targetDir;\r\n\r\n if (!existsSync(depTargetDir)) {\r\n mkdirSync(depTargetDir, { recursive: true });\r\n }\r\n\r\n // Extraire le nom du fichier depuis le path\r\n const depFileName = dep.file.split('/').pop()!;\r\n const depTargetPath = join(depTargetDir, depFileName);\r\n writeFileSync(depTargetPath, depContent, \"utf-8\");\r\n }\r\n }\r\n\r\n // Télécharger le composant principal\r\n const componentUrl = `${REGISTRY_URL}/${componentConfig.file}`;\r\n spinner.text = `Téléchargement de ${componentName}...`;\r\n const componentContent = await downloadFile(componentUrl);\r\n\r\n // Écrire le composant principal\r\n const targetComponentPath = join(targetDir, componentConfig.file);\r\n writeFileSync(targetComponentPath, componentContent, \"utf-8\");\r\n\r\n spinner.succeed(\r\n chalk.green(\r\n `✅ Composant ${componentName} ajouté avec succès dans ${config.componentsDir}/`\r\n )\r\n );\r\n\r\n console.log(\r\n chalk.cyan(\"\\n📦 Vous pouvez maintenant l'importer dans votre projet:\")\r\n );\r\n console.log(\r\n chalk.gray(\r\n `import { ${componentName} } from \"${config.componentsDir}/${componentConfig.file.replace(\".tsx\", \"\")}\";`\r\n )\r\n );\r\n console.log();\r\n } catch (error) {\r\n spinner.fail(chalk.red(\"❌ Erreur lors de l'installation du composant\"));\r\n console.error(error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport const add = new Command()\r\n .name(\"add\")\r\n .description(\"Ajouter un composant à votre projet\")\r\n .argument(\"<component>\", \"Nom du composant à ajouter\")\r\n .action(addComponent);\r\n"],"mappings":"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","names":["Command","existsSync","writeFileSync","join","dirname","existsSync","join","readFileSync","join","existsSync","readFileSync","join","existsSync","join","readFileSync","writeFileSync","join","join","existsSync","dirname","writeFileSync","Command","existsSync","mkdirSync","writeFileSync","join","chalk","ora","chalk","ora","join","existsSync","mkdirSync","writeFileSync","Command","Command"]}
@@ -0,0 +1,121 @@
1
+ @import "tailwindcss";
2
+
3
+ @custom-variant dark (&:is(.dark *));
4
+
5
+ @theme inline {
6
+ --color-background: var(--background);
7
+ --color-foreground: var(--foreground);
8
+ --font-sans: var(--font-geist-sans);
9
+ --font-mono: var(--font-geist-mono);
10
+ --color-sidebar-ring: var(--sidebar-ring);
11
+ --color-sidebar-border: var(--sidebar-border);
12
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
13
+ --color-sidebar-accent: var(--sidebar-accent);
14
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
15
+ --color-sidebar-primary: var(--sidebar-primary);
16
+ --color-sidebar-foreground: var(--sidebar-foreground);
17
+ --color-sidebar: var(--sidebar);
18
+ --color-chart-5: var(--chart-5);
19
+ --color-chart-4: var(--chart-4);
20
+ --color-chart-3: var(--chart-3);
21
+ --color-chart-2: var(--chart-2);
22
+ --color-chart-1: var(--chart-1);
23
+ --color-ring: var(--ring);
24
+ --color-input: var(--input);
25
+ --color-border: var(--border);
26
+ --color-destructive: var(--destructive);
27
+ --color-accent-foreground: var(--accent-foreground);
28
+ --color-accent: var(--accent);
29
+ --color-muted-foreground: var(--muted-foreground);
30
+ --color-muted: var(--muted);
31
+ --color-secondary-foreground: var(--secondary-foreground);
32
+ --color-secondary: var(--secondary);
33
+ --color-primary-foreground: var(--primary-foreground);
34
+ --color-primary: var(--primary);
35
+ --color-popover-foreground: var(--popover-foreground);
36
+ --color-popover: var(--popover);
37
+ --color-card-foreground: var(--card-foreground);
38
+ --color-card: var(--card);
39
+ --radius-sm: calc(var(--radius) - 4px);
40
+ --radius-md: calc(var(--radius) - 2px);
41
+ --radius-lg: var(--radius);
42
+ --radius-xl: calc(var(--radius) + 4px);
43
+ }
44
+
45
+ :root {
46
+ --radius: 0.625rem;
47
+ --background: oklch(1 0 0);
48
+ --foreground: oklch(0.145 0 0);
49
+ --card: oklch(1 0 0);
50
+ --card-foreground: oklch(0.145 0 0);
51
+ --popover: oklch(1 0 0);
52
+ --popover-foreground: oklch(0.145 0 0);
53
+ --primary: oklch(0.205 0 0);
54
+ --primary-foreground: oklch(0.985 0 0);
55
+ --secondary: oklch(0.97 0 0);
56
+ --secondary-foreground: oklch(0.205 0 0);
57
+ --muted: oklch(0.97 0 0);
58
+ --muted-foreground: oklch(0.556 0 0);
59
+ --accent: oklch(0.97 0 0);
60
+ --accent-foreground: oklch(0.205 0 0);
61
+ --destructive: oklch(0.577 0.245 27.325);
62
+ --border: oklch(0.922 0 0);
63
+ --input: oklch(0.922 0 0);
64
+ --ring: oklch(0.708 0 0);
65
+ --chart-1: oklch(0.646 0.222 41.116);
66
+ --chart-2: oklch(0.6 0.118 184.704);
67
+ --chart-3: oklch(0.398 0.07 227.392);
68
+ --chart-4: oklch(0.828 0.189 84.429);
69
+ --chart-5: oklch(0.769 0.188 70.08);
70
+ --sidebar: oklch(0.985 0 0);
71
+ --sidebar-foreground: oklch(0.145 0 0);
72
+ --sidebar-primary: oklch(0.205 0 0);
73
+ --sidebar-primary-foreground: oklch(0.985 0 0);
74
+ --sidebar-accent: oklch(0.97 0 0);
75
+ --sidebar-accent-foreground: oklch(0.205 0 0);
76
+ --sidebar-border: oklch(0.922 0 0);
77
+ --sidebar-ring: oklch(0.708 0 0);
78
+ }
79
+
80
+ .dark {
81
+ --background: oklch(0.145 0 0);
82
+ --foreground: oklch(0.985 0 0);
83
+ --card: oklch(0.205 0 0);
84
+ --card-foreground: oklch(0.985 0 0);
85
+ --popover: oklch(0.205 0 0);
86
+ --popover-foreground: oklch(0.985 0 0);
87
+ --primary: oklch(0.922 0 0);
88
+ --primary-foreground: oklch(0.205 0 0);
89
+ --secondary: oklch(0.269 0 0);
90
+ --secondary-foreground: oklch(0.985 0 0);
91
+ --muted: oklch(0.269 0 0);
92
+ --muted-foreground: oklch(0.708 0 0);
93
+ --accent: oklch(0.269 0 0);
94
+ --accent-foreground: oklch(0.985 0 0);
95
+ --destructive: oklch(0.704 0.191 22.216);
96
+ --border: oklch(1 0 0 / 10%);
97
+ --input: oklch(1 0 0 / 15%);
98
+ --ring: oklch(0.556 0 0);
99
+ --chart-1: oklch(0.488 0.243 264.376);
100
+ --chart-2: oklch(0.696 0.17 162.48);
101
+ --chart-3: oklch(0.769 0.188 70.08);
102
+ --chart-4: oklch(0.627 0.265 303.9);
103
+ --chart-5: oklch(0.645 0.246 16.439);
104
+ --sidebar: oklch(0.205 0 0);
105
+ --sidebar-foreground: oklch(0.985 0 0);
106
+ --sidebar-primary: oklch(0.488 0.243 264.376);
107
+ --sidebar-primary-foreground: oklch(0.985 0 0);
108
+ --sidebar-accent: oklch(0.269 0 0);
109
+ --sidebar-accent-foreground: oklch(0.985 0 0);
110
+ --sidebar-border: oklch(1 0 0 / 10%);
111
+ --sidebar-ring: oklch(0.556 0 0);
112
+ }
113
+
114
+ @layer base {
115
+ * {
116
+ @apply border-border outline-ring/50;
117
+ }
118
+ body {
119
+ @apply bg-background text-foreground;
120
+ }
121
+ }
@@ -0,0 +1,7 @@
1
+ const config = {
2
+ plugins: {
3
+ "@tailwindcss/postcss": {},
4
+ },
5
+ };
6
+
7
+ export default config;
@@ -0,0 +1,6 @@
1
+ import { clsx, type ClassValue } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs));
6
+ }
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "behsseui",
3
+ "version": "0.0.4",
4
+ "description": "CLI to add behsseui components to your projects",
5
+ "type": "module",
6
+ "author": "Behsse",
7
+ "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/behsse/ui.git"
11
+ },
12
+ "homepage": "https://github.com/behsse/ui#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/behsse/ui/issues"
15
+ },
16
+ "bin": {
17
+ "behsseui": "./dist/index.js"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsup",
25
+ "dev": "tsup --watch",
26
+ "typecheck": "tsc --noEmit"
27
+ },
28
+ "keywords": [
29
+ "cli",
30
+ "components",
31
+ "ui"
32
+ ],
33
+ "dependencies": {
34
+ "commander": "^12.1.0",
35
+ "prompts": "^2.4.2",
36
+ "chalk": "^5.3.0",
37
+ "ora": "^8.1.1",
38
+ "fs-extra": "^11.2.0",
39
+ "clsx": "^2.1.1",
40
+ "tailwind-merge": "^2.5.5"
41
+ },
42
+ "devDependencies": {
43
+ "@types/fs-extra": "^11.0.4",
44
+ "@types/node": "^22.10.5",
45
+ "@types/prompts": "^2.4.9",
46
+ "@types/react": "^18.3.18",
47
+ "react": "^18.3.1",
48
+ "tsup": "^8.3.5",
49
+ "typescript": "^5.9.3"
50
+ },
51
+ "peerDependencies": {
52
+ "react": "^18.0.0"
53
+ }
54
+ }