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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4cfab6080b581db0dddff8e9285cb831f70f259bb9da2965761702829c07292f
4
- data.tar.gz: 172214b97293124225a3f6eef3f9b71842d3e49a7159e3cc27bacc407ec6db66
3
+ metadata.gz: a82f3307793b324fb6df221851dd339ab65db676a7750563ab6b53d0e896e5d4
4
+ data.tar.gz: 0c853fc6d074a65006937912dc24f0917ce9ae9cd3af3b026b2ae47082336645
5
5
  SHA512:
6
- metadata.gz: 2437295ff5176fc4ace40768e03e7cd25ecbfa0e1562ef625e348eac1f69c7e91c60b2cedf3d48c0f4a9285272978e8b0ae3ec8c1a81e3dbf2c47296b4ef7d0d
7
- data.tar.gz: 021bf58afb13dce516963e7bb16b0fe5830498c2e88ab961a6dca0c4f7d5dc13e54fde83cf89b2b5a89a632f9a63a107539a462b82b65ec60f64e78f92eefee8
6
+ metadata.gz: 5fbf7e715f694d207ed59cc92d089bfc7e5960500e375125ab2b8c7012757f437521bc0bd338928596bec5d3d0251991b557ba87121a2ed65300b8d25f077cf0
7
+ data.tar.gz: b52ef0c04a2b5e90c334c4a7bc34d96eb542e1362be77b9d4a57c2beea8ad3481fa585fb23bed1da5be0f10caddcf359b7fdfaf4f57503cf09a65233927ee349
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # GRmenu (Ruby) v4.1.0
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
- 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 Living Neon 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.
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
  [![Gem Version](https://badge.fury.io/rb/grmenu.svg)](https://badge.fury.io/rb/grmenu)
8
8
  [![License: MIT](https://img.shields.io/github/license/JoseEduardoGR/GRmenu)](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 Living Neon a 30 FPS](#13-iluminación-dinámica-living-neon-a-30-fps)
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
- 5. [Laboratorio de Nuevas Funcionalidades (ruby/eaja.rb y ruby/e.rb)](#laboratorio-de-nuevas-funcionalidades)
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 Living Neon a 30 FPS:** Olas de luz senoidal continuas y destellos de incandescencia en tiempo real sin introducir retraso en el teclado.
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(:neon_red)
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 Neon", -> { GRmenu.theme(:cyberpunk) }]
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: "neon_cyan",
302
- title_color: "neon_yellow",
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: "neon_red"
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: "neon_cyan",
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: "neon_green", style: 3)
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: "neon_yellow")
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: "neon_green", pause: false)
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: "neon_cyan", center: true)
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: "neon_yellow", style: 3) do |bar|
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: "neon_cyan") do
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 Living Neon a 30 FPS
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 Neón Vivo",
513
+ title: "Efecto Cromático Vivo",
511
514
  style: 3,
512
515
  animate: "diagonal"
513
516
  )
514
- menu.set_style.border("neon_red").banner("neon_red").focus("neon_yellow")
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: "neon_red", style: 3, font: 1)
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.neon_cyan("Texto en Cian Neón")
531
- puts Color.neon_emerald("Texto en Esmeralda Neón")
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(:neon_red) # Rojos eléctricos incandescentes y foco amarillo
543
- GRmenu.theme(:cyberpunk) # Neones cian, amarillo y efecto Chroma
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:: "CyberNeon"
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:: neon_cyan:1
568
- title:: neon_yellow:2
569
- focus:: neon_red:2
570
+ border:: chromatic_cyan:1
571
+ title:: chromatic_yellow:2
572
+ focus:: chromatic_red:2
570
573
  options:: white:1
571
- banner:: neon_magenta:2
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:: neon_yellow:1
579
- focus:: neon_cyan:2
581
+ border:: chromatic_yellow:1
582
+ focus:: chromatic_cyan:2
580
583
  options:: white:1
581
- title:: neon_yellow:2
582
- arrow:: neon_cyan:2
584
+ title:: chromatic_yellow:2
585
+ arrow:: chromatic_cyan:2
583
586
  >>
584
587
 
585
588
  <<tabs
586
- active_tab:: neon_yellow:2
589
+ active_tab:: chromatic_yellow:2
587
590
  tab_color:: gray:1
588
- indicator:: neon_cyan:2
591
+ indicator:: chromatic_cyan:2
589
592
  >>
590
593
 
591
594
  <<input
592
595
  style:: 3
593
- border_color:: neon_cyan:1
594
- title_color:: neon_yellow:2
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:: neon_cyan:1
668
- title:: neon_yellow:2
669
- focus:: neon_red:2
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:: neon_yellow:1
674
- focus:: neon_cyan:2
676
+ border:: chromatic_yellow:1
677
+ focus:: chromatic_cyan:2
675
678
  >>
676
679
  <<tabs
677
- active_tab:: neon_yellow:2
680
+ active_tab:: chromatic_yellow:2
678
681
  tab_color:: gray:1
679
682
  >>
680
683
  <<input
681
684
  style:: 3
682
- border_color:: neon_cyan:1
683
- title_color:: neon_yellow:2
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 archivo de laboratorio interactivo completo para probar en vivo los submenús de 3 niveles, las pestañas con ratón y el input rediseñado:
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/eaja.rb
830
+ ruby ruby/j.rb
699
831
  ```
700
832
 
701
- O el laboratorio general de componentes:
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. |