g360-cli 1.13.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/package.json +1 -1
  2. package/src/assets/config/g360-skills.json +39 -0
  3. package/src/assets/config/project-types.json +15 -4
  4. package/src/assets/templates/python-flet/README.md +6 -1
  5. package/src/assets/templates/python-flet/pyproject.toml +1 -2
  6. package/src/assets/templates/python-flet-polished/README.md +170 -0
  7. package/src/assets/templates/python-flet-polished/assets/data/sample_data.json +12 -0
  8. package/src/assets/templates/python-flet-polished/assets/fonts/Inter-Variable.ttf +0 -0
  9. package/src/assets/templates/python-flet-polished/assets/fonts/JetBrainsMono-Variable.ttf +0 -0
  10. package/src/assets/templates/python-flet-polished/assets/images/app.ico +0 -0
  11. package/src/assets/templates/python-flet-polished/assets/images/logo.svg +9 -0
  12. package/src/assets/templates/python-flet-polished/build-portable.bat +42 -0
  13. package/src/assets/templates/python-flet-polished/create_shortcut.vbs +15 -0
  14. package/src/assets/templates/python-flet-polished/g360_flet/__init__.py +0 -0
  15. package/src/assets/templates/python-flet-polished/g360_flet/g360_signature.py +210 -0
  16. package/src/assets/templates/python-flet-polished/launch.vbs +3 -0
  17. package/src/assets/templates/python-flet-polished/launch_minimized.bat +3 -0
  18. package/src/assets/templates/python-flet-polished/main.py +47 -0
  19. package/src/assets/templates/python-flet-polished/pyproject.toml +18 -0
  20. package/src/assets/templates/python-flet-polished/requirements.txt +3 -0
  21. package/src/assets/templates/python-flet-polished/run.bat +189 -0
  22. package/src/assets/templates/python-flet-polished/skill.json +28 -0
  23. package/src/assets/templates/python-flet-polished/src/__init__.py +0 -0
  24. package/src/assets/templates/python-flet-polished/src/app.py +343 -0
  25. package/src/assets/templates/python-flet-polished/src/config/__init__.py +0 -0
  26. package/src/assets/templates/python-flet-polished/src/config/theme.py +122 -0
  27. package/src/assets/templates/python-flet-polished/src/core/__init__.py +0 -0
  28. package/src/assets/templates/python-flet-polished/src/core/constants.py +49 -0
  29. package/src/assets/templates/python-flet-polished/src/core/processor.py +128 -0
  30. package/src/assets/templates/python-flet-polished/src/core/skill.json +41 -0
  31. package/src/assets/templates/python-flet-polished/src/ui/__init__.py +0 -0
  32. package/src/assets/templates/python-flet-polished/src/ui/dashboard.py +308 -0
  33. package/src/assets/templates/python-flet-polished/src/ui/kpi_card.py +69 -0
  34. package/src/assets/templates/python-flet-polished/src/ui/search_overlay.py +143 -0
  35. package/src/assets/templates/python-flet-polished/sync_portable.py +71 -0
  36. package/src/cli.js +4 -4
  37. package/src/commands/init.js +33 -2
  38. package/py/src/g360_core/__pycache__/__init__.cpython-312.pyc +0 -0
  39. package/py/src/g360_core/__pycache__/__init__.cpython-314.pyc +0 -0
  40. package/py/src/g360_core/__pycache__/batch_processor.cpython-312.pyc +0 -0
  41. package/py/src/g360_core/__pycache__/batch_processor.cpython-314.pyc +0 -0
  42. package/py/src/g360_core/__pycache__/commercial_engine.cpython-314.pyc +0 -0
  43. package/py/src/g360_core/__pycache__/logger.cpython-312.pyc +0 -0
  44. package/py/src/g360_core/__pycache__/logger.cpython-314.pyc +0 -0
  45. package/py/src/g360_core/__pycache__/pipeline.cpython-312.pyc +0 -0
  46. package/py/src/g360_core/__pycache__/pipeline.cpython-314.pyc +0 -0
  47. package/py/src/g360_core/__pycache__/processor.cpython-312.pyc +0 -0
  48. package/py/src/g360_core/__pycache__/processor.cpython-314.pyc +0 -0
  49. package/py/src/g360_core/__pycache__/processor_segmentacion.cpython-312.pyc +0 -0
  50. package/py/src/g360_core/__pycache__/processor_segmentacion.cpython-314.pyc +0 -0
  51. package/py/src/g360_core/__pycache__/processor_sku.cpython-312.pyc +0 -0
  52. package/py/src/g360_core/__pycache__/processor_sku.cpython-314.pyc +0 -0
  53. package/py/src/g360_core/__pycache__/scanner.cpython-312.pyc +0 -0
  54. package/py/src/g360_core/__pycache__/scanner.cpython-314.pyc +0 -0
  55. package/py/src/g360_core/__pycache__/utils.cpython-312.pyc +0 -0
  56. package/py/src/g360_core/__pycache__/utils.cpython-314.pyc +0 -0
  57. package/src/assets/ingestion/core/__pycache__/ingestion.cpython-312.pyc +0 -0
  58. package/src/assets/signature/g360_flet/__pycache__/__init__.cpython-312.pyc +0 -0
  59. package/src/assets/signature/g360_flet/__pycache__/__init__.cpython-314.pyc +0 -0
  60. package/src/assets/signature/g360_flet/__pycache__/g360_signature.cpython-312.pyc +0 -0
  61. package/src/assets/signature/g360_flet/__pycache__/g360_signature.cpython-314.pyc +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "g360-cli",
3
- "version": "1.13.0",
3
+ "version": "1.14.0",
4
4
  "description": "CLI tool for bootstrapping G360 projects with standardized structure, assets, identity, and ERP data processing",
5
5
  "type": "module",
6
6
  "main": "src/cli.js",
@@ -279,6 +279,45 @@
279
279
  "framework": "flet",
280
280
  "portable": true,
281
281
  "brand": "cipsa"
282
+ },
283
+ {
284
+ "name": "flet-desktop-polished",
285
+ "description": "App Flet desktop con patrones UI avanzados: dual theme, auto-refresh, hash cache, search debounce, KPI glow, G360 signature widget",
286
+ "version": "1.0.0",
287
+ "device": "pc",
288
+ "colors": {
289
+ "bg": "#0b1220",
290
+ "surface": "#1a2333",
291
+ "accent": "#34d399",
292
+ "text": "#f0f6fc",
293
+ "muted": "#8b949e",
294
+ "success": "#34d399",
295
+ "warning": "#f59e0b",
296
+ "error": "#ef4444"
297
+ },
298
+ "effects": {
299
+ "glassmorphism": true,
300
+ "blur": "12px",
301
+ "rounded": "12px"
302
+ },
303
+ "signature": {
304
+ "mode": "powered",
305
+ "text": "powered by G360"
306
+ },
307
+ "framework": "flet",
308
+ "portable": true,
309
+ "features": [
310
+ "dual-theme",
311
+ "auto-launcher",
312
+ "portable-sync",
313
+ "g360-signature-flet",
314
+ "custom-fonts",
315
+ "cache-hash-diff",
316
+ "auto-refresh-thread",
317
+ "search-debounce",
318
+ "kpi-glow-cards",
319
+ "rotating-logger"
320
+ ]
282
321
  }
283
322
  ]
284
323
  }
@@ -21,13 +21,24 @@
21
21
  "framework": "python",
22
22
  "features": ["cli", "argparse", "rich"]
23
23
  },
24
+ {
25
+ "id": "python-flet-polished",
26
+ "name": "Python Flet Polished",
27
+ "description": "Python desktop app with Flet — estandar actual (dual theme, auto-refresh, hash cache, search debounce, KPI glow, G360 signature)",
28
+ "framework": "flet",
29
+ "features": ["desktop", "gui", "cross-platform", "portable", "dual-theme", "auto-refresh", "search-debounce", "kpi-glow", "g360-signature"],
30
+ "portable": true,
31
+ "default": true
32
+ },
24
33
  {
25
34
  "id": "python-flet",
26
- "name": "Python Flet Desktop",
27
- "description": "Python desktop app with Flet framework",
35
+ "name": "Python Flet (Legacy)",
36
+ "description": "Python desktop app with Flet framework — LEGACY: usar python-flet-polished para nuevos proyectos",
28
37
  "framework": "flet",
29
- "features": ["desktop", "gui", "cross-platform", "portable"],
30
- "portable": true
38
+ "features": ["desktop", "gui", "cross-platform"],
39
+ "portable": true,
40
+ "deprecated": true,
41
+ "deprecationNote": "Usa 'python-flet-polished' en su lugar. Este template se mantiene solo por compatibilidad con proyectos existentes."
31
42
  },
32
43
  {
33
44
  "id": "python-flet-migrate",
@@ -1,5 +1,8 @@
1
1
  # Mi Proyecto G360 Flet
2
2
 
3
+ > ⚠️ **LEGACY** — Este template fue reemplazado por `python-flet-polished` (estandar actual).
4
+ > Para nuevos proyectos usar: `g360 init <name> --template python-flet-polished --skill flet-desktop-polished`
5
+
3
6
  <picture>
4
7
  <source media="(prefers-color-scheme: dark)" srcset="g360/brand/g360/logotypes/logo-g360-light.svg">
5
8
  <img alt="G360" height="64" src="g360/brand/g360/logotypes/logo-g360-dark.svg">
@@ -65,5 +68,7 @@ page.add(g360_footer())
65
68
 
66
69
  ---
67
70
 
71
+ > **Nota**: Este es el template base original. Para proyectos nuevos se recomienda `python-flet-polished` que incluye: dual theme, auto-refresh con hash cache, search debounce, KPI glow cards, G360 signature widget y launcher auto-instalable de 5 pasos.
72
+
68
73
  **Marca**: G360 · **Isotipo**: 3 puntos + chevron `>`
69
- **Signature**: G360 Desktop · **Powered by**: [g360-signature](https://github.com/carloscus/g360-signature)
74
+ **Signature**: G360 Desktop · **Powered by**: [g360-signature](https://github.com/carloscus/g360-signature)
@@ -7,11 +7,10 @@ authors = [
7
7
  ]
8
8
  requires-python = ">=3.11,<4.0"
9
9
  dependencies = [
10
- "flet>=0.25.0",
10
+ "flet>=0.28.3",
11
11
  "openpyxl>=3.1.0",
12
12
  "pandas>=2.0.0",
13
13
  "xlrd>=2.0.0",
14
- "g360-core>=0.1.0",
15
14
  ]
16
15
 
17
16
  [project.optional-dependencies]
@@ -0,0 +1,170 @@
1
+ # G360 App Polished
2
+
3
+ > 🚀 **Plantilla estandar G360 para apps Flet desktop** — La evolucion de `python-flet` con patrones de UI avanzados heredados de produccion.
4
+
5
+ [![Version](https://img.shields.io/badge/version-1.0.0-blue)]()
6
+ [![Python](https://img.shields.io/badge/Python-3.11+-blue)](https://python.org)
7
+ [![Flet](https://img.shields.io/badge/Flet-0.28.3-green)](https://flet.dev)
8
+
9
+ ## Quick Start
10
+
11
+ ```bash
12
+ # La app auto-instala uv, Python 3.11, dependencias y crea acceso directo
13
+ run.bat
14
+
15
+ # O lanzador minimizado (sin consola visible)
16
+ launch.vbs
17
+ ```
18
+
19
+ ## Caracteristicas
20
+
21
+ | Caracteristica | Detalle |
22
+ |---|---|
23
+ | **Dual theme** | Dark/light con toggle y persistencia en `~/.g360/` |
24
+ | **Auto-refresh** | Cada 15 min con lock thread-safe |
25
+ | **Cache con hash diff** | SHA-256 evita rebuilds si los datos no cambiaron |
26
+ | **Search overlay** | Buscador flotante con debounce 250ms, Enter abre, Escape cierra |
27
+ | **KPI cards con glow** | Colores semanticos + efecto de luz |
28
+ | **G360 Signature** | Isotipo G360 detecta tema automaticamente (dark/light) |
29
+ | **Fonts embebidas** | Inter + JetBrains Mono Variable |
30
+ | **Launcher 5 pasos** | Auto-instala uv → Python 3.11 → .venv → deps → shortcut |
31
+ | **Portable** | `sync_portable.py` + `launch.vbs` para PCs sin Python |
32
+ | **Logger rotativo** | `RotatingFileHandler` max 2MB, backupCount=3 |
33
+ | **Shutdown limpio** | `page.on_close` detiene threads |
34
+
35
+ ## Estructura
36
+
37
+ ```
38
+ g360-app-polished/
39
+ ├── main.py # Entry point (ft.app + logger setup)
40
+ ├── src/
41
+ │ ├── __init__.py
42
+ │ ├── app.py # G360App base (orquestador)
43
+ │ ├── config/
44
+ │ │ ├── __init__.py
45
+ │ │ └── theme.py # Paleta dual + rgba() + persistencia
46
+ │ ├── core/
47
+ │ │ ├── __init__.py
48
+ │ │ ├── constants.py # Rutas, versiones, configuracion global
49
+ │ │ ├── processor.py # BaseProcessor (heredar y extender)
50
+ │ │ └── skill.json # Skill metadata
51
+ │ └── ui/
52
+ │ ├── __init__.py
53
+ │ ├── dashboard.py # Layout base: sidebar, KPIs, search
54
+ │ ├── kpi_card.py # Card reutilizable con glow
55
+ │ └── search_overlay.py # Buscador flotante con debounce
56
+ ├── g360_flet/
57
+ │ ├── __init__.py
58
+ │ └── g360_signature.py # Widget isotipo G360
59
+ ├── assets/
60
+ │ ├── fonts/ # Inter + JetBrains Mono Variable
61
+ │ ├── images/ # Logo + icono
62
+ │ └── data/ # Sample data + cache runtime
63
+ ├── skill.json # Skill G360 aplicado
64
+ ├── run.bat # Launcher 5 pasos auto-instalable
65
+ ├── launch.vbs # Lanzador minimizado
66
+ ├── launch_minimized.bat # Delega a launch.vbs
67
+ ├── build-portable.bat # PyInstaller onefile + windowed
68
+ ├── sync_portable.py # Sync sincronizacion
69
+ ├── create_shortcut.vbs # Acceso directo escritorio
70
+ ├── requirements.txt # Dependencias
71
+ ├── pyproject.toml # Metadata del proyecto
72
+ └── .gitignore
73
+ ```
74
+
75
+ ## Como extender
76
+
77
+ ### 1. Implementar tu logica de datos
78
+
79
+ En `src/app.py`, sobrescribe `_fetch_data`:
80
+
81
+ ```python
82
+ from src.app import G360App
83
+
84
+ class MiApp(G360App):
85
+ def _fetch_data(self) -> dict | None:
86
+ """Descarga datos desde tu API/ERP."""
87
+ import requests
88
+ resp = requests.get("https://mi-api.com/data")
89
+ return resp.json() if resp.ok else None
90
+ ```
91
+
92
+ ### 2. Procesar y renderizar
93
+
94
+ En `src/core/processor.py`, extiende `BaseProcessor`:
95
+
96
+ ```python
97
+ from src.core.processor import BaseProcessor
98
+
99
+ class MiProcessor(BaseProcessor):
100
+ def calcular_kpis(self, raw_data: dict) -> dict:
101
+ # Tu logica de KPIs
102
+ return {
103
+ "primary": {"value": "100", "subtext": "items"},
104
+ ...
105
+ }
106
+ ```
107
+
108
+ ### 3. Customizar el dashboard
109
+
110
+ ```python
111
+ from src.ui.dashboard import Dashboard
112
+
113
+ class MiDashboard(Dashboard):
114
+ def _render(self):
115
+ """Renderiza los datos procesados en el UI."""
116
+ kpis = MiProcessor().calcular_kpis(self._raw_data)
117
+ self._kpi_row.controls = self._build_kpi_row(kpis)
118
+ self.page.update()
119
+ ```
120
+
121
+ ## Theme Colors
122
+
123
+ Colores semanticos definidos en `skill.json`, accesibles via `get_colors(mode)`:
124
+
125
+ | Token | Dark | Light | Uso |
126
+ |-------|------|-------|-----|
127
+ | `bg` | `#0A0F1E` | `#F3F5F9` | Fondo principal |
128
+ | `surface` | `#141D33` | `#FFFFFF` | Cards, contenedores |
129
+ | `accent` | `#10B981` | `#047857` | Accentos principales |
130
+ | KPI cyan | `#06B6D4` | `#0891B2` | Indicador 1 |
131
+ | KPI violet | `#8B5CF6` | `#7C3AED` | Indicador 2 |
132
+ | KPI red | `#EF4444` | `#DC2626` | Indicador critico |
133
+ | KPI amber | `#F59E0B` | `#B45309` | Indicador warning |
134
+
135
+ ## Arquitectura
136
+
137
+ ```
138
+ main.py → G360App ──→ Dashboard ──→ KPICard, SearchOverlay
139
+ ├──→ theme.py (colores)
140
+ └──→ processor.py (logic)
141
+ ```
142
+
143
+ ### Capas (Regla G360: Core sin UI, UI con Core)
144
+
145
+ | Capa | Archivo | Responsabilidad |
146
+ |------|---------|-----------------|
147
+ | **Entry** | `main.py` | Boot, sys.path, ft.app, logger |
148
+ | **App** | `src/app.py` | Page setup, ciclo de vida, cache, auto-refresh, overlay |
149
+ | **Core** | `src/core/processor.py` | BaseProcessor (heredar) — KPIs, export |
150
+ | **Core** | `src/core/constants.py` | URL, rutas, version |
151
+ | **UI** | `src/ui/dashboard.py` | Layout completo, callbacks |
152
+ | **Config** | `src/config/theme.py` | Paleta dual, utility rgba, persistencia |
153
+ | **Brand** | `g360_flet/g360_signature.py` | Isotipo G360 auto-temado |
154
+
155
+ ## Comandos G360
156
+
157
+ ```bash
158
+ g360 init mi-app --template python-flet-polished --skill flet-desktop-polished --portable
159
+
160
+ # El template se resuelve automaticamente si usas un skill Flet:
161
+ g360 init mi-app --skill flet-desktop-polished
162
+ # ↓ usa python-flet-polished por defecto
163
+ ```
164
+
165
+ ---
166
+
167
+ > **Estandar desde v1.14.0.** El template `python-flet` clasico queda en **legacy** — usa `python-flet-polished` para nuevos proyectos.
168
+
169
+ **Marca**: G360 · **Isotipo**: 3 puntos + chevron `>` · **Signature**: powered by G360
170
+ **Powered by**: [g360-signature](https://github.com/carloscus/g360-signature)
@@ -0,0 +1,12 @@
1
+ {
2
+ "items": [
3
+ {"sku": "1001", "descripcion": "Producto ejemplo A", "stock": 150, "predespacho": 30, "disponible": 120, "linea": "PELOTAS", "categoria": "DEPORTES"},
4
+ {"sku": "1002", "descripcion": "Producto ejemplo B", "stock": 80, "predespacho": 20, "disponible": 60, "linea": "ESCRITURA", "categoria": "OFICINA"},
5
+ {"sku": "1003", "descripcion": "Producto ejemplo C", "stock": 200, "predespacho": 50, "disponible": 150, "linea": "PELOTAS", "categoria": "DEPORTES"},
6
+ {"sku": "1004", "descripcion": "Producto ejemplo D", "stock": 10, "predespacho": 5, "disponible": 5, "linea": "ARCHIVO", "categoria": "OFICINA"},
7
+ {"sku": "1005", "descripcion": "Producto ejemplo E", "stock": 300, "predespacho": 0, "disponible": 300, "linea": "PINTURA", "categoria": "ARTE"},
8
+ {"sku": "1006", "descripcion": "Producto ejemplo F", "stock": 45, "predespacho": 40, "disponible": 5, "linea": "MASCOTAS", "categoria": "OTROS"},
9
+ {"sku": "1007", "descripcion": "Producto ejemplo G", "stock": 120, "predespacho": 25, "disponible": 95, "linea": "DIBUJO", "categoria": "ARTE"},
10
+ {"sku": "1008", "descripcion": "Producto ejemplo H", "stock": 60, "predespacho": 10, "disponible": 50, "linea": "PEGAMENTOS", "categoria": "OFICINA"}
11
+ ]
12
+ }
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="90" height="90" viewBox="-3.374 5.061 1024 1024" preserveAspectRatio="xMidYMid meet" style="max-width: 90px; max-height: 90px;">
3
+ <g transform="matrix(0.1, 0, 0, -0.1, 1, 1024)" fill="#FF0000">
4
+ <path d="M 3052.75 9963.75 C 3031.364 9960.071 3009.576 9959.315 2988 9957 C 2936.722 9951.498 2885.136 9948.297 2834.188 9940.297 C 2727.738 9923.581 2621.128 9906.815 2516.063 9882.891 C 2481.936 9875.12 2451.049 9856.86 2417.938 9845.516 C 2345.256 9820.616 2270.824 9800.841 2198.766 9774.188 C 2171.471 9764.092 2147.07 9747.373 2120.5 9735.5 C 2069.784 9712.838 2017.058 9694.706 1967 9670.625 C 1950.816 9662.839 1938.017 9649.292 1922.5 9640.25 C 1870.825 9610.137 1816.662 9584.354 1765.578 9553.25 C 1758.156 9548.731 1755.362 9538.617 1748 9534 C 1737.956 9527.701 1725.079 9527.194 1714.75 9521.375 C 1692.368 9508.765 1672.25 9492.47 1650.375 9479 C 1643.08 9474.508 1634.117 9472.828 1627.359 9467.563 C 1608.101 9452.561 1592.233 9433.498 1572.875 9418.625 C 1563.156 9411.158 1551.053 9407.404 1540.641 9400.938 C 1530.023 9394.344 1519.599 9387.353 1509.875 9379.5 C 1484.352 9358.888 1459.982 9336.889 1435 9315.625 C 1393.737 9280.504 1350.022 9248.085 1311.141 9210.344 C 1230.746 9132.307 1153.829 9050.719 1077.547 8968.656 C 1051.724 8940.876 1028.888 8910.46 1005 8881 C 996.576 8870.611 989.787 8858.87 980.625 8849.125 C 972.644 8840.636 961.216 8835.673 953.875 8826.625 C 948.259 8819.703 947.025 8810.122 942.672 8802.344 C 937.417 8792.954 931.493 8783.924 925.125 8775.25 C 905.087 8747.956 881.999 8722.859 863.5 8694.5 C 840.866 8659.802 823.684 8621.8 802 8586.5 C 794.466 8574.234 783.03 8564.584 775.985 8552.031 C 754.278 8513.349 736.877 8472.386 716 8433.25 C 706.781 8415.969 694.572 8400.362 685.75 8382.875 C 670.935 8353.506 659.149 8322.698 645.203 8292.906 C 637.432 8276.304 629.266 8259.878 620.61 8243.719 C 616.229 8235.541 609.416 8228.627 606.125 8219.953 C 584.065 8161.801 566.273 8102.103 544.75 8043.75 C 538.013 8025.484 527.002 8008.861 521.391 7990.219 C 500.848 7921.969 485.46 7852.267 466.438 7783.578 C 457.409 7750.975 443.859 7719.553 437.25 7686.375 C 395.981 7479.208 384.417 7288.965 380.25 7073.875 C 378.48 6982.543 381.363 6890.94 390 6800 C 400.531 6689.11 419.747 6579.188 437.672 6469.25 C 439.777 6456.341 444.864 6444.028 450 6432 C 452.129 6427.013 457.869 6423.876 459.282 6418.641 C 464.479 6399.38 464.851 6379.069 469.516 6359.672 C 483.243 6302.599 498.401 6245.863 514.422 6189.391 C 518.243 6175.922 523.52 6162.884 529 6150 C 529.839 6148.027 532.212 6147.042 533.235 6145.157 C 536.978 6138.265 540.538 6131.22 543.203 6123.844 C 564.967 6063.609 582.734 6001.788 608.328 5943.078 C 619.398 5917.685 634.476 5894.223 646.719 5869.375 C 663.236 5835.853 677.5 5801.232 694.594 5768 C 705.177 5747.427 718.58 5728.413 729.672 5708.11 C 745.016 5680.023 757.199 5650.193 773.875 5622.875 C 784.537 5605.408 800.503 5591.604 811.375 5574.266 C 829.413 5545.499 841.679 5513.308 860.36 5484.954 C 876.104 5461.058 897.223 5441.125 914.25 5418.125 C 927.844 5399.763 938.212 5379.122 952.125 5361 C 969.813 5337.961 991.138 5317.876 1008.875 5294.875 C 1017.048 5284.276 1020.955 5270.696 1029.625 5260.5 C 1057.837 5227.32 1089.427 5197.166 1119.079 5165.266 C 1158.678 5122.665 1195.978 5077.856 1237.375 5037 C 1267.062 5007.701 1300.755 4982.755 1332.001 4955.125 C 1403.487 4891.911 1414.245 4873.967 1505.001 4806 C 1531.954 4785.815 1563.073 4771.708 1590.376 4752 C 1599.989 4745.061 1605.971 4733.98 1615.157 4726.485 C 1631.003 4713.555 1679.052 4685.273 1695.344 4676.454 C 1709.785 4668.637 1725.562 4663.273 1739.454 4654.516 C 1744.069 4651.607 1745.881 4645.577 1750.001 4642.001 C 1758.013 4635.048 1766.41 4628.381 1775.626 4623.126 C 1807.226 4605.106 1840.29 4589.77 1872.204 4572.313 C 1903.819 4555.02 1933.429 4533.904 1966.188 4518.891 C 2030.351 4489.485 2097.48 4466.993 2162.407 4439.313 C 2165.64 4437.935 2166.978 4433.793 2170.001 4432.001 C 2179.558 4426.335 2189.417 4421.002 2199.829 4417.126 C 2250.94 4398.101 2302.488 4380.216 2354.36 4363.376 C 2380.428 4354.913 2407.41 4349.495 2433.548 4341.251 C 2438.675 4339.634 2443.453 4336.91 2447.891 4333.876 C 2449.105 4333.046 2448.634 4330.545 2450.001 4330.001 C 2469.387 4322.291 2488.628 4313.318 2509.141 4309.516 C 2661.556 4281.269 2814.9 4258.257 2968.001 4234.001 C 2989.584 4230.582 3011.473 4229.446 3033.126 4226.501 C 3039.759 4225.599 3046.351 4224.268 3052.798 4222.469 C 3055.365 4221.753 3057.336 4219.032 3060.001 4219.001 C 3338.282 4215.748 3616.578 4213.505 3894.876 4212.626 C 4566.915 4210.505 5238.959 4210.426 5911.001 4210.001 C 6624.001 4209.551 7337.001 4210.001 8050.001 4210.001 C 8287.668 4210.001 8525.346 4207.663 8763.001 4210.001 C 8765.387 4210.024 8762.001 4214.668 8761.501 4217.001 C 8760.501 4221.668 8759.354 4226.305 8758.501 4231.001 C 8755.812 4245.808 8753.37 4260.66 8750.876 4275.501 C 8744.739 4312.024 8740.997 4349.021 8732.61 4385.094 C 8731.437 4390.139 8729.614 4392.281 8727.481 4397.001 C 8725.256 4401.926 8722.625 4410.927 8721.619 4416.237 C 8718.198 4434.288 8714.176 4449.353 8709.345 4467.079 C 8693.629 4524.74 8678.407 4582.666 8658.407 4638.985 C 8648.276 4667.513 8635.261 4695.101 8622.44 4722.525 C 8608.859 4751.577 8594.125 4780.02 8579.204 4808.407 C 8574.046 4818.22 8570.058 4827.277 8564.09 4836.619 C 8551.033 4857.056 8534.145 4876.518 8522.204 4897.626 C 8509.98 4919.234 8498.856 4935.964 8485.133 4956.653 C 8479.712 4964.826 8472.154 4976.255 8465.36 4983.329 C 8458.497 4990.475 8452.62 4998.521 8445.829 5005.735 C 8378.787 5076.948 8312.834 5149.234 8243.876 5218.594 C 8230.442 5232.106 8214.157 5242.454 8199.001 5254.001 C 8194.772 5257.222 8191.145 5260.753 8187.369 5264.494 C 8183.167 5268.657 8180.093 5273.658 8175.454 5277.329 C 8172.579 5279.604 8029.026 5380.975 8024.985 5383.282 C 7984.788 5406.231 7942.426 5425.204 7900.454 5444.719 C 7882.035 5453.283 7870.279 5460.199 7852.014 5469.087 C 7846.595 5471.724 7841.683 5472.736 7830.001 5479.001 C 7816.464 5486.262 7803.342 5494.744 7788.751 5499.548 C 7723.282 5521.102 7660.358 5547.162 7593.613 5564.364 C 7568.188 5570.917 7556.156 5578.276 7530.456 5583.65 C 7495.771 5590.904 7508.944 5579.63 7509.688 5583.577 C 7511.64 5593.925 7493.953 5588.601 7484.086 5591.139 C 7467.74 5595.343 7525.158 5587.681 7463.001 5595.001 C 7401.953 5602.19 7340.094 5598.115 7278.626 5598.47 C 6279.891 5604.24 5281.146 5608.199 4282.407 5613.376 C 4057.354 5614.543 3832.291 5614.775 3607.251 5617.501 C 3429.813 5619.65 3252.313 5620.978 3075.001 5628.001 C 3055.253 5628.783 3036.363 5636.347 3017.126 5640.876 C 2975.653 5650.639 2934.133 5660.236 2892.876 5670.876 C 2887.098 5672.366 2881.284 5674.207 2876.142 5677.235 C 2870.704 5680.437 2867.311 5686.709 2861.563 5689.313 C 2855.968 5691.848 2849.194 5690.218 2843.345 5692.095 C 2794.127 5707.891 2682.542 5751.997 2646.751 5770.001 C 2627.672 5779.598 2612.575 5795.767 2594.204 5806.657 C 2565.118 5823.899 2532.907 5835.718 2504.626 5854.251 C 2479.57 5870.67 2458.459 5892.444 2434.954 5911.016 C 2427.526 5916.885 2419.958 5922.643 2411.86 5927.548 C 2404.507 5932.002 2395.592 5933.795 2388.751 5939.001 C 2371.841 5951.869 2358.366 5968.954 2341.126 5981.376 C 2331.972 5987.972 2319.036 5988.273 2310.36 5995.485 C 2300.119 6003.997 2294.565 6016.95 2286.032 6027.173 C 2270.935 6045.26 2255.196 6062.805 2239.501 6080.376 C 2222.674 6099.213 2205.712 6117.933 2188.47 6136.391 C 2171.418 6154.645 2152.311 6171.06 2136.626 6190.501 C 2129.917 6198.817 2127.319 6209.768 2121.86 6218.954 C 2116.134 6228.589 2109.675 6237.78 2103.126 6246.876 C 2096.491 6256.092 2089.582 6265.122 2082.329 6273.86 C 2076.135 6281.322 2067.759 6287.095 2062.814 6295.438 C 2043.089 6328.72 2026.869 6363.959 2008.689 6398.11 C 1994.071 6425.569 1977.789 6452.177 1964.423 6480.267 C 1955.144 6499.768 1948.292 6520.343 1940.876 6540.626 C 1933.279 6561.404 1925.896 6582.277 1919.392 6603.423 C 1915.596 6615.764 1912.971 6628.436 1910.001 6641.001 C 1908.965 6645.383 1909.303 6650.182 1907.376 6654.251 C 1906.151 6656.837 1902.616 6657.639 1901.001 6660.001 C 1897.167 6665.607 1893.008 6671.324 1891.22 6677.876 C 1854.05 6814.07 1840.864 6928.785 1840.376 7078.626 C 1839.991 7196.858 1852.992 7365.084 1889.517 7489.782 C 1894.355 7506.299 1906.216 7520.027 1912.22 7536.157 C 1932.244 7589.952 1947.178 7645.562 1967.486 7699.251 C 1971.488 7709.83 1979.356 7718.514 1984.923 7728.36 C 1993.369 7743.296 2001.497 7758.411 2009.517 7773.579 C 2029.107 7810.631 2045.782 7849.324 2067.751 7885.017 C 2080.714 7906.077 2098.985 7923.382 2113.876 7943.126 C 2120.495 7951.902 2126.526 7961.125 2132.236 7970.517 C 2137.455 7979.102 2140.343 7989.161 2146.626 7997.001 C 2160.233 8013.982 2176.887 8028.289 2191.47 8044.439 C 2234.684 8092.295 2275.571 8142.273 2320.001 8189.001 C 2330.08 8199.602 2342.928 8207.178 2354.595 8216.001 C 2374.722 8231.221 2395.224 8245.94 2415.376 8261.126 C 2451.568 8288.399 2486.767 8317.011 2523.626 8343.376 C 2551.298 8363.169 2584.236 8374.399 2613.501 8391.751 C 2616.743 8393.673 2617.32 8398.353 2620.001 8401.001 C 2624.99 8405.928 2629.943 8411.353 2636.314 8414.282 C 2697.369 8442.356 2759.775 8467.396 2821.611 8493.704 C 2854.369 8507.641 2885.476 8526.719 2920.095 8535.017 C 3007.748 8556.027 3097.267 8568.681 3186.533 8581.173 C 3228.384 8587.03 3270.995 8585.387 3313.001 8590.001 C 3374.632 8596.771 3435.851 8606.871 3497.276 8615.306 C 3517.751 8618.118 3551.958 8604.205 3558.701 8623.741 C 3577.138 8677.16 3558.701 8736.763 3558.701 8793.274 C 3558.701 8962.806 3556.592 9132.352 3558.701 9301.871 C 3560.107 9414.919 3564.324 9527.914 3567.136 9640.936 C 3569.948 9753.958 3600.517 9869.731 3575.571 9980.001 C 3569.309 10007.682 3518.81 9980.05 3490.429 9980.001 C 3385.26 9979.821 3280.083 9980.651 3174.923 9979.314 C 3147.335 9978.963 3119.636 9978.426 3092.267 9974.939 C 3078.687 9973.209 3066.242 9966.071 3052.75 9963.75 Z"/>
5
+ <path d="M3731 9520 l3 -470 43 45 c24 25 43 48 43 52 0 7 221 221 279 271 21 17 44 32 50 32 6 0 11 5 11 10 0 6 24 26 54 45 29 19 62 42 71 52 10 9 27 23 39 29 12 6 44 23 71 38 28 15 55 32 60 39 11 13 177 97 193 97 6 0 12 5 14 10 3 11 154 80 175 80 6 0 18 7 27 15 15 15 175 71 274 96 28 7 52 16 52 21 0 4 -329 8 -731 8 l-731 0 3 -470z"/>
6
+ <path d="M 5440 9672 C 5440 9668 5410 9659 5373 9652 C 5259 9631 5025 9569 5022 9559 C 5020 9554 5013 9550 5007 9550 C 4987 9550 4735 9467 4730 9459 C 4727 9454 4685 9435 4636 9415 C 4545 9378 4509 9361 4500 9351 C 4497 9348 4461 9328 4420 9306 C 4379 9285 4340 9261 4334 9254 C 4328 9246 4320 9240 4316 9240 C 4294 9240 4160 9132 4068 9038 C 4008 8979 3960 8927 3960 8924 C 3960 8921 3947 8900 3931 8877 C 3916 8854 3900 8825 3896 8813 C 3892 8800 3885 8790 3880 8790 C 3871 8790 3810 8649 3810 8627 C 3810 8618 3806 8610 3800 8608 C 3789 8604 3766 8520 3744 8399 C 3730 8326 3727 8140 3723 7038 L 3717 5760 L 5591 5757 L 7463.382 5751.764 L 7586.538 5734.692 C 7647.538 5719.692 7683.154 5718.076 7684.154 5713.076 C 7724.614 5699.384 7727.768 5695.381 7732.768 5695.384 C 7754.755 5695.397 7918.932 5635.294 7936.214 5609.747 C 7939.024 5605.593 7968.381 5586.534 7985.427 5575.534 C 8036.543 5542.547 8091.32 5515.427 8098.32 5504.427 C 8101.32 5499.427 8128.214 5472.214 8160.214 5450.214 C 8193.214 5429.214 8220 5401 8227 5395 C 8256 5374 8450 5181 8450 5173 C 8450 5169 8470 5145 8495 5121 C 8520 5097 8540 5071 8540 5065 C 8540 5058 8552 5040 8567 5024 C 8581 5009 8607 4971 8623 4940 C 8640 4910 8659 4881 8665 4875 C 8675 4866 8722 4766 8734 4728 C 8742 4703 8761 4706 8795 4737 C 8811 4752 8849 4782 8880 4802 C 8960 4857 9097 4979 9230 5115 C 9268 5154 9313 5200 9331 5218 C 9349 5236 9376 5271 9391 5296 C 9407 5320 9424 5340 9430 5340 C 9435 5340 9448 5357 9459 5378 C 9469 5398 9489 5426 9502 5440 C 9516 5454 9534 5479 9542 5495 C 9576 5563 9596 5595 9606 5602 C 9612 5606 9632 5643 9650 5685 C 9668 5726 9686 5760 9690 5760 C 9694 5760 9712 5802 9731 5853 C 9749 5903 9767 5946 9772 5948 C 9780 5952 9807 6040 9837 6160 C 9847 6201 9858 6237 9861 6240 C 9873 6249 9910 6492 9920 6635 C 9931 6778 9927 6971 9909 7115 C 9893 7244 9867 7395 9860 7400 C 9857 7403 9844 7448 9831 7500 C 9804 7615 9778 7703 9769 7710 C 9763 7715 9714 7843 9702 7885 C 9699 7896 9693 7907 9689 7910 C 9685 7913 9665 7951 9645 7995 C 9625 8039 9606 8077 9602 8080 C 9598 8083 9577 8120 9555 8163 C 9534 8205 9513 8240 9508 8240 C 9504 8240 9489 8261 9473 8288 C 9458 8314 9431 8351 9413 8370 C 9395 8389 9380 8410 9380 8416 C 9380 8422 9360 8447 9335 8471 C 9310 8495 9290 8518 9290 8523 C 9290 8534 9108 8710 9097 8710 C 9092 8710 9079 8721 9069 8734 C 9059 8747 9028 8772 9001 8789 C 8974 8807 8949 8827 8946 8835 C 8943 8843 8936 8850 8930 8850 C 8924 8850 8899 8864 8875 8880 C 8851 8897 8827 8910 8821 8910 C 8815 8910 8803 8918 8793 8929 C 8783 8939 8730 8967 8675 8991 C 8620 9015 8569 9040 8562 9047 C 8549 9059 8334 9130 8307 9130 C 8299 9130 8290 9134 8288 9139 C 8281 9161 7841 9240 7731 9240 C 7708 9240 7690 9245 7687 9253 C 7682 9269 7012 9270 7002 9253 C 6998 9248 6950 9240 6895 9236 C 6678 9220 6239 9156 6232 9138 C 6230 9134 6220 9130 6209 9130 C 6177 9130 5835 9048 5830 9039 C 5827 9035 5804 9026 5780 9021 C 5755 9015 5717 9004 5695 8996 C 5673 8987 5650 8981 5644 8980 C 5637 8980 5624 9013 5615 9053 C 5605 9092 5594 9127 5590 9130 C 5585 9135 5571 9187 5522 9405 C 5513 9444 5503 9477 5500 9480 C 5496 9483 5483 9529 5471 9583 C 5452 9667 5440 9700 5440 9672 Z M 7410 7639 C 7480 7628 7612 7592 7620 7581 C 7623 7578 7660 7557 7704 7536 C 7747 7514 7787 7488 7793 7478 C 7800 7468 7809 7460 7815 7460 C 7840 7459 7990 7299 8019 7242 C 8030 7220 8045 7196 8053 7189 C 8081 7160 8132.9 6974.21 8142.523 6916 C 8145.046 6900.739 8148.988 6894.896 8150 6890 C 8156 6860.986 8153.68 6886.849 8160.001 6803.922 C 8166.322 6720.995 8155.915 6684.602 8161.353 6721.629 C 8166.215 6754.735 8152.612 6683.123 8145.046 6653.477 C 8131.197 6599.216 8081 6403 8060 6390 C 8056 6387 8041 6361 8026 6332 C 8011 6303 7988 6270 7975 6258 C 7961 6246 7950 6231 7950 6224 C 7950 6217 7924 6190 7893 6163 C 7861 6137 7833 6112 7830 6108 C 7820 6095 7735 6040 7724 6040 C 7719 6040 7704 6031 7692 6019 C 7664 5994 7549 5953 7452 5934 C 7363 5917 7206 5916 7107 5931 C 7036 5942 6870 5995 6860 6010 C 6857 6014 6830 6031 6800 6048 C 6769 6065 6733 6089 6720 6102 C 6624 6187 6592 6219 6572 6250 C 6559 6269 6543 6290 6536 6295 C 6520 6308 6450 6448 6450 6466 C 6450 6474 6446 6480 6441 6480 C 6429 6480 6404 6585 6390 6690 C 6382 6751 6382 6804 6389 6877 C 6400 6982 6427 7100 6441 7100 C 6445 7100 6454 7117 6461 7138 C 6487 7221 6530 7280 6640 7389 C 6745 7493 6747 7494 6830 7536 C 6871 7557 6907 7577 6910 7581 C 6917 7590 7007 7617 7070 7629 C 7100 7635 7134 7642 7145 7644 C 7187 7652 7348 7649 7410 7639 Z"/>
7
+ <path d="M 3980 2128 L 3980 250 L 4125 250 C 4205 250 4270 254 4270 259 C 4270 263 4304 270 4345 273 C 4480 285 4751 349 4778 377 C 4785 384 4803 393 4818 397 C 4862 408 4970 458 4970 468 C 4970 474 4978 480 4988 483 C 5022 495 5095 540 5125 568 C 5142 584 5162 601 5172 606 C 5196 619 5360 777 5360 787 C 5360 792 5376 813 5395 834 C 5414 855 5445 900 5463 934 C 5480 967 5498 997 5501 1000 C 5512 1009 5539 1066 5561 1127 C 5573 1159 5586 1187 5590 1190 C 5599 1198 5629 1329 5640 1417 C 5647 1467 5650 1939 5648 2748 L 5645 4061.894 L 4818.877 4078.649 L 3973.123 4073.772 L 3980 2128 Z"/>
8
+ </g>
9
+ </svg>
@@ -0,0 +1,42 @@
1
+ @echo off
2
+ setlocal enabledelayedexpansion
3
+ cd /d "%~dp0"
4
+
5
+ echo.
6
+ echo === G360 - Build Portable ===
7
+ echo.
8
+
9
+ REM Verificar uv
10
+ where uv >nul 2>&1
11
+ if errorlevel 1 (
12
+ echo Instalando uv...
13
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
14
+ )
15
+
16
+ REM Build standalone con PyInstaller
17
+ echo [BUILD] Generando ejecutable standalone...
18
+ uv run pyinstaller ^
19
+ --onefile ^
20
+ --windowed ^
21
+ --name "G360-App" ^
22
+ --icon assets\images\cipsa.ico ^
23
+ --add-data "assets;assets" ^
24
+ --add-data "src;src" ^
25
+ --add-data "g360_flet;g360_flet" ^
26
+ --collect-all flet ^
27
+ main.py
28
+
29
+ if errorlevel 1 (
30
+ echo.
31
+ echo ERROR: Fallo el build.
32
+ pause
33
+ exit /b 1
34
+ )
35
+
36
+ echo.
37
+ echo ========================================
38
+ echo BUILD EXITOSO
39
+ echo Ejecutable en: dist\G360-App.exe
40
+ echo ========================================
41
+ echo.
42
+ pause
@@ -0,0 +1,15 @@
1
+ Set objFSO = CreateObject("Scripting.FileSystemObject")
2
+ Set objShell = CreateObject("WScript.Shell")
3
+
4
+ strDesktop = objShell.SpecialFolders("Desktop")
5
+ strTarget = objFSO.GetAbsolutePathName("run.bat")
6
+ strIcon = objFSO.GetAbsolutePathName("assets\images\cipsa.ico")
7
+
8
+ Set objShortcut = objShell.CreateShortcut(strDesktop & "\G360 App.lnk")
9
+ objShortcut.TargetPath = strTarget
10
+ objShortcut.WorkingDirectory = objFSO.GetParentFolderName(strTarget)
11
+ objShortcut.Description = "G360 App"
12
+ objShortcut.IconLocation = strIcon
13
+ objShortcut.Save()
14
+
15
+ WScript.Echo "Atajo creado en el escritorio: G360 App.lnk"
@@ -0,0 +1,210 @@
1
+ """
2
+ g360-signature para Flet
3
+ Widget reutilizable del isotipo G360 (3 puntos + chevron) para apps Flet.
4
+ Soporta tema automatico (claro/oscuro) igual que la version web.
5
+
6
+ Uso:
7
+ from g360_flet.g360_signature import G360Signature
8
+
9
+ page.add(G360Signature(mode="own"))
10
+ page.add(G360Signature(mode="powered", version="1.0"))
11
+ """
12
+
13
+ import flet as ft
14
+
15
+ G360_GREEN = "#00d084"
16
+ G360_GRAY_DARK = "#94a3b8"
17
+ G360_GRAY_LIGHT = "#64748b"
18
+
19
+
20
+ class G360Signature(ft.Row):
21
+ """
22
+ Componente de branding G360 para Flet.
23
+
24
+ Detecta automaticamente el tema de la pagina (light/dark)
25
+ y ajusta los colores igual que el Web Component original.
26
+ """
27
+
28
+ def __init__(
29
+ self,
30
+ mode: str = "own",
31
+ version: str | None = None,
32
+ opacity: float = 0.4,
33
+ grayscale: bool = False,
34
+ spacing: int = 4,
35
+ on_hover=None,
36
+ **kwargs,
37
+ ):
38
+ super().__init__(**kwargs)
39
+
40
+ self._base_opacity = opacity
41
+ self._grayscale = grayscale
42
+ self.spacing = spacing
43
+ self.vertical_alignment = ft.CrossAxisAlignment.CENTER
44
+
45
+ self._mode = "own"
46
+ self._version = None
47
+
48
+ self.mode = mode
49
+ self.version = version
50
+
51
+ if on_hover is None:
52
+ self.on_hover = self._default_on_hover
53
+ else:
54
+ self.on_hover = on_hover
55
+
56
+ self.opacity = opacity
57
+
58
+ def _default_on_hover(self, e: ft.HoverEvent):
59
+ self.opacity = 1.0 if e.data == "true" else self._base_opacity
60
+ self.update()
61
+
62
+ def _is_dark(self) -> bool:
63
+ """Detecta si el tema actual es oscuro."""
64
+ if not self._is_mounted():
65
+ return False
66
+ mode = self.page.theme_mode
67
+ if mode == ft.ThemeMode.DARK:
68
+ return True
69
+ if mode == ft.ThemeMode.LIGHT:
70
+ return False
71
+ bg = self.page.bgcolor
72
+ if bg and isinstance(bg, str):
73
+ bg_lower = bg.lower()
74
+ if bg_lower.startswith("#"):
75
+ r = int(bg_lower[1:3], 16)
76
+ g = int(bg_lower[3:5], 16)
77
+ b = int(bg_lower[5:7], 16)
78
+ lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255
79
+ return lum < 0.5
80
+ return False
81
+
82
+ def _get_colors(self):
83
+ """Retorna colores segun el tema actual."""
84
+ if self._grayscale:
85
+ return G360_GRAY_DARK, G360_GRAY_DARK
86
+ if self._is_dark():
87
+ return G360_GREEN, G360_GRAY_DARK
88
+ return G360_GREEN, G360_GRAY_LIGHT
89
+
90
+ def _build(self):
91
+ green, gray = self._get_colors()
92
+
93
+ dots = ft.Column(
94
+ controls=[
95
+ ft.Container(width=4, height=4, border_radius=2, bgcolor=gray),
96
+ ft.Container(width=4, height=4, border_radius=2, bgcolor=green),
97
+ ft.Container(width=4, height=4, border_radius=2, bgcolor=gray),
98
+ ],
99
+ spacing=2,
100
+ horizontal_alignment=ft.CrossAxisAlignment.CENTER,
101
+ )
102
+
103
+ chevron = ft.Text(
104
+ ">",
105
+ size=14,
106
+ color=green,
107
+ font_family="JetBrains Mono",
108
+ selectable=False,
109
+ )
110
+
111
+ isotype = ft.Row(
112
+ controls=[dots, chevron],
113
+ spacing=1,
114
+ vertical_alignment=ft.CrossAxisAlignment.CENTER,
115
+ )
116
+
117
+ if self.mode == "own":
118
+ text_controls = [
119
+ ft.Text("G360", size=12, color=green, weight=ft.FontWeight.BOLD,
120
+ font_family="JetBrains Mono", selectable=False),
121
+ ft.Text(" by ccusi", size=12, color=gray,
122
+ font_family="JetBrains Mono", selectable=False),
123
+ ]
124
+ else:
125
+ text_controls = [
126
+ ft.Text("powered by ", size=12, color=gray,
127
+ font_family="JetBrains Mono", selectable=False),
128
+ ft.Text("G360", size=12, color=green, weight=ft.FontWeight.BOLD,
129
+ font_family="JetBrains Mono", selectable=False),
130
+ ]
131
+
132
+ if self.version:
133
+ text_controls.append(
134
+ ft.Text(f" v{self.version}", size=12, color=gray, opacity=0.7,
135
+ font_family="JetBrains Mono", selectable=False)
136
+ )
137
+
138
+ text_row = ft.Row(
139
+ controls=text_controls,
140
+ spacing=0,
141
+ vertical_alignment=ft.CrossAxisAlignment.CENTER,
142
+ )
143
+
144
+ self.controls = [isotype, text_row]
145
+
146
+ def _is_mounted(self) -> bool:
147
+ try:
148
+ return self.page is not None
149
+ except RuntimeError:
150
+ return False
151
+
152
+ @property
153
+ def mode(self) -> str:
154
+ return self._mode
155
+
156
+ @mode.setter
157
+ def mode(self, value: str):
158
+ if value not in ("own", "powered"):
159
+ raise ValueError(f"mode debe ser 'own' o 'powered', recibido: '{value}'")
160
+ self._mode = value
161
+ if self._is_mounted():
162
+ self._build()
163
+
164
+ @property
165
+ def version(self) -> str | None:
166
+ return self._version
167
+
168
+ @version.setter
169
+ def version(self, value: str | None):
170
+ self._version = value
171
+ if self._is_mounted():
172
+ self._build()
173
+
174
+ @property
175
+ def grayscale(self) -> bool:
176
+ return self._grayscale
177
+
178
+ @grayscale.setter
179
+ def grayscale(self, value: bool):
180
+ self._grayscale = value
181
+ if self._is_mounted():
182
+ self._build()
183
+
184
+ def did_mount(self):
185
+ self._build()
186
+ self.update()
187
+
188
+ def update(self):
189
+ if self._is_mounted():
190
+ self._build()
191
+ super().update()
192
+
193
+
194
+ def g360_own(version: str | None = None, **kwargs) -> G360Signature:
195
+ """Isotipo modo propio: G360 by ccusi"""
196
+ return G360Signature(mode="own", version=version, **kwargs)
197
+
198
+
199
+ def g360_powered(version: str | None = None, **kwargs) -> G360Signature:
200
+ """Isotipo modo powered: powered by G360"""
201
+ return G360Signature(mode="powered", version=version, **kwargs)
202
+
203
+
204
+ def g360_footer(version: str | None = None, **kwargs) -> ft.Container:
205
+ """Footer completo con el isotipo G360."""
206
+ return ft.Container(
207
+ content=G360Signature(mode="powered", version=version, opacity=0.6, **kwargs),
208
+ padding=ft.padding.Padding(0, 0, 0, 16),
209
+ alignment=ft.alignment.Alignment(0, 1),
210
+ )
@@ -0,0 +1,3 @@
1
+ Set WshShell = CreateObject("WScript.Shell")
2
+ WshShell.Run chr(34) & "run.bat" & Chr(34), 0
3
+ Set WshShell = Nothing
@@ -0,0 +1,3 @@
1
+ @echo off
2
+ cd /d "%~dp0"
3
+ cscript //nologo launch.vbs