# 0043 — Estandarizar shell de las 4 apps C++ (About + Settings + paneles + tokens)

## Metadata

| Campo | Valor |
|-------|-------|
| **ID** | 0043 |
| **Estado** | pendiente |
| **Prioridad** | alta |
| **Tipo** | refactor — `cpp/apps/*` y `projects/fn_monitoring/apps/registry_dashboard` |

## Dependencias

Bloquea-por: **0041** (AppConfig extendido), **0042** (layout_storage publico).

---

## Objetivo

Que las 4 apps C++ con GUI (`shaders_lab`, `chart_demo`, `primitives_gallery`, `registry_dashboard`) sigan el mismo patron de inicializacion documentado en `cpp/PATTERNS.md` (issue 0041): About + Settings + paneles + tokens, sin reinventar boilerplate.

## Contexto

Auditoria muestra que cada app arranca distinto: solo `shaders_lab` aprovecha menubar con paneles, solo `registry_dashboard` registra About + Settings, `primitives_gallery` llama `apply_dark_theme()` + `gl_loader_init()` a mano. Tras 0041 y 0042, se puede unificar.

## Arquitectura

```
cpp/apps/
├── shaders_lab/main.cpp                   # MOD — usa layout_storage publico, About, init via AppConfig
├── chart_demo/main.cpp                    # MOD — registra About, simplifica
├── primitives_gallery/main.cpp            # MOD — gl_loader_init via AppConfig, About
└── text_editor_smoke/                     # SIN CAMBIOS (test CLI)

projects/fn_monitoring/apps/registry_dashboard/
└── main.cpp                               # MOD — usa AppConfig.about en lugar de about_window_set_info inline
```

## Tareas

### Fase 1 — chart_demo (mas simple, validacion temprana)

1.1 Cambiar a:
```cpp
return fn::run_app({
    .title="chart_demo", .width=1280, .height=800,
    .about={.name="chart_demo", .version="0.1.0",
            .description="Demo de primitivos viz: line, scatter, bar, heatmap"}
}, render);
```
1.2 Quitar la llamada manual a `app_menubar(nullptr,0,nullptr)` del render — `run_app` la invoca por nosotros si hay panels/layouts; en este caso sin panels, dejar render limpio (o llamar `app_menubar(nullptr,0,nullptr)` solo si hace falta menubar para Settings).
1.3 Build OK.

### Fase 2 — primitives_gallery

2.1 Quitar `apply_dark_theme()` y `gl_loader_init()` del init manual (l. 129-134). Pasar `init_gl_loader=true` y `theme=ThemeMode::FnDark` en `AppConfig`.
2.2 Anadir About (`name="Primitives Gallery"`, version, description). 
2.3 Mantener `app_menubar(nullptr,0,nullptr)` solo si la menubar la quiere la app — opcionalmente delegar a `run_app` extendido.
2.4 Build OK.

### Fase 3 — registry_dashboard

3.1 Reemplazar la llamada manual `about_window_set_info(...)` (l. 121-127) por `AppConfig::about={...}`. La seccion `Status` se queda como `settings_window_add_section` (no cambia).
3.2 Build OK.

### Fase 4 — shaders_lab

4.1 Reemplazar el bloque de layouts inline por `fn_ui::layout_storage_open("shaders_lab.db")` + `layout_storage_make_callbacks` (consume issue 0042).
4.2 Anadir About (`name="shaders_lab"`, version, description).
4.3 Pasar `panels` y `layouts_cb` via `AppConfig` (issue 0041) — quitar la llamada manual a `app_menubar`.
4.4 Build OK.

### Fase 5 — Verificacion cross

5.1 Build Linux y Windows de las 4 apps.
5.2 Run rapido en Linux para confirmar que About y Settings/Status aparecen en el menubar de cada una.

## Decisiones de diseno

- Tocar registry_dashboard para que sea consistente con el patron, aunque hoy ya tenia About/Settings via APIs sueltas.
- text_editor_smoke se queda igual (es un test CLI).

## Riesgos

- Si `run_app` invoca `app_menubar` y la app tambien lo llama, salen dos menubars. Verificar que cada main.cpp solo llama `app_menubar` si NO esta declarado en AppConfig.
- shaders_lab: la migracion a `layout_storage` debe preservar layouts existentes — ver riesgo de 0042.

## Validacion

- Las 4 apps abren y muestran menu Settings con Settings… + About… (mas Status… donde aplique).
- shaders_lab guarda/carga layouts despues de la migracion.
- `cmake --build` pasa para todas. Cross-compile Windows OK.
