function Metodo() {
  const pilares = [
    {
      n: '01',
      t: 'Vamos às Gôndolas',
      d: 'Pesquisa de mercado e benchmarking. Mapeamos o terreno real antes de qualquer decisão — onde estão os concorrentes, o que o consumidor diz, e onde existe espaço para crescer.',
    },
    {
      n: '02',
      t: 'Criação Guiada',
      d: 'A busca pela interseção perfeita: o conjunto de elementos que satisfaz o consumidor e o conjunto que destaca a marca frente ao mercado. Nenhuma decisão visual começa antes dessa intersecção estar clara.',
    },
    {
      n: '03',
      t: 'Atualização do Produto',
      d: 'Contrato com datas e entregas descritas. Plataforma própria para o cliente acompanhar o andamento em tempo real. Atualização periódica via e-mail e WhatsApp. Uma resposta direta à desorganização do mercado de design.',
      highlight: true,
    },
  ];

  const etapas = [
    { n: '01', t: 'Briefing',     d: 'Entendimento do contexto, dos objetivos e das restrições. A conversa honesta que define o escopo e evita retrabalho.' },
    { n: '02', t: 'Benchmarking', d: 'Mapa Visual + Síntese de Mercado. Análise linha a linha: o que os concorrentes comunicam, como comunicam, e o espaço que nenhum deles ocupa.' },
    { n: '03', t: 'Criação',      d: 'O processo inteiro guiado pela análise anterior. Cada decisão de cor, tipografia e hierarquia tem raciocínio documentado — não é gosto, é argumento.' },
    { n: '04', t: 'Validação',    d: 'Reunião de apresentação das tomadas de decisão e do resultado obtido. Você entende o porquê de cada escolha antes da entrega final.' },
    { n: '05', t: 'Entrega',      d: 'Rótulo vetorizado, mockups em alta definição e imagem comercial tratada. Tudo documentado e pronto para produção imediata.' },
  ];

  const [activeStep, setActiveStep] = useState(0);
  const stepRefs = useRef([]);

  useEffect(() => {
    const observers = stepRefs.current.map((el, i) => {
      if (!el) return null;
      const io = new IntersectionObserver(
        ([entry]) => { if (entry.isIntersecting) setActiveStep(i); },
        { threshold: 0.38 }
      );
      io.observe(el);
      return io;
    });
    return () => observers.forEach(io => io?.disconnect());
  }, []);

  const sectionRef = useRef(null);
  const phiP = useScrollProgress(sectionRef);

  return (
    <Section id="metodo" pad="md" style={{ background: 'var(--bg-2)', borderTop: '1px solid var(--line-soft)', clipPath: 'inset(0)' }}>
      <div className="container" style={{ position: 'relative' }}>

        {/* Floating PHI watermark — parallax */}
        <div aria-hidden style={{
          position: 'absolute',
          right: '-8%', top: '10%',
          fontFamily: 'var(--serif)', fontStyle: 'italic',
          fontSize: 'clamp(200px, 28vw, 400px)',
          color: 'oklch(from var(--fg) l c h / 0.04)',
          lineHeight: 0.8, pointerEvents: 'none', userSelect: 'none',
          transform: `translate3d(0, ${(phiP - 0.5) * -80}px, 0)`,
          transition: 'transform .1s linear',
          zIndex: 0,
        }}>Φ</div>

        {/* Header */}
        <div ref={sectionRef} style={{ display: 'grid', gridTemplateColumns: '1fr 2fr', gap: 60, marginBottom: 80, position: 'relative', zIndex: 1 }} className="met-head">
          <div>
            <Label n="03">O método</Label>
            <div style={{ marginTop: 24 }} className="mono">Protocolo proprietário</div>
            <div className="serif" style={{ fontSize: 'clamp(32px, 7vw, 64px)', letterSpacing: '-0.03em', lineHeight: 0.95, marginTop: 6, display: 'flex', alignItems: 'baseline', gap: 12 }}>
              Método <em className="italic">PHI</em>
              <span className="serif italic" style={{ fontSize: 'clamp(24px, 5vw, 48px)', color: 'var(--accent)', lineHeight: 1 }}>Φ</span>
            </div>
            <p style={{ marginTop: 24, fontSize: 15, color: 'var(--fg-dim)', maxWidth: 380, lineHeight: 1.55 }}>
              3 pilares. 5 etapas. A ordem importa — pilares são o porquê, etapas são o como.
            </p>
          </div>
          <MaskLines
            tag="h2"
            className="serif"
            style={{ fontSize: 'clamp(34px, 5vw, 68px)', lineHeight: 1, letterSpacing: '-0.025em', alignSelf: 'end' }}
            lines={[
              <>Antes de decidir <em className="italic">como parecer,</em></>,
              <>decide-se <em className="italic">onde jogar.</em></>,
            ]}
          />
        </div>

        {/* PILARES */}
        <div style={{ marginBottom: 100, position: 'relative', zIndex: 1 }}>
          <div style={{ display: 'flex', gap: 10, alignItems: 'center', marginBottom: 28, paddingBottom: 16, borderBottom: '1px solid var(--line-soft)' }}>
            <span style={{ width: 6, height: 6, borderRadius: 999, background: 'var(--accent)', flexShrink: 0 }} />
            <span className="mono" style={{ color: 'var(--fg-mute)' }}>
              Os pilares · a fundação filosófica · <em className="italic" style={{ fontFamily: 'var(--serif)', textTransform: 'none', letterSpacing: 0, fontSize: 13 }}>o porquê</em>
            </span>
          </div>
          <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 0, borderTop: '1px solid var(--line-soft)', borderLeft: '1px solid var(--line-soft)' }} className="met-pilares">
            {pilares.map((p, i) => <PilarCard key={i} pilar={p} i={i} />)}
          </div>
        </div>

        {/* ETAPAS — scroll storytelling */}
        <div style={{ position: 'relative', zIndex: 1 }}>
          <div style={{ display: 'flex', gap: 10, alignItems: 'center', marginBottom: 60, paddingBottom: 16, borderBottom: '1px solid var(--line-soft)' }}>
            <span style={{ width: 6, height: 6, borderRadius: 999, background: 'var(--fg-mute)', flexShrink: 0 }} />
            <span className="mono" style={{ color: 'var(--fg-mute)' }}>
              As etapas · o fluxo operacional · <em className="italic" style={{ fontFamily: 'var(--serif)', textTransform: 'none', letterSpacing: 0, fontSize: 13 }}>o como</em>
            </span>
          </div>

          <div style={{ display: 'grid', gridTemplateColumns: '180px 1fr', gap: '0 80px', alignItems: 'start' }} className="met-scroll-grid">

            {/* Sticky left timeline */}
            <div style={{ position: 'sticky', top: 120, alignSelf: 'start' }} className="met-timeline">
              <div style={{ position: 'relative', paddingLeft: 22 }}>
                {/* Track line */}
                <div style={{ position: 'absolute', left: 3, top: 8, bottom: 8, width: 1, background: 'var(--line-soft)' }} />
                {/* Progress fill */}
                <div style={{
                  position: 'absolute', left: 3, top: 8, width: 1,
                  height: `${(activeStep / (etapas.length - 1)) * 100}%`,
                  background: 'var(--accent)',
                  transition: 'height .7s cubic-bezier(.2,.7,.2,1)',
                }} />
                {etapas.map((e, i) => (
                  <div key={i} style={{
                    display: 'flex', alignItems: 'flex-start', gap: 12,
                    paddingBottom: i < etapas.length - 1 ? 36 : 0,
                    opacity: i <= activeStep ? 1 : 0.35,
                    transition: 'opacity .5s',
                  }}>
                    <div style={{
                      width: 7, height: 7, borderRadius: 999, flexShrink: 0,
                      marginTop: 4,
                      background: i < activeStep ? 'var(--accent)' : i === activeStep ? 'var(--accent)' : 'var(--line)',
                      boxShadow: i === activeStep ? '0 0 10px var(--accent)' : 'none',
                      transition: 'background .4s, box-shadow .4s',
                    }} />
                    <div>
                      <div className="mono" style={{ fontSize: 10, color: 'var(--fg-mute)', marginBottom: 3, letterSpacing: '0.05em' }}>{e.n}</div>
                      <div className="serif" style={{
                        fontSize: 15, lineHeight: 1.1, letterSpacing: '-0.01em',
                        color: i === activeStep ? 'var(--fg)' : 'var(--fg-dim)',
                        fontStyle: i === activeStep ? 'italic' : 'normal',
                        transition: 'color .4s, font-style .3s',
                      }}>{e.t}</div>
                    </div>
                  </div>
                ))}
              </div>
            </div>

            {/* Step cards */}
            <div>
              {etapas.map((e, i) => (
                <EtapaCard
                  key={i}
                  etapa={e}
                  i={i}
                  active={i === activeStep}
                  last={i === etapas.length - 1}
                  setRef={el => { stepRefs.current[i] = el; }}
                />
              ))}
            </div>
          </div>
        </div>

      </div>

      <style>{`
        @media (max-width: 820px) {
          .met-head { grid-template-columns: 1fr !important; gap: 30px !important; }
          .met-pilares { grid-template-columns: 1fr !important; }
          .met-pilares > div { border-right: none !important; }
          .met-scroll-grid { grid-template-columns: 1fr !important; gap: 0 !important; }
          .met-timeline { display: none !important; }
          .met-etapa-card { min-height: 60vw !important; padding: 40px 0 !important; overflow: visible !important; }
          .met-etapa-wm { right: 0 !important; font-size: clamp(80px, 20vw, 130px) !important; }
        }
        @media (max-width: 480px) {
          .met-etapa-card { min-height: 70vw !important; padding: 32px 0 !important; }
          .met-pilares > div { padding: 28px 20px !important; }
        }
      `}</style>
    </Section>
  );
}

function EtapaCard({ etapa, i, active, last, setRef }) {
  const revealRef = useRef(null);
  const [inView, setInView] = useState(false);

  useEffect(() => {
    const el = revealRef.current;
    if (!el) return;
    const io = new IntersectionObserver(
      ([entry]) => { if (entry.isIntersecting) setInView(true); },
      { threshold: 0.1 }
    );
    io.observe(el);
    return () => io.disconnect();
  }, []);

  const combined = (el) => {
    revealRef.current = el;
    setRef(el);
  };

  return (
    <div
      ref={combined}
      className="met-etapa-card"
      style={{
        position: 'relative',
        minHeight: '52vh',
        padding: '56px 0',
        borderBottom: last ? 'none' : '1px solid var(--line-soft)',
        display: 'flex', flexDirection: 'column', justifyContent: 'center', gap: 28,
        overflow: 'hidden',
        opacity: inView ? 1 : 0,
        transform: inView ? 'none' : 'translateY(36px)',
        transition: `opacity .9s ${i * 80}ms, transform .9s ${i * 80}ms cubic-bezier(.2,.7,.2,1)`,
      }}
    >
      {/* Watermark step number */}
      <div aria-hidden className="serif italic met-etapa-wm" style={{
        position: 'absolute',
        right: -12, top: '50%',
        transform: 'translateY(-50%)',
        fontSize: 'clamp(100px, 18vw, 220px)',
        letterSpacing: '-0.05em', lineHeight: 0.85,
        color: active
          ? 'oklch(from var(--accent) l c h / 0.09)'
          : 'oklch(from var(--fg) l c h / 0.04)',
        pointerEvents: 'none', userSelect: 'none',
        transition: 'color .6s',
      }}>{etapa.n}</div>

      {/* Content */}
      <div className="mono" style={{
        color: active ? 'var(--accent)' : 'var(--fg-mute)',
        display: 'flex', gap: 12, alignItems: 'center',
        transition: 'color .4s',
      }}>
        <span style={{
          width: 20, height: 1,
          background: active ? 'var(--accent)' : 'var(--line)',
          display: 'inline-block',
          transition: 'background .4s, width .4s',
        }} />
        Etapa {etapa.n} · de 05
      </div>

      <h3 className="serif" style={{
        fontSize: 'clamp(36px, 6vw, 76px)',
        letterSpacing: '-0.03em', lineHeight: 0.95,
        color: active ? 'var(--fg)' : 'var(--fg-dim)',
        transition: 'color .4s',
        position: 'relative', zIndex: 1,
      }}>
        {active ? <em>{etapa.t}</em> : etapa.t}
      </h3>

      <p style={{
        fontSize: 17, color: 'var(--fg-dim)', lineHeight: 1.65,
        maxWidth: 560, position: 'relative', zIndex: 1,
        opacity: active ? 1 : 0.7,
        transition: 'opacity .4s',
      }}>
        {etapa.d}
      </p>
    </div>
  );
}

function PilarCard({ pilar, i }) {
  return (
    <Reveal delay={i * 80} style={{
      padding: '40px 32px',
      borderRight: '1px solid var(--line-soft)',
      borderBottom: '1px solid var(--line-soft)',
      borderTop: pilar.highlight ? '2px solid var(--accent)' : '2px solid transparent',
      background: pilar.highlight ? 'oklch(from var(--bg) l c h / 0.6)' : 'transparent',
      display: 'flex', flexDirection: 'column', gap: 20,
    }}>
      <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
        <span className="mono" style={{ color: 'var(--accent)' }}>{pilar.n}</span>
        {pilar.highlight && (
          <span className="mono" style={{ fontSize: 9, color: 'var(--accent)', display: 'flex', alignItems: 'center', gap: 4, letterSpacing: '0.1em' }}>
            <span style={{ width: 5, height: 5, borderRadius: 999, background: 'var(--accent)' }} />
            Pilar operacional
          </span>
        )}
      </div>
      <h3 className="serif" style={{ fontSize: 'clamp(22px, 3vw, 32px)', letterSpacing: '-0.02em', lineHeight: 1.05 }}>{pilar.t}</h3>
      <p style={{ fontSize: 15, color: 'var(--fg-dim)', lineHeight: 1.6 }}>{pilar.d}</p>
    </Reveal>
  );
}

window.Metodo = Metodo;
