From 1cdb97dd6023d44292f80dbe7632fbe6f3e8dd71 Mon Sep 17 00:00:00 2001 From: Francisco Solla Date: Sat, 19 Sep 2026 11:19:28 -0300 Subject: [PATCH] =?UTF-8?q?docs(S19):=20plano=20de=20inten=C3=A7=C3=A3o=20?= =?UTF-8?q?=E2=80=94=20links=20de=20compartilhamento=20com=20miniatura=20O?= =?UTF-8?q?G=20(Related=20#1207)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../links-compartilhamento-miniatura-og.md | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 docs/plans/links-compartilhamento-miniatura-og.md diff --git a/docs/plans/links-compartilhamento-miniatura-og.md b/docs/plans/links-compartilhamento-miniatura-og.md new file mode 100644 index 00000000..2df40ae4 --- /dev/null +++ b/docs/plans/links-compartilhamento-miniatura-og.md @@ -0,0 +1,99 @@ +# Links de compartilhamento com miniatura personalizada + +Status: rascunho +Atualizado em: 2026-09-19 +Issue: #1207 +Priority: P2 +Impeccable: A — N/A sem UI +Design UI: N/A — sem UI +Appetite: ~1 dia eng; um fluxo novo pequeno no admin + uma rota pública +Responsável: — + +## Intenção + +A comunicação do mandato compartilha hoje links que não são nossos — plenárias no Google Meet, formulários, páginas externas — e o card que aparece no WhatsApp é o genérico do destino (ou nenhum). Quando é uma plenária da campanha, o convite chega sem identidade: sem título escolhido, sem imagem, sem descrição. + +Queremos que a equipe consiga criar, dentro do painel, um link curto em `jorgesolla1313.com.br/` com título, descrição e imagem escolhidos, para que a miniatura do compartilhamento mostre exatamente o que foi configurado — e o clique leve direto ao destino. Hoje isso exigiria mexer no site a cada evento. + +## Persona e fluxo + +- **Persona / contexto:** equipe de comunicação do mandato (usuária Editor do painel, que já publica notícias, tags e mídia), montando um convite às pressas antes de divulgar no WhatsApp. +- **Job principal:** transformar um link externo em um cartão compartilhável com a identidade que ela escolher, sem depender de ninguém técnico. +- **Fluxo desejado:** + 1. No painel, cria um "link de compartilhamento" e preenche: slug, URL de destino (ex.: Google Meet), título, descrição e imagem (opcional; vazio = imagem padrão do site). + 2. O próprio formulário mostra as instruções de efetividade (tamanho/formato/limites de texto) e recusa slug duplicado/reservado ou destino inválido, com mensagem clara. + 3. Salva/publica e compartilha `jorgesolla1313.com.br/` no WhatsApp. + 4. A miniatura aparece com os dados configurados; quem clica chega ao destino na hora, sem tela intermediária perceptível. +- **Anti-goals de produto:** NÃO virar encurtador com analytics; NÃO ser um segundo cadastro de conteúdo; NÃO expor a URL de destino na miniatura; NÃO coletar dado de quem clica. + +## Objetivo e aceite + +- A equipe cria um link pelo painel e, ao compartilhar a URL curta no WhatsApp, a miniatura mostra o título, a descrição e a imagem configurados (o crawler do WhatsApp lê o HTML servido pelo nosso site — nada de miniatura montada só no navegador). +- O clique leva direto ao destino, sem interstício visível. +- Sem imagem configurada, a miniatura cai na imagem padrão do site (nunca quebrada/vazia). +- Fail-closed: link não publicado → 404; destino fora de `http`/`https`, slug duplicado ou slug reservado → recusado no admin com mensagem clara. +- A página do link é `noindex,nofollow` e nunca revela a URL de destino crua na descrição da miniatura. +- As instruções de imagem/texto ficam visíveis no próprio formulário, em pt-BR. + +## Dados (intenção) + +- **Vou apresentar dados?** Não — o link não coleta nem persiste dado de quem clica; v1 sem contagem de cliques, analytics ou UTM. +- **Decisões desbloqueadas:** N/A. +- **Forma:** N/A — sem dado apresentado. + +## Dados da decisão (literais) + +- Contrato de URL (produto): `https://jorgesolla1313.com.br/` — slug de 1 segmento na raiz. +- Destino aceito: apenas `http`/`https` (ex.: link do Google Meet), validado no admin. +- Slug duplicado ou reservado → recusado com mensagem clara. Reservados (colisão com rotas/valores do site): `cards`, `artigos`, `corte`, `privacidade`, `mandato-no-whatsapp`, `abaixo-assinado`, `api`, `admin`, `noticia`, `campanha`, `artigo`, `evento`. +- Página do link: `noindex,nofollow`. +- Instruções do admin (literais, pt-BR, visíveis no formulário): + - Imagem: 1200×630 px (proporção 1,91:1), arquivo até 600 KB, formatos JPG/PNG, largura mínima 300 px; evitar imagens muito largas (proporção máx. 4:1). + - Título curto: o WhatsApp mostra no máximo 2 linhas (~60–90 caracteres). + - Descrição: ~80 caracteres já bastam; evitar passar de ~160. + - A imagem precisa ser uma URL pública absoluta — o admin resolve isso sozinho ao subir o arquivo. + - O WhatsApp guarda a miniatura em cache por URL: para trocar a miniatura de um link já compartilhado, usar um slug novo (ou aguardar o cache expirar). + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** rotas públicas em `src/app/(frontend)/` (o segmento dinâmico existente já serve listagens e artigos; segmentos estáticos vencem o dinâmico — precedente: `/cards`); cadastro novo no grupo do admin `Publicações`; utilitários de SEO em `src/utilities/seo.ts` (`resolveSiteMetadata`, `toAbsoluteUrl`) e revalidação por tag em `src/utilities/documents.ts`. +- **Precedente a olhar:** `/corte/[id]` (OG custom + noindex/nofollow) como molde próximo de página de compartilhamento; `docs/plans/compartilhar-conteudos-home-whatsapp.md` (S4) que adiou "imagem OG por seção/card"; `docs/campanha/plano-site-campanha-2026.md` §7.1 (compartilhamento por seção com OG). +- **Risco de acoplamento:** o Next 15.4.11 não aceita duas pastas dinâmicas de nomes diferentes no mesmo nível (E337) — a rota nova não pode simplesmente nascer ao lado da existente; roteamento é decisão do plano de implementação. Sem Consent novo (não há dado pessoal) e sem infra de redirects. + +## Dependências + +- Nenhuma. + +## Fora de escopo + +- Expiração/agendamento automático do link — não pedido agora. +- QR code — não pedido agora. +- Contagem de cliques/analytics — não pedido agora. +- Encurtador genérico/domínio próprio — não pedido agora. +- Múltiplos destinos/A-B — não pedido agora. +- Pré-visualização custom do card no admin — não pedido agora. +- Tracking/UTM — não pedido agora. + +## Rabbit holes de produto + +- **Vira encurtador.** Se alguém "só completar" com analytics, domínio próprio e gestão de links, vira produto de infra. **Corte neste item:** link utilitário, sem métricas. +- **Vira segundo CMS.** Pedir corpo/richText/edição de página no link puxa a máquina de posts. **Corte neste item:** só título, descrição e imagem. +- **Cache do WhatsApp.** Prometer "trocar a miniatura" de um link já compartilhado é impossível sem slug novo. **Corte neste item:** orientação no formulário, sem mecanismo de invalidação. +- **Colisão de rota/slug.** Reservar mal os slugs quebra URLs existentes do site. **Corte neste item:** lista de reservados explícita + recusa no admin. + +## Questões em aberto (produto) + +- **Imagem por upload no admin ou URL externa?** **Opções:** A) upload; B) URL externa; C) ambos. **Recomendação:** A — upload pelo painel, com fallback para a imagem padrão do site; URL externa cria um jeito fácil de quebrar a miniatura. _(assumido — validar)_ +- **O clique deve ser instantâneo, sem tela intermediária?** **Opções:** A) sim; B) página intermediária com botão. **Recomendação:** A — instantâneo; a miniatura customizada exige HTML nosso servido aos crawlers, mas a pessoa não pode perceber tela alguma. _(assumido — validar)_ +- **Quem gerencia os links?** **Opções:** A) Editores (comunicação); B) só admin. **Recomendação:** A — mesma gente que já publica notícias. _(assumido — validar)_ +- **Agrupar no admin junto de `Publicações`?** **Opções:** A) sim; B) grupo próprio. **Recomendação:** A — é material de comunicação, ao lado de posts e mídia. _(assumido — validar)_ +- **Expiração/agendamento automático?** **Opções:** A) fora da v1; B) agendar no MVP. **Recomendação:** A — despublicar manualmente resolve; agendamento vira rabbit hole. _(assumido — validar)_ + +## Referências + +- GitHub Issue #1207 +- Design UI (gate): N/A — sem UI +- `src/app/(frontend)/corte/[id]/page.tsx` e `src/utilities/seo.ts` — precedente de OG custom + noindex +- `docs/plans/compartilhar-conteudos-home-whatsapp.md` (S4) — adiou OG por seção/card +- `docs/campanha/plano-site-campanha-2026.md` §7.1 — compartilhamento por seção com OG +- `AGENTS-public.md` — convenções do site público (OG, revalidação, cache)