# Módulo: Blog

> **Estado:** ✅ Production-ready (2026-04-28)
> **Doc técnica:** [`docs/backend3.0/Blog/README.md`](../../backend3.0/Blog/README.md)

---

## 1. Identidad

| Campo | Valor |
|-------|-------|
| **Nombre** | Blog |
| **Slug** | `blog` |
| **Cores que lo usan** | 17 |
| **Productos a la venta** | 7 de 8 (no corporative) |
| **Modelo principal** | `App\Modules\Blog\Models\Post` |
| **Tabla principal** | `posts` |
| **Tabla categorías** | `post_categories` |
| **Vista standalone** | `/blog` |
| **Vista detail** | `/blog/{slug}` |
| **CRUD admin** | `/admin/blog` |

---

## 2. Defaults JSON

3 posts genéricos con `header` apuntando a `cd-project/img/defaults/blog/blog-{1..3}.jpg`. 2 categorías (Novedades, Consejos).

---

## 3. Asset pack — `public/cd-project/img/defaults/blog/`

| Archivo | Peso | Origen |
|---------|------|--------|
| blog-1.jpg | 288KB | cd-project/img/blog/ |
| blog-2.jpg | 304KB | cd-project/img/blog/ |
| blog-3.jpg | 108KB | cd-project/img/blog/ |

---

## 4. ViewComposer

| Variable | Origen | Notas |
|----------|--------|-------|
| `$featuredPosts` | módulo blog (status=Published) | inyectada desde HomepageController, viaja a welcome/about/contact |
| `$recentPosts` | módulo blog | layout.front.footers.* |

Nota: el campo `header` se usa para la cover del post (no `image`). El BlogSeeder hace upload a Cloudinary cuando detecta path local.

---

## 5. Vistas

### Frontend
| Archivo | Notas |
|---------|-------|
| `modules/blog/frontend/index.blade.php` | Listing universal con cards (background-image style) |
| `modules/blog/frontend/post.blade.php` | Detail post |
| `modules/blog/frontend/show.blade.php` | Variante de detail |
| `modules/blog/frontend/partials/dynamic-header.blade.php` | Cases por demo |

### Demo-specific (welcome/about embebido)
| Demo | Bloque |
|------|--------|
| demo-law-firm-2 | welcome.blade L720-810 (2 posts en 2 columnas) |
| (otros) | varían |

---

## 6. CRUD admin

- **Ruta**: `/admin/blog`
- **Funcionalidades**: listing + create/edit + delete + categorías + tags + traducciones (cuando módulo Translations activo)

---

## 7. Comandos artisan

| Comando | Función |
|---------|---------|
| `bewpro:clean-blog` | Limpia posts y categorías |
| `bewpro:refresh-blog` | Re-seedea desde defaults |

---

## 8. Mejoras 2026-04-28

| Archivo | Cambio |
|---------|--------|
| `defaults/blog.json` | 2 → 3 posts. Agregado campo `header` apuntando a defaults/blog/. |
| `seeds/blog-law-firm-digital.json` | Agregado campo `header` a los 3 posts apuntando a defaults/blog/. Provisión sube las 3 covers a Cloudinary del tenant. |
| `welcome.blade.php` law-firm-2 | Fallback de blog images cambiado a `defaults/blog/` (antes `demos/law-firm-2/blog/`). |

Verificado: 3 posts con headers Cloudinary tras `bewpro:new --fresh`.

---

## 9. Auditoría — 30 items

| Bloque | Items | Estado |
|--------|-------|--------|
| 1. Identidad y código (4) | 4/4 | ✅ |
| 2. Defaults JSON (6) | 6/6 | ✅ |
| 3. Asset pack (5) | 5/5 | ✅ |
| 4. Vistas (6) | 6/6 | ✅ |
| 5. Integración sistema (5) | 5/5 | ✅ |
| 6. CRUD admin (4) | 4/4 | ✅ |
| **TOTAL** | **30/30** | ✅ |

**Veredicto**: ✅ Production-ready

---

## 10. Bugs conocidos

- `post.blade.php` y `show.blade.php` conviven; revisar legacy.

## 11. Referencias

- [`docs/backend3.0/Blog/README.md`](../../backend3.0/Blog/README.md)
