# 🚀 FletPlus
**FletPlus** es una librería de componentes visuales y utilidades para acelerar el desarrollo de interfaces modernas en Python usando [Flet](https://flet.dev).
Proporciona un conjunto de controles personalizables como tablas inteligentes, grillas responsivas, barras laterales, gestores de tema y estructura modular de apps.
---
## 📦 Instalación
```bash
pip install fletplus
```
- Incluye sistema de estilos, botones personalizados y utilidades de diseño responsivo.
- **Requiere Python 3.9+ y flet>=0.27.0**
## 🧩 Componentes incluidos
| Componente | Descripción |
|----------------|---------------------------------------------------|
| `SmartTable` | Tabla con paginación y ordenamiento integrados |
| `SidebarAdmin` | Menú lateral dinámico con ítems y selección |
| `ResponsiveGrid` | Distribución de contenido adaptable a pantalla |
| `ResponsiveContainer` | Aplica estilos según breakpoints definidos |
| `LineChart` | Gráfico de líneas interactivo basado en Canvas |
| `ThemeManager` | Gestión centralizada de modo claro/oscuro |
| `FletPlusApp` | Estructura base para apps con navegación y tema |
| `SystemTray` | Icono de bandeja del sistema con eventos |
| `PrimaryButton` / `SecondaryButton` / `IconButton` | Conjunto de botones tematizados y personalizables |
| `ResponsiveVisibility` | Oculta o muestra controles según tamaño u orientación |
# 📝 Logging
FletPlus utiliza el módulo estándar `logging` para registrar mensajes de la
biblioteca. De forma predeterminada, `FletPlusApp.start` configura un registro
básico a nivel `INFO`.
Para cambiar el nivel de salida en tu aplicación, ajusta `logging` antes de
iniciar FletPlus:
```python
import logging
from fletplus.core import FletPlusApp
logging.basicConfig(level=logging.DEBUG)
FletPlusApp.start(routes)
```
# 🎨 Sistema de estilos
El dataclass `Style` permite envolver cualquier control de Flet dentro de un
`Container` aplicando márgenes, padding, colores y bordes de forma declarativa.
```python
import flet as ft
from fletplus.styles import Style
def main(page: ft.Page):
estilo = Style(padding=20, bgcolor=ft.Colors.AMBER_100, border_radius=10)
saludo = estilo.apply(ft.Text("Hola estilo"))
page.add(saludo)
ft.app(target=main)
```
# 🖱️ Botones personalizados
Incluye tres variantes listas para usar: `PrimaryButton`, `SecondaryButton` e
`IconButton`, que aprovechan los tokens definidos en `ThemeManager` y aceptan
`Style` para ajustes adicionales.
```python
import flet as ft
from fletplus.components.buttons import PrimaryButton, SecondaryButton, IconButton
from fletplus.themes.theme_manager import ThemeManager
def main(page: ft.Page):
theme = ThemeManager(page, tokens={"typography": {"button_size": 16}})
theme.apply_theme()
page.add(
PrimaryButton("Guardar", icon=ft.icons.SAVE, theme=theme),
SecondaryButton("Cancelar", theme=theme),
IconButton(ft.icons.DELETE, label="Eliminar", theme=theme),
)
ft.app(target=main)
```
# 🌓 Gestor de temas
`ThemeManager` permite centralizar los tokens de estilo y alternar entre modo claro y oscuro.
## 📁 Cargar tokens/paletas desde JSON o YAML
Las paletas pueden definirse en un archivo **JSON** o **YAML** con las claves `light` y `dark`.
Además de `primary`, FletPlus reconoce grupos semánticos como `info`,
`success`, `warning` y `error` con tonos `_100` ... `_900` que luego se
pueden consultar o modificar dinámicamente mediante `get_token` y
`set_token`.
**palette.json**
```json
{
"light": {"primary": "#2196F3"},
"dark": {"primary": "#0D47A1"}
}
```
**palette.yaml**
```yaml
light:
primary: "#2196F3"
dark:
primary: "#0D47A1"
```
### Grupos de colores semánticos
Además de la clave `primary`, se pueden definir grupos de estado con distintos tonos.
Los grupos admitidos son `info`, `success`, `warning` y `error`, cada uno con
tonos `100` a `900`:
```json
{
"light": {
"info": {
"100": "#BBDEFB",
"500": "#2196F3",
"900": "#0D47A1"
},
"success": {
"100": "#C8E6C9",
"500": "#4CAF50",
"900": "#1B5E20"
},
"warning": {
"100": "#FFECB3",
"500": "#FFC107",
"900": "#FF6F00"
},
"error": {
"100": "#FFCDD2",
"500": "#F44336",
"900": "#B71C1C"
}
}
}
```
`load_palette_from_file` aplanará automáticamente estas secciones en claves
como `info_100` o `warning_500`. Revisa el archivo
[`palette_extended.json`](examples/palette_extended.json) para una paleta
completa con todos los tonos.
## 🔄 Ejemplo completo con ThemeManager
El siguiente ejemplo muestra cómo cargar la paleta y alternar entre modo claro y oscuro:
```python
import flet as ft
from fletplus.themes.theme_manager import ThemeManager, load_palette_from_file
import yaml
def main(page: ft.Page):
# Cargar tokens de colores desde JSON
colors = load_palette_from_file("palette.json", mode="light")
# Si prefieres YAML:
# with open("palette.yaml", "r", encoding="utf-8") as fh:
# colors = yaml.safe_load(fh)["light"]
theme = ThemeManager(page, tokens={"colors": colors})
theme.apply_theme()
# Botón para alternar entre modo claro y oscuro
toggle = ft.IconButton(
ft.icons.DARK_MODE,
on_click=lambda _: theme.toggle_dark_mode(),
)
page.add(ft.Text("Modo actual"), toggle)
ft.app(target=main)
```
# 📱 Diseño responsivo por dispositivo
Con `ResponsiveVisibility` se puede mostrar u ocultar un control según el
ancho, alto u orientación de la página, facilitando interfaces adaptables.
```python
import flet as ft
from fletplus.utils.responsive_visibility import ResponsiveVisibility
def main(page: ft.Page):
txt = ft.Text("Solo en pantallas anchas")
ResponsiveVisibility(page, txt, width_breakpoints={0: False, 800: True})
page.add(txt)
ft.app(target=main)
```
## 🎨 Estilos responsivos
Para aplicar diferentes estilos según el tamaño u orientación de la página se
puede combinar :class:`ResponsiveManager` con :class:`ResponsiveStyle`.
```python
import flet as ft
from fletplus.styles import Style
from fletplus.utils import ResponsiveManager, ResponsiveStyle
def main(page: ft.Page):
texto = ft.Text("Hola")
estilos = ResponsiveStyle(width={0: Style(text_style=ft.TextStyle(size=10)), 600: Style(text_style=ft.TextStyle(size=20))})
manager = ResponsiveManager(page)
manager.register_styles(texto, estilos)
page.add(texto)
ft.app(target=main)
```
# 🧱 ResponsiveContainer
`ResponsiveContainer` simplifica la aplicación de estilos responsivos a un control
sin manejar manualmente las señales de tamaño de la página.
```python
import flet as ft
from fletplus.components.responsive_container import ResponsiveContainer
from fletplus.styles import Style
from fletplus.utils.responsive_style import ResponsiveStyle
def main(page: ft.Page):
estilos = ResponsiveStyle(width={0: Style(padding=10), 600: Style(padding=30)})
contenedor = ResponsiveContainer(ft.Text("Hola"), estilos)
page.add(contenedor.build(page))
ft.app(target=main)
```
# 🧪 Ejemplo rápido
```python
import flet as ft
from fletplus.components.smart_table import SmartTable
from fletplus.styles import Style
def main(page: ft.Page):
rows = [
ft.DataRow(cells=[ft.DataCell(ft.Text("1")), ft.DataCell(ft.Text("Alice"))]),
ft.DataRow(cells=[ft.DataCell(ft.Text("2")), ft.DataCell(ft.Text("Bob"))]),
]
table = SmartTable(["ID", "Nombre"], rows, style=Style(bgcolor=ft.Colors.AMBER_50))
page.add(table.build())
ft.app(target=main)
```
## 📈 Ejemplo de LineChart
```python
import flet as ft
from fletplus.components.charts import LineChart
from fletplus.styles import Style
def main(page: ft.Page):
datos = [(0, 0), (1, 3), (2, 1), (3, 4)]
grafico = LineChart(datos, style=Style(padding=10))
page.add(grafico.build())
ft.app(target=main)
```
## 🔔 Ejemplo de SystemTray
```python
from fletplus.desktop.system_tray import SystemTray
tray = SystemTray(icon="icon.png", menu=["Abrir", "Salir"])
tray.on_click(lambda: print("Clic en el icono"))
tray.show()
```
# 🔧 Estructura del proyecto
fletplus/
├── components/
│ ├── smart_table.py
│ ├── sidebar_admin.py
│ └── responsive_grid.py
├── themes/
│ └── theme_manager.py
├── core.py ← Clase FletPlusApp
# 📋 Tests
Todos los componentes aceptan un argumento opcional `style` de tipo
[`Style`](./fletplus/styles/style.py) para envolver la estructura principal con
propiedades de margen, color de fondo y más. Los tests cubren estos
comportamientos (ver carpeta tests/).
```bash
pytest --cov=fletplus
```
# 📱 Modo móvil
> **Nota**: Para compilar y ejecutar en Android o iOS, es necesario tener configurado el entorno de Flet para cada plataforma. Consulta la [documentación oficial de instalación](https://flet.dev/docs/install/) y los [requisitos de despliegue móvil](https://flet.dev/docs/guides/mobile/) antes de generar tu app.
# 🌐 Construcción PWA
Para generar los archivos necesarios de una PWA se incluye el módulo
`fletplus.web.pwa`. Un flujo típico de build sería:
```python
from fletplus.web.pwa import generate_manifest, generate_service_worker
generate_manifest(
name="Mi App",
icons=[{"src": "icon.png", "sizes": "192x192", "type": "image/png"}],
start_url="/",
output_dir="web",
)
generate_service_worker(["/", "/main.css"], output_dir="web")
```
Durante el inicio de la aplicación se puede registrar con:
```python
from fletplus.web.pwa import register_pwa
def main(page):
register_pwa(page)
```
# 🛠️ Contribuir
Las contribuciones son bienvenidas:
1. **Haz un fork**
2. **Crea tu rama**: git checkout -b feature/nueva-funcionalidad
3. **Abre un PR** explicando el cambio
# 📄 Licencia
MIT License
Copyright (c) 2025 Adolfo González
# 💬 Contacto
Desarrollado por Adolfo González Hernández.
**email**: adolfogonzal@gmail.com
Raw data
{
"_id": null,
"home_page": "https://github.com/Alphonsus411/fletplus",
"name": "fletplus",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": null,
"author": "Adolfo Gonz\u00e1lez Hern\u00e1ndez",
"author_email": "Adolfo Gonz\u00e1lez <adolfogonzal@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/fb/64/8fd4941698fd8304211ab648927f6cbf0454ddbd0bbfe87282df3234456e/fletplus-0.2.2.tar.gz",
"platform": null,
"description": "# \ud83d\ude80 FletPlus\r\n\r\n**FletPlus** es una librer\u00eda de componentes visuales y utilidades para acelerar el desarrollo de interfaces modernas en Python usando [Flet](https://flet.dev). \r\nProporciona un conjunto de controles personalizables como tablas inteligentes, grillas responsivas, barras laterales, gestores de tema y estructura modular de apps.\r\n\r\n---\r\n\r\n## \ud83d\udce6 Instalaci\u00f3n\r\n\r\n```bash\r\npip install fletplus\r\n```\r\n- Incluye sistema de estilos, botones personalizados y utilidades de dise\u00f1o responsivo.\r\n- **Requiere Python 3.9+ y flet>=0.27.0**\r\n\r\n## \ud83e\udde9 Componentes incluidos\r\n\r\n| Componente | Descripci\u00f3n |\r\n|----------------|---------------------------------------------------|\r\n| `SmartTable` | Tabla con paginaci\u00f3n y ordenamiento integrados |\r\n| `SidebarAdmin` | Men\u00fa lateral din\u00e1mico con \u00edtems y selecci\u00f3n |\r\n| `ResponsiveGrid` | Distribuci\u00f3n de contenido adaptable a pantalla |\r\n| `ResponsiveContainer` | Aplica estilos seg\u00fan breakpoints definidos |\r\n| `LineChart` | Gr\u00e1fico de l\u00edneas interactivo basado en Canvas |\r\n| `ThemeManager` | Gesti\u00f3n centralizada de modo claro/oscuro |\r\n| `FletPlusApp` | Estructura base para apps con navegaci\u00f3n y tema |\r\n| `SystemTray` | Icono de bandeja del sistema con eventos |\r\n| `PrimaryButton` / `SecondaryButton` / `IconButton` | Conjunto de botones tematizados y personalizables |\r\n| `ResponsiveVisibility` | Oculta o muestra controles seg\u00fan tama\u00f1o u orientaci\u00f3n |\r\n\r\n# \ud83d\udcdd Logging\r\n\r\nFletPlus utiliza el m\u00f3dulo est\u00e1ndar `logging` para registrar mensajes de la\r\nbiblioteca. De forma predeterminada, `FletPlusApp.start` configura un registro\r\nb\u00e1sico a nivel `INFO`.\r\n\r\nPara cambiar el nivel de salida en tu aplicaci\u00f3n, ajusta `logging` antes de\r\niniciar FletPlus:\r\n\r\n```python\r\nimport logging\r\nfrom fletplus.core import FletPlusApp\r\n\r\nlogging.basicConfig(level=logging.DEBUG)\r\n\r\nFletPlusApp.start(routes)\r\n```\r\n\r\n# \ud83c\udfa8 Sistema de estilos\r\n\r\nEl dataclass `Style` permite envolver cualquier control de Flet dentro de un\r\n`Container` aplicando m\u00e1rgenes, padding, colores y bordes de forma declarativa.\r\n\r\n```python\r\nimport flet as ft\r\nfrom fletplus.styles import Style\r\n\r\ndef main(page: ft.Page):\r\n estilo = Style(padding=20, bgcolor=ft.Colors.AMBER_100, border_radius=10)\r\n saludo = estilo.apply(ft.Text(\"Hola estilo\"))\r\n page.add(saludo)\r\n\r\nft.app(target=main)\r\n```\r\n\r\n# \ud83d\uddb1\ufe0f Botones personalizados\r\n\r\nIncluye tres variantes listas para usar: `PrimaryButton`, `SecondaryButton` e\r\n`IconButton`, que aprovechan los tokens definidos en `ThemeManager` y aceptan\r\n`Style` para ajustes adicionales.\r\n\r\n```python\r\nimport flet as ft\r\nfrom fletplus.components.buttons import PrimaryButton, SecondaryButton, IconButton\r\nfrom fletplus.themes.theme_manager import ThemeManager\r\n\r\ndef main(page: ft.Page):\r\n theme = ThemeManager(page, tokens={\"typography\": {\"button_size\": 16}})\r\n theme.apply_theme()\r\n page.add(\r\n PrimaryButton(\"Guardar\", icon=ft.icons.SAVE, theme=theme),\r\n SecondaryButton(\"Cancelar\", theme=theme),\r\n IconButton(ft.icons.DELETE, label=\"Eliminar\", theme=theme),\r\n )\r\n\r\nft.app(target=main)\r\n```\r\n\r\n# \ud83c\udf13 Gestor de temas\r\n\r\n`ThemeManager` permite centralizar los tokens de estilo y alternar entre modo claro y oscuro.\r\n\r\n## \ud83d\udcc1 Cargar tokens/paletas desde JSON o YAML\r\n\r\nLas paletas pueden definirse en un archivo **JSON** o **YAML** con las claves `light` y `dark`.\r\nAdem\u00e1s de `primary`, FletPlus reconoce grupos sem\u00e1nticos como `info`,\r\n`success`, `warning` y `error` con tonos `_100` ... `_900` que luego se\r\npueden consultar o modificar din\u00e1micamente mediante `get_token` y\r\n`set_token`.\r\n\r\n**palette.json**\r\n```json\r\n{\r\n \"light\": {\"primary\": \"#2196F3\"},\r\n \"dark\": {\"primary\": \"#0D47A1\"}\r\n}\r\n```\r\n\r\n**palette.yaml**\r\n```yaml\r\nlight:\r\n primary: \"#2196F3\"\r\ndark:\r\n primary: \"#0D47A1\"\r\n```\r\n\r\n### Grupos de colores sem\u00e1nticos\r\n\r\nAdem\u00e1s de la clave `primary`, se pueden definir grupos de estado con distintos tonos.\r\nLos grupos admitidos son `info`, `success`, `warning` y `error`, cada uno con\r\ntonos `100` a `900`:\r\n\r\n```json\r\n{\r\n \"light\": {\r\n \"info\": {\r\n \"100\": \"#BBDEFB\",\r\n \"500\": \"#2196F3\",\r\n \"900\": \"#0D47A1\"\r\n },\r\n \"success\": {\r\n \"100\": \"#C8E6C9\",\r\n \"500\": \"#4CAF50\",\r\n \"900\": \"#1B5E20\"\r\n },\r\n \"warning\": {\r\n \"100\": \"#FFECB3\",\r\n \"500\": \"#FFC107\",\r\n \"900\": \"#FF6F00\"\r\n },\r\n \"error\": {\r\n \"100\": \"#FFCDD2\",\r\n \"500\": \"#F44336\",\r\n \"900\": \"#B71C1C\"\r\n }\r\n }\r\n}\r\n```\r\n\r\n`load_palette_from_file` aplanar\u00e1 autom\u00e1ticamente estas secciones en claves\r\ncomo `info_100` o `warning_500`. Revisa el archivo\r\n[`palette_extended.json`](examples/palette_extended.json) para una paleta\r\ncompleta con todos los tonos.\r\n\r\n## \ud83d\udd04 Ejemplo completo con ThemeManager\r\n\r\nEl siguiente ejemplo muestra c\u00f3mo cargar la paleta y alternar entre modo claro y oscuro:\r\n\r\n```python\r\nimport flet as ft\r\nfrom fletplus.themes.theme_manager import ThemeManager, load_palette_from_file\r\nimport yaml\r\n\r\n\r\ndef main(page: ft.Page):\r\n # Cargar tokens de colores desde JSON\r\n colors = load_palette_from_file(\"palette.json\", mode=\"light\")\r\n\r\n # Si prefieres YAML:\r\n # with open(\"palette.yaml\", \"r\", encoding=\"utf-8\") as fh:\r\n # colors = yaml.safe_load(fh)[\"light\"]\r\n\r\n theme = ThemeManager(page, tokens={\"colors\": colors})\r\n theme.apply_theme()\r\n\r\n # Bot\u00f3n para alternar entre modo claro y oscuro\r\n toggle = ft.IconButton(\r\n ft.icons.DARK_MODE,\r\n on_click=lambda _: theme.toggle_dark_mode(),\r\n )\r\n page.add(ft.Text(\"Modo actual\"), toggle)\r\n\r\n\r\nft.app(target=main)\r\n```\r\n\r\n# \ud83d\udcf1 Dise\u00f1o responsivo por dispositivo\r\n\r\nCon `ResponsiveVisibility` se puede mostrar u ocultar un control seg\u00fan el\r\nancho, alto u orientaci\u00f3n de la p\u00e1gina, facilitando interfaces adaptables.\r\n\r\n```python\r\nimport flet as ft\r\nfrom fletplus.utils.responsive_visibility import ResponsiveVisibility\r\n\r\ndef main(page: ft.Page):\r\n txt = ft.Text(\"Solo en pantallas anchas\")\r\n ResponsiveVisibility(page, txt, width_breakpoints={0: False, 800: True})\r\n page.add(txt)\r\n\r\nft.app(target=main)\r\n```\r\n\r\n## \ud83c\udfa8 Estilos responsivos\r\n\r\nPara aplicar diferentes estilos seg\u00fan el tama\u00f1o u orientaci\u00f3n de la p\u00e1gina se\r\npuede combinar :class:`ResponsiveManager` con :class:`ResponsiveStyle`.\r\n\r\n```python\r\nimport flet as ft\r\nfrom fletplus.styles import Style\r\nfrom fletplus.utils import ResponsiveManager, ResponsiveStyle\r\n\r\ndef main(page: ft.Page):\r\n texto = ft.Text(\"Hola\")\r\n estilos = ResponsiveStyle(width={0: Style(text_style=ft.TextStyle(size=10)), 600: Style(text_style=ft.TextStyle(size=20))})\r\n manager = ResponsiveManager(page)\r\n manager.register_styles(texto, estilos)\r\n page.add(texto)\r\n\r\nft.app(target=main)\r\n```\r\n\r\n# \ud83e\uddf1 ResponsiveContainer\r\n\r\n`ResponsiveContainer` simplifica la aplicaci\u00f3n de estilos responsivos a un control\r\nsin manejar manualmente las se\u00f1ales de tama\u00f1o de la p\u00e1gina.\r\n\r\n```python\r\nimport flet as ft\r\nfrom fletplus.components.responsive_container import ResponsiveContainer\r\nfrom fletplus.styles import Style\r\nfrom fletplus.utils.responsive_style import ResponsiveStyle\r\n\r\ndef main(page: ft.Page):\r\n estilos = ResponsiveStyle(width={0: Style(padding=10), 600: Style(padding=30)})\r\n contenedor = ResponsiveContainer(ft.Text(\"Hola\"), estilos)\r\n page.add(contenedor.build(page))\r\n\r\nft.app(target=main)\r\n```\r\n\r\n# \ud83e\uddea Ejemplo r\u00e1pido\r\n\r\n```python\r\nimport flet as ft\r\nfrom fletplus.components.smart_table import SmartTable\r\nfrom fletplus.styles import Style\r\n\r\ndef main(page: ft.Page):\r\n rows = [\r\n ft.DataRow(cells=[ft.DataCell(ft.Text(\"1\")), ft.DataCell(ft.Text(\"Alice\"))]),\r\n ft.DataRow(cells=[ft.DataCell(ft.Text(\"2\")), ft.DataCell(ft.Text(\"Bob\"))]),\r\n ]\r\n table = SmartTable([\"ID\", \"Nombre\"], rows, style=Style(bgcolor=ft.Colors.AMBER_50))\r\n page.add(table.build())\r\n\r\nft.app(target=main)\r\n```\r\n\r\n## \ud83d\udcc8 Ejemplo de LineChart\r\n\r\n```python\r\nimport flet as ft\r\nfrom fletplus.components.charts import LineChart\r\nfrom fletplus.styles import Style\r\n\r\ndef main(page: ft.Page):\r\n datos = [(0, 0), (1, 3), (2, 1), (3, 4)]\r\n grafico = LineChart(datos, style=Style(padding=10))\r\n page.add(grafico.build())\r\n\r\nft.app(target=main)\r\n```\r\n\r\n## \ud83d\udd14 Ejemplo de SystemTray\r\n\r\n```python\r\nfrom fletplus.desktop.system_tray import SystemTray\r\n\r\ntray = SystemTray(icon=\"icon.png\", menu=[\"Abrir\", \"Salir\"])\r\ntray.on_click(lambda: print(\"Clic en el icono\"))\r\ntray.show()\r\n```\r\n# \ud83d\udd27 Estructura del proyecto\r\n\r\nfletplus/\r\n\u251c\u2500\u2500 components/\r\n\u2502 \u251c\u2500\u2500 smart_table.py\r\n\u2502 \u251c\u2500\u2500 sidebar_admin.py\r\n\u2502 \u2514\u2500\u2500 responsive_grid.py\r\n\u251c\u2500\u2500 themes/\r\n\u2502 \u2514\u2500\u2500 theme_manager.py\r\n\u251c\u2500\u2500 core.py \u2190 Clase FletPlusApp\r\n\r\n# \ud83d\udccb Tests\r\n\r\nTodos los componentes aceptan un argumento opcional `style` de tipo\r\n[`Style`](./fletplus/styles/style.py) para envolver la estructura principal con\r\npropiedades de margen, color de fondo y m\u00e1s. Los tests cubren estos\r\ncomportamientos (ver carpeta tests/).\r\n\r\n```bash\r\npytest --cov=fletplus\r\n```\r\n\r\n# \ud83d\udcf1 Modo m\u00f3vil\r\n\r\n> **Nota**: Para compilar y ejecutar en Android o iOS, es necesario tener configurado el entorno de Flet para cada plataforma. Consulta la [documentaci\u00f3n oficial de instalaci\u00f3n](https://flet.dev/docs/install/) y los [requisitos de despliegue m\u00f3vil](https://flet.dev/docs/guides/mobile/) antes de generar tu app.\r\n\r\n# \ud83c\udf10 Construcci\u00f3n PWA\r\n\r\nPara generar los archivos necesarios de una PWA se incluye el m\u00f3dulo\r\n`fletplus.web.pwa`. Un flujo t\u00edpico de build ser\u00eda:\r\n\r\n```python\r\nfrom fletplus.web.pwa import generate_manifest, generate_service_worker\r\n\r\ngenerate_manifest(\r\n name=\"Mi App\",\r\n icons=[{\"src\": \"icon.png\", \"sizes\": \"192x192\", \"type\": \"image/png\"}],\r\n start_url=\"/\",\r\n output_dir=\"web\",\r\n)\r\ngenerate_service_worker([\"/\", \"/main.css\"], output_dir=\"web\")\r\n```\r\n\r\nDurante el inicio de la aplicaci\u00f3n se puede registrar con:\r\n\r\n```python\r\nfrom fletplus.web.pwa import register_pwa\r\n\r\ndef main(page):\r\n register_pwa(page)\r\n```\r\n\r\n# \ud83d\udee0\ufe0f Contribuir\r\n\r\nLas contribuciones son bienvenidas:\r\n\r\n1. **Haz un fork**\r\n\r\n2. **Crea tu rama**: git checkout -b feature/nueva-funcionalidad\r\n\r\n3. **Abre un PR** explicando el cambio\r\n\r\n# \ud83d\udcc4 Licencia\r\n\r\nMIT License\r\n\r\nCopyright (c) 2025 Adolfo Gonz\u00e1lez\r\n\r\n# \ud83d\udcac Contacto\r\n\r\nDesarrollado por Adolfo Gonz\u00e1lez Hern\u00e1ndez. \r\n\r\n**email**: adolfogonzal@gmail.com\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Componentes visuales avanzados para Flet en Python",
"version": "0.2.2",
"project_urls": {
"Documentation": "https://github.com/Alphonsus411/fletplus#readme",
"Homepage": "https://github.com/Alphonsus411/fletplus",
"Repository": "https://github.com/Alphonsus411/fletplus"
},
"split_keywords": [],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "4363ea08fd3775718c4c7a24c4b284e1c639df0d35016d40d08f2abbbfc44e87",
"md5": "a8370c2874cd6d8b550361e94d9a2a01",
"sha256": "26bb65a44fe73e1925ea792b7074bf4efd99be1e7df88682723a756a2da4b2cb"
},
"downloads": -1,
"filename": "fletplus-0.2.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a8370c2874cd6d8b550361e94d9a2a01",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 55414,
"upload_time": "2025-08-10T16:38:03",
"upload_time_iso_8601": "2025-08-10T16:38:03.069800Z",
"url": "https://files.pythonhosted.org/packages/43/63/ea08fd3775718c4c7a24c4b284e1c639df0d35016d40d08f2abbbfc44e87/fletplus-0.2.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fb648fd4941698fd8304211ab648927f6cbf0454ddbd0bbfe87282df3234456e",
"md5": "1fcbe0faae2c6937647edea48b0f8a94",
"sha256": "18fbcba7e78eda159fd6dedb3938fbf8b66554a062bc80f927b1897adb8b68db"
},
"downloads": -1,
"filename": "fletplus-0.2.2.tar.gz",
"has_sig": false,
"md5_digest": "1fcbe0faae2c6937647edea48b0f8a94",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 42951,
"upload_time": "2025-08-10T16:38:04",
"upload_time_iso_8601": "2025-08-10T16:38:04.396714Z",
"url": "https://files.pythonhosted.org/packages/fb/64/8fd4941698fd8304211ab648927f6cbf0454ddbd0bbfe87282df3234456e/fletplus-0.2.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-10 16:38:04",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Alphonsus411",
"github_project": "fletplus",
"github_not_found": true,
"lcname": "fletplus"
}