/* ==========================================================================
   Smart Localiza . v3 . camada sobria
   Carrega DEPOIS de main-final.css e style.css. Duas funcoes:
     1) site inteiro: fontes novas, fundo liso, menu novo, cards sobrios,
        fim das pilulas e dos efeitos (regras !important de proposito: elas
        precisam vencer 29 mil linhas de seletores mais especificos)
     2) home: componentes .v3-* das secoes refeitas
   Direcao em DIRECAO_V3.md na raiz do projeto.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Tokens. A convencao do tema: <html data-theme="light"> = claro,
      atributo ausente (ou "dark") = escuro.
   -------------------------------------------------------------------------- */
:root {
	--v3-page:        #FFFFFF;
	--v3-page-alt:    #F5F6F8;
	--v3-card:        #FFFFFF;
	--v3-line:        #E4E7EB;
	--v3-line-strong: #C9D0D8;
	--v3-ink:         #111827;
	--v3-ink-2:       #4B5563;
	--v3-ink-3:       #6B7280;
	/* Cinza fraco em CONTROLE (aba inativa), nao em legenda: o --v3-ink-3
	   sobre --v3-page-alt da 4,47:1 e reprova por pouco. Este da 4,91:1
	   sobre o cinza da secao e 5,31:1 sobre branco. */
	--v3-ink-3-strong: #646C78;
	--v3-brand:       #F16000;
	--v3-brand-hover: #D45400;
	/* Laranja escurecido para TEXTO pequeno: o #F16000 sobre branco da ~3,1:1
	   e reprova em texto corrido. Este da ~4,8:1. */
	--v3-brand-text:  #B84A00;
	--v3-brand-soft:  rgba(241, 96, 0, .10);
	--v3-ok:          #16A34A;
	--v3-shadow-menu: 0 12px 32px rgba(17, 24, 39, .10);

	/* Painel de monitoramento (secao de disponibilidade): SEGUE O TEMA
	   (pedido do Joao; a versao sempre-escura foi rejeitada). No claro e um
	   painel cinza-claro com miolo branco; no escuro, os valores escuros
	   ficam no bloco :root:not([data-theme=light]) abaixo. */
	--v3-panel-bg:      #F5F6F8;
	--v3-panel-card:    #FFFFFF;
	--v3-panel-line:    #E4E7EB;
	--v3-panel-ink:     #111827;
	--v3-panel-ink-dim: rgba(17, 24, 39, .62);
	--v3-panel-ink-mut: rgba(17, 24, 39, .45);

	/* Demo do produto (/conhecer-plataforma/): chrome ESCURO nos dois temas,
	   porque nao e uma secao do site e sim uma captura de tela do app, que e
	   escuro. Quase todos estes tokens valem igual nos dois temas; a excecao
	   e --v3-demo-bg, que no escuro precisa se afastar de --v3-page-alt (os
	   dois eram #14181D e a tela sumia dentro da secao). Ver bloco abaixo.
	   --v3-demo-edge e a moldura da tela: no claro o proprio hairline basta,
	   no escuro ele precisa de reforco. */
	--v3-demo-bg:     #14181D;
	--v3-demo-card:   #1B2128;
	--v3-demo-line:   #2A323B;
	--v3-demo-edge:   var(--v3-demo-line);
	--v3-demo-ink:    #E8EDF2;
	/* Contraste medido (branco E8EDF2 com alpha, composto no fundo):
	   ink-2 .64 = 6,42:1 sobre --v3-demo-card e 6,79:1 sobre --v3-demo-bg;
	   ink-3 .51 = 4,60:1 sobre --v3-demo-card e 4,77:1 sobre --v3-demo-bg.
	   O .42 antigo dava 3,57:1 e reprovava em ~52 textos de 10 a 12,5px,
	   inclusive nos botoes de sub-aba, que sao controle e nao decoracao. */
	--v3-demo-ink-2:  rgba(232, 237, 242, .64);
	--v3-demo-ink-3:  rgba(232, 237, 242, .51);
	--v3-demo-ok:     #22C55E;
	--v3-demo-warn:   #F59E0B;
	--v3-demo-alert:  #EF4444;

	/* Mapa dentro do demo: CLARO nos dois temas. Mapa de verdade e claro, e
	   painel escuro com mapa claro dentro e a cara de uma plataforma real.
	   A grade neon que estava aqui era o maior tique de IA da pagina. */
	--v3-map-paper:   #EDEEEA;
	--v3-map-block:   #E2E4DF;
	--v3-map-block-2: #D8DBD4;
	--v3-map-park:    #D3E3CE;
	--v3-map-water:   #C1D9E8;
	--v3-map-road:    #FFFFFF;
	--v3-map-road-2:  #F8F6F1;
	--v3-map-casing:  #D5D8D1;
	/* Rotulo escrito dentro do mapa. O #6E7176 antigo caia para 3,35:1 sobre
	   o rio (--v3-map-water) e 3,40:1 sobre o contorno de quadra, e a mesma
	   classe carrega "Cerca virtual, 400 m", que e informacao de produto.
	   Este passa em todos os ladrilhos: 5,67:1 no papel, 5,16 na quadra,
	   4,72 na quadra 2, 4,93 no parque, 4,59 no contorno e 4,52 no rio. */
	--v3-map-label:   #5A5D62;
	/* Pino numerado do trajeto: laranja escurecido FIXO nos dois temas. Nao da
	   para usar --v3-brand-text aqui porque ele clareia no tema escuro, e o
	   numero e branco de 10px sobre um mapa que e claro sempre. Branco sobre
	   este da 5,49:1; sobre o --v3-brand cheio daria 3,27:1 e reprovaria. */
	--v3-map-pin:     #A34200;

	/* Azul de SELECAO. Nao e cor de marca e nao entra em nada que se clique:
	   marca "este e o item que casa com o que voce escolheu", que e estado, e
	   por isso precisa de um tom que nao brigue com o laranja do botao. Hoje
	   so a faixa acesa do card acima de mil veiculos usa. */
	--v3-selecao:      #3B82F6;
	--v3-selecao-halo: rgba(59, 130, 246, .22);

	--v3-display: "Archivo", "Arial Narrow", Arial, sans-serif;
	--v3-body:    "Instrument Sans", system-ui, -apple-system, "Segoe UI", sans-serif;
	--v3-mono:    "Azeret Mono", ui-monospace, "Cascadia Mono", Consolas, monospace;

	/* O resto do site le estas tres; trocar aqui troca as paginas internas. */
	--sl-font-display: var(--v3-display);
	--sl-font-body:    var(--v3-body);
	--sl-font-mono:    var(--v3-mono);
}

:root:not([data-theme="light"]) {
	--v3-page:        #0F1215;
	--v3-page-alt:    #14181D;
	--v3-card:        #171C22;
	--v3-line:        #262D35;
	--v3-line-strong: #37404A;
	--v3-ink:         #EDEFF2;
	--v3-ink-2:       #AEB6C0;
	--v3-ink-3:       #88919C;
	--v3-ink-3-strong: #88919C; /* no escuro o proprio ink-3 ja da 5,58:1 */
	--v3-shadow-menu: 0 12px 32px rgba(0, 0, 0, .45);
	/* A tela do produto precisa se destacar da secao nos DOIS temas. No claro
	   isso sai de graca (chrome escuro sobre secao clara); no escuro os dois
	   valiam #14181D e a tela sumia. Aqui o fundo da tela desce e a moldura
	   engrossa em cor: #414B57 contra a secao da 2,01:1, contra 1,37:1 do
	   hairline padrao. */
	--v3-demo-bg:     #0B0F13;
	--v3-demo-edge:   #414B57;
	--v3-brand-text:  #FF9147;
	--v3-brand-soft:  rgba(241, 96, 0, .16);
	--v3-panel-bg:      #10151B;
	--v3-panel-card:    #161D25;
	--v3-panel-line:    #242D37;
	--v3-panel-ink:     #E8EDF2;
	--v3-panel-ink-dim: rgba(232, 237, 242, .60);
	--v3-panel-ink-mut: rgba(232, 237, 242, .38);
	/* O halo azul precisa de mais corpo no escuro para aparecer igual. */
	--v3-selecao-halo: rgba(59, 130, 246, .34);
}

/* --------------------------------------------------------------------------
   2. Base do site inteiro
   -------------------------------------------------------------------------- */
html { scroll-behavior: smooth; }

/* Quem liga "reduzir movimento" no sistema nao quer a pagina deslizando a
   cada ancora do menu. O main-final.css declara o smooth duas vezes; esta
   guarda precisa vir depois, e vem, porque o v3.css carrega por ultimo. */
@media (prefers-reduced-motion: reduce) {
	html { scroll-behavior: auto; }
}

body,
[data-theme="light"] body {
	background: var(--v3-page) !important;
	background-image: none !important;
	color: var(--v3-ink);
	font-family: var(--v3-body);
	font-size: 16px;
	line-height: 1.6;
}

/* Grao e mesh de gradiente do fundo, e o pontilhado diagonal do tema claro. */
body::before,
body::after,
[data-theme="light"] body::before,
[data-theme="light"] body::after {
	display: none !important;
	content: none !important;
}

h1, h2, h3, h4,
.sl-display {
	font-family: var(--v3-display);
	color: var(--v3-ink);
	margin: 0;
}

h1, h2 { font-variation-settings: "wdth" 110, "wght" 700; letter-spacing: -.02em; }
h3     { font-variation-settings: "wdth" 104, "wght" 650; letter-spacing: -.01em; }
h4     { font-variation-settings: "wdth" 100, "wght" 600; }

:focus-visible {
	outline: 2px solid var(--v3-brand);
	outline-offset: 2px;
}

.sl-wrap { max-width: 1200px; }

/* Palavra em laranja dentro de titulo: agora herda a cor do titulo. */
.sl-gt,
.sl-gt-grad,
.sl-s-head .sl-gt,
.sl-s-head .sl-gt-grad {
	background: none !important;
	-webkit-background-clip: initial !important;
	background-clip: initial !important;
	-webkit-text-fill-color: currentColor !important;
	color: inherit !important;
	animation: none !important;
}

/* Pilulas (eyebrow) em qualquer pagina. */
.sl-chip,
.sl-bx-eyebrow,
.sl-bxnum-eyebrow,
.sl-personas-content__chip,
.sl-page-hero .sl-chip {
	display: none !important;
}

/* Cabecalho de secao das paginas internas: esquerda, nao centro. */
/* Paginas internas continuam centralizadas (os blocos abaixo delas sao
   centralizados no main-final.css). So a home refeita usa cabecalho a esquerda. */
.sl-s-head { gap: .75rem; }
.sl-s-head h2 {
	font-size: clamp(1.7rem, 2.6vw + .6rem, 2.5rem) !important;
	font-weight: 700 !important;
	line-height: 1.08;
}
.sl-s-head p { color: var(--v3-ink-2); font-size: 1.05rem; }

/* Efeitos: revelacao com blur, letras fatiadas, blob do mouse, halos, orbs. */
.sl-reveal,
.sl-reveal.is-in,
.sl-reveal-children > *,
.sl-char {
	opacity: 1 !important;
	transform: none !important;
	filter: none !important;
	transition: none !important;
	animation: none !important;
	will-change: auto !important;
}
.sl-char { display: inline; }

.sl-cursor-blob,
.sl-hero::before,
.sl-hero::after,
.sl-fpx-bg,
.sl-fpx-orb,
.sl-fpx-grid,
.sl-aurora-bg,
.sl-sav-teaser-grid,
.sl-stack-map-grid,
.sl-fpx-card-shine,
.sl-bx-spot,
.sl-fpx-card-num,
.sl-fpx-card-arrow {
	display: none !important;
}

/* Botoes antigos (paginas internas): retos, sem brilho, sem ima do mouse. */
.sl-btn,
.sl-btn-primary,
.sl-btn-ghost,
.sl-btn-lg,
.sl-brand-lockup {
	transform: none !important;
	border-radius: 8px !important;
	box-shadow: none !important;
	font-family: var(--v3-body) !important;
	font-weight: 600 !important;
	transition: background-color .15s ease, border-color .15s ease, color .15s ease !important;
}
.sl-btn-primary::before,
.sl-btn-primary::after { display: none !important; }
.sl-btn-primary { background: var(--v3-brand) !important; color: #fff !important; }
.sl-btn-primary:hover { background: var(--v3-brand-hover) !important; }
.sl-btn-ghost {
	background: transparent !important;
	color: var(--v3-ink) !important;
	box-shadow: inset 0 0 0 1px var(--v3-line-strong) !important;
}
.sl-btn-ghost:hover { background: var(--v3-page-alt) !important; }

/* Cards antigos (paginas internas): branco, borda, quieto. */
.sl-fpx-card, .sl-bx-card, .sl-sav-card, .sl-office-card, .sl-roi-card,
.sl-fab-card, .sl-tudo-card, .sl-smartsms-card, .sl-personas-card,
.sl-int-card, .sl-phone-card, .sl-hscroll-card, .sl-boleto-card,
.sl-team-card, .sl-id-card, .sl-tier, .sl-pkg, .sl-principle,
.sl-bento-cell, .sl-api-panel, .sl-sav-panel, .sl-pri, .sl-faq,
.sl-persona-feat, .sl-persona-pain, .sl-server, .sl-sav-highlight {
	background: var(--v3-card) !important;
	background-image: none !important;
	border: 1px solid var(--v3-line) !important;
	border-radius: 10px !important;
	box-shadow: none !important;
	backdrop-filter: none !important;
	-webkit-backdrop-filter: none !important;
	transform: none !important;
	animation: none !important;
	color: var(--v3-ink);
}
.sl-fpx-card:hover, .sl-bx-card:hover, .sl-sav-card:hover, .sl-office-card:hover,
.sl-roi-card:hover, .sl-fab-card:hover, .sl-tudo-card:hover, .sl-smartsms-card:hover,
.sl-personas-card:hover, .sl-int-card:hover, .sl-phone-card:hover, .sl-hscroll-card:hover,
.sl-boleto-card:hover, .sl-team-card:hover, .sl-tier:hover, .sl-pkg:hover,
.sl-principle:hover, .sl-bento-cell:hover, .sl-persona-feat:hover,
.sl-persona-pain:hover, .sl-server:hover {
	border-color: var(--v3-line-strong) !important;
	box-shadow: none !important;
	transform: none !important;
}
.sl-fpx-card::before, .sl-fpx-card::after,
.sl-bx-card::before, .sl-bx-card::after,
.sl-sav-card::before, .sl-sav-card::after,
.sl-office-card::before, .sl-office-card::after,
.sl-roi-card::before, .sl-roi-card::after,
.sl-fab-card::before, .sl-fab-card::after,
.sl-tudo-card::before, .sl-tudo-card::after,
.sl-smartsms-card::before, .sl-smartsms-card::after,
.sl-personas-card::before, .sl-personas-card::after,
.sl-int-card::before, .sl-int-card::after,
.sl-tier::before, .sl-tier::after,
.sl-bento-cell::before, .sl-bento-cell::after,
.sl-server::before, .sl-server::after,
.sl-sav-highlight::before, .sl-sav-highlight::after {
	display: none !important;
}
/* Icones com gradiente viram traco cinza; tags coloridas viram texto. */
.sl-fpx-card-icon, .sl-bx-icon {
	background: none !important;
	box-shadow: none !important;
	border: 0 !important;
	color: var(--v3-ink-3);
}
.sl-fpx-card-icon svg, .sl-bx-icon svg { stroke: var(--v3-ink-3) !important; }
.sl-fpx-card-icon svg [fill], .sl-bx-icon svg [fill] { fill: var(--v3-ink-3) !important; }
.sl-fpx-card-tag, .sl-bx-tag {
	background: none !important;
	border: 0 !important;
	padding: 0 !important;
	color: var(--v3-ink-3) !important;
	font-family: var(--v3-mono) !important;
	font-size: 12px !important;
	letter-spacing: 0 !important;
	text-transform: none !important;
}

/* Rodape: sem brilho laranja subindo do chao. */
.sl-footer {
	background: var(--v3-page-alt) !important;
	background-image: none !important;
	border-top: 1px solid var(--v3-line) !important;
	color: var(--v3-ink-2);
}
.sl-footer h4 { color: var(--v3-ink); font-size: 14px; margin-bottom: 12px; }
.sl-footer a { color: var(--v3-ink-2); }
.sl-footer a:hover { color: var(--v3-ink); }
.sl-footer-bottom { border-top: 1px solid var(--v3-line); color: var(--v3-ink-3); font-size: 13px; }

/* --------------------------------------------------------------------------
   3. Menu (site inteiro). Marcacao vem do walker em inc/menu-walker.php.
      Barra solida, 68px, borda fina embaixo. Igual parado ou rolado.
   -------------------------------------------------------------------------- */
.sl-header,
.sl-header.is-scrolled,
[data-theme="light"] .sl-header,
[data-theme="light"] .sl-header.is-scrolled {
	position: sticky;
	top: 0;
	z-index: 50;
	padding: 0 !important;
	background: var(--v3-page) !important;
	backdrop-filter: none !important;
	-webkit-backdrop-filter: none !important;
	border-bottom: 1px solid var(--v3-line) !important;
	box-shadow: none !important;
	transition: none !important;
}

.sl-header-inner,
.sl-header.is-scrolled .sl-header-inner,
[data-theme="light"] .sl-header.is-scrolled .sl-header-inner {
	max-width: 1200px;
	margin: 0 auto;
	padding: 0 24px !important;
	min-height: 68px;
	display: flex;
	align-items: center;
	gap: 28px;
	background: none !important;
	border: 0 !important;
	border-radius: 0 !important;
	box-shadow: none !important;
	backdrop-filter: none !important;
	-webkit-backdrop-filter: none !important;
	transition: none !important;
}

.sl-brand-lockup { display: flex; align-items: center; flex: none; gap: 10px; }
.sl-brand-logo { height: 36px; width: auto; max-height: 36px; }
[data-theme="light"] .sl-brand-logo--dark { display: none; }
:root:not([data-theme="light"]) .sl-brand-logo--light { display: none; }
.sl-brand-mark { width: 30px; }
.sl-brand-name {
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 106, "wght" 700;
	font-size: 17px;
	color: var(--v3-ink);
}
.sl-brand-tag { display: none; }

.sl-nav { flex: 1; min-width: 0; display: flex; }
.sl-nav-list,
.sl-nav ul.sl-nav-static {
	display: flex;
	align-items: center;
	gap: 2px;
	width: 100%;
	list-style: none;
	margin: 0;
	padding: 0;
}
.sl-nav-item { position: relative; }

.sl-nav-link {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 9px 12px;
	border: 0;
	border-radius: 6px;
	background: none;
	font-family: var(--v3-body);
	font-weight: 500;
	font-size: 15px;
	line-height: 1;
	color: var(--v3-ink-2);
	text-decoration: none;
	cursor: pointer;
	transition: color .15s ease, background-color .15s ease;
}
.sl-nav-link:hover { color: var(--v3-ink); background: var(--v3-page-alt); }
.sl-nav-item.is-active > .sl-nav-link,
.sl-nav-link[aria-current="page"] {
	color: var(--v3-ink);
	background: none;
	border-radius: 0;
	box-shadow: inset 0 -2px 0 var(--v3-brand);
}
.sl-nav-chevron { width: 12px; height: 12px; opacity: .55; }
.sl-nav-cta-dot,
.sl-nav-cta-arrow,
.sl-nav-indicator,
.sl-nav-magic { display: none !important; }

/* "Area do cliente": botao CHEIO na cor da marca, encostado a direita da lista.

   Ate a v3.6.4 ele era de contorno no desktop e cheio so no rodape da gaveta
   do celular (.sl-mobile-drawer-cta). O Joao viu o do celular e pediu o mesmo
   nas outras telas. Mesma tinta e mesmo par de hover do .v3-btn--primary, que
   e o botao primario do site inteiro: um laranja so, com um comportamento so.

   O #fff literal no lugar de um token e de proposito e segue o
   .v3-btn--primary: os tokens de tinta viram com o tema, e o texto sobre o
   preenchimento laranja tem de continuar branco nos dois.

   A GEOMETRIA NAO MUDA, e isso nao e economia de esforco: o padding de 9px e
   quem define a altura do miolo do cabecalho, a casca esta travada em 69px
   logo no fim deste arquivo, e a barra grudenta das paginas de comando esta
   medida em top: 70px contra ela. Trocar 9px por 12px para "virar um botao de
   verdade" abriria um vao visivel naquela barra. */
.sl-nav-item--cta { margin-left: auto; }
.sl-nav-item--cta > .sl-nav-link {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	padding: 9px 16px;
	background: var(--v3-brand);
	border: 1px solid transparent;
	border-radius: 8px;
	color: #fff;
	box-shadow: none;
}

/* O icone herda a cor do botao (currentColor no SVG), entao nao precisa de
   regra de cor propria nem de variante por tema. flex: none para ele nunca
   encolher quando o rotulo for traduzido para uma palavra mais longa. */
.sl-nav-cta-icone { flex: none; }
.sl-nav-item--cta > .sl-nav-link:hover {
	background: var(--v3-brand-hover);
	color: #fff;
}
/* Estando NA pagina da area do cliente: o sublinhado laranja que marca o item
   ativo dos outros links do menu ficaria laranja sobre laranja, invisivel.
   O estado ativo vira o tom mais escuro do proprio botao, o mesmo do hover,
   que le como "voce ja esta aqui" sem desenhar nada por cima. */
.sl-nav-item--cta.is-active > .sl-nav-link {
	box-shadow: none;
	/* O raio PRECISA ser redeclarado: a regra generica do item ativo, logo
	   acima, zera o border-radius para o sublinhado laranja caber nos outros
	   links do menu. Sem esta linha o botao virava um retangulo de canto vivo
	   justamente na pagina da Area do Cliente. O que nao se declara nao entra
	   na disputa, por mais especifico que o seletor seja. */
	border-radius: 8px;
	background: var(--v3-brand-hover);
	color: #fff;
}

/* Dropdown: painel branco, borda, uma sombra so. Sem icones, sem barra
   de gradiente (a inline do functions.php foi removida). */
.sl-nav-dropdown {
	position: absolute;
	top: calc(100% + 8px);
	left: 0;
	z-index: 60;
	min-width: 300px;
	padding: 8px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
	box-shadow: var(--v3-shadow-menu);
	opacity: 0;
	visibility: hidden;
	transform: none !important;
	transition: opacity .15s ease, visibility .15s ease;
	overflow: visible !important;
}
.sl-nav-dropdown::before,
.sl-nav-dropdown::after { display: none !important; }
.sl-nav-item--has-dropdown:hover > .sl-nav-dropdown,
.sl-nav-item--has-dropdown.is-open > .sl-nav-dropdown,
.sl-nav-item--has-dropdown:focus-within > .sl-nav-dropdown,
.sl-nav-link[aria-expanded="true"] + .sl-nav-dropdown,
.sl-nav-dropdown.is-open {
	opacity: 1;
	visibility: visible;
}
.sl-nav-dropdown ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; }
.sl-nav-dropdown-item {
	display: block;
	padding: 10px 12px;
	border-radius: 6px;
	color: var(--v3-ink);
	text-decoration: none;
	transition: background-color .15s ease;
}
.sl-nav-dropdown-item:hover { background: var(--v3-page-alt); }
.sl-nav-dropdown-icon { display: none !important; }
.sl-nav-dropdown-text { display: flex; flex-direction: column; gap: 2px; }
.sl-nav-dropdown-text strong { font-family: var(--v3-body); font-weight: 600; font-size: 15px; line-height: 1.3; }
.sl-nav-dropdown-text small { font-family: var(--v3-body); font-size: 13px; line-height: 1.35; color: var(--v3-ink-3); }

.sl-header-actions { display: flex; align-items: center; gap: 8px; margin-left: auto; flex: none; }
.sl-theme-toggle {
	width: 36px;
	height: 36px;
	display: grid;
	place-items: center;
	border: 1px solid var(--v3-line);
	border-radius: 8px;
	background: none;
	color: var(--v3-ink-2);
	box-shadow: none !important;
	transform: none !important;
}
.sl-theme-toggle:hover { border-color: var(--v3-line-strong); color: var(--v3-ink); }
[data-theme="light"] .sl-theme-toggle-moon { display: none; }
:root:not([data-theme="light"]) .sl-theme-toggle-sun { display: none; }

.sl-menu-toggle {
	display: none;
	width: 40px;
	height: 36px;
	flex-direction: column;
	justify-content: center;
	gap: 5px;
	padding: 0 9px;
	border: 1px solid var(--v3-line);
	border-radius: 8px;
	background: none;
}
.sl-menu-toggle span { display: block; height: 2px; width: 100%; background: var(--v3-ink); border-radius: 1px; }

@media (max-width: 1000px) {
	.sl-nav { display: none; }
	.sl-menu-toggle { display: flex; }
	.sl-header-inner { gap: 12px; }
}

/* Gaveta mobile: fundo solido, links simples. */
.sl-mobile-drawer-panel {
	background: var(--v3-card) !important;
	backdrop-filter: none !important;
	-webkit-backdrop-filter: none !important;
	border-left: 1px solid var(--v3-line);
	box-shadow: var(--v3-shadow-menu) !important;
}
.sl-mobile-drawer-overlay { background: rgba(17, 24, 39, .45) !important; backdrop-filter: none !important; }
.sl-mobile-drawer-head { border-bottom: 1px solid var(--v3-line); }
.sl-mobile-drawer-link {
	color: var(--v3-ink) !important;
	background: none !important;
	border: 0 !important;
	font-family: var(--v3-body);
	font-weight: 500;
}
.sl-mobile-drawer-link.is-active { color: var(--v3-brand) !important; }
.sl-mobile-drawer-icon { display: none !important; }
.sl-mobile-drawer-nav ul a { color: var(--v3-ink-2) !important; }
.sl-mobile-drawer-group { animation: none !important; opacity: 1 !important; transform: none !important; }
.sl-mobile-drawer-cta {
	background: var(--v3-brand) !important;
	color: #fff !important;
	border-radius: 8px !important;
	box-shadow: none !important;
}
.sl-mobile-drawer-theme { color: var(--v3-ink-2) !important; background: none !important; border: 1px solid var(--v3-line) !important; border-radius: 8px !important; }

/* ---- gaveta mobile: grupos que abrem e fecham (v3.6.3) ----

   Antes a gaveta despejava todos os sub-itens de uma vez: no celular do Joao
   isso era uma coluna longa, sem nada dizendo que "Precos" era um grupo e nao
   uma pagina. Agora o cabecalho do grupo e um botao com chevron, os grupos
   nascem fechados e so o grupo da pagina atual ja vem aberto. */

/* O cabecalho do grupo virou <button>: reseta o que o navegador poe num
   botao e herda o resto de .sl-mobile-drawer-link (o v3.css ja apaga fundo e
   borda daquela classe). */
.v3-drawer-toggle {
	width: 100%;
	text-align: left;
	cursor: pointer;
	-webkit-appearance: none;
	appearance: none;
}

/* O chevron e a unica coisa que diz "isto abre". Ganha caixa propria em vez
   de ser so um traco solto: no toque, alvo com fundo e mais facil de mirar,
   e virado de cabeca para baixo ele mostra o estado sem precisar de texto. */
.v3-drawer-chevron {
	display: inline-grid;
	place-items: center;
	flex: none;
	width: 26px;
	height: 26px;
	border-radius: 7px;
	background: var(--v3-page-alt);
	color: var(--v3-ink-3);
	transition: transform .28s cubic-bezier(.22, 1, .36, 1), color .2s ease, background .2s ease;
}
.v3-drawer-group.is-aberto .v3-drawer-chevron {
	transform: rotate(180deg);
	background: var(--v3-brand-soft);
	color: var(--v3-brand-text);
}

/* A animacao de altura sem numero magico: a linha do grid vai de 0fr a 1fr e
   o navegador interpola ate a altura real do conteudo. max-height com um
   valor chutado ou abriria com solavanco (valor grande demais) ou cortaria a
   lista (valor pequeno demais), e nenhum dos dois se ajusta a um menu que o
   Joao pode mudar em Aparencia > Menus. */
.v3-drawer-sub {
	display: grid;
	grid-template-rows: 0fr;
	visibility: hidden;
	opacity: 0;
	transition: grid-template-rows .3s cubic-bezier(.22, 1, .36, 1), opacity .22s ease, visibility .3s;
}
.v3-drawer-group.is-aberto .v3-drawer-sub {
	grid-template-rows: 1fr;
	visibility: visible;
	opacity: 1;
}
/* O filho e quem corta o excedente enquanto a linha ainda nao cresceu. O
   min-height: 0 e obrigatorio: sem ele o item do grid nunca fica menor que o
   proprio conteudo e a animacao simplesmente nao acontece. O visibility do
   pai tira os links do Tab e do leitor de tela enquanto o grupo esta
   fechado, que o overflow sozinho nao faz. */
.v3-drawer-sub-int {
	min-height: 0;
	overflow: hidden;
}

/* O recuo de 2,5rem era o lugar do icone do item, que o v3 apaga desde a
   primeira rodada: sem o icone, aquele recuo empurrava a lista para o meio
   da gaveta sem motivo. */
.sl-mobile-drawer-nav .v3-drawer-sub-int ul {
	margin: 4px 0 6px 16px !important;
	padding-left: 10px !important;
	border-left: 1px solid var(--v3-line) !important;
}

@media (prefers-reduced-motion: reduce) {
	.v3-drawer-chevron,
	.v3-drawer-sub { transition: none; }
}

/* --------------------------------------------------------------------------
   4. Componentes v3 (home)
   -------------------------------------------------------------------------- */
.v3-wrap {
	max-width: 1200px;
	margin: 0 auto;
	padding: 0 24px;
}

.v3-section { padding: 88px 0; }
.v3-section--alt { background: var(--v3-page-alt); }
.v3-section--line { border-top: 1px solid var(--v3-line); }

/* Zebra: duas secoes cinza coladas somam 176px de padding sem nenhuma linha
   no meio e se fundem num bloco unico, que e o oposto do ritmo
   branco/cinza/branco. Quando a variante alt vem logo depois de outra alt,
   um fio separa as duas, exatamente como a faixa de CTA ja faz com --line.
   O :not evita dobrar a borda de quem ja pediu a linha na mao. */
.v3-section--alt + .v3-section--alt:not(.v3-section--line) {
	border-top: 1px solid var(--v3-line);
}

.v3-head { max-width: 680px; margin-bottom: 40px; }
.v3-head h2 {
	font-size: clamp(1.7rem, 2.6vw + .6rem, 2.5rem);
	line-height: 1.08;
	text-wrap: balance;
}
.v3-head p {
	margin: 14px 0 0;
	font-size: 17px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-grid-2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
.v3-grid-3 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }
.v3-grid-4 { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 20px; }

.v3-card {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 28px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
	color: var(--v3-ink);
	text-decoration: none;
	transition: border-color .15s ease;
}
.v3-card:hover { border-color: var(--v3-line-strong); }
.v3-card-title { font-size: 1.2rem; line-height: 1.25; }
.v3-card-text { margin: 0; font-size: 15px; line-height: 1.6; color: var(--v3-ink-2); }
.v3-card-list { list-style: none; margin: 4px 0 0; padding: 0; display: grid; gap: 10px; }
.v3-card-list li { position: relative; padding-left: 22px; font-size: 15px; line-height: 1.5; color: var(--v3-ink-2); }
/* Tique desenhado com duas bordas: nao depende de fonte nem de SVG.
   E o principal detalhe de cor da marca no corpo da pagina. */
.v3-card-list li::before {
	content: "";
	position: absolute;
	left: 2px;
	top: .38em;
	width: 5px;
	height: 9px;
	border: solid var(--v3-brand);
	border-width: 0 2px 2px 0;
	transform: rotate(45deg);
}
.v3-card-list strong { color: var(--v3-ink); font-weight: 600; }
.v3-card-meta {
	margin-top: auto;
	padding-top: 14px;
	border-top: 1px solid var(--v3-line);
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.4;
	color: var(--v3-ink-3);
}
.v3-card-actions { margin-top: 6px; display: flex; gap: 10px; flex-wrap: wrap; }

.v3-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 12px 20px;
	border: 1px solid transparent;
	border-radius: 8px;
	font-family: var(--v3-body);
	font-weight: 600;
	font-size: 15px;
	line-height: 1.2;
	text-decoration: none;
	cursor: pointer;
	transition: background-color .15s ease, border-color .15s ease, color .15s ease;
}
.v3-btn--primary { background: var(--v3-brand); color: #fff; }
.v3-btn--primary:hover { background: var(--v3-brand-hover); color: #fff; }
.v3-btn--secondary { background: transparent; color: var(--v3-ink); border-color: var(--v3-line-strong); }
.v3-btn--secondary:hover { background: var(--v3-page-alt); }

.v3-status-dot {
	display: inline-block;
	width: 7px;
	height: 7px;
	border-radius: 50%;
	background: var(--v3-ok);
	vertical-align: middle;
}

.v3-link {
	color: var(--v3-ink);
	font-weight: 500;
	text-decoration: underline;
	text-decoration-color: var(--v3-line-strong);
	text-underline-offset: 3px;
}
.v3-link:hover { text-decoration-color: var(--v3-ink); }

@media (max-width: 1000px) {
	.v3-grid-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 720px) {
	.v3-section { padding: 56px 0; }
	.v3-grid-2, .v3-grid-3 { grid-template-columns: minmax(0, 1fr); }
	.v3-card { padding: 22px; }

	/* Home, "O que a plataforma faz": no celular so ficam os tres cards
	   marcados com 'celular' no PHP (rastreamento, historico e bloqueio).
	   Nove cards empilhados eram uma rolagem longa demais logo depois da
	   hero, e os seis restantes continuam a um toque no botao "Ver todas as
	   funcionalidades" logo abaixo da grade. display:none e de proposito:
	   tira do leitor de tela e do tab junto com a vista, o que visibility
	   ou opacity nao fariam. */
	.v3-feat-card:not(.v3-feat-card--celular) { display: none; }
}

/* --------------------------------------------------------------------------
   5. Hero (home): pitch a esquerda, calculadora de preco a direita
   -------------------------------------------------------------------------- */
.v3-hero {
	padding: 72px 0 88px;
	border-bottom: 1px solid var(--v3-line);
}
.v3-hero-grid {
	display: grid;
	grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
	gap: 56px;
	align-items: center;
}
.v3-hero-title {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}
.v3-hero-lede {
	max-width: 520px;
	margin: 22px 0 0;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}
.v3-hero-ctas { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 30px; }
.v3-hero-note { margin: 20px 0 0; font-size: 14px; color: var(--v3-ink-3); }

/* Estatisticas do hero: numero na cor da marca, legenda quieta. */
.v3-hero-stats {
	display: flex;
	flex-wrap: wrap;
	gap: 20px 40px;
	margin-top: 34px;
	padding-top: 26px;
	border-top: 1px solid var(--v3-line);
}
.v3-hero-stat-n {
	display: block;
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 100, "wght" 700;
	font-size: clamp(1.65rem, 2.4vw, 2.15rem);
	line-height: 1;
	letter-spacing: -.02em;
	color: var(--v3-brand);
}
.v3-hero-stat-l {
	display: block;
	margin-top: 6px;
	font-size: 13px;
	line-height: 1.35;
	color: var(--v3-ink-3);
}

/* Calculadora. Os ganchos data-pri-* / #sl-pri-qty sao lidos por
   initPricingSlider() em main.js; o JS grava --sl-fill no <input type=range>. */
.v3-calc {
	padding: 28px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 12px;
}
.v3-calc-title { font-size: 1.25rem; line-height: 1.25; }
.v3-calc-sub { margin: 8px 0 0; font-size: 14px; line-height: 1.5; color: var(--v3-ink-2); }

.v3-calc-qty {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 12px;
	margin-top: 26px;
}
.v3-calc-qty label { font-size: 14px; font-weight: 500; color: var(--v3-ink-2); }
.v3-calc-qty output {
	font-family: var(--v3-mono);
	font-size: 26px;
	font-weight: 500;
	font-variant-numeric: tabular-nums;
	color: var(--v3-ink);
}

/* Trilho do slider: as duas cores sao funcao (preenchido/vazio), nao enfeite. */
.v3-calc-range,
input[type="range"].v3-calc-range,
[data-theme="light"] input[type="range"].v3-calc-range {
	-webkit-appearance: none;
	appearance: none;
	width: 100%;
	height: 4px;
	margin: 12px 0 8px;
	border: 0;
	border-radius: 2px;
	background: linear-gradient(to right, var(--v3-brand) 0, var(--v3-brand) var(--sl-fill, 12%), var(--v3-line) var(--sl-fill, 12%), var(--v3-line) 100%);
	outline: none;
	cursor: pointer;
}
.v3-calc-range::-webkit-slider-thumb {
	-webkit-appearance: none;
	width: 20px;
	height: 20px;
	border-radius: 50%;
	background: var(--v3-card);
	border: 2px solid var(--v3-brand);
	cursor: grab;
}
.v3-calc-range::-moz-range-thumb {
	width: 20px;
	height: 20px;
	border-radius: 50%;
	background: var(--v3-card);
	border: 2px solid var(--v3-brand);
	cursor: grab;
}
.v3-calc-range:focus-visible { outline: 2px solid var(--v3-brand); outline-offset: 6px; }
.v3-calc-bounds {
	display: flex;
	justify-content: space-between;
	font-family: var(--v3-mono);
	font-size: 12px;
	color: var(--v3-ink-3);
}

/* Plano inicial: valor FIXO por mes para quem tem poucos rastreadores. Fica
   colado nos limites do slider, que e onde o visitante ve o minimo de 20 e se
   pergunta o que acontece abaixo disso. */
.v3-calc-starter {
	margin: 14px 0 0;
	padding: 12px 14px;
	background: var(--v3-brand-soft);
	border-radius: 8px;
	font-size: 14px;
	line-height: 1.45;
	color: var(--v3-ink-2);
}
.v3-calc-starter strong {
	font-weight: 600;
	color: var(--v3-brand-text);
}

.v3-calc-results {
	display: grid;
	grid-template-columns: 1.3fr 1fr 1fr;
	gap: 12px;
	margin: 24px 0 0;
}
.v3-calc-result {
	padding: 14px 16px;
	border: 1px solid var(--v3-line);
	border-radius: 8px;
	background: var(--v3-page-alt);
}
.v3-calc-result--main { background: var(--v3-card); border-color: var(--v3-line-strong); }
.v3-calc-result dt { margin: 0; font-size: 13px; color: var(--v3-ink-3); }
.v3-calc-result dd {
	margin: 4px 0 0;
	display: flex;
	align-items: baseline;
	gap: 4px;
	font-family: var(--v3-mono);
	font-variant-numeric: tabular-nums;
	color: var(--v3-ink);
}
.v3-calc-result dd span { font-size: 13px; color: var(--v3-ink-3); }
.v3-calc-result dd strong { font-size: 22px; font-weight: 500; line-height: 1.1; }
.v3-calc-result--main dd strong { font-size: 30px; }
.v3-calc-result small { display: block; margin-top: 6px; font-size: 12px; color: var(--v3-ink-3); }

.v3-calc-foot {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 12px 18px;
	margin-top: 22px;
	padding-top: 20px;
	border-top: 1px solid var(--v3-line);
}
.v3-calc-hint { font-size: 13px; line-height: 1.4; color: var(--v3-ink-3); }

@media (max-width: 1000px) {
	.v3-hero-grid { grid-template-columns: minmax(0, 1fr); gap: 40px; }
	.v3-hero { padding: 56px 0 64px; }
}
@media (max-width: 720px) {
	.v3-hero { padding: 40px 0 56px; }
	.v3-calc { padding: 22px; }
	.v3-calc-results { grid-template-columns: minmax(0, 1fr); }
	.v3-hero-ctas .v3-btn { width: 100%; }
}

@media (prefers-reduced-motion: reduce) {
	*, *::before, *::after {
		animation-duration: .001ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: .001ms !important;
	}
}


/* --------------------------------------------------------------------------
   6. Secoes da home (CSS devolvido por cada agente, na ordem da pagina)
   -------------------------------------------------------------------------- */

/* === personas === */
/* --------------------------------------------------------------------------
   Personas (home, #personas): para quem e a plataforma.

   No celular e um empilhamento simples: primeiro a narrativa (h2, lede,
   estatisticas, botao), depois os dois cartoes em fluxo normal, um abaixo do
   outro. A partir de 1001px vira duas colunas, a dos cartoes um pouco maior,
   e os cartoes passam a ser absolutos e escalonados, um sobrepondo o outro.
   -------------------------------------------------------------------------- */
.v3-personas-grid {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: 40px;
	align-items: center;
}

/* Coluna dos cartoes. No celular e so uma pilha vertical, sem sobreposicao. */
.v3-personas-stack {
	display: grid;
	gap: 20px;
}

/* O cabecalho mora dentro da coluna da narrativa: sem o teto de 680px e sem a
   margem de cabecalho de secao (quem espaca e a barra das estatisticas). */
.v3-personas-head {
	max-width: none;
	margin-bottom: 0;
}

.v3-personas-acao { margin-top: 30px; }

/* Quadro da imagem no topo do cartao. E o mesmo com foto ou sem foto. */
.v3-personas-img {
	display: block;
	width: 100%;
	aspect-ratio: 16 / 10;
	object-fit: cover;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 8px;
}

/* Sem imagem no Customizer: retangulo liso dizendo onde subir o arquivo. */
.v3-personas-img--vazia {
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 16px;
	font-family: var(--v3-mono);
	font-size: 12px;
	line-height: 1.5;
	text-align: center;
	text-wrap: balance;
	color: var(--v3-ink-3);
}

/* Linha de destaque do cartao: o unico texto laranja da secao. */
.v3-personas-hl {
	margin: -4px 0 0;
	font-size: 14px;
	font-weight: 600;
	line-height: 1.4;
	color: var(--v3-brand-text);
}

/* Botao sempre no rodape do cartao, mesmo com textos de alturas diferentes. */
.v3-personas-card .v3-card-actions {
	margin-top: auto;
	padding-top: 8px;
}

/* Duas estatisticas, agora dentro da narrativa. */
.v3-personas-stats {
	display: flex;
	flex-wrap: wrap;
	gap: 24px 56px;
	margin-top: 32px;
	padding-top: 24px;
	border-top: 1px solid var(--v3-line);
}
.v3-personas-stat {
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.v3-personas-stat-n {
	font-family: var(--v3-display);
	font-weight: 700;
	font-variation-settings: "wdth" 106, "wght" 700;
	font-size: clamp(1.6rem, 2.6vw, 2.1rem);
	line-height: 1.05;
	letter-spacing: -.02em;
	color: var(--v3-brand);
}
.v3-personas-stat-l {
	font-size: 13px;
	line-height: 1.4;
	color: var(--v3-ink-3);
}

/* --------------------------------------------------------------------------
   Desktop: duas colunas e os dois cartoes escalonados.
   -------------------------------------------------------------------------- */
@media (min-width: 1001px) {

	.v3-personas-grid {
		grid-template-columns: minmax(0, 1.08fr) minmax(0, .92fr);
		gap: 56px;
	}

	/* A narrativa vem antes no HTML (para a secao abrir pelo h2 no celular e
	   para quem usa leitor de tela); aqui a coluna dos cartoes volta para a
	   esquerda e a narrativa para a direita. */
	.v3-personas-narrativa { grid-column: 2; grid-row: 1; }

	/* Os dois cartoes sao absolutos, entao a altura da coluna vem daqui. O de
	   cima cresce para baixo a partir do topo e o de baixo cresce para cima a
	   partir da base: texto maior aumenta a sobreposicao em vez de vazar para
	   a secao seguinte. Com imagem 16/10 o cartao fica em torno de 500px, o
	   que deixa cerca de 200px de sobreposicao. */
	.v3-personas-stack {
		display: block;
		position: relative;
		grid-column: 1;
		grid-row: 1;
		min-height: 800px;
		--v3-personas-sombra:      0 8px 24px rgba(17, 24, 39, .08);
		--v3-personas-sombra-alta: 0 14px 30px rgba(17, 24, 39, .13);
	}
	:root:not([data-theme="light"]) .v3-personas-stack {
		--v3-personas-sombra:      0 8px 24px rgba(0, 0, 0, .45);
		--v3-personas-sombra-alta: 0 14px 30px rgba(0, 0, 0, .55);
	}

	/* A unica sombra do padrao sobrio, e ela e funcional: cartao branco sobre
	   cartao branco so le como pilha com ela. Preta, nunca colorida. */
	.v3-personas-card {
		position: absolute;
		width: 78%;
		box-shadow: var(--v3-personas-sombra);
		transition: transform .18s ease, border-color .18s ease, box-shadow .18s ease;
	}
	.v3-personas-card--topo { top: 0; left: 0; z-index: 2; }
	.v3-personas-card--base { right: 0; bottom: 0; z-index: 1; }

	/* focus-within junto do hover: quem chega de teclado ao botao do cartao de
	   baixo tambem o traz para a frente. */
	.v3-personas-card:hover,
	.v3-personas-card:focus-within {
		z-index: 3;
		border-color: var(--v3-line-strong);
		box-shadow: var(--v3-personas-sombra-alta);
	}
	.v3-personas-card:hover { transform: translateY(-4px); }
}

/* Entre 1001 e 1200px a coluna e mais estreita e o cartao encolhe junto. */
@media (min-width: 1001px) and (max-width: 1200px) {
	.v3-personas-stack { min-height: 760px; }
}

@media (max-width: 720px) {
	.v3-personas-grid { gap: 32px; }
	.v3-personas-stats {
		gap: 22px 36px;
		margin-top: 26px;
	}
	.v3-personas-stat { flex: 1 1 40%; }
	.v3-personas-acao .v3-btn { width: 100%; }
}

@media (prefers-reduced-motion: reduce) {
	.v3-personas-card { transition: none; }
	.v3-personas-card:hover { transform: none; }
}

/* === bento === */
/* Recursos (#recursos): o que a sua empresa recebe. As classes prontas
   (.v3-card, .v3-card-list, .v3-card-meta, .v3-card-actions) bastam;
   so o titulo de cada item da lista fica em linha propria. */
.v3-recursos-list strong {
	display: block;
	margin-bottom: 2px;
	color: var(--v3-ink);
}

/* === features === */
/* Funcionalidades (home): icone da marca no topo do card + rodape com o botao.
   O resto do card usa .v3-card / .v3-card-title / -text / -meta e a grade
   usa .v3-grid-3, sem regra propria. */

.v3-feat-icon {
	display: grid;
	place-items: center;
	align-self: flex-start;
	flex: none;
	width: 40px;
	height: 40px;
	margin-bottom: 4px;
	border-radius: 8px;
	background: var(--v3-brand-soft);
	color: var(--v3-brand);
	transition: background-color .15s ease, color .15s ease;
}
.v3-feat-icon svg {
	display: block;
	width: 20px;
	height: 20px;
}
.v3-card:hover .v3-feat-icon {
	background: var(--v3-brand);
	color: #fff;
}

.v3-features-more {
	margin-top: 32px;
}

@media (max-width: 720px) {
	.v3-features-more {
		margin-top: 24px;
	}
	.v3-features-more .v3-btn {
		width: 100%;
	}
}

@media (prefers-reduced-motion: reduce) {
	.v3-feat-icon {
		transition: none;
	}
}

/* === logos === */
/* --------------------------------------------------------------------------
   Rastreadores compativeis (template-parts/section-logos.php)
   Cabecalho centralizado + MARQUEE de logos em loop continuo (excecao de
   movimento sancionada na DIRECAO_V3.md, "Tchan tecnologico", item 1).
   Receita do tema antigo reescrita em .v3-: trilho com a lista duplicada
   (copias extras aria-hidden), width max-content, translateX de 0 a -50%
   em 36s, pausa no hover do marquee, mascara de fade nas duas bordas.
   O espacamento entre logos e padding SIMETRICO no item, de proposito:
   com gap no flex a dobra de -50% cai meio gap fora do limite do item e o
   loop da um pulinho; com padding a dobra fecha exata. Nao trocar por gap.
   A mascara usa transparent/#000 porque em mask so o canal alfa conta
   (nao e cor renderizada, entao nao passa por var(--v3-*)).
   Logos continuam cinza acendendo no hover do proprio logo.
   -------------------------------------------------------------------------- */

/* unica secao da home com cabecalho centralizado, porque o marquee abaixo e centralizado */
.v3-head--centro {
	max-width: 720px;
	margin-left: auto;
	margin-right: auto;
	text-align: center;
}

.v3-logos-marquee {
	overflow: hidden;
	/* Fade curto de proposito: com o cartao maior, os 8% de antes apagavam quase
	   um cartao inteiro em cada ponta e dava a impressao de logo desbotado. */
	mask-image: linear-gradient(90deg, transparent 0, #000 4%, #000 96%, transparent 100%);
	-webkit-mask-image: linear-gradient(90deg, transparent 0, #000 4%, #000 96%, transparent 100%);
}

.v3-logos-track {
	display: flex;
	align-items: center;
	width: max-content;
	margin: 0;
	padding: 0;
	list-style: none;
	animation: v3-logos-scroll 36s linear infinite;
	will-change: transform;
}

.v3-logos-marquee:hover .v3-logos-track {
	animation-play-state: paused;
}

@keyframes v3-logos-scroll {
	from { transform: translateX(0); }
	to   { transform: translateX(-50%); }
}

/* O espacamento entre os cards e padding do ITEM (nunca gap: veja a nota do
   bloco acima). O card tem tamanho FIXO: e o que faz logos de proporcoes
   diferentes aparecerem todos do mesmo tamanho. */
.v3-logos-item {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	padding: 0 8px;
}

.v3-logos-card {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 216px;
	height: 124px;
	padding: 0 18px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
	transition: border-color .2s ease;
}

.v3-logos-item:hover .v3-logos-card,
.v3-logos-item:focus-within .v3-logos-card {
	border-color: var(--v3-line-strong);
}

/* Os arquivos que o admin sobe vao de 1:1 (queclink, lkgps) a 4,7:1 (oneblock).
   Com um teto de altura baixo, o logo quadrado saia minusculo perto do largo:
   era o que estava errado, e o teto de 38px de antes deixava queclink em
   38x38 dentro de um cartao de 184x96.

   A caixa aqui e generosa nos DOIS eixos e o object-fit resolve: o quadrado
   bate no teto de altura (80px) e o largo bate no de largura (180px = 216
   menos o padding). Vale saber que alguns arquivos (queclink, maxtrack,
   coban) trazem margem transparente embutida e por isso continuam parecendo
   menores que os outros; isso e do arquivo, nao do CSS, e so se resolve
   recortando o PNG. */
.v3-logos-item img {
	display: block;
	width: auto;
	max-width: 100%;
	max-height: 80px;
	object-fit: contain;
	filter: grayscale(1);
	opacity: .62;
	transition: filter .2s ease, opacity .2s ease;
}

.v3-logos-item:hover img,
.v3-logos-item:focus-within img {
	filter: grayscale(0);
	opacity: 1;
}

/* em tela sem mouse o hover nunca acontece: sobe o piso para o logo continuar legivel */
@media (hover: none) {
	.v3-logos-item img { opacity: .75; }
}

.v3-logos-cta {
	margin-top: 44px;
	text-align: center;
}

@media (max-width: 720px) {
	.v3-logos-item { padding: 0 6px; }
	.v3-logos-card { width: 164px; height: 92px; padding: 0 16px; }
	.v3-logos-item img { max-height: 56px; }
	.v3-logos-cta { margin-top: 32px; }
	.v3-logos-cta .v3-btn { width: 100%; }
}

/* sem movimento: o trilho vira galeria parada com quebra de linha e as copias somem */
@media (prefers-reduced-motion: reduce) {
	.v3-logos-track {
		animation: none;
		width: auto;
		flex-wrap: wrap;
		justify-content: center;
		row-gap: 28px;
	}
	.v3-logos-item[aria-hidden="true"] { display: none; }
	.v3-logos-item img,
	.v3-logos-card { transition: none; }
}

/* === bignum === */
/* --------------------------------------------------------------------------
   Disponibilidade (template-parts/section-bignum.php): painel de
   monitoramento COMPACTO que SEGUE O TEMA (tokens --v3-panel-*: claros no
   claro, escuros no escuro). Uma faixa: numero a esquerda, tres aneis a
   direita, batimento + assinatura numa linha so no rodape.
   Movimento sancionado (Tchan tecnologico), desligado em reduced-motion:
   pulso do ponto, EKG por stroke-dashoffset, cursor piscando, contador
   [data-sl-count] do main.js.
   -------------------------------------------------------------------------- */
.v3-uptime-panel {
	background: var(--v3-panel-bg);
	border: 1px solid var(--v3-panel-line);
	border-radius: 14px;
	padding: 18px 24px 12px;
	color: var(--v3-panel-ink);
}

.v3-uptime-panel-top {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 8px 20px;
	padding-bottom: 12px;
	border-bottom: 1px solid var(--v3-panel-line);
}

@keyframes v3-uptime-pulse {
	0%, 100% { opacity: 1; }
	50%      { opacity: .35; }
}

.v3-uptime-live {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	font-family: var(--v3-mono);
	font-size: 11px;
	line-height: 1.2;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--v3-panel-ink-dim);
}
.v3-uptime-live .v3-status-dot {
	flex: 0 0 auto;
	animation: v3-uptime-pulse 2.4s ease-in-out infinite;
}

.v3-uptime-clock {
	font-family: var(--v3-mono);
	font-size: 11px;
	line-height: 1.2;
	color: var(--v3-panel-ink-mut);
}

/* Numero e servidores lado a lado: e o que corta a altura pela metade. */
.v3-uptime-grid {
	display: grid;
	grid-template-columns: minmax(0, .85fr) minmax(0, 2.15fr);
	gap: 10px 44px;
	align-items: center;
	padding: 16px 0 6px;
}

.v3-uptime-big { margin: 0; }

.v3-uptime-big-value {
	margin: 0;
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: clamp(2.3rem, 3.4vw, 3rem);
	font-weight: 600;
	line-height: 1;
	letter-spacing: -.02em;
	font-variant-numeric: tabular-nums;
	color: var(--v3-brand);
}

.v3-uptime-big-legend {
	margin: 8px 0 0;
	font-size: 13px;
	line-height: 1.45;
	color: var(--v3-panel-ink-dim);
	text-wrap: pretty;
}

.v3-uptime-list {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 8px;
	margin: 0;
	padding: 0;
	list-style: none;
}

.v3-uptime-row {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 2px;
	padding: 8px 6px;
	border-radius: 10px;
	text-align: center;
	transition: background-color .6s ease;
}
/* O JS acende .is-updated por ~1,4s quando o valor muda; acende e apaga sozinho. */
.v3-uptime-row.is-updated { background: var(--v3-brand-soft); }

.v3-uptime-ring {
	position: relative;
	display: grid;
	place-items: center;
	margin-bottom: 3px;
}
.v3-uptime-ring-svg {
	display: block;
	width: 72px;
	height: 72px;
	transform: rotate(-90deg);
}
.v3-uptime-ring-bg,
.v3-uptime-ring-arc { stroke-width: 9; }
.v3-uptime-ring-bg  { stroke: var(--v3-panel-line); }
.v3-uptime-ring-arc { stroke: var(--v3-ok); }

/* O valor vive DENTRO do anel. O span interno e o gancho do initLiveStatus
   (.sl-server-uptime-value), que o main-final pinta em fonte display teal:
   o reset escopado desfaz so aqui. */
.v3-uptime-srv-val {
	position: absolute;
	inset: 0;
	display: grid;
	place-items: center;
}
.v3-uptime-srv-val,
.v3-uptime-row .v3-uptime-srv-val .sl-server-uptime-value {
	font-family: var(--v3-mono) !important;
	font-size: 11.5px;
	font-weight: 500;
	letter-spacing: -.02em;
	color: var(--v3-panel-ink) !important;
	background: none !important;
	-webkit-text-fill-color: currentColor !important;
}

.v3-uptime-row-label {
	font-family: var(--v3-mono);
	font-size: 12.5px;
	font-weight: 500;
	line-height: 1.3;
	color: var(--v3-panel-ink);
}

.v3-uptime-row-sub {
	font-size: 12px;
	line-height: 1.35;
	color: var(--v3-panel-ink-dim);
}

/* Sparkline: nasce escondido; o initLiveStatus escreve os pontos quando ha
   historico no navegador. O main-final mata .sl-status-spark com !important
   (era a barra do topo antigo); o display block escopado desfaz. */
.v3-uptime-spark {
	display: none;
	width: 44px;
	height: 12px;
	margin-top: 2px;
	color: var(--v3-brand);
}
.v3-uptime-spark:has(polyline:not([points=""])) { display: inline-flex; }
.v3-uptime-spark .sl-status-spark {
	display: block !important;
	width: 100%;
	height: 100%;
	filter: none;
}
.v3-uptime-spark .sl-status-spark polyline {
	fill: none;
	stroke: currentColor;
	stroke-width: 1.5;
}

.v3-uptime-row-status {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-size: 12px;
	color: var(--v3-panel-ink-dim);
}
.v3-uptime-panel .v3-uptime-row[data-status="down"] .v3-status-dot,
.v3-uptime-panel .v3-uptime-row[data-status="degraded"] .v3-status-dot,
.v3-uptime-panel .v3-uptime-row[data-status="maintenance"] .v3-status-dot { background: var(--v3-panel-ink-mut); }

/* Rodape do painel: batimento e assinatura na MESMA linha. */
.v3-uptime-tail {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 8px 18px;
	margin-top: 10px;
	padding-top: 10px;
	border-top: 1px solid var(--v3-panel-line);
}

@keyframes v3-uptime-ekg {
	from { stroke-dashoffset: 100; }
	to   { stroke-dashoffset: 0; }
}
.v3-uptime-ekg {
	flex: 1 1 220px;
	min-width: 0;
}
.v3-uptime-ekg-svg {
	display: block;
	width: 100%;
	height: 16px;
	opacity: .45;
}
.v3-uptime-ekg-line {
	stroke: var(--v3-ok);
	stroke-width: 1.5;
	stroke-linecap: round;
	vector-effect: non-scaling-stroke;
	stroke-dasharray: 16 84;
	animation: v3-uptime-ekg 7s linear infinite;
}

.v3-uptime-source {
	margin: 0;
	flex: none;
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-family: var(--v3-mono);
	font-size: 12px;
	color: var(--v3-panel-ink-mut);
}
@keyframes v3-uptime-blink { to { visibility: hidden; } }
.v3-uptime-cursor {
	width: 7px;
	height: 12px;
	background: var(--v3-panel-ink-mut);
	animation: v3-uptime-blink 1.1s steps(2, start) infinite;
}

.v3-uptime-foot { margin: 14px 0 0; }

@media (max-width: 1000px) {
	.v3-uptime-grid {
		grid-template-columns: minmax(0, 1fr);
		gap: 14px;
		padding: 14px 0 4px;
	}
}

@media (max-width: 720px) {
	.v3-uptime-panel { padding: 14px 16px 10px; }
	.v3-uptime-list { gap: 4px; }
	.v3-uptime-ring-svg { width: 60px; height: 60px; }
	.v3-uptime-row-label { font-size: 11.5px; }
	.v3-uptime-row-sub { font-size: 11px; }
}

@media (prefers-reduced-motion: reduce) {
	.v3-uptime-live .v3-status-dot { animation: none; }
	.v3-uptime-ekg-line { animation: none; stroke-dasharray: none; }
	.v3-uptime-cursor { animation: none; }
	.v3-uptime-row { transition: none; }
}

/* === faq === */
/* --------------------------------------------------------------------------
   FAQ (home, planos, contato): lista de <details> separados por hairline.
   Sinal + / – e feito em ::after, sem rotacao nem animacao.
   -------------------------------------------------------------------------- */
.v3-faq-wrap { max-width: 800px; }

.v3-faq-item { border-top: 1px solid var(--v3-line); }
.v3-faq-item:last-child { border-bottom: 1px solid var(--v3-line); }

.v3-faq-q {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 20px;
	padding: 18px 0;
	list-style: none;
	font-family: var(--v3-body);
	font-weight: 600;
	font-size: 16px;
	line-height: 1.4;
	color: var(--v3-ink);
	cursor: pointer;
}
.v3-faq-q::-webkit-details-marker { display: none; }
.v3-faq-q::after {
	content: "+";
	flex: none;
	font-family: var(--v3-mono);
	font-weight: 400;
	font-size: 18px;
	line-height: 1.2;
	color: var(--v3-ink-3);
}
.v3-faq-item[open] > .v3-faq-q::after { content: "\2013"; }

.v3-faq-a {
	max-width: 68ch;
	padding: 0 0 18px;
	font-size: 15px;
	line-height: 1.6;
	color: var(--v3-ink-2);
}

.v3-faq-more { margin: 24px 0 0; font-size: 15px; }

@media (max-width: 720px) {
	.v3-faq-q { padding: 16px 0; gap: 14px; }
	.v3-faq-a { padding-bottom: 16px; }
}

/* === cta === */
/* Chamada final da home (template-parts/section-cta.php) */
.v3-cta-box { max-width: 760px; }
.v3-cta-box .v3-head { max-width: none; margin-bottom: 28px; }
.v3-cta-actions { display: flex; flex-wrap: wrap; gap: 12px; }
.v3-cta-note {
	margin: 18px 0 0;
	font-size: 14px;
	line-height: 1.5;
	/* Cinza forte: as duas notas ficam sobre --v3-page-alt, onde o --v3-ink-3
	   normal da 4,47:1 e reprova por pouco. */
	color: var(--v3-ink-3-strong);
}

@media (max-width: 720px) {
	.v3-cta-actions .v3-btn { width: 100%; }
}


/* --------------------------------------------------------------------------
   7. Ajustes pos-render (primeira rodada de fotos)
   -------------------------------------------------------------------------- */
/* Icone do toggle: o CSS antigo empilha sol e lua por grid e esconde por opacity. */
.sl-theme-toggle svg {
	opacity: 1 !important;
	transform: none !important;
	grid-area: auto !important;
	position: static !important;
	width: 18px;
	height: 18px;
}

/* Marca SVG de fallback (sem logo no Customizer): parada. */
.sl-brand-mark,
.sl-brand-lockup:hover .sl-brand-mark {
	animation: none !important;
	transform: none !important;
}

/* Preco na fonte de titulo: em mono a virgula ganhava uma cela inteira ("3 , 00"). */
.v3-calc-result dd strong {
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 100, "wght" 600;
	letter-spacing: -.01em;
}

/* Titulos das colunas do rodape: texto normal, nao mono em caixa alta. */
.sl-footer-col h4 {
	font-family: var(--v3-body) !important;
	font-size: 14px !important;
	font-weight: 600 !important;
	letter-spacing: 0 !important;
	text-transform: none !important;
	color: var(--v3-ink) !important;
}

/* Banner de cookies: cartao branco com borda, sem blur, sem seta. */
.sl-cookies { backdrop-filter: none !important; -webkit-backdrop-filter: none !important; }
.sl-cookies {
	background: var(--v3-card) !important;
	background-image: none !important;
	color: var(--v3-ink) !important;
	border: 1px solid var(--v3-line) !important;
	border-radius: 10px !important;
	box-shadow: var(--v3-shadow-menu) !important;
	backdrop-filter: none !important;
	-webkit-backdrop-filter: none !important;
}
.sl-cookies-title { font-family: var(--v3-body) !important; font-weight: 600 !important; color: var(--v3-ink) !important; }
.sl-cookies-text { color: var(--v3-ink-2) !important; }
.sl-cookies-text a { color: var(--v3-ink) !important; text-decoration: underline; text-underline-offset: 3px; }
.sl-cookies-cat { color: var(--v3-ink-2) !important; }
.sl-cookies-btn {
	border-radius: 8px !important;
	box-shadow: none !important;
	transform: none !important;
	font-family: var(--v3-body) !important;
	font-weight: 600 !important;
	background-image: none !important;
}
.sl-cookies-btn--primary { background: var(--v3-brand) !important; color: #fff !important; border: 1px solid transparent !important; }
.sl-cookies-btn--primary:hover { background: var(--v3-brand-hover) !important; }
.sl-cookies-btn--ghost { background: transparent !important; color: var(--v3-ink) !important; border: 1px solid var(--v3-line-strong) !important; }


/* --------------------------------------------------------------------------
   8. Revisao adversarial (5 lentes + ceticos): o que sobreviveu
   -------------------------------------------------------------------------- */
html { scroll-padding-top: 84px; }

/* Enfeites que o main-final ainda gerava por pseudo-elemento ou por JS. */
.sl-nav-link::after,
.sl-nav-dropdown-item::before,
.sl-nav-dropdown-item::after,
.sl-theme-toggle::before,
.sl-scroll-bar,
.sl-copies-toast,
.sl-mobile-drawer-link::before,
.sl-mobile-drawer-arrow,
.sl-footer-col a::after,
.sl-btn-arrow::after,
.sl-persona-hero::before,
.sl-persona-hero::after,
.sl-plat-hero-who,
.sl-plat-bridge-eyebrow,
.sl-contact-mapsplit-eyebrow {
	content: none !important;
	display: none !important;
}

/* Menu no tema claro: as variantes [data-theme="light"] do main-final venciam. */
[data-theme="light"] .sl-nav-link { color: var(--v3-ink-2); }
[data-theme="light"] .sl-nav-link:hover { color: var(--v3-ink); background: var(--v3-page-alt); }
[data-theme="light"] .sl-nav-item.is-active > .sl-nav-link,
[data-theme="light"] .sl-nav-link[aria-current="page"] { color: var(--v3-ink); background: none; }

/* O botao "Area do cliente" precisa de entrada PROPRIA aqui, e nao e
   duplicacao: as tres regras logo acima tem a mesma especificidade das regras
   do botao (secao 3, perto do .sl-nav-item--cta) e vem DEPOIS delas no
   arquivo, entao no tema claro elas venciam.
   O que quebrava, medido antes do conserto: o texto do botao saia em
   rgb(75,85,99) sobre o laranja rgb(241,96,0), e na propria pagina da area do
   cliente o "background: none" do item ativo apagava o preenchimento inteiro.
   Cada linha abaixo responde a uma daquelas tres. */
[data-theme="light"] .sl-nav-item--cta > .sl-nav-link { color: #fff; }
[data-theme="light"] .sl-nav-item--cta > .sl-nav-link:hover {
	color: #fff;
	background: var(--v3-brand-hover);
}
[data-theme="light"] .sl-nav-item--cta.is-active > .sl-nav-link {
	color: #fff;
	border-radius: 8px;
	background: var(--v3-brand-hover);
}
[data-theme="light"] .sl-nav-dropdown {
	background: var(--v3-card);
	border-color: var(--v3-line);
	box-shadow: var(--v3-shadow-menu);
	backdrop-filter: none;
	-webkit-backdrop-filter: none;
}
[data-theme="light"] .sl-nav-dropdown-item:hover,
.sl-nav-dropdown-item:hover { background: var(--v3-page-alt); color: var(--v3-ink); }
[data-theme="light"] .sl-nav-dropdown-text strong { color: var(--v3-ink); }
[data-theme="light"] .sl-nav-dropdown-text small { color: var(--v3-ink-3); }

.sl-theme-toggle:hover,
:root[data-theme="light"] .sl-theme-toggle:hover {
	background: none;
	border-color: var(--v3-line-strong);
	color: var(--v3-ink);
}
.sl-theme-toggle:focus-visible,
:root[data-theme="light"] .sl-theme-toggle:focus-visible { outline-color: var(--v3-brand); }

/* Logo igual parado ou rolado; marca de fallback sem caixa, brilho ou shimmer. */
.sl-brand-logo,
.sl-header.is-scrolled .sl-brand-logo,
.sl-header.is-scrolled .sl-brand-lockup img { height: 36px; max-height: 36px; width: auto; transition: none; }
.sl-brand-mark,
.sl-header.is-scrolled .sl-brand-mark {
	width: 30px;
	height: auto;
	filter: none !important;
	background: none !important;
	border: 0 !important;
	border-radius: 0 !important;
	transition: none;
}
.sl-brand-lockup:hover .sl-brand-name {
	background: none !important;
	-webkit-text-fill-color: currentColor !important;
	color: var(--v3-ink) !important;
	animation: none !important;
}
.sl-magnetic:active,
.sl-brand-lockup.sl-magnetic:active,
.sl-btn-primary.sl-magnetic:active { transform: none !important; }

/* Gaveta mobile: sem seta teal, sem giro no fechar, botao Tema em texto normal. */
.sl-mobile-drawer-close { border-color: var(--v3-line) !important; color: var(--v3-ink-2) !important; border-radius: 8px !important; }
.sl-mobile-drawer-close:hover { background: var(--v3-page-alt) !important; border-color: var(--v3-line-strong) !important; color: var(--v3-ink) !important; transform: none !important; }
.sl-mobile-drawer-cta:hover { transform: none !important; }
.sl-mobile-drawer-theme { font-family: var(--v3-body) !important; font-size: 14px !important; font-weight: 500 !important; letter-spacing: 0 !important; }

/* Rodape: links e icones sociais sem seta, sem salto, sem laranja. */
.sl-footer-col a,
.sl-footer-col a:hover { transform: none !important; }
.sl-footer-social a { background: none !important; border-color: var(--v3-line) !important; color: var(--v3-ink-2) !important; }
.sl-footer-social a:hover { background: var(--v3-page-alt) !important; border-color: var(--v3-line-strong) !important; color: var(--v3-ink) !important; transform: none !important; }

/* Banner de cookies, painel "Personalizar": texto que ficava branco sobre branco. */
.sl-cookies-custom { border-top-color: var(--v3-line) !important; }
.sl-cookies-custom h4 {
	font-family: var(--v3-body) !important;
	font-size: 14px !important;
	font-weight: 600 !important;
	letter-spacing: 0 !important;
	text-transform: none !important;
	color: var(--v3-ink) !important;
}
.sl-cookies-cat { border-bottom-color: var(--v3-line) !important; }
.sl-cookies-cat strong { color: var(--v3-ink) !important; }
.sl-cookies-cat small { color: var(--v3-ink-3) !important; }
.sl-cookies-text a { text-decoration: underline !important; text-underline-offset: 3px; }

/* Disponibilidade: o JS grava data-status no <li>; o ponto e o texto reagem. */
.v3-uptime-row[data-status="down"] .v3-status-dot,
.v3-uptime-row[data-status="degraded"] .v3-status-dot,
.v3-uptime-row[data-status="maintenance"] .v3-status-dot { background: var(--v3-ink-3); }
.v3-uptime-row[data-status="down"] .v3-uptime-row-status-text,
.v3-uptime-row[data-status="degraded"] .v3-uptime-row-status-text,
.v3-uptime-row[data-status="maintenance"] .v3-uptime-row-status-text { font-size: 0; }
.v3-uptime-row[data-status="down"] .v3-uptime-row-status-text::before,
.v3-uptime-row[data-status="degraded"] .v3-uptime-row-status-text::before,
.v3-uptime-row[data-status="maintenance"] .v3-uptime-row-status-text::before { font-size: 13px; }
.v3-uptime-row[data-status="down"] .v3-uptime-row-status-text::before { content: "fora do ar"; }
.v3-uptime-row[data-status="degraded"] .v3-uptime-row-status-text::before { content: "instável"; }
.v3-uptime-row[data-status="maintenance"] .v3-uptime-row-status-text::before { content: "em manutenção"; }

/* Paginas internas: o que a camada generica deixava ERRADO (nao so diferente). */
.sl-btn-arrow {
	color: var(--v3-ink) !important;
	text-decoration: underline;
	text-decoration-color: var(--v3-line-strong);
	text-underline-offset: 3px;
}
.sl-btn-arrow:hover { color: var(--v3-ink) !important; text-decoration-color: var(--v3-ink); }
.sl-page-hero h1 { letter-spacing: -.025em; }
.sl-s-head h2 { letter-spacing: -.02em; }
.sl-tier.is-highlighted { border-color: var(--v3-brand) !important; box-shadow: inset 0 0 0 1px var(--v3-brand) !important; }
.sl-tier.is-highlighted .sl-tier-cta { background: var(--v3-brand) !important; color: #fff !important; box-shadow: none !important; }
.sl-pft-panel { background: none !important; border: 0 !important; }
.sl-hist-panel, .sl-rep-panel { background: var(--v3-card) !important; border: 0 !important; border-radius: 0 !important; }
.sl-sim-panel { background: var(--v3-card) !important; border: 0 !important; border-left: 1px solid var(--v3-line) !important; border-radius: 0 !important; }
.sl-contact-mapsplit-left { padding-left: max(1.5rem, calc((100vw - 1200px) / 2 + 1.5rem)) !important; }
.sl-screen-tag {
	background: none !important;
	border: 0 !important;
	padding: 0 !important;
	color: var(--v3-ink-3) !important;
	font-family: var(--v3-mono) !important;
	font-size: 12px !important;
	letter-spacing: 0 !important;
	text-transform: none !important;
}
.sl-screen-tag::before, .sl-screen-tag::after { display: none !important; }
.sl-roi-card-value, .sl-roi-annual-value {
	background: none !important;
	-webkit-text-fill-color: currentColor !important;
	color: var(--v3-ink) !important;
}
.sl-sav-step {
	background: none !important;
	-webkit-text-fill-color: currentColor !important;
	color: var(--v3-ink-3) !important;
	font-family: var(--v3-mono) !important;
	font-size: 13px !important;
}
.sl-404-code, .sl-special-kicker {
	margin: 0 0 12px;
	font-family: var(--v3-mono);
	font-size: 13px;
	color: var(--v3-ink-3);
}

/* --------------------------------------------------------------------------
   9. Tchan tecnologico: simulador de faturamento e header que encolhe.
   Este bloco fica no FIM do arquivo de proposito: as regras do header
   precisam vencer a secao 3 e o bloco 8 pela ordem na cascata.
   -------------------------------------------------------------------------- */

/* === simulador === */
/* === calc-roi ===
   Simulador "quanto posso faturar" DOBRAVEL dentro da calculadora do hero
   (template-parts/section-hero.php), sancionado no item 4 do "Tchan
   tecnologico". E um <details> nativo: a abertura e instantanea de proposito
   (nada de animar altura), entao nao ha animacao a desligar; o kill-switch
   global de prefers-reduced-motion do v3.css cobre qualquer sobra.
   Reusa initRoiCalc() do main.js (IDs sl-roi-*) e o trilho .v3-calc-range. */

.v3-calc-roi {
	margin-top: 22px;
	border-top: 1px solid var(--v3-line);
}

/* Summary como linha convidativa (mesma receita do + / \2013 da FAQ). */
.v3-calc-roi-cta {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 20px;
	padding: 16px 0;
	list-style: none;
	font-family: var(--v3-body);
	font-size: 15px;
	font-weight: 600;
	line-height: 1.4;
	color: var(--v3-brand-text);
	cursor: pointer;
}
.v3-calc-roi-cta::-webkit-details-marker { display: none; }
.v3-calc-roi-cta::after {
	content: "+";
	flex: none;
	font-family: var(--v3-mono);
	font-weight: 400;
	font-size: 18px;
	line-height: 1.2;
	color: var(--v3-ink-3);
}
.v3-calc-roi[open] > .v3-calc-roi-cta::after { content: "\2013"; }

.v3-calc-roi-body { padding: 2px 0 18px; }

/* Controles compactos: label pequena + output mono na direita. */
.v3-calc-roi-field { margin: 6px 0 16px; }
.v3-calc-roi-field:last-of-type { margin-bottom: 4px; }
.v3-calc-roi-field-head {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 16px;
}
.v3-calc-roi-field-head label {
	font-size: 13px;
	font-weight: 500;
	color: var(--v3-ink-2);
}
.v3-calc-roi-field-head output {
	font-family: var(--v3-mono);
	font-size: 15px;
	font-weight: 500;
	font-variant-numeric: tabular-nums;
	color: var(--v3-ink);
	white-space: nowrap;
}
.v3-calc-roi-field .v3-calc-range { margin: 10px 0 0; }

/* Resultados em linhas, nao em cards. */
.v3-calc-roi-lines { margin: 18px 0 0; }
.v3-calc-roi-line {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	justify-content: space-between;
	gap: 2px 16px;
	padding: 9px 0;
	border-top: 1px solid var(--v3-line);
}
.v3-calc-roi-line:first-child { border-top: 0; }
.v3-calc-roi-line dt {
	margin: 0;
	font-size: 13px;
	color: var(--v3-ink-3);
}
.v3-calc-roi-line dd {
	margin: 0;
	font-family: var(--v3-mono);
	font-variant-numeric: tabular-nums;
	color: var(--v3-ink);
	white-space: nowrap;
}
.v3-calc-roi-line dd strong {
	font-size: 16px;
	font-weight: 500;
	line-height: 1.2;
}

/* Sub do custo total: quebra pra linha propria, mono 12px, discreta. */
.v3-calc-roi-sub {
	flex: 1 0 100%;
	font-family: var(--v3-mono);
	font-size: 12px;
	line-height: 1.5;
	color: var(--v3-ink-3);
	text-align: right;
}
.v3-calc-roi-sub span { color: var(--v3-ink-2); }
.v3-calc-roi-tier { color: var(--v3-ink-3); }

/* Margem: a linha mais forte do bloco, em laranja de texto (contraste AA). */
.v3-calc-roi-line--hl dt {
	font-weight: 600;
	color: var(--v3-brand-text);
}
.v3-calc-roi-line--hl dd,
.v3-calc-roi-line--hl dd strong { color: var(--v3-brand-text); }
.v3-calc-roi-line--hl dd strong { font-size: 20px; }
.v3-calc-roi-pct { font-size: 13px; }

.v3-calc-roi-foot {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 10px;
	margin-top: 18px;
}
.v3-calc-roi-note {
	margin: 0;
	font-size: 12px;
	line-height: 1.5;
	color: var(--v3-ink-3);
}

@media (max-width: 720px) {
	.v3-calc-roi-foot .v3-btn { width: 100%; text-align: center; }
}

@media (prefers-reduced-motion: reduce) {
	.v3-calc-roi,
	.v3-calc-roi-body { transition: none; animation: none; }
}

/* --------------------------------------------------------------------------
   10. Demo do produto (/conhecer-plataforma/)
   Vocabulario COMPARTILHADO pelas telas de demonstracao: o painel do
   dashboard, a demo interativa de cerca e os telefones. Todos falam estas
   classes, para que as telas parecam o mesmo sistema.

   Regra da rodada v3.5: a PAGINA e clara (contrato v3) e a TELA e escura,
   porque e uma captura do app, que e escuro. Dentro da tela o MAPA e claro,
   porque mapa de verdade e claro. Por isso os tokens --v3-demo-* e
   --v3-map-* nao aparecem no bloco do tema escuro: eles valem igual nos dois.

   O que saiu daqui de proposito, por ser o que dava cara de IA: grade neon,
   filtro de brilho, halo radial, linha de varredura e teal fluorescente.
   -------------------------------------------------------------------------- */

/* === demo do produto === */

.v3-demo {
	overflow: hidden;
	background: var(--v3-demo-bg);
	border: 1px solid var(--v3-demo-edge);
	border-radius: 10px;
	color: var(--v3-demo-ink);
	font-family: var(--v3-body);
	font-size: 13px;
	line-height: 1.45;
}

/* Barra de titulo da janela. Sem as tres bolinhas de macOS: e ruido. */
.v3-demo-chrome {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 9px 14px;
	background: var(--v3-demo-card);
	border-bottom: 1px solid var(--v3-demo-line);
}

.v3-demo-chrome-title {
	font-size: 12.5px;
	font-weight: 500;
	color: var(--v3-demo-ink-2);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

@keyframes v3-demo-pulse {
	0%, 100% { opacity: 1; }
	50%      { opacity: .3; }
}

.v3-demo-live {
	margin-left: auto;
	display: inline-flex;
	align-items: center;
	gap: 7px;
	flex: none;
	font-size: 11.5px;
	color: var(--v3-demo-ink-2);
}

.v3-demo-dot {
	width: 6px;
	height: 6px;
	flex: none;
	border-radius: 50%;
	background: var(--v3-demo-ok);
}
.v3-demo-live .v3-demo-dot { animation: v3-demo-pulse 2.4s ease-in-out infinite; }
.v3-demo-dot--warn  { background: var(--v3-demo-warn); }
.v3-demo-dot--alert { background: var(--v3-demo-alert); }
.v3-demo-dot--off   { background: var(--v3-demo-ink-3); }

/* Superficie do mapa. O fundo claro fica aqui e nao no SVG, para que a area
   continue clara mesmo enquanto o SVG ainda nao pintou. */
.v3-demo-map {
	position: relative;
	background: var(--v3-map-paper);
}

/* FILHO DIRETO de proposito. Como descendente, esta regra alcancava todo SVG
   empilhado por cima do mapa (icone de 11 a 20px em popup, botao e bolinha de
   notificacao) e o esticava para o quadro inteiro, porque width/height no
   <svg> sao atributos de apresentacao e perdem para qualquer folha de estilo.
   Eram 11 icones deformados. Os 6 mapas da pagina tem o SVG como filho
   direto, entao o ">" nao tira nada de quem depende da regra. */
.v3-demo-map > svg {
	display: block;
	width: 100%;
	height: 100%;
}

/* Anel de foco de quem fica POR CIMA do mapa claro. O anel laranja padrao da
   2,81:1 contra o papel do mapa e some. Aqui ele encosta no botao escuro (onde
   da 5,4:1) e ganha um fio escuro por fora, que separa o laranja de qualquer
   ladrilho embaixo. A sombra e pintada por baixo do outline, entao os 2px de
   dentro ficam laranja e os 2px de fora ficam escuros. */
.v3-demo-map :focus-visible {
	outline-offset: 0;
	box-shadow: 0 0 0 4px var(--v3-demo-bg);
}

/* Rotulo de rua desenhado dentro do SVG do mapa. */
.v3-map-label {
	font-family: var(--v3-body);
	font-size: 11px;
	font-weight: 500;
	fill: var(--v3-map-label);
}
.v3-map-label--pequeno { font-size: 9.5px; }

/* Painel lateral / rodape de dados dentro da tela. */
.v3-demo-aside {
	background: var(--v3-demo-card);
	border-left: 1px solid var(--v3-demo-line);
	padding: 14px;
}

.v3-demo-card {
	background: var(--v3-demo-card);
	border: 1px solid var(--v3-demo-line);
	border-radius: 8px;
	padding: 9px 11px;
}

/* Rotulo em caixa de sentenca, nunca em CAIXA ALTA com pontos separando:
   era o tique de IA mais repetido da pagina. */
.v3-demo-label {
	display: block;
	font-size: 11px;
	color: var(--v3-demo-ink-3);
}

.v3-demo-value {
	display: block;
	margin-top: 2px;
	font-family: var(--v3-mono);
	font-size: 13.5px;
	font-weight: 500;
	color: var(--v3-demo-ink);
}
.v3-demo-value--ok    { color: var(--v3-demo-ok); }
.v3-demo-value--warn  { color: var(--v3-demo-warn); }
.v3-demo-value--alert { color: var(--v3-demo-alert); }

.v3-demo-tag {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 3px 9px;
	border: 1px solid var(--v3-demo-line);
	border-radius: 6px;
	font-size: 11.5px;
	color: var(--v3-demo-ink-2);
}

.v3-demo-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 7px;
	padding: 8px 12px;
	background: transparent;
	border: 1px solid var(--v3-demo-line);
	border-radius: 7px;
	color: var(--v3-demo-ink);
	font-family: var(--v3-body);
	font-size: 12.5px;
	font-weight: 500;
	line-height: 1;
	cursor: pointer;
	transition: border-color .18s ease, background-color .18s ease;
}
.v3-demo-btn:hover:not(:disabled) { border-color: var(--v3-demo-ink-3); }
.v3-demo-btn:disabled { opacity: .4; cursor: default; }
.v3-demo-btn--primary {
	background: var(--v3-brand);
	border-color: var(--v3-brand);
	color: #fff;
}
.v3-demo-btn--primary:hover:not(:disabled) { background: var(--v3-brand-hover); border-color: var(--v3-brand-hover); }

.v3-demo-sep {
	height: 1px;
	margin: 12px 0;
	background: var(--v3-demo-line);
	border: 0;
}

/* Popup/toast que aparecem por cima da tela nas animacoes em loop. */
.v3-demo-pop {
	position: absolute;
	background: var(--v3-demo-card);
	border: 1px solid var(--v3-demo-line);
	border-radius: 9px;
	padding: 11px 13px;
}

.v3-demo-toast {
	position: absolute;
	display: inline-flex;
	align-items: center;
	gap: 8px;
	padding: 8px 12px;
	background: var(--v3-demo-card);
	border: 1px solid var(--v3-demo-line);
	border-radius: 8px;
	font-size: 12px;
	color: var(--v3-demo-ink);
}

@media (prefers-reduced-motion: reduce) {
	.v3-demo-live .v3-demo-dot { animation: none; }
	.v3-demo-btn { transition: none; }
}


/* --------------------------------------------------------------------------
   10c. Painel de rastreamento em modo AO VIVO (.v3-dash-live-*)

   Veste o bloco [data-livemap] que o template-parts/dashboard-mock.php emite
   quando sl_tour_live_map_ready() diz sim. No modo reserva nada disto existe
   no DOM: o mapa desenhado continua com as regras de .v3-demo-map e
   .v3-dash-map da secao 10b, intocadas.

   O assets/js/sl-live-map.js NAO foi alterado. Tudo que ele nao aceita por
   data-attribute (moldura do Google, gesto de rolagem) e resolvido aqui.
   -------------------------------------------------------------------------- */

/* Palco do mapa. Herda o tamanho de .v3-dash-map (flex 1 e min-height 400px,
   340 em tablet, 280 no celular), entao o container ja tem altura definida
   quando o Google Maps mede o div. A classe .v3-demo-map fica de fora de
   proposito (a regra dela, hoje `.v3-demo-map > svg`, foi escrita para o mapa
   desenhado, nao para a arvore do Google). O fundo do papel entra aqui. */
.v3-dash-live-stage {
	position: relative;
	overflow: hidden;
	background: var(--v3-map-paper);
}

/* Modo Mapbox: e so uma imagem. O object-fit corta pelas laterais em vez de
   esticar, porque a URL vem em 1200x600 e o palco do painel varia de largura.
   O credito e obrigatorio: a URL desliga o logo e a atribuicao do Mapbox. */
.v3-dash-shot {
	position: relative;
	overflow: hidden;
	background: var(--v3-map-paper);
}
.v3-dash-shot-img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}
/* O assets/js/v3.js poe .is-erro quando a imagem do Mapbox nao carrega (chave
   restrita a outro dominio, cota estourada). Sem isto sobrava um retangulo cor
   de papel no meio do painel, sem explicacao para ninguem. */
.v3-dash-shot.is-erro .v3-dash-shot-img,
.v3-dash-shot.is-erro .v3-dash-shot-credito { display: none; }

.v3-dash-shot.is-erro {
	display: grid;
	place-items: center;
	padding: 24px;
	background: var(--v3-demo-card);
	text-align: center;
}
.v3-dash-shot.is-erro::after {
	content: "O mapa não pôde ser carregado agora.";
	font-size: 13px;
	color: var(--v3-demo-ink-2);
}

.v3-dash-shot-credito {
	position: absolute;
	right: 6px;
	bottom: 5px;
	padding: 2px 6px;
	border-radius: 4px;
	background: rgba(255, 255, 255, .74);
	font-size: 10.5px;
	line-height: 1.4;
	color: var(--v3-map-label);
}

/* A superficie do mapa ocupa o palco inteiro. Absoluta, e nao 100%/100%, pra
   nunca depender de altura percentual herdada. */
.v3-dash-live-map {
	position: absolute;
	inset: 0;
}

/* Tela de demonstracao, nao ferramenta: o mapa nao recebe ponteiro.
   Isto resolve de uma vez o `gestureHandling: 'greedy'` que esta fixo dentro
   do sl-live-map.js e que, numa pagina longa, prenderia a rolagem do mouse e
   o arrasto de um dedo no celular. O mapa continua vivo, mexendo sozinho a
   cada 30 s. Quem quer explorar tem a pagina /mapa-ao-vivo/.
   Pra torna-lo interativo basta apagar esta unica declaracao, ciente da
   armadilha de rolagem. */
.v3-dash-live-map { pointer-events: none; }

/* Excecao obrigatoria: a atribuicao e os termos do Google continuam clicaveis
   e VISIVEIS. Escondê-los violaria os termos da API. */
.v3-dash-live-map .gm-style-cc,
.v3-dash-live-map a[href^="https://maps.google.com"],
.v3-dash-live-map a[href*="/maps/@"] { pointer-events: auto; }

/* Reset defensivo: o main-final.css tem um `img, svg, video { max-width:100%;
   height:auto; display:block }` global que nao pode encostar nos tiles nem
   nos icones que o Google injeta. */
.v3-dash-live-map img,
.v3-dash-live-map svg { max-width: none; }

/* Moldura do Google fora: tipo de mapa, zoom, tela cheia e street view. Numa
   janela de 400px de altura dentro de um card, isso e ruido. Nao da pra
   desligar por data-attribute (as opcoes estao fixas no initMap do JS), entao
   sai por CSS. */
.v3-dash-live-stage .gm-style-mtc,
.v3-dash-live-stage .gm-bundled-control,
.v3-dash-live-stage .gm-fullscreen-control,
.v3-dash-live-stage .gm-svpc { display: none !important; }

/* Estado de carga. O sl-live-map.js apaga este bloco com style.display='none'
   assim que o mapa nasce, e troca o conteudo por um aviso se a chave falhar. */
.v3-dash-live-loading {
	position: absolute;
	inset: 0;
	z-index: 2;
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 10px;
	padding: 16px;
	background: var(--v3-demo-bg);
	color: var(--v3-demo-ink-2);
	font-size: 12.5px;
	text-align: center;
}

.v3-dash-live-spinner {
	width: 16px;
	height: 16px;
	flex: none;
	border-radius: 50%;
	border: 2px solid var(--v3-demo-line);
	border-top-color: var(--v3-brand);
	animation: v3-dash-live-spin .8s linear infinite;
}

@keyframes v3-dash-live-spin {
	to { transform: rotate(360deg); }
}

/* Peças da pagina /mapa-ao-vivo/ que existem no DOM so pra satisfazer o
   querySelector do JS: busca, filtros e barra lateral. Escondidas, sem
   ocupar espaco e fora da ordem de foco (o aria-hidden esta no HTML). */
.v3-dash-live-off { display: none !important; }

/* Etiqueta da barra de titulo no modo ao vivo: o numero e escrito pelo JS em
   [data-livemap-count-total]. Numeros tabulares pra largura nao dancar a cada
   atualizacao. */
.v3-dash-live-badge strong {
	font-weight: 600;
	color: var(--v3-demo-ink);
	font-variant-numeric: tabular-nums;
}

@media (max-width: 1000px) {
	/* A etiqueta cresceu com o contador; no tablet ela quebra em vez de
	   espremer o titulo da janela. */
	.v3-dash-live-badge { white-space: normal; text-align: right; }
}

@media (prefers-reduced-motion: reduce) {
	.v3-dash-live-spinner { animation: none; }
}

/* --------------------------------------------------------------------------
   11. Plataforma (/conhecer-plataforma/): hero, abas e faixa de proximo passo
   Casca da pagina. Cada bloco abaixo foi escrito junto com o template-part
   que ele veste; o vocabulario compartilhado das telas esta na secao 10.
   O conteudo de cada aba traz o proprio bloco; a grade .v3-plat-grid e o card
   largo .v3-plat-card--wide vivem aqui porque os quatro paineis usam os dois.
   -------------------------------------------------------------------------- */

/* === plataforma: hero === */

.v3-plat-hero {
	padding: 72px 0 80px;
	border-bottom: 1px solid var(--v3-line);
}

.v3-plat-hero-grid {
	display: grid;
	grid-template-columns: minmax(0, 1.02fr) minmax(0, .98fr);
	gap: 48px;
	align-items: center;
}

/* Sem foto no Customizer: uma coluna so, centrada na pagina. O texto continua
   alinhado a esquerda, como manda o contrato. */
.v3-plat-hero-grid--solo {
	grid-template-columns: minmax(0, 1fr);
	max-width: 760px;
	margin-inline: auto;
}

.v3-plat-hero-title {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}

.v3-plat-hero-lede {
	max-width: 540px;
	margin: 22px 0 0;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-plat-hero-ctas {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 30px;
}

.v3-plat-hero-note {
	margin: 20px 0 0;
	font-size: 14px;
	line-height: 1.5;
	color: var(--v3-ink-3);
}

.v3-plat-hero-visual { min-width: 0; }

/* A foto antiga levava filter: drop-shadow(0 14px 32px rgba(0,0,0,.38)), que
   no tema claro virava uma mancha escura. Aqui e so a imagem com a borda do
   tema. */
.v3-plat-hero-img {
	display: block;
	width: 100%;
	height: auto;
	max-height: 520px;
	object-fit: contain;
	border-radius: 14px;
}

/* === plataforma: abas === */

/* O container de data-pft. Nao ganha estilo proprio: e so o escopo que o
   initPlatTabs do main.js procura. */
.v3-plat-tabs-root { min-width: 0; }

/* Fila de botoes de texto, mesmo idioma do menu do site. A hairline de base e
   inset, e nao border, para nao ser cortada pelo overflow do scroll horizontal
   do celular. */
/* A fila GRUDA embaixo do cabecalho enquanto o visitante rola dentro das abas,
   e para de grudar sozinha quando a .v3-plat-tabs-root acaba: e assim que ela
   nunca aparece por cima da secao de apps, sem precisar de JS. Por isso a raiz
   das abas nao pode ganhar overflow nem transform, que matam o sticky.

   O 88px do topo e medido: a casca do cabecalho tem 69px e, no estado
   flutuante, o cartao interno desce 10px e mede 68 (52 encolhido), ocupando
   ate 78px de tela. 88 deixa 10px de ar em cima da fila nos dois estados.

   Fundo opaco obrigatorio: sem ele o conteudo do painel passaria POR BAIXO da
   fila e apareceria atras das palavras. */
.v3-plat-tabs {
	position: sticky;
	top: 88px;
	z-index: 20;
	display: flex;
	gap: 28px;
	margin: 0 0 32px;
	padding: 0;
	background: var(--v3-page);
	border: 0;
	border-radius: 0;
	box-shadow: inset 0 -1px 0 var(--v3-line);
	overflow-x: auto;
	overflow-y: hidden;
	scrollbar-width: none;
	-webkit-overflow-scrolling: touch;
}
.v3-plat-tabs::-webkit-scrollbar { display: none; }

/* Neutraliza a pilula do main-final.css (.sl-pft-tab L19919: padding 0.65rem
   1.5rem, border-radius 999px, peso 700). O seletor e composto de proposito:
   o main-final tem regras de tema claro com dois niveis de especificidade e
   uma classe so nao venceria. */
.v3-plat-tabs .sl-pft-tab {
	flex: none;
	display: inline-flex;
	align-items: center;
	gap: 0;
	padding: 10px 2px 14px;
	background: none;
	border: 0;
	border-radius: 0;
	box-shadow: none;
	backdrop-filter: none;
	-webkit-backdrop-filter: none;
	font-family: var(--v3-body);
	font-size: 15px;
	font-weight: 600;
	letter-spacing: 0;
	line-height: 1.2;
	/* Aba inativa e controle, nao legenda: com --v3-ink-3 dava 4,47:1 sobre
	   o cinza da secao no tema claro e reprovava por pouco. */
	color: var(--v3-ink-3-strong);
	white-space: nowrap;
	cursor: pointer;
	transition: color .15s ease, box-shadow .15s ease;
}

.v3-plat-tabs .sl-pft-tab:hover:not(.is-active) {
	background: none;
	color: var(--v3-ink-2);
}

/* Ativo: sublinhado laranja de 2px, igual ao item ativo do menu. */
.v3-plat-tabs .sl-pft-tab.is-active,
.v3-plat-tabs .sl-pft-tab[aria-selected="true"] {
	background: none;
	color: var(--v3-ink);
	box-shadow: inset 0 -2px 0 var(--v3-brand);
}

.v3-plat-tabs .sl-pft-tab:focus-visible {
	outline: 2px solid var(--v3-brand);
	outline-offset: 2px;
}

/* === plataforma: paineis e grade === */

/* Nenhum display aqui de proposito: quem esconde o painel e
   .sl-pft-panel[hidden] { display: none !important } do main-final.css, e essa
   regra e o motor das abas. O fade de troca (sl-pft-panel-fade) tambem vem de
   la e fica. */
.v3-plat-panel { min-width: 0; }

/* Sem align-items aqui: o stretch padrao e o que a .v3-grid-3 do contrato ja
   usa no resto do site (na secao de integracoes os seis cards ficam com a
   base reta). Com o start, os cards da mesma linha paravam em alturas
   diferentes e a pagina mostrava duas convencoes de grade. */
.v3-plat-grid {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 20px;
}

/* Card que carrega um demo grande: ocupa a linha inteira e nao tem padding,
   para o demo encostar na borda. */
.v3-plat-grid .v3-plat-card--wide {
	grid-column: 1 / -1;
	gap: 0;
	padding: 0;
	overflow: hidden;
}

/* Texto embaixo de um demo dentro do card largo (o card nao tem padding). */
.v3-plat-grid .v3-plat-card-body { padding: 20px 24px 24px; }

/* === plataforma: faixa de proximo passo === */

.v3-plat-bridge {
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	gap: 22px 40px;
	align-items: center;
	margin-top: 40px;
	padding: 26px 28px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
}

.v3-plat-bridge-title {
	font-size: 1.2rem;
	line-height: 1.25;
}

.v3-plat-bridge-text {
	max-width: 620px;
	margin: 8px 0 0;
	font-size: 15px;
	line-height: 1.6;
	color: var(--v3-ink-2);
}

.v3-plat-bridge-ctas {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
}

@media (max-width: 1000px) {
	.v3-plat-hero-grid { grid-template-columns: minmax(0, 1fr); gap: 36px; }
	.v3-plat-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.v3-plat-bridge { grid-template-columns: minmax(0, 1fr); }
}

@media (max-width: 720px) {
	.v3-plat-hero { padding: 48px 0 56px; }
	.v3-plat-hero-lede { font-size: 17px; }
	.v3-plat-hero-img { max-height: 380px; }
	/* No celular o cartao do cabecalho flutua com folga menor (8px) e a tela e
	   curta: a fila gruda mais alta para nao comer o painel. */
	.v3-plat-tabs { top: 78px; gap: 20px; margin-bottom: 26px; }
	.v3-plat-tabs .sl-pft-tab { flex: none; padding: 8px 2px 12px; font-size: 14.5px; }
	.v3-plat-grid { grid-template-columns: minmax(0, 1fr); }
	.v3-plat-grid .v3-plat-card-body { padding: 16px 18px 20px; }
	.v3-plat-bridge { padding: 22px; }
}

/* O unico movimento desta casca e o fade de troca de painel, herdado do
   main-final.css. Aqui ele desliga junto com o resto. */
@media (prefers-reduced-motion: reduce) {
	.v3-plat-panel.sl-pft-panel { animation: none; }
	.v3-plat-tabs .sl-pft-tab { transition: none; }
}

/* ---- as duas telas grandes: painel do dashboard e demo de cerca ---- */

/* --------------------------------------------------------------------------
   10b. As duas telas grandes do produto
   .v3-dash  = painel de rastreamento ao vivo (template-parts/dashboard-mock.php)
   .v3-sim   = demo interativa de cerca e bloqueio (simule-frota-demo.php)

   As duas usam o vocabulario .v3-demo-* da secao 10 e so acrescentam layout.
   Nenhuma classe .sl-* antiga e reaproveitada como estilo: as poucas que
   aparecem aqui (.sl-sim-svg, .sl-sim-alert-icon, .sl-sim-log-*, .sl-sim-tele-*)
   sao ganchos que o main.js exige ou escreve sozinho, e entram so como
   sobrescrita do que o main-final.css pinta neles.
   -------------------------------------------------------------------------- */

/* === painel de rastreamento (.v3-dash) === */

.v3-dash-body {
	display: grid;
	grid-template-columns: 214px minmax(0, 1fr);
	min-height: 620px;
}

/* Menu lateral: 17 itens, icone de traco, item ativo marcado por uma barra
   laranja fina. Sem fundo colorido e sem brilho. */
.v3-dash-menu {
	display: flex;
	flex-direction: column;
	padding: 10px 8px;
	border-right: 1px solid var(--v3-demo-line);
	overflow: hidden auto;
}

.v3-dash-menu-list {
	margin: 0;
	padding: 0;
	list-style: none;
}

.v3-dash-menu-item {
	display: flex;
	align-items: center;
	gap: 9px;
	padding: 6px 9px;
	border-left: 2px solid transparent;
	border-radius: 0 6px 6px 0;
	font-size: 12.5px;
	color: var(--v3-demo-ink-2);
	white-space: nowrap;
}

.v3-dash-menu-item svg {
	flex: none;
	opacity: .7;
}

.v3-dash-menu-item.is-active {
	border-left-color: var(--v3-brand);
	color: var(--v3-demo-ink);
}
.v3-dash-menu-item.is-active svg { opacity: 1; }

.v3-dash-menu-foot { margin-top: auto; }

.v3-dash-menu-account { align-items: flex-start; }

.v3-dash-menu-account-body {
	display: block;
	min-width: 0;
}
.v3-dash-menu-account-body strong {
	display: block;
	font-weight: 600;
	color: var(--v3-demo-ink);
}
.v3-dash-menu-account-body small {
	display: block;
	font-size: 10.5px;
	color: var(--v3-demo-ink-3);
	overflow: hidden;
	text-overflow: ellipsis;
}

.v3-dash-main {
	display: flex;
	flex-direction: column;
	min-width: 0;
}

.v3-dash-map {
	flex: 1 1 auto;
	min-height: 400px;
}

/* Rota ativa e pins. Pin honesto: circulo com borda branca e uma elipse
   cinza translucida por baixo fazendo de sombra. Nada de filter, nada de halo. */
.v3-dash-route {
	stroke: var(--v3-brand);
	stroke-width: 3;
	stroke-dasharray: 5 10;
	stroke-linecap: round;
	opacity: .9;
}

.v3-dash-pin-shadow {
	fill: var(--v3-map-label);
	opacity: .3;
}

.v3-dash-pin-core {
	stroke: var(--v3-map-road);
	stroke-width: 2;
}
.v3-dash-pin-core--ok    { fill: var(--v3-demo-ok); }
.v3-dash-pin-core--warn  { fill: var(--v3-demo-warn); }
.v3-dash-pin-core--alert { fill: var(--v3-demo-alert); }

.v3-dash-fence-ring {
	fill: var(--v3-brand);
	fill-opacity: .06;
	stroke: var(--v3-brand);
	stroke-width: 1.5;
	stroke-dasharray: 5 6;
	opacity: .8;
}

/* Rodape de dados: veiculo selecionado + sensores */
.v3-dash-panels {
	display: grid;
	grid-template-columns: minmax(230px, 1fr) 2fr;
	border-top: 1px solid var(--v3-demo-line);
}

.v3-dash-vehicle {
	padding: 14px;
	border-right: 1px solid var(--v3-demo-line);
	min-width: 0;
}

.v3-dash-vehicle-head {
	display: flex;
	align-items: center;
	gap: 8px;
	margin-bottom: 10px;
}
.v3-dash-vehicle-head strong {
	font-size: 14px;
	font-weight: 600;
}

.v3-dash-vehicle-live {
	margin-left: auto;
	display: inline-flex;
	align-items: center;
	gap: 6px;
	flex: none;
	font-size: 11.5px;
	color: var(--v3-demo-ink-2);
}
.v3-dash-vehicle-live .v3-demo-dot { animation: v3-demo-pulse 2.4s ease-in-out infinite; }

.v3-dash-vehicle-info {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 8px;
	margin: 0;
}
.v3-dash-vehicle-info > div { min-width: 0; }
.v3-dash-vehicle-info dd { margin: 0; }

.v3-dash-vehicle-addr {
	font-family: var(--v3-body);
	font-size: 12.5px;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

.v3-dash-sensors {
	padding: 14px;
	min-width: 0;
}

.v3-dash-sensors-head {
	display: flex;
	align-items: center;
	gap: 10px;
	margin-bottom: 10px;
}
.v3-dash-sensors-head strong {
	font-size: 13.5px;
	font-weight: 600;
}

.v3-dash-sensors-grid {
	display: grid;
	grid-template-columns: repeat(5, minmax(0, 1fr));
	gap: 8px;
}

.v3-dash-sensor {
	display: grid;
	grid-template-columns: auto minmax(0, 1fr);
	column-gap: 8px;
	align-items: center;
}
.v3-dash-sensor-icon {
	grid-row: 1 / 3;
	line-height: 0;
	color: var(--v3-demo-ink-3);
}
.v3-dash-sensor .v3-demo-label,
.v3-dash-sensor .v3-demo-value { grid-column: 2; }
.v3-dash-sensor .v3-demo-value { font-size: 12.5px; }

/* === demo interativa de cerca (.v3-sim) === */

.v3-sim-body {
	display: grid;
	grid-template-columns: minmax(0, 1.55fr) minmax(240px, 1fr);
	align-items: stretch;
}

/* A proporcao acompanha o viewBox 600x480 para que o preserveAspectRatio
   "meet" nao deixe faixa de papel sobrando nas laterais. */
.v3-sim-map {
	aspect-ratio: 5 / 4;
	min-height: 380px;
	touch-action: none;
	user-select: none;
	-webkit-user-select: none;
}

/* O main-final crava min-height 480px na .sl-sim-svg; aqui a altura e do pai. */
.v3-sim-map .sl-sim-svg {
	display: block;
	width: 100%;
	height: 100%;
	min-height: 0;
}

.v3-sim-fence-ring {
	fill: var(--v3-brand);
	fill-opacity: .06;
	stroke: var(--v3-brand);
	stroke-width: 2;
	stroke-dasharray: 6 6;
}

@keyframes v3-sim-fence-pulse {
	0%, 100% { stroke-width: 2; }
	50%      { stroke-width: 3.5; }
}
#sl-sim-fence.is-breached .v3-sim-fence-ring {
	stroke: var(--v3-demo-alert);
	fill: var(--v3-demo-alert);
	animation: v3-sim-fence-pulse .8s ease-in-out 3;
}

.v3-sim-trail {
	stroke: var(--v3-brand);
	stroke-width: 2.5;
	stroke-linecap: round;
	stroke-dasharray: 4 6;
	opacity: .75;
}

/* Marcador do veiculo: o JS reescreve o transform inteiro a cada frame, entao
   aqui nao pode existir scale nem rotate. */
#sl-sim-vehicle { cursor: grab; }
#sl-sim-vehicle.is-dragging { cursor: grabbing; }

.v3-sim-vehicle-shadow {
	fill: var(--v3-map-label);
	opacity: .32;
}
.v3-sim-vehicle-dot {
	fill: var(--v3-brand);
	stroke: var(--v3-map-road);
	stroke-width: 2.5;
}
#sl-sim-vehicle.is-blocked .v3-sim-vehicle-dot { fill: var(--v3-demo-alert); }

/* Banner de alerta. O icone e injetado pelo JS como emoji: escondemos o texto
   e desenhamos um ponto no ::before. */
@keyframes v3-sim-alert-in {
	from { opacity: 0; transform: translateY(-6px); }
	to   { opacity: 1; transform: translateY(0); }
}
@keyframes v3-sim-dot-pulse {
	0%, 100% { opacity: 1; }
	50%      { opacity: .25; }
}

/* Sem border e com o hairline desenhado por box-shadow inset de proposito. O
   showAlert() do main.js grava alertEl.style.borderColor com cinco cores
   fixas, duas delas o teal fluorescente #2dd4bf, e estilo inline vence folha
   de estilo. Sem largura de borda, esse borderColor nao pinta nada e a moldura
   volta a ser a do tema, sem precisar de !important. O padding ganhou 1px pra
   compensar a borda que saiu, entao a caixa mede o mesmo de antes.
   pointer-events: none porque o banner e uma barra de largura inteira em cima
   da area de arraste e fica 4s no ar: com ele clicavel, o visitante nao
   conseguia pegar o veiculo de novo. */
.v3-sim-alert {
	position: absolute;
	top: 12px;
	left: 12px;
	right: 12px;
	display: flex;
	align-items: center;
	gap: 9px;
	padding: 11px 13px;
	background: var(--v3-demo-card);
	border: 0;
	box-shadow: inset 0 0 0 1px var(--v3-demo-line);
	border-radius: 8px;
	font-size: 12.5px;
	color: var(--v3-demo-ink);
	pointer-events: none;
	animation: v3-sim-alert-in .28s ease-out;
}
.v3-sim-alert[hidden] { display: none; }
.v3-sim-alert strong { font-weight: 600; }

.v3-sim-alert .sl-sim-alert-icon {
	display: inline-flex;
	flex: none;
	font-size: 0;
	line-height: 0;
	filter: none;
}
/* Ponto NEUTRO. O tom do evento so existe no emoji que o JS injeta e que a
   regra acima esconde, e o JS nao escreve atributo nenhum no banner de onde o
   CSS pudesse ler o tom. Vermelho fixo mentia: "Entrou na cerca" e
   "Desbloqueado" apareciam com ponto de alarme. O texto do banner ja diz o
   que aconteceu. */
.v3-sim-alert .sl-sim-alert-icon::before {
	content: "";
	display: block;
	width: 9px;
	height: 9px;
	border-radius: 50%;
	background: var(--v3-demo-ink-2);
	animation: v3-sim-dot-pulse 1.2s ease-in-out infinite;
}

/* Dica inicial */
@keyframes v3-sim-hint-bob {
	0%, 100% { transform: translateX(-50%) translateY(0); }
	50%      { transform: translateX(-50%) translateY(-4px); }
}
.v3-sim-hint {
	position: absolute;
	left: 50%;
	bottom: 14px;
	transform: translateX(-50%);
	padding: 7px 12px;
	background: var(--v3-demo-card);
	border: 1px solid var(--v3-demo-line);
	border-radius: 7px;
	font-size: 12px;
	color: var(--v3-demo-ink-2);
	white-space: nowrap;
	pointer-events: none;
	animation: v3-sim-hint-bob 2.6s ease-in-out infinite;
}
.v3-sim-hint.is-hidden { display: none; }

/* Toast rapido de aviso */
@keyframes v3-sim-toast-pulse {
	0%   { opacity: 0; transform: translateX(-50%) translateY(8px); }
	60%  { opacity: 1; transform: translateX(-50%) translateY(-3px); }
	100% { opacity: 1; transform: translateX(-50%) translateY(0); }
}
.v3-sim-toast {
	position: absolute;
	left: 50%;
	bottom: 58px;
	transform: translateX(-50%);
	padding: 8px 12px;
	background: var(--v3-demo-card);
	border: 1px solid var(--v3-demo-warn);
	border-radius: 7px;
	font-size: 12px;
	color: var(--v3-demo-ink);
	white-space: nowrap;
	/* Flutua sobre a metade de baixo do mapa por 2,2s justamente quando o
	   visitante tenta arrastar o veiculo bloqueado: nao pode roubar o clique. */
	pointer-events: none;
}
.v3-sim-toast[hidden] { display: none; }
.v3-sim-toast.is-visible { animation: v3-sim-toast-pulse .5s ease-out; }

/* Botoes flutuantes: quadrados, opacos, sem vidro fosco */
.v3-sim-mapbtns {
	position: absolute;
	right: 12px;
	bottom: 12px;
	display: grid;
	grid-template-columns: repeat(2, auto);
	gap: 8px;
}
.v3-sim-mapbtn {
	width: 40px;
	height: 40px;
	padding: 0;
	background: var(--v3-demo-card);
}
.v3-sim-mapbtn:disabled { background: var(--v3-demo-card); }

/* Painel lateral */
.v3-sim-aside {
	display: flex;
	flex-direction: column;
	gap: 10px;
	min-width: 0;
}

.v3-sim-aside-head strong {
	font-size: 13.5px;
	font-weight: 600;
}

.v3-sim-plate .v3-demo-value { font-size: 12.5px; }

@keyframes v3-sim-status-pulse {
	0%, 100% { opacity: 1; }
	50%      { opacity: .55; }
}
.v3-sim-status {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 11px;
	border: 1px solid var(--v3-demo-line);
	border-radius: 8px;
	font-size: 12.5px;
	color: var(--v3-demo-ink);
}
.v3-sim-status-dot {
	width: 7px;
	height: 7px;
	flex: none;
	border-radius: 50%;
	background: var(--v3-demo-ok);
}
.v3-sim-status[data-sim-status="warn"] .v3-sim-status-dot    { background: var(--v3-demo-warn); }
.v3-sim-status[data-sim-status="alert"] .v3-sim-status-dot,
.v3-sim-status[data-sim-status="blocked"] .v3-sim-status-dot { background: var(--v3-demo-alert); }
.v3-sim-status[data-sim-status="alert"],
.v3-sim-status[data-sim-status="blocked"] { border-color: var(--v3-demo-alert); }
.v3-sim-status[data-sim-status="alert"] { animation: v3-sim-status-pulse 1.2s ease-in-out infinite; }

.v3-sim-tele {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 8px;
}

/* O JS faz el.className = '...' nestes dois: qualquer classe posta no PHP
   some no primeiro updateTelemetry(). Por isso o estilo vem do id, e o tom
   vem das classes que o proprio JS escreve. O !important e obrigatorio: o
   main-final pinta .sl-sim-tele-* com !important. */
#sl-sim-ignition,
#sl-sim-lock {
	display: block;
	margin-top: 2px;
	font-family: var(--v3-mono);
	font-size: 13.5px;
	font-weight: 500;
	color: var(--v3-demo-ink);
}
#sl-sim-ignition.sl-sim-tele-ok    { color: var(--v3-demo-ok) !important; }
#sl-sim-ignition.sl-sim-tele-warn  { color: var(--v3-demo-warn) !important; }
#sl-sim-ignition.sl-sim-tele-alert { color: var(--v3-demo-alert) !important; }
#sl-sim-lock.sl-sim-tele-blocked   { color: var(--v3-demo-alert) !important; }

.v3-sim-reset { width: 100%; }

.v3-sim-log {
	display: flex;
	flex-direction: column;
	min-height: 0;
}
.v3-sim-log-head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	margin-bottom: 6px;
}
.v3-sim-log-count {
	font-family: var(--v3-mono);
	font-size: 11px;
	color: var(--v3-demo-ink-3);
	border: 1px solid var(--v3-demo-line);
	border-radius: 5px;
	padding: 1px 6px;
}
.v3-sim-log-list {
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 5px;
	max-height: 170px;
	overflow-y: auto;
}

/* Os <li> do log sao gerados pelo JS com estes nomes: aqui so repintamos. */
@keyframes v3-sim-log-in {
	from { opacity: 0; transform: translateX(-8px); }
	to   { opacity: 1; transform: translateX(0); }
}
.v3-sim-log-list .sl-sim-log-empty {
	padding: 6px 0;
	font-size: 11.5px;
	font-style: normal;
	color: var(--v3-demo-ink-3);
}
.v3-sim-log-list .sl-sim-log-item {
	display: grid;
	grid-template-columns: auto minmax(0, 1fr) auto;
	align-items: center;
	gap: 8px;
	padding: 6px 9px;
	background: transparent;
	border: 1px solid var(--v3-demo-line);
	border-left-width: 2px;
	border-radius: 6px;
	font-size: 11.5px;
	animation: v3-sim-log-in .35s ease-out;
}
.v3-sim-log-list .sl-sim-log-item[data-tone="alert"]   { border-left-color: var(--v3-demo-alert); }
.v3-sim-log-list .sl-sim-log-item[data-tone="success"] { border-left-color: var(--v3-demo-ok); }
.v3-sim-log-list .sl-sim-log-item[data-tone="warn"]    { border-left-color: var(--v3-demo-warn); }
.v3-sim-log-list .sl-sim-log-item[data-tone="info"]    { border-left-color: var(--v3-demo-ink-3); }

.v3-sim-log-list .sl-sim-log-icon {
	display: inline-flex;
	flex: none;
	font-size: 0;
	line-height: 0;
	filter: none;
}
.v3-sim-log-list .sl-sim-log-icon::before {
	content: "";
	display: block;
	width: 7px;
	height: 7px;
	border-radius: 50%;
	background: var(--v3-demo-ink-3);
}
.v3-sim-log-list .sl-sim-log-item[data-tone="alert"]   .sl-sim-log-icon::before { background: var(--v3-demo-alert); }
.v3-sim-log-list .sl-sim-log-item[data-tone="success"] .sl-sim-log-icon::before { background: var(--v3-demo-ok); }
.v3-sim-log-list .sl-sim-log-item[data-tone="warn"]    .sl-sim-log-icon::before { background: var(--v3-demo-warn); }

.v3-sim-log-list .sl-sim-log-msg {
	color: var(--v3-demo-ink);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.v3-sim-log-list .sl-sim-log-time {
	font-family: var(--v3-mono);
	font-size: 10.5px;
	color: var(--v3-demo-ink-3);
}

/* === cortes === */

@media (max-width: 1000px) {
	.v3-dash-body {
		grid-template-columns: minmax(0, 1fr);
		min-height: 0;
	}
	.v3-dash-menu {
		flex-direction: row;
		padding: 8px;
		border-right: 0;
		border-bottom: 1px solid var(--v3-demo-line);
		overflow: auto hidden;
	}
	.v3-dash-menu-list {
		display: flex;
		gap: 4px;
	}
	.v3-dash-menu-item {
		border-left: 0;
		border-bottom: 2px solid transparent;
		border-radius: 6px 6px 0 0;
	}
	.v3-dash-menu-item.is-active { border-bottom-color: var(--v3-brand); }
	.v3-dash-menu .v3-demo-sep,
	.v3-dash-menu-foot { display: none; }

	.v3-dash-map { min-height: 340px; }

	.v3-dash-panels { grid-template-columns: minmax(0, 1fr); }
	.v3-dash-vehicle {
		border-right: 0;
		border-bottom: 1px solid var(--v3-demo-line);
	}
	.v3-dash-sensors-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }

	.v3-sim-body { grid-template-columns: minmax(0, 1fr); }
	.v3-sim-map {
		aspect-ratio: 4 / 3;
		min-height: 320px;
	}
	.v3-sim-aside {
		border-left: 0;
		border-top: 1px solid var(--v3-demo-line);
	}
}

@media (max-width: 720px) {
	.v3-dash-vehicle-info { grid-template-columns: minmax(0, 1fr); }
	.v3-dash-sensors-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.v3-dash-map { min-height: 280px; }

	.v3-sim-map {
		aspect-ratio: 1 / 1;
		min-height: 300px;
	}
	.v3-sim-mapbtn {
		width: 36px;
		height: 36px;
	}
	.v3-sim-hint,
	.v3-sim-toast {
		max-width: calc(100% - 24px);
		white-space: normal;
		text-align: center;
	}
}

@media (prefers-reduced-motion: reduce) {
	.v3-dash-vehicle-live .v3-demo-dot,
	.v3-sim-hint,
	.v3-sim-alert,
	.v3-sim-alert .sl-sim-alert-icon::before,
	.v3-sim-toast.is-visible,
	.v3-sim-status[data-sim-status="alert"],
	.v3-sim-log-list .sl-sim-log-item,
	#sl-sim-fence.is-breached .v3-sim-fence-ring {
		animation: none;
	}
	.v3-sim-hint { transform: translateX(-50%); }
	.v3-sim-toast { transform: translateX(-50%); }
}

/* ---- aba Rastreamento: historico, trajeto e tarefas ---- */

/* --------------------------------------------------------------------------
   10.x Aba Rastreamento (/conhecer-plataforma/)

   Tres pecas: o card largo do painel ao vivo, o card de historico com as
   sub-abas Resumo e Trajeto, e o card de tarefas com o caminhao em loop.
   O chrome das telas vem do vocabulario .v3-demo-* da secao 10; aqui so entra
   o que e proprio destes tres cards.

   Cor: dentro do SVG a marca aparece na rota, nos pinos e na cabine do
   caminhao, que sao o "veiculo" da tela. Fora isso e cinza de mapa.
   -------------------------------------------------------------------------- */

/* Texto do card largo, que nao tem padding para o demo encostar na borda. */
.v3-plat-rast-note {
	padding: 14px 28px 24px;
	display: flex;
	flex-direction: column;
	gap: 10px;
}

/* === historico do veiculo === */

/* A aba entrega 1 card largo + 2 cards. Numa grade de 3 colunas isso deixaria
   um vao no fim da linha, entao o historico ocupa duas. Se a grade virar de
   duas colunas, basta apagar esta regra. */
.v3-plat-hist { grid-column: span 2; }

.v3-plat-hist-screen {
	display: flex;
	flex-direction: column;
}

.v3-plat-hist-tabs {
	margin-left: auto;
	display: inline-flex;
	flex: none;
	gap: 4px;
}

.v3-plat-hist-tab {
	padding: 4px 10px;
	background: transparent;
	border: 1px solid transparent;
	border-radius: 6px;
	color: var(--v3-demo-ink-3);
	font-family: var(--v3-body);
	font-size: 12px;
	font-weight: 500;
	line-height: 1.3;
	cursor: pointer;
	transition: color .15s ease, border-color .15s ease;
}
.v3-plat-hist-tab:hover { color: var(--v3-demo-ink-2); }
.v3-plat-hist-tab.is-active {
	background: var(--v3-demo-bg);
	border-color: var(--v3-demo-line);
	color: var(--v3-demo-ink);
}

/* O JS das sub-abas so liga e desliga o atributo hidden. Sem esta linha o
   display do painel Resumo venceria o [hidden] da folha do navegador e as
   duas telas apareceriam empilhadas. */
.v3-plat-hist-panel[hidden] { display: none !important; }

.v3-plat-hist-resumo {
	display: flex;
	flex-direction: column;
	gap: 12px;
	min-height: 300px;
	padding: 14px 16px 16px;
}

.v3-plat-hist-cap {
	margin: 0;
	font-size: 12px;
	line-height: 1.4;
	color: var(--v3-demo-ink-3);
}

.v3-plat-hist-line {
	position: relative;
	display: grid;
	gap: 12px;
	margin: 0;
	padding: 0 0 0 20px;
	list-style: none;
}
/* Fio que costura os eventos do dia. */
.v3-plat-hist-line::before {
	content: "";
	position: absolute;
	left: 4px;
	top: 7px;
	bottom: 7px;
	width: 1px;
	background: var(--v3-demo-line);
}

.v3-plat-hist-step { position: relative; }
/* Sem box-shadow de brilho: o ponto aceso era um dos tiques de IA da pagina. */
.v3-plat-hist-dot {
	position: absolute;
	left: -20px;
	top: 4px;
	width: 9px;
	height: 9px;
	border-radius: 50%;
	background: var(--v3-demo-ink-3);
}
.v3-plat-hist-step--start .v3-plat-hist-dot { background: var(--v3-brand); }
.v3-plat-hist-step--drive .v3-plat-hist-dot { background: var(--v3-demo-ok); }
.v3-plat-hist-step strong {
	display: block;
	font-size: 13px;
	font-weight: 600;
	color: var(--v3-demo-ink);
}
.v3-plat-hist-step small {
	display: block;
	margin-top: 1px;
	font-size: 11.5px;
	color: var(--v3-demo-ink-3);
}

.v3-plat-hist-chart {
	margin-top: auto;
	padding-top: 12px;
	border-top: 1px solid var(--v3-demo-line);
}
.v3-plat-hist-chart-label {
	display: block;
	font-size: 11px;
	color: var(--v3-demo-ink-3);
}
.v3-plat-hist-bars {
	display: flex;
	align-items: flex-end;
	gap: 3px;
	height: 56px;
	margin-top: 8px;
}
.v3-plat-hist-bar {
	flex: 1 1 0;
	min-width: 0;
	min-height: 2px;
	border-radius: 2px 2px 0 0;
	background: var(--v3-demo-line);
}
.v3-plat-hist-bar--peak { background: var(--v3-demo-ink-3); }
/* Altura por classe porque style inline e proibido no contrato. */
.v3-plat-hist-bar--h02 { height: 2%; }
.v3-plat-hist-bar--h03 { height: 3%; }
.v3-plat-hist-bar--h04 { height: 4%; }
.v3-plat-hist-bar--h06 { height: 6%; }
.v3-plat-hist-bar--h08 { height: 8%; }
.v3-plat-hist-bar--h10 { height: 10%; }
.v3-plat-hist-bar--h12 { height: 12%; }
.v3-plat-hist-bar--h15 { height: 15%; }
.v3-plat-hist-bar--h22 { height: 22%; }
.v3-plat-hist-bar--h42 { height: 42%; }
.v3-plat-hist-bar--h55 { height: 55%; }
.v3-plat-hist-bar--h78 { height: 78%; }

/* === trajeto (sub-aba do historico) === */

/* Altura fixa: o quadro e 600x300 e o SVG cobre a area com slice, entao a
   largura do card nao estica o mapa. A barra de meta e um rodape de verdade,
   nao um adesivo por cima: sobreposta, ela comia o terceiro pino do trajeto. */
.v3-plat-trj-map {
	display: flex;
	flex-direction: column;
	height: 300px;
}
.v3-plat-trj-map > svg {
	flex: 1 1 auto;
	min-height: 0;
	height: auto;
}

.v3-plat-trj-num {
	font-family: var(--v3-body);
	font-size: 10px;
	font-weight: 600;
	fill: var(--v3-map-road);
}

/* Barrinha de meta da viagem: rodape do quadro, embaixo do mapa. */
.v3-plat-trj-meta {
	flex: none;
	display: flex;
	justify-content: space-between;
	gap: 10px;
	padding: 8px 12px;
	background: var(--v3-demo-card);
	border-top: 1px solid var(--v3-demo-line);
	font-size: 11.5px;
	line-height: 1.3;
	color: var(--v3-demo-ink-2);
}

/* === tarefas === */

/* Quadro quadrado: o viewBox e 360x360 e o caminhao percorre a rota inteira,
   entao nada pode ser cortado nas pontas. */
.v3-plat-tar-stage {
	aspect-ratio: 1 / 1;
	max-height: 400px;
}

.v3-plat-tar-notif {
	position: absolute;
	top: 12px;
	left: 50%;
	display: inline-flex;
	align-items: center;
	gap: 9px;
	max-width: calc(100% - 24px);
	padding: 8px 12px;
	background: var(--v3-demo-card);
	border: 1px solid var(--v3-demo-line);
	border-radius: 9px;
	color: var(--v3-demo-ink);
	white-space: nowrap;
	pointer-events: none;
	opacity: 0;
	transform: translateX(-50%) translateY(-12px);
}
.v3-plat-tar-notif-icon {
	display: inline-grid;
	place-items: center;
	flex: none;
	width: 20px;
	height: 20px;
	border-radius: 50%;
}
.v3-plat-tar-notif-body {
	display: flex;
	flex-direction: column;
	line-height: 1.25;
}
.v3-plat-tar-notif-body strong { font-size: 12.5px; font-weight: 600; }
.v3-plat-tar-notif-body small { font-size: 11px; color: var(--v3-demo-ink-3); }

/* Os dois avisos sao fatias do mesmo ciclo de 12s do animateMotion do
   caminhao: o primeiro entra logo depois da saida, o segundo na chegada.
   Os keyframes do main-final.css (sl-tar-notif-start / sl-tar-notif-done)
   ficam la intactos; estes sao os desta rodada, com nome proprio. */
.v3-plat-tar-notif--start { animation: v3-plat-tar-notif-start 12s ease-in-out infinite; }
.v3-plat-tar-notif--start .v3-plat-tar-notif-icon {
	background: var(--v3-brand);
	color: var(--v3-demo-ink);
}
.v3-plat-tar-notif--done { animation: v3-plat-tar-notif-done 12s ease-in-out infinite; }
.v3-plat-tar-notif--done .v3-plat-tar-notif-icon {
	background: var(--v3-demo-ok);
	color: var(--v3-demo-bg);
}

@keyframes v3-plat-tar-notif-start {
	0%, 4%    { opacity: 0; transform: translateX(-50%) translateY(-12px); }
	7%, 14%   { opacity: 1; transform: translateX(-50%) translateY(0); }
	18%, 100% { opacity: 0; transform: translateX(-50%) translateY(-12px); }
}
@keyframes v3-plat-tar-notif-done {
	0%, 86%   { opacity: 0; transform: translateX(-50%) translateY(-12px); }
	88%, 96%  { opacity: 1; transform: translateX(-50%) translateY(0); }
	99%, 100% { opacity: 0; transform: translateX(-50%) translateY(-12px); }
}

@media (max-width: 1000px) {
	.v3-plat-hist { grid-column: span 1; }
	.v3-plat-trj-map { height: 260px; }
	.v3-plat-hist-resumo { min-height: 260px; }
}

@media (max-width: 720px) {
	.v3-plat-rast-note { padding: 14px 22px 22px; }
	.v3-plat-hist-resumo { min-height: 0; padding: 12px 13px 14px; }
	.v3-plat-hist-bars { height: 46px; }
	.v3-plat-trj-map { height: 230px; }
	.v3-plat-tar-stage { max-height: 340px; }
}

@media (prefers-reduced-motion: reduce) {
	.v3-plat-hist-tab { transition: none; }
	/* O primeiro aviso fica de pe e o segundo sai de cena: sem o ciclo de 12s
	   os dois se sobreporiam no mesmo lugar. */
	.v3-plat-tar-notif { animation: none; }
	.v3-plat-tar-notif--start { opacity: 1; transform: translateX(-50%); }
	.v3-plat-tar-notif--done { display: none; }
	/* O caminhao anda por SMIL, que o CSS nao consegue pausar: quem pediu menos
	   movimento fica com o mapa, a rota e os dois pinos, sem o veiculo. */
	.v3-plat-tar-truck { display: none; }
}

/* ---- aba Seguranca: bloqueio remoto e lista de alertas ---- */

/* --------------------------------------------------------------------------
   Aba SEGURANCA de /conhecer-plataforma/ (template-parts/plat-tab-seguranca.php)
   Tres pecas: nota do card largo, card "Bloqueio remoto" (loop de 12s em CSS
   puro) e card "Alertas e cercas". Cor so nos tokens --v3-*; nada hardcodado.
   -------------------------------------------------------------------------- */

/* === nota abaixo da demo interativa (card largo, sem padding) === */

.v3-plat-seg-note {
	display: grid;
	gap: 10px;
	padding: 6px 28px 28px;
}

/* === card "Bloqueio remoto" ============================================== */

/* Palco do mapa. O fundo claro do papel ja vem de .v3-demo-map. */
.v3-plat-blq-stage {
	height: 280px;
	overflow: hidden;
}

/* Anel de estado do caminhao: quase invisivel enquanto livre, laranja discreto
   depois do comando. Sem box-shadow de brilho, de proposito. */
.v3-plat-blq-halo {
	fill: var(--v3-brand);
	stroke: var(--v3-brand);
	stroke-width: 1.5;
	fill-opacity: 0;
	stroke-opacity: .18;
	transform-box: fill-box;
	transform-origin: center;
	animation: v3-plat-blq-halo 12s linear infinite;
}

@keyframes v3-plat-blq-halo {
	0%, 60%   { fill-opacity: 0;   stroke-opacity: .18; transform: scale(1); }
	62%       { fill-opacity: .06; stroke-opacity: .34; transform: scale(1.12); }
	65%, 100% { fill-opacity: .12; stroke-opacity: .5;  transform: scale(1); }
}

/* --- popup de comando --- */

.v3-plat-blq-pop {
	top: 50%;
	left: 50%;
	width: 86%;
	max-width: 268px;
	padding: 0;
	overflow: hidden;
	opacity: 0;
	transform: translate(-50%, -50%);
	pointer-events: none;
	animation: v3-plat-blq-pop 12s ease-in-out infinite;
}

@keyframes v3-plat-blq-pop {
	0%, 12%   { opacity: 0; transform: translate(-50%, calc(-50% + 12px)); }
	16%, 50%  { opacity: 1; transform: translate(-50%, -50%); }
	54%, 100% { opacity: 0; transform: translate(-50%, calc(-50% - 6px)); }
}

.v3-plat-blq-pop-head {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 9px 12px;
	border-bottom: 1px solid var(--v3-demo-line);
}
.v3-plat-blq-pop-head strong {
	flex: 1;
	min-width: 0;
	font-size: 12.5px;
	font-weight: 600;
	color: var(--v3-demo-ink);
}
.v3-plat-blq-pop-icon  { display: inline-flex; flex: none; color: var(--v3-brand); }
.v3-plat-blq-pop-close { display: inline-flex; flex: none; color: var(--v3-demo-ink-3); }

.v3-plat-blq-pop-body {
	display: grid;
	gap: 9px;
	padding: 10px 12px;
}
.v3-plat-blq-field { display: grid; gap: 4px; }

.v3-plat-blq-select {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	padding: 6px 9px;
	border: 1px solid var(--v3-demo-line);
	border-radius: 6px;
	font-size: 11.5px;
	color: var(--v3-demo-ink);
}
.v3-plat-blq-select > span {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	min-width: 0;
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}
.v3-plat-blq-select svg { flex: none; color: var(--v3-demo-ink-3); }
.v3-plat-blq-seldot { margin: 0; }

.v3-plat-blq-pop-actions {
	display: flex;
	justify-content: flex-end;
	gap: 7px;
	padding: 9px 12px;
	border-top: 1px solid var(--v3-demo-line);
}
.v3-plat-blq-act {
	padding: 6px 11px;
	font-size: 11.5px;
	cursor: default;
}

/* O "clique" do botao primario, logo antes do toast. */
.v3-plat-blq-send {
	transition: none;
	animation: v3-plat-blq-send 12s ease-in-out infinite;
}

@keyframes v3-plat-blq-send {
	0%, 36%   { transform: scale(1);    background-color: var(--v3-brand); }
	38%       { transform: scale(.945); background-color: var(--v3-brand-hover); }
	41%, 100% { transform: scale(1);    background-color: var(--v3-brand); }
}

/* --- toast de confirmacao --- */

.v3-plat-blq-toast {
	top: 12px;
	left: 50%;
	gap: 7px;
	max-width: calc(100% - 24px);
	padding: 7px 11px;
	font-size: 11.5px;
	opacity: 0;
	transform: translateX(-50%) translateY(-10px);
	pointer-events: none;
	animation: v3-plat-blq-toast 12s ease-in-out infinite;
}

@keyframes v3-plat-blq-toast {
	0%, 40%   { opacity: 0; transform: translateX(-50%) translateY(-10px); }
	44%, 56%  { opacity: 1; transform: translateX(-50%) translateY(0); }
	60%, 100% { opacity: 0; transform: translateX(-50%) translateY(-10px); }
}

.v3-plat-blq-toast-icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: none;
	width: 15px;
	height: 15px;
	border-radius: 50%;
	background: var(--v3-demo-ok);
	color: var(--v3-demo-bg);
}

/* --- card de sensores --- */

.v3-plat-blq-sensors {
	position: absolute;
	right: 10px;
	bottom: 10px;
	width: 178px;
	padding: 8px 10px;
}
.v3-plat-blq-sensors-head {
	padding-bottom: 6px;
	margin-bottom: 6px;
	border-bottom: 1px solid var(--v3-demo-line);
	font-size: 11px;
	font-weight: 600;
	color: var(--v3-demo-ink-2);
}
.v3-plat-blq-sensor {
	display: grid;
	grid-template-columns: 14px 1fr auto;
	align-items: center;
	gap: 8px;
	padding: 3px 0;
	font-size: 11.5px;
}
.v3-plat-blq-sensor-icon  { display: inline-flex; color: var(--v3-demo-ink-3); }
.v3-plat-blq-sensor-label { color: var(--v3-demo-ink-2); }
.v3-plat-blq-sensor-value {
	font-weight: 600;
	color: var(--v3-demo-ink);
	text-align: right;
}

/* Dois estados sobrepostos em inline-grid: a troca e so opacidade, entao a
   largura do card nao pula quando o texto muda. */
.v3-plat-blq-swap {
	display: inline-grid;
	min-width: 58px;
}
.v3-plat-blq-swap > span { grid-area: 1 / 1; }
.v3-plat-blq-off {
	opacity: 1;
	color: var(--v3-demo-ink-2);
	animation: v3-plat-blq-off 12s linear infinite;
}
.v3-plat-blq-on {
	opacity: 0;
	color: var(--v3-demo-alert);
	font-weight: 700;
	animation: v3-plat-blq-on 12s linear infinite;
}

@keyframes v3-plat-blq-off {
	0%, 60%   { opacity: 1; }
	62%, 100% { opacity: 0; }
}
@keyframes v3-plat-blq-on {
	0%, 60%   { opacity: 0; }
	62%, 100% { opacity: 1; }
}

/* === card "Alertas e cercas" ============================================= */

.v3-plat-alertas-lista {
	list-style: none;
	margin: 0;
	padding: 0;
	overflow: hidden;
}
.v3-plat-alertas-item {
	display: grid;
	grid-template-columns: 28px 1fr 6px;
	align-items: center;
	gap: 10px;
	padding: 9px 12px;
	border-top: 1px solid var(--v3-demo-line);
}
.v3-plat-alertas-item:first-child { border-top: 0; }

/* Quadradinho com borda no lugar do pino de emoji. Sem cor propria: a
   severidade fica so no ponto de estado a direita. */
.v3-plat-alertas-icon {
	display: grid;
	place-items: center;
	width: 28px;
	height: 28px;
	border: 1px solid var(--v3-demo-line);
	border-radius: 7px;
	color: var(--v3-demo-ink-2);
}
.v3-plat-alertas-body { display: grid; gap: 2px; min-width: 0; }
.v3-plat-alertas-title {
	font-size: 12.5px;
	font-weight: 600;
	color: var(--v3-demo-ink);
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}
.v3-plat-alertas-meta {
	font-size: 11.5px;
	color: var(--v3-demo-ink-3);
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}

/* === cortes ============================================================== */

@media (max-width: 1000px) {
	.v3-plat-blq-stage { height: 300px; }
}

@media (max-width: 720px) {
	.v3-plat-seg-note        { padding: 6px 20px 22px; }
	.v3-plat-blq-stage       { height: 260px; }
	.v3-plat-blq-sensors     { width: 162px; right: 8px; bottom: 8px; }
	.v3-plat-alertas-item    { padding: 9px 10px; }
}

@media (prefers-reduced-motion: reduce) {
	.v3-plat-blq-halo,
	.v3-plat-blq-pop,
	.v3-plat-blq-send,
	.v3-plat-blq-toast,
	.v3-plat-blq-off,
	.v3-plat-blq-on { animation: none; }

	.v3-plat-blq-halo  { fill-opacity: .12; stroke-opacity: .5; }
	.v3-plat-blq-pop   { opacity: 1; }
	.v3-plat-blq-toast { opacity: 0; }
	.v3-plat-blq-off   { opacity: 0; }
	.v3-plat-blq-on    { opacity: 1; }
}

/* ---- aba Gestao: visao geral, relatorios, SMS e manutencao ---- */

/* --------------------------------------------------------------------------
   Aba GESTAO de /conhecer-plataforma/ (template-parts/plat-tab-gestao.php).

   Quatro recortes do sistema dentro da casca .v3-demo. Nada de turquesa,
   nada de box-shadow de brilho, nada de largura por style inline: a barra de
   manutencao le --v3-plat-mnt-p e o donut usa stroke-dasharray por atributo.

   Os keyframes sao novos e prefixados de proposito: os sl-sms-* de mesma
   funcao continuam vivos no main-final.css e nao podem ser redefinidos.
   -------------------------------------------------------------------------- */

/* A etiqueta da barra de titulo encosta na direita, como a etiqueta ao vivo. */
.v3-plat-vg-demo > .v3-demo-chrome > .v3-demo-tag,
.v3-plat-rel-demo > .v3-demo-chrome > .v3-demo-tag,
.v3-plat-sms-demo > .v3-demo-chrome > .v3-demo-tag,
.v3-plat-mnt-demo > .v3-demo-chrome > .v3-demo-tag { margin-left: auto; flex: none; }

/* Quatro cards numa grade de tres colunas: 1+2 na primeira linha, 2+1 na
   segunda. Os dois cards de tabela e de animacao pedem o dobro de largura. */
.v3-plat-rel-card,
.v3-plat-sms-card { grid-column: span 2; }

/* === 1. Visao geral: donut de status da frota === */

.v3-plat-vg-body {
	display: flex;
	align-items: center;
	gap: 18px;
	flex-wrap: wrap;
	padding: 16px 14px;
}

.v3-plat-vg-donut {
	position: relative;
	flex: none;
	width: 118px;
	height: 118px;
}

.v3-plat-vg-svg { display: block; }

/* Trilho e fatias: um caminho de 100 unidades (pathLength), entao o
   stroke-dasharray do HTML ja esta em porcentagem da volta. */
.v3-plat-vg-trilho {
	stroke: var(--v3-demo-line);
	stroke-width: 13;
}

.v3-plat-vg-arco { stroke-width: 13; }
.v3-plat-vg-arco--ok     { stroke: var(--v3-demo-ok); }
.v3-plat-vg-arco--alert  { stroke: var(--v3-demo-alert); }
.v3-plat-vg-arco--warn   { stroke: var(--v3-demo-warn); }
.v3-plat-vg-arco--neutro { stroke: var(--v3-demo-ink-3); }

.v3-plat-vg-centro {
	position: absolute;
	inset: 0;
	display: grid;
	place-content: center;
	justify-items: center;
	text-align: center;
}
.v3-plat-vg-centro strong {
	font-family: var(--v3-mono);
	font-size: 22px;
	font-weight: 500;
	line-height: 1;
	color: var(--v3-demo-ink);
}
.v3-plat-vg-centro small {
	margin-top: 4px;
	font-size: 10.5px;
	color: var(--v3-demo-ink-3);
}

.v3-plat-vg-legenda {
	flex: 1 1 148px;
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: 8px;
}
.v3-plat-vg-legenda li {
	display: grid;
	grid-template-columns: 8px minmax(0, 1fr) auto;
	align-items: center;
	gap: 9px;
}

.v3-plat-vg-marca {
	width: 8px;
	height: 8px;
	border-radius: 2px;
	background: var(--v3-demo-ink-3);
}
.v3-plat-vg-marca--ok     { background: var(--v3-demo-ok); }
.v3-plat-vg-marca--alert  { background: var(--v3-demo-alert); }
.v3-plat-vg-marca--warn   { background: var(--v3-demo-warn); }

.v3-plat-vg-nome {
	font-size: 12px;
	color: var(--v3-demo-ink-2);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.v3-plat-vg-num {
	font-family: var(--v3-mono);
	font-size: 12.5px;
	color: var(--v3-demo-ink);
}

/* === 2. Relatorios detalhados: sub-abas do initHistoryTabs === */

.v3-plat-rel-tabs {
	display: flex;
	gap: 4px;
	padding: 0 12px;
	border-bottom: 1px solid var(--v3-demo-line);
}

.v3-plat-rel-tab {
	appearance: none;
	margin: 0 0 -1px;
	padding: 9px 4px;
	background: none;
	border: 0;
	border-bottom: 2px solid transparent;
	font-family: var(--v3-body);
	font-size: 12.5px;
	font-weight: 500;
	color: var(--v3-demo-ink-3);
	cursor: pointer;
	transition: color .15s ease, border-color .15s ease;
}
.v3-plat-rel-tab + .v3-plat-rel-tab { margin-left: 14px; }
.v3-plat-rel-tab:hover { color: var(--v3-demo-ink-2); }
.v3-plat-rel-tab.is-active {
	color: var(--v3-demo-ink);
	border-bottom-color: var(--v3-brand);
}
.v3-plat-rel-tab:focus-visible {
	outline: 2px solid var(--v3-brand);
	outline-offset: -2px;
	border-radius: 4px;
}

/* O JS so liga e desliga o atributo hidden: a regra abaixo e o motor da
   troca de painel. Sem ela os dois painels aparecem empilhados. */
.v3-plat-rel-panel { display: block; padding: 13px 14px 15px; }
.v3-plat-rel-panel[hidden] { display: none; }

.v3-plat-rel-head {
	display: flex;
	align-items: baseline;
	gap: 9px;
	flex-wrap: wrap;
	padding-bottom: 10px;
	margin-bottom: 11px;
	border-bottom: 1px solid var(--v3-demo-line);
}
.v3-plat-rel-head .v3-demo-label { display: inline; flex: none; }
.v3-plat-rel-head .v3-demo-value { display: inline; margin: 0; font-size: 12.5px; }
.v3-plat-rel-head .v3-demo-tag { margin-left: auto; flex: none; }

.v3-plat-rel-cols {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 0 24px;
}
.v3-plat-rel-lista { margin: 0; }

.v3-plat-rel-linha {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 12px;
	padding: 6px 0;
	border-bottom: 1px solid var(--v3-demo-line);
}
.v3-plat-rel-linha:last-child { border-bottom: 0; }
.v3-plat-rel-linha dt {
	font-size: 12px;
	color: var(--v3-demo-ink-2);
}
.v3-plat-rel-linha dd {
	margin: 0;
	font-family: var(--v3-mono);
	font-size: 12px;
	color: var(--v3-demo-ink);
	white-space: nowrap;
}

.v3-plat-rel-tabela-wrap { overflow-x: auto; }
.v3-plat-rel-tabela {
	width: 100%;
	border-collapse: collapse;
}
.v3-plat-rel-tabela th {
	padding: 0 12px 8px 0;
	border-bottom: 1px solid var(--v3-demo-line);
	text-align: left;
	font-size: 11px;
	font-weight: 500;
	color: var(--v3-demo-ink-3);
	white-space: nowrap;
}
.v3-plat-rel-tabela td {
	padding: 7px 12px 7px 0;
	border-bottom: 1px solid var(--v3-demo-line);
	font-family: var(--v3-mono);
	font-size: 11.5px;
	color: var(--v3-demo-ink-2);
	white-space: nowrap;
}
.v3-plat-rel-tabela tr:last-child td { border-bottom: 0; }

.v3-plat-rel-badge {
	display: inline-block;
	padding: 2px 8px;
	border: 1px solid var(--v3-demo-line);
	border-radius: 5px;
	font-family: var(--v3-body);
	font-size: 11px;
	color: var(--v3-demo-ink-3);
}
.v3-plat-rel-badge--movimento { color: var(--v3-demo-ok); }

/* === 3. Configurar rastreador: loop de 12 segundos, so em CSS === */

.v3-plat-sms-stage {
	position: relative;
	overflow: hidden;
	min-height: 302px;
	padding: 14px;
}

.v3-plat-sms-lista {
	width: 56%;
	max-width: 330px;
	background: var(--v3-demo-card);
	border: 1px solid var(--v3-demo-line);
	border-radius: 8px;
	overflow: hidden;
}

.v3-plat-sms-lista-head {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 9px 11px;
	border-bottom: 1px solid var(--v3-demo-line);
}
.v3-plat-sms-lista-head strong {
	font-size: 12px;
	font-weight: 600;
	color: var(--v3-demo-ink);
}

.v3-plat-sms-ico {
	display: inline-flex;
	flex: none;
	color: var(--v3-demo-ink-3);
}

.v3-plat-sms-busca {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 10px 11px;
	padding: 6px 9px;
	border: 1px solid var(--v3-demo-line);
	border-radius: 6px;
}
.v3-plat-sms-busca-txt {
	font-size: 11.5px;
	color: var(--v3-demo-ink-3);
}

.v3-plat-sms-grupo {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 7px 11px;
	border-top: 1px solid var(--v3-demo-line);
}
.v3-plat-sms-grupo strong {
	font-size: 11.5px;
	font-weight: 600;
	color: var(--v3-demo-ink-2);
}
.v3-plat-sms-conta {
	margin-left: auto;
	font-family: var(--v3-mono);
	font-size: 11px;
	color: var(--v3-demo-ink-3);
}

.v3-plat-sms-veiculo {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 10px 11px;
	border-top: 1px solid var(--v3-demo-line);
}
.v3-plat-sms-check {
	display: grid;
	place-items: center;
	flex: none;
	width: 15px;
	height: 15px;
	border: 1px solid var(--v3-demo-line);
	border-radius: 3px;
	color: var(--v3-brand);
}
.v3-plat-sms-veiculo-txt {
	display: grid;
	gap: 2px;
	min-width: 0;
}
.v3-plat-sms-veiculo-txt strong {
	font-size: 12px;
	font-weight: 600;
	color: var(--v3-demo-ink);
}
.v3-plat-sms-veiculo-meta {
	margin-left: auto;
	display: flex;
	align-items: center;
	gap: 9px;
}
.v3-plat-sms-kmh {
	font-family: var(--v3-mono);
	font-size: 11.5px;
	color: var(--v3-demo-ink-2);
}

/* Os dois estados do texto ficam sobrepostos na mesma celula e trocam de
   opacidade; e o que faz o veiculo passar de nao conectado para online. */
.v3-plat-sms-troca {
	display: inline-grid;
	font-size: 11px;
	line-height: 1.3;
}
.v3-plat-sms-troca > span { grid-area: 1 / 1; }
.v3-plat-sms-off {
	color: var(--v3-demo-alert);
	animation: v3-sms-text-off 12s linear infinite;
}
.v3-plat-sms-on {
	opacity: 0;
	font-weight: 600;
	color: var(--v3-demo-ok);
	animation: v3-sms-text-on 12s linear infinite;
}

.v3-plat-sms-dot {
	width: 8px;
	height: 8px;
	flex: none;
	border-radius: 50%;
	background: var(--v3-demo-alert);
	animation: v3-sms-dot-swap 12s linear infinite;
}

.v3-plat-sms-pop {
	top: 18px;
	right: 14px;
	width: 46%;
	max-width: 262px;
	padding: 0;
	opacity: 0;
	transform: translateY(8px);
	animation: v3-sms-pop-in 12s ease-in-out infinite;
}
.v3-plat-sms-pop-head {
	padding: 9px 12px;
	border-bottom: 1px solid var(--v3-demo-line);
}
.v3-plat-sms-pop-head strong {
	font-size: 12px;
	font-weight: 600;
	color: var(--v3-demo-ink);
}
.v3-plat-sms-pop-body {
	display: grid;
	gap: 10px;
	padding: 11px 12px;
}
.v3-plat-sms-select {
	display: block;
	margin-top: 4px;
	padding: 5px 9px;
	border: 1px solid var(--v3-demo-line);
	border-radius: 6px;
	font-size: 11.5px;
	color: var(--v3-demo-ink);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.v3-plat-sms-pop-acoes { padding: 0 12px 12px; }
.v3-plat-sms-enviar {
	width: 100%;
	animation: v3-sms-btn-click 12s ease-in-out infinite;
}

.v3-plat-sms-toast {
	bottom: 16px;
	left: 50%;
	z-index: 3;
	opacity: 0;
	transform: translateX(-50%) translateY(10px);
	animation: v3-sms-toast-in 12s ease-in-out infinite;
}
.v3-plat-sms-toast-ico {
	display: inline-flex;
	flex: none;
	color: var(--v3-demo-ok);
}

/* Ciclo unico de 12s. O popup entra, o botao pisca aos 38%, o toast confirma
   aos 44% e o veiculo troca de estado aos 70%. */
@keyframes v3-sms-pop-in {
	0%, 4%    { opacity: 0; transform: translateY(8px); }
	10%, 50%  { opacity: 1; transform: translateY(0); }
	56%, 100% { opacity: 0; transform: translateY(-6px); }
}
@keyframes v3-sms-btn-click {
	0%, 36%   { transform: scale(1);   box-shadow: 0 0 0 0 var(--v3-brand-soft); }
	38%       { transform: scale(.94); box-shadow: 0 0 0 5px var(--v3-brand-soft); }
	41%, 100% { transform: scale(1);   box-shadow: 0 0 0 0 var(--v3-brand-soft); }
}
@keyframes v3-sms-toast-in {
	0%, 40%   { opacity: 0; transform: translateX(-50%) translateY(10px); }
	44%, 60%  { opacity: 1; transform: translateX(-50%) translateY(0); }
	64%, 100% { opacity: 0; transform: translateX(-50%) translateY(10px); }
}
@keyframes v3-sms-dot-swap {
	0%, 65%  { background: var(--v3-demo-alert); }
	70%, 95% { background: var(--v3-demo-ok); }
	100%     { background: var(--v3-demo-alert); }
}
@keyframes v3-sms-text-off {
	0%, 65%  { opacity: 1; }
	70%, 95% { opacity: 0; }
	100%     { opacity: 1; }
}
@keyframes v3-sms-text-on {
	0%, 65%  { opacity: 0; }
	70%, 95% { opacity: 1; }
	100%     { opacity: 0; }
}

/* === 4. Manutencao preventiva: cinco barras === */

.v3-plat-mnt-lista {
	list-style: none;
	margin: 0;
	padding: 12px 14px 14px;
	display: grid;
	gap: 13px;
}

.v3-plat-mnt-row {
	display: grid;
	grid-template-columns: 18px minmax(0, 1fr) auto;
	align-items: center;
	gap: 5px 9px;
}
.v3-plat-mnt-ico {
	display: inline-flex;
	color: var(--v3-demo-ink-3);
}
.v3-plat-mnt-txt {
	display: flex;
	align-items: baseline;
	gap: 7px;
	min-width: 0;
}
.v3-plat-mnt-nome {
	flex: none;
	font-size: 12px;
	color: var(--v3-demo-ink);
}
.v3-plat-mnt-veh {
	font-size: 11px;
	color: var(--v3-demo-ink-3);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.v3-plat-mnt-resta {
	font-family: var(--v3-mono);
	font-size: 11.5px;
	color: var(--v3-demo-ink-2);
	white-space: nowrap;
}
.v3-plat-mnt-resta--ok    { color: var(--v3-demo-ok); }
.v3-plat-mnt-resta--warn  { color: var(--v3-demo-warn); }
.v3-plat-mnt-resta--alert { color: var(--v3-demo-alert); }

/* A largura vem da variavel, posta por classe modificadora. Nunca de
   style inline: e a diferenca entre um card e um mock. */
.v3-plat-mnt-bar {
	grid-column: 1 / -1;
	height: 4px;
	border-radius: 2px;
	background: var(--v3-demo-line);
	overflow: hidden;
}
.v3-plat-mnt-bar > span {
	display: block;
	height: 100%;
	width: var(--v3-plat-mnt-p, 0%);
	border-radius: 2px;
	background: var(--v3-plat-mnt-c, var(--v3-demo-ink-3));
}
.v3-plat-mnt-bar--p32  { --v3-plat-mnt-p: 32%; }
.v3-plat-mnt-bar--p88  { --v3-plat-mnt-p: 88%; }
.v3-plat-mnt-bar--p90  { --v3-plat-mnt-p: 90%; }
.v3-plat-mnt-bar--p95  { --v3-plat-mnt-p: 95%; }
.v3-plat-mnt-bar--p100 { --v3-plat-mnt-p: 100%; }
.v3-plat-mnt-bar--ok    { --v3-plat-mnt-c: var(--v3-demo-ok); }
.v3-plat-mnt-bar--warn  { --v3-plat-mnt-c: var(--v3-demo-warn); }
.v3-plat-mnt-bar--alert { --v3-plat-mnt-c: var(--v3-demo-alert); }

/* === cortes === */

/* Duas colunas na grade: os quatro cards passam a ocupar a linha inteira,
   senao o card de uma coluna deixa buraco ao lado do card de duas. */
@media (max-width: 1000px) {
	.v3-plat-vg-card,
	.v3-plat-rel-card,
	.v3-plat-sms-card,
	.v3-plat-mnt-card { grid-column: 1 / -1; }
}

@media (max-width: 720px) {
	.v3-plat-vg-body { justify-content: center; }

	.v3-plat-rel-cols { grid-template-columns: minmax(0, 1fr); }
	.v3-plat-rel-head .v3-demo-tag { margin-left: 0; }

	.v3-plat-sms-lista { width: 100%; max-width: none; }
	.v3-plat-sms-pop {
		top: 46px;
		right: 14px;
		left: 14px;
		width: auto;
		max-width: none;
	}
}

@media (prefers-reduced-motion: reduce) {
	.v3-plat-sms-pop {
		animation: none;
		opacity: 1;
		transform: none;
	}
	.v3-plat-sms-toast { animation: none; display: none; }
	.v3-plat-sms-enviar,
	.v3-plat-sms-dot,
	.v3-plat-sms-off,
	.v3-plat-sms-on { animation: none; }
	.v3-plat-rel-tab { transition: none; }
}

/* ---- aba Tudo: a lista completa de funcoes ---- */

/* === plataforma . aba Tudo === */
/* A lista completa de funcoes (template-parts/plat-tab-tudo.php). Sao 19
   cartoes, entao a grade e mais densa que a .v3-grid-3 do site: 3 colunas com
   gap menor, cartao de padding curto e titulo um ponto abaixo do h3 padrao.
   O unico ponto de cor e a caixinha do icone, que ja vem pronta da
   .v3-feat-icon (inclusive a inversao para laranja solido no hover do card). */
.v3-plat-tudo-grid {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 14px;
}

/* Cartao curto: o texto e uma frase, nao um paragrafo. */
.v3-plat-tudo-card {
	gap: 10px;
	padding: 20px;
}
.v3-plat-tudo-card .v3-feat-icon {
	margin-bottom: 0;
}
.v3-plat-tudo-card .v3-card-title {
	font-size: 1.05rem;
	line-height: 1.3;
}
.v3-plat-tudo-card .v3-card-text {
	font-size: 14px;
	line-height: 1.55;
}

/* Asterisco das duas funcoes que dependem de pacote de SMS. Fica em cinza:
   o contrato reserva o laranja para fora do titulo. */
.v3-plat-tudo-star {
	margin-left: 2px;
	color: var(--v3-ink-3);
	font-weight: 600;
}

/* O mesmo aviso do asterisco, dito por extenso so para leitor de tela. */
.v3-plat-tudo-sr {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	border: 0;
	overflow: hidden;
	clip: rect(0 0 0 0);
	clip-path: inset(50%);
	white-space: nowrap;
}

/* Nota de rodape do asterisco. */
.v3-plat-tudo-note {
	margin: 18px 0 0;
	font-size: 14px;
	line-height: 1.5;
	/* Mesmo motivo da .v3-cta-note: fundo alt exige o cinza forte. */
	color: var(--v3-ink-3-strong);
}
.v3-plat-tudo-note a {
	color: var(--v3-brand-text);
	text-decoration: underline;
	text-underline-offset: 2px;
}
.v3-plat-tudo-note a:hover {
	color: var(--v3-brand-hover);
}

@media (max-width: 1000px) {
	.v3-plat-tudo-grid {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

@media (max-width: 720px) {
	.v3-plat-tudo-grid {
		grid-template-columns: 1fr;
		gap: 12px;
	}
	.v3-plat-tudo-card {
		padding: 18px;
	}
	.v3-plat-tudo-note {
		margin-top: 16px;
	}
}

/* ---- apps mobile: os dois telefones ---- */

/* === plataforma: apps mobile === */
/* --------------------------------------------------------------------------
   Secao /conhecer-plataforma/#apps-mobile (template-parts/plat-apps.php).
   Texto a esquerda, dois telefones a direita. A tela do telefone usa os
   tokens --v3-demo-* (chrome escuro do app) e o mapa usa --v3-map-*.
   A unica classe .sl-* aqui e .sl-phone-pin: o JS a exige e dela vem, pelo
   main-final.css, o par de keyframes sl-phone-pin-flash / sl-phone-pin-ripple
   do bloqueio. Todo o resto e sobrescrita para tirar o glow antigo.
   -------------------------------------------------------------------------- */
.v3-plat-apps {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 56px;
	align-items: center;
}

.v3-plat-apps-copy .v3-head { margin-bottom: 24px; }
.v3-plat-apps-actions { margin-top: 28px; }

/* Palco dos dois telefones. O deslocamento lateral e uma variavel para que
   os cortes so precisem trocar um numero. */
.v3-plat-apps-phones {
	--v3-plat-apps-off: 74px;
	position: relative;
	height: 560px;
}

.v3-plat-apps-phone {
	position: absolute;
	top: 0;
	left: 50%;
	box-sizing: border-box;
	width: 250px;
	height: 520px;
	margin-left: -125px;
	padding: 9px;
	background: var(--v3-demo-line);
	border-radius: 34px;
}
.v3-plat-apps-phone--tras   { transform: translateX(calc(var(--v3-plat-apps-off) * -1)) rotate(-4deg); }
.v3-plat-apps-phone--frente { transform: translateX(var(--v3-plat-apps-off)) rotate(3deg); z-index: 2; }

.v3-plat-apps-screen {
	position: relative;
	height: 100%;
	display: flex;
	flex-direction: column;
	background: var(--v3-demo-bg);
	border-radius: 26px;
	overflow: hidden;
	color: var(--v3-demo-ink);
	font-family: var(--v3-body);
}

/* Print do app enviado pelo Customizer. Preenche a tela inteira e passa POR
   BAIXO do entalhe, como um app de verdade: por isso ele nao entra no fluxo
   flex, e sim ocupa a moldura toda. O object-fit corta pelas laterais em vez
   de esticar, entao print de qualquer proporcao entra sem deformar. */
.v3-plat-apps-shot {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: top center;
	border-radius: 26px;
}

.v3-plat-apps-notch {
	position: absolute;
	top: 0;
	left: 50%;
	transform: translateX(-50%);
	width: 78px;
	height: 17px;
	background: var(--v3-demo-line);
	border-radius: 0 0 10px 10px;
	z-index: 3;
}

/* Barra de status: hora, sinal, 5G e bateria em SVG. Sem emoji. */
.v3-plat-apps-status {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 7px 14px 3px;
	font-family: var(--v3-mono);
	font-size: 10px;
	color: var(--v3-demo-ink-2);
}
.v3-plat-apps-sinais {
	display: inline-flex;
	align-items: center;
	gap: 5px;
}
.v3-plat-apps-ico { display: block; color: currentColor; }
.v3-plat-apps-ico--sinal { width: 11px; height: 9px; }
.v3-plat-apps-ico--bat   { width: 15px; height: 9px; }

.v3-plat-apps-appbar {
	display: flex;
	align-items: center;
	gap: 7px;
	padding: 5px 13px 9px;
	border-bottom: 1px solid var(--v3-demo-line);
	font-size: 12.5px;
	font-weight: 600;
}
.v3-plat-apps-appbar-nome {
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.v3-plat-apps-voltar {
	flex: none;
	width: 13px;
	height: 13px;
	color: var(--v3-demo-ink-2);
}
.v3-plat-apps-appbar .v3-demo-live { font-size: 10px; gap: 5px; }

/* Telefone de tras: lista de veiculos. */
.v3-plat-apps-lista {
	flex: 1;
	min-height: 0;
	display: flex;
	flex-direction: column;
	gap: 8px;
	padding: 10px;
	overflow: hidden;
}
.v3-plat-apps-veic {
	display: grid;
	gap: 3px;
	padding: 8px 10px;
}
.v3-plat-apps-veic-nome {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 12px;
	font-weight: 600;
	color: var(--v3-demo-ink);
}
.v3-plat-apps-veic-meta {
	font-family: var(--v3-mono);
	font-size: 10.5px;
	color: var(--v3-demo-ink-2);
}
.v3-plat-apps-veic-onde {
	font-size: 10.5px;
	color: var(--v3-demo-ink-3);
}

/* Telefone da frente: mapa + painel. */
.v3-plat-apps-map {
	flex: 1;
	min-height: 0;
	margin: 10px;
	border-radius: 10px;
	overflow: hidden;
}

/* O pino e um div HTML por cima do SVG, entao a posicao vem daqui. 50%/50%
   cai no centro do quadro do mapa, que e onde a avenida atravessa o cenario
   de sl_demo_map(). Ajuste fino: mexer so nestes dois valores. */
.v3-plat-apps-map .v3-plat-apps-pin {
	top: 50%;
	left: 50%;
	width: 18px;
	height: 18px;
	background: var(--v3-brand);
	border: 3px solid var(--v3-map-road);
	box-shadow: none;
	z-index: 2;
}
.v3-plat-apps-map .v3-plat-apps-pin.is-blocked {
	background: var(--v3-demo-alert);
	box-shadow: none;
}
/* A onda do bloqueio (sl-phone-pin-ripple) continua; so troca de cor. */
.v3-plat-apps-map .v3-plat-apps-pin:not(.is-blocked).is-flashing::after { border-color: var(--v3-brand); }
.v3-plat-apps-map .v3-plat-apps-pin.is-blocked.is-flashing::after      { border-color: var(--v3-demo-alert); }

.v3-plat-apps-painel { padding: 0 10px 12px; }
.v3-plat-apps-metricas {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 8px;
}
.v3-plat-apps-metric { padding: 7px 9px; }
.v3-plat-apps-metric .v3-demo-label { font-size: 10px; }
.v3-plat-apps-metric .v3-demo-value { font-size: 12.5px; }

.v3-plat-apps-ign.is-on  { color: var(--v3-demo-ok); }
.v3-plat-apps-ign.is-off { color: var(--v3-demo-alert); }
.v3-plat-apps-ign-off { display: none; }
.v3-plat-apps-ign.is-off .v3-plat-apps-ign-on  { display: none; }
.v3-plat-apps-ign.is-off .v3-plat-apps-ign-off { display: inline; }

.v3-plat-apps-painel .v3-plat-apps-block {
	width: 100%;
	margin-top: 8px;
	padding: 9px 12px;
	font-size: 12px;
}
/* Bloqueado = a acao disponivel passa a ser desbloquear, entao o botao
   perde o laranja e vira contorno. */
.v3-plat-apps-block.is-blocked {
	background: transparent;
	border-color: var(--v3-demo-line);
	color: var(--v3-demo-ink);
}
.v3-plat-apps-block.is-blocked:hover:not(:disabled) {
	background: transparent;
	border-color: var(--v3-demo-ink-3);
	color: var(--v3-demo-ink);
}

/* O JS escreve um emoji de cadeado dentro deste span. O texto fica com
   tamanho zero e o cadeado e desenhado nos dois pseudo-elementos. */
.v3-plat-apps-btn-icon {
	position: relative;
	flex: none;
	width: 11px;
	height: 13px;
	font-size: 0;
	line-height: 0;
	color: inherit;
}
.v3-plat-apps-btn-icon::before {
	content: "";
	position: absolute;
	left: 0;
	bottom: 0;
	width: 11px;
	height: 8px;
	border-radius: 2px;
	background: currentColor;
}
.v3-plat-apps-btn-icon::after {
	content: "";
	position: absolute;
	left: 2px;
	top: 0;
	width: 7px;
	height: 7px;
	border: 1.5px solid currentColor;
	border-bottom: 0;
	border-radius: 4px 4px 0 0;
}
.v3-plat-apps-block.is-blocked .v3-plat-apps-btn-icon::after {
	left: 6px;
	border-right: 0;
}

@media (max-width: 1000px) {
	.v3-plat-apps { grid-template-columns: 1fr; gap: 48px; }
	.v3-plat-apps-copy { max-width: 680px; }
}

@media (max-width: 720px) {
	.v3-plat-apps-phones {
		--v3-plat-apps-off: 52px;
		height: 516px;
	}
	.v3-plat-apps-phone {
		width: 228px;
		height: 476px;
		margin-left: -114px;
	}
}

@media (max-width: 560px) {
	.v3-plat-apps-phones { --v3-plat-apps-off: 0px; }
	.v3-plat-apps-phone--tras { display: none; }
	.v3-plat-apps-phone--frente { transform: none; }
}

@media (prefers-reduced-motion: reduce) {
	.v3-plat-apps-map .v3-plat-apps-pin,
	.v3-plat-apps-map .v3-plat-apps-pin.is-flashing,
	.v3-plat-apps-map .v3-plat-apps-pin.is-flashing::after {
		animation: none;
		transition: none;
	}
}

/* ---- numeros tecnicos e integracoes ---- */

/* --------------------------------------------------------------------------
   Specs tecnicas (/conhecer-plataforma/, template-parts/plat-specs.php)
   Cinco numeros em fila, sem card e sem caixa: so um hairline separando as
   colunas. O numero grande e um dos seis lugares onde o laranja da marca pode
   aparecer. O item que traz uma palavra em vez de digito ("Ilimitado") ganha
   um corpo menor para nao estourar a coluna.
   Cortes: 1000px vira 3 colunas (o hairline vertical continua entre as
   colunas e um hairline horizontal separa as duas linhas), 720px vira lista
   de uma coluna com hairline em cima de cada item a partir do segundo.
   -------------------------------------------------------------------------- */

.v3-plat-specs {
	display: grid;
	grid-template-columns: repeat(5, minmax(0, 1fr));
	column-gap: 0;
	row-gap: 0;
}

.v3-plat-specs-item {
	padding: 0 22px;
	border-left: 1px solid var(--v3-line);
}

.v3-plat-specs-item:first-child {
	padding-left: 0;
	border-left: 0;
}

.v3-plat-specs-item:last-child {
	padding-right: 0;
}

.v3-plat-specs-num {
	display: block;
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 110, "wght" 700;
	font-size: clamp(2rem, 2.2vw + 1rem, 2.9rem);
	line-height: 1;
	letter-spacing: -.025em;
	color: var(--v3-brand);
}

/* "Ilimitado" ocupa a largura de nove digitos: um corpo menor mantem a fila
   alinhada sem quebrar a palavra no meio. */
.v3-plat-specs-num--palavra {
	font-size: clamp(1.5rem, 1.1vw + .95rem, 1.95rem);
}

.v3-plat-specs-unit {
	font-size: .55em;
	font-variation-settings: "wdth" 110, "wght" 700;
	letter-spacing: 0;
}

.v3-plat-specs-label {
	display: block;
	margin-top: 12px;
	font-family: var(--v3-body);
	font-weight: 600;
	font-size: 15px;
	line-height: 1.35;
	color: var(--v3-ink);
	text-wrap: balance;
}

.v3-plat-specs-detail {
	display: block;
	margin-top: 6px;
	font-family: var(--v3-body);
	font-size: 13px;
	line-height: 1.5;
	color: var(--v3-ink-3);
	text-wrap: pretty;
}

@media (max-width: 1000px) {
	.v3-plat-specs {
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}
	.v3-plat-specs-item {
		padding-left: 22px;
		padding-right: 22px;
		border-left: 1px solid var(--v3-line);
	}
	.v3-plat-specs-item:nth-child(3n + 1) {
		padding-left: 0;
		border-left: 0;
	}
	.v3-plat-specs-item:nth-child(3n) {
		padding-right: 0;
	}
	.v3-plat-specs-item:nth-child(n + 4) {
		margin-top: 28px;
		padding-top: 28px;
		border-top: 1px solid var(--v3-line);
	}
}

@media (max-width: 720px) {
	.v3-plat-specs {
		grid-template-columns: minmax(0, 1fr);
	}
	.v3-plat-specs-item {
		padding-left: 0;
		padding-right: 0;
		border-left: 0;
	}
	.v3-plat-specs-item + .v3-plat-specs-item {
		margin-top: 24px;
		padding-top: 24px;
		border-top: 1px solid var(--v3-line);
	}
	.v3-plat-specs-label {
		margin-top: 10px;
	}
}

/* ---- chamada para /revendas/ (template-parts/plat-revendas.php) ---- */

/* Mesma proporcao do bloco de personas da home: a coluna de texto um pouco
   mais larga que o cartao, porque e ela que carrega o argumento. */
.v3-plat-rev-grid {
	display: grid;
	grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
	gap: 48px;
	align-items: center;
}

.v3-plat-rev-copy .v3-head { margin-bottom: 28px; }

.v3-plat-rev-acao {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 30px;
}

.v3-plat-rev-card {
	display: flex;
	flex-direction: column;
	gap: 14px;
}

/* A foto sangra ate a borda do cartao: e o mesmo tratamento do card de
   personas na home. O aspect-ratio evita o pulo de layout enquanto carrega. */
.v3-plat-rev-img {
	display: block;
	width: calc(100% + 56px);
	margin: -28px -28px 4px;
	aspect-ratio: 16 / 10;
	object-fit: cover;
	border-radius: 10px 10px 0 0;
	background: var(--v3-page-alt);
}

@media (max-width: 1000px) {
	.v3-plat-rev-grid {
		grid-template-columns: minmax(0, 1fr);
		gap: 32px;
	}
}

@media (max-width: 720px) {
	.v3-plat-rev-acao { gap: 10px; }
	.v3-plat-rev-acao .v3-btn { width: 100%; }
	/* O .v3-card cai para 22px de padding neste corte; a sangria acompanha. */
	.v3-plat-rev-img {
		width: calc(100% + 44px);
		margin: -22px -22px 4px;
	}
}

/* ==========================================================================
   12. Paginas /planos-plataforma/ e /revendas/ (rodada v3.5.3)

   As duas eram as ultimas paginas grandes no visual antigo. A marcacao nova
   e .v3-, com duas excecoes que sao gancho de JS e nao estilo:
     .sl-tier    e .sl-special    o initTierSlider() acende .is-highlighted
                                  nelas conforme a regua de quantidade
     os ids sl-roi-*              o initRoiCalc() escreve os numeros
   A .sl-tier ja e neutralizada pela secao 3; a .sl-special nao era, e e
   neutralizada logo abaixo.
   ========================================================================== */

/* ---- planos: hero ---- */

.v3-planos-hero {
	padding: 72px 0 56px;
	border-bottom: 1px solid var(--v3-line);
}

.v3-planos-hero-grid {
	display: grid;
	grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
	gap: 48px;
	align-items: center;
}
/* Sem imagem no Customizer: uma coluna, como a pagina nasceu. */
.v3-planos-hero-grid--solo { grid-template-columns: minmax(0, 1fr); }
.v3-planos-hero-grid--solo .v3-planos-hero-copy { max-width: 760px; }

.v3-planos-hero-copy { min-width: 0; }

/* A moldura tem proporcao fixa de 3 por 2 e a foto preenche com "cover".
   Antes a altura vinha da propria foto: uma imagem mais alta batia no
   max-height e ficava com tarja transparente em cima e embaixo, e uma mais
   baixa deixava a coluna da direita menor que o texto. Com a moldura fixa,
   qualquer foto que o admin subir sai do mesmo tamanho e alinhada com o
   texto. A foto que esta no ar hoje ja e 3 por 2, entao ela nao perde nada. */
.v3-planos-hero-visual {
	min-width: 0;
	overflow: hidden;
	aspect-ratio: 3 / 2;
	max-height: 460px;
	border-radius: 14px;
}
.v3-planos-hero-img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
}

.v3-planos-hero-title {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}

.v3-planos-hero-lede {
	margin: 22px 0 0;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-planos-hero-nota {
	margin: 20px 0 0;
	font-size: 15px;
	line-height: 1.5;
	color: var(--v3-ink-2);
}
.v3-planos-hero-nota strong { color: var(--v3-ink); font-weight: 600; }

/* ---- planos: regua de quantidade ---- */

.v3-tier-slider { gap: 14px; }

.v3-tier-slider-head {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 16px;
	flex-wrap: wrap;
}
.v3-tier-slider-head label {
	font-size: 15px;
	font-weight: 500;
	color: var(--v3-ink-2);
}

.v3-tier-slider-val {
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 22px;
	line-height: 1.1;
	color: var(--v3-ink);
	font-variant-numeric: tabular-nums;
}

/* O JS poe .is-faded assim que o visitante mexe na regua. */
.v3-tier-slider-hint {
	margin: 0;
	font-size: 13px;
	line-height: 1.4;
	color: var(--v3-ink-3);
	transition: opacity .2s ease;
}
.v3-tier-slider-hint.is-faded { opacity: 0; }

/* Botao "ir para a faixa": SO no celular.

   No computador os seis cards ficam lado a lado e acendem enquanto a regua
   anda, entao o botao nao teria serventia. No celular a tabela e uma coluna
   so e o card aceso fica longe demais da regua para alguem perceber; ai o
   botao vira a unica forma de a regua servir para alguma coisa.

   Quem decide QUANDO ele aparece e o v3.js (a partir de 50 veiculos), pelo
   atributo hidden. Aqui so se decide ONDE ele pode aparecer. As duas regras
   dentro do media query sao necessarias: qualquer display declarado por nos
   passa por cima do hidden do navegador, entao ele precisa ser desligado
   outra vez, de forma explicita. */
.v3-tier-ir { display: none; }

@media (max-width: 720px) {
	.v3-tier-ir {
		display: flex;
		align-items: center;
		justify-content: center;
		gap: 8px;
		width: 100%;
		margin-top: 4px;
		padding: 13px 18px;
		border: 0;
		border-radius: 9px;
		background: var(--v3-brand);
		font-family: var(--v3-body);
		font-size: 15px;
		font-weight: 600;
		line-height: 1.2;
		color: #fff;
		cursor: pointer;
		animation: v3-tier-ir-entra .18s ease both;
	}
	.v3-tier-ir[hidden] { display: none; }
	.v3-tier-ir:active { transform: translateY(1px); }
	.v3-tier-ir svg { flex: none; opacity: .85; }

	/* A dica apaga assim que a regua sai do zero, mas continua ocupando a
	   altura dela, e no celular isso virava um buraco entre a regua e o botao.
	   Aqui ela sai da conta de vez e o botao ocupa o lugar. So no celular: no
	   computador o espaco reservado segura o cartao parado, que e o certo. */
	.v3-tier-slider-hint.is-faded { display: none; }
}

@keyframes v3-tier-ir-entra {
	from { opacity: 0; transform: translateY(-4px); }
	to   { opacity: 1; transform: none; }
}

/* ---- planos: plano inicial de valor fixo ---- */

.v3-tier-starter {
	flex-direction: row;
	align-items: center;
	justify-content: space-between;
	gap: 24px;
	margin-top: 20px;
	flex-wrap: wrap;
}

.v3-tier-starter-copy { min-width: 0; }

/* Preco e botao juntos na direita, alinhados pela base do preco. */
.v3-tier-starter-lado {
	flex: none;
	display: flex;
	align-items: center;
	gap: 20px;
	flex-wrap: wrap;
}

.v3-tier-starter-preco {
	margin: 0;
	flex: none;
	display: flex;
	align-items: baseline;
	gap: 6px;
	font-family: var(--v3-display);
	font-size: 20px;
	color: var(--v3-brand);
}
.v3-tier-starter-preco strong {
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 34px;
	line-height: 1;
	letter-spacing: -.02em;
}
.v3-tier-starter-preco span {
	font-family: var(--v3-body);
	font-size: 14px;
	color: var(--v3-ink-3);
}

/* ---- planos: as seis faixas ---- */

.v3-tier-grid {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 20px;
	margin-top: 20px;
}

.v3-tier { gap: 6px; }

.v3-tier-faixa {
	margin: 0;
	font-size: 14px;
	font-weight: 500;
	color: var(--v3-ink-2);
}

.v3-tier-preco {
	margin: 4px 0 0;
	display: flex;
	align-items: baseline;
	gap: 6px;
	font-family: var(--v3-display);
	font-size: 18px;
	color: var(--v3-brand);
}
.v3-tier-preco strong {
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 32px;
	line-height: 1;
	letter-spacing: -.02em;
}

.v3-tier-por {
	margin: 0;
	font-size: 13px;
	color: var(--v3-ink-3);
}

.v3-tier .v3-card-actions { margin-top: auto; padding-top: 14px; }
.v3-tier .v3-btn { width: 100%; }

/* ---- planos: acima de mil veiculos ---- */

/* A .sl-special vinha com gradiente escuro, 4,5rem de padding, raio 24 e
   max-width 1100 do CSS antigo, e nao estava na lista de neutralizacao da
   secao 3 porque ate agora nenhuma pagina v3 a usava. */
.sl-special.v3-tier-especial {
	max-width: none !important;
	margin: 24px 0 0 !important;
	padding: 28px !important;
	background: var(--v3-card) !important;
	background-image: none !important;
	border: 1px solid var(--v3-line) !important;
	border-radius: 10px !important;
	box-shadow: none !important;
	overflow: visible !important;
	display: grid;
	grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr);
	gap: 12px 40px;
	align-items: start;
}
.sl-special.v3-tier-especial::before,
.sl-special.v3-tier-especial::after { display: none !important; }

/* Faixa acesa do card acima de mil veiculos.
   AZUL de proposito, e nos DOIS temas. O motivo tem historia: no tema claro
   uma regra antiga do main-final.css (linha 25975, com !important) ja pintava
   este card de azul quando a regua chegava em mil, e no escuro a regra sem
   !important perdia para a minha e ele acendia laranja. O Joao viu os dois e
   escolheu o azul. Faz sentido alem do gosto: o laranja e a cor do que se
   CLICA, e aqui o destaque diz "esta e a sua faixa", que e estado, nao acao;
   com laranja, o anel competia com o proprio botao dentro do card.
   O seletor leva as duas classes mais o estado (0,3,0) e !important para
   vencer o [data-theme="light"] .sl-special.is-highlighted do arquivo antigo. */
.sl-special.v3-tier-especial.is-highlighted,
[data-theme="light"] .sl-special.v3-tier-especial.is-highlighted {
	/* O anel e OUTLINE, e nao border, de proposito. A borda deste card e
	   disputada por tres regras com !important (uma delas do main-final, com
	   [data-theme="light"] no meio) e a mais especifica pintava a sombra mas
	   nao a borda; medido no navegador, a variavel chegava certa no elemento e
	   mesmo assim a cor da borda saia neutra. Ninguem mais declara outline
	   neste elemento, entao aqui nao ha disputa a perder.
	   O offset negativo desenha o anel POR CIMA da borda de 1px, entao o card
	   nao muda de tamanho ao acender e a linha neutra some por baixo. */
	outline: 2px solid var(--v3-selecao);
	outline-offset: -1px;
	box-shadow:
		0 0 0 4px var(--v3-selecao-halo),
		0 18px 44px -18px var(--v3-selecao-halo) !important;
}

.v3-tier-especial-copy { display: flex; flex-direction: column; gap: 12px; }

.v3-tier-especial-nums {
	margin: 0;
	display: grid;
	gap: 14px;
}
.v3-tier-especial-nums > div {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 14px;
	padding-bottom: 12px;
	border-bottom: 1px solid var(--v3-line);
}
.v3-tier-especial-nums > div:last-child { border-bottom: 0; padding-bottom: 0; }
.v3-tier-especial-nums dt {
	font-size: 14px;
	line-height: 1.35;
	color: var(--v3-ink-2);
}
.v3-tier-especial-nums dd {
	margin: 0;
	flex: none;
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 22px;
	line-height: 1;
	letter-spacing: -.02em;
	color: var(--v3-brand);
	font-variant-numeric: tabular-nums;
}

.v3-tier-especial-nota {
	grid-column: 1 / -1;
	margin: 4px 0 0;
	padding-top: 16px;
	border-top: 1px solid var(--v3-line);
	font-size: 13px;
	line-height: 1.5;
	color: var(--v3-ink-3);
}

/* ---- planos: o que vem em todas as faixas ---- */

/* Ficha tecnica dos recursos. Antes era uma lista solta no fundo da pagina e
   ficava com cara de rascunho. Agora e um painel: cabecalho com a contagem,
   os itens numa grade com fio separando celula de celula (o fio e border
   das proprias celulas, entao ele acompanha a quebra em 2 e 1 coluna sem
   nenhuma regra a mais) e a nota do asterisco como rodape de dentro. */
.v3-planos-ficha { padding: 0; gap: 0; overflow: hidden; }

.v3-planos-ficha-topo {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 16px;
	padding: 16px 24px;
	border-bottom: 1px solid var(--v3-line);
	background: var(--v3-page-alt);
}
.v3-planos-ficha-titulo {
	font-size: 14px;
	font-weight: 600;
	color: var(--v3-ink);
}
.v3-planos-ficha-conta {
	font-family: var(--v3-mono);
	font-size: 12.5px;
	color: var(--v3-ink-3-strong);
}

.v3-planos-inclusos {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
}
.v3-planos-inclusos li {
	display: flex;
	align-items: center;
	gap: 13px;
	padding: 15px 22px;
	border-right: 1px solid var(--v3-line);
	border-bottom: 1px solid var(--v3-line);
	font-size: 15px;
	line-height: 1.35;
	color: var(--v3-ink-2);
	transition: background-color .18s ease;
}
/* Ultima coluna sem fio a direita: a borda do card ja fecha ali. */
.v3-planos-inclusos li:nth-child(3n) { border-right: 0; }
.v3-planos-inclusos li:hover { background: var(--v3-page-alt); }

.v3-planos-inclusos-txt { min-width: 0; }

.v3-planos-inclusos-ico {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: none;
	width: 36px;
	height: 36px;
	border-radius: 9px;
	background: var(--v3-brand-soft);
	color: var(--v3-brand);
}

.v3-planos-nota {
	margin: 0;
	padding: 14px 24px;
	font-size: 13px;
	line-height: 1.5;
	color: var(--v3-ink-3-strong);
}

.v3-planos-ficha + .v3-plat-bridge { margin-top: 36px; }

/* ---- revendas: hero ---- */

.v3-rev-hero {
	padding: 72px 0 80px;
	border-bottom: 1px solid var(--v3-line);
}

.v3-rev-hero-grid {
	display: grid;
	grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
	gap: 48px;
	align-items: center;
}
.v3-rev-hero-grid--solo {
	grid-template-columns: minmax(0, 1fr);
	max-width: 800px;
}

.v3-rev-hero-title {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}

.v3-rev-hero-lede {
	max-width: 560px;
	margin: 22px 0 0;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-rev-hero-ctas {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 30px;
}

.v3-rev-hero-stats { margin-top: 34px; }

.v3-rev-hero-visual { min-width: 0; }

/* Sem drop-shadow: a foto antiga levava uma sombra de 38% que no tema claro
   virava mancha. */
.v3-rev-hero-img {
	display: block;
	width: 100%;
	height: auto;
	max-height: 460px;
	object-fit: contain;
	filter: none;
	border-radius: 14px;
}

/* ---- revendas: calculadora de margem ---- */

.v3-roi { gap: 24px; }

.v3-roi-entradas {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 24px 32px;
}

.v3-roi-entrada { display: flex; flex-direction: column; gap: 10px; }

.v3-roi-entrada-topo {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 12px;
}
.v3-roi-entrada-topo label {
	font-size: 14px;
	font-weight: 500;
	line-height: 1.3;
	color: var(--v3-ink-2);
}

.v3-roi-entrada-val {
	flex: none;
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 19px;
	line-height: 1;
	color: var(--v3-ink);
	font-variant-numeric: tabular-nums;
}

.v3-roi-saidas {
	margin: 0;
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 16px;
	padding-top: 22px;
	border-top: 1px solid var(--v3-line);
}

.v3-roi-saida {
	display: flex;
	flex-direction: column;
	gap: 4px;
	padding: 16px 18px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
}
.v3-roi-saida dt {
	margin: 0;
	font-size: 13px;
	color: var(--v3-ink-3);
}
.v3-roi-saida dd { margin: 0; }
.v3-roi-saida dd strong {
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 28px;
	line-height: 1.1;
	letter-spacing: -.02em;
	color: var(--v3-ink);
	font-variant-numeric: tabular-nums;
}
.v3-roi-saida small {
	font-size: 12.5px;
	line-height: 1.45;
	color: var(--v3-ink-3);
}
.v3-roi-saida small strong { font-weight: 600; color: var(--v3-ink-2); }

/* A margem e o numero que o visitante veio buscar: e o unico em laranja. */
.v3-roi-saida--forte { background: var(--v3-brand-soft); border-color: var(--v3-brand); }
.v3-roi-saida--forte dd strong { color: var(--v3-brand); }
.v3-roi-saida--forte small strong { color: var(--v3-brand-text); }

.v3-roi-faixa { font-family: var(--v3-mono); font-size: 11.5px; }

.v3-roi-ano {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 20px;
	flex-wrap: wrap;
	padding-top: 22px;
	border-top: 1px solid var(--v3-line);
}
.v3-roi-ano-copy {
	margin: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}
.v3-roi-ano-copy span { font-size: 14px; color: var(--v3-ink-2); }
.v3-roi-ano-copy strong {
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 32px;
	line-height: 1;
	letter-spacing: -.02em;
	color: var(--v3-ink);
	font-variant-numeric: tabular-nums;
}

.v3-roi-nota {
	margin: 0;
	font-size: 13px;
	line-height: 1.55;
	color: var(--v3-ink-3);
}

/* ---- calculadora dobrada (/planos-plataforma/) ---- */

/* O <details> e o proprio cartao. Quem abre e fecha e o navegador; nao ha JS
   nenhum atras disto, entao funciona antes do main.js carregar e continua
   funcionando se ele falhar. Fechado, o cartao vira uma linha; aberto, e a
   mesma calculadora de /revendas/. */
.v3-roi--dobra {
	display: block;
	padding: 0;
	overflow: hidden;
	/* Os blocos da tabela de precos se afastam por margem, nao por gap do pai:
	   sem esta linha o simulador encosta no card acima de mil veiculos. Mesmos
	   24px que separam aquele card da grade de faixas. */
	margin-top: 24px;
}

.v3-roi-resumo {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 20px;
	padding: 22px 24px;
	cursor: pointer;
	list-style: none;
	user-select: none;
}
/* O triangulo padrao do Safari e do Chrome sai: o botao ja diz o que acontece. */
.v3-roi-resumo::-webkit-details-marker { display: none; }
.v3-roi-resumo::marker { content: ''; }

.v3-roi-resumo:hover .v3-roi-resumo-btn,
.v3-roi-resumo:focus-visible .v3-roi-resumo-btn {
	border-color: var(--v3-brand);
	color: var(--v3-brand);
}

.v3-roi-resumo-txt {
	display: grid;
	gap: 4px;
	min-width: 0;
}
.v3-roi-resumo-txt strong {
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 1.2rem;
	line-height: 1.25;
	letter-spacing: -.015em;
	color: var(--v3-ink);
}
.v3-roi-resumo-txt small {
	font-size: 14px;
	line-height: 1.5;
	color: var(--v3-ink-2);
}

.v3-roi-resumo-btn {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	flex: none;
	padding: 10px 18px;
	border: 1px solid var(--v3-line-strong);
	border-radius: 8px;
	background: var(--v3-page);
	font-size: 14.5px;
	font-weight: 600;
	color: var(--v3-ink);
	transition: color .16s ease, border-color .16s ease;
}
.v3-roi-resumo-btn svg { transition: transform .18s ease; }
.v3-roi--dobra[open] .v3-roi-resumo-btn svg { transform: rotate(180deg); }

/* Aberto, o resumo ganha um fio embaixo para separar do corpo. */
.v3-roi--dobra[open] .v3-roi-resumo { border-bottom: 1px solid var(--v3-line); }

.v3-roi-corpo {
	display: flex;
	flex-direction: column;
	gap: 24px;
	padding: 24px;
}

@media (prefers-reduced-motion: no-preference) {
	.v3-roi--dobra[open] .v3-roi-corpo { animation: v3-roi-abre .22s ease both; }
}
@keyframes v3-roi-abre {
	from { opacity: 0; transform: translateY(-6px); }
	to   { opacity: 1; transform: none; }
}

@media (max-width: 720px) {
	.v3-roi-resumo { flex-direction: column; align-items: stretch; gap: 14px; padding: 20px; }
	.v3-roi-resumo-btn { justify-content: center; }
	.v3-roi-corpo { padding: 20px; }
}

@media (max-width: 1000px) {
	.v3-tier-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.sl-special.v3-tier-especial { grid-template-columns: minmax(0, 1fr); gap: 22px; }
	.v3-planos-hero-grid { grid-template-columns: minmax(0, 1fr); gap: 30px; }
	.v3-planos-inclusos { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.v3-planos-inclusos li:nth-child(3n) { border-right: 1px solid var(--v3-line); }
	.v3-planos-inclusos li:nth-child(2n) { border-right: 0; }
	.v3-rev-hero-grid { grid-template-columns: minmax(0, 1fr); gap: 32px; }
	.v3-rev-hero-img { max-height: 360px; }
	.v3-roi-entradas { grid-template-columns: minmax(0, 1fr); gap: 20px; }
	.v3-roi-saidas { grid-template-columns: minmax(0, 1fr); }
}

@media (max-width: 720px) {
	.v3-planos-hero { padding: 48px 0 40px; }
	.v3-planos-hero-img { max-height: 300px; }
	.v3-planos-hero-lede { font-size: 17px; }
	.v3-tier-grid { grid-template-columns: minmax(0, 1fr); }
	.v3-tier-starter { flex-direction: column; align-items: flex-start; gap: 14px; }
	.v3-tier-starter-lado { width: 100%; justify-content: space-between; gap: 12px; }
	.sl-special.v3-tier-especial { padding: 22px !important; }
	.v3-planos-inclusos { grid-template-columns: minmax(0, 1fr); }
	.v3-planos-inclusos li { border-right: 0; padding: 13px 18px; }
	.v3-planos-ficha-topo, .v3-planos-nota { padding-inline: 18px; }
	.v3-rev-hero { padding: 48px 0 56px; }
	.v3-rev-hero-lede { font-size: 17px; }
	.v3-rev-hero-ctas .v3-btn { width: 100%; }
	.v3-roi-ano .v3-btn { width: 100%; }
}

@media (prefers-reduced-motion: reduce) {
	.v3-tier-slider-hint { transition: none; }
}

/* ---- diagnostico do painel, so para admin ---- */

/* Amarelo de aviso de ferramenta, nao da paleta da marca: e proposital que
   pareca um bilhete do sistema e nao parte do site. Visitante nunca ve isto,
   porque o PHP so imprime para quem tem edit_theme_options. */
.v3-dash-diag {
	margin: 12px 0 0;
	padding: 10px 14px;
	background: #FFF7E6;
	border: 1px solid #F0D9A8;
	border-radius: 8px;
	font-size: 13px;
	line-height: 1.5;
	color: #6B4E11;
}
.v3-dash-diag strong { font-weight: 600; }

.v3-dash-diag-tec {
	display: block;
	margin-top: 6px;
	font-family: var(--v3-mono);
	font-size: 11.5px;
	line-height: 1.5;
	color: #8A6A2A;
	word-break: break-word;
}

/* ---- ponte entre planos, plataforma e revendas ---- */

/* Fundo alternado por conta propria: o bloco entra no fim de tres paginas
   diferentes, e em cada uma a secao anterior tem uma cor. O :not evita
   empilhar duas faixas cinza quando quem vem antes ja e cinza. */
.v3-ponte { background: var(--v3-page-alt); }
.v3-section--alt + .v3-ponte { background: var(--v3-page); }

.v3-ponte-grid {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 20px;
}

/* Nas paginas de fora do trio (gestores de frota) o bloco mostra os TRES
   destinos. Sem esta regra o terceiro caia sozinho numa segunda fila, com o
   dobro da largura dos dois de cima. A classe ja existia no PHP desde a
   v3.5.5; faltava a regra. */
.v3-ponte--tres .v3-ponte-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }

/* Desde a v3.6.3 o cartao usa a pele do trio de comandos (.v3-cta-card, com
   imagem no topo e o corpo com padding proprio), entao o alinhamento do botao
   ja vem de la e o que sobra aqui e so o respiro do fim. */
.v3-ponte-card .v3-cta-card-corpo .v3-card-actions { padding-top: 4px; }

@media (max-width: 1000px) {
	/* Tres colunas nao cabem no tablet: viram duas, e o terceiro cartao desce
	   com a largura de um so. */
	.v3-ponte--tres .v3-ponte-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 720px) {
	.v3-ponte-grid,
	.v3-ponte--tres .v3-ponte-grid { grid-template-columns: minmax(0, 1fr); }
	.v3-ponte-card .v3-btn { width: 100%; }
}

/* Os dois botoes do rodape da calculadora de margem. */
.v3-roi-ano-acoes {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
}

@media (max-width: 720px) {
	.v3-roi-ano-acoes { width: 100%; }
	.v3-roi-ano-acoes .v3-btn { width: 100%; }
}

/* ==========================================================================
   13. Paginas /gestores-de-frota/ e /planos/pacotes-sms/ (rodada v3.5.5)

   A calculadora de economia reusa o vocabulario .v3-roi-* de /revendas/: sao
   a mesma peca com contas diferentes, e dois estilos para isso seria ruido.
   O que e proprio daqui sao os cinco vetores de economia e a barra de retorno.
   ========================================================================== */

/* ---- gestores de frota: hero ---- */

.v3-frota-hero {
	padding: 72px 0 64px;
	border-bottom: 1px solid var(--v3-line);
}

.v3-frota-hero-copy { max-width: 780px; }

.v3-frota-hero-title {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}

.v3-frota-hero-lede {
	max-width: 620px;
	margin: 22px 0 0;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-frota-hero-ctas {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 30px;
}

.v3-frota-hero-stats { margin-top: 34px; }

/* ---- calculadora de economia ---- */

/* Seis entradas, entao a grade e mais apertada que a da calculadora de margem,
   que tem tres. */
.v3-sav-entradas { grid-template-columns: repeat(3, minmax(0, 1fr)); }

.v3-sav-regiao { gap: 8px; }
.v3-sav-regiao label {
	font-size: 14px;
	font-weight: 500;
	color: var(--v3-ink-2);
}

.v3-sav-select {
	width: 100%;
	padding: 9px 12px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line-strong);
	border-radius: 8px;
	color: var(--v3-ink);
	font-family: var(--v3-body);
	font-size: 15px;
	line-height: 1.3;
	cursor: pointer;
}
.v3-sav-select:focus-visible { outline: 2px solid var(--v3-brand); outline-offset: 2px; }

.v3-sav-hint {
	font-size: 12.5px;
	line-height: 1.4;
	color: var(--v3-ink-3);
}

/* Os cinco vetores. Cartao dentro de cartao: fundo alt para separar do painel
   sem precisar de mais uma borda forte. */
.v3-sav-vetores {
	display: grid;
	grid-template-columns: repeat(5, minmax(0, 1fr));
	gap: 14px;
	padding-top: 22px;
	border-top: 1px solid var(--v3-line);
}

.v3-sav-vetor {
	display: flex;
	flex-direction: column;
	gap: 6px;
	padding: 14px 16px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
}

.v3-sav-vetor-topo {
	display: flex;
	align-items: center;
	gap: 9px;
	flex-wrap: wrap;
}

.v3-sav-vetor-ico { width: 30px; height: 30px; border-radius: 8px; }
.v3-sav-vetor-ico svg { width: 16px; height: 16px; }

.v3-sav-vetor-nome {
	min-width: 0;
	font-size: 13.5px;
	font-weight: 600;
	line-height: 1.25;
	color: var(--v3-ink);
}

/* A porcentagem e o quanto cada frente economiza: numero, nao acao. */
.v3-sav-vetor-pct {
	flex: none;
	font-family: var(--v3-mono);
	font-size: 11.5px;
	color: var(--v3-brand-text);
}

.v3-sav-vetor-valor {
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 22px;
	line-height: 1.1;
	letter-spacing: -.02em;
	color: var(--v3-ink);
	font-variant-numeric: tabular-nums;
}

.v3-sav-vetor-sub {
	font-size: 12px;
	line-height: 1.4;
	color: var(--v3-ink-3);
}

/* Retorno: a barra e o unico movimento do bloco, e quem escreve a largura dela
   e o main.js, no atributo style. */
.v3-sav-retorno {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 24px;
	flex-wrap: wrap;
	padding-top: 22px;
	border-top: 1px solid var(--v3-line);
}

.v3-sav-retorno-copy {
	display: flex;
	flex-direction: column;
	gap: 6px;
	min-width: 260px;
	flex: 1 1 260px;
}

.v3-sav-retorno-rotulo { font-size: 14px; color: var(--v3-ink-2); }

.v3-sav-retorno-valor {
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 30px;
	line-height: 1;
	letter-spacing: -.02em;
	color: var(--v3-brand);
	font-variant-numeric: tabular-nums;
}

.v3-sav-barra {
	height: 6px;
	border-radius: 3px;
	background: var(--v3-line);
	overflow: hidden;
}
.v3-sav-barra span {
	display: block;
	height: 100%;
	width: 0;
	border-radius: 3px;
	background: var(--v3-brand);
	transition: width .35s ease;
}

.v3-sav-retorno-meta { font-size: 12.5px; color: var(--v3-ink-3); }

.v3-sav-retorno-acoes {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
}

/* ---- pacotes de SMS: hero ---- */

.v3-sms-hero {
	padding: 72px 0 64px;
	border-bottom: 1px solid var(--v3-line);
}

.v3-sms-hero-grid {
	display: grid;
	grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
	gap: 48px;
	align-items: center;
}
.v3-sms-hero-grid--solo { grid-template-columns: minmax(0, 1fr); }
.v3-sms-hero-grid--solo .v3-sms-hero-copy { max-width: 760px; }

.v3-sms-hero-copy { min-width: 0; }

.v3-sms-hero-title {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}

.v3-sms-hero-lede {
	max-width: 560px;
	margin: 22px 0 0;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-sms-hero-ctas {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 30px;
}

.v3-sms-hero-nota {
	margin: 20px 0 0;
	font-size: 14px;
	color: var(--v3-ink-3);
}

.v3-sms-hero-visual { min-width: 0; }
.v3-sms-hero-img {
	display: block;
	width: 100%;
	height: auto;
	max-height: 420px;
	object-fit: contain;
	border-radius: 14px;
}

/* ---- pacotes de SMS: os tres pacotes ---- */

.v3-sms-pack { gap: 6px; }

.v3-sms-pack-selo {
	margin: 0;
	font-family: var(--v3-mono);
	font-size: 11.5px;
	letter-spacing: .04em;
	color: var(--v3-ink-3-strong);
}
/* O pacote recomendado marca com o laranja de TEXTO, nao com fundo colorido. */
.v3-sms-pack--pop .v3-sms-pack-selo { color: var(--v3-brand-text); font-weight: 600; }

.v3-sms-pack-volume {
	margin: 4px 0 0;
	font-size: 15px;
	color: var(--v3-ink-2);
}
.v3-sms-pack-volume strong {
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 30px;
	line-height: 1;
	letter-spacing: -.02em;
	color: var(--v3-ink);
	font-variant-numeric: tabular-nums;
}

.v3-sms-pack-preco {
	margin: 8px 0 0;
	display: flex;
	align-items: baseline;
	gap: 6px;
	font-family: var(--v3-display);
	font-size: 17px;
	color: var(--v3-brand);
}
.v3-sms-pack-preco strong {
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 28px;
	line-height: 1;
	letter-spacing: -.02em;
}
.v3-sms-pack-preco span {
	font-family: var(--v3-body);
	font-size: 13px;
	color: var(--v3-ink-3);
}

.v3-sms-pack-taxa {
	margin: 0;
	font-size: 13.5px;
	color: var(--v3-ink-3);
}

.v3-sms-pack .v3-card-actions { margin-top: auto; padding-top: 14px; }
.v3-sms-pack .v3-btn { width: 100%; }

/* O codigo do pacote viaja na URL de compra e e a chave do relatorio: fica
   visivel, discreto, para quem precisa conferir o que comprou. */
.v3-sms-pack-sku {
	margin: 0;
	font-family: var(--v3-mono);
	font-size: 11px;
	color: var(--v3-ink-3);
}

/* Lista do que vem junto com o credito. Ela vinha depois do cartao da
   simulacao, que era quem dava o respiro; com o cartao fora, a lista encostava
   nos tres cartoes de preco e passava a ler como rodape do terceiro cartao.
   A hairline devolve a separacao sem precisar embrulhar a lista num cartao,
   que seria caixa dentro de caixa logo abaixo de outras tres. */
.v3-sms-recursos {
	margin-top: 36px;
	padding-top: 30px;
	border-top: 1px solid var(--v3-line);
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 12px 28px;
}

/* ---- app Smart SMS ---- */

.v3-sms-app {
	display: grid;
	grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
	gap: 48px;
	align-items: center;
}
.v3-sms-app:not(:has(.v3-sms-app-visual)) { grid-template-columns: minmax(0, 1fr); }

.v3-sms-app-copy { min-width: 0; }

.v3-sms-app-tag {
	margin: 0 0 10px;
	font-family: var(--v3-mono);
	font-size: 12px;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--v3-brand-text);
}

.v3-sms-app-lede {
	max-width: 560px;
	margin: 16px 0 0;
	font-size: 17px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-sms-app-lista { margin-top: 20px; }

.v3-sms-app-lojas {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 28px;
}

/* Botao de loja: mesma altura e mesmo raio dos botoes do site, sem imitar o
   badge oficial (que e imagem e envelhece mal em tema escuro). */
.v3-loja {
	display: inline-flex;
	align-items: center;
	gap: 11px;
	padding: 10px 18px 10px 15px;
	background: var(--v3-ink);
	border: 1px solid var(--v3-ink);
	border-radius: 8px;
	color: var(--v3-page);
	text-decoration: none;
	transition: opacity .18s ease;
}
.v3-loja:hover { opacity: .88; color: var(--v3-page); }

.v3-loja-ico { display: inline-flex; flex: none; }

.v3-loja-txt { display: flex; flex-direction: column; line-height: 1.15; }
.v3-loja-txt small { font-size: 11px; opacity: .78; }
.v3-loja-txt strong {
	font-family: var(--v3-body);
	font-size: 15px;
	font-weight: 600;
}

/* Loja que ainda nao existe: fica cinza e sem link, para nao prometer o que
   nao abre. */
.v3-loja--breve {
	background: transparent;
	border-color: var(--v3-line-strong);
	color: var(--v3-ink-3);
	cursor: default;
}
.v3-loja--breve .v3-loja-txt strong { color: var(--v3-ink-2); }

.v3-sms-app-visual { min-width: 0; }
.v3-sms-app-img {
	display: block;
	width: 100%;
	height: auto;
	max-height: 480px;
	object-fit: contain;
}

@media (max-width: 1000px) {
	.v3-sav-entradas { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.v3-sav-vetores { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.v3-sms-hero-grid { grid-template-columns: minmax(0, 1fr); gap: 30px; }
	.v3-sms-app { grid-template-columns: minmax(0, 1fr); gap: 30px; }
	.v3-sms-recursos { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 720px) {
	.v3-frota-hero { padding: 48px 0 44px; }
	.v3-frota-hero-lede, .v3-sms-hero-lede { font-size: 17px; }
	.v3-frota-hero-ctas .v3-btn, .v3-sms-hero-ctas .v3-btn { width: 100%; }
	.v3-sav-entradas { grid-template-columns: minmax(0, 1fr); }
	.v3-sav-vetores { grid-template-columns: minmax(0, 1fr); }
	.v3-sav-retorno-acoes { width: 100%; }
	.v3-sav-retorno-acoes .v3-btn { width: 100%; }
	.v3-sms-hero { padding: 48px 0 44px; }
	.v3-sms-hero-img { max-height: 300px; }
	/* No celular os cartoes ja empilham e a coluna fica estreita: o mesmo
	   respiro de desktop viraria um vao morto entre o ultimo cartao e a lista. */
	.v3-sms-recursos {
		margin-top: 28px;
		padding-top: 24px;
		grid-template-columns: minmax(0, 1fr);
	}
	.v3-sms-app-lojas .v3-loja { width: 100%; }
}

@media (prefers-reduced-motion: reduce) {
	.v3-sav-barra span { transition: none; }
	.v3-loja { transition: none; }
}

/* ---- moldura de telefone (.v3-fone) ---- */

/* O admin sobe o print PURO do celular e a moldura e desenhada aqui. Motivo:
   mockup montado no Photoshop envelhece (sombra fixa, fundo fixo, resolucao
   fixa) e quase sempre chega com o fundo errado no tema escuro.

   De proposito diferente da dupla de celulares de /conhecer-plataforma/: la
   sao dois aparelhos escuros, inclinados, sobrepostos e com entalhe; aqui e um
   so, reto, com moldura fina e botoes laterais. Mesma familia, pecas
   diferentes. */
.v3-fone {
	position: relative;
	width: min(100%, 300px);
	margin: 0 auto;
	padding: 11px;
	background: var(--v3-ink);
	border-radius: 44px;
	box-shadow:
		inset 0 0 0 1px rgba(255, 255, 255, .10),
		0 24px 60px -24px rgba(17, 24, 39, .45);
}

/* Botoes laterais: dois tracinhos que passam de fora da moldura. Sao o detalhe
   que faz o desenho ler como aparelho e nao como cartao arredondado. */
.v3-fone-btn {
	position: absolute;
	width: 3px;
	background: var(--v3-ink);
	border-radius: 2px;
}
.v3-fone-btn--vol {
	left: -3px;
	top: 108px;
	height: 74px;
}
.v3-fone-btn--liga {
	right: -3px;
	top: 132px;
	height: 52px;
}

.v3-fone-tela {
	position: relative;
	overflow: hidden;
	border-radius: 34px;
	background: var(--v3-demo-bg);
	/* Proporcao de celular moderno. Segura o layout enquanto a imagem carrega
	   e evita que print de proporcao diferente estique a moldura. */
	aspect-ratio: 9 / 19.5;
}

.v3-fone-img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: top center;
}

/* ---- moldura de navegador (.v3-nave) ---- */

/* Mesma ideia da moldura de telefone. Sem as tres bolinhas coloridas do macOS:
   elas sairam do site na v3 e aqui nao informam nada. O que informa e o
   endereco, entao ele fica. */
.v3-nave {
	overflow: hidden;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 12px;
	box-shadow: 0 24px 60px -30px rgba(17, 24, 39, .30);
}

.v3-nave-barra {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 10px 14px;
	background: var(--v3-page-alt);
	border-bottom: 1px solid var(--v3-line);
}

.v3-nave-setas {
	display: inline-flex;
	gap: 6px;
	flex: none;
	color: var(--v3-ink-3);
}

.v3-nave-url {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	min-width: 0;
	padding: 5px 14px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 999px;
	font-family: var(--v3-mono);
	font-size: 12px;
	line-height: 1.4;
	color: var(--v3-ink-3-strong);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.v3-nave-url svg { flex: none; color: var(--v3-ok); }

.v3-nave-tela {
	overflow: hidden;
	background: var(--v3-demo-bg);
}

.v3-nave-img {
	display: block;
	width: 100%;
	height: auto;
}

/* ---- ajustes das secoes que usam as molduras ---- */

.v3-sms-app--solo { grid-template-columns: minmax(0, 1fr); }

.v3-sms-web-itens { margin-top: 32px; }
.v3-sms-web-itens + .v3-plat-bridge { margin-top: 32px; }

@media (max-width: 1000px) {
	.v3-grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.v3-fone { width: min(100%, 260px); }
}

@media (max-width: 720px) {
	.v3-grid-4 { grid-template-columns: minmax(0, 1fr); }
	.v3-fone { width: min(100%, 240px); padding: 9px; border-radius: 38px; }
	.v3-fone-tela { border-radius: 30px; }
	.v3-nave-setas { display: none; }
}

/* ---- Smarts App (/planos/smartsapp/) ---- */

.v3-sa-hero {
	padding: 72px 0 64px;
	border-bottom: 1px solid var(--v3-line);
}

.v3-sa-hero-grid {
	display: grid;
	grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
	gap: 48px;
	align-items: center;
}
.v3-sa-hero-grid--solo { grid-template-columns: minmax(0, 1fr); }
.v3-sa-hero-grid--solo .v3-sa-hero-copy { max-width: 760px; }

.v3-sa-hero-copy { min-width: 0; }

.v3-sa-hero-title {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}

.v3-sa-hero-lede {
	max-width: 560px;
	margin: 22px 0 0;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-sa-hero-ctas {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 30px;
}

.v3-sa-hero-nota {
	margin: 20px 0 0;
	font-size: 14px;
	color: var(--v3-ink-3);
}

.v3-sa-hero-visual { min-width: 0; }
.v3-sa-hero-img {
	display: block;
	width: 100%;
	height: auto;
	max-height: 460px;
	object-fit: contain;
	border-radius: 14px;
}

/* Cartoes de plano: o preco e a unica coisa em laranja, e o card recomendado
   se marca pelo selo, nao por fundo colorido. */
.v3-sa-plano { gap: 8px; }

.v3-sa-plano-selo {
	margin: 0;
	font-family: var(--v3-mono);
	font-size: 11.5px;
	letter-spacing: .04em;
	color: var(--v3-ink-3-strong);
}
.v3-sa-plano--pop .v3-sa-plano-selo { color: var(--v3-brand-text); font-weight: 600; }

.v3-sa-plano-preco {
	margin: 2px 0 4px;
	display: flex;
	align-items: baseline;
	gap: 6px;
	font-family: var(--v3-display);
	font-size: 17px;
	color: var(--v3-brand);
}
.v3-sa-plano-preco strong {
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 30px;
	line-height: 1;
	letter-spacing: -.02em;
}
.v3-sa-plano-preco span {
	font-family: var(--v3-body);
	font-size: 13px;
	color: var(--v3-ink-3);
}

.v3-sa-plano .v3-card-actions { margin-top: auto; padding-top: 14px; }
.v3-sa-plano .v3-btn { width: 100%; }

/* Passos: o numero e grande e laranja, que e um dos lugares onde a cor pode
   aparecer (estatistica ou marcador de ordem), e nao compete com o botao. */
.v3-sa-passo { gap: 8px; }

.v3-sa-passo-n {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	border-radius: 9px;
	background: var(--v3-brand-soft);
	color: var(--v3-brand);
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 17px;
	line-height: 1;
}

.v3-sa-nave { margin-top: 32px; }
.v3-sa-nave + .v3-plat-bridge { margin-top: 32px; }

@media (max-width: 1000px) {
	.v3-sa-hero-grid { grid-template-columns: minmax(0, 1fr); gap: 30px; }
}

@media (max-width: 720px) {
	.v3-sa-hero { padding: 48px 0 44px; }
	.v3-sa-hero-lede { font-size: 17px; }
	.v3-sa-hero-ctas .v3-btn { width: 100%; }
	.v3-sa-hero-img { max-height: 320px; }
}

/* ---- conversa de WhatsApp desenhada (.v3-zap) ---- */

/* Vive dentro da .v3-fone. Desenhada em vez de print porque conversa real leva
   numero e nome de cliente junto, e isso nao vai para pagina publica.
   Escura de proposito: e a mesma familia das telas de produto do site, e o
   WhatsApp escuro e o que a maioria usa hoje. */
.v3-zap {
	display: flex;
	flex-direction: column;
	height: 100%;
	background: var(--v3-demo-bg);
	color: var(--v3-demo-ink);
	font-family: var(--v3-body);
	font-size: 12px;
	line-height: 1.4;
	text-align: left;
}

.v3-zap-topo {
	display: flex;
	align-items: center;
	gap: 9px;
	flex: none;
	padding: 28px 13px 9px;
	background: var(--v3-demo-card);
	border-bottom: 1px solid var(--v3-demo-line);
}

.v3-zap-voltar { display: inline-flex; flex: none; color: var(--v3-demo-ink-2); }

.v3-zap-avatar {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: none;
	width: 30px;
	height: 30px;
	border-radius: 50%;
	background: var(--v3-brand-soft);
	color: var(--v3-brand);
}

.v3-zap-quem { display: flex; flex-direction: column; min-width: 0; }
.v3-zap-quem strong {
	font-size: 12.5px;
	font-weight: 600;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.v3-zap-quem small { font-size: 10.5px; color: var(--v3-demo-ink-3); }

/* O fundo da conversa: um tom acima do fundo do app, para os baloes lerem como
   cartao por cima. Sem o papel de parede do WhatsApp, que aqui so faria sujeira. */
.v3-zap-fundo {
	flex: 1 1 auto;
	min-height: 0;
	display: flex;
	flex-direction: column;
	/* Ancorado embaixo, como conversa de verdade: se um dia o texto crescer e
	   nao couber, quem sai de vista e a mensagem MAIS VELHA, no topo, e nunca a
	   mais nova. Sem isto, texto maior comeria justamente o alerta do veiculo,
	   que e o segundo balao e um dos dois produtos da pagina. */
	justify-content: flex-end;
	gap: 7px;
	padding: 11px 10px;
	overflow: hidden;
	background: #0E1216;
}

.v3-zap-dia {
	align-self: center;
	padding: 3px 10px;
	border-radius: 999px;
	background: var(--v3-demo-card);
	font-size: 10px;
	color: var(--v3-demo-ink-3);
}

/* Balao recebido: encostado a esquerda, com o canto de cima cortado, que e o
   desenho que o olho reconhece como mensagem que chegou. */
.v3-zap-balao {
	position: relative;
	align-self: flex-start;
	max-width: 92%;
	display: flex;
	flex-direction: column;
	gap: 5px;
	padding: 8px 10px 15px;
	background: var(--v3-demo-card);
	border-radius: 10px 10px 10px 3px;
}

.v3-zap-txt { margin: 0; color: var(--v3-demo-ink); }
.v3-zap-txt strong { font-weight: 600; }
.v3-zap-txt--meta { color: var(--v3-demo-ink-2); font-size: 11.5px; }
/* O link do boleto: azul de sistema, que e como o WhatsApp mostra. */
.v3-zap-txt--link {
	padding-top: 6px;
	border-top: 1px solid var(--v3-demo-line);
	color: var(--v3-selecao);
}

.v3-zap-anexo {
	display: flex;
	align-items: center;
	gap: 9px;
	padding: 7px 8px;
	background: var(--v3-demo-bg);
	border-radius: 8px;
}
.v3-zap-anexo-ico {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: none;
	width: 30px;
	height: 30px;
	border-radius: 7px;
	background: var(--v3-brand-soft);
	color: var(--v3-brand);
}
.v3-zap-anexo-txt { display: flex; flex-direction: column; min-width: 0; }
.v3-zap-anexo-txt strong {
	font-size: 11.5px;
	font-weight: 600;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.v3-zap-anexo-txt small { font-size: 10px; color: var(--v3-demo-ink-3); }

.v3-zap-tag {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	align-self: flex-start;
	font-family: var(--v3-mono);
	font-size: 10px;
	letter-spacing: .04em;
	text-transform: uppercase;
	color: var(--v3-demo-ink-2);
}

.v3-zap-hora {
	position: absolute;
	right: 10px;
	bottom: 5px;
	font-size: 9.5px;
	color: var(--v3-demo-ink-3);
}

.v3-zap-barra {
	display: flex;
	align-items: center;
	gap: 8px;
	flex: none;
	padding: 8px 11px 13px;
	background: var(--v3-demo-card);
}
.v3-zap-campo {
	flex: 1 1 auto;
	padding: 7px 12px;
	border-radius: 999px;
	background: var(--v3-demo-bg);
	font-size: 11.5px;
	color: var(--v3-demo-ink-3);
}
.v3-zap-enviar {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: none;
	width: 30px;
	height: 30px;
	border-radius: 50%;
	background: var(--v3-brand);
	color: #fff;
}

/* ---- Site e Hospedagem (/site-e-hospedagem/) ---- */

/* Mesma casca de hero das outras paginas da rodada. O que muda aqui e a
   moldura de navegador virar link: a pagina vende um site, entao o print do
   exemplo tem que ser clicavel. */
.v3-sh-hero {
	padding: 72px 0 64px;
	border-bottom: 1px solid var(--v3-line);
}

.v3-sh-hero-grid {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	gap: 48px;
	align-items: center;
}
.v3-sh-hero-grid--solo { grid-template-columns: minmax(0, 1fr); }
.v3-sh-hero-grid--solo .v3-sh-hero-copy { max-width: 760px; }

.v3-sh-hero-copy { min-width: 0; }

.v3-sh-hero-title {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}

.v3-sh-hero-lede {
	max-width: 560px;
	margin: 22px 0 0;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-sh-hero-ctas {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 30px;
}

.v3-sh-hero-nota {
	margin: 20px 0 0;
	font-size: 14px;
	color: var(--v3-ink-3);
}

.v3-sh-hero-visual { min-width: 0; }

/* A .v3-nave nasceu <div>; aqui ela e <a>, entao precisa voltar a ser bloco e
   perder o sublinhado que o link herda. */
.v3-sh-nave {
	display: block;
	text-decoration: none;
	color: inherit;
	transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease;
}
.v3-sh-nave:hover,
.v3-sh-nave:focus-visible {
	transform: translateY(-2px);
	border-color: var(--v3-line-strong);
	box-shadow: 0 28px 66px -28px rgba(17, 24, 39, .38);
}
.v3-sh-nave:hover .v3-sh-nave-abrir { color: var(--v3-brand); }

/* O icone de "abrir em nova aba" mora no fim da barra, que e onde o navegador
   de verdade poe os botoes dele. */
.v3-sh-nave-abrir {
	display: inline-flex;
	flex: none;
	margin-left: auto;
	color: var(--v3-ink-3);
	transition: color .18s ease;
}

.v3-sh-nave-nota {
	margin: 12px 0 0;
	font-size: 13px;
	color: var(--v3-ink-3);
	text-align: center;
}

/* Cartoes de preco: mesmo desenho dos planos do Smarts App, para as duas
   paginas de venda nao terem dois vocabularios diferentes. */
.v3-sh-plano { gap: 8px; }

.v3-sh-plano-selo {
	margin: 0;
	font-family: var(--v3-mono);
	font-size: 11.5px;
	letter-spacing: .04em;
	color: var(--v3-ink-3-strong);
}

.v3-sh-plano-preco {
	margin: 2px 0 4px;
	display: flex;
	align-items: baseline;
	gap: 6px;
	font-family: var(--v3-display);
	font-size: 17px;
	color: var(--v3-brand);
}
.v3-sh-plano-preco strong {
	font-variation-settings: "wdth" 100, "wght" 600;
	font-size: 34px;
	line-height: 1;
	letter-spacing: -.02em;
}
.v3-sh-plano-preco small {
	font-family: var(--v3-body);
	font-size: 13px;
	color: var(--v3-ink-3);
}

.v3-sh-plano-pag {
	margin: 4px 0 0;
	padding-top: 12px;
	border-top: 1px solid var(--v3-line);
	font-size: 13.5px;
	line-height: 1.5;
	color: var(--v3-ink-3);
}
.v3-sh-plano-pag strong { color: var(--v3-ink-2); font-weight: 600; }

.v3-sh-plano .v3-card-actions { margin-top: auto; padding-top: 14px; }
.v3-sh-plano .v3-btn { width: 100%; }

/* A conta do combo e uma tabelinha, nao um paragrafo: o cliente le a soma de
   cima para baixo e para na linha que interessa. */
.v3-sh-combo { align-items: start; }

.v3-sh-conta {
	display: grid;
	gap: 16px;
	min-width: 280px;
}
.v3-sh-conta ul {
	list-style: none;
	margin: 0;
	padding: 16px 18px;
	display: grid;
	gap: 10px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 9px;
}
.v3-sh-conta li {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 20px;
	font-size: 14px;
	color: var(--v3-ink-2);
}
.v3-sh-conta li strong {
	font-family: var(--v3-mono);
	font-size: 14px;
	color: var(--v3-ink);
	white-space: nowrap;
}
.v3-sh-conta-total {
	padding-top: 10px;
	border-top: 1px solid var(--v3-line);
}
.v3-sh-conta-total strong { font-size: 19px !important; color: var(--v3-brand) !important; }
.v3-sh-conta-ano span,
.v3-sh-conta-ano strong { color: var(--v3-ink-3) !important; font-size: 13px !important; }
.v3-sh-conta .v3-btn { width: 100%; }

@media (max-width: 1000px) {
	.v3-sh-hero-grid { grid-template-columns: minmax(0, 1fr); gap: 30px; }
	.v3-sh-conta { min-width: 0; }
}

@media (max-width: 720px) {
	.v3-sh-hero { padding: 48px 0 44px; }
	.v3-sh-hero-lede { font-size: 17px; }
	.v3-sh-hero-ctas .v3-btn { width: 100%; }
	.v3-sh-planos { grid-template-columns: minmax(0, 1fr); }
}

/* ==========================================================================
   14. Comandos Rastreadores (/comandos-rastreadores/)

   Fragmento do modulo de comandos SMS (spec v3.6): hub, pagina de fabricante
   e pagina de modelo. Tres decisoes que valem para o bloco inteiro:

   - O bloco de comando usa os tokens --v3-demo-* e fica ESCURO nos dois
     temas, como as telas de demonstracao do produto: comando e terminal,
     nao texto corrido. Por isso este bloco quase nao tem regra de tema
     escuro propria: os --v3-demo-* sao fixos e o resto vira sozinho pelos
     tokens --v3-*.
   - A barra do seletor gruda a 70px do topo (a conta esta em .v3-cmd-topo),
     encostada na base do cabecalho flutuante em qualquer pagina.
   - O comando nunca estoura a pagina: o texto quebra em qualquer ponto
     (overflow-wrap anywhere) e, se ainda assim faltar espaco, a LINHA rola
     na horizontal por conta propria. A pagina em si nunca rola de lado.
   ========================================================================== */

/* ---- tokens locais: cor semantica do comando (v3.6.2) ----

   Sao DOIS pares por nivel, porque a mesma entrada pinta duas coisas em
   fundos diferentes: o TITULO fica sobre o cartao (--v3-card, #FFFFFF no
   claro e #171C22 no escuro) e o TEXTO DO COMANDO fica sobre o bloco escuro
   fixo do terminal (--v3-demo-bg, #14181D no claro e #0B0F13 no escuro).
   Por isso os tokens *-cmd NAO tem variante de tema: eles so precisam passar
   sobre fundo escuro, e o pior caso dos dois e o #14181D.

   Contraste medido (AA, piso 4,5:1 . o titulo e um h3 de 17,6px, abaixo dos
   18,66px que liberariam o piso de 3:1, entao vale o 4,5):
     titulo  perigo   #B42318 sobre #FFFFFF  6,57:1  |  #FF7A70 sobre #171C22   6,75:1
     titulo  atencao  #92400E sobre #FFFFFF  7,09:1  |  #FBBF24 sobre #171C22  10,26:1
     titulo  info     #175CD3 sobre #FFFFFF  5,99:1  |  #3B82F6 sobre #171C22   4,66:1
     comando perigo   #FF8A80 sobre #14181D  7,81:1  |  sobre #0B0F13  8,42:1
     comando atencao  #F59E0B sobre #14181D  8,30:1  |  sobre #0B0F13  8,95:1
     comando info     #7AB0FF sobre #14181D  8,05:1  |  sobre #0B0F13  8,68:1

   O amarelo do comando e o --v3-demo-warn que a demo do produto ja usa, sem
   token novo. O info claro e o --v3-selecao escurecido e o info do comando e
   o mesmo azul clareado: o #3B82F6 puro sobre o terminal daria 4,85:1 em
   mono de 13,5px, passa raspando e encosta no cinza do rotulo ao lado. */
:root {
	--v3-cmd-perigo:      #B42318;
	--v3-cmd-atencao:     #92400E;
	--v3-cmd-info:        #175CD3;
	--v3-cmd-perigo-cmd:  #FF8A80;
	--v3-cmd-atencao-cmd: var(--v3-demo-warn);
	--v3-cmd-info-cmd:    #7AB0FF;
}
:root:not([data-theme="light"]) {
	--v3-cmd-perigo:  #FF7A70;
	--v3-cmd-atencao: #FBBF24;
	--v3-cmd-info:    var(--v3-selecao);
}

/* ---- tokens locais: cor por POSICAO na lista de servidores (v3.6.3) ----

   Aqui a cor nao e alerta, e identidade: ela repete o que o rotulo da linha
   ja diz ("Servidor 01"), para o instalador separar de relance qual endereco
   e qual no meio da configuracao. Por isso nao ha selo escrito nem variante
   de tema: estas quatro so precisam passar sobre o bloco escuro do terminal,
   que e fixo nos dois temas, e o pior caso dos dois e o #14181D.

   Nada de cor nova inventada: as quatro ja existiam no arquivo (o azul e o
   vermelho do comando colorido, o verde do status ao vivo da demo e o ambar
   do aviso da demo). Contraste medido sobre #14181D (piso 4,5:1, porque o
   rotulo e mono de 12px):
     s1 azul     #7AB0FF  8,05:1
     s2 verde    #22C55E  7,82:1
     s3 vermelho #FF8A80  7,81:1
     s4 ambar    #F59E0B  8,30:1
   Sobre o #0B0F13 do tema escuro todas sobem, entao o piso e o de cima. */
:root {
	--v3-cmd-s1: var(--v3-cmd-info-cmd);
	--v3-cmd-s2: var(--v3-demo-ok);
	--v3-cmd-s3: var(--v3-cmd-perigo-cmd);
	--v3-cmd-s4: var(--v3-demo-warn);

	/* Verde de TEXTO sobre o cartao. Desde a v3.6.4 o token serve a DOIS
	   usos: o "Link copiado" da barra de compartilhar (v3.6.3) e o titulo do
	   comando de nivel Positivo. Os dois pousam no mesmo fundo (--v3-card),
	   entao dividem o par ja medido em vez de nascer um token por uso, que
	   e como duas verdades sobre a mesma cor comecam a divergir.
	   O --v3-ok do topo do arquivo e cor de bolinha de status e de traco de
	   SVG, onde o piso e 3:1; como texto de 14px sobre o cartao branco o
	   #16A34A da 3,30:1 e reprova. Dai o par proprio:
	     claro  #15803D sobre #FFFFFF  5,02:1
	     escuro #22C55E sobre #171C22  7,52:1
	   O mesmo token pinta a borda do botao, que no piso de 3:1 passa com
	   folga nos dois temas. */
	--v3-cmd-ok: #15803D;

	/* Par do comando (v3.6.4): o verde do titulo nao serve sobre o bloco
	   escuro do terminal. Sem variante de tema, pelo mesmo motivo dos outros
	   *-cmd: so precisa passar sobre fundo escuro, e o pior caso dos dois
	   temas e o #14181D.
	     comando positivo  #22C55E sobre #14181D  7,82:1
	   Sobre o #0B0F13 do tema escuro ele sobe. E o mesmo --v3-demo-ok do s2
	   aqui de cima, de proposito: o verde da lista de servidores e o do
	   comando positivo sao a mesma tinta sobre o mesmo fundo, e repetir o
	   valor so criaria dois lugares para divergir. */
	--v3-cmd-ok-cmd: var(--v3-demo-ok);
}
:root:not([data-theme="light"]) {
	--v3-cmd-ok: var(--v3-demo-ok);
}

/* ---- hero (as tres paginas) ---- */

/* Mesma receita da hero de /planos-plataforma/: copy a esquerda, foto na
   moldura a direita, borda no lugar de fundo decorado. */
.v3-cmd-hero { padding: 72px 0 56px; }

/* Nas paginas de fabricante e modelo a hero e so ancora visual: o conteudo
   real vem logo abaixo, entao ela nao pode empurrar a tela inteira. */
.v3-cmd-hero--compacta { padding: 48px 0 36px; }

.v3-cmd-hero-grid {
	display: grid;
	grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
	gap: 48px;
	align-items: center;
}

/* Sem imagem no Customizer: uma coluna so. Nunca moldura vazia, porque quem
   ve a pagina e o cliente, nao o administrador. */
.v3-cmd-hero-grid--solo { grid-template-columns: minmax(0, 1fr); }
.v3-cmd-hero-grid--solo .v3-cmd-hero-copy { max-width: 760px; }

.v3-cmd-hero-copy { min-width: 0; }

/* O titulo sai num <p> fora da pagina principal (o h1 verdadeiro fica no
   miolo), entao a tipografia de display precisa estar TODA na classe: um <p>
   nao herda nada das regras de h1. */
.v3-cmd-hero-titulo {
	margin: 0;
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 110, "wght" 700;
	font-weight: 700;
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	color: var(--v3-ink);
	text-wrap: balance;
}
/* Compacta um pouco menor: ela apresenta a pagina, nao disputa com o h1 que
   vem logo abaixo da barra. */
.v3-cmd-hero--compacta .v3-cmd-hero-titulo {
	font-size: clamp(1.9rem, 3vw + .5rem, 2.8rem);
}

.v3-cmd-hero-lede {
	margin: 22px 0 0;
	max-width: 640px;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-cmd-hero-ctas {
	margin-top: 30px;
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
}

/* Moldura de foto padrao da rodada: proporcao fixa 3 por 2 para qualquer
   imagem que o admin subir sair do mesmo tamanho e alinhada com o texto. */
.v3-cmd-hero-visual {
	min-width: 0;
	overflow: hidden;
	aspect-ratio: 3 / 2;
	max-height: 460px;
	border-radius: 14px;
}
.v3-cmd-hero--compacta .v3-cmd-hero-visual { max-height: 320px; }
.v3-cmd-hero-img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
}

/* ---- barra sticky: trilha + seletor de rastreador ---- */

/* O top e MEDIDO no bloco do header, no fim deste arquivo (v3.6.2, o 88px de
   antes deixava um vao visivel no desktop):
     - parado ........ a casca .sl-header tem altura fixa de 69px e nao
                       flutua, entao a base do cabecalho fica em 69px;
     - flutuando ..... o cartao .sl-header-inner desce 10px (translateY) e
                       mede 68px, terminando em 78px de tela;
     - flutuando slim  rolando para baixo o cartao encolhe para 52px, entao
                       termina em 62px.
   O estado que importa e o slim, que e justamente o de quem rola a pagina
   para baixo com a barra grudada: 70px deixa 8px de ar ali e 1px parado. Ao
   rolar para cima o cartao volta aos 68px e cobre esses 8px, que sao o
   respiro de cima da barra: a linha tem 58px de altura com 10px de padding,
   entao o cartao passa por cima do ar, nunca da trilha.
   Fundo opaco obrigatorio: sem ele o conteudo da pagina apareceria por
   baixo das palavras. A hairline vai por sombra interna para nao mexer na
   altura da barra. */
.v3-cmd-topo {
	position: sticky;
	top: 70px;
	z-index: 20;
	background: var(--v3-page);
	box-shadow: inset 0 -1px 0 var(--v3-line);
}

.v3-cmd-topo-linha {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 8px 20px;
	padding-top: 10px;
	padding-bottom: 10px;
	min-height: 58px;
}

.v3-cmd-trilha { min-width: 0; }
.v3-cmd-trilha ol {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	list-style: none;
	margin: 0;
	padding: 0;
}
.v3-cmd-trilha li {
	display: inline-flex;
	align-items: center;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.4;
	color: var(--v3-ink-3);
}
.v3-cmd-trilha a {
	color: var(--v3-ink-2);
	text-decoration: none;
}
.v3-cmd-trilha a:hover {
	color: var(--v3-ink);
	text-decoration: underline;
	text-underline-offset: 3px;
}
.v3-cmd-trilha [aria-current="page"] { color: var(--v3-ink); font-weight: 500; }
.v3-cmd-trilha-sep { margin: 0 8px; color: var(--v3-line-strong); }

.v3-cmd-sel { position: relative; flex: none; }

.v3-cmd-sel-abrir {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	padding: 9px 14px;
	background: transparent;
	border: 1px solid var(--v3-line-strong);
	border-radius: 8px;
	font-family: var(--v3-body);
	font-size: 14px;
	font-weight: 600;
	line-height: 1.2;
	color: var(--v3-ink);
	cursor: pointer;
	transition: background-color .15s ease, border-color .15s ease;
}
.v3-cmd-sel-abrir:hover { background: var(--v3-page-alt); }
.v3-cmd-sel-abrir svg { transition: transform .15s ease; }
.v3-cmd-sel-abrir[aria-expanded="true"] svg { transform: rotate(180deg); }

/* Painel do catalogo: card ancorado a direita do botao, com a mesma sombra
   do menu do site. O width respeita a viewport para nunca criar rolagem
   lateral na pagina. */
.v3-cmd-sel-painel {
	position: absolute;
	top: calc(100% + 8px);
	right: 0;
	z-index: 30;
	width: min(560px, calc(100vw - 48px));
	padding: 14px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 12px;
	box-shadow: var(--v3-shadow-menu);
	/* Teto real em tela baixa: sem isto o fundo do painel cai fora da
	   viewport (a barra e sticky, rolar a pagina nao alcanca) e os ultimos
	   modelos ficam inatingiveis. */
	max-height: calc(100vh - 176px);
	max-height: calc(100dvh - 176px);
	overflow-y: auto;
}

.v3-cmd-sel-busca {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 12px;
	background: var(--v3-page);
	border: 1px solid var(--v3-line);
	border-radius: 8px;
	color: var(--v3-ink-3);
	transition: border-color .15s ease;
}
/* O anel de foco fica na caixa, nao no input: e uma peca so aos olhos. */
.v3-cmd-sel-busca:focus-within { border-color: var(--v3-brand); }
.v3-cmd-sel-busca svg { flex: none; }
.v3-cmd-sel-input {
	flex: 1 1 auto;
	min-width: 0;
	padding: 0;
	background: transparent;
	border: 0;
	outline: none;
	font-family: var(--v3-body);
	font-size: 14px;
	line-height: 1.4;
	color: var(--v3-ink);
}
.v3-cmd-sel-input::placeholder { color: var(--v3-ink-3); }

.v3-cmd-sel-colunas {
	display: grid;
	grid-template-columns: 200px minmax(0, 1fr);
	gap: 6px 14px;
	margin-top: 12px;
}

/* A coluna de fabricantes rola sozinha: catalogo grande nao pode fazer o
   painel crescer alem da tela. */
.v3-cmd-sel-fabs {
	display: grid;
	gap: 2px;
	align-content: start;
	max-height: 300px;
	overflow-y: auto;
	padding-right: 4px;
}

.v3-cmd-sel-modelos {
	display: grid;
	gap: 2px;
	align-content: start;
	max-height: 300px;
	overflow-y: auto;
	border-left: 1px solid var(--v3-line);
	padding-left: 14px;
}

.v3-cmd-sel-fab {
	display: block;
	width: 100%;
	padding: 9px 12px;
	background: none;
	border: 0;
	border-radius: 8px;
	font-family: var(--v3-body);
	font-size: 14px;
	font-weight: 500;
	line-height: 1.3;
	text-align: left;
	color: var(--v3-ink-2);
	cursor: pointer;
	transition: background-color .15s ease, color .15s ease;
}
.v3-cmd-sel-fab:hover { background: var(--v3-page-alt); color: var(--v3-ink); }
/* Ativo pelo JS (.is-ativo): filete lateral na cor da marca, o mesmo idioma
   do sublinhado do item ativo do menu. O aria-current impresso no PHP e so a
   semente do estado inicial; quem acende e a classe. */
.v3-cmd-sel-fab.is-ativo {
	background: var(--v3-page-alt);
	color: var(--v3-ink);
	font-weight: 600;
	box-shadow: inset 2px 0 0 var(--v3-brand);
}

.v3-cmd-sel-item {
	display: block;
	padding: 8px 12px;
	border-radius: 8px;
	font-family: var(--v3-body);
	font-size: 14px;
	line-height: 1.35;
	color: var(--v3-ink-2);
	text-decoration: none;
	transition: background-color .15s ease, color .15s ease;
}
.v3-cmd-sel-item:hover { background: var(--v3-page-alt); color: var(--v3-ink); }
/* No item o aria-current fica: ele marca a PAGINA atual, que nao muda quando
   a pessoa so troca a coluna de fabricante. */
.v3-cmd-sel-item[aria-current="true"] {
	background: var(--v3-page-alt);
	color: var(--v3-ink);
	font-weight: 600;
	box-shadow: inset 2px 0 0 var(--v3-brand);
}

/* O painel e as pecas que o JS mostra e esconde vivem de [hidden]; as regras
   de display acima venceriam o default do navegador sem este reforco. */
.v3-cmd-sel-painel[hidden],
.v3-cmd-sel-item[hidden],
.v3-cmd-mais[hidden] { display: none !important; }

/* ---- hub: lista de fabricantes ---- */

.v3-cmd-fabs { padding: 72px 0 80px; }

/* Um fabricante por linha, largura toda (v3.6.2). A grade de tres colunas
   que morava aqui espremia a previa dos modelos em duas palavras, e o nome
   do modelo e justamente o que a pessoa reconhece: agora a lista le como
   indice de catalogo e cada linha tem espaco para os nomes. */
.v3-fab-lista {
	display: grid;
	gap: 10px;
	margin: 0;
	padding: 0;
	list-style: none;
}
.v3-fab-lista li { min-width: 0; }

/* Cartao deitado: mesma pele dos outros cards da rodada (fundo de card,
   hairline, hover so na borda) e tres colunas dentro da linha: foto, corpo
   e seta. */
.v3-fab-item {
	display: grid;
	grid-template-columns: auto minmax(0, 1fr) auto;
	align-items: center;
	column-gap: 18px;
	padding: 14px 20px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
	color: var(--v3-ink);
	text-decoration: none;
	transition: border-color .15s ease;
}
.v3-fab-item:hover { border-color: var(--v3-line-strong); }

/* Caixa de tamanho fixo com respiro por dentro: logo de fabricante vem em
   toda proporcao, e so uma moldura igual para todos alinha os nomes numa
   coluna reta. A imagem e contain, nunca cover: cortar a marca ao meio para
   preencher a caixa seria pior que a caixa com ar. */
.v3-fab-item-media {
	display: flex;
	align-items: center;
	justify-content: center;
	/* border-box explicito: o respiro por dentro nao pode virar tamanho por
	   fora, senao a placa do tema escuro (que usa outro padding) mudaria a
	   largura da coluna ao trocar de tema. */
	box-sizing: border-box;
	width: 56px;
	height: 56px;
	padding: 5px;
}
.v3-fab-item-logo {
	display: block;
	max-width: 100%;
	max-height: 100%;
	width: auto;
	height: auto;
	object-fit: contain;
}
/* Sem logo cadastrado: avatar com a inicial, na tinta fraca da marca. Melhor
   uma letra honesta que um quadrado cinza. */
.v3-fab-item-avatar {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	height: 100%;
	border-radius: 10px;
	background: var(--v3-brand-soft);
	color: var(--v3-brand-text);
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 104, "wght" 650;
	font-size: 19px;
	line-height: 1;
}

.v3-fab-item-corpo {
	display: grid;
	row-gap: 3px;
	min-width: 0;
}
.v3-fab-item-nome {
	font-weight: 600;
	font-size: 16.5px;
	line-height: 1.3;
	color: var(--v3-ink);
}
/* Previa em UMA linha, com reticencias quando estoura: linha de catalogo
   precisa de altura igual, senao a lista vira serrote. A contagem viaja no
   fim da mesma linha e sai em mono para nao virar uma frase so com os nomes;
   ela tambem esta no title do link, entao previa comprida que a empurre para
   fora nao esconde informacao de ninguem. */
/* A linha de baixo do fabricante: contagem primeiro (fora do corte) e, ao
   lado, os nomes dos modelos em pastilhas. Pastilha e nao texto corrido
   porque titulo de modelo do acervo antigo JA tem virgula dentro
   ("TK102, TK103, TK104"): com virgula juntando tudo, ninguem separa onde
   um modelo termina e o outro comeca. */
.v3-fab-item-linha {
	display: flex;
	align-items: center;
	gap: 12px;
	min-width: 0;
}

.v3-fab-item-qtd {
	flex: none;
	font-family: var(--v3-mono);
	font-size: 12.5px;
	color: var(--v3-ink-2);
}

/* Uma linha so, com o excesso desaparecendo no fim em vez de reticencia:
   com pastilha, a reticencia cortaria no meio de um nome e pareceria erro
   de dado. O fabricante inteiro e clicavel, entao o que sobra esta a um
   clique de distancia. */
.v3-fab-item-modelos {
	display: flex;
	align-items: center;
	gap: 6px;
	min-width: 0;
	overflow: hidden;
	flex-wrap: nowrap;
	mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 28px), transparent 100%);
	-webkit-mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 28px), transparent 100%);
}

.v3-fab-item-modelo {
	flex: none;
	padding: 2px 8px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 6px;
	font-size: 12.5px;
	line-height: 1.5;
	color: var(--v3-ink-2);
	white-space: nowrap;
}

/* "e mais N" nao e um modelo: sem caixa, so o texto apagado. */
.v3-fab-item-modelo--resto {
	padding-left: 2px;
	background: none;
	border: 0;
	color: var(--v3-ink-3);
}

.v3-fab-item-seta {
	display: inline-flex;
	color: var(--v3-ink-3);
	transition: color .15s ease;
}
.v3-fab-item:hover .v3-fab-item-seta { color: var(--v3-ink); }

/* Faixa de confianca: uma linha de numeros reais em mono, sem caixa nem
   caixa alta. Discreta de proposito. */
.v3-cmd-stats {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px 12px;
	margin: 28px 0 0;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.5;
	color: var(--v3-ink-3);
}
.v3-cmd-stats-sep { color: var(--v3-line-strong); }

/* ---- pagina do fabricante: cards de modelo ---- */

.v3-cmd-fab { padding: 56px 0 80px; }

/* O h1 desta pagina e de miolo, nao de hero: escala de h2 para nao brigar
   com o titulo grande que a hero acabou de mostrar. */
.v3-cmd-fab .v3-head h1 {
	font-size: clamp(1.9rem, 2.6vw + .6rem, 2.6rem);
	line-height: 1.08;
	letter-spacing: -.02em;
	text-wrap: balance;
}

.v3-cmd-fab-sub {
	margin: 0 0 18px;
	font-variation-settings: "wdth" 104, "wght" 650;
	font-size: 1.2rem;
	line-height: 1.25;
}

/* Card de modelo e um link inteiro; nao usa .v3-card porque a foto precisa
   sangrar ate a borda (padding zero em cima). */
.v3-cmd-modelo-card {
	position: relative;
	display: flex;
	flex-direction: column;
	overflow: hidden;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
	color: var(--v3-ink);
	text-decoration: none;
	transition: border-color .15s ease;
}
.v3-cmd-modelo-card:hover { border-color: var(--v3-line-strong); }

/* Foto de produto e contain, nunca cover: cortar o aparelho ao meio para
   preencher a moldura seria pior que a moldura com ar.

   Moldura mais alta (v3.6.4, pedido do Joao). Com os 160px de antes a area util
   do desktop era 337 x 127, quase 2,6:1 deitada, e foto de rastreador vem
   quadrada ou em pe: quem limitava era a altura, entao um arquivo quadrado
   aparecia com 127px no meio de uma moldura de 337 e o aparelho ficava
   minusculo, que foi o que ele viu na tela. Com 240px a area util vira
   337 x 207 e a mesma foto quadrada ocupa 207, 63% dos 337 em vez de 38%.

   ALTURA FIXA, e nao aspect-ratio, por um motivo medido: a foto e um <img> com
   max-height: 100%, e porcentagem so resolve contra altura DEFINIDA. Com
   aspect-ratio a altura da moldura e derivada do conteudo, o max-height vira
   "none", e ai um PNG quadrado de 800px empurrava a moldura para 370px de
   altura em vez de caber nela. Medido: 369 x 370 com aspect-ratio, 369 x 240
   com altura fixa. Com altura definida o max-height volta a valer e a foto
   encosta nos 207px uteis.

   flex: none porque o card e um flex column dentro de uma grade que estica as
   linhas; sem isso a moldura encolheria no card cujo titulo quebra em duas
   linhas e a fila sairia desalinhada. */
.v3-cmd-modelo-foto {
	display: flex;
	flex: none;
	align-items: center;
	justify-content: center;
	height: 240px;
	padding: 16px;
	background: var(--v3-page-alt);
	border-bottom: 1px solid var(--v3-line);
}

/* Modelo sem foto cadastrada: a moldura fica, com um icone de traco apagado.
   Sem ela o card perdia o topo inteiro e ficava com um vao do tamanho da
   moldura embaixo do nome, porque a grade estica a linha pela altura do card
   mais alto. Mesma receita do .v3-cta-card-topo--neutro. */
.v3-cmd-modelo-foto--vazia { color: var(--v3-line-strong); }
.v3-cmd-modelo-img {
	display: block;
	max-width: 100%;
	max-height: 100%;
	width: auto;
	height: auto;
	object-fit: contain;
}

.v3-cmd-modelo-corpo {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 8px;
	padding: 20px 52px 20px 22px;
}
.v3-cmd-modelo-nome {
	font-weight: 600;
	font-size: 16.5px;
	line-height: 1.3;
	color: var(--v3-ink);
}
.v3-cmd-modelo-chip {
	padding: 3px 9px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 6px;
	font-family: var(--v3-mono);
	font-size: 12px;
	line-height: 1.5;
	color: var(--v3-ink-2);
}
/* Ancorada no canto de baixo: com ou sem foto no card, a seta fica sempre na
   mesma posicao em todos os cards da grade. */
.v3-cmd-modelo-seta {
	position: absolute;
	right: 20px;
	bottom: 24px;
	display: inline-flex;
	color: var(--v3-ink-3);
	transition: color .15s ease;
}
.v3-cmd-modelo-card:hover .v3-cmd-modelo-seta { color: var(--v3-ink); }

/* ---- pagina do modelo: cabecalho e apresentacao ---- */

.v3-cmd-single { padding: 56px 0 80px; }

.v3-cmd-cab { max-width: 760px; margin: 0 0 28px; }

.v3-cmd-titulo {
	font-size: clamp(1.9rem, 2.6vw + .6rem, 2.6rem);
	line-height: 1.08;
	letter-spacing: -.02em;
	text-wrap: balance;
}

.v3-cmd-meta {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 8px 18px;
	margin-top: 14px;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.5;
	color: var(--v3-ink-3);
}
a.v3-cmd-meta-fab {
	color: var(--v3-ink-2);
	text-decoration: underline;
	text-decoration-color: var(--v3-line-strong);
	text-underline-offset: 3px;
}
a.v3-cmd-meta-fab:hover { color: var(--v3-ink); text-decoration-color: var(--v3-ink); }

.v3-cmd-sobre {
	max-width: 680px;
	margin: 0 0 36px;
	font-size: 16px;
	line-height: 1.6;
	color: var(--v3-ink-2);
}
.v3-cmd-sobre p { margin: 0 0 14px; }
.v3-cmd-sobre p:last-child { margin-bottom: 0; }

.v3-cmd-secao .v3-head { margin-bottom: 26px; }

/* Coluna de leitura: cartao de comando com 1200px de largura vira um trilho
   de texto perdido; 860px segura a linha do comando perto do botao. */
.v3-cmd-lista {
	display: grid;
	gap: 16px;
	max-width: 860px;
}

.v3-cmd-especiais { padding: 64px 0 80px; }

/* ---- bloco de comando ---- */

.v3-cmd-bloco { gap: 12px; padding: 22px 24px; }

.v3-cmd-bloco-topo {
	display: flex;
	align-items: baseline;
	gap: 12px;
	min-width: 0;
}
/* Numero da ordem de envio: e informacao de uso, entao recebe o laranja de
   texto (numero e um dos lugares sancionados da cor). */
.v3-cmd-num {
	flex: none;
	min-width: 26px;
	font-family: var(--v3-mono);
	font-size: 13px;
	font-weight: 500;
	color: var(--v3-brand-text);
}
.v3-cmd-bloco-titulo {
	margin: 0;
	min-width: 0;
	font-size: 1.1rem;
	line-height: 1.3;
}
.v3-cmd-tag {
	flex: none;
	align-self: center;
	margin-left: auto;
	padding: 2px 8px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 6px;
	font-family: var(--v3-mono);
	font-size: 11.5px;
	line-height: 1.5;
	color: var(--v3-ink-3);
}

.v3-cmd-bloco-desc {
	margin: 0;
	font-size: 14.5px;
	line-height: 1.55;
	color: var(--v3-ink-2);
}

/* Terminal do comando: escuro nos dois temas, tokens --v3-demo-* fixos.
   O overflow hidden e quem recorta as linhas rolaveis no raio do bloco. */
.v3-cmd-code {
	overflow: hidden;
	background: var(--v3-demo-bg);
	border: 1px solid var(--v3-demo-line);
	border-radius: 10px;
}

.v3-cmd-linha {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 10px 14px;
	overflow-x: auto;
}
/* Hairline entre linhas. O :first-child dentro de .v3-cmd-mais existe porque
   o irmao anterior dele e o wrapper, nao outra linha. */
.v3-cmd-linha + .v3-cmd-linha,
.v3-cmd-mais .v3-cmd-linha:first-child {
	border-top: 1px solid var(--v3-demo-line);
}

.v3-cmd-linha-rotulo {
	flex: 0 1 auto;
	min-width: 0;
	max-width: 40%;
	font-family: var(--v3-mono);
	font-size: 12px;
	line-height: 1.5;
	color: var(--v3-demo-ink-3);
	overflow-wrap: anywhere;
}
.v3-cmd-linha-txt {
	flex: 1 1 auto;
	min-width: 0;
	font-family: var(--v3-mono);
	font-size: 13.5px;
	line-height: 1.55;
	color: var(--v3-demo-ink);
	overflow-wrap: anywhere;
}

.v3-cmd-copiar {
	flex: none;
	margin-left: auto;
	min-height: 32px;
	padding: 5px 12px;
	background: transparent;
	border: 1px solid var(--v3-demo-line);
	border-radius: 7px;
	font-family: var(--v3-body);
	font-size: 12.5px;
	font-weight: 600;
	line-height: 1.2;
	color: var(--v3-demo-ink-2);
	cursor: pointer;
	transition: color .15s ease, border-color .15s ease;
}
.v3-cmd-copiar:hover {
	border-color: var(--v3-demo-ink-3);
	color: var(--v3-demo-ink);
}
.v3-cmd-copiar.is-copiado {
	border-color: var(--v3-demo-ok);
	color: var(--v3-demo-ok);
}

/* Ver mais como botao de texto: a lista de APN inteira aberta por padrao
   afundaria os comandos seguintes da configuracao. */
.v3-cmd-vermais {
	display: block;
	width: 100%;
	padding: 10px 14px;
	background: none;
	border: 0;
	border-top: 1px solid var(--v3-demo-line);
	font-family: var(--v3-body);
	font-size: 13px;
	font-weight: 600;
	line-height: 1.2;
	color: var(--v3-demo-ink-2);
	text-align: center;
	cursor: pointer;
	transition: color .15s ease;
}
.v3-cmd-vermais:hover { color: var(--v3-demo-ink); }

/* Textarea do fallback de copia (criada pelo JS): fora da tela, nunca
   display none, senao o execCommand nao copia nada. */
.v3-cmd-ta {
	position: fixed;
	top: 0;
	left: -9999px;
	width: 1px;
	height: 1px;
	padding: 0;
	border: 0;
	opacity: 0;
}

/* ---- avisos, legado e estado vazio ---- */

/* Barra que so o editor logado ve. Cinza de proposito: e lembrete de
   trabalho, nao alerta para o visitante. */
.v3-cmd-aviso-admin {
	max-width: 860px;
	margin: 0 0 24px;
	padding: 12px 16px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-left: 3px solid var(--v3-line-strong);
	border-radius: 8px;
}
.v3-cmd-aviso-admin p {
	margin: 0;
	font-size: 14px;
	line-height: 1.55;
	color: var(--v3-ink-2);
}
.v3-cmd-aviso-admin a { color: var(--v3-ink); font-weight: 600; }

/* Conteudo no formato antigo: SO contencao. O visual dele continua vindo do
   main-final.css; aqui a missao e nada estourar a coluna nem a pagina. */
.v3-cmd-legado { max-width: 860px; }
.v3-cmd-legado table {
	display: block;
	max-width: 100%;
	overflow-x: auto;
}
.v3-cmd-legado pre { max-width: 100%; overflow-x: auto; }
.v3-cmd-legado img { max-width: 100%; height: auto; }
/* Comandos herdados da familia vem de outra fonte que o conteudo do post:
   um fio separa os dois blocos para a emenda nao parecer texto corrido. */
.v3-cmd-legado-herdado {
	margin-top: 28px;
	padding-top: 24px;
	border-top: 1px solid var(--v3-line);
}

.v3-cmd-vazio { max-width: 640px; }

/* ---- trio de saidas (cta) ---- */

/* Base .v3-card com padding zero: a imagem do topo sangra ate a borda e o
   overflow hidden recorta no raio do card. */
.v3-cta-card { padding: 0; gap: 0; overflow: hidden; }

.v3-cta-card-topo {
	/* Proporcao no lugar de altura fixa (v3.6.3). Com altura fixa o MESMO
	   arquivo era cortado em 2,3:1 no desktop, 2,9:1 no tablet de duas colunas
	   e mais de 4:1 no celular de uma coluna, entao nenhuma recomendacao de
	   tamanho no Customizer podia ser verdadeira em todas as telas. Com
	   proporcao o corte e sempre o mesmo e o texto do Customizer pode dizer
	   um numero de verdade (1200x520). O 23/10 e a proporcao que a altura de
	   160px ja dava na coluna de 368px do desktop: nada muda ali.
	   flex: none porque o card e um flex column e sem isso a moldura encolhe
	   quando o corpo do card cresce. */
	flex: none;
	aspect-ratio: 23 / 10;
	border-bottom: 1px solid var(--v3-line);
}
.v3-cta-card-img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
}
/* Sem imagem no Customizer: padrao neutro com o icone de traco esmaecido.
   Nunca um buraco no card. */
.v3-cta-card-topo--neutro {
	display: flex;
	align-items: center;
	justify-content: center;
	background: var(--v3-page-alt);
	color: var(--v3-line-strong);
}

.v3-cta-card-corpo {
	display: flex;
	flex-direction: column;
	flex: 1 1 auto;
	gap: 12px;
	padding: 24px 26px 26px;
}
/* Botao alinhado na base mesmo quando um card tem texto mais curto. */
.v3-cta-card-corpo .v3-card-actions { margin-top: auto; }

/* ---- tema escuro ---- */

/* Quase tudo ja vira pelos tokens; os --v3-demo-* sao fixos de proposito.
   A unica excecao real: logo de fabricante desenhado para fundo claro some
   no card escuro, entao a area do logo ganha uma placa clara. O var(--v3-ink)
   e quase branco no escuro, o que evita cor fora de token. */
/* Terceira placa clara do modulo, e a que mais rende: foto de produto e
   fotografada sobre fundo branco. No tema escuro sem placa acontecia um dos
   dois desastres, e os dois aparecem no catalogo de verdade: aparelho preto em
   PNG transparente sumia no fundo escuro, e JPG com fundo branco desenhava um
   retangulo branco torto dentro do card. Com a placa, o arquivo de fundo
   branco se funde nela e o PNG transparente ganha contraste. O --v3-ink no
   tema escuro e quase branco, o que mantem a cor dentro dos tokens. */
/* :not(--vazia) porque a placa existe para a FOTO, e moldura vazia nao tem
   foto para salvar. Sem o :not, o modelo sem foto virava um retangulo quase
   branco de 240px dentro do card escuro, mais chamativo que o card ao lado que
   tem foto de verdade, e o icone invertia de peso entre os temas: discreto no
   claro (#C9D0D8 sobre #F5F6F8) e forte no escuro (#37404A sobre a placa
   clara). Fora da placa, a moldura vazia usa --v3-page-alt nos dois temas e o
   icone fica discreto nos dois, que e a receita do .v3-cta-card-topo--neutro
   que este bloco cita. */
:root:not([data-theme="light"]) .v3-cmd-modelo-foto:not(.v3-cmd-modelo-foto--vazia) {
	background: var(--v3-ink);
}

:root:not([data-theme="light"]) .v3-fab-item-media:has(.v3-fab-item-logo) {
	background: var(--v3-ink);
	border-radius: 8px;
	padding: 7px;
}

/* ---- responsivo ---- */

@media (max-width: 1000px) {
	.v3-cmd-hero-grid {
		grid-template-columns: minmax(0, 1fr);
		gap: 32px;
	}
	.v3-cmd-hero-visual { max-height: 360px; }
}

@media (max-width: 720px) {
	.v3-cmd-hero { padding: 56px 0 40px; }
	.v3-cmd-hero--compacta { padding: 40px 0 28px; }
	.v3-cmd-hero-lede { font-size: 17px; }

	.v3-cmd-fabs,
	.v3-cmd-fab,
	.v3-cmd-single,
	.v3-cmd-especiais { padding: 44px 0 56px; }

	/* O top continua o mesmo do desktop de proposito: no celular o cartao
	   flutuante desce 8px em vez de 10 e a casca parada continua com 69px,
	   entao a conta dos 70px cai no mesmo lugar (10px de ar no estado
	   encolhido). So a altura da linha diminui. */
	.v3-cmd-topo-linha { min-height: 52px; }

	/* Painel de largura total: o .v3-cmd-sel vira estatico e o painel passa
	   a se ancorar na propria barra sticky (o ancestral posicionado mais
	   proximo), ocupando a tela de lado a lado com folga. */
	.v3-cmd-sel { position: static; }
	.v3-cmd-sel-painel {
		top: calc(100% + 6px);
		left: 12px;
		right: 12px;
		width: auto;
		max-height: min(70vh, calc(100dvh - 150px));
		overflow-y: auto;
	}

	/* Coluna unica: fabricantes viram uma fileira de botoes com borda e os
	   modelos rolam logo abaixo. O JS e exatamente o mesmo. */
	.v3-cmd-sel-colunas {
		grid-template-columns: minmax(0, 1fr);
		gap: 12px;
	}
	.v3-cmd-sel-fabs {
		display: flex;
		flex-wrap: wrap;
		gap: 6px;
		max-height: none;
		overflow: visible;
		padding-right: 0;
	}
	.v3-cmd-sel-fab {
		width: auto;
		padding: 8px 12px;
		border: 1px solid var(--v3-line);
		background: var(--v3-card);
	}
	/* No formato de fileira o filete lateral leria como defeito; o ativo
	   passa a usar o sublinhado, o mesmo idioma do menu. */
	.v3-cmd-sel-fab.is-ativo {
		border-color: var(--v3-line-strong);
		background: var(--v3-page-alt);
		box-shadow: inset 0 -2px 0 var(--v3-brand);
	}
	.v3-cmd-sel-modelos {
		border-left: 0;
		padding-left: 0;
		max-height: 45vh;
	}

	/* Linha de comando no celular: rotulo em cima, comando e botao embaixo.
	   O botao cresce para alvo de toque confortavel. */
	.v3-cmd-linha { flex-wrap: wrap; row-gap: 6px; }
	.v3-cmd-linha-rotulo { flex: 1 1 100%; max-width: none; }
	.v3-cmd-copiar { min-height: 40px; padding: 8px 14px; }

	.v3-cmd-bloco { padding: 18px; }
	.v3-cmd-modelo-corpo { padding: 18px 48px 18px 18px; }
	.v3-cmd-modelo-seta { right: 16px; bottom: 20px; }
}

/* Input da copia manual (o JS troca o span do comando por ele quando ate o
   fallback de copia falha): input e a excecao das duas travas do anti-copia
   (user-select do main-final.css e ALLOWED_SELECTOR do main.js), entao e o
   unico jeito de o visitante selecionar e copiar na mao em pagina protegida.
   Visual identico ao .v3-cmd-linha-txt para a troca nao pular na tela. */
.v3-cmd-manual {
	flex: 1 1 auto;
	min-width: 0;
	padding: 0;
	background: transparent;
	border: 0;
	font-family: var(--v3-mono);
	font-size: 13.5px;
	line-height: 1.55;
	color: var(--v3-demo-ink);
}

/* ---- acrescimos da v3.6.2 ---- */

/* Cor semantica da entrada. Pinta DUAS coisas e mais nada: o titulo do
   cartao e o texto do comando dentro do terminal. A descricao continua
   neutra de proposito, senao o cartao inteiro vira um bloco colorido e a
   pagina perde a regra de ouro (cor so no que informa ou se clica).
   Os tokens e o contraste medido de cada par estao no comeco do bloco 14. */
.v3-cmd-bloco--perigo .v3-cmd-bloco-titulo  { color: var(--v3-cmd-perigo); }
.v3-cmd-bloco--atencao .v3-cmd-bloco-titulo { color: var(--v3-cmd-atencao); }
.v3-cmd-bloco--info .v3-cmd-bloco-titulo    { color: var(--v3-cmd-info); }

/* O .v3-cmd-manual entra junto porque ele e o MESMO comando: o JS troca o
   span pelo input quando ate o fallback de copia falha, e a troca nao pode
   mudar a cor na cara do visitante. */
.v3-cmd-bloco--perigo .v3-cmd-linha-txt,
.v3-cmd-bloco--perigo .v3-cmd-manual   { color: var(--v3-cmd-perigo-cmd); }
.v3-cmd-bloco--atencao .v3-cmd-linha-txt,
.v3-cmd-bloco--atencao .v3-cmd-manual  { color: var(--v3-cmd-atencao-cmd); }
.v3-cmd-bloco--info .v3-cmd-linha-txt,
.v3-cmd-bloco--info .v3-cmd-manual     { color: var(--v3-cmd-info-cmd); }

/* Nivel Positivo (v3.6.4): o par do Perigo, nao um enfeite. No catalogo real
   o ENGOFF bloqueia o motor e sai vermelho; este e o comando que libera de
   volta, e sem cor propria ele tinha a mesma cara de um comando qualquer.
   Pinta as MESMAS duas coisas dos outros niveis (titulo e texto do comando)
   e nada mais, e NAO ganha selo escrito: selo existe para alerta, e um
   "Seguro" ao lado do titulo convidaria a mandar o comando sem ler o que
   ele faz. Quem nao enxerga a cor aqui nao perde aviso nenhum.
   Contraste medido, mesmo criterio do resto do bloco:
     titulo   #15803D sobre #FFFFFF  5,02:1  |  #22C55E sobre #171C22  7,52:1
     comando  #22C55E sobre #14181D  7,82:1  (sobre o #0B0F13 sobe)
   O .v3-cmd-manual entra junto pelo motivo de sempre: o JS troca o span pelo
   input quando ate o fallback de copia falha, e a troca nao pode mudar a cor
   na cara do visitante. */
.v3-cmd-bloco--ok .v3-cmd-bloco-titulo      { color: var(--v3-cmd-ok); }
.v3-cmd-bloco--ok .v3-cmd-linha-txt,
.v3-cmd-bloco--ok .v3-cmd-manual       { color: var(--v3-cmd-ok-cmd); }

/* O selo escrito do alerta ("Cuidado" e "Atencao" ao lado do titulo) saiu na
   v3.6.4 a pedido do Joao. Nao ha CSS orfao aqui de proposito: a marcacao
   .v3-cmd-selo tambem saiu do template-parts/cmd-bloco.php, e o
   margin-left: auto que empurrava a etiqueta para a direita continua vivo em
   .v3-cmd-tag, que nunca dependeu do selo. */

/* ---- acrescimos da v3.6.3 ---- */

/* Lista de SERVIDORES: cada linha na sua cor, pela posicao. Pinta o rotulo
   junto do comando de proposito: os dois sao a mesma informacao (qual
   servidor e qual endereco) e so o comando colorido deixaria o rotulo
   cinza parecendo de outro dono.

   O ciclo e de quatro e o PHP ja manda a classe pronta (--s1 a --s4,
   repetindo). Tres classes de especificidade ganham da cor semantica da
   entrada (.v3-cmd-bloco--perigo .v3-cmd-linha-txt, duas classes), entao um
   bloco de servidor marcado como perigo continua com o titulo vermelho e as
   linhas nas cores de servidor, que e o que se quer: o alerta e do comando
   inteiro, a cor da linha e do endereco.

   O .v3-cmd-manual entra junto pelo mesmo motivo de sempre: o JS troca o
   span pelo input quando a copia falha, e a troca nao pode mudar a cor na
   cara do visitante. */
.v3-cmd-bloco--servidor .v3-cmd-linha--s1 .v3-cmd-linha-rotulo,
.v3-cmd-bloco--servidor .v3-cmd-linha--s1 .v3-cmd-linha-txt,
.v3-cmd-bloco--servidor .v3-cmd-linha--s1 .v3-cmd-manual { color: var(--v3-cmd-s1); }

.v3-cmd-bloco--servidor .v3-cmd-linha--s2 .v3-cmd-linha-rotulo,
.v3-cmd-bloco--servidor .v3-cmd-linha--s2 .v3-cmd-linha-txt,
.v3-cmd-bloco--servidor .v3-cmd-linha--s2 .v3-cmd-manual { color: var(--v3-cmd-s2); }

.v3-cmd-bloco--servidor .v3-cmd-linha--s3 .v3-cmd-linha-rotulo,
.v3-cmd-bloco--servidor .v3-cmd-linha--s3 .v3-cmd-linha-txt,
.v3-cmd-bloco--servidor .v3-cmd-linha--s3 .v3-cmd-manual { color: var(--v3-cmd-s3); }

.v3-cmd-bloco--servidor .v3-cmd-linha--s4 .v3-cmd-linha-rotulo,
.v3-cmd-bloco--servidor .v3-cmd-linha--s4 .v3-cmd-linha-txt,
.v3-cmd-bloco--servidor .v3-cmd-linha--s4 .v3-cmd-manual { color: var(--v3-cmd-s4); }

/* "Servidor 01" nao quebra no meio: e a palavra que faz a cor significar
   alguma coisa, e partida em duas linhas ela deixa de ser lida como
   numeracao. So o nowrap, sem mexer em flex nem em max-width: no celular a
   regra do bloco 14 ja poe o rotulo numa linha inteira dele, e sobrescrever
   isso aqui traria os tres pedacos de volta para a mesma linha estreita. */
.v3-cmd-bloco--servidor .v3-cmd-linha-rotulo { white-space: nowrap; }

/* ---- barra de compartilhar (v3.6.3) ----

   Fica entre o conteudo e o trio de saidas, nas tres vistas do modulo. Bloco
   de baixo relevo de proposito: quem chega aqui veio resolver um problema, e
   o compartilhar e uma oferta, nao um pedido. Por isso caixa com hairline e
   botoes secundarios, sem nenhum laranja: o unico botao primario da vista ja
   foi gasto na hero. */
/* Respiro so em cima: a secao anterior e a faixa cinza, e sem esta folga a
   caixa branca nascia colada na linha onde o cinza acaba, parecendo grudada
   nela. Embaixo quase nada, porque o trio de saidas logo abaixo ja traz os
   56px de padding de .v3-section. */
.v3-cmd-share { padding: 40px 0 8px; }

.v3-cmd-share-caixa {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 14px 20px;
	padding: 18px 22px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
}

.v3-cmd-share-txt {
	margin: 0;
	min-width: 0;
	font-size: 15px;
	line-height: 1.45;
	color: var(--v3-ink-2);
}

.v3-cmd-share-btns {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}

/* Botao com icone: o icone confirma a rede de relance e o texto continua ali
   para quem nao reconhece o desenho. Nunca so o icone. */
.v3-cmd-share-btn {
	display: inline-flex;
	align-items: center;
	gap: 8px;
}
.v3-cmd-share-icone { flex: none; }

/* Feedback do "Copiar link": verde, como o botao Copiar dos comandos, para o
   site nao ter dois jeitos de dizer a mesma coisa. O tom e outro porque o
   fundo e outro: la o botao vive sobre o bloco escuro do terminal e o verde
   da demo passa; aqui ele esta sobre o cartao e reprovaria em contraste.
   O --v3-cmd-ok e o par medido para este fundo. A cor tambem nao anda
   sozinha: o rotulo vira "Link copiado". */
.v3-cmd-share-copiar.is-copiado {
	border-color: var(--v3-cmd-ok);
	color: var(--v3-cmd-ok);
}

@media (max-width: 720px) {
	.v3-cmd-share-caixa {
		flex-direction: column;
		align-items: stretch;
		padding: 16px;
	}
	/* Quatro botoes na largura do celular quebram 3 + 1 e o ultimo fica
	   sozinho e torto; em duas colunas iguais eles fecham um quadrado. */
	.v3-cmd-share-btns {
		display: grid;
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
	/* "Copiar link" quebrava em duas linhas na coluna estreita e desalinhava a
	   fila inteira. Cabe inteiro com o respiro lateral menor e sem quebra. */
	.v3-cmd-share-btn {
		justify-content: center;
		gap: 6px;
		padding-left: 12px;
		padding-right: 12px;
		white-space: nowrap;
	}
}

/* Card de modelo com borda da marca: os cards da pagina do fabricante caem
   na mesma tela do trio de CTAs e sem isso os dois blocos de cartao se
   confundiam. E SO a borda, nunca fundo laranja. O #F16000 sobre o card da
   3,27:1 no claro e 5,23:1 no escuro, acima do piso de 3:1 de borda.
   No hover a borda ganha corpo por um anel interno de 1px em vez de trocar
   de tom: o --v3-brand-hover e mais escuro e no tema escuro pareceria que a
   borda apagou ao passar o mouse. */
.v3-cmd-modelo-card--destaque {
	border-color: var(--v3-brand);
	transition: border-color .15s ease, box-shadow .15s ease;
}
.v3-cmd-modelo-card--destaque:hover {
	border-color: var(--v3-brand);
	box-shadow: inset 0 0 0 1px var(--v3-brand);
}

/* Foto do fabricante ao lado do H1 da pagina do fabricante. So aparece com
   logo cadastrado (o PHP nao imprime moldura vazia), entao aqui nao existe
   caixa nem fundo: e a imagem, o respiro e o titulo. */
.v3-cmd-fab-marca {
	display: flex;
	align-items: center;
	gap: 18px;
}
.v3-cmd-fab-marca-img {
	flex: none;
	width: auto;
	height: 56px;
	max-width: 140px;
	object-fit: contain;
}
/* Mesma placa clara da lista do hub: logo desenhado para fundo branco some
   na pagina escura. */
:root:not([data-theme="light"]) .v3-cmd-fab-marca-img {
	background: var(--v3-ink);
	border-radius: 8px;
	/* content-box para o padding da placa NAO ser descontado da altura: com o
	   border-box global, os 6px comiam 12px do logo e ele encolhia so no tema
	   escuro. Mesma lição já registrada em .v3-fab-item-media. */
	box-sizing: content-box;
	padding: 6px;
}

@media (max-width: 1000px) {
	/* A hero vira coluna unica aqui, entao os tres botoes tem a largura toda
	   do texto e cabem lado a lado; so o miolo da linha do fabricante
	   aperta. */
	.v3-fab-item { column-gap: 16px; }
	.v3-cmd-fab-marca-img { height: 48px; }
}

@media (max-width: 720px) {
	/* A previa FICA no celular (pedido do Joao, v3.6.3), so que numa segunda
	   linha. Lado a lado com a contagem sobrava largura para uma pastilha e
	   meia, que informava menos que nada; empilhada cabem duas ou tres
	   inteiras, e sao elas que fazem reconhecer o fabricante de relance.
	   Grid de uma coluna com minmax(0,1fr) no lugar do flex: sem o minmax a
	   fila de pastilhas empurra a largura da linha e o corte nunca acontece. */
	.v3-fab-item-linha {
		display: grid;
		grid-template-columns: minmax(0, 1fr);
		row-gap: 5px;
	}
	.v3-fab-item {
		column-gap: 14px;
		padding: 12px 14px;
	}
	.v3-fab-item-media {
		width: 46px;
		height: 46px;
		padding: 3px;
	}
	.v3-fab-item-avatar { font-size: 17px; }
	.v3-fab-item-nome { font-size: 15.5px; }
	/* Pastilha um pouco menor no celular: cabe mais um nome antes do fade. */
	.v3-fab-item-modelo { padding: 1px 7px; font-size: 12px; }
	.v3-fab-item-qtd { font-size: 12px; }

	/* Numero, titulo, tag e selo na mesma linha nao cabem na tela do celular:
	   a linha passa a quebrar e o selo desce inteiro em vez de espremer o
	   titulo. */
	.v3-cmd-bloco-topo { flex-wrap: wrap; }

	.v3-cmd-fab-marca { gap: 14px; }
	.v3-cmd-fab-marca-img { height: 42px; max-width: 110px; }

	/* Tres botoes na hero do hub: cada um ocupa a linha inteira. Lado a lado
	   eles quebram 2 + 1 e o terceiro fica sozinho e desalinhado embaixo. */
	.v3-cmd-hero-ctas--trio .v3-btn { width: 100%; }
}

/* === rodape: grade que segue o numero real de colunas === */
/* --------------------------------------------------------------------------
   As colunas de links do rodape agora vem de menus do WordPress (cinco locais,
   "Rodape coluna 1" a "Rodape coluna 5", em inc/footer-menus.php) e podem ser
   de uma a cinco. O main-final.css fixa .sl-footer-main em
   grid-template-columns: 1.5fr 1fr 1fr 1fr 1fr, entao com duas colunas
   configuradas metade do rodape ficaria vazia. O footer.php escreve o atributo
   data-v3-cols com a contagem que de fato foi renderizada e as regras abaixo
   leem esse numero.

   Cada faixa e minmax(0, ...) e nao 1fr solto: um rotulo longo de menu (o admin
   escreve o que quiser) estica uma faixa 1fr e desalinha a fila inteira; com
   minmax(0, 1fr) o texto quebra dentro da propria coluna.

   Os limites de largura estao FECHADOS de proposito (min-width no desktop,
   faixa 1025-1100 no meio). Motivo: .sl-footer-main[data-v3-cols="3"] tem
   especificidade maior que o .sl-footer-main sozinho das @media do main-final,
   entao uma regra aberta venceria dentro delas e o rodape desceria para o
   celular ainda com cinco faixas. Abaixo de 1025px nao ha nada aqui: as duas
   colunas (1024px) e a coluna unica (768px) do main-final ja servem para
   qualquer quantidade.
   -------------------------------------------------------------------------- */
@media (min-width: 1101px) {
	/* Uma ou duas colunas em faixa fr esticariam uma lista de cinco links por
	   400px de largura. Travadas em 240px, a sobra fica com a faixa da marca e
	   as colunas encostam na direita, que e onde o olho ja procura. */
	.sl-footer-main[data-v3-cols="1"] { grid-template-columns: minmax(0, 1.5fr) minmax(0, 240px); }
	.sl-footer-main[data-v3-cols="2"] { grid-template-columns: minmax(0, 1.5fr) repeat(2, minmax(0, 240px)); }

	.sl-footer-main[data-v3-cols="3"] { grid-template-columns: minmax(0, 1.5fr) repeat(3, minmax(0, 1fr)); }
	/* Quatro colunas e o rodape de sempre: mesma proporcao do main-final. */
	.sl-footer-main[data-v3-cols="4"] { grid-template-columns: minmax(0, 1.5fr) repeat(4, minmax(0, 1fr)); }

	/* Seis faixas no container de 1200px: o gap de 2.5rem sozinho comeria 200px
	   e sobrariam ~150px por coluna. Gap menor e marca um pouco mais estreita,
	   que ainda cabe o lockup e os quatro icones sociais lado a lado. */
	.sl-footer-main[data-v3-cols="5"] {
		grid-template-columns: minmax(0, 1.3fr) repeat(5, minmax(0, 1fr));
		gap: 2rem;
	}
}

/* Faixa em que o main-final joga a marca para a linha inteira e deixa quatro
   faixas para os links: com menos de quatro colunas sobrariam faixas vazias. */
@media (min-width: 1025px) and (max-width: 1100px) {
	.sl-footer-main[data-v3-cols="1"],
	.sl-footer-main[data-v3-cols="2"] { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.sl-footer-main[data-v3-cols="3"] { grid-template-columns: repeat(3, minmax(0, 1fr)); }
	/* Cinco colunas nesta faixa: o main-final so reserva QUATRO tracks aqui
	   (a marca ocupa a linha inteira acima), entao a quinta caia sozinha numa
	   terceira linha, desalinhada das outras. Faixas de ~178px a 1025px, que
	   ainda comportam um rotulo de duas palavras. */
	.sl-footer-main[data-v3-cols="5"] {
		grid-template-columns: repeat(5, minmax(0, 1fr));
		gap: 2rem;
	}
}

/* ==========================================================================
   15. Documento legal (page-legal.php: privacidade, termos, LGPD)

   Pagina de leitura longa, entao o bloco resolve tres coisas e nada mais:

   - MEDIDA. A coluna de texto para em 33em, umas 72 letras por linha. Mais
     largo que isso o olho perde a volta da linha, e documento legal ja e
     chato o bastante sem ajuda.
   - SUMARIO QUE MUDA DE FORMA. No desktop e a barra lateral grudada de
     sempre; no celular vira um <details> recolhido no topo, porque barra
     grudada de 200px numa tela de 375px so rouba altura de leitura.
   - GANCHOS DO main.js. O sumario e escrito pela funcao initLegalToc, que
     procura #sl-legal-content, #sl-legal-toc e .sl-legal-toc-nav. Essa ultima
     e CLASSE, entao o visual antigo dela (fundo laranja fraco, borda
     arredondada, transition all) ainda casa e precisa ser desligado aqui,
     item por item. Nao apagar as regras .sl-legal-* do main-final.css: elas
     continuam sendo a base que este bloco sobrescreve.
   ========================================================================== */

/* ---- hero ---- */

/* Mesma receita das outras heros da rodada: titulo a esquerda, sem grade e
   sem foto. Documento legal nao tem ilustracao, tem nome e data. */
.v3-legal-hero { padding: 72px 0 40px; }

.v3-legal-hero-copy { max-width: 760px; }

.v3-legal-hero-titulo {
	margin: 0;
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	color: var(--v3-ink);
	text-wrap: balance;
}

/* A data e a unica informacao de servico da hero, entao vai em mono pequeno,
   como toda meta do site. O valor em si sobe um tom: e o que a pessoa veio
   conferir quando abre um documento legal pela segunda vez. */
.v3-legal-hero-meta {
	margin: 20px 0 0;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.5;
	color: var(--v3-ink-3);
}
.v3-legal-hero-meta time { color: var(--v3-ink-2); }

/* ---- grade: sumario e documento ---- */

.v3-legal { padding: 0 0 88px; }

/* O fio de cima separa a hero do documento sem gastar mais 88px de padding:
   as duas partes sao a mesma pagina, nao duas secoes. align-items start e
   obrigatorio, senao o item sticky estica na altura da coluna de texto e
   nunca gruda.

   O max-width de 900px e o sumario mais a medida de leitura, e nada alem
   disso: a grade nao estica ate os 1200px do .v3-wrap porque o unico jeito
   de preencher aquela largura seria alargar o texto, que e exatamente o que
   a medida esta evitando. O bloco fica encostado a esquerda, alinhado com o
   titulo da hero, e a faixa branca da direita e respiro, nao sobra. */
.v3-legal-grid {
	display: grid;
	grid-template-columns: 250px minmax(0, 1fr);
	gap: 56px;
	align-items: start;
	max-width: 900px;
	padding-top: 36px;
	border-top: 1px solid var(--v3-line);
}

/* Documento SEM nenhum <h2>: o initLegalToc do main.js esconde o sumario com
   style="display: none" e vai embora, mas a FAIXA de 250px continua reservada
   na grade, e o documento inteiro ficava espremido nos 594px restantes com um
   vao de 306px do lado. Como quem esconde e o JS por style inline, o gancho e
   o proprio atributo. As duas grafias estao aqui porque o navegador serializa
   "display: none;" com espaco, mas um style escrito a mao no editor pode vir
   sem. */
.v3-legal-grid:has(> [id="sl-legal-toc"][style*="display: none"]),
.v3-legal-grid:has(> [id="sl-legal-toc"][style*="display:none"]) {
	grid-template-columns: minmax(0, 1fr);
	gap: 0;
}

/* ---- sumario ----

   Estado BASE (o que o celular ve, e tambem a rede de seguranca do desktop):
   caixa fechada com o <summary> por cima. O desktop sobrescreve isso mais
   abaixo, dentro de um @supports, e o porque merece o paragrafo:

   O <details> nasce SEM o atributo open de proposito. Abrir um <details>
   fechado so pelo CSS depende de ::details-content, e por isso o @supports;
   onde ele nao existir, o desktop cai no mesmo botao "Sumario" do celular,
   a um clique da lista, que e uma degradacao honesta e nao uma tela quebrada.
   O caminho inverso (nascer com open no HTML e recolher no celular pelo CSS)
   foi descartado: o <summary> passaria a anunciar "expandido" justamente
   quando a lista estivesse escondida, e o primeiro clique fecharia o que ja
   parece fechado. Estado mentido e pior que estilo pobre. */
.v3-legal-toc {
	min-width: 0;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
}

.v3-legal-toc-abre {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	padding: 14px 16px;
	font-family: var(--v3-body);
	font-weight: 600;
	font-size: 15px;
	line-height: 1.2;
	color: var(--v3-ink);
	cursor: pointer;
	list-style: none;
}
.v3-legal-toc-abre::-webkit-details-marker { display: none; }

/* Seta desenhada com duas bordas, como o tique da .v3-card-list: nao depende
   de fonte nem de SVG e vira sozinha com o tema. */
.v3-legal-toc-abre::after {
	content: "";
	flex: none;
	width: 7px;
	height: 7px;
	margin-right: 3px;
	border: solid var(--v3-ink-3);
	border-width: 0 2px 2px 0;
	transform: translateY(-2px) rotate(45deg);
}
.v3-legal-toc[open] > .v3-legal-toc-abre::after {
	transform: translateY(2px) rotate(-135deg);
}

.v3-legal-toc-miolo { padding: 0 14px 16px; }

/* Rotulo do desktop. Fica escondido por padrao porque no celular quem nomeia
   a caixa e o proprio <summary>; repetir a palavra daria dois "Sumario". */
.v3-legal-toc-rotulo {
	display: none;
	margin: 0 0 12px;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.4;
	color: var(--v3-ink-3);
}

.v3-legal-toc-nav { min-width: 0; }

/* As tres regras abaixo existem tanto para desenhar quanto para desfazer: o
   .sl-legal-toc-nav do main-final.css continua casando (a classe e gancho do
   main.js e nao pode sair da marcacao) e traz flex, gap em rem, raio de 6px e
   transition all. Mesma especificidade, arquivo mais novo, este vence. */
.v3-legal-toc-nav ul {
	display: grid;
	gap: 2px;
	list-style: none;
	margin: 0;
	padding: 0;
}
.v3-legal-toc-nav li { position: static; }

/* Trilho fino a esquerda no lugar do fundo colorido: o item ativo se acende
   pela cor da marca no trilho, que e o mesmo gesto do item ativo do menu. */
.v3-legal-toc-nav a {
	display: block;
	padding: 7px 12px;
	background: none;
	border-left: 2px solid var(--v3-line);
	border-radius: 0;
	font-size: 14px;
	line-height: 1.4;
	color: var(--v3-ink-2);
	text-decoration: none;
	transition: color .15s ease, border-color .15s ease;
}
.v3-legal-toc-nav a:hover {
	background: none;
	border-left-color: var(--v3-line-strong);
	color: var(--v3-ink);
}
.v3-legal-toc-nav a.is-active {
	background: none;
	border-left-color: var(--v3-brand);
	color: var(--v3-ink);
	font-weight: 600;
}

/* ---- bloco de ajuda, dentro do sumario ---- */

.v3-legal-ajuda {
	margin-top: 24px;
	padding-top: 20px;
	border-top: 1px solid var(--v3-line);
}
.v3-legal-ajuda-titulo {
	margin: 0;
	font-size: 14px;
	font-weight: 600;
	line-height: 1.35;
	color: var(--v3-ink);
}
.v3-legal-ajuda-txt {
	margin: 6px 0 14px;
	font-size: 14px;
	line-height: 1.5;
	color: var(--v3-ink-2);
}
.v3-legal-ajuda-links {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}

/* Botoes secundarios e menores que o padrao: a pagina nao vende nada, e um
   botao laranja aqui competiria com o texto que a pessoa veio ler. */
.v3-legal-ajuda-btn {
	padding: 9px 14px;
	font-size: 14px;
}

/* ---- corpo do documento ----

   Tudo daqui para baixo estiliza HTML que vem do editor, entao os seletores
   sao de TAG: nao da para pedir class para quem escreve a politica.

   A medida vai em em, nao em ch, e a diferenca aqui e enorme: o zero da
   Instrument Sans mede 0,67em, enquanto a letra media de um texto corrido em
   portugues mede 0,46em. Pedir 70ch entregaria 792px, que sao CEM caracteres
   por linha e nao setenta. Medido na fonte: 33em dao 561px a 17px, que sao as
   72 letras por linha que a direcao pede. */
.v3-legal-corpo {
	min-width: 0;
	max-width: 33em;
	font-size: 17px;
	line-height: 1.75;
	color: var(--v3-ink-2);
}
.v3-legal-corpo > :first-child { margin-top: 0; }
.v3-legal-corpo > :last-child { margin-bottom: 0; }

/* O h2 e a unidade de navegacao da pagina (e dele que sai cada item do
   sumario), entao ele precisa de um respiro grande em cima: e o respiro que
   avisa "comecou outro assunto" para quem chega pelo link do sumario.
   O scroll-margin some com os poucos pixels que o cabecalho flutuante ainda
   cobre depois do scroll-padding-top global de 84px. */
.v3-legal-corpo h2 {
	margin: 56px 0 14px;
	font-size: clamp(1.45rem, 1.4vw + .9rem, 1.8rem);
	line-height: 1.15;
	color: var(--v3-ink);
	scroll-margin-top: 16px;
	text-wrap: balance;
}
.v3-legal-corpo h2:first-child { margin-top: 0; }

.v3-legal-corpo h3 {
	margin: 34px 0 10px;
	font-size: 1.12rem;
	line-height: 1.3;
	color: var(--v3-ink);
	scroll-margin-top: 16px;
}

/* O texto que o tema semeia so usa h2 e h3, mas o campo e do gerente e um dia
   alguem vai colar um h4. Sem estas regras ele cairia no reset global
   (margin: 0) somado ao line-height do h5 e do h6 do main-final, e sairia
   colado no paragrafo anterior, com as linhas se tocando. O font-family e o
   color explicitos sao o que tira o h5 e o h6 das tintas antigas. */
.v3-legal-corpo h4,
.v3-legal-corpo h5,
.v3-legal-corpo h6 {
	margin: 26px 0 8px;
	font-family: var(--v3-body);
	font-size: 1rem;
	font-weight: 600;
	line-height: 1.35;
	color: var(--v3-ink);
	scroll-margin-top: 16px;
}

/* color: inherit nao e decoracao. O main-final.css tem um "p { color:
   var(--sl-text-2) }" solto, e regra que casa DIRETO com o elemento ganha da
   cor herdada do .v3-legal-corpo por mais especifico que o ancestral seja.
   Sem esta linha o paragrafo do documento saia no token antigo e os <li> ao
   lado dele no token novo: dois cinzas diferentes no mesmo texto. */
.v3-legal-corpo p { margin: 0 0 18px; color: inherit; }
.v3-legal-corpo strong { color: var(--v3-ink); font-weight: 600; }

/* Lista de documento legal quase sempre e uma enumeracao de direitos ou de
   dados coletados: cada item e uma frase inteira e precisa de ar entre eles,
   senao vira parede. O marcador fica cinza porque numero e ponto ali sao
   estrutura, nao destaque. */
.v3-legal-corpo ul,
.v3-legal-corpo ol {
	margin: 0 0 18px;
	padding-left: 22px;
}
.v3-legal-corpo li { margin-bottom: 10px; }
.v3-legal-corpo li:last-child { margin-bottom: 0; }
.v3-legal-corpo li::marker { color: var(--v3-ink-3); }
.v3-legal-corpo li > ul,
.v3-legal-corpo li > ol { margin: 10px 0 0; }

.v3-legal-corpo a {
	color: var(--v3-ink);
	font-weight: 500;
	text-decoration: underline;
	text-decoration-color: var(--v3-line-strong);
	text-underline-offset: 3px;
}
.v3-legal-corpo a:hover { text-decoration-color: var(--v3-ink); }

.v3-legal-corpo blockquote {
	margin: 24px 0;
	padding: 2px 0 2px 20px;
	border-left: 2px solid var(--v3-line-strong);
	color: var(--v3-ink-2);
}
.v3-legal-corpo blockquote p:last-child { margin-bottom: 0; }

.v3-legal-corpo code {
	padding: 2px 6px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 5px;
	font-family: var(--v3-mono);
	font-size: .88em;
	color: var(--v3-ink);
}
.v3-legal-corpo pre {
	margin: 0 0 18px;
	padding: 16px;
	overflow-x: auto;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
}
.v3-legal-corpo pre code {
	padding: 0;
	background: none;
	border: 0;
}

.v3-legal-corpo hr {
	margin: 40px 0;
	border: 0;
	border-top: 1px solid var(--v3-line);
}

/* Tabela de tres colunas estoura a medida em qualquer celular. O <figure>
   que o editor poe em volta rola sozinho na horizontal; sem ele quem rolaria
   de lado seria a pagina inteira, que e o que nunca pode acontecer. */
.v3-legal-corpo figure {
	margin: 0 0 18px;
	overflow-x: auto;
}
.v3-legal-corpo table {
	width: 100%;
	margin: 0 0 18px;
	border-collapse: collapse;
	font-size: 15px;
}
.v3-legal-corpo figure table { margin-bottom: 0; }
.v3-legal-corpo th,
.v3-legal-corpo td {
	padding: 10px 12px;
	border: 1px solid var(--v3-line);
	text-align: left;
	vertical-align: top;
}
.v3-legal-corpo th {
	background: var(--v3-page-alt);
	color: var(--v3-ink);
	font-weight: 600;
}

.v3-legal-corpo img {
	height: auto;
	border-radius: 10px;
}

/* ---- quem responde pelo documento ---- */

/* Mesma largura da grade acima, senao um cartao de 1200px nasceria embaixo de
   um documento de 900px e as duas pecas pareceriam de paginas diferentes. */
.v3-legal-id {
	max-width: 900px;
	margin-top: 56px;
	padding: 22px 24px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
}
.v3-legal-id-nome {
	margin: 0;
	font-size: 15px;
	font-weight: 600;
	line-height: 1.35;
	color: var(--v3-ink);
}
.v3-legal-id-dados {
	display: grid;
	gap: 4px;
	margin: 10px 0 0;
	padding: 0;
	list-style: none;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.55;
	color: var(--v3-ink-3);
}
.v3-legal-id-dados a {
	color: var(--v3-ink-2);
	text-decoration: underline;
	text-decoration-color: var(--v3-line-strong);
	text-underline-offset: 3px;
}
.v3-legal-id-dados a:hover { text-decoration-color: var(--v3-ink-2); }

/* ---- desktop: o sumario vira barra lateral ----

   Unica regra min-width do bloco, e ela precisa ser assim: o estado recolhido
   e o padrao (ver o comentario do .v3-legal-toc) e e o desktop que abre a
   excecao, nao o contrario. O top de 88px sai da mesma conta do
   .v3-cmd-topo: a casca do cabecalho mede 69px parada e o cartao flutuante
   termina em 78px, entao 88 deixa 10px de ar no pior caso. */
@media (min-width: 1001px) {
	.v3-legal-toc {
		position: sticky;
		top: 88px;
		max-height: calc(100vh - 112px);
		overflow-y: auto;
	}

	@supports selector(::details-content) {
		.v3-legal-toc::details-content { content-visibility: visible; }
		.v3-legal-toc {
			background: none;
			border: 0;
			border-radius: 0;
		}
		.v3-legal-toc-abre { display: none; }
		.v3-legal-toc-miolo { padding: 0; }
		.v3-legal-toc-rotulo { display: block; }
	}
}

@media (max-width: 1000px) {
	/* Sumario em cima, documento embaixo, e a ordem da marcacao ja e essa.
	   Quem manda na largura agora e a propria medida de leitura: caixa do
	   sumario, texto e cartao de identificacao ficam com a mesma largura e a
	   pagina vira uma coluna so, encostada a esquerda. Sem este teto, no
	   tablet o texto parava em 561px dentro de uma coluna de 950px e sobrava
	   um vao enorme do lado direito. */
	.v3-legal-grid {
		grid-template-columns: minmax(0, 1fr);
		gap: 24px;
		max-width: 560px;
	}
	.v3-legal-corpo { max-width: none; }
	.v3-legal-id { max-width: 560px; }
}

@media (max-width: 720px) {
	.v3-legal-hero { padding: 48px 0 28px; }
	.v3-legal { padding-bottom: 56px; }
	.v3-legal-grid { padding-top: 24px; max-width: none; }
	.v3-legal-id { max-width: none; }

	/* Um ponto a menos no corpo e um pouco menos de entrelinha: na largura do
	   celular 17px/1.75 dava linhas curtas demais e um paredao de altura. */
	.v3-legal-corpo {
		font-size: 16px;
		line-height: 1.7;
	}
	.v3-legal-corpo h2 { margin-top: 40px; }
	.v3-legal-corpo h3 { margin-top: 28px; }

	.v3-legal-id {
		margin-top: 40px;
		padding: 18px;
	}
}

/* === status === */
/* --------------------------------------------------------------------------
   Pagina /status/ (page-status.php). Tres coisas explicam quase todo o bloco:

   1. A pagina e um INSTRUMENTO, nao uma secao de venda: e a excecao sancionada
      "painel de monitoramento" da DIRECAO_V3.md. Por isso ela reusa o painel do
      bloco de disponibilidade da home (.v3-uptime-panel e familia, tokens
      --v3-panel-*, anel, batimento e cursor) em vez de inventar um segundo
      painel para a mesma informacao. Aqui embaixo so existe o que e proprio
      desta pagina.
   2. O main.js (initStatusPage) reescreve pedacos da tela a cada 90 segundos, e
      em TRES lugares ele substitui o className inteiro do elemento: a faixa de
      estado, o cartao de cada servidor e a etiqueta de estado. Por isso o estilo
      desses entra por ATRIBUTO ([data-status-banner], [data-monitor-key],
      [data-status-pill]) ou pela propria classe que o JS escreve, sempre
      escopado dentro de um involucro .v3- que nenhuma reescrita alcanca. Um
      seletor .v3- no proprio elemento reescrito duraria ate a primeira leitura.
   3. As classes .sl-status-* que sobraram (as que o JS emite) trazem junto a
      pele antiga do main-final.css, que nao se edita: gradiente, raio de 14px,
      fundo preto translucido, capsula em caixa alta, halo de 8px no ponto. Cada
      uma dessas propriedades e desfeita na mao aqui. Quando uma regra abaixo
      parecer obvia demais ("background: none", "box-shadow: none"), ela esta
      desfazendo alguma coisa, nao decorando.

   Contraste. Os pares semanticos sao os mesmos ja medidos no bloco 14 (cor do
   comando): --v3-cmd-perigo / -atencao / -info / -ok sobre o cartao dao de
   5,02:1 a 10,26:1 nos dois temas. Sobre o painel (--v3-panel-bg, #F5F6F8 no
   claro e #10151B no escuro) foram medidos de novo, porque o fundo muda:
     --v3-cmd-ok       4,64:1 claro  |  8,05:1 escuro
     --v3-cmd-atencao  6,56:1 claro  |  10,99:1 escuro
     --v3-panel-ink-dim (rotulo de 10px)   4,84:1 claro  |  6,20:1 escuro
   O --v3-panel-ink-mut NAO e usado em texto nenhum daqui: ele da 2,99:1 sobre o
   painel claro e so serve para grafico (o cursor piscando).
   -------------------------------------------------------------------------- */

/* ---- hero + faixa de estado geral ---- */

.v3-st-hero { padding: 72px 0 48px; }
.v3-st-hero-copy { max-width: 760px; }

.v3-st-hero-titulo {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}

.v3-st-hero-lede {
	margin: 16px 0 0;
	max-width: 680px;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-st-live { margin-top: 32px; }

/* Caixa de erro: so aparece quando a leitura falha E a ultima boa ja passou de
   cinco minutos. O display:flex vence o [hidden] da folha do navegador, entao a
   regra do hidden precisa vir escrita. */
.v3-st-erro {
	display: flex;
	align-items: flex-start;
	gap: 12px;
	margin-bottom: 12px;
	padding: 14px 16px;
	background: var(--v3-card);
	border: 1px solid var(--v3-cmd-perigo);
	border-radius: 10px;
}
.v3-st-erro[hidden] { display: none; }
.v3-st-erro-ico { flex: none; display: flex; color: var(--v3-cmd-perigo); }
.v3-st-erro-txt { display: grid; gap: 3px; min-width: 0; }
.v3-st-erro-txt strong { font-size: 15px; font-weight: 600; color: var(--v3-ink); }
.v3-st-erro-txt span { font-family: var(--v3-mono); font-size: 12.5px; color: var(--v3-ink-3); }

/* A faixa de estado. O seletor entra pelo atributo porque o JS troca o
   className inteiro deste elemento a cada leitura. As propriedades abaixo
   desfazem o .sl-status-banner do main-final: raio 14px, fundo translucido e,
   em cada estado, um gradiente colorido de ponta a ponta. */
.v3-st-live [data-status-banner] {
	display: flex;
	align-items: center;
	gap: 14px;
	padding: 18px 20px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
	transition: border-color .2s ease;
}

/* Estado normal nao pinta nada: a borda so muda de cor quando ha o que avisar.
   O texto da faixa ("Incidente em curso") continua carregando a informacao
   inteira, entao a cor reforca em vez de substituir. */
.v3-st-live .sl-status-banner--down        { border-color: var(--v3-cmd-perigo); }
.v3-st-live .sl-status-banner--degraded    { border-color: var(--v3-cmd-atencao); }
.v3-st-live .sl-status-banner--maintenance { border-color: var(--v3-cmd-info); }

.v3-st-banner-dot {
	flex: none;
	width: 10px;
	height: 10px;
	border-radius: 50%;
	background: var(--v3-ink-3);
}
.v3-st-live .sl-status-banner--up .v3-st-banner-dot          { background: var(--v3-ok); }
.v3-st-live .sl-status-banner--down .v3-st-banner-dot        { background: var(--v3-cmd-perigo); }
.v3-st-live .sl-status-banner--degraded .v3-st-banner-dot    { background: var(--v3-cmd-atencao); }
.v3-st-live .sl-status-banner--maintenance .v3-st-banner-dot { background: var(--v3-cmd-info); }
/* Pulso reaproveitado do painel da home (nenhum @keyframes novo). */
.v3-st-live .sl-status-banner--up .v3-st-banner-dot { animation: v3-uptime-pulse 2.4s ease-in-out infinite; }

.v3-st-banner-txt { flex: 1; min-width: 0; display: grid; gap: 3px; }
.v3-st-banner-txt strong {
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 104, "wght" 650;
	font-size: 1.15rem;
	line-height: 1.2;
	letter-spacing: -.01em;
	color: var(--v3-ink);
}
/* Filho direto de proposito: o JS escreve um <span data-status-relative> dentro
   desta linha, e ele nao pode herdar tamanho proprio. */
.v3-st-banner-txt > span {
	font-family: var(--v3-mono);
	font-size: 12.5px;
	line-height: 1.4;
	color: var(--v3-ink-3);
}

.v3-st-atualizar {
	flex: none;
	display: grid;
	place-items: center;
	width: 38px;
	height: 38px;
	padding: 0;
	background: transparent;
	border: 1px solid var(--v3-line-strong);
	border-radius: 8px;
	color: var(--v3-ink-2);
	cursor: pointer;
	transition: background-color .15s ease, border-color .15s ease, color .15s ease;
}
.v3-st-atualizar:hover { background: var(--v3-page-alt); color: var(--v3-ink); }
/* Giro de uma volta ao clicar. O @keyframes e o sl-status-spin que ja existe no
   main-final: reusar o que esta la nao abre keyframe novo. */
.v3-st-atualizar.is-spinning svg { animation: sl-status-spin 1s linear; }

/* ---- painel: numero grande + cinco medidas ---- */

.v3-st-painel-grid {
	display: grid;
	grid-template-columns: minmax(0, .85fr) minmax(0, 2.15fr);
	gap: 16px 44px;
	align-items: center;
	padding: 18px 0 8px;
}

.v3-st-sla {
	margin: 8px 0 0;
	font-family: var(--v3-mono);
	font-size: 12.5px;
	line-height: 1.4;
}
.v3-st-sla--ok     { color: var(--v3-cmd-ok); }
.v3-st-sla--abaixo { color: var(--v3-cmd-atencao); }
/* Sem leitura de 30 dias nao ha veredito: a frase so informa a meta e nao pode
   sair na cor de aviso. */
.v3-st-sla--neutro { color: var(--v3-panel-ink-dim); }

.v3-st-medidas {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat(5, minmax(0, 1fr));
	gap: 14px 18px;
}
.v3-st-medida { display: grid; gap: 3px; align-content: start; min-width: 0; }

/* Os tres nomes abaixo servem ao painel E ao cartao de servidor, que tem fundos
   diferentes (--v3-panel-bg e --v3-card). Os tokens escolhidos passam nos dois:
   ver a conta no cabecalho do bloco. */
.v3-st-medida-rot {
	font-family: var(--v3-mono);
	font-size: 10px;
	font-weight: 500;
	line-height: 1.3;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--v3-panel-ink-dim);
}
.v3-st-medida-val {
	font-family: var(--v3-mono);
	font-size: 17px;
	font-weight: 500;
	line-height: 1.2;
	letter-spacing: -.01em;
	font-variant-numeric: tabular-nums;
	color: var(--v3-panel-ink);
}
.v3-st-medida-sub { font-size: 12px; line-height: 1.35; color: var(--v3-panel-ink-dim); }

/* O JS acende .is-alert neste cartao quando ha incidente aberto agora. */
.v3-st-medida.is-alert .v3-st-medida-val { color: var(--v3-cmd-atencao); }

/* ---- gráfico de tempo de resposta ---- */

.v3-st-controles {
	display: flex;
	flex-wrap: wrap;
	gap: 14px 40px;
	margin-bottom: 18px;
	border-bottom: 1px solid var(--v3-line);
}
.v3-st-grupo { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 14px; min-width: 0; }
.v3-st-grupo-rot {
	font-family: var(--v3-mono);
	font-size: 10.5px;
	font-weight: 500;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--v3-ink-3-strong);
}
.v3-st-abas { display: flex; flex-wrap: wrap; gap: 0 18px; min-width: 0; }

/* Mesma receita das abas de /conhecer-plataforma/: inativa em cinza de
   controle, ativa com o sublinhado laranja de 2px do item ativo do menu. */
.v3-st-aba {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	margin: 0;
	padding: 8px 2px 12px;
	background: none;
	border: 0;
	border-radius: 0;
	font-family: var(--v3-mono);
	font-size: 13px;
	font-weight: 500;
	line-height: 1.2;
	color: var(--v3-ink-3-strong);
	white-space: nowrap;
	cursor: pointer;
	transition: color .15s ease, box-shadow .15s ease;
}
.v3-st-aba:hover:not(.is-active) { color: var(--v3-ink-2); }
.v3-st-aba.is-active { color: var(--v3-ink); box-shadow: inset 0 -2px 0 var(--v3-brand); }
.v3-st-aba:focus-visible { outline: 2px solid var(--v3-brand); outline-offset: 2px; }

/* A tela do grafico e ESCURA nos dois temas, como o bloco de comando do modulo
   de rastreadores: o SVG e desenhado pelo main.js com grade e rotulos em branco
   translucido fixo, que somem sobre fundo claro. Sobre --v3-demo-bg o rotulo do
   eixo da 5,08:1. */
.v3-st-plot {
	position: relative;
	padding: 12px;
	background: var(--v3-demo-bg);
	border: 1px solid var(--v3-demo-edge);
	border-radius: 10px;
}
.v3-st-plot-tela { width: 100%; height: 240px; }
.v3-st-plot-tela svg { display: block; width: 100%; height: 100%; }

/* Repintura do SVG injetado pelo JS. CSS vence atributo de apresentacao, entao
   da para trocar a cor do traco, da area, do texto e das bolinhas sem tocar no
   main.js: o verde-agua dele era o ultimo resto da direcao "console",
   rejeitada. O path[stroke] pega so a linha (a area tem fill e nao stroke).
   As bolinhas sao casadas pelo HEXADECIMAL que o JS escreve, uma por estado,
   porque ali a cor E a informacao e um fill unico apagaria a diferenca entre
   leitura boa, degradada e fora do ar. Se o main.js mudar de tom um dia, a
   regra simplesmente deixa de casar e a bolinha volta a cor dele: erra para o
   lado seguro. */
.v3-st-plot-tela svg line { stroke: var(--v3-demo-line); }
.v3-st-plot-tela svg text { fill: var(--v3-demo-ink-3); font-family: var(--v3-mono); }
.v3-st-plot-tela svg path[stroke] { stroke: var(--v3-demo-ok); }
.v3-st-plot-tela svg stop { stop-color: var(--v3-demo-ok); }
.v3-st-plot-tela svg circle[fill="#2dd4bf"] { fill: var(--v3-demo-ok); }
.v3-st-plot-tela svg circle[fill="#ffb020"] { fill: var(--v3-demo-warn); }
.v3-st-plot-tela svg circle[fill="#ff4060"] { fill: var(--v3-cmd-perigo-cmd); }

.v3-st-plot-vazio {
	position: absolute;
	inset: 0;
	display: grid;
	place-items: center;
	padding: 20px;
	background: var(--v3-demo-bg);
	border-radius: 10px;
	color: var(--v3-demo-ink-2);
	font-size: 14px;
	text-align: center;
}
.v3-st-plot-vazio[hidden] { display: none; }
/* A cor vai no <p>, nao so no involucro: o main-final pinta paragrafo com a
   tinta do tema claro e a heranca do pai perde para a regra dele. */
.v3-st-plot-vazio p { margin: 0; max-width: 34ch; color: var(--v3-demo-ink-2); }

.v3-st-resumo {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: 12px;
	margin-top: 14px;
}
.v3-st-resumo-item {
	display: grid;
	gap: 3px;
	padding: 12px 14px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 8px;
}
.v3-st-resumo-item span {
	font-family: var(--v3-mono);
	font-size: 10.5px;
	font-weight: 500;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--v3-ink-3);
}
.v3-st-resumo-item strong {
	font-family: var(--v3-mono);
	font-size: 16px;
	font-weight: 500;
	font-variant-numeric: tabular-nums;
	color: var(--v3-ink);
}

/* ---- cartões de servidor ---- */

/* A classe .sl-status-monitors-section na secao e o PORTAO do initStatusPage
   (sem ela nada nesta pagina atualiza) e vem com padding proprio do
   main-final. Dois nomes no seletor so para vencer aquele padding. */
.v3-section.v3-st-servidores { padding: 88px 0; }

.v3-st-cards { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }

/* Pelo atributo: o JS troca o className deste elemento a cada leitura. As
   propriedades desfazem o .sl-status-monitor do main-final (raio 14px,
   gradiente branco translucido, sombra).

   O !important em tres delas nao e preguica: o main-final tem
   [data-theme="light"] .sl-status-monitor { ... !important } e declaracao com
   !important vence declaracao sem, por mais especifico ou mais tarde que o
   outro seletor esteja. Sem empatar, no tema CLARO (que e o padrao do site) o
   cartao voltava com sombra e borda fora de token, destoando dos .v3-card da
   mesma tela. O box-shadow precisa estar escrito: sem declaracao nao ha o que
   vencer. */
.v3-st-cards [data-monitor-key] {
	display: flex;
	flex-direction: column;
	gap: 18px;
	padding: 22px 24px;
	background: var(--v3-card) !important;
	border: 1px solid var(--v3-line) !important;
	border-radius: 10px;
	box-shadow: none !important;
	color: var(--v3-ink);
}
/* Os dois estados que o main-final pintava de gradiente: aqui viram borda.
   Mesmo empate de !important, pelo mesmo motivo: sem ele, no tema claro o
   cartao do servidor caido nao mostrava que estava caido. */
.v3-st-cards .sl-status-monitor--down     { background: var(--v3-card) !important; border-color: var(--v3-cmd-perigo) !important; }
.v3-st-cards .sl-status-monitor--degraded { background: var(--v3-card) !important; border-color: var(--v3-cmd-atencao) !important; }

.v3-st-card-topo {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 10px 16px;
}
.v3-st-card-ident { display: grid; gap: 3px; min-width: 0; }
.v3-st-card-nome {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 104, "wght" 650;
	font-weight: 650;
	font-size: 1.1rem;
	line-height: 1.25;
	letter-spacing: -.01em;
	color: var(--v3-ink);
}
.v3-st-card-lugar { font-size: 13px; line-height: 1.4; color: var(--v3-ink-2); }
/* A sigla da maquina (S01, S02, S03): mono e um tom abaixo do lugar, porque
   ela e codigo de suporte, nao nome. E o vocabulario que o bloco "Como esta
   pagina e medida" usa logo abaixo, entao ela precisa aparecer em algum lugar
   da tela. */
.v3-st-card-sigla {
	font-family: var(--v3-mono);
	font-size: 12px;
	color: var(--v3-ink-3);
}

/* A etiqueta de estado. O main-final faz dela uma capsula cinza em caixa alta
   com halo de 8px no ponto; aqui vira ponto mais palavra, como nas linhas de
   servidor da home. O JS reescreve o innerHTML e a classe dela toda leitura. */
.v3-st-cards [data-status-pill] {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	padding: 0;
	/* !important pelo mesmo motivo dos cartoes: o main-final tem
	   [data-theme="light"] .sl-status-pill--unknown { background: ... !important }
	   e sem empatar sobrava um retangulo cinza no tema claro. */
	background: none !important;
	border-radius: 0;
	font-family: var(--v3-mono);
	font-size: 12.5px;
	font-weight: 500;
	letter-spacing: 0;
	text-transform: none;
	white-space: nowrap;
	color: var(--v3-ink-3);
}
.v3-st-cards [data-status-pill] .sl-status-pill-dot {
	width: 8px;
	height: 8px;
	background: currentColor;
	box-shadow: none;
}
.v3-st-cards .sl-status-pill--up          { color: var(--v3-cmd-ok); }
.v3-st-cards .sl-status-pill--down        { color: var(--v3-cmd-perigo); }
.v3-st-cards .sl-status-pill--degraded    { color: var(--v3-cmd-atencao); }
.v3-st-cards .sl-status-pill--maintenance { color: var(--v3-cmd-info); }
/* O estado "Desconhecido" e o que aparece quando o monitor nao respondeu, ou
   seja, JUSTAMENTE quando alguem abre esta pagina. No tema claro ele saia em
   rgba(10,10,20,.45) sobre o cinza travado do main-final: 3,09:1 em texto de
   12,5px, abaixo dos 4,5:1 que a casa exige. Com o fundo desfeito acima e esta
   cor, o #6B7280 sobre o cartao branco da 4,83:1. */
.v3-st-cards .sl-status-pill--unknown     { color: var(--v3-ink-3) !important; }

.v3-st-card-num { display: flex; align-items: center; gap: 20px; }

/* Anel: mesmo componente do painel da home (.v3-uptime-ring e filhos), so que
   com o valor de 30 dias no miolo e um rotulo embaixo. */
.v3-st-anel { flex: none; display: grid; justify-items: center; gap: 4px; }
/* O involucro do anel ja nasce position:relative no bloco da home. Repetido
   aqui de proposito: o valor do meio e absoluto e, se aquele bloco mudar um
   dia, o numero iria parar no canto da pagina sem erro nenhum. */
.v3-st-anel .v3-uptime-ring { position: relative; display: grid; place-items: center; }
.v3-st-anel-val {
	position: absolute;
	inset: 0;
	display: grid;
	place-items: center;
	font-family: var(--v3-mono);
	font-size: 13px;
	font-weight: 500;
	letter-spacing: -.02em;
	font-variant-numeric: tabular-nums;
	color: var(--v3-ink);
}
.v3-st-anel-rot {
	max-width: 84px;
	font-family: var(--v3-mono);
	font-size: 10.5px;
	line-height: 1.35;
	letter-spacing: .08em;
	text-transform: uppercase;
	text-align: center;
	color: var(--v3-ink-3);
}
/* O arco nasce verde (regra do painel da home) e so muda quando ha o que
   avisar. Como o estado mora na classe que o JS escreve, o seletor sai dela. */
.v3-st-cards .sl-status-monitor--down .v3-uptime-ring-arc        { stroke: var(--v3-cmd-perigo); }
.v3-st-cards .sl-status-monitor--degraded .v3-uptime-ring-arc    { stroke: var(--v3-cmd-atencao); }
.v3-st-cards .sl-status-monitor--maintenance .v3-uptime-ring-arc { stroke: var(--v3-cmd-info); }
.v3-st-cards .sl-status-monitor--unknown .v3-uptime-ring-arc     { stroke: var(--v3-line-strong); }

.v3-st-card-stats {
	list-style: none;
	margin: 0;
	padding: 0;
	flex: 1 1 auto;
	min-width: 0;
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 12px;
}
.v3-st-card-stats li { display: grid; gap: 3px; min-width: 0; }

/* Barra de batimentos: fundo escuro nos dois temas porque as cores das
   barrinhas sao claras e fixas (o JS reescreve a barra inteira e nao le token
   nenhum). Medido sobre --v3-demo-bg: verde 9,59:1 e vermelho 5,22:1, muito
   acima do piso de 3:1 de elemento grafico. */
.v3-st-batidas {
	display: flex;
	align-items: flex-end;
	gap: 2px;
	height: 40px;
	padding: 6px;
	background: var(--v3-demo-bg);
	border-radius: 8px;
	overflow: hidden;
}
/* Altura de 30%: e a mesma que o JS usa quando nao tem ping, e o inline dele
   substitui esta na primeira leitura. O PHP nao escreve altura nenhuma porque
   style inline esta fora da direcao; o que importa na primeira pintura e a COR,
   que e o estado. */
.v3-st-batidas .sl-status-tick {
	flex: 1 1 0;
	min-width: 2px;
	height: 30%;
	border-radius: 2px;
	background: var(--v3-demo-ink-3);
	transition: none;
}
.v3-st-batidas .sl-status-tick:hover { transform: none; }
/* Sem leitura nenhuma a barra seria um retangulo preto vazio no meio do cartao.
   O :empty some com ela e se desfaz sozinho no instante em que o JS injeta a
   primeira barrinha (por isso o PHP imprime as barrinhas coladas na div). */
.v3-st-batidas:empty { display: none; }
.v3-st-batidas .sl-status-tick--up          { background: var(--v3-demo-ok); }
.v3-st-batidas .sl-status-tick--degraded    { background: var(--v3-demo-warn); }
.v3-st-batidas .sl-status-tick--down        { background: var(--v3-cmd-perigo-cmd); }
.v3-st-batidas .sl-status-tick--maintenance { background: var(--v3-cmd-info-cmd); }
.v3-st-batidas .sl-status-tick--unknown     { background: var(--v3-demo-line); }

.v3-st-card-pe {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 4px 16px;
	margin-top: auto;
	padding-top: 14px;
	border-top: 1px solid var(--v3-line);
	font-size: 13px;
	line-height: 1.45;
	color: var(--v3-ink-2);
}
.v3-st-card-msg { min-width: 0; }
.v3-st-card-int { flex: none; font-family: var(--v3-mono); font-size: 12px; color: var(--v3-ink-3); }

/* ---- eventos do monitoramento ---- */

/* O JS reescreve esta lista inteira com as classes .sl-status-activity-*, entao
   o estilo delas mora aqui, escopado. O main-final dava a cada item um fundo
   branco translucido, e ao estado uma capsula colorida em caixa alta. */
.v3-st-eventos { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
.v3-st-eventos .sl-status-activity-item,
.v3-st-eventos .sl-status-activity-empty {
	display: flex;
	align-items: flex-start;
	gap: 12px;
	padding: 14px 18px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
	color: var(--v3-ink-2);
	font-size: 14px;
	line-height: 1.5;
}
.v3-st-eventos .sl-status-activity-empty { align-items: center; }
.v3-st-eventos .sl-status-activity-empty svg { flex: none; color: var(--v3-cmd-ok); }

.v3-st-eventos .sl-status-activity-dot {
	flex: none;
	width: 8px;
	height: 8px;
	margin-top: 7px;
	border-radius: 50%;
	background: var(--v3-ink-3);
}
.v3-st-eventos .sl-status-activity-dot--down        { background: var(--v3-cmd-perigo); }
.v3-st-eventos .sl-status-activity-dot--degraded    { background: var(--v3-cmd-atencao); }
.v3-st-eventos .sl-status-activity-dot--maintenance { background: var(--v3-cmd-info); }

.v3-st-eventos .sl-status-activity-body { flex: 1; min-width: 0; display: grid; gap: 3px; }
.v3-st-eventos .sl-status-activity-line { display: flex; align-items: baseline; flex-wrap: wrap; gap: 2px 12px; }
.v3-st-eventos .sl-status-activity-line strong { font-size: 15px; font-weight: 600; color: var(--v3-ink); }
.v3-st-eventos .sl-status-activity-status {
	padding: 0;
	background: none;
	border-radius: 0;
	font-family: var(--v3-mono);
	font-size: 12.5px;
	font-weight: 500;
	letter-spacing: 0;
	text-transform: none;
	color: var(--v3-ink-3);
}
.v3-st-eventos .sl-status-activity-status--down        { background: none; color: var(--v3-cmd-perigo); }
.v3-st-eventos .sl-status-activity-status--degraded    { background: none; color: var(--v3-cmd-atencao); }
.v3-st-eventos .sl-status-activity-status--maintenance { background: none; color: var(--v3-cmd-info); }
.v3-st-eventos .sl-status-activity-time { font-family: var(--v3-mono); font-size: 12px; color: var(--v3-ink-3); }

/* ---- incidentes (abertos e resolvidos) ---- */

.v3-st-incidentes { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
.v3-st-incidente {
	display: flex;
	align-items: baseline;
	flex-wrap: wrap;
	gap: 4px 16px;
	padding: 16px 18px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
}
/* A gravidade vem de um nivel semantico, nao do hexadecimal guardado no CPT:
   aqueles quatro valores foram escolhidos para a pele escura antiga e reprovam
   sobre o cartao branco. A palavra ("Critico", "Menor") continua dizendo tudo. */
.v3-st-sev {
	flex: none;
	font-family: var(--v3-mono);
	font-size: 12px;
	font-weight: 500;
	color: var(--v3-ink-3);
}
.v3-st-sev--perigo  { color: var(--v3-cmd-perigo); }
.v3-st-sev--atencao { color: var(--v3-cmd-atencao); }
.v3-st-sev--info    { color: var(--v3-cmd-info); }
.v3-st-sev--neutro  { color: var(--v3-ink-3); }

.v3-st-incidente-nome {
	flex: 1 1 280px;
	min-width: 0;
	font-size: 15px;
	font-weight: 500;
	color: var(--v3-ink);
	text-decoration: underline;
	text-decoration-color: var(--v3-line-strong);
	text-underline-offset: 3px;
}
.v3-st-incidente-nome:hover { text-decoration-color: var(--v3-ink); }
.v3-st-incidente-est { flex: none; font-family: var(--v3-mono); font-size: 12.5px; color: var(--v3-ink-3); }

/* ---- avisos de mudanca de estado ---- */

/* A pilha nasce vazia e o JS cria cada aviso com as classes .sl-status-toast*.
   O main-final fazia deles um vidro escuro com blur e sombra de 30px; aqui sao
   o mesmo cartao do resto do site, com a sombra do menu (unica sombra do tema)
   porque ele flutua sobre o conteudo. */
.v3-st-avisos {
	position: fixed;
	top: 88px;
	right: 16px;
	z-index: 9999;
	display: flex;
	flex-direction: column;
	gap: 10px;
	max-width: 360px;
	pointer-events: none;
}
.v3-st-avisos .sl-status-toast {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	min-width: 0;
	padding: 14px 16px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line-strong);
	border-radius: 10px;
	box-shadow: var(--v3-shadow-menu);
	backdrop-filter: none;
	-webkit-backdrop-filter: none;
	color: var(--v3-ink-2);
	font-size: 14px;
	line-height: 1.45;
	pointer-events: auto;
}
.v3-st-avisos .sl-status-toast--recovery { background: var(--v3-card); border-color: var(--v3-cmd-ok); }
.v3-st-avisos .sl-status-toast--incident { background: var(--v3-card); border-color: var(--v3-cmd-perigo); }
.v3-st-avisos .sl-status-toast--recovery .sl-status-toast-icon { color: var(--v3-cmd-ok); }
.v3-st-avisos .sl-status-toast--incident .sl-status-toast-icon { color: var(--v3-cmd-perigo); }
.v3-st-avisos .sl-status-toast-icon { flex: none; margin-top: 1px; }
/* Bloco, e nao grid: o JS escreve "<strong>nome</strong> caiu<small>de x para
   y</small>" e, em grid ou flex-column, o "caiu" solto vira um item proprio e
   cai numa linha so dele, longe do nome. Em bloco a frase fica inteira e so o
   <small> desce. */
.v3-st-avisos .sl-status-toast-body { flex: 1; min-width: 0; display: block; }
.v3-st-avisos .sl-status-toast-body strong { font-size: 14px; font-weight: 600; color: var(--v3-ink); }
.v3-st-avisos .sl-status-toast-body small {
	display: block;
	margin-top: 3px;
	font-family: var(--v3-mono);
	font-size: 12px;
	color: var(--v3-ink-3);
}
.v3-st-avisos .sl-status-toast-close {
	flex: none;
	padding: 0 2px;
	background: none;
	border: 0;
	color: var(--v3-ink-3);
	font-size: 20px;
	line-height: 1;
	cursor: pointer;
}
.v3-st-avisos .sl-status-toast-close:hover { color: var(--v3-ink); }

/* ---- respiro ---- */

@media (max-width: 1000px) {
	.v3-st-painel-grid { grid-template-columns: minmax(0, 1fr); gap: 20px; padding: 14px 0 6px; }
	.v3-st-medidas { grid-template-columns: repeat(3, minmax(0, 1fr)); }
	.v3-st-cards { grid-template-columns: minmax(0, 1fr); }
}

@media (max-width: 720px) {
	.v3-section.v3-st-servidores { padding: 56px 0; }
	.v3-st-hero { padding: 48px 0 36px; }
	.v3-st-hero-lede { font-size: 17px; }
	.v3-st-live [data-status-banner] { align-items: flex-start; gap: 12px; padding: 16px; }
	.v3-st-banner-dot { margin-top: 7px; }
	.v3-st-medidas { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.v3-st-controles { gap: 10px 24px; }
	.v3-st-abas { gap: 0 14px; }
	.v3-st-plot-tela { height: 200px; }
	.v3-st-resumo { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.v3-st-cards [data-monitor-key] { padding: 18px; }
	.v3-st-card-num { gap: 14px; }
	.v3-st-anel .v3-uptime-ring-svg { width: 60px; height: 60px; }
	.v3-st-card-stats { gap: 8px; }
	.v3-st-medida-val { font-size: 15px; }
	.v3-st-avisos { top: 78px; left: 16px; right: 16px; max-width: none; }
}

/* No celular estreito o anel e as tres medidas nao cabem lado a lado: com o
   anel na linha, cada medida ficava com 58px e "100,00%" em mono de 15px pede
   63. A quebra passa as medidas para a linha de baixo inteira. */
@media (max-width: 560px) {
	.v3-st-card-num { flex-wrap: wrap; gap: 12px 16px; }
	.v3-st-card-stats { flex: 1 1 100%; }
}

@media (prefers-reduced-motion: reduce) {
	.v3-st-live .sl-status-banner--up .v3-st-banner-dot { animation: none; }
	.v3-st-cards .sl-status-pill--up .sl-status-pill-dot { animation: none; }
	.v3-st-atualizar.is-spinning svg { animation: none; }
	.v3-st-avisos .sl-status-toast,
	.v3-st-avisos .sl-status-toast.is-leaving { animation: none; }
}

/* === rastreadores suportados === */
/* --------------------------------------------------------------------------
   /rastreadores-suportados/ (page-rastreadores.php). Catalogo de marcas e
   protocolos, alimentado pelo CPT 'protocolo'.

   DUAS COISAS PARA NAO DESFAZER SEM PENSAR:

   1. As classes .sl-* que sobraram na marcacao (sl-brand-row, sl-brand-name,
      sl-brand-models-inline, sl-brand-chip, sl-protocol, sl-server-uptime-value)
      NAO sao legado esquecido: sao os seletores que o main.js procura. Elas
      trazem junto a pele antiga do main-final, e por isso quase toda regra
      daqui aparece com duas ou tres classes: e o minimo para vencer os blocos
      [data-theme="light"] .sl-* daquele arquivo, que tem a mesma
      especificidade de uma classe so. Baixar a especificidade aqui devolve o
      cartao escuro com borda colorida no meio da pagina clara.

   2. Tres regras [hidden] no fim do bloco. O main.js mostra e esconde o botao
      de limpar, a lista e o estado vazio pelo ATRIBUTO hidden, e display:flex
      ou display:grid vencem o hidden do navegador. Sem elas o botao de limpar
      nasce visivel e a lista nunca some na busca sem resultado: nenhum erro no
      console, so a tela errada.

   A cor por protocolo (meta _sl_color) saiu na v3.6.6. O porque esta no
   cabecalho do page-rastreadores.php.
   -------------------------------------------------------------------------- */

/* Hero. Mesma receita da /revendas/: padding proprio em vez do .v3-section
   padrao, porque primeira secao da pagina respira menos em cima, e um fio
   fechando embaixo em vez de mudar o fundo. */
.v3-rastr-hero {
	padding: 72px 0 80px;
	border-bottom: 1px solid var(--v3-line);
}
.v3-rastr-hero-copy { max-width: 860px; }

.v3-rastr-hero-title {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}
.v3-rastr-hero-lede {
	max-width: 640px;
	margin: 22px 0 0;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}
.v3-rastr-hero-ctas {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 30px;
}
.v3-rastr-stats { margin-top: 34px; }

/* Disponibilidade ao vivo. O numero e o mesmo .v3-personas-stat-n dos outros
   tres, mas carrega junto a classe .sl-server-uptime-value, que o main-final
   pinta de teal em DOIS lugares, um deles dentro de [data-theme="light"] e
   portanto com o peso de duas classes. Tres classes desfazem os dois. O
   font-size vem junto porque o main-final trava 1,15rem na mesma classe: hoje
   o v3.css ja vence por ordem de carga, mas deixar explicito aqui evita que
   um dia o numero encolha sozinho ao mexer na ordem dos arquivos. */
.v3-rastr-stats .v3-rastr-uptime .sl-server-uptime-value {
	font-family: var(--v3-display);
	font-size: clamp(1.6rem, 2.6vw, 2.1rem);
	color: var(--v3-brand);
	transition: none;
}
/* O initLiveStatus acende .is-updated por ~1,4s quando o valor muda de
   verdade. O fundo fica rente ao texto de proposito: qualquer padding aqui
   desalinharia esta estatistica das outras tres da mesma linha. */
.v3-rastr-uptime {
	border-radius: 8px;
	transition: background-color .6s ease;
}
.v3-rastr-uptime.is-updated { background: var(--v3-brand-soft); }

/* Selo da ultima atualizacao do catalogo. Mono e discreto: e procedencia do
   dado, nao promessa. Cinza --v3-ink-3 sobre --v3-page da 4,83:1. */
.v3-rastr-selo {
	margin: 24px 0 0;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.4;
	color: var(--v3-ink-3);
}
.v3-rastr-selo time { color: var(--v3-ink-2); }

/* --------------------------------------------------------------------------
   Busca. Cartao branco dentro da secao cinza: o campo precisa se separar do
   fundo, senao vira uma linha sem forma no meio do texto.
   -------------------------------------------------------------------------- */
.v3-rastr-busca {
	display: flex;
	align-items: center;
	gap: 10px;
	max-width: 560px;
	padding: 0 12px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line-strong);
	border-radius: 10px;
}
.v3-rastr-busca:focus-within { border-color: var(--v3-ink); }
.v3-rastr-busca-icone {
	flex: none;
	display: flex;
	color: var(--v3-ink-3);
}

/* Rotulo so para leitor de tela: o campo ja tem placeholder e lupa, mas
   placeholder some ao digitar e nao substitui rotulo. */
.v3-rastr-busca-label {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

/* O id entra no seletor porque o main-final tem um bloco
   [data-theme="light"] #sl-brand-search-input que pinta o campo por id. */
.v3-rastr-busca .v3-rastr-busca-campo,
.v3-rastr-busca #sl-brand-search-input {
	flex: 1 1 auto;
	min-width: 0;
	padding: 13px 0;
	background: transparent;
	border: 0;
	border-radius: 0;
	font-family: var(--v3-body);
	font-size: 15px;
	line-height: 1.4;
	color: var(--v3-ink);
	outline: none;
	-webkit-appearance: none;
	appearance: none;
}
.v3-rastr-busca .v3-rastr-busca-campo::placeholder,
.v3-rastr-busca #sl-brand-search-input::placeholder {
	color: var(--v3-ink-3);
	opacity: 1;
}
/* O X nativo do type="search" do WebKit duplicaria o botao de limpar, e o
   nativo nao avisa o main.js. */
.v3-rastr-busca-campo::-webkit-search-decoration,
.v3-rastr-busca-campo::-webkit-search-cancel-button {
	-webkit-appearance: none;
	appearance: none;
}

.v3-rastr-busca-limpar {
	flex: none;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 26px;
	height: 26px;
	padding: 0;
	background: transparent;
	border: 1px solid var(--v3-line);
	border-radius: 6px;
	color: var(--v3-ink-3);
	cursor: pointer;
	transition: color .15s ease, border-color .15s ease;
}
.v3-rastr-busca-limpar:hover {
	color: var(--v3-ink);
	border-color: var(--v3-line-strong);
}

/* --------------------------------------------------------------------------
   Pastilhas de atalho por protocolo. O PHP corta em doze; a explicacao do
   corte esta la. Aqui interessa o estado ativo.
   -------------------------------------------------------------------------- */
.v3-rastr-protos {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 8px;
	margin-top: 18px;
}
.v3-rastr-protos-rotulo {
	margin-right: 4px;
	font-family: var(--v3-mono);
	font-size: 12px;
	letter-spacing: .04em;
	/* Cinza forte: esta linha fica sobre --v3-page-alt, onde o --v3-ink-3
	   normal da 4,47:1 e reprova por pouco. Este da 4,91:1. */
	color: var(--v3-ink-3-strong);
}

/* "e mais N na lista abaixo": conta o que o corte de doze deixou de fora. Sem
   caixa e sem borda de proposito, porque nao e botao e nao filtra nada. */
.v3-rastr-proto-resto {
	align-self: center;
	font-family: var(--v3-mono);
	font-size: 12.5px;
	color: var(--v3-ink-3);
}

.v3-rastr-proto.sl-protocol {
	padding: 8px 13px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line-strong);
	border-radius: 8px;
	font-family: var(--v3-mono);
	font-size: 13px;
	font-weight: 500;
	line-height: 1.2;
	letter-spacing: 0;
	text-transform: none;
	color: var(--v3-ink);
	cursor: pointer;
	box-shadow: none;
	transform: none;
	transition: background-color .15s ease, border-color .15s ease, color .15s ease;
}
/* Hover so na borda, igual ao .v3-card do resto do site. O legado subia a
   pastilha 2px e acendia um halo laranja; os dois estao desligados aqui. */
.v3-rastr-proto.sl-protocol:hover {
	background: var(--v3-card);
	border-color: var(--v3-ink-3);
	color: var(--v3-ink);
	box-shadow: none;
	transform: none;
}
.v3-rastr-proto.sl-protocol:focus-visible {
	outline: 2px solid var(--v3-brand);
	outline-offset: 2px;
}
/* Pastilha ativa em TINTA, nao em laranja, por dois motivos. O primeiro e o
   contrato: a direcao lista onde o laranja pode entrar e "filtro ativo" nao
   esta la. O segundo e contraste: branco sobre --v3-brand da 3,27:1 e reprova
   em texto de 13px. Esta combinacao da 17,7:1 no claro e 16,3:1 no escuro.
   A mudanca tambem nao e SO de cor: a pastilha sai de vazada para cheia, e o
   main.js escreve o nome do protocolo dentro do campo de busca ao lado, entao
   o filtro ligado continua legivel por palavra para quem nao distingue cor. */
.v3-rastr-proto.sl-protocol.is-active {
	background: var(--v3-ink);
	border-color: var(--v3-ink);
	color: var(--v3-page);
	font-weight: 600;
	box-shadow: none;
}

/* Contagem viva. O main.js reescreve so o numero de dentro do primeiro span;
   as palavras em volta sao do PHP. */
.v3-rastr-contagem {
	margin: 18px 0 0;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.4;
	color: var(--v3-ink-3-strong);
}
.v3-rastr-contagem span {
	color: var(--v3-ink);
	font-weight: 500;
}

/* --------------------------------------------------------------------------
   Catalogo.
   -------------------------------------------------------------------------- */
/* Bloco simples de proposito: o main.js cria um sentinela de rolagem e o
   insere como IRMAO da lista, aqui dentro. Numa grade ele viraria uma celula
   vazia no meio do catalogo. */
.v3-rastr-catalogo { margin-top: 24px; }
.v3-rastr-catalogo .sl-brand-sentinel { height: 1px; }

.v3-rastr-lista {
	display: grid;
	gap: 10px;
}

/* Cartao deitado, mesma pele dos outros cards da rodada. O display:block
   desfaz o flex horizontal do legado, que jogava descricao e pastilhas na
   mesma linha e espremia as duas. */
.v3-rastr-lista .v3-rastr-item.sl-brand-row {
	display: block;
	padding: 22px 24px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
	color: var(--v3-ink);
	box-shadow: none;
	transform: none;
	transition: border-color .15s ease;
	/* O main-final liga content-visibility:auto nestas linhas, e vale a pena
	   num catalogo de cem marcas. So o placeholder de altura vem de la com
	   110px, medida do cartao antigo; com o novo a barra de rolagem pulava a
	   cada bloco revelado. */
	contain-intrinsic-size: auto 190px;
}
.v3-rastr-lista .v3-rastr-item.sl-brand-row:hover {
	background: var(--v3-card);
	border-color: var(--v3-line-strong);
	box-shadow: none;
	transform: none;
}

/* O initTilt e o initSpotlight do main.js listam .sl-brand-row na curadoria
   deles, e essa classe NAO pode sair da marcacao: e por ela que o initBrandList
   acha as linhas para filtrar. Resultado no desktop com mouse: cada linha do
   catalogo balancava em 3D e recebia um clarao laranja de 380px seguindo o
   cursor, que sao os dois efeitos que a direcao proibe por nome.

   O transform o JS escreve INLINE a cada pointermove, e atributo style vence
   qualquer declaracao de autor sem !important, por isso o transform: none logo
   acima nao resolvia sozinho. O ::after do spotlight vem do main-final e some
   por display. Mesmo recurso ja usado no mapa do contato e no reset da
   .sl-server-status. */
.v3-rastr-lista .v3-rastr-item.sl-brand-row,
.v3-rastr-lista .v3-rastr-item.sl-brand-row:hover { transform: none !important; }
.v3-rastr-lista .v3-rastr-item.sl-brand-row.sl-spotlight::after { display: none !important; }

.v3-rastr-item-topo {
	display: flex;
	align-items: center;
	gap: 14px;
}

/* Sigla do meta _sl_mark, na tinta fraca da marca. Mesmo par do
   .v3-fab-item-avatar do hub de comandos, ja medido: --v3-brand-text sobre
   --v3-brand-soft da 4,66:1 no claro e 6,17:1 no escuro. */
.v3-rastr-sigla {
	flex: none;
	display: flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	width: 44px;
	height: 44px;
	border: 0;
	border-radius: 10px;
	background: var(--v3-brand-soft);
	color: var(--v3-brand-text);
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 104, "wght" 650;
	font-size: 16px;
	line-height: 1;
}

.v3-rastr-item-id {
	display: flex;
	align-items: baseline;
	flex-wrap: wrap;
	gap: 6px 10px;
	min-width: 0;
}

/* .sl-brand-name e a MESMA classe do nome no logotipo do cabecalho, que sai em
   teal e ganha um gradiente varrido no hover do lockup. Dentro da lista ela
   precisa virar titulo normal, e o -webkit-text-fill-color e o que impede o
   texto de ficar transparente se aquele gradiente algum dia vazar para ca. */
.v3-rastr-lista .v3-rastr-nome.sl-brand-name {
	margin: 0;
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 104, "wght" 650;
	font-size: 1.15rem;
	line-height: 1.25;
	letter-spacing: -.01em;
	text-transform: none;
	color: var(--v3-ink);
	background: none;
	-webkit-text-fill-color: currentColor;
}

.v3-rastr-tag {
	flex: none;
	padding: 2px 8px;
	border: 1px solid var(--v3-line);
	border-radius: 5px;
	font-family: var(--v3-mono);
	font-size: 11.5px;
	line-height: 1.5;
	color: var(--v3-ink-3);
}

/* Modelos que vieram no titulo depois do ":" (auto-split do helper). */
.v3-rastr-lista .v3-rastr-inline.sl-brand-models-inline {
	margin: 12px 0 0;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.5;
	color: var(--v3-ink-2);
}

.v3-rastr-desc {
	max-width: 74ch;
	margin: 12px 0 0;
	font-size: 15px;
	line-height: 1.6;
	color: var(--v3-ink-2);
}

/* Protocolo, porta e modelos. Protocolo cadastrado so com o nome nao imprime
   esta div: quem decide e o PHP, nao um :empty aqui. O tema antigo tentava pelo
   CSS e nunca funcionou, porque o PHP deixa quebra de linha entre as tags e
   :empty so casa com elemento sem NENHUM no filho, texto em branco incluido.
   Nao readicionar a regra achando que resolve. */
.v3-rastr-dados {
	display: flex;
	flex-wrap: wrap;
	gap: 16px 34px;
	margin-top: 16px;
	padding-top: 16px;
	border-top: 1px solid var(--v3-line);
}

.v3-rastr-col {
	display: flex;
	flex-direction: column;
	gap: 7px;
	min-width: 0;
	max-width: 340px;
}
.v3-rastr-col--larga { max-width: 560px; }

.v3-rastr-rotulo {
	font-family: var(--v3-mono);
	font-size: 11px;
	line-height: 1.4;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--v3-ink-3);
}

.v3-rastr-pastilhas {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
}

/* Pastilha de dado. Fundo --v3-page-alt dentro do cartao branco: le como
   ladrilho rebaixado sem precisar de sombra. --v3-ink-2 sobre ele da 7,0:1 no
   claro e 8,6:1 no escuro. */
.v3-rastr-lista .v3-rastr-pastilha.sl-brand-chip {
	padding: 3px 9px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 6px;
	font-family: var(--v3-mono);
	font-size: 12.5px;
	line-height: 1.45;
	letter-spacing: 0;
	color: var(--v3-ink-2);
	transition: none;
}
/* Protocolo pesa mais que modelo, e e o que decide a compatibilidade. O
   destaque e de tinta e de borda, nunca de matiz: o rotulo "Protocolo" em
   cima da coluna ja diz o que a cor diria. */
.v3-rastr-lista .v3-rastr-pastilha--proto.sl-brand-chip {
	border-color: var(--v3-line-strong);
	color: var(--v3-ink);
	font-weight: 500;
}

.v3-rastr-item-acao {
	margin: 16px 0 0;
	font-size: 15px;
}

.v3-rastr-vazio {
	max-width: 700px;
	margin-top: 10px;
}

/* --------------------------------------------------------------------------
   Passos. Lista ordenada de verdade: o numero sai do ::marker, entao nao ha
   algarismo escrito na marcacao para o leitor de tela ler duas vezes, e nao ha
   numero grande de enfeite, que a direcao proibe. O fio em cima de cada item
   da o ritmo que o numerinho nao precisa dar.
   -------------------------------------------------------------------------- */
.v3-rastr-passos {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: 22px;
	margin: 0;
	padding: 0;
	list-style: decimal inside;
}
.v3-rastr-passo {
	padding-top: 16px;
	border-top: 1px solid var(--v3-line);
	font-size: 16px;
}
.v3-rastr-passo::marker {
	font-family: var(--v3-mono);
	font-weight: 500;
	color: var(--v3-ink-3);
}
/* Inline de proposito: com list-style inside, um titulo em bloco empurraria o
   numero para uma linha sozinha. Assim le "1. Ache o codigo do modelo". */
.v3-rastr-passo-t {
	font-family: var(--v3-body);
	font-weight: 600;
	font-size: 16px;
	line-height: 1.35;
	color: var(--v3-ink);
}
.v3-rastr-passo-d {
	display: block;
	margin-top: 8px;
	font-size: 14.5px;
	line-height: 1.55;
	color: var(--v3-ink-2);
}

/* --------------------------------------------------------------------------
   [hidden] que o main.js liga e desliga. Todos os tres elementos tem display
   proprio, que vence o hidden do navegador. Ver o aviso do topo do bloco.
   -------------------------------------------------------------------------- */
.v3-rastr-busca-limpar[hidden] { display: none; }
.v3-rastr-lista[hidden]        { display: none; }
.v3-rastr-vazio[hidden]        { display: none; }

@media (max-width: 1000px) {
	.v3-rastr-hero { padding: 60px 0 64px; }
	.v3-rastr-passos { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.v3-rastr-col,
	.v3-rastr-col--larga { max-width: 100%; }
}

@media (max-width: 720px) {
	.v3-rastr-hero { padding: 48px 0 52px; }
	.v3-rastr-hero-ctas .v3-btn { width: 100%; }
	.v3-rastr-busca { max-width: none; }
	.v3-rastr-protos { gap: 7px; }
	/* O rotulo ocupa a linha inteira: junto das pastilhas ele empurrava a
	   primeira delas para fora e sobrava uma pastilha sozinha no fim. */
	.v3-rastr-protos-rotulo { flex: 1 0 100%; margin: 0 0 2px; }
	.v3-rastr-passos { grid-template-columns: minmax(0, 1fr); gap: 18px; }
	.v3-rastr-lista .v3-rastr-item.sl-brand-row { padding: 18px; }
	.v3-rastr-sigla { width: 40px; height: 40px; font-size: 15px; }
	.v3-rastr-dados { gap: 14px 24px; }
	.v3-rastr-vazio .v3-btn { width: 100%; }
}

/* --------------------------------------------------------------------------
   404: pagina de erro
   Quem cai aqui errou um endereco e esta a um clique de fechar a aba, entao a
   pagina e curta: hero com a busca do site, o seletor de rastreador inteiro e
   seis destinos em card. Os CARDS nao tem uma linha de CSS aqui, de proposito:
   .v3-grid-3 + .v3-card + .v3-feat-icon ja desenham exatamente isso, e e o
   mesmo arranjo dos cards de canal da page-area-cliente.php.
   -------------------------------------------------------------------------- */

.v3-404-hero { padding: 72px 0 56px; }
.v3-404-hero-copy { max-width: 720px; }

/* "Erro 404" e meta, nao titulo: mono pequeno, como toda meta do site.
   Contraste do --v3-ink-3: #6B7280 sobre o branco da pagina da 4,83:1, e no
   tema escuro #88919C sobre #0F1215 da 5,88:1. Passa nos dois em 13px. */
.v3-404-codigo {
	margin: 0 0 16px;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.4;
	letter-spacing: .04em;
	color: var(--v3-ink-3);
}

/* Familia, peso e cor vem da regra global de h1 do topo do arquivo; aqui so a
   escala da hero, igual a da .v3-legal-hero-titulo. */
.v3-404-titulo {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}

.v3-404-lede {
	margin: 22px 0 0;
	max-width: 620px;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

/* ---- busca do site ---- */

/* O ELEMENTO entra no seletor (input.v3-404-busca-campo) e nao e preciosismo:
   o main-final.css estiliza input[type="search"] com especificidade (0,1,1),
   igual a de uma classe mais um elemento e MAIOR que a de uma classe sozinha.
   Com a classe pura, padding, raio de 12px e fundo translucido daquele arquivo
   venceriam calados. O width: auto existe pelo mesmo motivo: la o campo e
   width: 100%, que num item flex vira 100% do contentor e estoura a linha. */
.v3-404-busca {
	display: flex;
	gap: 10px;
	margin-top: 30px;
	max-width: 560px;
}
input.v3-404-busca-campo {
	flex: 1 1 auto;
	width: auto;
	min-width: 0;
	padding: 12px 14px;
	background: var(--v3-card);
	/* Borda em --v3-ink-3 e nao em --v3-line-strong, que e o hairline de card:
	   #C9D0D8 sobre branco da 1,56:1 e #37404A sobre o fundo escuro da 1,79:1,
	   e os dois reprovam nos 3:1 que um contorno de controle precisa ter. O
	   ink-3 da 4,83:1 no claro e 5,88:1 no escuro. Fica mais escuro que as
	   outras bordas do site de proposito: este e o unico campo editavel da
	   pagina, e contorno de campo e informacao, nao moldura. */
	border: 1px solid var(--v3-ink-3);
	border-radius: 8px;
	font-family: var(--v3-body);
	font-size: 15px;
	line-height: 1.2;
	color: var(--v3-ink);
	transition: border-color .15s ease;
}
input.v3-404-busca-campo::placeholder { color: var(--v3-ink-3); }
input.v3-404-busca-campo:hover { border-color: var(--v3-ink-2); }

/* O foco do site e o anel laranja do :focus-visible, mas ele nunca alcancava
   um campo: o main-final.css tem input:focus { outline: none } com
   especificidade (0,1,1) contra os (0,1,0) do :focus-visible solto. Aqui o
   anel volta, com o elemento no seletor para vencer aquela regra, e a sombra
   de 4px que vinha junto de la sai, senao ficariam dois aneis concentricos. */
input.v3-404-busca-campo:focus,
input.v3-404-busca-campo:focus-visible {
	outline: 2px solid var(--v3-brand);
	outline-offset: 2px;
	border-color: var(--v3-brand);
	background: var(--v3-card);
	box-shadow: none;
}
.v3-404-busca .v3-btn { flex: none; }

/* A nota e o que faz a busca valer a pena nesta pagina (o CPT dos modelos de
   rastreador participa da busca do WordPress), entao e informacao de servico:
   mono pequeno, como a meta do resto do site. */
.v3-404-busca-nota {
	margin: 10px 0 0;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.5;
	color: var(--v3-ink-3);
}

.v3-404-ctas {
	margin-top: 26px;
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
}

/* ---- seletor de rastreador reaproveitado ---- */

/* A barra do template-parts/cmd-seletor.php foi desenhada para grudar abaixo
   da hero das paginas de comando (sticky, top: 70px medido contra o cabecalho).
   Aqui ela e um bloco comum no meio de uma secao.
   RELATIVE e nao STATIC: abaixo de 720px o painel do catalogo se posiciona por
   left/right: 12px contra o ancestral posicionado mais proximo, que e esta
   barra. Com static ela deixaria de ser ancestral posicionado, o painel
   passaria a se medir pela pagina inteira e o catalogo abriria fora da tela.
   O top: auto anula o top: 70px do sticky, que num elemento relativo empurra
   a barra 70px para baixo em vez de gruda-la. Fundo opaco e fio de baixo saem
   porque existiam para a barra passar por cima do conteudo enquanto rola. */
.v3-404-sel .v3-cmd-topo {
	position: relative;
	top: auto;
	z-index: 1;
	background: transparent;
	box-shadow: none;
}
/* So o respiro vertical: o padding lateral desta linha vem do .v3-wrap que ela
   tambem carrega, e zera-lo com o atalho padding encostaria a barra na borda
   da tela. */
.v3-404-sel .v3-cmd-topo-linha {
	padding-top: 0;
	padding-bottom: 0;
	min-height: 0;
}

/* A trilha daquela peca diz "Voce esta em: Comandos de rastreadores". Nesta
   pagina isso e mentira anunciada: o <nav> tem aria-label e o item sai com
   aria-current="page" enquanto o h1 da tela diz que a pagina nao existe.
   display: none tira o nav da arvore de acessibilidade tambem, e nao so da
   tela, que e a unica forma de esconder que resolve o problema. */
.v3-404-sel .v3-cmd-trilha { display: none; }

/* Sem a trilha sobra um item so na linha e o botao encosta na esquerda. O
   painel e ancorado por right: 0 porque la ele pende de um botao que fica na
   DIREITA; aqui, ancorado assim, abriria para fora da tela pela esquerda. */
.v3-404-sel .v3-cmd-sel-painel { right: auto; left: 0; }

@media (max-width: 720px) {
	.v3-404-hero { padding: 48px 0 40px; }
	.v3-404-lede { font-size: 17px; }

	/* Campo em cima, botao embaixo. Lado a lado, o "Buscar" comia metade da
	   largura util do campo, que e onde a pessoa digita o nome do modelo. */
	.v3-404-busca {
		flex-direction: column;
		max-width: none;
	}
	.v3-404-busca .v3-btn { width: 100%; }

	/* Devolve o ancoramento de tela cheia que o bloco de 720px da propria peca
	   pede: o left: 0 do desktop, acima, e mais especifico e venceria mesmo
	   dentro desta media query. */
	.v3-404-sel .v3-cmd-sel-painel {
		left: 12px;
		right: 12px;
	}
}

/* ==========================================================================
   Pagina /sobre/ (page-sobre.php, rodada v3.6.6)

   Peca a peca: hero com foto opcional e a barra de numeros das personas, a
   historia em duas colunas (a data de um lado, o texto do outro), os tres
   principios e o time em .v3-card puro, a ficha da Receita como um cartao
   dividido por hairlines e o mapa com os quatro cartoes de localizacao.

   Duas coisas aqui nao sao estilo novo e sim conserto de pele antiga:

     .v3-sobre-mapa.sl-gmap       a .sl-gmap do main-final.css e a familia que
                                  o main.js completa sozinho (ele acende
                                  .sl-gmap--ready e injeta o fallback). Ela fica
                                  na marcacao por causa disso, mas trazia
                                  background #1a1a24 fixo, que e um retangulo
                                  preto no tema claro enquanto os ladrilhos
                                  carregam.
     .v3-sobre-mapa .sl-gmap-fallback   o <a> que o JS escreve quando nao ha
                                  chave do Google (o caso de hoje). Na pele
                                  antiga ele e uma caixa tracejada em laranja
                                  que levanta no hover. Aqui vira cartao sobrio.

   Os dois seletores sao compostos de proposito, e mesmo assim alguns valores
   precisam de !important: o conserto do tema claro no main-final.css usa
   !important e empata em especificidade com eles. O porque esta escrito
   outra vez, por extenso, em cima do bloco do mapa.
   -------------------------------------------------------------------------- */

/* ---- sobre: hero ---- */

.v3-sobre-hero {
	padding: 72px 0 56px;
	border-bottom: 1px solid var(--v3-line);
}

.v3-sobre-hero-grid {
	display: grid;
	grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
	gap: 48px;
	align-items: center;
}
/* Sem foto no Customizer: uma coluna so, com a medida de leitura do texto. */
.v3-sobre-hero-grid--solo { grid-template-columns: minmax(0, 1fr); }
.v3-sobre-hero-grid--solo .v3-sobre-hero-copy { max-width: 760px; }

.v3-sobre-hero-copy { min-width: 0; }

/* Moldura de proporcao fixa, igual a das heros de /planos-plataforma/ e
   /revendas/: qualquer foto que o admin subir sai do mesmo tamanho e alinhada
   com o texto, em vez de a altura da coluna vir da imagem. */
.v3-sobre-hero-visual {
	min-width: 0;
	overflow: hidden;
	aspect-ratio: 3 / 2;
	max-height: 460px;
	border-radius: 14px;
}
.v3-sobre-hero-img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
}

.v3-sobre-hero-title {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}
.v3-sobre-hero-lede {
	margin: 22px 0 0;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}
/* Mesmo respiro da barra de numeros da hero de /revendas/. */
.v3-sobre-hero-stats { margin-top: 34px; }

/* ---- sobre: historia ---- */

/* A data fica numa coluna estreita a esquerda e o texto na larga a direita.
   Nao e uma linha do tempo: a empresa so publicou uma data ate hoje, e a
   template-parts/section-timeline.php do tema e outra coisa (as etapas de
   implantacao, ainda na pele antiga). */
.v3-sobre-hist {
	display: grid;
	grid-template-columns: 200px minmax(0, 1fr);
	gap: 48px;
	align-items: start;
}

/* O fio grosso em cima da data e o unico ornamento da secao, e ele existe
   para a coluna estreita nao parecer um paragrafo solto no canto. */
.v3-sobre-hist-meta {
	padding-top: 16px;
	border-top: 2px solid var(--v3-line-strong);
}
.v3-sobre-hist-ano {
	margin: 0;
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 106, "wght" 700;
	font-size: clamp(2.4rem, 4vw, 3.2rem);
	line-height: 1;
	letter-spacing: -.03em;
	color: var(--v3-ink);
}
/* Texto pequeno DIRETO sobre a secao cinza, e nao dentro de um cartao branco:
   por isso ink-3-strong e nao ink-3. O #6B7280 sobre o #F5F6F8 da 4,47:1 e
   reprova por pouco abaixo de 18,66px; o #646C78 do ink-3-strong da 4,91:1,
   como ja esta medido no bloco de tokens deste arquivo. */
.v3-sobre-hist-rotulo {
	margin: 10px 0 0;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.45;
	color: var(--v3-ink-3-strong);
}

.v3-sobre-hist-corpo { min-width: 0; }
.v3-sobre-hist-titulo {
	font-size: clamp(1.7rem, 2.6vw + .6rem, 2.5rem);
	line-height: 1.08;
	text-wrap: balance;
}
.v3-sobre-hist-texto {
	max-width: 68ch;
	margin: 18px 0 0;
	font-size: 17px;
	line-height: 1.65;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

/* ---- sobre: quem atende ---- */

/* A area da pessoa, acima do nome. Mono e caixa de sentenca: caixa alta com
   espacamento de letra aqui viraria o eyebrow que saiu do site inteiro. */
.v3-sobre-time-area {
	margin: 0;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.4;
	color: var(--v3-ink-3);
}

/* Botao abaixo de uma grade (o de /contato/ e os que vierem depois). */
.v3-sobre-acao { margin-top: 32px; }

/* ---- sobre: ficha oficial ---- */

/* O cartao perde o padding proprio e vira tres faixas separadas por hairline:
   identificacao, dados e acoes. O gap do .v3-card tambem zera, senao sobra um
   vao de 12px encostado em cada fio. */
.v3-sobre-id {
	gap: 0;
	padding: 0;
}

.v3-sobre-id-topo {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	justify-content: space-between;
	gap: 12px 24px;
	padding: 24px 28px;
	border-bottom: 1px solid var(--v3-line);
}
.v3-sobre-id-nomes { min-width: 0; }
.v3-sobre-id-nome {
	margin: 0;
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 104, "wght" 650;
	font-size: 1.2rem;
	line-height: 1.25;
	letter-spacing: -.01em;
	color: var(--v3-ink);
}
.v3-sobre-id-razao {
	margin: 4px 0 0;
	font-size: 14px;
	line-height: 1.45;
	color: var(--v3-ink-3);
}
.v3-sobre-id-situacao {
	margin: 0;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.4;
	color: var(--v3-ink-3);
}
.v3-sobre-id-situacao strong {
	font-weight: 500;
	color: var(--v3-ink);
}

.v3-sobre-id-dados {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	margin: 0;
}
.v3-sobre-id-item {
	padding: 20px 28px;
	border-bottom: 1px solid var(--v3-line);
}
/* Fio vertical so na coluna da esquerda das linhas de duas colunas. O :not e
   obrigatorio: o item largo tambem cai em posicao impar e ganharia um fio
   colado na borda direita do cartao. */
.v3-sobre-id-item:not(.v3-sobre-id-item--largo):nth-child(odd) {
	border-right: 1px solid var(--v3-line);
}
.v3-sobre-id-item--largo { grid-column: 1 / -1; }
/* O ultimo nao desenha fio embaixo: quem fecha ali e a borda do proprio
   cartao, e os dois juntos leem como uma linha de 2px. */
.v3-sobre-id-item:last-child { border-bottom: 0; }

.v3-sobre-id-dados dt {
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.4;
	color: var(--v3-ink-3);
}
.v3-sobre-id-dados dd {
	margin: 6px 0 0;
	font-size: 16px;
	line-height: 1.5;
	color: var(--v3-ink);
}
/* CNPJ em mono: e numero, e a mono alinha os grupos de digitos. */
.v3-sobre-id-num {
	font-family: var(--v3-mono);
	font-size: 15px;
	letter-spacing: -.01em;
}
/* O CNAE desce para a linha de baixo da atividade: e a referencia do codigo,
   nao parte do nome da atividade. */
.v3-sobre-id-cnae {
	display: block;
	margin-top: 6px;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.4;
	color: var(--v3-ink-3);
}

.v3-sobre-id-acoes {
	margin: 0;
	padding: 22px 28px;
}

/* ---- sobre: onde ficamos ---- */

/* Os !important daqui para baixo nao sao preguica: o main-final.css tem um
   bloco inteiro de [data-theme="light"] .sl-gmap* escrito com !important (era
   o conserto do tema claro na pele antiga). Ele tem a MESMA especificidade que
   estes seletores compostos e venceria no tema claro, deixando o mapa com
   fundo #f0f0f5 e o fallback tracejado. Mesma razao pela qual o topo deste
   arquivo ja usa !important. No tema escuro nenhum deles chega a valer. */
.v3-sobre-mapa.sl-gmap {
	height: auto;
	min-height: 0;
	aspect-ratio: 21 / 9;
	max-height: 460px;
	/* A pele antiga fixava #1a1a24 aqui, que no tema claro e um retangulo preto
	   enquanto os ladrilhos nao chegam (e a caixa inteira quando nao ha chave
	   do Google). Cartao com hairline, como todo o resto da pagina. */
	background: var(--v3-card) !important;
	border: 1px solid var(--v3-line);
	border-radius: 12px;
}

/* A .sl-gmap--ready quem acende e a initContactMap(), e so quando um mapa de
   verdade sobe. Sem chave do Google configurada ela nunca acende e o que fica
   na caixa e o link de fallback: um pino de 22px e duas linhas de texto
   boiando numa faixa de 460px. Por isso o estado padrao aqui e a caixa
   encolhida, e a proporcao de banner so vale quando o mapa existe. */
.v3-sobre-mapa.sl-gmap:not(.sl-gmap--ready) {
	aspect-ratio: auto;
	max-height: none;
	min-height: 160px;
}

/* O <a> que a initContactMap() escreve quando nao ha chave configurada. A
   marcacao dele e do JS (svg + span + small) e nao muda; aqui so se troca a
   caixa tracejada laranja que levantava no hover por um alvo sobrio. */
.v3-sobre-mapa .sl-gmap-fallback {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 10px;
	height: 100%;
	min-height: 0;
	padding: 32px;
	background: none !important;
	border: 0 !important;
	border-radius: inherit;
	text-align: center;
	text-decoration: none;
	color: var(--v3-ink) !important;
	transition: background-color .15s ease;
}
.v3-sobre-mapa .sl-gmap-fallback:hover {
	background: var(--v3-page-alt) !important;
	transform: none;
}
/* Laranja de TEXTO, nao o --v3-brand cheio: o icone fica sobre o cartao branco
   e nao sobre a tinta fraca do .v3-feat-icon. O #B84A00 da ~4,8:1 e passa com
   folga nos 3:1 que icone exige; o #F16000 ficaria em ~3,1:1, no limite. */
.v3-sobre-mapa .sl-gmap-fallback svg { color: var(--v3-brand-text); }
.v3-sobre-mapa .sl-gmap-fallback span {
	font-family: var(--v3-body);
	font-weight: 600;
	font-size: 16px;
	color: var(--v3-ink) !important;
}
.v3-sobre-mapa .sl-gmap-fallback small {
	max-width: 40ch;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.5;
	color: var(--v3-ink-3) !important;
}

.v3-sobre-locais { margin-top: 24px; }

/* Telefone e e-mail: o dado e o proprio link, entao ele nao vai no rodape de
   meta do cartao e sim no corpo, no tamanho do texto. */
.v3-sobre-local-dado {
	margin: 0;
	font-size: 16px;
	line-height: 1.5;
}

/* ---- sobre: conteudo livre do editor ---- */

/* A pagina quase sempre nao tem nada aqui; quando o admin escrever, o texto
   sai na mesma medida e no mesmo ritmo do resto do site em vez de herdar a
   prosa da pele antiga. */
.v3-sobre-prose {
	max-width: 720px;
	font-size: 17px;
	line-height: 1.7;
	color: var(--v3-ink-2);
}
.v3-sobre-prose > :first-child { margin-top: 0; }
.v3-sobre-prose h2 {
	margin: 40px 0 12px;
	font-size: clamp(1.5rem, 2vw + .5rem, 1.9rem);
	line-height: 1.15;
}
.v3-sobre-prose h3 { margin: 28px 0 10px; font-size: 1.15rem; line-height: 1.3; }
/* color: inherit pelo mesmo motivo ja documentado em .v3-legal-corpo p: o
   main-final tem um "p { color: var(--sl-text-2) }" pelado, e regra que casa
   DIRETO com o elemento ganha da cor herdada do ancestral, por mais especifico
   que ele seja. Sem esta linha o paragrafo do editor saia na paleta antiga e o
   <li> ao lado dele na nova, dois cinzas diferentes no mesmo texto. */
.v3-sobre-prose p { margin: 0 0 16px; color: inherit; }
.v3-sobre-prose ul,
.v3-sobre-prose ol { margin: 0 0 16px; padding-left: 22px; }
.v3-sobre-prose li { margin-bottom: 8px; }
.v3-sobre-prose strong { font-weight: 600; color: var(--v3-ink); }
.v3-sobre-prose a {
	color: var(--v3-ink);
	text-decoration: underline;
	text-decoration-color: var(--v3-line-strong);
	text-underline-offset: 3px;
}
.v3-sobre-prose a:hover { text-decoration-color: var(--v3-ink); }
.v3-sobre-prose img { border-radius: 10px; }

/* ---- sobre: cortes ---- */

@media (max-width: 1000px) {
	.v3-sobre-hero-grid { grid-template-columns: minmax(0, 1fr); gap: 30px; }
	.v3-sobre-hero-visual { max-height: 360px; }

	/* Sem a coluna estreita, a data e o rotulo dividem uma linha so em vez de
	   virarem um bloco alto em cima do texto. */
	.v3-sobre-hist { grid-template-columns: minmax(0, 1fr); gap: 26px; }
	.v3-sobre-hist-meta { display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap; }
	.v3-sobre-hist-rotulo { margin: 0; }

	.v3-sobre-mapa.sl-gmap { aspect-ratio: 16 / 9; }
}

@media (max-width: 720px) {
	.v3-sobre-hero { padding: 48px 0 40px; }
	.v3-sobre-hero-lede { font-size: 17px; }
	.v3-sobre-hero-visual { max-height: 300px; }

	.v3-sobre-hist-texto { font-size: 16px; }

	.v3-sobre-id-dados { grid-template-columns: minmax(0, 1fr); }
	.v3-sobre-id-item:not(.v3-sobre-id-item--largo):nth-child(odd) { border-right: 0; }
	.v3-sobre-id-topo,
	.v3-sobre-id-item,
	.v3-sobre-id-acoes { padding-inline: 20px; }
	.v3-sobre-id-acoes .v3-btn { width: 100%; }

	.v3-sobre-acao .v3-btn { width: 100%; }

	/* Mapa mais alto que largo no celular: 21/9 numa tela de 360px vira uma
	   faixa de 150px de altura, onde nao cabe nem o pino nem o fallback. */
	.v3-sobre-mapa.sl-gmap { aspect-ratio: 4 / 3; max-height: 340px; }
}

@media (prefers-reduced-motion: reduce) {
	.v3-sobre-mapa .sl-gmap-fallback { transition: none; }
}

/* ==========================================================================
   16. Contato (/contato/)
   Hero, contatos diretos do Customizer, formulario com o escritorio ao lado,
   atalhos e o FAQ (que vem do template-part e traz a ancora #faq).
   ========================================================================== */

/* ---- hero ---- */

.v3-ct-hero {
	padding: 72px 0;
	border-bottom: 1px solid var(--v3-line);
}

.v3-ct-hero-copy { max-width: 760px; }

.v3-ct-hero-titulo {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}

.v3-ct-hero-lede {
	max-width: 620px;
	margin: 22px 0 0;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-ct-hero-ctas {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 30px;
}

/* Status de atendimento. Fica DEPOIS dos botoes de proposito: em cima do h1
   ele lia como a pilula de eyebrow que saiu do site inteiro, e aqui ele e o
   que e, uma nota de rodape do cabecalho.
   O ponto verde e status real (calculado no fuso do WP), nao enfeite, entao
   pode usar --v3-ok: #16A34A sobre branco da 3,30:1 e passa no minimo de 3:1
   de elemento nao textual. Fora do horario o mesmo ponto vira --v3-ink-3, para
   quem nao distingue cor continuar recebendo o aviso pela frase. */
.v3-ct-status {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 22px 0 0;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.4;
	color: var(--v3-ink-3);
}
.v3-ct-status .v3-status-dot { flex: none; }
.v3-ct-status--fora .v3-status-dot { background: var(--v3-ink-3); }

/* ---- contatos diretos (Customizer > Time do Contato) ---- */

/* Sem avatar colorido: a versao anterior pintava cada card com a cor do
   membro (--team-c num style inline) e tres cards de cores diferentes eram
   justamente o "card colorido" que a v3 tirou do site. O que identifica a
   pessoa agora e o cargo e o nome, que e o que alguem procura. */
.v3-ct-pessoa { gap: 10px; }

.v3-ct-pessoa-area {
	margin: 0;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.3;
	color: var(--v3-ink-3);
}

.v3-ct-pessoa .v3-card-text { margin-bottom: 4px; }

/* Os canais grudam no pe do card (margin-top auto) para os tres cards
   alinharem a linha de contato mesmo com dica de tamanhos diferentes. */
.v3-ct-canais {
	display: grid;
	gap: 10px;
	margin: auto 0 0;
	padding: 16px 0 0;
	border-top: 1px solid var(--v3-line);
	list-style: none;
}

.v3-ct-canal {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	max-width: 100%;
	color: var(--v3-ink-2);
	font-size: 14px;
	line-height: 1.35;
	text-decoration: none;
	/* E-mail de dominio proprio nao quebra sozinho e estoura a coluna de 1/3
	   de tela; anywhere quebra onde der, inclusive no meio da palavra. */
	overflow-wrap: anywhere;
}
.v3-ct-canal:hover {
	color: var(--v3-ink);
	text-decoration: underline;
	text-underline-offset: 3px;
}
.v3-ct-canal svg {
	flex: none;
	color: var(--v3-ink-3);
	transition: color .15s ease;
}
.v3-ct-canal:hover svg { color: var(--v3-ink-2); }

/* Telefone e e-mail sao dado, e dado vai em mono, como o resto do site. */
.v3-ct-canal-dado {
	font-family: var(--v3-mono);
	font-size: 13px;
}

/* ---- formulario e escritorio ---- */

.v3-ct-grid {
	display: grid;
	grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr);
	gap: 24px;
	align-items: start;
}

.v3-ct-lado {
	display: grid;
	gap: 20px;
	min-width: 0;
}

.v3-ct-info { gap: 18px; }

.v3-ct-dados {
	display: grid;
	gap: 4px;
	margin: 0;
}
.v3-ct-dados dt {
	margin-top: 14px;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.3;
	color: var(--v3-ink-3);
}
.v3-ct-dados dt:first-child { margin-top: 0; }
.v3-ct-dados dd {
	margin: 0;
	font-size: 15px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	overflow-wrap: anywhere;
}

.v3-ct-redes {
	padding-top: 16px;
	border-top: 1px solid var(--v3-line);
}
.v3-ct-redes-rot {
	margin: 0 0 10px;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.3;
	color: var(--v3-ink-3);
}
.v3-ct-redes-lista {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}
/* 44px e alvo de toque, nao estetica: sao quatro quadrados lado a lado no
   celular e o rodape ja usa essa medida no mesmo tipo de icone. */
.v3-ct-redes-lista a {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border: 1px solid var(--v3-line);
	border-radius: 8px;
	color: var(--v3-ink-2);
	transition: border-color .15s ease, color .15s ease;
}
.v3-ct-redes-lista a:hover {
	border-color: var(--v3-line-strong);
	color: var(--v3-ink);
}

/* ---- o formulario, que e marcacao do shortcode ----
   [sl_contact_form] (inc/shortcodes.php) monta os campos, o nonce, o honeypot
   e o proprio handler do POST, e nao pode ser reescrito nesta rodada. Por isso
   as classes .sl-form* abaixo sao as unicas .sl-* desta pagina: elas nao estao
   na marcacao do template, sao o que a funcao do tema emite, e todas vivem
   dentro de .v3-ct-form para nao vazarem para os outros formularios do site. */

.v3-ct-form .sl-form {
	max-width: 100%;
	margin: 0;
	gap: 16px;
}
.v3-ct-form .sl-form-row { gap: 16px; }
.v3-ct-form .sl-form-field { gap: 6px; }

/* Rotulo em caixa de sentenca: o mono 0.7rem em CAIXA ALTA com 0.12em de
   espacamento do main-final e a etiqueta de painel que a v3 tirou. */
.v3-ct-form .sl-form label {
	font-family: var(--v3-body);
	font-size: 13px;
	font-weight: 500;
	letter-spacing: 0;
	text-transform: none;
	color: var(--v3-ink-2);
}

/* Borda do campo em --v3-ink-3 e nao no hairline de card: o campo e controle,
   precisa de 3:1, e o --v3-line-strong sobre branco da so 1,56:1. Medido:
   #6B7280 sobre #FFFFFF = 4,83:1 no claro, e #88919C sobre o cartao #171C22 =
   5,64:1 no escuro. No escuro o fundo do campo desce para --v3-page, que fica
   abaixo do cartao e deixa o campo afundado, que e o que se espera de um. */
.v3-ct-form .sl-form input,
.v3-ct-form .sl-form select,
.v3-ct-form .sl-form textarea {
	padding: 11px 14px;
	background-color: var(--v3-page);
	border: 1px solid var(--v3-ink-3);
	border-radius: 8px;
	color: var(--v3-ink);
	font-family: var(--v3-body);
	font-size: 15px;
	line-height: 1.4;
	transition: border-color .15s ease;
}
.v3-ct-form .sl-form textarea {
	min-height: 120px;
	resize: vertical;
}
.v3-ct-form .sl-form ::placeholder {
	color: var(--v3-ink-3);
	opacity: 1;
}

/* Foco: anel da marca, igual ao :focus-visible do resto do site. Nenhuma
   propriedade de background aqui de proposito: o shorthand do main-final
   apagaria a seta do <select>, que e background-image. */
.v3-ct-form .sl-form input:focus,
.v3-ct-form .sl-form select:focus,
.v3-ct-form .sl-form textarea:focus {
	outline: 2px solid var(--v3-brand);
	outline-offset: 1px;
	border-color: var(--v3-brand);
	box-shadow: none;
}

/* Seta do select redesenhada com UM cinza fixo nos dois temas: o #a0a0b0 do
   main-final da 2,20:1 sobre branco e reprova. O #6B7280 passa nos dois lados
   (4,83:1 sobre o branco do claro, 3,72:1 sobre o #171C22 do escuro), o que um
   token que troca com o tema nao conseguiria fazer dentro de um data URI. */
.v3-ct-form .sl-form select {
	padding-right: 40px;
	background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%236B7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");
	background-repeat: no-repeat;
	background-position: right 14px center;
}

/* Botao de envio com a geometria do .v3-btn. A largura de 100% e o texto vem
   do shortcode; o resto e daqui. */
.v3-ct-form .sl-form .sl-btn-primary {
	padding: 13px 20px;
	font-size: 15px;
	letter-spacing: 0;
	gap: 8px;
}

/* Aviso de envio e de erro. Dois tons medidos, e nao um fundo tingido: o verde
   #15803D sobre uma tinta de 8% do proprio verde cairia para 4,40:1 e
   reprovaria, entao a caixa fica sem preenchimento e a cor vive no texto e no
   fio. Medidos: ok #15803D sobre branco = 5,02:1 e #4ADE80 sobre o cartao
   escuro = 10,3:1; erro #B42318 sobre branco = 6,57:1 e #F97066 sobre o
   cartao escuro = 6,47:1. */
.v3-ct-form {
	--v3-ct-ok:   #15803D;
	--v3-ct-erro: #B42318;
}
:root:not([data-theme="light"]) .v3-ct-form {
	--v3-ct-ok:   #4ADE80;
	--v3-ct-erro: #F97066;
}
.v3-ct-form .sl-form-alert {
	margin: 0 0 18px;
	padding: 12px 14px;
	background: none;
	border-radius: 8px;
	font-size: 14px;
	line-height: 1.5;
}
.v3-ct-form .sl-form-alert--ok {
	border: 1px solid var(--v3-ct-ok);
	color: var(--v3-ct-ok);
}
.v3-ct-form .sl-form-alert--error {
	border: 1px solid var(--v3-ct-erro);
	color: var(--v3-ct-erro);
}
.v3-ct-form .sl-form-alert strong { font-weight: 600; }

/* ---- mapa ----
   A caixa e do template; o miolo e do main.js (initContactMap), que escreve o
   mapa do Google ou, sem chave, um cartao de fallback com classe
   .sl-gmap-fallback. As duas pecas do main-final vem com !important dentro do
   bloco [data-theme="light"], entao aqui tambem precisa de !important: sem
   ele, o mapa volta a ser um retangulo #f0f0f5 com moldura laranja tracejada,
   que e o unico laranja decorativo que sobrou desta pagina. */
.v3-ct-mapa {
	overflow: hidden;
	border: 1px solid var(--v3-line);
	border-radius: 10px;
}
.v3-ct-mapa .v3-ct-mapa-tela {
	min-height: 280px;
	background: var(--v3-page-alt) !important;
}
.v3-ct-mapa .sl-gmap-fallback {
	min-height: 280px;
	padding: 24px;
	background: var(--v3-page-alt) !important;
	border: 0 !important;
	border-radius: 0;
	color: var(--v3-ink) !important;
	transform: none;
}
.v3-ct-mapa .sl-gmap-fallback:hover {
	background: var(--v3-page-alt) !important;
	border: 0 !important;
	transform: none;
}
.v3-ct-mapa .sl-gmap-fallback svg { color: var(--v3-ink-3) !important; }
.v3-ct-mapa .sl-gmap-fallback span {
	color: var(--v3-ink) !important;
	font-family: var(--v3-body);
	font-size: 15px;
	font-weight: 600;
}
.v3-ct-mapa .sl-gmap-fallback small {
	color: var(--v3-ink-2) !important;
	font-size: 13px;
}
.v3-ct-mapa noscript a {
	display: inline-block;
	padding: 24px;
	color: var(--v3-ink);
}

/* ---- atalhos ---- */

.v3-ct-grupo { gap: 14px; }

.v3-ct-atalhos {
	margin: 0;
	padding: 0;
	list-style: none;
}
/* Fio so ENTRE as linhas: o de cima duplicaria a distancia do titulo do card
   e o de baixo desenharia uma linha solta no ar dentro do cartao. */
.v3-ct-atalhos li + li { border-top: 1px solid var(--v3-line); }

.v3-ct-atalho {
	display: flex;
	align-items: flex-start;
	gap: 12px;
	padding: 14px 0;
	color: var(--v3-ink);
	text-decoration: none;
}
.v3-ct-atalhos li:first-child .v3-ct-atalho { padding-top: 2px; }
.v3-ct-atalhos li:last-child .v3-ct-atalho { padding-bottom: 0; }

/* Icone de traco no lugar do emoji da versao anterior. Cinza --v3-ink-3
   (4,83:1 sobre branco, acima do minimo de 3:1 de icone) e nunca laranja: o
   laranja desta pagina e do botao primario e do tique da lista. */
.v3-ct-atalho-icone {
	display: inline-flex;
	flex: none;
	margin-top: 1px;
	color: var(--v3-ink-3);
	transition: color .15s ease;
}

.v3-ct-atalho-corpo {
	display: grid;
	row-gap: 3px;
	min-width: 0;
}
.v3-ct-atalho-nome {
	font-weight: 600;
	font-size: 15px;
	line-height: 1.35;
}
.v3-ct-atalho-txt {
	font-size: 14px;
	line-height: 1.45;
	color: var(--v3-ink-2);
}

/* Seta que so muda de cor no hover, igual a da lista de fabricantes: a linha
   inteira nao anda, nao levanta e nao ganha sombra. */
.v3-ct-atalho-seta {
	display: inline-flex;
	flex: none;
	margin-top: 2px;
	margin-left: auto;
	color: var(--v3-ink-3);
	transition: color .15s ease;
}
.v3-ct-atalho:hover .v3-ct-atalho-seta,
.v3-ct-atalho:hover .v3-ct-atalho-icone { color: var(--v3-ink); }
.v3-ct-atalho:hover .v3-ct-atalho-nome {
	text-decoration: underline;
	text-underline-offset: 3px;
}

/* ---- responsivo ---- */

@media (max-width: 1000px) {
	/* O formulario passa a ocupar a largura toda e o escritorio desce para
	   baixo dele: em duas colunas estreitas os campos pareados do shortcode
	   (nome e telefone na mesma linha) ficariam com 130px cada. */
	.v3-ct-grid { grid-template-columns: minmax(0, 1fr); }
	.v3-ct-hero { padding: 60px 0; }
}

@media (max-width: 720px) {
	.v3-ct-hero { padding: 48px 0 44px; }
	.v3-ct-hero-lede { margin-top: 18px; font-size: 17px; }
	.v3-ct-hero-ctas { margin-top: 24px; }
	/* A frase de status quebra em duas linhas no celular; o ponto precisa
	   ficar no alto, alinhado com a primeira linha, e nao no meio do bloco. */
	.v3-ct-status { align-items: flex-start; }
	.v3-ct-status .v3-status-dot { margin-top: 6px; }
	.v3-ct-mapa .v3-ct-mapa-tela,
	.v3-ct-mapa .sl-gmap-fallback { min-height: 220px; }
}

/* ==========================================================================
   16. Pagina /api/ (page-api.php, rodada v3.6.6)

   Bloco curto de proposito: a pagina e feita de .v3-head, .v3-grid-3,
   .v3-card, .v3-card-meta, .v3-feat-icon e .v3-btn, que ja existiam. O que
   sobra para ca e a hero (medida de leitura e ficha tecnica) e o encaixe com
   o playground antigo, que continua com a pele .sl-api-* e NAO foi tocado
   nesta rodada. Nenhuma regra daqui mira classe .sl-: quando aquele bloco for
   refeito, este continua valendo inteiro.
   ========================================================================== */

/* ---- hero ---- */

/* Mesmo molde da hero de /revendas/ e da do documento legal: texto a esquerda,
   sem grade e sem foto. Pagina de API nao tem ilustracao, tem endereco de
   documentacao e ficha tecnica. */
.v3-section.v3-api-hero { padding: 72px 0 64px; }

.v3-api-hero-copy { max-width: 760px; }

.v3-api-hero-titulo {
	margin: 0;
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	color: var(--v3-ink);
	text-wrap: balance;
}

.v3-api-hero-lede {
	margin: 22px 0 0;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-api-hero-ctas {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 28px;
}

/* ---- ficha tecnica da hero ---- */

/* Substitui as tres pilulas com bolinha verde da pele antiga. Grade de duas
   colunas, rotulo em cima e valor embaixo; o fio separa a parte de servico do
   discurso sem gastar outra secao, que e o mesmo recurso do .v3-card-meta.
   Grade e nao flex porque as quatro linhas tem largura de texto muito
   diferente e, com flex, a segunda coluna nunca alinhava com a primeira. */
.v3-api-specs {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 22px 48px;
	margin: 36px 0 0;
	padding-top: 26px;
	border-top: 1px solid var(--v3-line);
}

.v3-api-spec { min-width: 0; }

/* Rotulo em mono pequeno, como toda meta do site. A conta do contraste, porque
   o texto tem 13px e o piso e 4,5:1: --v3-ink-3 #6B7280 sobre --v3-page
   #FFFFFF da 4,83:1 no claro, e #88919C sobre #0F1215 da 5,95:1 no escuro.
   Passa nos dois temas sem cor propria, entao nao ha cor escolhida aqui. */
.v3-api-spec dt {
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.4;
	color: var(--v3-ink-3);
}

/* O margin zera tambem o recuo de 40px que o navegador poe em <dd> por
   padrao, senao o valor nascia desalinhado do proprio rotulo. */
.v3-api-spec dd {
	margin: 6px 0 0;
	font-size: 15px;
	line-height: 1.5;
	color: var(--v3-ink);
}

/* Nome de parametro que a pessoa vai copiar. Mono, com a tinta de secao
   alternada por tras e o mesmo hairline dos cartoes em volta: laranja aqui
   seria decoracao, e a regra de ouro reserva a cor da marca para o que se
   clica. O fio nao e enfeite, e o que separa a pastilha do fundo no tema
   escuro, onde --v3-page-alt #14181D fica a um passo do --v3-page #0F1215.
   Texto --v3-ink sobre --v3-page-alt: 16,8:1 no claro e 15,3:1 no escuro.
   O nowrap impede que "user_api_hash" quebre no meio e vire duas palavras
   que nao existem. */
.v3-api-specs code {
	padding: 2px 6px;
	border: 1px solid var(--v3-line);
	border-radius: 5px;
	background: var(--v3-page-alt);
	font-family: var(--v3-mono);
	font-size: 13px;
	color: var(--v3-ink);
	white-space: nowrap;
}

/* ---- rodape de endpoints do cartao ---- */

/* O .v3-card-meta ja entrega mono 13px com fio em cima. Aqui entra so a rede
   de seguranca: a linha e uma lista de caminhos e o conteudo dela muda quando
   o catalogo do playground muda, entao um caminho longo demais quebra dentro
   do cartao em vez de estourar a largura dele. */
.v3-api-card-eps { overflow-wrap: break-word; }

/* ---- encaixe com o playground ---- */

/* O cabecalho do playground e uma secao propria, porque a parte que desenha o
   playground nao e desta rodada. Sem isso os dois paddings de baixo se somam:
   88px daqui mais os 2rem que a .sl-api-section ja traz no topo. Zerado, o
   titulo fica a 32px dos filtros que ele esta apresentando.

   O seletor e duplo de proposito. O media query de 720px da secao 4 escreve
   'padding: 56px 0' no .v3-section, com a mesma especificidade desta regra;
   se este bloco um dia for movido para antes daquele, o atalho perderia a
   disputa e o vao voltaria so no celular, que e o tipo de regressao que
   ninguem ve no computador. */
.v3-section.v3-api-intro { padding-bottom: 0; }
.v3-api-intro .v3-head { margin-bottom: 0; }

@media (max-width: 720px) {
	.v3-section.v3-api-hero { padding: 52px 0 44px; }

	/* Dois botoes lado a lado no celular ficam com area de toque estreita
	   demais; empilhados e de largura cheia, cada um vira um alvo inteiro.
	   Mesmo tratamento que o .v3-features-more ja recebe na home. */
	.v3-api-hero-ctas { gap: 10px; }
	.v3-api-hero-ctas .v3-btn { width: 100%; }

	/* Ficha tecnica em coluna unica: em duas colunas de celular o valor mais
	   longo ("REST sobre HTTPS, resposta em JSON") quebrava em tres linhas e
	   desalinhava as duas fileiras uma da outra. */
	.v3-api-specs {
		grid-template-columns: minmax(0, 1fr);
		gap: 18px;
		margin-top: 30px;
		padding-top: 22px;
	}
}

/* ==========================================================================
   16. Visitantes online (page-visitantes-online.php)
   Duas metades com donos diferentes, e a segunda é a armadilha da página:

   a) o que o PHP desenha e ninguém mais toca: hero, painel ao vivo, resumo,
      estado vazio e as duas listas de ressalva. Tudo .v3-.
   b) a grade de cidades, que o assets/js/main.js REESCREVE a cada 30 s com
      marcação própria em classes .sl-vo-*. Essas classes não podem sumir da
      marcação, então o visual delas é refeito aqui, no escopo
      .v3-vo-lista .v3-vo-cities, com dois ancestrais de propósito: o
      main-final.css pinta as mesmas classes em bloco próprio e ainda tem um
      bloco [data-theme="light"] com a MESMA especificidade de dois seletores.
      Empatar e depender só da ordem dos ficheiros seria frágil.

   Movimento: ponto pulsando, batimento e cursor, os três do painel de
   monitoramento já sancionado. Reusa os @keyframes v3-uptime-pulse,
   v3-uptime-ekg e v3-uptime-blink do bloco 6 em vez de declarar iguais.
   ========================================================================== */

/* --- Hero: texto à esquerda, painel ao vivo à direita --------------------- */
.v3-vo-hero {
	padding: 72px 0 80px;
	border-bottom: 1px solid var(--v3-line);
}

.v3-vo-hero-grid {
	display: grid;
	grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
	gap: 48px;
	align-items: center;
}

.v3-vo-hero-title {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}

.v3-vo-hero-lede {
	max-width: 560px;
	margin: 22px 0 0;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-vo-hero-nota {
	max-width: 560px;
	margin: 16px 0 0;
	font-size: 15px;
	line-height: 1.6;
	color: var(--v3-ink-3);
}

/* --- Painel ao vivo ------------------------------------------------------ */
.v3-vo-panel {
	background: var(--v3-panel-bg);
	border: 1px solid var(--v3-panel-line);
	border-radius: 14px;
	padding: 18px 24px 12px;
	color: var(--v3-panel-ink);
}

.v3-vo-panel-top {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 6px 20px;
	padding-bottom: 14px;
	border-bottom: 1px solid var(--v3-panel-line);
}

.v3-vo-live {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	font-family: var(--v3-mono);
	font-size: 11px;
	line-height: 1.2;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--v3-panel-ink-dim);
}
/* Verde só aqui, e porque é status de verdade: existe gente no site agora.
   O ponto tem 7px e é gráfico, então vale a régua de 3:1 (mede 3,05:1 sobre
   o painel claro e 5,52:1 sobre o escuro). */
.v3-vo-live .v3-status-dot {
	flex: 0 0 auto;
	animation: v3-uptime-pulse 2.4s ease-in-out infinite;
}

.v3-vo-janela {
	font-family: var(--v3-mono);
	font-size: 11.5px;
	line-height: 1.2;
	color: var(--v3-panel-ink-dim);
}

/* O número grande em mono: é um mostrador, não um título. Laranja porque é o
   caso 4 da direção (número de estatística grande). Contraste medido do
   --v3-brand #F16000 sobre --v3-panel-bg: 3,03:1 no claro e 5,56:1 no escuro;
   passa porque texto desta altura é texto grande, onde a régua é 3:1. */
.v3-vo-num-linha {
	margin: 18px 0 0;
}

.v3-vo-num {
	display: block;
	font-family: var(--v3-mono);
	font-weight: 500;
	font-size: clamp(3rem, 6.4vw, 4.4rem);
	line-height: 1;
	letter-spacing: -.04em;
	font-variant-numeric: tabular-nums;
	color: var(--v3-brand);
}

.v3-vo-num-label {
	display: block;
	margin-top: 10px;
	font-size: 15px;
	line-height: 1.4;
	color: var(--v3-panel-ink);
}

/* A ressalva mora colada no número de propósito: quem lê "27 pessoas" precisa
   ver aqui, e não três seções abaixo, que a conta é por navegador.
   --v3-panel-ink-dim mede 4,83:1 sobre o painel claro e 6,13:1 sobre o
   escuro, então passa a régua de texto pequeno. */
.v3-vo-num-nota {
	margin: 4px 0 0;
	font-family: var(--v3-mono);
	font-size: 11.5px;
	line-height: 1.4;
	color: var(--v3-panel-ink-dim);
}

.v3-vo-aqui {
	display: flex;
	align-items: baseline;
	gap: 10px;
	margin: 14px 0 0;
	padding-top: 14px;
	border-top: 1px solid var(--v3-panel-line);
}

.v3-vo-aqui-n {
	font-family: var(--v3-mono);
	font-weight: 500;
	font-size: 20px;
	line-height: 1;
	font-variant-numeric: tabular-nums;
	color: var(--v3-panel-ink);
}

.v3-vo-aqui-l {
	font-size: 14px;
	line-height: 1.4;
	color: var(--v3-panel-ink-dim);
}

.v3-vo-panel-tail {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 8px 18px;
	margin-top: 14px;
	padding-top: 10px;
	border-top: 1px solid var(--v3-panel-line);
}

.v3-vo-ekg {
	flex: 1 1 160px;
	min-width: 0;
}
.v3-vo-ekg-svg {
	display: block;
	width: 100%;
	height: 16px;
	opacity: .45;
}
.v3-vo-ekg-line {
	stroke: var(--v3-ok);
	stroke-width: 1.5;
	stroke-linecap: round;
	vector-effect: non-scaling-stroke;
	stroke-dasharray: 16 84;
	animation: v3-uptime-ekg 7s linear infinite;
}

.v3-vo-fonte {
	margin: 0;
	flex: none;
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-family: var(--v3-mono);
	font-size: 11.5px;
	color: var(--v3-panel-ink-dim);
}
/* Bloquinho decorativo, não texto: por isso pode ficar no tom mais fraco. */
.v3-vo-cursor {
	width: 7px;
	height: 12px;
	background: var(--v3-panel-ink-mut);
	animation: v3-uptime-blink 1.1s steps(2, start) infinite;
}

/* --- Resumo da lista ----------------------------------------------------- */
/* O main.js reescreve este texto ("N localidades · X pessoas") a cada 30 s, e
   o ponto do meio vem de lá, não daqui. Sobre a seção cinza o --v3-ink-3 cai
   para 4,44:1 e reprova por pouco, então entra o --v3-ink-3-strong (4,91:1). */
.v3-vo-resumo {
	margin: 0 0 20px;
	padding-bottom: 12px;
	border-bottom: 1px solid var(--v3-line);
	font-family: var(--v3-mono);
	font-size: 12.5px;
	line-height: 1.4;
	color: var(--v3-ink-3-strong);
}

/* --- Grade de cidades (marcação do main.js) ------------------------------ */
.v3-vo-lista .v3-vo-cities .sl-vo-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
	gap: 12px;
}

/* O cartão é um botão: abre o modal de clima do footer.php. Fica com a mesma
   pele do .v3-card e o hover só engrossa a borda, sem levantar nem brilhar.
   Aqui morrem, de uma vez, o gradiente por faixa do dia, a sombra do tema
   claro e a animação de entrada do main-final: com a grade sendo reescrita a
   cada 30 s, aquela animação reencenava a lista inteira meio minuto sim,
   meio minuto não, que é tique visual, não sinal de vida. */
.v3-vo-lista .v3-vo-cities .sl-vo-city {
	display: flex;
	flex-direction: column;
	gap: 0;
	padding: 16px 18px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
	box-shadow: none;
	transform: none;
	animation: none;
	transition: border-color .15s ease;
	cursor: pointer;
}
.v3-vo-lista .v3-vo-cities .sl-vo-city:hover {
	background: var(--v3-card);
	border-color: var(--v3-line-strong);
	box-shadow: none;
	transform: none;
}
.v3-vo-lista .v3-vo-cities .sl-vo-city:focus-visible {
	outline: 2px solid var(--v3-brand);
	outline-offset: 2px;
	border-color: var(--v3-line-strong);
}

/* Cartão dos sem cidade: não é botão e a borda tracejada diz isso antes de
   qualquer texto. O main.js recusa abrir o modal dele. */
.v3-vo-lista .v3-vo-cities .sl-vo-city--unknown {
	background: var(--v3-card);
	border-style: dashed;
	opacity: 1;
	cursor: default;
}
.v3-vo-lista .v3-vo-cities .sl-vo-city--unknown:hover {
	border-color: var(--v3-line);
}

.v3-vo-lista .v3-vo-cities .sl-vo-city-top {
	display: grid;
	grid-template-columns: auto minmax(0, 1fr) auto;
	align-items: center;
	gap: 12px;
}

.v3-vo-lista .v3-vo-cities .sl-vo-city-pin {
	width: 34px;
	height: 34px;
	border-radius: 8px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	color: var(--v3-ink-3);
	display: grid;
	place-items: center;
	flex-shrink: 0;
	overflow: hidden;
}
/* Com bandeira a moldura é só o fio: a cor do país é a informação, e um fundo
   cinza atrás dela suja as bandeiras claras. */
.v3-vo-lista .v3-vo-cities .sl-vo-city-pin--flag {
	background: var(--v3-card);
	padding: 3px;
}
.v3-vo-lista .v3-vo-cities .sl-vo-flag-pin {
	width: 100%;
	height: 100%;
	display: block;
	object-fit: cover;
	border-radius: 4px;
	box-shadow: none;
}

.v3-vo-lista .v3-vo-cities .sl-vo-city-body {
	display: flex;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}
.v3-vo-lista .v3-vo-cities .sl-vo-city-body strong {
	font-family: var(--v3-body);
	font-size: 15px;
	font-weight: 600;
	line-height: 1.3;
	color: var(--v3-ink);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.v3-vo-lista .v3-vo-cities .sl-vo-city-body span {
	font-family: var(--v3-mono);
	font-size: 11.5px;
	line-height: 1.4;
	letter-spacing: .02em;
	color: var(--v3-ink-3);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* Número em tinta forte, não na cor da marca: o cartão inteiro já é clicável e
   a regra de ouro reserva o laranja para o que se clica, não para o que se lê
   dentro do que se clica. O ponto verde pulsando que o main-final punha antes
   de CADA contagem vira vinte pontos piscando fora de compasso; o status ao
   vivo é dado uma vez, lá no painel. */
.v3-vo-lista .v3-vo-cities .sl-vo-city-count {
	font-family: var(--v3-mono);
	font-size: 20px;
	font-weight: 500;
	line-height: 1;
	letter-spacing: -.02em;
	color: var(--v3-ink);
	font-variant-numeric: tabular-nums;
	min-width: 1.4em;
	text-align: right;
}
.v3-vo-lista .v3-vo-cities .sl-vo-city:not(.sl-vo-city--unknown) .sl-vo-city-count {
	display: block;
}
.v3-vo-lista .v3-vo-cities .sl-vo-city:not(.sl-vo-city--unknown) .sl-vo-city-count::before {
	content: none;
}
.v3-vo-lista .v3-vo-cities .sl-vo-city--unknown .sl-vo-city-count {
	color: var(--v3-ink-3);
}
.v3-vo-lista .v3-vo-cities .sl-vo-city--unknown .sl-vo-city-pin {
	color: var(--v3-ink-3);
}

/* Rodapé do cartão: relógio da cidade e temperatura. O main.js reescreve a
   hora a cada 60 s e troca o sol pela lua sozinho. */
.v3-vo-lista .v3-vo-cities .sl-vo-city-meta {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	margin-top: 12px;
	padding-top: 10px;
	border-top: 1px solid var(--v3-line);
	font-family: var(--v3-mono);
	font-size: 11.5px;
	line-height: 1.4;
	letter-spacing: .02em;
	color: var(--v3-ink-3);
}
.v3-vo-lista .v3-vo-cities .sl-vo-meta-time {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	color: var(--v3-ink-3);
	font-variant-numeric: tabular-nums;
}
/* Sol e lua no mesmo cinza: a hora ao lado já diz qual dos dois é, e pintar a
   lua de azul reabriria a cor decorativa por outra porta. */
.v3-vo-lista .v3-vo-cities .sl-vo-meta-icon,
.v3-vo-lista .v3-vo-cities .sl-vo-meta-icon[data-state="night"] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 14px;
	height: 14px;
	color: var(--v3-ink-3);
}
.v3-vo-lista .v3-vo-cities .sl-vo-meta-temp {
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
	color: var(--v3-ink-3);
	font-variant-numeric: tabular-nums;
}

/* Cidade sem fuso vem com o rodapé [hidden], e cidade sem temperatura vem com
   o valor [hidden]. Sem estas duas linhas o display de cima venceria o
   [hidden] por especificidade e o cartão abriria uma faixa vazia embaixo. */
.v3-vo-lista .v3-vo-cities .sl-vo-city-meta[hidden],
.v3-vo-lista .v3-vo-cities .sl-vo-meta-temp[hidden] {
	display: none;
}

/* --- Estado vazio -------------------------------------------------------- */
.v3-vo-vazio {
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	padding: 48px 24px;
	border: 1px dashed var(--v3-line-strong);
	border-radius: 10px;
	background: var(--v3-card);
}
.v3-vo-vazio-icone {
	display: inline-flex;
	color: var(--v3-ink-3);
}
.v3-vo-vazio-title {
	margin: 14px 0 0;
	font-size: 1.1rem;
	line-height: 1.3;
}
.v3-vo-vazio-text {
	max-width: 520px;
	margin: 10px 0 0;
	font-size: 15px;
	line-height: 1.6;
	color: var(--v3-ink-2);
}

/* --- Listas da seção "O que este número quer dizer" ---------------------- */
/* Marcador em traço, não o tique laranja do .v3-card-list: metade dos itens é
   ressalva ("conta navegadores, não pessoas") e um tique lê como promessa
   cumprida. O traço é decoração pura, como qualquer marcador de lista, então
   não entra na régua de contraste: quem carrega o sentido é o texto. */
.v3-vo-notas {
	list-style: none;
	margin: 4px 0 0;
	padding: 0;
	display: grid;
	gap: 10px;
}
.v3-vo-notas li {
	position: relative;
	padding-left: 20px;
	font-size: 15px;
	line-height: 1.55;
	color: var(--v3-ink-2);
}
.v3-vo-notas li::before {
	content: "";
	position: absolute;
	left: 0;
	top: .72em;
	width: 10px;
	height: 0;
	border-top: 2px solid var(--v3-line-strong);
}

@media (max-width: 1000px) {
	.v3-vo-hero {
		padding: 56px 0 64px;
	}
	.v3-vo-hero-grid {
		grid-template-columns: minmax(0, 1fr);
		gap: 32px;
	}
	.v3-vo-hero-lede,
	.v3-vo-hero-nota {
		max-width: 640px;
	}
}

@media (max-width: 720px) {
	.v3-vo-panel {
		padding: 16px 18px 10px;
	}
	.v3-vo-num {
		font-size: clamp(2.6rem, 14vw, 3.4rem);
	}
	/* Abaixo de 720 o minmax de 250px ainda caberia em duas colunas em alguns
	   celulares largos, e o nome da cidade cortaria no meio. Uma coluna. */
	.v3-vo-lista .v3-vo-cities .sl-vo-grid {
		grid-template-columns: minmax(0, 1fr);
	}
	.v3-vo-vazio {
		padding: 36px 18px;
	}
}

@media (prefers-reduced-motion: reduce) {
	.v3-vo-live .v3-status-dot { animation: none; }
	.v3-vo-ekg-line { animation: none; stroke-dasharray: none; }
	.v3-vo-cursor { animation: none; }
	.v3-vo-lista .v3-vo-cities .sl-vo-city { transition: none; }
}

/* ==========================================================================
   Area do Cliente (page-area-cliente.php, rodada v3.6.6)

   A pagina responde a uma pergunta so: qual servidor e o meu. Por isso os tres
   cartoes de servidor entram na MESMA secao do h1, sem cabecalho de secao no
   meio, e cada cartao e o link inteiro, do numero ao botao.

   Duas classes .sl-* sobrevivem aqui de proposito, porque sao gancho do
   initLiveStatus() do assets/js/main.js e nao estilo:
     .sl-server-status        o JS troca o texto do ultimo <span> filho quando
                              o monitor acusa queda
     .sl-server-uptime-value  o JS escreve o uptime real a cada 90 segundos
   O main-final.css pinta as duas (pilula teal em caixa alta e fonte display em
   teal). O reset delas vive aqui, ESCOPADO no cartao, para nao encostar no
   painel de disponibilidade da home, que usa os mesmos dois ganchos com outro
   desenho.
   ========================================================================== */

/* Cor do ponto de status quando o monitor acusa queda. Quem grava o
   data-status no cartao e o JS, entao a cor sai do dado e nunca da mao.
   Medida sobre --v3-card nos dois temas (minimo 3:1 para ponto e icone):
     #D92D20 sobre #FFFFFF = 4,83:1   #F87171 sobre #171C22 = 6,20:1
     #C2410C sobre #FFFFFF = 5,18:1   #FBBF24 sobre #171C22 = 10,26:1 */
:root {
	--v3-ac-caiu:    #D92D20;
	--v3-ac-atencao: #C2410C;
}
:root:not([data-theme="light"]) {
	--v3-ac-caiu:    #F87171;
	--v3-ac-atencao: #FBBF24;
}

/* ---- entrada: hero curto e os tres servidores na mesma secao ---- */

/* 72px no topo, como em .v3-planos-hero e .v3-rev-hero, e nao os 88px da
   .v3-section: h1 logo abaixo do cabecalho pede menos respiro em cima, senao a
   primeira coisa que a pessoa com pressa ve e espaco vazio. */
.v3-ac-entrada { padding-top: 72px; }

.v3-ac-hero { max-width: 720px; }

.v3-ac-hero-titulo {
	font-size: clamp(2.2rem, 4.4vw + .6rem, 3.6rem);
	line-height: 1.02;
	letter-spacing: -.025em;
	text-wrap: balance;
}

.v3-ac-hero-lede {
	margin: 22px 0 0;
	font-size: 18px;
	line-height: 1.55;
	color: var(--v3-ink-2);
	text-wrap: pretty;
}

.v3-ac-hero .v3-card-actions { margin-top: 26px; }

.v3-ac-servidores {
	margin: 44px 0 0;
	padding: 0;
	list-style: none;
}

/* O <li> e a celula da grade; quem tem a moldura e o <a> de dentro, que
   precisa esticar ate o fim da celula para os tres botoes pararem na mesma
   linha mesmo com textos de alturas diferentes. */
.v3-ac-servidores > li { display: flex; }
.v3-ac-srv { width: 100%; gap: 10px; }

.v3-ac-srv-topo {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
}

/* "Servidor 01" e como o suporte chama a maquina ao telefone. Mono para ler
   como identificador e nao como titulo. O --v3-ink-3 (#6B7280) sobre o cartao
   branco da 4,83:1, acima do 4,5:1 que estes 12,5px exigem. */
.v3-ac-srv-num {
	font-family: var(--v3-mono);
	font-size: 12.5px;
	font-weight: 500;
	letter-spacing: .02em;
	color: var(--v3-ink-3);
}

/* Reset da .sl-server-status, que no main-final.css e uma pilula teal em caixa
   alta. O !important nao e preguica: o [data-theme="light"] .sl-server-status
   de la tem a MESMA especificidade que este seletor e so perderia por ordem de
   arquivo, o que e apoio fragil demais para um gancho que nao pode sumir. */
.v3-ac-srv-estado {
	display: inline-flex !important;
	align-items: center;
	gap: 7px;
	width: auto !important;
	padding: 0 !important;
	background: none !important;
	border: 0 !important;
	border-radius: 0 !important;
	font-family: var(--v3-body) !important;
	font-size: 13px !important;
	font-weight: 500;
	line-height: 1.3;
	letter-spacing: 0 !important;
	text-transform: none !important;
	color: var(--v3-ink-2) !important;
	transition: none !important;
}

/* O JS grava data-status no proprio <a> assim que o monitor responde. */
.v3-ac-srv[data-status="down"] .v3-status-dot        { background: var(--v3-ac-caiu); }
.v3-ac-srv[data-status="degraded"] .v3-status-dot,
.v3-ac-srv[data-status="maintenance"] .v3-status-dot { background: var(--v3-ac-atencao); }

/* O titulo do cartao e um <h2>, porque ele vem logo depois do <h1> e nao ha
   cabecalho de secao no meio para ocupar esse nivel. Sem esta linha ele herda
   o peso e a largura de h2 e sai mais preto e mais largo que todo outro titulo
   de cartao do site; aqui ele volta ao desenho de h3, que e o que a
   .v3-card-title pressupoe. */
.v3-ac-srv-dominio { font-variation-settings: "wdth" 104, "wght" 650; }

.v3-ac-srv-meta { display: grid; gap: 7px; }

/* O endereco fica em --v3-ink-2, nao no --v3-ink-3 do resto do rodape do
   cartao: e ele que a nota de seguranca manda conferir antes de digitar a
   senha, entao e a linha mais legivel das tres (7,56:1 sobre o cartao branco).
   O break-all e ultimo recurso, para um host mais comprido que o de hoje nao
   vazar a moldura; quem evita a quebra no caso normal e o corte de coluna em
   1100px logo abaixo. */
.v3-ac-srv-host {
	color: var(--v3-ink-2);
	word-break: break-all;
}

.v3-ac-srv-linha {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	justify-content: space-between;
	gap: 2px 14px;
}

.v3-ac-srv-up {
	display: inline-flex;
	align-items: baseline;
	gap: 5px;
}

/* Mesmo reset do painel da home: o main-final pinta este span em fonte display
   teal, e aqui ele e so mais um numero da linha de rodape do cartao. */
.v3-ac-srv-up .sl-server-uptime-value {
	font-family: var(--v3-mono) !important;
	font-size: 13px !important;
	font-weight: 500 !important;
	letter-spacing: 0 !important;
	line-height: inherit !important;
	color: var(--v3-ink) !important;
	background: none !important;
	-webkit-text-fill-color: currentColor !important;
	transition: none !important;
}

/* O cartao inteiro e o link, entao este "botao" e um <span>: ele existe para
   dizer onde o clique leva e acende junto com a borda quando o ponteiro entra
   no cartao. Nao pode virar <button> nem <a>, que sao proibidos dentro de um
   <a>. O :hover no pai e o que faz o falso botao reagir. */
.v3-ac-srv .v3-btn {
	width: 100%;
	margin-top: 4px;
}
.v3-ac-srv:hover .v3-btn--secondary,
.v3-ac-srv:focus-visible .v3-btn--secondary {
	background: var(--v3-page-alt);
	border-color: var(--v3-ink-3);
}

/* Nota de seguranca. A peca pede que a pessoa LEIA um endereco, entao o
   endereco e o unico destaque: fundo cinza, hairline, sem icone e sem cor. Ela
   avisa, nao alarma, e alarme colorido aqui competiria com os tres cartoes. */
.v3-ac-aviso {
	max-width: 860px;
	margin: 28px 0 0;
	padding: 16px 18px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 10px;
	font-size: 14.5px;
	line-height: 1.6;
	color: var(--v3-ink-2);
}
.v3-ac-aviso strong { color: var(--v3-ink); font-weight: 600; }

/* O endereco ocupa uma LINHA propria, em bloco. Dentro da frase ele quebrava
   no meio ("https://ser" numa linha, "vidor0X..." na outra) e a caixinha virava
   duas, justo no texto que pede para a pessoa ler o endereco caractere por
   caractere. Em bloco ele nunca quebra numa tela de 320px e ainda ganha a
   pausa visual de um trecho citado. */
.v3-ac-aviso code {
	display: block;
	width: fit-content;
	max-width: 100%;
	margin: 10px 0;
	padding: 7px 10px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 6px;
	font-family: var(--v3-mono);
	font-size: .92em;
	line-height: 1.4;
	color: var(--v3-ink);
	overflow-wrap: anywhere;
}

/* ---- ferramentas e canais de suporte: cartao-atalho ---- */

/* "Abrir" com a seta de link que sai do site, grudado no pe do cartao para os
   atalhos terminarem todos na mesma altura. A cor so aparece no hover, e e o
   --v3-brand-text (4,8:1 sobre o cartao), nunca o --v3-brand cheio, que em
   texto de 14px da 3,1:1 e reprova. */
.v3-ac-fer-acao {
	margin-top: auto;
	padding-top: 16px;
	display: inline-flex;
	align-items: center;
	gap: 7px;
	font-size: 14px;
	font-weight: 600;
	color: var(--v3-ink);
	transition: color .15s ease;
}
.v3-ac-fer:hover .v3-ac-fer-acao { color: var(--v3-brand-text); }
.v3-ac-fer-acao svg { flex: none; }

/* O numero e o e-mail do suporte sao para copiar ou ditar, entao vao em mono.
   Quebra livre porque e-mail de dominio comprido nao pode vazar o cartao. */
.v3-ac-canal-valor {
	margin-top: auto;
	padding-top: 16px;
	font-family: var(--v3-mono);
	font-size: 14px;
	font-weight: 500;
	color: var(--v3-ink);
	word-break: break-word;
}

/* Esta grade troca de tres para duas colunas em 1100px, e nao nos 1000px da
   .v3-grid-3, por causa de uma medida: entre 1000 e 1100px a coluna util do
   cartao fica em 241px e "servidor01.smartlocaliza.com.br" em Azeret Mono 13px
   ocupa 262px, entao o endereco quebrava entre "com." e "br". Quebrar ali e
   pior aqui do que em qualquer outro cartao do site, porque a nota logo abaixo
   pede que a pessoa confira esse endereco caractere por caractere antes de
   digitar a senha. Em 1100px a coluna vai para 276px e o endereco cabe inteiro.
   Com tres servidores em duas colunas o ultimo ficaria sozinho em meia coluna,
   com um buraco do lado; esticado, ele continua sendo um cartao inteiro. */
@media (max-width: 1100px) {
	.v3-ac-servidores { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.v3-ac-servidores > li:last-child:nth-child(odd) { grid-column: 1 / -1; }
}

@media (max-width: 720px) {
	/* Uma coluna. Repetido aqui de proposito: a regra de 1100px acima tem a
	   mesma especificidade que a da .v3-grid-3 e continua valendo neste
	   tamanho, entao sem esta linha o celular ficaria com duas colunas. */
	.v3-ac-servidores {
		grid-template-columns: minmax(0, 1fr);
		margin-top: 32px;
	}
	.v3-ac-servidores > li:last-child:nth-child(odd) { grid-column: auto; }

	/* Botao da largura toda no celular: esta pagina recebe quem esta com pressa
	   e com uma mao so no aparelho. */
	.v3-ac-hero .v3-card-actions { display: grid; gap: 10px; }
	.v3-ac-hero .v3-btn { width: 100%; }

	/* Regiao e uptime param de disputar a mesma linha quando ela encolhe. */
	.v3-ac-srv-linha { justify-content: flex-start; gap: 2px 10px; }
}

/* ============================================================
   v3.6.7: uma medida so na /status/
   ============================================================
   O cartao "De onde vem o numero" saiu a pedido, e o irmao dele ficou
   sozinho. Manter a .v3-grid-2 deixaria metade da linha vazia no desktop,
   e soltar o cartao na largura toda do wrap (1152px) esticaria o paragrafo
   muito alem da medida de leitura confortavel. */
.v3-st-medida-unica {
	max-width: 720px;
}

/* ============================================================
   v3.6.7: "ver os outros N" nas filas de pastilhas do catalogo
   ============================================================
   O catalogo da plataforma tem marca com mais de duzentos modelos. Impressos
   de uma vez, o cartao de UMA marca passa de tres telas de celular e empurra
   o resto do catalogo para fora da vista. O corte fica no PHP; aqui so o
   visual do <details> nativo que guarda o resto.

   Elemento clicavel, entao cor de marca: e exatamente o caso que a direcao
   reserva para a cor. */
.v3-rastr-mais {
	margin-top: 7px;
}

.v3-rastr-mais-btn {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	width: fit-content;
	padding: 2px 0;
	font-size: 13px;
	line-height: 1.45;
	font-weight: 500;
	color: var(--v3-brand-text);
	cursor: pointer;
	/* list-style none nos dois: o Firefox desenha o triangulo pelo
	   ::marker do summary e o Safari antigo pelo ::-webkit-details-marker.
	   A seta abaixo e desenhada aqui para girar junto com o estado. */
	list-style: none;
}
.v3-rastr-mais-btn::-webkit-details-marker { display: none; }
.v3-rastr-mais-btn::marker { content: ""; }

.v3-rastr-mais-btn::after {
	content: "";
	width: 6px;
	height: 6px;
	border: solid currentColor;
	border-width: 0 1.5px 1.5px 0;
	transform: rotate(45deg) translate(-1px, -1px);
	transition: transform .18s ease;
}
.v3-rastr-mais[open] > .v3-rastr-mais-btn::after {
	transform: rotate(-135deg) translate(-1px, -1px);
}

.v3-rastr-mais-btn:hover { color: var(--v3-brand); }

.v3-rastr-mais-btn:focus-visible {
	outline: 2px solid var(--v3-brand);
	outline-offset: 3px;
	border-radius: 4px;
}

.v3-rastr-mais > .v3-rastr-pastilhas {
	margin-top: 7px;
}

@media (prefers-reduced-motion: reduce) {
	.v3-rastr-mais-btn::after { transition: none; }
}

/* ==========================================================================
   17. Playground da API (miolo da /api/, rodada v3.6.7)

   Par do template-parts/section-api-playground.php. Colar logo DEPOIS do bloco
   "16. Pagina /api/", que desenha a casca da mesma tela: hero, contexto e o
   cabecalho que apresenta este playground.

   Duas coisas explicam quase todo seletor daqui:

   1. QUATRO CLASSES .sl-* APARECEM NO HTML SEM ESTAR NO PHP, porque o proprio
      main.js as escreve: .sl-api-filter (com .sl-api-filter-count), .sl-api-chip
      (com .sl-api-chip-method) e .sl-api-field. Elas nao podem mudar de nome, e
      trazem junto a pele antiga do main-final.css: pilula de raio 999px, fundo
      teal, caixa alta, sombra, campo de 12px de raio. Cada propriedade dessas e
      desfeita na mao aqui. Quando uma regra abaixo parecer obvia demais
      ("background: none", "box-shadow: none", "text-transform: none"), ela esta
      desfazendo alguma coisa, nao decorando. Tudo escopado dentro de .v3-apipg:
      fora desta pagina nada muda.

   2. VARIOS SELETORES SAO DOBRADOS DE PROPOSITO. O main-final.css tem regras de
      tema claro que miram este mesmo HTML com mais de uma classe:
      [data-theme="light"] code e pre (0,1,1), [data-theme="light"]
      input[type="text"] e textarea (0,2,1). Uma classe so (0,1,0) perderia para
      todas, e o bloco escuro de codigo viraria claro no tema claro, que e o
      oposto do que se espera numa pagina de API. Nenhuma daquelas regras leva
      !important, entao subir a especificidade basta e o arquivo continua sem
      um !important novo.

   CONTRASTE. Nada de cor inventada: os tons vem dos tokens ja medidos nos
   blocos 10 e 14. Sobre o cartao, --v3-cmd-perigo da 6,57:1 no claro e 6,75:1
   no escuro e --v3-cmd-ok da 5,02:1 e 7,52:1. Sobre o bloco escuro do codigo,
   que e o mesmo nos dois temas, --v3-cmd-info-cmd da 8,05:1, --v3-demo-ok
   7,82:1, --v3-cmd-perigo-cmd 7,81:1, --v3-demo-warn 8,30:1, --v3-demo-ink-2
   6,79:1 e --v3-demo-ink-3 4,77:1. O --v3-ink-3 sobre o cartao branco da
   4,83:1 e o --v3-ink-3-strong 5,31:1, que e o usado em controle.
   ========================================================================== */

/* A secao comeca logo abaixo do cabecalho desenhado pela page-api.php, e
   aquela secao ja zera o proprio padding de baixo (.v3-section.v3-api-intro).
   Os 32px repetem o respiro que a pele antiga dava com padding-top: 2rem.
   O seletor e duplo porque a classe .sl-api-section continua nesta <section>
   (e o portao do main.js) e o main-final.css ainda a pinta com
   padding: 2rem 0 5rem. */
.v3-section.v3-apipg { padding: 32px 0 88px; }

/* ---- filtros por categoria ---- */

/* Fila de botoes de texto com fio de base, igual as abas da
   /conhecer-plataforma/. O fio e inset, e nao border, para nao ser cortado
   quando a fila quebra em duas linhas. */
.v3-apipg-filtros {
	display: flex;
	flex-wrap: wrap;
	gap: 0 22px;
	margin: 0 0 20px;
	box-shadow: inset 0 -1px 0 var(--v3-line);
}

/* Desfaz a pilula do .sl-api-filter (main-final L6990: raio 999px, borda,
   fundo, e teal cheio no ativo). Vira o mesmo botao de texto com sublinhado
   laranja que o site ja usa para "item ativo". */
.v3-apipg-filtros .sl-api-filter {
	flex: none;
	display: inline-flex;
	align-items: baseline;
	gap: 6px;
	padding: 10px 2px 13px;
	background: none;
	border: 0;
	border-radius: 0;
	box-shadow: none;
	font-family: var(--v3-body);
	font-size: 14.5px;
	font-weight: 600;
	letter-spacing: 0;
	line-height: 1.2;
	text-transform: none;
	/* Aba inativa e controle, nao legenda: o --v3-ink-3 reprovaria por pouco
	   sobre o cinza da secao, e este e o tom que o contrato ja reserva. */
	color: var(--v3-ink-3-strong);
	cursor: pointer;
	transition: color .15s ease, box-shadow .15s ease;
}
.v3-apipg-filtros .sl-api-filter:hover:not(.is-active) {
	background: none;
	color: var(--v3-ink-2);
}
.v3-apipg-filtros .sl-api-filter.is-active {
	background: none;
	color: var(--v3-ink);
	box-shadow: inset 0 -2px 0 var(--v3-brand);
}
.v3-apipg-filtros .sl-api-filter:focus-visible {
	outline: 2px solid var(--v3-brand);
	outline-offset: 2px;
}

/* A contagem e dado, nao etiqueta. Sai da pastilha cinza e perde o opacity:
   .75 do main-final, que derrubava o contraste junto com o peso visual. */
.v3-apipg-filtros .sl-api-filter-count {
	padding: 0;
	background: none;
	border-radius: 0;
	font-family: var(--v3-mono);
	font-size: 12px;
	font-weight: 400;
	opacity: 1;
	color: var(--v3-ink-3);
}
.v3-apipg-filtros .sl-api-filter.is-active .sl-api-filter-count {
	background: none;
	opacity: 1;
	color: var(--v3-ink-3);
}

/* ---- fila de endpoints ---- */

.v3-apipg-picker { margin: 0 0 24px; }

/* Rolagem horizontal: com o filtro "Todos" sao trinta e um chips, e empilhar
   isso em cinco fileiras empurraria o editor para fora da tela.
   O aviso de "tem mais para o lado" e uma MASCARA, nao um degrade pintado:
   nao acrescenta cor nenhuma e funciona igual nos dois temas. O ::after do
   main-final fazia isso com um degrade ate um preto fixo (rgba(10,10,15,.95))
   e no tema claro aparecia como uma sujeira cinza na borda.
   O #000 das duas linhas abaixo e o unico valor cru deste bloco inteiro, e
   nao e cor: numa mascara o que conta e so o canal alfa, e #000 ali quer
   dizer "opaco". Nao existe token para isso e nao deveria existir. */
.v3-apipg-picker-rolo {
	display: flex;
	gap: 8px;
	overflow-x: auto;
	padding: 2px 0 10px;
	scrollbar-width: none;
	-webkit-overflow-scrolling: touch;
	-webkit-mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 36px), transparent 100%);
	        mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 36px), transparent 100%);
}
.v3-apipg-picker-rolo::-webkit-scrollbar { display: none; }

/* Desfaz o chip do main-final (L7049: fundo branco translucido, borda clara
   fixa, teal no ativo). Continua sendo uma caixa, e nao um botao de texto
   como os filtros, porque o rotulo tem duas partes (metodo e caminho) e um
   sublinhado sozinho nao separaria um chip do vizinho numa fila rolavel. O
   que marca o escolhido e o mesmo sublinhado laranja, desenhado por dentro. */
.v3-apipg-picker-rolo .sl-api-chip {
	flex: none;
	display: inline-flex;
	align-items: baseline;
	gap: 8px;
	padding: 9px 14px 10px;
	background: var(--v3-card);
	border: 1px solid var(--v3-line);
	border-radius: 8px;
	box-shadow: none;
	font-family: var(--v3-mono);
	font-size: 13px;
	font-weight: 400;
	letter-spacing: 0;
	line-height: 1.3;
	text-transform: none;
	color: var(--v3-ink-2);
	white-space: nowrap;
	cursor: pointer;
	transition: border-color .15s ease, color .15s ease, box-shadow .15s ease;
}
/* O transform: none desfaz o translateY(-1px) que o main-final aplica no
   hover do chip. Pulinho no hover e exatamente o tique que a direcao v3
   tirou do site inteiro, e ele volta sozinho junto com a classe. */
.v3-apipg-picker-rolo .sl-api-chip:hover {
	background: var(--v3-card);
	border-color: var(--v3-line-strong);
	color: var(--v3-ink);
	transform: none;
}
/* O chip escolhido NAO troca de fundo, so de borda, de tinta e do sublinhado.
   Um fundo --v3-page-alt funcionava no tema claro (mais escuro que o cartao,
   lia como afundado) e se perdia no escuro, onde o page-alt #14181D fica mais
   ESCURO que o proprio cartao #171C22 e o chip escolhido recuava em vez de
   avancar. O sublinhado laranja e o mesmo sinal das abas do site, e esse
   funciona igual nos dois temas. */
.v3-apipg-picker-rolo .sl-api-chip.is-active {
	background: var(--v3-card);
	border-color: var(--v3-line-strong);
	color: var(--v3-ink);
	box-shadow: inset 0 -2px 0 var(--v3-brand);
}
.v3-apipg-picker-rolo .sl-api-chip:focus-visible {
	outline: 2px solid var(--v3-brand);
	outline-offset: 2px;
}

/* Metodo HTTP sem cor. A pele antiga pintava GET de teal, POST de azul e
   DELETE de vermelho; na direcao v3 cor de texto fora do modulo Comandos nao
   e sancionada, e aqui ela nao acrescentaria informacao nenhuma, porque a
   palavra "GET" ja esta escrita por extenso ao lado do caminho. Os sufixos
   --get, --post, --put, --patch e --delete que o JS escreve ficam de
   proposito SEM regra: esta linha, com duas classes, ja vence as deles. */
.v3-apipg-picker-rolo .sl-api-chip-method {
	padding: 0;
	background: none;
	border-radius: 0;
	font-family: var(--v3-mono);
	font-size: 11px;
	font-weight: 500;
	letter-spacing: .06em;
	color: var(--v3-ink-3);
}

/* ---- requisicao e resposta lado a lado ---- */

.v3-apipg-split {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 20px;
	align-items: start;
	margin-bottom: 20px;
}

/* Os dois paineis sao .v3-card do contrato: fundo, borda, raio e coluna vem
   de la, e o tema escuro sai de graca. Aqui muda so o respiro, porque 28px de
   padding com campo de formulario dentro deixa o cartao alto demais e o gap
   de 12px e curto para separar grupos de campos. */
.v3-apipg-painel { gap: 18px; padding: 22px; }

.v3-apipg-painel-titulo {
	margin: 0;
	font-size: 1.05rem;
	line-height: 1.25;
	color: var(--v3-ink);
}

/* A linha "GET /get_devices". O color: inherit no <p> nao e enfeite: o
   main-final tem um "p { color }" pelado, que casa DIRETO com o elemento e
   ganha da cor herdada do cartao. */
.v3-apipg-chamada {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px;
	margin: -6px 0 0;
	color: inherit;
}

/* Rotulo do metodo: moldura no lugar de cor. O JS troca tambem o atributo
   data-method, que fica sem regra pelo mesmo motivo do sufixo do chip. */
.v3-apipg-metodo {
	flex: none;
	padding: 4px 9px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 6px;
	font-family: var(--v3-mono);
	font-size: 12px;
	font-weight: 500;
	letter-spacing: .06em;
	line-height: 1.3;
	color: var(--v3-ink);
}

/* O caminho e um <code>: precisa vencer o [data-theme="light"] code (0,1,1)
   do main-final, que o pintaria de #f6f6fa e o desalinharia do rotulo ao
   lado. Duas classes resolvem sem !important. */
.v3-apipg .v3-apipg-rota {
	padding: 0;
	background: none;
	border: 0;
	border-radius: 0;
	font-family: var(--v3-mono);
	font-size: 14px;
	line-height: 1.4;
	color: var(--v3-ink);
	overflow-wrap: anywhere;
}

.v3-apipg-desc {
	margin: -8px 0 0;
	font-size: 14.5px;
	line-height: 1.55;
	color: var(--v3-ink-2);
}
/* Endpoint sem descricao no catalogo deixaria um paragrafo vazio comendo o
   gap da coluna. O :empty resolve sem pedir nada ao JS. */
.v3-apipg-desc:empty { display: none; }

/* ---- grupos de campos ---- */

.v3-apipg-grupo { display: grid; gap: 10px; }

.v3-apipg-grupo-titulo {
	margin: 0;
	font-family: var(--v3-mono);
	font-size: 12px;
	font-weight: 400;
	letter-spacing: .04em;
	line-height: 1.4;
	text-transform: none;
	color: var(--v3-ink-3);
}

.v3-apipg-campos { display: grid; gap: 8px; }

/* O <label> de cada campo e escrito pelo JS com a classe .sl-api-field. Duas
   colunas: nome do parametro a esquerda, valor a direita. O main-final ja
   fazia grade aqui, mas com o nome em caixa alta de 0,66rem, que e etiqueta.
   Nome de parametro e literal que a pessoa vai copiar: vai em mono e com as
   letras que a API usa. */
.v3-apipg-campos .sl-api-field {
	display: grid;
	grid-template-columns: minmax(0, 132px) minmax(0, 1fr);
	align-items: center;
	gap: 4px 12px;
	margin: 0;
}
/* As tres ultimas linhas sao a correcao mais importante deste bloco. O
   main-final corta o nome com reticencias (overflow hidden + text-overflow
   ellipsis + white-space nowrap), e com 132px de coluna "registration_number"
   saia como "registration_nu...". Nome de parametro e literal que a pessoa vai
   copiar para o codigo dela: cortado, ele deixa de ser informacao. Aqui ele
   quebra em duas linhas em vez de sumir. */
.v3-apipg-campos .sl-api-field > span {
	font-family: var(--v3-mono);
	font-size: 12.5px;
	font-weight: 400;
	letter-spacing: 0;
	line-height: 1.4;
	text-transform: none;
	color: var(--v3-ink-3);
	overflow: visible;
	text-overflow: clip;
	white-space: normal;
	overflow-wrap: anywhere;
}

/* O seletor termina em input[type="text"] (0,2,2) porque o main-final tem
   [data-theme="light"] input[type="text"] (0,2,1) e a regra pelada de input
   (0,1,1) no topo do arquivo. Sem os dois niveis o campo volta a ter raio de
   12px, padding de 0,9rem e fundo branco fixo, inclusive no tema escuro. */
.v3-apipg-campos .sl-api-field input[type="text"] {
	width: 100%;
	min-width: 0;
	padding: 8px 10px;
	background: var(--v3-page);
	border: 1px solid var(--v3-line);
	border-radius: 7px;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.4;
	color: var(--v3-ink);
	transition: border-color .15s ease;
}
.v3-apipg-campos .sl-api-field input[type="text"]:hover {
	border-color: var(--v3-line-strong);
}
/* O :focus zera o halo de 4px que o main-final desenha em todo input; o
   :focus-visible vem depois e devolve o anel do site so para quem navega
   pelo teclado. A ordem importa: as duas regras tem a mesma especificidade. */
.v3-apipg-campos .sl-api-field input[type="text"]:focus {
	outline: none;
	border-color: var(--v3-brand);
	background: var(--v3-page);
	box-shadow: none;
}
.v3-apipg-campos .sl-api-field input[type="text"]:focus-visible {
	outline: 2px solid var(--v3-brand);
	outline-offset: 1px;
}

/* O corpo JSON e codigo que se digita, entao ele mora no mesmo bloco escuro
   da resposta e do exemplo: a pessoa escreve na mesma superficie em que le.
   Duas classes pelo [data-theme="light"] textarea (0,1,1) e pela regra pelada
   de textarea do topo do main-final. */
.v3-apipg .v3-apipg-editor {
	width: 100%;
	/* 148px e a medida do maior corpo do catalogo (o do /login, cinco linhas)
	   sem barra de rolagem propria. Menos que isso e a caixa nasce rolando
	   num conteudo que caberia. */
	min-height: 148px;
	padding: 12px 14px;
	/* A barra de rolagem padrao e clara e corta o bloco escuro ao meio quando
	   o corpo passa das cinco linhas. */
	scrollbar-width: thin;
	scrollbar-color: var(--v3-demo-line) var(--v3-demo-bg);
	background: var(--v3-demo-bg);
	border: 1px solid var(--v3-demo-line);
	border-radius: 8px;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.6;
	color: var(--v3-demo-ink);
	resize: vertical;
	transition: border-color .15s ease;
}
.v3-apipg .v3-apipg-editor:focus {
	outline: none;
	background: var(--v3-demo-bg);
	border-color: var(--v3-demo-edge);
	box-shadow: none;
}
.v3-apipg .v3-apipg-editor:focus-visible {
	outline: 2px solid var(--v3-brand);
	outline-offset: 1px;
}

/* A unica coisa que avisa que o corpo digitado nao e JSON valido. Aqui a cor
   nao e enfeite e nao substitui palavra nenhuma: o JS escreve "JSON invalido"
   junto com a mensagem do parser. */
.v3-apipg-erro {
	margin: 0;
	font-family: var(--v3-mono);
	font-size: 12.5px;
	line-height: 1.5;
	color: var(--v3-cmd-perigo);
}

/* ---- nota de autenticacao ---- */

/* O fio em cima separa a explicacao dos campos que se editam, do mesmo jeito
   que o .v3-card-meta separa o rodape do cartao. A cor e declarada, e nao
   herdada, pela armadilha de sempre: o main-final tem um "p { color }" pelado,
   que casa direto com o elemento e ganha de qualquer cor herdada do cartao. */
.v3-apipg-nota {
	margin: 0;
	padding-top: 14px;
	border-top: 1px solid var(--v3-line);
	font-size: 14px;
	line-height: 1.55;
	color: var(--v3-ink-2);
}
/* Mesma pastilha do endereco base la embaixo, e duas classes pelo mesmo
   [data-theme="light"] code (0,1,1) do main-final. */
.v3-apipg .v3-apipg-nota code {
	padding: 1px 5px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 5px;
	font-family: var(--v3-mono);
	font-size: 12.5px;
	color: var(--v3-ink);
	white-space: nowrap;
}

/* ---- botoes da requisicao ---- */

/* O margin-top: auto empurra os botoes para o pe do cartao, para os dois
   paineis terminarem na mesma altura quando o endpoint tem poucos campos. */
.v3-apipg-acoes {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
	margin-top: auto;
	padding-top: 4px;
}
/* O main.js desliga o botao durante a chamada simulada. Sem estado visivel
   ele continuava parecendo clicavel e a pessoa clicava de novo. Controle
   desligado esta fora do piso de contraste da WCAG, que e o unico motivo de
   o opacity ser aceitavel aqui. */
.v3-apipg-acoes .v3-btn:disabled {
	opacity: .55;
	cursor: default;
}

/* ---- cabecalho da resposta ---- */

.v3-apipg-respcab {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px;
}

/* Etiqueta de estado. O texto que o JS escreve ("200 OK", "429 Too Many
   Requests") ja carrega a informacao inteira, entao a cor nao entra no texto:
   colorir texto fora do modulo Comandos nao e sancionado na direcao v3. O que
   muda por estado e a BORDA, o mesmo recurso da faixa de estado da /status/.
   Quem nao distingue cor continua com o codigo HTTP escrito por extenso. */
.v3-apipg-estado {
	padding: 5px 10px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 6px;
	font-family: var(--v3-mono);
	font-size: 12.5px;
	line-height: 1.3;
	color: var(--v3-ink);
	white-space: nowrap;
}
.v3-apipg-estado[data-tone="success"] { border-color: var(--v3-cmd-ok); }
.v3-apipg-estado[data-tone="warn"]    { border-color: var(--v3-cmd-atencao); }
.v3-apipg-estado[data-tone="error"]   { border-color: var(--v3-cmd-perigo); }
.v3-apipg-estado[data-tone="pending"] { color: var(--v3-ink-3); }

/* O tempo da chamada sai do JS com um "·" na frente ("· 240 ms"). Separador
   entre dois dados, nao palavra encadeada: fica. */
.v3-apipg-lat {
	font-family: var(--v3-mono);
	font-size: 12.5px;
	line-height: 1.3;
	color: var(--v3-ink-3);
}

/* Mesma receita do .v3-cmd-copiar do terminal de comandos, so que sobre o
   cartao claro em vez do bloco escuro. O .is-copied vem do JS por 1,5s e usa
   o mesmo verde de texto sobre cartao ja medido para o "Link copiado". */
.v3-apipg-copiar {
	flex: none;
	margin-left: auto;
	min-height: 32px;
	padding: 5px 12px;
	background: transparent;
	border: 1px solid var(--v3-line);
	border-radius: 7px;
	font-family: var(--v3-body);
	font-size: 12.5px;
	font-weight: 600;
	line-height: 1.2;
	color: var(--v3-ink-2);
	cursor: pointer;
	transition: color .15s ease, border-color .15s ease;
}
.v3-apipg-copiar:hover {
	border-color: var(--v3-line-strong);
	color: var(--v3-ink);
}
.v3-apipg-copiar.is-copied {
	border-color: var(--v3-cmd-ok);
	color: var(--v3-cmd-ok);
}

/* ---- bloco escuro da resposta ---- */

/* O involucro e a .v3-cmd-code do terminal de comandos, reusada inteira:
   fundo escuro nos dois temas, borda e raio ja resolvidos. Aqui entra so o
   que aquele bloco nao previa, que e a altura.

   Os 280px sao a altura de repouso: antes de qualquer clique o cartao da
   resposta tem so a etiqueta "Aguardando" e uma linha de texto, e ao lado de
   um endpoint com dezessete filtros ele nascia como uma tira. Nao ha aqui
   nenhuma tentativa de igualar a altura dos dois paineis: uma requisicao com
   dezessete parametros e mesmo mais alta que a resposta dela, e esticar o
   bloco escuro para acompanhar so criaria um retangulo preto vazio. */
.v3-apipg-resp { min-height: 280px; }

/* O corte da resposta longa mora no proprio <pre>, e nao no involucro, porque
   e o <pre> que o main.js mede para decidir se mostra o botao
   (responseEl.scrollHeight > responseEl.clientHeight + 4). Tirar o max-height
   daqui faz o botao nunca aparecer, sem erro nenhum no console. */
.v3-apipg-resp .v3-apipg-pre {
	max-height: 340px;
	overflow: hidden;
}
.v3-apipg-resp.is-expanded .v3-apipg-pre { max-height: none; }

/* Botao "mostrar tudo" como faixa no pe do bloco, igual ao "Ver mais" da
   lista de APN (.v3-cmd-vermais). Substitui o degrade que o main-final
   desenhava por cima da resposta cortada: aqui o proprio botao, encostado no
   corte, ja diz que o texto continua, e a pagina nao ganha um gradiente. */
.v3-apipg-mais {
	display: block;
	width: 100%;
	padding: 10px 14px;
	background: none;
	border: 0;
	border-top: 1px solid var(--v3-demo-line);
	font-family: var(--v3-body);
	font-size: 13px;
	font-weight: 600;
	line-height: 1.2;
	text-align: center;
	color: var(--v3-demo-ink-2);
	cursor: pointer;
	transition: color .15s ease;
}
.v3-apipg-mais:hover { color: var(--v3-demo-ink); }

/* ---- exemplo de codigo ---- */

.v3-apipg-cod {
	gap: 14px;
	padding: 22px;
	margin-bottom: 20px;
}
.v3-apipg-cod-cab {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px 20px;
}
.v3-apipg-cod-cab .v3-apipg-painel-titulo { flex: none; }

.v3-apipg-langs {
	display: flex;
	flex-wrap: wrap;
	gap: 18px;
}
/* Mesmo botao de texto com sublinhado laranja dos filtros la de cima: uma so
   maneira de dizer "este e o item ativo" na pagina inteira. */
.v3-apipg-lang {
	flex: none;
	padding: 4px 2px 7px;
	background: none;
	border: 0;
	border-radius: 0;
	box-shadow: none;
	font-family: var(--v3-body);
	font-size: 14.5px;
	font-weight: 600;
	line-height: 1.2;
	color: var(--v3-ink-3-strong);
	cursor: pointer;
	transition: color .15s ease, box-shadow .15s ease;
}
.v3-apipg-lang:hover:not(.is-active) { color: var(--v3-ink-2); }
.v3-apipg-lang.is-active {
	color: var(--v3-ink);
	box-shadow: inset 0 -2px 0 var(--v3-brand);
}
.v3-apipg-lang:focus-visible {
	outline: 2px solid var(--v3-brand);
	outline-offset: 2px;
}

/* ---- o <pre> dos dois blocos escuros ---- */

/* Duas classes, pelo [data-theme="light"] pre (0,1,1) do main-final: sem
   isso, no tema claro o bloco viraria #f6f6fa com texto escuro e o realce do
   JSON, que e pensado para fundo escuro, ficaria ilegivel. Fundo escuro em
   bloco de codigo nos dois temas e a convencao de toda documentacao de API, e
   e a mesma decisao ja tomada no terminal dos comandos SMS. */
.v3-apipg .v3-apipg-pre {
	margin: 0;
	padding: 14px 16px;
	background: none;
	border: 0;
	border-radius: 0;
	font-family: var(--v3-mono);
	font-size: 12.5px;
	line-height: 1.65;
	color: var(--v3-demo-ink-2);
	white-space: pre-wrap;
	overflow-wrap: anywhere;
}
.v3-apipg .v3-apipg-pre code {
	padding: 0;
	background: none;
	border: 0;
	font-family: inherit;
	font-size: inherit;
	color: inherit;
}

/* Realce do JSON. Os <span class="json-*"> sao escritos pelo main.js querendo
   ou nao: ou recebem cor pensada aqui, ou ficam com a do main-final. As
   quatro cores sao os tokens ja medidos para o bloco escuro do terminal de
   comandos, que e a mesma superficie e o mesmo fundo nos dois temas. Nenhum
   token novo, nenhuma cor nova na pagina. */
.v3-apipg .v3-apipg-pre .json-key    { color: var(--v3-cmd-info-cmd); }
.v3-apipg .v3-apipg-pre .json-string { color: var(--v3-demo-ok); }
.v3-apipg .v3-apipg-pre .json-number { color: var(--v3-demo-warn); }
.v3-apipg .v3-apipg-pre .json-bool   { color: var(--v3-cmd-perigo-cmd); }
.v3-apipg .v3-apipg-pre .json-null   { color: var(--v3-demo-ink-3); font-style: italic; }

/* ---- rodape: o que saber e para onde ir ---- */

.v3-apipg-rodape { align-items: start; }

/* O endereco base e literal para copiar. Mesma pastilha da ficha tecnica da
   hero desta pagina (.v3-api-specs code), e duas classes pelo mesmo
   [data-theme="light"] code. */
.v3-apipg .v3-apipg-base {
	padding: 2px 6px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 5px;
	font-family: var(--v3-mono);
	font-size: 13px;
	color: var(--v3-ink);
	overflow-wrap: anywhere;
}

/* O link em si e a .v3-link do contrato. Aqui so a lista: um por linha, com
   fio entre eles e area de toque de 44px no celular. */
.v3-apipg-links {
	list-style: none;
	display: grid;
	margin: 0;
	padding: 0;
}
.v3-apipg-links li + li { border-top: 1px solid var(--v3-line); }
.v3-apipg-links a {
	display: block;
	padding: 13px 0;
	font-size: 15px;
	line-height: 1.4;
}

/* ---- respostas do layout ---- */

@media (max-width: 1000px) {
	/* Os dois paineis lado a lado param de caber bem antes dos 720px: com o
	   nome do parametro em uma coluna e o valor na outra, cada painel fica
	   com menos de 300px uteis e todo campo quebra. */
	.v3-apipg-split { grid-template-columns: minmax(0, 1fr); }
}

@media (max-width: 720px) {
	.v3-section.v3-apipg { padding: 24px 0 56px; }

	/* No computador as catorze categorias quebram em duas fileiras e aparecem
	   todas, que e o melhor. No celular elas viravam SEIS fileiras: a primeira
	   tela ficava so de filtro e o editor comecava fora da vista. Rolando de
	   lado, a fila ocupa uma linha, com o mesmo aviso de borda da fila de
	   endpoints logo abaixo. O fio de base continua sendo inset, e nao border,
	   justamente para nao rolar junto com o conteudo. */
	.v3-apipg-filtros {
		flex-wrap: nowrap;
		gap: 0 18px;
		margin-bottom: 16px;
		overflow-x: auto;
		scrollbar-width: none;
		-webkit-mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 28px), transparent 100%);
		        mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 28px), transparent 100%);
	}
	.v3-apipg-filtros::-webkit-scrollbar { display: none; }
	.v3-apipg-filtros .sl-api-filter { font-size: 14px; }
	.v3-apipg-picker { margin-bottom: 20px; }

	.v3-apipg-painel,
	.v3-apipg-cod { padding: 18px; }

	/* Nome do parametro em cima do campo: em duas colunas de celular sobra
	   menos de 150px para o valor, e "user_api_hash" com token dentro nao
	   cabe em coluna nenhuma. */
	.v3-apipg-campos .sl-api-field { grid-template-columns: minmax(0, 1fr); }

	/* Dois botoes lado a lado no celular ficam com area de toque estreita
	   demais. Mesmo tratamento da hero desta pagina. */
	.v3-apipg-acoes .v3-btn { width: 100%; }

	/* O botao de copiar desgruda da direita quando o cabecalho quebra: com o
	   margin-left: auto ele ficava sozinho numa terceira linha, encostado na
	   borda, longe do bloco que copia. */
	.v3-apipg-respcab .v3-apipg-copiar,
	.v3-apipg-cod-cab .v3-apipg-copiar { margin-left: 0; }

	.v3-apipg-langs { gap: 16px; }
	.v3-apipg .v3-apipg-pre { padding: 12px 13px; font-size: 12px; }
}

/* ---- tres guardas de [hidden] ----

   O main.js mostra e esconde estes tres pelo atributo hidden. Sem as linhas
   abaixo, o display que cada um recebe acima venceria o [hidden]{display:none}
   do navegador e os tres nasceriam abertos: os grupos de campos todos ao
   mesmo tempo (inclusive o corpo JSON de um GET), a linha de erro de JSON sem
   erro nenhum e o botao "mostrar tudo" sobre uma resposta que cabe inteira. */
.v3-apipg-grupo[hidden] { display: none; }
.v3-apipg-erro[hidden]  { display: none; }
.v3-apipg-mais[hidden]  { display: none; }

/* ==========================================================================
   Mapa do escritorio (page-sobre.php e page-contato.php, rodada v3.6.7)

   As duas paginas publicam o mesmo endereco e agora desenham o mesmo mapa.
   Qual dos dois caminhos entra quem decide e o PHP, pela chave do Google:

     COM sl_gmaps_key   sai a marcacao de sempre ([data-sl-map] + .sl-gmap) e
                        quem desenha e a initContactMap() do main.js. As regras
                        dessa pele continuam nos blocos de /sobre/ e /contato/
                        ja existentes neste arquivo, com os !important que elas
                        precisam para vencer o main-final; daqui so sai a
                        proporcao da faixa larga.
     SEM chave          sai um <iframe> do OpenStreetMap, que nao tem pele
                        antiga nenhuma para desfazer: classes novas, prefixo
                        .v3-, nenhum !important.

   O mapa embutido e sempre claro, nos dois temas: sao os ladrilhos do
   OpenStreetMap, imagem de terceiro, e nao ha token de cor para trocar. Por
   isso a moldura e o hairline --v3-line e o fundo de espera e --v3-page-alt: no
   tema escuro o mapa fica sendo uma figura clara dentro de uma moldura escura,
   que e como uma foto se comporta, e nao um vazamento da paleta antiga.
   -------------------------------------------------------------------------- */

/* A caixa tem PROPORCAO, e nao altura: mapa de rua e uma faixa. O iframe fica
   posicionado por cima dela em vez de usar height 100%, porque altura em
   porcentagem dentro de um pai que so tem aspect-ratio e resolvida de um jeito
   em cada motor.

   O "width: 100%" nao e redundante, e sem ele a caixa fica ESTREITA. Com
   largura automatica, aspect-ratio e max-height juntos, o navegador trata a
   largura como o eixo dependente: ela bate no teto de 460px de altura e volta a
   ser calculada pela proporcao, 460 x 21 / 9 = 1073px, dentro de um contentor
   de 1152px. Sobram 79px de um lado so, ou seja, um mapa desalinhado da secao,
   que e o defeito que esta rodada veio consertar e nao repetir. Com a largura
   declarada, a proporcao passa a ser a forma preferida e o max-height so corta
   a altura. Medido no navegador, nao deduzido. */
.v3-mapa-osm {
	position: relative;
	overflow: hidden;
	width: 100%;
	aspect-ratio: 21 / 9;
	max-height: 460px;
	background: var(--v3-page-alt);
	border: 1px solid var(--v3-line);
	border-radius: 12px;
}
.v3-mapa-osm-tela {
	position: absolute;
	inset: 0;
	display: block;
	width: 100%;
	height: 100%;
	border: 0;
}

/* Rodape do mapa: o endereco a esquerda, o link a direita. Ele e IRMAO da caixa
   do mapa, nunca filho: no caminho do Google o main.js troca o miolo do
   [data-sl-map] por inteiro, e o que estivesse la dentro sumiria na primeira
   vez que o mapa subisse.
   A cor vai declarada aqui, no proprio <p>, porque o main-final.css tem um
   "p { color }" pelado e regra que casa direto com o elemento ganha da cor
   herdada do ancestral. */
.v3-mapa-pe {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	justify-content: space-between;
	gap: 6px 24px;
	margin: 12px 0 0;
	font-family: var(--v3-mono);
	font-size: 13px;
	line-height: 1.5;
	color: var(--v3-ink-3);
}
.v3-mapa-pe-end { min-width: 0; }
/* O link e o unico texto de acao da faixa: sai do mono do dado e nao quebra no
   meio do rotulo. */
.v3-mapa-pe .v3-link {
	font-family: var(--v3-body);
	font-size: 14px;
	white-space: nowrap;
}

/* A MESMA armadilha ja estava escrita no bloco da /sobre/, desde a v3.6.6:
   aspect-ratio 21/9 com max-height 460px e largura automatica. Ninguem viu
   porque sem chave do Google a caixa nunca chega a .sl-gmap--ready, e o estado
   sem essa classe descarta a proporcao. No dia em que a chave for preenchida, o
   mapa nasceria 79px mais estreito que a secao, encostado a esquerda. Esta
   declaracao tem a mesma especificidade da de la e vem depois no arquivo, entao
   e a que vale; o resto daquele bloco continua intacto. */
.v3-sobre-mapa.sl-gmap { width: 100%; }

/* ---- /contato/: a faixa do mapa ocupa as duas colunas ----

   O mapa era o segundo item do <aside>, embaixo do painel de dados, numa coluna
   de menos de 400 px. Duas coisas erradas ali: mapa de rua estreito nao se le,
   e o <aside> inteiro e bem mais curto que o formulario ao lado, entao sobrava
   um vao embaixo dele, que foi o que o Joao viu. Como ultimo item da grade,
   ocupando as duas colunas, o mapa fecha a secao e o vao deixa de existir. No
   celular a grade ja e de uma coluna e a ordem do HTML (formulario, painel,
   mapa) e a mesma da tela. */
.v3-ct-grid > .v3-ct-mapa-faixa { grid-column: 1 / -1; }

/* O caminho do Google na faixa larga. A regra la de cima no arquivo fixa
   min-height 280px, que numa faixa de 1200 px vira um retangulo achatado; aqui
   a altura passa a sair da proporcao, igual a do mapa embutido. Mesma
   especificidade da outra e escrita depois dela: e esta que vale. O raio
   acompanha o do mapa embutido para os dois caminhos terminarem iguais. */
.v3-ct-mapa--largo {
	border-radius: 12px;
}
.v3-ct-mapa--largo .v3-ct-mapa-tela {
	min-height: 0;
	width: 100%;
	aspect-ratio: 21 / 9;
	max-height: 460px;
}

@media (max-width: 1000px) {
	/* Faixa menos larga pede proporcao menos larga: 21/9 numa tela de tablet
	   vira um filete. */
	.v3-mapa-osm,
	.v3-ct-mapa--largo .v3-ct-mapa-tela { aspect-ratio: 16 / 9; }
}

@media (max-width: 720px) {
	/* 21/9 numa tela de 360 px tem 150 px de altura, onde nao cabe nem o pino
	   nem uma quadra. No celular o mapa fica mais alto que largo. */
	.v3-mapa-osm,
	.v3-ct-mapa--largo .v3-ct-mapa-tela { aspect-ratio: 4 / 3; max-height: 340px; }
}

/* === faixa de demonstracao do hero de comandos === */
/* --------------------------------------------------------------------------
   Faixa de demonstracao do hero de /comandos-rastreadores/ (so o hub).
   Marcacao em template-parts/cmd-faixa.php; as classes de fase vem do bloco
   [data-cmdh] no fim do assets/js/v3.js.

   Duas telas na mesma linha de base: um telefone estreito a esquerda (22,9%
   da faixa) e um tablet deitado a direita (70,5%), com 6,6% de vao. A conta
   fecha 100% de proposito, para a faixa ocupar o .v3-wrap inteiro: e dai que
   sai o unico numero que decidiu a composicao, os 784px de tela de tablet em
   1440. Dentro da coluna direita do hero (520,6px, ver .v3-cmd-hero-grid) o
   mesmo aviso sairia em 26px, corpo de legenda para o desfecho da pagina.

   ZERO @keyframes aqui, e nao por gosto: a regra cega de movimento reduzido
   da linha 1020 deste arquivo zera animation-duration no site inteiro, e quem
   nao declara animation-fill-mode volta ao estado INICIAL, que na tela le como
   "nao aconteceu nada". E o defeito do card de SMS da secao 12, onde quem pede
   menos movimento ve o veiculo congelado em "Nao conectado", ou seja, o
   contrario da promessa. Aqui todo estado e classe mais transition, entao
   movimento reduzido so torna a troca instantanea.

   O ESTADO SEM NENHUMA CLASSE E O ESTADO COMPLETO: folha aberta, comandos
   entregues, rodape "Online", 32 km/h, veiculo no mapa e o aviso na versao
   pequena. E o que aparece sem JS, com JS quebrado, com autoplay recusado e
   com movimento reduzido. Nenhum instante do laco mostra tudo isso junto: e
   uma pose montada de proposito, porque imagem parada tem de contar a
   historia inteira. A encenacao so comeca quando o JS poe .is-rodando, e a
   partir dai cada fase .is-t0 a .is-t10 manda no que aparece.

   Nenhuma declaracao forcada neste bloco (o grep de conferencia tem de dar
   zero). A peca nao usa uma unica classe .sl-*, que e de onde vem a forca
   obrigatoria no resto do arquivo, e as duas regras de elemento pelado do
   main-final.css que a alcancam (a de "p" na linha 351 e a de "img, svg,
   video" na 163) sao vencidas por classe, com a cor e as medidas
   redeclaradas onde precisa. Os dois pontos estao marcados abaixo.
   -------------------------------------------------------------------------- */

/* A hero do hub perde a coluna da foto e ganha a faixa embaixo, entao o
   respiro de baixo cresce: o que fecha a secao agora e a demonstracao, nao o
   ultimo botao. */
.v3-cmd-hero--faixa { padding: 64px 0 72px; }

.v3-cmdh { margin-top: 40px; }

	/* A medida de 760px do --solo e para hero de duas colunas, onde a coluna do
	   texto e estreita. Aqui a faixa ja ocupa a largura toda, e o teto estreito
	   so servia para empurrar o titulo para uma terceira linha: 176,2px contra
	   117,5px. Medido: o pino do mapa sobe de 942,0 para 883,2 numa janela de
	   1152x900, ou seja, passa a nascer acima da dobra. */
	.v3-cmd-hero--faixa .v3-cmd-hero-grid--solo .v3-cmd-hero-copy { max-width: 900px; }

/* --- palco: as duas molduras --- */

/* Tudo que muda entre os cortes e numero, entao tudo que muda entre os cortes
   e variavel: os dois @media la embaixo so trocam valores desta lista. O
   bisel e a ESPESSURA VISIVEL da moldura (padding mais o fio de 1px), por
   isso o padding sai de um calc: com box-sizing border-box (main-final.css:148)
   o fio entra na largura e, sem o calc, a tela do tablet sairia com 782px em
   vez dos 784 da especificacao. */
.v3-cmdh-palco {
	--v3-cmdh-bf: 9px;     /* bisel do telefone */
	--v3-cmdh-bt: 14px;    /* bisel do tablet */
	--v3-cmdh-rod: 30px;   /* altura do rodape de estado dentro do telefone */
	--v3-cmdh-fs-status: 10px;
	--v3-cmdh-fs-appbar: 12.5px;
	--v3-cmdh-fs-label: 11px;
	--v3-cmdh-fs-valor: 13.5px;
	--v3-cmdh-fs-nome: 12px;
	--v3-cmdh-fs-btn: 12.5px;
	--v3-cmdh-fs-est: 11.5px;
	--v3-cmdh-fs-conf: 56px;
	display: grid;
	grid-template-columns: 22.9% 70.5%;
	column-gap: 6.6%;
	/* O tablet e sempre mais alto que o telefone por algebra (a diferenca vale
	   0,0332 vezes a largura da faixa mais 27,9, positiva para qualquer
	   largura), entao o escalonamento nunca inverte entre cortes. */
	align-items: end;
}

.v3-cmdh-fone { grid-column: 1; grid-row: 1; min-width: 0; }
.v3-cmdh-tab  { grid-column: 2; grid-row: 1; min-width: 0; }

/* As duas molduras. O fundo e o token de linha (mesma receita do telefone de
   /conhecer-plataforma/), mas aqui ele sozinho nao basta: no tema escuro o
   #2A323B da moldura contra o fundo da pagina da 1,37:1 e o aparelho some. O
   fio de --v3-demo-edge resolve, porque esse token engrossa para #414B57 no
   escuro e continua sendo o proprio hairline no claro. */
.v3-cmdh-fone,
.v3-cmdh-tab {
	background: var(--v3-demo-line);
	border: 1px solid var(--v3-demo-edge);
}
.v3-cmdh-fone {
	padding: calc(var(--v3-cmdh-bf) - 1px);
	border-radius: 34px;
}
.v3-cmdh-tab {
	padding: calc(var(--v3-cmdh-bt) - 1px);
	border-radius: 16px;
}

/* width: 100% declarado nas duas telas mesmo sem max-height. E a regra da
   casa: aspect-ratio com largura automatica encolhe a caixa assim que ela
   bate em qualquer teto de altura, e o navegador recalcula a LARGURA pela
   proporcao (foi o que aconteceu no palco do tarifador). */
.v3-cmdh-fone-tela {
	position: relative;
	width: 100%;
	aspect-ratio: 232 / 502;
	display: flex;
	flex-direction: column;
	overflow: hidden;
	border-radius: 26px;
	background: var(--v3-demo-bg);
	color: var(--v3-demo-ink);
	font-family: var(--v3-body);
}
.v3-cmdh-tab-tela {
	position: relative;
	width: 100%;
	aspect-ratio: 4 / 3;
	overflow: hidden;
	border-radius: 7px;
	background: var(--v3-demo-bg);
	color: var(--v3-demo-ink);
	font-family: var(--v3-body);
}

/* --- chrome do telefone --- */

/* O entalhe em porcentagem, e nao nos 78x17px do telefone da plataforma: aqui
   a tela varia de 121 a 246px de largura entre os cortes, e medida fixa viraria
   uma tarja atravessada no celular. O aspect-ratio guarda a proporcao original. */
.v3-cmdh-entalhe {
	position: absolute;
	top: 0;
	left: 50%;
	transform: translateX(-50%);
	width: 34%;
	aspect-ratio: 78 / 17;
	background: var(--v3-demo-line);
	border-radius: 0 0 10px 10px;
	z-index: 3;
}

.v3-cmdh-status {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex: none;
	padding: 6px 12px 2px;
	font-family: var(--v3-mono);
	font-size: var(--v3-cmdh-fs-status);
	color: var(--v3-demo-ink-2);
}
.v3-cmdh-sinais {
	display: inline-flex;
	align-items: center;
	gap: 4px;
}
/* Medida explicita: o main-final.css:163 tem "img, svg, video { max-width:100%;
   height: auto }" e um svg sem altura declarada colapsaria para zero aqui. */
/* fill, e nao color: os <rect> do sinal e da bateria nao declaram preenchimento
   proprio, entao caiam no preto padrao do SVG e sumiam contra a tela escura do
   telefone. O contorno da bateria continua vazado porque o fill="none" DELE e
   atributo do proprio elemento, e atributo do elemento vence valor herdado. */
.v3-cmdh-ico { display: block; fill: currentColor; }
.v3-cmdh-ico--sinal { width: 10px; height: 8px; }
.v3-cmdh-ico--bat   { width: 14px; height: 8px; }

.v3-cmdh-appbar {
	display: flex;
	align-items: center;
	gap: 6px;
	flex: none;
	padding: 4px 11px 8px;
	border-bottom: 1px solid var(--v3-demo-line);
	font-size: var(--v3-cmdh-fs-appbar);
	font-weight: 600;
}
.v3-cmdh-appbar-nome {
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
/* A pastilha de vocabulario e grande demais para 121px de tela: aqui ela e
   selo de canto, nao controle. */
.v3-cmdh-appbar .v3-demo-tag {
	margin-left: auto;
	flex: none;
	padding: 2px 6px;
	border-radius: 5px;
	font-size: 9.5px;
}

/* A lista encolhe e recorta: quem manda na altura util e a folha de comando,
   que e uma gaveta absoluta por cima (ver .v3-cmdh-folha). Sem o min-height: 0
   um filho flex se recusa a encolher abaixo do proprio conteudo e a tela do
   telefone estoura no corte de 721px, onde ela tem 299px de altura. */
.v3-cmdh-lista {
	flex: 1 1 auto;
	min-height: 0;
	overflow: hidden;
	display: grid;
	align-content: start;
	gap: 6px;
	padding: 8px;
}

.v3-cmdh-item {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 7px 8px;
	border-radius: 7px;
}
.v3-cmdh-check {
	display: grid;
	place-items: center;
	flex: none;
	width: 14px;
	height: 14px;
	border: 1px solid var(--v3-demo-line);
	border-radius: 4px;
	color: var(--v3-brand);
}
/* Quem acende e a marca, nunca a caixa. Apagar o .v3-cmdh-check inteiro em
   .is-t0 deixaria o veiculo escolhido sem quadradinho ao lado de dois que
   tem, que le como falha de renderizacao e nao como "ainda nao marcado". Os
   outros dois itens vem com o span vazio de proposito. */
.v3-cmdh-check svg {
	display: block;
	width: 9px;
	height: 9px;
	transition: opacity .22s ease;
}

.v3-cmdh-item-txt {
	display: grid;
	gap: 1px;
	min-width: 0;
}
.v3-cmdh-item-nome {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-size: var(--v3-cmdh-fs-nome);
	font-weight: 600;
	color: var(--v3-demo-ink);
}
/* nowrap tambem na placa: em mono, "BRA-2E19" nos 121px de tela do celular
   quebra na segunda linha e o cartao do veiculo cresce no meio do laco. */
.v3-cmdh-item-placa {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-family: var(--v3-mono);
	font-size: 10px;
	color: var(--v3-demo-ink-3);
}
.v3-cmdh-item-meta {
	margin-left: auto;
	flex: none;
	display: inline-flex;
	align-items: center;
}

/* Os textos que trocam ficam sobrepostos na mesma celula e so a opacidade
   muda: o layout nunca se mexe. Mesma receita do .v3-plat-sms-troca que ja
   esta no ar na secao 12. */
.v3-cmdh-troca { display: inline-grid; }
.v3-cmdh-troca > span {
	grid-area: 1 / 1;
	transition: opacity .24s ease;
}

.v3-cmdh-kmh-a,
.v3-cmdh-kmh-b {
	font-family: var(--v3-mono);
	font-size: 10.5px;
	white-space: nowrap;
	color: var(--v3-demo-ink-2);
}
.v3-cmdh-kmh-a { opacity: 0; }

/* Folha de comando: gaveta ABSOLUTA por cima da lista, parada logo acima do
   rodape de estado. Em fluxo normal ela ocupava altura sempre, entao o
   translateY(100%) de .is-t0 a jogava por cima do rodape e escondia o "Nao
   conectado", que e justamente o que a primeira fase precisa mostrar. Por
   isso o rodape tem altura fixa (--v3-cmdh-rod) e nao apenas conteudo: e ela
   que ancora esta gaveta. */
.v3-cmdh-folha {
	position: absolute;
	left: 0;
	right: 0;
	bottom: var(--v3-cmdh-rod);
	z-index: 2;
	display: grid;
	gap: 8px;
	padding: 10px;
	background: var(--v3-demo-card);
	border-top: 1px solid var(--v3-demo-line);
	border-radius: 14px 14px 0 0;
	box-shadow: 0 -10px 22px rgba(0, 0, 0, .34);
	transition: transform .30s ease, opacity .22s ease;
}
.v3-cmdh-campo { display: grid; gap: 2px; }
.v3-cmdh-campo .v3-demo-label { font-size: var(--v3-cmdh-fs-label); }
.v3-cmdh-valor {
	display: block;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-family: var(--v3-mono);
	font-size: var(--v3-cmdh-fs-valor);
	font-weight: 500;
	color: var(--v3-demo-ink);
	transition: opacity .26s ease;
}
.v3-cmdh-enviar {
	width: 100%;
	padding: 7px 10px;
	border-radius: 7px;
	font-size: var(--v3-cmdh-fs-btn);
	/* O box-shadow entra na transicao porque o anel do clique e sombra. */
	transition: transform .16s ease, box-shadow .16s ease, background-color .18s ease, border-color .18s ease;
}

.v3-cmdh-rodape-fone {
	display: flex;
	align-items: center;
	gap: 7px;
	flex: none;
	height: var(--v3-cmdh-rod);
	padding: 0 11px;
	border-top: 1px solid var(--v3-demo-line);
	background: var(--v3-demo-bg);
	position: relative;
	z-index: 3;
}
.v3-cmdh-dot {
	width: 7px;
	height: 7px;
	flex: none;
	border-radius: 50%;
	background: var(--v3-demo-ok);
	transition: background-color .30s linear;
}
.v3-cmdh-est {
	font-size: var(--v3-cmdh-fs-est);
	line-height: 1.3;
	white-space: nowrap;
}
.v3-cmdh-est--off    { color: var(--v3-demo-alert); opacity: 0; }
.v3-cmdh-est--espera { color: var(--v3-demo-warn);  opacity: 0; }
.v3-cmdh-est--on     { color: var(--v3-demo-ok); font-weight: 600; }

/* Toast de ponta a ponta, sem translateX(-50%): a caixa centralizada de 12px
   de fonte nao cabe nos 121px de tela do celular e vazava pelos dois lados.

   E ancorado pelo TOPO, nao pelo rodape. Ancorado embaixo ele caia exatamente
   sobre o "Enviar comandos" (a folha comeca entre 47% e 55% da tela em todos os
   cortes e o botao e a ultima linha dela), e o botao sumia atras do aviso nos
   dois segundos em que ele aparece: lido de fora, o botao virava o toast. A
   34% ele fica sempre na area da lista, acima da folha, em qualquer corte. */
.v3-cmdh-toast {
	/* Mais estreito que o cartao de veiculo, redondo e com sombra, de
	   proposito: com a largura e o raio de um cartao ele parecia mais um item
	   da lista, e nao um aviso passando por cima. Ele CRUZA um cartao em todo
	   corte acima de 1000px, e nenhuma porcentagem resolve isso (a tela do
	   tablet varia de 425,8 a 531,8px enquanto os cartoes ficam nos mesmos
	   pixels); a saida e ele deixar de imitar um. */
	left: 22px;
	right: 22px;
	top: 34%;
	bottom: auto;
	z-index: 4;
	display: flex;
	justify-content: center;
	gap: 6px;
	padding: 6px 8px;
	border-radius: 999px;
	box-shadow: 0 6px 18px rgba(0, 0, 0, .45);
	font-size: 10.5px;
	text-align: center;
	opacity: 0;
	transition: opacity .24s ease;
}
.v3-cmdh-toast-ico {
	display: inline-flex;
	flex: none;
	color: var(--v3-demo-ok);
}
.v3-cmdh-toast-ico svg {
	display: block;
	width: 11px;
	height: 11px;
}

/* --- tela do tablet: mapa, video e o aviso --- */

.v3-cmdh-mapa { position: absolute; inset: 0; }

/* O pino e um <g> com transform="translate(x,y)" escrito pelo PHP com as
   coordenadas de sl_demo_map_ponto. NAO se toca no transform dele por CSS: a
   propriedade sobrescreveria o atributo e o pino sairia do lugar, e ate a
   propriedade individual "scale" erraria, porque ela e aplicada POR FORA do
   transform (a escala cairia tambem sobre o translate e o pino iria parar em
   40% das coordenadas). Quem cresce sao os tres circulos, cada um em volta do
   proprio centro, e para isso o transform-origin precisa do fill-box. */
.v3-cmdh-pino { transition: opacity .28s ease; }
.v3-cmdh-pino circle {
	transform-box: fill-box;
	transform-origin: center;
	transition: transform .34s cubic-bezier(.2, 1.3, .4, 1);
}

/* Nasce invisivel e sobe quando o JS confirma quadro apresentado (.is-video).
   Sem poster de proposito: o mapa desenhado por baixo e o poster, e assim nao
   existe retangulo preto nem um campo a mais no Customizer. A medida vem por
   classe porque o main-final.css:163 poe height: auto em todo <video>. */
.v3-cmdh-video {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	opacity: 0;
	transition: opacity .25s ease;
}

/* Aviso, versao PEQUENA: e a pose parada, do tamanho de um toast de
   plataforma. Ancorado no canto inferior DIREITO, e nao de lado a lado: de
   ponta a ponta ele virava uma barra de status e pesava mais que o mapa, e a
   esquerda e justamente onde o telefone cobre o tablet abaixo de 720px. O teto
   de largura e para uma copy maior nao atravessar a tela inteira. */
.v3-cmdh-conf {
	position: absolute;
	inset: auto 12px 12px auto;
	max-width: calc(100% - 24px);
	z-index: 2;
	display: flex;
	align-items: center;
	gap: 9px;
	padding: 9px 11px;
	background: var(--v3-demo-card);
	border: 1px solid var(--v3-demo-line);
	border-radius: 9px;
	transition: opacity .30s ease;
}
.v3-cmdh-conf-ico {
	display: inline-flex;
	flex: none;
	width: 18px;
	height: 18px;
	color: var(--v3-demo-ok);
}
.v3-cmdh-conf-ico svg { display: block; width: 100%; height: 100%; }
.v3-cmdh-conf-txt { display: grid; gap: 2px; min-width: 0; }
.v3-cmdh-conf-tit {
	font-family: var(--v3-display);
	font-variation-settings: "wdth" 110, "wght" 700;
	font-weight: 700;
	font-size: 15px;
	line-height: 1.04;
	letter-spacing: -.02em;
	color: var(--v3-demo-ink);
}
.v3-cmdh-conf-sub {
	font-size: 12px;
	line-height: 1.3;
	color: var(--v3-demo-ink-2);
}
.v3-cmdh-conf-sub-a { opacity: 0; }

/* --- rodape da peca: alternativa em texto e o botao de pausa --- */

/* Os dois vivem FORA do palco porque o palco e aria-hidden. A frase e a
   alternativa textual que a WCAG 1.2.1 exige de video sem audio, e o botao e
   o que a 2.2.2 exige de movimento automatico com mais de 5 segundos. */
.v3-cmdh-rodape {
	margin-top: 18px;
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 12px 24px;
}
/* Cor declarada no proprio <p>: o main-final.css:351 tem "p { color: ... }"
   pelado, e regra que casa DIRETO com o elemento ganha de qualquer cor
   herdada do ancestral, por mais especifico que ele seja. */
.v3-cmdh-alt {
	margin: 0;
	max-width: 640px;
	font-size: 14px;
	line-height: 1.5;
	color: var(--v3-ink-3);
}
.v3-cmdh-pausa {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	flex: none;
	padding: 8px 13px;
	background: transparent;
	/* --v3-line e fio de divisoria; contorno de controle e --v3-line-strong,
	   como o botao do simulador de ROI ja usa. */
	border: 1px solid var(--v3-line-strong);
	border-radius: 8px;
	color: var(--v3-ink-2);
	font-family: var(--v3-body);
	font-size: 13px;
	font-weight: 500;
	line-height: 1;
	cursor: pointer;
	transition: border-color .18s ease, color .18s ease;
}
.v3-cmdh-pausa:hover {
	border-color: var(--v3-line-strong);
	color: var(--v3-ink);
}
.v3-cmdh-pausa-ico {
	display: block;
	width: 14px;
	height: 14px;
	flex: none;
	fill: currentColor;
}
/* Duas barras enquanto roda, um triangulo quando esta parado. O rotulo e a
   fonte da verdade (o JS troca o textContent); isto so impede que o icone
   minta enquanto o texto ja mudou. O palco vem ANTES do rodape na marcacao,
   entao o combinador de irmao alcanca. */
.v3-cmdh-pausa-ico-b { display: none; }
.v3-cmdh-palco.is-parado ~ .v3-cmdh-rodape .v3-cmdh-pausa-ico-a { display: none; }
.v3-cmdh-palco.is-parado ~ .v3-cmdh-rodape .v3-cmdh-pausa-ico-b { display: block; }

/* --------------------------------------------------------------------------
   Encenacao. Tudo daqui para baixo so vale sob .is-rodando, que o JS poe no
   primeiro quadro bem-sucedido e nunca tira (nem na pausa: o ultimo estado
   aplicado permanece e a cena congela coerente).
   -------------------------------------------------------------------------- */

/* Sob .is-rodando o aviso deixa de ser o cartao do rodape e passa a ser a tela
   inteira. A TROCA DE TAMANHO NUNCA E TRANSICIONADA: "auto" nao interpola, e
   inset: auto 12px 12px auto contra inset: 0 sao dois posicionamentos
   diferentes, nao dois valores do mesmo. So a opacidade transiciona. */
.v3-cmdh-palco.is-rodando .v3-cmdh-conf {
	inset: 0;
	max-width: none;
	flex-direction: column;
	justify-content: center;
	gap: 16px;
	/* Folga lateral menor que a vertical de proposito: no ponto mais apertado
	   em que os 56px ainda valem (viewport 1001, tela de tablet com 643,9px) a
	   frase medida em Archivo wdth 110 da 582,6px, e com 24px de cada lado
	   sobravam 13px. O corpo e da especificacao e nao se mexe; a folga e que
	   cede. */
	padding: 24px 18px;
	background: var(--v3-demo-bg);
	border: 0;
	border-radius: 0;
	text-align: center;
	opacity: 0;
	/* SEM transicao aqui, e isto e o remendo de um defeito visto no navegador.
	   A pose parada tem o aviso VISIVEL (pequeno), entao a chegada do
	   .is-rodando muda a opacidade de 1 para 0: com transicao, a peca abria
	   com o "Comandos enviados" em tela cheia se dissolvendo por 0,30s, ou
	   seja, mostrando o desfecho antes do comeco. Quem carrega a transicao sao
	   as fases: a de entrada esta no is-t5 e a de saida no is-t7 e is-t8. Nas
	   demais nao ha o que transicionar, porque o aviso ja esta apagado. */
	transition: none;
}

/* Trava de um quadro, posta e tirada pelo JS na primeira entrada em cena e em
   toda retomada. Sem ela o palco sai da pose COMPLETA para a fase 0, que e o
   oposto dela, e o navegador dispara quinze transicoes de uma vez: o visitante
   via a gaveta descendo, o "Online" voltando para "Nao conectado" e o veiculo
   encolhendo no mapa, ou seja, o desfecho sendo desmontado antes do comeco.
   NAO pode morar no .is-t0, porque o t0 tambem e alcancado vindo do t10 e ali
   as marcas de selecao tem de apagar em 220ms, por projeto.
   Sem !important: o seletor de duas classes (0,2,0) ja vence as transicoes de
   elemento (0,1,0), que sao as unicas em disputa. */
.v3-cmdh-palco.is-mudo,
.v3-cmdh-palco.is-mudo * { transition: none; }

.v3-cmdh-palco.is-rodando .v3-cmdh-conf-ico { width: 30px; height: 30px; }
.v3-cmdh-palco.is-rodando .v3-cmdh-conf-txt { gap: 10px; justify-items: center; }
.v3-cmdh-palco.is-rodando .v3-cmdh-conf-tit { font-size: var(--v3-cmdh-fs-conf); }
.v3-cmdh-palco.is-rodando .v3-cmdh-conf-sub { font-size: 14px; }
.v3-cmdh-palco.is-rodando.is-t5 .v3-cmdh-conf,
.v3-cmdh-palco.is-rodando.is-t6 .v3-cmdh-conf { opacity: 1; transition: opacity .26s ease; }
.v3-cmdh-palco.is-rodando.is-t7 .v3-cmdh-conf,
.v3-cmdh-palco.is-rodando.is-t8 .v3-cmdh-conf { opacity: 0; transition: opacity .30s ease; }

/* A linha de apoio troca sozinha, sem mexer no layout. */
.v3-cmdh-palco.is-rodando.is-t5 .v3-cmdh-conf-sub-a { opacity: 1; }
.v3-cmdh-palco.is-rodando.is-t5 .v3-cmdh-conf-sub-b { opacity: 0; }

/* Marca de selecao: apagada so na primeira fase. Ate a v3.6.9 eram duas, e a
   segunda acendia com atraso para as duas nao lerem como um piscar unico;
   desde a v3.6.10 a encenacao escolhe UM rastreador, entao o atraso saiu
   junto com a segunda marca. */
.v3-cmdh-palco.is-rodando.is-t0 .v3-cmdh-check svg { opacity: 0; }

/* Folha fechada nas duas primeiras fases e de novo na ultima, que e a virada
   do laco. */
.v3-cmdh-palco.is-rodando.is-t0 .v3-cmdh-folha,
.v3-cmdh-palco.is-rodando.is-t1 .v3-cmdh-folha,
.v3-cmdh-palco.is-rodando.is-t10 .v3-cmdh-folha {
	transform: translateY(100%);
	opacity: 0;
}

/* Os valores chegam apagados e acendem: e o gesto de "escolher o modelo e a
   operadora" sem cursor desenhado. */
.v3-cmdh-palco.is-rodando.is-t0 .v3-cmdh-valor,
.v3-cmdh-palco.is-rodando.is-t1 .v3-cmdh-valor,
.v3-cmdh-palco.is-rodando.is-t2 .v3-cmdh-valor { opacity: .35; }

/* O clique. O anel e rgba(241, 96, 0, .18) cravado e NAO --v3-brand-soft: o
   token vale .10 no claro e .16 no escuro, e a mesma batida dentro de uma tela
   que e escura nos dois temas teria peso diferente em cada um. Isto nao e uma
   excecao nova a direcao, e a correcao de uma que ja esta no ar na secao 12. */
.v3-cmdh-palco.is-rodando.is-t4 .v3-cmdh-enviar {
	transform: scale(.94);
	box-shadow: 0 0 0 5px rgba(241, 96, 0, .18);
}

.v3-cmdh-palco.is-rodando.is-t5 .v3-cmdh-toast,
.v3-cmdh-palco.is-rodando.is-t6 .v3-cmdh-toast { opacity: 1; }

/* Rodape de estado: vermelho ate o comando sair, ambar enquanto espera
   posicao, verde quando o veiculo responde. */
.v3-cmdh-palco.is-rodando .v3-cmdh-dot { background: var(--v3-demo-alert); }
.v3-cmdh-palco.is-rodando .v3-cmdh-est--off { opacity: 1; }
.v3-cmdh-palco.is-rodando .v3-cmdh-est--on  { opacity: 0; }
.v3-cmdh-palco.is-rodando.is-t7 .v3-cmdh-dot { background: var(--v3-demo-warn); }
.v3-cmdh-palco.is-rodando.is-t7 .v3-cmdh-est--off { opacity: 0; }
.v3-cmdh-palco.is-rodando.is-t7 .v3-cmdh-est--espera { opacity: 1; }
.v3-cmdh-palco.is-rodando.is-online .v3-cmdh-dot { background: var(--v3-demo-ok); }
.v3-cmdh-palco.is-rodando.is-online .v3-cmdh-est--off { opacity: 0; }
.v3-cmdh-palco.is-rodando.is-online .v3-cmdh-est--on  { opacity: 1; }

/* A velocidade so troca uma batida DEPOIS do veiculo aparecer: primeiro ele
   existe, depois ele anda. */
.v3-cmdh-palco.is-rodando .v3-cmdh-kmh-a { opacity: 1; }
.v3-cmdh-palco.is-rodando .v3-cmdh-kmh-b { opacity: 0; }
.v3-cmdh-palco.is-rodando.is-t9 .v3-cmdh-kmh-a,
.v3-cmdh-palco.is-rodando.is-t10 .v3-cmdh-kmh-a { opacity: 0; }
.v3-cmdh-palco.is-rodando.is-t9 .v3-cmdh-kmh-b,
.v3-cmdh-palco.is-rodando.is-t10 .v3-cmdh-kmh-b { opacity: 1; }

/* O pino do mapa desenhado. As regras valem mesmo quando existe video, e isso
   e de proposito: o <video> fica POR CIMA do mapa, entao no caminho com video
   elas nao aparecem, e no meio segundo entre o play e o primeiro quadro o
   desenho ja esta contando a historia certa em vez de mostrar o veiculo antes
   da hora. */
.v3-cmdh-palco.is-rodando .v3-cmdh-pino { opacity: 0; }
.v3-cmdh-palco.is-rodando .v3-cmdh-pino circle { transform: scale(.4); }
.v3-cmdh-palco.is-rodando.is-online .v3-cmdh-pino { opacity: 1; }
.v3-cmdh-palco.is-rodando.is-online .v3-cmdh-pino circle { transform: scale(1); }

/* Video. As duas classes tem a mesma especificidade (0,2,0): quem decide e a
   ORDEM, entao .is-sem-video precisa continuar embaixo. */
.v3-cmdh-palco.is-video .v3-cmdh-video { opacity: 1; }
.v3-cmdh-palco.is-sem-video .v3-cmdh-video { opacity: 0; }

/* --------------------------------------------------------------------------
   Cortes. Nenhum ponto de quebra novo: os mesmos 1000px e 720px do arquivo.
   -------------------------------------------------------------------------- */

@media (max-width: 1000px) {
	.v3-cmdh-palco {
		--v3-cmdh-bf: 8px;
		--v3-cmdh-bt: 12px;
		--v3-cmdh-rod: 27px;
		--v3-cmdh-fs-status: 9px;
		--v3-cmdh-fs-appbar: 11.5px;
		--v3-cmdh-fs-label: 10px;
		--v3-cmdh-fs-valor: 12px;
		--v3-cmdh-fs-nome: 11px;
		--v3-cmdh-fs-btn: 11.5px;
		--v3-cmdh-fs-est: 10.5px;
		--v3-cmdh-fs-conf: 40px;
	}
	.v3-cmdh-fone { border-radius: 30px; }
	.v3-cmdh-fone-tela { border-radius: 23px; }
	.v3-cmdh-lista { gap: 5px; padding: 7px; }
	/* Mesmo layout de duas linhas do bloco de 720, e pelo mesmo motivo: neste
	   degrau a coluna de texto do PRIMEIRO cartao (o unico que carrega o meta
	   de velocidade) fica com 30px e corta "Ford Ka" em "Fo..." e "ABC-1234"
	   em "AB...". Os outros dois nao sofrem porque o meta deles e vazio, e por
	   isso nao abre a segunda linha. */
	.v3-cmdh-item {
		display: grid;
		grid-template-columns: auto minmax(0, 1fr);
		align-items: center;
		column-gap: 6px;
		row-gap: 1px;
		padding: 6px 7px;
	}
	.v3-cmdh-check { grid-row: 1 / span 2; }
	.v3-cmdh-item-txt { grid-column: 2; }
	.v3-cmdh-item-meta { grid-column: 2; margin-left: 0; }
	.v3-cmdh-folha { gap: 7px; padding: 9px; }
	.v3-cmdh-conf { inset: auto 10px 10px auto; max-width: calc(100% - 20px); padding: 8px 10px; }
	.v3-cmdh-palco.is-rodando .v3-cmdh-conf { inset: 0; padding: 20px; gap: 13px; }
}

/* Empilhado. O tablet toma a largura toda e o telefone fica PENDURADO embaixo,
   ancorado a esquerda, cobrindo so o canto inferior esquerdo do mapa: sobra de
   82% a 90% da area. Transpor o arranjo lado a lado para o celular deixaria o
   telefone atravessado no meio do mapa e so 65% dele visivel. */
@media (max-width: 720px) {
	/* O teto sobe do palco para o conjunto: com ele so na demonstracao, entre
	   510 e 720px o tablet ficava recuado 106px enquanto a legenda e o botao de
	   pausa iam de ponta a ponta do wrap. Agora a peca inteira e uma figura
	   centrada. */
	.v3-cmdh { margin-top: 32px; max-width: 460px; margin-left: auto; margin-right: auto; }
	/* Repetido aqui porque o .v3-cmd-hero--faixa mora fora de media query, com
	   a mesma especificidade do bloco movel da secao 14 e cinco mil linhas
	   depois dele: sem esta linha o hub fica com o respiro de desktop no
	   celular e a proxima mudanca do bloco de 720 continua sem efeito nesta
	   hero. E a armadilha do "o que se declara depois ganha", com o sinal
	   invertido. */
	.v3-cmd-hero--faixa { padding: 48px 0 56px; }
	.v3-cmdh-palco {
		--v3-cmdh-bf: 8px;
		--v3-cmdh-bt: 10px;
		--v3-cmdh-rod: 25px;
		--v3-cmdh-fs-appbar: 11px;
		--v3-cmdh-fs-label: 9.5px;
		--v3-cmdh-fs-valor: 11px;
		/* 10px, e nao os 10,5 de antes: "KIA SPORTAGE" mede 76px em 10,5 e a
		   coluna do nome oferece 75 num aparelho de 375, ou seja, o nome do
		   veiculo que a encenacao inteira gira em torno saia com reticencia
		   por um pixel. Em 10px ele mede 72,4 e entra com folga. */
		--v3-cmdh-fs-nome: 10px;
		--v3-cmdh-fs-btn: 11px;
		--v3-cmdh-fs-est: 10px;
		--v3-cmdh-fs-conf: 26px;
		grid-template-columns: minmax(0, 1fr);
		column-gap: 0;
		align-items: start;
	}
	/* Contexto de empilhamento proprio para o tablet. Sem ele o aviso de tela
	   cheia (.v3-cmdh-conf sob .is-rodando, z-index 2) escapa para o contexto
	   do palco, empata com o z-index 2 do telefone e ganha por vir depois no
	   DOM: o telefone ficava decapitado por 2,4s a cada volta. O
	   .v3-cmdh-tab-tela nao segura o aviso porque position: relative com
	   z-index auto NAO abre contexto. */
	.v3-cmdh-tab { grid-column: 1; grid-row: 1; position: relative; z-index: 1; }
	.v3-cmdh-fone {
		grid-column: 1;
		/* Linha propria: a margem negativa encolhe a LINHA, e o palco fica com
		   a altura certa. Na mesma linha do tablet ela nao encolheria nada. */
		grid-row: 2;
		justify-self: start;
		position: relative;
		z-index: 2;
		width: 42%;
		max-width: 156px;
		margin-top: -104px;
		border-radius: 26px;
	}
	.v3-cmdh-fone-tela { border-radius: 19px; }
	/* Sobram dois veiculos, um campo e o botao: e o que cabe em 121px de tela
	   sem virar tipografia de 8px. Classe DOBRADA nos dois modificadores de
	   proposito: o .v3-cmdh-item logo abaixo redeclara display para grid e tem
	   a mesma especificidade (0,1,0), e no empate ganha quem vem depois, entao
	   o item extra voltava a aparecer e empurrava o segundo veiculo para tras
	   da folha. */
	.v3-cmdh-item.v3-cmdh-item--extra,
	.v3-cmdh-campo.v3-cmdh-campo--extra,
	.v3-cmdh-status-rede { display: none; }
	.v3-cmdh-status { padding: 5px 9px 2px; }
	.v3-cmdh-appbar { padding: 3px 8px 6px; }
	.v3-cmdh-lista { gap: 5px; padding: 6px; }
	/* Medido: numa tela de 121px sobravam 26px para o nome do veiculo, com
	   "Ford Ka" cortado em "Fo...". A velocidade desce para a linha da placa,
	   que e o unico lugar onde ela cabe sem encolher a tipografia: com a
	   coluna do texto em 77px, "Fiat Strada" (53,6px), "BRA-2E19" (46,8px) e
	   "32 km/h" (43,2px) entram inteiros. A marca de selecao atravessa as duas
	   linhas para continuar centrada no cartao. */
	.v3-cmdh-item {
		display: grid;
		grid-template-columns: auto minmax(0, 1fr);
		align-items: center;
		column-gap: 6px;
		row-gap: 1px;
		padding: 5px 6px;
	}
	.v3-cmdh-check { grid-row: 1 / span 2; }
	.v3-cmdh-item-txt { grid-column: 2; }
	.v3-cmdh-item-meta { grid-column: 2; margin-left: 0; }
	/* O nome do veiculo pode QUEBRAR neste degrau, em vez de sair com
	   reticencia. Em 375 "KIA SPORTAGE" cabe numa linha por 0px de folga, entao
	   a quebra so acontece de 359 para baixo, onde a coluna tem 52px e nenhum
	   corpo legivel faria o nome caber inteiro. Duas linhas dizem o nome; a
	   reticencia esconde metade dele, e e justamente o veiculo que a encenacao
	   inteira acompanha ate o mapa. */
	.v3-cmdh-item-nome { white-space: normal; overflow-wrap: anywhere; }
	.v3-cmdh-item-placa { font-size: 9px; }
	.v3-cmdh-kmh-a,
	.v3-cmdh-kmh-b { font-size: 9.5px; }
	.v3-cmdh-folha { gap: 6px; padding: 8px; border-radius: 11px 11px 0 0; }
	/* 6px de folga lateral, e nao 8: "Enviar comandos" mede 88,1px em 11px e a
	   folha deixa 89,3px com o padding de 8, ou seja, quebrava em duas linhas
	   por 1,2px. O nowrap e a garantia de que uma copy maior corte em vez de
	   crescer. */
	.v3-cmdh-enviar { padding: 6px; white-space: nowrap; }
	/* 6px de folga e 5px de vao: "Aguardando posição" mede 94,8px em 10px e o
	   rodape so oferecia 92,3px com o padding de 8, entao a palavra saia pela
	   direita da tela sem nenhum aviso (o .v3-cmdh-est tem nowrap). */
	.v3-cmdh-rodape-fone { padding: 0 6px; gap: 5px; }
	/* Mesma conta no toast: 84px de texto contra 80,3px de espaco. Aqui o que
	   cede e o icone e o vao, nao o corpo. */
	.v3-cmdh-toast { left: 4px; right: 4px; top: 30%; font-size: 9px; padding: 5px 4px; gap: 4px; white-space: nowrap; }
	.v3-cmdh-toast-ico svg { width: 10px; height: 10px; }
	/* Canto de CIMA no empilhado: aqui o telefone entra pelo canto inferior
	   esquerdo, entao um cartao ancorado embaixo vai ao encontro dele. Em
	   360px ele cruzava o telefone, o pino e a pastilha ao mesmo tempo. */
	.v3-cmdh-conf { inset: 8px 8px auto auto; max-width: calc(100% - 16px); padding: 7px 9px; gap: 7px; }
	.v3-cmdh-conf-ico { width: 15px; height: 15px; }
	.v3-cmdh-conf-tit { font-size: 13px; }
	.v3-cmdh-conf-sub { font-size: 10.5px; }
	/* Os 104px sao a propria margin-top negativa do telefone, logo acima: o
	   aviso para onde o telefone comeca, em vez de ficar ATRAS dele. So o
	   contexto de empilhamento nao bastava, porque metade da frase ficaria
	   escondida atras da moldura. Com o aviso mais baixo o corpo tambem tem de
	   ceder: o conteudo media 130,6px numa caixa de 126,3. */
	.v3-cmdh-palco.is-rodando .v3-cmdh-conf { inset: 0 0 104px; padding: 16px; gap: 11px; }
	.v3-cmdh-palco.is-rodando .v3-cmdh-conf-ico { width: 22px; height: 22px; }
	.v3-cmdh-palco.is-rodando .v3-cmdh-conf-sub { font-size: 13px; }
	.v3-cmdh-rodape {
		margin-top: 16px;
		align-items: flex-start;
		flex-direction: column;
	}
}

/* Movimento reduzido. O JS nao poe .is-rodando, entao a peca ja fica na pose
   parada, que conta a historia inteira; isto aqui so garante que nada
   transicione se a pessoa DESTRAVAR a demonstracao pelo botao (gesto explicito
   vence preferencia do sistema) e que a peca continue legivel, nunca vazia. */
@media (prefers-reduced-motion: reduce) {
	.v3-cmdh-check svg,
	.v3-cmdh-troca > span,
	.v3-cmdh-folha,
	.v3-cmdh-valor,
	.v3-cmdh-enviar,
	.v3-cmdh-toast,
	.v3-cmdh-conf,
	.v3-cmdh-dot,
	.v3-cmdh-pino,
	.v3-cmdh-pino circle,
	.v3-cmdh-video,
	.v3-cmdh-pausa { transition: none; }
}


/* === header === */
/* --------------------------------------------------------------------------
   Header flutuante (assets/js/v3.js poe as classes; o visual e todo daqui).

   Repouso ..... barra fixa de ponta a ponta, borda fina embaixo.
   --float ..... desprende: o miolo (.sl-header-inner) vira um cartao
                 arredondado com borda e sombra, 10px abaixo do topo, e a
                 casca (.sl-header) fica transparente com pointer-events
                 none para nao bloquear cliques em volta do cartao.
   --slim ...... o cartao encolhe (68 -> 52px) descendo e cresce subindo.

   A casca tem ALTURA FIXA de 69px em todos os estados: o desprender e feito
   por transform/width, que nao mexem em layout, entao o conteudo da pagina
   nunca da tranco. Este bloco PRECISA ser o ultimo do arquivo: os empates
   de !important com a secao 3 sao decididos pela ordem.
   -------------------------------------------------------------------------- */

/* Casca: altura constante e transicao das cores. */
.sl-header,
.sl-header.is-scrolled,
[data-theme="light"] .sl-header,
[data-theme="light"] .sl-header.is-scrolled {
	height: 69px;
	transition: background-color .3s ease, border-color .3s ease !important;
}

/* A pilula flutuante ANTIGA do main-final (border-radius 999px + blur) vive
   em [data-theme=light] .sl-header.is-scrolled .sl-header-inner; a secao 3 ja
   a neutraliza, e os seletores acima e abaixo carregam .is-scrolled junto
   para nunca perderem a disputa quando o main.js poe a classe. */
.sl-header.v3-header--float,
.sl-header.v3-header--float.is-scrolled,
[data-theme="light"] .sl-header.v3-header--float,
[data-theme="light"] .sl-header.v3-header--float.is-scrolled {
	background: transparent !important;
	border-bottom-color: transparent !important;
	pointer-events: none;
}

/* Miolo: a transicao unica e bem amortecida que faz o "desprender" premium. */
.sl-header .sl-header-inner,
.sl-header.is-scrolled .sl-header-inner,
[data-theme="light"] .sl-header.is-scrolled .sl-header-inner {
	position: relative;
	width: 100%;
	pointer-events: auto;
	transition:
		width .38s cubic-bezier(.33, 1, .36, 1),
		min-height .38s cubic-bezier(.33, 1, .36, 1),
		transform .38s cubic-bezier(.33, 1, .36, 1),
		border-radius .38s cubic-bezier(.33, 1, .36, 1),
		background-color .3s ease,
		border-color .3s ease,
		box-shadow .3s ease !important;
}

.sl-header.v3-header--float .sl-header-inner,
.sl-header.v3-header--float.is-scrolled .sl-header-inner,
[data-theme="light"] .sl-header.v3-header--float .sl-header-inner,
[data-theme="light"] .sl-header.v3-header--float.is-scrolled .sl-header-inner {
	width: min(100% - 32px, 1148px);
	transform: translateY(10px);
	background: var(--v3-card) !important;
	border: 1px solid var(--v3-line) !important;
	border-radius: 14px !important;
	box-shadow: 0 10px 30px rgba(17, 24, 39, .10) !important;
}
:root:not([data-theme="light"]) .sl-header.v3-header--float .sl-header-inner {
	box-shadow: 0 10px 30px rgba(0, 0, 0, .5) !important;
}

/* Encolhe descendo, cresce subindo. */
.sl-header.v3-header--slim .sl-header-inner,
.sl-header.v3-header--slim.is-scrolled .sl-header-inner,
[data-theme="light"] .sl-header.v3-header--slim .sl-header-inner,
[data-theme="light"] .sl-header.v3-header--slim.is-scrolled .sl-header-inner {
	min-height: 52px !important;
}

/* Logo e marca de fallback acompanham a altura. Os seletores com is-scrolled
   empatam com o bloco 8 (que fixa 36px) e vencem por ordem. */
.sl-header .sl-brand-logo,
.sl-header.is-scrolled .sl-brand-logo,
.sl-header .sl-brand-lockup img,
.sl-header.is-scrolled .sl-brand-lockup img,
.sl-header .sl-brand-mark,
.sl-header.is-scrolled .sl-brand-mark {
	transition: height .38s cubic-bezier(.33, 1, .36, 1);
}
.sl-header.v3-header--slim .sl-brand-logo,
.sl-header.v3-header--slim .sl-brand-lockup img,
.sl-header.v3-header--slim .sl-brand-mark {
	height: 28px;
}

/* No celular o cartao flutua com folga menor. */
@media (max-width: 720px) {
	.sl-header.v3-header--float .sl-header-inner,
	.sl-header.v3-header--float.is-scrolled .sl-header-inner,
	[data-theme="light"] .sl-header.v3-header--float .sl-header-inner,
	[data-theme="light"] .sl-header.v3-header--float.is-scrolled .sl-header-inner {
		width: calc(100% - 20px);
		transform: translateY(8px);
		border-radius: 12px !important;
	}
}

/* Os estados continuam sendo aplicados pelo JS; so a animacao some. */
@media (prefers-reduced-motion: reduce) {
	.sl-header,
	.sl-header.is-scrolled,
	[data-theme="light"] .sl-header,
	[data-theme="light"] .sl-header.is-scrolled,
	.sl-header .sl-header-inner,
	.sl-header.is-scrolled .sl-header-inner,
	[data-theme="light"] .sl-header.is-scrolled .sl-header-inner,
	.sl-header .sl-brand-logo,
	.sl-header.is-scrolled .sl-brand-logo,
	.sl-header .sl-brand-lockup img,
	.sl-header.is-scrolled .sl-brand-lockup img,
	.sl-header .sl-brand-mark,
	.sl-header.is-scrolled .sl-brand-mark {
		transition: none !important;
	}
}
