@mimi-ng/cli 0.2.0 → 0.3.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.
Files changed (55) hide show
  1. package/README.md +15 -1
  2. package/dist/registry.json +274 -14
  3. package/dist/templates/components/calendar/calendar-texts.ts +72 -0
  4. package/dist/templates/components/calendar/calendar.ts +588 -0
  5. package/dist/templates/components/calendar/dates.ts +181 -0
  6. package/dist/templates/components/calendar/index.ts +3 -0
  7. package/dist/templates/components/chip/chip-texts.ts +40 -0
  8. package/dist/templates/components/chip/chip.ts +116 -0
  9. package/dist/templates/components/chip/index.ts +2 -0
  10. package/dist/templates/components/color-picker/color-picker-texts.ts +57 -0
  11. package/dist/templates/components/color-picker/color-picker.ts +718 -0
  12. package/dist/templates/components/color-picker/color.ts +157 -0
  13. package/dist/templates/components/color-picker/index.ts +3 -0
  14. package/dist/templates/components/combobox/combobox-texts.ts +70 -0
  15. package/dist/templates/components/combobox/combobox.ts +798 -0
  16. package/dist/templates/components/combobox/index.ts +2 -0
  17. package/dist/templates/components/date-picker/date-picker.ts +240 -0
  18. package/dist/templates/components/date-picker/index.ts +3 -0
  19. package/dist/templates/components/date-range/date-range.ts +308 -0
  20. package/dist/templates/components/date-range/index.ts +1 -0
  21. package/dist/templates/components/file-upload/file-upload-texts.ts +77 -0
  22. package/dist/templates/components/file-upload/file-upload.ts +698 -0
  23. package/dist/templates/components/file-upload/index.ts +2 -0
  24. package/dist/templates/components/input-mask/index.ts +1 -0
  25. package/dist/templates/components/input-mask/input-mask.ts +319 -0
  26. package/dist/templates/components/input-otp/index.ts +1 -0
  27. package/dist/templates/components/input-otp/input-otp.ts +212 -0
  28. package/dist/templates/components/number-input/index.ts +2 -0
  29. package/dist/templates/components/number-input/number-input-texts.ts +46 -0
  30. package/dist/templates/components/number-input/number-input.ts +450 -0
  31. package/dist/templates/components/option-list/index.ts +11 -0
  32. package/dist/templates/components/option-list/option-list.ts +518 -0
  33. package/dist/templates/components/password/index.ts +2 -0
  34. package/dist/templates/components/password/password-texts.ts +68 -0
  35. package/dist/templates/components/password/password.ts +363 -0
  36. package/dist/templates/components/popover/popover.ts +12 -4
  37. package/dist/templates/components/progress/index.ts +1 -0
  38. package/dist/templates/components/progress/progress.ts +217 -0
  39. package/dist/templates/components/select/select.ts +3 -2
  40. package/dist/templates/components/slider/index.ts +2 -0
  41. package/dist/templates/components/slider/slider-texts.ts +26 -0
  42. package/dist/templates/components/slider/slider.ts +425 -0
  43. package/dist/templates/components/tags-input/index.ts +2 -0
  44. package/dist/templates/components/tags-input/tags-input-texts.ts +44 -0
  45. package/dist/templates/components/tags-input/tags-input.ts +303 -0
  46. package/dist/templates/components/toggle-group/index.ts +1 -0
  47. package/dist/templates/components/toggle-group/toggle-group.ts +406 -0
  48. package/dist/templates/theme/provider.ts +13 -0
  49. package/dist/templates/theme/theme-base.css +103 -0
  50. package/dist/templates/theme/types.ts +216 -0
  51. package/dist/templates/utils/overlay.ts +17 -4
  52. package/dist/ui/index.js +105 -1
  53. package/dist/ui/schema.json +56 -0
  54. package/dist/utils/write-files.js +12 -2
  55. package/package.json +1 -1
@@ -352,6 +352,209 @@ export interface MimiPaginationTokens {
352
352
  blur?: string;
353
353
  }
354
354
 
355
+ /**
356
+ * Toggle Group. Fondo, textos, indicador y su sombra van en el CSS (`--mimi-toggle-group-bg`,
357
+ * `-fg`, `-active-fg`, `-indicator`, `-indicator-shadow`).
358
+ */
359
+ export interface MimiToggleGroupTokens {
360
+ /** Radio de cada ítem y del indicador (el global `radius`); el del grupo es radio + relleno. */
361
+ radius?: string;
362
+ /** Relleno del grupo (3px). */
363
+ padding?: string;
364
+ /** Separación entre ítems (2px). */
365
+ gap?: string;
366
+ /** Alto de cada ítem (32px). */
367
+ itemHeight?: string;
368
+ /** Relleno horizontal de cada ítem (12px). */
369
+ itemPx?: string;
370
+ /** Ancho mínimo de un ítem (el de uno solo con ícono, 44px). */
371
+ iconWidth?: string;
372
+ /** Tamaño de texto (13.5px). */
373
+ fontSize?: string;
374
+ /** Curva del indicador (`cubic-bezier(.3, 1.35, .5, 1)`, la de Tabs). */
375
+ spring?: string;
376
+ }
377
+
378
+ /**
379
+ * Progress. La pista y la parte llena van en el CSS (`--mimi-progress-track`, `-fill`).
380
+ */
381
+ export interface MimiProgressTokens {
382
+ /** Grosor de la barra (8px). */
383
+ height?: string;
384
+ /** Tamaño del círculo `default` (76px). */
385
+ circleSize?: string;
386
+ /** Grosor del trazo del círculo `default`, en unidades del viewBox de 36 (3). */
387
+ circleWidth?: string | number;
388
+ }
389
+
390
+ /**
391
+ * Number Input. El fondo del botón en hover va en el CSS (`--mimi-number-button-hover`); el
392
+ * borde, el fondo y los anillos son los de Input (globales).
393
+ */
394
+ export interface MimiNumberInputTokens {
395
+ /** Altura (el alto de control). */
396
+ height?: string;
397
+ /** Radio de la caja (el global `radius`). */
398
+ radius?: string;
399
+ /** Relleno horizontal de la caja (4px). */
400
+ px?: string;
401
+ /** Tamaño de los botones − y + (30px). */
402
+ buttonSize?: string;
403
+ /** Radio de los botones (el global `radius-sm`). */
404
+ buttonRadius?: string;
405
+ }
406
+
407
+ /**
408
+ * Password. El hover del botón y la pista del medidor van en el CSS
409
+ * (`--mimi-password-toggle-hover`, `-meter-track`); los colores de los niveles son los globales
410
+ * `--mimi-strength-*`.
411
+ */
412
+ export interface MimiPasswordTokens {
413
+ /** Botón de mostrar u ocultar (32px). */
414
+ toggleSize?: string;
415
+ /** Radio del botón (el global `radius-sm`). */
416
+ toggleRadius?: string;
417
+ /** Alto de cada barra del medidor (6px). */
418
+ meterHeight?: string;
419
+ /** Separación entre barras (4px). */
420
+ meterGap?: string;
421
+ }
422
+
423
+ /**
424
+ * Input Mask. El color del marcador y el fondo del prefijo van en el CSS
425
+ * (`--mimi-mask-placeholder`, `-prefix-bg`); la caja usa los tokens de Input.
426
+ */
427
+ export interface MimiInputMaskTokens {
428
+ /** Separación entre el prefijo, el ícono y el texto (8px). */
429
+ gap?: string;
430
+ /** Alto del prefijo (26px). */
431
+ prefixHeight?: string;
432
+ /** Radio del prefijo (el global `radius-sm`). */
433
+ prefixRadius?: string;
434
+ }
435
+
436
+ /**
437
+ * Input OTP. Fondo, borde, separador y cursor van en el CSS (`--mimi-otp-bg`, `-border`,
438
+ * `-separator`, `-caret`).
439
+ */
440
+ export interface MimiInputOtpTokens {
441
+ /** Ancho de la casilla (46px). */
442
+ width?: string;
443
+ /** Alto de la casilla (54px). */
444
+ height?: string;
445
+ /** Separación entre casillas (8px). */
446
+ gap?: string;
447
+ /** Radio (el global `radius`). */
448
+ radius?: string;
449
+ /** Tamaño del carácter (22px). */
450
+ fontSize?: string;
451
+ }
452
+
453
+ /** Chip (Tags Input y Combobox). Los colores van en el CSS (`--mimi-chip-bg`, `-fg`). */
454
+ export interface MimiChipTokens {
455
+ /** Alto (26px). */
456
+ height?: string;
457
+ /** Radio (el global `badge-radius`). */
458
+ radius?: string;
459
+ /** Tamaño de texto (13px). */
460
+ fontSize?: string;
461
+ /** Botón de quitar (18px). */
462
+ removeSize?: string;
463
+ }
464
+
465
+ /** Tags Input. El borde con el límite alcanzado va en el CSS (`--mimi-tags-full-border`). */
466
+ export interface MimiTagsInputTokens {
467
+ /** Separación entre chips (6px). */
468
+ gap?: string;
469
+ /** Relleno de la caja (`5px 10px 5px 6px`). */
470
+ padding?: string;
471
+ /** Ancho mínimo del campo de texto (120px). */
472
+ inputMinWidth?: string;
473
+ }
474
+
475
+ /**
476
+ * Slider. Pista, relleno, pulgar y su sombra van en el CSS (`--mimi-slider-track`, `-fill`,
477
+ * `-thumb`, `-thumb-shadow`); la burbuja usa los colores de Tooltip.
478
+ */
479
+ export interface MimiSliderTokens {
480
+ /** Grosor de la pista (6px). */
481
+ height?: string;
482
+ /** Tamaño del pulgar (20px). */
483
+ thumbSize?: string;
484
+ }
485
+
486
+ /**
487
+ * Combobox. El fondo y la sombra del panel y la opción activa van en el CSS
488
+ * (`--mimi-combobox-menu-bg`, `-menu-shadow`, `-option-hover`).
489
+ */
490
+ export interface MimiComboboxTokens {
491
+ /** Alto del campo (el global `control-height`). */
492
+ height?: string;
493
+ /** Radio del campo y del panel (el global `radius`). */
494
+ radius?: string;
495
+ /** Alto máximo del panel (228px). */
496
+ menuMaxHeight?: string;
497
+ /** Alto mínimo de cada opción (34px). */
498
+ optionHeight?: string;
499
+ /** Radio de cada opción (el global `radius-sm`). */
500
+ optionRadius?: string;
501
+ }
502
+
503
+ /**
504
+ * Calendario, Date Picker y Date Range (una tabla, decidido por defecto en la G2.9). Los colores
505
+ * van en el CSS (`--mimi-date-cell-hover`, `-selected-bg`, `-selected-fg`, `-range`,
506
+ * `-today-ring`, `-menu-bg`, `-menu-shadow`).
507
+ */
508
+ export interface MimiDateTokens {
509
+ /** Tamaño de cada día (36px). */
510
+ cellSize?: string;
511
+ /** Radio de cada día (el global `radius-sm`). */
512
+ cellRadius?: string;
513
+ /** Relleno del panel (12px). */
514
+ padding?: string;
515
+ /** Ancho de la columna de atajos del rango (130px). */
516
+ presetsWidth?: string;
517
+ }
518
+
519
+ /**
520
+ * File Upload. Fondos y bordes de la zona van en el CSS (`--mimi-upload-bg`, `-border`,
521
+ * `-active-bg`, `-active-border`).
522
+ */
523
+ export interface MimiFileUploadTokens {
524
+ /** Radio de la zona (el global `radius-card`). */
525
+ radius?: string;
526
+ /** Alto mínimo de la zona (176px). */
527
+ height?: string;
528
+ /** Círculo del ícono (44px). */
529
+ iconSize?: string;
530
+ /** Radio de cada fila (el global `radius`). */
531
+ itemRadius?: string;
532
+ /** Miniatura de cada fila (44px). */
533
+ thumbSize?: string;
534
+ }
535
+
536
+ /**
537
+ * Color Picker. Fondo, sombra, el borde y la sombra de los pulgares y el borde de las muestras
538
+ * van en el CSS (`--mimi-color-picker-bg`, `-shadow`, `-thumb-border`, `-thumb-shadow`,
539
+ * `-swatch-border`).
540
+ */
541
+ export interface MimiColorPickerTokens {
542
+ /** Radio del panel (el global `radius`). */
543
+ radius?: string;
544
+ /** Ancho del panel (280px). */
545
+ width?: string;
546
+ /** Relleno y separación (12px). */
547
+ padding?: string;
548
+ /** Alto del área de saturación (150px). */
549
+ areaHeight?: string;
550
+ /** Radio del área (el global `radius-sm`). */
551
+ areaRadius?: string;
552
+ /** Alto de la barra de tono (12px). */
553
+ hueHeight?: string;
554
+ /** Separación de las muestras (6px). */
555
+ swatchGap?: string;
556
+ }
557
+
355
558
  /**
356
559
  * Tokens por componente (spec 13). Solo los que no dependen del modo: los colores de los
357
560
  * componentes (`--mimi-<prefijo>-bg`, `-fg`, `-border`…) se cambian en el CSS (spec 6.2).
@@ -378,6 +581,19 @@ export interface MimiComponentTokens {
378
581
  tabs?: MimiTabsTokens;
379
582
  toolbar?: MimiToolbarTokens;
380
583
  pagination?: MimiPaginationTokens;
584
+ toggleGroup?: MimiToggleGroupTokens;
585
+ progress?: MimiProgressTokens;
586
+ numberInput?: MimiNumberInputTokens;
587
+ password?: MimiPasswordTokens;
588
+ inputMask?: MimiInputMaskTokens;
589
+ inputOtp?: MimiInputOtpTokens;
590
+ chip?: MimiChipTokens;
591
+ tagsInput?: MimiTagsInputTokens;
592
+ slider?: MimiSliderTokens;
593
+ combobox?: MimiComboboxTokens;
594
+ date?: MimiDateTokens;
595
+ fileUpload?: MimiFileUploadTokens;
596
+ colorPicker?: MimiColorPickerTokens;
381
597
  }
382
598
 
383
599
  export interface MimiThemePreset {
@@ -36,9 +36,21 @@ function connectedPosition(
36
36
  : { originX: 'start', originY: y, overlayX: 'end', overlayY: y, offsetX: -offset };
37
37
  }
38
38
 
39
+ /** Las otras alineaciones, en orden de preferencia (la opuesta antes que el centro). */
40
+ const FALLBACK_ALIGNS: Record<MimiOverlayAlign, MimiOverlayAlign[]> = {
41
+ start: ['end', 'center'],
42
+ end: ['start', 'center'],
43
+ center: ['start', 'end'],
44
+ };
45
+
39
46
  /**
40
- * Posiciones para el CDK, en orden de preferencia: el lado y la alineación pedidos, el lado
41
- * opuesto y, por último, los otros dos lados centrados. `offset` es la separación con el trigger.
47
+ * Posiciones para el CDK, en orden de preferencia: el lado pedido con la alineación pedida y
48
+ * después con las otras dos; el lado opuesto, igual; y, por último, los otros dos lados
49
+ * centrados. `offset` es la separación con el trigger.
50
+ *
51
+ * Las otras alineaciones del mismo lado (5.17a) evitan que en una pantalla chica el panel se
52
+ * salga por un costado: en 360px, un menú de 240px alineado al inicio de un trigger cercano al
53
+ * borde derecho no cabía en ninguna de las cuatro posiciones de antes y el CDK lo dejaba fuera.
42
54
  */
43
55
  export function mimiConnectedPositions(
44
56
  side: MimiOverlaySide,
@@ -47,9 +59,10 @@ export function mimiConnectedPositions(
47
59
  ): ConnectedPosition[] {
48
60
  const others: MimiOverlaySide[] =
49
61
  side === 'top' || side === 'bottom' ? ['right', 'left'] : ['bottom', 'top'];
62
+ const aligns = [align, ...FALLBACK_ALIGNS[align]];
50
63
  return [
51
- connectedPosition(side, align, offset),
52
- connectedPosition(OPPOSITE[side], align, offset),
64
+ ...aligns.map((a) => connectedPosition(side, a, offset)),
65
+ ...aligns.map((a) => connectedPosition(OPPOSITE[side], a, offset)),
53
66
  ...others.map((other) => connectedPosition(other, 'center', offset)),
54
67
  ];
55
68
  }
package/dist/ui/index.js CHANGED
@@ -103,7 +103,104 @@ function inspect(tree, options) {
103
103
  }
104
104
  const implicit = [...new Set(items_1.INIT_ITEMS.flatMap((item) => (0, registry_1.resolveItems)(item)))].filter((item) => !items.includes(item));
105
105
  const componentsDir = (0, paths_1.normalizePath)(config.aliases?.components ?? 'src/app/components/ui');
106
- return { componentsDir, config, items, implicit, newPackages };
106
+ const outdated = outdatedPeers(tree, items, installed, newPackages);
107
+ const updatable = PEERS_WITH_MINIMUM.filter((name) => installed[name] || newPackages[name]);
108
+ return { componentsDir, config, items, implicit, newPackages, outdated, updatable };
109
+ }
110
+ // ── Versiones mínimas de cdk y aria (M.4) ─────────────────────────────────────────────
111
+ /**
112
+ * Paquetes cuya versión mínima se vigila. La CLI no los cambia si el proyecto ya los tiene (se
113
+ * actualizan con `ng update`, junto con el resto de Angular), pero avisa si quedan por debajo de
114
+ * lo que pide el registro: con aria y cdk 22.2.3, Combobox y Select lanzan NG0950 (spec 4,
115
+ * «#33974»).
116
+ */
117
+ const PEERS_WITH_MINIMUM = ['@angular/cdk', '@angular/aria'];
118
+ const RANGE = /^\s*(\^|~|>=|=)?\s*v?(\d+)\.(\d+)\.(\d+)\s*$/;
119
+ function parseRange(range) {
120
+ const match = RANGE.exec(range);
121
+ if (!match)
122
+ return null;
123
+ return { op: match[1] ?? '=', version: [+match[2], +match[3], +match[4]] };
124
+ }
125
+ function compare(a, b) {
126
+ return a[0] - b[0] || a[1] - b[1] || a[2] - b[2];
127
+ }
128
+ /**
129
+ * Si un rango puede instalar `required` o una posterior. Lo que no se entiende (`*`, `latest`,
130
+ * `22.2.x`, `workspace:`…) cuenta como que sí: el aviso no da falsas alarmas.
131
+ */
132
+ function canReach(range, required) {
133
+ const parsed = parseRange(range);
134
+ if (!parsed)
135
+ return true;
136
+ if (parsed.op === '>=' || compare(parsed.version, required) >= 0)
137
+ return true;
138
+ // Por debajo del mínimo: llega solo si el tope del rango (exclusivo) queda por encima.
139
+ const [major, minor, patch] = parsed.version;
140
+ const upper = parsed.op === '^'
141
+ ? major > 0
142
+ ? [major + 1, 0, 0]
143
+ : minor > 0
144
+ ? [0, minor + 1, 0]
145
+ : [0, 0, patch + 1]
146
+ : parsed.op === '~'
147
+ ? [major, minor + 1, 0]
148
+ : null;
149
+ return upper !== null && compare(required, upper) < 0;
150
+ }
151
+ /** El mínimo que piden los ítems para cada paquete vigilado (aria implica el mismo cdk). */
152
+ function requiredMinimums(items) {
153
+ const minimums = new Map();
154
+ for (const item of items) {
155
+ const { dependencies = {}, peerDependencies = {} } = registry_1.registry.items[item];
156
+ for (const [name, range] of Object.entries({ ...dependencies, ...peerDependencies })) {
157
+ if (!PEERS_WITH_MINIMUM.includes(name))
158
+ continue;
159
+ const version = parseRange(range)?.version;
160
+ if (!version)
161
+ continue;
162
+ const names = name === '@angular/aria' ? [name, '@angular/cdk'] : [name];
163
+ for (const target of names) {
164
+ const known = minimums.get(target);
165
+ if (!known || compare(version, known) > 0)
166
+ minimums.set(target, version);
167
+ }
168
+ }
169
+ }
170
+ return minimums;
171
+ }
172
+ function outdatedPeers(tree, items, installed, newPackages) {
173
+ const outdated = [];
174
+ for (const [name, required] of requiredMinimums(items)) {
175
+ const declared = installed[name] ?? newPackages[name];
176
+ if (!declared)
177
+ continue;
178
+ // Si ya está instalado, manda la versión de node_modules (la que corre de verdad).
179
+ const onDisk = installed[name] ? installedVersion(tree, name) : null;
180
+ const version = onDisk ? parseRange(onDisk)?.version : null;
181
+ const ok = version ? compare(version, required) >= 0 : canReach(declared, required);
182
+ if (!ok) {
183
+ outdated.push({
184
+ name,
185
+ current: onDisk ?? declared,
186
+ source: onDisk ? 'installed' : installed[name] ? 'declared' : 'added',
187
+ required: required.join('.'),
188
+ });
189
+ }
190
+ }
191
+ return outdated.sort((a, b) => a.name.localeCompare(b.name));
192
+ }
193
+ const SOURCE_TEXT = {
194
+ installed: (current) => `${current} instalada`,
195
+ declared: (current) => `"${current}" en package.json`,
196
+ added: (current) => `"${current}", que se agrega ahora`,
197
+ };
198
+ function installedVersion(tree, name) {
199
+ const file = tree.read(`node_modules/${name}/package.json`);
200
+ if (!file)
201
+ return null;
202
+ const { version } = JSON.parse(file.toString('utf-8'));
203
+ return version ?? null;
107
204
  }
108
205
  /**
109
206
  * @angular/aria pide como peer la versión exacta de @angular/cdk (22.1.7 → cdk 22.1.7). Si el cdk
@@ -236,6 +333,13 @@ function summary(plan, report) {
236
333
  for (const [name, version] of packages)
237
334
  log.info(` ${name}@${version}`);
238
335
  }
336
+ if (plan.outdated.length > 0) {
337
+ const required = [...new Set(plan.outdated.map((peer) => peer.required))].join(', ');
338
+ const lines = plan.outdated.map((peer) => ` ${peer.name}: ${SOURCE_TEXT[peer.source](peer.current)}`);
339
+ log.warn(`Mimi necesita @angular/cdk y @angular/aria ${required} o posterior (las anteriores ` +
340
+ `tienen errores conocidos con sus componentes) y tu proyecto tiene:\n${lines.join('\n')}\n` +
341
+ `Actualízalos con:\n ng update ${plan.updatable.join(' ')}`);
342
+ }
239
343
  if ((0, write_files_1.hasFileChanges)(report)) {
240
344
  log.info(`Guarda la carpeta ${write_files_1.BASE_DIR.split('/')[0]}/ en git: Mimi la usa para actualizar tus ` +
241
345
  'componentes sin perder tus cambios.');
@@ -31,6 +31,10 @@
31
31
  "value": "button",
32
32
  "label": "button"
33
33
  },
34
+ {
35
+ "value": "calendar",
36
+ "label": "calendar"
37
+ },
34
38
  {
35
39
  "value": "card",
36
40
  "label": "card"
@@ -39,6 +43,14 @@
39
43
  "value": "checkbox",
40
44
  "label": "checkbox"
41
45
  },
46
+ {
47
+ "value": "color-picker",
48
+ "label": "color-picker"
49
+ },
50
+ {
51
+ "value": "combobox",
52
+ "label": "combobox"
53
+ },
42
54
  {
43
55
  "value": "confirm",
44
56
  "label": "confirm"
@@ -47,6 +59,14 @@
47
59
  "value": "context-menu",
48
60
  "label": "context-menu"
49
61
  },
62
+ {
63
+ "value": "date-picker",
64
+ "label": "date-picker"
65
+ },
66
+ {
67
+ "value": "date-range",
68
+ "label": "date-range"
69
+ },
50
70
  {
51
71
  "value": "dialog",
52
72
  "label": "dialog"
@@ -55,6 +75,10 @@
55
75
  "value": "dropdown-menu",
56
76
  "label": "dropdown-menu"
57
77
  },
78
+ {
79
+ "value": "file-upload",
80
+ "label": "file-upload"
81
+ },
58
82
  {
59
83
  "value": "form-field",
60
84
  "label": "form-field"
@@ -63,14 +87,34 @@
63
87
  "value": "input",
64
88
  "label": "input"
65
89
  },
90
+ {
91
+ "value": "input-mask",
92
+ "label": "input-mask"
93
+ },
94
+ {
95
+ "value": "input-otp",
96
+ "label": "input-otp"
97
+ },
98
+ {
99
+ "value": "number-input",
100
+ "label": "number-input"
101
+ },
66
102
  {
67
103
  "value": "pagination",
68
104
  "label": "pagination"
69
105
  },
106
+ {
107
+ "value": "password",
108
+ "label": "password"
109
+ },
70
110
  {
71
111
  "value": "popover",
72
112
  "label": "popover"
73
113
  },
114
+ {
115
+ "value": "progress",
116
+ "label": "progress"
117
+ },
74
118
  {
75
119
  "value": "select",
76
120
  "label": "select"
@@ -83,6 +127,10 @@
83
127
  "value": "skeleton",
84
128
  "label": "skeleton"
85
129
  },
130
+ {
131
+ "value": "slider",
132
+ "label": "slider"
133
+ },
86
134
  {
87
135
  "value": "switch",
88
136
  "label": "switch"
@@ -91,6 +139,10 @@
91
139
  "value": "tabs",
92
140
  "label": "tabs"
93
141
  },
142
+ {
143
+ "value": "tags-input",
144
+ "label": "tags-input"
145
+ },
94
146
  {
95
147
  "value": "textarea",
96
148
  "label": "textarea"
@@ -99,6 +151,10 @@
99
151
  "value": "toast",
100
152
  "label": "toast"
101
153
  },
154
+ {
155
+ "value": "toggle-group",
156
+ "label": "toggle-group"
157
+ },
102
158
  {
103
159
  "value": "toolbar",
104
160
  "label": "toolbar"
@@ -61,7 +61,8 @@ function readManifest(tree) {
61
61
  * - si no, se crean los que faltan y se actualizan los que el usuario no tocó. Los modificados
62
62
  * sobre esta versión se conservan (`skipped`).
63
63
  *
64
- * Con `overwrite`, todo se reemplaza y nada se bloquea. Los ítems `implicit` (el tema y lo que
64
+ * Con `overwrite`, todo se reemplaza y nada se bloquea, también un archivo igual a su base de la
65
+ * misma versión (`formatted`; M.11). Los ítems `implicit` (el tema y lo que
65
66
  * copia init, que `ng g mimi` revisa aunque no se pidan) solo se escriben si hay que
66
67
  * actualizarlos: un cambio del usuario sobre la versión actual se respeta en silencio, también
67
68
  * con `overwrite`, y no bloquean a otros ítems.
@@ -172,7 +173,16 @@ function writeTemplates(options) {
172
173
  writeBase(file, content);
173
174
  break;
174
175
  case 'formatted':
175
- options.report.unchanged.push(file);
176
+ // Con --overwrite se reemplaza siempre, también con la misma versión (M.11): sin él,
177
+ // un archivo distinto de la plantilla con la misma versión no se podía reponer.
178
+ if (options.overwrite && !implicit.has(item)) {
179
+ tree.overwrite(target, content);
180
+ options.report.overwritten.push(file);
181
+ writeBase(file, content);
182
+ }
183
+ else {
184
+ options.report.unchanged.push(file);
185
+ }
176
186
  break;
177
187
  case 'old':
178
188
  tree.overwrite(target, content);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mimi-ng/cli",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Angular + Tailwind CSS 4 UI components that a CLI copies into your project, so you own the code. Schematics for ng add and ng generate.",
5
5
  "keywords": [
6
6
  "angular",