
// ============================================================
// ESTUDIO RETÓRICA · Páginas internas
// ============================================================

const RETORICA_IMAGES = {
  logo: getRetoricaAssetUrl('assets/retorica-logo.png'),
  vitaldent: getRetoricaAssetUrl('assets/vitaldent-logo.svg'),
  diada: getRetoricaAssetUrl('assets/Proyecto-nuevo-1.png'),
  matrix: getRetoricaAssetUrl('assets/matrix-events-1.png'),
  disruptivos: getRetoricaAssetUrl('assets/Logo-Disruptivos-1.png'),
  tucanes: getRetoricaAssetUrl('assets/los-tucanes.png'),
  cultural: getRetoricaAssetUrl('assets/cultural-bytes.png'),
  editorial: getRetoricaAssetUrl('assets/1.png'),
  radical: getRetoricaAssetUrl('assets/3-1.png'),
  drag: getRetoricaAssetUrl('assets/this-is-drag.png'),
  matrixSun: getRetoricaAssetUrl('assets/matrix-sun.png'),
};

const imageStyle = (url, overlay = 'linear-gradient(180deg, rgba(0,0,0,0.03) 0%, rgba(0,0,0,0.18) 100%)') => ({
  backgroundImage: `${overlay}, url(${url})`,
});

const logoImageStyle = (url) => ({
  backgroundImage: `url(${url})`,
  backgroundColor: '#fff',
  backgroundRepeat: 'no-repeat',
  backgroundPosition: 'center',
  backgroundSize: '84% auto',
});

const projectImageStyle = (project, overlay) => (
  project.logoOnly ? logoImageStyle(project.image) : (overlay ? imageStyle(project.image, overlay) : imageStyle(project.image))
);

const WHATSAPP_NUMBER = '34617492461';
const CONTACT_SERVICES = ['Identidad corporativa', 'Diseño web', 'Marketing digital', 'Contenido y audiovisual', 'Proyecto integral'];

const buildWhatsappUrl = ({ name, email, service, message }) => {
  const text = [
    'Hola, quiero hablar con Estudio Retórica.',
    '',
    `Nombre: ${name || ''}`,
    `Email: ${email || ''}`,
    `Servicio de interés: ${service || ''}`,
    'Mensaje:',
    message || '',
  ].join('\n');
  return `https://api.whatsapp.com/send/?app_absent=0&phone=${WHATSAPP_NUMBER}&text=${encodeURIComponent(text)}&type=phone_number`;
};

const portfolioProjects = [
  {
    slug: 'matrix-events',
    name: 'Matrix Events',
    category: 'Eventos',
    summary: 'Identidad con fuerza visual para marcas y activaciones que necesitan presencia inmediata.',
    image: RETORICA_IMAGES.matrix,
    featured: true,
    span: 'page-card--span-6',
    services: ['Branding', 'Piezas de comunicación', 'Sistema de marca'],
    impact: 'Refuerza presencia, lectura y recordación en escenarios, piezas y formatos promocionales.',
    challenge: 'Necesidad de una identidad con lectura instantánea y suficiente presencia para convivir con entornos de alta energía visual.',
    approach: 'Se construyó un lenguaje de marca de contraste alto y aplicaciones directas para piezas, escenarios y activos promocionales.',
    deliverables: ['Identidad visual', 'Sistema cromático', 'Piezas de comunicación', 'Material promocional'],
    result: 'Un caso que transmite seguridad, impacto y una sensación de marca lista para operar en contextos presenciales.',
    related: ['disruptivos', 'diada-tec', 'matrix-sun-festival'],
  },
  {
    slug: 'vitaldent',
    name: 'Vitaldent',
    category: 'Activaciones',
    summary: 'Street Marketing y buzoneo para llevar la marca al territorio y activar contacto directo con nuevos pacientes.',
    image: RETORICA_IMAGES.vitaldent,
    website: 'https://www.vitaldent.com/',
    logoOnly: true,
    span: 'page-card--span-4',
    services: ['Street Marketing', 'Buzoneo', 'Activación local'],
    impact: 'Refuerza presencia de marca en calle y apoya la captación local con una acción física, directa y reconocible.',
    challenge: 'Acercar una marca reconocida a zonas de interés con una acción clara, visible y orientada a generar recordación.',
    approach: 'Se planteó una activación de calle y reparto segmentado para conectar la comunicación con recorridos cotidianos del público.',
    deliverables: ['Street Marketing', 'Buzoneo', 'Material promocional', 'Activación local'],
    result: 'Un caso de presencia territorial que convierte visibilidad física en contacto y recordación de marca.',
    related: ['matrix-events', 'cultural-bytes', 'this-is-drag'],
  },
  {
    slug: 'disruptivos',
    name: 'Disruptivos',
    category: 'Contenido',
    summary: 'Un universo gráfico más expresivo para video, podcast y comunicación digital.',
    image: RETORICA_IMAGES.disruptivos,
    featured: true,
    span: 'page-card--span-6',
    services: ['Branding', 'Contenido', 'Audiovisual'],
    impact: 'Permite adaptar la marca a covers, redes, reels y piezas editoriales con coherencia.',
    challenge: 'La marca debía sostenerse en múltiples formatos digitales y conservar personalidad sin perder claridad.',
    approach: 'Se enfatizó flexibilidad visual para portadas, activos sociales, piezas audiovisuales y contenidos editoriales.',
    deliverables: ['Sistema de marca', 'Assets para contenido', 'Aplicaciones para digital', 'Base visual para audiovisual'],
    result: 'Una identidad lista para moverse con facilidad entre contenido, social media y formatos audiovisuales.',
    related: ['cultural-bytes', 'this-is-drag', 'matrix-sun-festival'],
  },
  {
    slug: 'diada-tec',
    name: 'Diada Tec',
    category: 'Branding',
    summary: 'Lenguaje visual limpio y corporativo para una marca con lectura clara y actual.',
    image: RETORICA_IMAGES.diada,
    span: 'page-card--span-4',
    services: ['Logo', 'Aplicaciones', 'Sistema visual'],
    impact: 'Aporta solidez comercial y una presencia que se siente profesional desde el primer vistazo.',
    challenge: 'Conseguir una presentación más técnica y confiable sin recargar la comunicación.',
    approach: 'Se trabajó una estética limpia y ordenada, útil para lectura rápida y percepción corporativa.',
    deliverables: ['Logo', 'Sistema visual', 'Aplicaciones base'],
    result: 'Una marca con mejor balance entre claridad, profesionalismo y adaptabilidad.',
    related: ['matrix-sun-festival', 'disruptivos', 'radical-trainer'],
  },
  {
    slug: 'los-tucanes',
    name: 'Los Tucanes',
    category: 'Branding',
    summary: 'Propuesta gráfica directa y llamativa para públicos de consumo masivo.',
    image: RETORICA_IMAGES.tucanes,
    span: 'page-card--span-4',
    services: ['Marca', 'Piezas promocionales', 'Aplicación visual'],
    impact: 'Favorece una comunicación popular, rápida y con alta visibilidad.',
    challenge: 'Lograr una comunicación popular y visible que sostuviera recordación.',
    approach: 'Se impulsó una línea gráfica frontal y reconocible, pensada para captar rápido.',
    deliverables: ['Marca', 'Piezas promocionales', 'Aplicaciones visuales'],
    result: 'Una propuesta más visible para públicos amplios y contextos de alta exposición.',
    related: ['matrix-events', 'cultural-bytes', 'this-is-drag'],
  },
  {
    slug: 'cultural-bytes',
    name: 'Cultural Bytes',
    category: 'Digital',
    summary: 'Activos pensados para entornos educativos, comunicación digital y recordación de marca.',
    image: RETORICA_IMAGES.cultural,
    span: 'page-card--span-4',
    services: ['Digital', 'Contenido', 'Branding'],
    impact: 'Hace más clara la conexión entre identidad, comunidad y piezas digitales.',
    challenge: 'Unir comunidad, educación y marca dentro de una presencia visual clara.',
    approach: 'Se desarrolló una base gráfica flexible para piezas digitales y comunicación recurrente.',
    deliverables: ['Assets digitales', 'Sistema visual', 'Piezas de comunicación'],
    result: 'Una identidad más lista para habitar entornos digitales y contenidos continuos.',
    related: ['disruptivos', 'this-is-drag', 'matrix-sun-festival'],
  },
  {
    slug: 'proyecto-editorial',
    name: 'Proyecto editorial',
    category: 'Branding',
    summary: 'Piezas editoriales y de marca para elevar la percepción premium.',
    image: RETORICA_IMAGES.editorial,
    span: 'page-card--span-4',
    services: ['Editorial', 'Branding', 'Comunicación'],
    impact: 'Aporta narrativa visual y una sensación de cuidado superior.',
    challenge: 'Construir piezas que comunicaran mayor cuidado y refinamiento.',
    approach: 'Se priorizó una dirección visual sobria y editorial para reforzar valor percibido.',
    deliverables: ['Piezas editoriales', 'Branding support', 'Comunicación'],
    result: 'Una propuesta más premium y con mejor lectura visual.',
    related: ['disruptivos', 'radical-trainer', 'diada-tec'],
  },
  {
    slug: 'radical-trainer',
    name: 'Radical Trainer',
    category: 'Branding',
    summary: 'Marca con presencia contundente y look deportivo/comercial.',
    image: RETORICA_IMAGES.radical,
    span: 'page-card--span-4',
    services: ['Logo', 'Aplicaciones', 'Branding'],
    impact: 'Construye una presencia fuerte que se reconoce rápido incluso en formatos grandes.',
    challenge: 'Generar una identidad potente y legible para una marca con energía alta.',
    approach: 'Se definió un system fuerte de contraste y lectura rápida para piezas físicas y digitales.',
    deliverables: ['Logo', 'Aplicaciones', 'Branding'],
    result: 'Una presencia contundente que comunica energía y recordación.',
    related: ['matrix-events', 'matrix-sun-festival', 'proyecto-editorial'],
  },
  {
    slug: 'this-is-drag',
    name: 'This Is Drag',
    category: 'Digital',
    summary: 'Diseño y desarrollo web a medida para una plataforma de espectáculos y activaciones de drag queens.',
    image: RETORICA_IMAGES.drag,
    website: 'https://thisisdrag.es/',
    span: 'page-card--span-4',
    services: ['Diseño web', 'Desarrollo web', 'Optimización SEO'],
    impact: 'Aporta una experiencia visual impactante, rápida y optimizada para la reserva y promoción de eventos.',
    challenge: 'Traducir la energía vibrante y colorida del espectáculo drag a un entorno web limpio, accesible y comercialmente enfocado.',
    approach: 'Se diseñó una interfaz en modo oscuro con acentos neón de alto contraste y animaciones fluidas que conectan de inmediato con la audiencia.',
    deliverables: ['Arquitectura de información', 'Diseño de interfaz (UI)', 'Desarrollo Frontend', 'Optimización de velocidad'],
    result: 'Un portal dinámico que no solo proyecta la identidad del show, sino que duplica el interés en cotizaciones y reservas.',
    related: ['cultural-bytes', 'disruptivos', 'matrix-sun-festival'],
  },
  {
    slug: 'matrix-sun-festival',
    name: 'Matrix Sun Festival',
    category: 'Digital',
    summary: 'Rediseño completo del sitio raíz de Matrix Events y desarrollo de la landing page para el Matrix Sun Festival.',
    image: RETORICA_IMAGES.matrixSun,
    website: 'https://matrixevents.es/events/matrix-sun-festival/',
    span: 'page-card--span-4',
    services: ['Rediseño web', 'UI/UX', 'Optimización móvil'],
    impact: 'Una presencia online premium que facilita la venta directa de entradas y consolida la identidad digital de la marca.',
    challenge: 'Unificar la comunicación de la marca raíz con la energía y especificidad de su festival principal, mejorando el embudo de conversión en móviles.',
    approach: 'Se reestructuró el sitio completo con una estética limpia, dándole protagonismo al contenido visual y un proceso de compra de entradas en dos clics.',
    deliverables: ['Rediseño de sitio raíz', 'Landing de Matrix Sun Festival', 'Estructura de conversión', 'Desarrollo responsive'],
    result: 'Una experiencia unificada que incrementa la venta de entradas online y proyecta el posicionamiento internacional del festival.',
    related: ['matrix-events', 'this-is-drag', 'diada-tec'],
  },
];

const portfolioFilters = ['Todos', 'Branding', 'Digital', 'Contenido', 'Eventos', 'Activaciones'];

const getProjectBySlug = (slug) => portfolioProjects.find((item) => item.slug === slug) || portfolioProjects[0];



const usePortfolioPointer = (ref) => {
  React.useEffect(() => {
    const node = ref.current;
    if (!node) return;

    const setPosition = (clientX, clientY) => {
      const rect = node.getBoundingClientRect();
      const x = clientX - rect.left;
      const y = clientY - rect.top;
      const px = rect.width ? x / rect.width : 0.5;
      const py = rect.height ? y / rect.height : 0.5;
      node.style.setProperty('--mx', `${(px * 100).toFixed(2)}%`);
      node.style.setProperty('--my', `${(py * 100).toFixed(2)}%`);
      node.style.setProperty('--rx', `${(py - 0.5) * -9}deg`);
      node.style.setProperty('--ry', `${(px - 0.5) * 10}deg`);
    };

    const reset = () => {
      node.style.setProperty('--mx', '50%');
      node.style.setProperty('--my', '50%');
      node.style.setProperty('--rx', '0deg');
      node.style.setProperty('--ry', '0deg');
    };

    reset();
    const onMove = (event) => setPosition(event.clientX, event.clientY);
    const onTouchMove = (event) => {
      const touch = event.touches && event.touches[0];
      if (touch) setPosition(touch.clientX, touch.clientY);
    };
    node.addEventListener('mousemove', onMove);
    node.addEventListener('touchmove', onTouchMove, { passive: true });
    node.addEventListener('mouseleave', reset);
    return () => {
      node.removeEventListener('mousemove', onMove);
      node.removeEventListener('touchmove', onTouchMove);
      node.removeEventListener('mouseleave', reset);
    };
  }, [ref]);
};

const PortfolioMotionStage = () => {
  const stageProjects = [getProjectBySlug('matrix-sun-festival'), getProjectBySlug('this-is-drag'), getProjectBySlug('radical-trainer'), getProjectBySlug('disruptivos'), getProjectBySlug('cultural-bytes'), getProjectBySlug('matrix-events')];
  const [active, setActive] = React.useState(stageProjects[0]);
  const [pulses, setPulses] = React.useState([]);
  const ref = React.useRef(null);
  usePortfolioPointer(ref);

  const launchPulse = (event) => {
    const rect = ref.current.getBoundingClientRect();
    const pulse = {
      id: `${Date.now()}-${Math.random()}`,
      x: event.clientX - rect.left,
      y: event.clientY - rect.top,
    };
    setPulses((current) => [...current, pulse]);
    window.setTimeout(() => setPulses((current) => current.filter((item) => item.id !== pulse.id)), 700);
  };

  return (
    <section className="page-shell page-shell--tight">
      <div ref={ref} className="portfolio-motion" data-reveal onClick={launchPulse}>
        <div className="portfolio-motion__backdrop" aria-hidden="true">
          <div className="portfolio-motion__grid" />
          {pulses.map((pulse) => (
            <span key={pulse.id} className="portfolio-motion__pulse" style={{ left: pulse.x, top: pulse.y }} />
          ))}
        </div>

        <div className="portfolio-motion__copy">
          <div className="page-card__meta" style={{ color: 'rgba(254,234,0,0.76)' }}>Laboratorio de proyectos</div>
          <h2 className="t-display-sm" style={{ marginTop: 14, color: '#fff' }}>Una entrada interactiva para que el portafolio proyecte mejor el alcance creativo y estratégico de Retórica.</h2>
          <p className="t-body" style={{ marginTop: 16, color: 'rgba(255,255,255,0.76)' }}>
            Cada proyecto activa una lectura distinta del portafolio para mostrar cómo Retórica resuelve branding, diseño web, contenido y comunicación con un criterio visual consistente.
          </p>
          <div className="portfolio-motion__chips">
            {active.services.map((service) => <span key={service} className="chip chip--dark">{service}</span>)}
          </div>
          <div className="portfolio-motion__actions">
            <a href={`/caso/?project=${active.slug}`} className="btn btn--primary btn--lg">Ver caso</a>
            <a href="/contacto/#contact" className="btn btn--ghost btn--lg">Quiero algo así</a>
          </div>
        </div>

        <div className="portfolio-motion__visual">
          <div className="portfolio-motion__main" style={projectImageStyle(active, 'linear-gradient(180deg, rgba(0,0,0,0.12) 0%, rgba(0,0,0,0.36) 100%)')}>
            <div className="portfolio-motion__label">{active.name}</div>
            <div className="portfolio-motion__summary">{active.summary}</div>
          </div>
          <div className="portfolio-motion__switches">
            {stageProjects.map((item) => (
              <button
                key={item.slug}
                type="button"
                className={`portfolio-motion__switch ${active.slug === item.slug ? 'is-active' : ''}`}
                onClick={(event) => {
                  event.stopPropagation();
                  setActive(item);
                }}
              >
                <span>{item.name}</span>
                <small>{item.category}</small>
              </button>
            ))}
          </div>
        </div>
      </div>
    </section>
  );
};

const PortfolioPage = () => {
  const [filter, setFilter] = React.useState('Todos');
  const [activeProject, setActiveProject] = React.useState(portfolioProjects[0]);

  const visibleProjects = filter === 'Todos'
    ? portfolioProjects
    : portfolioProjects.filter((item) => item.category === filter);

  React.useEffect(() => {
    if (!visibleProjects.find((item) => item.name === activeProject.name)) {
      setActiveProject(visibleProjects[0] || portfolioProjects[0]);
    }
  }, [filter]);

  return (
    <>
      <PageHeader
        eyebrow="Portafolio"
        title={<>Casos y clientes que convierten el trabajo en prueba social visible.</>}
        subtitle="Una selección de marcas y proyectos donde Retórica convirtió estrategia, diseño y contenido en una presencia más fuerte y vendible."
        ctaLabel="Ir a contacto"
      />

      <section className="page-shell page-shell--tight">
        <div className="page-showcase page-showcase--dark" data-reveal>
          <div className="page-showcase__content">
            <div className="page-card__meta" style={{ color: 'rgba(254,234,0,0.72)' }}>Selección destacada</div>
            <h2 className="t-display-sm" style={{ marginTop: 12, color: '#fff' }}>Una vitrina de marcas que ya pasaron del concepto a una presencia con carácter.</h2>
            <p className="t-body" style={{ marginTop: 14, color: 'rgba(255,255,255,0.72)' }}>
              Cada proyecto revela una parte del criterio de Retórica: marcas que se ven mejor, comunican mejor y llegan con más fuerza a su audiencia.
            </p>
            <div className="page-showcase__chips">
              {['Branding', 'Digital', 'Contenido', 'Eventos', 'Identidad visual'].map((item) => (
                <span key={item} className="chip chip--dark">{item}</span>
              ))}
            </div>
          </div>
          <div className="page-showcase__visual page-showcase__visual--logo">
            <div className="page-showcase__brand-mark" aria-hidden="true">R</div>
            <img src={RETORICA_IMAGES.logo} alt="Estudio Retorica" />
          </div>
        </div>
      </section>

      <PortfolioMotionStage />

      <section className="page-shell page-shell--tight">
        <div className="page-filterbar" data-reveal>
          {portfolioFilters.map((item) => (
            <button
              key={item}
              type="button"
              className={`page-filterbar__button ${filter === item ? 'is-active' : ''}`}
              onClick={() => setFilter(item)}
            >
              {item}
            </button>
          ))}
        </div>

        <div className="page-grid page-grid--portfolio page-grid--cards-v5">
          {visibleProjects.map((item) => (
            <article
              key={item.name}
              className={`page-card page-card--portfolio page-card--interactive ${activeProject.name === item.name ? 'is-active' : ''}`}
>
              <div className="page-card__media" style={projectImageStyle(item)} />
              <div className="page-card__body">
                <div className="page-card__meta">{item.category}</div>
                <div className="page-card__title">{item.name}</div>
                <div className="page-card__text">{item.summary}</div>
                <div className="page-card__chips">
                  {item.services.slice(0, 3).map((service) => <span key={service} className="chip">{service}</span>)}
                </div>
                <div className="page-card__actions">
                  <button type="button" className="btn btn--secondary btn--sm" onClick={() => setActiveProject(item)}>Ver en foco</button>
                  <a href={`/caso/?project=${item.slug}`} className="btn btn--primary btn--sm">Ver caso</a>
                </div>
              </div>
            </article>
          ))}
        </div>
      </section>

      <section className="page-shell page-shell--tight">
        <div className="portfolio-focus" data-reveal>
          <div className="portfolio-focus__media" style={projectImageStyle(activeProject, 'linear-gradient(180deg, rgba(0,0,0,0.06) 0%, rgba(0,0,0,0.3) 100%)')} />
          <div className="portfolio-focus__body">
            <div className="page-card__meta">Proyecto en foco</div>
            <h2 className="t-display-sm" style={{ marginTop: 12 }}>{activeProject.name}</h2>
            <p className="t-body" style={{ marginTop: 14, color: 'var(--fg-muted)' }}>{activeProject.impact}</p>
            <div className="portfolio-focus__tags">
              {activeProject.services.map((item) => (
                <span key={item} className="chip">{item}</span>
              ))}
            </div>
            <div className="portfolio-focus__cta">
              <a href={`/caso/?project=${activeProject.slug}`} className="btn btn--primary btn--lg">Ver caso completo</a>
              {activeProject.website && <a href={activeProject.website} target="_blank" rel="noopener" className="btn btn--secondary btn--lg">Ver sitio</a>}
              <a href="/contacto/#contact" className="btn btn--secondary btn--lg">Quiero un proyecto así</a>
            </div>
          </div>
        </div>
      </section>

      <section className="page-shell">
        <div className="portfolio-logo-strip">
          {portfolioProjects.map((item, index) => (
            <div key={`${item.name}-${index}`} className="portfolio-logo-strip__item" data-reveal>
              <img src={item.image} alt={item.name} loading="lazy" />
              <span>{item.name}</span>
            </div>
          ))}
        </div>
      </section>
    </>
  );
};

const CasePage = () => {
  const search = new URLSearchParams(window.location.search);
  const project = getProjectBySlug(search.get('project'));
  const relatedProjects = project.related.map((slug) => getProjectBySlug(slug)).filter(Boolean);

  return (
    <>
      <PageHeader
        eyebrow={project.category}
        title={<>{project.name}</>}
        subtitle={project.summary}
        bg="black"
        ctaLabel="Solicitar propuesta"
        ctaHref="/contacto/#contact"
      />

      <section className="page-shell page-shell--tight">
        <div className="case-hero" data-reveal>
          <div className="case-hero__media" style={projectImageStyle(project, 'linear-gradient(180deg, rgba(0,0,0,0.06) 0%, rgba(0,0,0,0.24) 100%)')} />
          <div className="case-hero__body">
            <div className="page-card__meta">Resumen del caso</div>
            <h2 className="t-display-sm" style={{ marginTop: 12 }}>Un caso para ver cómo Retórica convierte intención en presencia de marca.</h2>
            <p className="t-body" style={{ marginTop: 16, color: 'var(--fg-muted)' }}>{project.impact}</p>
            <div className="case-hero__chips">
              {project.services.map((item) => <span key={item} className="chip">{item}</span>)}
            </div>
            <div className="case-hero__actions">
              <a href="/portafolio/" className="btn btn--secondary btn--lg">Volver al portafolio</a>
              {project.website && <a href={project.website} target="_blank" rel="noopener" className="btn btn--secondary btn--lg">Ver sitio</a>}
              <a href="/contacto/#contact" className="btn btn--primary btn--lg">Quiero una propuesta</a>
            </div>
          </div>
        </div>
      </section>

      <section className="page-shell page-shell--tight">
        <div className="case-facts">
          {[
            ['Reto', project.challenge],
            ['Enfoque', project.approach],
            ['Entregables', project.deliverables.join(' · ')],
            ['Resultado', project.result],
          ].map(([title, text]) => (
            <article key={title} className="case-facts__item" data-reveal>
              <div className="page-card__meta">{title}</div>
              <p className="t-body" style={{ marginTop: 12, color: 'var(--fg-muted)' }}>{text}</p>
            </article>
          ))}
        </div>
      </section>

      <section className="page-shell page-shell--tight">
        <div className="case-related-head" data-reveal>
          <div>
            <div className="t-eyebrow" style={{ color: 'rgba(0,0,0,0.56)' }}>Más trabajo</div>
            <h2 className="t-display-sm" style={{ marginTop: 16 }}>Otros casos para seguir recorriendo el trabajo del estudio.</h2>
          </div>
          <a href="/portafolio/" className="btn btn--secondary btn--lg">Ver todos</a>
        </div>
        <div className="page-grid page-grid--related page-grid--cards-v5">
          {relatedProjects.map((item) => (
            <article key={item.slug} className="page-card page-card--related" data-reveal>
              <div className="page-card__media" style={projectImageStyle(item)} />
              <div className="page-card__body">
                <div className="page-card__meta">{item.category}</div>
                <div className="page-card__title">{item.name}</div>
                <div className="page-card__text">{item.summary}</div>
                <div className="page-card__actions">
                  <a href={`/caso/?project=${item.slug}`} className="btn btn--primary btn--sm">Abrir caso</a>
                </div>
              </div>
            </article>
          ))}
        </div>
      </section>

      <section className="page-shell page-shell--tight">
        <div className="case-cta" data-reveal>
          <div>
            <div className="t-eyebrow" style={{ color: 'rgba(254,234,0,0.72)' }}>Siguiente paso</div>
            <h2 className="t-display-sm" style={{ marginTop: 12, color: '#fff' }}>¿Quieres una página, identidad o campaña con este nivel de presencia?</h2>
            <p className="t-body" style={{ marginTop: 16, color: 'rgba(255,255,255,0.72)', maxWidth: 760 }}>
              El sitio ya incluye brief inicial y contacto por WhatsApp para empezar una propuesta con mejor contexto desde el primer mensaje.
            </p>
          </div>
          <div className="case-cta__actions">
            <a href="/contacto/#contact" className="btn btn--primary btn--lg">Solicitar propuesta</a>
            <a href="/brief/" className="btn btn--ghost btn--lg">Completar brief</a>
          </div>
        </div>
      </section>
    </>
  );
};

const ServicesPage = () => (
  <>
    <PageHeader
      eyebrow="Servicios"
      title={<>Retórica articula branding, desarrollo web, marketing y contenido dentro de una sola propuesta de agencia.</>}
      subtitle="Branding, desarrollo web, marketing digital y contenido articulados para que una marca gane presencia, orden y capacidad comercial."
      bg="black"
      ctaLabel="Ver portafolio"
      ctaHref="/portafolio/"
    />
    <section className="page-shell">
      <div className="info-split">
        <div className="info-panel info-panel--black" data-reveal>
          <div className="t-eyebrow" style={{ color: 'var(--brand-yellow)' }}>Capacidades</div>
          <h2 className="t-display-sm" style={{ marginTop: 14 }}>Una oferta más clara, estratégica y orientada a conversión.</h2>
          <ul className="info-list" style={{ color: 'rgba(255,255,255,0.78)' }}>
            {['Identidad corporativa', 'Diseño web', 'Gestión de redes sociales', 'Buzoneo y street marketing', 'Posicionamiento web y marketing', 'Audiovisual y podcast'].map((item) => (
              <li key={item}><Icon name="check" size={16} color="#FEEA00" /> {item}</li>
            ))}
          </ul>
        </div>
        <div className="info-panel" data-reveal>
          <div className="page-card__meta">Qué comunica esta página</div>
          <h3 className="t-h2" style={{ marginTop: 10 }}>Todo lo que una marca necesita para verse mejor y vender con más fuerza.</h3>
          <p className="t-body" style={{ marginTop: 16, color: 'var(--fg-muted)' }}>
            Retórica conecta identidad, web, marketing y contenido para que la marca tenga una base coherente, atractiva y lista para salir a buscar resultados.
          </p>
        </div>
      </div>

      <div className="hp-services__grid" style={{ marginTop: 28 }}>
        {[
          {
            n: '01', title: 'Identidad corporativa',
            desc: 'Sistema visual, presentaciones, aplicaciones y tono verbal para construir reconocimiento.',
            items: ['Logo y versiones', 'Paleta y tipografía', 'Aplicaciones de marca', 'Piezas de presentación'],
          },
          {
            n: '02', title: 'Diseño web',
            desc: 'Sitios a medida que presentan mejor el valor de la marca y funcionan como escaparate para clientes y oportunidades.',
            items: ['Home comercial', 'Páginas de servicio', 'Portafolio visual', 'Formularios y CTA'],
          },
          {
            n: '03', title: 'Redes, SEO y marketing',
            desc: 'Una misma base para social media, posicionamiento web, contenido y campañas online.',
            items: ['Gestión de redes', 'Contenido editorial', 'SEO y captación', 'Landing de campaña'],
          },
          {
            n: '04', title: 'Audiovisual y activaciones',
            desc: 'La propuesta también cubre reels, podcast, piezas visuales, fotografía, video y marketing directo.',
            items: ['Video y podcast', 'Fotografía', 'Street marketing', 'Buzoneo'],
          },
        ].map((item) => (
          <article key={item.title} className="hp-service" data-reveal>
            <div className="hp-service__head">
              <div className="hp-service__n">{item.n}</div>
              <Icon name="arrow-up-right" size={18} color="#050505" />
            </div>
            <h3 className="t-h2" style={{ marginTop: 16 }}>{item.title}</h3>
            <p className="t-body" style={{ marginTop: 12, color: 'var(--fg-muted)' }}>{item.desc}</p>
            <ul className="hp-service__items">
              {item.items.map((sub) => <li key={sub}><Icon name="check" size={16} color="#050505" /> {sub}</li>)}
            </ul>
          </article>
        ))}
      </div>
    </section>
  </>
);

const StudioPage = () => (
  <>
    <PageHeader
      eyebrow="Estudio"
      title={<>Retórica pone el discurso en el centro para convertir marcas en presencia, presencia en confianza y confianza en negocio.</>}
      subtitle="Una agencia donde la estrategia verbal, la identidad visual y la ejecución digital trabajan juntas para mover una marca con más claridad y más intención."
      ctaLabel="Ver servicios"
      ctaHref="/servicios/"
    />
    <section className="page-shell">
      <div className="info-split">
        <div className="info-panel" data-reveal>
          <div className="page-card__meta">Qué define esta propuesta</div>
          <h2 className="t-display-sm" style={{ marginTop: 12 }}>Una agencia que piensa, diseña y activa marcas con una lógica clara de crecimiento.</h2>
          <p className="t-body" style={{ marginTop: 16, color: 'var(--fg-muted)' }}>
            Retórica trabaja desde una idea simple y poderosa: cuando el mensaje está bien construido, la marca se siente más sólida, el sitio convence más y el marketing encuentra mejor dirección.
          </p>
        </div>
        <div className="info-panel info-panel--black" data-reveal>
          <div className="page-card__meta" style={{ color: 'rgba(254,234,0,0.72)' }}>Principios</div>
          <ul className="info-list" style={{ color: 'rgba(255,255,255,0.78)', marginTop: 18 }}>
            {['Propuesta de valor entendible desde la home', 'Más dinamismo sin sacrificar claridad', 'Portafolio organizado para explicar mejor el trabajo', 'Canales de contacto listos para convertir'].map((item) => (
              <li key={item}><Icon name="check" size={16} color="#FEEA00" /> {item}</li>
            ))}
          </ul>
        </div>
      </div>

      <div className="timeline">
        {[
          ['01', 'Atracción', 'La primera pantalla comunica mejor el perfil de agencia, su tono y la amplitud de servicios que puede articular.'],
          ['02', 'Confianza', 'Los proyectos, clientes y casos funcionan como prueba visible del criterio y la capacidad de ejecución de Retórica.'],
          ['03', 'Conversión', 'Brief, correo y WhatsApp facilitan el inicio de la conversación, la solicitud de propuesta y la maduración del lead.'],
        ].map(([year, title, text]) => (
          <div key={title} className="timeline__item" data-reveal>
            <div className="timeline__year">{year}</div>
            <div>
              <div className="t-h4">{title}</div>
              <p className="t-body" style={{ marginTop: 8, color: 'var(--fg-muted)' }}>{text}</p>
            </div>
          </div>
        ))}
      </div>
    </section>
  </>
);


const JournalContactSection = () => {
  const [sent, setSent] = React.useState(false);
  const [waUrl, setWaUrl] = React.useState('');
  const [form, setForm] = React.useState({
    name: '',
    email: '',
    service: CONTACT_SERVICES[0],
    message: '',
  });

  const handleChange = (key, value) => setForm((prev) => ({ ...prev, [key]: value }));

  const handleSubmit = (e) => {
    e.preventDefault();
    const url = buildWhatsappUrl(form);
    setWaUrl(url);
    setSent(true);
    window.open(url, '_blank', 'noopener');
  };

  return (
    <section className="hp-contact" id="contact">
      <div className="hp-contact__inner">
        <div className="hp-contact__panel" data-reveal>
          <div className="t-eyebrow" style={{ color: 'rgba(254,234,0,0.72)' }}>Formulario de contacto</div>
          <h2 className="t-display-sm" style={{ marginTop: 16, color: '#fff' }}>Cuéntanos qué necesita tu marca y llevemos la conversación a una propuesta clara.</h2>
          <p className="t-body" style={{ marginTop: 16, color: 'rgba(255,255,255,0.74)' }}>
            Si ya tienes una idea, un sitio por mejorar, una campaña por lanzar o una marca por ordenar, este formulario ayuda a que Retórica reciba el contexto correcto desde el primer mensaje.
          </p>
          <div className="hp-contact__quick">
            <a href="mailto:direccion@estudioretorica.com" className="hp-contact__quick-item">
              <Icon name="mail" size={18} color="#FEEA00" />
              <div>
                <div className="t-caption" style={{ color: 'rgba(255,255,255,0.56)' }}>Correo</div>
                <div className="t-h4" style={{ color: '#fff', marginTop: 2 }}>direccion@estudioretorica.com</div>
              </div>
            </a>
            <a href={`https://api.whatsapp.com/send/?app_absent=0&phone=${WHATSAPP_NUMBER}&text=&type=phone_number`} className="hp-contact__quick-item">
              <Icon name="phone" size={18} color="#FEEA00" />
              <div>
                <div className="t-caption" style={{ color: 'rgba(255,255,255,0.56)' }}>WhatsApp</div>
                <div className="t-h4" style={{ color: '#fff', marginTop: 2 }}>+34 617492461</div>
              </div>
            </a>
            <a href="/brief/" className="hp-contact__quick-item">
              <Icon name="download" size={18} color="#FEEA00" />
              <div>
                <div className="t-caption" style={{ color: 'rgba(255,255,255,0.56)' }}>Brief inicial</div>
                <div className="t-h4" style={{ color: '#fff', marginTop: 2 }}>Completar brief</div>
              </div>
            </a>
          </div>
        </div>

        <form className="hp-contact__form" data-reveal onSubmit={handleSubmit}>
          {!sent ? (
            <>
              <div className="field">
                <label className="field__label">Nombre</label>
                <input className="input" placeholder="Tu nombre" value={form.name} onChange={(e) => handleChange('name', e.target.value)} required />
              </div>
              <div className="field">
                <label className="field__label">Email</label>
                <input className="input" type="email" placeholder="tu@empresa.com" value={form.email} onChange={(e) => handleChange('email', e.target.value)} required />
              </div>
              <div className="field" style={{ gridColumn: '1 / -1' }}>
                <label className="field__label">Servicio</label>
                <div className="hp-contact__budget">
                  {CONTACT_SERVICES.map((service) => (
                    <label key={service} className="hp-contact__budget-item">
                      <input type="radio" name="service" checked={form.service === service} onChange={() => handleChange('service', service)} />
                      {service}
                    </label>
                  ))}
                </div>
              </div>
              <div className="field" style={{ gridColumn: '1 / -1' }}>
                <label className="field__label">Mensaje</label>
                <textarea className="input" rows="6" placeholder="Cuéntanos qué objetivo tienes, qué necesitas resolver y en qué plazo quieres avanzar." style={{ minHeight: 160, resize: 'vertical' }} value={form.message} onChange={(e) => handleChange('message', e.target.value)} required />
              </div>
              <div style={{ gridColumn: '1 / -1', display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: 16, flexWrap: 'wrap' }}>
                <span className="t-caption" style={{ color: 'rgba(255,255,255,0.56)' }}>Al enviar, se abrirá WhatsApp con un mensaje estructurado para continuar la conversación con Retórica.</span>
                <button className="btn btn--primary btn--lg" type="submit">Enviar por WhatsApp</button>
              </div>
            </>
          ) : (
            <div className="hp-contact__sent">
              <div className="t-h2" style={{ color: '#fff' }}>Mensaje preparado.</div>
              <p className="t-body" style={{ marginTop: 12, color: 'rgba(255,255,255,0.78)' }}>
                Si WhatsApp no se abrió automáticamente, usa el botón de abajo para continuar con la información ya cargada.
              </p>
              <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', marginTop: 18 }}>
                <a href={waUrl} className="btn btn--primary btn--lg" target="_blank" rel="noreferrer">Abrir WhatsApp</a>
                <button type="button" className="btn btn--ghost btn--lg" onClick={() => setSent(false)}>Editar datos</button>
              </div>
            </div>
          )}
        </form>
      </div>
    </section>
  );
};

const JournalPage = () => (
  <>
    <PageHeader
      eyebrow="Contacto y briefing"
      title={<>Canales y recursos para iniciar una conversación clara con Retórica y activar un proyecto de marca, web o marketing.</>}
      subtitle="Todo lo necesario para iniciar una conversación con criterio: brief, portafolio, casos y contacto directo con la agencia."
      bg="black"
      ctaLabel="Ir al formulario"
      ctaHref="#contact"
    />
    <section className="page-shell">
      <div className="resource-list">
        {[
          ['Brief', 'Brief inicial interactivo', 'Recurso para ordenar objetivos, alcance, entregables y tiempos antes de cotizar.', '/brief/'],
          ['Canal directo', 'direccion@estudioretorica.com', 'Correo principal del estudio.', 'mailto:direccion@estudioretorica.com'],
          ['WhatsApp', '+34 617492461', 'Canal directo publicado en el sitio oficial.', 'https://api.whatsapp.com/send/?app_absent=0&phone=34617492461&text=&type=phone_number'],
          ['Portafolio', 'Portafolio de proyectos', 'Selección visible de clientes y casos del estudio.', '/portafolio/'],
          ['Caso destacado', 'Matrix Events', 'Ejemplo de página de caso dentro de esta versión del sitio.', '/caso/?project=matrix-events'],
        ].map(([tag, title, desc, href]) => (
          <a key={title} href={href} className="resource-item" data-reveal>
            <span className="resource-item__tag">{tag}</span>
            <div>
              <div className="t-h4">{title}</div>
              <div className="t-body-sm" style={{ color: 'var(--fg-muted)', marginTop: 6 }}>{desc}</div>
            </div>
            <Icon name="arrow-up-right" size={18} color="#050505" />
          </a>
        ))}
      </div>

      <div className="info-split" style={{ marginTop: 28 }}>
        <div className="info-panel" data-reveal>
          <div className="page-card__meta">Qué enviar para cotizar más rápido</div>
          <ul className="info-list">
            {['Objetivo del proyecto', 'Tipo de servicio requerido', 'Fechas o urgencia', 'Referencias visuales', 'Canal de contacto preferido'].map((item) => (
              <li key={item}><Icon name="check" size={16} color="#050505" /> {item}</li>
            ))}
          </ul>
        </div>
        <div className="info-panel info-panel--black" data-reveal>
          <div className="page-card__meta" style={{ color: 'rgba(254,234,0,0.72)' }}>Atajo comercial</div>
          <h3 className="t-h2" style={{ marginTop: 10 }}>La ruta más simple para iniciar es brief + WhatsApp + contexto claro.</h3>
          <p className="t-body" style={{ marginTop: 16, color: 'rgba(255,255,255,0.74)' }}>
            Primero puedes completar el brief y luego abrir WhatsApp o escribir por correo con un contexto mejor planteado. Esa secuencia reduce fricción y hace más útil la conversación inicial con la agencia.
          </p>
          <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', marginTop: 22 }}>
            <a href="/brief/" className="btn btn--primary btn--lg">Abrir brief</a>
            <a href="#contact" className="btn btn--ghost btn--lg">Ir al formulario</a>
          </div>
        </div>
      </div>
    </section>
    <JournalContactSection />
  </>
);
