/* ============================================================================ * InfoMeteo — app.css (consolidado) * ============================================================================ * Contém todos os estilos usados em home e em páginas de cidade/subdivisão. * As regras estão em 3 blocos sequenciais. Selectors compartilhados (~380 * linhas de :root vars + tipografia base) aparecem idênticos em [home] e * [city]; a cascata resolve sem conflito. Selectors específicos de cada * página (.hp-*, .hero-city-*, .aqp-*, etc.) só matcham nas suas views. * * Ordem intencional: * 1. home — primeiro (aplica em todas as páginas, sobrepujado por city * em city-page scope quando há conflito real) * 2. city — segundo (overrides pra views de cidade) * 3. pwa-banner — último (componente isolado, compartilhado home+city) * ============================================================================ */ === HOME === /* ============================================================================ * BLOCO 1 — HOME * ============================================================================ */ /* TEMA CLARO — azul céu + branco */ :root{--bg:#9ec4df;--text:#1a3a52;--muted:#5a8aaa;--muted2:#7aaac4;--accent:#3aa8e8;--accent2:#0e7abf;--radius:16px;--shadow:0 10px 30px rgba(14,122,191,.14);--c-max:rgba(220,60,50,.90);--c-min:rgba(47,128,255,.85);--c-max-solid:#e33b30;--c-min-solid:#2f80ff} *{box-sizing:border-box} html,body{height:100%} body{ margin:0; background: radial-gradient(1200px 900px at 70% -10%, rgba(58,168,232,.18), transparent 60%), radial-gradient(900px 700px at 10% 0%, rgba(255,255,255,.15), transparent 55%), var(--bg); color:var(--text); font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif; -webkit-font-smoothing:antialiased; -moz-osx-font-smoothing:grayscale; } body::before{ content:""; position: fixed; inset: 0; z-index: -1; pointer-events: none; background: radial-gradient(1200px 900px at 70% -10%, rgba(58,168,232,.18), transparent 60%), radial-gradient(900px 700px at 10% 0%, rgba(255,255,255,.15), transparent 55%), var(--bg); } .app-shell{min-height:100%;display:flex;justify-content:center;padding:0px 14px 22px} .app{ width:100%;max-width:420px;border-radius:20px;overflow:hidden; background:rgba(255,255,255,.60); border:1px solid rgba(58,168,232,.18); box-shadow:var(--shadow) } .app-header{ position:sticky;top:0;z-index:30; background:transparent; backdrop-filter:blur(10px); border-bottom:1px solid rgba(58,168,232,.16); padding:14px 14px 12px } .header-logo{display:flex;justify-content:center;padding:10px 0px 0px;width:100%;} .header-logo a{display:inline-flex;align-items:center;} .site-logo{height:110px;width:auto;display:block;} .header-top{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px} .location{display:flex;align-items:center;gap:10px;min-width:0} .loc-icon{ width:22px;height:38px;display:block;border-radius:12px; background-color:#7eabca; -webkit-mask-image:url('https://infometeo.com/assets/svg/ic-local.svg'); mask-image:url('https://infometeo.com/assets/svg/ic-local.svg'); -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat; -webkit-mask-position:center;mask-position:center; -webkit-mask-size:contain;mask-size:contain; opacity:.99; } .loc-city{font-weight:700;font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .loc-sub{font-size:12px;color:var(--muted)} /* ===== UNIT SWITCHES BAR ===== */ .unit-switches{display:flex;align-items:center;justify-content:center;gap:10px;padding:6px 14px 2px;flex-wrap:wrap} .uswitch{position:relative;display:inline-flex;align-items:center;height:30px;border-radius:999px;background:rgba(58,168,232,.13);border:1.5px solid rgba(58,168,232,.18);overflow:hidden;cursor:pointer;-webkit-user-select:none;user-select:none;padding:0 3px} .uswitch-opt{position:relative;z-index:1;display:flex;align-items:center;justify-content:center;height:22px;padding:0 9px;font-size:11px;font-weight:800;letter-spacing:.03em;color:var(--muted);transition:color .2s ease;white-space:nowrap;border-radius:999px} .uswitch-opt.is-active{color:var(--accent2)} .uswitch-pill{position:absolute;height:22px;border-radius:999px;background:rgba(58,168,232,.22);border:1px solid rgba(14,122,191,.25);transition:left .25s ease,width .25s ease;pointer-events:none} .page-h1{ margin: 0 0 10px 0; font-size: 16px; line-height: 1.25; font-weight: 900; letter-spacing: .2px; color: rgba(26,58,82,.95); text-align: center; } .page-h1-sub{ margin: 0 0 14px 0; font-size: 12px; color: rgba(26,58,82,.65); text-align: center; } .suggest-loading{ padding: 12px; display: flex; align-items: center; gap: 10px; color: rgba(26,58,82,.75); font-size: 12px; } .suggest-spinner{ width: 16px; height: 16px; border-radius: 999px; border: 2px solid rgba(58,168,232,.20); border-top-color: rgba(14,122,191,.95); animation: suggestSpin .75s linear infinite; flex: 0 0 auto; } @keyframes suggestSpin{ to { transform: rotate(360deg); } } .search{display:flex;gap:10px} .search-wrap{ position:relative; flex:1; } .search-wrap::before{ content:""; position:absolute; right:12px; top:50%; transform:translateY(-50%); width:18px;height:18px; background-color: rgba(90,138,170,.55); -webkit-mask-image: url('https://infometeo.com/assets/svg/ic-search.svg'); mask-image: url('https://infometeo.com/assets/svg/ic-search.svg'); -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat; -webkit-mask-position:center;mask-position:center; -webkit-mask-size:contain;mask-size:contain; pointer-events:none; opacity:.95; transition: opacity .12s ease; } .search-wrap:focus-within::before{ opacity:0; pointer-events:none; } .search-input{ flex:1;height:42px;border-radius:14px;border:0px solid rgba(58,168,232,.22); background:rgba(255,255,255,.70);color:var(--text); padding:0 12px;padding-right:42px; font-size:16px; outline:none; transition: background .12s ease, border-color .12s ease, box-shadow .12s ease; } .search-input:focus{ background: rgba(255,255,255,.92); border-color: rgba(58,168,232,.22); box-shadow: 0 0 0 3px rgba(58, 168, 232, 0.32); } .search-input::placeholder{color:rgba(90,138,170,.75)} .search-wrap.has-value::before{ opacity:0; pointer-events:none; } .search-input::-webkit-search-cancel-button{ -webkit-appearance:none; display:none; } .search-input::-ms-clear{ display:none; } .search-clear{ position:absolute; right:10px; top:50%; transform:translateY(-50%); width:26px; height:26px; border:none; background:transparent; color:rgba(14,122,191,.75); display:none; align-items:center; justify-content:center; cursor:pointer; padding:0; border-radius:50%; transition: color .15s ease, background .15s ease; } .search-clear:hover{ color:rgba(14,122,191,1); background:rgba(14,122,191,.10); } .search-clear.is-visible{ display:flex; } .gps-btn{ flex:0 0 auto; width:42px;height:42px; border:none;border-radius:14px; background:rgba(255,255,255,.70); color:rgba(90,138,170,.75); display:flex;align-items:center;justify-content:center; cursor:pointer; transition: background .15s ease, color .15s ease; } .gps-btn svg{ width:22px; height:22px; } .gps-btn:hover{ background:rgba(255,255,255,.92); color:rgba(14,122,191,.85); } .gps-btn.is-loading{ pointer-events:none; opacity:.6; } .gps-btn.is-loading svg{ animation: gpsSpin .8s linear infinite; } @keyframes gpsSpin{ to{ transform:rotate(360deg); } } .gps-wrap{ position:relative; flex:0 0 auto; } .gps-tooltip{ position:absolute; bottom:calc(100% + 10px); right:0; white-space:nowrap; font-size:11px; font-weight:600; color:rgba(26,58,82,.88); background:#e8f6ff; border:1px solid rgba(58,168,232,.22); border-radius:10px; padding:6px 10px; box-shadow:0 4px 16px rgba(14,122,191,.14); pointer-events:none; opacity:1; transform:translateY(0); } .gps-tooltip::after{ content:""; position:absolute; top:100%; right:13px; border:5px solid transparent; border-top-color:#e8f6ff; filter:drop-shadow(0 1px 0 rgba(58,168,232,.22)); } .gps-wrap .gps-tooltip{ opacity:1; transform:translateY(0); animation: gpsFloat 2.4s ease-in-out infinite; } @keyframes gpsFloat{ 0%,100%{ transform:translateY(0); } 50%{ transform:translateY(-3px); } } .gps-toast{ overflow:hidden; max-height:0; opacity:0; transition: max-height 0.4s cubic-bezier(.4,0,.2,1), opacity 0.3s ease, margin 0.4s ease; margin:0; } .gps-toast.is-visible{ max-height:60px; opacity:1; margin-top:8px; } .gps-toast-inner{ font-size:12px; line-height:1.4; padding:10px 14px; border-radius:12px; background:rgba(220,70,60,.10); border:1px solid rgba(220,70,60,.22); color:rgba(160,40,30,.9); } /* ============================================================================ * SELETOR DE PAÍS (country switcher) — irmão visual do .gps-btn * ---------------------------------------------------------------------------- * Botão quadrado com a bandeira do país atual, posicionado À DIREITA do botão * de localização (.gps-btn). Reusa EXATAMENTE os tokens do .gps-btn — mesmo * tamanho, raio, fundo e override >=768px — para parecer o mesmo controle. * * O CONTEÚDO (lista de países "atualmente presentes" + bandeiras) é injetado * pela Seção 8 do /assets/app-br.js dentro de #countryMenu, e a bandeira ativa * é definida em .country-flag. Aqui ficam só os estilos. * ========================================================================== */ .country-wrap{ position:relative; flex:0 0 auto; } .country-btn{ flex:0 0 auto; width:42px;height:42px; /* == .gps-btn */ border:none;border-radius:14px; /* == .gps-btn */ background:rgba(255,255,255,.70); /* == .gps-btn */ color:rgba(90,138,170,.75); display:flex;align-items:center;justify-content:center; cursor:pointer;overflow:hidden;padding:0; transition: background .15s ease, color .15s ease, box-shadow .15s ease; } .country-btn:hover{ background:rgba(255,255,255,.92); } .country-btn:focus-visible{ outline:none; box-shadow:0 0 0 3px rgba(58,168,232,.32); } .country-btn[aria-expanded="true"]{ background:rgba(255,255,255,.92); } /* Bandeira do país ativo. object-fit:cover preserva a proporção real da bandeira sem distorcer; o chip arredondado dá o acabamento do app. */ .country-flag{ width:26px;height:26px;border-radius:7px; object-fit:cover;display:block; box-shadow:0 0 0 1px rgba(14,122,191,.18); } /* Painel dropdown — herda a linguagem visual do .suggest */ .country-menu{ position:absolute;top:calc(100% + 8px);right:0;z-index:99999; min-width:184px;padding:6px; background:rgba(240,250,255,.98); border:1px solid rgba(58,168,232,.20); border-radius:14px; box-shadow:0 18px 40px rgba(14,122,191,.18); display:none; } .country-menu.is-open{ display:block; } .country-item{ width:100%;display:flex;align-items:center;gap:10px; padding:9px 10px;border:none;border-radius:10px; background:transparent;color:var(--text); font-size:13px;font-weight:600;line-height:1.2; text-align:left;cursor:pointer;text-decoration:none; transition: background .12s ease, color .12s ease; } .country-item:hover{ background:rgba(58,168,232,.12); } .country-item.is-active{ background:rgba(58,168,232,.18); color:var(--accent2); } .country-item .flag{ width:24px;height:24px;flex:0 0 auto;border-radius:6px; object-fit:cover;display:block; box-shadow:0 0 0 1px rgba(14,122,191,.15); } @media (min-width: 768px){ .country-btn{ width:54px;height:54px;border-radius:16px; } /* == .gps-btn >=768 */ .country-flag{ width:30px;height:30px;border-radius:8px; } } /* ============================================================================ * UNIDADE DE TEMPERATURA (°F / °C) — hooks por idioma + um geral * ---------------------------------------------------------------------------- * "um seletor geral" -> .uswitch[data-switch="units"] (vale p/ todos) * "um seletor pra cada idioma" -> html[lang|="xx"] .uswitch[data-switch="units"] * (sobrescreve apenas naquele idioma; o e emitido pelo PHP). * * O geral define a aparencia base via a custom property --units-accent; cada * bloco de idioma e um ponto de extensao pronto — por padrao nao muda nada, * mas voce pode redefinir --units-accent (ou regras proprias) para diferenciar * o controle de °F em cada idioma. [lang|="en"] casa "en" e "en-US". * ========================================================================== */ .uswitch[data-switch="units"]{ --units-accent: var(--accent2); } .uswitch[data-switch="units"] .uswitch-opt.is-active{ color: var(--units-accent); } html[lang|="pt"] .uswitch[data-switch="units"]{ /* PT */ } html[lang|="en"] .uswitch[data-switch="units"]{ /* EN — °F e o default imperial */ } html[lang|="es"] .uswitch[data-switch="units"]{ /* ES */ } html[lang|="fr"] .uswitch[data-switch="units"]{ /* FR */ } html[lang|="de"] .uswitch[data-switch="units"]{ /* DE */ } html[lang|="it"] .uswitch[data-switch="units"]{ /* IT */ } html[lang|="nl"] .uswitch[data-switch="units"]{ /* NL */ } html[lang|="sv"] .uswitch[data-switch="units"]{ /* SV */ } html[lang|="no"] .uswitch[data-switch="units"]{ /* NO */ } html[lang|="ro"] .uswitch[data-switch="units"]{ /* RO */ } html[lang|="fi"] .uswitch[data-switch="units"]{ /* FI */ } html[lang|="da"] .uswitch[data-switch="units"]{ /* DA */ } html[lang|="cs"] .uswitch[data-switch="units"]{ /* CS */ } html[lang|="tr"] .uswitch[data-switch="units"]{ /* TR */ } html[lang|="sk"] .uswitch[data-switch="units"]{ /* SK */ } html[lang|="vi"] .uswitch[data-switch="units"]{ /* VI */ } html[lang|="id"] .uswitch[data-switch="units"]{ /* ID */ } html[lang|="hu"] .uswitch[data-switch="units"]{ /* HU */ } html[lang|="hr"] .uswitch[data-switch="units"]{ /* HR */ } html[lang|="tl"] .uswitch[data-switch="units"]{ /* TL */ } .suggest{ position:absolute; left:0; right:0; top:calc(42px + 8px); z-index:99999; max-height:200px; overflow-y:auto; background: rgba(240,250,255,.98); border:1px solid rgba(58,168,232,.20); border-radius:14px; box-shadow: 0 18px 40px rgba(14,122,191,.18); display:none; } .suggest.is-open{ display:block; } .suggest-item{ padding:10px 12px; display:flex; align-items:center; justify-content:space-between; gap:10px; cursor:pointer; user-select:none; text-decoration:none; color:inherit; border-bottom:1px solid rgba(58,168,232,.10); } .suggest-item:last-child{ border-bottom:0; } .suggest-item:hover{ background: rgba(58,168,232,.08); } .suggest-main{display:flex;flex-direction:column;gap:2px;min-width:0;} .suggest-name{font-weight:800;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} .suggest-sub{font-size:11px;color:rgba(26,58,82,.60);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} .suggest-pill{ font-size:12px; padding:6px 10px; border-radius:999px; background: rgba(58,168,232,.14); border:1px solid rgba(58,168,232,.28); color: rgba(26,58,82,.90); flex:0 0 auto; display:inline-flex; align-items:center; gap:8px; } .suggest-pill img{width:22px;height:22px;display:block;background:rgba(58,168,232,.14);border-radius:8px;} .suggest-temp{font-weight:900;letter-spacing:.2px;white-space:nowrap;} .suggest-empty{padding:12px;font-size:12px;color:rgba(26,58,82,.60);} .ad-slot1{ margin-top: clamp(10px, 1.8vh, 18px); height: clamp(56px, 9vh, 110px); width: 100%; background: rgba(14,122,191,.04); border: 0; border-radius: 0; display: flex; align-items: center; justify-content: center; box-shadow: inset 0 2px 8px rgba(14,122,191,.08); } .ad-slot2{ background: rgba(14,122,191,.04); border: 0; border-radius: 0; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 24px rgba(14,122,191,.15), 0 1px 6px rgba(0,0,0,.06); } .ad-bottom-wrap{ display: flex; flex-direction: column; align-items: center; } .ad-bottom-desktop{ width: 728px; height: 90px; max-width: 100%; } .ad-bottom-mobile{ width: 300px; height: 250px; } .ad-top-wrap{ display: flex; flex-direction: column; align-items: center; margin-top: clamp(10px, 1.8vh, 18px); } .ad-top-desktop{ width: 728px; height: 90px; max-width: 100%; margin-top: 0; box-shadow: 0 4px 24px rgba(14,122,191,.15), 0 1px 6px rgba(0,0,0,.06); border-radius: 0; } .ad-top-mobile{ width: 320px; height: 100px; margin-top: 0; box-shadow: 0 4px 24px rgba(14,122,191,.15), 0 1px 6px rgba(0,0,0,.06); border-radius: 0; } .ad-label{ font-size: 9px; letter-spacing: 3px; text-transform: uppercase; color: rgba(26,58,82,.35); text-align: center; margin-top: 6px; } .app-content{padding:14px} .stack{display:flex;flex-direction:column;gap:12px} .card{ background:rgba(255,255,255,.82); border:none; border-radius:var(--radius); padding:14px; box-shadow:0 10px 22px rgba(14,122,191,.10) } .badge{ font-size:12px; padding:6px 10px; border-radius:999px; background:#ddf2ff91; border:1px solid rgba(58,168,232,.18); display:inline-flex; align-items:center; gap:6px } .badge-maxmin{gap:10px} .badge-mx,.badge-mn{display:inline-flex;align-items:center;gap:3px;font-weight:700} .badge-mx{color:var(--c-max)} .badge-mn{color:var(--c-min)} .ic-rain{width:14px;height:14px;vertical-align:-2px;flex:0 0 14px;object-fit:contain;filter:brightness(0) saturate(100%) invert(55%) sepia(15%) saturate(700%) hue-rotate(160deg) brightness(90%) contrast(85%)} .badge-rain{color:var(--muted)} .card-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:10px} .card-title{margin:0;font-size:14px} .card-subtitle{font-size:12px;color:var(--muted)} .hours-maxmin{display:inline-flex;align-items:center;gap:4px;font-weight:700;font-size:12px;white-space:nowrap} .cities-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;} .city-card{background:#ddf2ff91;border:1px solid rgba(58,168,232,.14);border-radius:14px;padding:10px;text-decoration:none;color:var(--text);display:flex;flex-direction:column;gap:4px;transition:background .15s,border-color .15s;overflow:hidden;min-width:0;} .city-card:hover{background:rgba(255,255,255,.80);border-color:rgba(14,122,191,.32);} .city-card-top{display:flex;align-items:center;justify-content:space-between;min-width:0;overflow:hidden;} .city-card-name{font-size:13px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;} .city-card-state{font-size:12px;color:var(--muted);} .city-card-top>div{min-width:0;overflow:hidden;flex:1;} .footer{display:flex;justify-content:center;gap:8px;color:var(--muted2);font-size:12px;padding:4px 0 2px} .dot{opacity:.7} .live-dot{width:10px;height:10px;border-radius:999px;background:#ff3b30;box-shadow:0 0 0 0 rgba(255,59,48,.55);animation: livePulse 1s infinite;} @keyframes livePulse{ 0%{transform:scale(1);box-shadow:0 0 0 0 rgba(255,59,48,.55);opacity:1;} 60%{transform:scale(1.12);box-shadow:0 0 0 10px rgba(255,59,48,0);opacity:.95;} 100%{transform:scale(1);box-shadow:0 0 0 0 rgba(255,59,48,0);opacity:1;} } :root{ --bottom-nav-h: 64px; --bottom-nav-gap: 0px; } .app-content{padding-bottom: calc(14px + var(--bottom-nav-h) + var(--bottom-nav-gap) + 10px);} .bottom-nav{ position:fixed;left:0;right:0;bottom:0;width:100%;z-index:9999; background:rgba(232,244,253,.94);border-top:1px solid rgba(58,168,232,.18); backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px); box-shadow:0 -14px 30px rgba(14,122,191,.12); padding:8px 10px;overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain; } .bottom-nav-inner{display:flex;gap:8px;justify-content:flex-start;width:max-content;margin:0 auto;padding:0 10px;} .bottom-nav a{ height:calc(var(--bottom-nav-h) - 16px);display:grid;place-items:center;padding:0 12px; white-space:nowrap;text-decoration:none;color:rgba(26,58,82,.80); font-weight:800;letter-spacing:.2px;font-size:13px; background:rgba(255,255,255,.55);border:1px solid rgba(58,168,232,.16); border-radius:999px;transition: transform .12s ease, background .12s ease, border-color .12s ease; } .bottom-nav a:hover{background:rgba(255,255,255,.80);border-color:rgba(58,168,232,.28);} .bottom-nav a.is-active{background:rgba(58,168,232,.22);border-color:rgba(14,122,191,.40);color:rgba(26,58,82,.98);} .bottom-nav a.nav-home{padding:0 14px;min-width:44px;} .bottom-nav a.nav-home svg{display:block;} /* homepage-only components */ .hero{padding:16px;background:rgba(255,255,255,.82)} .hero-top{display:flex;align-items:center;justify-content:space-between;gap:10px} .temp{font-size:52px;line-height:1;font-weight:800;letter-spacing:-1px} .temp-dual{display:flex;align-items:baseline;gap:8px} .temp-max{color:#a63025;display:inline-flex;align-items:baseline;gap:2px} .temp-max .mm-ic{align-self:center;background-color:#a63025} .temp-min{font-size:38px;color:#1a5a8a;display:inline-flex;align-items:baseline;gap:2px} .temp-min .mm-ic{align-self:center;background-color:#1a5a8a} .desc{font-size:13px;color:var(--muted);margin-top:6px} .badges{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px} .hero-icon{ width:72px;height:72px;border-radius:18px;display:grid;place-items:center; background:#c9dfee;overflow:hidden } .hero-icon img{width:58px;height:58px} .kpis{margin-top:12px;display:grid;grid-template-columns:repeat(2,1fr);gap:10px} .kpi{background:#ddf2ff91;border:1px solid rgba(58,168,232,.14);border-radius:14px;padding:10px} .kpi .label{color:var(--muted);font-size:12px} .kpi .value{font-weight:700;margin-top:4px;display:flex;align-items:center;gap:4px} .wd-arrow{flex-shrink:0;color:var(--accent2)} .hero--multi{padding:14px;background:rgba(255,255,255,.82);} .hero--multi .temp{font-size:46px;} .hero--multi .desc{margin-top:4px;font-size:13px;} .live-now{ display:inline-flex;align-items:center;gap:10px;padding:8px 12px;border-radius:999px; background:#ddf2ff91;border:1px solid #3aa8e824; font-size:16px;font-weight:900;letter-spacing:.2px;line-height:1;min-height:36px;margin-bottom:10px;color:rgba(26,58,82,.98); } .hero-city-cta{display:block;width:100%;margin-top:12px;padding:10px;background:rgba(58,168,232,.18);border:1px solid rgba(14,122,191,.30);border-radius:12px;text-align:center;text-decoration:none;color:var(--accent2);font-weight:800;font-size:13px;transition:background .15s,border-color .15s;} .hero-city-cta:hover{background:rgba(58,168,232,.28);border-color:rgba(14,122,191,.45);} .mm-ic{width:12px;height:12px;display:inline-block;flex:0 0 12px;vertical-align:-2px;opacity:.98;background-color:var(--text);-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;-webkit-mask-size:contain;mask-repeat:no-repeat;mask-position:center;mask-size:contain;} .mm-ic--min{background-color:var(--c-min-solid);-webkit-mask-image:var(--mm-url);mask-image:var(--mm-url);} .mm-ic--max{background-color:var(--c-max-solid);-webkit-mask-image:var(--mm-url);mask-image:var(--mm-url);} .hero-city{background:rgba(255,255,255,.82);border-radius:var(--radius);padding:14px;box-shadow:0 10px 22px rgba(14,122,191,.10);position:relative;overflow:hidden;} .hero-city::after{content:"";position:absolute;top:-40px;right:-40px;width:160px;height:160px;border-radius:50%;background:radial-gradient(circle,rgba(58,168,232,.18) 0%,transparent 70%);pointer-events:none;} .hero-city-top{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;} .hero-city-info{flex:1;min-width:0;} .hero-city-name{font-weight:700;font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .hero-city-state{font-size:12px;color:var(--muted);margin-top:2px;} .hero-city-temp{font-size:52px;line-height:1;font-weight:800;letter-spacing:-1px;margin-top:4px;} .hero-city-desc{font-size:13px;color:var(--muted);margin-top:6px;} .hero-city-icon{width:72px;height:72px;border-radius:18px;display:grid;place-items:center;background:#c9dfee;overflow:hidden;flex-shrink:0;} .hero-city-icon img{width:58px;height:58px;} .hero-city-badges{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px;} .live-badge{display:inline-flex;align-items:center;gap:7px;padding:5px 10px 5px 8px;border-radius:999px;background:#ddf2ff91;border:1px solid rgba(58,168,232,.24);font-size:11px;font-weight:700;color:var(--text);margin-bottom:10px;} .days-strip{display:flex;gap:10px;overflow-x:auto;padding-bottom:6px;scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch;} .day-chip{flex:0 0 auto;min-width:86px;background:#ddf2ff91;border:1px solid rgba(58,168,232,.14);border-radius:14px;padding:10px 10px 12px;display:flex;flex-direction:column;align-items:center;gap:6px;scroll-snap-align:center;text-decoration:none;color:var(--text);transition:background .15s,border-color .15s;} .day-chip:hover{background:rgba(255,255,255,.80);border-color:rgba(14,122,191,.28);} .day-chip.is-today{background:rgba(58,168,232,.22);border-color:rgba(14,122,191,.40);} .day-chip-label{font-size:12px;color:var(--muted);} .day-chip img{width:44px;height:44px;border-radius:12px;background:#aed2e8;} .day-chip-temps{display:flex;gap:6px;align-items:center;} .day-chip-max{font-size:14px;font-weight:700;color:var(--c-max);} .day-chip-min{font-size:12px;font-weight:600;color:var(--c-min);} .cities-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;} .city-card{background:#ddf2ff91;border:1px solid rgba(58,168,232,.14);border-radius:14px;padding:10px;text-decoration:none;color:var(--text);display:flex;flex-direction:column;gap:4px;transition:background .15s,border-color .15s;overflow:hidden;min-width:0;} .city-card:hover{background:rgba(255,255,255,.80);border-color:rgba(14,122,191,.32);} .city-card-top{display:flex;align-items:center;justify-content:space-between;min-width:0;overflow:hidden;} .city-card-name{font-size:13px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;} .city-card-state{font-size:12px;color:var(--muted);} .city-card-top>div{min-width:0;overflow:hidden;flex:1;} .city-card-temp{font-weight:700;margin-top:4px;} .city-card-icon img{width:44px;height:44px;border-radius:12px;background:#aed2e8;} .sun-bar{background:linear-gradient(90deg,rgba(255,200,50,.12) 0%,rgba(58,168,232,.12) 50%,rgba(80,80,120,.10) 100%);border-radius:14px;padding:10px;display:flex;justify-content:space-between;align-items:center;border:1px solid rgba(58,168,232,.14);margin-top:6px;} .sun-point{display:flex;flex-direction:column;align-items:center;gap:4px;} .sun-point-icon{width:28px;height:28px;object-fit:contain;display:block;} .sun-point-label{font-size:12px;color:var(--muted);} .sun-point-time{font-weight:700;margin-top:4px;} .sun-track{flex:1;display:flex;flex-direction:column;align-items:center;gap:4px;padding:0 12px;} .sun-track-bar{width:100%;height:4px;border-radius:999px;background:linear-gradient(90deg,rgba(255,180,30,.5),rgba(58,168,232,.5));position:relative;} .sun-track-dot{width:12px;height:12px;border-radius:50%;background:rgba(255,200,50,1);border:2px solid white;position:absolute;top:50%;transform:translateY(-50%);box-shadow:0 0 6px rgba(255,180,30,.6);} .sun-track-label{font-size:12px;color:var(--muted);} .states-list{display:flex;flex-direction:column;gap:6px;} .state-row{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-radius:14px;background:#ddf2ff91;border:1px solid rgba(58,168,232,.14);text-decoration:none;color:var(--text);transition:background .15s,border-color .15s;} .state-row:hover{background:rgba(255,255,255,.80);border-color:rgba(14,122,191,.28);} .state-row-info{display:flex;flex-direction:column;gap:2px;} .state-row-name{font-size:13px;font-weight:700;} .state-row-cap{font-size:12px;color:var(--muted);} .state-row-right{display:flex;align-items:center;gap:8px;} .state-row-temp{font-weight:700;margin-top:4px;} .state-row-icon img{width:44px;height:44px;border-radius:12px;background:#aed2e8;} .phenomena-scroll{display:flex;gap:10px;overflow-x:auto;padding-bottom:6px;-webkit-overflow-scrolling:touch;} .phenomenon-chip{flex:0 0 auto;min-width:86px;background:#ddf2ff91;border:1px solid rgba(58,168,232,.14);border-radius:14px;padding:10px 10px 12px;display:flex;flex-direction:column;align-items:center;gap:6px;text-decoration:none;color:var(--text);transition:background .15s,border-color .15s;} .phenomenon-chip:hover{background:rgba(255,255,255,.80);border-color:rgba(14,122,191,.28);} .phenomenon-emoji{font-size:28px;line-height:1;} .phenomenon-name{font-size:12px;font-weight:700;text-align:center;color:var(--muted);} .tips-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;} .tip-card{background:#ddf2ff91;border:1px solid rgba(58,168,232,.14);border-radius:14px;padding:10px;} .tip-icon{font-size:20px;margin-bottom:6px;} .tip-title{font-size:13px;font-weight:700;} .tip-text{font-size:12px;color:var(--muted);line-height:1.4;margin-top:4px;} /* padrão: esconde desktop, mostra mobile */ .ad-only-desktop{display:none!important;} .ad-only-mobile{display:flex!important;} /* PC: mostra desktop, esconde mobile */ @media (min-width: 768px){ .ad-only-desktop{display:flex!important;} .ad-only-mobile{display:none!important;} } @media (min-width: 768px) { .app-shell{ padding: 0px 22px 34px; } .app{ max-width: 860px; border-radius: 24px; } .app-header{ padding: 18px 18px 16px; } .site-logo{ height: 110px; } .loc-icon{ width: 34px; height: 54px; border-radius: 16px; } .loc-city{ font-size: 20px; } .loc-sub{ font-size: 14px; } .search{ gap: 12px; } .search-input{ height: 54px; border-radius: 16px; padding: 0 14px; padding-right: 48px; font-size: 15px; } .search-wrap::before{ right: 14px; width: 20px; height: 20px; } .gps-btn{ width:54px; height:54px; border-radius:16px; } .gps-btn svg{ width:24px; height:24px; } .suggest{ top: calc(54px + 10px); border-radius: 16px; max-height: 280px; } .app-content{ padding: 18px; padding-bottom: calc(18px + var(--bottom-nav-h) + var(--bottom-nav-gap) + 14px); } .stack{ gap: 14px; } .card{ padding: 18px; border-radius: 18px; } .badge{ font-size: 13px; padding: 7px 12px; } .hero--multi .temp{ font-size: 64px; } .temp{ font-size: 72px; } .desc{ font-size: 14px; } .hero-icon{ width: 92px; height: 92px; border-radius: 22px; } .hero-icon img{ width: 70px; height: 70px; } .kpis{ gap: 12px; grid-template-columns: repeat(3,1fr); } .kpi{ padding: 12px; border-radius: 16px; } .kpi .label{ font-size: 13px; } .kpi .value{ font-size: 15px; } .live-now{ font-size: 18px; min-height: 40px; padding: 9px 14px; } .hero-city{ padding: 18px; border-radius: 18px; } .hero-city-temp{ font-size: 72px; } .hero-city-icon{ width: 92px; height: 92px; border-radius: 22px; } .hero-city-icon img{ width: 70px; height: 70px; } .cities-grid{ grid-template-columns: repeat(4, 1fr); } .tips-grid{ grid-template-columns: repeat(4, 1fr); } .day-chip{ min-width: 104px; border-radius: 16px; padding: 12px 12px 14px; } .day-chip img{ width: 50px; height: 50px; border-radius: 12px; background: #c9dfee; } .day-chip-label{ font-size: 13px; } .day-chip-max{ font-size: 15px; } .ad-slot1{ height: clamp(70px, 10vh, 140px); } :root{ --bottom-nav-h: 72px; } .bottom-nav{ left: 50%; right: auto; transform: translateX(-50%); padding: 10px 12px; } .bottom-nav-inner{ justify-content: center; padding: 0 8px; width: 100%; } .bottom-nav a{ height: calc(var(--bottom-nav-h) - 18px); font-size: 14px; padding: 0 14px; } } /* ============================================================================ * BLOCO 2 — CIDADE / SUBDIVISÃO * ============================================================================ */ /* TEMA CLARO — azul céu + branco */ :root{--bg:#9ec4df;--text:#1a3a52;--muted:#5a8aaa;--muted2:#7aaac4;--accent:#3aa8e8;--accent2:#0e7abf;--radius:16px;--shadow:0 10px 30px rgba(14,122,191,.14);--c-max:rgba(220,60,50,.90);--c-min:rgba(47,128,255,.85);--c-max-solid:#e33b30;--c-min-solid:#2f80ff} *{box-sizing:border-box} html,body{height:100%} body{ margin:0; background: radial-gradient(1200px 900px at 70% -10%, rgba(58,168,232,.18), transparent 60%), radial-gradient(900px 700px at 10% 0%, rgba(255,255,255,.15), transparent 55%), var(--bg); color:var(--text); font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif; -webkit-font-smoothing:antialiased; -moz-osx-font-smoothing:grayscale; } body::before{ content:""; position: fixed; inset: 0; z-index: -1; pointer-events: none; background: radial-gradient(1200px 900px at 70% -10%, rgba(58,168,232,.18), transparent 60%), radial-gradient(900px 700px at 10% 0%, rgba(255,255,255,.15), transparent 55%), var(--bg); } .app-shell{min-height:100%;display:flex;justify-content:center;padding:0px 14px 22px} .app{ width:100%;max-width:420px;border-radius:20px;overflow:hidden; background:rgba(255,255,255,.60); border:1px solid rgba(58,168,232,.18); box-shadow:var(--shadow) } .app-header{ position:sticky;top:0;z-index:30; background:transparent; backdrop-filter:blur(10px); border-bottom:1px solid rgba(58,168,232,.16); padding:14px 14px 12px } .header-logo{display:flex;justify-content:center;padding:10px 0px 0px;width:100%;} .header-logo a{display:inline-flex;align-items:center;} .site-logo{height:110px;width:auto;display:block;} .header-top{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px} .location{display:flex;align-items:center;gap:10px;min-width:0} .loc-icon{ width:22px;height:38px;display:block;border-radius:12px; background-color:#7eabca; -webkit-mask-image:url('https://infometeo.com/assets/svg/ic-local.svg'); mask-image:url('https://infometeo.com/assets/svg/ic-local.svg'); -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat; -webkit-mask-position:center;mask-position:center; -webkit-mask-size:contain;mask-size:contain; opacity:.99; } .loc-city{font-weight:700;font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .loc-sub{font-size:12px;color:var(--muted)} /* ===== UNIT SWITCHES BAR ===== */ .unit-switches{display:flex;align-items:center;justify-content:center;gap:10px;padding:6px 14px 2px;flex-wrap:wrap} .uswitch{position:relative;display:inline-flex;align-items:center;height:30px;border-radius:999px;background:rgba(58,168,232,.13);border:1.5px solid rgba(58,168,232,.18);overflow:hidden;cursor:pointer;-webkit-user-select:none;user-select:none;padding:0 3px} .uswitch-opt{position:relative;z-index:1;display:flex;align-items:center;justify-content:center;height:22px;padding:0 9px;font-size:11px;font-weight:800;letter-spacing:.03em;color:var(--muted);transition:color .2s ease;white-space:nowrap;border-radius:999px} .uswitch-opt.is-active{color:var(--accent2)} .uswitch-pill{position:absolute;height:22px;border-radius:999px;background:rgba(58,168,232,.22);border:1px solid rgba(14,122,191,.25);transition:left .25s ease,width .25s ease;pointer-events:none} .page-h1{ margin: 0 0 10px 0; font-size: 16px; line-height: 1.25; font-weight: 900; letter-spacing: .2px; color: rgba(26,58,82,.95); text-align: center; } .page-h1-sub{ margin: 0 0 14px 0; font-size: 12px; color: rgba(26,58,82,.65); text-align: center; } .suggest-loading{ padding: 12px; display: flex; align-items: center; gap: 10px; color: rgba(26,58,82,.75); font-size: 12px; } .suggest-spinner{ width: 16px; height: 16px; border-radius: 999px; border: 2px solid rgba(58,168,232,.20); border-top-color: rgba(14,122,191,.95); animation: suggestSpin .75s linear infinite; flex: 0 0 auto; } @keyframes suggestSpin{ to { transform: rotate(360deg); } } .search{display:flex;gap:10px} .search-wrap{ position:relative; flex:1; } .search-wrap::before{ content:""; position:absolute; right:12px; top:50%; transform:translateY(-50%); width:18px;height:18px; background-color: rgba(90,138,170,.55); -webkit-mask-image: url('https://infometeo.com/assets/svg/ic-search.svg'); mask-image: url('https://infometeo.com/assets/svg/ic-search.svg'); -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat; -webkit-mask-position:center;mask-position:center; -webkit-mask-size:contain;mask-size:contain; pointer-events:none; opacity:.95; transition: opacity .12s ease; } .search-wrap:focus-within::before{ opacity:0; pointer-events:none; } .search-input{ flex:1;height:42px;border-radius:14px;border:0px solid rgba(58,168,232,.22); background:rgba(255,255,255,.70);color:var(--text); padding:0 12px;padding-right:42px; font-size:16px; outline:none; transition: background .12s ease, border-color .12s ease, box-shadow .12s ease; } .search-input:focus{ background: rgba(255,255,255,.92); border-color: rgba(58,168,232,.22); box-shadow: 0 0 0 3px rgba(58, 168, 232, 0.32); } .search-input::placeholder{color:rgba(90,138,170,.75)} /* oculta lupa quando há texto digitado */ .search-wrap.has-value::before{ opacity:0; pointer-events:none; } .search-input::-webkit-search-cancel-button{ -webkit-appearance:none; display:none; } .search-input::-ms-clear{ display:none; } /* botão X customizado */ .search-clear{ position:absolute; right:10px; top:50%; transform:translateY(-50%); width:26px;height:26px; border:none;background:transparent; color:rgba(14,122,191,.75); display:none; align-items:center;justify-content:center; cursor:pointer; padding:0; border-radius:50%; transition: color .15s ease, background .15s ease; } .search-clear:hover{ color:rgba(14,122,191,1); background:rgba(14,122,191,.10); } .search-clear.is-visible{ display:flex; } .gps-btn{ flex:0 0 auto; width:42px;height:42px; border:none;border-radius:14px; background:rgba(255,255,255,.70); color:rgba(90,138,170,.75); display:flex;align-items:center;justify-content:center; cursor:pointer; transition: background .15s ease, color .15s ease; } .gps-btn svg{ width:22px; height:22px; } .gps-btn:hover{ background:rgba(255,255,255,.92); color:rgba(14,122,191,.85); } .gps-btn.is-loading{ pointer-events:none; opacity:.6; } .gps-btn.is-loading svg{ animation: gpsSpin .8s linear infinite; } @keyframes gpsSpin{ to{ transform:rotate(360deg); } } .gps-wrap{ position:relative; flex:0 0 auto; } .gps-tooltip{ position:absolute; bottom:calc(100% + 10px); right:0; white-space:nowrap; font-size:11px; font-weight:600; color:rgba(26,58,82,.88); background:#e8f6ff; border:1px solid rgba(58,168,232,.22); border-radius:10px; padding:6px 10px; box-shadow:0 4px 16px rgba(14,122,191,.14); pointer-events:none; opacity:1; transform:translateY(0); } .gps-tooltip::after{ content:""; position:absolute; top:100%; right:13px; border:5px solid transparent; border-top-color:#e8f6ff; filter:drop-shadow(0 1px 0 rgba(58,168,232,.22)); } .gps-wrap .gps-tooltip{ opacity:1; transform:translateY(0); animation: gpsFloat 2.4s ease-in-out infinite; } @keyframes gpsFloat{ 0%,100%{ transform:translateY(0); } 50%{ transform:translateY(-3px); } } .gps-toast{ overflow:hidden; max-height:0; opacity:0; transition: max-height 0.4s cubic-bezier(.4,0,.2,1), opacity 0.3s ease, margin 0.4s ease; margin:0; } .gps-toast.is-visible{ max-height:60px; opacity:1; margin-top:8px; } .gps-toast-inner{ font-size:12px; line-height:1.4; padding:10px 14px; border-radius:12px; background:rgba(220,70,60,.10); border:1px solid rgba(220,70,60,.22); color:rgba(160,40,30,.9); } .suggest{ position:absolute; left:0; right:0; top:calc(42px + 8px); z-index:99999; max-height:200px; overflow-y:auto; background: rgba(240,250,255,.98); border:1px solid rgba(58,168,232,.20); border-radius:14px; box-shadow: 0 18px 40px rgba(14,122,191,.18); display:none; } .suggest.is-open{ display:block; } .suggest-item{ padding:10px 12px; display:flex; align-items:center; justify-content:space-between; gap:10px; cursor:pointer; user-select:none; text-decoration:none; color:inherit; border-bottom:1px solid rgba(58,168,232,.10); } .suggest-item:last-child{ border-bottom:0; } .suggest-item:hover{ background: rgba(58,168,232,.08); } .suggest-main{display:flex;flex-direction:column;gap:2px;min-width:0;} .suggest-name{font-weight:800;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} .suggest-sub{font-size:11px;color:rgba(26,58,82,.60);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} .suggest-pill{ font-size:12px; padding:6px 10px; border-radius:999px; background: rgba(58,168,232,.14); border:1px solid rgba(58,168,232,.28); color: rgba(26,58,82,.90); flex:0 0 auto; display:inline-flex; align-items:center; gap:8px; } .suggest-pill img{width:22px;height:22px;display:block;background:rgba(58,168,232,.14);border-radius:8px;} .suggest-temp{font-weight:900;letter-spacing:.2px;white-space:nowrap;} .suggest-empty{padding:12px;font-size:12px;color:rgba(26,58,82,.60);} .ad-slot1{ margin-top: clamp(10px, 1.8vh, 18px); height: clamp(56px, 9vh, 110px); width: 100%; background: rgba(14,122,191,.04); border: 0; border-radius: 0; display: flex; align-items: center; justify-content: center; box-shadow: inset 0 2px 8px rgba(14,122,191,.08); } .ad-slot2{ background: rgba(14,122,191,.04); border: 0; border-radius: 0; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 24px rgba(14,122,191,.15), 0 1px 6px rgba(0,0,0,.06); } .ad-bottom-wrap{ display: flex; flex-direction: column; align-items: center; } .ad-bottom-desktop{ width: 728px; height: 90px; max-width: 100%; } .ad-bottom-mobile{ width: 300px; height: 250px; } .ad-top-wrap{ display: flex; flex-direction: column; align-items: center; margin-top: clamp(10px, 1.8vh, 18px); } .ad-top-desktop{ width: 728px; height: 90px; max-width: 100%; margin-top: 0; box-shadow: 0 4px 24px rgba(14,122,191,.15), 0 1px 6px rgba(0,0,0,.06); border-radius: 0; } .ad-top-mobile{ width: 320px; height: 100px; margin-top: 0; box-shadow: 0 4px 24px rgba(14,122,191,.15), 0 1px 6px rgba(0,0,0,.06); border-radius: 0; } .ad-label{ font-size: 9px; letter-spacing: 3px; text-transform: uppercase; color: rgba(26,58,82,.35); text-align: center; margin-top: 6px; } .app-content{padding:14px} .stack{display:flex;flex-direction:column;gap:12px} .card{ background:rgba(255,255,255,.82); border:none; border-radius:var(--radius); padding:14px; box-shadow:0 10px 22px rgba(14,122,191,.10) } .card.card-hours{margin-bottom: clamp(12px, 2.2vh, 26px);} .card.card-hours--inline{ margin-bottom: 0 !important; } .hero{padding:16px;background:rgba(255,255,255,.82)} .hero-top{display:flex;align-items:center;justify-content:space-between;gap:10px} .temp{font-size:52px;line-height:1;font-weight:800;letter-spacing:-1px} .temp-dual{display:flex;align-items:baseline;gap:8px} .temp-max{color:#a63025;display:inline-flex;align-items:baseline;gap:2px} .temp-max .mm-ic{align-self:center;background-color:#a63025} .temp-min{font-size:38px;color:#1a5a8a;display:inline-flex;align-items:baseline;gap:2px} .temp-min .mm-ic{align-self:center;background-color:#1a5a8a} .desc{font-size:13px;color:var(--muted);margin-top:6px} .badges{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px} .badge{ font-size:12px; padding:6px 10px; border-radius:999px; background:#ddf2ff91; border:1px solid rgba(58,168,232,.18); display:inline-flex; align-items:center; gap:6px } .badge-maxmin{gap:10px} .badge-mx,.badge-mn{display:inline-flex;align-items:center;gap:3px;font-weight:700} .badge-mx{color:var(--c-max)} .badge-mn{color:var(--c-min)} .ic-rain{width:14px;height:14px;vertical-align:-2px;flex:0 0 14px;object-fit:contain;filter:brightness(0) saturate(100%) invert(55%) sepia(15%) saturate(700%) hue-rotate(160deg) brightness(90%) contrast(85%)} .badge-rain{color:var(--muted)} .hero-icon{ width:72px;height:72px;border-radius:18px;display:grid;place-items:center; background:#c9dfee;overflow:hidden } .hero-icon img{width:58px;height:58px} .kpis{margin-top:12px;display:grid;grid-template-columns:repeat(2,1fr);gap:10px} .kpi{background:#ddf2ff91;border:1px solid rgba(58,168,232,.14);border-radius:14px;padding:10px} .kpi .label{color:var(--muted);font-size:12px} .kpi .value{font-weight:700;margin-top:4px;display:flex;align-items:center;gap:4px} .card-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:10px} .card-title{margin:0;font-size:14px} .card-subtitle{font-size:12px;color:var(--muted)} .hours-maxmin{display:inline-flex;align-items:center;gap:4px;font-weight:700;font-size:12px;white-space:nowrap} .cities-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;} .city-card{background:#ddf2ff91;border:1px solid rgba(58,168,232,.14);border-radius:14px;padding:10px;text-decoration:none;color:var(--text);display:flex;flex-direction:column;gap:4px;transition:background .15s,border-color .15s;overflow:hidden;min-width:0;} .city-card:hover{background:rgba(255,255,255,.80);border-color:rgba(14,122,191,.32);} .city-card--active{background:rgba(58,168,232,.18);border-color:rgba(14,122,191,.40);box-shadow:0 0 0 1px rgba(58,168,232,.20);} .city-card-top{display:flex;align-items:center;justify-content:space-between;min-width:0;overflow:hidden;} .city-card-name{font-size:13px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;} .city-card-state{font-size:12px;color:var(--muted);} .city-card-top>div{min-width:0;overflow:hidden;flex:1;} /* Pin de localização nos cards de Cidades próximas/Capitais/Distritos. Reusa o SVG de pin do header (.loc-icon), mas em escala reduzida para caber no chip. flex:0 0 auto trava a largura — nome longo da cidade trunca via ellipsis no .city-card-name sem encolher o ícone. */ .city-card-top{gap:8px;} .city-card-icon{ width:13px;height:20px;flex:0 0 13px;display:block; background-color:#7eabca; -webkit-mask-image:url('https://infometeo.com/assets/svg/ic-local.svg'); mask-image:url('https://infometeo.com/assets/svg/ic-local.svg'); -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat; -webkit-mask-position:center;mask-position:center; -webkit-mask-size:contain;mask-size:contain; opacity:.85; } .city-card--active .city-card-icon{background-color:rgba(14,122,191,.85);opacity:1;} .hourly-scroll{ display:flex;gap:10px;overflow-x:auto;padding-bottom:6px; scroll-snap-type: x proximity; -webkit-overflow-scrolling: touch; } .hour{ min-width:86px;background:#ddf2ff91;border:1px solid rgba(58,168,232,.14);border-radius:14px; padding:10px 10px 12px;display:flex;flex-direction:column;align-items:center;gap:6px; scroll-snap-align:center; } .hour .t{font-size:12px;color:var(--muted)} .hour img{width:44px;height:44px;border-radius:12px;background:#aed2e8;} .hour .v{font-size:14px;font-weight:700} .hour-feels{font-size:10px;color:var(--muted);text-align:center;margin-top:1px;white-space:nowrap} .hour .hour-cond{font-size:10px;color:var(--muted2);text-align:center;line-height:1.2;margin-top:2px;max-width:80px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;height:calc(10px * 1.2 * 2);min-height:calc(10px * 1.2 * 2)} .hour.is-now{ background: rgba(58,168,232,.22); border-color: rgba(14,122,191,.40); } .hour.is-now .t{ color: rgba(26,58,82,.95); font-weight: 800; } .hourly-scroll.is-centering{ scroll-snap-type: none !important; } /* Expandable hour detail */ .hour--expandable{ cursor: pointer; position: relative; } .hour--expandable.is-expanded{ background: rgba(58,168,232,.18); border-color: rgba(14,122,191,.32); transition: background 0.3s ease, border-color 0.3s ease; } .hour-arrow{ display:flex;align-items:center;justify-content:center; color:var(--muted);margin-top:2px; transition: transform 0.5s cubic-bezier(.4,0,.2,1); } .hour--expandable.is-expanded .hour-arrow{ transform: rotate(180deg); } /* External detail panel (below hourly-scroll, inside the card) */ .hour-detail-panel{ overflow:hidden; max-height:0; opacity:0; transition: max-height 0.5s cubic-bezier(.4,0,.2,1), opacity 0.35s ease, margin 0.5s cubic-bezier(.4,0,.2,1); margin-top:0; } .hour-detail-panel.is-open{ max-height:320px; opacity:1; margin-top:12px; } .hour-detail-panel-inner{ background: rgba(221,242,255,.55); border: 1px solid rgba(58,168,232,.18); border-radius: 14px; padding: 14px 16px; } /* Mobile card is no longer used — detail panel stays inside the card on all screens */ .hour-detail-panel-mobile-card { display: none !important; } .hdp-title{ font-size:13px;font-weight:700;margin-bottom:10px; color:var(--fg); display:flex;align-items:center;gap:6px; } .hdp-title .hdp-time{ font-weight:800;color:rgba(14,122,191,.85); } .hdp-grid{ display:grid; grid-template-columns: repeat(2, 1fr); gap: 8px 16px; } @media (max-width: 639px){ .hdp-grid{ grid-template-columns: 1fr; gap: 7px 0; } } .hd-row{ display:flex;justify-content:flex-start;align-items:center; gap:6px;font-size:12px;line-height:1.4; width:100%; } .hd-label{ color:var(--muted); white-space:nowrap; flex-shrink:0; } .hd-val{ font-weight:600; white-space:nowrap; } .hd-wdir{ display:inline-flex; align-items:center; gap:5px; white-space:nowrap; } .wd-arrow{ flex-shrink:0; color:var(--accent2); } .grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px} .tile{background:#ddf2ff91;border:1px solid rgba(58,168,232,.14);border-radius:14px;padding:10px} .tile .label{color:var(--muted);font-size:12px} .tile .value{font-weight:700;margin-top:6px;display:flex;align-items:center;gap:4px} .alert{ background:rgba(255,193,7,.08); border:1px solid rgba(255,193,7,.28); border-radius:16px;padding:12px 12px 10px } .alert-title{font-weight:800;margin:0 0 6px} .alert-item{font-size:13px;color:rgba(26,58,82,.88);line-height:1.35;margin:0 0 10px} .alert-item strong{color:var(--text)} .alert-meta{font-size:12px;color:rgba(26,58,82,.60)} .day-divider{height:1px;background:rgba(58,168,232,.15);margin:8px 0;border-radius:999px;} .sun-bar{background:linear-gradient(90deg,rgba(255,200,50,.12) 0%,rgba(58,168,232,.12) 50%,rgba(80,80,120,.10) 100%);border-radius:14px;padding:10px;display:flex;justify-content:space-between;align-items:center;border:1px solid rgba(58,168,232,.14);margin-top:6px;} .sun-point{display:flex;flex-direction:column;align-items:center;gap:4px;} .sun-point-icon{width:28px;height:28px;object-fit:contain;display:block;} .sun-point-label{font-size:12px;color:var(--muted);} .sun-point-time{font-weight:700;margin-top:4px;} .sun-track{flex:1;display:flex;flex-direction:column;align-items:center;gap:4px;padding:0 12px;} .sun-track-bar{width:100%;height:4px;border-radius:999px;background:linear-gradient(90deg,rgba(255,180,30,.5),rgba(58,168,232,.5));position:relative;} .sun-track-dot{width:12px;height:12px;border-radius:50%;background:rgba(255,200,50,1);border:2px solid white;position:absolute;top:50%;transform:translateY(-50%);box-shadow:0 0 6px rgba(255,180,30,.6);} .sun-track-label{font-size:12px;color:var(--muted);} /* Qualidade do ar */ .aq-card{ background: rgba(255,255,255,.82); } .aq-body{ display:flex; align-items:center; gap:12px; margin-bottom:14px; } .aq-status{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:3px; flex:0 0 80px; text-align:center; } .aq-emoji{ font-size:34px; line-height:1; } .aq-label{ font-size:13px; font-weight:800; letter-spacing:.1px; margin-top:2px; } .aq-index{ font-size:11px; color:var(--muted); } .aq-index strong{ color:var(--text); font-weight:800; } .aq-metrics{ flex:1; display:flex; flex-direction:column; gap:8px; min-width:0; } .aq-metric{ display:flex; align-items:center; justify-content:space-between; background:#ddf2ff91; border:1px solid rgba(58,168,232,.14); border-radius:12px; padding:9px 12px; gap:8px; min-width:0; } .aq-m-label{ font-size:12px; color:var(--muted); flex-shrink:0; line-height:1.4; } .aq-m-label sub{ font-size:9px; vertical-align:baseline; position:relative; top:3px; } .aq-m-val{ font-size:13px; font-weight:700; white-space:nowrap; flex-shrink:0; } .aq-bar-wrap{ margin-top:2px; } .aq-bar-track{ position:relative; height:7px; border-radius:999px; background:linear-gradient(90deg,#22c55e 0%,#eab308 33%,#f97316 55%,#ef4444 72%,#a855f7 88%,#7f1d1d 100%); } .aq-bar-dot{ width:14px; height:14px; border-radius:50%; position:absolute; top:50%; transform:translate(-50%,-50%); border:2px solid white; box-shadow:0 0 6px rgba(0,0,0,.22); } .aq-bar-ticks{ display:flex; justify-content:space-between; margin-top:5px; font-size:10px; color:var(--muted); } .aq-deeplink{ display:flex;align-items:center;justify-content:center;gap:7px; margin-top:12px; padding:10px 14px; border-radius:12px; background:rgba(58,168,232,.08); border:1px solid rgba(58,168,232,.18); text-decoration:none; color:rgba(14,122,191,.9); font-size:12px; font-weight:600; transition:background .15s, border-color .15s; } .aq-deeplink:hover{ background:rgba(58,168,232,.16); border-color:rgba(14,122,191,.32); } .aq-deeplink svg{ flex-shrink:0; opacity:.8; } .aq-deeplink-text{ line-height:1.3; } .aq-deeplink-arrow{ font-size:14px; color:var(--accent2); flex-shrink:0; opacity:.7; } .dot{opacity:.7} .footer{display:flex;justify-content:center;gap:8px;color:var(--muted2);font-size:12px;padding:4px 0 2px} .error{background:rgba(255,107,107,.07);border:1px solid rgba(255,107,107,.28);border-radius:var(--radius);padding:14px} .error-title{font-weight:800;margin-bottom:6px} .error-msg{color:rgba(26,58,82,.85);font-size:13px;margin-bottom:0} #heroContainer{display:flex;flex-direction:column;gap:12px} .hero--multi{padding:14px;background:rgba(255,255,255,.82);} .hero--multi .temp{font-size:46px;} .hero--multi .desc{margin-top:4px;font-size:13px;} .hero-daytitle,.live-now{ display:inline-flex;align-items:center;gap:10px;padding:8px 12px;border-radius:999px; background:#ddf2ff91;border:1px solid #3aa8e824; box-shadow: inset 0 0 0 0px rgba(58,168,232,.12); font-size:16px;font-weight:900;letter-spacing:.2px;line-height:1;min-height:36px;margin-bottom:10px;color:rgba(26,58,82,.98); } .hero-daytitle .mini{font-size:12px;font-weight:800;color:rgba(26,58,82,.75);opacity:.95;line-height:1;} .live-dot{width:10px;height:10px;border-radius:999px;background:#ff3b30;box-shadow:0 0 0 0 rgba(255,59,48,.55);animation: livePulse 1s infinite;} @keyframes livePulse{ 0%{transform:scale(1);box-shadow:0 0 0 0 rgba(255,59,48,.55);opacity:1;} 60%{transform:scale(1.12);box-shadow:0 0 0 10px rgba(255,59,48,0);opacity:.95;} 100%{transform:scale(1);box-shadow:0 0 0 0 rgba(255,59,48,0);opacity:1;} } .mm-ic{width:12px;height:12px;display:inline-block;flex:0 0 12px;vertical-align:-2px;opacity:.98;background-color:var(--text);-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;-webkit-mask-size:contain;mask-repeat:no-repeat;mask-position:center;mask-size:contain;} .mm-ic--min{background-color:var(--c-min-solid);-webkit-mask-image:var(--mm-url);mask-image:var(--mm-url);} .mm-ic--max{background-color:var(--c-max-solid);-webkit-mask-image:var(--mm-url);mask-image:var(--mm-url);} :root{ --bottom-nav-h: 64px; --bottom-nav-gap: 0px; } .app-content{padding-bottom: calc(14px + var(--bottom-nav-h) + var(--bottom-nav-gap) + 10px);} .bottom-nav{ position:fixed;left:0;right:0;bottom:0;width:100%;z-index:9999; background:rgba(232,244,253,.94);border-top:1px solid rgba(58,168,232,.18); backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px); box-shadow:0 -14px 30px rgba(14,122,191,.12); padding:8px 10px;overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain; } .bottom-nav-inner{display:flex;gap:8px;justify-content:flex-start;width:max-content;margin:0 auto;padding:0 10px;} .bottom-nav a{ height:calc(var(--bottom-nav-h) - 16px);display:grid;place-items:center;padding:0 12px; white-space:nowrap;text-decoration:none;color:rgba(26,58,82,.80); font-weight:800;letter-spacing:.2px;font-size:13px; background:rgba(255,255,255,.55);border:1px solid rgba(58,168,232,.16); border-radius:999px;transition: transform .12s ease, background .12s ease, border-color .12s ease; } .bottom-nav a:hover{background:rgba(255,255,255,.80);border-color:rgba(58,168,232,.28);} .bottom-nav a.is-active{background:rgba(58,168,232,.22);border-color:rgba(14,122,191,.40);color:rgba(26,58,82,.98);} .bottom-nav a.nav-home{padding:0 14px;min-width:44px;} .bottom-nav a.nav-home svg{display:block;} /* DESKTOP / PC MODE */ .pc-hero-row{display:block;} .pc-hero-main{display:block;} @media (min-width: 768px){ /* Grid de 2 colunas (anúncio 300px + hero) só quando há anúncio. Sem .has-ad o grid não é aplicado e o hero ocupa toda a largura, evitando o bug de card estreito + espaço vazio à direita nas views HOJE e AMANHÃ quando AD_DESKTOP_HERO=0. */ .pc-hero-row.has-ad{ display:grid; grid-template-columns: 300px minmax(0,1fr); gap: 14px; align-items:start; } .pc-adslot1{ width: 300px; height: 250px; min-height: 250px; margin: 0; justify-content: center; align-items: center; align-self: center; border-radius: 0; box-shadow: 0 4px 24px rgba(14,122,191,.15), 0 1px 6px rgba(0,0,0,.06); } .pc-adslot1-wrap{ display: flex; flex-direction: column; align-items: center; align-self: center; } .pc-topslot{ margin-top: 0; margin-bottom: 0; justify-content: center; } } /* padrão: esconde desktop, mostra mobile */ .ad-only-desktop{display:none!important;} .ad-only-mobile{display:flex!important;} /* PC: mostra desktop, esconde mobile */ @media (min-width: 768px){ .ad-only-desktop{display:flex!important;} .ad-only-mobile{display:none!important;} } @media (min-width: 768px) { .app-shell{ padding: 0px 22px 34px; } .app{ max-width: 860px; border-radius: 24px; } .app-header{ padding: 18px 18px 16px; } .site-logo{ height: 110px; } .loc-icon{ width: 34px; height: 54px; border-radius: 16px; } .loc-city{ font-size: 20px; } .loc-sub{ font-size: 14px; } .search{ gap: 12px; } .search-input{ height: 54px; border-radius: 16px; padding: 0 14px; padding-right: 48px; font-size: 15px; } .search-wrap::before{ right: 14px; width: 20px; height: 20px; } .gps-btn{ width:54px; height:54px; border-radius:16px; } .gps-btn svg{ width:24px; height:24px; } .suggest{ top: calc(54px + 10px); border-radius: 16px; max-height: 280px; } .app-content{ padding: 18px; padding-bottom: calc(18px + var(--bottom-nav-h) + var(--bottom-nav-gap) + 14px); } .stack{ gap: 14px; } .card{ padding: 18px; border-radius: 18px; } .hero--multi .temp{ font-size: 64px; } .temp{ font-size: 72px; } .desc{ font-size: 14px; } .badge{ font-size: 13px; padding: 7px 12px; } .hero-icon{ width: 92px; height: 92px; border-radius: 22px; } .hero-icon img{ width: 70px; height: 70px; } .kpis{ gap: 12px; grid-template-columns: repeat(3,1fr); } .kpi{ padding: 12px; border-radius: 16px; } .kpi .label{ font-size: 13px; } .kpi .value{ font-size: 15px; } .hourly-scroll{ gap: 12px; padding-bottom: 8px; } .hour{ min-width: 104px; border-radius: 16px; padding: 12px 12px 14px; } .hour img{ width: 50px; height: 50px; border-radius: 12px; background: #c9dfee; } .hour .t{ font-size: 13px; } .hour .v{ font-size: 15px; } .hour .hour-cond{ font-size: 11px; max-width: 96px; height:calc(11px * 1.2 * 2); min-height:calc(11px * 1.2 * 2); } .hdp-grid{ grid-template-columns: repeat(3, 1fr); gap: 8px 20px; } .hd-row{ font-size: 13px; } .grid{ grid-template-columns: repeat(4, 1fr); } .ad-slot1{ height: clamp(70px, 10vh, 140px); } :root{ --bottom-nav-h: 72px; } .bottom-nav{ left: 50%; right: auto; transform: translateX(-50%); padding: 10px 12px; } .bottom-nav-inner{ justify-content: center; padding: 0 8px; width: 100%; } .bottom-nav a{ height: calc(var(--bottom-nav-h) - 18px); font-size: 14px; padding: 0 14px; } .hero-daytitle,.live-now{ font-size: 18px; min-height: 40px; padding: 9px 14px; } } /* ============ qualidade-do-ar page (antes inline em render_aq_page) ============ */ .aqp-hero{ background:rgba(255,255,255,.82); border-radius:var(--radius); padding:20px; box-shadow:0 10px 22px rgba(14,122,191,.10); display:flex;flex-direction:column;gap:16px; } .aqp-days{ display:grid; grid-template-columns:repeat(auto-fit,minmax(240px,1fr)); gap:12px; } .aqp-day{ border-radius:14px; padding:16px; display:flex;flex-direction:column;gap:10px; border:1.5px solid rgba(58,168,232,.18); background:rgba(255,255,255,.72); position:relative;overflow:hidden; } .aqp-day::before{ content:""; position:absolute;inset:0; border-radius:inherit; opacity:.07; pointer-events:none; background:var(--aqp-color,#22c55e); } .aqp-day-header{ display:flex;align-items:center;justify-content:space-between;gap:8px; } .aqp-day-label{font-weight:800;font-size:15px;color:var(--text);} .aqp-day-dm{font-size:12px;color:var(--muted);} .aqp-status-row{ display:flex;align-items:center;gap:10px; } .aqp-emoji{font-size:36px;line-height:1;} .aqp-status-text{display:flex;flex-direction:column;gap:2px;} .aqp-aqi-label{font-size:18px;font-weight:800;line-height:1.1;} .aqp-aqi-num{font-size:12px;color:var(--muted);} .aqp-bar-wrap{margin-top:2px;} .aqp-bar-track{ height:8px;border-radius:999px; background:linear-gradient(90deg,#22c55e 0%,#eab308 33%,#f97316 55%,#ef4444 70%,#a855f7 85%,#7f1d1d 100%); position:relative; } .aqp-bar-pin{ position:absolute;top:50%;transform:translate(-50%,-50%); width:14px;height:14px;border-radius:50%; border:2.5px solid #fff; box-shadow:0 1px 4px rgba(0,0,0,.25); } .aqp-bar-ticks{ display:flex;justify-content:space-between; font-size:9px;color:var(--muted);margin-top:3px; } .aqp-pollutants{ display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:4px; } .aqp-pol{ background:rgba(221,242,255,.55); border:1px solid rgba(58,168,232,.14); border-radius:10px;padding:8px 10px; } .aqp-pol-name{font-size:10px;color:var(--muted);margin-bottom:3px;} .aqp-pol-val{font-size:13px;font-weight:700;} .aqp-pol-bar{ height:3px;border-radius:999px;background:rgba(58,168,232,.15);margin-top:4px;overflow:hidden; } .aqp-pol-fill{height:100%;border-radius:999px;} .aqp-legend{ display:flex;gap:8px;flex-wrap:wrap;margin-top:4px; } .aqp-legend-item{ display:flex;align-items:center;gap:5px;font-size:11px;color:var(--muted); } .aqp-legend-dot{ width:10px;height:10px;border-radius:50%;flex-shrink:0; } .aqp-nodata{ text-align:center;padding:24px;color:var(--muted);font-size:13px; } /* ============ vento page (render_wind_page) ============ * Paleta: tokens do site (--text/--muted/--accent/--accent2) + escala * Beaufort de beaufort_from_kph() via --wp-c / --wp-bg. Seta e bússola * seguem a rosa dos ventos do card de vento (disco azul-claro, agulha * #b00000). Sem animações de entrada; só o chevron responde ao toque. */ .wp-hero{ background:rgba(255,255,255,.82); border-radius:var(--radius); padding:18px 16px 16px; box-shadow:0 10px 22px rgba(14,122,191,.10); display:flex;flex-direction:column;gap:14px; } .wp-hero .card-head{margin-bottom:0;} .wp-hero .card-head .card-title{white-space:nowrap;} .wp-hero .card-head .card-subtitle{text-align:right;} .wp-title{font-size:16px;display:flex;align-items:center;gap:7px;} .wp-title svg{color:var(--accent2);flex-shrink:0;} .wp-kicker{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);} .wp-dim{color:var(--muted);font-weight:500;} .wp-arr{display:block;flex-shrink:0;overflow:visible;} .wp-arr--none{display:inline-block;border-radius:50%;border:1px dashed rgba(90,138,170,.5);} /* --- agora: corpo do card de vento da página inicial (render_wind_card_body) --- */ .wp-now{display:block;overflow:visible;} .wp-wg.is-stacked .wp-wg-s{display:none;} .wp-wg.is-stacked .wp-wg-g{flex-basis:100%;justify-content:center;} /* --- chip Beaufort --- */ .wp-bft{ display:inline-flex;align-items:center;gap:7px; padding:4px 10px 4px 4px;border-radius:999px; background:var(--wp-bg,#e0f4fb); border:1px solid rgba(58,168,232,.18); border-color:color-mix(in srgb,var(--wp-c,#3aa8e8) 32%,transparent); max-width:100%; } .wp-bft-n{width:20px;height:20px;border-radius:50%;background:var(--wp-c,#3aa8e8);color:#fff;font-size:11px;font-weight:900;display:grid;place-items:center;flex-shrink:0;} .wp-bft-txt{font-size:11px;line-height:1.25;color:var(--text);min-width:0;} .wp-bft-txt strong{font-weight:800;} .wp-bft-light{display:block;font-weight:400;color:var(--muted);} .wp-tip{position:relative;display:inline-flex;align-items:center;flex-shrink:0;margin-left:2px;cursor:default;outline:none;} .wp-tip-q{ width:14px;height:14px;border-radius:50%; border:1px solid rgba(14,122,191,.35);background:rgba(14,122,191,.10);color:#0e7abf; font-size:8.5px;font-weight:900;display:inline-flex;align-items:center;justify-content:center; -webkit-user-select:none;user-select:none; } .wp-tip:focus-visible .wp-tip-q{box-shadow:0 0 0 2px rgba(14,122,191,.35);} .wp-tip-box{ display:none;position:fixed;z-index:9999;width:200px;pointer-events:none; background:#1a3a52;color:#fff;font-size:11px;font-weight:500;line-height:1.45;text-align:left; border-radius:10px;padding:9px 11px;box-shadow:0 4px 20px rgba(14,80,160,.30); white-space:normal; } .wp-tip-box strong{display:block;margin-bottom:3px;font-size:10px;opacity:.65;letter-spacing:.05em;text-transform:uppercase;} .wp-sum .wp-bft-txt{max-width:130px;} [dir="rtl"] .wp-tip{margin-left:0;margin-right:2px;} [dir="rtl"] .wp-tip-box{text-align:right;} /* --- faixa de 14 dias --- */ .wp-strip{ display:flex;gap:6px;overflow-x:auto;padding:2px 2px 6px; scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch; } .wp-col{ flex:0 0 52px;display:flex;flex-direction:column;align-items:center;gap:4px; padding:8px 3px 6px;border-radius:12px;scroll-snap-align:start; border:1px solid transparent; } .wp-col.is-today{background:rgba(58,168,232,.10);border-color:rgba(58,168,232,.22);} .wp-col-code{font-size:9px;font-weight:800;color:var(--muted);letter-spacing:.02em;white-space:nowrap;} .wp-col-bar{width:10px;height:64px;border-radius:999px;background:rgba(58,168,232,.12);display:flex;align-items:flex-end;overflow:hidden;} .wp-col-bar span{display:block;width:100%;border-radius:999px;} .wp-col-val{display:flex;align-items:baseline;gap:1px;font-size:13px;font-weight:900;letter-spacing:-.3px;color:var(--text);white-space:nowrap;} .wp-col-val .u-wind-unit{font-size:7.5px;font-weight:700;letter-spacing:0;opacity:.7;} .wp-col-wd{font-size:10px;font-weight:700;color:var(--text);margin-top:1px;} .wp-col-dm{font-size:9px;color:var(--muted);white-space:nowrap;} .wp-hint{margin:-2px 0;font-size:11px;color:var(--muted);text-align:center;} /* --- lista dia a dia (
) --- */ .wp-list{display:flex;flex-direction:column;gap:8px;} .wp-day{ background:rgba(255,255,255,.82);border-radius:14px; box-shadow:0 6px 16px rgba(14,122,191,.08); border:0px solid rgba(58,168,232,.14); position:relative;overflow:hidden; } .wp-day::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--wp-c,#3aa8e8);opacity:.85;} .wp-day.is-today{border-color:rgba(14,122,191,.32);} .wp-day-sum{list-style:none;cursor:pointer;display:block;padding:12px 12px 12px 16px;} .wp-day-sum::-webkit-details-marker{display:none;} .wp-day-sum::marker{content:"";} .wp-day-sum:focus-visible{outline:2px solid var(--accent2);outline-offset:-3px;border-radius:12px;} .wp-sum{ display:grid; grid-template-columns:auto minmax(0,1fr) auto 18px; grid-template-areas:"when dir max chev" "mid mid mid mid" "foot foot foot foot"; gap:8px 10px;align-items:center; } .wp-day-when{grid-area:when;display:flex;flex-direction:column;min-width:52px;} .wp-day-wd{font-size:14px;font-weight:800;line-height:1.15;} .wp-day-dm{font-size:11px;color:var(--muted);} .wp-day-dir{grid-area:dir;display:flex;align-items:center;gap:7px;min-width:0;} .wp-day-dir-txt{display:flex;flex-direction:column;min-width:0;} .wp-day-code{font-size:13px;font-weight:800;line-height:1.1;white-space:nowrap;} .wp-day-dirname{font-size:10px;color:var(--muted);line-height:1.15;max-height:2.3em;overflow:hidden;overflow-wrap:break-word;hyphens:manual;} .wp-day-max{grid-area:max;display:flex;align-items:baseline;gap:3px;font-size:22px;font-weight:900;letter-spacing:-1px;line-height:1;white-space:nowrap;justify-self:end;} .wp-day-max .u-wind-unit{font-size:10px;font-weight:700;letter-spacing:0;opacity:.75;} .wp-day-foot{grid-area:foot;display:flex;align-items:center;justify-content:flex-end;min-width:0;} .wp-day-meta{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:2px 12px;font-size:11px;line-height:1.3;color:var(--muted);text-align:right;min-width:0;} .wp-day-meta span{white-space:nowrap;} .wp-day-meta strong{color:var(--text);font-weight:800;} .wp-day-meta strong .u-wind-unit{font-weight:600;opacity:.8;} .wp-chev{grid-area:chev;color:var(--muted);display:grid;place-items:center;transition:transform .2s ease;} .wp-day[open] .wp-chev{transform:rotate(180deg);} .wp-day-mid{grid-area:mid;display:flex;align-items:center;gap:10px;min-width:0;} .wp-spark{flex:1 1 auto;min-width:0;display:flex;align-items:flex-end;gap:2px;height:26px;padding:0 1px;} .wp-spark i{flex:1 1 0;display:block;border-radius:2px 2px 0 0;min-width:2px;opacity:.9;} .wp-sum .wp-bft{flex:0 1 auto;min-width:0;max-width:100%;} .wp-sum .wp-bft-txt{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} /* --- hora a hora (conteúdo do
) --- */ .wp-hours{padding:0 12px 12px 16px;border-top:1px dashed rgba(58,168,232,.24);} .wp-hours-head{display:flex;justify-content:space-between;align-items:baseline;gap:8px;padding:10px 0 8px;font-size:11px;font-weight:700;color:var(--text);} .wp-hours-head .wp-dim{font-weight:500;font-size:10px;} .wp-hours-scroll{display:flex;gap:6px;overflow-x:auto;padding-bottom:6px;scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch;} .wp-hour{ flex:0 0 72px;display:flex;flex-direction:column;align-items:center;gap:4px; background:#ddf2ff91;border:1px solid rgba(58,168,232,.14);border-radius:12px; padding:8px 4px;scroll-snap-align:start; } .wp-hour-t{font-size:10px;font-weight:700;color:var(--muted);} .wp-hour-dir{ font-size:9.5px;font-weight:700;color:var(--muted);text-align:center;line-height:1.15; min-height:2.3em;display:flex;align-items:center;justify-content:center; overflow-wrap:anywhere;hyphens:manual;max-width:100%; } .wp-hour-v{display:flex;align-items:baseline;gap:2px;font-size:15px;font-weight:900;letter-spacing:-.5px;line-height:1;white-space:nowrap;} .wp-hour-v .u-wind-unit{font-size:9px;font-weight:700;letter-spacing:0;opacity:.75;} .wp-hour-g{display:flex;align-items:baseline;gap:2px;font-size:10.5px;font-weight:700;color:var(--muted);white-space:nowrap;} .wp-hour-g .u-wind-unit{font-size:8.5px;font-weight:600;opacity:.85;} .wp-hours-foot{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:11px;color:var(--muted);padding-top:6px;} .wp-hours-foot strong{color:var(--text);font-weight:800;} .wp-nodata{text-align:center;padding:24px;color:var(--muted);font-size:13px;} /* --- próximas 24h (wp_next24_html): mesmas células .wp-hour do hora a hora --- */ .wp-24-scroll{padding-top:9px;margin-top:-6px;} .wp-hour.is-now{background:rgba(58,168,232,.18);border-color:rgba(14,122,191,.38);} .wp-hour.is-now .wp-hour-t{color:var(--accent2);} .wp-hour.is-newday{position:relative;border-color:rgba(14,122,191,.30);} .wp-hour-day{ position:absolute;top:-8px;left:50%;transform:translateX(-50%); padding:1px 7px;border-radius:999px;background:var(--accent2,#0e7abf);color:#fff; font-size:8.5px;font-weight:800;letter-spacing:.02em;line-height:1.5;white-space:nowrap; max-width:calc(100% + 8px);overflow:hidden;text-overflow:ellipsis; } /* --- legenda Beaufort --- */ .wp-legend-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px 10px;} .wp-lg{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:10px;background:rgba(221,242,255,.45);border:1px solid rgba(58,168,232,.12);min-width:0;} .wp-lg-n{width:22px;height:22px;border-radius:50%;color:#fff;font-size:11px;font-weight:900;display:grid;place-items:center;flex-shrink:0;} .wp-lg-txt{display:flex;flex-direction:column;min-width:0;line-height:1.2;} .wp-lg-name{font-size:11px;font-weight:800;line-height:1.15;} .wp-lg-range{font-size:10px;color:var(--muted);} /* --- RTL (ar/fa) --- */ [dir="rtl"] .wp-day::before{left:auto;right:0;} [dir="rtl"] .wp-day-sum{padding:12px 16px 12px 12px;} [dir="rtl"] .wp-hours{padding:0 16px 12px 12px;} [dir="rtl"] .wp-day-nums{align-items:flex-start;} @media (min-width:768px){ .wp-hero{padding:22px 20px 20px;} .wp-strip{justify-content:space-between;} .wp-col{flex:1 1 0;min-width:52px;} .wp-col-val{font-size:14px;} .wp-col-val .u-wind-unit{font-size:8.5px;} .wp-col-bar{height:84px;width:12px;} .wp-col-val{font-size:13px;} .wp-col-wd{font-size:11px;} .wp-hint{font-size:12px;} .wp-day-sum{padding:14px 16px 14px 20px;} .wp-sum{grid-template-columns:76px minmax(0,1fr) auto 18px;gap:8px 14px;} .wp-day-wd{font-size:15px;} .wp-day-max{font-size:26px;} .wp-spark{height:32px;} .wp-hour{flex-basis:86px;} .wp-hour-dir{font-size:10px;} .wp-legend-grid{grid-template-columns:repeat(3,1fr);} .wp-sum .wp-bft-txt{max-width:260px;} .wp-day-meta{font-size:12px;gap:2px 14px;} .wp-day-mid{gap:14px;} } @media (prefers-reduced-motion: reduce){ .wp-chev{transition:none;} } /* ============================================================================ * BLOCO 3 — PWA BANNER (compartilhado) * ============================================================================ */ .pwa-banner{ position:fixed;top:0;left:0;right:0;z-index:99999; transform:translateY(-100%);transition:transform .35s cubic-bezier(.4,0,.2,1); display:none; } .pwa-banner.is-visible{transform:translateY(0)} /* Modo minimizado: barra fina no topo do documento, empurra o conteúdo, não flutua */ .pwa-banner.is-sticky{ position:static;transform:none;transition:none;display:block; } .pwa-banner.is-sticky .pwa-banner-inner{ padding:8px 14px;box-shadow:none;border-radius:0;margin:0;max-width:none; gap:10px; } .pwa-banner.is-sticky .pwa-banner-icon{width:28px;height:28px;border-radius:7px} .pwa-banner.is-sticky .pwa-banner-icon img{border-radius:7px} .pwa-banner.is-sticky .pwa-banner-title{font-size:13px} .pwa-banner.is-sticky .pwa-banner-desc{display:none} .pwa-banner.is-sticky .pwa-banner-btn{padding:6px 14px;font-size:12px;border-radius:8px} .pwa-banner.is-sticky .pwa-banner-close{display:none} .pwa-banner-inner{ display:flex;align-items:center;gap:12px; padding:12px 16px; background:linear-gradient(135deg,#0e7abf 0%,#3aa8e8 100%); color:#fff;font-family:Inter,system-ui,sans-serif; box-shadow:0 4px 20px rgba(0,0,0,.18); } .pwa-banner-icon{ width:40px;height:40px;border-radius:10px;flex-shrink:0;overflow:hidden; } .pwa-banner-icon img{width:100%;height:100%;object-fit:cover;border-radius:10px} .pwa-banner-text{flex:1;min-width:0} .pwa-banner-title{font-size:14px;font-weight:700;line-height:1.2} .pwa-banner-desc{font-size:12px;opacity:.88;line-height:1.3;margin-top:2px} .pwa-banner-btn{ flex-shrink:0;background:#fff;color:#0e7abf;border:none;border-radius:10px; padding:9px 18px;font-size:13px;font-weight:700;cursor:pointer; font-family:inherit;transition:background .15s,transform .1s; white-space:nowrap; } .pwa-banner-btn:active{transform:scale(.96)} .pwa-banner-close{ flex-shrink:0;background:none;border:none;color:rgba(255,255,255,.7); font-size:22px;line-height:1;cursor:pointer;padding:4px; transition:color .15s;font-family:inherit; } .pwa-banner-close:hover{color:#fff} @media(min-width:600px){ .pwa-banner-inner{ max-width:580px;margin:12px auto;border-radius:14px; padding:14px 20px; } } /* ============================================================================ * BLOCO 4 — TÁBUA DE MARÉS * ============================================================================ * Estilos da view //tabua-de-mares/. Reaproveita as variáveis do tema * (--text, --muted, --accent, --accent2, --radius). * * Layout: tabela de linhas (uma por dia), cada linha com colunas flex: * - Data (azul, fixa ~92px) * - Nascente/Poente (amarelo, fixa ~110px) * - 3-5 marés (1fr cada, brancas com borda) * * Em mobile (≤520px) a linha se reorganiza em 2 sub-linhas: header à * esquerda + marés em grid 2x2 à direita. * ============================================================================ */ .tidep-hero{ background:rgba(255,255,255,.82); border-radius:var(--radius); padding:20px; box-shadow:0 10px 22px rgba(14,122,191,.10); display:flex;flex-direction:column;gap:14px; } .tidep-table{display:flex;flex-direction:column;gap:6px;} .tidep-row{ display:flex;gap:6px;align-items:stretch; } .tidep-cell{ border-radius:10px; padding:10px 8px; display:flex;flex-direction:column;justify-content:center;align-items:center; text-align:center;line-height:1.3; min-width:0; } /* Coluna data (azul) */ .tidep-date{ background:#0e7abf; color:#e6f1fb; flex:0 0 92px; font-weight:600; } .tidep-date-dm{font-size:15px;font-weight:700;} .tidep-date-wd{font-size:11px;opacity:.85;text-transform:capitalize;margin-top:2px;} /* Coluna nascente/poente (amarelo) */ .tidep-astro{ background:#faeeda; color:#633806; flex:0 0 110px; gap:4px; } .tidep-astro-line{ display:flex;flex-direction:column;align-items:center;gap:1px; } .tidep-astro-label{font-size:11px;font-weight:700;} .tidep-astro-val{font-size:13px;} /* Células de maré (brancas, com borda) */ .tidep-tide{ background:#fff; border:1px solid rgba(58,168,232,.18); flex:1 1 0; gap:2px; } .tidep-tide-type{ font-size:12px;font-weight:800;letter-spacing:.3px; color:var(--text); } .tidep-tide-time{ font-size:14px;font-weight:600;color:var(--text); } .tidep-tide-height{ font-size:12px;color:var(--muted); } /* Realce sutil pra distinguir ALTA de BAIXA sem ficar ruidoso */ .tidep-tide-high{ border-color:rgba(14,122,191,.28); } .tidep-tide-high .tidep-tide-type{color:#0e7abf;} .tidep-tide-low{ border-color:rgba(168,90,20,.22); } .tidep-tide-low .tidep-tide-type{color:#a85a14;} .tidep-tide-empty{ flex:1;background:#fff;color:var(--muted);font-size:12px; border:1px dashed rgba(58,168,232,.28); } .tidep-nodata{ text-align:center;padding:24px;color:var(--muted);font-size:13px; background:rgba(255,255,255,.55);border-radius:12px; } .tidep-disclaimer{ font-size:11px;color:var(--muted);line-height:1.5; margin:6px 0 0;padding:10px 12px; background:rgba(58,168,232,.06);border-radius:8px; border-left:3px solid rgba(58,168,232,.32); } .tidep-disclaimer a{ color:var(--accent2);text-decoration:underline;text-underline-offset:2px; } .tidep-disclaimer a:hover{ color:var(--accent); } /* ===== Tide CARD (resumo de 1 dia, embutido em hoje/amanhã) ===== * Diferente da .tidep-table (página inteira), aqui é um único article.card * com cabeçalho + uma única "linha" contendo data + astro + 4 marés. * Visual harmonizado com .aq-card. */ .tide-card{ display:flex;flex-direction:column;gap:12px; } /* Layout principal: data (fixa) + astro (fixa) + grid de marés (flex:1). * Reaproveita as classes .tidep-cell, .tidep-date, .tidep-astro e suas * filhas — exatamente o que a tábua completa usa. Em mobile reorganiza * em duas sublinhas: (data + astro) + (marés 2x2) — mesmo padrão da * tábua. */ .tide-card-row{ display:flex;gap:6px;align-items:stretch; } .tide-card-row .tidep-date{ flex:0 0 92px; } .tide-card-row .tidep-astro{ flex:0 0 110px; } .tide-card-tides{ flex:1 1 0; display:grid; grid-template-columns:repeat(4, 1fr); gap:6px; min-width:0; } .tide-card-tide{ background:var(--color-background-primary, #fff); border:1px solid rgba(58,168,232,.18); border-radius:10px; padding:10px 6px; display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px; text-align:center;line-height:1.2; min-width:0; } .tide-card-tide-type{ font-size:11px;font-weight:800;letter-spacing:.3px; color:var(--text); } .tide-card-tide-time{ font-size:14px;font-weight:600;color:var(--text); } .tide-card-tide-height{ font-size:11px;color:var(--muted); } .tide-card-tide-high{ border-color:rgba(14,122,191,.28); } .tide-card-tide-high .tide-card-tide-type{color:#0e7abf;} .tide-card-tide-low{ border-color:rgba(168,90,20,.22); } .tide-card-tide-low .tide-card-tide-type{color:#a85a14;} /* Mobile: empilha data+astro lado a lado em cima e marés 2x2 embaixo. * Mesma lógica e mesmos breakpoints da tábua completa (.tidep-row), pra * manter consistência visual. */ @media (max-width: 900px){ .tide-card-row{ flex-wrap:wrap; } .tide-card-row .tidep-date{ flex:1 1 40%; flex-direction:row;justify-content:center;gap:8px; padding:8px 10px; } .tide-card-row .tidep-date .tidep-date-dm{font-size:14px;} .tide-card-row .tidep-date .tidep-date-wd{font-size:11px;margin-top:0;} .tide-card-row .tidep-astro{ flex:1 1 40%; flex-direction:row;justify-content:space-around;gap:12px; padding:8px 10px; } /* Pares "Nascente / hora" continuam empilhados verticalmente, mas os * dois pares ficam lado a lado dentro da caixa amarela. */ .tide-card-row .tidep-astro .tidep-astro-line{flex-direction:column;gap:0;align-items:center;} .tide-card-row .tidep-astro .tidep-astro-label{font-size:10px;} .tide-card-row .tidep-astro .tidep-astro-val{font-size:13px;font-weight:600;} .tide-card-tides{ flex:1 1 100%; grid-template-columns:repeat(2, 1fr); } } /* ===== Mobile / tablet: reorganiza em duas sublinhas ===== * Container vira flex-wrap; data + astro ocupam a primeira sub-linha; * marés vão pra segunda em grid 2 colunas (cobrindo 4 marés tipicas). * * Breakpoint deliberadamente alto (900px) porque o layout horizontal * desktop só fica confortável a partir de ~960px de viewport: abaixo * disso, as 4 células de maré ficam apertadas demais (cada uma com * ~80px) e o texto "ALTA 14h34 2.31 m" sobrepõe visualmente entre * células vizinhas. Em 99% dos casos o usuário do site (mobile-first) * vai ver o layout 2x2; o horizontal fica reservado pra desktops largos. */ @media (max-width: 900px){ /* Cabeçalho: empilha título e subtítulo verticalmente, senão título * "Tábua de Marés" + subtítulo "Cidade (UF) • próximos dias" não * cabem lado a lado e os dois quebram em duas linhas cada. */ .tidep-hero .card-head{ flex-direction:column; align-items:flex-start; gap:2px; margin-bottom:6px; } .tidep-hero .card-subtitle{ font-size:11px; } .tidep-row{ flex-wrap:wrap; } .tidep-date{ flex:1 1 40%; flex-direction:row;justify-content:center;gap:8px; padding:8px 10px; } .tidep-date-dm{font-size:14px;} .tidep-date-wd{font-size:11px;margin-top:0;} .tidep-astro{ flex:1 1 40%; flex-direction:row;justify-content:space-around;gap:12px; padding:8px 10px; } /* Mantém label EM CIMA e hora EMBAIXO em cada par (igual ao desktop), * apenas com os dois pares lado a lado dentro da caixa amarela. * Sem isso, "Nascente 05:43" e "Poente 17:21" ficavam empurrados em uma * só linha e visualmente embolavam. */ .tidep-astro-line{flex-direction:column;gap:0;align-items:center;} .tidep-astro-label{font-size:10px;} .tidep-astro-val{font-size:13px;font-weight:600;} .tidep-tide{ flex:1 1 calc(50% - 3px); min-height:60px; padding:6px 4px; } .tidep-tide-time{font-size:13px;} .tidep-tide-type{font-size:11px;} .tidep-tide-height{font-size:11px;} } /* ==================================================================== * RTL (direita → esquerda) — árabe (ar) e persa (fa) * -------------------------------------------------------------------- * O recebe dir="rtl" e o navegador já espelha o fluxo natural do * texto, a ordem de flex/grid e o scroll. Este bloco corrige apenas o que * NÃO é espelhado automaticamente: posicionamento absoluto com left/right * físicos, paddings/margens direcionais, ícones com máscara e glifos * direcionais (setas). Mantido como override no fim do arquivo para não * tocar as regras LTR existentes — cinto + suspensório. * ==================================================================== */ /* Tipografia: alinhamento natural à direita. */ [dir="rtl"] body{ text-align:right; } /* --- Busca: lupa, padding do input e botão limpar trocam de lado --- */ [dir="rtl"] .search-wrap::before{ right:auto; left:12px; } [dir="rtl"] .search-input{ padding-right:12px; padding-left:42px; text-align:right; } [dir="rtl"] .search-clear{ right:auto; left:10px; } /* Responsivo: a lupa maior no breakpoint também espelha. */ [dir="rtl"] .search-wrap::before{ right:auto; } @media (min-width:768px){ [dir="rtl"] .search-wrap::before{ left:14px; right:auto; } [dir="rtl"] .search-input{ padding-left:48px; padding-right:12px; } } /* --- Decoração do hero (bolha radial) espelha para o lado esquerdo --- */ [dir="rtl"] .hero-city::after{ right:auto; left:-40px; } /* --- Listas / itens com alinhamento físico à esquerda --- */ [dir="rtl"] .state-item, [dir="rtl"] .suggest-item, [dir="rtl"] .suggest-empty{ text-align:right; } /* --- Glifos direcionais embutidos no CTA do herói ("ver previsão →"). * A seta é renderizada num separado do texto. * Em RTL ela deve apontar para a esquerda: invertemos visualmente o glifo * via transform, sem tocar no texto traduzido. */ .hero-cta-arrow{ display:inline-block; } [dir="rtl"] .hero-cta-arrow, [dir="rtl"] .arrow-rtl{ transform:scaleX(-1); } /* --- Trilha do sol: o offset central translateX(-50%) é simétrico, então * permanece válido em RTL; nada a fazer. Documentado para evitar regressão. */ /* --- Chips horizontais com scroll-snap: o flex já inverte; o scroll começa * naturalmente da direita. Sem override necessário. --- */ /* ============================================================================ * BLOCO 4 — CHAT DE IA (previsão do tempo) * ============================================================================ * Botão flutuante imediatamente acima do bottom-nav + painel de chat. * O painel abre como bottom sheet, preso ao rodapé e acima visualmente * do botão e do menu em mobile e desktop. * Toda a paleta vem das vars do tema (:root) — nada hardcoded fora dela * além dos rgba() derivados do accent, mesmo padrão do resto do arquivo. * ============================================================================ */ :root{--aichat-float-space:54px;} /* Reserva espaço apenas nas páginas em que o botão flutuante existe. */ .has-aichat-float .app-content{ padding-bottom:calc(14px + var(--bottom-nav-h) + var(--bottom-nav-gap) + var(--aichat-float-space) + 10px); } @media (min-width:768px){ .has-aichat-float .app-content{ padding-bottom:calc(18px + var(--bottom-nav-h) + var(--bottom-nav-gap) + var(--aichat-float-space) + 14px); } } /* ---- Botão flutuante, sem container externo ---- */ .aichat-bar{ position:fixed;left:50%; bottom:calc(var(--bottom-nav-h) + var(--bottom-nav-gap) + 10px); z-index:9998; display:flex;align-items:center;gap:10px; width:min(880px, calc(100vw - 16px)); margin:0;padding:0 14px;height:44px;cursor:text; transform:translateX(-50%); border-radius:999px; -webkit-appearance:none;appearance:none; opacity:1 !important; isolation:isolate; /* Assinatura visual de chat de IA: BORDA em gradiente pastel (céu → * azul-pervinca → lilás suave), técnica de dupla camada de background: * a 1ª (padding-box) pinta o miolo claro; a 2ª (border-box) vaza só no * 1px da borda transparente e vira o anel colorido. O preenchimento * continua liso e claro — as cores ficam SÓ no contorno, sem exagero. */ border:1px solid transparent; /* A base sólida reproduz a superfície original do .app. Sobre ela ficam * as duas camadas RGBA antigas, preservando inclusive o gradiente suave * que aparecia através do miolo branco a .72 — agora sem transparência * até o conteúdo que estiver atrás do botão. */ background-color:#d8e7f2; background-image: linear-gradient(rgba(255,255,255,.72), rgba(255,255,255,.72)), linear-gradient(120deg, rgba(58,168,232,.55), rgba(122,170,255,.50), rgba(168,150,242,.45), rgba(58,168,232,.55)); background-origin:padding-box,border-box; background-clip:padding-box,border-box; background-repeat:no-repeat; color:rgba(90,138,170,.95); font-family:inherit;font-weight:500;font-size:14px; text-align:left;-webkit-user-select:none;user-select:none; box-shadow: 0 1px 2px rgba(14,122,191,.05), 0 0 18px rgba(58,168,232,.16), 0 0 18px rgba(168,150,242,.12); } /* Hover com a composição antiga sobre a mesma base inteiramente opaca. */ .aichat-bar:hover{ background-color:#d8e7f2; background-image: linear-gradient(rgba(255,255,255,.84), rgba(255,255,255,.84)), linear-gradient(120deg, rgba(58,168,232,.62), rgba(122,170,255,.57), rgba(168,150,242,.52), rgba(58,168,232,.62)); background-origin:padding-box,border-box; background-clip:padding-box,border-box; box-shadow: 0 1px 2px rgba(14,122,191,.05), 0 0 22px rgba(58,168,232,.20), 0 0 22px rgba(168,150,242,.15); } /* Sem efeito de clique/foco próprio: o clique só abre o chat, e o estado * visual fica por conta do :hover acima. Outline suprimido no mouse; o anel * nativo do navegador permanece para navegação por teclado (acessibilidade). */ .aichat-bar:active{outline:none;} .aichat-bar:focus:not(:focus-visible){outline:none;} /* Faísca com as MESMAS cores do anel da barra (céu → pervinca → lilás): * o traço do SVG usa stroke:currentColor, que não aceita gradiente — então * o gradiente entra como background do span e o SVG vira MÁSCARA (recorta o * fundo colorido no formato da faísca). Mesma técnica do .loc-icon do site. * O url() embute o próprio SVG da faísca dupla em data URI. */ .aichat-bar-ic{ width:18px;height:18px;flex:0 0 auto; border-radius:0;box-shadow:none;color:transparent; background:linear-gradient(120deg, rgba(58,168,232,.95), rgba(122,170,255,.92), rgba(168,150,242,.90)); -webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l1.9 4.6L18.5 9.5l-4.6 1.9L12 16l-1.9-4.6L5.5 9.5l4.6-1.9z'/%3E%3Cpath d='M19 15l.8 1.9 1.9.8-1.9.8L19 20.4l-.8-1.9-1.9-.8 1.9-.8z'/%3E%3C/svg%3E"); mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l1.9 4.6L18.5 9.5l-4.6 1.9L12 16l-1.9-4.6L5.5 9.5l4.6-1.9z'/%3E%3Cpath d='M19 15l.8 1.9 1.9.8-1.9.8L19 20.4l-.8-1.9-1.9-.8 1.9-.8z'/%3E%3C/svg%3E"); -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat; -webkit-mask-position:center;mask-position:center; -webkit-mask-size:contain;mask-size:contain; } /* O SVG inline fica invisível (color:transparent no pai) — quem aparece é a * máscara. Mantido no DOM para acessibilidade/estrutura intactas. */ .aichat-bar-ic svg{width:17px;height:17px;display:block;visibility:hidden;} .aichat-bar-txt{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} /* Chevron à direita, discreto (sem negrito de pill de CTA). */ .aichat-bar-arrow{display:block;color:var(--accent2);font-size:18px;line-height:1;font-weight:600;opacity:.85;} /* ---- Overlay (fundo escurecido, fecha ao toque) ---- */ .aichat-overlay{ position:fixed;inset:0;z-index:10000; background:rgba(26,58,82,.28); backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px); opacity:0;transition:opacity .25s ease; } .aichat-overlay.is-open{opacity:1;} /* ---- Painel de rodapé (bottom sheet) ---- * Ao abrir, fica encostado no limite inferior da viewport e cobre a região * do botão/menu. Não soma a altura do bottom-nav ao posicionamento. */ .aichat-panel{ position:fixed;left:50%; bottom:0; z-index:10001;width:min(420px, 100vw); display:flex;flex-direction:column; max-height:min(76vh, 620px); max-height:min(76dvh, 620px); border-radius:20px 20px 0 0;overflow:hidden; background:rgba(255,255,255,.93); border:1px solid rgba(58,168,232,.25); border-bottom:0; box-shadow:0 -20px 60px rgba(14,122,191,.28); backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px); transform:translate(-50%, 100%); opacity:0;pointer-events:none; transition:transform .30s cubic-bezier(.2,.9,.3,1), opacity .22s ease; } .aichat-panel.is-open{ transform:translate(-50%, 0); opacity:1;pointer-events:auto; } /* ---- Cabeçalho ---- */ .aichat-head{ display:flex;align-items:center;gap:10px;padding:12px 14px; border-bottom:1px solid rgba(58,168,232,.16); background:linear-gradient(135deg, rgba(58,168,232,.14), rgba(255,255,255,.35)); } .aichat-head-ic{ width:32px;height:32px;flex:0 0 auto;display:grid;place-items:center; border-radius:50%;color:#fff; background:linear-gradient(135deg, var(--accent), var(--accent2)); box-shadow:0 4px 10px rgba(14,122,191,.25); } .aichat-head-ic svg{width:16px;height:16px;display:block;} .aichat-head-txt{display:flex;flex-direction:column;min-width:0;flex:1;} .aichat-head-txt strong{font-size:14px;color:var(--text);line-height:1.2;} .aichat-head-txt span{ font-size:11.5px;color:var(--muted); white-space:nowrap;overflow:hidden;text-overflow:ellipsis; } .aichat-close{ width:30px;height:30px;flex:0 0 auto;display:grid;place-items:center; border-radius:50%;border:1px solid rgba(58,168,232,.20);cursor:pointer; background:rgba(255,255,255,.70);color:var(--text);padding:0; transition:background .12s ease, transform .12s ease; } /* X em SVG: display:block zera a linha-base tipográfica; com place-items:center * o desenho fica geometricamente centrado no círculo (o glifo × não fica). */ .aichat-close svg{width:14px;height:14px;display:block;} .aichat-close:hover{background:rgba(255,255,255,.95);transform:scale(1.06);} /* ---- Área de mensagens ---- */ .aichat-msgs{ flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch; padding:14px;display:flex;flex-direction:column;gap:10px; min-height:190px;overscroll-behavior:contain; } .aichat-msg{ max-width:86%;padding:9px 12px;border-radius:14px; font-size:13.5px;line-height:1.5; white-space:pre-wrap;overflow-wrap:break-word;word-break:break-word; animation:aichat-msg-in .22s ease both; } .aichat-msg--ai{ align-self:flex-start;color:var(--text); background:rgba(58,168,232,.12);border:1px solid rgba(58,168,232,.16); border-bottom-left-radius:6px; } .aichat-msg--user{ align-self:flex-end;color:#fff; background:linear-gradient(135deg, var(--accent), var(--accent2)); box-shadow:0 4px 12px rgba(14,122,191,.20); border-bottom-right-radius:6px; } @keyframes aichat-msg-in{ from{opacity:0;transform:translateY(6px);} to{opacity:1;transform:translateY(0);} } /* ---- Indicador "digitando" (3 pontinhos) ---- */ .aichat-typing{display:flex;align-items:center;gap:4px;padding:12px 14px;} .aichat-typing span{ width:7px;height:7px;border-radius:50%; background:var(--accent2);opacity:.35; animation:aichat-dot 1.1s infinite ease-in-out; } .aichat-typing span:nth-child(2){animation-delay:.15s;} .aichat-typing span:nth-child(3){animation-delay:.30s;} @keyframes aichat-dot{ 0%,60%,100%{opacity:.30;transform:translateY(0);} 30%{opacity:1;transform:translateY(-3px);} } /* ---- Linha de entrada ---- */ .aichat-inputrow{ display:flex;gap:8px; padding:10px 10px calc(10px + env(safe-area-inset-bottom, 0px)); border-top:1px solid rgba(58,168,232,.16); background:rgba(255,255,255,.65); } .aichat-inputrow input{ flex:1;min-width:0;height:40px;padding:0 14px; border-radius:999px;border:1.5px solid rgba(58,168,232,.22); background:rgba(255,255,255,.85);color:var(--text); font-family:inherit;font-size:16px; /* 16px evita zoom automático no iOS */ outline:none;transition:border-color .12s ease, box-shadow .12s ease; } @media (min-width:520px){ .aichat-inputrow input{font-size:13.5px;} } .aichat-inputrow input::placeholder{color:var(--muted2);} .aichat-inputrow input:focus{ border-color:var(--accent); box-shadow:0 0 0 3px rgba(58,168,232,.15); } .aichat-send{ width:40px;height:40px;flex:0 0 auto;display:grid;place-items:center; border-radius:50%;border:none;cursor:pointer;color:#fff;padding:0; background:linear-gradient(135deg, var(--accent), var(--accent2)); box-shadow:0 6px 14px rgba(14,122,191,.28); transition:transform .12s ease, box-shadow .12s ease, opacity .12s ease; } /* O avião de papel aponta pro canto superior direito, então sua massa visual * é assimétrica: centrado geometricamente ele PARECE torto. O translate * desloca 1px pra baixo-esquerda e alinha o centro ÓPTICO com o círculo. */ .aichat-send svg{width:17px;height:17px;display:block;transform:translate(-1px,1px);} .aichat-send:hover{transform:scale(1.06);box-shadow:0 8px 18px rgba(14,122,191,.34);} .aichat-send:active{transform:scale(.96);} .aichat-send:disabled{opacity:.55;cursor:default;transform:none;} /* ---- Acessibilidade: respeita redução de movimento ---- */ @media (prefers-reduced-motion: reduce){ .aichat-panel,.aichat-overlay,.aichat-bar,.aichat-msg{transition:none;animation:none;} .aichat-typing span{animation:none;opacity:.8;} } /* ---- RTL: espelha barrinha e balões (mesmo padrão do bloco RTL acima) ---- */ [dir="rtl"] .aichat-bar{text-align:right;} [dir="rtl"] .aichat-bar-arrow{transform:scaleX(-1);} [dir="rtl"] .aichat-msg--ai{border-bottom-left-radius:14px;border-bottom-right-radius:6px;} [dir="rtl"] .aichat-msg--user{border-bottom-right-radius:14px;border-bottom-left-radius:6px;}