grmenu 3.0.0 → 4.0.2
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/README.md +584 -300
- data/data/borders.json +77 -57
- data/data/colors.json +356 -13
- data/data/help.txt +346 -218
- 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/{GRmenu.rb → grmenu.rb} +1971 -144
- metadata +9 -2
data/README.md
CHANGED
|
@@ -1,102 +1,124 @@
|
|
|
1
|
-
# GRmenu (Ruby)
|
|
1
|
+
# GRmenu (Ruby) v4.0.2
|
|
2
2
|
|
|
3
|
-
**Suite TUI Profesional y Ligera para la
|
|
3
|
+
**Suite TUI Profesional y Ligera para la Creación de Interfaces de Línea de Comandos en Terminales TTY.**
|
|
4
4
|
|
|
5
|
-
|
|
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
|
[](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
|
|
17
|
-
2. [
|
|
18
|
-
3. [Inicio
|
|
19
|
-
4. [
|
|
20
|
-
- [1.
|
|
21
|
-
- [2.
|
|
22
|
-
- [3.
|
|
23
|
-
- [4.
|
|
24
|
-
- [5.
|
|
25
|
-
- [6.
|
|
26
|
-
- [7.
|
|
27
|
-
- [8.
|
|
28
|
-
- [9.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
48
|
+
## Por qué elegir GRmenu?
|
|
39
49
|
|
|
40
|
-
- **Cero Dependencias Externas:** Funciona exclusivamente con la
|
|
41
|
-
- **
|
|
42
|
-
- **
|
|
43
|
-
- **
|
|
44
|
-
- **
|
|
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
|
-
##
|
|
63
|
+
## Instalación y Requisitos
|
|
49
64
|
|
|
50
65
|
Requiere **Ruby >= 2.6.0**.
|
|
51
66
|
|
|
52
|
-
###
|
|
67
|
+
### Vía RubyGems
|
|
53
68
|
|
|
54
69
|
```bash
|
|
55
70
|
gem install grmenu
|
|
56
71
|
```
|
|
57
72
|
|
|
58
|
-
###
|
|
73
|
+
### Vía Gemfile
|
|
59
74
|
|
|
60
75
|
```ruby
|
|
61
|
-
gem 'grmenu', '~>
|
|
76
|
+
gem 'grmenu', '~> 4.0'
|
|
62
77
|
```
|
|
63
78
|
|
|
64
|
-
### Requerimiento
|
|
79
|
+
### Requerimiento en scripts de Ruby
|
|
65
80
|
|
|
66
81
|
```ruby
|
|
67
|
-
require '
|
|
82
|
+
require 'grmenu'
|
|
68
83
|
```
|
|
69
84
|
|
|
70
85
|
---
|
|
71
86
|
|
|
72
|
-
## Inicio
|
|
87
|
+
## Inicio Rápido en 10 Segundos
|
|
73
88
|
|
|
74
|
-
Crea un archivo llamado `app.rb` y
|
|
89
|
+
Crea un archivo llamado `app.rb` y ejecútalo con `ruby app.rb`:
|
|
75
90
|
|
|
76
91
|
```ruby
|
|
77
|
-
require '
|
|
92
|
+
require 'grmenu'
|
|
93
|
+
|
|
94
|
+
# Cargar un tema integrado con estética neón
|
|
95
|
+
GRmenu.theme(:neon_red)
|
|
78
96
|
|
|
79
|
-
def
|
|
80
|
-
GRmenu.
|
|
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.2!")
|
|
83
99
|
end
|
|
84
100
|
|
|
85
|
-
def
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
["
|
|
94
|
-
["Ver
|
|
95
|
-
["Salir", -> { exit(0) }, "Finaliza la
|
|
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: "
|
|
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
|
-
##
|
|
129
|
+
## Guía Exhaustiva de Componentes y Características
|
|
108
130
|
|
|
109
|
-
### 1.
|
|
131
|
+
### 1. Menú Interactivo Principal
|
|
110
132
|
|
|
111
|
-
El constructor `GRmenu.new` proporciona una experiencia interactiva completa con
|
|
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 (
|
|
153
|
+
# 1. Method directo (formatea y capitaliza el nombre automáticamente)
|
|
134
154
|
method(:iniciar_servidor),
|
|
135
155
|
|
|
136
|
-
# 2. Symbol (invoca el
|
|
156
|
+
# 2. Symbol (invoca el método del contexto)
|
|
137
157
|
:crear_respaldo,
|
|
138
158
|
|
|
139
|
-
# 3. Arreglo [Etiqueta,
|
|
159
|
+
# 3. Arreglo [Etiqueta, Acción]
|
|
140
160
|
["Lanzar Proceso", method(:lanzar)],
|
|
141
161
|
|
|
142
|
-
# 4. Arreglo con Tooltip [Etiqueta,
|
|
143
|
-
["Limpieza de
|
|
144
|
-
|
|
145
|
-
# 5. Bloque
|
|
146
|
-
["
|
|
147
|
-
|
|
148
|
-
# 6. Hash
|
|
149
|
-
{ name: "
|
|
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
|
|
183
|
+
title: "Consola de Administración",
|
|
152
184
|
banner: "SISTEMA",
|
|
153
185
|
search: true, # Activa buscador interactivo en vivo
|
|
154
|
-
columns:
|
|
155
|
-
page_size: 6, #
|
|
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.
|
|
197
|
+
### 2. Submenús en Cascada de hasta 3 Niveles (*Sub del Sub*)
|
|
165
198
|
|
|
166
|
-
|
|
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
|
-
|
|
170
|
-
║
|
|
171
|
-
║
|
|
172
|
-
║
|
|
173
|
-
║
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
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
|
-
["
|
|
186
|
-
["Monitor Prometheus", true, "
|
|
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: "
|
|
338
|
+
color: "neon_cyan",
|
|
193
339
|
style: 3
|
|
194
340
|
)
|
|
195
341
|
|
|
196
|
-
puts "
|
|
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
|
|
204
|
-
- `Espacio`: Alterna
|
|
205
|
-
- `a
|
|
206
|
-
- `n
|
|
207
|
-
- `i
|
|
208
|
-
- `Enter`: Confirma y devuelve
|
|
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
|
-
###
|
|
354
|
+
### 7. Control Deslizante en Tiempo Real (`GRmenu.slider`)
|
|
214
355
|
|
|
215
|
-
Permite seleccionar
|
|
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: "
|
|
366
|
+
color: "gold",
|
|
236
367
|
style: 3
|
|
237
368
|
)
|
|
238
|
-
|
|
239
|
-
puts "Memoria configurada: #{ram} GB"
|
|
240
369
|
```
|
|
241
370
|
|
|
242
|
-
**Teclas de
|
|
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
|
-
###
|
|
375
|
+
### 8. Diálogos Nativos de Confirmación (`GRmenu.confirm`)
|
|
251
376
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
#### Renderizado Directo en Consola:
|
|
377
|
+
Cuadros emergentes Si / No con botones activos interactivos:
|
|
255
378
|
|
|
256
379
|
```ruby
|
|
257
|
-
|
|
258
|
-
|
|
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
|
-
|
|
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
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
]
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
-
|
|
428
|
+
if fila
|
|
429
|
+
puts "Fila elegida: #{fila.join(' | ')}"
|
|
430
|
+
end
|
|
277
431
|
```
|
|
278
432
|
|
|
279
433
|
---
|
|
280
434
|
|
|
281
|
-
###
|
|
435
|
+
### 10. Tarjetas Estilizadas y Alertas (`GRmenu.card` y `GRmenu.alert`)
|
|
282
436
|
|
|
283
|
-
Cuadros
|
|
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
|
-
|
|
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
|
-
#
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
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
|
-
|
|
480
|
+
---
|
|
481
|
+
|
|
482
|
+
### 12. Barras de Progreso y Spinners de Carga
|
|
297
483
|
|
|
298
484
|
```ruby
|
|
299
|
-
#
|
|
300
|
-
|
|
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
|
-
#
|
|
303
|
-
|
|
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
|
-
###
|
|
502
|
+
### 13. Iluminación Dinámica Living Neon a 30 FPS
|
|
309
503
|
|
|
310
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
536
|
+
### 15. Sistema de Temas .gr y CSS para TUI
|
|
328
537
|
|
|
329
|
-
|
|
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.
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
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
|
-
####
|
|
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
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
358
|
-
|
|
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
|
-
|
|
361
|
-
GRmenu.div(60, "rgb", 1, "═")
|
|
688
|
+
menu.draw
|
|
362
689
|
```
|
|
363
690
|
|
|
364
691
|
---
|
|
365
692
|
|
|
366
|
-
|
|
693
|
+
## Laboratorio de Nuevas Funcionalidades
|
|
367
694
|
|
|
368
|
-
|
|
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
|
-
```
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
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
|
-
##
|
|
709
|
+
## Catálogo Visual de Fuentes 3D
|
|
398
710
|
|
|
399
|
-
Configura la
|
|
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
|
-
##
|
|
728
|
+
## Catálogo Visual de Marcos y Bordes
|
|
417
729
|
|
|
418
|
-
Configura el
|
|
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`| `●○○○●` (
|
|
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
|
-
|
|
|
746
|
+
| Parámetro | Tipo | Valor por Defecto | Descripción |
|
|
435
747
|
|:----------|:-----|:------------------|:------------|
|
|
436
|
-
| `functions` | `Array` | *Obligatorio* | Lista de
|
|
437
|
-
| `title:` | `String` | `""` |
|
|
438
|
-
| `banner:` | `String` | `""` | Texto convertido a arte ASCII 3D
|
|
439
|
-
| `subtitle:` | `String` | `""` |
|
|
440
|
-
| `search:` | `Boolean` | `false` | Activa el buscador
|
|
441
|
-
| `columns:` | `Integer` | `1` | Cantidad de columnas para
|
|
442
|
-
| `page_size:` | `Integer` | `auto` |
|
|
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
|
|
446
|
-
| `
|
|
447
|
-
| `
|
|
448
|
-
| `
|
|
449
|
-
| `
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
|
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.
|
|
469
|
-
| `GRmenu.
|
|
470
|
-
| `GRmenu.
|
|
471
|
-
| `GRmenu.
|
|
472
|
-
| `GRmenu.
|
|
473
|
-
| `GRmenu.
|
|
474
|
-
| `GRmenu.
|
|
475
|
-
| `GRmenu.
|
|
476
|
-
| `GRmenu.
|
|
477
|
-
| `GRmenu.
|
|
478
|
-
| `GRmenu.
|
|
479
|
-
| `GRmenu.
|
|
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
|
|
484
|
-
|
|
485
|
-
|
|
|
486
|
-
|
|
487
|
-
| `↑` (Arriba) / `k` |
|
|
488
|
-
| `↓` (Abajo) / `j` |
|
|
489
|
-
|
|
|
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
|
|
494
|
-
| `←` / `→` o `h` / `l`| Slider | Ajusta el valor
|
|
495
|
-
| `↑` / `↓` o `k` / `j`| Slider | Salto
|
|
496
|
-
| `Enter` | Global | Ejecuta la
|
|
497
|
-
| `q` / `Esc` | Global | Sale del
|
|
498
|
-
| `Backspace` | Buscador / Input | Borra el
|
|
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
|
|
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)**
|