grmenu 2.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +707 -262
- data/data/borders.json +77 -57
- data/data/colors.json +356 -13
- data/data/help.txt +432 -0
- 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 +4242 -0
- metadata +15 -4
- data/GRmenu.rb +0 -1184
data/README.md
CHANGED
|
@@ -1,381 +1,826 @@
|
|
|
1
|
-
|
|
1
|
+
# GRmenu (Ruby) v4.0.1
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Suite TUI Profesional y Ligera para la Creación de Interfaces de Línea de Comandos en Terminales TTY.**
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Flechas arriba/abajo para moverte · `Enter` para elegir · `q` para salir
|
|
5
|
+
Menús interactivos por teclado y ratón (ANSI SGR 1006), submenús laterales en cascada (hasta 3 niveles: *Sub del Sub*), menús por pestañas multitarea (`GRmenu.tabs`), rediseño de entrada de datos (`GRmenu.input`), tablas con ordenamiento y búsqueda en vivo, selección múltiple con casillas de verificación, controles deslizantes en tiempo real, renderizado de imágenes ANSI TrueColor de 24 bits, sistema de temas estilo CSS `.gr`, iluminación dinámica Living Neon a 30 FPS en vivo, colores hexadecimales directos (`#RRGGBB`), modales nativos de confirmación y texto, buscador instantáneo en vivo, cuadrículas bidimensionales, barras de progreso y banners 3D sin dependencias externas.
|
|
8
6
|
|
|
9
7
|
[](https://badge.fury.io/rb/grmenu)
|
|
10
8
|
[](LICENSE)
|
|
11
9
|
[](https://github.com/JoseEduardoGR/GRmenu)
|
|
10
|
+
[](https://www.ruby-lang.org)
|
|
12
11
|
|
|
13
|
-
|
|
12
|
+

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