mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-14 17:43:04 +00:00
docs(S5): construtor fluido do kit na home (substitui o wizard em página)
This commit is contained in:
parent
f0c735c077
commit
f01e1a146a
6 changed files with 1711 additions and 1525 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
1133
docs/plans/kit-apoiador-home-ui-design.html
Normal file
1133
docs/plans/kit-apoiador-home-ui-design.html
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -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-<id>.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>
|
||||
|
|
|
|||
Loading…
Reference in a new issue