ansimax 1.0.0 → 1.1.1
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/CHANGELOG.md +274 -0
- package/LICENSE +201 -21
- package/README.es.md +752 -628
- package/README.md +493 -369
- package/dist/index.d.mts +1256 -336
- package/dist/index.d.ts +1256 -336
- package/dist/index.js +4417 -683
- package/dist/index.mjs +4319 -682
- package/examples/01-cli-installer.ts +96 -0
- package/examples/01-quick-smoke.ts +121 -0
- package/examples/02-colors-gradients.ts +108 -0
- package/examples/02-live-dashboard.ts +152 -0
- package/examples/03-ascii-banners.ts +81 -0
- package/examples/03-pixel-art-game.ts +170 -0
- package/examples/04-interactive-deploy.ts +163 -0
- package/examples/04-trees.ts +117 -0
- package/examples/05-components.ts +96 -0
- package/examples/05-tree-visualizations.ts +183 -0
- package/examples/06-everything-together.ts +466 -0
- package/examples/06-pixel-art.ts +116 -0
- package/examples/07-animations.ts +68 -0
- package/examples/08-loaders.ts +98 -0
- package/examples/09-themes.ts +90 -0
- package/examples/10-everything.ts +133 -0
- package/examples/all-in-one.cjs +210 -0
- package/examples/all-in-one.mjs +203 -0
- package/examples/animations.ts +172 -0
- package/examples/demo.js +213 -0
- package/examples/demo.ts +212 -0
- package/examples/loaders.ts +254 -0
- package/examples/showcase.ts +174 -0
- package/examples/trees-basic.ts +99 -0
- package/examples/tsconfig.json +18 -0
- package/examples/tsconfig.vscode.json +25 -0
- package/package.json +19 -7
package/README.es.md
CHANGED
|
@@ -1,629 +1,753 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
|
|
3
|
-
<img src="media/ansimax.png" alt="Ansimax" width="
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
[![
|
|
12
|
-
[![
|
|
13
|
-
[![
|
|
14
|
-
[![
|
|
15
|
-
[![
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
|
69
|
-
|
|
70
|
-
|
|
|
71
|
-
|
|
|
72
|
-
|
|
|
73
|
-
|
|
|
74
|
-
|
|
|
75
|
-
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
---
|
|
108
|
-
|
|
109
|
-
##
|
|
110
|
-
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
```ts
|
|
190
|
-
import {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
<
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
await
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
<
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
- **
|
|
399
|
-
- **
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
-
|
|
438
|
-
|
|
439
|
-
### ✅ Fase
|
|
440
|
-
|
|
441
|
-
- [x]
|
|
442
|
-
- [x]
|
|
443
|
-
- [x]
|
|
444
|
-
- [x]
|
|
445
|
-
- [
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
- [x]
|
|
450
|
-
- [x]
|
|
451
|
-
- [x]
|
|
452
|
-
- [
|
|
453
|
-
- [
|
|
454
|
-
- [
|
|
455
|
-
- [
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
- [x]
|
|
462
|
-
- [x]
|
|
463
|
-
- [x]
|
|
464
|
-
- [
|
|
465
|
-
- [
|
|
466
|
-
- [
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
- [
|
|
471
|
-
- [
|
|
472
|
-
- [
|
|
473
|
-
|
|
474
|
-
### ✅ Fase
|
|
475
|
-
|
|
476
|
-
- [x]
|
|
477
|
-
- [x]
|
|
478
|
-
- [x]
|
|
479
|
-
- [x]
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
- [
|
|
484
|
-
- [
|
|
485
|
-
- [
|
|
486
|
-
- [
|
|
487
|
-
- [ ] **
|
|
488
|
-
- [ ] **
|
|
489
|
-
- [ ] **
|
|
490
|
-
|
|
491
|
-
###
|
|
492
|
-
|
|
493
|
-
- [x]
|
|
494
|
-
- [x]
|
|
495
|
-
- [
|
|
496
|
-
- [
|
|
497
|
-
- [
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
- [
|
|
502
|
-
- [
|
|
503
|
-
- [
|
|
504
|
-
- [
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
- [ ]
|
|
509
|
-
- [ ]
|
|
510
|
-
- [ ]
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
- [
|
|
517
|
-
- [
|
|
518
|
-
- [
|
|
519
|
-
- [ ]
|
|
520
|
-
|
|
521
|
-
**
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
-
|
|
540
|
-
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
-
|
|
580
|
-
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
---
|
|
615
|
-
|
|
616
|
-
##
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<img src="media/ansimax.png" alt="Logo de Ansimax" width="380"/>
|
|
4
|
+
|
|
5
|
+
### La librería definitiva de renderizado CLI para Node.js
|
|
6
|
+
|
|
7
|
+
_Colores • Gradientes • Animaciones • ASCII Art • Pixel Art • Árboles • Componentes • Temas_
|
|
8
|
+
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](https://www.npmjs.com/package/ansimax)
|
|
11
|
+
[](tsconfig.json)
|
|
12
|
+
[](#testing)
|
|
13
|
+
[](#testing)
|
|
14
|
+
[](#)
|
|
15
|
+
[](#)
|
|
16
|
+
|
|
17
|
+
[English](README.md) · **Español**
|
|
18
|
+
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
<div align="center">
|
|
24
|
+
|
|
25
|
+
### 🎬 Vista previa
|
|
26
|
+
|
|
27
|
+
<table>
|
|
28
|
+
<tr>
|
|
29
|
+
<td align="center">
|
|
30
|
+
<strong>Animaciones</strong><br/>
|
|
31
|
+
<img src="media/animations.gif" alt="Demo de animaciones de Ansimax" width="420"/>
|
|
32
|
+
</td>
|
|
33
|
+
<td align="center">
|
|
34
|
+
<strong>Loaders</strong><br/>
|
|
35
|
+
<img src="media/loaders.gif" alt="Demo de loaders de Ansimax" width="420"/>
|
|
36
|
+
</td>
|
|
37
|
+
</tr>
|
|
38
|
+
</table>
|
|
39
|
+
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 🌟 ¿Qué es Ansimax?
|
|
45
|
+
|
|
46
|
+
Ansimax es una **librería de renderizado todo-en-uno** para construir interfaces de terminal hermosas en Node.js. Un solo paquete reemplaza un stack de más de 8 dependencias — colores, gradientes, ASCII art, spinners, barras de progreso, tablas, menús, árboles, temas, pixel art — combinadas en una única API coherente de TypeScript con **cero dependencias en runtime**.
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npm install ansimax
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import { color, gradient, ascii, loader } from 'ansimax';
|
|
54
|
+
|
|
55
|
+
console.log(ascii.banner('hola', {
|
|
56
|
+
colorFn: (t) => gradient(t, ['#ff79c6', '#bd93f9', '#8be9fd']),
|
|
57
|
+
}));
|
|
58
|
+
|
|
59
|
+
const stop = loader.spin('Construyendo proyecto', { color: '#bd93f9' });
|
|
60
|
+
await algunaTareaAsync();
|
|
61
|
+
stop('Build completado', true);
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 💡 ¿Por qué Ansimax?
|
|
67
|
+
|
|
68
|
+
| Sin Ansimax | Con Ansimax |
|
|
69
|
+
|---|---|
|
|
70
|
+
| Instalar 8+ paquetes: `chalk`, `gradient-string`, `figlet`, `ora`, `cli-progress`, `cli-table3`, `boxen`, `inquirer` | Una sola instalación: `ansimax` |
|
|
71
|
+
| Mezclar APIs incompatibles, paradigmas diferentes, tipos en conflicto | API funcional consistente, fuente única de verdad |
|
|
72
|
+
| Sin sistema de temas coherente entre paquetes | Temas integrados (Dracula, Nord, Matrix, Cyberpunk, +5) |
|
|
73
|
+
| Limpieza manual del cursor, sin protección ante crashes | Cursor con conteo de referencias + handlers de crash integrados |
|
|
74
|
+
| Sin soporte de `AbortSignal` en la mayoría de libs CLI | Toda animación, loader y prompt es abortable |
|
|
75
|
+
| Cada lib trae su propia lógica de fallback en runtime | `NO_COLOR` / `FORCE_COLOR` / detección de TTY unificada |
|
|
76
|
+
| Sin límites de memoria en cachés de color | Cachés LRU acotadas en todo el código (sin fugas bajo carga) |
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 🆚 Comparación con el ecosistema Node.js
|
|
81
|
+
|
|
82
|
+
Ansimax reemplaza un stack de dependencias de librerías populares de Node.js con un solo paquete coherente y tipado:
|
|
83
|
+
|
|
84
|
+
| Característica | chalk | gradient-string | ora | cli-progress | figlet | boxen | inquirer | cli-table3 | **Ansimax** |
|
|
85
|
+
|---|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|
|
86
|
+
| Colores básicos + 256 | ✅ | — | — | — | — | — | — | — | ✅ |
|
|
87
|
+
| Truecolor con fallback adaptativo | ✅ | ✅ | — | — | — | — | — | — | ✅ |
|
|
88
|
+
| Gradientes multi-stop | — | ✅ | — | — | — | — | — | — | ✅ |
|
|
89
|
+
| **Gradientes animados** | — | — | — | — | — | — | — | — | 🔜 |
|
|
90
|
+
| Banners ASCII | — | — | — | — | ✅ | — | — | — | ✅ |
|
|
91
|
+
| Registro de fuentes personalizadas | — | — | — | — | parcial | — | — | — | ✅ |
|
|
92
|
+
| Cajas con múltiples estilos | — | — | — | — | — | ✅ | — | — | ✅ |
|
|
93
|
+
| Spinners (varios estilos) | — | — | ✅ | — | — | — | — | — | ✅ (11 estilos) |
|
|
94
|
+
| Barras de progreso animadas | — | — | — | ✅ | — | — | — | — | ✅ |
|
|
95
|
+
| **Tareas jerárquicas/paralelas** | — | — | — | — | — | — | — | — | ✅ |
|
|
96
|
+
| Tablas (multi-línea, conscientes de ANSI) | — | — | — | — | — | — | — | ✅ | ✅ |
|
|
97
|
+
| Menús interactivos + multi-select | — | — | — | — | — | — | ✅ | — | ✅ |
|
|
98
|
+
| **Árboles con detección de ciclos** | — | — | — | — | — | — | — | — | ✅ |
|
|
99
|
+
| **Pixel art + canvas + sprites** | — | — | — | — | — | — | — | — | ✅ |
|
|
100
|
+
| **Sistema de temas + aislamiento por instancia** | — | — | — | — | — | — | — | — | ✅ |
|
|
101
|
+
| `AbortSignal` en todas partes | — | — | parcial | — | — | — | parcial | — | ✅ |
|
|
102
|
+
| Soporte de `NO_COLOR` | ✅ | parcial | parcial | — | — | — | — | — | ✅ |
|
|
103
|
+
| TypeScript-first | parcial | parcial | ✅ | parcial | parcial | ✅ | parcial | parcial | ✅ |
|
|
104
|
+
| Cero dependencias en runtime | ✅ | — | — | — | — | — | — | — | ✅ |
|
|
105
|
+
| **Tamaño total de instalación** | pequeño | pequeño | medio | medio | medio | pequeño | grande | medio | **< 100 KB** |
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 📦 Instalación
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
npm install ansimax
|
|
113
|
+
# o
|
|
114
|
+
pnpm add ansimax
|
|
115
|
+
# o
|
|
116
|
+
yarn add ansimax
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Requisitos:** Node.js ≥ 18. Soporta ESM y CJS. Los ejemplos se publican junto con el paquete — ver [`/examples`](./examples).
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## ⚡ Ejemplo en 30 segundos
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
import { color, gradient, loader, ascii } from 'ansimax';
|
|
127
|
+
|
|
128
|
+
console.log(ascii.banner('deploy', {
|
|
129
|
+
colorFn: (t) => gradient(t, ['#ff6b6b', '#feca57', '#48dbfb']),
|
|
130
|
+
}));
|
|
131
|
+
|
|
132
|
+
const stop = loader.spin('Construyendo proyecto', { color: '#bd93f9' });
|
|
133
|
+
await algunaTareaAsync();
|
|
134
|
+
stop('Build completado', true); // ✓ + color de éxito
|
|
135
|
+
|
|
136
|
+
console.log(color.green('✓') + ' Listo en ' + color.bold('1.4s'));
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 🚀 Inicio rápido
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
import { configure, color, themes, gradient } from 'ansimax';
|
|
145
|
+
|
|
146
|
+
// Configuración global
|
|
147
|
+
configure({ theme: 'dracula', animationSpeed: 'normal' });
|
|
148
|
+
|
|
149
|
+
// Estilos básicos
|
|
150
|
+
console.log(color.red('error'));
|
|
151
|
+
console.log(color.bold(color.cyan('importante')));
|
|
152
|
+
|
|
153
|
+
// Gradiente multi-stop
|
|
154
|
+
console.log(gradient('texto arcoiris', [
|
|
155
|
+
'#ff5555', '#ffaa00', '#ffff00',
|
|
156
|
+
'#00ff00', '#0099ff', '#cc44ff',
|
|
157
|
+
]));
|
|
158
|
+
|
|
159
|
+
// Cambiar tema — dispara los subscribers
|
|
160
|
+
themes.use('cyberpunk');
|
|
161
|
+
console.log(themes.primary('primary de cyberpunk'));
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## ✨ Características
|
|
167
|
+
|
|
168
|
+
- 🎨 **Colores** — Truecolor / 256 / básico con fallback adaptativo. Detección de NO_COLOR / FORCE_COLOR / TTY
|
|
169
|
+
- 🌈 **Gradientes** — Lineales multi-stop, radiales, diagonales, ángulo arbitrario. Presets personalizados vía `registerPreset`
|
|
170
|
+
- 🔠 **ASCII Art** — Banners (fuentes `big`/`small`), cajas (6 estilos), divisores, logos. API de stream + registro de fuentes
|
|
171
|
+
- 🖼️ **Pixel Art** — Sprites, alpha blending, gradientes con dithering, canvas con renderizado dirty-rect, modo braille (sub-pixel 2×4)
|
|
172
|
+
- 🌳 **Árboles** — API builder + data plana, 4 estilos, colores/iconos por nodo, max-depth, detección de ciclos, algoritmos walk/find/map/filter
|
|
173
|
+
- 🎞️ **Animaciones** — Typewriter, fade, slide, pulse, wave, glitch, reveal. Conscientes de AbortSignal, modo reducedMotion
|
|
174
|
+
- ⏳ **Loaders** — 11 estilos de spinner, barras animadas, tareas jerárquicas/paralelas, cuentas regresivas, gestor multi-spinner
|
|
175
|
+
- 🎬 **Frames** — Reproducción secuenciada con pause/resume/seek, renderizador live push-based, timing con corrección de drift, morph
|
|
176
|
+
- 🧱 **Componentes** — Tablas (conscientes de ANSI, celdas multi-línea), badges, líneas de estado, secciones, columnas, timelines, menús interactivos
|
|
177
|
+
- 🎨 **Temas** — 8 built-in (Dracula, Nord, Monokai, Cyberpunk, Pastel, Matrix, Ocean, Sunset). Aislamiento por instancia, listeners `onChange`, helpers `bg*`
|
|
178
|
+
- ⚙️ **Configure** — Config centralizada con subscribers, updates batched, overrides temporales con `withConfig()`, modo strict
|
|
179
|
+
- 🛠️ **Utils** — Primitivas ANSI, control del cursor, hyperlinks de terminal (OSC 8), `setTitle`, `safeJson`, `onResize`, debounce/throttle/memoize
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 📸 Showcase
|
|
184
|
+
|
|
185
|
+
### Colores y Gradientes
|
|
186
|
+
|
|
187
|
+
<img src="media/colors.png" alt="Colores y gradientes" />
|
|
188
|
+
|
|
189
|
+
```ts
|
|
190
|
+
import { color, gradient } from 'ansimax';
|
|
191
|
+
|
|
192
|
+
color.red('rojo'); color.green('verde'); color.blue('azul');
|
|
193
|
+
color.bold(texto); color.italic(texto); color.underline(texto);
|
|
194
|
+
gradient('fuego a océano', ['#ff6b6b', '#feca57', '#48dbfb']);
|
|
195
|
+
color.rainbow('preset rainbow integrado');
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### ASCII Art
|
|
199
|
+
|
|
200
|
+
<img src="media/ascii_art.png" alt="ASCII art" />
|
|
201
|
+
|
|
202
|
+
```ts
|
|
203
|
+
import { ascii, gradient } from 'ansimax';
|
|
204
|
+
|
|
205
|
+
ascii.banner('HOLA', {
|
|
206
|
+
font: 'big',
|
|
207
|
+
align: 'center',
|
|
208
|
+
colorFn: (t) => gradient(t, ['#ff79c6', '#bd93f9']),
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
ascii.box('¡Caja arcoiris!', { padding: 1, borderStyle: 'rounded' });
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Árboles
|
|
215
|
+
|
|
216
|
+
<img src="media/trees.png" alt="Árboles" />
|
|
217
|
+
|
|
218
|
+
```ts
|
|
219
|
+
import { tree, color } from 'ansimax';
|
|
220
|
+
|
|
221
|
+
const proyecto = tree({ label: 'mi-app', icon: '📦', color: color.bold });
|
|
222
|
+
const src = proyecto.add({ label: 'src', icon: '📁' });
|
|
223
|
+
src.addLeaf({ label: 'index.ts', icon: '📄' });
|
|
224
|
+
src.addLeaf({ label: 'app.ts', icon: '📄' });
|
|
225
|
+
|
|
226
|
+
console.log(proyecto.render({
|
|
227
|
+
style: 'rounded',
|
|
228
|
+
palette: [color.cyan, color.green, color.magenta],
|
|
229
|
+
guideColor: color.dim,
|
|
230
|
+
}));
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Pixel Art y Canvas
|
|
234
|
+
|
|
235
|
+
<img src="media/pixel_art.png" alt="Pixel art" />
|
|
236
|
+
|
|
237
|
+
```ts
|
|
238
|
+
import { images, createCanvas, gradientRect } from 'ansimax';
|
|
239
|
+
|
|
240
|
+
// Sprite integrado
|
|
241
|
+
console.log(images.sprite('heart'));
|
|
242
|
+
|
|
243
|
+
// Gradiente suave con dither Bayer
|
|
244
|
+
console.log(gradientRect({
|
|
245
|
+
width: 50, height: 4,
|
|
246
|
+
colors: ['#ff6b6b', '#feca57', '#48dbfb'],
|
|
247
|
+
dither: 'bayer',
|
|
248
|
+
}));
|
|
249
|
+
|
|
250
|
+
// Canvas personalizado
|
|
251
|
+
const c = createCanvas(40, 10);
|
|
252
|
+
c.fill({ r: 18, g: 18, b: 38 });
|
|
253
|
+
c.drawCircle(20, 5, 4, { r: 255, g: 200, b: 0 }, true);
|
|
254
|
+
c.drawSprite(2, 2, images.sprites.star!.pixels);
|
|
255
|
+
c.print();
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Componentes
|
|
259
|
+
|
|
260
|
+
<img src="media/components.png" alt="Componentes" />
|
|
261
|
+
|
|
262
|
+
```ts
|
|
263
|
+
import { components, color } from 'ansimax';
|
|
264
|
+
|
|
265
|
+
components.table([
|
|
266
|
+
['Módulo', 'Estado', 'Cobertura'],
|
|
267
|
+
['colors', color.green('● listo'), '100%'],
|
|
268
|
+
['animations', color.green('● listo'), '100%'],
|
|
269
|
+
['loaders', color.green('● listo'), '100%'],
|
|
270
|
+
], { borderStyle: 'rounded' });
|
|
271
|
+
|
|
272
|
+
components.badge('VERSION', 'v1.1.1');
|
|
273
|
+
components.badge('BUILD', 'passing');
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Timeline
|
|
277
|
+
|
|
278
|
+
<img src="media/timeline.png" alt="Timeline" />
|
|
279
|
+
|
|
280
|
+
```ts
|
|
281
|
+
components.timeline([
|
|
282
|
+
{ label: 'Init del proyecto', done: true, time: '10:00' },
|
|
283
|
+
{ label: 'Pipeline de build', done: true, time: '10:15' },
|
|
284
|
+
{ label: 'Correr tests', done: false, time: '10:32' },
|
|
285
|
+
{ label: 'Deploy a npm', done: false },
|
|
286
|
+
]);
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### Loaders y Progreso
|
|
290
|
+
|
|
291
|
+
```ts
|
|
292
|
+
import { loader } from 'ansimax';
|
|
293
|
+
|
|
294
|
+
// Spinner con éxito/fallo
|
|
295
|
+
const stop = loader.spin('Cargando...', { color: '#bd93f9' });
|
|
296
|
+
await tarea();
|
|
297
|
+
stop('¡Listo!', true); // ✓ ícono verde
|
|
298
|
+
|
|
299
|
+
// Barra de progreso animada
|
|
300
|
+
await loader.progressAnimate(100, 'Descargando', {
|
|
301
|
+
color: '#50fa7b', delay: 25,
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
// Tareas jerárquicas con ejecución paralela
|
|
305
|
+
await loader.tasks([
|
|
306
|
+
{ text: 'Build', fn: async () => build(), subtasks: [
|
|
307
|
+
{ text: 'TypeScript', fn: async () => tsc() },
|
|
308
|
+
{ text: 'Bundle', fn: async () => bundle() },
|
|
309
|
+
]},
|
|
310
|
+
{ text: 'Test', fn: async () => test() },
|
|
311
|
+
], { parallel: true });
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### Animaciones
|
|
315
|
+
|
|
316
|
+
```ts
|
|
317
|
+
import { animate, gradient } from 'ansimax';
|
|
318
|
+
|
|
319
|
+
await animate.typewriter('Bienvenido al wizard de deployment...', {
|
|
320
|
+
speed: 30,
|
|
321
|
+
colorFn: (t) => gradient(t, ['#bd93f9', '#ff79c6']),
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
await animate.fadeIn('Carga completa', { duration: 600 });
|
|
325
|
+
|
|
326
|
+
// Carrera de pasos contra timeout — nunca se cuelga
|
|
327
|
+
await animate.parallel([
|
|
328
|
+
async () => await checkNetwork(),
|
|
329
|
+
async () => await checkDatabase(),
|
|
330
|
+
async () => await checkAuth(),
|
|
331
|
+
], { timeout: 5000 });
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Temas
|
|
335
|
+
|
|
336
|
+
<img src="media/themes.png" alt="Temas" />
|
|
337
|
+
|
|
338
|
+
```ts
|
|
339
|
+
import { themes, createTheme } from 'ansimax';
|
|
340
|
+
|
|
341
|
+
// Temas built-in
|
|
342
|
+
themes.use('dracula');
|
|
343
|
+
themes.primary('hola');
|
|
344
|
+
|
|
345
|
+
// Escuchar cambios
|
|
346
|
+
const off = themes.onChange((nuevo, anterior) => {
|
|
347
|
+
console.log(`Tema: ${anterior.name} → ${nuevo.name}`);
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
// Multi-tenant: cada instancia totalmente aislada
|
|
351
|
+
const tenantA = createTheme('nord');
|
|
352
|
+
const tenantB = createTheme('matrix');
|
|
353
|
+
tenantA.register('custom', miDef); // no se filtra a tenantB
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## 📚 Ejemplos
|
|
359
|
+
|
|
360
|
+
Once ejemplos de calidad de producción se publican en el paquete npm y son ejecutables directamente. Los encuentras en [`/examples`](./examples) después de instalar:
|
|
361
|
+
|
|
362
|
+
| Archivo | Qué demuestra |
|
|
363
|
+
|---|---|
|
|
364
|
+
| `01-quick-smoke.ts` | Test rápido de humo — verifica que cada import principal funciona |
|
|
365
|
+
| `02-colors-gradients.ts` | Toda función de color, tipos de gradiente, presets, compose, API chain |
|
|
366
|
+
| `03-ascii-banners.ts` | Banners (`big`/`small`), 6 estilos de caja, divisores, compositor de logos |
|
|
367
|
+
| `04-trees.ts` | Tree builder + API data-plana, 4 estilos, palettes, algoritmos (walk/find/map/filter) |
|
|
368
|
+
| `05-components.ts` | Tablas, badges, status, secciones, columnas, timelines, barras de progreso |
|
|
369
|
+
| `06-pixel-art.ts` | Sprites, canvas personalizado, gradient rects con dither, transforms (flip/rotate) |
|
|
370
|
+
| `07-animations.ts` | typewriter, fadeIn/Out, slide, pulse, wave, glitch, reveal |
|
|
371
|
+
| `08-loaders.ts` | Estilos de spinner, progreso animado, tareas jerárquicas, cuenta regresiva |
|
|
372
|
+
| `09-themes.ts` | Los 8 temas integrados, listeners, registro de temas personalizados, aislamiento por instancia |
|
|
373
|
+
| `10-everything.ts` | Showcase completo — cada módulo ejercitado en un demo cohesivo |
|
|
374
|
+
| `all-in-one.mjs` | Demo completo en **ESM** (JS puro con `import`) — sin necesidad de TypeScript |
|
|
375
|
+
| `all-in-one.cjs` | Demo completo en **CommonJS** (JS puro con `require`) — sin necesidad de TypeScript |
|
|
376
|
+
|
|
377
|
+
Ejecuta cualquier ejemplo con:
|
|
378
|
+
```bash
|
|
379
|
+
# Ejemplos en TypeScript
|
|
380
|
+
npx tsx examples/10-everything.ts
|
|
381
|
+
|
|
382
|
+
# JS puro — ESM
|
|
383
|
+
node examples/all-in-one.mjs
|
|
384
|
+
|
|
385
|
+
# JS puro — CommonJS
|
|
386
|
+
node examples/all-in-one.cjs
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
## 🎯 Casos de uso
|
|
392
|
+
|
|
393
|
+
- **Instaladores y scaffolders CLI** — hermosa experiencia de primer arranque (estilo create-react-app, create-next-app)
|
|
394
|
+
- **Herramientas DevOps** — dashboards de deployment, pipelines de build, monitores de salud
|
|
395
|
+
- **Dev experience** — mejores test runners, output de lint, formateo de errores
|
|
396
|
+
- **Prompts interactivos** — menús, confirmaciones, wizards multi-select
|
|
397
|
+
- **Exploración de datos** — tablas, árboles, charts para workflows terminal-first
|
|
398
|
+
- **Reportes de estado** — progreso en tiempo real, orquestación multi-tarea
|
|
399
|
+
- **Intros ASCII** — launchers de juego, splash screens, banners de login
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## ⚙️ Configuración
|
|
404
|
+
|
|
405
|
+
La config global afecta cada módulo que la respeta (colores, temas, velocidad de animación, etc.):
|
|
406
|
+
|
|
407
|
+
```ts
|
|
408
|
+
import { configure, getConfig, withConfig, onConfigKeyChange } from 'ansimax';
|
|
409
|
+
|
|
410
|
+
configure({
|
|
411
|
+
colorMode: 'auto', // 'none' | 'basic' | '256' | 'truecolor' | 'auto'
|
|
412
|
+
animationSpeed: 'normal', // 'slow' | 'normal' | 'fast' | 'instant'
|
|
413
|
+
theme: 'dracula', // cualquier tema registrado
|
|
414
|
+
reducedMotion: false,
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
// Escuchar cambios (por-key — evita disparos excesivos)
|
|
418
|
+
const off = onConfigKeyChange('theme', (nuevo, anterior) => {
|
|
419
|
+
console.log(`Tema: ${anterior} → ${nuevo}`);
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
// Override temporal + restauración automática al completar o lanzar
|
|
423
|
+
await withConfig({ animationSpeed: 'fast' }, async () => {
|
|
424
|
+
await correrDemo();
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
// Modo strict captura typos en config
|
|
428
|
+
configure({ unknwnKey: 'x' }, { strict: true }); // lanza RangeError
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
---
|
|
432
|
+
|
|
433
|
+
## 🛣️ Roadmap
|
|
434
|
+
|
|
435
|
+
Ansimax se está construyendo hacia una **plataforma completa de renderizado de terminal** — una respuesta nativa de Node a lo que los desarrolladores de Python obtienen de `rich` + `textual` combinados, con mejoras específicas de Node donde importa.
|
|
436
|
+
|
|
437
|
+
El roadmap apunta intencionalmente — y busca superar — gaps que ni siquiera librerías TUI maduras de Python han resuelto completamente: renderers live-diff, gradientes animados, protocolos de imágenes en terminal, y una verdadera capa reactiva.
|
|
438
|
+
|
|
439
|
+
### ✅ Fase 1 — Fundamento core
|
|
440
|
+
- [x] Motor de estilos — ANSI 16 / 256 / truecolor con fallback adaptativo
|
|
441
|
+
- [x] Helpers Hex + RGB con clamping y validación
|
|
442
|
+
- [x] Soporte `NO_COLOR` / `FORCE_COLOR` + auto-detección no-TTY
|
|
443
|
+
- [x] Integración de `AbortSignal` en animaciones y loaders
|
|
444
|
+
- [x] Stacking de estilos `compose()` con emisión single-reset
|
|
445
|
+
- [x] Caché LRU acotada de escapes (512 entradas, key packed-RGB)
|
|
446
|
+
- [x] Registro de presets personalizados (`registerPreset`, `listPresets`)
|
|
447
|
+
|
|
448
|
+
### ✅ Fase 2 — Motor de gradientes
|
|
449
|
+
- [x] Gradientes lineales (multi-stop)
|
|
450
|
+
- [x] Rainbow + 6 presets built-in
|
|
451
|
+
- [x] Gradientes radiales (en `gradientRect`)
|
|
452
|
+
- [x] Gradientes diagonales
|
|
453
|
+
- [x] Gradientes a ángulo arbitrario
|
|
454
|
+
- [x] Dithering Bayer 4×4 para transiciones tonales suaves
|
|
455
|
+
- [x] UX single-stop (comportamiento estilo CSS)
|
|
456
|
+
- [ ] **Gradientes animados** (flujo de color en el tiempo, loops infinitos)
|
|
457
|
+
- [ ] **Curvas de interpolación** (linear / ease-in / ease-out / cubic-bezier)
|
|
458
|
+
- [ ] **Gradientes cónicos** (barrido radial)
|
|
459
|
+
|
|
460
|
+
### 🟡 Fase 3 — Motor ASCII
|
|
461
|
+
- [x] Fuentes de bloque (`big`, `small`)
|
|
462
|
+
- [x] Banner con gradiente + alineación + coloreado por carácter
|
|
463
|
+
- [x] Dibujo de cajas (6 estilos de borde)
|
|
464
|
+
- [x] Divisores con variantes de estilo
|
|
465
|
+
- [x] Compositor de logos (gradiente + box wrapping)
|
|
466
|
+
- [x] Registro de fuentes personalizadas (`registerFont`, `hasFont`, `listFonts`)
|
|
467
|
+
- [x] API de stream (`ascii.stream()` con AbortSignal)
|
|
468
|
+
- [ ] **Conversor Imagen → ASCII** (con detección de bordes, Sobel/Canny)
|
|
469
|
+
- [ ] **Renderizado ASCII en color** (preservar colores de imagen)
|
|
470
|
+
- [ ] **Dithering de imágenes** para mejor rango tonal (Floyd-Steinberg)
|
|
471
|
+
- [ ] **ASCII optimizado para rostros** (modo de alto detalle para retratos)
|
|
472
|
+
- [ ] **Soporte de fuentes figlet** (loader de archivos `.flf` — 250+ fuentes de comunidad)
|
|
473
|
+
|
|
474
|
+
### ✅ Fase 4 — Primitivas TUI
|
|
475
|
+
- [x] Tablas (filas irregulares, celdas multi-línea, conscientes de ANSI)
|
|
476
|
+
- [x] Cajas con múltiples estilos
|
|
477
|
+
- [x] Mensajes de estado + badges (con opción de borde)
|
|
478
|
+
- [x] Timelines con estados done/pending
|
|
479
|
+
- [x] Menús interactivos (single + multi-select)
|
|
480
|
+
- [x] Layout de columnas (overflow truncate/wrap)
|
|
481
|
+
- [x] Secciones (cabeceras con gradiente, ancho automático)
|
|
482
|
+
- [x] Árboles (colapsables, max-depth, cycle-safe)
|
|
483
|
+
- [ ] **Panels** (split layouts: hsplit, vsplit)
|
|
484
|
+
- [ ] **Layouts** (posicionamiento estilo flexbox)
|
|
485
|
+
- [ ] **Sistema de grid** (spans column/row inspirados en CSS Grid)
|
|
486
|
+
- [ ] **Renderizado de Markdown** (headings, listas, code blocks, tablas)
|
|
487
|
+
- [ ] **Syntax highlighting** (gramáticas integradas)
|
|
488
|
+
- [ ] **Pretty-printing JSON/YAML** (con límite de profundidad + collapse)
|
|
489
|
+
- [ ] **Integración de logging** (drop-in para `console`/`pino`/`winston`)
|
|
490
|
+
|
|
491
|
+
### ✅ Fase 5 — Control de cursor y pantalla
|
|
492
|
+
- [x] Visibilidad de cursor, save/restore, posicionamiento, navegación por líneas
|
|
493
|
+
- [x] Limpieza de pantalla (línea, área, completa)
|
|
494
|
+
- [x] Cursor con conteo de referencias (calls superpuestas son seguras)
|
|
495
|
+
- [x] Restauración crash-safe (handlers de exit/SIGINT/SIGTERM)
|
|
496
|
+
- [x] Hyperlinks de terminal (OSC 8)
|
|
497
|
+
- [x] Título de ventana (OSC 2)
|
|
498
|
+
- [x] Bell (BEL)
|
|
499
|
+
|
|
500
|
+
### ✅ Fase 6 — Motor de animaciones
|
|
501
|
+
- [x] Typewriter, fadeIn, fadeOut, slide, pulse, wave, glitch, reveal
|
|
502
|
+
- [x] Conscientes de `AbortSignal`
|
|
503
|
+
- [x] Modo `reducedMotion` para accesibilidad
|
|
504
|
+
- [x] Frame morph (interpolación texto → texto, descifrado cinematográfico)
|
|
505
|
+
- [x] `parallel()` con timeout
|
|
506
|
+
- [x] Propagación de signal a animaciones anidadas
|
|
507
|
+
- [ ] **Librería de funciones easing** (24 easings estándar: cubic, elastic, bounce, back)
|
|
508
|
+
- [ ] **Composición de animaciones** (DSL `parallel + sequence + delay`)
|
|
509
|
+
- [ ] **Animaciones con física de spring** (estilo `react-spring`)
|
|
510
|
+
- [ ] **Motor de tween** (interpolar cualquier tipo de valor)
|
|
511
|
+
|
|
512
|
+
### 🟡 Fase 7 — Ecosistema de progreso
|
|
513
|
+
- [x] Spinners (11 estilos) con color + AbortSignal
|
|
514
|
+
- [x] Barras de progreso animadas
|
|
515
|
+
- [x] Runners multi-tarea (secuencial + paralelo)
|
|
516
|
+
- [x] Cuentas regresivas
|
|
517
|
+
- [x] Manager multi-spinner (spinners concurrentes apilados)
|
|
518
|
+
- [x] Tareas jerárquicas (rollup padre + subtareas)
|
|
519
|
+
- [ ] **Estimación live de ETA** (rolling average + proyección con filtro de Kalman)
|
|
520
|
+
- [ ] **Refresh live con diff renderer** (sin flicker, solo redibujar líneas cambiadas)
|
|
521
|
+
- [ ] **Grupos de progreso** (grupos con nombre y tema compartido)
|
|
522
|
+
- [ ] **Medidores de throughput** (bytes/s, ops/s con unidades auto-escaladas)
|
|
523
|
+
|
|
524
|
+
### 🟡 Fase 8 — Detección de capacidades
|
|
525
|
+
- [x] Detección de TTY (auto-desactivar en pipes/CI)
|
|
526
|
+
- [x] Soporte de env `NO_COLOR` / `FORCE_COLOR`
|
|
527
|
+
- [x] Detección de profundidad de color (16 / 256 / truecolor)
|
|
528
|
+
- [x] Detección de proveedor CI (GitHub Actions, CircleCI, GitLab, Buildkite, Drone, Travis)
|
|
529
|
+
- [x] Detección de programa de terminal (iTerm, vscode, WezTerm, Hyper, Apple_Terminal)
|
|
530
|
+
- [x] Detección de Windows Terminal (`WT_SESSION`)
|
|
531
|
+
- [ ] **Detección de ancho Unicode** (CJK halfwidth/fullwidth, clusters de emoji, ZWJ)
|
|
532
|
+
- [ ] **Detección de protocolos de imagen** (Sixel, imágenes inline de iTerm, protocolo de Kitty)
|
|
533
|
+
- [ ] **Base de datos de capacidades de terminal** (flags xterm completos + probes de versión)
|
|
534
|
+
- [ ] **Detección de métricas de fuente** (ancho/alto de celda para layouts pixel-accurate)
|
|
535
|
+
|
|
536
|
+
### 🟡 Fase 9 — Renderizado avanzado
|
|
537
|
+
- [x] Canvas dirty-rectangle (solo redibujar píxeles cambiados)
|
|
538
|
+
- [x] Cachés LRU acotadas (escape sequences, render cache, ANSI cache)
|
|
539
|
+
- [x] Timing con corrección de drift (animaciones permanecen pegadas al reloj)
|
|
540
|
+
- [ ] **Diff renderer** (damage tracking a nivel de línea para UIs completas)
|
|
541
|
+
- [ ] **Buffer virtual** (componer UI sin escribir a stdout)
|
|
542
|
+
- [ ] **Z-index / layering** (overlapping de paneles con prioridad)
|
|
543
|
+
- [ ] **Soporte de eventos de mouse** (click, hover, drag, scroll)
|
|
544
|
+
- [ ] **Abstracción de eventos de teclado** (flechas, modificadores, secuencias, dead keys)
|
|
545
|
+
- [ ] **Framework TUI completo** (componentes reactivos — equivalente a Textual para Node)
|
|
546
|
+
|
|
547
|
+
### 🔴 Fase 10 — Charts de terminal
|
|
548
|
+
- [ ] Barras (horizontal + vertical, agrupadas, apiladas)
|
|
549
|
+
- [ ] Líneas (con braille para resolución sub-carácter)
|
|
550
|
+
- [ ] Sparklines (mini-charts inline para status bars)
|
|
551
|
+
- [ ] Áreas (rellenas con gradientes)
|
|
552
|
+
- [ ] Heatmaps (grids 2D color-mapped)
|
|
553
|
+
- [ ] Pie / donut (con etiquetas de porcentaje)
|
|
554
|
+
- [ ] Scatter plots
|
|
555
|
+
- [ ] Box plots / candlestick
|
|
556
|
+
- [ ] Charts en streaming en tiempo real (feed de datos con ventana móvil)
|
|
557
|
+
- [ ] **Compositor de plots** (dashboards multi-chart con ejes compartidos)
|
|
558
|
+
|
|
559
|
+
### 🔴 Fase 11 — Formularios e input
|
|
560
|
+
- [ ] Prompts de texto (con autocomplete + historial)
|
|
561
|
+
- [ ] Prompts de password (mascarados, medidor de fortaleza)
|
|
562
|
+
- [ ] Diálogos de confirmación (yes/no con highlight de default)
|
|
563
|
+
- [ ] Input numérico (con validación min/max)
|
|
564
|
+
- [ ] Pickers de fecha/hora (widget calendario)
|
|
565
|
+
- [ ] Picker de archivos (navegador de filesystem)
|
|
566
|
+
- [ ] Compositor de formularios (multi-campo con validación + display de errores)
|
|
567
|
+
- [ ] **Flujos de wizard** (formularios multi-paso con back/forward, indicador de progreso)
|
|
568
|
+
|
|
569
|
+
### 🔴 Fase 12 — Imagen y media
|
|
570
|
+
- [ ] Renderizado de imágenes Sixel (xterm, mlterm, WezTerm)
|
|
571
|
+
- [ ] Imágenes inline de iTerm2 (protocolo base64)
|
|
572
|
+
- [ ] Protocolo gráfico de Kitty
|
|
573
|
+
- [ ] PNG/JPEG → imagen de terminal (auto-detecta mejor protocolo)
|
|
574
|
+
- [ ] Preview de video (frame-por-frame a bajo FPS)
|
|
575
|
+
- [ ] Generación de códigos QR (con opciones de tamaño + nivel ECC)
|
|
576
|
+
- [ ] Generación de códigos de barras (Code 128, EAN-13)
|
|
577
|
+
|
|
578
|
+
### 🔴 Fase 13 — Sistema de plugins
|
|
579
|
+
- [ ] API de plugins para componentes personalizados
|
|
580
|
+
- [ ] Marketplace de temas
|
|
581
|
+
- [ ] Registro de fuentes personalizadas vía paquetes npm
|
|
582
|
+
- [ ] Registro de animaciones de la comunidad
|
|
583
|
+
- [ ] Interfaz de proveedor de capabilities (plug-in para detectores propios)
|
|
584
|
+
- [ ] Plugins de renderer (cambiar stdout por cualquier writable stream)
|
|
585
|
+
|
|
586
|
+
### 🔴 Fase 14 — Capa reactiva (framework TUI)
|
|
587
|
+
- [ ] **Ciclo de vida de componentes** (hooks mount/unmount/update)
|
|
588
|
+
- [ ] **Estado reactivo** (auto re-render al cambiar data, signals o hooks)
|
|
589
|
+
- [ ] **Diffing de Virtual DOM** (updates a nivel de línea)
|
|
590
|
+
- [ ] **Event bus** (comunicación entre componentes)
|
|
591
|
+
- [ ] **Loop de aplicación** (árbol de render único con ciclo de vida completo)
|
|
592
|
+
- [ ] **Routing** (apps multi-pantalla con historial)
|
|
593
|
+
- [ ] **Integración DevTools** (inspector de árbol de componentes, mark de nodos cambiados)
|
|
594
|
+
- [ ] **CSS-in-TS styling** (estilos con scope por componente)
|
|
595
|
+
|
|
596
|
+
**Leyenda:** ✅ Completo · 🟡 Parcial · 🔴 Planeado
|
|
597
|
+
|
|
598
|
+
---
|
|
599
|
+
|
|
600
|
+
## 🧪 Testing
|
|
601
|
+
|
|
602
|
+
```bash
|
|
603
|
+
npm test # Correr todos los 1700+ tests
|
|
604
|
+
npm run test:watch # Modo watch
|
|
605
|
+
npm run test:coverage # Reporte de cobertura
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
Targets de cobertura:
|
|
609
|
+
- Statements: **98%**
|
|
610
|
+
- Branches: **95%**
|
|
611
|
+
- Functions: **99%**
|
|
612
|
+
- Lines: **99%**
|
|
613
|
+
|
|
614
|
+
---
|
|
615
|
+
|
|
616
|
+
## 🛠️ Requisitos
|
|
617
|
+
|
|
618
|
+
- **Node.js** ≥ 18
|
|
619
|
+
- **TypeScript** ≥ 5.0 (para consumo tipado — opcional)
|
|
620
|
+
- **Terminal** con soporte truecolor recomendado (Windows Terminal, iTerm2, WezTerm, Kitty, xterm moderno). Degrada gracefully a 256 / 16 / sin-color.
|
|
621
|
+
|
|
622
|
+
---
|
|
623
|
+
|
|
624
|
+
## 🏗️ Estructura del proyecto
|
|
625
|
+
|
|
626
|
+
```
|
|
627
|
+
ansimax/
|
|
628
|
+
├── src/
|
|
629
|
+
│ ├── colors/ Renderizado de color + motor de gradientes
|
|
630
|
+
│ ├── themes/ Sistema de temas + 8 built-ins
|
|
631
|
+
│ ├── ascii/ Banners, cajas, fuentes
|
|
632
|
+
│ ├── animations/ Typewriter, fade, slide, pulse, wave, glitch, reveal
|
|
633
|
+
│ ├── loaders/ Spinners, progreso, tareas, multi-loader
|
|
634
|
+
│ ├── frames/ Reproducción secuenciada + renderer live + morph
|
|
635
|
+
│ ├── components/ Tablas, badges, status, timelines, menús
|
|
636
|
+
│ ├── images/ Sprites, canvas, gradientes con dither
|
|
637
|
+
│ ├── trees/ Builder de árboles + algoritmos
|
|
638
|
+
│ ├── utils/ Primitivas ANSI + helpers
|
|
639
|
+
│ └── configure.ts Config global + subscribers
|
|
640
|
+
├── examples/ 10 ejemplos (TS) + 2 (JS — ESM y CJS) — todas las funciones cubiertas
|
|
641
|
+
└── __tests__/ 16 test suites, 1700+ tests
|
|
642
|
+
```
|
|
643
|
+
|
|
644
|
+
---
|
|
645
|
+
|
|
646
|
+
## 📝 Changelog
|
|
647
|
+
|
|
648
|
+
### v1.1.1 — Fixes de bugs + ejemplos limpios
|
|
649
|
+
|
|
650
|
+
Release patch que arregla dos bugs encontrados en testing real de v1.1.0, más una carpeta de ejemplos refrescada.
|
|
651
|
+
|
|
652
|
+
- 🐛 **Fix de crash en `box()`** con `padding: { x, y }` — ahora cae graciosamente al default para padding no-numérico (también maneja NaN, Infinity, strings)
|
|
653
|
+
- 🐛 **Fix de leak de cursor en `components.menu()`** al salir abruptamente (Ctrl+C, SIGTERM) — handlers de cleanup de emergencia ahora restauran el cursor incluso cuando el proceso se mata mid-menu
|
|
654
|
+
- 📚 **Nuevos ejemplos** — 10 ejemplos en TypeScript + 2 variantes en JS puro (`all-in-one.mjs` para ESM, `all-in-one.cjs` para CommonJS)
|
|
655
|
+
- 📖 **READMEs actualizados** — GIFs de preview en el header, GIF de showcase completo en el footer
|
|
656
|
+
|
|
657
|
+
Sin cambios en la API — drop-in replacement para `1.1.0`.
|
|
658
|
+
|
|
659
|
+
### v1.1.0 — Hardening exhaustivo + nuevas features
|
|
660
|
+
|
|
661
|
+
Una pasada masiva de robustez sobre todo módulo, más un nuevo módulo `trees`. **100% retrocompatible** — toda API existente funciona idéntica.
|
|
662
|
+
|
|
663
|
+
**Highlights:**
|
|
664
|
+
|
|
665
|
+
- 🌳 **Nuevo módulo `trees`** — API builder + API data-plana, 4 estilos, detección de ciclos, algoritmos (`walk`, `find`, `count`, `map`, `filter`)
|
|
666
|
+
- ⚙️ **Mejoras de `configure.ts`** — `onConfigKeyChange`, `pauseListeners` / `resumeListeners`, `withConfig()`, modo strict
|
|
667
|
+
- 🎨 **Themes** — aislamiento por instancia (multi-tenant safe), `tryUse`, listeners `onChange`, `unregister`, helpers `bg*`, accesor dinámico `style(name)`
|
|
668
|
+
- 🌈 **Colors** — `registerPreset` / `listPresets`, caché LRU acotada, RGB safe ante NaN/Infinity, UX de gradient single-stop
|
|
669
|
+
- 🖼️ **Images** — `Pixel` / `PixelGrid` exportados, deep-clone en `canvas.pixels`, coords defensivas, caché ANSI LRU acotada
|
|
670
|
+
- 🔠 **ASCII** — `hasFont`, `measure`, `stream` con AbortSignal, grapheme-aware
|
|
671
|
+
- 🎞️ **Frames** — cursor con conteo de refs, restauración crash-safe, `repeat: 0` = infinito, fps cap a 60, corrección de drift
|
|
672
|
+
- 🧱 **Components** — `menu([])` retorna `MENU_CANCELLED` (no throw), inputs numéricos defensivos en todas partes
|
|
673
|
+
- 🛠️ **Utils** — `setTitle`, `link` (hyperlinks OSC 8), `bell`, `safeJson` (BigInt + circular), `once`, `escapeRegex`, `padBoth`, `nextTick`, `memoize` con keyFn personalizado, `debounce` con `maxWait`, `onResize` con throttle
|
|
674
|
+
- 🧪 **Tests** — ~1700+ tests en 16 suites, todos verdes, ~98% de cobertura
|
|
675
|
+
|
|
676
|
+
Ver [CHANGELOG.md](CHANGELOG.md) para el historial completo de versiones con desglose por módulo.
|
|
677
|
+
|
|
678
|
+
### v1.0.0 — Release inicial
|
|
679
|
+
|
|
680
|
+
- Módulos core: `color`, `animate`, `ascii`, `loader`, `frames`, `components`, `themes`, `images`, `configure`
|
|
681
|
+
- Tipos TypeScript exportados, build dual ESM + CJS
|
|
682
|
+
- Renderizado de color adaptativo (detección NO_COLOR / FORCE_COLOR / TTY)
|
|
683
|
+
- Soporte de `AbortSignal` en todas las APIs bloqueantes
|
|
684
|
+
- 750+ tests, 85%+ cobertura
|
|
685
|
+
|
|
686
|
+
---
|
|
687
|
+
|
|
688
|
+
## 🤝 Contribuir
|
|
689
|
+
|
|
690
|
+
¡Las contribuciones son bienvenidas! Áreas donde la ayuda es especialmente apreciada:
|
|
691
|
+
|
|
692
|
+
- Nuevos presets de animación (easings, física spring)
|
|
693
|
+
- Fuentes ASCII adicionales (parser de figlet `.flf`)
|
|
694
|
+
- Entradas en la base de capacidades de terminal
|
|
695
|
+
- Traducciones (fr, de, ja, ...)
|
|
696
|
+
- Apps de ejemplo del mundo real
|
|
697
|
+
- Implementaciones de charts (Fase 10)
|
|
698
|
+
|
|
699
|
+
Por favor lee [CONTRIBUTING.md](.github/CONTRIBUTING.md) para las guías.
|
|
700
|
+
|
|
701
|
+
---
|
|
702
|
+
|
|
703
|
+
## 🐛 Reportar issues
|
|
704
|
+
|
|
705
|
+
¿Encontraste un bug? ¿Tienes una sugerencia? [Abre un issue](https://github.com/Brashkie/ansimax/issues/new).
|
|
706
|
+
|
|
707
|
+
Para divulgaciones de seguridad, envía un email a [security@brashkie.dev](mailto:security@brashkie.dev) en lugar de abrir un issue público.
|
|
708
|
+
|
|
709
|
+
---
|
|
710
|
+
|
|
711
|
+
## ⭐ Apoyo
|
|
712
|
+
|
|
713
|
+
Si Ansimax te ahorra tiempo, por favor dale estrella al repo en [GitHub](https://github.com/Brashkie/ansimax) — ayuda al proyecto a crecer y acelera el roadmap.
|
|
714
|
+
|
|
715
|
+
---
|
|
716
|
+
|
|
717
|
+
## 👨💻 Autor
|
|
718
|
+
|
|
719
|
+
**Brashkie** · [@Brashkie](https://github.com/Brashkie)
|
|
720
|
+
|
|
721
|
+
---
|
|
722
|
+
|
|
723
|
+
## 🎬 Showcase completo
|
|
724
|
+
|
|
725
|
+
<div align="center">
|
|
726
|
+
|
|
727
|
+
<img src="media/all-ansimax.gif" alt="Showcase completo de Ansimax — todo en acción" width="720"/>
|
|
728
|
+
|
|
729
|
+
_Todas las funciones en acción — typewriter, gradientes, banners ASCII, árboles, tablas, spinners, temas y pixel art_
|
|
730
|
+
|
|
731
|
+
</div>
|
|
732
|
+
|
|
733
|
+
---
|
|
734
|
+
|
|
735
|
+
## 📜 Licencia
|
|
736
|
+
|
|
737
|
+
[Apache License 2.0](LICENSE) © 2026 Brashkie
|
|
738
|
+
|
|
739
|
+
Ansimax está licenciada bajo **Apache License, Version 2.0** — una licencia permisiva que permite uso comercial, modificación, distribución, e incluye un grant explícito de patentes. Ver el archivo [LICENSE](LICENSE) para el texto completo.
|
|
740
|
+
|
|
741
|
+
---
|
|
742
|
+
|
|
743
|
+
**Keywords:** cli, terminal, ansi, colors, gradients, animation, spinner, ascii, ascii-art, pixel-art, progress-bar, loader, components, table, banner, theme, tree, trees, tui, typescript, nodejs, zero-dependencies, chalk, ora, boxen, figlet, inquirer
|
|
744
|
+
|
|
745
|
+
---
|
|
746
|
+
|
|
747
|
+
<div align="center">
|
|
748
|
+
|
|
749
|
+
**Construido con ❤️ y TypeScript**
|
|
750
|
+
|
|
751
|
+
Si Ansimax te ayuda a hacer mejores CLIs, ¡dale ⭐ en [GitHub](https://github.com/Brashkie/ansimax)!
|
|
752
|
+
|
|
629
753
|
</div>
|