# Launcher grid — integración

## Módulos (nuevos)

| Archivo | Rol |
|---------|-----|
| [layout-model.js](layout-model.js) | Esquema `launcherLayout`, migración, `resolveGridRows`, reorden, quitar apps |
| [folder-service.js](folder-service.js) | Crear carpeta (2 apps), insertar app en carpeta, metadatos, eliminar / descomponer |
| [grid-drag.js](grid-drag.js) | Ghost de arrastre, hit-test, ratio de solapamiento |
| [pointer-interaction.js](pointer-interaction.js) | Long press vs arrastre (Pointer Events) |
| [context-target.js](context-target.js) | Helpers de tipo `app` / `folder` |
| [grid-integration.js](grid-integration.js) | Tiles, `bindLauncherToTile`, filas con sistema prepend |

## Extendido (existente)

- [index.php](../../index.php): scripts antes de `main.js`, botones del strip para carpetas, modal `#launcherFolderModal`.
- [main.js](../../js/main.js): `renderGrid`, `saveSettings` (sync `launcherLayout`), alta/baja de apps, `addToDesktop`, `moveToTrash`, `showStripMenu` (coords pointer), listeners de carpeta.
- [main.css](../../css/main.css): estilos `.folder-tile`, arrastre, modal carpeta.
- [includes/bootstrap.php](../../../includes/bootstrap.php): default `launcherLayout` null.
- [includes/settings_helpers.php](../../../includes/settings_helpers.php): merge de `launcherLayout`.

## Enganche en `main.js`

1. Variables `launcherLayout`, `launcherContextTarget`, controladores pointer.
2. `renderGrid` usa `GridLauncher.integration.buildDisplayRows` + `createAppTile` / `createFolderTile` + `bindLauncherToTile`.
3. Persistencia: `saveSettings({ launcherLayout })` tras reorden, carpeta o renombrado/color.
4. Menú contextual: `prepareLauncherStripForApp` / `prepareLauncherStripForFolder`; clic derecho sigue el listener `contextmenu` (no duplicar con pointer botón 2).

## Depuración

En consola: `window.__GRID_LAUNCHER_DEBUG__ = true` (reservado para logs futuros).

## Checklist de pruebas manuales

1. **Grid normal**: tap abre app; escritorio previo sin errores con scripts cargados.
2. **Clic derecho (PC)**: menú contextual en app; carpetas muestran Abrir / Renombrar / Color / Eliminar.
3. **Long press sin mover**: menú contextual (apps no sistema; carpetas).
4. **Long press + arrastre**: reorden visual y persistencia tras recarga (sin búsqueda/filtro activo).
5. **Búsqueda/filtro activo**: arrastre desactivado; menú contextual sigue disponible.
6. **Soltar app sobre app** (solapamiento alto): crea carpeta; recarga conserva.
7. **Soltar app sobre carpeta**: app entra en carpeta.
8. **Abrir carpeta**: modal lista apps; clic abre app y cierra modal.
9. **Renombrar / color**: persiste y se ve en tile.
10. **Eliminar carpeta vacía** / **descomponer con apps**: layout coherente.
11. **Nueva app** (modal): aparece en grid y persiste orden.
12. **Desinstalar app**: desaparece del layout y carpetas.
