From 8fa6432b7b7050381590acd33e4116780f52514c Mon Sep 17 00:00:00 2001 From: Francisco Solla Date: Wed, 21 Oct 2026 22:55:28 -0300 Subject: [PATCH] =?UTF-8?q?docs(plans):=20planeja=20o=20site=20p=C3=B3s-el?= =?UTF-8?q?ei=C3=A7=C3=A3o,=20o=20PL=205594/2026=20e=20o=20cutover=20de=20?= =?UTF-8?q?dom=C3=ADnio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit S47 (#1442), S48 (#1443), OPS130 (#1444) e OPS131 (#1445). Inclui o design hi-fi do S47 e a regra pós-eleição no DESIGN.md. --- DESIGN.md | 2 + docs/plans/abaixo-assinado-pl-5594-2026.md | 88 + .../ops130-sincronizar-artigos-jorgesolla.md | 82 + .../ops131-cutover-dominio-jorgesolla.md | 91 ++ ...e-pos-eleicao-agradecimento-ui-design.html | 1448 +++++++++++++++++ docs/plans/site-pos-eleicao-agradecimento.md | 107 ++ 6 files changed, 1818 insertions(+) create mode 100644 docs/plans/abaixo-assinado-pl-5594-2026.md create mode 100644 docs/plans/ops130-sincronizar-artigos-jorgesolla.md create mode 100644 docs/plans/ops131-cutover-dominio-jorgesolla.md create mode 100644 docs/plans/site-pos-eleicao-agradecimento-ui-design.html create mode 100644 docs/plans/site-pos-eleicao-agradecimento.md diff --git a/DESIGN.md b/DESIGN.md index 1f6e371c..f97cc34f 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -296,6 +296,8 @@ This file is the living owner of Teqo's visual decisions — a working document, **Public light-surface focus separation (C243, 2026-10-01).** When the campaign-yellow focus outline sits on a cream, white, or yellow-tinted public surface, keep the 3px yellow signal but add a dark blue outer separator. Yellow alone does not separate reliably from these backgrounds; the second edge preserves the archive's established focus identity while making keyboard location unmistakable without turning blue into a competing action color. +**Post-election mandate home (S47, 2026-10-21).** Once an election closes, the public home uses the name-only Jorge Solla lockup and reframes campaign red as a single, sober field of gratitude; cream carries the editorial chapters and yellow is limited to the one hero action plus focus/accent signals. The verified vote total may dominate the thank-you hero, but it must read as entrusted confidence rather than as a results dashboard: no ranking stack, electoral number, campaign CTA, or competing primary action. Content boards become flat editorial compositions with hairline divisions, and mandate themes use one continuous grid rather than a floating-card catalogue. This preserves recognition from the campaign identity while clearly changing the site's register from persuasion to institutional continuity. + How rules change: - **Decide, then update the owner.** When a better pattern wins — anti-slop review (`design-taste-frontend` / `gpt-taste`), a reference study (`awesome-design-md`), a redesign pass (`redesign-existing-projects`), or implementation judgment — update this file in the **same change** and say why. A pattern that only lives in code or in an agent's head is drift, not design. diff --git a/docs/plans/abaixo-assinado-pl-5594-2026.md b/docs/plans/abaixo-assinado-pl-5594-2026.md new file mode 100644 index 00000000..2e20fddf --- /dev/null +++ b/docs/plans/abaixo-assinado-pl-5594-2026.md @@ -0,0 +1,88 @@ +# Abaixo-assinado do PL 5594/2026 — transparência dos presidenciáveis (S48) + +Status: rascunho +Atualizado em: 2026-10-21 +Issue: #1443 +Priority: P1 +Impeccable: A — sem UI nova; usa a página existente de abaixo-assinado (copy do template ajustada) +Design UI: N/A — sem UI nova +Appetite: ~0,5 dia eng; um outcome verificável (petição publicada, assinável e compartilhável) +Responsável: — + +## Intenção + +Jorge Solla protocolou o PL 5594/2026 em 19/10/2026: candidatos à Presidência e à Vice-Presidência passam a ter de autorizar, no registro da candidatura, o acesso a seus sigilos bancário, fiscal, telefônico e de internet. O tema está no centro do debate desde 18/10, quando Lula desafiou Flávio Bolsonaro a abrir os sigilos. O Teqo já tem a ferramenta de abaixo-assinado; falta a petição do PL — com o texto oficial, a motivação e um pedido claro de tramitação/aprovação. + +## Persona e fluxo + +- **Persona / contexto:** eleitor que acompanhou o debate e quer cobrar transparência; chega pelo link no WhatsApp/redes, no celular. +- **Job principal:** entender o que o PL faz, por que importa agora e assinar em menos de um minuto. +- **Fluxo desejado:** abre `/abaixo-assinado/pl-5594-2026` → lê o resumo e a motivação → vê o contador → preenche nome/e-mail/celular/estado/cidade/CEP → assina → vê a confirmação e compartilha. +- **Anti-goals de produto:** não é um novo cadastro de pessoa (usa `Contact`); não acusa ninguém de crime; não promete aprovação; não cria um segundo mecanismo de consentimento. + +## Objetivo e aceite + +- A petição `pl-5594-2026` existe, está `enabled`, com título/subtítulo/corpo/consent e página pública em `/abaixo-assinado/pl-5594-2026` (200). +- O corpo explica, com o texto oficial: autorização no registro; 5 anos de IR; dados bancários/fiscais/telefônicos/de conexão; conteúdo das comunicações excluído; acesso só por órgãos competentes com auditoria; LGPD; divulgação pela Justiça Eleitoral. +- A motivação menciona o debate de 18/10 e o desafio de Lula a Flávio Bolsonaro, sem afirmar crime ou irregularidade. +- O formulário assina de verdade (contato + assinatura + inscrição na mesma transação, padrão existente), com consent válido e contador. +- A página tem canonical/OG/JSON-LD coerentes com o site atual e link para o texto oficial na Câmara. +- Nenhuma migration, nenhuma collection nova, nenhuma PII em log. + +## Dados (intenção) + +- **Vou apresentar dados?** Sim, o contador de assinaturas (já existente). +- **Decisões desbloqueadas:** o visitante decide assinar; a equipe mede adesão. +- **Forma:** contador absoluto; sem percentual, sem ranking, sem meta inventada. + +## Dados da decisão (literais) + +- `id` da petição: `pl-5594-2026` (URL `/abaixo-assinado/pl-5594-2026`). +- Título: `Quem quer ser presidente deve abrir os sigilos`. +- Subtítulo: `Apoie o PL 5594/2026: candidatos à Presidência e à Vice-Presidência devem autorizar o acesso aos sigilos bancário, fiscal, telefônico e de internet.` +- PL: **5594/2026**, apresentado em **19/10/2026**, autor **Dep. Jorge Solla (PT/BA)**; ementa oficial: "Dispõe sobre a transparência patrimonial, fiscal e financeira dos candidatos à Presidência da República, estabelece mecanismos de autorização de acesso a informações protegidas por sigilo e altera a Lei nº 9.504, de 30 de setembro de 1997." +- Ficha oficial: `https://www.camara.leg.br/proposicoesWeb/fichadetramitacao?idProposicao=2648344`; inteiro teor: `https://www.camara.leg.br/proposicoesWeb/prop_mostrarintegra?codteor=3184912`. +- Status em 21/10/2026: apenas apresentação na Mesa, sem tramitação posterior. +- Consent: usar o mesmo Consent das 3 petições existentes (`form.consent` id 2, chave `whatsapp-inscricao`), como está em produção; não criar Consent novo sem revisão jurídica. +- Copy do formulário (ajustar o hardcoded "campanha"): `Sua assinatura fortalece esta mobilização.` / `Os dados serão usados para registrar sua participação e a comunicação de conteúdos relacionados.` +- Motivação: debate de **18/10/2026**, Lula desafiou Flávio Bolsonaro a abrir os sigilos; Solla protocolou o PL no dia seguinte. Não afirmar que houve crime, ilícito ou recusa não comprovada. +- Texto do corpo: 5 blocos — (1) o que é; (2) por que agora; (3) o que o PL não faz; (4) o pedido; (5) link oficial. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** collection `petition` (admin), página `src/app/(frontend)/abaixo-assinado/[id]/page.tsx`, `PetitionForm`, `submitPetitionSignature`, `getSignatureCount`; conteúdo criado no admin (sem código novo, salvo o ajuste de copy do template). +- **Precedente a olhar:** petições `fim-escala-6x1`, `contra-reducao-maioridade-penal`, `nao-a-privatizacao-da-orla-de-salvador` (produção); o fluxo de Consent das petições existentes. +- **Risco de acoplamento:** o `id` é a URL pública; trocar depois quebra links. O consent é o do documento; o cliente não pode escolher. A action já abre transação. + +## Dependências + +- Nenhuma dura. Suave: S47 (se o gate quiser um CTA na home/footer para a petição). + +## Fora de escopo + +- Página de listagem de abaixo-assinados. +- Meta de assinaturas, campos novos, upload de imagem/mídia. +- Nova identidade visual da petição. +- Divulgação paga/WhatsApp em massa. +- Alterar o texto do Consent existente. + +## Rabbit holes de produto + +- **"Vamos fazer uma campanha de mídia junto."** Vira operação de tráfego. **Corte:** só a página + link direto. +- **"Criar um consent específico e uma nova finalidade."** Exige revisão jurídica. **Corte:** reutilizar o Consent das petições existentes. +- **"Prometer que o PL será aprovado."** **Corte:** pedir apoio à tramitação, sem promessa. + +## Questões em aberto (produto) + +- **Usar o Consent existente (id 2) ou criar um novo?** **Opções:** A) reutilizar (padrão das 3 petições); B) novo texto. **Recomendação:** A — mantém o fluxo e evita mudança jurídica; se o texto não cobrir a finalidade, o jurídico decide. _(assumido)_ +- **Adicionar CTA na home/footer?** **Opções:** A) só link direto agora; B) CTA na home (depende de S47). **Recomendação:** A — a página é compartilhável; o CTA entra quando o design da S47 for aprovado. _(assumido)_ +- **Imagem/OG?** **Opções:** A) sem imagem nova (OG do site); B) arte oficial do kit. **Recomendação:** A — não inventar arte; o texto oficial é o herói. + +## Referências + +- GitHub Issue #1443 +- Texto oficial: `https://www.camara.leg.br/proposicoesWeb/prop_mostrarintegra?codteor=3184912` +- Ficha: `https://www.camara.leg.br/proposicoesWeb/fichadetramitacao?idProposicao=2648344` +- Votação de Solla: TSE/G1, totalização de 05/10/2026 +- Cobertura do PL e do debate: BPMoney (21/10/2026), A Tarde (20/10/2026), Brasil 247 (21/10/2026) +- `AGENTS-public.md` (Posts & Tags), `AGENTS.md` (Consent/LGPD), `src/collections/Petition.ts`, `src/app/(frontend)/abaixo-assinado/[id]/page.tsx`, `src/app/(frontend)/actions/submitPetitionSignature.ts` diff --git a/docs/plans/ops130-sincronizar-artigos-jorgesolla.md b/docs/plans/ops130-sincronizar-artigos-jorgesolla.md new file mode 100644 index 00000000..b4c5559d --- /dev/null +++ b/docs/plans/ops130-sincronizar-artigos-jorgesolla.md @@ -0,0 +1,82 @@ +# OPS130 — Sincronizar todos os artigos do jorgesolla.com.br e revisar os escondidos + +Status: rascunho +Atualizado em: 2026-10-21 +Issue: #1444 +Priority: P1 +Impeccable: A — N/A sem UI +Design UI: N/A — sem UI +Appetite: ~0,5–1 dia (operação no homeserver + revisão de taxonomia) +Responsável: — + +## Intenção + +O site antigo (`jorgesolla.com.br`, WordPress) é a fonte dos artigos do mandato e será desativado no cutover (OPS131). O Teqo tem hoje 43 posts publicados, todos visíveis; o seed `pnpm db:seed:posts` é create-only e já sincronizou o lote de agosto. Antes de desligar o WordPress, o Teqo precisa ter todos os artigos publicados lá — inclusive os que ficaram de fora ou estavam escondidos no período eleitoral — para que o acervo não se perca e o leitor encontre o mesmo conteúdo no novo domínio. + +## Persona e fluxo + +- **Persona / contexto:** equipe de comunicação do mandato; leitor que chega pelo Google/links antigos. +- **Job principal:** garantir que todo artigo disponível no jorgesolla.com.br exista no Teqo, com capa e URL canônica, antes de o WordPress sair do ar. +- **Fluxo desejado:** dry-run (o que seria criado/saltado) → revisão dos slugs novos/classificação → sync em produção (create-only, idempotente) → bust do cache `posts` → verificação de contagem/capas/páginas → auditoria dos "escondidos" → runbook atualizado. +- **Anti-goals de produto:** não é upsert nem espelho bidirecional; não importa páginas institucionais do WP (PUB2); não publica rascunho/privado do WP sem revisão; não toca PII; não muda o contrato de URL dos artigos. + +## Objetivo e aceite + +- Todo post publicado no WP REST (`/wp-json/wp/v2/posts`) existe no Teqo como post publicado; a diferença é zero ou está documentada no runbook. +- Os posts já existentes permanecem intocados (create-only, idempotente por slug). +- As capas dos novos carregam em `/api/media/file/...` (bucket de produção), e o cache `posts` é bustado. +- A lista de "escondidos" é auditada com evidência: hoje (21/10) há **0 tags com `hidden = true`**, **43 posts publicados**, **10 com a tag `eleitoral`**; não há drafts. Se a intenção do humano for posts em rascunho/privado do WordPress, eles não são importáveis pela API pública — precisam ser publicados no WP antes do sync ou exportados à parte. +- Nenhum conteúdo de campanha que a S47 decidir retirar é reexposto por este item; a decisão de visibilidade editorial é da S47. +- O runbook de sync (OPS58) é reutilizado e atualizado com o estado encontrado. + +## Dados (intenção) + +- **Vou apresentar dados?** Sim, no runbook: contagem WP × Teqo, criados/saltados, capas, escondidos. +- **Decisões desbloqueadas:** a equipe sabe se pode desligar o WordPress sem perder artigo; o leitor não encontra 404. +- **Forma:** contagens absolutas e lista de slugs; sem percentual. + +## Dados da decisão (literais) + +- WP REST: `https://jorgesolla.com.br/wp-json/wp/v2/posts?per_page=100` (paginado por `x-wp-totalpages`). +- Seed: `pnpm db:seed:posts --dry-run`; execução em produção (homeserver) com `ALLOW_REMOTE_DB=true` e `SEED_MEDIA_CONFIRM=1` (S3 de prod). +- Cache: `POST /api/revalidate` com `x-revalidate-secret` (tag default `posts`). +- Controle de visibilidade: `tag.hidden` + `isPostVisible`; tag de campanha: slug `eleitoral`. +- Estado de produção em 2026-10-21 (leitura read-only): 43 posts publicados; 0 drafts; 8 tags, todas `hidden = false`; 10 posts com `eleitoral`; categorias: politica 13, desenvolvimento 9, saude 8, educacao 7, direitos-trabalhistas 3, cultura 2, seguranca 1. +- Runbook de referência: `docs/plans/ops58-sincronizar-posts-prod-impl.md` (dry-run → sync → bust → verify). + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** `scripts/seed-posts.mjs`, `scripts/lib/wpArticles.mjs`, `scripts/seed-loader.mjs`, `docs/plans/ops58-sincronizar-posts-prod-impl.md`, `docs/ops/teqo-1313-deploy.md` (runbook); homeserver (`~/stack/teqo-1313.env`). +- **Precedente a olhar:** OPS58 (sync create-only), OPS52-media (execução no homeserver), OPS60 (guard `SEED_MEDIA_CONFIRM`). +- **Risco de acoplamento:** o Postgres de prod não é exposto ao host; rodar no homeserver, na rede do compose, com as `S3_*` de prod. Sem isso, capas caem no disco local e quebram em produção. + +## Dependências + +- Nenhuma dura. OPS131 (cutover) depende deste: não desligar o WordPress antes de o acervo estar no Teqo. + +## Fora de escopo + +- Atualizar/sobrescrever o corpo de posts já existentes (create-only). +- Importar páginas institucionais do WP (PUB2). +- Automação agendada do sync. +- Publicar rascunhos/privados do WP sem decisão editorial. +- Corrigir a taxonomia de todos os slugs antigos; só os novos que o dry-run apontar. + +## Rabbit holes de produto + +- **"Fazer upsert completo do WP."** Diff de richText, mídia, datas; vira migração de conteúdo. **Corte:** create-only. +- **"Importar tudo, inclusive drafts."** Publica conteúdo não revisado. **Corte:** só `published`; drafts exigem decisão. +- **"Automatizar o sync agora."** Infra nova para uma frequência que vai acabar com o WordPress. **Corte:** execução manual com runbook. + +## Questões em aberto (produto) + +- **"Escondidos" = tag `hidden` do Teqo ou posts em draft/private do WordPress?** **Opções:** A) o Teqo não tem nada escondido hoje (0 tags hidden, 0 drafts), então o pedido é no-op e o foco é o sync; B) são posts do WP em draft/private, que precisam ser publicados lá antes. **Recomendação:** A + auditoria do WP; se B, listar os posts e decidir um a um. _(assumido — validar no gate)_ +- **Slugs novos fora da taxonomia:** **Opções:** A) default `politica` + warning; B) bloquear até classificar. **Recomendação:** A, com revisão dos slugs no dry-run. _(assumido)_ +- **Posts com tag `eleitoral`:** **Opções:** A) manter publicados como notícia histórica; B) esconder/retirar. **Recomendação:** A — são notícia, não pedido de voto; a S47 cuida das superfícies de campanha. _(assumido)_ + +## Referências + +- GitHub Issue #1444 +- `docs/plans/ops58-sincronizar-posts-prod.md` e `-impl.md` +- `AGENTS-public.md` §Posts & Tags; `scripts/seed-posts.mjs`; `scripts/lib/wpArticles.mjs` +- Produção (leitura read-only, 2026-10-21): DB `teqo_1313`, tags/posts; `~/stack/teqo-1313.env` diff --git a/docs/plans/ops131-cutover-dominio-jorgesolla.md b/docs/plans/ops131-cutover-dominio-jorgesolla.md new file mode 100644 index 00000000..83d69ce8 --- /dev/null +++ b/docs/plans/ops131-cutover-dominio-jorgesolla.md @@ -0,0 +1,91 @@ +# OPS131 — Cutover do domínio jorgesolla.com.br para o Teqo e desativação do WordPress + +Status: rascunho +Atualizado em: 2026-10-21 +Issue: #1445 +Priority: P1 +Impeccable: A — N/A sem UI +Design UI: N/A — sem UI +Appetite: ~1–2 dias + propagação DNS; um outcome verificável (o domínio canônico serve o Teqo e o WordPress não serve mais) +Responsável: — + +## Intenção + +O site do mandato ainda vive em duas casas: o Teqo em `jorgesolla1313.com.br` (campanha) e o WordPress em `jorgesolla.com.br` (site antigo, fonte dos artigos). Com a eleição encerrada e o acervo sincronizado (OPS130), o endereço definitivo deve ser `jorgesolla.com.br` — o domínio que as pessoas conhecem, que já está nos materiais e no e-mail do mandato. O `jorgesolla1313.com.br` cumpriu o papel de campanha e deve redirecionar; o WordPress deve ser desativado sem perder SEO, e-mail ou o acesso da equipe. + +## Persona e fluxo + +- **Persona / contexto:** eleitor/leitor que digita `jorgesolla.com.br` ou clica num link antigo; equipe do mandato que usa `/campanha`; ops que opera o homeserver. +- **Job principal:** abrir o domínio oficial e ver o site novo, com os links antigos funcionando; a equipe continua entrando em `/campanha`. +- **Fluxo desejado:** pré-flight (DNS, URLs do WP, mídia, auth) → congela escritas no WP → sync final (OPS130) → troca `NEXT_PUBLIC_SITE_URL`/`metadata.URL` → deploy → ingress/DNS do novo domínio → 301 dos links antigos e do domínio 1313 → verificação → desliga o WordPress. +- **Anti-goals de produto:** não migrar plugins/temas/usuários do WordPress; não mudar o e-mail (`@jorgesolla.com.br` já é o domínio do mandato); não perder artigos; não deixar duas fontes de verdade; não quebrar o login da equipe em silêncio. + +## Objetivo e aceite + +- `https://jorgesolla.com.br` e `https://www.jorgesolla.com.br` servem o Teqo (200), com canonical/OG no domínio novo. +- `https://jorgesolla1313.com.br` responde 301 para o domínio novo, preservando o path (incluindo `/campanha`, conforme a decisão de auth abaixo). +- URLs antigas do WordPress (`/YYYY/MM/DD//`) respondem 301 para o caminho canônico do artigo no Teqo (`/[type]/[category]/[slug]`); páginas antigas vão para o equivalente ou para `/`; nenhuma URL indexada fica 404 sem decisão. +- O WordPress deixa de servir o site depois da janela de rollback; o DNS/ingress do novo domínio aponta para o túnel do homeserver. +- MX/TXT/SPF/DKIM/DMARC e subdomínios que não são o site ficam intocados; o e-mail `campanha@jorgesolla.com.br` continua funcionando. +- `NEXT_PUBLIC_SITE_URL=https://jorgesolla.com.br` no env de produção (rebuild, pois é inlined) e `metadata.URL` no admin com o mesmo valor; convites, calendário e OAuth usam o novo origin. +- WebAuthn/passkeys: a decisão do gate é explícita — reenrollment dos usuários de campanha no novo domínio ou manutenção do `/campanha` no domínio antigo; nenhuma credencial quebra em silêncio. +- Mídia/OG: `/api/media/file/...` e as imagens OG continuam 200 no domínio novo; o `next.config.mjs` aceita o host do novo domínio. +- O runbook de cutover/rollback fica em `docs/ops/teqo-1313-deploy.md`, com a evidência do pré-flight. + +## Dados (intenção) + +- **Vou apresentar dados?** Sim, no pré-flight/runbook: inventário de DNS, contagem de URLs do WP, mapa de redirects, contagem de usuários com passkey. +- **Decisões desbloqueadas:** ops decide o momento do corte; a equipe sabe o que reenrolar; o leitor não perde o link. +- **Forma:** contagens absolutas e mapa URL→URL; sem dashboard. + +## Dados da decisão (literais) + +- Domínio canônico: `https://jorgesolla.com.br` (apex); `www` → 301 para o apex. +- Domínio de campanha: `https://jorgesolla1313.com.br` → 301 para o canônico. +- Env de produção: `NEXT_PUBLIC_SITE_URL=https://jorgesolla.com.br` (inlined no build; exige rebuild) e `metadata.URL=https://jorgesolla.com.br` (global no admin). +- Cloudflare: o túnel é remotely-managed; o ingress do novo domínio aponta para `http://localhost:1313`; a zona `jorgesolla1313.com.br` hoje é `2ae7416abc4ea930db5ce6782504c578` — a zona de `jorgesolla.com.br` deve ser lida no dashboard, não hardcoded. +- WordPress: `https://jorgesolla.com.br` hoje resolve para `128.201.75.110`; a API de posts é a fonte do OPS130; o site antigo usa permalinks `/////`. +- Auth: o RP ID do WebAuthn é o hostname de `NEXT_PUBLIC_SITE_URL` (`src/utilities/webauthn/campaignWebAuthnConfig.ts:87`); credenciais criadas em `jorgesolla1313.com.br` não valem em `jorgesolla.com.br`. +- SEO: o canonical prefere `metadata.URL` e cai para `NEXT_PUBLIC_SITE_URL` (`src/utilities/seo.ts:60-72`); o origin das imagens OG é o deployment (`seo.ts:86-93`). +- Redirects: não há redirects em `next.config.mjs` nem middleware hoje; o único redirect in-app é o canonical de artigo (`[type]/[category]/[slug]/page.tsx:140-142`). + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** `src/utilities/seo.ts`, `src/utilities/campaignInviteOrigin.ts`, `src/utilities/webauthn/campaignWebAuthnConfig.ts`, `src/payload.config.ts` (serverURL, se aplicável), `next.config.mjs` (host de imagem), `src/app/robots.ts` (robots/sitemap), `docs/ops/teqo-1313-deploy.md`, `~/stack/teqo-1313.env`, Cloudflare tunnel/DNS. +- **Precedente a olhar:** OPS51/OPS52 (cutover de DB/mídia), OPS80/OPS81 (cutoff de `pt.jorgesolla.com.br`, que deixou `jorgesolla.com.br`/SEO fora de escopo), OPS103 (staging/noindex), OPS130 (sync). +- **Risco de acoplamento:** `NEXT_PUBLIC_SITE_URL` governa convite/WebAuthn/calendar/OAuth; trocar sem reenrollment quebra o login por passkey; `metadata.URL` governa canonical/OG; o e-mail usa o mesmo domínio (não tocar em MX/TXT). + +## Dependências + +- **OPS130 (dura):** o acervo precisa estar no Teqo antes de desligar o WordPress. +- **S47 (dura ou suave):** o site deve estar pós-eleição antes de virar o domínio oficial; se o corte vier antes, o domínio novo abriria com a home de campanha. +- **S48 (suave):** a petição pode estar no ar antes do corte para o link já nascer no domínio novo. + +## Fora de escopo + +- Migrar páginas institucionais/plugins/usuários do WordPress (PUB2). +- Redesenho do site (S47). +- Migração de e-mail (já está no domínio). +- Apagar o backup do WordPress; o conteúdo antigo fica arquivado. +- SEO além do canonical/redirects mínimos (sitemap completo é follow-up). +- Manter os dois domínios como canônicos. + +## Rabbit holes de produto + +- **"Migrar o WordPress inteiro."** Vira reescrita de páginas/plugins. **Corte:** só posts + redirects; páginas são PUB2. +- **"Resolver o passkey com um RP ID pai."** `jorgesolla1313.com.br` não é subdomínio de `jorgesolla.com.br`; não existe RP ID comum. **Corte:** decisão explícita de reenrollment OU manter `/campanha` no domínio antigo. +- **"Cortar DNS e ver depois."** Sem mapa de redirects e sem pré-flight, perde SEO e links. **Corte:** pré-flight + 301 + verificação antes de desligar. + +## Questões em aberto (produto) + +- **Passkeys:** **Opções:** A) cutover total + reenrollment dos usuários de campanha; B) manter `/campanha` em `jorgesolla1313.com.br` e só o site público no novo domínio; C) adiar o cutover até um mecanismo de migração. **Recomendação:** A — a eleição acabou e a equipe é pequena; reenrollment assistido é aceitável, com aviso prévio. _(assumido — decisão humana obrigatória)_ +- **Janela do WordPress:** **Opções:** A) desligar após a verificação, com backup/arquivo; B) manter read-only por 30 dias. **Recomendação:** B — janela curta de rollback, sem escritas. _(assumido)_ +- **Redirect de `jorgesolla1313.com.br`:** **Opções:** A) 301 permanente; B) 302 por 90 dias. **Recomendação:** A — o 1313 não volta; 301 preserva o SEO. _(assumido)_ +- **Escopo dos redirects antigos:** **Opções:** A) posts + páginas conhecidas; B) todas as URLs do sitemap do WP. **Recomendação:** B — inventariar o sitemap e mapear; o que não tiver equivalente vai para `/`. _(assumido)_ + +## Referências + +- GitHub Issue #1445 +- `docs/ops/teqo-1313-deploy.md` (homeserver, tunnel, envs, staging); `AGENTS-infra.md` +- `src/utilities/seo.ts`, `src/utilities/campaignInviteOrigin.ts`, `src/utilities/webauthn/campaignWebAuthnConfig.ts`, `next.config.mjs` +- OPS80/OPS81 (`pt.jorgesolla.com.br`), OPS130 (sync), S47 (site pós-eleição) diff --git a/docs/plans/site-pos-eleicao-agradecimento-ui-design.html b/docs/plans/site-pos-eleicao-agradecimento-ui-design.html new file mode 100644 index 00000000..38ebb984 --- /dev/null +++ b/docs/plans/site-pos-eleicao-agradecimento-ui-design.html @@ -0,0 +1,1448 @@ + + + + + + + + + + Design S47 — Casa do mandato pós-eleição + + + +
+

+ Gate visual · S47 +

+
+
+

+ Casa do mandato pós-eleição +

+

+ Agradecimento sóbrio, humano e editorial. O número é memória de confiança; o site volta + o olhar para o trabalho que continua. +

+
+

+ Cenas estáticas · 1280 + 390 · conteúdo real +

+
+
+ +
+ +
+
+

Cena 01 · Home completa

+ 1280 px +
+
+
+ +
+ +
+
+
+
+
+
+

+ Obrigado, Bahia +

+

+ 152.049 + votos de confiança +

+

+ Obrigado a quem votou, a quem caminhou, a quem compartilhou e a quem acreditou. A + eleição terminou; o trabalho continua. +

+ +

+ Jorge Solla · Deputado Federal · PT · Bahia +

+
+
+
+ Jorge Solla sorrindo, com blazer azul e camisa do PT +
+
+
+
+ +
+ +
+ +
+
+
+

Nossa história

+

+ Saúde pública como escolha de vida +

+

+ Da gestão do SUS ao Congresso Nacional, uma trajetória feita ao lado de quem + defende saúde, democracia e direitos para todos. +

+ +
+ +
+
+ +
+
+
+
+

+ Bandeiras do mandato +

+

+ Compromissos que orientam o trabalho +

+
+

+ Posições construídas em décadas de vida pública, agora renovadas para o quarto + mandato. +

+
+
    +
  1. + Saúde +

    + Defender o SUS e valorizar quem cuida +

    +

    + Financiamento público, piso da enfermagem, vacinação, ciência e atendimento + digno. +

    +
  2. +
  3. + Educação +

    + Mais oportunidades no interior +

    +

    + Institutos federais, universidades e escola pública de qualidade em toda a + Bahia. +

    +
  4. +
  5. + Renda +

    + Crescimento com dignidade +

    +

    + Salário mínimo valorizado, moradia, agricultura familiar e comida na mesa. +

    +
  6. +
  7. + Democracia +

    Participação e direitos

    +

    + Instituições fortes, liberdade, respeito e combate permanente à desinformação. +

    +
  8. +
  9. + Bahia +

    + A Bahia no centro das decisões +

    +

    + Investimento federal e presença do mandato nos municípios e territórios. +

    +
  10. +
  11. + Trabalho +

    + Tempo para viver, renda para cuidar +

    +

    + Jornada justa, direitos protegidos e trabalho que não adoece. +

    +
  12. +
+
+
+ +
+
+
+
+

Perto da Bahia

+

+ O mandato em fotos +

+
+ Ver o álbum +
+
+ Vista aérea de encontro popular no Comércio, em Salvador + Agenda de saúde pública com Jorge Solla e Lula +
+

+ Trabalho presente, memória viva. +

+ +
+
+
+
+ +
+
+
+ Jorge Solla — Deputado Federal +

+ Deputado Federal · PT · Bahia
Mais Saúde, Mais Futuro. +

+
+
+

Navegue

+ +
+
+

Redes

+ +
+
+
+

+ Jorge José Santos Pereira Solla · Deputado Federal · Partido dos Trabalhadores · + Bahia +

+
+
+
+
+ + +
+
+

Cena 02 · Home completa

+ 390 px +
+
+
+
+ + Jorge Solla — Deputado Federal + + +
+ +
+ +
+
+
+

+ Obrigado, Bahia +

+

+ 152.049votos de confiança +

+

+ Obrigado a quem votou, a quem caminhou, a quem compartilhou e a quem acreditou. A + eleição terminou; o trabalho continua. +

+ Acompanhe o mandato +
+
+ Jorge Solla sorrindo, com blazer azul e camisa do PT +

+ Deputado Federal · PT · Bahia +

+
+ +
+

Acompanhe de perto

+

+ O mandato, onde a Bahia acontece +

+

+ Notícias, vídeos e registros do trabalho em Brasília e nos municípios. +

+ + + +
+ +
+

Nossa história

+

+ Saúde pública como escolha de vida +

+

+ Da gestão do SUS ao Congresso Nacional, uma trajetória feita ao lado de quem defende + saúde, democracia e direitos para todos. +

+ + +
+ +
+

Bandeiras do mandato

+

+ Compromissos que orientam o trabalho +

+

+ Posições construídas em décadas de vida pública, agora renovadas para o quarto + mandato. +

+
    +
  1. + Saúde +

    + Defender o SUS e valorizar quem cuida +

    +

    + Financiamento público, piso da enfermagem, vacinação, ciência e atendimento digno. +

    +
  2. +
  3. + Educação +

    + Mais oportunidades no interior +

    +

    + Institutos federais, universidades e escola pública de qualidade em toda a Bahia. +

    +
  4. +
  5. + Renda +

    + Crescimento com dignidade +

    +

    + Salário mínimo valorizado, moradia, agricultura familiar e comida na mesa. +

    +
  6. +
  7. + Democracia +

    + Participação e direitos +

    +

    + Instituições fortes, liberdade, respeito e combate permanente à desinformação. +

    +
  8. +
  9. + Bahia +

    + A Bahia no centro das decisões +

    +

    + Investimento federal e presença do mandato nos municípios e territórios. +

    +
  10. +
  11. + Trabalho +

    + Tempo para viver, renda para cuidar +

    +

    + Jornada justa, direitos protegidos e trabalho que não adoece. +

    +
  12. +
+
+ +
+

Perto da Bahia

+

+ O mandato em fotos +

+
+ Vista aérea de encontro popular no Comércio, em Salvador + Agenda de saúde pública com Jorge Solla e Lula +
+

+ Trabalho presente, memória viva. +

+
+
+ Ver o álbum +
+ +
+ Jorge Solla — Deputado Federal +

+ Deputado Federal · PT · Bahia
Mais Saúde, Mais Futuro. +

+
+
+

Navegue

+ +
+
+

Redes

+ +
+
+

+ Jorge José Santos Pereira Solla · Deputado Federal · Partido dos Trabalhadores · Bahia +

+
+
+
+ + +
+
+ + 1280 + 390 +
+
+
+
+
+ Jorge Solla — Deputado Federal +

+ Deputado Federal · PT · Bahia
Mais Saúde, Mais Futuro. +

+
+
+

Navegue

+

+ Artigos
Fotos
Privacidade +

+
+
+

Redes

+

+ Instagram
YouTube
Facebook +

+
+
+

+ Jorge José Santos Pereira Solla · Deputado Federal · Partido dos Trabalhadores · Bahia +

+
+
+ Jorge Solla — Deputado Federal +

+ Deputado Federal · PT · Bahia
Mais Saúde, Mais Futuro. +

+
+

+ Navegue
Artigos
Fotos
Privacidade +

+

+ Redes
Instagram
YouTube
Facebook +

+
+

+ Jorge José Santos Pereira Solla · Deputado Federal · Partido dos Trabalhadores · Bahia +

+
+
+
+ + +
+
+

Cena 04 · Estados vazios

+ board + álbum +
+
+
+

Acompanhe de perto

+
+ +

+ Ainda não há publicações +

+

+ As notícias do mandato aparecerão aqui assim que forem publicadas. +

+
+
+
+

Perto da Bahia

+
+ +

+ O álbum está sendo preparado +

+

+ Novos registros do trabalho na Bahia serão publicados em breve. +

+
+
+
+
+ + +
+
+

Cena 05 · Cabeçalho de página interna

+ /artigos · /fotos +
+
+
+
+ +
+
+

Mandato em movimento

+

+ Artigos e notícias +

+
+
+
+
+
+ Jorge Solla — Deputado Federal + +
+
+
+

Menu aberto

+ +
+ +
+
+
+

Memória do mandato

+

Fotos

+
+
+
+
+ + +
+ + + diff --git a/docs/plans/site-pos-eleicao-agradecimento.md b/docs/plans/site-pos-eleicao-agradecimento.md new file mode 100644 index 00000000..ec8bae6a --- /dev/null +++ b/docs/plans/site-pos-eleicao-agradecimento.md @@ -0,0 +1,107 @@ +# Site público pós-eleição — retirar a propaganda e agradecer os 152.049 votos (S47) + +Status: rascunho +Atualizado em: 2026-10-21 +Issue: #1442 +Priority: P1 +Impeccable: C — novo fluxo na home (hero de agradecimento + retirada das seções de campanha) +Design UI: docs/plans/site-pos-eleicao-agradecimento-ui-design.html +Appetite: ~1–2 dias eng; um outcome verificável (nenhuma propaganda/1313 visível no site público + agradecimento no ar) +Responsável: — + +## Intenção + +A eleição para deputado federal terminou em 04/10/2026 e Jorge Solla foi reeleito com 152.049 votos. O site público ainda é uma peça de campanha: hero de candidato, pedido de voto, "1313" em títulos/rodapé/metadados, CTAs de apoio e páginas de material eleitoral. Manter isso no ar depois da eleição confunde o visitante, desatualiza a identidade do mandato e mantém propaganda eleitoral ativa sem campanha. O site precisa virar a casa institucional do deputado: agradecer os votos e seguir publicando o mandato (notícias, fotos, trajetória, bandeiras), sem pedir voto e sem o número 1313. + +## Persona e fluxo + +- **Persona / contexto:** eleitor que chega pelo link compartilhado/WhatsApp, jornalista que busca o mandato, apoiador que quer acompanhar o trabalho — no celular, logo depois da eleição. +- **Job principal:** entender que a eleição acabou, sentir-se agradecido e encontrar o conteúdo do mandato. +- **Fluxo desejado:** abre o site → vê "Obrigado, Bahia — 152.049 votos" e um texto curto de agradecimento → rola para as notícias/"Acompanhe de perto", a trajetória, as bandeiras e as fotos → encontra o rodapé institucional e as redes. +- **Anti-goals de produto:** não é uma nova campanha; não é um site institucional completo (bio/propostas é PUB2); não cria cadastro de pessoa novo; não vira dashboard de resultados; não apaga o acervo editorial. + +### Esboço de fluxo (C) + +```text +[chega] → hero "Obrigado, Bahia" (152.049) → notícias → trajetória → bandeiras do mandato → fotos → rodapé institucional +``` + +### Design UI (C) + +- Design UI (gate): `docs/plans/site-pos-eleicao-agradecimento-ui-design.html` (+ assets em `site-pos-eleicao-agradecimento-ui-design-assets/`) +- Cenas: 1280 e 390; estados: home completa, hero de agradecimento, rodapé. NEEDS ASSET para foto nova se o design pedir; usar `JOA00162.webp` como padrão. + +## Objetivo e aceite + +- Nenhuma superfície pública exibe "1313" como número eleitoral, pedido de voto, "candidato", "propaganda eleitoral" ou CTA de campanha (hero, cards, rodapé, títulos/metadados). +- A home abre com o agradecimento: "152.049 votos" (literal TSE) e texto de agradecimento a quem votou e a quem ajudou na campanha. +- A identidade visível passa a "Jorge Solla — Deputado Federal · PT · Bahia"; o logo usado é o lockup de nome (`jorge-solla-positivo/negativo`), nunca a marca completa com 1313. +- As seções de campanha saem da home: "Por que essa eleição importa", newsletter "da campanha", cards "Mostre que você está com Solla", jingles/rádio 1313 e a seção da Central de Conteúdos. +- As páginas de campanha (`/conteudos`, `/jingles`, `/cards`) saem do ar/do menu; `/fotos`, `/artigos`, `/privacidade` e o acervo de fala continuam. `/potencial` e a Plenária ficam até 25/10 (2º turno) e saem depois — decisão a confirmar no gate. +- O rodapé vira institucional: nome, cargo, partido/estado, redes, artigos, fotos, privacidade; sem "Quero apoiar", sem CNPJ de campanha, sem "1º turno". +- Metadados/SEO: títulos e descrições sem 1313; a URL canônica continua a atual até o cutover (OPS131). +- Nada de PII nova, nenhum Consent novo, nenhuma migration. +- O design hi-fi aprovado é o alvo do port. + +Guardrails: + +- Não apagar posts/fotos/jingles do CMS; despublicar/retirar da navegação é suficiente (reversível). +- A página do abaixo-assinado (S48) não é tocada aqui. +- O domínio não muda aqui (OPS131). + +## Dados (intenção) + +- **Vou apresentar dados?** Sim, na superfície: o número de votos no agradecimento. +- **Decisões desbloqueadas:** o visitante entende o resultado e o novo papel do site; a equipe decide o que continua público no mandato. +- **Forma:** número absoluto, sem percentual estadual; o dado é o total de votos, não um ranking. Fonte TSE/G1 (05/10/2026). + +## Dados da decisão (literais) + +- Votos: **152.049** (TSE, totalização de 05/10/2026; 1,84% dos válidos; 11º mais votado da BA; 417 municípios; Salvador 26.082). +- Mandato: **4º mandato consecutivo** (reeleito em 2026; posse em 01/02/2027). +- Copy do hero (proposta): eyebrow `Obrigado, Bahia`; título `152.049 votos de confiança`; texto `Obrigado a quem votou, a quem caminhou, a quem compartilhou e a quem acreditou. A eleição terminou; o trabalho continua.`; CTA primário `Acompanhe o mandato` → `/artigos`. +- Identidade: `Jorge Solla` · `Deputado Federal` · `PT · Bahia`; o slogan `Mais Saúde, Mais Futuro` pode permanecer como assinatura (não é número/pedido de voto). +- Seções que saem: `problem` (`Por que essa eleição importa`), `cards`, `sound` (jingles/rádio), `contentPieces` (Central), newsletter de campanha; `story` e `flags` ficam com copy de mandato; `content` (Acompanhe de perto), `fotos` e `selfie` ficam. +- Rotas de campanha: `/conteudos`, `/jingles`, `/cards` → fora do ar (404 ou redirect para `/`, decisão do impl plan); `/potencial` e share link `plenaria-vitoria` → até 25/10. +- Arquivos com literais 1313 a limpar: `CampaignHero.tsx`, `CampaignFooter.tsx`, `CampaignPageHeader.tsx`, `CampaignLogoLink.tsx`, `JingleHomeSection.tsx`, `RadioPlayer.tsx`, `ContentPiece*`, `fotos/page.tsx`, `fotos/encontre/page.tsx`, `conteudos/*`, `jingles/page.tsx`, `(home)/page.tsx`, `SITE_METADATA_DEFAULTS` (description "campanhas" → "mandato"). +- Download de foto: `jorge-solla-foto-.` (sem 1313). +- O `1313` em assets do kit (`numero-*`, `marca-*-completa`, `radio/*`) pode permanecer no repositório como acervo, mas nenhum deles é renderizado em superfície pública. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** `src/app/(frontend)/(home)/page.tsx`, `src/components/CampaignHero.tsx`, `CampaignFooter.tsx`, `CampaignPageHeader.tsx`, `CampaignLogoLink.tsx`, `JingleHomeSection.tsx`, `ContentPiece*`, `src/app/(frontend)/fotos/page.tsx`, `conteudos/*`, `jingles/page.tsx`, `src/utilities/seo.ts`/global `metadata`. +- **Precedente a olhar:** S36 (crop do logo), S21/S22 (jingles), S27/S39 (Central), C233 (fotos), `DESIGN.md` §7 e `public/campaign-kit/README.md`. +- **Risco de acoplamento:** `CampaignFooter` é compartilhado por `/fotos`, `/jingles`, `/potencial`, `/cards`, `/conteudos` — a mudança de assinatura afeta todas; `CampaignLogoLink` é o dono do crop do logo; `isPostVisible`/posts não podem ser tocados por engano. + +## Dependências + +- Nenhuma dura. Suave: S48 (abaixo-assinado) para o CTA de participação, se o gate quiser; OPS130 para o acervo completo de artigos. + +## Fora de escopo + +- Bio/propostas institucionais novas (PUB2). +- Cutover do domínio (OPS131). +- Conteúdo do abaixo-assinado (S48) e sincronização de artigos (OPS130). +- Apagar dados do CMS ou do acervo de fotos. +- Redesenho de todas as páginas internas do mandato. + +## Rabbit holes de produto + +- **"Vamos aproveitar e redesenhar o site inteiro."** Vira um projeto institucional. **Corte:** só a home/shell + retirada das campanhas; o resto é PUB2. +- **"Apagar todos os posts de campanha."** Perde histórico e notícia. **Corte:** retirar a propaganda de campanha das superfícies; o acervo editorial fica. +- **"Criar uma nova marca."** O kit 1313 não tem marca de mandato sem o número. **Corte:** usar os lockups de nome existentes; NEEDS ASSET se o humano quiser marca nova. + +## Questões em aberto (produto) + +- **O que fazer com o 2º turno (Lula) que ainda está no ar?** **Opções:** A) manter `/potencial` e a Plenária até 25/10 e retirar depois; B) retirar tudo agora. **Recomendação:** A — o 2º turno ainda não acabou; o corte imediato é o de Solla/1313. _(assumido — validar no gate)_ +- **Manter a seção "Bandeiras"?** **Opções:** A) manter, reescrita como bandeiras do mandato; B) remover junto com o bloco "Por que essa eleição importa". **Recomendação:** A — é conteúdo de posição, não pedido de voto; a copy eleitoral sai. _(assumido)_ +- **Newsletter:** **Opções:** A) remover a captura de campanha (sem novo Consent); B) manter com copy de mandato. **Recomendação:** A — evita mudar a finalidade do consentimento sem revisão. _(assumido)_ +- **Central/Jingles/Cards:** **Opções:** A) despublicar e tirar do ar; B) manter internos. **Recomendação:** A — são material de campanha; o CMS continua com os registros. _(assumido)_ + +## Referências + +- GitHub Issue #1442 +- Design UI (gate): `docs/plans/site-pos-eleicao-agradecimento-ui-design.html` +- TSE/G1: `https://g1.globo.com/ba/bahia/eleicoes/2026/noticia/2026/10/05/eleicoes-2026-jorge-solla-pt-e-eleito-deputado-federal-pela-bahia.ghtml` (152.049 votos, 1,84%, 11º, 417 municípios, Salvador 26.082) +- `AGENTS-public.md` (Posts & Tags), `AGENTS.md` (campaign/public), `DESIGN.md` §7, `public/campaign-kit/README.md` +- `src/app/(frontend)/(home)/page.tsx`, `src/components/CampaignFooter.tsx`, `src/components/CampaignHero.tsx`