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.
- checksums.yaml +4 -4
- data/GRmenu.rb +1167 -57
- data/README.md +345 -250
- data/data/borders.json +77 -57
- data/data/colors.json +356 -13
- data/data/help.txt +284 -197
- data/data/themes/cyberpunk.gr +60 -0
- data/data/themes/dracula.gr +60 -0
- data/data/themes/matrix.gr +60 -0
- data/data/themes/monokai.gr +60 -0
- data/data/themes/neon_red.gr +51 -0
- data/data/themes/nord.gr +60 -0
- data/data/themes/sunset.gr +60 -0
- data/e.rb +394 -0
- data/grmenu.rb +3 -0
- metadata +10 -2
- data/LICENSE +0 -21
data/README.md
CHANGED
|
@@ -1,47 +1,56 @@
|
|
|
1
|
-
# GRmenu (Ruby)
|
|
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,
|
|
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
|
[](https://badge.fury.io/rb/grmenu)
|
|
8
8
|
[](LICENSE)
|
|
9
9
|
[](https://github.com/JoseEduardoGR/GRmenu)
|
|
10
10
|
[](https://www.ruby-lang.org)
|
|
11
11
|
|
|
12
|
+

|
|
13
|
+
|
|
12
14
|
---
|
|
13
15
|
|
|
14
16
|
## Tabla de Contenidos
|
|
15
17
|
|
|
16
|
-
1. [Por que elegir GRmenu?](
|
|
17
|
-
2. [Instalacion y Requisitos](
|
|
18
|
-
3. [Inicio Rapido en 10 Segundos](
|
|
19
|
-
4. [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.
|
|
22
|
-
- [3.
|
|
23
|
-
- [4.
|
|
24
|
-
- [5.
|
|
25
|
-
- [6.
|
|
26
|
-
- [7.
|
|
27
|
-
- [8.
|
|
28
|
-
- [9.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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', '~>
|
|
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 '
|
|
88
|
+
require 'grmenu'
|
|
89
|
+
|
|
90
|
+
# Cargar un tema predefinido con estetica neon
|
|
91
|
+
GRmenu.theme(:neon_red)
|
|
78
92
|
|
|
79
|
-
def
|
|
80
|
-
GRmenu.
|
|
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
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
["
|
|
94
|
-
["Ver
|
|
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: "
|
|
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.
|
|
179
|
+
### 2. Sistema de Temas .gr y CSS para TUI
|
|
165
180
|
|
|
166
|
-
|
|
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
|
-
|
|
170
|
-
║
|
|
171
|
-
|
|
172
|
-
║
|
|
173
|
-
|
|
309
|
+
╔════════════════ Monitor de Infraestructura ════════════════╗
|
|
310
|
+
║ Buscar: gate█ ║
|
|
311
|
+
║════════════════════════════════════════════════════════════║
|
|
312
|
+
║ ID │ SERVICIO │ ESTADO │ LATENCIA ║
|
|
313
|
+
║───────┼──────────────────┼───────────────┼─────────────────║
|
|
314
|
+
║ > 01 │ API Gateway │ Operativo │ 12ms ║
|
|
174
315
|
║────────────────────────────────────────────────────────────║
|
|
175
|
-
║
|
|
316
|
+
║ ↑/↓ Mover | s Ordenar | / Buscar | Enter Seleccionar ║
|
|
176
317
|
╚════════════════════════════════════════════════════════════╝
|
|
177
318
|
```
|
|
178
319
|
|
|
179
|
-
#### Codigo de Ejemplo:
|
|
180
|
-
|
|
181
320
|
```ruby
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
["
|
|
185
|
-
["
|
|
186
|
-
["
|
|
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
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
|
|
197
|
-
|
|
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
|
-
###
|
|
347
|
+
### 6. Tarjetas y Alertas Estilizadas
|
|
214
348
|
|
|
215
|
-
|
|
349
|
+
Cuadros informativos con division de parrafos (*word-wrapping*) automatico y soporte completo para colores TrueColor y Neón:
|
|
216
350
|
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
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
|
-
|
|
229
|
-
|
|
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
|
-
|
|
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
|
-
|
|
243
|
-
-
|
|
244
|
-
-
|
|
245
|
-
- `
|
|
246
|
-
-
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
258
|
-
|
|
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
|
-
|
|
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
|
-
|
|
265
|
-
[
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
-
|
|
442
|
+
---
|
|
282
443
|
|
|
283
|
-
|
|
444
|
+
### 10. Control Deslizante Interactivo
|
|
284
445
|
|
|
285
|
-
|
|
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
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
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
|
-
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
### 11. Modales Nativos de Confirmacion y Entrada
|
|
297
464
|
|
|
298
465
|
```ruby
|
|
299
|
-
#
|
|
300
|
-
|
|
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
|
-
#
|
|
303
|
-
|
|
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
|
-
###
|
|
480
|
+
### 12. Renderizado Universal de Imagenes
|
|
309
481
|
|
|
310
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
328
|
-
|
|
329
|
-
#### Barra de Progreso (`GRmenu.progress`):
|
|
490
|
+
### 13. Barra de Progreso y Spinner de Carga
|
|
330
491
|
|
|
331
492
|
```ruby
|
|
332
|
-
|
|
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
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
-
###
|
|
510
|
+
### 14. Banners 3D y Modulo de Color
|
|
355
511
|
|
|
356
512
|
```ruby
|
|
357
|
-
#
|
|
358
|
-
GRmenu.banner("ADMIN", 0, color: "
|
|
359
|
-
|
|
360
|
-
#
|
|
361
|
-
|
|
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
|
-
|
|
525
|
+
## Ejemplo Completo en Ruby (`e.rb`)
|
|
367
526
|
|
|
368
|
-
|
|
527
|
+
Puedes ejecutar el archivo de laboratorio interactivo completo:
|
|
369
528
|
|
|
370
|
-
```
|
|
371
|
-
|
|
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
|
-
| `
|
|
447
|
-
| `
|
|
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
|
|
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.
|
|
469
|
-
| `GRmenu.
|
|
470
|
-
| `GRmenu.
|
|
471
|
-
| `GRmenu.
|
|
472
|
-
| `GRmenu.
|
|
473
|
-
| `GRmenu.
|
|
474
|
-
| `GRmenu.
|
|
475
|
-
| `GRmenu.
|
|
476
|
-
| `GRmenu.
|
|
477
|
-
| `GRmenu.
|
|
478
|
-
| `GRmenu.
|
|
479
|
-
| `GRmenu.
|
|
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
|
-
|