---
name: generate_pwa_manifest
kind: function
lang: py
domain: core
version: "1.0.0"
purity: pure
signature: "def generate_pwa_manifest(name: str, short_name: str, description: str = \"\", start_url: str = \"/\", display: str = \"standalone\", orientation: str = \"portrait\", theme_color: str = \"#000000\", background_color: str = \"#000000\", icons: list[dict] | None = None, categories: list[str] | None = None, lang: str = \"es\") -> dict"
description: "Genera el contenido de un manifest.json para Progressive Web Apps segun el estandar W3C Web App Manifest. Retorna un dict listo para json.dumps(). Si icons es None genera placeholders estandar para 192x192 y 512x512."
tags: [pwa, manifest, web, json, frontend]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
params:
  - name: name
    desc: "Nombre completo de la aplicacion que aparece en la pantalla de instalacion."
  - name: short_name
    desc: "Nombre corto para launchers y pantallas de inicio (maximo 12 caracteres recomendado)."
  - name: description
    desc: "Descripcion de la aplicacion. Cadena vacia por defecto."
  - name: start_url
    desc: "URL de inicio al lanzar la PWA desde la pantalla de inicio. Por defecto '/'."
  - name: display
    desc: "Modo de visualizacion: standalone, fullscreen, minimal-ui o browser. Por defecto standalone."
  - name: orientation
    desc: "Orientacion preferida de pantalla: portrait, landscape o any. Por defecto portrait."
  - name: theme_color
    desc: "Color del tema en formato hex (#RRGGBB) para la barra de estado y UI del SO. Por defecto #000000."
  - name: background_color
    desc: "Color de fondo en formato hex (#RRGGBB) mostrado durante la carga. Por defecto #000000."
  - name: icons
    desc: "Lista de dicts con src, sizes, type y purpose. Si es None genera placeholders para 192x192 y 512x512."
  - name: categories
    desc: "Lista de categorias W3C (navigation, shopping, travel, etc). Si es None usa lista vacia."
  - name: lang
    desc: "Codigo de idioma BCP 47 del contenido principal de la app. Por defecto 'es'."
output: "Dict con la estructura completa W3C Web App Manifest: name, short_name, description, start_url, scope, display, orientation, theme_color, background_color, icons, categories y lang."
tested: true
tests:
  - "valores por defecto generan manifest valido con icons placeholder"
  - "icons custom se respetan"
  - "todos los campos se incluyen correctamente"
  - "categories none produce lista vacia"
  - "json dumps compatible"
test_file_path: "python/functions/core/generate_pwa_manifest_test.py"
file_path: "python/functions/core/generate_pwa_manifest.py"
---

## Ejemplo

```python
manifest = generate_pwa_manifest(
    name="Voice Guide",
    short_name="VoiceGuide",
    description="Guia por voz con POIs",
    theme_color="#12b886",
    background_color="#1a1b1e",
)
# {
#   "name": "Voice Guide",
#   "short_name": "VoiceGuide",
#   "start_url": "/",
#   "scope": "/",
#   "display": "standalone",
#   "orientation": "portrait",
#   "theme_color": "#12b886",
#   "background_color": "#1a1b1e",
#   "icons": [
#     {"src": "/icons/icon-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "any maskable"},
#     {"src": "/icons/icon-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "any maskable"},
#   ],
#   "categories": [],
#   "lang": "es",
# }

import json
with open("public/manifest.json", "w") as f:
    json.dump(manifest, f, indent=2, ensure_ascii=False)
```

## Notas

Funcion pura — sin I/O, sin efectos secundarios. El caller es responsable de escribir el archivo con `json.dumps()` o `json.dump()`.

Los valores de `display` validos segun W3C son: `fullscreen`, `standalone`, `minimal-ui`, `browser`. La funcion no valida el valor — acepta cualquier string para permitir valores futuros del estandar.

El campo `scope` siempre se fija a `"/"`. Si se necesita un scope distinto, el caller puede modificar el dict resultante antes de serializar.
