grmenu 4.1.0 → 5.0.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.
- checksums.yaml +4 -4
- data/README.md +186 -49
- data/data/colors.json +224 -44
- data/data/help.txt +223 -90
- data/data/themes/chromatic_red.gr +74 -0
- data/data/themes/cyberpunk.gr +18 -2
- data/data/themes/dracula.gr +18 -2
- data/data/themes/matrix.gr +18 -2
- data/data/themes/monokai.gr +18 -2
- data/data/themes/nord.gr +18 -2
- data/data/themes/sunset.gr +18 -2
- data/grmenu/animation.rb +139 -0
- data/grmenu/banner.rb +99 -0
- data/grmenu/color.rb +265 -0
- data/grmenu/image.rb +339 -0
- data/grmenu/interactive.rb +1002 -0
- data/grmenu/renderer.rb +865 -0
- data/grmenu/set_style.rb +312 -0
- data/grmenu/terminal.rb +189 -0
- data/grmenu/theme.rb +378 -0
- data/grmenu/version.rb +6 -0
- data/grmenu/widgets/checkbox.rb +291 -0
- data/grmenu/widgets/dialogs.rb +251 -0
- data/grmenu/widgets/form.rb +533 -0
- data/grmenu/widgets/input.rb +171 -0
- data/grmenu/widgets/modal.rb +209 -0
- data/grmenu/widgets/progress.rb +210 -0
- data/grmenu/widgets/slider.rb +178 -0
- data/grmenu/widgets/table.rb +291 -0
- data/grmenu/window.rb +187 -0
- data/grmenu.rb +88 -4339
- metadata +23 -3
- data/data/themes/neon_red.gr +0 -51
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a82f3307793b324fb6df221851dd339ab65db676a7750563ab6b53d0e896e5d4
|
|
4
|
+
data.tar.gz: 0c853fc6d074a65006937912dc24f0917ce9ae9cd3af3b026b2ae47082336645
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5fbf7e715f694d207ed59cc92d089bfc7e5960500e375125ab2b8c7012757f437521bc0bd338928596bec5d3d0251991b557ba87121a2ed65300b8d25f077cf0
|
|
7
|
+
data.tar.gz: b52ef0c04a2b5e90c334c4a7bc34d96eb542e1362be77b9d4a57c2beea8ad3481fa585fb23bed1da5be0f10caddcf359b7fdfaf4f57503cf09a65233927ee349
|
data/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# GRmenu (Ruby)
|
|
1
|
+
# GRmenu (Ruby) v5.0.0
|
|
2
2
|
|
|
3
3
|
**Suite TUI Profesional y Ligera para la Creación de Interfaces de Línea de Comandos en Terminales TTY.**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Formularios multi-campo interactivos con barrita de cursor `│`, ventanas modales flotantes 3D (`GRmenu.modal`), control de fondo de ventana (`GRmenu.window`) con auto-restauración limpia, menús interactivos por teclado y ratón (ANSI SGR 1006), submenús laterales en cascada (hasta 3 niveles: *Sub del Sub*), menús por pestañas multitarea (`GRmenu.tabs`), rediseño de entrada de datos (`GRmenu.input`), tablas con ordenamiento y búsqueda en vivo, selección múltiple con casillas de verificación, controles deslizantes en tiempo real, renderizado de imágenes ANSI TrueColor de 24 bits, sistema de temas estilo CSS `.gr`, iluminación dinámica Cromática a 30 FPS en vivo, colores hexadecimales directos (`#RRGGBB`), modales nativos de confirmación y texto, buscador instantáneo en vivo, cuadrículas bidimensionales, barras de progreso y banners 3D sin dependencias externas.
|
|
6
6
|
|
|
7
7
|
[](https://badge.fury.io/rb/grmenu)
|
|
8
8
|
[](LICENSE)
|
|
@@ -31,12 +31,15 @@ Menús interactivos por teclado y ratón (ANSI SGR 1006), submenús laterales en
|
|
|
31
31
|
- [10. Tarjetas Estilizadas y Alertas (GRmenu.card y GRmenu.alert)](#10-tarjetas-estilizadas-y-alertas-grmenucard-y-grmenualert)
|
|
32
32
|
- [11. Renderizado Universal de Imágenes en Terminal (GRmenu.image)](#11-renderizado-universal-de-imágenes-en-terminal-grmenuimage)
|
|
33
33
|
- [12. Barras de Progreso y Spinners de Carga](#12-barras-de-progreso-y-spinners-de-carga)
|
|
34
|
-
- [13. Iluminación Dinámica
|
|
34
|
+
- [13. Iluminación Dinámica Cromática a 30 FPS](#13-iluminación-dinámica-cromática-a-30-fps)
|
|
35
35
|
- [14. Banners ASCII 3D y Módulo de Color (Color / C)](#14-banners-ascii-3d-y-módulo-de-color)
|
|
36
36
|
- [15. Sistema de Temas .gr y CSS para TUI](#15-sistema-de-temas-gr-y-css-para-tui)
|
|
37
37
|
- [16. Exportación de Temas desde Terminal / CLI (-theme)](#16-exportación-de-temas-desde-terminal--cli--theme)
|
|
38
38
|
- [17. CSS Inline en el Código (<<-GR)](#17-css-inline-en-el-código--gr)
|
|
39
|
-
|
|
39
|
+
- [18. Formularios Multi-Campo Interactivos (GRmenu.form)](#18-formularios-multi-campo-interactivos-grmenuform)
|
|
40
|
+
- [19. Ventanas Modales Flotantes 3D (GRmenu.modal)](#19-ventanas-modales-flotantes-3d-grmenumodal)
|
|
41
|
+
- [20. Control de Color y Fondo de Terminal (GRmenu.window)](#20-control-de-color-y-fondo-de-terminal-grmenuwindow)
|
|
42
|
+
5. [Laboratorio de Nuevas Funcionalidades (ruby/j.rb, ruby/eaja.rb y ruby/e.rb)](#laboratorio-de-nuevas-funcionalidades)
|
|
40
43
|
6. [Catálogo Visual de Fuentes 3D (1 al 10)](#catálogo-visual-de-fuentes-3d)
|
|
41
44
|
7. [Catálogo Visual de Marcos y Bordes (1 al 20)](#catálogo-visual-de-marcos-y-bordes)
|
|
42
45
|
8. [Referencia Exhaustiva de la API de Ruby](#referencia-exhaustiva-de-la-api-de-ruby)
|
|
@@ -54,7 +57,7 @@ Menús interactivos por teclado y ratón (ANSI SGR 1006), submenús laterales en
|
|
|
54
57
|
- **Sistema de Temas CSS (.gr):** Diseña la estética visual de tu consola como si fuera una hoja de estilos web con bloques `<<menu`, `<<submenu`, `<<tabs`, `<<input`, `<<table`, `<<card`, `<<slider` y `<<checkbox`.
|
|
55
58
|
- **Firmas Flexibles en Todos los Widgets:** Acepta tanto llamadas clásicas posicionales como llamadas por palabra clave (`title:`, `headers:`, `rows:`, `pause: false`).
|
|
56
59
|
- **Colores Hexadecimales Directos:** Soporta valores `#FF0055`, `#00F5FF`, `#0FF` en cualquier marco, texto o banner con TrueColor de 24 bits nativo.
|
|
57
|
-
- **Animaciones
|
|
60
|
+
- **Animaciones Cromática a 30 FPS:** Olas de luz senoidal continuas y destellos de incandescencia en tiempo real sin introducir retraso en el teclado.
|
|
58
61
|
- **Modo TTY Crudo Instantáneo:** Control milimétrico de la consola sin parpadeo de pantalla y con captura instantánea de eventos de teclado (0 ms de latencia).
|
|
59
62
|
- **Multiplataforma Real:** Totalmente compatible con Linux, macOS y Windows (Windows Terminal, PowerShell, CMD y terminal de VS Code).
|
|
60
63
|
|
|
@@ -92,7 +95,7 @@ Crea un archivo llamado `app.rb` y ejecútalo con `ruby app.rb`:
|
|
|
92
95
|
require 'grmenu'
|
|
93
96
|
|
|
94
97
|
# Cargar un tema integrado con estética neón
|
|
95
|
-
GRmenu.theme(:
|
|
98
|
+
GRmenu.theme(:chromatic_red)
|
|
96
99
|
|
|
97
100
|
def saludar
|
|
98
101
|
GRmenu.alert(:success, "Bienvenido a GRmenu v4.1.0!")
|
|
@@ -246,7 +249,7 @@ tabs_data = {
|
|
|
246
249
|
["Redis Cache", -> { GRmenu.card("Redis", "Memoria: 14 MB", pause: false); sleep 1.2 }]
|
|
247
250
|
],
|
|
248
251
|
"Configuración" => [
|
|
249
|
-
["Cambiar Tema
|
|
252
|
+
["Cambiar Tema Cromático", -> { GRmenu.theme(:cyberpunk) }]
|
|
250
253
|
]
|
|
251
254
|
}
|
|
252
255
|
|
|
@@ -298,8 +301,8 @@ servidor = GRmenu.input(
|
|
|
298
301
|
label: "URL del Servidor:",
|
|
299
302
|
default: "http://localhost:8080",
|
|
300
303
|
style: 3,
|
|
301
|
-
border_color: "
|
|
302
|
-
title_color: "
|
|
304
|
+
border_color: "chromatic_cyan",
|
|
305
|
+
title_color: "chromatic_yellow",
|
|
303
306
|
label_color: "white"
|
|
304
307
|
)
|
|
305
308
|
|
|
@@ -309,7 +312,7 @@ token = GRmenu.input(
|
|
|
309
312
|
label: "Token Secreto:",
|
|
310
313
|
password: true,
|
|
311
314
|
style: 3,
|
|
312
|
-
border_color: "
|
|
315
|
+
border_color: "chromatic_red"
|
|
313
316
|
)
|
|
314
317
|
|
|
315
318
|
# Uso rápido posicional
|
|
@@ -335,7 +338,7 @@ paquetes = [
|
|
|
335
338
|
seleccionados = GRmenu.checkbox(
|
|
336
339
|
paquetes,
|
|
337
340
|
title: "Instalador de Paquetes",
|
|
338
|
-
color: "
|
|
341
|
+
color: "chromatic_cyan",
|
|
339
342
|
style: 3
|
|
340
343
|
)
|
|
341
344
|
|
|
@@ -377,7 +380,7 @@ ram = GRmenu.slider(
|
|
|
377
380
|
Cuadros emergentes Si / No con botones activos interactivos:
|
|
378
381
|
|
|
379
382
|
```ruby
|
|
380
|
-
if GRmenu.confirm("¿Deseas aplicar los cambios en producción?", default: true, color: "
|
|
383
|
+
if GRmenu.confirm("¿Deseas aplicar los cambios en producción?", default: true, color: "chromatic_green", style: 3)
|
|
381
384
|
puts "Aplicando..."
|
|
382
385
|
end
|
|
383
386
|
```
|
|
@@ -412,7 +415,7 @@ filas = [
|
|
|
412
415
|
]
|
|
413
416
|
|
|
414
417
|
# Llamada posicional
|
|
415
|
-
fila = GRmenu.table(headers, filas, style: 3, header_color: "
|
|
418
|
+
fila = GRmenu.table(headers, filas, style: 3, header_color: "chromatic_yellow")
|
|
416
419
|
|
|
417
420
|
# Llamada por palabra clave
|
|
418
421
|
fila = GRmenu.table(
|
|
@@ -444,7 +447,7 @@ GRmenu.alert(:error, "Fallo al conectar con el cluster.", pause: false)
|
|
|
444
447
|
GRmenu.alert(:info, "Actualización disponible.")
|
|
445
448
|
|
|
446
449
|
# Tarjeta informativa posicional (ideal para respuestas y logs)
|
|
447
|
-
GRmenu.card("NGINX Web Server", "NGINX iniciado en el puerto 80 (PID 1024)", style: 3, border_color: "
|
|
450
|
+
GRmenu.card("NGINX Web Server", "NGINX iniciado en el puerto 80 (PID 1024)", style: 3, border_color: "chromatic_green", pause: false)
|
|
448
451
|
|
|
449
452
|
# Tarjeta informativa con keywords
|
|
450
453
|
GRmenu.card(
|
|
@@ -465,7 +468,7 @@ Decodifica y renderiza cualquier formato de imagen (PNG, JPEG, JPG, WEBP, GIF, B
|
|
|
465
468
|
|
|
466
469
|
```ruby
|
|
467
470
|
# 1. Renderizado directo en consola
|
|
468
|
-
GRmenu.image("assets/logo.png", width: 40, style: 3, color: "
|
|
471
|
+
GRmenu.image("assets/logo.png", width: 40, style: 3, color: "chromatic_cyan", center: true)
|
|
469
472
|
|
|
470
473
|
# 2. Como cabecera gráfica dentro de un menú interactivo
|
|
471
474
|
menu = GRmenu.new(
|
|
@@ -483,7 +486,7 @@ menu.draw
|
|
|
483
486
|
|
|
484
487
|
```ruby
|
|
485
488
|
# Barra de progreso con avance dinámico
|
|
486
|
-
GRmenu.progress(100, title: "Descargando Paquetes", color: "
|
|
489
|
+
GRmenu.progress(100, title: "Descargando Paquetes", color: "chromatic_yellow", style: 3) do |bar|
|
|
487
490
|
10.times do |i|
|
|
488
491
|
sleep 0.1
|
|
489
492
|
bar.advance(10, status: "Procesando bloque #{i + 1} de 10...")
|
|
@@ -491,7 +494,7 @@ GRmenu.progress(100, title: "Descargando Paquetes", color: "neon_yellow", style:
|
|
|
491
494
|
end
|
|
492
495
|
|
|
493
496
|
# Spinner animado no bloqueante en hilo secundario
|
|
494
|
-
resultado = GRmenu.spinner("Conectando con el cluster remoto...", color: "
|
|
497
|
+
resultado = GRmenu.spinner("Conectando con el cluster remoto...", color: "chromatic_cyan") do
|
|
495
498
|
sleep 1.2
|
|
496
499
|
"Conexión exitosa"
|
|
497
500
|
end
|
|
@@ -499,7 +502,7 @@ end
|
|
|
499
502
|
|
|
500
503
|
---
|
|
501
504
|
|
|
502
|
-
### 13. Iluminación Dinámica
|
|
505
|
+
### 13. Iluminación Dinámica Cromática a 30 FPS
|
|
503
506
|
|
|
504
507
|
Al configurar `animate: "diagonal"`, `"linear"`, `"fade"` o `"rgb"`, el motor proyecta una ola de luz senoidal continua en tiempo real a 30 FPS que barre los marcos y los banners con destellos de incandescencia (*glow*), sin introducir retraso en el teclado:
|
|
505
508
|
|
|
@@ -507,11 +510,11 @@ Al configurar `animate: "diagonal"`, `"linear"`, `"fade"` o `"rgb"`, el motor pr
|
|
|
507
510
|
menu = GRmenu.new(
|
|
508
511
|
opciones,
|
|
509
512
|
banner: "THEMES",
|
|
510
|
-
title: "Efecto
|
|
513
|
+
title: "Efecto Cromático Vivo",
|
|
511
514
|
style: 3,
|
|
512
515
|
animate: "diagonal"
|
|
513
516
|
)
|
|
514
|
-
menu.set_style.border("
|
|
517
|
+
menu.set_style.border("chromatic_red").banner("chromatic_red").focus("chromatic_yellow")
|
|
515
518
|
menu.draw
|
|
516
519
|
```
|
|
517
520
|
|
|
@@ -521,14 +524,14 @@ menu.draw
|
|
|
521
524
|
|
|
522
525
|
```ruby
|
|
523
526
|
# Banners en arte ASCII 3D (fuentes del 1 al 10)
|
|
524
|
-
GRmenu.banner("ADMIN", 0, color: "
|
|
527
|
+
GRmenu.banner("ADMIN", 0, color: "chromatic_red", style: 3, font: 1)
|
|
525
528
|
|
|
526
529
|
# Módulo Color / C / Colors
|
|
527
530
|
puts Color.rgb("Texto degradado en onda arcoíris continua")
|
|
528
531
|
puts Color.hex("#FF0055", "Texto en Rojo Carmesí")
|
|
529
532
|
puts Color.gold("Texto en Dorado")
|
|
530
|
-
puts Color.
|
|
531
|
-
puts Color.
|
|
533
|
+
puts Color.chromatic_cyan("Texto en Cian Cromático")
|
|
534
|
+
puts Color.chromatic_emerald("Texto en Esmeralda Cromático")
|
|
532
535
|
```
|
|
533
536
|
|
|
534
537
|
---
|
|
@@ -539,8 +542,8 @@ GRmenu incluye un motor de temas declarativos en archivos `.gr` con sintaxis lim
|
|
|
539
542
|
|
|
540
543
|
#### Cargar Temas Integrados:
|
|
541
544
|
```ruby
|
|
542
|
-
GRmenu.theme(:
|
|
543
|
-
GRmenu.theme(:cyberpunk) #
|
|
545
|
+
GRmenu.theme(:chromatic_red) # Rojos eléctricos incandescentes y foco amarillo
|
|
546
|
+
GRmenu.theme(:cyberpunk) # Cromáticos cian, amarillo y efecto Chroma
|
|
544
547
|
GRmenu.theme(:matrix) # Verde fosforescente terminal hacker
|
|
545
548
|
GRmenu.theme(:dracula) # Morados, fucsias y cian
|
|
546
549
|
GRmenu.theme(:nord) # Azules árticos y paleta fría
|
|
@@ -552,7 +555,7 @@ GRmenu.theme(:sunset) # Atardecer cálido en rojos, naranjas y dorados
|
|
|
552
555
|
```gr
|
|
553
556
|
GRmenu::config<-1->
|
|
554
557
|
|
|
555
|
-
@theme:: "
|
|
558
|
+
@theme:: "CyberChromatic"
|
|
556
559
|
@author:: "GRcode"
|
|
557
560
|
@version:: "4.1"
|
|
558
561
|
|
|
@@ -564,34 +567,34 @@ GRmenu::config<-1->
|
|
|
564
567
|
desc_prefix:: ->
|
|
565
568
|
center:: true
|
|
566
569
|
mouse:: true
|
|
567
|
-
border::
|
|
568
|
-
title::
|
|
569
|
-
focus::
|
|
570
|
+
border:: chromatic_cyan:1
|
|
571
|
+
title:: chromatic_yellow:2
|
|
572
|
+
focus:: chromatic_red:2
|
|
570
573
|
options:: white:1
|
|
571
|
-
banner::
|
|
574
|
+
banner:: chromatic_magenta:2
|
|
572
575
|
subtitle:: cyan:1
|
|
573
576
|
divider:: blue:1
|
|
574
577
|
>>
|
|
575
578
|
|
|
576
579
|
<<submenu
|
|
577
580
|
style:: 3
|
|
578
|
-
border::
|
|
579
|
-
focus::
|
|
581
|
+
border:: chromatic_yellow:1
|
|
582
|
+
focus:: chromatic_cyan:2
|
|
580
583
|
options:: white:1
|
|
581
|
-
title::
|
|
582
|
-
arrow::
|
|
584
|
+
title:: chromatic_yellow:2
|
|
585
|
+
arrow:: chromatic_cyan:2
|
|
583
586
|
>>
|
|
584
587
|
|
|
585
588
|
<<tabs
|
|
586
|
-
active_tab::
|
|
589
|
+
active_tab:: chromatic_yellow:2
|
|
587
590
|
tab_color:: gray:1
|
|
588
|
-
indicator::
|
|
591
|
+
indicator:: chromatic_cyan:2
|
|
589
592
|
>>
|
|
590
593
|
|
|
591
594
|
<<input
|
|
592
595
|
style:: 3
|
|
593
|
-
border_color::
|
|
594
|
-
title_color::
|
|
596
|
+
border_color:: chromatic_cyan:1
|
|
597
|
+
title_color:: chromatic_yellow:2
|
|
595
598
|
label_color:: white:2
|
|
596
599
|
>>
|
|
597
600
|
|
|
@@ -664,23 +667,23 @@ menu.style(<<-GR)
|
|
|
664
667
|
<<menu
|
|
665
668
|
style:: 3
|
|
666
669
|
mouse:: true
|
|
667
|
-
border::
|
|
668
|
-
title::
|
|
669
|
-
focus::
|
|
670
|
+
border:: chromatic_cyan:1
|
|
671
|
+
title:: chromatic_yellow:2
|
|
672
|
+
focus:: chromatic_red:2
|
|
670
673
|
>>
|
|
671
674
|
<<submenu
|
|
672
675
|
style:: 3
|
|
673
|
-
border::
|
|
674
|
-
focus::
|
|
676
|
+
border:: chromatic_yellow:1
|
|
677
|
+
focus:: chromatic_cyan:2
|
|
675
678
|
>>
|
|
676
679
|
<<tabs
|
|
677
|
-
active_tab::
|
|
680
|
+
active_tab:: chromatic_yellow:2
|
|
678
681
|
tab_color:: gray:1
|
|
679
682
|
>>
|
|
680
683
|
<<input
|
|
681
684
|
style:: 3
|
|
682
|
-
border_color::
|
|
683
|
-
title_color::
|
|
685
|
+
border_color:: chromatic_cyan:1
|
|
686
|
+
title_color:: chromatic_yellow:2
|
|
684
687
|
label_color:: white:2
|
|
685
688
|
>>
|
|
686
689
|
GR
|
|
@@ -690,17 +693,147 @@ menu.draw
|
|
|
690
693
|
|
|
691
694
|
---
|
|
692
695
|
|
|
696
|
+
### 18. Formularios Multi-Campo Interactivos (`GRmenu.form`)
|
|
697
|
+
|
|
698
|
+
Permite capturar múltiples datos en una sola pantalla encapsulada con diseño profesional, sombra 3D proyectada (`▒▒`), navegación fluida con `Tab` o flechas `↑`/`↓`, **barrita de cursor activa `│`** en tiempo real y retorno estructurado como un `Hash` de Ruby:
|
|
699
|
+
|
|
700
|
+
```text
|
|
701
|
+
╔══════════════ Registro de Nueva Cuenta ══════════════╗
|
|
702
|
+
║ ║
|
|
703
|
+
║ Nombre de Usuario: [ gabo_dev│ ] ║▒▒
|
|
704
|
+
║ Contraseña: [ ********** ] ║▒▒
|
|
705
|
+
║ Edad TCP: [ 25│ ] ║▒▒
|
|
706
|
+
║ Rol del Sistema: [ < Desarrollador > ] ║▒▒
|
|
707
|
+
║ ¿Habilitar HTTPS?: [ [X] Sí ] ║▒▒
|
|
708
|
+
║ ║
|
|
709
|
+
║ ────────────────────────────────────────────────── ║▒▒
|
|
710
|
+
║ > [ ✔ Guardar ] < [ ✖ Cancelar ] ║▒▒
|
|
711
|
+
║ Tab/↑↓: Mover | Enter: Siguiente | Esc: Cancelar ║▒▒
|
|
712
|
+
╚══════════════════════════════════════════════════════╝▒▒
|
|
713
|
+
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
#### Uso mediante Bloque DSL:
|
|
717
|
+
```ruby
|
|
718
|
+
datos = GRmenu.form("Registro de Nueva Cuenta", color: "cyan", style: 3, shadow: true) do |f|
|
|
719
|
+
f.text :usuario, "Nombre de Usuario:", default: "gabo_dev", placeholder: "Ej. admin"
|
|
720
|
+
f.password :password, "Contraseña:", mask: "*"
|
|
721
|
+
f.number :edad, "Edad:", default: 25, min: 18, max: 99, step: 1
|
|
722
|
+
f.select :rol, "Rol del Sistema:", ["Admin", "Desarrollador", "Auditor"], default: "Desarrollador"
|
|
723
|
+
f.boolean :https, "¿Habilitar HTTPS?", default: true
|
|
724
|
+
end
|
|
725
|
+
|
|
726
|
+
if datos
|
|
727
|
+
puts "Datos recibidos: #{datos.inspect}"
|
|
728
|
+
# => {:usuario=>"gabo_dev", :password=>"...", :edad=>25, :rol=>"Desarrollador", :https=>true}
|
|
729
|
+
else
|
|
730
|
+
puts "Formulario cancelado por el usuario"
|
|
731
|
+
end
|
|
732
|
+
```
|
|
733
|
+
|
|
734
|
+
* **Tipos de campo soportados:**
|
|
735
|
+
- `f.text(key, label, default: "", placeholder: "")`: Texto con cursor `│`, soporte de `Home`, `End`, `Ctrl+U`, `Backspace` y desplazamiento horizontal si excede el ancho.
|
|
736
|
+
- `f.password(key, label, default: "", mask: "*")`: Contraseña con caracteres enmascarados y barrita de cursor.
|
|
737
|
+
- `f.number(key, label, default: 0, min: nil, max: nil, step: 1)`: Campo numérico editable con cursor `│`, límites y atajos `+`/`-`.
|
|
738
|
+
- `f.select(key, label, options = [], default: nil)`: Selector interactivo inline `< Opción >` ciclable con `←`/`→` o `Espacio`.
|
|
739
|
+
- `f.boolean(key, label, default: false)` (alias `f.checkbox`): Casilla booleana `[X] Sí` / `[ ] No` alternable con `Espacio` o `s`/`n`/`y`.
|
|
740
|
+
* **Teclas y Atajos:**
|
|
741
|
+
- `Tab` / `↓`: Avanza al siguiente campo o botón.
|
|
742
|
+
- `Shift+Tab` / `↑`: Retrocede al campo o botón anterior.
|
|
743
|
+
- `←` / `→`: Mueve la barrita de cursor `│` a través del texto, o navega opciones en selectores.
|
|
744
|
+
- `Home` / `Ctrl+A`: Salta al inicio del campo.
|
|
745
|
+
- `End` / `Ctrl+E`: Salta al final del campo.
|
|
746
|
+
- `Ctrl+U`: Limpia todo el texto del campo activo.
|
|
747
|
+
- `Backspace` / `Delete`: Borra el carácter anterior o siguiente al cursor.
|
|
748
|
+
- `Enter`: Avanza al siguiente campo; sobre `[ ✔ Guardar ]` o `[ ✖ Cancelar ]` ejecuta la acción.
|
|
749
|
+
- `Esc`: Cancela el formulario inmediatamente (retorna `nil`).
|
|
750
|
+
|
|
751
|
+
---
|
|
752
|
+
|
|
753
|
+
### 19. Ventanas Modales Flotantes 3D (`GRmenu.modal` / `GRmenu.popup`)
|
|
754
|
+
|
|
755
|
+
Despliega ventanas emergentes flotantes centradas en pantalla con **sombra proyectada 3D (`▒▒`)**, ajuste de texto automático (*word-wrapping*) y fila de botones de acción interactivos:
|
|
756
|
+
|
|
757
|
+
```text
|
|
758
|
+
╔═════════════════ Confirmación de Despliegue ═════════════════╗
|
|
759
|
+
║ ║
|
|
760
|
+
║ Se aplicarán los cambios a la base de datos de producción. ║▒▒
|
|
761
|
+
║ Esta operación creará un snapshot de seguridad previo. ║▒▒
|
|
762
|
+
║ ¿Deseas continuar con la migración? ║▒▒
|
|
763
|
+
║ ║
|
|
764
|
+
║ > [ ✔ Proceder ] < [ Posponer ] [ ✖ Cancelar ] ║▒▒
|
|
765
|
+
╚══════════════════════════════════════════════════════════════╝▒▒
|
|
766
|
+
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
|
|
767
|
+
```
|
|
768
|
+
|
|
769
|
+
```ruby
|
|
770
|
+
decision = GRmenu.modal(
|
|
771
|
+
title: "Confirmación de Despliegue",
|
|
772
|
+
content: "Se aplicarán los cambios a la base de datos de producción.\nEsta operación creará un snapshot de seguridad previo.\n¿Deseas continuar con la migración?",
|
|
773
|
+
buttons: ["Proceder", "Posponer", "Cancelar"],
|
|
774
|
+
color: "chromatic_yellow",
|
|
775
|
+
style: 3,
|
|
776
|
+
shadow: true
|
|
777
|
+
)
|
|
778
|
+
|
|
779
|
+
case decision
|
|
780
|
+
when "Proceder"
|
|
781
|
+
puts "Iniciando despliegue..."
|
|
782
|
+
when "Posponer"
|
|
783
|
+
puts "Despliegue aplazado 1 hora."
|
|
784
|
+
else
|
|
785
|
+
puts "Operación cancelada."
|
|
786
|
+
end
|
|
787
|
+
```
|
|
788
|
+
|
|
789
|
+
* **Características:**
|
|
790
|
+
- Auto-ajuste de párrafos largos (*word-wrapping*) sin desbordar la consola ni quebrar bordes.
|
|
791
|
+
- Botones interactivos con foco activo resaltado.
|
|
792
|
+
- `←` / `→` o `Tab` / `Shift+Tab` para navegar entre botones; `Enter` o `Espacio` para confirmar.
|
|
793
|
+
- `Esc` cierra la modal y retorna `nil`.
|
|
794
|
+
|
|
795
|
+
---
|
|
796
|
+
|
|
797
|
+
### 20. Control de Color y Fondo de Terminal (`GRmenu.window`)
|
|
798
|
+
|
|
799
|
+
Permite pintar y personalizar el fondo global de toda la ventana de la terminal utilizando secuencias de escape nativas **OSC 11** (`\e]11;#hex\a`) combinadas con limpieza por extensión de color (*ANSI BCE*):
|
|
800
|
+
|
|
801
|
+
```ruby
|
|
802
|
+
# 1. Cambiar el color de fondo usando código Hexadecimal
|
|
803
|
+
GRmenu.window.color("#0f172a") # Azul Marino profundo
|
|
804
|
+
GRmenu.window.bg("#1a1b26") # Tokyo Night
|
|
805
|
+
|
|
806
|
+
# 2. Usar nombres integrados o alias en español
|
|
807
|
+
GRmenu.window.color("negro") # Negro puro (#000000)
|
|
808
|
+
GRmenu.window.bg("red") # Rojo vibrante
|
|
809
|
+
|
|
810
|
+
# 3. Usar arreglo RGB directo [R, G, B]
|
|
811
|
+
GRmenu.window.bg([15, 32, 39])
|
|
812
|
+
|
|
813
|
+
# 4. Cambiar el título de la ventana de la consola (OSC 0)
|
|
814
|
+
GRmenu.window.title("Panel de Control - v5.0")
|
|
815
|
+
|
|
816
|
+
# 5. Restaurar el fondo natural de la terminal manualmente (OSC 111)
|
|
817
|
+
GRmenu.window.reset
|
|
818
|
+
```
|
|
819
|
+
|
|
820
|
+
* **Auto-Restauración Limpia Garantizada:**
|
|
821
|
+
GRmenu registra limpiadores automáticos con `at_exit` y captura de señales del sistema (`SIGINT`, `SIGTERM`, `SIGHUP`). Si tu script termina normalmente, ocurre un error no controlado o el usuario presiona `Ctrl+C`, **el fondo de la terminal siempre vuelve a su estado original** automáticamente, sin dejar residuos visuales.
|
|
822
|
+
|
|
823
|
+
---
|
|
824
|
+
|
|
693
825
|
## Laboratorio de Nuevas Funcionalidades
|
|
694
826
|
|
|
695
|
-
Puedes ejecutar el
|
|
827
|
+
Puedes ejecutar el laboratorio interactivo para probar en vivo los nuevos formularios multi-campo, las ventanas modales 3D y el fondo de terminal:
|
|
696
828
|
|
|
697
829
|
```bash
|
|
698
|
-
ruby ruby/
|
|
830
|
+
ruby ruby/j.rb
|
|
699
831
|
```
|
|
700
832
|
|
|
701
|
-
O
|
|
833
|
+
O los laboratorios de submenús de 3 niveles, pestañas y componentes generales:
|
|
702
834
|
|
|
703
835
|
```bash
|
|
836
|
+
ruby ruby/eaja.rb
|
|
704
837
|
ruby ruby/e.rb
|
|
705
838
|
```
|
|
706
839
|
|
|
@@ -779,6 +912,10 @@ Configura el diseño del marco mediante el parámetro `style: 1..20`:
|
|
|
779
912
|
| `GRmenu.checkbox` | `(items, ...)` | Devuelve `Array` con elementos marcados (`[X]`). |
|
|
780
913
|
| `GRmenu.slider` | `(prompt, ...)` | Devuelve valor numérico seleccionado en barra interactiva. |
|
|
781
914
|
| `GRmenu.confirm` | `(pregunta, ...)` | Devuelve booleano (`true`/`false`) con botones interactivos. |
|
|
915
|
+
| `GRmenu.modal` | `(title:, content:, buttons:, ...)` | Ventana flotante 3D emergente con sombra proyectada y botones (Alias: `popup`). |
|
|
916
|
+
| `GRmenu.form` | `(title, **opts, &bloque)` | Formulario interactivo multi-campo con barrita de cursor y retorno Hash. |
|
|
917
|
+
| `GRmenu.window.color`| `(color_o_hex)` | Cambia el fondo global de la terminal (OSC 11 + BCE) con auto-restauración limpia. |
|
|
918
|
+
| `GRmenu.window.reset`| `()` | Restaura el fondo predeterminado original de la terminal (OSC 111). |
|
|
782
919
|
| `GRmenu.input` | `(title: ..., label: ..., ...)` | Entrada de texto rediseñada con marco y cursor `█`. |
|
|
783
920
|
| `GRmenu.image` | `(filepath, width:, style:, color:)` | Renderiza imagen en TrueColor 24-bit (Lanczos / Zlib). |
|
|
784
921
|
| `GRmenu.progress` | `(total = 100, ... &bloque)` | Barra de progreso dinámica con bloque. |
|