// landing.jsx — Salud de Diva landing
const { useState, useEffect, useRef } = React;

// ─────────────────────────────────────────────────────────────────────────────
// Data
// ─────────────────────────────────────────────────────────────────────────────

const SERVICES = [
  {
    id: 'laser',
    name: 'Láser',
    desc: 'Depilación definitiva y rejuvenecimiento con láser de diodo de última generación.',
    body: 'Tecnología de láser de diodo de última generación, segura para todo tipo de pieles y fototipos. Sesiones rápidas, sin dolor, con resultados visibles desde la primera visita. Indicado para depilación definitiva y para tratamientos faciales de rejuvenecimiento y manchas.',
    tags: ['Diodo', 'Depilación', 'Rejuvenecimiento', 'Manchas'],
  },
  {
    id: 'corporal',
    name: 'Pérdida de grasa',
    desc: 'Remodelación corporal combinando HIFU focal, Indiba y Leeging.',
    body: 'Programas personalizados que combinan ultrasonido focalizado (HIFU focal pro), radiofrecuencia Indiba y presoterapia Leeging para reducir grasa localizada, drenar y reafirmar. Resultados medibles, sin quirófano, con un plan que se ajusta a tu cuerpo y a tu ritmo.',
    tags: ['HIFU focal pro', 'Indiba', 'Leeging', 'Remodelación'],
  },
  {
    id: 'facial',
    name: 'Cuidado facial avanzado',
    desc: 'Protocolos faciales a medida con activos profesionales y aparatología.',
    body: 'Diagnóstico individual de tu piel y un protocolo facial diseñado a tu medida: limpiezas profundas, hidratación intensiva, peelings y activos profesionales aplicados con técnica y mimo. Tu piel sale luminosa, descansada y mucho mejor cuidada.',
    tags: ['Higiene profunda', 'Hidratación', 'Peelings', 'Activos profesionales'],
  },
  {
    id: 'antiedad',
    name: 'Antiedad y rejuvenecimiento',
    desc: 'HIFU, plasmafibroblasto y tratamientos firmantes con resultado real.',
    body: 'Tratamientos no invasivos para tensar, redensificar y devolver la firmeza al rostro y al cuello: HIFU (ultrasonido focalizado), plasmafibroblasto y protocolos firmantes. Pensados para verte mejor, no diferente, con un resultado natural que evoluciona contigo.',
    tags: ['HIFU', 'Plasmafibroblasto', 'Lifting sin cirugía'],
  },
  {
    id: 'micro',
    name: 'Micropigmentación',
    desc: 'Cejas y labios con técnica fina, simétrica y natural.',
    body: 'Micropigmentación realizada con técnica fina, pigmentos de alta calidad y un estudio previo del rostro para que el resultado sea simétrico, natural y favorecedor. Cejas que se ven y labios que se sienten, sin maquillarte cada mañana.',
    tags: ['Cejas', 'Labios', 'Técnica fina'],
  },
];

const TECH = [
  { name: 'HIFU', label: 'Ultrasonido', desc: 'Lifting facial y corporal sin cirugía. Tensa y redensifica la piel desde dentro.' },
  { name: 'HIFU Focal Pro', label: 'Corporal', desc: 'Ultrasonido focalizado para reducir grasa localizada con precisión milimétrica.' },
  { name: 'Indiba', label: 'Radiofrecuencia', desc: 'Reactiva la circulación, drena, reafirma. La aliada en cualquier protocolo corporal.' },
  { name: 'Diodo', label: 'Láser', desc: 'Depilación definitiva en pocas sesiones, segura en todos los fototipos.' },
  { name: 'Leeging', label: 'Presoterapia', desc: 'Drenaje linfático mecánico para descongestionar y reducir retención.' },
  { name: 'Plasmafibroblasto', label: 'Regeneración', desc: 'Estimula la producción natural de colágeno para un efecto lifting progresivo.' },
];

const PILLARS = [
  { roman: 'I.', title: 'Formación permanente', body: 'En estética, lo de ayer no basta para hoy. Reme se forma de manera continua para incorporar lo último en técnica, aparatología y conocimiento dermatológico.' },
  { roman: 'II.', title: 'Trabajo bien hecho', body: 'Más de veinte años cuidando piel y cuerpos enseñan algo importante: no hay atajos. Cada protocolo se trabaja con la dedicación y el tiempo que requiere.' },
  { roman: 'III.', title: 'Atención al detalle', body: 'Lo que distingue un buen tratamiento de uno excelente está en lo pequeño. Una temperatura, una presión, una pausa. Aquí cada detalle importa.' },
];

const WHATSAPP_URL = 'https://wa.me/34696844884?text=Hola%20Reme,%20me%20gustar%C3%ADa%20pedir%20cita%20en%20Salud%20de%20Diva.';

// ─────────────────────────────────────────────────────────────────────────────
// Hooks
// ─────────────────────────────────────────────────────────────────────────────

function useScrolled(threshold = 30) {
  const [scrolled, setScrolled] = useState(false);
  useEffect(() => {
    const onScroll = () => setScrolled(window.scrollY > threshold);
    onScroll();
    window.addEventListener('scroll', onScroll, { passive: true });
    return () => window.removeEventListener('scroll', onScroll);
  }, [threshold]);
  return scrolled;
}

function useReveal(animations) {
  useEffect(() => {
    const els = Array.from(document.querySelectorAll('.reveal'));
    if (animations === 'off') {
      // skip the hide+animate cycle entirely
      els.forEach((el) => el.classList.remove('reveal-init'));
      return;
    }
    // Mark all reveals as hidden-pending (fail-open if this never runs)
    els.forEach((el) => el.classList.add('reveal-init'));
    // Anything already in viewport at mount: reveal immediately (no scroll needed)
    const reveal = (el) => requestAnimationFrame(() => el.classList.add('in'));
    const isInView = (el) => {
      const r = el.getBoundingClientRect();
      return r.top < window.innerHeight && r.bottom > 0;
    };
    els.forEach((el) => { if (isInView(el)) reveal(el); });
    // Observer for the rest
    let io;
    try {
      io = new IntersectionObserver(
        (entries) => {
          entries.forEach((e) => {
            if (e.isIntersecting) {
              reveal(e.target);
              io.unobserve(e.target);
            }
          });
        },
        { threshold: 0.08, rootMargin: '0px 0px -40px 0px' }
      );
      els.forEach((el) => { if (!el.classList.contains('in')) io.observe(el); });
    } catch (e) {
      // No IO support: just reveal everything
      els.forEach((el) => reveal(el));
    }
    // Safety net: anything still hidden after 4s gets revealed anyway
    const safety = setTimeout(() => {
      els.forEach((el) => el.classList.add('in'));
    }, 4000);
    return () => {
      if (io) io.disconnect();
      clearTimeout(safety);
    };
  }, [animations]);
}

// ─────────────────────────────────────────────────────────────────────────────
// Sections
// ─────────────────────────────────────────────────────────────────────────────

function Nav() {
  const scrolled = useScrolled();
  const [menuOpen, setMenuOpen] = useState(false);

  // lock body scroll when drawer open
  useEffect(() => {
    document.body.style.overflow = menuOpen ? 'hidden' : '';
    return () => { document.body.style.overflow = ''; };
  }, [menuOpen]);

  const go = (id) => (e) => {
    e.preventDefault();
    setMenuOpen(false);
    // small delay so drawer can close before scroll starts
    setTimeout(() => {
      const el = document.getElementById(id);
      if (el) window.scrollTo({ top: el.offsetTop - 60, behavior: 'smooth' });
    }, 60);
  };
  return (
    <React.Fragment>
      <nav className={`top ${scrolled ? 'scrolled' : ''}`}>
        <a href="#top" onClick={go('top')} className="brand">
          <span className="mark"><em>S</em></span>
          <span>Salud de Diva</span>
        </a>
        <div className="links">
          <a href="#about" onClick={go('about')}>Sobre Reme</a>
          <a href="#services" onClick={go('services')}>Tratamientos</a>
          <a href="#tech" onClick={go('tech')}>Tecnología</a>
          <a href="#contact" onClick={go('contact')}>Contacto</a>
        </div>
        <a href={WHATSAPP_URL} target="_blank" rel="noopener" className="nav-cta">
          <WhaIcon size={14} /> Pedir cita
        </a>
        <button
          className={`nav-burger ${menuOpen ? 'open' : ''}`}
          aria-label="Menú"
          aria-expanded={menuOpen}
          onClick={() => setMenuOpen((v) => !v)}
        >
          <span></span><span></span><span></span>
        </button>
      </nav>

      <div className={`nav-drawer ${menuOpen ? 'open' : ''}`}>
        <a href="#about" onClick={go('about')}>Sobre Reme</a>
        <a href="#services" onClick={go('services')}>Tratamientos</a>
        <a href="#tech" onClick={go('tech')}>Tecnología</a>
        <a href="#contact" onClick={go('contact')}>Contacto</a>
        <a href={WHATSAPP_URL} target="_blank" rel="noopener" className="nav-drawer-cta">
          <WhaIcon size={14} /> Pedir cita
        </a>
      </div>
    </React.Fragment>
  );
}

function Hero({ headline, layout }) {
  const parts = splitHeadline(headline);
  return (
    <section className="hero" id="top">
      <div className="container">
        <div className="hero-grid" style={layout === 'centered' ? { gridTemplateColumns: '1fr', textAlign: 'center', justifyItems: 'center' } : null}>
          <div className="hero-copy">
            <div className="reveal eyebrow">Estética Avanzada · Bullas, Murcia</div>
            <h1 className="h-display reveal reveal-d1" style={{ marginTop: 28 }}>
              {parts.map((p, i) =>
                p.italic ? <span key={i} className="accent">{p.text}</span> : <span key={i}>{p.text}</span>
              )}
            </h1>
            <p className="lede reveal reveal-d2">
              Más de veinte años de oficio, formación constante y la última tecnología en estética avanzada, al servicio de tu piel, tu cuerpo y tu manera de sentirte.
            </p>
            <div className="ctas reveal reveal-d3">
              <a className="btn" href={WHATSAPP_URL} target="_blank" rel="noopener">
                <WhaIcon size={14} /> Pedir cita por WhatsApp
              </a>
              <a className="btn ghost" href="#services" onClick={(e) => { e.preventDefault(); document.getElementById('services').scrollIntoView({ behavior: 'smooth' }); }}>
                Ver tratamientos
              </a>
            </div>
          </div>

          {layout === 'split' && (
            <div className="hero-portrait reveal reveal-d2">
              <image-slot id="hero-portrait" placeholder="Foto del centro o de Reme · vertical 3:4"></image-slot>
              <div className="deco-frame"></div>
              <div className="hero-numbers">Est. 2003</div>
              <div className="hero-meta"><span className="dot"></span> Cabina privada</div>
            </div>
          )}
        </div>
      </div>
    </section>
  );
}

function splitHeadline(text) {
  // italicize the last word for accent
  const words = text.split(' ');
  if (words.length < 2) return [{ text, italic: false }];
  const last = words.pop();
  return [
    { text: words.join(' ') + ' ', italic: false },
    { text: last, italic: true },
  ];
}

function Strip() {
  const items = ['Más de 20 años de experiencia', 'Cita previa', 'Bullas · Murcia', 'Formación permanente', 'Tecnología de vanguardia', 'Trato cercano'];
  const sequence = (
    <span>
      {items.map((it, i) => (
        <React.Fragment key={i}>
          {it}<span className="sep">✦</span>
        </React.Fragment>
      ))}
    </span>
  );
  return (
    <div className="strip">
      <div className="strip-track">
        {sequence}{sequence}
      </div>
    </div>
  );
}

function About({ showSignature }) {
  return (
    <section className="about" id="about">
      <div className="container">
        <div className="about-grid">
          <div className="about-portrait reveal">
            <image-slot id="about-portrait" placeholder="Retrato de Reme · vertical 4:5"></image-slot>
            {showSignature && (
              <div className="about-signature">
                <div className="script">Reme</div>
                <div className="label">Fundadora<br/>Estética avanzada</div>
              </div>
            )}
          </div>
          <div className="about-text">
            <div className="reveal eyebrow">Sobre nosotras</div>
            <h2 className="h-display reveal reveal-d1">
              Más de veinte años <span className="italic">aprendiendo</span> a cuidarte mejor.
            </h2>
            <p className="reveal reveal-d2">
              Salud de Diva nace de una convicción que Reme lleva más de dos décadas defendiendo: en estética, no vale quedarse anticuada. La piel cambia, la ciencia avanza, las técnicas evolucionan, y quien te cuida tiene que evolucionar con ellas.
            </p>
            <div className="pull reveal reveal-d2">
              «Cada tratamiento es para una persona concreta. Mi trabajo es escucharla, leerla y darle lo que necesita; no lo que está de moda.»
            </div>
            <p className="reveal reveal-d3">
              Por eso este centro vive en formación permanente, invierte en la mejor aparatología disponible y dedica el tiempo que cada cuerpo requiere. Nada se hace con prisa. Todo se hace con criterio.
            </p>

            <div className="about-stats reveal reveal-d4">
              <div className="stat">
                <div className="num">20+</div>
                <div className="lbl">Años de oficio</div>
              </div>
              <div className="stat">
                <div className="num">6</div>
                <div className="lbl">Tecnologías punteras</div>
              </div>
              <div className="stat">
                <div className="num">∞</div>
                <div className="lbl">Detalles cuidados</div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

function Services() {
  const [open, setOpen] = useState('laser');
  return (
    <section className="services" id="services">
      <div className="container">
        <div className="services-head reveal">
          <div>
            <div className="eyebrow">Tratamientos</div>
            <h2 className="h-display">Una <span className="italic">carta corta</span>, trabajada con criterio.</h2>
          </div>
          <p className="intro">
            Cinco áreas, sin atajos. Cada protocolo se diseña a partir de un diagnóstico individual y se ajusta sesión a sesión.
          </p>
        </div>

        <div className="service-list">
          {SERVICES.map((s, i) => (
            <div key={s.id} className={`service-item reveal ${open === s.id ? 'open' : ''}`} style={{ transitionDelay: `${i * 60}ms` }}>
              <div className="service-row" onClick={() => setOpen(open === s.id ? null : s.id)}>
                <div className="num">0{i + 1}</div>
                <div className="name">{s.name}</div>
                <div className="desc">{s.desc}</div>
                <div className="toggle">
                  <svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 1v12M1 7h12" stroke="currentColor" strokeWidth="1.4" strokeLinecap="round"/></svg>
                </div>
              </div>
              <div className="service-detail">
                <div className="service-detail-inner">
                  <div className="copy">
                    <p>{s.body}</p>
                    <div className="tag-row">
                      {s.tags.map((t) => <span key={t} className="tag">{t}</span>)}
                    </div>
                  </div>
                  <div className="visual">
                    <image-slot id={`svc-${s.id}`} placeholder={`Imagen tratamiento · ${s.name}`}></image-slot>
                  </div>
                </div>
              </div>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

function Tech() {
  return (
    <section className="tech" id="tech">
      <div className="container">
        <div className="reveal eyebrow">Tecnología</div>
        <h2 className="h-display reveal reveal-d1">La mejor herramienta <span className="italic">no sustituye</span> a la mejor mano. La complementa.</h2>
        <p className="intro reveal reveal-d2">
          La aparatología es solo una parte de la ecuación, pero importa, y mucho. En Salud de Diva trabajamos con los equipos más avanzados del sector porque el resultado lo merece.
        </p>
        <div className="tech-grid">
          {TECH.map((t, i) => (
            <div key={t.name} className="tech-card reveal" style={{ transitionDelay: `${i * 80}ms` }}>
              <div>
                <div className="icon">{t.name[0]}</div>
                <h4>{t.name}</h4>
                <p>{t.desc}</p>
              </div>
              <div className="label">{t.label}</div>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

function Philosophy() {
  return (
    <section className="philosophy">
      <div className="container">
        <div className="reveal eyebrow">Nuestra filosofía</div>
        <h2 className="h-display reveal reveal-d1" style={{ fontSize: 'clamp(40px, 5vw, 64px)', maxWidth: 760, marginTop: 14 }}>
          Tres principios que llevan <span className="italic">veinte años</span> sin moverse del sitio.
        </h2>
        <div className="pillars">
          {PILLARS.map((p, i) => (
            <div key={i} className="pillar reveal" style={{ transitionDelay: `${i * 100}ms` }}>
              <div className="roman">{p.roman}</div>
              <h3>{p.title}</h3>
              <p>{p.body}</p>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

function Contact() {
  return (
    <section className="contact" id="contact">
      <div className="container">
        <div className="contact-grid">
          <div>
            <div className="reveal eyebrow">Reservar cita</div>
            <h2 className="h-display reveal reveal-d1">
              ¿Empezamos <span className="italic">a cuidarte?</span>
            </h2>
            <p className="lede reveal reveal-d2">
              Atendemos siempre bajo cita previa, para dedicarte el tiempo que mereces. Escríbenos por WhatsApp y te respondemos personalmente, sin formularios largos ni esperas.
            </p>
            <div className="reveal reveal-d3" style={{ fontFamily: 'var(--serif)', fontSize: 18, fontStyle: 'italic', color: 'var(--taupe-3)' }}>
              «La cita es un momento para ti. Reservarlo, también.»
            </div>
          </div>

          <div className="info-card reveal reveal-d2">
            <div className="info-row">
              <div className="ico">@</div>
              <div>
                <div className="label">Dirección</div>
                <div className="value">Calle Pino de la Murta, 16<br/>30180 · Bullas, Murcia</div>
              </div>
            </div>
            <div className="info-row">
              <div className="ico">☏</div>
              <div>
                <div className="label">Teléfono</div>
                <div className="value"><a href="tel:+34696844884">696 844 884</a></div>
              </div>
            </div>
            <div className="info-row">
              <div className="ico">✦</div>
              <div>
                <div className="label">Horario</div>
                <div className="value">Bajo cita previa</div>
              </div>
            </div>
            <a href={WHATSAPP_URL} target="_blank" rel="noopener" className="btn coral wha-btn">
              <WhaIcon size={16} /> Escribir por WhatsApp
            </a>
          </div>
        </div>
      </div>
    </section>
  );
}

function Footer() {
  return (
    <footer>
      <div className="container">
        <div className="foot-grid">
          <div>
            <div className="foot-brand">Salud <span className="accent">de</span> Diva</div>
            <div className="foot-tag">Estética Avanzada · Reme</div>
            <p style={{ marginTop: 24, fontSize: 13, lineHeight: 1.7, color: 'rgba(251,246,239,.6)', maxWidth: 360 }}>
              Centro de estética avanzada en Bullas, Murcia. Tratamientos personalizados, tecnología de vanguardia y más de veinte años de experiencia.
            </p>
          </div>
          <div className="foot-col">
            <h5>Tratamientos</h5>
            <ul>
              <li><a href="#services">Láser</a></li>
              <li><a href="#services">Pérdida de grasa</a></li>
              <li><a href="#services">Cuidado facial</a></li>
              <li><a href="#services">Antiedad</a></li>
              <li><a href="#services">Micropigmentación</a></li>
            </ul>
          </div>
          <div className="foot-col">
            <h5>Contacto</h5>
            <ul>
              <li>Calle Pino de la Murta, 16</li>
              <li>30180 · Bullas, Murcia</li>
              <li><a href="tel:+34696844884">696 844 884</a></li>
              <li><a href={WHATSAPP_URL} target="_blank" rel="noopener">WhatsApp</a></li>
            </ul>
          </div>
        </div>
        <div className="foot-bottom">
          <div>© {new Date().getFullYear()} Salud de Diva · Reme. Todos los derechos reservados.</div>
          <div style={{ fontFamily: 'var(--script)', fontSize: 22, color: 'var(--coral)' }}>Hecho con cariño.</div>
        </div>
      </div>
    </footer>
  );
}

function WhaFab() {
  return (
    <a href={WHATSAPP_URL} target="_blank" rel="noopener" className="wha-fab" aria-label="WhatsApp">
      <span className="pulse"></span>
      <WhaIcon size={28} />
    </a>
  );
}

function WhaIcon({ size = 24 }) {
  return (
    <svg width={size} height={size} viewBox="0 0 32 32" fill="currentColor" aria-hidden="true">
      <path d="M16 3C8.82 3 3 8.82 3 16c0 2.31.6 4.5 1.67 6.4L3 29l6.78-1.65A12.9 12.9 0 0 0 16 29c7.18 0 13-5.82 13-13S23.18 3 16 3zm0 23.6c-1.92 0-3.78-.52-5.4-1.5l-.39-.23-4.02.98 1.05-3.92-.25-.4A10.55 10.55 0 0 1 5.4 16 10.6 10.6 0 1 1 16 26.6zm5.84-7.92c-.32-.16-1.88-.92-2.17-1.03-.29-.11-.5-.16-.71.16-.21.32-.82 1.03-1 1.24-.18.21-.37.24-.69.08-.32-.16-1.34-.49-2.55-1.57-.94-.84-1.57-1.88-1.76-2.2-.18-.32-.02-.49.14-.65.14-.14.32-.37.48-.55.16-.18.21-.32.32-.53.11-.21.05-.4-.03-.55-.08-.16-.71-1.71-.97-2.34-.25-.61-.51-.53-.71-.54l-.6-.01c-.21 0-.55.08-.84.4-.29.32-1.1 1.08-1.1 2.63 0 1.55 1.13 3.05 1.29 3.26.16.21 2.22 3.4 5.39 4.77.75.32 1.34.51 1.8.66.76.24 1.45.21 1.99.13.61-.09 1.88-.77 2.14-1.51.26-.74.26-1.38.18-1.51-.08-.13-.29-.21-.61-.37z"/>
    </svg>
  );
}

// ─────────────────────────────────────────────────────────────────────────────
// App
// ─────────────────────────────────────────────────────────────────────────────

function App() {
  const [t, setTweak] = useTweaks(window.TWEAK_DEFAULTS);
  useReveal(t.animations);

  // Apply palette + font as CSS vars
  useEffect(() => {
    const root = document.documentElement;
    const [nude, taupe, coral, paper] = t.palette;
    root.style.setProperty('--nude', nude);
    root.style.setProperty('--taupe', taupe);
    root.style.setProperty('--coral', coral);
    // derived
    const lighten = (hex, amt) => {
      const h = hex.replace('#','');
      const r = parseInt(h.slice(0,2),16), g = parseInt(h.slice(2,4),16), b = parseInt(h.slice(4,6),16);
      const mix = (c) => Math.round(c + (255 - c) * amt);
      return `rgb(${mix(r)},${mix(g)},${mix(b)})`;
    };
    const darken = (hex, amt) => {
      const h = hex.replace('#','');
      const r = parseInt(h.slice(0,2),16), g = parseInt(h.slice(2,4),16), b = parseInt(h.slice(4,6),16);
      const mix = (c) => Math.round(c * (1 - amt));
      return `rgb(${mix(r)},${mix(g)},${mix(b)})`;
    };
    root.style.setProperty('--paper', paper);
    root.style.setProperty('--cream', lighten(nude, 0.35));
    root.style.setProperty('--taupe-2', lighten(taupe, 0.18));
    root.style.setProperty('--taupe-3', lighten(taupe, 0.45));
    root.style.setProperty('--coral-deep', darken(coral, 0.18));
  }, [t.palette]);

  useEffect(() => {
    document.documentElement.style.setProperty('--serif', `'${t.headingFont}', 'Playfair Display', Georgia, serif`);
  }, [t.headingFont]);

  return (
    <React.Fragment>
      <Nav />
      <Hero headline={t.heroHeadline} layout={t.heroLayout} />
      <Strip />
      <About showSignature={t.showSignature} />
      <Services />
      <Tech />
      <Philosophy />
      <Contact />
      <Footer />
      <WhaFab />

      <TweaksPanel title="Tweaks">
        <TweakSection label="Paleta de color" />
        <TweakColor
          label="Esquema"
          value={t.palette}
          options={[
            ['#E8DDD3', '#3D332E', '#E8907F', '#FBF6EF'],  // original nude+coral
            ['#EFE6DA', '#2A2520', '#C9A876', '#FAF6F0'],  // ivory + champagne dorado
            ['#E0CFC0', '#4A2E2A', '#D87A6C', '#F5ECE2'],  // terracota cálido
            ['#DDD5CB', '#1F1A18', '#B89580', '#F3EFE9'],  // mocha frío luxe
          ]}
          onChange={(v) => setTweak('palette', v)}
        />
        <TweakSection label="Tipografía" />
        <TweakSelect
          label="Titulares"
          value={t.headingFont}
          options={['Cormorant Garamond', 'Playfair Display', 'Italiana']}
          onChange={(v) => setTweak('headingFont', v)}
        />
        <TweakText
          label="Titular del hero"
          value={t.heroHeadline}
          onChange={(v) => setTweak('heroHeadline', v)}
        />
        <TweakSection label="Layout y motion" />
        <TweakRadio
          label="Hero"
          value={t.heroLayout}
          options={['split', 'centered']}
          onChange={(v) => setTweak('heroLayout', v)}
        />
        <TweakRadio
          label="Animaciones"
          value={t.animations}
          options={['subtle', 'off']}
          onChange={(v) => setTweak('animations', v)}
        />
        <TweakToggle
          label="Firma sobre el retrato"
          value={t.showSignature}
          onChange={(v) => setTweak('showSignature', v)}
        />
      </TweaksPanel>
    </React.Fragment>
  );
}

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