grmenu 2.0.0 → 4.0.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.
data/README.md CHANGED
@@ -1,381 +1,826 @@
1
- <div align="center">
1
+ # GRmenu (Ruby) v4.0.1
2
2
 
3
- # GRmenu (Ruby)
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 para terminal en modo TTY crudo, con soporte para Banners ASCII 3D, barras de progreso, spinners animados, tooltips dinámicos, estilos y colores personalizados**
6
-
7
- Flechas arriba/abajo para moverte · `Enter` para elegir · `q` para salir
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.
8
6
 
9
7
  [![Gem Version](https://badge.fury.io/rb/grmenu.svg)](https://badge.fury.io/rb/grmenu)
10
8
  [![License: MIT](https://img.shields.io/github/license/JoseEduardoGR/GRmenu)](LICENSE)
11
9
  [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-blue)](https://github.com/JoseEduardoGR/GRmenu)
10
+ [![Ruby](https://img.shields.io/badge/ruby-%3E%3D%202.6-red.svg)](https://www.ruby-lang.org)
12
11
 
13
- </div>
12
+ ![Demo de GRmenu en Ruby](assets/demo.png)
14
13
 
15
14
  ---
16
15
 
17
- ## Características
16
+ ## Tabla de Contenidos
17
+
18
+ 1. [Por qué elegir GRmenu?](#por-qué-elegir-grmenu)
19
+ 2. [Instalación y Requisitos](#instalación-y-requisitos)
20
+ 3. [Inicio Rápido en 10 Segundos](#inicio-rápido-en-10-segundos)
21
+ 4. [Guía Exhaustiva de Componentes y Características](#guía-exhaustiva-de-componentes-y-características)
22
+ - [1. Menú Interactivo Principal (Buscador, Grid 2D y Paginación)](#1-menú-interactivo-principal)
23
+ - [2. Submenús en Cascada de hasta 3 Niveles (Sub del Sub)](#2-submenús-en-cascada-de-hasta-3-niveles-sub-del-sub)
24
+ - [3. Menú por Pestañas Multitarea (GRmenu.tabs)](#3-menú-por-pestañas-multitarea-grmenutabs)
25
+ - [4. Soporte Completo de Ratón (mouse: true)](#4-soporte-completo-de-ratón-mouse-true)
26
+ - [5. Rediseño de Entrada de Datos (GRmenu.input)](#5-rediseño-de-entrada-de-datos-grmenuinput)
27
+ - [6. Selector Múltiple con Checkboxes (GRmenu.checkbox)](#6-selector-múltiple-con-checkboxes-grmenucheckbox)
28
+ - [7. Control Deslizante en Tiempo Real (GRmenu.slider)](#7-control-deslizante-en-tiempo-real-grmenuslider)
29
+ - [8. Diálogos Nativos de Confirmación (GRmenu.confirm)](#8-diálogos-nativos-de-confirmación-grmenuconfirm)
30
+ - [9. Tablas Interactivas con Buscador y Ordenamiento (GRmenu.table)](#9-tablas-interactivas-con-buscador-y-ordenamiento-grmenutable)
31
+ - [10. Tarjetas Estilizadas y Alertas (GRmenu.card y GRmenu.alert)](#10-tarjetas-estilizadas-y-alertas-grmenucard-y-grmenualert)
32
+ - [11. Renderizado Universal de Imágenes en Terminal (GRmenu.image)](#11-renderizado-universal-de-imágenes-en-terminal-grmenuimage)
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)
35
+ - [14. Banners ASCII 3D y Módulo de Color (Color / C)](#14-banners-ascii-3d-y-módulo-de-color)
36
+ - [15. Sistema de Temas .gr y CSS para TUI](#15-sistema-de-temas-gr-y-css-para-tui)
37
+ - [16. Exportación de Temas desde Terminal / CLI (-theme)](#16-exportación-de-temas-desde-terminal--cli--theme)
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)
40
+ 6. [Catálogo Visual de Fuentes 3D (1 al 10)](#catálogo-visual-de-fuentes-3d)
41
+ 7. [Catálogo Visual de Marcos y Bordes (1 al 20)](#catálogo-visual-de-marcos-y-bordes)
42
+ 8. [Referencia Exhaustiva de la API de Ruby](#referencia-exhaustiva-de-la-api-de-ruby)
43
+ 9. [Mapa de Controles: Teclado y Ratón](#mapa-de-controles-teclado-y-ratón)
44
+ 10. [Licencia](#licencia)
45
+
46
+ ---
18
47
 
19
- - 🎮 **Navegación con flechas** — arriba/abajo para moverte, `Enter` para ejecutar, `q` para salir.
20
- - 🔤 **10 Fuentes ASCII 3D para Banners** — fuentes tridimensionales (ANSI Shadow, Slant, Doom, Graffiti, Modular, Wire, Block, Stars, etc.).
21
- - 📜 **Auto-Paginación y Scroll Fluido** calcula la altura de la terminal y crea una ventana deslizante con indicadores automáticos (`▲ (+N arriba)` / `▼ (+M abajo)`).
22
- - 💡 **Descripciones y Tooltips Dinámicos** muestra información explicativa en la parte inferior del recuadro al enfocar cada opción.
23
- - **Spinners y Barras de Progreso** helpers nativos `GRmenu.spinner` y `GRmenu.progress` dentro de recuadros con la misma estética visual.
24
- - 🎨 **20 estilos de borde** desde ASCII clásico hasta caracteres Unicode dobles, curvas redondeadas y bloques outline.
25
- - 🌈 **Paleta de colores completa** personalización individual de marco, título, banner, subtítulo, divisores, opciones y foco activo con 2 niveles de brillo.
26
- - 📐 **Centrado simétrico automático** alinea y centra automáticamente subtítulos y menús de opciones respecto al ancho de banners grandes.
27
- - 🛠️ **Helpers nativos en modo crudo** `clear_screen`, `continue`, `banner`, `spinner`, `progress`, `div` y `help`.
28
- - 💻 **100% Multiplataforma** compatible con Linux, macOS y Windows (PowerShell, CMD, Windows Terminal, VS Code).
29
- - 📦 **Cero dependencias externas** utiliza únicamente la librería estándar `io/console` y `json`.
48
+ ## Por qué elegir GRmenu?
49
+
50
+ - **Cero Dependencias Externas:** Funciona exclusivamente con la biblioteca estándar de Ruby (`io/console`, `json`, `zlib`, `open3`), sin gemas externas ni extensiones en C compiladas.
51
+ - **Soporte de Ratón ANSI SGR 1006:** Interactúa directamente con clics en opciones, pestañas, cajas de submenús, flechas de paginación y rueda de desplazamiento vertical (*Scroll Wheel*) activando `mouse: true`.
52
+ - **Submenús en Cascada de hasta 3 Niveles:** Despliega paneles anidados conectados mediante puentes dobles `──` (`Box 0 ── Box 1 ── Box 2`) con un motor responsivo que desliza la vista automáticamente si el terminal es estrecho.
53
+ - **Pestañas Multitarea (`GRmenu.tabs`):** Organiza interfaces complejas en paneles horizontales alternables con `Tab`, `Shift+Tab` o clic del ratón.
54
+ - **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
+ - **Firmas Flexibles en Todos los Widgets:** Acepta tanto llamadas clásicas posicionales como llamadas por palabra clave (`title:`, `headers:`, `rows:`, `pause: false`).
56
+ - **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.
58
+ - **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
+ - **Multiplataforma Real:** Totalmente compatible con Linux, macOS y Windows (Windows Terminal, PowerShell, CMD y terminal de VS Code).
30
60
 
31
61
  ---
32
62
 
33
- ## 📦 Instalación
63
+ ## Instalación y Requisitos
64
+
65
+ Requiere **Ruby >= 2.6.0**.
66
+
67
+ ### Vía RubyGems
34
68
 
35
69
  ```bash
36
70
  gem install grmenu
37
71
  ```
38
72
 
39
- O si trabajás con el archivo directamente en tu proyecto:
73
+ ### Vía Gemfile
40
74
 
41
75
  ```ruby
42
- require "GRmenu"
76
+ gem 'grmenu', '~> 4.0'
43
77
  ```
44
78
 
45
- <sub>Requiere Ruby 2.6.</sub>
79
+ ### Requerimiento en scripts de Ruby
80
+
81
+ ```ruby
82
+ require 'grmenu'
83
+ ```
46
84
 
47
85
  ---
48
86
 
49
- ## 💡 Cómo se pasan las opciones y todos los parámetros
87
+ ## Inicio Rápido en 10 Segundos
50
88
 
51
- `GRmenu` permite pasar métodos directos, símbolos, arreglos con nombres personalizados, bloques lambda/procs y **descripciones explicativas (tooltips)**:
89
+ Crea un archivo llamado `app.rb` y ejecútalo con `ruby app.rb`:
52
90
 
53
91
  ```ruby
92
+ require 'grmenu'
93
+
94
+ # Cargar un tema integrado con estética neón
95
+ GRmenu.theme(:neon_red)
96
+
97
+ def saludar
98
+ GRmenu.alert(:success, "Bienvenido a GRmenu v4.0.1!")
99
+ end
100
+
101
+ def ver_tabla
102
+ headers = ["ID", "SERVICIO", "ESTADO"]
103
+ filas = [
104
+ ["01", "API Gateway", "Operativo"],
105
+ ["02", "Postgres DB", "Operativo"],
106
+ ["03", "Redis Cache", "En espera"]
107
+ ]
108
+ GRmenu.table(headers, filas, title: "Monitor de Servidores", search: true)
109
+ end
110
+
54
111
  menu = GRmenu.new(
55
112
  [
56
- method(:iniciar_servidor), # 1. Method (auto-capitaliza: "Iniciar Servidor")
57
- :crear_respaldo, # 2. Symbol (auto-capitaliza: "Crear Respaldo")
58
- ["Métricas del Sistema", method(:ver_metricas)], # 3. Array ["Nombre Personalizado", acción]
59
- ["Crear Backup", method(:respaldo), "Genera dump SQL de la BD"], # 4. Con Tooltip descriptivo al pie del marco
60
- ["Ejecutar Lambda", -> { puts Color.pink("Lambda!"); GRmenu.continue }, "Bloque anónimo Proc/Lambda"],
61
- ["Probar Banner Helper", method(:prueba_banner_rapido)], # 5. Helper GRmenu.banner
62
- ["Ver Ayuda y Referencia", method(:ver_ayuda_completa)], # 6. Helper GRmenu.help
63
- method(:salir) # 7. Salir
113
+ ["Saludar", method(:saludar), "Muestra un mensaje emergente"],
114
+ ["Ver Infraestructura", method(:ver_tabla), "Tabla interactiva con buscador en vivo"],
115
+ ["Salir", -> { exit(0) }, "Finaliza la ejecución"]
64
116
  ],
65
- banner: "DEV OPS", # Texto gigante en arte ASCII 3D
66
- title: "Panel de Control", # Título en el marco de opciones
67
- subtitle: "Consola de Administración\nUsa las flechas y Enter", # Subtítulo (soporta saltos de línea \n)
68
- font: 1, # Fuente del banner (1 al 10, default 1: ANSI Shadow 3D)
69
- style: 7, # Estilo de marco de opciones (1 al 20, ej: 7=redondeado, 3=doble)
70
- banner_style: 3, # Estilo de marco del banner (1 al 20, ej: 3=doble línea)
71
- divider: true, # Líneas divisorias a la par del banner (true, false o número)
72
- center: true, # Centrado automático del menú y subtítulo respecto al banner
73
- page_size: 8 # (Opcional) Límite visible para auto-scroll y paginación
117
+ title: "Panel de Control",
118
+ banner: "DEMO",
119
+ style: 3,
120
+ mouse: true,
121
+ animate: "diagonal"
74
122
  )
123
+
124
+ menu.draw
75
125
  ```
76
126
 
77
127
  ---
78
128
 
79
- ## 🌟 Ejemplo Completo de Uso (`e.rb`)
129
+ ## Guía Exhaustiva de Componentes y Características
130
+
131
+ ### 1. Menú Interactivo Principal
80
132
 
81
- A continuación se muestra el archivo de ejemplo completo [`e.rb`](e.rb) con acciones originales, helpers de carga (`spinner` / `progress`), paginación, configuración de estilos, fuentes y colores:
133
+ El constructor `GRmenu.new` proporciona una experiencia interactiva completa con navegación continua (*snake loop*), paginación automática, buscador en vivo y distribución en cuadrículas 2D.
134
+
135
+ ```text
136
+ ╔═══════════════════════════════════════════╗
137
+ ║ Panel de Control ║
138
+ ║═══════════════════════════════════════════║
139
+ ║ Buscar: serv█ ║
140
+ ║═══════════════════════════════════════════║
141
+ ║ > [X] Servidor Web Nginx ║
142
+ ║ [ ] Servidor Base de Datos Postgres ║
143
+ ║───────────────────────────────────────────║
144
+ ║ * Proxy inverso HTTP de alto rendimiento ║
145
+ ╚═══════════════════════════════════════════╝
146
+ ```
147
+
148
+ #### Formatos de Opciones Aceptados
82
149
 
83
150
  ```ruby
84
- # frozen_string_literal: true
151
+ menu = GRmenu.new(
152
+ [
153
+ # 1. Method directo (formatea y capitaliza el nombre automáticamente)
154
+ method(:iniciar_servidor),
155
+
156
+ # 2. Symbol (invoca el método del contexto)
157
+ :crear_respaldo,
158
+
159
+ # 3. Arreglo [Etiqueta, Acción]
160
+ ["Lanzar Proceso", method(:lanzar)],
161
+
162
+ # 4. Arreglo con Tooltip [Etiqueta, Acción, Descripción]
163
+ ["Limpieza de Caché", method(:limpiar), "Vacía los temporales en disco"],
164
+
165
+ # 5. Bloque anónimo Proc o Lambda
166
+ ["Acción Rápida", -> { puts "Ejecutado!"; GRmenu.continue }, "Ejecuta bloque inline"],
167
+
168
+ # 6. Hash explícito
169
+ { name: "Configuración", action: method(:config), desc: "Ajustes del sistema" },
170
+
171
+ # 7. Submenús anidados en cascada (hasta 3 niveles)
172
+ ["Servicios", [
173
+ ["Servidores Web", [
174
+ ["Iniciar NGINX", -> { puts "Iniciando NGINX..." }],
175
+ ["Reiniciar Apache", -> { puts "Reiniciando Apache..." }]
176
+ ]],
177
+ ["Bases de Datos", [
178
+ ["PostgreSQL", -> { puts "Iniciando Postgres..." }],
179
+ ["Redis", -> { puts "Limpiando Redis..." }]
180
+ ]]
181
+ ], "Administración de servicios por niveles"]
182
+ ],
183
+ title: "Consola de Administración",
184
+ banner: "SISTEMA",
185
+ search: true, # Activa buscador interactivo en vivo
186
+ columns: 1, # Cuadrícula de columnas (soporta 2+ con navegación 2D)
187
+ page_size: 6, # Paginación con auto-scroll
188
+ mouse: true, # Soporte de ratón (clic y rueda de scroll)
189
+ style: 3
190
+ )
85
191
 
86
- require "GRmenu"
192
+ menu.draw(size_max: 44)
193
+ ```
87
194
 
88
- # 1. Definición de acciones/métodos originales
89
- def iniciar_servidor
90
- GRmenu.clear_screen
91
- puts Color.bright_green("-> Servidor iniciado correctamente en el puerto 3000.")
92
- GRmenu.continue
93
- end
195
+ ---
94
196
 
95
- def crear_respaldo
96
- GRmenu.clear_screen
97
- puts Color.bright_cyan("-> Creando respaldo de la base de datos...")
98
- GRmenu.continue
99
- end
197
+ ### 2. Submenús en Cascada de hasta 3 Niveles (*Sub del Sub*)
100
198
 
101
- def ver_metricas
102
- GRmenu.clear_screen
103
- puts Color.bright_magenta("-> CPU: 12% | RAM: 4.2 GB | Estado: Operativo")
104
- GRmenu.continue
105
- end
199
+ GRmenu permite anidar opciones hasta **3 niveles de profundidad** (*Menú Original $\to$ Submenú 1 $\to$ Sub del Sub*).
106
200
 
107
- def prueba_banner_rapido
108
- GRmenu.clear_screen
109
- GRmenu.banner("OK", 0, color: "green", level: 2, style: 3, font: 1)
110
- GRmenu.div(40, "green", 1, "═")
111
- puts Color.green(" Prueba completada con éxito.")
112
- GRmenu.div(40, "green", 1, "═")
113
- GRmenu.continue
114
- end
201
+ ```text
202
+ ╔══════════════════════╗ ╔════════════════════╗ ╔════════════════════╗
203
+ > Servicios ▶ ║──║ Servicios ║ ║ Servidores Web ║
204
+ ║ Ajustes ║ ║════════════════════║ ║════════════════════║
205
+ ╚══════════════════════╝ > Servidores Web ▶ ║──║ > Iniciar NGINX ║
206
+ ║ Bases de Datos ▶ ║ ║ Reiniciar Apache
207
+ ╚════════════════════╝ ╚════════════════════╝
208
+ ```
115
209
 
116
- def ver_ayuda_completa
117
- GRmenu.clear_screen
118
- GRmenu.help
119
- GRmenu.continue
120
- end
210
+ * **Detección Automática:** Cualquier opción cuyo segundo elemento sea un arreglo de opciones recibe automáticamente el indicador `▶`.
211
+ * **Puentes Dobles `──`:** Conectan las cajas visualmente a la altura exacta de la opción seleccionada.
212
+ * **Diseño Responsivo:** Si la consola no es lo suficientemente ancha para mostrar las 3 cajas simultáneamente, el visor se desliza suavemente mostrando `Sub 1 ── Sub 2` o la caja activa sin deformar la interfaz ni desbordar la pantalla.
213
+ * **Controles por Teclado:**
214
+ - `→` (Derecha): Despliega el submenú del siguiente nivel.
215
+ - `←` (Izquierda) o `Esc`: Cierra el nivel actual y regresa al nivel padre.
216
+ - `↑ / ↓`: Navega cíclicamente dentro de la caja activa.
217
+ - `Enter`: Despliega submenú o ejecuta la acción final si es una hoja del árbol.
218
+ * **Controles por Ratón (`mouse: true`):**
219
+ - Clic sobre cualquier caja enfoca ese nivel y esa opción.
220
+ - Segundo clic o clic sobre la opción activa ejecuta la acción.
221
+ - La rueda de scroll funciona dinámicamente sobre la caja que tiene el foco.
121
222
 
122
- def salir
123
- GRmenu.clear_screen
124
- puts Color.bright_yellow("¡Sesión finalizada con éxito!")
125
- exit(0)
126
- end
223
+ ---
127
224
 
128
- # 2. Nuevos ejemplos: Barra de Progreso, Spinner y Paginación
129
- def demo_barra_progreso
130
- GRmenu.clear_screen
131
- # Fácil y rápido: pasas el total y bar.advance(1) en tu bucle
132
- GRmenu.progress(10, title: "Descargando Paquetes", color: "cyan", style: 3) do |bar|
133
- 10.times do |i|
134
- sleep 0.1
135
- bar.advance(1, status: "Paso #{i + 1} de 10 completado")
136
- end
137
- end
138
- puts Color.bright_green("\n-> ¡Barra completada al 100%!")
139
- GRmenu.continue
140
- end
225
+ ### 3. Menú por Pestañas Multitarea (`GRmenu.tabs`)
141
226
 
142
- def demo_spinner
143
- GRmenu.clear_screen
144
- GRmenu.spinner("Conectando a la base de datos...", color: "green") do
145
- sleep 1.2
146
- end
147
- puts Color.bright_green("\n-> Conexión establecida con éxito.")
148
- GRmenu.continue
149
- end
227
+ Permite organizar interfaces complejas en paneles horizontales independientes:
150
228
 
151
- def demo_paginacion
152
- GRmenu.clear_screen
153
- opciones_largas = (1..20).map do |n|
154
- ["Elemento ##{n}", -> {
155
- GRmenu.clear_screen
156
- puts Color.bright_cyan("-> Has seleccionado el Elemento ##{n}")
157
- GRmenu.continue
158
- }, "Descripción opcional del elemento ##{n}"]
159
- end
229
+ ```text
230
+ [ Servidores ] Bases de Datos Configuración
160
231
 
161
- sub = GRmenu.new(
162
- opciones_largas,
163
- title: "Submenú Paginado",
164
- subtitle: "Usa ↑ / ↓ para ver el auto-scroll",
165
- style: 7,
166
- page_size: 6
167
- )
168
- sub.draw(size_max: 38)
169
- end
232
+ ╔══════════════════════════════════════════════════════════════════╗
233
+ ║ > Iniciar API Gateway ║
234
+ ║ Supervisar Worker Celery ║
235
+ ╚══════════════════════════════════════════════════════════════════╝
236
+ ```
170
237
 
171
- # 3. Instanciación del menú con TODOS los parámetros disponibles
172
- def main
173
- menu = GRmenu.new(
174
- [
175
- method(:iniciar_servidor), # 1. Method (sin info)
176
- :crear_respaldo, # 2. Symbol (sin info)
177
- ["Métricas del Sistema", method(:ver_metricas)], # 3. Array (sin info)
178
- ["Probar Barra de Progreso", method(:demo_barra_progreso), "Ejemplo fácil de GRmenu.progress al 100%"], # 4. CON Tooltip
179
- ["Probar Spinner de Carga", method(:demo_spinner), "Animación en tiempo real para funciones pesadas"],
180
- ["Probar Paginación (20 ítems)", method(:demo_paginacion), "Desplazamiento suave de opciones"],
181
- ["Ejecutar Lambda", -> { puts Color.pink("¡Lambda!"); GRmenu.continue }], # 5. Lambda/Proc
182
- ["Probar Banner Helper", method(:prueba_banner_rapido)], # 6. Helper GRmenu.banner
183
- ["Ver Ayuda y Referencia", method(:ver_ayuda_completa), "Abre la guía de ayuda interactiva"], # 7. Helper GRmenu.help
184
- method(:salir) # 8. Salir
185
- ],
186
- banner: " gr codE ",
187
- title: "Panel de Control",
188
- subtitle: "Consola de Administración TTY\nUsa ↑ / ↓ para navegar y Enter para seleccionar",
189
- style: 3,
190
- banner_style: 3,
191
- divider: true,
192
- center: true
193
- )
194
-
195
- # 4. Configuración completa de colores y estilos
196
- menu.set_style.font(1) # 1 = ANSI Shadow 3D
197
- menu.set_style.banner("cyan", 2) # Color del banner ASCII
198
- menu.set_style.title("yellow", 2) # Color del título del recuadro
199
- menu.set_style.subtitle("white", 1)# Color del subtítulo
200
- menu.set_style.divider("blue", 1) # Color de las líneas divisorias
201
- menu.set_style.border("yellow", 1) # Color del borde del marco de opciones
202
- menu.set_style.options("white", 1) # Color de opciones no seleccionadas
203
- menu.set_style.focus("green", 2) # Color y brillo de la opción resaltada
204
-
205
- # 5. Dibujar y lanzar el menú interactivo
206
- menu.draw(size_max: 38)
207
- end
238
+ ```ruby
239
+ tabs_data = {
240
+ "Servidores" => [
241
+ ["API Gateway", -> { GRmenu.card("Gateway", "Puerto 8080 activo", pause: false); sleep 1.2 }],
242
+ ["Worker Celery", -> { GRmenu.card("Worker", "42 tareas en cola", pause: false); sleep 1.2 }]
243
+ ],
244
+ "Bases de Datos" => [
245
+ ["PostgreSQL", -> { GRmenu.card("Postgres", "Conexiones: 12/100", pause: false); sleep 1.2 }],
246
+ ["Redis Cache", -> { GRmenu.card("Redis", "Memoria: 14 MB", pause: false); sleep 1.2 }]
247
+ ],
248
+ "Configuración" => [
249
+ ["Cambiar Tema Neon", -> { GRmenu.theme(:cyberpunk) }]
250
+ ]
251
+ }
252
+
253
+ tabs_menu = GRmenu.tabs(
254
+ tabs_data,
255
+ title: "Consola de Administración Multitarea",
256
+ style: 3,
257
+ mouse: true
258
+ )
208
259
 
209
- main
260
+ tabs_menu.draw
210
261
  ```
211
262
 
263
+ * **Atajos de Teclado:** Pulsa `Tab` para avanzar a la siguiente pestaña o `Shift+Tab` para retroceder.
264
+ * **Soporte de Ratón:** Haz clic directamente sobre el nombre de cualquier pestaña para cambiar a ella al instante.
265
+
212
266
  ---
213
267
 
214
- ## 📖 Guía y Referencia Rápida en Consola (`GRmenu.help`)
268
+ ### 4. Soporte Completo de Ratón (`mouse: true`)
215
269
 
216
- Para consultar en cualquier momento la lista de helpers, colores, fuentes, marcos y sintaxis directamente desde la terminal, podés ejecutar:
270
+ Al activar `mouse: true` en el constructor o en el CSS (`<<menu mouse:: true >>`), GRmenu activa el protocolo estándar **ANSI SGR 1006**:
271
+
272
+ * **Clic Izquierdo:**
273
+ - En opciones: Un clic enfoca la opción; un segundo clic la ejecuta.
274
+ - En pestañas: Cambia inmediatamente a la pestaña pulsada.
275
+ - En submenús: Despliega y enfoca el submenú correspondiente.
276
+ - En flechas de paginación (`▲` / `▼`): Sube o baja de página.
277
+ * **Rueda de Desplazamiento (*Scroll Wheel*):**
278
+ - Mueve el foco hacia arriba (`wheel up`) o hacia abajo (`wheel down`) dentro del menú o panel activo de forma ultra-fluida.
279
+
280
+ ---
281
+
282
+ ### 5. Rediseño de Entrada de Datos (`GRmenu.input`)
283
+
284
+ El método `GRmenu.input` cuenta con marco visual integrado, título superior centrado, etiqueta interior y soporte para contraseñas:
285
+
286
+ ```text
287
+ ╔══════════════ Ingresa tu Configuración ══════════════╗
288
+ ║ ║
289
+ ║ URL del Servidor: http://localhost:8080█ ║
290
+ ║ ║
291
+ ╚══════════════════════════════════════════════════════╝
292
+ ```
217
293
 
218
294
  ```ruby
219
- GRmenu.help
295
+ # Entrada con valor pre-cargado editable
296
+ servidor = GRmenu.input(
297
+ title: "Ingresa tu Configuración",
298
+ label: "URL del Servidor:",
299
+ default: "http://localhost:8080",
300
+ style: 3,
301
+ border_color: "neon_cyan",
302
+ title_color: "neon_yellow",
303
+ label_color: "white"
304
+ )
305
+
306
+ # Entrada segura con modo password (oculta caracteres con asteriscos)
307
+ token = GRmenu.input(
308
+ title: "Autenticación Segura",
309
+ label: "Token Secreto:",
310
+ password: true,
311
+ style: 3,
312
+ border_color: "neon_red"
313
+ )
314
+
315
+ # Uso rápido posicional
316
+ nombre = GRmenu.input("Ingresa tu Nombre:", default: "admin")
220
317
  ```
221
318
 
222
- O desde una instancia:
319
+ * **Controles:** Escritura normal, `Backspace` para borrar, `Ctrl+U` para limpiar toda la línea y `Enter` para confirmar.
320
+
321
+ ---
322
+
323
+ ### 6. Selector Múltiple con Checkboxes (`GRmenu.checkbox`)
324
+
325
+ Permite seleccionar múltiples elementos simultáneamente mediante casillas interactivas `[X]` / `[ ]`:
223
326
 
224
327
  ```ruby
225
- menu.help
328
+ paquetes = [
329
+ ["Servidor Nginx Web", true, "Proxy inverso de alta velocidad"],
330
+ ["Base de Datos PostgreSQL 16", true, "Motor de datos principal"],
331
+ ["Almacén de Caché Redis 7.2", false, "Caché en memoria RAM"],
332
+ ["Monitor Prometheus", true, "Métricas y alertas"]
333
+ ]
334
+
335
+ seleccionados = GRmenu.checkbox(
336
+ paquetes,
337
+ title: "Instalador de Paquetes",
338
+ color: "neon_cyan",
339
+ style: 3
340
+ )
341
+
342
+ puts "Seleccionados: #{seleccionados.inspect}"
226
343
  ```
227
344
 
345
+ * **Teclas de Control:**
346
+ - `Espacio`: Alterna marcado `[X]` / `[ ]`.
347
+ - `a`: Selecciona todos (*Select All*).
348
+ - `n`: Deselecciona todos (*Deselect All*).
349
+ - `i`: Invierte la selección.
350
+ - `Enter`: Confirma y devuelve la lista de elementos marcados.
351
+
228
352
  ---
229
353
 
230
- ## 🕹️ Controles
354
+ ### 7. Control Deslizante en Tiempo Real (`GRmenu.slider`)
231
355
 
232
- | Tecla | Acción |
233
- |-------------|---------------------------|
234
- | `↑` | Mover selección arriba |
235
- | `↓` | Mover selección abajo |
236
- | `Enter` | Ejecutar opción seleccionada |
237
- | `q` | Salir del menú |
356
+ Permite seleccionar numéricamente un valor dentro de un rango mediante una barra horizontal en tiempo real:
238
357
 
239
- ---
358
+ ```ruby
359
+ ram = GRmenu.slider(
360
+ "Asignar Memoria RAM:",
361
+ min: 1,
362
+ max: 64,
363
+ step: 1,
364
+ default: 16,
365
+ unit: "GB",
366
+ color: "gold",
367
+ style: 3
368
+ )
369
+ ```
240
370
 
241
- ## 🔤 Fuentes ASCII 3D para Banners (`font: 1` al `10`)
242
-
243
- | ID | Estilo | Muestra (`RUBY`) |
244
- |:--:|--------------------------|------------------|
245
- | **`1`** | **ANSI Shadow 3D (Default)** | `██████╗ ██╗ ██╗ ██████╗ ██╗ ██╗` |
246
- | **`2`** | **Slant 3D (FIGlet)** | ` ____ __ __ ____ __ __` |
247
- | **`3`** | **Doom / Standard 3D** | ` ____ _ _ ____ __ __` |
248
- | **`4`** | **Graffiti Shadow 3D** | ` ,---. ,--. ,--. ,---. ,--. ,--.` |
249
- | **`5`** | **Small Slant / Mini 3D**| ` ___ _ _ ___ _ _` |
250
- | **`6`** | **Modular Pipe 3D** | ` _____ _____ _____ _____` |
251
- | **`7`** | **Bubble / Round Gothic**| ` ____ _ _ ____ _ _` |
252
- | **`8`** | **Double-Line Wire 3D** | ` ╔═════╗ ║ ║ ╔════╗ ║ ║` |
253
- | **`9`** | **Solid Fat 3D Block** | ` ██████▄ ██ ██ ██████▄ ██ ██` |
254
- | **`10`**| **Arcade Stars Matrix** | ` ★★★★ ★ ★ ★★★★ ★ ★` |
371
+ * **Teclas:** `← / →` ajusta de 1 en 1 (`step`), `↑ / ↓` realiza saltos rápidos de 5 pasos, `Enter` confirma.
255
372
 
256
373
  ---
257
374
 
258
- ## 🖼️ Estilos de Marco (`style` / `banner_style: 1` al `20`)
259
-
260
- | `style` | Vista previa | `style` | Vista previa |
261
- |:---:|:---|:---:|:---|
262
- | 1 | `#===#` | 11 | `░░░░░` |
263
- | 2 | `┌───┐` *(Línea simple)* | 12 | `█████` |
264
- | 3 | `╔═══╗` *(Doble línea - Default banner)* | 13 | `*****` |
265
- | 4 | `┏━━━┓` *(Línea gruesa)* | 14 | `+++++` |
266
- | 5 | `╒═══╕` | 15 | `=====` |
267
- | 6 | `╓───╖` | 16 | `~~~~~` |
268
- | 7 | `╭───╮` *(Curvas redondeadas)* | 17 | `-----` |
269
- | 8 | `▛▀▀▀▜` *(Bloques outline)* | 18 | `◆◆◆◆◆` |
270
- | 9 | `▓▓▓▓▓` | 19 | `●○○○●` *(Círculos - Default opciones)* |
271
- | 10 | `▒▒▒▒▒` | 20 | `★☆☆☆★` *(Estrellas)* |
375
+ ### 8. Diálogos Nativos de Confirmación (`GRmenu.confirm`)
376
+
377
+ Cuadros emergentes Si / No con botones activos interactivos:
378
+
379
+ ```ruby
380
+ if GRmenu.confirm("¿Deseas aplicar los cambios en producción?", default: true, color: "neon_green", style: 3)
381
+ puts "Aplicando..."
382
+ end
383
+ ```
384
+
385
+ * **Teclas:** `← / →` para alternar entre `[ Sí ]` y `[ No ]`, `Enter` para confirmar.
272
386
 
273
387
  ---
274
388
 
275
- ## 🎨 Paleta de Colores y Módulo `Color`
389
+ ### 9. Tablas Interactivas con Buscador y Ordenamiento (`GRmenu.table`)
390
+
391
+ Visualiza y navega colecciones de datos tabulares con buscador instantáneo, ordenamiento por columnas con la tecla `s`, paginación y protección anti-desbordes:
392
+
393
+ ```text
394
+ ╔════════════════ Monitor de Infraestructura ════════════════╗
395
+ ║ Buscar: gate█ ║
396
+ ║════════════════════════════════════════════════════════════║
397
+ ║ ID │ SERVICIO │ ESTADO │ LATENCIA ║
398
+ ║───────┼──────────────────┼───────────────┼─────────────────║
399
+ ║ > 01 │ API Gateway │ Operativo │ 12ms ║
400
+ ║────────────────────────────────────────────────────────────║
401
+ ║ ↑/↓ Mover | s Ordenar | / Buscar | Enter Seleccionar ║
402
+ ╚════════════════════════════════════════════════════════════╝
403
+ ```
276
404
 
277
405
  ```ruby
278
- puts Color.green("Texto en verde")
279
- puts Color.bright_cyan("Cian brillante")
280
- puts Color.yellow("Texto en amarillo")
281
- puts Color.bright_magenta("Magenta brillante")
282
- puts Color.purple("Texto en morado")
283
- puts Color.orange("Texto en naranja")
284
- puts Color.pink("Texto en rosa")
285
- puts Color.gray("Texto en gris")
406
+ headers = ["ID", "SERVICIO", "ESTADO", "LATENCIA"]
407
+ filas = [
408
+ ["01", "API Gateway", "Operativo", "12ms"],
409
+ ["02", "PostgreSQL Primary", "Operativo", "2ms"],
410
+ ["03", "Redis Cache", "Operativo", "1ms"],
411
+ ["04", "Workers Celery", "Ocupado", "45ms"]
412
+ ]
413
+
414
+ # Llamada posicional
415
+ fila = GRmenu.table(headers, filas, style: 3, header_color: "neon_yellow")
416
+
417
+ # Llamada por palabra clave
418
+ fila = GRmenu.table(
419
+ headers: headers,
420
+ rows: filas,
421
+ title: "Monitor de Infraestructura",
422
+ search: true,
423
+ sort: true,
424
+ page_size: 5,
425
+ style: 3
426
+ )
427
+
428
+ if fila
429
+ puts "Fila elegida: #{fila.join(' | ')}"
430
+ end
286
431
  ```
287
432
 
288
- Colores soportados: `black`, `gray`, `red`, `green`, `yellow`, `blue`, `magenta`, `purple`, `pink`, `cyan`, `aqua`, `orange`, `white`.
433
+ ---
434
+
435
+ ### 10. Tarjetas Estilizadas y Alertas (`GRmenu.card` y `GRmenu.alert`)
436
+
437
+ Cuadros informativos con división automática de párrafos (*word-wrapping*) y soporte completo para colores TrueColor y Neón:
438
+
439
+ ```ruby
440
+ # Alertas contextuales
441
+ GRmenu.alert(:success, "Conexión establecida con el servidor.")
442
+ GRmenu.alert(:warning, "Memoria RAM al 85%.", pause: false)
443
+ GRmenu.alert(:error, "Fallo al conectar con el cluster.", pause: false)
444
+ GRmenu.alert(:info, "Actualización disponible.")
445
+
446
+ # 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)
448
+
449
+ # Tarjeta informativa con keywords
450
+ GRmenu.card(
451
+ title: "Métricas de Producción",
452
+ content: "Peticiones/seg: 18,400 req/s\nLatencia p99: 11.4 ms\nSalud del cluster: 100%",
453
+ border_color: "#FF0055",
454
+ title_color: "#00F5FF",
455
+ content_color: "gold",
456
+ style: 7
457
+ )
458
+ ```
289
459
 
290
460
  ---
291
461
 
292
- ## 🛠️ Helpers Nativos en Modo Crudo
462
+ ### 11. Renderizado Universal de Imágenes en Terminal (`GRmenu.image`)
463
+
464
+ Decodifica y renderiza cualquier formato de imagen (PNG, JPEG, JPG, WEBP, GIF, BMP) con **micro-subpíxeles ANSI TrueColor de 24 bits** usando medios bloques `▀` (2 píxeles verticales por celda, relación de aspecto 1:1) y remuestreo Lanczos:
293
465
 
294
466
  ```ruby
295
- # 1. Limpia la pantalla al instante con secuencias ANSI
296
- GRmenu.clear_screen # o GRmenu.clr
467
+ # 1. Renderizado directo en consola
468
+ GRmenu.image("assets/logo.png", width: 40, style: 3, color: "neon_cyan", center: true)
297
469
 
298
- # 2. Imprime un banner o logo gigante responsivo
299
- GRmenu.banner("SECURE", 0, color: "magenta", style: 3, font: 1)
470
+ # 2. Como cabecera gráfica dentro de un menú interactivo
471
+ menu = GRmenu.new(
472
+ opciones,
473
+ image: "assets/banner.png",
474
+ image_width: 44,
475
+ title: "Galería con Imagen"
476
+ )
477
+ menu.draw
478
+ ```
300
479
 
301
- # 3. Spinner animado en tiempo real mientras corre un bloque
302
- GRmenu.spinner("Conectando al clúster...", color: "green") do
303
- hacer_tarea_pesada()
480
+ ---
481
+
482
+ ### 12. Barras de Progreso y Spinners de Carga
483
+
484
+ ```ruby
485
+ # Barra de progreso con avance dinámico
486
+ GRmenu.progress(100, title: "Descargando Paquetes", color: "neon_yellow", style: 3) do |bar|
487
+ 10.times do |i|
488
+ sleep 0.1
489
+ bar.advance(10, status: "Procesando bloque #{i + 1} de 10...")
490
+ end
304
491
  end
305
492
 
306
- # 4. Barra de progreso porcentual dentro de un recuadro estilizado
307
- GRmenu.progress(10, title: "Exportando Datos", color: "cyan") do |bar|
308
- 10.times { |i| bar.advance(1, status: "Paso #{i + 1}/10") }
493
+ # Spinner animado no bloqueante en hilo secundario
494
+ resultado = GRmenu.spinner("Conectando con el cluster remoto...", color: "neon_cyan") do
495
+ sleep 1.2
496
+ "Conexión exitosa"
309
497
  end
498
+ ```
310
499
 
311
- # 5. Línea divisoria horizontal adaptable
312
- GRmenu.div(60, "blue")
500
+ ---
501
+
502
+ ### 13. Iluminación Dinámica Living Neon a 30 FPS
313
503
 
314
- # 6. Pausa de consola que espera una sola tecla en modo TTY crudo
315
- GRmenu.continue("Presiona cualquier tecla para continuar...")
504
+ 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:
316
505
 
317
- # 7. Guía interactiva en consola
318
- GRmenu.help
506
+ ```ruby
507
+ menu = GRmenu.new(
508
+ opciones,
509
+ banner: "THEMES",
510
+ title: "Efecto Neón Vivo",
511
+ style: 3,
512
+ animate: "diagonal"
513
+ )
514
+ menu.set_style.border("neon_red").banner("neon_red").focus("neon_yellow")
515
+ menu.draw
319
516
  ```
320
517
 
321
518
  ---
322
519
 
323
- ## 📖 Referencia de la API
520
+ ### 14. Banners ASCII 3D y Módulo de Color
324
521
 
325
- ### `GRmenu.new(functions, ...)`
522
+ ```ruby
523
+ # Banners en arte ASCII 3D (fuentes del 1 al 10)
524
+ GRmenu.banner("ADMIN", 0, color: "neon_red", style: 3, font: 1)
525
+
526
+ # Módulo Color / C / Colors
527
+ puts Color.rgb("Texto degradado en onda arcoíris continua")
528
+ puts Color.hex("#FF0055", "Texto en Rojo Carmesí")
529
+ 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")
532
+ ```
326
533
 
327
- | Parámetro | Tipo | Descripción |
328
- |------------------|------------|-------------|
329
- | `functions` | `Array` | Opciones a mostrar (`Method`, `Symbol`, `Array ["Nombre", acción, "Descripción"]`, `Proc`/`lambda`). |
330
- | `banner:` | `String` | Texto gigante a renderizar en arte ASCII 3D arriba del menú. |
331
- | `title:` | `String` | Título en la cabecera del marco de opciones. |
332
- | `subtitle:` | `String` | Subtítulo o descripción (soporta múltiples líneas con `\n`). |
333
- | `font:` | `Integer` | Fuente ASCII 3D del banner (1 al 10, default 1). |
334
- | `style:` | `Integer` | Estilo de marco para las opciones (1 al 20, default 19). |
335
- | `banner_style:` | `Integer` | Estilo de marco para el banner (1 al 20, default 3). |
336
- | `divider:` | `Boolean` | Dibuja líneas divisorias a la par del ancho del banner. |
337
- | `center:` | `Boolean` | Centra simétricamente el subtítulo y menú de opciones (default `true`). |
338
- | `page_size:` | `Integer` | (Opcional) Número máximo de opciones visibles en pantalla para auto-paginación. |
534
+ ---
339
535
 
340
- ### `GRmenu.spinner(message, color: "cyan", &block)`
536
+ ### 15. Sistema de Temas .gr y CSS para TUI
341
537
 
342
- Ejecuta un bloque en segundo plano mientras dibuja una animación giratoria y muestra `✔ Mensaje ¡Listo!` al terminar.
538
+ GRmenu incluye un motor de temas declarativos en archivos `.gr` con sintaxis limpia tipo CSS que cubre menús, submenús, pestañas, inputs, tablas, tarjetas, sliders y checkboxes.
343
539
 
344
- ### `GRmenu.progress(total, title:, color:, style:, &block)`
540
+ #### Cargar Temas Integrados:
541
+ ```ruby
542
+ GRmenu.theme(:neon_red) # Rojos eléctricos incandescentes y foco amarillo
543
+ GRmenu.theme(:cyberpunk) # Neones cian, amarillo y efecto Chroma
544
+ GRmenu.theme(:matrix) # Verde fosforescente terminal hacker
545
+ GRmenu.theme(:dracula) # Morados, fucsias y cian
546
+ GRmenu.theme(:nord) # Azules árticos y paleta fría
547
+ GRmenu.theme(:monokai) # Amarillos, verdes y magentas
548
+ GRmenu.theme(:sunset) # Atardecer cálido en rojos, naranjas y dorados
549
+ ```
345
550
 
346
- Crea una barra de progreso porcentual dentro de un recuadro estilizado. El bloque recibe el objeto `bar` con los métodos `bar.advance(n, status:)` y `bar.set(valor, status:)`.
551
+ #### Especificación Completa de un Archivo de Tema (`mi_tema.gr`):
552
+ ```gr
553
+ GRmenu::config<-1->
554
+
555
+ @theme:: "CyberNeon"
556
+ @author:: "GRcode"
557
+ @version:: "4.1"
558
+
559
+ <<menu
560
+ style:: 3
561
+ banner_style:: 3
562
+ font:: 1
563
+ animate:: diagonal
564
+ desc_prefix:: ->
565
+ center:: true
566
+ mouse:: true
567
+ border:: neon_cyan:1
568
+ title:: neon_yellow:2
569
+ focus:: neon_red:2
570
+ options:: white:1
571
+ banner:: neon_magenta:2
572
+ subtitle:: cyan:1
573
+ divider:: blue:1
574
+ >>
575
+
576
+ <<submenu
577
+ style:: 3
578
+ border:: neon_yellow:1
579
+ focus:: neon_cyan:2
580
+ options:: white:1
581
+ title:: neon_yellow:2
582
+ arrow:: neon_cyan:2
583
+ >>
584
+
585
+ <<tabs
586
+ active_tab:: neon_yellow:2
587
+ tab_color:: gray:1
588
+ indicator:: neon_cyan:2
589
+ >>
590
+
591
+ <<input
592
+ style:: 3
593
+ border_color:: neon_cyan:1
594
+ title_color:: neon_yellow:2
595
+ label_color:: white:2
596
+ >>
597
+
598
+ <<table
599
+ style:: 3
600
+ header_color:: #00F5FF
601
+ border_color:: #FF0055
602
+ selected_row:: gold:2
603
+ row_color:: white:1
604
+ zebra_striping:: true
605
+ >>
606
+
607
+ <<card
608
+ style:: 7
609
+ border_color:: #FF0055
610
+ title_color:: #00F5FF
611
+ content_color:: white:1
612
+ >>
613
+
614
+ <<slider
615
+ style:: 3
616
+ color:: #FF0055
617
+ fill_char:: █
618
+ empty_char:: ░
619
+ >>
620
+
621
+ <<checkbox
622
+ style:: 3
623
+ color:: #FF0055
624
+ checked_mark:: [X]
625
+ unchecked_mark:: [ ]
626
+ >>
627
+ ```
347
628
 
348
- ### `menu.set_style`
629
+ Para aplicarlo a todo tu sistema:
630
+ ```ruby
631
+ GRmenu.import_config("mi_tema.gr")
632
+ ```
349
633
 
350
- | Método | Descripción |
351
- |-------------------------------------|-------------------------------------------|
352
- | `set_style.font(id)` | Cambia el tipo de fuente ASCII 3D (1..10). |
353
- | `set_style.banner(color, level=2)` | Color y brillo del banner ASCII 3D. |
354
- | `set_style.title(color, level=2)` | Color y brillo del título del marco. |
355
- | `set_style.subtitle(color, level=1)`| Color y brillo del subtítulo. |
356
- | `set_style.divider(color, level=1)` | Color y brillo de las líneas divisorias. |
357
- | `set_style.border(color, level=1)` | Color y brillo del marco de opciones. |
358
- | `set_style.options(color, level=1)` | Color y brillo de opciones no activas. |
359
- | `set_style.focus(color, level=2)` | Color y brillo de la opción resaltada. |
634
+ ---
635
+
636
+ ### 16. Exportación de Temas desde Terminal / CLI (-theme)
637
+
638
+ Puedes extraer y exportar el tema configurado en cualquier script de Ruby directamente a un archivo `.gr`:
639
+
640
+ ```bash
641
+ # Exporta el tema del script con nombre automático:
642
+ ruby mi_app.rb -theme
643
+
644
+ # Exporta a un archivo de salida específico:
645
+ ruby mi_app.rb -theme -o salida_tema.gr
646
+ ```
647
+
648
+ De forma programática en Ruby:
649
+ ```ruby
650
+ GRmenu.export_from_file("mi_app.rb", "tema_extraido.gr")
651
+ menu.export_theme("mi_tema.gr")
652
+ ```
653
+
654
+ ---
655
+
656
+ ### 17. CSS Inline en el Código (`<<-GR`)
657
+
658
+ Puedes inyectar bloques de estilo tipo `<style>` directamente en tu script sin crear archivos `.gr` adicionales:
659
+
660
+ ```ruby
661
+ menu = GRmenu.new(opciones, title: "App con CSS", mouse: true)
662
+
663
+ menu.style(<<-GR)
664
+ <<menu
665
+ style:: 3
666
+ mouse:: true
667
+ border:: neon_cyan:1
668
+ title:: neon_yellow:2
669
+ focus:: neon_red:2
670
+ >>
671
+ <<submenu
672
+ style:: 3
673
+ border:: neon_yellow:1
674
+ focus:: neon_cyan:2
675
+ >>
676
+ <<tabs
677
+ active_tab:: neon_yellow:2
678
+ tab_color:: gray:1
679
+ >>
680
+ <<input
681
+ style:: 3
682
+ border_color:: neon_cyan:1
683
+ title_color:: neon_yellow:2
684
+ label_color:: white:2
685
+ >>
686
+ GR
687
+
688
+ menu.draw
689
+ ```
690
+
691
+ ---
692
+
693
+ ## Laboratorio de Nuevas Funcionalidades
694
+
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:
696
+
697
+ ```bash
698
+ ruby ruby/eaja.rb
699
+ ```
700
+
701
+ O el laboratorio general de componentes:
702
+
703
+ ```bash
704
+ ruby ruby/e.rb
705
+ ```
706
+
707
+ ---
360
708
 
361
- ### `menu.draw(size_max: 20)`
709
+ ## Catálogo Visual de Fuentes 3D
362
710
 
363
- Inicia el menú interactivo con navegación por teclado y bloquea el hilo hasta que el usuario elige una opción (`Enter`) o sale (`q`).
711
+ Configura la tipografía mediante el parámetro `font: 1..10`:
712
+
713
+ | ID | Nombre de Fuente | Muestra Visual |
714
+ |:--:|:-----------------|:---------------|
715
+ | `1` | **ANSI Shadow 3D** *(Default)* | `██████╗ ██╗ ██╗` |
716
+ | `2` | **Slant 3D** | ` ____ __ __` |
717
+ | `3` | **Doom / Standard 3D** | ` ____ _ _` |
718
+ | `4` | **Graffiti Shadow 3D** | ` ,---. ,--. ,--.` |
719
+ | `5` | **Small Slant / Mini 3D** | ` ___ _ _` |
720
+ | `6` | **Modular Pipe 3D** | ` _____ _____` |
721
+ | `7` | **Bubble / Round Gothic** | ` ____ _ _` |
722
+ | `8` | **Double-Line Wire 3D** | ` ╔═════╗ ║ ║` |
723
+ | `9` | **Solid Fat 3D Block** | ` ██████▄ ██ ██` |
724
+ | `10`| **Arcade Stars Matrix** | ` ★★★★ ★ ★` |
364
725
 
365
726
  ---
366
727
 
367
- ## 🤝 Contribuir
728
+ ## Catálogo Visual de Marcos y Bordes
729
+
730
+ Configura el diseño del marco mediante el parámetro `style: 1..20`:
368
731
 
369
- Las contribuciones son bienvenidas. Podés abrir un [issue](https://github.com/JoseEduardoGR/GRmenu/issues) o enviar un pull request.
732
+ | ID | Muestra | ID | Muestra | ID | Muestra | ID | Muestra |
733
+ |:--:|:--------|:--:|:--------|:--:|:--------|:--:|:--------|
734
+ | `1` | `#####` (Hash) | `6` | `╓───╖` (Mixto) | `11`| `░░░░░` (Sombra suave) | `16`| `~~~~~` (Ondas) |
735
+ | `2` | `┌───┐` (Simple) | `7` | `╭───╮` (Curvas) | `12`| `█████` (Bloque) | `17`| `-----` (Guion) |
736
+ | `3` | `╔═══╗` (Doble) | `8` | `▛▀▀▀▜` (Outline) | `13`| `*****` (Asterisco) | `18`| `◆◆◆◆◆` (Rombos) |
737
+ | `4` | `┏━━━┓` (Gruesa) | `9` | `▓▓▓▓▓` (Sombra oscura) | `14`| `+++++` (Cruces) | `19`| `●○○○●` (Círculos) |
738
+ | `5` | `╒═══╕` (Mixto) | `10`| `▒▒▒▒▒` (Sombra media) | `15`| `=====` (Doble simple) | `20`| `★☆☆☆★` (Estrellas) |
370
739
 
371
740
  ---
372
741
 
373
- ## 📄 Licencia
742
+ ## Referencia Exhaustiva de la API de Ruby
743
+
744
+ ### Constructor `GRmenu.new(functions, **opciones)`
745
+
746
+ | Parámetro | Tipo | Valor por Defecto | Descripción |
747
+ |:----------|:-----|:------------------|:------------|
748
+ | `functions` | `Array` | *Obligatorio* | Lista de métodos, símbolos, arrays `[nombre, acción, tooltip]`, submenús anidados o `Proc`. |
749
+ | `title:` | `String` | `""` | Título centrado en la cabecera del marco de opciones. |
750
+ | `banner:` | `String` | `""` | Texto convertido a arte ASCII 3D arriba del menú. |
751
+ | `subtitle:` | `String` | `""` | Descripción o subtítulo (soporta saltos de línea `\n`). |
752
+ | `search:` | `Boolean` | `false` | Activa el buscador instantáneo interactivo mientras se escribe. |
753
+ | `columns:` | `Integer` | `1` | Cantidad de columnas para navegación en cuadrícula 2D. |
754
+ | `page_size:` | `Integer` | `auto` | Número máximo de filas visibles antes de activar auto-scroll. |
755
+ | `mouse:` | `Boolean` | `false` | Activa soporte de ratón ANSI SGR 1006 (clic, scroll, submenús). |
756
+ | `tabs:` | `Hash` | `nil` | Estructura de pestañas multitarea horizontales. |
757
+ | `style:` | `Integer` | `19` | Estilo de marco para las opciones (1 al 20). |
758
+ | `banner_style:` | `Integer` | `3` | Estilo de marco para el banner 3D (1 al 20). |
759
+ | `font:` | `Integer` | `1` | Fuente tipográfica del banner ASCII (1 al 10). |
760
+ | `animate:` | `String/Bool`| `false` | Efecto de iluminación ("diagonal", "linear", "fade", "rgb"). |
761
+ | `desc_prefix:` | `String` | `"[i]"` | Prefijo visual para el tooltip de ayuda. |
762
+ | `image:` | `String` | `nil` | Ruta a imagen de cabecera (PNG/JPG/WEBP/GIF/BMP). |
763
+ | `image_width:` | `Integer` | `40` | Ancho en columnas de terminal para la imagen. |
764
+ | `divider:` | `Boolean/Int` | `true` | Líneas divisorias horizontales ajustadas al marco. |
765
+ | `center:` | `Boolean` | `true` | Centrado horizontal simétrico automático. |
766
+
767
+ ### Métodos Estáticos y Componentes
768
+
769
+ | Método | Firma | Retorno |
770
+ |:-------|:------|:--------|
771
+ | `GRmenu.tabs` | `(tabs_hash, **opciones)` | Crea un menú interactivo dividido por pestañas horizontales. |
772
+ | `GRmenu.theme` | `(nombre_o_simbolo)` | Carga un tema `.gr` predefinido para todo el sistema. |
773
+ | `GRmenu.import_config` | `(ruta_archivo_gr)` | Carga un archivo de tema `.gr` personalizado. |
774
+ | `GRmenu.export_from_file`| `(script_origen, archivo_gr)` | Extrae el tema de un script sin correr bucles. |
775
+ | `GRmenu.style` | `(texto_css_gr)` | Inyecta estilos CSS inline globalmente. |
776
+ | `GRmenu.table` | `(headers, rows, ...)` | Muestra tabla interactiva con buscador y ordenamiento. |
777
+ | `GRmenu.card` | `(title, content, ...)` | Muestra tarjeta con auto-wrap y `pause:` configurable. |
778
+ | `GRmenu.alert` | `(tipo, mensaje, ...)` | Muestra alerta emergente contextual. |
779
+ | `GRmenu.checkbox` | `(items, ...)` | Devuelve `Array` con elementos marcados (`[X]`). |
780
+ | `GRmenu.slider` | `(prompt, ...)` | Devuelve valor numérico seleccionado en barra interactiva. |
781
+ | `GRmenu.confirm` | `(pregunta, ...)` | Devuelve booleano (`true`/`false`) con botones interactivos. |
782
+ | `GRmenu.input` | `(title: ..., label: ..., ...)` | Entrada de texto rediseñada con marco y cursor `█`. |
783
+ | `GRmenu.image` | `(filepath, width:, style:, color:)` | Renderiza imagen en TrueColor 24-bit (Lanczos / Zlib). |
784
+ | `GRmenu.progress` | `(total = 100, ... &bloque)` | Barra de progreso dinámica con bloque. |
785
+ | `GRmenu.spinner` | `(mensaje, ... &bloque)` | Spinner animado no bloqueante. |
786
+ | `GRmenu.banner` | `(texto, delay = 0, ...)` | Imprime banner ASCII 3D. |
787
+ | `GRmenu.div` | `(long = nil, color = "blue", ...)` | Imprime línea divisoria horizontal. |
788
+ | `GRmenu.clear_screen` | `()` (Alias: `GRmenu.clr`) | Limpia la pantalla y el scrollback. |
789
+ | `GRmenu.continue` | `(texto = "Presiona...")` | Pausa hasta pulsar una tecla. |
790
+ | `GRmenu.help` | `()` | Muestra guía completa de documentación en consola. |
374
791
 
375
- Distribuido bajo licencia [MIT](LICENSE).
792
+ ---
793
+
794
+ ## Mapa de Controles: Teclado y Ratón
795
+
796
+ | Control | Contexto | Acción Realizada |
797
+ |:--------|:---------|:-----------------|
798
+ | `↑` (Arriba) / `k` | Menús / Tablas / Checkbox | Mueve el foco hacia arriba (con salto continuo *Snake* en extremos). |
799
+ | `↓` (Abajo) / `j` | Menús / Tablas / Checkbox | Mueve el foco hacia abajo. |
800
+ | `Tab` / `Shift+Tab` | Pestañas (`tabs`) | Cambia a la siguiente o anterior pestaña. |
801
+ | `→` (Derecha) | Submenús / Grid 2D | Abre submenú lateral (hasta 3 niveles) o salta columna en grid 2D. |
802
+ | `←` (Izquierda) | Submenús / Grid 2D | Cierra el submenú lateral actual y regresa al nivel padre. |
803
+ | `Clic Izquierdo` | Ratón (`mouse: true`) | Enfoca la opción; si ya está enfocada, la ejecuta inmediatamente. |
804
+ | `Clic en Pestaña` | Ratón (`mouse: true`) | Salta instantáneamente a la pestaña seleccionada. |
805
+ | `Clic en Submenú` | Ratón (`mouse: true`) | Abre o enfoca la caja del submenú correspondiente. |
806
+ | `Rueda de Scroll` | Ratón (`mouse: true`) | Desplaza el foco arriba o abajo (↑ / ↓) fluidamente en el panel activo. |
807
+ | `Clic en ▲ / ▼` | Ratón (`mouse: true`) | Sube o baja de página en paginación. |
808
+ | `s` / `S` | Tablas | Ordena la tabla por la columna actual alternando ASC/DESC. |
809
+ | `Espacio` | Checkbox | Marca o desmarca la casilla del elemento actual `[X]` / `[ ]`. |
810
+ | `a` / `A` | Checkbox | Marca todos los elementos (*Select All*). |
811
+ | `n` / `N` | Checkbox | Desmarca todos los elementos (*Deselect All*). |
812
+ | `i` / `I` | Checkbox | Invierte la selección de todos los elementos. |
813
+ | `←` / `→` o `h` / `l`| Slider | Ajusta el valor numérico en un incremento (`step`). |
814
+ | `↑` / `↓` o `k` / `j`| Slider | Salto rápido de 5 pasos en el valor numérico. |
815
+ | `Enter` | Global | Ejecuta la acción seleccionada o confirma el formulario. |
816
+ | `q` / `Esc` | Global | Sale del menú o cancela la operación actual. |
817
+ | `Backspace` | Buscador / Input | Borra el último caracter ingresado. |
818
+ | `Ctrl+U` | Buscador / Input | Limpia todo el texto ingresado. |
819
+
820
+ ---
376
821
 
377
- <div align="center">
822
+ ## Licencia
378
823
 
379
- Hecho por [grcode](https://github.com/JoseEduardoGR)
824
+ Distribuido bajo licencia **MIT**. Consulta [`LICENSE`](LICENSE) para más detalles.
380
825
 
381
- </div>
826
+ Desarrollado con precisión por **[grcode](https://github.com/JoseEduardoGR)**