docs(S5): construtor fluido do kit na home (substitui o wizard em página)

This commit is contained in:
Francisco Solla 2026-09-28 09:20:18 -03:00
parent f0c735c077
commit f01e1a146a
6 changed files with 1711 additions and 1525 deletions

View file

@ -294,6 +294,8 @@ This file is the living owner of Teqo's visual decisions — a working document,
**Public campaign home as editorial evidence (S1, 2026-09-28).** The campaign home uses a mobilization→evidence rhythm: brand-red opening and final participation frame the page; cream/white reading chapters carry principles, dated work and trajectory. Principles are long-form chapters paired with documentary photography (sticky on desktop, inline on mobile/reduced motion), never an equal-card grid. Developed public-work cases use a source-visible two-era record that separates institutional sphere, date and delivery phase. Yellow remains an orientation/focus/source signal, not a competing CTA; on a red field the primary CTA may be white with dark-red ink, while light fields use the canonical red/white action. This pattern replaces the old repeated-card campaign page because it gives authentic photography room, makes attribution auditable and preserves one dominant action in every color context.
**Embedded support-kit builder (S5, 2026-09-28).** Personalization on the public campaign home is one continuous, progressively disclosed section inside `#cards`, not a numbered wizard or a separate funnel. Name begins the live preview; optional photo and dobradinha appear as inline invitations; a kit tray accumulates only valid pieces and never covers content or focus. Desktop pairs a sticky live preview with the scrolling controls; mobile keeps previews and the tray inline. The full `/cards` studio remains the owner of the six models and deep links. This keeps the action inside the home’s editorial rhythm, reduces modal/context switching, and makes optional inputs feel additive instead of required.
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.

View file

@ -29,53 +29,53 @@ intocados; nada de superfície pública nova que viole o período eleitoral.
Legenda de ação: **R** = redesenhar; **P** = preservar (só contrato/estilo
mínimo); **E** = endpoint não visual (preserve-only); **G** = adição gateada.
| # | Rota / feature | Dono atual (código) | Fatia | Ação | Critério de aceite |
| --- | ----------------------------------------- | ---------------------------------------------------------- | ----- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1 | `/` | `(frontend)/(home)/page.tsx` + `layout.tsx` | S1 | R | Composição completa aprovada no artefato; seções identidade→princípios→trabalho→trajetória→conteúdo→participação; CTA primário único; vazio/erro/recusa desenhados; assinatura com reduced-motion |
| 2 | Shell de campanha (header/footer/nav) | `CampaignPageHeader`, `CampaignLogoLink`, `CampaignFooter` | S1 | R | Um só shell para home/conteúdos/jingles/fotos; alvos ≥44px; identificação eleitoral intacta; "Fotos" condicional preservada |
| 3 | `/conteudos` | `conteudos/(catalog)/page.tsx` | S2 | R | Lista/filtros/estados redesenhados; canonical `/conteudos`; `noindex` com 0 peças; skeletons preservados |
| 4 | `/conteudos/[slug]` | `conteudos/[slug]/page.tsx` | S2 | R | Detalhe + player + share redesenhados; 404 uniforme; OG `video.other`/`article` |
| 5 | `/conteudos/[slug]/midia` | `conteudos/[slug]/midia/route.ts` | S2 | E | Range/streaming, `?download=1` `jorge-solla-1313-<slug>.<ext>`, evento anônimo — intocados |
| 6 | `/conteudos/[slug]/frame` | `conteudos/[slug]/frame/route.ts` | S2 | E | Geração/espera do still dentro do orçamento — intocada |
| 7 | `/corte/[id]` | `corte/[id]/page.tsx` + `corte/layout.tsx` | S2 | R | `noindex` sempre; crédito de origem; 404 uniforme; share kit preservado |
| 8 | `/jingles` | `jingles/page.tsx` | S2 | R | Player/reprodução/download `jorge-solla-1313-<slug>.mp3`; vazio honesto; áudio nunca autoplay |
| 9 | `/midia` (referida no brief) | = itens 5/6 (endpoints de mídia) | S2 | E | Registrada como endpoint; não há página `/midia` no app |
| 10 | `/artigos` | `artigos/page.tsx` | S3 | R | Landing editorial restilizada; imagem do destaque corrigida; sem chrome de campanha |
| 11 | `/[type]` | `[type]/page.tsx` (`[type]/layout.tsx`) | S3 | R | Listagem por tipo restilizada; canonical; `generateStaticParams`/`dynamicParams` preservados |
| 12 | `/[type]/[category]` | `[type]/[category]/page.tsx` | S3 | R | Listagem de categoria restilizada; separação editorial mantida |
| 13 | `/[type]/[category]/[slug]` | `[type]/[category]/[slug]/page.tsx` | S3 | R | Artigo: JSON-LD `Article`, OG, redirect canônico, ISR `posts` — preservados |
| 14 | ShareLink `/[type]` (direct/announcement) | `[type]/page.tsx` branch + `components/shareLink/*` | S3 | R | Redirecionamento instantâneo e página de anúncio restilizadas; poll 30s e OG preservados |
| 15 | `/api/share-link/[slug]/live` | `api/share-link/[slug]/live/route.ts` | S3 | E | `{target}` nunca 5xx, `no-store` — intocado |
| 16 | `/[type]/evento.ics` | `[type]/evento.ics/route.ts` | S3 | P | Saída `.ics`, nome do arquivo e `Cache-Control` intocados |
| 17 | `/privacidade` | `privacidade/page.tsx` | S4 | R | Texto legal intacto; restilo editorial; 404 se `!published` |
| 18 | `/mandato-no-whatsapp` | `mandato-no-whatsapp/page.tsx` | S4 | R | Fluxo/form preservados; Consent `whatsapp-inscricao` fail-closed; ≥16px inputs |
| 19 | `/abaixo-assinado/[id]` | `abaixo-assinado/[id]/page.tsx` | S4 | R | Assinatura transacional/consent intactos; **bug 500 em id inexistente corrigido (404)**; JSON-LD/pixel preservados |
| 20 | Newsletter da home | `CampaignNewsletterSection` + `submitCampaignNewsletter` | S1/S4 | R | Consent `campanha-novidades` fail-closed; pixel Lead preservado; estado de recusa desenhado |
| 21 | `/cards` (estúdio) | `(home)/cards/page.tsx` + `components/cards/*` | S5 | R | 6 modelos reais; `?model=` válido; `#cards` da home; nomes de arquivo e telemetria anônima preservados |
| 22 | Wizard kit completo (extensão) | `CardsStudio`/`CardComposer` (dono) | S5 | R | Passos nome→foto→dobradinha→kit; nunca gera arte incompleta; foto nunca sai do browser; back/forward na sessão; sem persistência silenciosa |
| 23 | `/fotos` (C233) | `fotos/page.tsx` + `components/fotos/*` | S6 | R | Redesenho preserva o contrato C233 (só `approved`; kill switch `photoAlbum.published`; canal de remoção; vazio honesto) — **aberta por decisão de 28/09/2026** |
| 24 | `/fotos/encontre` (C234) | `fotos/encontre/page.tsx` + `api/fotos/selfie` | S7 | R | Redesenho preserva o contrato C234 (`selfieSearchEnabled` fail-closed; Consent por chave; sem score/nome; on-device) — **aberta por decisão de 28/09/2026** |
| 25 | `/api/revalidate` | `api/revalidate/route.ts` | — | P | Allowlist de tags intocada |
| 26 | `/api/content-events` | `api/content-events/route.ts` | S2 | P | Beacon anônimo: schema, rate-limit, catálogos — intocados |
| 27 | `/api/social-feed/sync` | `api/social-feed/sync/route.ts` | — | P | Auth admin + same-origin — intocado |
| 28 | Metadados raiz/robots/OG | `(frontend)/layout.tsx`, `robots.ts`, `lib/seo` | S1 | P | Fallbacks e noindex de staging preservados |
| 29 | `hidden`/`isPostVisible` | `src/utilities/posts.ts` | S3 | P | Falha fechada; remoção sem deploy — intocados |
| # | Rota / feature | Dono atual (código) | Fatia | Ação | Critério de aceite |
| --- | ------------------------------------------- | ---------------------------------------------------------- | ----- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 1 | `/` | `(frontend)/(home)/page.tsx` + `layout.tsx` | S1 | R | Composição completa aprovada no artefato; seções identidade→princípios→trabalho→trajetória→conteúdo→participação; CTA primário único; vazio/erro/recusa desenhados; assinatura com reduced-motion |
| 2 | Shell de campanha (header/footer/nav) | `CampaignPageHeader`, `CampaignLogoLink`, `CampaignFooter` | S1 | R | Um só shell para home/conteúdos/jingles/fotos; alvos ≥44px; identificação eleitoral intacta; "Fotos" condicional preservada |
| 3 | `/conteudos` | `conteudos/(catalog)/page.tsx` | S2 | R | Lista/filtros/estados redesenhados; canonical `/conteudos`; `noindex` com 0 peças; skeletons preservados |
| 4 | `/conteudos/[slug]` | `conteudos/[slug]/page.tsx` | S2 | R | Detalhe + player + share redesenhados; 404 uniforme; OG `video.other`/`article` |
| 5 | `/conteudos/[slug]/midia` | `conteudos/[slug]/midia/route.ts` | S2 | E | Range/streaming, `?download=1` `jorge-solla-1313-<slug>.<ext>`, evento anônimo — intocados |
| 6 | `/conteudos/[slug]/frame` | `conteudos/[slug]/frame/route.ts` | S2 | E | Geração/espera do still dentro do orçamento — intocada |
| 7 | `/corte/[id]` | `corte/[id]/page.tsx` + `corte/layout.tsx` | S2 | R | `noindex` sempre; crédito de origem; 404 uniforme; share kit preservado |
| 8 | `/jingles` | `jingles/page.tsx` | S2 | R | Player/reprodução/download `jorge-solla-1313-<slug>.mp3`; vazio honesto; áudio nunca autoplay |
| 9 | `/midia` (referida no brief) | = itens 5/6 (endpoints de mídia) | S2 | E | Registrada como endpoint; não há página `/midia` no app |
| 10 | `/artigos` | `artigos/page.tsx` | S3 | R | Landing editorial restilizada; imagem do destaque corrigida; sem chrome de campanha |
| 11 | `/[type]` | `[type]/page.tsx` (`[type]/layout.tsx`) | S3 | R | Listagem por tipo restilizada; canonical; `generateStaticParams`/`dynamicParams` preservados |
| 12 | `/[type]/[category]` | `[type]/[category]/page.tsx` | S3 | R | Listagem de categoria restilizada; separação editorial mantida |
| 13 | `/[type]/[category]/[slug]` | `[type]/[category]/[slug]/page.tsx` | S3 | R | Artigo: JSON-LD `Article`, OG, redirect canônico, ISR `posts` — preservados |
| 14 | ShareLink `/[type]` (direct/announcement) | `[type]/page.tsx` branch + `components/shareLink/*` | S3 | R | Redirecionamento instantâneo e página de anúncio restilizadas; poll 30s e OG preservados |
| 15 | `/api/share-link/[slug]/live` | `api/share-link/[slug]/live/route.ts` | S3 | E | `{target}` nunca 5xx, `no-store` — intocado |
| 16 | `/[type]/evento.ics` | `[type]/evento.ics/route.ts` | S3 | P | Saída `.ics`, nome do arquivo e `Cache-Control` intocados |
| 17 | `/privacidade` | `privacidade/page.tsx` | S4 | R | Texto legal intacto; restilo editorial; 404 se `!published` |
| 18 | `/mandato-no-whatsapp` | `mandato-no-whatsapp/page.tsx` | S4 | R | Fluxo/form preservados; Consent `whatsapp-inscricao` fail-closed; ≥16px inputs |
| 19 | `/abaixo-assinado/[id]` | `abaixo-assinado/[id]/page.tsx` | S4 | R | Assinatura transacional/consent intactos; **bug 500 em id inexistente corrigido (404)**; JSON-LD/pixel preservados |
| 20 | Newsletter da home | `CampaignNewsletterSection` + `submitCampaignNewsletter` | S1/S4 | R | Consent `campanha-novidades` fail-closed; pixel Lead preservado; estado de recusa desenhado |
| 21 | `/cards` (estúdio) | `(home)/cards/page.tsx` + `components/cards/*` | S5 | R | 6 modelos reais; `?model=` válido; `#cards` da home; nomes de arquivo e telemetria anônima preservados |
| 22 | Construtor fluido do kit na home (extensão) | `CardsStudio`/`CardComposer` (dono) | S5 | R | Uma superfície contínua e progressiva na seção `#cards` da home (sem wizard/passos): prévia viva, foto e dobradinha como convites inline, bandeja só com peças válidas, downloads individual/kit; foto nunca sai do browser; `?model=` e `/cards` preservados; sem persistência silenciosa |
| 23 | `/fotos` (C233) | `fotos/page.tsx` + `components/fotos/*` | S6 | R | Redesenho preserva o contrato C233 (só `approved`; kill switch `photoAlbum.published`; canal de remoção; vazio honesto) — **aberta por decisão de 28/09/2026** |
| 24 | `/fotos/encontre` (C234) | `fotos/encontre/page.tsx` + `api/fotos/selfie` | S7 | R | Redesenho preserva o contrato C234 (`selfieSearchEnabled` fail-closed; Consent por chave; sem score/nome; on-device) — **aberta por decisão de 28/09/2026** |
| 25 | `/api/revalidate` | `api/revalidate/route.ts` | — | P | Allowlist de tags intocada |
| 26 | `/api/content-events` | `api/content-events/route.ts` | S2 | P | Beacon anônimo: schema, rate-limit, catálogos — intocados |
| 27 | `/api/social-feed/sync` | `api/social-feed/sync/route.ts` | — | P | Auth admin + same-origin — intocado |
| 28 | Metadados raiz/robots/OG | `(frontend)/layout.tsx`, `robots.ts`, `lib/seo` | S1 | P | Fallbacks e noindex de staging preservados |
| 29 | `hidden`/`isPostVisible` | `src/utilities/posts.ts` | S3 | P | Falha fechada; remoção sem deploy — intocados |
Nenhuma rota da lista do programa fica sem dono. `/midia` e `/frame` são
endpoints de mídia da Central (itens 5/6), não páginas.
## 3. Fatias
| Fatia | Escopo | Depende | Appetite | Design |
| ------ | ----------------------------------------------------------------------------- | ------------------------- | -------- | ------------------------------------------- |
| **S0** | Auditoria, matriz, plano, 1º pacote de design | — | — | campanha home+shell |
| **S1** | Shell de campanha + home (itens 1–2, 20) | S0 | M | `site-publico-campanha-home-ui-design.html` |
| **S2** | Central de Conteúdos, cortes, mídia embutida, jingles (3–9, 26) | S1 (shell) | M | artefato próprio por superfície |
| **S3** | Editorial: artigos, listas, artigo, share-links, `.ics` (10–16, 29) | S0 | M | artefato próprio |
| **S4** | Participação: WhatsApp, abaixo-assinado, privacidade, polish de forms (17–20) | S1 | S/M | artefato próprio |
| **S5** | Wizard do kit de apoio (21–22) | S1 | M | artefato próprio (estende `/cards`) |
| **S6** | Álbum público C233 (23) — aberto (decisão de 28/09/2026) | S3 (editorial) | S | artefato C233 aprovado (base) |
| **S7** | Selfie C234 (24) — aberto (decisão de 28/09/2026) | S6 + ops (flag + Consent) | — | artefato C234 aprovado (base) |
| Fatia | Escopo | Depende | Appetite | Design |
| ------ | ----------------------------------------------------------------------------- | ------------------------- | -------- | -------------------------------------------------------------------------- |
| **S0** | Auditoria, matriz, plano, 1º pacote de design | — | — | campanha home+shell |
| **S1** | Shell de campanha + home (itens 1–2, 20) | S0 | M | `site-publico-campanha-home-ui-design.html` |
| **S2** | Central de Conteúdos, cortes, mídia embutida, jingles (3–9, 26) | S1 (shell) | M | artefato próprio por superfície |
| **S3** | Editorial: artigos, listas, artigo, share-links, `.ics` (10–16, 29) | S0 | M | artefato próprio |
| **S4** | Participação: WhatsApp, abaixo-assinado, privacidade, polish de forms (17–20) | S1 | S/M | artefato próprio |
| **S5** | Construtor fluido do kit de apoio na home (21–22) | S1 | M | artefato próprio (seção `#cards`; estúdio `/cards` segue dono dos modelos) |
| **S6** | Álbum público C233 (23) — aberto (decisão de 28/09/2026) | S3 (editorial) | S | artefato C233 aprovado (base) |
| **S7** | Selfie C234 (24) — aberto (decisão de 28/09/2026) | S6 + ops (flag + Consent) | — | artefato C234 aprovado (base) |
O núcleo (S1–S5) não depende de S6/S7; bloqueio de uma adição gateada não para
o resto. Cada fatia exige: reconciliação factual dos claims que publica,

View file

@ -1 +1 @@
**S1 — Redesign das superfícies públicas: auditoria, matriz de cobertura e artefato hi-fi da home de campanha (2026-09-28):** primeira entrega do programa de redesign do site público (`docs/campanha/redesign-site-publico.md`), **docs-only e sem implementação** — ela abre o gate visual. O plano de programa registra o diagnóstico da auditoria live (1280/390), a **matriz de cobertura** de todas as rotas públicas das duas vertentes (campanha: `/`, shell, `/conteudos`, `/[slug]`, mídia/frame, `/corte/[id]`, `/jingles`; editorial: `/artigos`, `/[type]`, `/[type]/[category]`, `/[type]/[category]/[slug]`, share-links, `.ics`; participação: `/mandato-no-whatsapp`, `/abaixo-assinado/[id]`, `/privacidade`; extensões C233/C234), as 8 fatias com dependências e aceite, os contratos públicos preservados e a **reconciliação factual registrada em 28/09/2026**: por decisão da coordenação, "Criou o SAMU 192" e "Criou o Brasil Sorridente" ficam aprovados (liderou o piloto municipal e a nacionalização; liderou a implementação), "Mais votado do PT-BA em 2022" está correto no recorte partidário (com o escopo explícito), "DIAP entre os 40 melhores" confirmado, e 3.333/1.031 seguem como no ar com rechecagem antes do go-live; C233/C234 são **superfícies abertas e implementadas** (S6/S7 de redesenho, não adição gateada). O artefato hi-fi `docs/plans/site-publico-campanha-home-ui-design.html` (designer `openai/gpt-5.6-sol`) apresenta a home completa em 1280/390 com a direção "vermelho abre, papel explica": hero de mobilização com H1 "Mais Saúde, Mais Futuro", micro-provas aprovadas, prova social numérica, princípios como capítulos com fotografia própria por capítulo (crossfade 1:1 no desktop, inline no mobile/reduced-motion), a seção "por que essa eleição importa", o caso **SAMU na Bahia** como ficha de evidência em duas eras (gestão estadual 2007–2010 · entregue; governo federal 2025 · autorizado, com fonte), trajetória datada por esfera, board de atualizações (posts + YouTube + Instagram com snapshot/lazy), zona de mídia com rádio/vídeo sob ação do usuário e fail-closed, participação com um CTA primário e formulário de 3 campos, e os quatro estados críticos (board vazio, descoberta fail-closed, consentimento recusado, fallback de mídia); **três decisões visuais** documentadas no artefato e o porquê registrado em `DESIGN.md` §7. A faixa de jingles da home nasceu no tier degradado numa primeira passada (a cota do frontier esgotou no meio do lote) e foi **certificada pelo `openai/gpt-5.6-sol`** na passada seguinte, com as marcações `DEGRADED` removidas. O mesmo lote entregou o artefato da fatia S5 — `docs/plans/kit-apoiador-wizard-ui-design.html` — com o wizard do kit de apoio (passos nome → foto de perfil → dobradinha → kit completo, mais a descoberta de selfie C234 só quando disponível), sobre o estúdio `/cards` existente sem duplicar o renderer: peças inválidas nunca entram no download, foto nunca sai do aparelho, `?model=`/`#cards` preservados, com kit vazio/parcial/cheio, erros recuperáveis (arquivo, cutout, nome longo, busca sem resultado), foco/teclado/reduced-motion e a ação de baixar o kit com o transporte em lote deixado como decisão de implementação. Riscos públicos abertos no plano: `/abaixo-assinado/<id inexistente>` responde 500 em produção (deveria 404) e imagem de destaque quebrada em `/artigos`. Copy da home reconciliado em deck de voz (`solla-comunicacao`, untracked). PR em rascunho: aguarda aprovação humana do artefato antes de qualquer implementação.
**S1 — Redesign das superfícies públicas: auditoria, matriz de cobertura e artefato hi-fi da home de campanha (2026-09-28):** primeira entrega do programa de redesign do site público (`docs/campanha/redesign-site-publico.md`), **docs-only e sem implementação** — ela abre o gate visual. O plano de programa registra o diagnóstico da auditoria live (1280/390), a **matriz de cobertura** de todas as rotas públicas das duas vertentes (campanha: `/`, shell, `/conteudos`, `/[slug]`, mídia/frame, `/corte/[id]`, `/jingles`; editorial: `/artigos`, `/[type]`, `/[type]/[category]`, `/[type]/[category]/[slug]`, share-links, `.ics`; participação: `/mandato-no-whatsapp`, `/abaixo-assinado/[id]`, `/privacidade`; extensões C233/C234), as 8 fatias com dependências e aceite, os contratos públicos preservados e a **reconciliação factual registrada em 28/09/2026**: por decisão da coordenação, "Criou o SAMU 192" e "Criou o Brasil Sorridente" ficam aprovados (liderou o piloto municipal e a nacionalização; liderou a implementação), "Mais votado do PT-BA em 2022" está correto no recorte partidário (com o escopo explícito), "DIAP entre os 40 melhores" confirmado, e 3.333/1.031 seguem como no ar com rechecagem antes do go-live; C233/C234 são **superfícies abertas e implementadas** (S6/S7 de redesenho, não adição gateada). O artefato hi-fi `docs/plans/site-publico-campanha-home-ui-design.html` (designer `openai/gpt-5.6-sol`) apresenta a home completa em 1280/390 com a direção "vermelho abre, papel explica": hero de mobilização com H1 "Mais Saúde, Mais Futuro", micro-provas aprovadas, prova social numérica, princípios como capítulos com fotografia própria por capítulo (crossfade 1:1 no desktop, inline no mobile/reduced-motion), a seção "por que essa eleição importa", o caso **SAMU na Bahia** como ficha de evidência em duas eras (gestão estadual 2007–2010 · entregue; governo federal 2025 · autorizado, com fonte), trajetória datada por esfera, board de atualizações (posts + YouTube + Instagram com snapshot/lazy), zona de mídia com rádio/vídeo sob ação do usuário e fail-closed, participação com um CTA primário e formulário de 3 campos, e os quatro estados críticos (board vazio, descoberta fail-closed, consentimento recusado, fallback de mídia); **três decisões visuais** documentadas no artefato e o porquê registrado em `DESIGN.md` §7. A faixa de jingles da home nasceu no tier degradado numa primeira passada (a cota do frontier esgotou no meio do lote) e foi **certificada pelo `openai/gpt-5.6-sol`** na passada seguinte, com as marcações `DEGRADED` removidas. O mesmo lote entregou o artefato da fatia S5 — `docs/plans/kit-apoiador-home-ui-design.html` — com o **construtor fluido do kit de apoio dentro da home** (seção `#cards`, no ritmo editorial): uma superfície contínua e progressiva, sem wizard/passos, em que o nome inicia a prévia viva, foto e dobradinha aparecem como convites inline opcionais e a bandeja acumula só as peças válidas (downloads individual e do kit), com os 6 modelos do estúdio preservados em `/cards` e `?model=`/âncora `#cards` mantidos; a Seção `#cards` do artefato da home foi atualizada para essa composição. O artefato anterior de wizard em página separada foi **removido antes de qualquer aprovação** (superseded, sem twin). Estados cobertos: nome vazio/inválido, foto adicionada/reenquadrada, dobradinha, erros recuperáveis (arquivo, cutout, busca vazia), bandeja vazia/parcial/completa, foco/teclado/`prefers-reduced-motion` e o convite de selfie C234 como ação separada; o transporte do "Baixar kit" fica como decisão de implementação. Riscos públicos abertos no plano: `/abaixo-assinado/<id inexistente>` responde 500 em produção (deveria 404) e imagem de destaque quebrada em `/artigos`. Copy da home reconciliado em deck de voz (`solla-comunicacao`, untracked). PR em rascunho: aguarda aprovação humana do artefato antes de qualquer implementação.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -23,6 +23,7 @@
--ink: #221713;
--muted: #705f58;
--line: rgb(71 19 14 / 18%);
--field: rgb(71 19 14 / 26%);
--blue: #184e92;
--red-bright: #e4102f;
--green: #009647;
@ -1116,6 +1117,264 @@
line-height: 1.5;
}
.home-kit-builder {
padding: 112px 72px 126px;
background: var(--campaign-cream);
border-top: 1px solid var(--line);
}
.voice-mark {
color: #9b6500;
font-size: 0.7em;
vertical-align: super;
}
.home-kit-builder > header {
max-width: 780px;
}
.home-kit-builder > header h2 {
margin: 0;
font: 760 3.45rem/0.98 var(--font-display);
letter-spacing: -0.052em;
}
.home-kit-builder > header > p:last-child {
max-width: 650px;
margin: 22px 0 0;
color: var(--muted);
font-size: 0.9rem;
line-height: 1.65;
}
.home-builder-layout {
display: grid;
grid-template-columns: 42% 58%;
gap: 1px;
margin-top: 62px;
background: var(--line);
border: 1px solid var(--line);
}
.home-builder-preview {
position: relative;
padding: 38px;
background: var(--pt-red-dark);
color: white;
}
.home-builder-preview-inner {
position: sticky;
top: 24px;
}
.home-card-live {
position: relative;
width: 232px;
aspect-ratio: 3 / 4;
margin: 0 auto;
overflow: hidden;
border-radius: 10px;
box-shadow: 0 22px 52px rgb(0 0 0 / 30%);
}
.home-card-live img {
width: 100%;
height: 100%;
object-fit: cover;
}
.home-card-name {
position: absolute;
top: 30%;
left: 20%;
max-width: 65%;
color: #ffec01;
font: 850 1.05rem/0.95 var(--font-display);
text-transform: uppercase;
}
.home-live-label {
margin: 22px 0 0;
color: rgb(255 255 255 / 65%);
font-size: 0.66rem;
text-align: center;
}
.home-kit-mini {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 8px;
margin-top: 24px;
}
.home-kit-mini div {
min-height: 66px;
padding: 9px;
background: rgb(255 255 255 / 9%);
border: 1px solid rgb(255 255 255 / 14%);
color: rgb(255 255 255 / 62%);
font-size: 0.58rem;
line-height: 1.35;
}
.home-kit-mini div.ready {
color: white;
border-color: rgb(255 230 7 / 60%);
}
.home-builder-controls {
padding: 36px 42px 42px;
background: white;
}
.home-control-block {
padding: 28px 0;
border-top: 1px solid var(--line);
}
.home-control-block:first-child {
padding-top: 0;
border-top: 0;
}
.home-control-block h3 {
margin: 0;
font: 730 1.35rem/1.08 var(--font-display);
}
.home-control-block > p {
margin: 8px 0 0;
color: var(--muted);
font-size: 0.72rem;
line-height: 1.55;
}
.home-control-block label {
display: block;
margin-top: 18px;
font-size: 0.72rem;
font-weight: 750;
}
.home-control-block input {
width: 100%;
min-height: 48px;
margin-top: 8px;
padding: 0 13px;
border: 1px solid var(--field);
border-radius: 8px;
background: white;
color: var(--ink);
font-size: 1rem;
}
.home-inline-invite {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-top: 16px;
padding: 16px;
background: var(--campaign-surface);
border: 1px dashed var(--field);
}
.home-inline-invite strong {
display: block;
font-size: 0.76rem;
}
.home-inline-invite span {
display: block;
margin-top: 4px;
color: var(--muted);
font-size: 0.65rem;
}
.home-inline-invite button,
.home-builder-download,
.home-piece-download {
min-height: 44px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 8px;
font-weight: 760;
}
.home-inline-invite button {
flex: 0 0 auto;
padding: 0 14px;
border: 1px solid var(--line);
background: white;
color: var(--pt-red);
font-size: 0.7rem;
}
.home-picker-selected {
display: flex;
min-height: 48px;
align-items: center;
margin-top: 14px;
padding: 0 13px;
border: 1px solid var(--field);
border-radius: 8px;
background: white;
font-size: 0.72rem;
font-weight: 700;
}
.home-picker-selected span {
margin-left: auto;
color: var(--muted);
font-size: 0.64rem;
}
.home-privacy {
margin: 13px 0 0;
color: var(--muted);
font-size: 0.64rem;
line-height: 1.5;
}
.home-tray {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
margin-top: 18px;
}
.home-tray article {
min-height: 108px;
padding: 12px;
background: var(--cream);
border: 1px solid var(--line);
}
.home-tray strong {
display: block;
font-size: 0.66rem;
line-height: 1.25;
}
.home-tray span {
display: block;
margin-top: 7px;
color: var(--green);
font-size: 0.6rem;
font-weight: 700;
}
.home-piece-download {
margin-top: 7px;
border: 0;
background: transparent;
color: var(--pt-red);
font-size: 0.62rem;
}
.home-tray-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 14px;
margin-top: 14px;
padding: 15px;
background: var(--pt-red-dark);
color: white;
}
.home-tray-footer strong {
font: 740 0.86rem/1.2 var(--font-display);
}
.home-tray-footer p {
margin: 4px 0 0;
color: rgb(255 255 255 / 62%);
font-size: 0.59rem;
}
.home-builder-download {
padding: 0 16px;
border: 0;
background: white;
color: var(--pt-red-dark);
font-size: 0.7rem;
}
.home-studio-link {
min-height: 44px;
display: inline-flex;
align-items: center;
margin-top: 22px;
color: var(--pt-red);
font-size: 0.72rem;
font-weight: 750;
text-underline-offset: 4px;
}
.participation {
display: grid;
grid-template-columns: 42% 58%;
@ -1603,6 +1862,45 @@
.mobile .jingles-note {
padding-right: 20px;
}
.mobile .home-kit-builder {
padding: 82px 20px 90px;
}
.mobile .home-kit-builder > header h2 {
font-size: 2.5rem;
}
.mobile .home-builder-layout {
display: block;
margin-top: 42px;
}
.mobile .home-builder-preview {
padding: 28px 18px;
}
.mobile .home-builder-preview-inner {
position: static;
}
.mobile .home-card-live {
width: 176px;
}
.mobile .home-builder-controls {
padding: 28px 18px 32px;
}
.mobile .home-inline-invite {
align-items: flex-start;
flex-direction: column;
}
.mobile .home-inline-invite button {
width: 100%;
}
.mobile .home-tray {
grid-template-columns: 1fr 1fr;
}
.mobile .home-tray-footer {
align-items: stretch;
flex-direction: column;
}
.mobile .home-builder-download {
width: 100%;
}
.mobile .participation {
display: block;
}
@ -2506,7 +2804,7 @@
As primeiras peças estão a caminho. Enquanto isso, faça seu card e mostre que
você está com Solla.
</p>
<a href="/cards">Fazer meu card</a>
<a href="#cards">Fazer meu card</a>
</article>
</div>
</div>
@ -2642,6 +2940,128 @@
</p>
</section>
<section id="cards" class="home-kit-builder" aria-labelledby="desktop-cards-title">
<header>
<p class="eyebrow">Faça parte</p>
<h2 id="desktop-cards-title">Mostre que você está com Solla</h2>
<p>
Escolha um modelo, coloque seu nome ou sua foto e baixe seu card. Compartilhe com
sua gente e fortaleça nossa caminhada.
</p>
</header>
<div class="home-builder-layout">
<aside class="home-builder-preview" aria-label="Prévia viva e bandeja do kit">
<div class="home-builder-preview-inner">
<div class="home-card-live">
<img
src="../../public/cards/name-card-base.jpg"
width="1080"
height="1440"
alt="Prévia do card com nome"
/>
<span class="home-card-name">MARIA<br />DO CARMO</span>
</div>
<p class="home-live-label">
Prévia viva · o nome muda enquanto você digita<span class="voice-mark">†</span>
</p>
<div class="home-kit-mini" aria-label="Peças prontas do kit">
<div class="ready"><strong>Nome</strong><br />pronto</div>
<div class="ready"><strong>2 perfis</strong><br />prontos</div>
<div class="ready"><strong>Time</strong><br />pronto</div>
<div class="ready"><strong>Estadual</strong><br />pronto</div>
<div class="ready"><strong>Colinha</strong><br />pronta</div>
<div><strong>6 peças</strong><br />na bandeja</div>
</div>
</div>
</aside>
<div class="home-builder-controls">
<section class="home-control-block">
<h3>Comece pelo seu nome<span class="voice-mark">†</span></h3>
<p>
O texto se ajusta em caixa alta e até 2 linhas. Se não couber com leitura
segura, nenhuma peça incompleta é criada.
</p>
<label for="home-kit-name-desktop">Seu nome</label>
<input id="home-kit-name-desktop" value="Maria do Carmo" autocomplete="off" />
<p class="home-privacy">
Seu nome e sua foto são processados apenas no seu aparelho e não são enviados
para nós.
</p>
</section>
<section class="home-control-block">
<h3>Quer sua foto?<span class="voice-mark">†</span></h3>
<p>
Opcional. O recorte, o enquadramento e a harmonização acontecem no aparelho.
</p>
<div class="home-inline-invite">
<div>
<strong>Foto adicionada<span class="voice-mark">†</span></strong
><span>Arraste para reenquadrar ou use os controles de direção e zoom.</span>
</div>
<button type="button">Trocar foto</button>
</div>
<p class="home-privacy">Sua foto fica neste aparelho e não é enviada para nós.</p>
</section>
<section class="home-control-block">
<h3>Quer sua dobradinha?<span class="voice-mark">†</span></h3>
<p>
Opcional. Escolha entre 53 estaduais; a arte de time e a colinha usam a opção
selecionada.
</p>
<div class="home-picker-selected">Julio Pinheiro <span>13999 · Trocar</span></div>
<p class="home-privacy">
A escolha é processada neste aparelho. Nenhum nome, foto ou cadastro é
solicitado.
</p>
</section>
<section class="home-control-block">
<h3>Sua bandeja<span class="voice-mark">†</span></h3>
<p>Só peças válidas aparecem aqui. Baixe uma por vez ou use a ação do kit.</p>
<div class="home-tray">
<article>
<strong>Card com seu nome</strong><span>Pronto</span
><button class="home-piece-download" type="button">Baixar PNG</button>
</article>
<article>
<strong>Moldura quadrada</strong><span>Pronta</span
><button class="home-piece-download" type="button">Baixar PNG</button>
</article>
<article>
<strong>Moldura vertical</strong><span>Pronta</span
><button class="home-piece-download" type="button">Baixar PNG</button>
</article>
<article>
<strong>Time de você</strong><span>Pronto</span
><button class="home-piece-download" type="button">Baixar PNG</button>
</article>
<article>
<strong>Time do estadual</strong><span>Pronto</span
><button class="home-piece-download" type="button">Baixar PNG</button>
</article>
<article>
<strong>Minha colinha</strong><span>Pronta</span
><button class="home-piece-download" type="button">Baixar PNG</button>
</article>
</div>
<div class="home-tray-footer">
<div>
<strong>6 peças prontas<span class="voice-mark">†</span></strong>
<p>
Arquivos individuais: card-jorge-solla-&lt;id&gt;.png · telemetria anônima.
</p>
</div>
<button class="home-builder-download" type="button">
Baixar kit<span class="voice-mark">†</span>
</button>
</div>
<a class="home-studio-link" href="/cards"
>Ver todos os modelos e o estúdio completo</a
>
</section>
</div>
</div>
</section>
<section
id="desktop-participar"
class="participation"
@ -3149,7 +3569,7 @@
As primeiras peças estão a caminho. Enquanto isso, faça seu card e mostre que
você está com Solla.
</p>
<a href="/cards">Fazer meu card</a>
<a href="#cards-mobile">Fazer meu card</a>
</article>
</div>
</div>
@ -3285,6 +3705,117 @@
</p>
</section>
<section id="cards-mobile" class="home-kit-builder" aria-labelledby="mobile-cards-title">
<header>
<p class="eyebrow">Faça parte</p>
<h2 id="mobile-cards-title">Mostre que você está com Solla</h2>
<p>
Escolha um modelo, coloque seu nome ou sua foto e baixe seu card. Compartilhe com
sua gente e fortaleça nossa caminhada.
</p>
</header>
<div class="home-builder-layout">
<aside class="home-builder-preview" aria-label="Prévia viva e bandeja do kit">
<div class="home-builder-preview-inner">
<div class="home-card-live">
<img
src="../../public/cards/name-card-base.jpg"
width="1080"
height="1440"
alt="Prévia do card com nome"
/><span class="home-card-name" style="font-size: 0.8rem"
>MARIA<br />DO CARMO</span
>
</div>
<p class="home-live-label">
Prévia viva · inline, sem cobrir conteúdo ou foco<span class="voice-mark"
>†</span
>
</p>
<div class="home-kit-mini">
<div class="ready"><strong>Nome</strong><br />pronto</div>
<div class="ready"><strong>Perfis</strong><br />prontos</div>
<div class="ready"><strong>Time</strong><br />pronto</div>
<div class="ready"><strong>Estadual</strong><br />pronto</div>
<div class="ready"><strong>Colinha</strong><br />pronta</div>
<div><strong>6 peças</strong><br />na bandeja</div>
</div>
</div>
</aside>
<div class="home-builder-controls">
<section class="home-control-block">
<h3>Comece pelo seu nome<span class="voice-mark">†</span></h3>
<p>O card muda enquanto você digita.</p>
<label for="home-kit-name-mobile">Seu nome</label
><input id="home-kit-name-mobile" value="Maria do Carmo" autocomplete="off" />
<p class="home-privacy">
Seu nome e sua foto são processados apenas no seu aparelho e não são enviados
para nós.
</p>
</section>
<section class="home-control-block">
<h3>Quer sua foto?<span class="voice-mark">†</span></h3>
<div class="home-inline-invite">
<div>
<strong>Foto opcional<span class="voice-mark">†</span></strong
><span>Recorte e ajuste no aparelho.</span>
</div>
<button type="button">Escolher foto</button>
</div>
<p class="home-privacy">Sua foto fica neste aparelho e não é enviada para nós.</p>
</section>
<section class="home-control-block">
<h3>Quer sua dobradinha?<span class="voice-mark">†</span></h3>
<div class="home-inline-invite">
<div>
<strong>53 estaduais</strong
><span>Busca por nome e navegação por teclado.</span>
</div>
<button type="button">Escolher estadual</button>
</div>
<p class="home-privacy">
A escolha é processada neste aparelho. Nenhum nome, foto ou cadastro é
solicitado.
</p>
</section>
<section class="home-control-block">
<h3>Sua bandeja<span class="voice-mark">†</span></h3>
<p>Só peças válidas aparecem aqui.</p>
<div class="home-tray">
<article>
<strong>Card com nome</strong><span>Pronto</span
><button class="home-piece-download" type="button">Baixar</button>
</article>
<article>
<strong>2 perfis</strong><span>Prontos</span
><button class="home-piece-download" type="button">Baixar</button>
</article>
<article>
<strong>Time</strong><span>Pronto</span
><button class="home-piece-download" type="button">Baixar</button>
</article>
<article>
<strong>Colinha</strong><span>Pronta</span
><button class="home-piece-download" type="button">Baixar</button>
</article>
</div>
<div class="home-tray-footer">
<div>
<strong>6 peças prontas<span class="voice-mark">†</span></strong>
<p>Sem arte incompleta.</p>
</div>
<button class="home-builder-download" type="button">
Baixar kit<span class="voice-mark">†</span>
</button>
</div>
<a class="home-studio-link" href="/cards"
>Ver todos os modelos e o estúdio completo</a
>
</section>
</div>
</div>
</section>
<section class="participation" aria-labelledby="mobile-support-title">
<div class="participation-copy">
<p class="eyebrow">Apoie e acompanhe</p>
@ -3467,7 +3998,7 @@
“As primeiras peças estão a caminho. Enquanto isso, faça seu card e mostre que você está
com Solla.”
</div>
<a href="/cards">Fazer meu card</a>
<a href="#cards">Fazer meu card</a>
</article>
<article class="state-card">
<span class="state-tag">Descoberta fail-closed</span>