# Producto: Law Firm Digital

> **Estado:** ✅ Production-ready (validado 2026-04-27)
> **Tenant demo público:** `bp-demo-law-firm-digital`
> **Última auditoría:** 2026-04-27 — paridad admin↔front 100%

---

## 1. Identidad

| Campo | Valor |
|-------|-------|
| **Core slug** | `law-firm-digital` |
| **Demo asignado** | `demo-law-firm-2` |
| **Tagline** | Estudio Jurídico |
| **Descripción** | Asesoramiento jurídico profesional con compromiso y dedicación a cada cliente |
| **Schema.org type** | `LegalService` |
| **Idioma SEO** | `es_AR` |
| **Demo de referencia** | https://dpolegal.com (referente visual del template Porto) |
| **Industria (alias-matrix)** | `law-corporate` |

---

## 2. Catálogo — shop products que mapean a este core

Definido en `database/seeders/products/catalog.json`:

| Shop slug | Nombre comercial |
|-----------|------------------|
| `law-firm-digital` | Law Firm Digital |
| `law-firm` | Law Firm |
| `attorney` | Attorney |
| `notary` | Notary |
| `legal-services` | Legal Services |

→ Cualquiera de estos 5 slugs en `bewpro:new` resuelve al mismo core preset.

---

## 3. Módulos activos

8 módulos totales (5 declarados + 3 auto-activos del sistema):

| Módulo | Header label | Header | Footer | Origen |
|--------|--------------|--------|--------|--------|
| `services` | "Áreas de Actuación" (con dropdown) | ✅ | ✅ | declarado |
| `team` | "Equipo" | ✅ | ✅ | declarado |
| `blog` | "Novedades" | ✅ | ✅ | declarado |
| `references` | — | ❌ | ✅ | declarado |
| `faqs` | — | ❌ | ✅ | declarado |
| `about` | "El Estudio" | ✅ | ✅ | auto (cd-base) |
| `contact` | "Contacto" | ✅ | ✅ | auto (cd-base) |
| `project-setup` | — | — | — | auto (sistema) |

Header titles overrides definidos en `seeds/config-law-firm-digital.json` → bloque `footer.navegacion_principal.*.title`.

---

## 4. Branding

### Brand defaults

| Slot | Hex | Uso |
|------|-----|-----|
| **primary** | `#1A325D` | Azul oscuro corporativo. Botones primarios, links, headings destacados |
| **secondary** | `#B8960C` | Dorado contraste. Badges sobre fondo oscuro, iconos CTA |
| **tertiary** | `#F5F5F0` | Cream. Fondos suaves de sección |
| **quaternary** | `#6B7280` | Grey neutro. Textos secundarios |
| **dark** | `#0F1923` | Casi negro. Texto principal |
| **light** | `#FFFFFF` | Blanco. Fondos limpios |

### Fonts

| Slot | Font | Uso |
|------|------|-----|
| primary | Poppins | Sans-serif body |
| secondary | Lora | Serif para headings (h1-h6) |
| tertiary | Poppins | Reusado |

### Logo pack

`law-firm-digital` → carpeta `public/cd-project/assets/law-firm-digital/`

---

## 5. Asset pack físico

Ubicación: `public/cd-project/assets/law-firm-digital/`

```
apple-touch-icon.png
favicon-96x96.png
favicon.ico
favicon.svg
logo.png
logo-2.png
logo-alternative.png
site.webmanifest
web-app-manifest-192x192.png
web-app-manifest-512x512.png
```

**Flujo en provisión:**
1. `ProvisionAssetResolver` detecta el subdir del producto
2. `AssetsSeeder` lee `assets.json` y resuelve cada path a `cd-project/assets/law-firm-digital/{file}`
3. Sube cada archivo a Cloudinary del tenant: `{db_name_sin_bp-}/assets/{file}`
4. Persiste URLs absolutas en `settings`: `site.assets.main_logo`, `site.assets.footer_logo`, etc.
5. Cliente puede sobrescribir vía `/brand-kit` wizard (sube logo nuevo → Cloudinary tenant)

### Imágenes del demo (no editables, son del template)

`public/cd-project/img/demos/law-firm-2/`:
- `backgrounds/` — overlays de secciones oscuras (hero, testimonios, team, parallax, page-headers)
- `banner/banner-1.jpg`, `banner-2.jpg` — imágenes hero por defecto
- `team/team-1..5.jpg` — fotos placeholders del equipo
- `cases/case-1.jpg`, `case-2.jpg` — imágenes placeholder de casos/references
- `blog/blog-1.jpg`, `blog-2.jpg` — covers placeholder de blog posts
- `icons/icon-*.svg` — íconos SVG de áreas de práctica
- `generic/generic-1..4.jpg` — fotos de about (signature image, gallery section)

---

## 6. CTA del Header

```json
{
  "active": true,
  "title": "Solicitar Consulta",
  "url": "/contact",
  "target": "_self",
  "style": "primary"
}
```

Editable en: `/site-data?tab=welcome` → sección "Botón CTA del Header (visible en todas las páginas)"
Anchor directo: `/site-data?tab=welcome#cta_header`

---

## 7. Seeds de contenido

Ubicación: `database/seeders/products/core/seeds/`

| Archivo | Contenido seedeado |
|---------|--------------------|
| `services-law-firm-digital.json` | 1 categoría (Áreas de Práctica) + 5 servicios (Familia, Societario, Comercial, Daños, Laboral) |
| `team-law-firm-digital.json` | 2 categorías (Socios, Asociados) + 5 abogados |
| `blog-law-firm-digital.json` | 2 categorías (Actualidad Jurídica, Guías Legales) + 3 posts |
| `faqs-law-firm-digital.json` | 3 categorías + 10 preguntas |
| `references-law-firm-digital.json` | 2 categorías + 5 referencias |
| `config-law-firm-digital.json` | welcome (42 keys) + about (22 keys) + contact (15 keys) + footer.navegacion_principal (5 items) |

---

## 8. Vistas blade del producto

### Frontend (visitante)

| Archivo | Líneas | Contenido |
|---------|--------|-----------|
| `resources/views/modules/cd-base/frontend/demos/demo-law-firm-2/welcome.blade.php` | 832 | Home: hero carousel, services slider, about, client logos, testimonials, FAQs+form, team carousel, extended services, CTA, success stories, parallax, blog |
| `resources/views/modules/cd-base/frontend/demos/demo-law-firm-2/about.blade.php` | 285 | Page header, The Difference (3 cols), Global Service + counters, Gallery, Team grid, Testimonials, Marquee logos |
| `resources/views/modules/cd-base/frontend/demos/demo-law-firm-2/contact.blade.php` | 209 | Page header, Contact info + Map, FAQs accordion + Contact form |

### Layout

| Archivo | Contenido |
|---------|-----------|
| `resources/views/layout/front/headers/demo-law-firm-2.blade.php` | Header con phone/email/schedule top bar + CTA + nav (5 items con dropdown en services) |
| `resources/views/layout/front/footers/demo-law-firm-2.blade.php` | Footer dark con logo + nav + datos contacto |
| `resources/views/layout/front/partials/page-header-law-firm-2.blade.php` | Page header de about/contact (overlay oscuro + breadcrumb dorado) |

### Admin (`/site-data`)

| Archivo | Tab |
|---------|-----|
| `resources/views/admin/site-data/welcome/demo-law-firm-2.blade.php` | Welcome (42 inputs en 9 secciones) |
| `resources/views/admin/site-data/about/demo-law-firm-2.blade.php` | About (22 inputs en 5 secciones) |
| `resources/views/admin/site-data/contact/demo-law-firm-2.blade.php` | Contact (3 inputs propios + 12 vía `_common`) |

---

## 9. Editabilidad — paridad admin↔front

| Tab admin | Keys del front | Inputs admin | Cobertura |
|-----------|----------------|--------------|-----------|
| `/site-data?tab=welcome` | 42 | 42 | ✅ 100% |
| `/site-data?tab=about` | 22 | 22 | ✅ 100% |
| `/site-data?tab=contact` | 15 | 15 (12 vía `_common` + 3 propios) | ✅ 100% |
| `/site-data?tab=general` | brand identity, logos, social | sistema base | ✅ |

### Lo que el cliente puede personalizar post-entrega

- **Brand kit wizard** (`/brand-kit`): logos × 3 + 6 colores + 3 fonts → repinta toda la vista
- **`/site-data`**: 79 textos editables de welcome/about/contact + datos de contacto + CTA del header + SEO + redes sociales + analytics
- **CRUD admin** de cada módulo: services, team, blog posts, FAQs, references
- **Header navigation**: titles + orden + activo/inactivo

---

## 10. Comando de provisión

```bash
php artisan bewpro:new EMAIL "Nombre del Estudio" law-firm-digital --db=bp-CLIENTE [--fresh] [--no-email]
```

Acepta cualquiera de los 5 shop slugs (`law-firm-digital`, `law-firm`, `attorney`, `notary`, `legal-services`) — todos resuelven al mismo core.

**Steps que ejecuta** (`ProvisionProject::doProvision()` + `ProvisionNew::handle()`):
1. Resuelve shop slug → core preset → escribe `users.json` temporal con admin
2. Conecta/crea DB del tenant
3. Migrate fresh (si `--fresh`) o incremental
4. Escribe `cd-system.theme.demo = demo-law-firm-2` + módulos activos
5. Seed permissions/roles/users
6. Aplica `brand_defaults` → `site.theme.colors.*` + `cd-system.theme.fonts.*` + `brand_kit.core_defaults.*`
7. Escribe `site.*` data (welcome/about/contact/header/seo/og/twitter — todo desde JSON merged)
8. Escribe analytics (vacío por defecto)
9. Sube asset pack a Cloudinary tenant + reescribe paths a URLs absolutas
10. Seed contenido módulos
11. Seed CdBase
12. Clear caches
13. Email credenciales (skip con `--no-email`)

---

## 11. Changelog del pulido (2026-04-27)

### Bugs transversales arreglados (benefician a los 8 productos)

| Archivo | Bug | Fix |
|---------|-----|-----|
| `app/Services/SkinColorService.php:37` | `--default: #A0A0A0` (gris ilegible) | `#555555` |
| `app/Services/SkinColorService.php:58-67` | Escala greys invertida (`--grey-100: #2A2A2A` casi negro) → `section.section { background: var(--grey-100); }` quedaba ilegible | Invertida a estándar Bootstrap (100=`#F4F4F4` light, 1000=`#212121` dark) |
| `app/Console/Commands/ProvisionProject.php` | `buildSiteData()` hardcodeaba paths a `cd-project/assets/logo.png` raíz, ignorando subdir del producto | Helper `prefixAssetPath()` consulta `ProvisionAssetResolver` y prefija con subdir |
| `app/Console/Commands/ProvisionProject.php` | Resolver se configuraba en Step 7 pero `buildSiteData` corre en Step 5 | Resolver se configura al inicio de `doProvision()` |
| `database/seeders/AssetsSeeder.php` | `Asset::path` se guardaba sin subdir → mismatch con settings | Path canónico ahora incluye subdir resuelto |
| `app/Modules/CdBase/Controllers/Frontend/HomepageController.php::contact()` | No pasaba `$faqs` a la vista → bloque FAQ vacío | Carga featured FAQs limit(8) con fallback |
| `resources/views/components/header-nav.blade.php` | Componente anónimo no recibía `$serviceCategories`/`$headerServices` (scope aislado) → dropdown vacío | Auto-fetch inline cuando vienen sin set |

### Cambios específicos del demo-law-firm-2

| Archivo | Cambio |
|---------|--------|
| `welcome.blade.php` | Hero fallback `slides/slide-X.jpg` (vacíos 2KB) → `banner/banner-X.jpg` (134-142KB reales) |
| `welcome.blade.php` | CSS scoped para uniformar altura de cards en sliders services y team (display:flex en owl-stage) |
| `welcome.blade.php` | CTA "Porque elegirnos": iconos `text-color-primary` (azul sobre azul) → `text-color-secondary` (dorado) |
| `welcome.blade.php` | Badges TESTIMONIOS y ATTORNEYS sobre fondo oscuro: `text-color-primary` → `text-color-secondary` |
| `welcome.blade.php` | Logos clientes: `img/logos/logo-X.png` (404) → `cd-project/img/logos/logo-X.png` (existen) |
| `welcome.blade.php` | Traducciones: READ MORE → LEER MÁS, LEARN MORE → CONOCER MÁS, VIEW PROFILE → VER PERFIL, VIEW DETAILS → VER DETALLES, VIEW BLOG → VER BLOG, CONTACT US → CONTACTANOS, REQUEST CONSULTATION → SOLICITAR CONSULTA |
| `about.blade.php` | Removida img de signature.png genérica; queda solo nombre |
| `about.blade.php` | Traducciones: OUR MISSION → NUESTRA MISIÓN, CLIENTS AND COLLEAGUES → CLIENTES Y COLEGAS, WE HAVE EARNED THE TRUST → CONFIANZA Y TRAYECTORIA, OUR DIFFERENCE → NUESTRA DIFERENCIA, TESTIMONIALS → TESTIMONIOS |
| `about.blade.php` | TESTIMONIOS section: badge dorado uppercase + classes-only (cero hex hardcoded) |
| `contact.blade.php` | Traducciones: Get In Touch → Ponete en contacto, Address and Mail → Dirección y Email, Address → Dirección, Assistance Hours → Horarios de Atención, Work Inquiries → Consultas, ANY QUESTIONS? → PREGUNTAS?, LET'S TALK → HABLEMOS, REQUEST CONSULTATION → SOLICITAR CONSULTA, Loading... → Enviando... |
| `contact.blade.php` | Form placeholders: Name → Nombre, E-mail → Email, Phone → Teléfono, Message → Mensaje |
| `page-header-law-firm-2.blade.php` | Breadcrumb azul sobre overlay negro (ilegible) → `text-color-light opacity-8` (links) + `text-color-secondary` (activo) |
| `core/law-firm-digital.json` | CTA header default: "Free Consultation" → "Solicitar Consulta" |
| `seeds/config-law-firm-digital.json` | Limpiados placeholders `[NOMBRE DEL ESTUDIO]`, `[NOMBRE DEL SOCIO FUNDADOR]`, `[TU TELÉFONO]`, `[TU DIRECCIÓN]`, `[tu@email.com]`, `[Nombre del Socio]` → textos demo realistas |
| `seeds/config-law-firm-digital.json` | Agregado bloque `footer.navegacion_principal` con titles override (Áreas de Actuación, Equipo, Novedades, El Estudio, Contacto) |
| `seeds/config-law-firm-digital.json` | Removida `signature_image` (basura, no usada en front) |
| `seeds/config-law-firm-digital.json` | Agregado `contact.google_maps_embed = ""` |
| `admin/site-data/welcome/demo-law-firm-2.blade.php` | +4 inputs: cta_schedule, parallax_quote, parallax_author, parallax_author_title |
| `admin/site-data/about/demo-law-firm-2.blade.php` | +5 inputs: page_title, details_title, details_description, team_title, testimonials_title (también description_1 + signature_name ya estaban) |
| `admin/site-data/contact/demo-law-firm-2.blade.php` | +3 inputs: meta_description, meta_keywords, google_maps_embed |
| `admin/site-data/index.blade.php` | Heading del CTA del Header clarificado: "(visible en todas las páginas)" + anchor `#cta_header` |

---

## 12. QA checklist (por reproducir antes de declarar production-ready)

```bash
# 1. Provisionar tenant fresco
php artisan bewpro:new admin@bewpro.com "Demo Law Firm Digital" law-firm-digital --db=bp-demo-law-firm-digital --fresh --no-email

# 2. Verificar Cloudinary
mysql bp-demo-law-firm-digital -e "SELECT \`key\`, value FROM settings WHERE \`key\` LIKE 'site.assets.%' AND value LIKE 'https://res.cloudinary.com%'"
# Esperado: 6 filas (main_logo, footer_logo, loader_logo, favicon, apple_touch_icon, main_logo_sticky)

# 3. Verificar brand colors
mysql bp-demo-law-firm-digital -e "SELECT \`key\`, value FROM settings WHERE \`key\` LIKE 'site.theme.colors.%'"
# Esperado: 6 colores hex del brand_defaults

# 4. Verificar conteo de seeds
mysql bp-demo-law-firm-digital -e "SELECT (SELECT COUNT(*) FROM services) services, (SELECT COUNT(*) FROM team_members) team, (SELECT COUNT(*) FROM posts) posts, (SELECT COUNT(*) FROM faqs) faqs, (SELECT COUNT(*) FROM \`references\`) refs"
# Esperado: services 5, team 5, posts 3, faqs 10, refs 5

# 5. Smoke test front
for url in / /about /contact; do
  curl -s -o /dev/null -w "%{http_code} %{size_download}b $url\n" http://localhost/cd-system/public$url
done
# Esperado: 200 200 200

# 6. Cero placeholders/inglés residual
curl -s http://localhost/cd-system/public/ | grep -oE '\[NOMBRE [^]]+\]|>John Doe<|>Lorem |REQUEST CONSULTATION'
# Esperado: vacío

# 7. Header dropdown con items
curl -s http://localhost/cd-system/public/ | grep "dropdown-item.*services/" | wc -l
# Esperado: 5+ (uno por servicio)

# 8. FAQs en /contact
curl -s http://localhost/cd-system/public/contact | grep -c "collapseFAQ"
# Esperado: 10+ (5 FAQs × 2 referencias cada una)

# 9. CSS vars correctas
curl -s http://localhost/cd-system/public/ | grep -E "^\s*--(grey-100|default):"
# Esperado: --grey-100: #F4F4F4 ; --default: #555555

# 10. Editabilidad admin↔front (paridad)
# Abrir /site-data?tab=welcome , ?tab=about , ?tab=contact y verificar que cada
# texto del front tiene un input correspondiente.
```

---

## 13. Problemas conocidos / fuera de scope

- **`_common.blade.php` de contact tiene 9 campos extra** (`card_subtitle`, `city`, `map_url`, `page_badge`, `page_heading`, `page_subtitle`, `secondary_address`, `secondary_city`, `hours`) que el demo-law-firm-2 no consume. Cliente los ve editables pero no afectan al render. Otros demos los usan → no se borran globalmente. Solución futura: condicionar `_common` por demo.
- **CTA del Header vive en el tab "Inicio" del admin** pero aparece en TODAS las páginas. Para esta release solo se clarificó en el label. Refactor a tab "Header" propio queda pendiente.
- **Vista `team` no tiene blade dedicado** para el demo-law-firm-2 — usa el genérico del módulo. Si se quiere look custom, agregar `resources/views/modules/team-members/frontend/demos/demo-law-firm-2/index.blade.php`.

---

## 14. Referencias cruzadas

- Bug del scale de greys + `--default`: aplicado a los 8 productos. Ver `app/Services/SkinColorService.php`.
- Patrón de provisión: `docs/bewpro2.0/branding/pipeline-provision.md`
- Patrón de vistas: `docs/bewpro2.0/arquitectura-vistas-base.md` (este demo está en Patrón A — config-heavy)
- Catálogo completo: `database/seeders/products/catalog.json`
- Estado del producto: `docs/bewpro2.0/product-readiness/estado-productos.md`
