@mimi-ng/cli 0.2.0 → 0.4.0
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 +35 -2
- package/dist/init/css.js +1 -1
- package/dist/init/index.js +25 -0
- package/dist/init/paths.js +20 -0
- package/dist/registry.json +385 -14
- package/dist/templates/blocks/login-01/index.ts +1 -0
- package/dist/templates/blocks/login-01/login-01.html +174 -0
- package/dist/templates/blocks/login-01/login-01.ts +105 -0
- package/dist/templates/blocks/login-02/index.ts +1 -0
- package/dist/templates/blocks/login-02/login-02.html +186 -0
- package/dist/templates/blocks/login-02/login-02.ts +92 -0
- package/dist/templates/blocks/otp-01/index.ts +1 -0
- package/dist/templates/blocks/otp-01/otp-01.html +166 -0
- package/dist/templates/blocks/otp-01/otp-01.ts +212 -0
- package/dist/templates/blocks/pricing-01/index.ts +1 -0
- package/dist/templates/blocks/pricing-01/pricing-01.html +173 -0
- package/dist/templates/blocks/pricing-01/pricing-01.ts +178 -0
- package/dist/templates/blocks/settings-01/index.ts +1 -0
- package/dist/templates/blocks/settings-01/settings-01.html +424 -0
- package/dist/templates/blocks/settings-01/settings-01.ts +382 -0
- package/dist/templates/blocks/signup-01/index.ts +1 -0
- package/dist/templates/blocks/signup-01/signup-01.html +332 -0
- package/dist/templates/blocks/signup-01/signup-01.ts +176 -0
- package/dist/templates/components/calendar/calendar-texts.ts +72 -0
- package/dist/templates/components/calendar/calendar.ts +588 -0
- package/dist/templates/components/calendar/dates.ts +181 -0
- package/dist/templates/components/calendar/index.ts +3 -0
- package/dist/templates/components/chip/chip-texts.ts +40 -0
- package/dist/templates/components/chip/chip.ts +116 -0
- package/dist/templates/components/chip/index.ts +2 -0
- package/dist/templates/components/color-picker/color-picker-texts.ts +57 -0
- package/dist/templates/components/color-picker/color-picker.ts +718 -0
- package/dist/templates/components/color-picker/color.ts +157 -0
- package/dist/templates/components/color-picker/index.ts +3 -0
- package/dist/templates/components/combobox/combobox-texts.ts +70 -0
- package/dist/templates/components/combobox/combobox.ts +798 -0
- package/dist/templates/components/combobox/index.ts +2 -0
- package/dist/templates/components/date-picker/date-picker.ts +240 -0
- package/dist/templates/components/date-picker/index.ts +3 -0
- package/dist/templates/components/date-range/date-range.ts +308 -0
- package/dist/templates/components/date-range/index.ts +1 -0
- package/dist/templates/components/file-upload/file-upload-texts.ts +77 -0
- package/dist/templates/components/file-upload/file-upload.ts +698 -0
- package/dist/templates/components/file-upload/index.ts +2 -0
- package/dist/templates/components/input-mask/index.ts +1 -0
- package/dist/templates/components/input-mask/input-mask.ts +319 -0
- package/dist/templates/components/input-otp/index.ts +1 -0
- package/dist/templates/components/input-otp/input-otp.ts +212 -0
- package/dist/templates/components/number-input/index.ts +2 -0
- package/dist/templates/components/number-input/number-input-texts.ts +46 -0
- package/dist/templates/components/number-input/number-input.ts +450 -0
- package/dist/templates/components/option-list/index.ts +11 -0
- package/dist/templates/components/option-list/option-list.ts +518 -0
- package/dist/templates/components/password/index.ts +2 -0
- package/dist/templates/components/password/password-texts.ts +68 -0
- package/dist/templates/components/password/password.ts +363 -0
- package/dist/templates/components/popover/popover.ts +12 -4
- package/dist/templates/components/progress/index.ts +1 -0
- package/dist/templates/components/progress/progress.ts +217 -0
- package/dist/templates/components/select/select.ts +3 -2
- package/dist/templates/components/slider/index.ts +2 -0
- package/dist/templates/components/slider/slider-texts.ts +26 -0
- package/dist/templates/components/slider/slider.ts +425 -0
- package/dist/templates/components/tabs/tabs.ts +88 -23
- package/dist/templates/components/tags-input/index.ts +2 -0
- package/dist/templates/components/tags-input/tags-input-texts.ts +44 -0
- package/dist/templates/components/tags-input/tags-input.ts +303 -0
- package/dist/templates/components/toggle-group/index.ts +1 -0
- package/dist/templates/components/toggle-group/toggle-group.ts +406 -0
- package/dist/templates/theme/provider.ts +13 -0
- package/dist/templates/theme/theme-base.css +103 -0
- package/dist/templates/theme/types.ts +216 -0
- package/dist/templates/utils/overlay.ts +17 -4
- package/dist/ui/index.js +232 -10
- package/dist/ui/schema.json +82 -2
- package/dist/utils/project.js +35 -0
- package/dist/utils/tailwind.js +80 -0
- package/dist/utils/write-files.js +49 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ ng add @mimi-ng/cli
|
|
|
29
29
|
|
|
30
30
|
Verifica Angular y Tailwind (si falta algo, se detiene sin modificar nada) y configura el proyecto:
|
|
31
31
|
|
|
32
|
-
- importa el tema de Mimi en tu CSS global, justo después de `@import "tailwindcss"
|
|
32
|
+
- importa el tema de Mimi en tu CSS global, justo después de `@import "tailwindcss"`, y excluye `.mimi/` del escaneo de Tailwind (`@source not "../.mimi";`, con Tailwind 4.1 o superior);
|
|
33
33
|
- agrega el alias `@/components/ui/*` al `tsconfig.json`;
|
|
34
34
|
- registra la CLI en `angular.json`, para que funcione `ng g mimi`;
|
|
35
35
|
- instala `clsx`, `tailwind-merge` y `class-variance-authority` con tu gestor de paquetes;
|
|
@@ -37,6 +37,14 @@ Verifica Angular y Tailwind (si falta algo, se detiene sin modificar nada) y con
|
|
|
37
37
|
|
|
38
38
|
Con `--icons` instala también [`@lucide/angular`](https://lucide.dev) para tus íconos.
|
|
39
39
|
|
|
40
|
+
**Si configuraste el CSS a mano, o instalaste con la 0.3.0 o una anterior,** agrega después de `@import "tailwindcss"` (la ruta va de tu CSS global a la carpeta `.mimi/` de la raíz; con `src/styles.css`, así):
|
|
41
|
+
|
|
42
|
+
```css
|
|
43
|
+
@source not "../.mimi";
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Sin esa línea, Tailwind escanea las copias originales de `.mimi/` (van en git) y tu CSS lleva sus clases aunque ya las hayas cambiado. `ng g mimi` te avisa si falta. Necesita Tailwind 4.1 o superior: la 4.0 no entiende `@source not`.
|
|
47
|
+
|
|
40
48
|
## Agregar componentes
|
|
41
49
|
|
|
42
50
|
```sh
|
|
@@ -46,7 +54,7 @@ ng g mimi # menú para elegir (terminal interactiva)
|
|
|
46
54
|
ng g @mimi-ng/cli:ui button # forma larga (si Mimi no está en schematicCollections)
|
|
47
55
|
```
|
|
48
56
|
|
|
49
|
-
Cada componente se copia a `src/app/components/ui/<nombre>`, con lo que necesite, y se instalan las dependencias que falten. Algunos usan por dentro `@angular/cdk` y `@angular/aria`, paquetes oficiales del equipo de Angular: `ng g mimi` los instala cuando hacen falta (aria en la versión exacta de tu cdk) y agrega los estilos del CDK a tu CSS global. Más en [Fundamentos](https://ng.mimiworks.dev/docs/foundations).
|
|
57
|
+
Cada componente se copia a `src/app/components/ui/<nombre>`, con lo que necesite, y se instalan las dependencias que falten. Algunos usan por dentro `@angular/cdk` y `@angular/aria`, paquetes oficiales del equipo de Angular: `ng g mimi` los instala cuando hacen falta (aria en la versión exacta de tu cdk) y agrega los estilos del CDK a tu CSS global. Mimi necesita `@angular/cdk` y `@angular/aria` 22.2.4 o posterior (con 22.2.3, Combobox y Select pueden fallar al destruirse): si ya los tienes en una versión anterior, `ng g mimi` te avisa (no los cambia por ti); actualízalos con `ng update @angular/cdk @angular/aria`. Más en [Fundamentos](https://ng.mimiworks.dev/docs/foundations).
|
|
50
58
|
|
|
51
59
|
Después lo importas como cualquier otro:
|
|
52
60
|
|
|
@@ -67,25 +75,50 @@ export class App {}
|
|
|
67
75
|
- **Badge**: `ng g mimi badge` · [documentación](https://ng.mimiworks.dev/docs/components/badge)
|
|
68
76
|
- **Button**: `ng g mimi button` · [documentación](https://ng.mimiworks.dev/docs/components/button)
|
|
69
77
|
- **Card**: `ng g mimi card` · [documentación](https://ng.mimiworks.dev/docs/components/card)
|
|
78
|
+
- **Calendar**: `ng g mimi calendar` · [documentación](https://ng.mimiworks.dev/docs/components/date-picker)
|
|
70
79
|
- **Checkbox**: `ng g mimi checkbox` · [documentación](https://ng.mimiworks.dev/docs/components/switch)
|
|
80
|
+
- **Color Picker**: `ng g mimi color-picker` · [documentación](https://ng.mimiworks.dev/docs/components/color-picker)
|
|
81
|
+
- **Combobox**: `ng g mimi combobox` · [documentación](https://ng.mimiworks.dev/docs/components/combobox)
|
|
71
82
|
- **Confirm**: `ng g mimi confirm` · [documentación](https://ng.mimiworks.dev/docs/components/confirm)
|
|
72
83
|
- **Context Menu**: `ng g mimi context-menu` · [documentación](https://ng.mimiworks.dev/docs/components/context-menu)
|
|
84
|
+
- **Date Picker**: `ng g mimi date-picker` · [documentación](https://ng.mimiworks.dev/docs/components/date-picker)
|
|
85
|
+
- **Date Range**: `ng g mimi date-range` · [documentación](https://ng.mimiworks.dev/docs/components/date-range)
|
|
73
86
|
- **Dialog**: `ng g mimi dialog` · [documentación](https://ng.mimiworks.dev/docs/components/dialog)
|
|
74
87
|
- **Dropdown Menu**: `ng g mimi dropdown-menu` · [documentación](https://ng.mimiworks.dev/docs/components/dropdown-menu)
|
|
88
|
+
- **File Upload**: `ng g mimi file-upload` · [documentación](https://ng.mimiworks.dev/docs/components/file-upload)
|
|
75
89
|
- **FormField**: `ng g mimi form-field` · [documentación](https://ng.mimiworks.dev/docs/components/form-field)
|
|
76
90
|
- **Input**: `ng g mimi input` · [documentación](https://ng.mimiworks.dev/docs/components/input)
|
|
91
|
+
- **Input Mask**: `ng g mimi input-mask` · [documentación](https://ng.mimiworks.dev/docs/components/input-mask)
|
|
92
|
+
- **Input OTP**: `ng g mimi input-otp` · [documentación](https://ng.mimiworks.dev/docs/components/input-otp)
|
|
93
|
+
- **Number Input**: `ng g mimi number-input` · [documentación](https://ng.mimiworks.dev/docs/components/number-input)
|
|
77
94
|
- **Pagination**: `ng g mimi pagination` · [documentación](https://ng.mimiworks.dev/docs/components/pagination)
|
|
95
|
+
- **Password**: `ng g mimi password` · [documentación](https://ng.mimiworks.dev/docs/components/password)
|
|
78
96
|
- **Popover**: `ng g mimi popover` · [documentación](https://ng.mimiworks.dev/docs/components/popover)
|
|
97
|
+
- **Progress**: `ng g mimi progress` · [documentación](https://ng.mimiworks.dev/docs/components/progress)
|
|
79
98
|
- **Select**: `ng g mimi select` · [documentación](https://ng.mimiworks.dev/docs/components/select)
|
|
80
99
|
- **Separator**: `ng g mimi separator` · [documentación](https://ng.mimiworks.dev/docs/components/separator)
|
|
81
100
|
- **Skeleton**: `ng g mimi skeleton` · [documentación](https://ng.mimiworks.dev/docs/components/skeleton)
|
|
101
|
+
- **Slider**: `ng g mimi slider` · [documentación](https://ng.mimiworks.dev/docs/components/slider)
|
|
82
102
|
- **Switch**: `ng g mimi switch` · [documentación](https://ng.mimiworks.dev/docs/components/switch)
|
|
83
103
|
- **Tabs**: `ng g mimi tabs` · [documentación](https://ng.mimiworks.dev/docs/components/tabs)
|
|
84
104
|
- **Textarea**: `ng g mimi textarea` · [documentación](https://ng.mimiworks.dev/docs/components/input)
|
|
105
|
+
- **Tags Input**: `ng g mimi tags-input` · [documentación](https://ng.mimiworks.dev/docs/components/tags-input)
|
|
85
106
|
- **Toast**: `ng g mimi toast` · [documentación](https://ng.mimiworks.dev/docs/components/toast)
|
|
107
|
+
- **Toggle Group**: `ng g mimi toggle-group` · [documentación](https://ng.mimiworks.dev/docs/components/toggle-group)
|
|
86
108
|
- **Toolbar**: `ng g mimi toolbar` · [documentación](https://ng.mimiworks.dev/docs/components/toolbar)
|
|
87
109
|
- **Tooltip**: `ng g mimi tooltip` · [documentación](https://ng.mimiworks.dev/docs/components/tooltip)
|
|
88
110
|
|
|
111
|
+
## Blocks
|
|
112
|
+
|
|
113
|
+
Pantallas enteras (inicio de sesión, registro, ajustes…) hechas con los componentes de Mimi. Se agregan con el mismo comando, por ejemplo `ng g mimi` seguido del nombre del Block: la pantalla se copia a `src/app/blocks/<nombre>` (`aliases.blocks` en `mimi.json`) y los componentes que usa, a la carpeta de siempre. Es un componente de página: agrégalo a tus rutas. La pantalla es tuya; si la modificas, `ng g mimi` no la vuelve a tocar al actualizar (te avisa y `--overwrite` la reemplaza entera).
|
|
114
|
+
|
|
115
|
+
- **login-01** (inicio de sesión centrado, con Google y GitHub): `ng g mimi login-01` · [documentación](https://ng.mimiworks.dev/docs/blocks/login-01)
|
|
116
|
+
- **login-02** (inicio de sesión en dos columnas, con imagen y testimonio): `ng g mimi login-02` · [documentación](https://ng.mimiworks.dev/docs/blocks/login-02)
|
|
117
|
+
- **otp-01** (verificación con un código de 6 dígitos, reenvío y cuenta regresiva): `ng g mimi otp-01` · [documentación](https://ng.mimiworks.dev/docs/blocks/otp-01)
|
|
118
|
+
- **pricing-01** (tres planes con mensual/anual y el plan destacado): `ng g mimi pricing-01` · [documentación](https://ng.mimiworks.dev/docs/blocks/pricing-01)
|
|
119
|
+
- **settings-01** (ajustes de cuenta con secciones, interruptores, sesiones y facturación): `ng g mimi settings-01` · [documentación](https://ng.mimiworks.dev/docs/blocks/settings-01)
|
|
120
|
+
- **signup-01** (registro con validación, medidor de contraseña y confirmación): `ng g mimi signup-01` · [documentación](https://ng.mimiworks.dev/docs/blocks/signup-01)
|
|
121
|
+
|
|
89
122
|
## Tus cambios
|
|
90
123
|
|
|
91
124
|
- Guarda la carpeta `.mimi/` en git: tiene la copia original de cada archivo, y con ella Mimi sabe qué cambiaste tú.
|
package/dist/init/css.js
CHANGED
|
@@ -42,7 +42,7 @@ function insertAfterTheme(css, lines) {
|
|
|
42
42
|
const eol = eolOf(css);
|
|
43
43
|
return css.slice(0, end) + lines.map((line) => eol + line).join('') + css.slice(end);
|
|
44
44
|
}
|
|
45
|
-
/** ¿Ya hay un `@import` o `@source` con esa ruta (
|
|
45
|
+
/** ¿Ya hay un `@import`, `@source` o `@source not` con esa ruta (comillas simples o dobles)? */
|
|
46
46
|
function hasDirective(css, directive, path) {
|
|
47
47
|
const escaped = path.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
48
48
|
return new RegExp(`${directive}\\s+(["'])${escaped}\\1`).test(css);
|
package/dist/init/index.js
CHANGED
|
@@ -7,6 +7,7 @@ const utility_1 = require("@schematics/angular/utility");
|
|
|
7
7
|
const json_file_1 = require("@schematics/angular/utility/json-file");
|
|
8
8
|
const registry_1 = require("../registry");
|
|
9
9
|
const project_1 = require("../utils/project");
|
|
10
|
+
const tailwind_1 = require("../utils/tailwind");
|
|
10
11
|
const write_files_1 = require("../utils/write-files");
|
|
11
12
|
const css_1 = require("./css");
|
|
12
13
|
const items_1 = require("./items");
|
|
@@ -87,13 +88,17 @@ async function inspect(tree, options) {
|
|
|
87
88
|
}
|
|
88
89
|
const sourceRoot = (0, paths_1.normalizePath)(project.sourceRoot ?? `${project.root}/src`);
|
|
89
90
|
const mimiConfig = (0, project_1.readJson)(tree, 'mimi.json');
|
|
91
|
+
if (mimiConfig)
|
|
92
|
+
(0, project_1.assertAliases)(mimiConfig);
|
|
90
93
|
const componentsDir = (0, paths_1.normalizePath)(mimiConfig?.aliases?.components ?? `${sourceRoot}/app/components/ui`);
|
|
91
94
|
const tsConfig = build?.options?.['tsConfig'];
|
|
92
95
|
return {
|
|
93
96
|
projectName: name,
|
|
94
97
|
cssPath: withTailwind,
|
|
95
98
|
sourceNone: (0, css_1.findTailwindImport)(tree.readText(withTailwind)).sourceNone,
|
|
99
|
+
sourceNot: (0, tailwind_1.tailwindSupportsSourceNot)(tree, deps['tailwindcss']),
|
|
96
100
|
componentsDir,
|
|
101
|
+
blocksDir: (0, paths_1.normalizePath)(mimiConfig?.aliases?.blocks ?? (0, project_1.defaultBlocksDir)(componentsDir)),
|
|
97
102
|
buildTsConfig: typeof tsConfig === 'string' ? (0, paths_1.normalizePath)(tsConfig) : undefined,
|
|
98
103
|
mimiConfig,
|
|
99
104
|
sourceRoot,
|
|
@@ -134,6 +139,24 @@ function updateGlobalCss(plan) {
|
|
|
134
139
|
context.logger.warn(`El @import de Tailwind en ${plan.cssPath} usa source(none): Tailwind no escanea nada por su ` +
|
|
135
140
|
`cuenta. Se agregó @source "${sourcePath}"; para que genere las clases de los componentes.`);
|
|
136
141
|
}
|
|
142
|
+
// G1: y la carpeta de los Blocks (sin él, un Block queda sin estilos). Tailwind no se queja
|
|
143
|
+
// si la carpeta todavía no existe.
|
|
144
|
+
const blocksSourcePath = (0, paths_1.relativePath)(cssDir, plan.blocksDir);
|
|
145
|
+
if (plan.sourceNone && !(0, css_1.hasDirective)(css, '@source', blocksSourcePath)) {
|
|
146
|
+
lines.push(`@source "${blocksSourcePath}";`);
|
|
147
|
+
}
|
|
148
|
+
// Sin source(none), Tailwind escanea todo el workspace salvo lo que ignora git, y .mimi/ va
|
|
149
|
+
// en git: las clases de las copias originales acabarían en el CSS aunque el usuario ya las
|
|
150
|
+
// haya cambiado o quitado en sus componentes.
|
|
151
|
+
// Con Tailwind 4.0 (no entiende `@source not`) no se escribe: solo se avisa.
|
|
152
|
+
if ((0, tailwind_1.missingMimiExclusion)(css, plan.cssPath)) {
|
|
153
|
+
const line = (0, tailwind_1.mimiSourceNotLine)(plan.cssPath);
|
|
154
|
+
if (plan.sourceNot)
|
|
155
|
+
lines.push(line);
|
|
156
|
+
else
|
|
157
|
+
context.logger.warn(`Tailwind 4.0 escanea ${write_files_1.BASE_DIR}/ y genera CSS de más. Con Tailwind 4.1 o superior, ` +
|
|
158
|
+
`agrega ${line} en ${plan.cssPath} (init lo hace si lo vuelves a ejecutar).`);
|
|
159
|
+
}
|
|
137
160
|
if (lines.length === 0)
|
|
138
161
|
return;
|
|
139
162
|
css = (0, css_1.insertAfterTailwind)(css, lines);
|
|
@@ -224,6 +247,8 @@ function writeMimiConfig(plan) {
|
|
|
224
247
|
components: plan.componentsDir,
|
|
225
248
|
utils: `${plan.componentsDir}/utils`,
|
|
226
249
|
theme: `${plan.sourceRoot}/app/mimi.preset.ts`,
|
|
250
|
+
// Desde la 0.4.0 (B.1-a). Los proyectos anteriores lo reciben con el primer Block.
|
|
251
|
+
blocks: plan.blocksDir,
|
|
227
252
|
},
|
|
228
253
|
components: {},
|
|
229
254
|
};
|
package/dist/init/paths.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
exports.normalizePath = normalizePath;
|
|
9
|
+
exports.invalidAliasReason = invalidAliasReason;
|
|
9
10
|
exports.dirnameOf = dirnameOf;
|
|
10
11
|
exports.relativePath = relativePath;
|
|
11
12
|
/** `src\app\ui\`, `./src/app/ui` o `/src/app/ui` → `src/app/ui`. Resuelve `.` y `..`. */
|
|
@@ -21,6 +22,25 @@ function normalizePath(path) {
|
|
|
21
22
|
}
|
|
22
23
|
return out.join('/');
|
|
23
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* M2: un alias de mimi.json (`components`, `blocks`) tiene que ser una ruta relativa a la raíz del
|
|
27
|
+
* workspace y quedar dentro de él. Devuelve el motivo si no lo es (o null): absoluta (`/x`,
|
|
28
|
+
* `C:\x`, `\\servidor`, `~/x`), con `..` o vacía. Se comprueba antes de normalizar: normalizePath
|
|
29
|
+
* convertiría `C:\x` en una carpeta «C:» y quitaría el `/` inicial.
|
|
30
|
+
*/
|
|
31
|
+
function invalidAliasReason(value) {
|
|
32
|
+
if (typeof value !== 'string' || value.trim() === '')
|
|
33
|
+
return 'está vacío';
|
|
34
|
+
const path = value.trim().replace(/\\/g, '/');
|
|
35
|
+
if (/^[a-zA-Z]:/.test(path) || path.startsWith('/') || path.startsWith('~')) {
|
|
36
|
+
return 'es una ruta absoluta';
|
|
37
|
+
}
|
|
38
|
+
if (path.split('/').includes('..'))
|
|
39
|
+
return 'tiene «..» (saldría del proyecto)';
|
|
40
|
+
if (normalizePath(path) === '')
|
|
41
|
+
return 'apunta a la raíz del workspace';
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
24
44
|
/** Carpeta de un archivo: `src/styles.css` → `src`. */
|
|
25
45
|
function dirnameOf(path) {
|
|
26
46
|
const parts = normalizePath(path).split('/');
|