teqo/src/app/(frontend)/styles.css
Francisco Solla 398a91e54a feat(S9): captura de novidades da campanha na home pública (form + CTA do hero)
Seção 'Receba as novidades da campanha' acima do rodapé: nome + WhatsApp
obrigatórios, e-mail/estado/cidade/comentário opcionais, toggle pré-selecionado
'Quero fazer parte do time' gravado como subscription.campaignLevel
(time|esporadico). CTA secundário do hero vira o atalho (#novidades, scroll
suave). Contact + Subscription em withPayloadTransaction com consentimento
novo fail-closed por chave estável 'campanha-novidades' — nada é gravado sem o
texto aprovado no admin. Migration 20260819_192605 (state de contact nullable
+ coluna campaign_level). Impl plan, changelog, int + e2e.
2026-08-20 02:19:58 +00:00

1146 lines
33 KiB
CSS
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.

@import 'tailwindcss';
@plugin 'tailwindcss-animate';
@import 'tw-animate-css';
@import 'shadcn/tailwind.css';
@custom-variant dark (&:is(.dark *));
@source "../../**/*.{js,ts,jsx,tsx,mdx}";
@theme {
--breakpoint-2xs: 23.75rem;
--breakpoint-xs: 26.25rem;
}
* {
box-sizing: border-box;
}
html {
-webkit-font-smoothing: antialiased;
color-scheme: light;
}
html,
body,
#app {
height: 100%;
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--font-sans: var(--font-sans);
--font-mono: var(--font-geist-mono);
--color-sidebar-ring: var(--sidebar-ring);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar: var(--sidebar);
--color-chart-5: var(--chart-5);
--color-chart-4: var(--chart-4);
--color-chart-3: var(--chart-3);
--color-chart-2: var(--chart-2);
--color-chart-1: var(--chart-1);
--color-ring: var(--ring);
--color-input: var(--input);
--color-border: var(--border);
--color-destructive: var(--destructive);
--color-accent-foreground: var(--accent-foreground);
--color-accent: var(--accent);
--color-muted-foreground: var(--muted-foreground);
--color-muted: var(--muted);
--color-secondary-foreground: var(--secondary-foreground);
--color-secondary: var(--secondary);
--color-primary-foreground: var(--primary-foreground);
--color-primary: var(--primary);
--color-popover-foreground: var(--popover-foreground);
--color-popover: var(--popover);
--color-card-foreground: var(--card-foreground);
--color-card: var(--card);
--color-scope-border: var(--scope-border);
--color-scope-foreground: var(--scope-foreground);
--color-scope: var(--scope);
--color-tse-foreground: var(--tse-foreground);
--color-tse: var(--tse);
--color-support-engaged-foreground: var(--support-engaged-foreground);
--color-support-engaged: var(--support-engaged);
--color-support-to-approach-foreground: var(--support-to-approach-foreground);
--color-support-to-approach: var(--support-to-approach);
--color-support-disputed-foreground: var(--support-disputed-foreground);
--color-support-disputed: var(--support-disputed);
--color-support-remembered-foreground: var(--support-remembered-foreground);
--color-support-remembered: var(--support-remembered);
--color-support-negative-foreground: var(--support-negative-foreground);
--color-support-negative: var(--support-negative);
--color-estimate-confirmed-foreground: var(--estimate-confirmed-foreground);
--color-estimate-confirmed: var(--estimate-confirmed);
--color-estimate-pending-foreground: var(--estimate-pending-foreground);
--color-estimate-pending: var(--estimate-pending);
--color-cadence-overdue: var(--cadence-overdue);
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--radius-2xl: calc(var(--radius) + 8px);
--radius-3xl: calc(var(--radius) + 12px);
--radius-4xl: calc(var(--radius) + 16px);
}
:root {
--card: oklch(0.25 0.025 171);
--card-foreground: oklch(0.98 0.004 197.1);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.18 0.01 223.9);
--primary: oklch(0.9 0.14 143);
--primary-foreground: oklch(0.2 0.015 171);
--secondary: oklch(0.31 0.02 171);
--secondary-foreground: oklch(0.98 0.004 197.1);
--muted: oklch(0.29 0.02 171);
--muted-foreground: oklch(0.9 0.01 197.1);
--accent: oklch(0.34 0.025 171);
--accent-foreground: oklch(0.98 0.004 197.1);
--destructive: oklch(0.577 0.245 27.325);
--border: oklch(0.7 0.015 197.1 / 20%);
--input: oklch(0.7 0.015 197.1 / 20%);
--ring: oklch(0.9 0.14 143);
--chart-1: oklch(0.81 0.117 11.638);
--chart-2: oklch(0.645 0.246 16.439);
--chart-3: oklch(0.586 0.253 17.585);
--chart-4: oklch(0.514 0.222 16.935);
--chart-5: oklch(0.455 0.188 13.697);
--radius: 0.875rem;
--sidebar: oklch(0.25 0.025 171);
--sidebar-foreground: oklch(0.98 0.004 197.1);
--sidebar-primary: oklch(0.9 0.14 143);
--sidebar-primary-foreground: oklch(0.2 0.015 171);
--sidebar-accent: oklch(0.31 0.02 171);
--sidebar-accent-foreground: oklch(0.98 0.004 197.1);
--sidebar-border: oklch(0.7 0.015 197.1 / 20%);
--sidebar-ring: oklch(0.9 0.14 143);
--background: #ae1603;
--foreground: oklch(0.98 0.004 197.1);
--field-background: #ffffff;
--field-foreground: #000000;
--field-placeholder: rgb(0 0 0 / 80%);
--field-border: rgb(255 255 255 / 80%);
--field-disabled-background: rgb(255 255 255 / 70%);
--field-disabled-foreground: rgb(0 0 0 / 70%);
--field-icon: rgb(0 0 0 / 60%);
/* Brand header bar. Defined on :root so it is inherited by every theme
(including "editorial") and stays the same red regardless of palette. */
--site-header: #ae1603;
--site-header-foreground: #fff8f2;
--site-header-muted: rgb(255 248 242 / 72%);
--site-header-border: rgb(255 255 255 / 18%);
}
/* Light, neutral editorial palette for the public Posts pages (listings +
article). Mirrors the shadcn token contract with a brand-red primary. */
[data-theme='editorial'] {
--background: #f6f4f3;
--foreground: #201b1a;
--card: #ffffff;
--card-foreground: #201b1a;
--popover: #ffffff;
--popover-foreground: #201b1a;
--primary: #c51414;
--primary-foreground: #ffffff;
--secondary: #efe9e7;
--secondary-foreground: #4a3f3d;
--muted: #efe9e7;
--muted-foreground: #6c615e;
--accent: #f3edeb;
--accent-foreground: #201b1a;
--destructive: #b42318;
--border: rgb(32 27 26 / 12%);
--input: rgb(32 27 26 / 16%);
--ring: #c51414;
}
/* Paleta da página de campanha 2026 (home pública jorgesolla1313).
Extraída da geometria do rascunho Penpot (15/08/2026): vermelho #a21c1c,
amarelo #ffe607, problema #47130e, bandeiras #ebe9e9, cards #f9faff.
Aplicado via data-theme="campaign-site" no layout da home. */
[data-theme='campaign-site'] {
--background: #ffffff;
--foreground: #000000;
--pt-red: #a21c1c;
--pt-red-dark: #47130e;
--pt-yellow: #ffe607;
--pt-yellow-ink: #000000;
--campaign-cream: #fff8f2;
--campaign-ink: #000000;
--campaign-muted: #6c615e;
--campaign-surface: #f9faff;
--campaign-band: #ebe9e9;
--campaign-line: rgb(0 0 0 / 12%);
--campaign-content-inset: clamp(20px, calc(25.36vw - 79.64px), 180px);
/* S9 — the "novidades" capture form sits on the light band, so the field
border must be visible against it (the :root default is a white border
for the dark WhatsApp page). */
--field-border: rgb(0 0 0 / 18%);
}
/* Campaign home geometry is interpolated between the approved Penpot boards.
Copy stays in normal flow so browser text-spacing preferences can expand the
hero; only the photographic composition is positioned absolutely. */
.campaign-hero {
--campaign-hero-height: max(
clamp(745px, calc(933.42px - 47.95vw), 780px),
clamp(745px, calc(41.6vw + 581.51px), 901px)
);
min-height: var(--campaign-hero-height);
height: auto;
}
.campaign-hero-stage {
max-width: 1920px;
min-height: var(--campaign-hero-height);
height: auto;
}
/* Penpot uses the wide official lockup on phones/tablets. Its PNG canvas is
square and mostly transparent, so the element follows the board geometry. */
.campaign-home-logo {
--campaign-logo-size: clamp(356px, calc(38.93vw + 203px), 502px);
top: clamp(-166px, calc(-11.47vw - 77.92px), -123px);
left: clamp(0px, calc(33.6vw - 113.05px), 145px);
width: var(--campaign-logo-size);
height: var(--campaign-logo-size);
background-image: url('/Prancheta%206%403x.png');
background-repeat: no-repeat;
background-position: center;
background-size: contain;
}
.campaign-hero-portrait {
top: clamp(53px, calc(9.33vw + 16.32px), 88px);
left: calc(50% - 211px + clamp(8.5px, calc(3.07vw - 3.55px), 20px));
width: 422px;
height: auto;
aspect-ratio: 422 / 469;
}
.campaign-hero-portrait-image {
top: -3.63%;
left: 0.24%;
width: 106.4%;
}
.campaign-hero-ally {
z-index: 0;
width: 177px;
height: auto;
}
.campaign-hero-ally--rui {
top: clamp(144px, calc(9.33vw + 107.32px), 179px);
left: calc(50% - 218.5px + clamp(0px, calc(3.07vw - 12.05px), 11.5px));
}
.campaign-hero-ally--wagner {
top: clamp(148px, calc(9.33vw + 111.32px), 183px);
left: calc(50% - 265.5px + clamp(0px, calc(3.07vw - 12.05px), 11.5px));
}
.campaign-hero-ally--jeronimo {
top: clamp(140px, calc(9.33vw + 103.32px), 175px);
left: calc(50% + 27.5px + clamp(0px, calc(3.07vw - 12.05px), 11.5px));
}
.campaign-hero-ally--lula {
top: clamp(179px, calc(9.33vw + 142.32px), 214px);
left: calc(50% + 65.5px + clamp(0px, calc(3.07vw - 12.05px), 11.5px));
z-index: 2;
width: 216px;
}
.campaign-hero-overlay {
top: clamp(300px, calc(9.33vw + 263.32px), 335px);
left: 50%;
width: 100vw;
height: 245px;
transform: translateX(-50%);
}
.campaign-hero-content {
min-height: var(--campaign-hero-height);
padding-top: clamp(462px, calc(9.33vw + 425.32px), 497px);
padding-bottom: clamp(14px, calc(28.34px - 1.87vw), 21px);
}
.campaign-hero-title {
width: min(100%, clamp(392px, calc(38.67vw + 240.04px), 537px));
margin-right: auto;
margin-left: auto;
text-align: center;
font-size: clamp(32px, calc(4.27vw + 15.23px), 48px);
}
.campaign-hero-copy {
width: min(calc(100% - 40px), clamp(327px, calc(24.8vw + 229.54px), 420px));
margin-top: clamp(13px, calc(4.59vw - 4.73px), 30.5px);
margin-left: clamp(20px, calc(31.2vw - 98.62px), 141px);
font-size: clamp(14px, calc(1.07vw + 9.81px), 18px);
}
.campaign-hero-actions {
width: max-content;
margin-top: clamp(16px, calc(6.85vw - 5.92px), 31px);
margin-right: clamp(18px, calc(52.27vw - 187.43px), 214px);
margin-left: auto;
gap: clamp(10px, calc(3.73vw - 4.67px), 24px);
}
.campaign-hero-action {
min-height: clamp(44px, calc(4.27vw + 27.23px), 60px);
height: auto;
font-size: clamp(17px, calc(0.27vw + 15.95px), 18px);
}
.campaign-hero-action--secondary {
width: clamp(145px, calc(3.47vw + 131.38px), 158px);
}
.campaign-hero-action--primary {
width: clamp(112px, calc(12.27vw + 63.79px), 158px);
}
.campaign-hero-action-detail,
.campaign-hero-action-long {
display: none;
}
.campaign-hero-accolades {
width: max-content;
margin-top: clamp(16px, calc(6.13vw - 8.09px), 39px);
margin-right: clamp(18px, calc(5.07vw - 1.91px), 37px);
margin-left: auto;
align-items: flex-end;
gap: 2px;
text-align: right;
font-size: clamp(10px, calc(0.53vw + 7.9px), 12px);
line-height: 1.2;
}
.campaign-hero-accolade-secondary {
display: none;
}
.campaign-proof {
height: clamp(88px, calc(9.33vw + 51.32px), 123px);
}
.campaign-proof-list {
grid-template-columns: repeat(3, minmax(0, 1fr));
align-items: center;
gap: 23px;
}
.campaign-proof-value {
font-size: clamp(24px, calc(3.2vw + 11.42px), 36px);
}
.campaign-proof-label {
font-size: clamp(10px, calc(2.13vw + 1.62px), 18px);
line-height: 1.15;
}
.campaign-problem {
height: clamp(659px, calc(774.22px - 11.25vw), 730px);
}
.campaign-flags {
height: clamp(368px, calc(419.93px - 5.08vw), 400px);
}
.campaign-section-eyebrow,
.campaign-section-title,
.campaign-section-copy {
left: var(--campaign-content-inset);
}
.campaign-section-eyebrow {
font-size: clamp(10px, calc(0.32vw + 8.75px), 12px);
line-height: 1.25;
}
.campaign-section-title {
font-size: clamp(22px, calc(0.32vw + 20.75px), 24px);
line-height: 1.07;
}
.campaign-section-copy {
font-size: clamp(14px, calc(0.32vw + 12.75px), 16px);
}
.campaign-problem-eyebrow {
top: 35px;
}
.campaign-problem-title {
top: clamp(59px, calc(1.11vw + 54.64px), 66px);
width: min(
calc(100% - var(--campaign-content-inset) - var(--campaign-content-inset)),
clamp(331px, calc(45.17vw + 153.49px), 616px)
);
}
.campaign-problem-copy {
top: clamp(127px, calc(157.83px - 3.01vw), 146px);
width: min(
calc(100% - var(--campaign-content-inset) - 20px),
clamp(327px, calc(61.65vw + 84.72px), 716px)
);
}
.campaign-problem-carousel {
top: clamp(191px, calc(278.63px - 8.56vw), 245px);
}
.campaign-flags-eyebrow {
top: clamp(33px, calc(39.49px - 0.63vw), 37px);
}
.campaign-flags-title {
top: clamp(62px, calc(68.49px - 0.63vw), 66px);
width: min(
calc(100% - var(--campaign-content-inset) - var(--campaign-content-inset)),
clamp(331px, calc(52.77vw + 123.6px), 664px)
);
}
.campaign-flags-copy {
top: clamp(130px, calc(160.83px - 3.01vw), 149px);
width: min(
calc(100% - var(--campaign-content-inset) - 20px),
clamp(327px, calc(63.87vw + 76px), 730px)
);
}
.campaign-flags-carousel {
top: clamp(215px, calc(285px - 17.81vw), 228px);
}
[data-theme='campaign-site'] [data-carousel='problem'] [data-carousel-track] {
gap: clamp(10px, calc(1.74vw + 3.16px), 21px);
}
[data-theme='campaign-site'] [data-carousel='flags'] [data-carousel-track] {
gap: clamp(10px, calc(0.63vw + 7.51px), 14px);
}
/* The content board carousel is not full-bleed: it lives inside the section
gutter, so the shared track inset (--campaign-carousel-inset) must not
re-pad it or its slides stop filling the viewport. */
[data-theme='campaign-site'] [data-carousel='contents'] [data-carousel-track] {
padding-left: 0;
padding-right: 0;
scroll-padding-left: 0;
}
[data-theme='campaign-site'] [data-carousel-chips] {
gap: clamp(6px, calc(0.16vw + 5.37px), 7px);
}
@media (min-width: 24.5625rem) {
.campaign-flags-carousel {
top: clamp(184px, calc(234.31px - 4.91vw), 215px);
}
}
@media (min-width: 40rem) {
.campaign-hero-action-detail,
.campaign-hero-action-long {
display: block;
}
.campaign-hero-action-short {
display: none;
}
}
/* Desktop grid recalibration (S6): the flags section grows so both grid rows
of content-height cards fit with breathing room. Fluid clamp between the
measured anchors: ~520px at 1024px (narrow columns, 3-line card bodies) →
~418px from ~1385px up (columns saturate at the content max width).
`overflow: hidden` keeps text-zoom growth (≥125%) inside the band instead
of painting the cards over the footer. */
@media (min-width: 64rem) {
.campaign-flags {
height: clamp(418px, calc(807.7px - 28.13vw), 520px);
overflow: hidden;
}
[data-theme='campaign-site'] {
--campaign-desktop-portrait-width: clamp(465px, calc(26.45vw + 194.15px), 702px);
--campaign-desktop-portrait-height: clamp(517px, calc(29.41vw + 215.84px), 781px);
--campaign-desktop-hero-height: max(
var(--campaign-desktop-portrait-height),
clamp(477px, min(clamp(543px, 52.8vw, 1014px), calc(-16.79vw + 108.01dvh + 26.8px)), 871px)
);
--campaign-proof-min-height: clamp(124px, calc(244px - 9.38vw), 148px);
--campaign-proof-max-height: clamp(148px, calc(6.81vw + 78.3px), 209px);
}
.campaign-hero {
--campaign-hero-height: var(--campaign-desktop-hero-height);
}
.campaign-home-logo {
top: clamp(55px, calc(15.23vw - 101px), 94px);
left: clamp(47px, calc(6.64vw - 21px), 64px);
width: clamp(197px, calc(23.44vw - 43px), 257px);
height: clamp(150px, calc(17.97vw - 34px), 196px);
transform: none;
background-image: url('/Prancheta%203%403x.png');
background-position: clamp(-56.75px, calc(-5.37vw + 12px), -43px)
clamp(-87.55px, calc(-8.03vw + 15.2px), -67px);
background-size: 143.65% 189.3%;
}
.campaign-hero-portrait {
top: auto;
bottom: 0;
left: clamp(153px, calc(33.59vw - 191px), 239px);
width: var(--campaign-desktop-portrait-width);
aspect-ratio: 465 / 517;
}
.campaign-hero-portrait-image {
top: -3.67%;
left: 0.25%;
width: 106.45%;
}
.campaign-hero-ally {
top: auto;
bottom: var(--campaign-ally-bottom, 0px);
width: clamp(177px, calc(6.14vw + 93.16px), 211px);
}
.campaign-hero-ally--rui {
left: clamp(-27px, calc(37.89vw - 415px), 70px);
--campaign-ally-bottom: clamp(67px, calc(102px - 2.73vw), 74px);
}
.campaign-hero-ally--wagner {
left: clamp(-75px, calc(37.89vw - 463px), 22px);
--campaign-ally-bottom: 0px;
z-index: 1;
}
.campaign-hero-ally--jeronimo {
left: clamp(63px, calc(31.25vw - 257px), 143px);
--campaign-ally-bottom: clamp(49px, calc(1.56vw + 33px), 53px);
z-index: 1;
}
.campaign-hero-ally--lula {
left: clamp(-8px, calc(37.89vw - 396px), 89px);
width: clamp(238px, calc(8.3vw + 124.6px), 284px);
--campaign-ally-bottom: 0px;
}
.campaign-hero-overlay {
display: none;
}
.campaign-hero-content {
--campaign-hero-content-right: clamp(47px, calc(40.23vw - 365px), 150px);
padding-top: clamp(106px, calc(8.2vw + 22px), 127px);
padding-bottom: 11px;
}
.campaign-hero-title {
width: 392px;
margin-right: var(--campaign-hero-content-right);
margin-left: auto;
text-align: right;
font-size: 36px;
line-height: 1.2;
}
.campaign-hero-copy {
width: 418px;
margin-top: 19.6px;
margin-right: var(--campaign-hero-content-right);
margin-left: auto;
text-align: right;
font-size: 18px;
}
.campaign-hero-actions {
margin-top: 29px;
margin-right: var(--campaign-hero-content-right);
margin-left: auto;
gap: 24px;
}
.campaign-hero-action {
width: 158px;
min-height: 60px;
height: auto;
font-size: 18px;
}
.campaign-hero-action-detail,
.campaign-hero-action-long,
.campaign-hero-accolade-secondary {
display: block;
}
.campaign-hero-action-short {
display: none;
}
.campaign-hero-accolades {
margin-top: clamp(64px, calc(169px - 8.2vw), 85px);
margin-right: 0;
margin-left: 559px;
align-items: flex-start;
gap: 8px;
text-align: left;
font-size: 12px;
line-height: 15px;
}
.campaign-proof {
height: clamp(
var(--campaign-proof-min-height),
calc(100dvh - var(--campaign-desktop-hero-height)),
var(--campaign-proof-max-height)
);
}
.campaign-proof-list {
grid-template-columns: 147px 178px 183px;
align-items: start;
justify-content: space-between;
gap: 0;
padding-top: clamp(17px, calc(47px - 2.34vw), 23px);
}
.campaign-proof-value {
font-size: 36px;
line-height: 1.1;
}
.campaign-proof-label {
font-size: 18px;
line-height: 1.25;
}
}
@media (min-width: 80rem) {
.campaign-hero-portrait {
left: clamp(239px, calc(100vw - 1041px), 325px);
}
.campaign-home-logo {
top: clamp(45px, calc(823.3px - 56.98vw), 94px);
left: clamp(64px, calc(8.14vw - 40.19px), 71px);
width: clamp(257px, calc(43.02vw - 293.7px), 294px);
height: clamp(196px, calc(32.56vw - 220.74px), 224px);
background-position: clamp(-64.92px, calc(64.85px - 9.5vw), -56.75px)
clamp(-100.05px, calc(98.5px - 14.54vw), -87.55px);
}
.campaign-hero-ally--rui {
left: clamp(70px, calc(83.72vw - 1001.63px), 142px);
--campaign-ally-bottom: clamp(64px, calc(111.65px - 3.49vw), 67px);
}
.campaign-hero-ally--wagner {
left: clamp(22px, calc(87.21vw - 1094.28px), 97px);
--campaign-ally-bottom: 0px;
}
.campaign-hero-ally--jeronimo {
left: clamp(143px, calc(93.02vw - 1047.7px), 223px);
--campaign-ally-bottom: clamp(49px, calc(112.53px - 4.65vw), 53px);
}
.campaign-hero-ally--lula {
left: clamp(89px, calc(87.21vw - 1027.28px), 164px);
--campaign-ally-bottom: 0px;
}
.campaign-hero-content {
--campaign-hero-content-right: clamp(150px, calc(72.09vw - 772.8px), 212px);
padding-top: clamp(106px, calc(439.56px - 24.42vw), 127px);
}
.campaign-hero-accolades {
margin-top: clamp(64px, calc(122.09vw - 1498.8px), 169px);
margin-left: clamp(559px, calc(186.05vw - 1822.4px), 719px);
}
.campaign-proof-list {
padding-top: clamp(17px, calc(19.77vw - 236.02px), 34px);
}
}
@media (min-width: 85.375rem) {
.campaign-hero-portrait {
left: clamp(325px, calc(35.92vw - 165.7px), 524px);
}
.campaign-home-logo {
top: clamp(45px, calc(7.4vw - 56.1px), 86px);
left: clamp(71px, calc(22.38vw - 234.8px), 195px);
width: clamp(294px, calc(16.43vw + 69.6px), 385px);
height: clamp(224px, calc(12.64vw + 51.4px), 294px);
background-position: clamp(-85px, calc(-3.63vw - 15.35px), -64.92px)
clamp(-131px, calc(-5.6vw - 23.6px), -100.05px);
}
.campaign-hero-ally--rui {
left: clamp(142px, calc(30.51vw - 274.7px), 311px);
--campaign-ally-bottom: clamp(64px, calc(2.17vw + 34.4px), 76px);
}
.campaign-hero-ally--wagner {
left: clamp(97px, calc(28.88vw - 297.5px), 257px);
--campaign-ally-bottom: 0px;
}
.campaign-hero-ally--jeronimo {
left: clamp(223px, calc(35.56vw - 262.8px), 420px);
--campaign-ally-bottom: clamp(49px, calc(1.44vw + 29.27px), 57px);
}
.campaign-hero-ally--lula {
left: clamp(164px, calc(32.31vw - 277.4px), 343px);
--campaign-ally-bottom: 0px;
}
.campaign-hero-content {
--campaign-hero-content-right: clamp(212px, calc(1.44vw + 192.27px), 220px);
padding-top: clamp(106px, calc(15.16vw - 101.1px), 190px);
padding-bottom: clamp(7px, calc(24.32px - 0.9vw), 12px);
}
.campaign-hero-title {
width: clamp(392px, calc(38.81vw - 138.1px), 607px);
font-size: clamp(36px, calc(2.17vw + 6.41px), 48px);
}
.campaign-hero-copy {
width: clamp(418px, calc(26.71vw + 53.05px), 566px);
margin-top: clamp(19.6px, calc(3.83vw - 32.68px), 40.8px);
font-size: clamp(18px, calc(1.08vw + 3.2px), 24px);
}
.campaign-hero-actions {
margin-top: clamp(29px, calc(6.68vw - 62.23px), 66px);
gap: clamp(24px, calc(0.36vw + 19.07px), 26px);
}
.campaign-hero-action {
width: clamp(158px, calc(2.89vw + 118.55px), 174px);
min-height: clamp(60px, calc(1.08vw + 45.2px), 66px);
height: auto;
font-size: clamp(18px, calc(0.36vw + 13.07px), 20px);
}
.campaign-hero-accolades {
margin-top: clamp(169px, calc(5.87vw + 88.76px), 201.5px);
margin-left: clamp(719px, calc(73.83vw - 289.5px), 1128px);
font-size: clamp(11px, calc(0.36vw + 7.07px), 14px);
line-height: 1.2;
}
.campaign-proof-list {
padding-top: clamp(30px, calc(1.08vw + 19.2px), 40px);
}
}
@media (prefers-reduced-motion: reduce) {
[data-theme='campaign-site'] [data-carousel-track] {
scroll-behavior: auto;
}
}
/* Full-bleed carousel viewport with content-aligned first cards. The scroller
reaches both browser edges; only its initial item follows the page gutter. */
[data-theme='campaign-site'] [data-carousel] {
--campaign-carousel-inset: var(--campaign-content-inset);
}
[data-theme='campaign-site'] [data-carousel-track],
[data-theme='campaign-site'] [data-carousel-chips] {
padding-left: var(--campaign-carousel-inset);
padding-right: var(--campaign-carousel-inset);
}
[data-theme='campaign-site'] [data-carousel-track] {
scroll-padding-left: var(--campaign-carousel-inset);
}
.campaign-action-feedback {
transition:
transform 180ms cubic-bezier(0.22, 1, 0.36, 1),
opacity 120ms ease-out,
background-color 180ms ease-out,
filter 180ms ease-out;
}
@media (hover: hover) and (pointer: fine) {
.campaign-action-feedback:hover {
transform: scale(1.05);
}
}
.campaign-action-feedback:active {
opacity: 0.8;
transform: scale(0.99);
}
@media (prefers-reduced-motion: reduce) {
.campaign-action-feedback {
transition: none;
}
.campaign-action-feedback:hover,
.campaign-action-feedback:active {
transform: none;
}
}
@media (min-width: 64rem) {
[data-theme='campaign-site'] {
--campaign-content-inset: max(180px, calc((100vw - 1152px) / 2 + 32px));
}
}
[data-theme='petition'] {
--background: #fff8f2;
--foreground: #2c2522;
--card: #ffffff;
--card-foreground: #2c2522;
--popover: #ffffff;
--popover-foreground: #2c2522;
--primary: #c51414;
--primary-foreground: #ffffff;
--secondary: #ffe8df;
--secondary-foreground: #5f1715;
--muted: #f4e7de;
--muted-foreground: #675c56;
--accent: #ffcf2e;
--accent-foreground: #332300;
--border: rgb(189 119 104 / 24%);
--input: rgb(189 119 104 / 32%);
--ring: #c51414;
--destructive: #b42318;
--petition-hero: #b6120f;
--petition-hero-foreground: #fffaf5;
--petition-hero-muted: #ffe2d6;
--petition-hero-chip: rgb(255 255 255 / 12%);
--petition-hero-chip-foreground: #fff7ed;
--petition-hero-glow: rgb(255 207 46 / 24%);
--petition-hero-depth: rgb(122 0 0 / 35%);
--petition-hero-cta: #ffcf2e;
--petition-hero-cta-foreground: #332300;
--petition-form-section: #f6ebe4;
--field-background: #ffffff;
--field-foreground: #2c2522;
--field-placeholder: rgb(44 37 34 / 58%);
--field-border: #ddc7bc;
--field-disabled-background: #ece0d9;
--field-disabled-foreground: rgb(44 37 34 / 55%);
--field-icon: rgb(44 37 34 / 58%);
}
/* Clean, neutral light palette for the internal /campanha area (login +
management panel). Mirrors the shadcn token contract with a brand-red
primary and defines the --field-* tokens so the custom Input renders with a
visible border on the white card. Applied via data-theme="campaign" on the
(campaign) layout, so it never affects the public (frontend) pages. */
[data-theme='campaign'] {
--radius: 0.5rem;
--background: #ffffff;
--foreground: #1c1917;
--card: #ffffff;
--card-foreground: #1c1917;
--popover: #ffffff;
--popover-foreground: #1c1917;
--primary: #c51414;
--primary-foreground: #ffffff;
--secondary: #f5f5f4;
--secondary-foreground: #292524;
--muted: #f4f4f5;
--muted-foreground: #6b7280;
--accent: #f4f4f5;
--accent-foreground: #1c1917;
--destructive: #b42318;
--border: rgb(28 25 23 / 12%);
--input: rgb(28 25 23 / 16%);
--ring: #c51414;
--field-background: #ffffff;
--field-foreground: #1c1917;
--field-placeholder: rgb(28 25 23 / 50%);
--field-border: #d6d3d1;
--field-disabled-background: #f5f5f4;
--field-disabled-foreground: rgb(28 25 23 / 55%);
--field-icon: rgb(28 25 23 / 55%);
/* Light rail for the campaign app shell (not the public-site dark sidebar). */
--sidebar: #fafaf9;
--sidebar-foreground: #1c1917;
--sidebar-primary: #c51414;
--sidebar-primary-foreground: #ffffff;
--sidebar-accent: #f5f5f4;
--sidebar-accent-foreground: #1c1917;
--sidebar-border: rgb(28 25 23 / 12%);
--sidebar-ring: #c51414;
--scope: #fff5ed;
--scope-foreground: #6b2d15;
--scope-border: #e8c5ae;
--tse: #f1f3f5;
--tse-foreground: #3f4854;
--support-engaged: #dcfce7;
--support-engaged-foreground: #166534;
--support-to-approach: #eef0f3;
--support-to-approach-foreground: #46505c;
--support-disputed: #fef3c7;
--support-disputed-foreground: #92400e;
--support-remembered: #e0e7ff;
--support-remembered-foreground: #3730a3;
--support-negative: #fee2e2;
--support-negative-foreground: #991b1b;
--estimate-confirmed: #dcfce7;
--estimate-confirmed-foreground: #166534;
--estimate-pending: #fef3c7;
--estimate-pending-foreground: #92400e;
--cadence-overdue: #b42318;
}
[data-theme='campaign']
:is(
[data-slot='input'],
[data-slot='input-group'],
[data-slot='combobox-trigger'],
[data-slot='native-select'],
[data-slot='select-trigger']
) {
border-radius: var(--radius-md);
}
/* B183 — Safari iOS auto-zooms any form control whose computed font-size is
below 16px when focused, and a standalone PWA does not always restore the
scale when the keyboard closes. One unlayered rule for touch phones (coarse
pointer, no hover) keeps every campaign input — omnibox, Command search,
native selects, textareas — at the 16px threshold in any orientation, while
desktop keeps its own size utilities (unlayered beats the utilities layer). */
@media (pointer: coarse) and (hover: none) {
[data-theme='campaign'] :is(input, select, textarea, [contenteditable='true']) {
font-size: 1rem;
}
}
/* The public-site base `h1` is centered + display-sized for article heroes.
Campaign dashboard headings are left-aligned section titles, so undo the
base centering and text balancing here; each heading keeps its own
size/weight utility classes. The base `p { not-first:mt-6 }` is also for
article body flow — campaign layouts space subtitles via flex gap, so the
extra top margin would stack on top of the gap and create a large gap
between a title and its subtitle. */
[data-theme='campaign'] h1 {
text-align: left;
text-wrap: initial;
}
[data-theme='campaign'] p {
margin-top: 0;
}
/*
* Cropped full-width Solla mark for the campaign sidebar.
* Source SVG viewBox is 430.9×300.5 but ink sits roughly in y 134–188 —
* size the box to ink height and pin the mask on the ink’s vertical center.
*/
.campaign-logo {
aspect-ratio: 430.9 / 64;
mask-image: url(/LOGO_SOLLA_BRANCO.svg);
mask-size: 100% auto;
mask-repeat: no-repeat;
/* Ink vertical center ≈ (134.4 + 187.8) / 2 / 300.5 */
mask-position: center 53.6%;
-webkit-mask-image: url(/LOGO_SOLLA_BRANCO.svg);
-webkit-mask-size: 100% auto;
-webkit-mask-repeat: no-repeat;
-webkit-mask-position: center 53.6%;
}
.dark {
--background: oklch(0.148 0.004 228.8);
--foreground: oklch(0.987 0.002 197.1);
--card: oklch(0.218 0.008 223.9);
--card-foreground: oklch(0.987 0.002 197.1);
--popover: oklch(0.218 0.008 223.9);
--popover-foreground: oklch(0.987 0.002 197.1);
--primary: oklch(0.925 0.005 214.3);
--primary-foreground: oklch(0.218 0.008 223.9);
--secondary: oklch(0.275 0.011 216.9);
--secondary-foreground: oklch(0.987 0.002 197.1);
--muted: oklch(0.275 0.011 216.9);
--muted-foreground: oklch(0.723 0.014 214.4);
--accent: oklch(0.275 0.011 216.9);
--accent-foreground: oklch(0.987 0.002 197.1);
--destructive: oklch(0.704 0.191 22.216);
--border: oklch(1 0 0 / 10%);
--input: oklch(1 0 0 / 15%);
--ring: oklch(0.56 0.021 213.5);
--chart-1: oklch(0.81 0.117 11.638);
--chart-2: oklch(0.645 0.246 16.439);
--chart-3: oklch(0.586 0.253 17.585);
--chart-4: oklch(0.514 0.222 16.935);
--chart-5: oklch(0.455 0.188 13.697);
--sidebar: oklch(0.218 0.008 223.9);
--sidebar-foreground: oklch(0.987 0.002 197.1);
--sidebar-primary: oklch(0.488 0.243 264.376);
--sidebar-primary-foreground: oklch(0.987 0.002 197.1);
--sidebar-accent: oklch(0.275 0.011 216.9);
--sidebar-accent-foreground: oklch(0.987 0.002 197.1);
--sidebar-border: oklch(1 0 0 / 10%);
--sidebar-ring: oklch(0.56 0.021 213.5);
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply text-foreground;
background-color: var(--background);
background-image: linear-gradient(to top, #ae1603 0%, #c86112 100%);
}
h1 {
@apply scroll-m-20 text-center text-4xl font-extrabold tracking-tight text-balance;
}
h2 {
@apply scroll-m-20 border-b pb-2 text-3xl font-semibold tracking-tight first:mt-0;
}
h3 {
@apply scroll-m-20 text-2xl font-semibold tracking-tight;
}
h4 {
@apply scroll-m-20 text-xl font-semibold tracking-tight;
}
p {
@apply leading-7 not-first:mt-6;
}
blockquote {
@apply mt-6 border-l-2 pl-6 italic;
}
ul {
@apply my-6 ml-6 list-disc [&>li]:mt-2;
}
code {
@apply bg-muted relative rounded px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold;
}
small {
@apply text-sm leading-none font-medium;
}
button,
select {
cursor: pointer;
}
html {
@apply font-sans;
}
}
@layer utilities {
.scrollbar-hide {
-ms-overflow-style: none; /* IE and Edge */
scrollbar-width: none; /* Firefox */
}
.scrollbar-hide::-webkit-scrollbar {
display: none; /* Chrome, Safari */
}
/* B167 — the chat Panel's footprint is hidden by this class instead of RRP's
imperative collapse: `display:none !important` beats the `display:flex`
react-resizable-panels writes inline on the Panel element on every render,
so hiding survives RRP's own (async, viewport-driven) re-layouts. */
.b167-ai-chat-hidden {
display: none !important;
}
}
/* MARK: Calendar (shadcn radix-nova) — cell geometry tokens for the day grid.
`--cell-size`/`--cell-radius` are consumed by ui/calendar.tsx classNames. */
.cn-calendar {
@apply p-2 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(7)];
}
.cn-calendar-dropdown-root {
@apply border-input has-focus:ring-ring/50 border has-focus:border-ring has-focus:ring-3;
}
.cn-calendar-caption-label {
@apply h-6 pr-1 pl-1.5;
}
/* E16 — municipality dossier print view: compact A4 typography (one step down
the DESIGN.md ramp: body text-sm→text-xs, section titles text-base→text-sm),
sections kept whole across page breaks. Chrome hiding lives in `print:`
utilities on the campaign layout/components; this block only tunes the
dossier itself. */
@media print {
@page {
size: A4;
margin: 14mm;
}
html,
body,
#app {
height: auto;
}
[data-dossier] {
font-size: 0.75rem;
gap: 0.75rem;
}
[data-dossier] section {
break-inside: avoid;
padding: 0.75rem;
}
[data-dossier] h2 {
font-size: 0.875rem;
}
[data-dossier] a {
text-decoration: none;
color: inherit;
}
/* Badges carry meaning by fill (prioridade, tendência, classe territorial);
without this the printer drops the background and every badge prints as
identical grey text. */
[data-dossier] [data-slot='badge'] {
print-color-adjust: exact;
-webkit-print-color-adjust: exact;
border: 1px solid rgb(0 0 0 / 20%);
}
}