S4 — Compartilhar conteúdos da home no WhatsApp #86

Merged
fsolla merged 3 commits from S4-compartilhar-conteudos-da-home-no-whatsapp into main 2026-08-19 16:26:44 +00:00
Owner

Closes #19

changelog-rewrite: remove a duplicata da entrada OPS67 no agregado docs/CHANGELOG-AGENTS.md (duplicada pelo rebase do OPS68 em main; a fonte única docs/changelog/2026-08-19-ops67.md é preservada — o agregado volta a espelhar as entradas, insert-only)

S4 — Compartilhar conteúdos da home no WhatsApp. Cada card da seção "Acompanhe de perto" (Artigo/YouTube/Instagram) ganha um botão discreto de compartilhar (canto do card, visual 28px sobre área de toque 44px, aria-label) que abre um popover de 2 ações:

  • Compartilhar no WhatsApp — wa.me do próprio remetente com mensagem pré-configurada por fonte (decisão B do gate): "Olha isso do Solla: {título} — {link}" / "Olha esse vídeo…" / "Olha esse post…"; link = página canônica do artigo (absoluta via window.location.origin no cliente) ou URL da plataforma; nova aba noopener noreferrer.
  • Copiar link — clipboard com "Link copiado" + aria-live para leitores de tela.

Engenharia (impl plan docs/plans/compartilhar-conteudos-home-whatsapp-impl.md aprovado no gate humano):

  • Botão irmão do anchor do card (wrapper relative) — interactive dentro de anchor seria HTML inválido; zero mudança de layout (absoluto, group migra para o wrapper preservando o zoom do cover).
  • Popover Radix (ui/Popover, portal) — escapa o overflow-x-auto do carrossel mobile; sem roles menu/menuitem (semântica honesta de popover com 2 ações; Radix emite aria-expanded).
  • buildWhatsAppTextShareUrl do S6 movido para src/lib/phone.ts (dono do wa.me) com re-export no homeSearchShare.ts — src/lib/contentShare.ts reusa, sem twin. Resolução de link fail-soft contra permalink malformado.
  • Sem migration/schema/Consent — montagem de URL 100% cliente, nada coletado.

Testes: 11 units (contentShare.unit.spec.ts) + e2e novo no describe serial da seção (mensagens por fonte, clipboard real, Escape/clique-fora, mobile ≥44px, portal no viewport). Verificação local: unit 2402 + int 791 verdes; tsc/lint/format/cycles/build verdes; e2e da seção 19/19 (2 runs); knip = limitação P3 pré-existente. Changelog: docs/changelog/2026-08-19-s4.md.

/simplify (3 revisores) absorvido: owner move do wa.me, máquina de feedback de copiar simplificada, foco/roles honestos, min-h-11 nos itens, aria-live, origin lazy, malformed-href fail-soft, e2e endurecido (pin de identidade do card ativo + unmount antes do próximo trigger). 1 débito deferido no impl plan (dedupe do blob de settings do feed nos testes S2/S3).

Nota de fluxo: a PR passou do primeiro run do safety net com rebase conflitante no agregado do changelog (main andou com OPS66/67/68); a branch foi rebaseada em main e o agregado regenerado (dedupe da duplicata OPS67, ver changelog-rewrite acima).

Closes #19 changelog-rewrite: remove a duplicata da entrada OPS67 no agregado docs/CHANGELOG-AGENTS.md (duplicada pelo rebase do OPS68 em main; a fonte única docs/changelog/2026-08-19-ops67.md é preservada — o agregado volta a espelhar as entradas, insert-only) **S4 — Compartilhar conteúdos da home no WhatsApp.** Cada card da seção "Acompanhe de perto" (Artigo/YouTube/Instagram) ganha um botão discreto de compartilhar (canto do card, visual 28px sobre área de toque 44px, `aria-label`) que abre um popover de 2 ações: - **Compartilhar no WhatsApp** — `wa.me` do próprio remetente com mensagem pré-configurada **por fonte** (decisão B do gate): "Olha isso do Solla: {título} — {link}" / "Olha esse vídeo…" / "Olha esse post…"; link = página canônica do artigo (absoluta via `window.location.origin` no cliente) ou URL da plataforma; nova aba `noopener noreferrer`. - **Copiar link** — clipboard com "Link copiado" + `aria-live` para leitores de tela. Engenharia (impl plan `docs/plans/compartilhar-conteudos-home-whatsapp-impl.md` aprovado no gate humano): - Botão **irmão** do anchor do card (wrapper `relative`) — interactive dentro de anchor seria HTML inválido; zero mudança de layout (absoluto, `group` migra para o wrapper preservando o zoom do cover). - Popover Radix (`ui/Popover`, portal) — escapa o `overflow-x-auto` do carrossel mobile; sem roles `menu`/`menuitem` (semântica honesta de popover com 2 ações; Radix emite `aria-expanded`). - `buildWhatsAppTextShareUrl` do S6 movido para `src/lib/phone.ts` (dono do wa.me) com re-export no `homeSearchShare.ts` — `src/lib/contentShare.ts` reusa, sem twin. Resolução de link fail-soft contra permalink malformado. - Sem migration/schema/Consent — montagem de URL 100% cliente, nada coletado. Testes: 11 units (`contentShare.unit.spec.ts`) + e2e novo no describe serial da seção (mensagens por fonte, clipboard real, Escape/clique-fora, mobile ≥44px, portal no viewport). Verificação local: unit 2402 + int 791 verdes; tsc/lint/format/cycles/build verdes; e2e da seção 19/19 (2 runs); knip = limitação P3 pré-existente. Changelog: `docs/changelog/2026-08-19-s4.md`. /simplify (3 revisores) absorvido: owner move do wa.me, máquina de feedback de copiar simplificada, foco/roles honestos, `min-h-11` nos itens, `aria-live`, origin lazy, malformed-href fail-soft, e2e endurecido (pin de identidade do card ativo + unmount antes do próximo trigger). 1 débito deferido no impl plan (dedupe do blob de settings do feed nos testes S2/S3). Nota de fluxo: a PR passou do primeiro run do safety net com rebase conflitante no agregado do changelog (main andou com OPS66/67/68); a branch foi rebaseada em main e o agregado regenerado (dedupe da duplicata OPS67, ver changelog-rewrite acima).
fsolla added 2 commits 2026-08-19 15:34:59 +00:00
style: prettier nos docs do S4 (changelog + plans)
Some checks failed
CI (PR) / checks (pull_request) Successful in 12m57s
PR Ready + auto-merge / ready-automerge (pull_request) Failing after 13m14s
be632e48e0
fsolla force-pushed S4-compartilhar-conteudos-da-home-no-whatsapp from be632e48e0 to 067d20357d 2026-08-19 15:58:14 +00:00 Compare
fsolla closed this pull request 2026-08-19 16:16:56 +00:00
fsolla reopened this pull request 2026-08-19 16:17:00 +00:00
fsolla merged commit fbfbfb1329 into main 2026-08-19 16:26:44 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: fsolla/teqo#86
No description provided.