teqo-backup/src/app/(frontend)/styles.css
Francisco Solla 37bb239d1d
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
fix(build): tira docs do scan do Tailwind — destrava a main
A detecção automática do Tailwind v4 lia os designs HTML de docs/plans/
e a classe bg-[url('../../public/…')] do design do álbum (4bf0c0c0)
virava módulo relativo no CSS de produção, quebrando next build na main
e o verify do deploy. @source not mantém o CSS publicado só com os
componentes reais (a variante root-absolute já existe em src).
2026-09-26 03:57:27 -03:00

1171 lines
34 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}";
@source not "../../../docs/**";
@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;
/* S14 — the campaign theme is light: the near-white `--muted-foreground`
inherited from `:root` (built for the dark pages) is illegible on white.
Point it at the campaign gray (~6:1) so generic descriptions — e.g. the
card composer help text — read correctly in dialogs/drawers. */
--muted-foreground: var(--campaign-muted);
--campaign-surface: #f9faff;
--campaign-band: #ebe9e9;
--campaign-line: rgb(0 0 0 / 12%);
--campaign-content-inset: clamp(20px, calc(25.36vw - 79.64px), 180px);
/* S15 — literal colors of the "Time de você" card banners, measured from the
reference card. The canvas renderer keeps the same literals in `src/lib`. */
--team-red: #e50e2f;
--team-yellow: #ffec01;
--team-blue: #0061a5;
/* 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%);
}
}
/* S22 — home "A trilha da nossa caminhada": the section title scales above the
neighbours' (Cenas 01/02: 40px desktop, 34px mobile) without touching the
shared token. The radio player (S25, own `<audio preload="none">`) lives as
Tailwind utilities in RadioPlayer — no painted art, wave or spinner here. */
.campaign-sound-title {
font-size: clamp(34px, calc(1.7vw + 18px), 40px);
}
/* S39 — home "Central de Conteúdos": 30px mobile → 36px desktop (cenas 01/02),
above the shared 22–24px token without touching it. */
.campaign-content-pieces-title {
font-size: clamp(30px, calc(0.94vw + 24px), 36px);
}