# HANDOFF — Piedra Total Perú (piedra-total-peru)

Última actualización: **2026-09-27**

## Entorno
- **Local**: `http://127.0.0.1:8001/` (todo en Docker; NUNCA `localhost`).
- **MySQL**: host `3307` (contenedor `3306`), BD `piedra`.
- **Build assets**: `docker compose run --rm node npm run build`
- **Limpiar vistas Blade**: `docker compose exec app php artisan view:clear`
- **Tests**: `docker compose exec app php artisan test --filter="..."`
- **Producción**: cPanel, cuenta `rocochoslima`, dominio `piedratotalperu.com`, app en **su propia carpeta** (no `public_html`; confirmar el nombre — la que contiene `artisan`), rewrite a `public/`, PHP **8.4** (`ea-php84`).

## Qué se hizo esta sesión (2026-09-27)
### A. Home/UI (Piedra)
- **Hero ≤ 100vh**: `app.css` → `--strip-height` (0 móvil / 45px desktop) y `hero-viewport` = `calc(100svh - var(--strip-height))` (la franja superior ya no lo empuja).
- **Acordeón de colecciones** (`resources/views/components/collections-accordion.blade.php` + `app.css` + `resources/js/animations.js`):
  - Rótulos no se parten en móvil (`width: max-content; max-width: 90%`).
  - Bandas con `min-h` y contenedor `min-h` (pueden crecer si la pantalla es muy baja).
  - `[data-accordion-label].is-behind` (z-index 20) mientras hay un panel abierto (la piedra tapa los otros).
  - **Entrada dominó** izq→der: `buildCollectionsEntrance()` en `animations.js` + `data-collections-entrance` / `data-accordion-name`.
  - Fondo `data-tone="light"` (antes negro al descubrirse).
- **Carrito “Mi pedido”**: se muestra **solo con ítems**; movido del botón flotante al **header** (icono + badge); en móvil junto al menú. `site-header.blade.php`, `order-builder.blade.php`, `OrderBuilder.php`, `icon.blade.php` (`cart`).

### B. Subida de imágenes (rendimiento/cuelgue)
- `app/Services/MediaService.php`: **decode único** (`generateDerivatives`) + **guarda de píxeles** (`config/media.php`, `MEDIA_MAX_PIXELS`, default 24MP) + `ensureDerivatives()`.
- Comando **`media:derivatives`** (`app/Console/Commands/GenerateMediaDerivativesCommand.php`).
- Tests: `tests/Feature/MediaUploadResizeTest.php`, `tests/Feature/Console/GenerateMediaDerivativesCommandTest.php`.

### C. Panel: previews ligeras (evita bajar originales)
- `app/Filament/Support/MediaThumbnailPreview.php`: preview = **thumb → webp → placeholder** (NUNCA original), metadata-free. Aplicado a los `FileUpload` de imagen de `ProductForm`, `PageForm`, `PostForm`, `ProjectForm`, `TestimonialForm`.
- Tests: `tests/Unit/Filament/MediaThumbnailPreviewTest.php`, `tests/Feature/Filament/ProductMediaPreviewTest.php`.

### D. Scheduler (CRÍTICO: `proc_open` deshabilitado)
- El hosting tiene **`proc_open` deshabilitado**; en Laravel 12/13 `Schedule::command()` corre cada tarea como **subproceso** → fallaba TODO el scheduler (`The Process class relies on proc_open...`).
- `routes/console.php` usa **`Schedule::call(fn () => Artisan::call(...))`**. Tareas: `sitemap-generate` (horaria), `request-logs-prune` (02:30), `backup-run-db` (03:00), `backup-clean` (03:30), **`media-derivatives` cada 15 min**, y `queue-work` si `QUEUE_CONNECTION=database`.
- **NO volver a `Schedule::command()`** en este hosting.

### E. Fix Alpine (`SyntaxError: Invalid or unexpected token`)
- `resources/views/filament/forms/components/permalink.blade.php`: `@js($getPermalink())` dentro de `x-on:click` se emitía **sin compilar** → rompía la página (parecía “crashear”). Ahora usa **`$refs.permalink.value`**.
- Regla: **no usar `@js()` dentro de expresiones Alpine**.

### F. `.htaccess` con PHP 8.4
- `/.htaccess` y `/public/.htaccess` con el bloque `cPanel-generated handler` (`AddHandler application/x-httpd-ea-php84`). Si se pierde, cae a PHP viejo y falla `Composer ... PHP >= 8.4.1`.

### G. Assets nuevos
- Imágenes nuevas incluidas en el zip: `public/images/og-default.jpg|png`, `public/images/real/colecciones/roca.jpeg`, `logo-blanco.webp`, `logo-negro.webp`, `noise.svg`.

## Deploy
- Zips en `D:\Escritorio\rocochos\piedra-total-peru_YYYY-MM-DD.zip` (excluye `vendor`, `storage`, `public/images` (salvo archivos puntuales), `node_modules`, `.git`, `tests`, `bootstrap/cache/*`).
- Pasos:
  1. Backup (BD + archivos).
  2. Reemplazar código en su carpeta (NO borrar `.env`, `vendor/`, `storage/`, `public/images/`).
  3. Borrar `bootstrap/cache/*` (dejar `.gitignore`).
  4. Migraciones: endpoint `GET /deploy/{token}` (token en `.env` como `DEPLOY_TOKEN`; `?dry=1` para simular), o `public/_migrate.php`, o Terminal `php artisan migrate --force`. Necesarias para `redirects` (middleware `CheckRedirects`) y `request_logs` (`LogRequests`).
  5. `php artisan view:clear` (o borrar `storage/framework/views/*`).
- Cron cPanel: `schedule:run` cada minuto (`cd /home/rocochoslima/<carpeta-piedra> && /usr/local/bin/ea-php84 artisan schedule:run >> /dev/null 2>&1`).
- **Tokens del endpoint**: viven en `.env` (`DEPLOY_TOKEN`). **No** ponerlos en el repo; rotarlos si se filtraron.

## Gotchas
- `proc_open` deshabilitado → usar `Schedule::call`, nunca `Schedule::command`.
- `@js` en Alpine → rompe; usar `$refs`/`data-*`.
- `CheckRedirects` (global en web) consulta `redirects`; `LogRequests` escribe `request_logs`. Si faltan esas tablas → errores en cada request (500/blanco).
- Tras editar `.blade`: `view:clear`.
- El panel Filament usa assets en `public/js|css|fonts/filament` (van en el zip).
- Logs de diagnóstico **temporales** puestos: prefijos `[edit-product]` y `[thumb-preview]` en `MediaThumbnailPreview.php` y `EditProduct.php` → **quitar** cuando ya no hagan falta.

## Pendiente
1. Quitar los logs de diagnóstico `[edit-product]` / `[thumb-preview]`.
2. **Tests rojos pre-existentes** (no tocados):
   - `DesignQualityTest` (eyebrow `"Continuidad estética…"` en `SiteSettingSeeder.php:145` / `home.blade.php`) — decidir copy nuevo o quitar eyebrow.
   - `DarkEditorialTest` (`stone-lines` esperado `dark`, hoy `light` con `collections-accordion` dark aparte).
   - `MediaLibraryTest` + `MediaPickerPreviewTest` (media picker: campo `library_gallery`, ViewException).
3. **Favicon editable** desde panel: hoy hardcodeado (`AdminPanelProvider->favicon`, `config/seo.php`). Los **logos del header/footer SÍ son editables** (`header_logo_light/dark`, `footer_logo` en `ManageSiteSettings`).
4. Verificar límites PHP en cPanel (`.user.ini`) y `public/storage` / rewrite `^storage/`.
5. Cola: `QUEUE_CONNECTION=sync`; para background cambiar a `database` (el cron ya está preparado con `Schedule::call`).

## Historial breve (contexto previo)
- Sitio de catálogo de piedra natural (server-rendered Blade + Filament), e-commerce fuera de alcance.
- Rediseño editorial del home + propagación a páginas (sesiones previas).
- Migrado a Docker; ver `AGENTS.md` para el stack y reglas de capas/SEO.

## Referencias
- `AGENTS.md` — stack, arquitectura, testing.
- `scripts/deploy.sh` — deploy en Docker (backup → migrate → optimize).
