teqo-backup/docs/plans/cards-time-ajuste-sem-limite-ui-design.html
Francisco Solla d0823043ed
Some checks are pending
Deploy / preflight (push) Waiting to run
Deploy / verify (push) Blocked by required conditions
Deploy / deploy staging (teqo-staging) (push) Blocked by required conditions
Deploy / requeue when main advanced (push) Blocked by required conditions
Deploy / deploy production (teqo-1313) (push) Blocked by required conditions
style(S33,S34,S35): formata os designs hi-fi dos planos
2026-09-24 00:29:27 -03:00

536 lines
22 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="pt-BR" data-theme="campaign-site">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
<title>Design S33 · Ajuste da foto livre, sem limite</title>
<style type="text/tailwindcss">
:root {
--background: #fff;
--foreground: #000;
--pt-red: #a21c1c;
--campaign-cream: #fff8f2;
--campaign-ink: #000;
--campaign-muted: #6c615e;
--campaign-surface: #f9faff;
--campaign-band: #ebe9e9;
--campaign-line: rgb(0 0 0 / 12%);
--team-blue: #0061a5;
--gate: #0f766e;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: Arial, Helvetica, sans-serif;
}
button,
input {
font: inherit;
}
button:focus-visible,
input:focus-visible,
[tabindex]:focus-visible {
outline: 2px solid var(--pt-red);
outline-offset: 2px;
}
.stage-shadow {
box-shadow: 0 26px 80px rgb(0 0 0 / 32%);
}
.team-card {
position: relative;
aspect-ratio: 3 / 4;
overflow: hidden;
background: #0b8fc3;
}
.team-card > img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
.team-photo {
z-index: 1;
}
.team-overlay {
z-index: 4;
}
.silhouette {
position: absolute;
z-index: 2;
top: var(--y, 29%);
left: var(--x, 54%);
width: 36%;
height: 45%;
transform: translate(-50%, -10%);
color: #061d40;
filter: drop-shadow(0 2px 2px rgb(0 0 0 / 18%));
}
.silhouette::before {
content: '';
position: absolute;
top: 0;
left: 50%;
width: 36%;
aspect-ratio: 0.82;
transform: translateX(-50%);
border-radius: 48% 48% 45% 45%;
background: currentColor;
}
.silhouette::after {
content: '';
position: absolute;
right: 0;
bottom: 0;
left: 0;
height: 77%;
border-radius: 49% 49% 8% 8% / 30% 30% 6% 6%;
background: currentColor;
}
.drag-badge {
position: absolute;
right: 8px;
bottom: 8px;
z-index: 8;
border-radius: 4px;
background: rgb(0 0 0 / 72%);
padding: 4px 7px;
color: #fff;
font-size: 9px;
font-weight: 700;
}
.gate-vector {
position: absolute;
z-index: 9;
border-top: 2px dashed rgb(15 118 110 / 90%);
transform-origin: left center;
pointer-events: none;
}
.gate-vector::after {
content: '';
position: absolute;
top: -5px;
right: -1px;
width: 8px;
height: 8px;
border-top: 2px solid var(--gate);
border-right: 2px solid var(--gate);
transform: rotate(45deg);
}
.control-button {
display: inline-flex;
width: 44px;
height: 44px;
flex: none;
align-items: center;
justify-content: center;
border: 1px solid var(--campaign-line);
border-radius: 8px;
background: #fff;
color: var(--campaign-ink);
font-size: 17px;
}
.range {
appearance: none;
height: 4px;
min-width: 0;
border-radius: 999px;
background: linear-gradient(90deg, var(--pt-red) 0 46%, #d6d3d1 46% 100%);
}
.range::-webkit-slider-thumb {
appearance: none;
width: 20px;
height: 20px;
border: 3px solid #fff;
border-radius: 999px;
background: var(--pt-red);
box-shadow: 0 0 0 1px rgb(0 0 0 / 18%);
}
.primary,
.secondary {
display: inline-flex;
min-height: 44px;
flex: 1;
align-items: center;
justify-content: center;
border-radius: 8px;
padding: 0 20px;
font-size: 14px;
font-weight: 800;
}
.primary {
border: 0;
background: var(--pt-red);
color: #fff;
}
.secondary {
border: 2px solid var(--campaign-line);
background: #fff;
color: var(--pt-red);
}
.switch {
position: relative;
width: 44px;
height: 26px;
flex: none;
border-radius: 999px;
background: var(--pt-red);
}
.switch::after {
content: '';
position: absolute;
top: 3px;
left: 21px;
width: 20px;
height: 20px;
border-radius: 999px;
background: #fff;
box-shadow: 0 1px 2px rgb(0 0 0 / 25%);
}
</style>
</head>
<body class="bg-zinc-950 text-zinc-100 antialiased">
<div
class="border-b border-emerald-400/40 bg-emerald-400/10 px-4 py-2 text-center text-[11px] font-black tracking-[.14em] text-emerald-300 uppercase"
>
Design tier: openai/gpt-5.6-sol · frontier · gate humano obrigatório
</div>
<main class="mx-auto max-w-[1440px] px-4 py-10 sm:px-6 lg:px-10">
<header class="max-w-4xl">
<p class="text-xs font-black tracking-[.12em] text-red-400 uppercase">
Gate visual · S33 · decisão revisada em 24/09/2026
</p>
<h1 class="mt-2 text-3xl font-black tracking-tight">
A foto vai a qualquer ponto — inclusive para fora
</h1>
<p class="mt-3 max-w-3xl text-sm leading-6 text-zinc-400">
O enquadramento automático S15 continua sendo o ponto de partida. Depois dele, arrastar,
setas e teclado deixam a posição livre nos dois eixos. A pessoa pode esconder parte ou
toda a própria foto e revelar a arte do time ao fundo; para voltar, arrasta de volta na
mesma área ativa.
</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"
>1280px · dialog</span
>
<span class="rounded-full border border-zinc-700 bg-zinc-900 px-3 py-2"
>390px · drawer</span
>
<span
class="rounded-full border border-emerald-700 bg-emerald-950 px-3 py-2 text-emerald-200"
>X + Y: sem limite</span
>
<span class="rounded-full border border-zinc-700 bg-zinc-900 px-3 py-2"
>Zoom [1,4] · inalterado</span
>
</div>
</header>
<section class="mt-14">
<p class="text-[11px] font-black tracking-[.12em] text-sky-300 uppercase">
Cena 01 · desktop 1280 × 800
</p>
<h2 class="mt-1 text-xl font-black">Dialog de ajuste · do limite atual à posição livre</h2>
<p class="mt-1 max-w-4xl text-xs leading-5 text-zinc-500">
Setas tracejadas, rótulos e silhueta são anotações do gate. O compositor não ganha
controles nem copy.
</p>
<div
class="stage-shadow relative mx-auto mt-5 h-[800px] w-[1280px] max-w-full overflow-hidden rounded-2xl bg-[var(--campaign-cream)] text-black"
>
<div class="absolute inset-0 bg-black/58"></div>
<article
role="dialog"
aria-label="Time do estadual"
class="absolute top-1/2 left-1/2 flex max-h-[744px] w-[760px] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-xl bg-white shadow-2xl"
>
<header class="flex shrink-0 items-start gap-3 px-5 pt-5">
<div class="min-w-0 flex-1">
<p class="text-xs font-black tracking-[.1em] text-[var(--pt-red)] uppercase">
Time do estadual
</p>
<h3 class="mt-1 text-xl font-black">Confira seu card</h3>
</div>
<button
aria-label="Fechar"
class="inline-flex size-11 items-center justify-center rounded-lg text-2xl text-[var(--campaign-muted)]"
>
×
</button>
</header>
<div class="min-h-0 flex-1 overflow-y-auto px-5 pt-4 pb-5">
<p class="mx-auto mb-4 max-w-[620px] text-sm leading-5 text-[var(--campaign-muted)]">
O recorte já foi centralizado. Se precisar, arraste a foto ou use os controles.
</p>
<div class="grid grid-cols-2 gap-5">
<figure class="m-0 rounded-xl bg-stone-50 p-3 ring-1 ring-black/10">
<div class="flex items-center justify-between gap-2">
<figcaption
class="text-[11px] font-black tracking-wide text-stone-600 uppercase"
>
Hoje · gesto para cedo
</figcaption>
<span
class="rounded-full bg-stone-200 px-2 py-1 text-[10px] font-black text-stone-600"
>±33px típico</span
>
</div>
<div
class="relative mx-auto mt-3 w-[210px] overflow-hidden rounded-lg border border-black/10 shadow-sm"
tabindex="0"
>
<div class="team-card">
<img
class="team-photo"
src="../../public/cards/estaduais/julio-fotos.webp"
alt="Arte do time de Julio Pinheiro"
/><span class="silhouette" style="--x: 57%; --y: 29%"></span
><img
class="team-overlay"
src="../../public/cards/estaduais/julio-base.webp"
alt="Faixas da arte de Julio Pinheiro"
/>
</div>
<span class="drag-badge">Arraste para ajustar</span>
</div>
<p class="mt-2 text-center text-[11px] leading-4 text-stone-600">
O arquivo transparente trava enquanto a pessoa ainda aparece perto do centro.
</p>
</figure>
<figure class="m-0 rounded-xl bg-teal-50 p-3 ring-2 ring-teal-700">
<div class="flex items-center justify-between gap-2">
<figcaption
class="text-[11px] font-black tracking-wide text-teal-900 uppercase"
>
Novo · além do quadro
</figcaption>
<span
class="rounded-full bg-teal-700 px-2 py-1 text-[10px] font-black text-white"
>X + Y livres</span
>
</div>
<div
class="relative mx-auto mt-3 w-[210px] overflow-hidden rounded-lg border border-teal-700/30 shadow-sm"
tabindex="0"
>
<div class="team-card">
<img
class="team-photo"
src="../../public/cards/estaduais/julio-fotos.webp"
alt="Arte do time revelada ao fundo"
/><span class="silhouette" style="--x: 110%; --y: -16%"></span
><img
class="team-overlay"
src="../../public/cards/estaduais/julio-base.webp"
alt="Faixas da arte de Julio Pinheiro"
/><span
class="gate-vector top-[31%] left-[49%] w-[48%] -rotate-[36deg]"
></span>
</div>
<span class="drag-badge">Arraste para ajustar</span>
</div>
<p class="mt-2 text-center text-[11px] leading-4 text-teal-900/75">
A pessoa já saiu quase toda pelo alto e pela direita. A arte de trás reaparece.
</p>
</figure>
</div>
<div class="mx-auto mt-5 max-w-[620px]">
<div class="flex items-center gap-3">
<label class="text-sm font-bold">Zoom</label
><button class="control-button" aria-label="Diminuir zoom">−</button
><input
class="range h-11 flex-1"
type="range"
value="46"
aria-label="Zoom"
/><button class="control-button" aria-label="Aumentar zoom">+</button>
</div>
<p class="mt-4 text-sm font-bold">Ajuste fino</p>
<div class="mt-2 grid grid-cols-4 gap-2">
<button class="control-button w-full" aria-label="Mover foto para a esquerda">
←</button
><button class="control-button w-full" aria-label="Mover foto para cima">↑</button
><button class="control-button w-full" aria-label="Mover foto para baixo">
↓</button
><button class="control-button w-full" aria-label="Mover foto para a direita">
→
</button>
</div>
</div>
</div>
<footer class="flex shrink-0 gap-3 border-t border-[var(--campaign-line)] px-5 py-4">
<button class="secondary">Cancelar</button
><button class="primary">Criar meu card</button>
</footer>
</article>
</div>
</section>
<section class="mt-14">
<p class="text-[11px] font-black tracking-[.12em] text-emerald-300 uppercase">
Cena 02 · mobile 390 × 844
</p>
<h2 class="mt-1 text-xl font-black">Drawer · foto totalmente fora, área ainda ativa</h2>
<p class="mt-1 max-w-3xl text-xs leading-5 text-zinc-500">
A prévia mostra a escolha extrema permitida: só a arte do time fica visível. O quadro
inteiro continua sendo a área de arrasto para trazer a foto de volta.
</p>
<div class="mt-5 grid items-start gap-6 lg:grid-cols-[390px_1fr]">
<div
class="stage-shadow relative mx-auto h-[844px] w-[390px] max-w-full overflow-hidden rounded-[24px] bg-[var(--campaign-cream)] text-black lg:mx-0"
>
<div class="absolute inset-0 bg-black/50"></div>
<article
role="dialog"
class="absolute inset-0 flex flex-col overflow-hidden rounded-t-xl bg-white"
>
<div class="flex h-3 shrink-0 items-end justify-center">
<span class="h-1 w-24 rounded-full bg-[var(--campaign-band)]"></span>
</div>
<header class="flex shrink-0 items-start gap-3 px-5 pt-5">
<div class="min-w-0 flex-1">
<p class="text-[10px] font-black tracking-[.1em] text-[var(--pt-red)] uppercase">
Time do estadual
</p>
<h3 class="mt-1 text-lg font-black">Confira seu card</h3>
</div>
<button
aria-label="Fechar"
class="inline-flex size-11 items-center justify-center text-2xl text-[var(--campaign-muted)]"
>
×
</button>
</header>
<div class="min-h-0 flex-1 overflow-hidden px-5 pt-3 pb-4">
<p class="mb-3 text-sm leading-5 text-[var(--campaign-muted)]">
O recorte já foi centralizado. Se precisar, arraste a foto ou use os controles.
</p>
<figure class="m-0">
<div
class="relative mx-auto w-[184px] overflow-hidden rounded-lg border-2 border-teal-700 shadow-sm"
tabindex="0"
aria-label="Ajuste da foto"
>
<div class="team-card">
<img
class="team-photo"
src="../../public/cards/estaduais/julio-fotos.webp"
alt="Arte do time visível porque a foto do visitante está fora do quadro"
/><span class="silhouette" style="--x: -75%; --y: 118%"></span
><img
class="team-overlay"
src="../../public/cards/estaduais/julio-base.webp"
alt="Faixas da arte de Julio Pinheiro"
/>
</div>
<span class="drag-badge">Arraste para ajustar</span>
</div>
<figcaption
class="mt-1.5 text-center text-[9px] font-black text-teal-800 uppercase"
>
Foto fora do quadro · arrasto segue ativo
</figcaption>
</figure>
<div class="mt-4 flex items-center gap-3">
<label class="text-sm font-bold">Zoom</label
><button class="control-button">−</button
><input
class="range h-11 flex-1"
type="range"
value="46"
aria-label="Zoom"
/><button class="control-button">+</button>
</div>
<p class="mt-3 text-sm font-bold">Ajuste fino</p>
<div class="mt-2 grid grid-cols-4 gap-2">
<button class="control-button w-full">←</button
><button class="control-button w-full">↑</button
><button class="control-button w-full">↓</button
><button class="control-button w-full">→</button>
</div>
<button
role="switch"
aria-checked="true"
class="mt-3 flex min-h-11 w-full items-start gap-3 rounded-lg border border-[var(--campaign-line)] bg-white p-3 text-left"
>
<span class="switch mt-1.5"></span
><span
><span class="block text-sm font-bold">Harmonizar cores</span
><span class="block text-xs leading-5 text-[var(--campaign-muted)]"
>Ajusta o brilho e as cores da sua foto para combinar com as fotos do
card.</span
></span
>
</button>
<button class="secondary mt-3 w-full">Trocar foto</button>
</div>
<footer class="flex shrink-0 gap-3 border-t border-[var(--campaign-line)] px-5 py-4">
<button class="secondary">Cancelar</button
><button class="primary">Criar meu card</button>
</footer>
</article>
</div>
<aside class="rounded-2xl border border-emerald-400/30 bg-emerald-400/10 p-5">
<p class="text-[11px] font-black tracking-[.12em] text-emerald-300 uppercase">
Leitura do gesto
</p>
<ul class="mt-3 space-y-3 text-sm leading-6 text-zinc-300">
<li><strong class="text-white">Hoje:</strong> o gesto para cedo (±33px típico).</li>
<li>
<strong class="text-white">Novo:</strong> sem limite — posição livre nos dois eixos,
inclusive fora do quadro.
</li>
<li>
<strong class="text-white">Voltar:</strong> arrastar na prévia, que continua ativa
mesmo sem a pessoa visível.
</li>
<li>
<strong class="text-white">Ponto de partida:</strong> enquadramento automático S15,
aplicado como hoje.
</li>
</ul>
</aside>
</div>
</section>
<section class="mt-14 rounded-2xl border border-zinc-800 bg-zinc-900 p-6">
<p class="text-[11px] font-black tracking-[.12em] text-amber-300 uppercase">
Anotação do gate · não portar para a tela
</p>
<h2 class="mt-1 text-xl font-black">O que muda — e o que não muda</h2>
<div class="mt-5 grid gap-4 md:grid-cols-2">
<article class="rounded-xl border border-emerald-700 bg-emerald-950/40 p-5">
<p class="text-xs font-black tracking-wide text-emerald-300 uppercase">Posição</p>
<p class="mt-2 text-sm leading-6 text-zinc-200">
Sem clamp em X ou Y. Pode passar da janela, ficar parcialmente fora ou desaparecer por
completo do quadro.
</p>
</article>
<article class="rounded-xl border border-zinc-700 bg-zinc-950/50 p-5">
<p class="text-xs font-black tracking-wide text-zinc-300 uppercase">Todo o resto</p>
<p class="mt-2 text-sm leading-6 text-zinc-300">
S15 como início; zoom na faixa [1,4]; mesmos controles, copy e área de arrasto;
nenhuma telemetria.
</p>
</article>
</div>
</section>
<aside class="mt-14 border-t border-zinc-800 pt-8 text-xs leading-5 text-zinc-500">
<p>
<strong class="text-zinc-300">Ativos:</strong> arte real de JULIO em
<code>../../public/cards/estaduais/julio-fotos.webp</code> + <code>julio-base.webp</code>.
A silhueta abstrata representa o recorte do visitante.
</p>
<p class="mt-2"><strong class="text-zinc-300">NEEDS ASSET:</strong> nenhum.</p>
<p class="mt-2">
<strong class="text-zinc-300">Sem novidade de interface:</strong> anotações verdes existem
só neste gate; não há controle, copy ou telemetria novos.
</p>
</aside>
</main>
</body>
</html>