chore(S16,S17,S18): formata artefatos ui-design (prettier) para o gate

This commit is contained in:
Francisco Solla 2026-09-19 01:03:48 -03:00
parent eadaf6f64f
commit 8480868059
3 changed files with 156 additions and 125 deletions

View file

@ -175,12 +175,12 @@
<p class="mt-3 max-w-3xl text-sm leading-6 text-zinc-400">
O enquadramento automático passa a mirar a proporção da cabeça: a cabeça do visitante fica
na mesma ordem de grandeza das cabeças dos candidatos (±20%), medida pela mesma régua nos
dois lados. Sem controle novo; arrastar e zoom seguem como escape. Sem rosto detectado, vale
o enquadramento de hoje — sem erro visível.
dois lados. Sem controle novo; arrastar e zoom seguem como escape. Sem rosto detectado,
vale o enquadramento de hoje — sem erro visível.
</p>
<p class="mt-3 max-w-3xl text-xs leading-5 text-amber-300/90">
<strong>DEGRADED:</strong> este design não está certificado. É insumo para decisão humana no
gate/PR — o tier degradado nunca aprova.
<strong>DEGRADED:</strong> este design não está certificado. É insumo para decisão humana
no gate/PR — o tier degradado nunca aprova.
</p>
<div class="mt-5 flex flex-wrap gap-2 text-[11px] font-bold text-zinc-300">
<span class="rounded-full border border-zinc-700 bg-zinc-900 px-3 py-2"
@ -213,7 +213,9 @@
>
<div class="grid gap-8 sm:grid-cols-3">
<figure class="m-0">
<div class="relative mx-auto w-[240px] overflow-hidden rounded-lg border border-[var(--campaign-line)] shadow-md">
<div
class="relative mx-auto w-[240px] overflow-hidden rounded-lg border border-[var(--campaign-line)] shadow-md"
>
<div class="tcard">
<img src="../../public/cards/team-card-base.png" alt="" class="tcard-base" />
<div class="tcard-window">
@ -248,7 +250,9 @@
</figure>
<figure class="m-0">
<div class="relative mx-auto w-[240px] overflow-hidden rounded-lg border-2 border-emerald-500 shadow-md">
<div
class="relative mx-auto w-[240px] overflow-hidden rounded-lg border-2 border-emerald-500 shadow-md"
>
<div class="tcard">
<img src="../../public/cards/team-card-base.png" alt="" class="tcard-base" />
<div class="tcard-window">
@ -287,7 +291,9 @@
</figure>
<figure class="m-0">
<div class="relative mx-auto w-[240px] overflow-hidden rounded-lg border border-[var(--campaign-line)] shadow-md">
<div
class="relative mx-auto w-[240px] overflow-hidden rounded-lg border border-[var(--campaign-line)] shadow-md"
>
<div class="tcard">
<img src="../../public/cards/team-card-base.png" alt="" class="tcard-base" />
<div class="tcard-window">
@ -335,15 +341,17 @@
</h2>
<p class="mt-1 max-w-3xl text-xs leading-5 text-zinc-500">
A medida é a mesma dos dois lados: a caixa do rosto. A referência dos candidatos é medida
uma vez sobre a arte-mestre e vira constante; a do visitante é medida na foto no momento do
recorte. O alvo é a mesma ordem de grandeza, ±20%.
uma vez sobre a arte-mestre e vira constante; a do visitante é medida na foto no momento
do recorte. O alvo é a mesma ordem de grandeza, ±20%.
</p>
<div
class="mt-4 overflow-hidden rounded-xl border border-zinc-700 bg-[var(--campaign-cream)] p-8 text-black shadow-2xl"
>
<div class="grid gap-8 sm:grid-cols-2">
<figure class="m-0">
<div class="relative mx-auto w-[260px] overflow-hidden rounded-lg border border-[var(--campaign-line)] shadow-md">
<div
class="relative mx-auto w-[260px] overflow-hidden rounded-lg border border-[var(--campaign-line)] shadow-md"
>
<div class="tcard">
<img src="../../public/cards/team-card-base.png" alt="" class="tcard-base" />
<img src="../../public/cards/team-card-front.png" alt="" class="tcard-front" />
@ -354,13 +362,17 @@
></div>
</div>
</div>
<figcaption class="mt-3 text-center text-[11px] leading-4 text-[var(--campaign-muted)]">
<figcaption
class="mt-3 text-center text-[11px] leading-4 text-[var(--campaign-muted)]"
>
Referência medida uma vez na arte-mestre (aprox. ilustrativa).
</figcaption>
</figure>
<figure class="m-0">
<div class="relative mx-auto w-[260px] overflow-hidden rounded-lg border border-[var(--campaign-line)] shadow-md">
<div
class="relative mx-auto w-[260px] overflow-hidden rounded-lg border border-[var(--campaign-line)] shadow-md"
>
<div class="tcard">
<img src="../../public/cards/team-card-base.png" alt="" class="tcard-base" />
<div class="tcard-window">
@ -385,15 +397,21 @@
></div>
</div>
</div>
<figcaption class="mt-3 text-center text-[11px] leading-4 text-[var(--campaign-muted)]">
<figcaption
class="mt-3 text-center text-[11px] leading-4 text-[var(--campaign-muted)]"
>
Mesma caixa, medida na foto do visitante; igual em ordem de grandeza.
</figcaption>
</figure>
</div>
<ul class="mx-auto mt-6 max-w-3xl list-disc space-y-2 pl-5 text-xs leading-5 text-[var(--campaign-muted)]">
<ul
class="mx-auto mt-6 max-w-3xl list-disc space-y-2 pl-5 text-xs leading-5 text-[var(--campaign-muted)]"
>
<li>Em foto com mais de um rosto, vale o maior rosto (o do visitante).</li>
<li>O rosto nunca é cortado pelo enquadramento proporcional.</li>
<li>Cobertura da janela prevalece: sem buraco no card, mesmo que limite a proporção.</li>
<li>
Cobertura da janela prevalece: sem buraco no card, mesmo que limite a proporção.
</li>
<li>A medida é feita no recorte; arrastar/zoom não re-medem nem re-enquadram.</li>
</ul>
</div>
@ -406,8 +424,8 @@
</h2>
<p class="mt-1 max-w-3xl text-xs leading-5 text-zinc-500">
Sem rosto detectado, com detecção indisponível ou em qualquer falha, vale exatamente o
enquadramento de hoje (pelo contorno da foto): nenhum aviso, nenhum erro, nenhum bloqueio. O
único erro recuperável continua sendo o do recorte de fundo.
enquadramento de hoje (pelo contorno da foto): nenhum aviso, nenhum erro, nenhum bloqueio.
O único erro recuperável continua sendo o do recorte de fundo.
</p>
<div class="mt-4 grid gap-6 lg:grid-cols-[390px_1fr]">
<div
@ -475,7 +493,9 @@
</button>
<button aria-label="Mover foto para cima" class="ctrl-btn min-h-11">↑</button>
<button aria-label="Mover foto para baixo" class="ctrl-btn min-h-11">↓</button>
<button aria-label="Mover foto para a direita" class="ctrl-btn min-h-11">→</button>
<button aria-label="Mover foto para a direita" class="ctrl-btn min-h-11">
→
</button>
</div>
<button
class="mt-3 inline-flex min-h-11 w-full items-center justify-center rounded-lg border-2 border-[var(--campaign-line)] bg-white px-5 text-sm font-extrabold text-[var(--pt-red)]"
@ -517,8 +537,8 @@
<div
class="mt-3 rounded-lg border border-zinc-800 bg-zinc-900/60 p-4 text-xs leading-5 text-zinc-400"
>
<strong class="text-zinc-300">O escape continua o de sempre:</strong> arrastar a foto e
os controles de zoom/ajuste fino. Nenhum botão novo, nenhum passo novo, nenhum aviso
<strong class="text-zinc-300">O escape continua o de sempre:</strong> arrastar a foto
e os controles de zoom/ajuste fino. Nenhum botão novo, nenhum passo novo, nenhum aviso
quando a medida não é possível.
</div>
</div>
@ -534,9 +554,9 @@
class="mt-4 rounded-xl border border-zinc-700 bg-zinc-900 p-5 text-xs leading-6 text-zinc-300"
>
<p class="font-mono text-[11px] text-zinc-400">
[foto escolhida] → [recorte no aparelho: progresso | erro + retry] → [rosto medido?] — sim
→ [zoom p/ cabeça a ±20% da cabeça dos candidatos] · não → [enquadramento de hoje, pelo
contorno] → [prévia (arrastar/zoom como escape)] → [baixar PNG]
[foto escolhida] → [recorte no aparelho: progresso | erro + retry] → [rosto medido?] —
sim → [zoom p/ cabeça a ±20% da cabeça dos candidatos] · não → [enquadramento de hoje,
pelo contorno] → [prévia (arrastar/zoom como escape)] → [baixar PNG]
</p>
</div>
<div class="mt-4 grid gap-4 lg:grid-cols-3">
@ -582,17 +602,18 @@
</p>
<p class="mt-2">
<strong class="text-zinc-300">Em aberto (validar com produto):</strong> referência dos
candidatos como constante medida uma vez vs medida em runtime; só automático com fallback vs
toggle; detector (caixa do rosto vs malha facial).
candidatos como constante medida uma vez vs medida em runtime; só automático com fallback
vs toggle; detector (caixa do rosto vs malha facial).
</p>
<p class="mt-2">
<strong class="text-zinc-300">NEEDS ASSET:</strong> foto real do visitante (com e sem rosto)
para validar a proporção; aqui usamos silhueta cinza. A arte oficial dos candidatos é real.
<strong class="text-zinc-300">NEEDS ASSET:</strong> foto real do visitante (com e sem
rosto) para validar a proporção; aqui usamos silhueta cinza. A arte oficial dos candidatos
é real.
</p>
<p class="mt-2">
<strong class="text-zinc-300">Ilustração:</strong> as caixas da régua e as escalas dos
placeholders são aproximações para comunicar a intenção — a métrica final é a caixa do rosto
medida pelo detector, com tolerância ±20% e cobertura sempre prevalecendo.
placeholders são aproximações para comunicar a intenção — a métrica final é a caixa do
rosto medida pelo detector, com tolerância ±20% e cobertura sempre prevalecendo.
</p>
</aside>
</main>

View file

@ -224,13 +224,14 @@
Card “Time de você”: harmonizar as cores da foto
</h1>
<p class="mt-3 max-w-3xl text-sm leading-6 text-zinc-400">
No estado em que a foto já está pronta, um único controle binário ajusta brilho, contraste e
saturação da selfie para o tom das fotos oficiais dos candidatos. Padrão LIGADO; desligar
devolve a original na hora; vale para a prévia e para o PNG; nada persiste e não há editor.
No estado em que a foto já está pronta, um único controle binário ajusta brilho, contraste
e saturação da selfie para o tom das fotos oficiais dos candidatos. Padrão LIGADO;
desligar devolve a original na hora; vale para a prévia e para o PNG; nada persiste e não
há editor.
</p>
<p class="mt-3 max-w-3xl text-xs leading-5 text-amber-300/90">
<strong>DEGRADED:</strong> este design não está certificado. É insumo para decisão humana no
gate/PR — o tier degradado nunca aprova.
<strong>DEGRADED:</strong> este design não está certificado. É insumo para decisão humana
no gate/PR — o tier degradado nunca aprova.
</p>
<div class="mt-5 flex flex-wrap gap-2 text-[11px] font-bold text-zinc-300">
<span class="rounded-full border border-zinc-700 bg-zinc-900 px-3 py-2"
@ -239,9 +240,7 @@
<span class="rounded-full border border-zinc-700 bg-zinc-900 px-3 py-2"
>390px · mobile</span
>
<span class="rounded-full border border-zinc-700 bg-zinc-900 px-3 py-2"
>alvo ≥ 44px</span
>
<span class="rounded-full border border-zinc-700 bg-zinc-900 px-3 py-2">alvo ≥ 44px</span>
<span class="rounded-full border border-zinc-700 bg-zinc-900 px-3 py-2"
>padrão LIGADO</span
>
@ -254,8 +253,8 @@
Cena 1 · Estado pronto · dialog desktop 1280 — “Harmonizar cores” LIGADO (padrão)
</h2>
<p class="mt-1 max-w-3xl text-xs leading-5 text-zinc-500">
O controle entra depois do ajuste fino e antes de “Trocar foto”, com ajuda curta em pt-BR e
alvo ≥ 44px. No estado ligado, a prévia já abre harmonizada.
O controle entra depois do ajuste fino e antes de “Trocar foto”, com ajuda curta em pt-BR
e alvo ≥ 44px. No estado ligado, a prévia já abre harmonizada.
</p>
<div
class="relative mt-4 flex min-h-[920px] w-full max-w-[1280px] items-center justify-center overflow-hidden rounded-xl border border-zinc-700 bg-[var(--campaign-band)] p-8 text-black shadow-2xl"
@ -327,12 +326,7 @@
<div class="mt-5 flex items-center gap-3">
<label for="s17-zoom" class="text-sm font-bold">Zoom</label>
<button
aria-label="Diminuir zoom"
class="ctrl-btn size-11 shrink-0"
>
−
</button>
<button aria-label="Diminuir zoom" class="ctrl-btn size-11 shrink-0">−</button>
<input
id="s17-zoom"
aria-label="Nível de zoom"
@ -340,12 +334,7 @@
value="46"
class="range-track h-11 min-w-0 flex-1"
/>
<button
aria-label="Aumentar zoom"
class="ctrl-btn size-11 shrink-0"
>
+
</button>
<button aria-label="Aumentar zoom" class="ctrl-btn size-11 shrink-0">+</button>
</div>
<div class="mt-4">
<p class="text-sm font-bold">Ajuste fino</p>
@ -355,7 +344,9 @@
</button>
<button aria-label="Mover foto para cima" class="ctrl-btn min-h-11">↑</button>
<button aria-label="Mover foto para baixo" class="ctrl-btn min-h-11">↓</button>
<button aria-label="Mover foto para a direita" class="ctrl-btn min-h-11">→</button>
<button aria-label="Mover foto para a direita" class="ctrl-btn min-h-11">
→
</button>
</div>
</div>
@ -513,7 +504,9 @@
</button>
<button aria-label="Mover foto para cima" class="ctrl-btn min-h-11">↑</button>
<button aria-label="Mover foto para baixo" class="ctrl-btn min-h-11">↓</button>
<button aria-label="Mover foto para a direita" class="ctrl-btn min-h-11">→</button>
<button aria-label="Mover foto para a direita" class="ctrl-btn min-h-11">
→
</button>
</div>
</div>
@ -579,8 +572,8 @@
Cena 3 · Estado pronto · drawer mobile 390 — controle LIGADO
</h2>
<p class="mt-1 max-w-3xl text-xs leading-5 text-zinc-500">
No mobile o controle fica na mesma ordem do desktop e o alvo de toque cobre a linha inteira
(≥ 44px), sem depender de mirar no trilho.
No mobile o controle fica na mesma ordem do desktop e o alvo de toque cobre a linha
inteira (≥ 44px), sem depender de mirar no trilho.
</p>
<div class="mt-4 grid gap-6 lg:grid-cols-2">
<div
@ -599,7 +592,9 @@
<p class="text-[10px] font-black tracking-[0.1em] text-[var(--pt-red)] uppercase">
Time de você
</p>
<h3 id="s17-m-title" class="mt-1 text-lg leading-6 font-black">Confira seu card</h3>
<h3 id="s17-m-title" class="mt-1 text-lg leading-6 font-black">
Confira seu card
</h3>
<p class="mt-1 text-sm leading-5 text-[var(--campaign-muted)]">
Arraste a foto ou use os controles.
</p>
@ -659,7 +654,9 @@
</button>
<button aria-label="Mover foto para cima" class="ctrl-btn min-h-11">↑</button>
<button aria-label="Mover foto para baixo" class="ctrl-btn min-h-11">↓</button>
<button aria-label="Mover foto para a direita" class="ctrl-btn min-h-11">→</button>
<button aria-label="Mover foto para a direita" class="ctrl-btn min-h-11">
→
</button>
</div>
<div
@ -722,17 +719,19 @@
(nunca só o trilho).
</li>
<li>
<strong class="text-zinc-200">Ajuda:</strong> “Ajusta o brilho e as cores da sua foto
para combinar com as fotos do card.”
<strong class="text-zinc-200">Ajuda:</strong> “Ajusta o brilho e as cores da sua
foto para combinar com as fotos do card.”
</li>
<li>
<strong class="text-zinc-200">Alvo:</strong> a linha inteira é o botão, com altura
mínima de 44px; funciona por toque e teclado, com foco visível.
</li>
<li>
<strong class="text-zinc-200">Semântica:</strong> binário ligado/desligado
(<code>role="switch"</code> + <code>aria-checked</code>); no port, usa o vocabulário
de toggle já existente no app (sem shadcn Switch).
<strong class="text-zinc-200">Semântica:</strong> binário ligado/desligado (<code
>role="switch"</code
>
+ <code>aria-checked</code>); no port, usa o vocabulário de toggle já existente no
app (sem shadcn Switch).
</li>
<li>
<strong class="text-zinc-200">Estados:</strong> LIGADO (trilho
@ -763,16 +762,18 @@
Cena 4 · Antes / depois da prévia — a escolha refletida
</h2>
<p class="mt-1 max-w-3xl text-xs leading-5 text-zinc-500">
Mesmo recorte, mesmo enquadramento, mesma prévia: só o ajuste de brilho/contraste/saturação
muda. A foto do visitante é um placeholder cinza (NEEDS ASSET) — nenhuma foto real de
terceiro é simulada.
Mesmo recorte, mesmo enquadramento, mesma prévia: só o ajuste de
brilho/contraste/saturação muda. A foto do visitante é um placeholder cinza (NEEDS ASSET)
— nenhuma foto real de terceiro é simulada.
</p>
<div
class="mt-4 overflow-hidden rounded-xl border border-zinc-700 bg-[var(--campaign-cream)] p-8 text-black shadow-2xl"
>
<div class="grid gap-8 sm:grid-cols-2">
<figure class="m-0">
<div class="mx-auto w-[240px] overflow-hidden rounded-lg border border-[var(--campaign-line)] shadow-md">
<div
class="mx-auto w-[240px] overflow-hidden rounded-lg border border-[var(--campaign-line)] shadow-md"
>
<div class="tcard">
<img src="../../public/cards/team-card-base.png" alt="" class="tcard-base" />
<div class="tcard-window">
@ -815,7 +816,9 @@
</figure>
<figure class="m-0">
<div class="mx-auto w-[240px] overflow-hidden rounded-lg border border-[var(--campaign-line)] shadow-md">
<div
class="mx-auto w-[240px] overflow-hidden rounded-lg border border-[var(--campaign-line)] shadow-md"
>
<div class="tcard">
<img src="../../public/cards/team-card-base.png" alt="" class="tcard-base" />
<div class="tcard-window">
@ -860,8 +863,7 @@
<p class="mt-6 text-center text-xs leading-5 text-[var(--campaign-muted)]">
<strong>NEEDS ASSET:</strong> foto real do visitante para validar o ajuste no lugar do
placeholder cinza. A referência de tom é a arte oficial
<code>team-card-base.png</code>.
placeholder cinza. A referência de tom é a arte oficial <code>team-card-base.png</code>.
</p>
</div>
</section>
@ -879,7 +881,9 @@
<li>Desligar devolve a foto original instantaneamente; religar reaplica.</li>
<li>A escolha vale para a prévia e para o PNG baixado.</li>
<li>100% no aparelho: sem upload, sem rede, sem analytics de PII.</li>
<li>Ajuste suave e limitado ao tom das fotos oficiais (brilho, contraste, saturação).</li>
<li>
Ajuste suave e limitado ao tom das fotos oficiais (brilho, contraste, saturação).
</li>
<li>Fica só no modelo <code>time-de-voce</code>.</li>
<li>A nota de privacidade existente continua visível e verdadeira.</li>
</ul>
@ -906,17 +910,18 @@
</p>
<p>
<strong class="text-zinc-300">Copys literais do plano:</strong> rótulo “Harmonizar cores”;
ajuda “Ajusta o brilho e as cores da sua foto para combinar com as fotos do card.”; nota de
privacidade inalterada (<code>CARD_PHOTO_PRIVACY_NOTE</code>).
ajuda “Ajusta o brilho e as cores da sua foto para combinar com as fotos do card.”; nota
de privacidade inalterada (<code>CARD_PHOTO_PRIVACY_NOTE</code>).
</p>
<p class="mt-2">
<strong class="text-zinc-300">Em aberto (validar com produto):</strong> referência de tom
medida na arte-mestre vs perfil fixo; controle só no estado pronto vs também antes da foto.
medida na arte-mestre vs perfil fixo; controle só no estado pronto vs também antes da
foto.
</p>
<p class="mt-2">
<strong class="text-zinc-300">Nota de justiça visual:</strong> os tons antes/depois aqui são
uma ilustração sobre placeholder cinza; o ajuste real é automático e calibrado contra a
arte-mestre, sem preview de número.
<strong class="text-zinc-300">Nota de justiça visual:</strong> os tons antes/depois aqui
são uma ilustração sobre placeholder cinza; o ajuste real é automático e calibrado contra
a arte-mestre, sem preview de número.
</p>
</aside>
</main>

View file

@ -164,15 +164,15 @@
Card “Time de você”: nomes longos cabendo no banner
</h1>
<p class="mt-3 max-w-3xl text-sm leading-6 text-zinc-400">
Militante no celular com nome composto digita o nome inteiro e o banner azul se alarga
apenas o necessário a partir da referência 509, agora até o teto de 1000 (antes 660; ≈40 px
de margem em cada lado do card), sem nunca cruzar o topo da janela da foto. Acima do teto, a
pessoa recebe a mesma mensagem de nome curto de hoje e o CTA segue desabilitado. Nenhum passo
novo, nenhuma decisão nova.
Militante no celular com nome composto digita o nome inteiro e o banner azul se alarga
apenas o necessário a partir da referência 509, agora até o teto de 1000 (antes 660; ≈40
px de margem em cada lado do card), sem nunca cruzar o topo da janela da foto. Acima do
teto, a pessoa recebe a mesma mensagem de nome curto de hoje e o CTA segue desabilitado.
Nenhum passo novo, nenhuma decisão nova.
</p>
<p class="mt-3 max-w-3xl text-xs leading-5 text-amber-300/90">
<strong>DEGRADED:</strong> este design não está certificado. É insumo para decisão humana no
gate/PR — o tier degradado nunca aprova.
<strong>DEGRADED:</strong> este design não está certificado. É insumo para decisão humana
no gate/PR — o tier degradado nunca aprova.
</p>
<div class="mt-5 flex flex-wrap gap-2 text-[11px] font-bold text-zinc-300">
<span class="rounded-full border border-zinc-700 bg-zinc-900 px-3 py-2"
@ -196,8 +196,8 @@
Cena 1 · Spec de geometria — banner dinâmico 509 → 1000
</h2>
<p class="mt-1 max-w-3xl text-xs leading-5 text-zinc-500">
Centro, y, altura e rotação do banner azul permanecem os do S15; só a largura entra. No teto
(largura 1000) o canto mais baixo fica em ≈436, ~3 px acima do topo da janela da foto
Centro, y, altura e rotação do banner azul permanecem os do S15; só a largura entra. No
teto (largura 1000) o canto mais baixo fica em ≈436, ~3 px acima do topo da janela da foto
(y=439) — encosta sem cruzar.
</p>
@ -259,10 +259,10 @@
<div class="rounded-lg border border-zinc-700 bg-zinc-900 p-3">
<dt class="font-black tracking-wide text-zinc-300 uppercase">Largura dinâmica</dt>
<dd class="mt-1 text-zinc-400">
referência <strong class="text-zinc-200">509</strong> quando o nome cabe nela (tinta
≤ <strong class="text-zinc-200">470</strong>); alarga só o necessário até o teto
<strong class="text-zinc-200">1000</strong> (≈40 px de margem de cada lado); centro
mantido em 545.
referência <strong class="text-zinc-200">509</strong> quando o nome cabe nela
(tinta ≤ <strong class="text-zinc-200">470</strong>); alarga só o necessário até o
teto <strong class="text-zinc-200">1000</strong> (≈40 px de margem de cada lado);
centro mantido em 545.
</dd>
</div>
<div class="rounded-lg border border-zinc-700 bg-zinc-900 p-3">
@ -287,8 +287,8 @@
<div
class="mt-3 rounded-lg border border-zinc-800 bg-zinc-900/60 p-3 text-xs leading-5 text-zinc-400"
>
<strong class="text-zinc-300">Banner vermelho intocado:</strong> 693×118, centro
(545, 162), −3,5°, fill #E50E2F, texto #FFEC01 — as cores do S15 seguem literais. O azul
<strong class="text-zinc-300">Banner vermelho intocado:</strong> 693×118, centro (545,
162), −3,5°, fill #E50E2F, texto #FFEC01 — as cores do S15 seguem literais. O azul
agora <strong class="text-zinc-300">pode ultrapassar</strong> o vermelho (teto 1000 >
693). Teto 1000 e cap mínimo 40: <em>decisão do humano no gate (2026-09-19)</em>.
</div>
@ -302,10 +302,10 @@
Cena 2 · Alargamento do banner — referência 509 → teto 1000 · desktop 1280
</h2>
<p class="mt-1 max-w-3xl text-xs leading-5 text-zinc-500">
ANA encosta na referência e pede só 566; MARIA, FULANO, MARIA CLARA, MARIA EDUARDA e MARIA DA
CONCEIÇÃO alargam conforme o nome, encostando no teto 1000. O cap desce até o mínimo legível
40; abaixo disso o banner não é desenhado e a mensagem pede um nome mais curto. Nunca há corte
silencioso.
ANA encosta na referência e pede só 566; MARIA, FULANO, MARIA CLARA, MARIA EDUARDA e MARIA
DA CONCEIÇÃO alargam conforme o nome, encostando no teto 1000. O cap desce até o mínimo
legível 40; abaixo disso o banner não é desenhado e a mensagem pede um nome mais curto.
Nunca há corte silencioso.
</p>
<div
@ -508,7 +508,9 @@
<div
class="relative mt-4 flex min-h-[780px] w-full max-w-[1280px] items-center justify-center overflow-hidden rounded-xl border border-zinc-700 bg-[var(--campaign-cream)] p-8 text-black shadow-2xl"
>
<div class="absolute inset-0 bg-[linear-gradient(135deg,#fff8f2,#ebe9e9)] opacity-80"></div>
<div
class="absolute inset-0 bg-[linear-gradient(135deg,#fff8f2,#ebe9e9)] opacity-80"
></div>
<div class="absolute inset-0 bg-black/45"></div>
<article
role="dialog"
@ -558,8 +560,8 @@
<p
class="mt-3 rounded-md border border-dashed border-amber-500 bg-amber-50 px-3 py-2 text-[11px] leading-5 font-bold text-amber-800"
>
Anotação do gate (não é copy de produto): o banner azul se alarga para caber o nome
composto em uma linha.
Anotação do gate (não é copy de produto): o banner azul se alarga para caber o
nome composto em uma linha.
</p>
</div>
<div
@ -576,7 +578,8 @@
</button>
</div>
<p class="mt-4 text-xs leading-5 text-[var(--campaign-muted)]">
Seu nome e sua foto são processados apenas no seu aparelho e não são enviados para nós.
Seu nome e sua foto são processados apenas no seu aparelho e não são enviados para
nós.
</p>
</div>
<footer class="flex gap-3 border-t border-[var(--campaign-line)] px-5 py-4">
@ -602,8 +605,8 @@
Cena 4 · Compositor pronto · dialog desktop 1280 — prévia com o banner alargado
</h2>
<p class="mt-1 max-w-3xl text-xs leading-5 text-zinc-500">
A prévia real confirma “TIME DE MARIA CLARA” em uma linha; Zoom, ajuste fino e “Trocar foto”
seguem como escape.
A prévia real confirma “TIME DE MARIA CLARA” em uma linha; Zoom, ajuste fino e “Trocar
foto” seguem como escape.
</p>
<div
class="relative mt-4 flex min-h-[880px] w-full max-w-[1280px] items-center justify-center overflow-hidden rounded-xl border border-zinc-700 bg-[var(--campaign-band)] p-8 text-black shadow-2xl"
@ -864,7 +867,9 @@
<p class="text-[10px] font-black tracking-[0.1em] text-[var(--pt-red)] uppercase">
Time de você
</p>
<h3 id="s16-m-ready" class="mt-1 text-lg leading-6 font-black">Confira seu card</h3>
<h3 id="s16-m-ready" class="mt-1 text-lg leading-6 font-black">
Confira seu card
</h3>
<p class="mt-1 text-sm leading-5 text-[var(--campaign-muted)]">
Arraste a foto ou use os controles.
</p>
@ -986,8 +991,8 @@
</h2>
<p class="mt-1 max-w-3xl text-xs leading-5 text-zinc-500">
BARTOLOMEUCOSTAJUNIOR (cap 39) e ANTICONSTITUCIONALISSIMAMENTE (cap 30) seguem como
<code>too-long</code>: ficam abaixo do cap mínimo 40, o banner não é desenhado, a mensagem é
a mesma de hoje e o CTA fica desabilitado. Nada de corte silencioso.
<code>too-long</code>: ficam abaixo do cap mínimo 40, o banner não é desenhado, a mensagem
é a mesma de hoje e o CTA fica desabilitado. Nada de corte silencioso.
</p>
<div
class="relative mt-4 flex min-h-[820px] w-full max-w-[1280px] items-center justify-center overflow-hidden rounded-xl border border-zinc-700 bg-[var(--campaign-band)] p-8 text-black shadow-2xl"
@ -1051,8 +1056,8 @@
chamado.
</p>
<p class="mt-4 text-xs leading-5 text-[var(--campaign-muted)]">
A foto escolhida e o recorte permanecem salvos neste aparelho enquanto você corrige o
nome.
A foto escolhida e o recorte permanecem salvos neste aparelho enquanto você corrige
o nome.
</p>
</div>
<footer class="flex gap-3 border-t border-[var(--campaign-line)] px-5 py-4">
@ -1078,8 +1083,8 @@
Cena 7 · Nomes que devem caber (aceite, medidos com a fonte real)
</h2>
<p class="mt-1 max-w-3xl text-xs leading-5 text-zinc-500">
Com o teto 1000 (tinta máxima 961) e o cap mínimo 40, os nomes longos cabem em uma linha, sem
corte. MARIA DA CONCEIÇÃO passou a caber; só os absurdos abaixo do cap mínimo seguem
Com o teto 1000 (tinta máxima 961) e o cap mínimo 40, os nomes longos cabem em uma linha,
sem corte. MARIA DA CONCEIÇÃO passou a caber; só os absurdos abaixo do cap mínimo seguem
<code>too-long</code>.
</p>
<div class="mt-4 overflow-hidden rounded-xl border border-zinc-700">
@ -1145,10 +1150,10 @@
</table>
</div>
<p class="mt-2 text-[11px] leading-4 text-zinc-500">
Caps e larguras medidos com Brexter 700 (cap ratio 0,72) sobre a arte oficial do S15. Outros
nomes do aceite no plano: ANA BEATRIZ 78, JOSÉ CARLOS 78, PEDRO HENRIQUE 62, JOÃO VITOR 89,
GUILHERME 94, FERNANDA 98. A medição fina é do plano/implementação — este artefato mostra a
intenção visual.
Caps e larguras medidos com Brexter 700 (cap ratio 0,72) sobre a arte oficial do S15.
Outros nomes do aceite no plano: ANA BEATRIZ 78, JOSÉ CARLOS 78, PEDRO HENRIQUE 62, JOÃO
VITOR 89, GUILHERME 94, FERNANDA 98. A medição fina é do plano/implementação — este
artefato mostra a intenção visual.
</p>
</section>
@ -1160,28 +1165,28 @@
</p>
<p>
<strong class="text-zinc-300">Decisões portadas do S15:</strong> banner vermelho intocado
(693×118, centro 545/162, −3,5°, #E50E2F, texto #FFEC01); banner azul com centro 545, y 313,
altura 176, rotação −4,1°, fill #0061A5, texto #FFFFFF, uma linha, sem quebra; largura
dinâmica referência 509 → teto 1000 (tinta máxima 961); janela da foto x=286 y=439 w=592
h=577.
(693×118, centro 545/162, −3,5°, #E50E2F, texto #FFEC01); banner azul com centro 545, y
313, altura 176, rotação −4,1°, fill #0061A5, texto #FFFFFF, uma linha, sem quebra;
largura dinâmica referência 509 → teto 1000 (tinta máxima 961); janela da foto x=286 y=439
w=592 h=577.
</p>
<p class="mt-2">
<strong class="text-zinc-300">Decisão do humano no gate (2026-09-19):</strong> o banner azul
pode ultrapassar o vermelho e ir até quase a largura toda do card → teto 1000; cap mínimo
legível 40. A confirmar na implementação: margem real (≈45 px) vs ≈40 px informado; largura
dinâmica vs fixa; texto da mensagem inalterado.
<strong class="text-zinc-300">Decisão do humano no gate (2026-09-19):</strong> o banner
azul pode ultrapassar o vermelho e ir até quase a largura toda do card → teto 1000; cap
mínimo legível 40. A confirmar na implementação: margem real (≈45 px) vs ≈40 px informado;
largura dinâmica vs fixa; texto da mensagem inalterado.
</p>
<p class="mt-2">
<strong class="text-zinc-300">NEEDS ASSET:</strong> foto real do visitante para substituir a
silhueta SVG placeholder usada nas prévias; a arte oficial
<strong class="text-zinc-300">NEEDS ASSET:</strong> foto real do visitante para substituir
a silhueta SVG placeholder usada nas prévias; a arte oficial
(<code>team-card-base.png</code>, <code>team-card-front.png</code>) já existe e é usada
direto.
</p>
<p class="mt-2">
<strong class="text-zinc-300">Fora de escopo deste design:</strong> duas linhas no banner,
encolher a fonte abaixo de 40, cortar/elidir o nome, proibir o banner azul de ultrapassar o
vermelho (agora é permitido), regenerar <code>team-card-example.jpg</code>, mexer no modelo de
nome (S13) e nos outros 3 modelos.
encolher a fonte abaixo de 40, cortar/elidir o nome, proibir o banner azul de ultrapassar
o vermelho (agora é permitido), regenerar <code>team-card-example.jpg</code>, mexer no
modelo de nome (S13) e nos outros 3 modelos.
</p>
</aside>
</main>