alexui 1.0.0 → 1.0.2
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 +46 -26
- package/dist/index.js +1 -1
- package/dist/tui/panels.js +13 -12
- package/dist/tui/theme.d.ts +18 -18
- package/dist/tui/theme.js +38 -29
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,42 +1,68 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
<h1>✨ AlexUI CLI ✨</h1>
|
|
3
|
+
<p><b>Componentes React glassmorphic premium directo a tu proyecto</b></p>
|
|
4
|
+
<p>Estilo shadcn: instalás el código fuente, no dependés de paquetes compilados.</p>
|
|
5
|
+
|
|
6
|
+
[](https://alexui.netlify.app/)
|
|
7
|
+
[](https://www.npmjs.com/package/alexui)
|
|
8
|
+
</div>
|
|
2
9
|
|
|
3
|
-
|
|
10
|
+
<br />
|
|
4
11
|
|
|
5
|
-
##
|
|
12
|
+
## 🌟 Explorá el Catálogo Interactivo
|
|
13
|
+
|
|
14
|
+
Antes de instalar nada, date una vuelta por nuestro catálogo para ver los más de **80 componentes en vivo**, probar temas, interactuar con la UI y copiar prompts optimizados para IA (Claude, Cursor, etc).
|
|
15
|
+
|
|
16
|
+
👉 **[Descubrí AlexUI en alexui.netlify.app](https://alexui.netlify.app/)**
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 🚀 Requisitos
|
|
6
21
|
|
|
7
22
|
- Node.js 18+
|
|
8
|
-
- Proyecto React
|
|
23
|
+
- Proyecto React (Vite, Next.js, etc)
|
|
24
|
+
- **Tailwind CSS v4** configurado
|
|
25
|
+
|
|
26
|
+
## 💻 Instalación Rápida
|
|
9
27
|
|
|
10
|
-
|
|
28
|
+
La CLI de `alexui` hace todo el trabajo por vos. No hace falta instalarla globalmente, usá `npx`:
|
|
11
29
|
|
|
12
30
|
```bash
|
|
31
|
+
# 1. Inicializá la configuración en la raíz de tu proyecto
|
|
13
32
|
npx alexui@latest init
|
|
14
|
-
|
|
33
|
+
|
|
34
|
+
# 2. Agregá los componentes que te gusten
|
|
35
|
+
npx alexui@latest add dock loginform
|
|
15
36
|
```
|
|
16
37
|
|
|
17
|
-
|
|
38
|
+
## 💖 TUI Interactiva (Recomendado)
|
|
39
|
+
|
|
40
|
+
Si querés la mejor experiencia visual, la CLI viene con una interfaz de terminal premium con gradientes y menús interactivos.
|
|
18
41
|
|
|
19
42
|
```bash
|
|
20
|
-
|
|
21
|
-
alexui tui
|
|
43
|
+
npx alexui@latest tui
|
|
22
44
|
```
|
|
23
45
|
|
|
24
|
-
|
|
46
|
+
Desde ahí vas a poder navegar por todo el registro de componentes usando las flechas de tu teclado y agregarlos visualmente a tu proyecto.
|
|
47
|
+
|
|
48
|
+
## 🛠 Comandos Disponibles
|
|
25
49
|
|
|
26
50
|
| Comando | Descripción |
|
|
27
51
|
|---------|-------------|
|
|
28
|
-
| `alexui init` | Crea `alexui.json` y opcionalmente el CSS
|
|
29
|
-
| `alexui add <id>` | Copia componente
|
|
30
|
-
| `alexui list` | Lista los
|
|
31
|
-
| `alexui tui` | Modo
|
|
52
|
+
| `alexui init` | Crea el archivo `alexui.json` y opcionalmente el CSS base glassmorphic |
|
|
53
|
+
| `alexui add <id>` | Copia el componente elegido y resuelve sus dependencias internas automáticamente |
|
|
54
|
+
| `alexui list` | Lista todos los componentes disponibles en el registry |
|
|
55
|
+
| `alexui tui` | Abre el Modo Interactivo en terminal |
|
|
32
56
|
|
|
33
|
-
###
|
|
57
|
+
### Usar en un proyecto externo
|
|
58
|
+
Si estás parado en otra carpeta, podés apuntar la CLI hacia tu app usando `--cwd`:
|
|
34
59
|
|
|
35
60
|
```bash
|
|
36
|
-
alexui --cwd ../mi-app add loginform
|
|
61
|
+
npx alexui@latest --cwd ../mi-app add loginform
|
|
37
62
|
```
|
|
38
63
|
|
|
39
|
-
## Configuración (`alexui.json`)
|
|
64
|
+
## ⚙️ Configuración (`alexui.json`)
|
|
65
|
+
Cuando corras `init`, se te va a generar un archivo como este para que la CLI sepa dónde meter las cosas:
|
|
40
66
|
|
|
41
67
|
```json
|
|
42
68
|
{
|
|
@@ -45,13 +71,7 @@ alexui --cwd ../mi-app add loginform
|
|
|
45
71
|
}
|
|
46
72
|
```
|
|
47
73
|
|
|
48
|
-
##
|
|
49
|
-
|
|
50
|
-
- Sitio: [alexui.dev](https://alexui.dev) *(actualizar cuando esté en producción)*
|
|
51
|
-
- Preview en vivo, docs y prompts IA por componente
|
|
52
|
-
|
|
53
|
-
## Licencia
|
|
54
|
-
|
|
55
|
-
MIT — © 2026 Alexis Jardin. Los componentes copiados a tu proyecto son tuyos para modificar.
|
|
74
|
+
## 📜 Licencia
|
|
56
75
|
|
|
57
|
-
|
|
76
|
+
MIT — © 2026 Alexis Jardin.
|
|
77
|
+
Los componentes copiados a tu proyecto son tuyos para modificar, extender y usar en producción como quieras.
|
package/dist/index.js
CHANGED
package/dist/tui/panels.js
CHANGED
|
@@ -12,22 +12,23 @@ export function renderProjectPanel(cwd) {
|
|
|
12
12
|
const lines = [
|
|
13
13
|
statusBadge(ready) + pc.dim(' ') + pc.dim(shortenPath(cwd, 44)),
|
|
14
14
|
'',
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
` ${pc.cyan(icon.project)} ${pc.bold('Proyecto').padEnd(10)} ${pc.white(shortenPath(cwd))}`,
|
|
16
|
+
` ${pc.cyan(icon.pm)} ${pc.bold('Gestor').padEnd(10)} ${pc.magenta(pm)}`,
|
|
17
|
+
` ${pc.cyan(icon.list)} ${pc.bold('Catálogo').padEnd(10)} ${pc.dim(`AlexUI ${registry.version} · ${registry.componentCount} componentes`)}`,
|
|
18
18
|
];
|
|
19
19
|
if (ready) {
|
|
20
20
|
const config = readConfig(cwd);
|
|
21
|
-
lines.splice(3, 0,
|
|
21
|
+
lines.splice(3, 0, ` ${pc.cyan(icon.folder)} ${pc.bold('UI').padEnd(10)} ${pc.dim(path.join(cwd, config.componentDir))}`, ` ${pc.cyan(icon.css)} ${pc.bold('CSS').padEnd(10)} ${pc.dim(path.join(cwd, config.tailwind.css))}`);
|
|
22
22
|
}
|
|
23
23
|
else {
|
|
24
|
-
lines.splice(3, 0, pc.yellow(` ${icon.warn}
|
|
24
|
+
lines.splice(3, 0, pc.yellow(` ${icon.warn} Sin alexui.json — inicializá el proyecto primero`));
|
|
25
25
|
}
|
|
26
26
|
return lines.join('\n');
|
|
27
27
|
}
|
|
28
28
|
export function printWelcome(cwd) {
|
|
29
29
|
const registry = getRegistry();
|
|
30
30
|
console.log(renderBanner(registry.version, registry.componentCount));
|
|
31
|
+
p.intro(pc.bgCyan(pc.black(' AlexUI ')));
|
|
31
32
|
p.note(renderProjectPanel(cwd), `${icon.logo} Panel de control`);
|
|
32
33
|
}
|
|
33
34
|
export function printProjectPanel(cwd, title = 'Estado actualizado') {
|
|
@@ -36,13 +37,13 @@ export function printProjectPanel(cwd, title = 'Estado actualizado') {
|
|
|
36
37
|
export function menuOptions(cwd) {
|
|
37
38
|
const registry = getRegistry();
|
|
38
39
|
return [
|
|
39
|
-
{ value: 'init', label: `${icon.init} Inicializar proyecto`, hint: 'alexui.json + tema CSS' },
|
|
40
|
-
{ value: 'add', label: `${icon.add} Agregar componentes`, hint: 'multiselección rápida' },
|
|
41
|
-
{ value: 'browse', label: `${icon.browse} Explorar catálogo`, hint: 'detalle y preview' },
|
|
42
|
-
{ value: 'search', label: `${icon.search} Buscar`, hint: 'id, título o categoría' },
|
|
43
|
-
{ value: 'list', label: `${icon.list} Ver catálogo completo`, hint: `${registry.componentCount} items` },
|
|
44
|
-
{ value: 'chdir', label: `${icon.chdir} Cambiar proyecto`, hint: shortenPath(cwd, 36) },
|
|
45
|
-
{ value: 'exit', label: `${icon.exit} Salir`, hint: 'cerrar TUI' },
|
|
40
|
+
{ value: 'init', label: `${pc.cyan(icon.init)} ${'Inicializar proyecto'.padEnd(22)}`, hint: 'alexui.json + tema CSS' },
|
|
41
|
+
{ value: 'add', label: `${pc.cyan(icon.add)} ${'Agregar componentes'.padEnd(22)}`, hint: 'multiselección rápida' },
|
|
42
|
+
{ value: 'browse', label: `${pc.cyan(icon.browse)} ${'Explorar catálogo'.padEnd(22)}`, hint: 'detalle y preview' },
|
|
43
|
+
{ value: 'search', label: `${pc.cyan(icon.search)} ${'Buscar'.padEnd(22)}`, hint: 'id, título o categoría' },
|
|
44
|
+
{ value: 'list', label: `${pc.cyan(icon.list)} ${'Ver catálogo completo'.padEnd(22)}`, hint: `${registry.componentCount} items` },
|
|
45
|
+
{ value: 'chdir', label: `${pc.cyan(icon.chdir)} ${'Cambiar proyecto'.padEnd(22)}`, hint: shortenPath(cwd, 36) },
|
|
46
|
+
{ value: 'exit', label: `${pc.red(icon.exit)} ${'Salir'.padEnd(22)}`, hint: 'cerrar TUI' },
|
|
46
47
|
];
|
|
47
48
|
}
|
|
48
49
|
export function sectionHeader(title) {
|
package/dist/tui/theme.d.ts
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
export declare const icon: {
|
|
2
|
-
readonly logo: "
|
|
3
|
-
readonly project: "
|
|
4
|
-
readonly folder: "
|
|
5
|
-
readonly css: "
|
|
2
|
+
readonly logo: "✨";
|
|
3
|
+
readonly project: "📦";
|
|
4
|
+
readonly folder: "📁";
|
|
5
|
+
readonly css: "🎨";
|
|
6
6
|
readonly pm: "⚡";
|
|
7
|
-
readonly init: "
|
|
8
|
-
readonly add: "
|
|
9
|
-
readonly browse: "
|
|
10
|
-
readonly search: "
|
|
11
|
-
readonly list: "
|
|
12
|
-
readonly chdir: "
|
|
13
|
-
readonly exit: "
|
|
14
|
-
readonly complete: "
|
|
15
|
-
readonly atomic: "
|
|
16
|
-
readonly npm: "
|
|
17
|
-
readonly internal: "
|
|
18
|
-
readonly ok: "
|
|
19
|
-
readonly warn: "
|
|
20
|
-
readonly back: "
|
|
7
|
+
readonly init: "🚀";
|
|
8
|
+
readonly add: "📦";
|
|
9
|
+
readonly browse: "🧭";
|
|
10
|
+
readonly search: "🔍";
|
|
11
|
+
readonly list: "📜";
|
|
12
|
+
readonly chdir: "🔀";
|
|
13
|
+
readonly exit: "✖";
|
|
14
|
+
readonly complete: "🧊";
|
|
15
|
+
readonly atomic: "💧";
|
|
16
|
+
readonly npm: "⬇";
|
|
17
|
+
readonly internal: "🔗";
|
|
18
|
+
readonly ok: "✔";
|
|
19
|
+
readonly warn: "⚠";
|
|
20
|
+
readonly back: "↩";
|
|
21
21
|
};
|
|
22
22
|
export declare function categoryIcon(category: string): string;
|
|
23
23
|
export declare function shortenPath(fullPath: string, max?: number): string;
|
package/dist/tui/theme.js
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
import pc from 'picocolors';
|
|
2
|
+
import gradient from 'gradient-string';
|
|
2
3
|
export const icon = {
|
|
3
|
-
logo: '
|
|
4
|
-
project: '
|
|
5
|
-
folder: '
|
|
6
|
-
css: '
|
|
4
|
+
logo: '✨',
|
|
5
|
+
project: '📦',
|
|
6
|
+
folder: '📁',
|
|
7
|
+
css: '🎨',
|
|
7
8
|
pm: '⚡',
|
|
8
|
-
init: '
|
|
9
|
-
add: '
|
|
10
|
-
browse: '
|
|
11
|
-
search: '
|
|
12
|
-
list: '
|
|
13
|
-
chdir: '
|
|
14
|
-
exit: '
|
|
15
|
-
complete: '
|
|
16
|
-
atomic: '
|
|
17
|
-
npm: '
|
|
18
|
-
internal: '
|
|
19
|
-
ok: '
|
|
20
|
-
warn: '
|
|
21
|
-
back: '
|
|
9
|
+
init: '🚀',
|
|
10
|
+
add: '📦',
|
|
11
|
+
browse: '🧭',
|
|
12
|
+
search: '🔍',
|
|
13
|
+
list: '📜',
|
|
14
|
+
chdir: '🔀',
|
|
15
|
+
exit: '✖',
|
|
16
|
+
complete: '🧊',
|
|
17
|
+
atomic: '💧',
|
|
18
|
+
npm: '⬇',
|
|
19
|
+
internal: '🔗',
|
|
20
|
+
ok: '✔',
|
|
21
|
+
warn: '⚠',
|
|
22
|
+
back: '↩',
|
|
22
23
|
};
|
|
23
24
|
const CATEGORY_ICONS = {
|
|
24
25
|
entradas: '⌨',
|
|
@@ -42,30 +43,38 @@ export function shortenPath(fullPath, max = 52) {
|
|
|
42
43
|
return `${parts[0]}/…/${parts.slice(-2).join('/')}`;
|
|
43
44
|
}
|
|
44
45
|
export function renderBanner(version, componentCount) {
|
|
45
|
-
const
|
|
46
|
+
const brandGradient = gradient(['#06b6d4', '#d946ef']); // Cyan to Magenta
|
|
47
|
+
const asciiLogo = `
|
|
48
|
+
___ __ __ ______
|
|
49
|
+
/ | / /____ _ / / / / _/
|
|
50
|
+
/ /| | / / _ \\ |/_// / / // /
|
|
51
|
+
/ ___ |/ / __/> </ /_/ // /
|
|
52
|
+
/_/ |_/_/\\___/_/|_|\\____/___/
|
|
53
|
+
`;
|
|
46
54
|
return [
|
|
47
55
|
'',
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
56
|
+
brandGradient.multiline(asciiLogo),
|
|
57
|
+
'',
|
|
58
|
+
` ${pc.bold(pc.white('AlexUI CLI'))} ${pc.dim(`v${version}`)}`,
|
|
59
|
+
` ${pc.dim(`${componentCount} componentes`)} ${pc.magenta('·')} ${pc.dim('glassmorphic react')}`,
|
|
51
60
|
'',
|
|
52
61
|
].join('\n');
|
|
53
62
|
}
|
|
54
63
|
export function renderDivider(label) {
|
|
55
64
|
if (!label)
|
|
56
|
-
return pc.dim('
|
|
57
|
-
const pad = Math.max(2,
|
|
58
|
-
return pc.dim(` ──
|
|
65
|
+
return pc.dim(' ────────────────────────────────────────────');
|
|
66
|
+
const pad = Math.max(2, 42 - label.length);
|
|
67
|
+
return pc.dim(` ── `) + pc.white(pc.bold(label)) + pc.dim(` ${'─'.repeat(pad)}`);
|
|
59
68
|
}
|
|
60
69
|
export function statusBadge(ready) {
|
|
61
70
|
return ready
|
|
62
|
-
? pc.bgGreen(pc.black(` ${icon.ok}
|
|
63
|
-
: pc.bgYellow(pc.black(` ${icon.warn}
|
|
71
|
+
? pc.bgGreen(pc.black(` ${icon.ok} Listo `))
|
|
72
|
+
: pc.bgYellow(pc.black(` ${icon.warn} Sin init `));
|
|
64
73
|
}
|
|
65
74
|
export function groupBadge(group) {
|
|
66
75
|
return group === 'completos'
|
|
67
|
-
? pc.bgMagenta(pc.black(` ${icon.complete}
|
|
68
|
-
: pc.bgBlue(pc.black(` ${icon.atomic}
|
|
76
|
+
? pc.bgMagenta(pc.black(` ${icon.complete} Completo `))
|
|
77
|
+
: pc.bgBlue(pc.black(` ${icon.atomic} Atómico `));
|
|
69
78
|
}
|
|
70
79
|
export function depPills(deps, kind) {
|
|
71
80
|
if (deps.length === 0)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "alexui",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "CLI para agregar componentes AlexUI by Alexis Jardin a tu proyecto React",
|
|
5
5
|
"author": "Alexis Jardin",
|
|
6
6
|
"license": "MIT",
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@clack/prompts": "^0.10.1",
|
|
37
37
|
"commander": "^13.1.0",
|
|
38
|
+
"gradient-string": "^3.0.0",
|
|
38
39
|
"picocolors": "^1.1.1"
|
|
39
40
|
},
|
|
40
41
|
"devDependencies": {
|