/* ============================================================
   Plenno · Sidebar — Case Study
   Main React application (single-file by design)
   Author: Lou Praxedes
   ============================================================ */

const { useState, useEffect, useRef, useMemo } = React;

/* ------------------------------------------------------------
   Tweakable defaults (host can persist these)
   ------------------------------------------------------------ */
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "theme": "light",
  "accent": "#6d28d9",
  "typeface": "geist",
  "showProgress": true
}/*EDITMODE-END*/;

const ACCENT_OPTIONS = [
  "#6d28d9", // deep violet — accessible default on white (AAA-LG)
  "#0F5C5C", // plenno teal — brand
  "#b91c1c", // crimson — editorial high-contrast
  "#1f2937"  // charcoal — monochrome
];

const TYPEFACE_OPTIONS = [
  { id: "geist",      name: "Geist · Sans (default)",     display: "'Geist', sans-serif",        body: "'Geist', sans-serif" },
  { id: "instrument", name: "Instrument Serif · Editorial", display: "'Instrument Serif', serif", body: "'Geist', sans-serif" },
  { id: "newsreader", name: "Newsreader · Literary",        display: "'Newsreader', serif",        body: "'Geist', sans-serif" }
];

/* ------------------------------------------------------------
   Sections registry — drives nav + scroll-spy
   ------------------------------------------------------------ */
const SECTIONS = [
  { id: "contexto",    label: "Contexto" },
  { id: "problema",    label: "Problema" },
  { id: "contextos",   label: "7 Contextos" },
  { id: "telas",       label: "Telas" },
  { id: "resultados",  label: "Resultados" }
];

const SCREENS_GALLERY = [
  {
    num: "01",
    title: "Lista de Contratos",
    italic: "ponto de entrada",
    desc: "Hub principal do contexto Contratos. Lista os contratos ativos por organização, com filtros de status e ação rápida de criação.",
    expanded: "assets/screens/lista-contratos-expandida.png",
    collapsed: "assets/screens/lista-contratos-colapsada.png",
    tags: ["Tabela densa", "CTA contextual", "Status pills"]
  },
  {
    num: "02",
    title: "Menu Contextual do Contrato",
    italic: "navegação aninhada",
    desc: "Ao selecionar um contrato, a sidebar revela um terceiro nível de navegação interna — sem perder o contexto do contrato pai. É onde a hierarquia de 3 níveis prova seu valor.",
    expanded: "assets/screens/menu-contratos-expandida.png",
    collapsed: "assets/screens/menu-contratos-colapsada.png",
    tags: ["Hierarquia 3 níveis", "Drill-down", "Contexto persistente"]
  },
  {
    num: "03",
    title: "Indicadores de Presença",
    italic: "leitura imediata",
    desc: "Dashboard de conformidade com KPIs em escala visual (Conforme / Revisado / Não recebidos / Aguardando). O resumo no topo evita que o usuário precise interpretar números — a cor já conta a história.",
    expanded: "assets/screens/fluxo-expandida.png",
    collapsed: "assets/screens/fluxo-colapsada.png",
    tags: ["KPI cards", "Barras de progresso", "Filtros aplicados"]
  },
  {
    num: "04",
    title: "Cadastro de Profissionais",
    italic: "o operacional",
    desc: "Lista de médicos vinculados ao contrato com indicadores rápidos de pendência documental. A coluna “Documentos” usa um único glifo vermelho para sinalizar falta — ruído visual mínimo.",
    expanded: "assets/screens/cadastro-expandida.png",
    collapsed: "assets/screens/cadastro-colapsada.png",
    tags: ["Tabela operacional", "Sinalização inline", "Ação por linha"]
  },
  {
    num: "05",
    title: "Documentação · Controle",
    italic: "matriz densa",
    desc: "Matriz Profissional × Documento, com até 30 colunas ativas. Tabs internas dividem Obrigatórios / Opcionais / Especialidades. O resumo numérico no topo (Aprovados, Pendentes, Reprovados, Vencidos, Não enviados) é o atalho mental do gestor.",
    expanded: "assets/screens/documentacao-expandida.png",
    collapsed: "assets/screens/documentacao-colapsada.png",
    tags: ["Matriz densa", "Tabs internas", "Scroll horizontal"]
  },
  {
    num: "06",
    title: "Histórico de Documentação",
    italic: "versionamento",
    desc: "Auditoria de versões — quem subiu, quem revisou, quando. Padrão de tabela leve que aparece em vários contextos do produto, mantendo consistência de leitura.",
    expanded: "assets/screens/historico-expandida.png",
    collapsed: "assets/screens/historico-colapsada.png",
    tags: ["Auditoria", "Versões", "Reuso de padrão"]
  },
  {
    num: "07",
    title: "Gestão de Faturamento",
    italic: "controle financeiro",
    desc: "Tabela cruzando profissional e estado documental para faturamento. Filtros encadeados no topo permitem recortar por médico, CPF, tag ou aprovação total. A largura da tabela explica por que a sidebar colapsada existe.",
    expanded: "assets/screens/gestao-expandida.png",
    collapsed: "assets/screens/gestao-colapsada.png",
    tags: ["Filtros encadeados", "Tabela larga", "Caso de uso da colapsada"]
  },
  {
    num: "08",
    title: "Fluxo Financeiro · Kanban",
    italic: "três estados, uma mecânica",
    desc: "Kanban de vagas com três colunas semânticas: Valoração (apurando), Em Disputa (contestada), Faturadas (pago). Mesmo card, mesmo formato — só a cor muda. Linguagem visual aprendida em segundos.",
    expanded: "assets/screens/fluxo-expandida.png",
    collapsed: "assets/screens/fluxo-colapsada.png",
    tags: ["Kanban semântico", "Cards padronizados", "Cor como estado"]
  },
  {
    num: "09",
    title: "Edição do Contrato",
    italic: "formulário em camadas",
    desc: "Formulário multi-tabs (Informações, Unidades, Documentos, Tags, Financeiro) que mantém o usuário num único contexto. Quando a sidebar colapsa, o formulário ganha quase 200px de respiro horizontal — em telas grandes isso muda a percepção de densidade.",
    expanded: "assets/screens/edicao-contrato-expandida.png",
    collapsed: "assets/screens/edicao-contrato-colapsada.png",
    tags: ["Multi-tabs", "Form em camadas", "Largura adaptativa"]
  }
];

const SEVEN_CONTEXTS = [
  { id: "contrato",   name: "Contrato",         desc: "Operação de um contrato específico: profissionais, documentos, faturamento, indicadores.", status: "Case principal", featured: true },
  { id: "unidades",   name: "Unidades",         desc: "Visão por unidade hospitalar — escalas, plantões e equipe operacional no ponto de cuidado.",                status: "Documentado neste case", featured: true },
  { id: "favoritos",  name: "Favoritos",        desc: "Atalho pessoal: páginas mais usadas pelo usuário, fixadas e ordenáveis na sidebar.",                          status: "Documentado neste case", featured: true },
  { id: "org",        name: "ORG",              desc: "Visão executiva da organização — dashboards financeiros agregados, conformidade documental e análise de profissionais em escala.",                            status: "Documentado neste case", featured: true },
  { id: "backoffice", name: "Backoffice",       desc: "Painel administrativo do time Plenno — permissões, organizações, usuários e operações em lote. O único contexto que não é do cliente.",                                   status: "Documentado neste case", featured: true },
  { id: "global",     name: "Base Global",      desc: "Registro mestre dos profissionais — fonte única da verdade. Acessível pelo menu de usuário, não pelo sidebar.",                             status: "Documentado neste case", featured: true },
  { id: "novo",       name: "Usuário Não Configurado", desc: "Estado de fallback — quando o usuário não tem permissão para a camada acessada. Sidebar e context header desaparecem, dando lugar a uma mensagem clara.", status: "Documentado neste case", featured: true }
];

/* ============================================================
   Top Nav with scroll-spy
   ============================================================ */
function TopNav({ active }) {
  return (
    <nav className="topnav">
      <div className="topnav-inner">
        <a href="../../index.html" aria-label="Lou Praxedes" style={{ display: "inline-flex", alignItems: "center" }}>
          <img src="assets/logo-mark.png" alt="Lou Praxedes" style={{ height: "38px", width: "auto", mixBlendMode: "multiply" }} />
        </a>
        <div style={{ display: "flex", alignItems: "center", gap: "34px" }}>
          <a href="../../index.html" style={{ fontFamily: "var(--font-body)", fontSize: "16px", fontWeight: 500, color: "var(--text)", textDecoration: "none", letterSpacing: "-0.01em" }}>Início</a>
          <a href="../../sobre.html" style={{ fontFamily: "var(--font-body)", fontSize: "16px", fontWeight: 500, color: "var(--text)", textDecoration: "none", letterSpacing: "-0.01em" }}>Sobre</a>
          <div style={{ display: "inline-flex", alignItems: "center", background: "var(--bg-soft)", border: "1px solid var(--border)", borderRadius: "999px", padding: "3px" }}>
            <span style={{ fontFamily: "var(--font-body)", fontSize: "13px", fontWeight: 600, letterSpacing: "0.02em", padding: "6px 14px", borderRadius: "999px", background: "var(--text)", color: "var(--bg)" }}>PT</span>
            <span style={{ fontFamily: "var(--font-body)", fontSize: "13px", fontWeight: 600, letterSpacing: "0.02em", padding: "6px 14px", borderRadius: "999px", background: "transparent", color: "var(--text-dim)" }}>EN</span>
          </div>
        </div>
      </div>
    </nav>
  );
}

/* ============================================================
   Hero
   ============================================================ */
function Hero() {
  const STATES = [
    { id: "default",   img: "assets/sidebars/default.png",   pos: "center top",     ctx: "Estado inicial",  caption: <>Sidebar mínima — só o que o usuário <strong>precisa enxergar primeiro</strong>.</> },
    { id: "org",       img: "assets/sidebars/org.png",       pos: "center 12%",     ctx: "Contexto · ORG",  caption: <>Visão executiva — <strong>financeiro, documentação e profissionais</strong> agregados.</> },
    { id: "contrato",  img: "assets/sidebars/full.png",      pos: "center 32%",     ctx: "Contexto · Contrato", caption: <>Operação completa — toda a árvore de um <strong>contrato selecionado</strong>.</> },
    { id: "unidade",   img: "assets/sidebars/unidade.png",   pos: "center 52%",     ctx: "Contexto · Unidade",  caption: <>Aprofundou em uma unidade — <strong>escalas, presenças e repasses</strong>.</> },
    { id: "favoritos", img: "assets/sidebars/favoritos.png", pos: "center bottom",  ctx: "Camada · Favoritos",  caption: <>Camada pessoal — <strong>páginas fixadas</strong>, persiste entre contextos.</> },
    { id: "collapsed", img: "assets/sidebars/collapsed.png", pos: "center top",     ctx: "Modo · Colapsada",    caption: <>Sidebar colapsada — libera <strong>respiro horizontal</strong> para tabelas densas.</> }
  ];

  const [active, setActive] = useState(0);
  const [paused, setPaused] = useState(false);

  useEffect(() => {
    if (paused) return;
    const id = setInterval(() => {
      setActive(a => (a + 1) % STATES.length);
    }, 3800);
    return () => clearInterval(id);
  }, [paused, STATES.length]);

  const current = STATES[active];

  return (
    <header id="top" className="hero">
      <div className="container">
        <div className="hero-grid">
          <div className="hero-text">
            <div className="hero-meta">
              <span className="pill">Plenno · Healthcare SaaS</span>
              <span className="pill">Lead Product Designer</span>
            </div>
            <h1 className="hero-title">
              Sete contextos.<br />
              <em>Um</em> componente.
            </h1>
            <p className="hero-sub">
              Como transformei uma navegação em cascata, cega ao contexto, em uma sidebar que <em>se reconfigura a cada persona</em> — entregando sete jornadas a partir de um único componente.
            </p>
            <div className="hero-stats">
              <div className="hero-stat">
                <div className="k">Cliente</div>
                <div className="v">Plenno · Healthcare</div>
              </div>
              <div className="hero-stat">
                <div className="k">Papel</div>
                <div className="v">Lead Product Designer</div>
              </div>
              <div className="hero-stat">
                <div className="k">Entrega</div>
                <div className="v"><em>7</em> contextos de navegação</div>
              </div>
              <div className="hero-stat">
                <div className="k">Status</div>
                <div className="v">Em produção</div>
              </div>
            </div>
          </div>

          <div
            className="hero-sidebar-stage"
            onMouseEnter={() => setPaused(true)}
            onMouseLeave={() => setPaused(false)}
          >
            <div className="hero-sidebar-frame">
              <div className="ctx-pill">
                <span className="dot"></span>
                <span className="name">{current.ctx}</span>
              </div>
              {STATES.map((s, i) => (
                <img
                  key={s.id}
                  src={s.img}
                  alt={s.ctx}
                  style={{ objectPosition: s.pos }}
                  className={"hero-sidebar-img " + (s.id === "collapsed" ? "collapsed " : "") + (i === active ? "active" : "")}
                />
              ))}
            </div>
            <div className="hero-sidebar-nav">
              {STATES.map((s, i) => (
                <button
                  key={s.id}
                  className={i === active ? "active" : ""}
                  onClick={() => { setActive(i); setPaused(true); }}
                  aria-label={"Mostrar " + s.ctx}
                >
                  {s.id}
                </button>
              ))}
            </div>
          </div>
        </div>
      </div>
    </header>
  );
}

/* ============================================================
   Contexto (about the product)
   ============================================================ */
function Contexto() {
  return (
    <section id="contexto" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">01</span>
          <span className="dot"></span>
          <span>Sobre o produto</span>
        </div>
        <h2 className="section-title">
          Plenno é o sistema operacional do <em>plantão médico</em>.
        </h2>
        <p className="section-lede">SaaS B2B de gestão de plantões, escalas e faturamento de unidades de saúde — RH, financeiro, compliance e operação num só produto.</p>
        <div className="compare-grid" style={{marginTop: "32px"}}>
          <div className="card-soft">
            <div className="kicker">O que o produto faz</div>
            <h3 style={{fontFamily: "var(--font-display)", fontSize: 28, fontWeight: 500, margin: "14px 0 16px", letterSpacing: "-0.01em"}}>
              Gestão de plantões e faturamento médico
            </h3>
            <p className="muted">Contratos, escalas, controle de documentação obrigatória, valoração de plantões, disputas e faturamento — tudo em uma única plataforma, conectando ponta operacional e financeiro.</p>
          </div>
          <div className="card-soft">
            <div className="kicker">Meu papel</div>
            <h3 style={{fontFamily: "var(--font-display)", fontSize: 28, fontWeight: 500, margin: "14px 0 16px", letterSpacing: "-0.01em"}}>
              Liderança de Design <em style={{fontStyle: "italic", color: "var(--accent)"}}>end-to-end</em>
            </h3>
            <p className="muted">Liderei desde a descoberta do problema, defini a nova estrutura de UX, mapeei o impacto em todas as páginas do produto e conduzi o time de design para incorporar a navegação ao design system existente.</p>
          </div>
        </div>
      </div>
    </section>
  );
}

/* ============================================================
   Problema
   ============================================================ */
function Problema() {
  return (
    <section id="problema" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">02</span>
          <span className="dot"></span>
          <span>O problema</span>
        </div>
        <h2 className="section-title">
          A sidebar antiga era uma <em>cascata</em> que ninguém entendia.
        </h2>
        <p className="section-lede">Um menu fixo e hierárquico, igual para toda persona. Achar uma página exigia descer camadas de submenus repetidos.</p>

        <div className="compare-grid">
          <div className="compare-card">
            <div className="label before">— Antes</div>
            <h3>Navegação em cascata, sem contexto</h3>
            <p className="muted">Todos os módulos do produto eram listados em uma única árvore vertical, independente da persona ou da tarefa. O gestor financeiro via os mesmos itens que o coordenador médico — e nenhum dos dois encontrava rapidamente o que precisava.</p>
            <div className="cascade">
              <div className="row"><span className="bullet">▸</span> Menu</div>
              <div className="row" style={{paddingLeft: 16}}><span className="bullet">▸</span> Submenu</div>
              <div className="row" style={{paddingLeft: 32}}><span className="bullet">▸</span> Submenu</div>
              <div className="row" style={{paddingLeft: 48}}><span className="bullet">▸</span> Submenu</div>
              <div className="row" style={{paddingLeft: 64}}><span className="bullet">▸</span> Página…</div>
              <div className="row" style={{paddingLeft: 0, marginTop: 8, color: "#c97a6e"}}>↳ usuário perdido</div>
            </div>
          </div>
          <div className="compare-card">
            <div className="label after">— Depois</div>
            <h3>Sidebar contextual, permissionada</h3>
            <p className="muted">A sidebar passou a se reconfigurar conforme o contexto ativo do usuário — Contrato, Unidade, ORG, Backoffice, Base Global, Favoritos ou estado não-configurado. Cada contexto carrega apenas as páginas relevantes para aquela jornada.</p>
            <div className="cascade" style={{borderColor: "var(--accent-line)", background: "var(--accent-soft)"}}>
              <div className="row" style={{color: "var(--accent)"}}>● Contexto ativo: Contrato</div>
              <div className="row" style={{paddingLeft: 12, color: "var(--text)"}}>→ Lista de contratos</div>
              <div className="row" style={{paddingLeft: 12, color: "var(--text)"}}>→ Indicadores</div>
              <div className="row" style={{paddingLeft: 12, color: "var(--text)"}}>→ Profissionais</div>
              <div className="row" style={{paddingLeft: 12, color: "var(--text)"}}>→ Faturamento</div>
              <div className="row" style={{paddingLeft: 12, color: "var(--text-dim)"}}>+ páginas específicas do contexto</div>
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

/* ============================================================
   Objetivos
   ============================================================ */
function Objetivos() {
  const items = [
    { k: "UX", title: "Reduzir o esforço cognitivo para encontrar páginas no dia-a-dia", desc: "Eliminar a navegação “de cima pra baixo” e introduzir contexto explícito ao usuário." },
    { k: "Produto", title: "Permitir que personas distintas operem o produto sem se atropelar", desc: "Cada perfil enxerga apenas o que faz sentido para sua jornada — sem esconder funcionalidade, sem inundar." },
    { k: "Design System", title: "Padronizar o componente Sidebar como base para toda a navegação", desc: "Um único componente, sete estados de conteúdo, dois modos de exibição (expandida/colapsada)." },
    { k: "Negócio", title: "Reduzir o custo de onboarding e o ruído com suporte sobre navegação", desc: "Permitir que novos clientes operem o produto sem treinamento extensivo." }
  ];
  return (
    <section id="objetivos" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">03</span>
          <span className="dot"></span>
          <span>Objetivos</span>
        </div>
        <h2 className="section-title">
          O briefing era simples. A execução, <em>não</em>.
        </h2>
        <p className="section-lede">Quatro objetivos entre UX, produto, design system e negócio.</p>
        <div className="results-grid">
          {items.map((it, i) => (
            <div className="result-card" key={i}>
              <div className="icon">{String(i+1).padStart(2,"0")}</div>
              <div className="kicker" style={{marginBottom: 12}}>{it.k}</div>
              <h4>{it.title}</h4>
              <p style={{marginTop: 12}}>{it.desc}</p>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

/* ============================================================
   Descoberta & Insights
   ============================================================ */
function Descoberta() {
  return (
    <section id="descoberta" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">04</span>
          <span className="dot"></span>
          <span>Descoberta & Insights</span>
        </div>
        <h2 className="section-title">
          O caminho começou nos <em>logs de suporte</em>, não no Figma.
        </h2>
        <p className="section-lede">Personas, entrevistas e análise de tickets apontaram o mesmo padrão: a navegação tratava todos os usuários como iguais.</p>
        <div className="compare-grid" style={{marginTop: 32}}>
          <div className="card">
            <div className="kicker">Insight 01 · Comportamento</div>
            <h3 style={{fontFamily: "var(--font-display)", fontSize: 28, fontWeight: 500, margin: "14px 0 16px", letterSpacing: "-0.01em"}}>
              O usuário trabalha <em style={{fontStyle: "italic", color: "var(--accent)"}}>dentro</em> de um contrato, não no produto inteiro.
            </h3>
            <p className="muted">Observamos que, ao logar, o usuário gasta &gt;80% do tempo dentro de um único contrato ou unidade. A sidebar antiga tratava todas as opções como igualmente prováveis — quando na prática elas não são.</p>
          </div>
          <div className="card">
            <div className="kicker">Insight 02 · Permissionamento</div>
            <h3 style={{fontFamily: "var(--font-display)", fontSize: 28, fontWeight: 500, margin: "14px 0 16px", letterSpacing: "-0.01em"}}>
              Cada persona tem um <em style={{fontStyle: "italic", color: "var(--accent)"}}>conjunto próprio</em> de páginas.
            </h3>
            <p className="muted">Coordenadores médicos não tocam em faturamento. Gestores financeiros não abrem matriz documental. Ao cruzar permissões reais com tarefas reais, sete jornadas distintas emergiram do mesmo produto.</p>
          </div>
          <div className="card">
            <div className="kicker">Insight 03 · Densidade</div>
            <h3 style={{fontFamily: "var(--font-display)", fontSize: 28, fontWeight: 500, margin: "14px 0 16px", letterSpacing: "-0.01em"}}>
              As tabelas precisam de <em style={{fontStyle: "italic", color: "var(--accent)"}}>respiro</em> horizontal.
            </h3>
            <p className="muted">Telas como Gestão de Faturamento e Documentação têm 10+ colunas. Em monitor 1366px com sidebar expandida, o usuário rola horizontalmente o tempo todo. A sidebar colapsada deixou de ser feature — virou requisito.</p>
          </div>
          <div className="card">
            <div className="kicker">Insight 04 · Aprendizado</div>
            <h3 style={{fontFamily: "var(--font-display)", fontSize: 28, fontWeight: 500, margin: "14px 0 16px", letterSpacing: "-0.01em"}}>
              Reuso de padrão é mais barato que <em style={{fontStyle: "italic", color: "var(--accent)"}}>novidade</em>.
            </h3>
            <p className="muted">Em vez de inventar componentes para cada contexto, decidimos reusar a mesma anatomia (tabela, filtros, tabs, kanban) e variar apenas o conteúdo da sidebar. O usuário aprende uma vez, aplica em sete lugares.</p>
          </div>
        </div>
      </div>
    </section>
  );
}

/* ============================================================
   7 Contextos — the big idea
   ============================================================ */
function Contextos() {
  const [active, setActive] = useState("contrato");
  const item = SEVEN_CONTEXTS.find(c => c.id === active);
  return (
    <section id="contextos" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">03</span>
          <span className="dot"></span>
          <span>A grande ideia · 7 Contextos</span>
        </div>
        <h2 className="section-title">
          Um componente, <em>sete identidades</em>.
        </h2>
        <p className="section-lede">Sete contextos, cada um uma jornada permissionada com páginas e prioridades próprias. O mesmo componente se reconfigura.</p>

        <div className="contexts-hub">
          <div className="core">
            <div className="core-inner">
              <span className="num">7</span>
              contextos
            </div>
          </div>
          <div style={{maxWidth: 480}}>
            <div className="kicker" style={{marginBottom: 12}}>Definição</div>
            <p style={{fontFamily: "var(--font-display)", fontSize: 24, lineHeight: 1.4, color: "var(--text)"}}>
              Cada contexto é uma combinação <em style={{fontStyle: "italic", color: "var(--accent)"}}>(persona × intenção × permissão)</em> que determina exatamente quais páginas a sidebar oferece naquele momento.
            </p>
            <p className="muted" style={{fontSize: 15}}>
              Eles não são telas diferentes — é o <em style={{fontStyle: "italic", color: "var(--text)"}}>mesmo</em> componente carregando estruturas diferentes.
            </p>
          </div>
        </div>

        <div className="contexts-list">
          {SEVEN_CONTEXTS.map((c, i) => (
            <div
              key={c.id}
              className={"context-card " + (c.featured ? "featured" : "")}
              onMouseEnter={() => setActive(c.id)}
            >
              <div className="ctx-num">CTX · {String(i+1).padStart(2,"0")}</div>
              <div className="ctx-name">{c.name}</div>
              <div className="ctx-desc">{c.desc}</div>
              <div className="ctx-status">
                <span className="dot"></span>
                {c.status}
              </div>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

/* ============================================================
   Information Architecture — Contratos tree
   ============================================================ */
function FluxoContratos() {
  return (
    <section id="fluxo" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">06</span>
          <span className="dot"></span>
          <span>Deep dive · Contexto Contrato</span>
        </div>
        <h2 className="section-title">
          O contexto <em>Contrato</em> é o coração operacional do produto.
        </h2>
        <p className="section-lede">Onde o gestor resolve o dia-a-dia: profissionais, documentos, indicadores e faturamento. O contexto escolhido como case principal.</p>

        <div className="kicker" style={{marginTop: 56, marginBottom: 16}}>Arquitetura de informação · Contrato</div>
        <div className="ia-tree">
{`Contexto: `}<span className="root">CONTRATO</span>{`
│
├── `}<span className="leaf">Lista de Contratos</span>{` · ponto de entrada
│
└── `}<span className="branch">[contrato selecionado: UPA 24h São Sebastião/SP]</span>{`
    │
    ├── `}<span className="leaf">Edição do Contrato</span>{`         · 5 tabs (Informações · Unidades · Documentos · Tags · Financeiro)
    ├── `}<span className="leaf">Indicadores de Presença</span>{`   · KPIs de conformidade documental
    │
    ├── `}<span className="branch">Profissionais</span>{`
    │   ├── `}<span className="leaf">Cadastro</span>{`               · lista nominal de plantonistas
    │   └── `}<span className="leaf">Documentação</span>{`           · matriz Profissional × Documento
    │       └── `}<span className="leaf">Histórico</span>{`         · versionamento e auditoria
    │
    ├── `}<span className="branch">Faturamento</span>{`
    │   ├── `}<span className="leaf">Gestão</span>{`                 · controle por profissional
    │   └── `}<span className="leaf">Fluxo Financeiro</span>{`       · kanban Valoração → Em Disputa → Faturadas
    │       ├── `}<span className="leaf">Detalhe Valoração</span>{`
    │       ├── `}<span className="leaf">Detalhe Em Disputa</span>{`
    │       └── `}<span className="leaf">Detalhe Faturado</span>{`
    │
    └── `}<span className="leaf">Unidades</span>{`                   · lista das unidades vinculadas ao contrato

`}<span className="note">// 14 páginas no contexto Contrato · mesma anatomia da sidebar, conteúdo permissionado</span>
        </div>

        <div className="fullbleed-image" style={{marginTop: 64}}>
          <img src="assets/screens/contexto-contratos-mapa.png" alt="Mapa do fluxo Contratos extraído do Figma — todas as telas e estados da jornada" />
          <div className="kicker" style={{marginTop: 20, textAlign: "center", color: "var(--text-dim)"}}>
            Fonte · documentação no Figma
          </div>
        </div>
      </div>
    </section>
  );
}

/* ============================================================
   Conexão entre contextos — Contrato → Unidade bridge
   ============================================================ */
function Conexao() {
  return (
    <section id="conexao" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">07</span>
          <span className="dot"></span>
          <span>Conexão entre contextos</span>
        </div>
        <h2 className="section-title">
          Quando o contrato te leva até a <em>unidade</em>.
        </h2>
        <p className="section-lede">Contrato e Unidade são pontos da mesma jornada. A sidebar reconfigura as páginas; o header do registro permanece.</p>

        <div className="bridge">
          <BridgePane
            label="Você está aqui"
            ctxTag="Contexto · Contrato"
            target={false}
            items={[
              { type: "section", text: "Contratos" },
              { type: "parent", text: "Lista de contratos" },
              { type: "active", text: "UPA 24hs São Sebastião", glyph: "●" },
              { type: "child", text: "Edição do contrato" },
              { type: "child", text: "Indicadores de Presença" },
              { type: "child", text: "Profissionais" },
              { type: "child", text: "Faturamento" },
              { type: "child highlight", text: "Unidades" }
            ]}
            canvasHeader={{
              kicker: "Lista de unidades vinculadas",
              title: "UPA 24hs São Sebastião/SP"
            }}
            canvasBlocks={["row","row","row","row","row","row"]}
          />

          <div className="bridge-arrow-cell">
            <div className="arrow-line"></div>
            <div className="arrow-label">Clica em Unidades</div>
            <div className="arrow-line"></div>
            <div className="arrow-head"></div>
          </div>

          <BridgePane
            label="Aprofundou em"
            ctxTag="Contexto · Unidade"
            target={true}
            items={[
              { type: "section", text: "Unidades" },
              { type: "parent", text: "Visão de Unidades" },
              { type: "active", text: "UPA 24hs São Sebastião", glyph: "●" },
              { type: "child", text: "Geral" },
              { type: "child", text: "Calendário / Escala" },
              { type: "child", text: "Plantão" },
              { type: "child", text: "Indicadores" },
              { type: "child", text: "Relatório de Pontos" }
            ]}
            canvasHeader={{
              kicker: "Operação · escala semanal",
              title: "UPA 24hs São Sebastião/SP"
            }}
            canvasBlocks={["calendar","row","row","row"]}
          />
        </div>

        <div className="fullbleed-image" style={{marginTop: 72}}>
          <img src="assets/screens/contexto-unidades-mapa.png" alt="Mapa do fluxo Unidades extraído do Figma — todas as telas da jornada operacional" />
          <div className="kicker" style={{marginTop: 20, textAlign: "center", color: "var(--text-dim)"}}>
            Fonte · documentação no Figma
          </div>
        </div>
      </div>
    </section>
  );
}

function BridgePane({ label, ctxTag, target, items, canvasHeader, canvasBlocks }) {
  return (
    <div className={"bridge-pane " + (target ? "target" : "")}>
      <div className="pane-label">
        <span>{label}</span>
        <span className="ctx-tag">{ctxTag}</span>
      </div>
      <div className="bridge-mock">
        <div className="bridge-sidebar">
          {items.map((it, i) => {
            const isHighlight = it.type.includes("highlight");
            const cls = "nav-item " + it.type.replace(" highlight", "");
            if (it.type === "section") {
              return <div key={i} className="nav-section">{it.text}</div>;
            }
            return (
              <div key={i} className={cls + (isHighlight ? " " : "")} style={isHighlight ? { color: "var(--accent)", background: "var(--accent-soft)", border: "1px dashed var(--accent-line)" } : null}>
                <span className="glyph">{it.glyph || (it.type === "active" ? "●" : it.type === "parent" ? "▸" : "·")}</span>
                <span>{it.text}</span>
              </div>
            );
          })}
        </div>
        <div className="bridge-canvas">
          <div className="canvas-header">
            <span className="static">{canvasHeader.kicker}</span>
            {canvasHeader.title}
          </div>
          <div className="canvas-body">
            {canvasBlocks.map((b, i) => (
              <div key={i} className={"canvas-block " + (b === "calendar" ? "calendar" : "")}></div>
            ))}
          </div>
        </div>
      </div>
    </div>
  );
}

/* ============================================================
   Favoritos — the personal cross-context layer
   ============================================================ */
function Favoritos() {
  const ctxCards = [
    {
      ctx: "Contrato",
      items: [
        { name: "Lista de contratos", starred: false },
        { name: "Edição do contrato", starred: true },
        { name: "Indicadores de Presença", starred: false },
        { name: "Fluxo Financeiro", starred: true }
      ]
    },
    {
      ctx: "Unidade",
      items: [
        { name: "Visão de Unidades", starred: false },
        { name: "Calendário / Escala", starred: true },
        { name: "Plantão", starred: false },
        { name: "Relatório de Pontos", starred: false }
      ]
    },
    {
      ctx: "ORG",
      items: [
        { name: "Configurações fiscais", starred: true },
        { name: "Hierarquia organizacional", starred: false }
      ]
    }
  ];
  // Flatten starred items into the favorites band, keeping origin
  const favs = ctxCards.flatMap(c => c.items.filter(i => i.starred).map(i => ({ name: i.name, origin: c.ctx })));

  return (
    <section id="favoritos" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">08</span>
          <span className="dot"></span>
          <span>Camada · Favoritos</span>
        </div>
        <h2 className="section-title">
          Sobre os contextos, uma <em>camada pessoal</em>.
        </h2>
        <p className="section-lede">O sétimo contexto: uma camada pessoal onde cada usuário fixa as páginas que mais usa, de qualquer contexto.</p>

        <div className="layer-showcase">
          <div className="layer-contexts">
            {ctxCards.map((c, i) => (
              <div key={i} className="layer-ctx-card">
                <div className="ctx-head">
                  <div className="ctx-name-mono">Contexto · <span>{c.ctx}</span></div>
                  <div className="ctx-count">{c.items.length} páginas</div>
                </div>
                <div className="ctx-items">
                  {c.items.map((it, j) => (
                    <div key={j} className={"ctx-item " + (it.starred ? "starred" : "")}>
                      <span className="glyph">▸</span>
                      <span>{it.name}</span>
                      {it.starred && <span className="star">★ fixado</span>}
                    </div>
                  ))}
                </div>
              </div>
            ))}

            <div className="layer-fav-band">
              <div className="fav-head">
                <span className="fav-icon">✦</span>
                <span className="fav-title">Favoritos</span>
                <span className="fav-sub">Camada pessoal · persiste em qualquer contexto</span>
              </div>
              <div className="fav-items">
                {favs.map((f, i) => (
                  <div key={i} className="fav-item">
                    <span className="fav-name">
                      <span className="star">★</span>
                      <span>{f.name}</span>
                    </span>
                    <span className="origin">{f.origin}</span>
                  </div>
                ))}
                <div className="fav-item add">+ Adicionar favorito</div>
              </div>
            </div>
          </div>

          <div className="layer-modal">
            <div className="lm-label">— Affordance · adicionar</div>
            <div className="lm-mock">
              <h4 className="lm-mock-title">Adicionar Favorito</h4>
              <p className="lm-mock-desc">Defina um apelido para encontrar essa página rapidamente na sua lista pessoal.</p>
              <div className="lm-input">
                <span className="placeholder">Nome do favorito…</span>
              </div>
              <div className="lm-actions">
                <div className="lm-btn secondary">Cancelar</div>
                <div className="lm-btn primary">Salvar</div>
              </div>
            </div>
            <p className="lm-caption">
              Acionável a partir do botão "+ Adicionar favorito" no rodapé da sidebar — disponível em <em style={{color: "var(--accent)", fontStyle: "italic"}}>todos os outros contextos</em>.
            </p>
          </div>
        </div>

        <div className="fullbleed-image" style={{marginTop: 72}}>
          <img src="assets/screens/contexto-favoritos-mapa.png" alt="Mapa do fluxo Favoritos extraído do Figma — adicionar, listar, editar e estado vazio" />
          <div className="kicker" style={{marginTop: 20, textAlign: "center", color: "var(--text-dim)"}}>
            Fonte · documentação no Figma
          </div>
        </div>
      </div>
    </section>
  );
}

/* ============================================================
   ORG — macro / executive view (rollup hierarchy)
   ============================================================ */
function Org() {
  const contratos = [
    { tag: "Contrato 01", name: "UPA 24h São Sebastião", value: "R$ 980.420", meta: "1 unidade · 25 médicos" },
    { tag: "Contrato 02", name: "Hospital de Clínicas Costa Sul", value: "R$ 1.124.300", meta: "1 unidade · 25 médicos" },
    { tag: "Contrato 03", name: "UPA Nossa Senhora Aparecida", value: "R$ 742.800", meta: "1 unidade · 13 médicos" }
  ];
  const unidades = [
    { name: "UPA São Sebastião", value: "R$ 980k" },
    { name: "HCS Boiçucanga",    value: "R$ 1.1M" },
    { name: "UPA N.S. Aparecida", value: "R$ 742k" },
    { name: "UPA Vergueiro",     value: "R$ 510k" },
    { name: "Pref. Guarujá A",   value: "R$ 380k" },
    { name: "Pref. Guarujá B",   value: "R$ 320k" }
  ];

  return (
    <section id="org" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">09</span>
          <span className="dot"></span>
          <span>Macro · ORG</span>
        </div>
        <h2 className="section-title">
          Em ORG, o produto vira <em>executivo</em>.
        </h2>
        <p className="section-lede">O nível executivo — diretor, CFO, compliance. Os mesmos componentes do Contrato, agregados por toda a organização.</p>

        <div className="rollup">
          {/* Tier 1 — ORG */}
          <div className="org-card">
            <div className="org-label">Contexto · ORG · Med Plus</div>
            <h3 className="org-title">Operação consolidada do <em>trimestre</em></h3>
            <div className="org-kpi-row">
              <div className="org-kpi">
                <div className="k">Faturamento total</div>
                <div className="v"><em>R$ 2,84M</em></div>
              </div>
              <div className="org-kpi">
                <div className="k">Médicos ativos</div>
                <div className="v">63</div>
              </div>
              <div className="org-kpi">
                <div className="k">Documentos sob gestão</div>
                <div className="v">6.344</div>
              </div>
              <div className="org-kpi">
                <div className="k">Conformidade</div>
                <div className="v">98,5%</div>
              </div>
            </div>
          </div>

          <div className="rollup-arrow">
            <div className="line"></div>
            <span>drill-down · um contrato por vez</span>
            <div className="line"></div>
            <div className="arrow"></div>
          </div>

          {/* Tier 2 — Contratos */}
          <div className="rollup-tier tier-contratos">
            {contratos.map((c, i) => (
              <div key={i} className="contrato-card">
                <div className="c-tag">{c.tag}</div>
                <div className="c-name">{c.name}</div>
                <div className="c-value">{c.value}</div>
                <div className="c-meta">{c.meta}</div>
              </div>
            ))}
          </div>

          <div className="rollup-arrow">
            <div className="line"></div>
            <span>drill-down · uma unidade por vez</span>
            <div className="line"></div>
            <div className="arrow"></div>
          </div>

          {/* Tier 3 — Unidades */}
          <div className="rollup-tier tier-unidades">
            {unidades.map((u, i) => (
              <div key={i} className="unidade-chip">
                <div className="u-name">{u.name}</div>
                <div className="u-value">{u.value}</div>
              </div>
            ))}
          </div>
        </div>

        <div className="kicker" style={{marginTop: 80, marginBottom: 16}}>Mesma anatomia, três escalas de decisão</div>
        <div className="rollup-personas">
          <div className="persona-card">
            <div className="p-scale macro">Macro · ORG</div>
            <h4>Estratégico</h4>
            <p>Decisões de negócio: aceitar um novo contrato? Onde está o gargalo de margem? Qual filial precisa de atenção?</p>
            <div className="p-question">"A operação inteira está saudável?"</div>
          </div>
          <div className="persona-card">
            <div className="p-scale meso">Meso · Contrato</div>
            <h4>Tático</h4>
            <p>Decisões de gestão de contrato: documentação em dia? Faturamento bate com escalas? Profissionais regularizados?</p>
            <div className="p-question">"Este contrato está saudável?"</div>
          </div>
          <div className="persona-card">
            <div className="p-scale micro">Micro · Unidade</div>
            <h4>Operacional</h4>
            <p>Decisões de chão de fábrica: quem está de plantão amanhã? Qual médico não validou ponto? Tem cobertura para o feriado?</p>
            <div className="p-question">"O plantão de amanhã está coberto?"</div>
          </div>
        </div>

        <div className="fullbleed-image" style={{marginTop: 72}}>
          <img src="assets/screens/contexto-org-mapa.png" alt="Mapa do fluxo ORG extraído do Figma — dashboard financeiro, documentação consolidada, profissionais e histórico" />
          <div className="kicker" style={{marginTop: 20, textAlign: "center", color: "var(--text-dim)"}}>
            Fonte · documentação no Figma
          </div>
        </div>
      </div>
    </section>
  );
}

/* ============================================================
   Backoffice — admin panel · permissions matrix
   ============================================================ */
function Backoffice() {
  // Profile rows × Context columns
  const contexts = ["Backoffice", "Base Global", "ORG", "Contratos", "Unidades", "Favoritos"];
  const profiles = [
    { name: "Admin Plenno",            tag: "interno · time produto",  perms: ["full", "full", "full", "full", "full", "full"], plenno: true },
    { name: "Diretor da Organização",  tag: "executivo · cliente",     perms: ["none", "none", "full", "full", "full", "full"] },
    { name: "Gestor de Contrato",      tag: "operacional · cliente",   perms: ["none", "none", "partial", "full", "full", "full"] },
    { name: "Coordenador de Unidade",  tag: "chão · cliente",          perms: ["none", "none", "none", "partial", "full", "full"] },
    { name: "Médico (autoatendimento)", tag: "ponta · profissional",    perms: ["none", "none", "none", "none", "partial", "full"] }
  ];

  const renderMark = (p) => {
    if (p === "full") return <div className="perm-mark full">✓</div>;
    if (p === "partial") return <div className="perm-mark partial">~</div>;
    return <div className="perm-mark none">·</div>;
  };

  return (
    <section id="backoffice" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">10</span>
          <span className="dot"></span>
          <span>Painel · Backoffice</span>
        </div>
        <h2 className="section-title">
          Onde o time <em>Plenno</em> opera a plataforma.
        </h2>
        <p className="section-lede">O único contexto interno: o time Plenno gere permissões, organizações e usuários — em 4 níveis, multi-tenant.</p>

        <div className="perm-matrix">
          <div className="perm-matrix-head">
            <div>
              <div className="label">Quem vê o quê · matriz de permissões</div>
              <h3>Cada perfil enxerga apenas os contextos da sua jornada</h3>
            </div>
            <div className="legend">
              <span><span className="key full">✓</span> acesso total</span>
              <span><span className="key partial">~</span> acesso parcial</span>
              <span><span className="key none">·</span> bloqueado</span>
            </div>
          </div>
          <div className="perm-grid">
            <div className="perm-cell corner"></div>
            {contexts.map(c => (
              <div key={c} className="perm-cell col-head">{c}</div>
            ))}
            {profiles.map((p, ri) => (
              <React.Fragment key={ri}>
                <div className={"perm-cell row-head " + (p.plenno ? "plenno" : "")}>
                  {p.name}
                  <span className="role-tag">{p.tag}</span>
                </div>
                {p.perms.map((perm, ci) => (
                  <div key={ci} className="perm-cell">{renderMark(perm)}</div>
                ))}
              </React.Fragment>
            ))}
          </div>
        </div>

        <div className="bulk-card">
          <div className="bulk-text">
            <div className="label">Recurso exclusivo · Backoffice</div>
            <h4>Profissionais em <em>lote</em></h4>
            <p>Operação para cadastrar centenas de médicos de uma vez via planilha modelo. O usuário baixa o template, preenche, valida campos no upload e o sistema importa — com pré-visualização de erros antes de comprometer dados.</p>
            <p style={{margin: 0, fontSize: 13}}>É uma das poucas ferramentas do Plenno que só existe em Backoffice. Faz sentido: só o time Plenno onboarda novos contratos com profissionais ainda não cadastrados.</p>
          </div>
          <div className="bulk-visual">
            <div className="bulk-tile">
              <span className="ico">↓</span>
              Download<br/>template
            </div>
            <div className="bulk-tile primary">
              <span className="ico">↑</span>
              Upload<br/>preenchido
            </div>
            <div className="bulk-tile" style={{gridColumn: "span 2"}}>
              <span className="ico" style={{color: "var(--plenno-faturada)"}}>✓</span>
              Validação inline · 200 registros em um envio
            </div>
          </div>
        </div>

        <div className="fullbleed-image" style={{marginTop: 72}}>
          <img src="assets/screens/contexto-backoffice-mapa.png" alt="Mapa do fluxo Backoffice extraído do Figma — permissões em 4 níveis, organizações, usuários e profissionais em lote" />
          <div className="kicker" style={{marginTop: 20, textAlign: "center", color: "var(--text-dim)"}}>
            Fonte · documentação no Figma
          </div>
        </div>
      </div>
    </section>
  );
}

/* ============================================================
   Base Global — single source of truth · user-menu entry point
   ============================================================ */
function BaseGlobal() {
  const appearances = [
    { ctx: "Contrato",   name: "UPA 24h São Sebastião — Pediatria",     status: "active" },
    { ctx: "Contrato",   name: "Hospital de Clínicas Costa Sul",        status: "active" },
    { ctx: "Histórico",  name: "Clínica São Paulo · 2018–2020",         status: "past" },
    { ctx: "Histórico",  name: "Hospital Santa Cruz · 2020–2023",       status: "past" },
    { ctx: "Unidade",    name: "Ambulatório de Referência · Plantão D",  status: "active" }
  ];

  return (
    <section id="baseglobal" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">11</span>
          <span className="dot"></span>
          <span>Registro · Base Global</span>
        </div>
        <h2 className="section-title">
          A <em>fonte única</em> da verdade sobre profissionais.
        </h2>
        <p className="section-lede">Registro mestre de cada profissional. Existe uma vez e alimenta todos os contratos — fim da duplicação.</p>

        {/* Entry point — user menu dropdown */}
        <div className="bg-entry">
          <div className="bg-entry-mock">
            <div className="callout">
              <span>Entrada</span>
              <span className="arrow">↗</span>
            </div>
            <div className="topbar">
              <div className="logo">plenno</div>
              <div className="user-pill">
                <span className="avatar">NU</span>
                <span>Nome do Usuário</span>
                <span className="chev">▾</span>
              </div>
            </div>
            <div className="sidebar-ghost">
              <div className="ico-square"></div>
              <div className="ico-square"></div>
              <div className="ico-square"></div>
            </div>
            <div className="canvas-ghost"></div>
            <div className="dropdown">
              <div className="email">nomedousuario@gmail.com</div>
              <div className="item">
                <span className="ico">⬚</span>
                <span>Backoffice</span>
              </div>
              <div className="item highlight">
                <span className="ico">⬛</span>
                <span>Base de Profissionais</span>
              </div>
              <div className="item sep">
                <span className="ico">↗</span>
                <span>Ir para a Plenno</span>
              </div>
              <div className="item">
                <span className="ico">⤴</span>
                <span>Sair</span>
              </div>
              <div className="version">Versão 9.1.3</div>
            </div>
          </div>
          <div className="bg-entry-explain">
            <div className="label">Acesso · menu de usuário</div>
            <h4>Não vive no sidebar. Vive no <em>menu de quem você é</em>.</h4>
            <p>Base Global e Backoffice são os únicos contextos que <em style={{fontStyle: "italic", color: "var(--text)"}}>não</em> aparecem na navegação lateral. O acesso é feito a partir do dropdown do usuário no canto superior direito.</p>
            <p>É uma decisão deliberada: separar o que se faz <em style={{fontStyle: "italic", color: "var(--text)"}}>todos os dias</em> (Contratos, Unidades, Favoritos) do que se configura <em style={{fontStyle: "italic", color: "var(--text)"}}>raramente</em> (Base de profissionais, Backoffice). Cada espaço tem um peso diferente — e o cérebro do usuário aprende isso em uma sessão.</p>
          </div>
        </div>

        {/* Constellation — single record, many appearances */}
        <div className="bg-constellation">
          <div className="kicker">Um registro · muitas aparições</div>
          <div className="bg-constellation-grid">
            <div className="bg-record-card">
              <div className="label">Registro · Base Global</div>
              <div className="name">Dr. Alberto Pereira da Silva Oliveira</div>
              <div className="role">Médico · Pediatra</div>
              <div className="specs">
                <span className="tag">CRM/SP 158432</span>
                <span className="tag">CPF 123.***.789-10</span>
                <span className="tag">Pediatria</span>
              </div>
              <div className="score">
                <span className="score-val"><em>99</em>/100</span>
                <span className="score-label">Score · pontualidade + avaliação</span>
              </div>
            </div>

            <div className="bg-connector dual">
              <span>vinculado a</span>
              <span style={{color: "var(--accent)", fontFamily: "var(--font-mono)", fontSize: 18}}>→</span>
            </div>

            <div className="bg-appearances">
              {appearances.map((a, i) => (
                <div key={i} className="bg-appearance">
                  <div>
                    <div className="a-context">{a.ctx}</div>
                    <div className="a-name">{a.name}</div>
                  </div>
                  <span className={"a-status " + a.status}>
                    {a.status === "active" ? "Ativo" : "Concluído"}
                  </span>
                </div>
              ))}
            </div>
          </div>
        </div>

        <div className="fullbleed-image" style={{marginTop: 72}}>
          <img src="assets/screens/contexto-base-global-mapa.png" alt="Mapa do contexto Base Global no Figma — Sidebar expandida e colapsada com Lista de Profissionais e Detalhes do Profissional" />
          <div className="kicker" style={{marginTop: 20, textAlign: "center", color: "var(--text-dim)"}}>
            Fonte · documentação no Figma
          </div>
        </div>
      </div>
    </section>
  );
}

/* ============================================================
   Usuário Não Configurado — the seventh context · silence
   ============================================================ */
function NaoConfigurado() {
  return (
    <section id="naoconfig" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">12</span>
          <span className="dot"></span>
          <span>Estado · Não Configurado</span>
        </div>
        <h2 className="section-title">
          O sétimo contexto é o <em>silêncio</em>.
        </h2>
        <p className="section-lede">Sem permissão para a camada acessada, a navegação se recolhe e sobra uma mensagem clara com o próximo passo.</p>

        <div className="empty-mock">
          <div className="annotation header-anno">
            <span className="label-box">Context header removido</span>
            <span className="leader"></span>
          </div>
          <div className="annotation sidebar-anno">
            <span className="label-box">Sidebar removida</span>
            <span className="leader"></span>
          </div>
          <div className="topbar">
            <div className="logo">plenno</div>
            <div className="user-pill">
              <span className="avatar">CM</span>
              <span>Nome do Usuário ▾</span>
            </div>
          </div>
          <div className="stage">
            <div className="empty-state">
              <svg className="icon-no" viewBox="0 0 56 56" fill="none" xmlns="http://www.w3.org/2000/svg">
                <circle cx="28" cy="28" r="26" stroke="currentColor" strokeWidth="2.5"/>
                <line x1="9.5" y1="9.5" x2="46.5" y2="46.5" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round"/>
              </svg>
              <h3>Acesso indisponível</h3>
              <p className="desc-strong">Suas permissões ainda não foram configuradas.</p>
              <p className="desc">Seu usuário está ativo, mas precisa de permissões específicas para acessar esta área.</p>
              <p className="desc">Entre em contato com a gestão para configurar suas permissões.</p>
              <div className="wordmark">
                <svg width="22" height="22" viewBox="0 0 22 22" fill="none">
                  <path d="M3 3 L19 3 L11 19 Z" fill="var(--plenno-teal)" />
                </svg>
                plenno
              </div>
            </div>
          </div>
        </div>

        {/* Side-by-side: normal vs absent */}
        <div className="empty-compare">
          <div className="empty-compare-card">
            <div className="ec-head">
              <span>Contexto autorizado</span>
              <span className="tag normal">● navegação presente</span>
            </div>
            <div className="ec-body">
              <div className="ec-tb"></div>
              <div className="ec-sb">
                <div className="ec-item"></div>
                <div className="ec-item"></div>
                <div className="ec-item"></div>
                <div className="ec-item"></div>
                <div className="ec-item"></div>
              </div>
              <div className="ec-canvas">
                <div className="ec-header"></div>
                <div className="ec-line"></div>
                <div className="ec-line" style={{width: "70%"}}></div>
                <div className="ec-line" style={{width: "85%"}}></div>
                <div className="ec-line" style={{width: "60%"}}></div>
              </div>
            </div>
          </div>
          <div className="empty-compare-card absent">
            <div className="ec-head">
              <span>Sem permissão</span>
              <span className="tag absent">● tudo se cala</span>
            </div>
            <div className="ec-body">
              <div className="ec-tb"></div>
              <div className="ec-sb">
                <div className="ec-item"></div>
                <div className="ec-item"></div>
                <div className="ec-item"></div>
                <div className="ec-item"></div>
                <div className="ec-item"></div>
              </div>
              <div className="ec-canvas">
                <div className="ec-message">⊘ Acesso indisponível</div>
                <div className="ec-message-sub">Permissões ainda não configuradas</div>
              </div>
            </div>
          </div>
        </div>

        <div className="fullbleed-image" style={{marginTop: 72}}>
          <img src="assets/screens/contexto-naoconfig-mapa.png" alt="Mapa do contexto Usuário Não Configurado no Figma — tela de Acesso indisponível com nota explicativa" />
          <div className="kicker" style={{marginTop: 20, textAlign: "center", color: "var(--text-dim)"}}>
            Fonte · documentação no Figma
          </div>
        </div>
      </div>
    </section>
  );
}

/* ============================================================
   Telas — gallery with expand/collapse toggle
   ============================================================ */
function Telas({ globalState, setGlobalState }) {
  return (
    <section id="telas" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">04</span>
          <span className="dot"></span>
          <span>Telas principais</span>
        </div>
        <h2 className="section-title">
          Nove telas, <em>duas leituras</em> cada.
        </h2>
        <p className="section-lede">Cada página do Contrato em duas leituras — expandida e colapsada. Use o controle para alternar todas.</p>

        <div className="demo-toggle-bar">
          <span>Estado da sidebar:</span>
          <div className="toggle-pills" role="tablist" aria-label="Estado da sidebar">
            <button
              className={globalState === "expanded" ? "active" : ""}
              onClick={() => setGlobalState("expanded")}
              role="tab"
              aria-selected={globalState === "expanded"}
            >Expandida</button>
            <button
              className={globalState === "collapsed" ? "active" : ""}
              onClick={() => setGlobalState("collapsed")}
              role="tab"
              aria-selected={globalState === "collapsed"}
            >Colapsada</button>
          </div>
          <span style={{color: "var(--text-dim)"}}>· clica em qualquer tela pra alternar individualmente</span>
        </div>

        <div className="screens-grid">
          {SCREENS_GALLERY.map((s, i) => (
            <ScreenRow key={s.num} screen={s} reverse={i % 2 === 1} globalState={globalState} />
          ))}
        </div>
      </div>
    </section>
  );
}

function ScreenRow({ screen, reverse, globalState }) {
  const [local, setLocal] = useState(null); // null = follow global, "expanded" or "collapsed" = override
  const effective = local || globalState;
  const flip = () => setLocal(effective === "expanded" ? "collapsed" : "expanded");
  return (
    <div className={"screen-row " + (reverse ? "reverse" : "")}>
      <div className="screen-visual">
        <div className="screen-frame" onClick={flip} style={{cursor: "pointer"}} title="Clique para alternar estado">
          <img
            src={effective === "expanded" ? screen.expanded : screen.collapsed}
            alt={screen.title + " — sidebar " + (effective === "expanded" ? "expandida" : "colapsada")}
          />
          <div className="frame-caption">
            <span>plenno · contexto contrato</span>
            <span className="state">
              <span className="dot"></span>
              sidebar {effective === "expanded" ? "expandida" : "colapsada"}
            </span>
          </div>
        </div>
      </div>
      <div className="screen-text">
        <div className="num">Tela {screen.num}</div>
        <h3>
          {screen.title} <br />
          <em>· {screen.italic}</em>
        </h3>
        <p>{screen.desc}</p>
        <div className="tag-list">
          {screen.tags.map(t => <span className="tag" key={t}>{t}</span>)}
        </div>
      </div>
    </div>
  );
}

/* ============================================================
   Sistema · Design System & Microinterações
   ============================================================ */
function Sistema() {
  return (
    <section id="sistema" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">08</span>
          <span className="dot"></span>
          <span>Sistema · DS & Microinterações</span>
        </div>
        <h2 className="section-title">
          O novo componente nasceu <em>dentro</em> do design system.
        </h2>
        <p className="section-lede">Todas as variações entraram no design system do produto: tokens, estados e acessibilidade documentados.</p>

        <div className="kicker" style={{marginTop: 56, marginBottom: 16}}>Tokens semânticos do produto</div>
        <div className="ds-grid">
          <div className="ds-token">
            <div className="swatch" style={{background: "var(--plenno-teal)"}}></div>
            <div className="name">brand / primary</div>
            <div className="hex">Plenno Teal · #0F5C5C</div>
          </div>
          <div className="ds-token">
            <div className="swatch" style={{background: "var(--plenno-valoracao)"}}></div>
            <div className="name">state / valoracao</div>
            <div className="hex">#F59E0B · em apuração</div>
          </div>
          <div className="ds-token">
            <div className="swatch" style={{background: "var(--plenno-disputa)"}}></div>
            <div className="name">state / disputa</div>
            <div className="hex">#A855F7 · contestada</div>
          </div>
          <div className="ds-token">
            <div className="swatch" style={{background: "var(--plenno-faturada)"}}></div>
            <div className="name">state / faturada</div>
            <div className="hex">#10B981 · paga</div>
          </div>
        </div>

        <div className="kicker" style={{marginTop: 64, marginBottom: 16}}>Tipografia do produto</div>
        <div className="ds-type-grid">
          <div className="ds-type">
            <div className="sample" style={{fontSize: 32, fontWeight: 500, letterSpacing: "-0.01em"}}>UPA 24 Horas</div>
            <div className="meta">Display · 32 / 600 / -1% tracking</div>
          </div>
          <div className="ds-type">
            <div className="sample" style={{fontSize: 18, fontWeight: 500}}>Fluxo Financeiro</div>
            <div className="meta">Section · 18 / 500 / 0% tracking</div>
          </div>
          <div className="ds-type">
            <div className="sample" style={{fontSize: 14, color: "var(--text-muted)"}}>Lista de contratos · UPA 24hs</div>
            <div className="meta">Body · 14 / 400 / 0% tracking</div>
          </div>
          <div className="ds-type">
            <div className="sample" style={{fontFamily: "var(--font-mono)", fontSize: 11, letterSpacing: "0.08em", textTransform: "uppercase", color: "var(--text-muted)"}}>71.041.289 / 0001-35</div>
            <div className="meta">Mono caps · 11 / 500 / +8% tracking</div>
          </div>
        </div>

        <div className="kicker" style={{marginTop: 64, marginBottom: 16}}>Microinterações chave</div>
        <div className="micro-grid">
          <div className="micro-card">
            <div className="micro-visual">
              <div className="nub-demo">
                <div className="panel"></div>
                <div className="canvas"></div>
                <div className="nub"></div>
              </div>
            </div>
            <h4>Toggle de borda viva</h4>
            <p>Um botão circular ancorado na divisão entre sidebar e conteúdo. Em vez de viver dentro do menu, ele “mora na fronteira” — sempre acessível, independente do estado.</p>
          </div>
          <div className="micro-card">
            <div className="micro-visual">
              <FavoritoDemo />
            </div>
            <h4>Favoritos persistentes</h4>
            <p>O usuário fixa páginas frequentes na base da sidebar. Atalho que sobrevive a trocas de contexto — uma camada pessoal sobre a camada permissionada.</p>
          </div>
          <div className="micro-card">
            <div className="micro-visual">
              <ThemeDemo />
            </div>
            <h4>Modo Claro / Escuro</h4>
            <p>Toggle persistente no rodapé da sidebar, em vez de escondido em configurações. Acessível em um clique de qualquer página.</p>
          </div>
          <div className="micro-card">
            <div className="micro-visual">
              <CrumbDemo />
            </div>
            <h4>Hierarquia visível</h4>
            <p>O contrato selecionado fica destacado e abre um nível filho sem perder o pai. A âncora visual elimina a sensação de “onde estou?”.</p>
          </div>
        </div>
      </div>
    </section>
  );
}

function FavoritoDemo() {
  return (
    <svg width="180" height="100" viewBox="0 0 180 100" style={{opacity: 0.95}}>
      <rect x="10" y="10" width="160" height="22" rx="6" fill="var(--bg-elev)" stroke="var(--border)" />
      <text x="22" y="25" fontFamily="var(--font-mono)" fontSize="9" fill="var(--text-muted)" letterSpacing="1">★ FAVORITOS</text>
      <rect x="10" y="40" width="160" height="14" rx="4" fill="var(--bg-elev)" />
      <text x="22" y="50" fontFamily="var(--font-mono)" fontSize="8" fill="var(--text)">Fluxo financeiro</text>
      <rect x="10" y="58" width="160" height="14" rx="4" fill="var(--bg-elev)" />
      <text x="22" y="68" fontFamily="var(--font-mono)" fontSize="8" fill="var(--text)">Documentação</text>
      <rect x="10" y="76" width="160" height="14" rx="4" fill="var(--accent-soft)" stroke="var(--accent-line)" />
      <text x="22" y="86" fontFamily="var(--font-mono)" fontSize="8" fill="var(--accent)">+ Adicionar favorito</text>
    </svg>
  );
}

function ThemeDemo() {
  return (
    <svg width="180" height="36" viewBox="0 0 180 36">
      <rect x="10" y="6" width="160" height="24" rx="12" fill="var(--bg-elev)" stroke="var(--border)" />
      <rect x="14" y="10" width="76" height="16" rx="8" fill="var(--accent-soft)" stroke="var(--accent-line)" />
      <text x="52" y="21" textAnchor="middle" fontFamily="var(--font-mono)" fontSize="9" fill="var(--accent)" letterSpacing="0.5">MODO CLARO ☀</text>
      <text x="128" y="21" textAnchor="middle" fontFamily="var(--font-mono)" fontSize="9" fill="var(--text-dim)" letterSpacing="0.5">MODO ESCURO ☾</text>
    </svg>
  );
}

function CrumbDemo() {
  return (
    <svg width="180" height="100" viewBox="0 0 180 100" style={{opacity: 0.95}}>
      <text x="10" y="18" fontFamily="var(--font-mono)" fontSize="9" fill="var(--text-muted)">▾ Contratos</text>
      <text x="20" y="34" fontFamily="var(--font-mono)" fontSize="9" fill="var(--text)">▸ Lista de contratos</text>
      <text x="20" y="50" fontFamily="var(--font-mono)" fontSize="9" fill="var(--accent)">● UPA 24hs São Sebastião</text>
      <text x="34" y="66" fontFamily="var(--font-mono)" fontSize="9" fill="var(--text-muted)">→ Edição do contrato</text>
      <text x="34" y="80" fontFamily="var(--font-mono)" fontSize="9" fill="var(--text-muted)">→ Indicadores</text>
      <text x="34" y="94" fontFamily="var(--font-mono)" fontSize="9" fill="var(--text-muted)">→ Profissionais ▸</text>
    </svg>
  );
}

/* ============================================================
   Resultados (qualitative, honest)
   ============================================================ */
function Resultados() {
  return (
    <section id="resultados" className="section scroll-mark">
      <div className="container">
        <div className="section-meta">
          <span className="num">05</span>
          <span className="dot"></span>
          <span>Resultados & Impacto</span>
        </div>
        <h2 className="section-title">
          Os usuários relataram <em>encontrar</em> as ferramentas mais rápido.
        </h2>
        <p className="section-lede">O sinal mais consistente veio do uso: a navegação saiu do caminho. Em entrevistas, gestores disseram “saber onde estão”.</p>

        <div className="results-grid">
          <div className="result-card">
            <div className="icon">↑</div>
            <h4>Localização <em>imediata</em></h4>
            <p>Usuários reportaram melhora na velocidade para encontrar páginas e ferramentas que utilizam no dia-a-dia.</p>
          </div>
          <div className="result-card">
            <div className="icon">◷</div>
            <h4>Menos rolagem <em>horizontal</em></h4>
            <p>A sidebar colapsada liberou espaço crítico em telas com tabelas densas (Faturamento, Documentação) — viabilizando trabalho em monitores menores.</p>
          </div>
          <div className="result-card">
            <div className="icon">⌘</div>
            <h4>Reuso de <em>padrão</em></h4>
            <p>O mesmo componente serve sete jornadas. O time de produto passou a criar novos módulos sem reinventar navegação.</p>
          </div>
          <div className="result-card">
            <div className="icon">✱</div>
            <h4>Onboarding mais <em>curto</em></h4>
            <p>Novos clientes passam menos tempo explorando o menu — o contexto já guia para onde ir, em vez de exigir mapa mental.</p>
          </div>
        </div>

        <div className="pullquote">
          <q>Antes eu abria a navegação e travava. Hoje sinto que ela já sabe o que eu vim fazer.</q>
          <div className="attr">— Gestora financeira, cliente Plenno · feedback pós-lançamento</div>
        </div>

        <div className="kicker" style={{marginTop: 64, marginBottom: 16}}>Considerações finais</div>
        <p style={{fontFamily: "var(--font-display)", fontSize: 24, lineHeight: 1.4, maxWidth: 760}}>
          O projeto consolidou na minha prática a ideia de que <em style={{fontStyle: "italic", color: "var(--accent)"}}>navegação é arquitetura, não decoração</em>. Ela carrega a maior parte do contrato entre produto e usuário sobre “onde estou” e “para onde posso ir”.
        </p>
        <p style={{fontFamily: "var(--font-display)", fontSize: 24, lineHeight: 1.4, maxWidth: 760}}>
          Os sete contextos estão documentados — do operacional ao silencioso. Cada um carrega uma decisão de design própria, e juntos formam o sistema de navegação do Plenno.
        </p>
      </div>
    </section>
  );
}

/* ============================================================
   Footer
   ============================================================ */
function Footer() {
  return (
    <footer style={{ background:"var(--bg-card)", borderTop:"1px solid var(--border)" }}>
      <div style={{ maxWidth:1180, margin:"0 auto", padding:"40px 24px", display:"grid", gridTemplateColumns:"1fr auto 1fr", alignItems:"center", gap:20 }}>
        <span></span>
        <a href="../../index.html" style={{ fontSize:15, color:"var(--text)", textDecoration:"none", borderBottom:"1px solid var(--text)", paddingBottom:3, justifySelf:"center", whiteSpace:"nowrap" }}>Todos os projetos</a>
        <a href="../../cortex.html" style={{ fontSize:16, color:"var(--text-muted)", textDecoration:"none", textAlign:"right" }}>Cortex DS →</a>
      </div>
      <div style={{ maxWidth:1180, margin:"0 auto", padding:"30px 24px 64px", textAlign:"center", borderTop:"1px solid var(--border)" }}>
        <a href="mailto:loupraxedes@gmail.com" style={{ fontFamily:"var(--font-mono)", fontSize:14, color:"var(--text-muted)", textDecoration:"none", wordBreak:"break-word" }}>loupraxedes@gmail.com</a>
        <p style={{ margin:"18px 0 0", fontFamily:"var(--font-mono)", fontSize:12, letterSpacing:"0.04em", color:"var(--text-muted)" }}>© 2026 Lou Praxedes</p>
      </div>
    </footer>
  );
}

/* ============================================================
   Main App — wires tweaks, scroll-spy, theme
   ============================================================ */
function App() {
  const [t, setTweak] = window.useTweaks(TWEAK_DEFAULTS);

  // Theme on html
  useEffect(() => {
    document.documentElement.setAttribute("data-theme", t.theme);
  }, [t.theme]);

  // Accent
  useEffect(() => {
    document.documentElement.style.setProperty("--accent", t.accent);
    document.documentElement.style.setProperty("--accent-soft", t.accent + "1f");
    document.documentElement.style.setProperty("--accent-line", t.accent + "40");
  }, [t.accent]);

  // Typeface
  useEffect(() => {
    const tf = TYPEFACE_OPTIONS.find(o => o.id === t.typeface) || TYPEFACE_OPTIONS[0];
    document.documentElement.style.setProperty("--font-display", tf.display);
    document.documentElement.style.setProperty("--font-body", tf.body);
  }, [t.typeface]);

  // Scroll-spy
  const [active, setActive] = useState(SECTIONS[0].id);
  useEffect(() => {
    const opts = { rootMargin: "-40% 0% -50% 0%" };
    const obs = new IntersectionObserver((entries) => {
      entries.forEach(e => {
        if (e.isIntersecting) setActive(e.target.id);
      });
    }, opts);
    SECTIONS.forEach(s => {
      const el = document.getElementById(s.id);
      if (el) obs.observe(el);
    });
    return () => obs.disconnect();
  }, []);

  // Global state for screens gallery toggle
  const [globalScreenState, setGlobalScreenState] = useState("expanded");

  // Lightbox state — captures clicks on .fullbleed-image img anywhere on the page
  const [lightbox, setLightbox] = useState(null); // { src, alt }
  const [zoom, setZoom] = useState(1);

  useEffect(() => {
    const onClick = (e) => {
      const img = e.target.closest && e.target.closest('.fullbleed-image img');
      if (img) {
        e.preventDefault();
        setLightbox({ src: img.src, alt: img.alt || '' });
        setZoom(1);
      }
    };
    document.addEventListener('click', onClick);
    return () => document.removeEventListener('click', onClick);
  }, []);

  useEffect(() => {
    if (!lightbox) return;
    const onKey = (e) => {
      if (e.key === 'Escape') setLightbox(null);
      else if (e.key === '+' || e.key === '=') setZoom(z => Math.min(z + 0.25, 3));
      else if (e.key === '-' || e.key === '_') setZoom(z => Math.max(z - 0.25, 0.5));
      else if (e.key === '0') setZoom(1);
    };
    document.addEventListener('keydown', onKey);
    return () => document.removeEventListener('keydown', onKey);
  }, [lightbox]);

  const { TweaksPanel, TweakSection, TweakRadio, TweakColor, TweakSelect } = window;

  return (
    <>
      <TopNav active={active} />
      <main>
        <Hero />
        <section style={{ background: "#fff", borderTop: "1px solid #ece8e0", borderBottom: "1px solid #ece8e0" }}>
          <div style={{ maxWidth: 1180, margin: "0 auto", padding: "46px 56px", display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(150px, 1fr))", gap: 28 }}>
            {[["7", "Contextos de navegação"], ["9", "Telas documentadas"], ["4", "Níveis de permissão"], ["2", "Modos · expandida e colapsada"]].map(function (m, i) {
              return (
                <div key={i} style={{ display: "flex", flexDirection: "column", gap: 8 }}>
                  <span style={{ fontFamily: "var(--font-display, Geist)", fontSize: 48, fontWeight: 600, letterSpacing: "-0.03em", color: "#0F5C5C", lineHeight: 1 }}>{m[0]}</span>
                  <span className="metric-label" style={{ fontSize: 14, lineHeight: 1.4, color: "#6b6760" }}>{m[1]}</span>
                </div>
              );
            })}
          </div>
        </section>
        <Contexto />
        <Problema />
        <Contextos />
        <Telas globalState={globalScreenState} setGlobalState={setGlobalScreenState} />
        <Resultados />
      </main>
      <Footer />

      <TweaksPanel title="Tweaks">
        <TweakSection label="Tema" />
        <TweakRadio
          label="Modo"
          value={t.theme}
          options={[{ value: "light", label: "Claro" }, { value: "dark", label: "Escuro" }]}
          onChange={(v) => setTweak("theme", v)}
        />
        <TweakSection label="Acento" />
        <TweakColor
          label="Cor de destaque"
          value={t.accent}
          options={ACCENT_OPTIONS}
          onChange={(v) => setTweak("accent", v)}
        />
        <TweakSection label="Tipografia" />
        <TweakSelect
          label="Pareamento"
          value={t.typeface}
          options={TYPEFACE_OPTIONS.map(o => ({ value: o.id, label: o.name }))}
          onChange={(v) => setTweak("typeface", v)}
        />
      </TweaksPanel>

      {/* Lightbox overlay — opens when any .fullbleed-image img is clicked */}
      <div
        className={"lightbox" + (lightbox ? " open" : "")}
        onClick={(e) => { if (e.target.className && e.target.className.includes && e.target.className.includes('lightbox')) setLightbox(null); }}
      >
        {lightbox && (
          <>
            <button className="lightbox-close" onClick={() => setLightbox(null)} aria-label="Fechar">×</button>
            <div className="lightbox-toolbar">
              <button onClick={() => setZoom(z => Math.max(z - 0.25, 0.5))} aria-label="Diminuir zoom">−</button>
              <span className="zoom-label">{Math.round(zoom * 100)}%</span>
              <button onClick={() => setZoom(z => Math.min(z + 0.25, 3))} aria-label="Aumentar zoom">+</button>
              <button onClick={() => setZoom(1)} aria-label="Resetar zoom" title="Resetar zoom" style={{fontSize: 11}}>1:1</button>
            </div>
            <div className="lightbox-stage">
              <img src={lightbox.src} alt={lightbox.alt} style={{transform: `scale(${zoom})`}} />
            </div>
            <div className="lightbox-caption">{lightbox.alt} · use + e − para zoom · esc para fechar</div>
          </>
        )}
      </div>
    </>
  );
}

/* ============================================================
   Mount
   ============================================================ */
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);
