/* global React, ReactDOM */
// =============================================================================
// LIVEN ART GROUP · Landing pública · liven.group
// Casa de fotografía y vídeo de boda fundada en Madrid (MMX).
// Tres firmas: Liven (principal) · Walther Santafé (autor) · Liven Academy (entrada).
// SPA React (sin build), i18n ES/EN/DE, routing por estado interno, deploy SCP.
// =============================================================================
const { useState, useEffect } = React;

// =============================================================================
// LEAD_ENDPOINT — URL del Cloudflare Worker que recibe el lead y lo crea en
// Odoo Online. Ver web/worker/README.md para el despliegue. Mientras esté en
// el valor placeholder, el formulario sigue funcionando (UX conversacional +
// backup local en localStorage.livenLeads) pero el lead no llega a Odoo.
// CAMBIAR esta línea por la URL real del worker (ej.
// "https://liven-leads.<account>.workers.dev") y redesplegar con cache bust.
// =============================================================================
const LEAD_ENDPOINT = "https://liven-leads.proud-union-1ce3.workers.dev";

/* ============================================================================
   i18n — toda la copy en español primero, espejada en inglés.
   Tono emotivo+profesional dirigido a perfil novias Moraleja, bodas en El
   Campillo, El Chaparral, Las Jarillas, Casa Mónico, ≥200 invitados; y al
   resto, aspiracional a ese sector. Sin clichés de boda.
   ============================================================================ */
const COPY = {
  es: {
    /* ---------- Nav y header ---------- */
    nav: { liven:"Liven", academy:"Academy", walther:"Walther Santafé", contact:"Contacto", casa:"La casa" },
    book: "Hablemos",
    /* ---------- HERO ---------- */
    heroEyebrow: "Casa fundada en Madrid · MMX",
    heroTagline: "The Wedding Experts",
    heroBrand1: "Liven",
    heroBrand2: "Art · Group",
    heroSubA: "Arquitectos de la ",
    heroSubEm: "memoria",
    heroSubB: ".",
    heroFirmasLabel: "Las tres firmas",
    heroFirma1: "Liven",
    heroFirma2: "Walther Santafé",
    heroFirma3: "Liven Academy",
    heroM1k: "Fundación", heroM1v: "MMX",
    heroM2k: "Bodas",      heroM2v: "3.500+",
    heroM3k: "Firmas",     heroM3v: "III",
    heroM4k: "Idiomas",    heroM4v: "EN · ES · DE",
    /* ---------- INTRO DE LA CASA ---------- */
    casaEyebrow: "Filosofía",
    casaTitle1: "El valor de la ",
    casaTitleEm: "memoria",
    casaTitle2: ".",
    casaP1: "Durante estos quince años hemos aprendido que las fotos son solo una parte del recuerdo: nosotros construimos la memoria que os acompañará el resto de vuestra vida. Y esa memoria nace de la confianza. Nos acercamos como quien acompaña a un amigo en su boda —con tiempo, sin prisa y sin poses forzadas—, porque solo desde esa cercanía el recuerdo termina siendo de verdad vuestro. Lo hacemos desde la sobriedad, la elegancia y la honestidad, cuidando cada detalle para que, cuando volváis a estas imágenes dentro de veinte años, reconozcáis exactamente lo que sentíais.",
    casaP2: "Liven Art Group es la casa madrileña fundada en 2010. Hemos acompañado más de tres mil quinientas bodas en El Campillo, El Chaparral, Las Jarillas, Casa Mónico, Palacio de Aldovea y un largo etcétera. Tres firmas con identidad propia bajo un mismo techo, para tres maneras de mirar una boda.",
    /* ---------- LAS TRES FIRMAS (home) ---------- */
    firmasEyebrow: "Las tres firmas de la casa",
    firmasH1: "Tres firmas. Una ",
    firmasHEm: "promesa",
    firmasH2: ".",
    firmasSub: "Vosotros elegís la que más os encaje. Lo que no negociamos en ninguna es lo que de verdad importa — que dentro de quince años, mirando estas fotos, volváis a sentir el día.",
    /* 01 LIVEN */
    f1Tag: "Firma principal de la casa",
    f1Seal: "Desde MMX",
    f1Desc: "El corazón del estudio. Cobertura completa con un mínimo de dos fotógrafos, desde los preparativos hasta una parte de la fiesta. Quince años en El Campillo, El Chaparral, Las Jarillas y Casa Mónico nos enseñan a leer cada finca y cada tiempo del día. Vosotros vivís la boda; del recuerdo nos encargamos nosotros.",
    f1See: "Conocer Liven",
    /* 02 WALTHER */
    f2Tag: "Edición limitada · cupo reservado",
    f2Corner: "— pieza de autor",
    f2Seal: "Cupo limitado",
    f2Desc: "Nuestra pieza de lujo. Cobertura con la implicación directa de Enri en la fotografía y en la dirección visual del reportaje. Pensada para parejas que entienden de fotografía y quieren que la suya tenga voz propia. Unas pocas fechas reservadas al año.",
    f2See: "Conocer Walther Santafé",
    /* 03 ACADEMY */
    f3Tag: "Puerta de entrada al estudio",
    f3Seal: "Bodas íntimas",
    f3Desc: "Línea de fotógrafos jóvenes seleccionados y formados dentro de la casa. Mantienen el método y el cuidado del estudio con una inversión más contenida. Pensada para bodas más íntimas que quieran el sello Liven sin renunciar a nada.",
    f3See: "Conocer Academy",
    /* ---------- MANIFIESTO ---------- */
    manifestQ1: "Quince años aprendiendo que lo importante de una boda ",
    manifestQEm: "no se posa: ocurre",
    manifestQ2: " mientras nadie mira. Nuestro oficio es estar ahí cuando ocurre, sin que se note que estamos.",
    manifestSign: "— Enri, fundador de Liven Art Group",
    /* ---------- PROCESO (home) ---------- */
    procEyebrow: "Cómo trabajamos",
    procH1: "Cuatro pasos, ",
    procHEm: "sin sorpresas",
    procH2: ".",
    proc1n:"i.",  proc1t:"Conversación", proc1d:"Una llamada o reunión para entender la boda, las personas y el papel que queréis que tengan la fotografía y el vídeo dentro del día.",
    proc2n:"ii.", proc2t:"Propuesta",    proc2d:"Una propuesta a medida según firma, escala y zona. Sin tarifas estándar maquilladas: el presupuesto se ajusta a vuestra boda real.",
    proc3n:"iii.",proc3t:"El día",       proc3d:"Cobertura completa, dos fotógrafos como mínimo, desde los preparativos hasta una parte de la fiesta. Un paso por delante para que no os tengáis que ocupar de nada.",
    proc4n:"iv.", proc4t:"Entrega",      proc4d:"Adelanto la semana siguiente. Entrega completa entre tres y seis meses según temporada. Álbum cuidado si lo pedís.",
    /* ---------- CIERRE / CTA ---------- */
    ctaH1: "Hablemos de ",
    ctaHEm: "vuestra",
    ctaH2: " boda.",
    ctaSub: "Una conversación breve para conoceros. Volvemos a vosotros con calma.",
    ctaBtn1: "Iniciar conversación",
    ctaBtn2: "Escribir un email",
    /* ---------- FOOTER ---------- */
    fBlurb1: "Una manera muy cuidada de ",
    fBlurbEm: "acompañar",
    fBlurb2: " una boda.",
    fHouse: "La casa",
    fHouseI1: "Sobre Liven Group",
    fHouseI2: "Filosofía",
    fHouseI3: "Premios",
    fFirms: "Firmas",
    fF1Name: "Liven",            fF1Role: "Firma principal",
    fF2Name: "Walther Santafé",  fF2Role: "Pieza de autor",
    fF3Name: "Liven Academy",    fF3Role: "Puerta de entrada",
    fContact: "Contacto",
    fContactEmail: "info@liven.group",
    fContactPhone: "+34 630 930 200",
    fContactAddress: "C/ Lagasca 21, 1ºD · 28001 Madrid",
    fLangs: "Idiomas",
    fLang1: "Inglés", fLang2: "Español", fLang3: "Alemán",
    fRights: "Todos los derechos reservados",
    fLegal: "Aviso legal", fPrivacy: "Privacidad",

    /* ============================================================
       FIRMA · LIVEN (línea principal)
       ============================================================ */
    livenH1a: "El ",
    livenH1b: "corazón",
    livenH1c: " del estudio.",
    livenTag: "Firma principal · Liven",
    livenIntro: "Liven es nuestra línea principal. Trabajamos siempre con cobertura completa del día, un mínimo de dos fotógrafos y acompañamos desde los preparativos hasta una parte de la fiesta. La forma en la que cubrimos la mayoría de las bodas de la casa: en El Campillo, El Chaparral, Las Jarillas, Casa Mónico, Palacio de Aldovea o donde haga falta.",
    livenStat1n: "3.500+", livenStat1l: "bodas entregadas",
    livenStat2n: "15 años", livenStat2l: "de oficio",
    livenStat3n: "2 +",     livenStat3l: "fotógrafos por boda",
    livenSec1Eye: "Qué incluye",
    livenSec1H: "Cobertura completa, sin atajos.",
    livenSec1P: "Reportaje fotográfico con un mínimo de dos fotógrafos. Vídeo cuando lo pedís, con equipo ampliado. Entrega digital cuidada y posibilidad de álbum impreso. Desde los preparativos hasta una parte de la fiesta, con el tiempo necesario para que el reportaje recoja lo que pasa de verdad y no una sucesión de poses.",
    livenProcessEye: "Proceso",
    livenProcessH: "Cuatro pasos, sin sorpresas.",
    livenP1t: "Conversación", livenP1d: "Una llamada o reunión para entender la boda, las personas y el papel que queréis que tengan la fotografía y el vídeo dentro del día.", livenP1w: "Sem. previas",
    livenP2t: "Propuesta",    livenP2d: "Propuesta a medida según firma, escala y zona. Sin tarifas estándar maquilladas: el presupuesto se ajusta a vuestra boda real.", livenP2w: "1 sem.",
    livenP3t: "El día",       livenP3d: "Cobertura completa con dos fotógrafos como mínimo, desde los preparativos hasta una parte de la fiesta. Un paso por delante, sin interferir.", livenP3w: "24 h",
    livenP4t: "Entrega",      livenP4d: "Adelanto la semana siguiente a la boda. Entrega completa entre tres y seis meses según temporada. Álbum cuidado si lo pedís.", livenP4w: "3–6 meses",
    livenPacksEye: "Cómo se contrata",
    livenPacksH: "Tres formas de contratar Liven.",
    livenPack1n: "Liven · ",  livenPack1nE: "Foto",
    livenPack1d: "Cobertura completa de fotografía. Lo más solicitado por parejas que ya saben lo que quieren.",
    livenPack1l1: "Cobertura completa", livenPack1l2: "2 fotógrafos mínimo", livenPack1l3: "Entrega digital cuidada", livenPack1l4: "Álbum opcional",
    livenPack2n: "Liven · ", livenPack2nE: "Foto + Vídeo",
    livenPack2d: "Cobertura completa de fotografía y vídeo, con equipo ampliado y un vídeo final cuidado.",
    livenPack2l1: "Foto completa", livenPack2l2: "Vídeo de boda (3–6 min)", livenPack2l3: "Equipo ampliado", livenPack2l4: "Álbum incluido",
    livenPack2badge: "Más solicitado",
    livenPack3n: "Liven · ", livenPack3nE: "Destino",
    livenPack3d: "Cobertura completa para bodas fuera de Madrid o destination weddings, dentro y fuera de España.",
    livenPack3l1: "Vuelo y alojamiento incl.", livenPack3l2: "Reunión presencial previa", livenPack3l3: "Cobertura desplazada", livenPack3l4: "Mín. dos días",

    /* ============================================================
       FIRMA · WALTHER SANTAFÉ (pieza de autor)
       ============================================================ */
    waltherH1a: "Una mirada ",
    waltherH1b: "con firma",
    waltherH1c: ".",
    waltherTag: "Pieza de autor · Walther Santafé",
    waltherIntro: "Walther Santafé es la pieza de autor de la casa. La firma Enri en persona: una cobertura más íntima, con mayor implicación directa en la fotografía y en la dirección visual del reportaje. Pensada para parejas que entienden de fotografía y quieren que la suya tenga voz propia. Unas pocas fechas reservadas al año.",
    waltherStat1n: "8",       waltherStat1l: "bodas al año (máx.)",
    waltherStat2n: "15 años", waltherStat2l: "de práctica",
    waltherStat3n: "I",       waltherStat3l: "una sola mirada",
    waltherSec1Eye: "Qué incluye",
    waltherSec1H: "Una sola voz.",
    waltherSec1P: "Cobertura completa firmada por Enri. Dirección visual integral del reportaje, presencia directa en cámara durante todo el día y postproducción cuidada al milímetro. Pocas bodas al año, briefing largo previo, ningún detalle delegado.",
    waltherProcessEye: "Proceso",
    waltherProcessH: "Más reunión, más tiempo.",
    waltherP1t: "Reunión",  waltherP1d: "Reunión presencial larga, idealmente en Madrid. Entender vuestra boda, vuestras referencias y lo que esperáis del reportaje. Sin esta conversación no se trabaja con esta firma.", waltherP1w: "Sem. previas",
    waltherP2t: "Briefing", waltherP2d: "Un documento personal con la dirección visual, la lista de momentos clave y el plan de cobertura. Lo discutimos antes del día.", waltherP2w: "2–3 sem.",
    waltherP3t: "El día",   waltherP3d: "Cobertura firmada por Enri. Equipo pequeño, presencia directa en cámara, atención plena. Un paso por delante, sin interferir.", waltherP3w: "24 h",
    waltherP4t: "Entrega",  waltherP4d: "Adelanto la semana siguiente. Entrega completa entre cuatro y siete meses. Selección personal de Enri. Álbum cuidado siempre incluido.", waltherP4w: "4–7 meses",
    waltherPacksEye: "Cómo se contrata",
    waltherPacksH: "Tres formas de trabajar con Walther.",
    waltherPack1n: "Walther · ", waltherPack1nE: "Boda",
    waltherPack1d: "Cobertura autoral del día completo, firmada por Enri.",
    waltherPack1l1: "Cobertura firmada", waltherPack1l2: "Equipo reducido", waltherPack1l3: "Álbum cuidado incluido", waltherPack1l4: "Cupo muy limitado",
    waltherPack2n: "Walther · ", waltherPack2nE: "Boda + Pre-boda",
    waltherPack2d: "Boda más sesión pre-boda en el lugar que elijáis. La forma más habitual de trabajar con esta firma.",
    waltherPack2l1: "Sesión pre-boda", waltherPack2l2: "Cobertura firmada", waltherPack2l3: "Doble álbum", waltherPack2l4: "Reunión presencial previa",
    waltherPack2badge: "Más habitual",
    waltherPack3n: "Walther · ", waltherPack3nE: "Destino",
    waltherPack3d: "Bodas fuera de Madrid o destination weddings, dentro y fuera de España.",
    waltherPack3l1: "Vuelo y alojamiento", waltherPack3l2: "Días previos en el destino", waltherPack3l3: "Cobertura firmada", waltherPack3l4: "Briefing presencial",

    /* ============================================================
       FIRMA · LIVEN ACADEMY (puerta de entrada)
       ============================================================ */
    academyH1a: "La ",
    academyH1b: "puerta",
    academyH1c: " a la casa Liven.",
    academyTag: "Puerta de entrada · Liven Academy",
    academyIntro: "Liven Academy es la línea de fotógrafos jóvenes seleccionados y formados dentro del estudio. Trabajan con el método de la casa, supervisados desde dentro, con una inversión más contenida. Pensada para bodas más íntimas que quieran el sello Liven sin renunciar a nada.",
    academyStat1n: "4",       academyStat1l: "fotógrafos formados aquí",
    academyStat2n: "15 años", academyStat2l: "del método de la casa",
    academyStat3n: "80–150",  academyStat3l: "invitados (orientativo)",
    academySec1Eye: "Qué incluye",
    academySec1H: "El método Liven, en formato más contenido.",
    academySec1P: "Cobertura completa con dos fotógrafos jóvenes formados dentro del estudio. Supervisión directa de la casa en producción y postproducción. Entrega digital cuidada y posibilidad de álbum impreso. Misma cultura de trabajo, con una inversión adaptada a bodas más íntimas.",
    academyProcessEye: "Proceso",
    academyProcessH: "El mismo proceso, formato contenido.",
    academyP1t: "Conversación", academyP1d: "Una llamada para entender la boda y validar si el formato Academy encaja con vuestro día.", academyP1w: "Sem. previas",
    academyP2t: "Propuesta",    academyP2d: "Propuesta a medida con el equipo Academy asignado a vuestra boda.", academyP2w: "1 sem.",
    academyP3t: "El día",       academyP3d: "Cobertura completa con dos fotógrafos Academy, supervisión Liven en producción.", academyP3w: "24 h",
    academyP4t: "Entrega",      academyP4d: "Adelanto la semana siguiente. Entrega completa con supervisión postproducción de la casa.", academyP4w: "3–6 meses",
    academyPacksEye: "Cómo se contrata",
    academyPacksH: "Tres formas de contratar Academy.",
    academyPack1n: "Academy · ", academyPack1nE: "Foto",
    academyPack1d: "Cobertura completa de fotografía con dos fotógrafos Academy.",
    academyPack1l1: "Cobertura completa", academyPack1l2: "2 fotógrafos Academy", academyPack1l3: "Supervisión Liven", academyPack1l4: "Entrega digital",
    academyPack2n: "Academy · ", academyPack2nE: "Foto + Vídeo",
    academyPack2d: "Foto más vídeo en una boda íntima, con equipo ampliado.",
    academyPack2l1: "Foto completa", academyPack2l2: "Vídeo de boda", academyPack2l3: "Equipo ampliado", academyPack2l4: "Álbum opcional",
    academyPack2badge: "Más solicitado",
    academyPack3n: "Academy · ", academyPack3nE: "Día íntimo",
    academyPack3d: "Cobertura adaptada a bodas pequeñas con un solo fotógrafo y día completo.",
    academyPack3l1: "≤ 80 invitados", academyPack3l2: "1 fotógrafo Academy", academyPack3l3: "Día completo", academyPack3l4: "Entrega digital",

    /* ============================================================
       CONTACT — flujo conversacional de 10 pasos (intacto)
       ============================================================ */
    cTitle1: "Cuéntanos vuestra",
    cTitle2: " boda.",
    cSub: "Una conversación breve para conoceros. Volvemos a vosotros con calma.",
    cMeta1: "Email",    cMeta1V: "info@liven.group",
    cMeta2: "Teléfono", cMeta2V: "+34 630 930 200",
    cMeta3: "Estudio",  cMeta3V: "C/ Lagasca 21, 1ºD · 28001 Madrid",
    cMeta4: "Horario",  cMeta4V: "Lun–Jue · 10:00–19:00",
    cStepOf: "Paso", cOf: "de",
    cWelcomeTitle: "Bienvenidos a Liven Art Group.",
    cWelcomeSub: "Antes de empezar, nos gustaría conoceros un poco mejor.",
    cWelcomeBtn: "Comenzar",
    cP1Q: "Para empezar, ¿cómo quieres que te llamemos?",
    cP1Ph: "Tu nombre",
    cP1V: "Encantados.",
    cPApeQ: "¿Y tu apellido?",
    cPApePh: "Apellido",
    cPApeV: "Gracias.",
    cP2Q: "¿Y tu pareja? ¿Cómo se llama?",
    cP2Ph: "Nombre y apellido",
    cP2V: "Un placer conoceros.",
    cP3Q: "¿Tenéis ya una fecha para la boda?",
    cP3V: "Anotado.",
    cP4Q: "¿Dónde tendrá lugar la celebración?",
    cP4Ph: "Finca, lugar o ciudad",
    cP4V: "Perfecto.",
    cP5Q: "¿Será una boda de día o de tarde/noche?",
    cP5O1: "De día",
    cP5O2: "De tarde/noche",
    cP5V: "Entendido.",
    cP6Q: "Cuando miréis vuestras fotos de boda dentro de muchos años, ¿qué os gustaría que contaran sobre este momento?",
    cP6Ph: "Tomad vuestro tiempo para responder",
    cP6V: "Gracias por compartirlo.",
    cP7Q: "En Liven entendemos la boda como el inicio de una historia que continúa con el tiempo.\n\n¿Os interesa conocer cómo acompañamos a nuestras parejas más allá del día de la boda?",
    cP7O1: "Sí, me interesa",
    cP7O2: "Por ahora solo la boda",
    cP7V: "Lo tenemos en cuenta.",
    cP8Q: "Para poder preparar el siguiente paso, necesitamos un email de contacto.",
    cP8Ph: "vuestro@email.com",
    cP8V: "Gracias.",
    cClosingTitle: "Gracias.",
    cClosingBody1: "Con la información que nos habéis compartido, vamos a preparar el siguiente paso con calma.",
    cClosingBody2: "En breve recibiréis un email con la propuesta de Liven Art Group ajustada a vuestra boda y los siguientes pasos para concertar una llamada o reunión.",
    cBack: "← Atrás", cNext: "Siguiente", cSend: "Enviar",
    cInvalidEmail: "Revisad el formato del email.",
    cSendError: "No hemos podido enviar la información. Probad de nuevo en un momento.",
  },

  en: {
    nav: { liven:"Liven", academy:"Academy", walther:"Walther Santafé", contact:"Contact", casa:"The house" },
    book: "Let's talk",
    heroEyebrow: "House founded in Madrid · MMX",
    heroTagline: "The Wedding Experts",
    heroBrand1: "Liven",
    heroBrand2: "Art · Group",
    heroSubA: "Architects of ",
    heroSubEm: "memory",
    heroSubB: ".",
    heroFirmasLabel: "The three signatures",
    heroFirma1: "Liven",
    heroFirma2: "Walther Santafé",
    heroFirma3: "Liven Academy",
    heroM1k: "Founded", heroM1v: "MMX",
    heroM2k: "Weddings", heroM2v: "3,500+",
    heroM3k: "Signatures", heroM3v: "III",
    heroM4k: "Languages", heroM4v: "EN · ES · DE",
    casaEyebrow: "Philosophy",
    casaTitle1: "The value of ",
    casaTitleEm: "memory",
    casaTitle2: ".",
    casaP1: "Over these fifteen years we have learned that the photographs are only part of what remains: what we truly build is the memory that will stay with you for the rest of your lives. And that memory is born of trust. We accompany you the way you would a close friend on their wedding day — with time, without rushing, without forced poses — because only from that closeness does the memory become truly yours. We work with restraint, elegance and honesty, caring for every detail so that, when you return to these images twenty years from now, you recognise exactly what you were feeling.",
    casaP2: "Liven Art Group is the Madrid house founded in 2010. We have accompanied more than three thousand five hundred weddings at El Campillo, El Chaparral, Las Jarillas, Casa Mónico, Palacio de Aldovea and many others. Three signatures with their own identity under one roof, for three ways of looking at a wedding.",
    firmasEyebrow: "The three signatures of the house",
    firmasH1: "Three signatures. One ",
    firmasHEm: "promise",
    firmasH2: ".",
    firmasSub: "You choose the one that fits you best. What we never negotiate in any of them is what truly matters — that fifteen years from now, looking at these photos, you feel the day again.",
    f1Tag: "Principal signature of the house",
    f1Seal: "Since MMX",
    f1Desc: "The heart of the studio. Full-day coverage with a minimum of two photographers, from getting ready to part of the party. Fifteen years at El Campillo, El Chaparral, Las Jarillas and Casa Mónico teach us to read every estate and every rhythm of the day. You live the wedding; we take care of the memory.",
    f1See: "Discover Liven",
    f2Tag: "Limited edition · reserved slots",
    f2Corner: "— author's piece",
    f2Seal: "Limited slots",
    f2Desc: "Our piece of luxury. Coverage with Enri's direct involvement in the photography and the visual direction of the report. For couples who understand photography and want theirs to have its own voice. A handful of dates reserved per year.",
    f2See: "Discover Walther Santafé",
    f3Tag: "Entry into the studio",
    f3Seal: "Intimate weddings",
    f3Desc: "Our line of young photographers selected and trained inside the studio. They keep the method and care of the house with a more contained investment. Designed for more intimate weddings that want the Liven seal without giving up anything.",
    f3See: "Discover Academy",
    manifestQ1: "Fifteen years learning that what matters in a wedding ",
    manifestQEm: "doesn't pose: it happens",
    manifestQ2: " when no one is looking. Our craft is being there when it happens, without it being noticed.",
    manifestSign: "— Enri, founder of Liven Art Group",
    procEyebrow: "How we work",
    procH1: "Four steps, ",
    procHEm: "no surprises",
    procH2: ".",
    proc1n:"i.",   proc1t:"Conversation", proc1d:"A short call or meeting to understand the wedding, the people, and the role you want photography and film to play in the day.",
    proc2n:"ii.",  proc2t:"Proposal",     proc2d:"A tailored proposal based on signature, scale and area. No standard rates dressed up: the budget fits your actual wedding.",
    proc3n:"iii.", proc3t:"The day",      proc3d:"Full coverage, two photographers minimum, from getting ready to part of the party. One step ahead so you don't have to think about anything.",
    proc4n:"iv.",  proc4t:"Delivery",     proc4d:"Preview the following week. Full delivery in three to six months depending on season. Carefully crafted album if you wish.",
    ctaH1: "Let's talk about ",
    ctaHEm: "your",
    ctaH2: " wedding.",
    ctaSub: "A short conversation to get to know you. We get back to you with care.",
    ctaBtn1: "Start conversation",
    ctaBtn2: "Send an email",
    fBlurb1: "A very careful way to ",
    fBlurbEm: "accompany",
    fBlurb2: " a wedding.",
    fHouse: "The house",
    fHouseI1: "About Liven Group",
    fHouseI2: "Philosophy",
    fHouseI3: "Awards",
    fFirms: "Signatures",
    fF1Name: "Liven",            fF1Role: "Principal signature",
    fF2Name: "Walther Santafé",  fF2Role: "Author's piece",
    fF3Name: "Liven Academy",    fF3Role: "Entry",
    fContact: "Contact",
    fContactEmail: "hello@liven.group",
    fContactPhone: "+34 630 930 200",
    fContactAddress: "C/ Lagasca 21, 1ºD · 28001 Madrid",
    fLangs: "Languages",
    fLang1: "English", fLang2: "Spanish", fLang3: "German",
    fRights: "All rights reserved",
    fLegal: "Legal notice", fPrivacy: "Privacy",
    livenH1a: "The ",
    livenH1b: "heart",
    livenH1c: " of the studio.",
    livenTag: "Principal signature · Liven",
    livenIntro: "Liven is our principal line. We always work with full-day coverage, a minimum of two photographers, and we accompany from getting ready to part of the party. The way we cover most weddings of the house: at El Campillo, El Chaparral, Las Jarillas, Casa Mónico, Palacio de Aldovea or wherever needed.",
    livenStat1n: "3,500+", livenStat1l: "weddings delivered",
    livenStat2n: "15 yrs", livenStat2l: "of craft",
    livenStat3n: "2 +",    livenStat3l: "photographers per wedding",
    livenSec1Eye: "What's included",
    livenSec1H: "Full coverage, no shortcuts.",
    livenSec1P: "Photographic coverage with a minimum of two photographers. Video when you ask for it, with an extended team. Careful digital delivery and the option of a printed album. From getting ready to part of the party, with the time the report needs to capture what truly happens — not a succession of poses.",
    livenProcessEye: "Process",
    livenProcessH: "Four steps, no surprises.",
    livenP1t: "Conversation", livenP1d: "A short call or meeting to understand the wedding, the people, and the role you want photography and film to play in the day.", livenP1w: "Prior weeks",
    livenP2t: "Proposal",     livenP2d: "A tailored proposal based on signature, scale and area. No standard rates dressed up: the budget fits your actual wedding.", livenP2w: "1 week",
    livenP3t: "The day",      livenP3d: "Full coverage with two photographers minimum, from getting ready to part of the party. One step ahead, without interfering.", livenP3w: "24 h",
    livenP4t: "Delivery",     livenP4d: "Preview the following week. Full delivery in three to six months depending on season. Carefully crafted album if you wish.", livenP4w: "3–6 months",
    livenPacksEye: "How to book",
    livenPacksH: "Three ways to book Liven.",
    livenPack1n: "Liven · ",  livenPack1nE: "Photo",
    livenPack1d: "Full photography coverage. The most requested by couples who know what they want.",
    livenPack1l1: "Full coverage", livenPack1l2: "2 photographers min.", livenPack1l3: "Careful digital delivery", livenPack1l4: "Optional album",
    livenPack2n: "Liven · ", livenPack2nE: "Photo + Film",
    livenPack2d: "Full photography and film coverage, with extended team and a carefully crafted final film.",
    livenPack2l1: "Full photography", livenPack2l2: "Wedding film (3–6 min)", livenPack2l3: "Extended team", livenPack2l4: "Album included",
    livenPack2badge: "Most requested",
    livenPack3n: "Liven · ", livenPack3nE: "Destination",
    livenPack3d: "Full coverage for weddings outside Madrid or destination weddings, inside and outside Spain.",
    livenPack3l1: "Travel & lodging incl.", livenPack3l2: "Prior in-person meeting", livenPack3l3: "Travel coverage", livenPack3l4: "Min. two days",
    waltherH1a: "A signed ",
    waltherH1b: "gaze",
    waltherH1c: ".",
    waltherTag: "Author's piece · Walther Santafé",
    waltherIntro: "Walther Santafé is the author's piece of the house. Signed by Enri in person: a more intimate coverage, with greater direct involvement in the photography and the visual direction of the report. For couples who understand photography and want theirs to have its own voice. A handful of dates reserved per year.",
    waltherStat1n: "8",      waltherStat1l: "weddings/year (max.)",
    waltherStat2n: "15 yrs", waltherStat2l: "of practice",
    waltherStat3n: "I",      waltherStat3l: "one single gaze",
    waltherSec1Eye: "What's included",
    waltherSec1H: "A single voice.",
    waltherSec1P: "Coverage signed by Enri. Integral visual direction of the report, direct presence on camera throughout the day and meticulous post-production. Few weddings per year, extensive prior briefing, no detail delegated.",
    waltherProcessEye: "Process",
    waltherProcessH: "More meetings, more time.",
    waltherP1t: "Meeting",  waltherP1d: "A long in-person meeting, ideally in Madrid. Understanding your wedding, your references and what you expect from the report. We don't work with this signature without this conversation.", waltherP1w: "Prior weeks",
    waltherP2t: "Briefing", waltherP2d: "A personal document with the visual direction, the list of key moments and the coverage plan. We discuss it before the day.", waltherP2w: "2–3 weeks",
    waltherP3t: "The day",  waltherP3d: "Coverage signed by Enri. Small team, direct presence on camera, full attention. One step ahead, without interfering.", waltherP3w: "24 h",
    waltherP4t: "Delivery", waltherP4d: "Preview the following week. Full delivery in four to seven months. Enri's personal selection. Carefully crafted album always included.", waltherP4w: "4–7 months",
    waltherPacksEye: "How to book",
    waltherPacksH: "Three ways to work with Walther.",
    waltherPack1n: "Walther · ", waltherPack1nE: "Wedding",
    waltherPack1d: "Author's coverage for the full day, signed by Enri.",
    waltherPack1l1: "Signed coverage", waltherPack1l2: "Small team", waltherPack1l3: "Carefully crafted album incl.", waltherPack1l4: "Very limited slots",
    waltherPack2n: "Walther · ", waltherPack2nE: "Wedding + Pre-wedding",
    waltherPack2d: "Wedding plus pre-wedding session in the place you choose. The most common way to work with this signature.",
    waltherPack2l1: "Pre-wedding session", waltherPack2l2: "Signed coverage", waltherPack2l3: "Double album", waltherPack2l4: "Prior in-person meeting",
    waltherPack2badge: "Most common",
    waltherPack3n: "Walther · ", waltherPack3nE: "Destination",
    waltherPack3d: "Weddings outside Madrid or destination weddings, inside and outside Spain.",
    waltherPack3l1: "Travel & lodging", waltherPack3l2: "Days at the destination", waltherPack3l3: "Signed coverage", waltherPack3l4: "In-person briefing",
    academyH1a: "The ",
    academyH1b: "door",
    academyH1c: " into Liven.",
    academyTag: "Entry · Liven Academy",
    academyIntro: "Liven Academy is our line of young photographers selected and trained inside the studio. They work with the house method, supervised from within, with a more contained investment. Designed for more intimate weddings that want the Liven seal without giving up anything.",
    academyStat1n: "4",      academyStat1l: "photographers trained here",
    academyStat2n: "15 yrs", academyStat2l: "of house method",
    academyStat3n: "80–150", academyStat3l: "guests (indicative)",
    academySec1Eye: "What's included",
    academySec1H: "The Liven method, in a more contained format.",
    academySec1P: "Full coverage with two young photographers trained inside the studio. Direct supervision from the house in production and post-production. Careful digital delivery and the option of a printed album. Same work culture, with an investment adapted to more intimate weddings.",
    academyProcessEye: "Process",
    academyProcessH: "Same process, contained format.",
    academyP1t: "Conversation", academyP1d: "A call to understand the wedding and check whether the Academy format fits your day.", academyP1w: "Prior weeks",
    academyP2t: "Proposal",     academyP2d: "Tailored proposal with the Academy team assigned to your wedding.", academyP2w: "1 week",
    academyP3t: "The day",      academyP3d: "Full coverage with two Academy photographers, Liven supervision in production.", academyP3w: "24 h",
    academyP4t: "Delivery",     academyP4d: "Preview the following week. Full delivery with house post-production supervision.", academyP4w: "3–6 months",
    academyPacksEye: "How to book",
    academyPacksH: "Three ways to book Academy.",
    academyPack1n: "Academy · ", academyPack1nE: "Photo",
    academyPack1d: "Full photography coverage with two Academy photographers.",
    academyPack1l1: "Full coverage", academyPack1l2: "2 Academy photographers", academyPack1l3: "Liven supervision", academyPack1l4: "Digital delivery",
    academyPack2n: "Academy · ", academyPack2nE: "Photo + Film",
    academyPack2d: "Photo plus film in an intimate wedding, with extended team.",
    academyPack2l1: "Full photography", academyPack2l2: "Wedding film", academyPack2l3: "Extended team", academyPack2l4: "Optional album",
    academyPack2badge: "Most requested",
    academyPack3n: "Academy · ", academyPack3nE: "Intimate day",
    academyPack3d: "Coverage adapted to small weddings with a single photographer and full day.",
    academyPack3l1: "≤ 80 guests", academyPack3l2: "1 Academy photographer", academyPack3l3: "Full day", academyPack3l4: "Digital delivery",
    cTitle1: "Tell us about your",
    cTitle2: " wedding.",
    cSub: "A short conversation to get to know you. We get back to you with care.",
    cMeta1: "Email",    cMeta1V: "hello@liven.group",
    cMeta2: "Phone",    cMeta2V: "+34 630 930 200",
    cMeta3: "Studio",   cMeta3V: "C/ Lagasca 21, 1ºD · 28001 Madrid",
    cMeta4: "Hours",    cMeta4V: "Mon–Thu · 10:00–19:00",
    cStepOf: "Step", cOf: "of",
    cWelcomeTitle: "Welcome to Liven Art Group.",
    cWelcomeSub: "Before we begin, we'd like to get to know you a little.",
    cWelcomeBtn: "Begin",
    cP1Q: "To begin, what should we call you?",
    cP1Ph: "Your name",
    cP1V: "Nice to meet you.",
    cPApeQ: "And your surname?",
    cPApePh: "Surname",
    cPApeV: "Thank you.",
    cP2Q: "And your partner? What is their name?",
    cP2Ph: "First and last name",
    cP2V: "A pleasure.",
    cP3Q: "Do you already have a date for the wedding?",
    cP3V: "Noted.",
    cP4Q: "Where will the celebration take place?",
    cP4Ph: "Estate, venue or city",
    cP4V: "Perfect.",
    cP5Q: "Will it be a daytime or evening wedding?",
    cP5O1: "Daytime",
    cP5O2: "Evening",
    cP5V: "Got it.",
    cP6Q: "When you look at your wedding photos many years from now, what would you like them to tell about this moment?",
    cP6Ph: "Take your time to answer",
    cP6V: "Thank you for sharing this.",
    cP7Q: "At Liven we understand a wedding as the beginning of a story that continues over time.\n\nWould you like to know how we accompany our couples beyond the wedding day?",
    cP7O1: "Yes, I'm interested",
    cP7O2: "For now, just the wedding",
    cP7V: "Noted.",
    cP8Q: "To prepare the next step, we need a contact email.",
    cP8Ph: "your@email.com",
    cP8V: "Thank you.",
    cClosingTitle: "Thank you.",
    cClosingBody1: "With the information you've shared, we will prepare the next step carefully.",
    cClosingBody2: "You will soon receive an email with the Liven Art Group proposal tailored to your wedding and the next steps to arrange a call or meeting.",
    cBack: "← Back", cNext: "Next", cSend: "Send",
    cInvalidEmail: "Please check the email format.",
    cSendError: "We couldn't send the information. Please try again in a moment.",
  },

  /* ============================================================
     DE — Deutsch. Trato "ihr/euch" (informal plural) al pareja,
     coherente con la calidez del español. Nombres propios de fincas
     y firmas en español. Tono editorial-elegante.
     ============================================================ */
  de: {
    nav: { liven:"Liven", academy:"Academy", walther:"Walther Santafé", contact:"Kontakt", casa:"Das Haus" },
    book: "Sprechen wir",
    heroEyebrow: "Haus gegründet in Madrid · MMX",
    heroTagline: "The Wedding Experts",
    heroBrand1: "Liven",
    heroBrand2: "Art · Group",
    heroSubA: "Architekten der ",
    heroSubEm: "Erinnerung",
    heroSubB: ".",
    heroFirmasLabel: "Die drei Signaturen",
    heroFirma1: "Liven",
    heroFirma2: "Walther Santafé",
    heroFirma3: "Liven Academy",
    heroM1k: "Gegründet", heroM1v: "MMX",
    heroM2k: "Hochzeiten", heroM2v: "3.500+",
    heroM3k: "Signaturen", heroM3v: "III",
    heroM4k: "Sprachen", heroM4v: "EN · ES · DE",
    casaEyebrow: "Philosophie",
    casaTitle1: "Der Wert der ",
    casaTitleEm: "Erinnerung",
    casaTitle2: ".",
    casaP1: "In diesen fünfzehn Jahren haben wir gelernt, dass die Fotos nur ein Teil der Erinnerung sind: Was wir wirklich schaffen, ist die Erinnerung, die euch ein Leben lang begleitet. Und diese Erinnerung entsteht aus Vertrauen. Wir begleiten euch so, wie man einen guten Freund auf seiner Hochzeit begleitet — mit Zeit, ohne Eile und ohne gestellte Posen —, denn nur aus dieser Nähe wird die Erinnerung wirklich zu eurer. Wir arbeiten mit Zurückhaltung, Eleganz und Ehrlichkeit und achten auf jedes Detail, damit ihr, wenn ihr in zwanzig Jahren auf diese Bilder zurückblickt, genau wiedererkennt, was ihr gefühlt habt.",
    casaP2: "Liven Art Group ist das Madrider Haus, gegründet 2010. Wir haben mehr als dreitausendfünfhundert Hochzeiten in El Campillo, El Chaparral, Las Jarillas, Casa Mónico, Palacio de Aldovea und vielen weiteren begleitet. Drei Signaturen mit jeweils eigener Identität unter einem Dach, für drei Arten, eine Hochzeit zu betrachten.",
    firmasEyebrow: "Die drei Signaturen des Hauses",
    firmasH1: "Drei Signaturen. Ein ",
    firmasHEm: "Versprechen",
    firmasH2: ".",
    firmasSub: "Ihr wählt die, die am besten zu euch passt. Was wir in keiner verhandeln, ist das, was wirklich zählt — dass ihr in fünfzehn Jahren, beim Anschauen dieser Fotos, den Tag wieder spürt.",
    f1Tag: "Hauptsignatur des Hauses",
    f1Seal: "Seit MMX",
    f1Desc: "Das Herz des Studios. Vollständige Tagesabdeckung mit mindestens zwei Fotografen, vom Getting-Ready bis zu einem Teil der Feier. Fünfzehn Jahre in El Campillo, El Chaparral, Las Jarillas und Casa Mónico lehren uns, jedes Anwesen und jeden Rhythmus des Tages zu lesen. Ihr lebt die Hochzeit; um die Erinnerung kümmern wir uns.",
    f1See: "Liven entdecken",
    f2Tag: "Limitierte Edition · reservierte Plätze",
    f2Corner: "— Autorenstück",
    f2Seal: "Begrenzte Plätze",
    f2Desc: "Unser Luxusstück. Eine Abdeckung mit der direkten Beteiligung von Enri an der Fotografie und der visuellen Leitung der Reportage. Gedacht für Paare, die etwas von Fotografie verstehen und möchten, dass ihre eine eigene Stimme hat. Wenige Termine pro Jahr reserviert.",
    f2See: "Walther Santafé entdecken",
    f3Tag: "Eintritt in das Studio",
    f3Seal: "Intime Hochzeiten",
    f3Desc: "Linie junger Fotografen, ausgewählt und im Haus ausgebildet. Sie bewahren die Methode und die Sorgfalt des Studios bei einer enthaltsameren Investition. Gedacht für intimere Hochzeiten, die das Liven-Siegel ohne Verzicht möchten.",
    f3See: "Academy entdecken",
    manifestQ1: "Fünfzehn Jahre, in denen wir gelernt haben, dass das Wichtige einer Hochzeit ",
    manifestQEm: "sich nicht in Pose setzt: es geschieht",
    manifestQ2: ", während niemand hinschaut. Unser Handwerk ist es, da zu sein, wenn es geschieht, ohne dass man bemerkt, dass wir da sind.",
    manifestSign: "— Enri, Gründer von Liven Art Group",
    procEyebrow: "Wie wir arbeiten",
    procH1: "Vier Schritte, ",
    procHEm: "ohne Überraschungen",
    procH2: ".",
    proc1n:"i.",   proc1t:"Gespräch", proc1d:"Ein kurzer Anruf oder ein Treffen, um die Hochzeit, die Menschen und die Rolle zu verstehen, die Fotografie und Film im Tag spielen sollen.",
    proc2n:"ii.",  proc2t:"Angebot",  proc2d:"Ein maßgeschneidertes Angebot je nach Signatur, Umfang und Region. Keine aufgehübschten Standardtarife: das Budget passt zu eurer tatsächlichen Hochzeit.",
    proc3n:"iii.", proc3t:"Der Tag",  proc3d:"Vollständige Abdeckung, mindestens zwei Fotografen, vom Getting-Ready bis zu einem Teil der Feier. Einen Schritt voraus, damit ihr euch um nichts kümmern müsst.",
    proc4n:"iv.",  proc4t:"Übergabe", proc4d:"Vorschau in der Folgewoche. Vollständige Übergabe in drei bis sechs Monaten je nach Saison. Sorgfältig gestaltetes Album, wenn ihr es wünscht.",
    ctaH1: "Sprechen wir über ",
    ctaHEm: "eure",
    ctaH2: " Hochzeit.",
    ctaSub: "Ein kurzes Gespräch, um euch kennenzulernen. Wir melden uns mit Bedacht zurück.",
    ctaBtn1: "Gespräch beginnen",
    ctaBtn2: "Eine E-Mail schreiben",
    fBlurb1: "Eine sehr sorgfältige Art, eine Hochzeit zu ",
    fBlurbEm: "begleiten",
    fBlurb2: ".",
    fHouse: "Das Haus",
    fHouseI1: "Über Liven Group",
    fHouseI2: "Philosophie",
    fHouseI3: "Auszeichnungen",
    fFirms: "Signaturen",
    fF1Name: "Liven",            fF1Role: "Hauptsignatur",
    fF2Name: "Walther Santafé",  fF2Role: "Autorenstück",
    fF3Name: "Liven Academy",    fF3Role: "Eintritt",
    fContact: "Kontakt",
    fContactEmail: "info@liven.group",
    fContactPhone: "+34 630 930 200",
    fContactAddress: "C/ Lagasca 21, 1ºD · 28001 Madrid",
    fLangs: "Sprachen",
    fLang1: "Englisch", fLang2: "Spanisch", fLang3: "Deutsch",
    fRights: "Alle Rechte vorbehalten",
    fLegal: "Impressum", fPrivacy: "Datenschutz",
    livenH1a: "Das ",
    livenH1b: "Herz",
    livenH1c: " des Studios.",
    livenTag: "Hauptsignatur · Liven",
    livenIntro: "Liven ist unsere Hauptlinie. Wir arbeiten immer mit vollständiger Tagesabdeckung, mindestens zwei Fotografen, und begleiten vom Getting-Ready bis zu einem Teil der Feier. Die Art, wie wir die meisten Hochzeiten des Hauses abdecken: in El Campillo, El Chaparral, Las Jarillas, Casa Mónico, Palacio de Aldovea oder wo nötig.",
    livenStat1n: "3.500+", livenStat1l: "ausgelieferte Hochzeiten",
    livenStat2n: "15 Jahre", livenStat2l: "Handwerk",
    livenStat3n: "2 +",     livenStat3l: "Fotografen pro Hochzeit",
    livenSec1Eye: "Was enthalten ist",
    livenSec1H: "Vollständige Abdeckung, keine Abkürzungen.",
    livenSec1P: "Fotografische Reportage mit mindestens zwei Fotografen. Film auf Wunsch, mit erweitertem Team. Sorgfältige digitale Übergabe und Option auf ein gedrucktes Album. Vom Getting-Ready bis zu einem Teil der Feier, mit der Zeit, die die Reportage braucht, um zu erfassen, was wirklich geschieht — keine Aneinanderreihung von Posen.",
    livenProcessEye: "Prozess",
    livenProcessH: "Vier Schritte, ohne Überraschungen.",
    livenP1t: "Gespräch",  livenP1d: "Ein kurzer Anruf oder ein Treffen, um die Hochzeit, die Menschen und die Rolle zu verstehen, die Fotografie und Film im Tag spielen sollen.", livenP1w: "Vorwochen",
    livenP2t: "Angebot",   livenP2d: "Maßgeschneidertes Angebot je nach Signatur, Umfang und Region. Keine aufgehübschten Standardtarife.", livenP2w: "1 Wo.",
    livenP3t: "Der Tag",   livenP3d: "Vollständige Abdeckung mit mindestens zwei Fotografen, vom Getting-Ready bis zu einem Teil der Feier. Einen Schritt voraus, ohne zu stören.", livenP3w: "24 h",
    livenP4t: "Übergabe",  livenP4d: "Vorschau in der Folgewoche. Vollständige Übergabe in drei bis sechs Monaten. Sorgfältiges Album, wenn ihr es wünscht.", livenP4w: "3–6 Monate",
    livenPacksEye: "Wie ihr bucht",
    livenPacksH: "Drei Arten, Liven zu buchen.",
    livenPack1n: "Liven · ",  livenPack1nE: "Foto",
    livenPack1d: "Vollständige Fotografie-Abdeckung. Am häufigsten gebucht von Paaren, die wissen, was sie wollen.",
    livenPack1l1: "Vollständige Abdeckung", livenPack1l2: "Min. 2 Fotografen", livenPack1l3: "Sorgfältige digitale Übergabe", livenPack1l4: "Album optional",
    livenPack2n: "Liven · ", livenPack2nE: "Foto + Film",
    livenPack2d: "Vollständige Foto- und Filmabdeckung, mit erweitertem Team und einem sorgfältig gestalteten Endfilm.",
    livenPack2l1: "Vollständige Fotografie", livenPack2l2: "Hochzeitsfilm (3–6 Min.)", livenPack2l3: "Erweitertes Team", livenPack2l4: "Album inklusive",
    livenPack2badge: "Am gefragtesten",
    livenPack3n: "Liven · ", livenPack3nE: "Destination",
    livenPack3d: "Vollständige Abdeckung für Hochzeiten außerhalb Madrids oder Destination-Hochzeiten, innerhalb und außerhalb Spaniens.",
    livenPack3l1: "Flug & Unterkunft inkl.", livenPack3l2: "Persönliches Treffen vorab", livenPack3l3: "Reisende Abdeckung", livenPack3l4: "Min. zwei Tage",
    waltherH1a: "Ein signierter ",
    waltherH1b: "Blick",
    waltherH1c: ".",
    waltherTag: "Autorenstück · Walther Santafé",
    waltherIntro: "Walther Santafé ist das Autorenstück des Hauses. Persönlich von Enri signiert: eine intimere Abdeckung, mit größerer direkter Beteiligung an der Fotografie und der visuellen Leitung der Reportage. Für Paare, die etwas von Fotografie verstehen und möchten, dass ihre eine eigene Stimme hat. Wenige Termine pro Jahr reserviert.",
    waltherStat1n: "8",       waltherStat1l: "Hochzeiten/Jahr (max.)",
    waltherStat2n: "15 Jahre", waltherStat2l: "Praxis",
    waltherStat3n: "I",       waltherStat3l: "ein einziger Blick",
    waltherSec1Eye: "Was enthalten ist",
    waltherSec1H: "Eine einzige Stimme.",
    waltherSec1P: "Von Enri signierte Abdeckung. Integrale visuelle Leitung der Reportage, direkte Präsenz mit der Kamera den ganzen Tag und akribische Postproduktion. Wenige Hochzeiten pro Jahr, ausführliches Vorab-Briefing, kein Detail delegiert.",
    waltherProcessEye: "Prozess",
    waltherProcessH: "Mehr Treffen, mehr Zeit.",
    waltherP1t: "Treffen",  waltherP1d: "Ein langes persönliches Treffen, idealerweise in Madrid. Eure Hochzeit, eure Referenzen und das, was ihr von der Reportage erwartet, verstehen. Ohne dieses Gespräch arbeiten wir nicht mit dieser Signatur.", waltherP1w: "Vorwochen",
    waltherP2t: "Briefing", waltherP2d: "Ein persönliches Dokument mit der visuellen Leitung, der Liste der Schlüsselmomente und dem Abdeckungsplan. Wir besprechen es vor dem Tag.", waltherP2w: "2–3 Wo.",
    waltherP3t: "Der Tag",  waltherP3d: "Von Enri signierte Abdeckung. Kleines Team, direkte Präsenz mit der Kamera, volle Aufmerksamkeit. Einen Schritt voraus, ohne zu stören.", waltherP3w: "24 h",
    waltherP4t: "Übergabe", waltherP4d: "Vorschau in der Folgewoche. Vollständige Übergabe in vier bis sieben Monaten. Persönliche Auswahl von Enri. Sorgfältiges Album immer inklusive.", waltherP4w: "4–7 Monate",
    waltherPacksEye: "Wie ihr bucht",
    waltherPacksH: "Drei Arten, mit Walther zu arbeiten.",
    waltherPack1n: "Walther · ", waltherPack1nE: "Hochzeit",
    waltherPack1d: "Autorenabdeckung des gesamten Tages, von Enri signiert.",
    waltherPack1l1: "Signierte Abdeckung", waltherPack1l2: "Kleines Team", waltherPack1l3: "Sorgfältiges Album inkl.", waltherPack1l4: "Sehr begrenzte Plätze",
    waltherPack2n: "Walther · ", waltherPack2nE: "Hochzeit + Pre-Wedding",
    waltherPack2d: "Hochzeit plus Pre-Wedding-Session am Ort eurer Wahl. Die häufigste Art, mit dieser Signatur zu arbeiten.",
    waltherPack2l1: "Pre-Wedding-Session", waltherPack2l2: "Signierte Abdeckung", waltherPack2l3: "Doppelalbum", waltherPack2l4: "Persönliches Treffen vorab",
    waltherPack2badge: "Am häufigsten",
    waltherPack3n: "Walther · ", waltherPack3nE: "Destination",
    waltherPack3d: "Hochzeiten außerhalb Madrids oder Destination-Hochzeiten, innerhalb und außerhalb Spaniens.",
    waltherPack3l1: "Flug & Unterkunft", waltherPack3l2: "Tage am Zielort", waltherPack3l3: "Signierte Abdeckung", waltherPack3l4: "Persönliches Briefing",
    academyH1a: "Die ",
    academyH1b: "Tür",
    academyH1c: " zu Liven.",
    academyTag: "Eintritt · Liven Academy",
    academyIntro: "Liven Academy ist unsere Linie junger Fotografen, ausgewählt und innerhalb des Studios ausgebildet. Sie arbeiten mit der Methode des Hauses, von innen betreut, mit einer enthaltsameren Investition. Gedacht für intimere Hochzeiten, die das Liven-Siegel ohne Verzicht möchten.",
    academyStat1n: "4",       academyStat1l: "hier ausgebildete Fotografen",
    academyStat2n: "15 Jahre", academyStat2l: "Haus-Methode",
    academyStat3n: "80–150",  academyStat3l: "Gäste (Richtwert)",
    academySec1Eye: "Was enthalten ist",
    academySec1H: "Die Liven-Methode, im enthaltsameren Format.",
    academySec1P: "Vollständige Abdeckung mit zwei jungen, innerhalb des Studios ausgebildeten Fotografen. Direkte Betreuung durch das Haus in Produktion und Postproduktion. Sorgfältige digitale Übergabe und Option auf ein gedrucktes Album. Gleiche Arbeitskultur, mit einer auf intimere Hochzeiten angepassten Investition.",
    academyProcessEye: "Prozess",
    academyProcessH: "Gleicher Prozess, enthaltsames Format.",
    academyP1t: "Gespräch", academyP1d: "Ein Anruf, um die Hochzeit zu verstehen und zu prüfen, ob das Academy-Format zu eurem Tag passt.", academyP1w: "Vorwochen",
    academyP2t: "Angebot",  academyP2d: "Maßgeschneidertes Angebot mit dem Academy-Team, das eurer Hochzeit zugewiesen ist.", academyP2w: "1 Wo.",
    academyP3t: "Der Tag",  academyP3d: "Vollständige Abdeckung mit zwei Academy-Fotografen, Liven-Betreuung in der Produktion.", academyP3w: "24 h",
    academyP4t: "Übergabe", academyP4d: "Vorschau in der Folgewoche. Vollständige Übergabe mit Haus-Betreuung in der Postproduktion.", academyP4w: "3–6 Monate",
    academyPacksEye: "Wie ihr bucht",
    academyPacksH: "Drei Arten, Academy zu buchen.",
    academyPack1n: "Academy · ", academyPack1nE: "Foto",
    academyPack1d: "Vollständige Fotografie-Abdeckung mit zwei Academy-Fotografen.",
    academyPack1l1: "Vollständige Abdeckung", academyPack1l2: "2 Academy-Fotografen", academyPack1l3: "Liven-Betreuung", academyPack1l4: "Digitale Übergabe",
    academyPack2n: "Academy · ", academyPack2nE: "Foto + Film",
    academyPack2d: "Foto plus Film für eine intime Hochzeit, mit erweitertem Team.",
    academyPack2l1: "Vollständige Fotografie", academyPack2l2: "Hochzeitsfilm", academyPack2l3: "Erweitertes Team", academyPack2l4: "Album optional",
    academyPack2badge: "Am gefragtesten",
    academyPack3n: "Academy · ", academyPack3nE: "Intimer Tag",
    academyPack3d: "Auf kleine Hochzeiten angepasste Abdeckung mit einem einzigen Fotografen und vollem Tag.",
    academyPack3l1: "≤ 80 Gäste", academyPack3l2: "1 Academy-Fotograf", academyPack3l3: "Voller Tag", academyPack3l4: "Digitale Übergabe",
    cTitle1: "Erzählt uns von eurer",
    cTitle2: " Hochzeit.",
    cSub: "Ein kurzes Gespräch, um euch kennenzulernen. Wir melden uns mit Bedacht zurück.",
    cMeta1: "E-Mail",  cMeta1V: "info@liven.group",
    cMeta2: "Telefon", cMeta2V: "+34 630 930 200",
    cMeta3: "Studio",  cMeta3V: "C/ Lagasca 21, 1ºD · 28001 Madrid",
    cMeta4: "Zeiten",  cMeta4V: "Mo–Do · 10:00–19:00",
    cStepOf: "Schritt", cOf: "von",
    cWelcomeTitle: "Willkommen bei Liven Art Group.",
    cWelcomeSub: "Bevor wir beginnen, möchten wir euch ein wenig besser kennenlernen.",
    cWelcomeBtn: "Beginnen",
    cP1Q: "Zu Beginn: wie sollen wir dich nennen?",
    cP1Ph: "Dein Name",
    cP1V: "Sehr erfreut.",
    cPApeQ: "Und dein Nachname?",
    cPApePh: "Nachname",
    cPApeV: "Danke.",
    cP2Q: "Und dein Partner / deine Partnerin? Wie heißt sie/er?",
    cP2Ph: "Vor- und Nachname",
    cP2V: "Es ist uns ein Vergnügen.",
    cP3Q: "Habt ihr schon ein Datum für die Hochzeit?",
    cP3V: "Notiert.",
    cP4Q: "Wo findet die Feier statt?",
    cP4Ph: "Anwesen, Ort oder Stadt",
    cP4V: "Perfekt.",
    cP5Q: "Wird es eine Tages- oder Abendhochzeit?",
    cP5O1: "Tageshochzeit",
    cP5O2: "Abend / Nacht",
    cP5V: "Verstanden.",
    cP6Q: "Wenn ihr in vielen Jahren auf eure Hochzeitsfotos schaut, was sollen sie über diesen Moment erzählen?",
    cP6Ph: "Nehmt euch Zeit zum Antworten",
    cP6V: "Danke, dass ihr das geteilt habt.",
    cP7Q: "Bei Liven verstehen wir eine Hochzeit als den Beginn einer Geschichte, die sich mit der Zeit fortsetzt.\n\nMöchtet ihr erfahren, wie wir unsere Paare über den Hochzeitstag hinaus begleiten?",
    cP7O1: "Ja, das interessiert mich",
    cP7O2: "Vorerst nur die Hochzeit",
    cP7V: "Wir berücksichtigen es.",
    cP8Q: "Um den nächsten Schritt vorzubereiten, brauchen wir eine Kontakt-E-Mail.",
    cP8Ph: "eure@email.com",
    cP8V: "Danke.",
    cClosingTitle: "Danke.",
    cClosingBody1: "Mit den Informationen, die ihr uns geteilt habt, bereiten wir den nächsten Schritt mit Bedacht vor.",
    cClosingBody2: "In Kürze erhaltet ihr eine E-Mail mit dem auf eure Hochzeit zugeschnittenen Liven-Art-Group-Angebot und den nächsten Schritten, um einen Anruf oder ein Treffen zu vereinbaren.",
    cBack: "← Zurück", cNext: "Weiter", cSend: "Senden",
    cInvalidEmail: "Bitte überprüft das E-Mail-Format.",
    cSendError: "Wir konnten die Informationen nicht senden. Bitte versucht es gleich erneut.",
  }
};

/* ============================================================================
   Hook de scroll-reveal. Añade .in a cualquier .reveal que entre en viewport.
   ============================================================================ */
function useReveal(deps){
  useEffect(() => {
    const els = document.querySelectorAll(".reveal:not(.in)");
    const io = new IntersectionObserver((entries) => {
      entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add("in"); io.unobserve(e.target); } });
    }, { threshold: 0.12 });
    els.forEach(el => io.observe(el));
    return () => io.disconnect();
  }, deps);
}

/* ============================================================================
   Header — wordmark apilado Liven / GROUP a la izquierda, nav centrada, lang+CTA
   a la derecha. Cambiar de ruta hace scroll al top suavemente.
   ============================================================================ */
function Header({ route, setRoute, lang, setLang }) {
  const t = COPY[lang];
  const go = (r) => { setRoute(r); window.scrollTo({top:0,behavior:"smooth"}); };
  return (
    <header className="site">
      <div className="bar">
        <div className="brand" onClick={()=>go("home")} role="button">
          <span className="b1">{t.heroBrand1}</span>
          <span className="b2">{t.heroBrand2}</span>
        </div>
        <nav className="primary">
          <ul>
            <li><a href="https://livenph.com" target="_blank" rel="noopener noreferrer">{t.nav.liven}</a></li>
            <li><a href="https://walthersantafe.com" target="_blank" rel="noopener noreferrer">{t.nav.walther}</a></li>
            <li><a className={route==="academy"?"active":""} onClick={()=>go("academy")}>{t.nav.academy}</a></li>
            <li><a className={route==="contact"?"active":""} onClick={()=>go("contact")}>{t.nav.contact}</a></li>
          </ul>
        </nav>
        <div className="head-right">
          <div className="lang">
            <button className={lang==="en"?"active":""} onClick={()=>setLang("en")}>EN</button>
            <span className="sep">·</span>
            <button className={lang==="es"?"active":""} onClick={()=>setLang("es")}>ES</button>
            <span className="sep">·</span>
            <button className={lang==="de"?"active":""} onClick={()=>setLang("de")}>DE</button>
          </div>
          <a className="cta-top" onClick={()=>go("contact")}><span>{t.book} <span>→</span></span></a>
        </div>
      </div>
    </header>
  );
}

/* ============================================================================
   Hero — centrado tipo bookplate. Wordmark Liven + GROUP debajo. Subtítulo
   italic con énfasis emocional. Tira de tres firmas + meta de la casa.
   ============================================================================ */
function Hero({ lang }) {
  const t = COPY[lang];
  return (
    <section className="hero wrap">
      <div className="ornament"></div>
      <div className="hero-tagline">{t.heroTagline}</div>
      <h1 className="hero-mark">{t.heroBrand1}<span className="group">{t.heroBrand2}</span></h1>
      <p className="hero-sub">{t.heroSubA}<em>{t.heroSubEm}</em>{t.heroSubB}</p>
      <div className="hero-firmas">
        <span>{t.heroFirma1}</span>
        <span className="dot"></span>
        <span>{t.heroFirma2}</span>
        <span className="dot"></span>
        <span>{t.heroFirma3}</span>
      </div>
      <div className="hero-meta">
        <div className="col"><div className="k">{t.heroM1k}</div><div className="v"><em>{t.heroM1v}</em></div></div>
        <div className="col"><div className="k">{t.heroM2k}</div><div className="v"><em>{t.heroM2v}</em></div></div>
        <div className="col"><div className="k">{t.heroM3k}</div><div className="v"><em>{t.heroM3v}</em></div></div>
        <div className="col"><div className="k">{t.heroM4k}</div><div className="v"><em>{t.heroM4v}</em></div></div>
      </div>
    </section>
  );
}

/* ============================================================================
   CasaIntro — sección que explica que Liven Group es la casa-paraguas que
   reúne las tres firmas. Centrada, dos párrafos en serif italic-lectura.
   ============================================================================ */
function CasaIntro({ lang }) {
  const t = COPY[lang];
  return (
    <section className="casa wrap reveal">
      <div className="cap eyebrow">— {t.casaEyebrow} —</div>
      <h2>{t.casaTitle1}<em>{t.casaTitleEm}</em>{t.casaTitle2}</h2>
      <p>{t.casaP1}</p>
      <p>{t.casaP2}</p>
    </section>
  );
}

/* ============================================================================
   FirmasGrid — las tres firmas como tarjetas equivalentes en grid 3 columnas.
   Cada una con su tratamiento tipográfico para hinted la jerarquía:
   - Liven: serif uppercase tracked, sólida (firma principal)
   - Walther: italic serif con caoba y "pieza de autor" en esquina (lujo)
   - Academy: lockup Liven (sans tracked) + ACADEMY (serif) para visibilizar
     la pertenencia al paraguas (puerta de entrada)
   ============================================================================ */
function FirmasGrid({ lang, goFirma }) {
  const t = COPY[lang];
  return (
    <section className="firmas">
      <div className="wrap">
        <div className="firmas-head">
          <div className="cap eyebrow">— {t.firmasEyebrow} —</div>
          <h3>{t.firmasH1}<em>{t.firmasHEm}</em>{t.firmasH2}</h3>
          <p className="sub">{t.firmasSub}</p>
        </div>

        <div className="firmas-grid">

          <article className="firma firma-1" onClick={()=>window.open("https://livenph.com","_blank","noopener")} role="button">
            <div className="roman">I</div>
            <div className="tag">{t.f1Tag}</div>
            <div className="filete-top"></div>
            <div className="mark">Liven</div>
            <p className="desc">{t.f1Desc}</p>
            <a className="see">{t.f1See} →</a>
          </article>

          <article className="firma firma-2" onClick={()=>window.open("https://walthersantafe.com","_blank","noopener")} role="button">
            <div className="corner">{t.f2Corner}</div>
            <div className="roman">II</div>
            <div className="tag">{t.f2Tag}</div>
            <div className="filete-top"></div>
            <div className="mark">Walther<span className="surname">Santafé</span></div>
            <p className="desc">{t.f2Desc}</p>
            <a className="see">{t.f2See} →</a>
          </article>

          <article className="firma firma-3" onClick={()=>goFirma("academy")} role="button">
            <div className="roman">III</div>
            <div className="tag">{t.f3Tag}</div>
            <div className="filete-top"></div>
            <div className="mark">
              <span className="pre">Liven</span>
              <span className="main">Academy</span>
            </div>
            <p className="desc">{t.f3Desc}</p>
            <a className="see">{t.f3See} →</a>
          </article>

        </div>
      </div>
    </section>
  );
}

/* ============================================================================
   Manifest — una sola cita central con ornamento de filetes. Firma de Enri.
   ============================================================================ */
function Manifest({ lang }) {
  const t = COPY[lang];
  return (
    <section className="manifest wrap reveal">
      <div className="ornament-wide"><span></span><div className="dot"></div><span></span></div>
      <p className="q">{t.manifestQ1}<em>{t.manifestQEm}</em>{t.manifestQ2}</p>
      <div className="sign">{t.manifestSign}</div>
    </section>
  );
}

/* ============================================================================
   Proceso — cuatro pasos del trabajo de la casa, en columnas. Numeración
   romana minúscula como en una invitación. Misma data que el Proceso de cada
   FirmaPage; aquí en versión compacta para la home.
   ============================================================================ */
function Proceso({ lang }) {
  const t = COPY[lang];
  const steps = [
    [t.proc1n, t.proc1t, t.proc1d],
    [t.proc2n, t.proc2t, t.proc2d],
    [t.proc3n, t.proc3t, t.proc3d],
    [t.proc4n, t.proc4t, t.proc4d],
  ];
  return (
    <section className="proceso reveal">
      <div className="wrap">
        <div className="proceso-head">
          <div className="cap eyebrow">— {t.procEyebrow} —</div>
          <h3>{t.procH1}<em>{t.procHEm}</em>{t.procH2}</h3>
        </div>
        <div className="proceso-cols">
          {steps.map(([n,h,p],i)=>(
            <div className="col" key={i}>
              <div className="num">{n}</div>
              <h4>{h}</h4>
              <p>{p}</p>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

/* ============================================================================
   CTA / Cierre — un solo titular y un text-link primario hacia el flujo
   conversacional. Botón secundario discreto a email directo.
   ============================================================================ */
function CTA({ lang, goContact }) {
  const t = COPY[lang];
  return (
    <section className="cta-block reveal">
      <h2>{t.ctaH1}<em>{t.ctaHEm}</em>{t.ctaH2}</h2>
      <p className="lead">{t.ctaSub}</p>
      <div className="btn-row">
        <button className="cta-link" onClick={goContact}>{t.ctaBtn1} →</button>
        <a className="btn ghost" href="mailto:info@liven.group"><span>{t.ctaBtn2}</span></a>
      </div>
    </section>
  );
}

/* ============================================================================
   Footer — wordmark gigante Liven Group apilado sobre fondo tinta. Cuatro
   columnas: la casa, firmas (con tier role), contacto, idiomas.
   ============================================================================ */
function Footer({ lang, setRoute }) {
  const t = COPY[lang];
  const go = (r) => { setRoute(r); window.scrollTo({top:0,behavior:"smooth"}); };
  return (
    <footer className="site">
      <div className="footer-mark">
        <div className="m1">Liv<em>en</em></div>
        <div className="m2">{t.heroBrand2}</div>
      </div>
      <div className="footer-grid">
        <div>
          <h4>{t.fHouse}</h4>
          <p className="blurb">{t.fBlurb1}<em>{t.fBlurbEm}</em>{t.fBlurb2}</p>
        </div>
        <div>
          <h4>{t.fFirms}</h4>
          <ul>
            <li className="tier" onClick={()=>window.open("https://livenph.com","_blank","noopener")}>
              <span className="name">{t.fF1Name}</span>
              <span className="role">{t.fF1Role}</span>
            </li>
            <li className="tier" onClick={()=>window.open("https://walthersantafe.com","_blank","noopener")}>
              <span className="name">{t.fF2Name}</span>
              <span className="role">{t.fF2Role}</span>
            </li>
            <li className="tier" onClick={()=>go("academy")}>
              <span className="name">{t.fF3Name}</span>
              <span className="role">{t.fF3Role}</span>
            </li>
          </ul>
        </div>
        <div>
          <h4>{t.fContact}</h4>
          <ul>
            <li>{t.fContactEmail}</li>
            <li>{t.fContactPhone}</li>
            <li>{t.fContactAddress}</li>
          </ul>
        </div>
        <div>
          <h4>{t.fLangs}</h4>
          <ul><li>{t.fLang1}</li><li>{t.fLang2}</li><li>{t.fLang3}</li></ul>
        </div>
      </div>
      <div className="footer-bottom">
        <span>© {new Date().getFullYear()} · Liven Art Group · {t.fRights}</span>
        <span>
          <a>{t.fLegal}</a>
          <a>{t.fPrivacy}</a>
        </span>
      </div>
    </footer>
  );
}

/* ============================================================================
   FirmaPage — plantilla común a las tres páginas internas: hero (texto +
   imagen vertical), tira de 3 stats, two-col con servicios + imagen, process
   en filas, packs en 3 tarjetas con feat opcional.
   ============================================================================ */
function FirmaPage({ lang, slug, data }) {
  const stats = data.stats;
  const services = data.services;
  const process = data.process;
  const packs = data.packs;
  return (
    <section className="firma-page wrap">
      <div className="firma-hero">
        <div className="left">
          <span className="num-mark">№ {data.num} · {data.tag}</span>
          <h1>{data.hero}</h1>
          <p className="lead">{data.intro}</p>
        </div>
        <div className="right"><div className="img" style={{backgroundImage:`url(${data.img})`}}/></div>
      </div>

      <div className="firma-stats reveal">
        {stats.map((s,i)=>(
          <div key={i} className="stat">
            <div className="num-xl">{s.n}</div>
            <div className="lbl">{s.l}</div>
          </div>
        ))}
      </div>

      <div className="two-col reveal">
        <div className="copy">
          <span className="cap">— {services.eye}</span>
          <h2>{services.h}</h2>
          <p className="body-text">{services.p}</p>
        </div>
        <div className="stack">
          <div className="frame tall"><div className="img" style={{backgroundImage:`url(${data.img2})`}}/></div>
        </div>
      </div>

      <div className="process reveal">
        <div className="process-head">
          <span className="cap">— {process.eye}</span>
          <h2>{process.h}</h2>
        </div>
        {process.steps.map((s,i)=>(
          <div className="pr" key={i}>
            <span className="num">{String(i+1).padStart(2,"0")} · {s.w}</span>
            <h4>{s.t}</h4>
            <p>{s.d}</p>
            <span className="time">↗</span>
          </div>
        ))}
      </div>

      <div className="wrap" style={{padding:"5vh 0 2rem"}}>
        <div style={{display:"flex",flexDirection:"column",gap:".8rem"}}>
          <span className="cap">— {packs.eye}</span>
          <h2>{packs.h}</h2>
        </div>
      </div>
      <div className="packs reveal">
        {packs.items.map((p,i)=>(
          <div className={"pack"+(p.feat?" feat":"")} key={i}>
            {p.badge && <span className="badge">{p.badge}</span>}
            <span className="num">№ {String(i+1).padStart(2,"0")}</span>
            <h3 className="pack-name">{p.n}<em>{p.nE}</em></h3>
            <p className="pack-desc">{p.d}</p>
            <ul>{p.list.map((it,j)=><li key={j}>{it}</li>)}</ul>
          </div>
        ))}
      </div>
    </section>
  );
}

/* ============================================================================
   buildFirmaData — construye el objeto data para la firma según slug.
   Las imágenes apuntan a Unsplash genéricas; cuando Enri tenga selección de
   reportajes reales, sustituir aquí.
   ============================================================================ */
function buildFirmaData(slug, t) {
  if (slug === "liven") return {
    num:"01", tag:t.livenTag,
    hero:<>{t.livenH1a}<em>{t.livenH1b}</em>{t.livenH1c}</>,
    intro:t.livenIntro,
    // Imágenes curadas de la portada de livenph.com -- migrar a Hostinger cuando se pueda.
    img:"https://www.livenph.com/wp-content/uploads/slider3/fotografo-boda-2.jpeg",
    img2:"https://www.livenph.com/wp-content/uploads/slider3/fotografos-de-boda-4.jpeg",
    stats:[{n:t.livenStat1n,l:t.livenStat1l},{n:t.livenStat2n,l:t.livenStat2l},{n:t.livenStat3n,l:t.livenStat3l}],
    services:{eye:t.livenSec1Eye,h:t.livenSec1H,p:t.livenSec1P},
    process:{eye:t.livenProcessEye,h:t.livenProcessH,steps:[
      {t:t.livenP1t,d:t.livenP1d,w:t.livenP1w},
      {t:t.livenP2t,d:t.livenP2d,w:t.livenP2w},
      {t:t.livenP3t,d:t.livenP3d,w:t.livenP3w},
      {t:t.livenP4t,d:t.livenP4d,w:t.livenP4w},
    ]},
    packs:{eye:t.livenPacksEye,h:t.livenPacksH,items:[
      {n:t.livenPack1n,nE:t.livenPack1nE,d:t.livenPack1d,list:[t.livenPack1l1,t.livenPack1l2,t.livenPack1l3,t.livenPack1l4]},
      {n:t.livenPack2n,nE:t.livenPack2nE,d:t.livenPack2d,list:[t.livenPack2l1,t.livenPack2l2,t.livenPack2l3,t.livenPack2l4],feat:true,badge:t.livenPack2badge},
      {n:t.livenPack3n,nE:t.livenPack3nE,d:t.livenPack3d,list:[t.livenPack3l1,t.livenPack3l2,t.livenPack3l3,t.livenPack3l4]},
    ]},
  };
  if (slug === "walther") return {
    num:"02", tag:t.waltherTag,
    hero:<>{t.waltherH1a}<em>{t.waltherH1b}</em>{t.waltherH1c}</>,
    intro:t.waltherIntro,
    // Bodas reales -- B&N autorales para vender "pieza de autor".
    img:"https://www.livenph.com/wp-content/uploads/2021/04/LIVEN-Hajar_Mohamed-3444.jpg",
    img2:"https://www.livenph.com/wp-content/uploads/2021/05/LIVEN-BeatrizIgnacio-5499-portada.jpg",
    stats:[{n:t.waltherStat1n,l:t.waltherStat1l},{n:t.waltherStat2n,l:t.waltherStat2l},{n:t.waltherStat3n,l:t.waltherStat3l}],
    services:{eye:t.waltherSec1Eye,h:t.waltherSec1H,p:t.waltherSec1P},
    process:{eye:t.waltherProcessEye,h:t.waltherProcessH,steps:[
      {t:t.waltherP1t,d:t.waltherP1d,w:t.waltherP1w},
      {t:t.waltherP2t,d:t.waltherP2d,w:t.waltherP2w},
      {t:t.waltherP3t,d:t.waltherP3d,w:t.waltherP3w},
      {t:t.waltherP4t,d:t.waltherP4d,w:t.waltherP4w},
    ]},
    packs:{eye:t.waltherPacksEye,h:t.waltherPacksH,items:[
      {n:t.waltherPack1n,nE:t.waltherPack1nE,d:t.waltherPack1d,list:[t.waltherPack1l1,t.waltherPack1l2,t.waltherPack1l3,t.waltherPack1l4]},
      {n:t.waltherPack2n,nE:t.waltherPack2nE,d:t.waltherPack2d,list:[t.waltherPack2l1,t.waltherPack2l2,t.waltherPack2l3,t.waltherPack2l4],feat:true,badge:t.waltherPack2badge},
      {n:t.waltherPack3n,nE:t.waltherPack3nE,d:t.waltherPack3d,list:[t.waltherPack3l1,t.waltherPack3l2,t.waltherPack3l3,t.waltherPack3l4]},
    ]},
  };
  // academy
  return {
    num:"03", tag:t.academyTag,
    hero:<>{t.academyH1a}<em>{t.academyH1b}</em>{t.academyH1c}</>,
    intro:t.academyIntro,
    // Bodas reales -- jovenes / intimas para vender "puerta de entrada".
    img:"https://www.livenph.com/wp-content/uploads/2020/09/LIVEN-Isabel_Eduardo-64.jpg",
    img2:"https://www.livenph.com/wp-content/uploads/2021/04/LIVEN-Patricia_Jorge-2247-scaled.jpg",
    stats:[{n:t.academyStat1n,l:t.academyStat1l},{n:t.academyStat2n,l:t.academyStat2l},{n:t.academyStat3n,l:t.academyStat3l}],
    services:{eye:t.academySec1Eye,h:t.academySec1H,p:t.academySec1P},
    process:{eye:t.academyProcessEye,h:t.academyProcessH,steps:[
      {t:t.academyP1t,d:t.academyP1d,w:t.academyP1w},
      {t:t.academyP2t,d:t.academyP2d,w:t.academyP2w},
      {t:t.academyP3t,d:t.academyP3d,w:t.academyP3w},
      {t:t.academyP4t,d:t.academyP4d,w:t.academyP4w},
    ]},
    packs:{eye:t.academyPacksEye,h:t.academyPacksH,items:[
      {n:t.academyPack1n,nE:t.academyPack1nE,d:t.academyPack1d,list:[t.academyPack1l1,t.academyPack1l2,t.academyPack1l3,t.academyPack1l4]},
      {n:t.academyPack2n,nE:t.academyPack2nE,d:t.academyPack2d,list:[t.academyPack2l1,t.academyPack2l2,t.academyPack2l3,t.academyPack2l4],feat:true,badge:t.academyPack2badge},
      {n:t.academyPack3n,nE:t.academyPack3nE,d:t.academyPack3d,list:[t.academyPack3l1,t.academyPack3l2,t.academyPack3l3,t.academyPack3l4]},
    ]},
  };
}

/* ============================================================================
   ContactPage — flujo conversacional de 10 pasos (welcome → 8 preguntas →
   closing). Lógica idéntica a la versión previa: validación intermedia de
   ~1.2s, auto-avance en pasos de selección, Enter avanza, regex email,
   backup local en localStorage.livenLeads + POST a app.liven.group cuando
   exista el endpoint. Especificación en docs/conversational-spec.md.
   ============================================================================ */
function ContactPage({ lang }) {
  const t = COPY[lang];
  const [step, setStep] = useState(0);
  const [showValidation, setShowValidation] = useState(false);
  const [submitState, setSubmitState] = useState("idle"); // idle | sending | sent | error
  const [data, setData] = useState({
    alias: "",          // cómo quiere que le llamemos (trato de email)
    apellido: "",       // apellido del contacto principal
    partner2Name: "",   // nombre y apellido de la pareja
    weddingDate: "",
    weddingLocation: "",
    weddingType: "",
    photoExpectations: "",
    longTermInterest: null,
    email: "",
  });
  const upd = (k, v) => setData(d => ({ ...d, [k]: v }));

  const STEPS = [
    { key: "welcome" },
    { key: "alias",               section: "Vosotros" },
    { key: "apellido",            section: "Vosotros" },
    { key: "partner2_name",       section: "Vosotros" },
    { key: "wedding_date",        section: "Vuestra boda" },
    { key: "wedding_location",    section: "Vuestra boda" },
    { key: "wedding_type",        section: "Vuestra boda" },
    { key: "photo_expectations",  section: "Vuestra mirada" },
    { key: "long_term_interest",  section: "Vuestra mirada" },
    { key: "email",               section: "Contacto" },
    { key: "closing" },
  ];
  const cur = STEPS[step];
  const total = STEPS.length - 2;
  const showProgress = step > 0 && step < STEPS.length - 1;

  const canNext = () => {
    switch (cur.key) {
      case "alias":               return data.alias.trim().length > 1;
      case "apellido":            return data.apellido.trim().length > 1;
      case "partner2_name":       return data.partner2Name.trim().length > 1;
      case "wedding_date":        return data.weddingDate !== "";
      case "wedding_location":    return data.weddingLocation.trim().length > 1;
      case "wedding_type":        return data.weddingType !== "";
      case "photo_expectations":  return data.photoExpectations.trim().length > 8;
      case "long_term_interest":  return data.longTermInterest !== null;
      case "email":               return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(data.email);
      default:                    return true;
    }
  };

  function goNext() {
    if (!canNext()) return;
    setShowValidation(true);
    setTimeout(() => {
      setShowValidation(false);
      if (cur.key === "email") {
        submit();
      } else {
        setStep(s => s + 1);
      }
    }, 1200);
  }

  function goBack() { if (step > 1) setStep(s => s - 1); }

  // Auto-avance para los pasos de seleccion (radios). NO usamos goNext()/canNext()
  // aqui porque setTimeout captura un closure obsoleto del state -- el setData
  // recien llamado no se refleja en `data` hasta el siguiente render, y canNext()
  // veria el valor antiguo (vacio) y bloquearia el avance.
  // Como el valor seleccionado por el radio es valido por construccion, podemos
  // disparar el flujo de validacion+avance directamente sin re-validar.
  function autoAdvance() {
    setTimeout(() => {
      setShowValidation(true);
      setTimeout(() => {
        setShowValidation(false);
        setStep(s => s + 1);
      }, 1200);
    }, 350);
  }

  async function submit() {
    setSubmitState("sending");
    try {
      // Backup local SIEMPRE primero — red de seguridad si todo el pipeline falla.
      try {
        const all = JSON.parse(localStorage.getItem("livenLeads") || "[]");
        all.push({ ...data, ts: new Date().toISOString() });
        localStorage.setItem("livenLeads", JSON.stringify(all));
      } catch (_) {}

      // Envío al worker → Odoo. El campo `_hp` (honeypot) va vacío para usuarios
      // reales; un bot que rellene el formulario automáticamente lo poblaría y
      // el worker lo descartaría silenciosamente.
      if (LEAD_ENDPOINT && LEAD_ENDPOINT !== "PENDIENTE_DE_DESPLIEGUE") {
        try {
          const res = await fetch(LEAD_ENDPOINT, {
            method: "POST",
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({ ...data, _hp: "" }),
          });
          if (!res.ok) throw new Error("HTTP " + res.status);
        } catch (e) {
          // No bloqueamos el cierre del flujo — el lead queda en localStorage.
          console.warn("[landing] envío al worker falló:", e && e.message);
        }
      } else {
        console.warn("[landing] LEAD_ENDPOINT sin configurar — lead solo en localStorage.");
      }

      setSubmitState("sent");
      setStep(s => s + 1);
    } catch (e) {
      setSubmitState("error");
    }
  }

  function renderWelcome() {
    return (
      <div className="step active" style={{textAlign:"center",padding:"6vh 0"}}>
        <h2 style={{marginBottom:"1.4rem"}}>{t.cWelcomeTitle}</h2>
        <p className="lead" style={{margin:"0 auto 2.4rem",textAlign:"center"}}>{t.cWelcomeSub}</p>
        <button className="cta-link" onClick={()=>setStep(1)}>{t.cWelcomeBtn} →</button>
      </div>
    );
  }

  function renderClosing() {
    return (
      <div className="step thanks active">
        <div className="ok">✓</div>
        <h2>{t.cClosingTitle}</h2>
        <p className="body-text" style={{marginTop:"1.4rem"}}>{t.cClosingBody1}</p>
        <p className="body-text" style={{marginTop:"1rem"}}>{t.cClosingBody2}</p>
      </div>
    );
  }

  function renderQuestion() {
    if (showValidation) {
      const vMap = {
        alias: t.cP1V, apellido: t.cPApeV, partner2_name: t.cP2V, wedding_date: t.cP3V,
        wedding_location: t.cP4V, wedding_type: t.cP5V, photo_expectations: t.cP6V,
        long_term_interest: t.cP7V, email: t.cP8V,
      };
      return (
        <div className="step active" style={{textAlign:"center",padding:"6vh 0"}}>
          <p style={{fontFamily:"var(--serif)",fontStyle:"italic",fontSize:"clamp(1.4rem,2.4vw,2rem)",fontWeight:300,color:"var(--ink-soft)",letterSpacing:"-.005em"}}>
            {vMap[cur.key]}
          </p>
        </div>
      );
    }

    switch (cur.key) {
      case "alias":
        return (
          <div className="step active">
            <h2>{t.cP1Q}</h2>
            <div className="field">
              <input autoFocus type="text" value={data.alias}
                placeholder={t.cP1Ph}
                onChange={e=>upd("alias", e.target.value)}
                onKeyDown={e=>{ if(e.key==="Enter" && canNext()) goNext(); }}/>
            </div>
          </div>
        );
      case "apellido":
        return (
          <div className="step active">
            <h2>{t.cPApeQ}</h2>
            <div className="field">
              <input autoFocus type="text" value={data.apellido}
                placeholder={t.cPApePh}
                onChange={e=>upd("apellido", e.target.value)}
                onKeyDown={e=>{ if(e.key==="Enter" && canNext()) goNext(); }}/>
            </div>
          </div>
        );
      case "partner2_name":
        return (
          <div className="step active">
            <h2>{t.cP2Q}</h2>
            <div className="field">
              <input autoFocus type="text" value={data.partner2Name}
                placeholder={t.cP2Ph}
                onChange={e=>upd("partner2Name", e.target.value)}
                onKeyDown={e=>{ if(e.key==="Enter" && canNext()) goNext(); }}/>
            </div>
          </div>
        );
      case "wedding_date":
        return (
          <div className="step active">
            <h2>{t.cP3Q}</h2>
            <div className="field">
              <input autoFocus type="date" value={data.weddingDate}
                onChange={e=>upd("weddingDate", e.target.value)}
                onKeyDown={e=>{ if(e.key==="Enter" && canNext()) goNext(); }}/>
            </div>
          </div>
        );
      case "wedding_location":
        return (
          <div className="step active">
            <h2>{t.cP4Q}</h2>
            <div className="field">
              <input autoFocus type="text" value={data.weddingLocation}
                placeholder={t.cP4Ph}
                onChange={e=>upd("weddingLocation", e.target.value)}
                onKeyDown={e=>{ if(e.key==="Enter" && canNext()) goNext(); }}/>
            </div>
          </div>
        );
      case "wedding_type":
        return (
          <div className="step active">
            <h2>{t.cP5Q}</h2>
            <div className="opts">
              {[["dia",t.cP5O1],["tarde-noche",t.cP5O2]].map(([v,l])=>(
                <label key={v} className="opt">
                  <input type="radio" name="wt" checked={data.weddingType===v}
                    onChange={()=>{ upd("weddingType",v); autoAdvance(); }}/>
                  <span className="dot-r"/>
                  <span className="opt-text"><span>{l}</span></span>
                </label>
              ))}
            </div>
          </div>
        );
      case "photo_expectations":
        return (
          <div className="step active">
            <h2 style={{whiteSpace:"pre-line"}}>{t.cP6Q}</h2>
            <div className="field">
              <textarea autoFocus rows="6" value={data.photoExpectations}
                placeholder={t.cP6Ph}
                onChange={e=>upd("photoExpectations", e.target.value)}/>
            </div>
          </div>
        );
      case "long_term_interest":
        return (
          <div className="step active">
            <h2 style={{whiteSpace:"pre-line"}}>{t.cP7Q}</h2>
            <div className="opts">
              {[[true,t.cP7O1],[false,t.cP7O2]].map(([v,l])=>(
                <label key={String(v)} className="opt">
                  <input type="radio" name="lti" checked={data.longTermInterest===v}
                    onChange={()=>{ upd("longTermInterest",v); autoAdvance(); }}/>
                  <span className="dot-r"/>
                  <span className="opt-text"><span>{l}</span></span>
                </label>
              ))}
            </div>
          </div>
        );
      case "email":
        return (
          <div className="step active">
            <h2>{t.cP8Q}</h2>
            <div className="field">
              <input autoFocus type="email" value={data.email}
                placeholder={t.cP8Ph}
                onChange={e=>upd("email", e.target.value)}
                onKeyDown={e=>{ if(e.key==="Enter" && canNext()) goNext(); }}/>
              {data.email.length > 3 && !canNext() ? (
                <div style={{marginTop:".6rem",fontSize:".8rem",color:"var(--muted)"}}>{t.cInvalidEmail}</div>
              ) : null}
            </div>
          </div>
        );
      default:
        return null;
    }
  }

  return (
    <section className="contact-stage wrap">
      <div className="contact-intro">
        <span className="cap">— {t.nav.contact}</span>
        <h1>{t.cTitle1}<em>{t.cTitle2}</em></h1>
        <p className="lead">{t.cSub}</p>
        <div className="contact-meta">
          {[[t.cMeta1,t.cMeta1V],[t.cMeta2,t.cMeta2V],[t.cMeta3,t.cMeta3V],[t.cMeta4,t.cMeta4V]].map(([k,v],i)=>(
            <div className="row" key={i}><span className="k">{k}</span><span>{v}</span></div>
          ))}
        </div>
      </div>
      <div className="form">
        {showProgress && (
          <React.Fragment>
            <div style={{display:"flex",justifyContent:"space-between",marginBottom:"1.4rem"}}>
              <span className="cap">{t.cStepOf} {step} {t.cOf} {total}</span>
              <span className="cap">— {cur.section}</span>
            </div>
            <div className="progress">
              {Array.from({length:total}).map((_,i)=>(
                <span key={i} style={{background:(i+1)<=step?"var(--ink)":"var(--line)"}}/>
              ))}
            </div>
          </React.Fragment>
        )}

        {cur.key === "welcome" && renderWelcome()}
        {cur.key !== "welcome" && cur.key !== "closing" && renderQuestion()}
        {cur.key === "closing" && renderClosing()}

        {submitState === "error" ? (
          <div style={{marginTop:"1.6rem",fontSize:".9rem",color:"var(--accent)"}}>{t.cSendError}</div>
        ) : null}

        {!showValidation && cur.key !== "welcome" && cur.key !== "closing"
          && cur.key !== "wedding_type" && cur.key !== "long_term_interest" && (
          <div className="step-actions">
            <button className="btn-link" disabled={step<=1} onClick={goBack}>{t.cBack}</button>
            {cur.key === "email" ? (
              <button className="btn solid" onClick={goNext}
                style={{opacity:canNext()?1:.35,pointerEvents:canNext()?"auto":"none"}}>
                <span>{submitState==="sending" ? "…" : t.cSend} →</span>
              </button>
            ) : (
              <button className="btn" onClick={goNext}
                style={{opacity:canNext()?1:.35,pointerEvents:canNext()?"auto":"none"}}>
                <span>{t.cNext} →</span>
              </button>
            )}
          </div>
        )}
      </div>
    </section>
  );
}

/* ============================================================================
   App — raíz. Maneja idioma (detección browser + persistencia) y ruta.
   Renderiza Header siempre, una de las cuatro rutas (home/liven/walther/
   academy/contact), y Footer siempre.
   ============================================================================ */
function App() {
  // Idioma con detección del browser + persistencia en localStorage.
  // Soportamos tres lenguas: EN, ES, DE. Cualquier variante "de-*" → "de",
  // cualquier "en-*" → "en", el resto cae en español por defecto (sede en Madrid).
  const [lang, setLang] = useState(() => {
    try {
      const saved = localStorage.getItem("livenLang");
      if (saved === "es" || saved === "en" || saved === "de") return saved;
      const nav = (navigator.language || "").toLowerCase();
      if (nav.startsWith("de")) return "de";
      if (nav.startsWith("en")) return "en";
      return "es";
    } catch (_) { return "es"; }
  });
  useEffect(() => {
    try { localStorage.setItem("livenLang", lang); } catch (_) {}
    document.documentElement.setAttribute("lang", lang);
  }, [lang]);

  const [route, setRoute] = useState("home");

  useReveal([route, lang]);

  const t = COPY[lang];
  const goFirma = (s) => { setRoute(s); window.scrollTo({top:0,behavior:"smooth"}); };
  const goContact = () => { setRoute("contact"); window.scrollTo({top:0,behavior:"smooth"}); };

  return (
    <React.Fragment>
      <Header route={route} setRoute={setRoute} lang={lang} setLang={setLang}/>
      <main>
        <div className={"route"+(route==="home"?" active":"")} key={"home-"+lang}>
          <Hero lang={lang}/>
          <CasaIntro lang={lang}/>
          <FirmasGrid lang={lang} goFirma={goFirma}/>
          <Manifest lang={lang}/>
          <Proceso lang={lang}/>
          <CTA lang={lang} goContact={goContact}/>
        </div>
        {["liven","walther","academy"].map(slug=>(
          <div key={slug+"-"+lang} className={"route"+(route===slug?" active":"")}>
            <FirmaPage lang={lang} slug={slug} data={buildFirmaData(slug, t)}/>
            <CTA lang={lang} goContact={goContact}/>
          </div>
        ))}
        <div className={"route"+(route==="contact"?" active":"")} key={"contact-"+lang}>
          <ContactPage lang={lang}/>
        </div>
      </main>
      <Footer lang={lang} setRoute={setRoute}/>
    </React.Fragment>
  );
}

ReactDOM.createRoot(document.getElementById("root")).render(<App/>);
