fletplus


Namefletplus JSON
Version 0.2.2 PyPI version JSON
download
home_pagehttps://github.com/Alphonsus411/fletplus
SummaryComponentes visuales avanzados para Flet en Python
upload_time2025-08-10 16:38:04
maintainerNone
docs_urlNone
authorAdolfo González Hernández
requires_python>=3.8
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 🚀 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"
}
        
Elapsed time: 1.16156s