grmenu 3.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,102 +1,124 @@
1
- # GRmenu (Ruby) v3.0
1
+ # GRmenu (Ruby) v4.0.1
2
2
 
3
- **Suite TUI Profesional y Ligera para la Creacion de Interfaces de Linea de Comandos en Terminales TTY.**
3
+ **Suite TUI Profesional y Ligera para la Creación de Interfaces de Línea de Comandos en Terminales TTY.**
4
4
 
5
- Menus interactivos por teclado, seleccion multiple con casillas de verificacion, controles deslizantes en tiempo real, renderizado de imagenes ANSI TrueColor de 24 bits, modo cromatico RGB animado a 30 FPS, modales nativos de confirmacion y texto, buscador instantaneo en vivo, cuadriculas bidimensionales, barras de progreso y banners 3D sin dependencias externas.
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.
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)
9
9
  [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-blue)](https://github.com/JoseEduardoGR/GRmenu)
10
10
  [![Ruby](https://img.shields.io/badge/ruby-%3E%3D%202.6-red.svg)](https://www.ruby-lang.org)
11
11
 
12
+ ![Demo de GRmenu en Ruby](assets/demo.png)
13
+
12
14
  ---
13
15
 
14
16
  ## Tabla de Contenidos
15
17
 
16
- 1. [Por que elegir GRmenu?](#-por-que-elegir-grmenu)
17
- 2. [Instalacion y Requisitos](#-instalacion-y-requisitos)
18
- 3. [Inicio Rapido en 10 Segundos](#-inicio-rapido-en-10-segundos)
19
- 4. [Guia de Componentes y Caracteristicas](#-guia-de-componentes-y-caracteristicas)
20
- - [1. Menu Interactivo Principal (Buscador, Grid 2D y Paginacion)](#1-menu-interactivo-principal)
21
- - [2. Seleccion Multiple con Checkboxes (GRmenu.checkbox)](#2-seleccion-multiple-con-checkboxes)
22
- - [3. Control Deslizante Interactivo (GRmenu.slider)](#3-control-deslizante-interactivo)
23
- - [4. Renderizado Universal de Imagenes (GRmenu.image)](#4-renderizado-universal-de-imagenes)
24
- - [5. Modales Nativos de Confirmacion y Entrada (confirm e input)](#5-modales-nativos-de-confirmacion-y-entrada)
25
- - [6. Modo RGB Chroma Wave Animado a 30 FPS](#6-modo-rgb-chroma-wave-animado)
26
- - [7. Barra de Progreso y Spinner de Carga](#7-barra-de-progreso-y-spinner-de-carga)
27
- - [8. Banners 3D y Lineas Divisorias](#8-banners-3d-y-lineas-divisorias)
28
- - [9. Modulo Independiente de Color (Color / C)](#9-modulo-independiente-de-color)
29
- 5. [Catalogo Visual de Fuentes 3D (1 al 10)](#-catalogo-visual-de-fuentes-3d)
30
- 6. [Catalogo Visual de Marcos y Bordes (1 al 20)](#-catalogo-visual-de-marcos-y-bordes)
31
- 7. [Referencia Exhaustiva de la API](#-referencia-exhaustiva-de-la-api)
32
- 8. [Mapa de Controles y Teclado](#-mapa-de-controles-y-teclado)
33
- 9. [Recetas y Casos de Uso del Mundo Real](#-recetas-y-casos-de-uso-del-mundo-real)
34
- 10. [Licencia](#-licencia)
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)
35
45
 
36
46
  ---
37
47
 
38
- ## Por que elegir GRmenu?
48
+ ## Por qué elegir GRmenu?
39
49
 
40
- - **Cero Dependencias Externas:** Funciona exclusivamente con la libreria estandar de Ruby (`io/console`, `json`, `zlib`), sin gemas pesadas ni binarios nativos requeridos.
41
- - **Modo TTY Crudo Instantaneo:** Control milimetrico de la consola sin parpadeo de pantalla y con captura instantanea de eventos de teclado (0 ms de latencia).
42
- - **Animaciones Sin Lag a 30 FPS:** Motor de renderizado reactivo no bloqueante basado en `IO.select` que permite efectos visuales dinamicos continuos sin saturar la CPU ni bloquear la entrada del usuario.
43
- - **Multiplataforma Real:** Totalmente compatible con Linux, macOS y Windows (Windows Terminal, PowerShell, CMD y VS Code Terminal).
44
- - **Diseno Modular y Expresivo:** Desde un simple menu de 3 lineas hasta complejas suites de instalacion, paneles DevOps o herramientas de configuracion.
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).
45
60
 
46
61
  ---
47
62
 
48
- ## Instalacion y Requisitos
63
+ ## Instalación y Requisitos
49
64
 
50
65
  Requiere **Ruby >= 2.6.0**.
51
66
 
52
- ### Via RubyGems
67
+ ### Vía RubyGems
53
68
 
54
69
  ```bash
55
70
  gem install grmenu
56
71
  ```
57
72
 
58
- ### Via Gemfile
73
+ ### Vía Gemfile
59
74
 
60
75
  ```ruby
61
- gem 'grmenu', '~> 3.0'
76
+ gem 'grmenu', '~> 4.0'
62
77
  ```
63
78
 
64
- ### Requerimiento directo en scripts
79
+ ### Requerimiento en scripts de Ruby
65
80
 
66
81
  ```ruby
67
- require 'GRmenu'
82
+ require 'grmenu'
68
83
  ```
69
84
 
70
85
  ---
71
86
 
72
- ## Inicio Rapido en 10 Segundos
87
+ ## Inicio Rápido en 10 Segundos
73
88
 
74
- Crea un archivo llamado `app.rb` y ejecuta `ruby app.rb`:
89
+ Crea un archivo llamado `app.rb` y ejecútalo con `ruby app.rb`:
75
90
 
76
91
  ```ruby
77
- require 'GRmenu'
92
+ require 'grmenu'
93
+
94
+ # Cargar un tema integrado con estética neón
95
+ GRmenu.theme(:neon_red)
78
96
 
79
- def iniciar_servicio
80
- GRmenu.clear_screen
81
- puts Color.bright_green("-> Servicio iniciado exitosamente en http://localhost:3000")
82
- GRmenu.continue
97
+ def saludar
98
+ GRmenu.alert(:success, "Bienvenido a GRmenu v4.0.1!")
83
99
  end
84
100
 
85
- def ver_estado
86
- GRmenu.clear_screen
87
- puts Color.bright_cyan("-> Estado: Servidor Operativo | Memoria: 45 MB | Conexiones: 12")
88
- GRmenu.continue
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)
89
109
  end
90
110
 
91
111
  menu = GRmenu.new(
92
112
  [
93
- ["Iniciar Servicio", method(:iniciar_servicio), "Lanza el worker en segundo plano"],
94
- ["Ver Estado", method(:ver_estado), "Muestra metricas de memoria y conexion"],
95
- ["Salir", -> { exit(0) }, "Finaliza la ejecucion"]
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"]
96
116
  ],
97
117
  title: "Panel de Control",
98
- banner: "MI APP",
99
- style: 3
118
+ banner: "DEMO",
119
+ style: 3,
120
+ mouse: true,
121
+ animate: "diagonal"
100
122
  )
101
123
 
102
124
  menu.draw
@@ -104,11 +126,11 @@ menu.draw
104
126
 
105
127
  ---
106
128
 
107
- ## Guia de Componentes y Caracteristicas
129
+ ## Guía Exhaustiva de Componentes y Características
108
130
 
109
- ### 1. Menu Interactivo Principal
131
+ ### 1. Menú Interactivo Principal
110
132
 
111
- El constructor `GRmenu.new` proporciona una experiencia interactiva completa con navegacion continua, paginacion automatica, buscador en vivo y organizacion en cuadricula 2D.
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.
112
134
 
113
135
  ```text
114
136
  ╔═══════════════════════════════════════════╗
@@ -125,34 +147,45 @@ El constructor `GRmenu.new` proporciona una experiencia interactiva completa con
125
147
 
126
148
  #### Formatos de Opciones Aceptados
127
149
 
128
- Puedes combinar cualquiera de los siguientes formatos en el array de opciones:
129
-
130
150
  ```ruby
131
151
  menu = GRmenu.new(
132
152
  [
133
- # 1. Method directo (auto-formatea y capitaliza el nombre)
153
+ # 1. Method directo (formatea y capitaliza el nombre automáticamente)
134
154
  method(:iniciar_servidor),
135
155
 
136
- # 2. Symbol (invoca el metodo global o del contexto)
156
+ # 2. Symbol (invoca el método del contexto)
137
157
  :crear_respaldo,
138
158
 
139
- # 3. Arreglo [Etiqueta, Accion]
159
+ # 3. Arreglo [Etiqueta, Acción]
140
160
  ["Lanzar Proceso", method(:lanzar)],
141
161
 
142
- # 4. Arreglo con Tooltip [Etiqueta, Accion, Descripcion]
143
- ["Limpieza de Cache", method(:limpiar), "Vacia los temporales en disco"],
144
-
145
- # 5. Bloque anonimo Proc o Lambda
146
- ["Accion Rapida", -> { puts "Ejecutado!"; GRmenu.continue }, "Ejecuta bloque inline"],
147
-
148
- # 6. Hash explicito
149
- { name: "Configuracion", action: method(:config), desc: "Ajustes del sistema" }
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"]
150
182
  ],
151
- title: "Consola de Administracion",
183
+ title: "Consola de Administración",
152
184
  banner: "SISTEMA",
153
185
  search: true, # Activa buscador interactivo en vivo
154
- columns: 2, # Cuadricula de 2 columnas con flechas izquierda/derecha
155
- page_size: 6, # Paginacion con auto-scroll
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)
156
189
  style: 3
157
190
  )
158
191
 
@@ -161,242 +194,521 @@ menu.draw(size_max: 44)
161
194
 
162
195
  ---
163
196
 
164
- ### 2. Seleccion Multiple con Checkboxes
197
+ ### 2. Submenús en Cascada de hasta 3 Niveles (*Sub del Sub*)
165
198
 
166
- Permite al usuario seleccionar multiples elementos simultaneamente mediante casillas de verificacion interactivas `[X]` / `[ ]`.
199
+ GRmenu permite anidar opciones hasta **3 niveles de profundidad** (*Menú Original $\to$ Submenú 1 $\to$ Sub del Sub*).
167
200
 
168
201
  ```text
169
- ╔══════════════════ Instalador de Paquetes ══════════════════╗
170
- [X] Servidor Nginx Web
171
- [X] Base de Datos PostgreSQL 16
172
- [ ] Almacen de Cache Redis 7.2
173
- [X] Monitor Prometheus
174
- ║────────────────────────────────────────────────────────────║
175
- ║ Espacio: Marcar | a: Todos | n: Ninguno | Enter: Confirmar ║
176
- ╚════════════════════════════════════════════════════════════╝
202
+ ╔══════════════════════╗ ╔════════════════════╗ ╔════════════════════╗
203
+ > Servicios ▶ ║──║ Servicios ║ ║ Servidores Web
204
+ Ajustes ║════════════════════║ ║════════════════════║
205
+ ╚══════════════════════╝ > Servidores Web ║──║ > Iniciar NGINX
206
+ Bases de Datos ║ Reiniciar Apache ║
207
+ ╚════════════════════╝ ╚════════════════════╝
208
+ ```
209
+
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.
222
+
223
+ ---
224
+
225
+ ### 3. Menú por Pestañas Multitarea (`GRmenu.tabs`)
226
+
227
+ Permite organizar interfaces complejas en paneles horizontales independientes:
228
+
229
+ ```text
230
+ [ Servidores ] Bases de Datos Configuración
231
+
232
+ ╔══════════════════════════════════════════════════════════════════╗
233
+ ║ > Iniciar API Gateway ║
234
+ ║ Supervisar Worker Celery ║
235
+ ╚══════════════════════════════════════════════════════════════════╝
236
+ ```
237
+
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
+ )
259
+
260
+ tabs_menu.draw
261
+ ```
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
+
266
+ ---
267
+
268
+ ### 4. Soporte Completo de Ratón (`mouse: true`)
269
+
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
+ ╚══════════════════════════════════════════════════════╝
177
292
  ```
178
293
 
179
- #### Codigo de Ejemplo:
294
+ ```ruby
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")
317
+ ```
318
+
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]` / `[ ]`:
180
326
 
181
327
  ```ruby
182
328
  paquetes = [
183
329
  ["Servidor Nginx Web", true, "Proxy inverso de alta velocidad"],
184
330
  ["Base de Datos PostgreSQL 16", true, "Motor de datos principal"],
185
- ["Almacen de Cache Redis 7.2", false, "Cache en memoria RAM"],
186
- ["Monitor Prometheus", true, "Metricas y alertas"]
331
+ ["Almacén de Caché Redis 7.2", false, "Caché en memoria RAM"],
332
+ ["Monitor Prometheus", true, "Métricas y alertas"]
187
333
  ]
188
334
 
189
335
  seleccionados = GRmenu.checkbox(
190
336
  paquetes,
191
337
  title: "Instalador de Paquetes",
192
- color: "rgb",
338
+ color: "neon_cyan",
193
339
  style: 3
194
340
  )
195
341
 
196
- puts "Elementos seleccionados: #{seleccionados.length}"
197
- seleccionados.each do |elem|
198
- nombre = elem.is_a?(Array) ? elem[0] : elem
199
- puts " - [X] #{nombre}"
200
- end
342
+ puts "Seleccionados: #{seleccionados.inspect}"
201
343
  ```
202
344
 
203
- **Teclas de Control en Checkbox:**
204
- - `Espacio`: Alterna entre marcado `[X]` y desmarcado `[ ]`.
205
- - `a` / `A`: Marca todos los elementos (*Select All*).
206
- - `n` / `N`: Desmarca todos los elementos (*Deselect All*).
207
- - `i` / `I`: Invierte la seleccion actual.
208
- - `Enter`: Confirma y devuelve el arreglo de elementos seleccionados.
209
- - `q` / `Esc`: Cancela y devuelve un arreglo vacio `[]`.
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.
210
351
 
211
352
  ---
212
353
 
213
- ### 3. Control Deslizante Interactivo
354
+ ### 7. Control Deslizante en Tiempo Real (`GRmenu.slider`)
214
355
 
215
- Permite seleccionar numericamente un valor o porcentaje dentro de un rango mediante una barra horizontal en tiempo real.
216
-
217
- ```text
218
- ╔══════════════ Asignar Memoria RAM ══════════════╗
219
- ║ [████████████████████░░░░░░░░░░] 16 GB ║
220
- ║ ║
221
- ║ ← / → Ajustar paso | ↑ / ↓ Salto x5 | Enter OK ║
222
- ╚═════════════════════════════════════════════════╝
223
- ```
224
-
225
- #### Codigo de Ejemplo:
356
+ Permite seleccionar numéricamente un valor dentro de un rango mediante una barra horizontal en tiempo real:
226
357
 
227
358
  ```ruby
228
359
  ram = GRmenu.slider(
229
- "Asignar Memoria RAM",
360
+ "Asignar Memoria RAM:",
230
361
  min: 1,
231
362
  max: 64,
232
363
  step: 1,
233
364
  default: 16,
234
365
  unit: "GB",
235
- color: "rgb",
366
+ color: "gold",
236
367
  style: 3
237
368
  )
238
-
239
- puts "Memoria configurada: #{ram} GB"
240
369
  ```
241
370
 
242
- **Teclas de Control en Slider:**
243
- - `←` / `→` o `h` / `l`: Ajusta el valor paso a paso (`step`).
244
- - `↑` / `↓` o `k` / `j`: Salto rapido de 5 pasos.
245
- - `Enter`: Guarda y retorna el numero exacto (`Integer` o `Float`).
246
- - `q` / `Esc`: Cancela y retorna el valor por defecto.
371
+ * **Teclas:** `← / →` ajusta de 1 en 1 (`step`), `↑ / ↓` realiza saltos rápidos de 5 pasos, `Enter` confirma.
247
372
 
248
373
  ---
249
374
 
250
- ### 4. Renderizado Universal de Imagenes
375
+ ### 8. Diálogos Nativos de Confirmación (`GRmenu.confirm`)
251
376
 
252
- Decodifica y renderiza cualquier formato de imagen (PNG, JPEG, JPG, WEBP, GIF, BMP) con micro-pixeles ANSI TrueColor de 24 bits y escalado proporcional exacto.
253
-
254
- #### Renderizado Directo en Consola:
377
+ Cuadros emergentes Si / No con botones activos interactivos:
255
378
 
256
379
  ```ruby
257
- # Renderiza una imagen centrada dentro de un marco estilizado
258
- GRmenu.image("fondo.jpg", width: 60, color: "rgb", style: 3)
380
+ if GRmenu.confirm("¿Deseas aplicar los cambios en producción?", default: true, color: "neon_green", style: 3)
381
+ puts "Aplicando..."
382
+ end
259
383
  ```
260
384
 
261
- #### Como Cabecera Superior en un Menu:
385
+ * **Teclas:** `← / →` para alternar entre `[ Sí ]` y `[ No ]`, `Enter` para confirmar.
386
+
387
+ ---
388
+
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
+ ```
262
404
 
263
405
  ```ruby
264
- menu = GRmenu.new(
265
- [
266
- ["Escanear Red", method(:escanear)],
267
- ["Ver Reporte", method(:reporte)],
268
- ["Salir", -> { exit(0) }]
269
- ],
270
- image: "logo.png",
271
- image_width: 44,
272
- title: "Security Toolset",
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,
273
425
  style: 3
274
426
  )
275
427
 
276
- menu.draw
428
+ if fila
429
+ puts "Fila elegida: #{fila.join(' | ')}"
430
+ end
277
431
  ```
278
432
 
279
433
  ---
280
434
 
281
- ### 5. Modales Nativos de Confirmacion y Entrada
435
+ ### 10. Tarjetas Estilizadas y Alertas (`GRmenu.card` y `GRmenu.alert`)
282
436
 
283
- Cuadros de dialogo emergentes bloqueantes que capturan respuestas del usuario de forma directa y visual.
437
+ Cuadros informativos con división automática de párrafos (*word-wrapping*) y soporte completo para colores TrueColor y Neón:
284
438
 
285
- #### Modal de Confirmacion (`GRmenu.confirm`):
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
+ ```
459
+
460
+ ---
461
+
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:
286
465
 
287
466
  ```ruby
288
- # Dialogo interactivo Si / No con seleccion por flechas y teclado
289
- if GRmenu.confirm("Deseas aplicar los cambios en produccion?", default: true, color: "rgb", style: 3)
290
- puts Color.bright_green("-> Cambios aplicados con exito.")
291
- else
292
- puts Color.bright_red("-> Operacion cancelada.")
293
- end
467
+ # 1. Renderizado directo en consola
468
+ GRmenu.image("assets/logo.png", width: 40, style: 3, color: "neon_cyan", center: true)
469
+
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
294
478
  ```
295
479
 
296
- #### Cuadro de Entrada de Texto (`GRmenu.input`):
480
+ ---
481
+
482
+ ### 12. Barras de Progreso y Spinners de Carga
297
483
 
298
484
  ```ruby
299
- # Entrada interactiva con cursor en vivo
300
- nombre = GRmenu.input("Ingresa tu nombre de usuario:", default: "admin", color: "rgb", style: 3)
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
491
+ end
301
492
 
302
- # Modo password para claves secretas (oculta caracteres con asteriscos)
303
- token = GRmenu.input("Ingresa tu API Token:", password: true, color: "magenta", style: 7)
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"
497
+ end
304
498
  ```
305
499
 
306
500
  ---
307
501
 
308
- ### 6. Modo RGB Chroma Wave Animado
502
+ ### 13. Iluminación Dinámica Living Neon a 30 FPS
309
503
 
310
- Puedes activar el modo de color animado pasando `"rgb"`, `"rainbow"` o `"chroma"` a cualquier componente visual. El motor genera una onda sinusoidal horizontal que fluye suavemente a 30 FPS en segundo plano sin producir retraso en el teclado.
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:
311
505
 
312
506
  ```ruby
313
- menu = GRmenu.new(opciones, banner: "CHROMA", title: "RGB Wave Panel")
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
516
+ ```
517
+
518
+ ---
314
519
 
315
- menu.set_style.banner("rgb") # Letras 3D en degradado continuo
316
- menu.set_style.title("rgb") # Titulo de cabecera en RGB
317
- menu.set_style.border("rgb") # Marco exterior multicolor
318
- menu.set_style.divider("rgb") # Lineas divisorias animadas
319
- menu.set_style.focus("rgb") # Cursor enfocado pulsando en RGB
320
- menu.set_style.options("rgb") # Texto de opciones en tono suave
520
+ ### 14. Banners ASCII 3D y Módulo de Color
321
521
 
322
- menu.draw
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")
323
532
  ```
324
533
 
325
534
  ---
326
535
 
327
- ### 7. Barra de Progreso y Spinner de Carga
536
+ ### 15. Sistema de Temas .gr y CSS para TUI
328
537
 
329
- #### Barra de Progreso (`GRmenu.progress`):
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.
330
539
 
540
+ #### Cargar Temas Integrados:
331
541
  ```ruby
332
- GRmenu.progress(100, title: "Descargando Actualizacion", color: "rgb", style: 3) do |bar|
333
- 10.times do |i|
334
- sleep 0.1
335
- bar.advance(10, status: "Procesando bloque #{i + 1} de 10...")
336
- end
337
- end
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
338
549
  ```
339
550
 
340
- #### Spinner Animado (`GRmenu.spinner`):
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
+ ```
341
628
 
629
+ Para aplicarlo a todo tu sistema:
342
630
  ```ruby
343
- resultado = GRmenu.spinner("Conectando con el cluster remoto...", color: "rgb") do
344
- # Simula tarea pesada
345
- sleep 1.5
346
- "Conexion Establecida"
347
- end
631
+ GRmenu.import_config("mi_tema.gr")
632
+ ```
633
+
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
+ ```
348
647
 
349
- puts Color.bright_green("-> #{resultado}")
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")
350
652
  ```
351
653
 
352
654
  ---
353
655
 
354
- ### 8. Banners 3D y Lineas Divisorias
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:
355
659
 
356
660
  ```ruby
357
- # Imprime un banner en arte ASCII 3D con retardo opcional de animacion
358
- GRmenu.banner("ADMIN", 0, color: "rgb", style: 3, font: 1)
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
359
687
 
360
- # Imprime una linea divisoria horizontal con ajuste automatico al ancho de terminal
361
- GRmenu.div(60, "rgb", 1, "═")
688
+ menu.draw
362
689
  ```
363
690
 
364
691
  ---
365
692
 
366
- ### 9. Modulo Independiente de Color
693
+ ## Laboratorio de Nuevas Funcionalidades
367
694
 
368
- El modulo `Color` (o su alias `C`) permite pintar cadenas de texto directamente con secuencias ANSI y TrueColor:
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:
369
696
 
370
- ```ruby
371
- # Modo Arcoiris RGB Dinamico
372
- puts Color.rgb("Texto degradado en onda horizontal multicolor")
373
-
374
- # Metodos directos por color (Nivel 1 Normal / Nivel 2 Brillante)
375
- puts Color.bright_green("Verde brillante")
376
- puts Color.bright_cyan("Cian brillante")
377
- puts Color.bright_magenta("Magenta brillante")
378
- puts Color.bright_yellow("Amarillo brillante")
379
- puts Color.bright_red("Rojo brillante")
380
- puts Color.orange("Naranja")
381
- puts Color.purple("Morado")
382
- puts Color.pink("Rosa")
383
- puts Color.gray("Gris")
384
- puts Color.white("Blanco")
385
-
386
- # Atajos ultra-cortos de 1 o 2 letras
387
- puts Color.g("Verde")
388
- puts Color.cy("Cian")
389
- puts Color.r("Rojo")
390
- puts Color.y("Amarillo")
391
- puts Color.w("Blanco")
392
- puts Color.gr("Gris")
697
+ ```bash
698
+ ruby ruby/eaja.rb
699
+ ```
700
+
701
+ O el laboratorio general de componentes:
702
+
703
+ ```bash
704
+ ruby ruby/e.rb
393
705
  ```
394
706
 
395
707
  ---
396
708
 
397
- ## Catalogo Visual de Fuentes 3D
709
+ ## Catálogo Visual de Fuentes 3D
398
710
 
399
- Configura la tipografia mediante el parametro `font: 1..10`:
711
+ Configura la tipografía mediante el parámetro `font: 1..10`:
400
712
 
401
713
  | ID | Nombre de Fuente | Muestra Visual |
402
714
  |:--:|:-----------------|:---------------|
@@ -413,130 +725,102 @@ Configura la tipografia mediante el parametro `font: 1..10`:
413
725
 
414
726
  ---
415
727
 
416
- ## Catalogo Visual de Marcos y Bordes
728
+ ## Catálogo Visual de Marcos y Bordes
417
729
 
418
- Configura el diseno del marco mediante el parametro `style: 1..20`:
730
+ Configura el diseño del marco mediante el parámetro `style: 1..20`:
419
731
 
420
732
  | ID | Muestra | ID | Muestra | ID | Muestra | ID | Muestra |
421
733
  |:--:|:--------|:--:|:--------|:--:|:--------|:--:|:--------|
422
734
  | `1` | `#####` (Hash) | `6` | `╓───╖` (Mixto) | `11`| `░░░░░` (Sombra suave) | `16`| `~~~~~` (Ondas) |
423
735
  | `2` | `┌───┐` (Simple) | `7` | `╭───╮` (Curvas) | `12`| `█████` (Bloque) | `17`| `-----` (Guion) |
424
736
  | `3` | `╔═══╗` (Doble) | `8` | `▛▀▀▀▜` (Outline) | `13`| `*****` (Asterisco) | `18`| `◆◆◆◆◆` (Rombos) |
425
- | `4` | `┏━━━┓` (Gruesa) | `9` | `▓▓▓▓▓` (Sombra oscura) | `14`| `+++++` (Cruces) | `19`| `●○○○●` (Circulos) |
737
+ | `4` | `┏━━━┓` (Gruesa) | `9` | `▓▓▓▓▓` (Sombra oscura) | `14`| `+++++` (Cruces) | `19`| `●○○○●` (Círculos) |
426
738
  | `5` | `╒═══╕` (Mixto) | `10`| `▒▒▒▒▒` (Sombra media) | `15`| `=====` (Doble simple) | `20`| `★☆☆☆★` (Estrellas) |
427
739
 
428
740
  ---
429
741
 
430
- ## Referencia Exhaustiva de la API
742
+ ## Referencia Exhaustiva de la API de Ruby
431
743
 
432
744
  ### Constructor `GRmenu.new(functions, **opciones)`
433
745
 
434
- | Parametro | Tipo | Valor por Defecto | Descripcion |
746
+ | Parámetro | Tipo | Valor por Defecto | Descripción |
435
747
  |:----------|:-----|:------------------|:------------|
436
- | `functions` | `Array` | *Obligatorio* | Lista de metodos, simbolos, arrays `[nombre, accion, tooltip]`, procs o hashes. |
437
- | `title:` | `String` | `""` | Titulo centrado en la cabecera del marco de opciones. |
438
- | `banner:` | `String` | `""` | Texto convertido a arte ASCII 3D superior. |
439
- | `subtitle:` | `String` | `""` | Descripcion o subtitulo (soporta saltos de linea `\n`). |
440
- | `search:` | `Boolean` | `false` | Activa el buscador instantaneo mientras se escribe. |
441
- | `columns:` | `Integer` | `1` | Cantidad de columnas para distribucion en cuadricula 2D. |
442
- | `page_size:` | `Integer` | `auto` | Maximo de filas visibles antes de activar desplazamiento con scroll. |
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. |
443
757
  | `style:` | `Integer` | `19` | Estilo de marco para las opciones (1 al 20). |
444
758
  | `banner_style:` | `Integer` | `3` | Estilo de marco para el banner 3D (1 al 20). |
445
- | `font:` | `Integer` | `1` | Fuente tipografica del banner ASCII (1 al 10). |
446
- | `image:` | `String` | `nil` | Ruta al archivo de imagen de cabecera (PNG/JPG/WEBP/GIF/BMP). |
447
- | `image_width:` | `Integer` | `40` | Ancho en columnas para el renderizado de la imagen. |
448
- | `divider:` | `Boolean/Int` | `true` | Lineas divisorias horizontales ajustadas al marco. |
449
- | `center:` | `Boolean` | `true` | Centrado horizontal simetrico automatico. |
450
-
451
- ### Metodos de Estilo `menu.set_style`
452
-
453
- | Metodo | Argumentos | Descripcion |
454
- |:-------|:-----------|:------------|
455
- | `banner(color, level=2)` | `(String, Integer)` | Color del banner ASCII (soporta `"rgb"`). |
456
- | `title(color, level=2)` | `(String, Integer)` | Color del titulo del recuadro (soporta `"rgb"`). |
457
- | `subtitle(color, level=1)` | `(String, Integer)` | Color del texto del subtitulo (soporta `"rgb"`). |
458
- | `divider(color, level=1)` | `(String, Integer)` | Color de las lineas divisorias (soporta `"rgb"`). |
459
- | `border(color, level=1)` | `(String, Integer)` | Color del marco de opciones (soporta `"rgb"`). |
460
- | `options(color, level=1)` | `(String, Integer)` | Color de las opciones inactivas (soporta `"rgb"`). |
461
- | `focus(color, level=2)` | `(String, Integer)` | Color del cursor y opcion activa (soporta `"rgb"`). |
462
- | `font(font_id)` | `(Integer 1..10)` | Cambia la fuente tipografica del banner. |
463
-
464
- ### Metodos Estaticos y Modales
465
-
466
- | Metodo | Firma | Retorno |
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 |
467
770
  |:-------|:------|:--------|
468
- | `GRmenu.checkbox` | `(items, title:, color:, style:, page_size:, preselected:)` | `Array` con los elementos marcados. |
469
- | `GRmenu.slider` | `(prompt, min:, max:, step:, default:, unit:, color:, style:)` | `Numeric` con el valor seleccionado. |
470
- | `GRmenu.confirm` | `(pregunta, default: true, color: "cyan", style: 3)` | `Boolean` (`true` para Si, `false` para No). |
471
- | `GRmenu.input` | `(prompt, default: "", password: false, color: "cyan", style: 3)` | `String` ingresado por el usuario. |
472
- | `GRmenu.image` | `(filepath, width: 40, height: nil, style: 3, color: "cyan")` | Dibuja la imagen en la terminal. |
473
- | `GRmenu.progress` | `(total = 100, title: nil, color: "cyan", style: 3, &bloque)` | Ejecuta el bloque con la barra de progreso. |
474
- | `GRmenu.spinner` | `(mensaje = "...", color: "cyan", delay: 0.08, &bloque)` | Ejecuta el bloque mostrando un spinner animado. |
475
- | `GRmenu.banner` | `(texto, delay = 0, color: "magenta", style: 3, font: 1)` | Imprime texto en arte ASCII 3D. |
476
- | `GRmenu.div` | `(long = nil, color = "blue", level = 1, char = "─")` | Imprime una linea divisoria en la consola. |
477
- | `GRmenu.clear_screen`| `()` (Alias: `GRmenu.clr`) | Limpia la pantalla y el scrollback al instante. |
478
- | `GRmenu.continue` | `(texto = "Presiona cualquier tecla...")` | Pausa la ejecucion hasta presionar una tecla. |
479
- | `GRmenu.help` | `()` | Muestra la guia interactiva de documentacion en consola. |
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. |
480
791
 
481
792
  ---
482
793
 
483
- ## Mapa de Controles y Teclado
484
-
485
- | Tecla / Combinacion | Contexto | Accion Realizada |
486
- |:--------------------|:---------|:-----------------|
487
- | `↑` (Arriba) / `k` | Menus / Checkbox | Mueve el foco hacia arriba (con salto continuo *Snake* en extremos). |
488
- | `↓` (Abajo) / `j` | Menus / Checkbox | Mueve el foco hacia abajo. |
489
- | `←` / `→` | Grid 2D | Salta de columna a la izquierda o derecha. |
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. |
490
809
  | `Espacio` | Checkbox | Marca o desmarca la casilla del elemento actual `[X]` / `[ ]`. |
491
810
  | `a` / `A` | Checkbox | Marca todos los elementos (*Select All*). |
492
811
  | `n` / `N` | Checkbox | Desmarca todos los elementos (*Deselect All*). |
493
- | `i` / `I` | Checkbox | Invierte la seleccion de todos los elementos. |
494
- | `←` / `→` o `h` / `l`| Slider | Ajusta el valor numerico en un incremento (`step`). |
495
- | `↑` / `↓` o `k` / `j`| Slider | Salto rapido de 5 pasos en el valor numerico. |
496
- | `Enter` | Global | Ejecuta la accion seleccionada o confirma el formulario. |
497
- | `q` / `Esc` | Global | Sale del menu o cancela la operacion actual. |
498
- | `Backspace` | Buscador / Input | Borra el ultimo caracter ingresado. |
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. |
499
818
  | `Ctrl+U` | Buscador / Input | Limpia todo el texto ingresado. |
500
819
 
501
820
  ---
502
821
 
503
- ## Recetas y Casos de Uso del Mundo Real
504
-
505
- ### Asistente de Instalacion de Servidores
506
-
507
- ```ruby
508
- require 'GRmenu'
509
-
510
- GRmenu.clear_screen
511
- GRmenu.banner("SETUP", 0, color: "rgb", style: 3, font: 1)
512
-
513
- nombre = GRmenu.input("Nombre del proyecto:", default: "mi-app", color: "rgb")
514
- puerto = GRmenu.slider("Puerto HTTP:", min: 3000, max: 9000, step: 100, default: 8080, color: "rgb")
515
-
516
- modulos = [
517
- ["Proxy Nginx", true, "Servidor web frontal"],
518
- ["Base PostgreSQL", true, "Base de datos relacional"],
519
- ["Redis Cache", false, "Acelerador de sesiones"]
520
- ]
521
- seleccion = GRmenu.checkbox(modulos, title: "Selecciona Modulos", color: "rgb")
522
-
523
- if GRmenu.confirm("Deseas comenzar la instalacion ahora?", default: true, color: "rgb")
524
- GRmenu.progress(100, title: "Instalando Componentes", color: "rgb") do |bar|
525
- seleccion.each_with_index do |item, idx|
526
- sleep 0.4
527
- bar.advance(100 / seleccion.length, status: "Configurando #{item[0]}...")
528
- end
529
- end
530
- puts Color.bright_green("\n-> Instalacion de '#{nombre}' completada en el puerto #{puerto}!")
531
- end
532
- GRmenu.continue
533
- ```
534
-
535
- ---
536
-
537
822
  ## Licencia
538
823
 
539
- Distribuido bajo licencia **MIT**. Consulta [`LICENSE`](LICENSE) para mas detalles.
540
-
541
- Desarrollado con precision por **[grcode](https://github.com/JoseEduardoGR)**
824
+ Distribuido bajo licencia **MIT**. Consulta [`LICENSE`](LICENSE) para más detalles.
542
825
 
826
+ Desarrollado con precisión por **[grcode](https://github.com/JoseEduardoGR)**