grmenu 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -1,47 +1,56 @@
1
- # GRmenu (Ruby) v3.0
1
+ # GRmenu (Ruby) v4.0
2
2
 
3
3
  **Suite TUI Profesional y Ligera para la Creacion de Interfaces de Linea 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
+ Menus interactivos por teclado, tablas con ordenamiento y busqueda en vivo, seleccion multiple con casillas de verificacion, controles deslizantes en tiempo real, renderizado de imagenes ANSI TrueColor de 24 bits, sistema de temas estilo CSS `.gr`, iluminacion dinamica a 30 FPS en vivo, colores hexadecimales directos, modales nativos de confirmacion y texto, buscador instantaneo en vivo, cuadriculas 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)
18
+ 1. [Por que elegir GRmenu?](#por-que-elegir-grmenu)
19
+ 2. [Instalacion y Requisitos](#instalacion-y-requisitos)
20
+ 3. [Inicio Rapido en 10 Segundos](#inicio-rapido-en-10-segundos)
21
+ 4. [Guia de Componentes y Caracteristicas](#guia-de-componentes-y-caracteristicas)
20
22
  - [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)
23
+ - [2. Sistema de Temas .gr y CSS para TUI](#2-sistema-de-temas-gr-y-css-para-tui)
24
+ - [3. Exportacion de Temas desde Terminal / CLI](#3-exportacion-de-temas-desde-terminal--cli)
25
+ - [4. CSS Inline en el Codigo (<<-GR)](#4-css-inline-en-el-codigo--gr)
26
+ - [5. Tablas Interactivas con Buscador y Ordenamiento (GRmenu.table)](#5-tablas-interactivas-con-buscador-y-ordenamiento)
27
+ - [6. Tarjetas y Alertas Estilizadas (GRmenu.card y GRmenu.alert)](#6-tarjetas-y-alertas-estilizadas)
28
+ - [7. Colores Hexadecimales TrueColor y Catalogo de 90+ Colores](#7-colores-hexadecimales-truecolor-y-catalogo-de-90-colores)
29
+ - [8. Iluminacion Dinamica Living Neon a 30 FPS](#8-iluminacion-dinamica-living-neon-a-30-fps)
30
+ - [9. Seleccion Multiple con Checkboxes (GRmenu.checkbox)](#9-seleccion-multiple-con-checkboxes)
31
+ - [10. Control Deslizante Interactivo (GRmenu.slider)](#10-control-deslizante-interactivo)
32
+ - [11. Modales Nativos de Confirmacion y Entrada (confirm e input)](#11-modales-nativos-de-confirmacion-y-entrada)
33
+ - [12. Renderizado Universal de Imagenes (GRmenu.image)](#12-renderizado-universal-de-imagenes)
34
+ - [13. Barra de Progreso y Spinner de Carga](#13-barra-de-progreso-y-spinner-de-carga)
35
+ - [14. Banners 3D y Modulo de Color (Color / C)](#14-banners-3d-y-modulo-de-color)
36
+ 5. [Ejemplo Completo en Ruby (e.rb)](#ejemplo-completo-en-ruby-erb)
37
+ 6. [Catalogo Visual de Fuentes 3D (1 al 10)](#catalogo-visual-de-fuentes-3d)
38
+ 7. [Catalogo Visual de Marcos y Bordes (1 al 20)](#catalogo-visual-de-marcos-y-bordes)
39
+ 8. [Referencia Exhaustiva de la API](#referencia-exhaustiva-de-la-api)
40
+ 9. [Mapa de Controles y Teclado](#mapa-de-controles-y-teclado)
41
+ 10. [Licencia](#licencia)
35
42
 
36
43
  ---
37
44
 
38
45
  ## Por que elegir GRmenu?
39
46
 
40
47
  - **Cero Dependencias Externas:** Funciona exclusivamente con la libreria estandar de Ruby (`io/console`, `json`, `zlib`), sin gemas pesadas ni binarios nativos requeridos.
48
+ - **Sistema de Temas CSS (.gr):** Diseña la estetica de tu consola como si fuera una hoja de estilos web con bloques `<<menu`, `<<table`, `<<card`, `<<slider`, etc.
49
+ - **Colores Hexadecimales Directos:** Soporta `#FF0055`, `#00F5FF`, `#0FF` en cualquier componente con TrueColor de 24 bits nativo.
50
+ - **Animaciones Living Neon a 30 FPS:** Olas de luz senoidal continuas y destello de incandescencia en marcos y banners sin producir retraso en el teclado.
51
+ - **Exportacion Instantanea CLI:** Convierte la configuracion visual de cualquier script a un archivo de tema `.gr` reutilizable con la bandera `-theme`.
41
52
  - **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
53
  - **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.
45
54
 
46
55
  ---
47
56
 
@@ -58,13 +67,15 @@ gem install grmenu
58
67
  ### Via Gemfile
59
68
 
60
69
  ```ruby
61
- gem 'grmenu', '~> 3.0'
70
+ gem 'grmenu', '~> 4.0'
62
71
  ```
63
72
 
64
73
  ### Requerimiento directo en scripts
65
74
 
75
+ Puedes requerirlo tanto en minusculas como con la sintaxis tradicional:
76
+
66
77
  ```ruby
67
- require 'GRmenu'
78
+ require 'grmenu' # o require 'GRmenu'
68
79
  ```
69
80
 
70
81
  ---
@@ -74,29 +85,35 @@ require 'GRmenu'
74
85
  Crea un archivo llamado `app.rb` y ejecuta `ruby app.rb`:
75
86
 
76
87
  ```ruby
77
- require 'GRmenu'
88
+ require 'grmenu'
89
+
90
+ # Cargar un tema predefinido con estetica neon
91
+ GRmenu.theme(:neon_red)
78
92
 
79
- def iniciar_servicio
80
- GRmenu.clear_screen
81
- puts Color.bright_green("-> Servicio iniciado exitosamente en http://localhost:3000")
82
- GRmenu.continue
93
+ def saludar
94
+ GRmenu.alert(:success, "Bienvenido a GRmenu v4.0!")
83
95
  end
84
96
 
85
- def ver_estado
86
- GRmenu.clear_screen
87
- puts Color.bright_cyan("-> Estado: Servidor Operativo | Memoria: 45 MB | Conexiones: 12")
88
- GRmenu.continue
97
+ def ver_tabla
98
+ headers = ["ID", "SERVICIO", "ESTADO"]
99
+ filas = [
100
+ ["01", "API Gateway", "Operativo"],
101
+ ["02", "Postgres DB", "Operativo"],
102
+ ["03", "Redis Cache", "En espera"]
103
+ ]
104
+ GRmenu.table(headers: headers, rows: filas, title: "Monitor de Servidores", search: true)
89
105
  end
90
106
 
91
107
  menu = GRmenu.new(
92
108
  [
93
- ["Iniciar Servicio", method(:iniciar_servicio), "Lanza el worker en segundo plano"],
94
- ["Ver Estado", method(:ver_estado), "Muestra metricas de memoria y conexion"],
109
+ ["Saludar", method(:saludar), "Muestra un mensaje emergente"],
110
+ ["Ver Infraestructura", method(:ver_tabla), "Tabla interactiva con buscador en vivo"],
95
111
  ["Salir", -> { exit(0) }, "Finaliza la ejecucion"]
96
112
  ],
97
113
  title: "Panel de Control",
98
- banner: "MI APP",
99
- style: 3
114
+ banner: "DEMO",
115
+ style: 3,
116
+ animate: "diagonal"
100
117
  )
101
118
 
102
119
  menu.draw
@@ -125,8 +142,6 @@ El constructor `GRmenu.new` proporciona una experiencia interactiva completa con
125
142
 
126
143
  #### Formatos de Opciones Aceptados
127
144
 
128
- Puedes combinar cualquiera de los siguientes formatos en el array de opciones:
129
-
130
145
  ```ruby
131
146
  menu = GRmenu.new(
132
147
  [
@@ -161,235 +176,358 @@ menu.draw(size_max: 44)
161
176
 
162
177
  ---
163
178
 
164
- ### 2. Seleccion Multiple con Checkboxes
179
+ ### 2. Sistema de Temas .gr y CSS para TUI
165
180
 
166
- Permite al usuario seleccionar multiples elementos simultaneamente mediante casillas de verificacion interactivas `[X]` / `[ ]`.
181
+ GRmenu incluye un motor de temas declarativos en archivos `.gr` con sintaxis limpia tipo CSS.
182
+
183
+ #### Cargar Temas Integrados:
184
+ ```ruby
185
+ GRmenu.theme(:neon_red) # Rojos electricos incandescentes y foco amarillo
186
+ GRmenu.theme(:cyberpunk) # Neones cian, amarillo y efecto Chroma
187
+ GRmenu.theme(:matrix) # Verde fosforescente terminal hacker
188
+ GRmenu.theme(:dracula) # Morados, fucsias y cian
189
+ GRmenu.theme(:nord) # Azules articos y paleta fria
190
+ GRmenu.theme(:monokai) # Amarillos, verdes y magentas
191
+ GRmenu.theme(:sunset) # Atardecer calido en rojos, naranjas y dorados
192
+ ```
193
+
194
+ #### Crear tu propio Archivo de Tema (`mi_tema.gr`):
195
+ ```gr
196
+ GRmenu::config<-1->
197
+
198
+ @theme:: "Neon Tokyo"
199
+ @author:: "TuNombre"
200
+ @version:: "1.0"
201
+
202
+ <<menu
203
+ style:: 3
204
+ banner_style:: 3
205
+ font:: 1
206
+ animate:: diagonal
207
+ desc_prefix:: ->
208
+ center:: true
209
+ border:: #FF0055
210
+ title:: #00F5FF
211
+ focus:: gold:2
212
+ options:: white:1
213
+ banner:: #FF0055
214
+ subtitle:: #A6E3A1
215
+ divider:: #FF0055
216
+ >>
217
+
218
+ <<table
219
+ style:: 3
220
+ header_color:: #00F5FF
221
+ border_color:: #FF0055
222
+ selected_row:: gold:2
223
+ row_color:: white:1
224
+ zebra_striping:: true
225
+ >>
226
+
227
+ <<card
228
+ style:: 7
229
+ border_color:: #FF0055
230
+ title_color:: #00F5FF
231
+ content_color:: white:1
232
+ >>
233
+
234
+ <<slider
235
+ style:: 3
236
+ color:: #FF0055
237
+ fill_char:: █
238
+ empty_char:: ░
239
+ >>
240
+
241
+ <<checkbox
242
+ style:: 3
243
+ color:: #FF0055
244
+ checked_mark:: [X]
245
+ unchecked_mark:: [ ]
246
+ >>
247
+ ```
248
+
249
+ Para aplicarlo a todo tu sistema:
250
+ ```ruby
251
+ GRmenu.import_config("mi_tema.gr")
252
+ ```
253
+
254
+ ---
255
+
256
+ ### 3. Exportacion de Temas desde Terminal / CLI
257
+
258
+ Puedes extraer y exportar el tema configurado en cualquier script de Ruby directamente a un archivo `.gr`:
259
+
260
+ #### Mediante banderas de linea de comandos:
261
+ ```bash
262
+ # Exporta el tema del script con nombre automatico:
263
+ ruby mi_app.rb -theme
264
+
265
+ # Exporta a un archivo de salida especifico:
266
+ ruby mi_app.rb -theme -o salida_tema.gr
267
+ ```
268
+
269
+ #### De forma programatica en Ruby:
270
+ ```ruby
271
+ # Extrae el tema de un script sin ejecutar bucles interactivos:
272
+ GRmenu.export_from_file("mi_app.rb", "tema_extraido.gr")
273
+
274
+ # Exporta el tema de una instancia existente:
275
+ menu.export_theme("mi_tema.gr")
276
+ ```
277
+
278
+ ---
279
+
280
+ ### 4. CSS Inline en el Codigo (`<<-GR`)
281
+
282
+ Puedes inyectar bloques de estilo tipo `<style>` directamente en tu script sin crear archivos `.gr` adicionales:
283
+
284
+ ```ruby
285
+ menu = GRmenu.new(opciones, title: "App con CSS")
286
+
287
+ menu.style(<<-GR)
288
+ <<menu
289
+ style:: 3
290
+ animate:: diagonal
291
+ border:: #FF0055:1
292
+ title:: #00F5FF:2
293
+ focus:: gold:2
294
+ banner:: neon_crimson:2
295
+ subtitle:: #A6E3A1:1
296
+ >>
297
+ GR
298
+
299
+ menu.draw
300
+ ```
301
+
302
+ ---
303
+
304
+ ### 5. Tablas Interactivas con Buscador y Ordenamiento
305
+
306
+ Visualiza y navega colecciones de datos tabulares con buscador instantaneo, ordenamiento por columnas con la tecla `s`, paginacion y proteccion anti-desbordes:
167
307
 
168
308
  ```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 ║
309
+ ╔════════════════ Monitor de Infraestructura ════════════════╗
310
+ Buscar: gate█
311
+ ║════════════════════════════════════════════════════════════║
312
+ ID │ SERVICIO │ ESTADO │ LATENCIA
313
+ ║───────┼──────────────────┼───────────────┼─────────────────║
314
+ ║ > 01 │ API Gateway │ Operativo │ 12ms ║
174
315
  ║────────────────────────────────────────────────────────────║
175
- Espacio: Marcar | a: Todos | n: Ninguno | Enter: Confirmar
316
+ ↑/↓ Mover | s Ordenar | / Buscar | Enter Seleccionar
176
317
  ╚════════════════════════════════════════════════════════════╝
177
318
  ```
178
319
 
179
- #### Codigo de Ejemplo:
180
-
181
320
  ```ruby
182
- paquetes = [
183
- ["Servidor Nginx Web", true, "Proxy inverso de alta velocidad"],
184
- ["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"]
321
+ headers = ["ID", "SERVICIO", "ESTADO", "LATENCIA"]
322
+ filas = [
323
+ ["01", "API Gateway", "Operativo", "12ms"],
324
+ ["02", "PostgreSQL Primary", "Operativo", "2ms"],
325
+ ["03", "Redis Cache", "Operativo", "1ms"],
326
+ ["04", "Workers Celery", "Ocupado", "45ms"],
327
+ ["05", "ElasticSearch", "Operativo", "8ms"]
187
328
  ]
188
329
 
189
- seleccionados = GRmenu.checkbox(
190
- paquetes,
191
- title: "Instalador de Paquetes",
192
- color: "rgb",
330
+ seleccion = GRmenu.table(
331
+ headers: headers,
332
+ rows: filas,
333
+ title: "Monitor de Infraestructura",
334
+ search: true, # Buscador en vivo
335
+ sort: true, # Ordena por columnas con la tecla 's'
336
+ page_size: 5,
193
337
  style: 3
194
338
  )
195
339
 
196
- puts "Elementos seleccionados: #{seleccionados.length}"
197
- seleccionados.each do |elem|
198
- nombre = elem.is_a?(Array) ? elem[0] : elem
199
- puts " - [X] #{nombre}"
340
+ if seleccion
341
+ puts "Fila elegida: #{seleccion.join(' | ')}"
200
342
  end
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 `[]`.
210
-
211
345
  ---
212
346
 
213
- ### 3. Control Deslizante Interactivo
347
+ ### 6. Tarjetas y Alertas Estilizadas
214
348
 
215
- Permite seleccionar numericamente un valor o porcentaje dentro de un rango mediante una barra horizontal en tiempo real.
349
+ Cuadros informativos con division de parrafos (*word-wrapping*) automatico y soporte completo para colores TrueColor y Neón:
216
350
 
217
- ```text
218
- ╔══════════════ Asignar Memoria RAM ══════════════╗
219
- [████████████████████░░░░░░░░░░] 16 GB ║
220
- ║ ║
221
- / Ajustar paso | ↑ / ↓ Salto x5 | Enter OK ║
222
- ╚═════════════════════════════════════════════════╝
351
+ ```ruby
352
+ # Alertas con iconos y colores contextuales
353
+ GRmenu.alert(:success, "Conexion establecida con el servidor.")
354
+ GRmenu.alert(:warning, "Memoria RAM al 85%.")
355
+ GRmenu.alert(:error, "Fallo en la peticion al cluster.")
356
+ GRmenu.alert(:info, "Actualizacion disponible.")
357
+
358
+ # Tarjeta informativa con bordes y colores personalizados
359
+ GRmenu.card(
360
+ title: "Metricas de Produccion",
361
+ content: "Peticiones/seg: 18,400 req/s\nLatencia p99: 11.4 ms\nSalud del cluster: 100%",
362
+ border_color: "#FF0055",
363
+ title_color: "#00F5FF",
364
+ content_color: "gold",
365
+ style: 7
366
+ )
223
367
  ```
224
368
 
225
- #### Codigo de Ejemplo:
369
+ ---
370
+
371
+ ### 7. Colores Hexadecimales TrueColor y Catalogo de 90+ Colores
372
+
373
+ El motor soporta **colores hexadecimales directos de 24 bits** (`#RRGGBB` o formato corto `#RGB`), ademas de un catalogo de 90+ colores pre-calibrados con version normal y version neón:
226
374
 
227
375
  ```ruby
228
- ram = GRmenu.slider(
229
- "Asignar Memoria RAM",
230
- min: 1,
231
- max: 64,
232
- step: 1,
233
- default: 16,
234
- unit: "GB",
235
- color: "rgb",
236
- style: 3
237
- )
376
+ # 1. En codigo con encadenamiento fluido (chaining):
377
+ menu.set_style.border("#FF0055").title("#00F5FF").focus("gold")
238
378
 
239
- puts "Memoria configurada: #{ram} GB"
379
+ # 2. Con codigos de 3 digitos:
380
+ menu.set_style.border("#0FF")
381
+
382
+ # 3. Directamente con el helper de Color:
383
+ puts Color.hex("#A6E3A1", "Verde menta suave")
384
+ puts Color.gold("Texto Dorado")
385
+ puts Color.neon_emerald("Esmeralda Neon")
386
+ puts Color.crimson("Rojo Carmesi")
240
387
  ```
241
388
 
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.
389
+ #### Familias de Colores Destacadas:
390
+ - **Metales y Joyas:** `gold` / `neon_gold`, `silver` / `neon_silver`, `platinum` / `neon_platinum`, `ruby` / `neon_ruby`, `emerald` / `neon_emerald`, `sapphire` / `neon_sapphire`.
391
+ - **Fuego y Tierra:** `crimson` / `neon_crimson`, `scarlet` / `neon_scarlet`, `coral` / `neon_coral`, `amber` / `neon_amber`.
392
+ - **Naturaleza y Pasteles:** `lime` / `neon_lime`, `mint` / `neon_mint`, `peach` / `neon_peach`, `lavender` / `neon_lavender`, `mauve` / `neon_mauve`.
393
+ - **Ciberpunk y Monitores:** `neon_red`, `neon_cyan`, `neon_pink`, `matrix` / `neon_matrix`, `charcoal`.
247
394
 
248
395
  ---
249
396
 
250
- ### 4. Renderizado Universal de Imagenes
251
-
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.
397
+ ### 8. Iluminacion Dinamica Living Neon a 30 FPS
253
398
 
254
- #### Renderizado Directo en Consola:
399
+ Al configurar `animate: "diagonal"`, `"linear"` o `"fade"`, el motor no se queda estatico: 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 ningun lag al pulsar teclas:
255
400
 
256
401
  ```ruby
257
- # Renderiza una imagen centrada dentro de un marco estilizado
258
- GRmenu.image("fondo.jpg", width: 60, color: "rgb", style: 3)
402
+ menu = GRmenu.new(
403
+ opciones,
404
+ banner: "THEMES",
405
+ title: "Efecto Neon Vivo",
406
+ style: 3,
407
+ animate: "diagonal" # "diagonal", "linear", "fade" o "rgb"
408
+ )
409
+ menu.set_style.border("neon_red").banner("neon_red").focus("neon_yellow")
410
+ menu.draw
259
411
  ```
260
412
 
261
- #### Como Cabecera Superior en un Menu:
413
+ ---
414
+
415
+ ### 9. Seleccion Multiple con Checkboxes
416
+
417
+ Permite al usuario seleccionar multiples elementos simultaneamente mediante casillas de verificacion interactivas `[X]` / `[ ]`.
262
418
 
263
419
  ```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",
420
+ paquetes = [
421
+ ["Servidor Nginx Web", true, "Proxy inverso de alta velocidad"],
422
+ ["Base de Datos PostgreSQL 16", true, "Motor de datos principal"],
423
+ ["Almacen de Cache Redis 7.2", false, "Cache en memoria RAM"],
424
+ ["Monitor Prometheus", true, "Metricas y alertas"]
425
+ ]
426
+
427
+ seleccionados = GRmenu.checkbox(
428
+ paquetes,
429
+ title: "Instalador de Paquetes",
430
+ color: "neon_cyan",
273
431
  style: 3
274
432
  )
275
-
276
- menu.draw
277
433
  ```
278
434
 
279
- ---
435
+ **Teclas de Control:**
436
+ - `Espacio`: Alterna marcado `[X]` / `[ ]`.
437
+ - `a`: Seleccionar todos.
438
+ - `n`: Deseleccionar todos.
439
+ - `i`: Invertir seleccion.
440
+ - `Enter`: Confirmar seleccion.
280
441
 
281
- ### 5. Modales Nativos de Confirmacion y Entrada
442
+ ---
282
443
 
283
- Cuadros de dialogo emergentes bloqueantes que capturan respuestas del usuario de forma directa y visual.
444
+ ### 10. Control Deslizante Interactivo
284
445
 
285
- #### Modal de Confirmacion (`GRmenu.confirm`):
446
+ Permite seleccionar numericamente un valor o porcentaje dentro de un rango mediante una barra horizontal en tiempo real.
286
447
 
287
448
  ```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
449
+ ram = GRmenu.slider(
450
+ "Asignar Memoria RAM",
451
+ min: 1,
452
+ max: 64,
453
+ step: 1,
454
+ default: 16,
455
+ unit: "GB",
456
+ color: "gold",
457
+ style: 3
458
+ )
294
459
  ```
295
460
 
296
- #### Cuadro de Entrada de Texto (`GRmenu.input`):
461
+ ---
462
+
463
+ ### 11. Modales Nativos de Confirmacion y Entrada
297
464
 
298
465
  ```ruby
299
- # Entrada interactiva con cursor en vivo
300
- nombre = GRmenu.input("Ingresa tu nombre de usuario:", default: "admin", color: "rgb", style: 3)
466
+ # Modal Si / No con flechas
467
+ if GRmenu.confirm("Deseas aplicar los cambios en produccion?", color: "neon_green", style: 3)
468
+ puts "Aplicando..."
469
+ end
301
470
 
302
- # Modo password para claves secretas (oculta caracteres con asteriscos)
303
- token = GRmenu.input("Ingresa tu API Token:", password: true, color: "magenta", style: 7)
471
+ # Cuadro de entrada de texto con cursor en vivo
472
+ nombre = GRmenu.input("Ingresa tu nombre de usuario:", default: "admin", color: "neon_cyan", style: 3)
473
+
474
+ # Modo password para ocultar claves
475
+ token = GRmenu.input("Ingresa tu API Token:", password: true, color: "neon_pink", style: 7)
304
476
  ```
305
477
 
306
478
  ---
307
479
 
308
- ### 6. Modo RGB Chroma Wave Animado
480
+ ### 12. Renderizado Universal de Imagenes
309
481
 
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.
482
+ Decodifica y renderiza cualquier formato de imagen (PNG, JPEG, JPG, WEBP, GIF, BMP) con micro-pixeles ANSI TrueColor de 24 bits:
311
483
 
312
484
  ```ruby
313
- menu = GRmenu.new(opciones, banner: "CHROMA", title: "RGB Wave Panel")
314
-
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
321
-
322
- menu.draw
485
+ GRmenu.image("wallpaper.jpg", width: 60, color: "neon_cyan", style: 3)
323
486
  ```
324
487
 
325
488
  ---
326
489
 
327
- ### 7. Barra de Progreso y Spinner de Carga
328
-
329
- #### Barra de Progreso (`GRmenu.progress`):
490
+ ### 13. Barra de Progreso y Spinner de Carga
330
491
 
331
492
  ```ruby
332
- GRmenu.progress(100, title: "Descargando Actualizacion", color: "rgb", style: 3) do |bar|
493
+ # Barra de progreso
494
+ GRmenu.progress(100, title: "Descargando Actualizacion", color: "neon_yellow", style: 3) do |bar|
333
495
  10.times do |i|
334
496
  sleep 0.1
335
497
  bar.advance(10, status: "Procesando bloque #{i + 1} de 10...")
336
498
  end
337
499
  end
338
- ```
339
500
 
340
- #### Spinner Animado (`GRmenu.spinner`):
341
-
342
- ```ruby
343
- resultado = GRmenu.spinner("Conectando con el cluster remoto...", color: "rgb") do
344
- # Simula tarea pesada
345
- sleep 1.5
346
- "Conexion Establecida"
501
+ # Spinner animado en segundo plano
502
+ resultado = GRmenu.spinner("Conectando con el cluster remoto...", color: "neon_cyan") do
503
+ sleep 1.2
504
+ "OK"
347
505
  end
348
-
349
- puts Color.bright_green("-> #{resultado}")
350
506
  ```
351
507
 
352
508
  ---
353
509
 
354
- ### 8. Banners 3D y Lineas Divisorias
510
+ ### 14. Banners 3D y Modulo de Color
355
511
 
356
512
  ```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)
359
-
360
- # Imprime una linea divisoria horizontal con ajuste automatico al ancho de terminal
361
- GRmenu.div(60, "rgb", 1, "═")
513
+ # Banner ASCII 3D
514
+ GRmenu.banner("ADMIN", 0, color: "neon_red", style: 3, font: 1)
515
+
516
+ # Modulo Color / C
517
+ puts Color.rgb("Texto degradado arcoiris continuo")
518
+ puts Color.hex("#FF0055", "Texto en Rojo Carmesi")
519
+ puts Color.gold("Texto en Dorado")
520
+ puts Color.neon_cyan("Texto en Cian Neon")
362
521
  ```
363
522
 
364
523
  ---
365
524
 
366
- ### 9. Modulo Independiente de Color
525
+ ## Ejemplo Completo en Ruby (`e.rb`)
367
526
 
368
- El modulo `Color` (o su alias `C`) permite pintar cadenas de texto directamente con secuencias ANSI y TrueColor:
527
+ Puedes ejecutar el archivo de laboratorio interactivo completo:
369
528
 
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")
529
+ ```bash
530
+ ruby ruby/e.rb
393
531
  ```
394
532
 
395
533
  ---
@@ -443,40 +581,31 @@ Configura el diseno del marco mediante el parametro `style: 1..20`:
443
581
  | `style:` | `Integer` | `19` | Estilo de marco para las opciones (1 al 20). |
444
582
  | `banner_style:` | `Integer` | `3` | Estilo de marco para el banner 3D (1 al 20). |
445
583
  | `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. |
584
+ | `animate:` | `String/Bool`| `false` | Efecto de iluminacion ("diagonal", "linear", "fade", "rgb"). |
585
+ | `desc_prefix:` | `String` | `"[i]"` | Prefijo visual para el tooltip de ayuda. |
448
586
  | `divider:` | `Boolean/Int` | `true` | Lineas divisorias horizontales ajustadas al marco. |
449
587
  | `center:` | `Boolean` | `true` | Centrado horizontal simetrico automatico. |
450
588
 
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
589
+ ### Metodos Estaticos y Componentes
465
590
 
466
591
  | Metodo | Firma | Retorno |
467
592
  |:-------|:------|:--------|
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. |
593
+ | `GRmenu.theme` | `(nombre_o_simbolo)` | Carga un tema `.gr` predefinido para todo el sistema. |
594
+ | `GRmenu.import_config` | `(ruta_archivo_gr)` | Carga un archivo de tema `.gr` personalizado. |
595
+ | `GRmenu.export_from_file`| `(script_origen, archivo_gr)` | Extrae el tema de un script sin correr bucles. |
596
+ | `GRmenu.style` | `(texto_css_gr)` | Inyecta estilos CSS inline globalmente. |
597
+ | `GRmenu.table` | `(headers:, rows:, title:, search:, sort:, page_size:)` | Muestra tabla interactiva y devuelve fila elegida. |
598
+ | `GRmenu.card` | `(title:, content:, style:, color:, border_color:, title_color:)` | Muestra tarjeta con auto-wrap. |
599
+ | `GRmenu.alert` | `(tipo, mensaje, title:, style:, color:)` | Muestra alerta emergente estilizada. |
600
+ | `GRmenu.checkbox` | `(items, title:, color:, style:, preselected:)` | Devuelve array con items marcados. |
601
+ | `GRmenu.slider` | `(prompt, min:, max:, step:, default:, unit:, color:)` | Devuelve valor numerico seleccionado. |
602
+ | `GRmenu.confirm` | `(pregunta, default: true, color:, style:)` | Devuelve booleano (`true`/`false`). |
603
+ | `GRmenu.input` | `(prompt, default: "", password: false, color:)` | Devuelve string ingresado. |
604
+ | `GRmenu.image` | `(filepath, width:, style:, color:)` | Renderiza imagen en TrueColor 24-bit. |
605
+ | `GRmenu.progress` | `(total = 100, title:, color:, style:, &bloque)` | Barra de progreso con bloque. |
606
+ | `GRmenu.spinner` | `(mensaje, color:, delay:, &bloque)` | Spinner animado no bloqueante. |
607
+ | `GRmenu.banner` | `(texto, delay = 0, color:, style:, font:)` | Imprime banner ASCII 3D. |
608
+ | `GRmenu.help` | `()` | Muestra guia de documentacion en consola. |
480
609
 
481
610
  ---
482
611
 
@@ -484,9 +613,10 @@ Configura el diseno del marco mediante el parametro `style: 1..20`:
484
613
 
485
614
  | Tecla / Combinacion | Contexto | Accion Realizada |
486
615
  |:--------------------|:---------|:-----------------|
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. |
616
+ | `↑` (Arriba) / `k` | Menus / Tablas / Checkbox | Mueve el foco hacia arriba (con salto continuo *Snake* en extremos). |
617
+ | `↓` (Abajo) / `j` | Menus / Tablas / Checkbox | Mueve el foco hacia abajo. |
489
618
  | `←` / `→` | Grid 2D | Salta de columna a la izquierda o derecha. |
619
+ | `s` / `S` | Tablas | Ordena la tabla por la columna actual alternando ASC/DESC. |
490
620
  | `Espacio` | Checkbox | Marca o desmarca la casilla del elemento actual `[X]` / `[ ]`. |
491
621
  | `a` / `A` | Checkbox | Marca todos los elementos (*Select All*). |
492
622
  | `n` / `N` | Checkbox | Desmarca todos los elementos (*Deselect All*). |
@@ -500,43 +630,8 @@ Configura el diseno del marco mediante el parametro `style: 1..20`:
500
630
 
501
631
  ---
502
632
 
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
633
  ## Licencia
538
634
 
539
635
  Distribuido bajo licencia **MIT**. Consulta [`LICENSE`](LICENSE) para mas detalles.
540
636
 
541
637
  Desarrollado con precision por **[grcode](https://github.com/JoseEduardoGR)**
542
-