:root { --accent:#38bdf8; --glass-border:rgba(148,163,184,.2); }
.app-shell {max-width:1120px; padding:32px 24px 48px; display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:24px; align-items:start;}
.app-header,.footer-actions,footer {grid-column:1/-1; width:100%;}
header.app-header {align-items:flex-start; margin:0; padding:12px 56px 24px 0; border-bottom:1px solid var(--glass-border);}
.brand-title {font-size:clamp(1.5rem,5vw,2.7rem);letter-spacing:.07em;}
.brand-tagline {color:var(--text-muted);margin-top:10px;line-height:1.5;}
.card {margin:0; min-width:0; border-radius:28px;}
.player-card {grid-column:1;grid-row:2; background:linear-gradient(145deg,var(--accent-glow),var(--bg-card) 65%);}
#card-prog {grid-column:2;grid-row:2/4;}
#card-mapa {grid-column:1/-1;}
.program-feature {padding:8px 0 24px;}
.eyebrow {text-transform:uppercase;letter-spacing:.16em;font-size:.72rem;font-weight:700;color:var(--accent);}
#program-current {font-size:clamp(1.6rem,3vw,2.2rem);line-height:1.2;margin:12px 0 20px;overflow-wrap:anywhere;}
.next-program {padding:14px 16px;border:1px solid var(--glass-border);border-radius:16px;line-height:1.6;}
.next-program span {display:block;color:var(--text-muted);font-size:.75rem;}
#program-next {font-size:.9rem;}
.live-status {flex-wrap:wrap;gap:12px;}
.schedule-toolbar {display:flex;align-items:center;justify-content:space-between;gap:12px;}
.schedule-toolbar h2 {font-size:1.1rem;}
.schedule-days {display:flex;gap:8px;overflow-x:auto;padding:8px 0 16px;}
.schedule-days button,#schedule-today {flex-shrink:0;border:1px solid var(--glass-border);border-radius:12px;min-height:44px;padding:8px 12px;background:var(--bg-deep);color:var(--text-main);cursor:pointer;}
.schedule-days button[aria-pressed=true] {background:var(--accent);color:#082f49;font-weight:700;}
.schedule-list {max-height:530px;scrollbar-width:thin;}
.schedule-item {gap:14px;line-height:1.55;padding:14px 10px;}
.schedule-time {flex:0 0 94px;font-size:.78rem;color:var(--text-muted);font-variant-numeric:tabular-nums;}
.schedule-name {font-size:.88rem;overflow-wrap:anywhere;}
.schedule-item.is-current .schedule-name {font-weight:700;}
.digital-clock-container {margin-top:18px;}
.anchor-controls {opacity:.85;}
button:focus-visible,a:focus-visible,input:focus-visible {outline:3px solid var(--accent);outline-offset:4px;}
.map-container {height:330px;}
footer {line-height:1.8;}
.brand-lockup {display:flex;align-items:center;gap:14px;}
.brand-lockup img {border-radius:12px;flex-shrink:0;}
.app-tools {grid-column:1/-1;display:flex;gap:10px;flex-wrap:wrap;}
.app-tools button,.dialog-actions button,.dialog-actions a {min-height:44px;padding:12px 16px;border:1px solid var(--glass-border);border-radius:12px;background:var(--bg-card);color:var(--text-main);font:inherit;font-size:.8rem;cursor:pointer;text-decoration:none;}
#share-radio {border-color:var(--accent);color:var(--accent);}
.app-shell .player-card {grid-row:3;}
.app-shell #card-prog {grid-row:3/5;}
.app-shell #more-panel {grid-column:1/-1;grid-row:2;}   /* v3.7.0: no lugar da antiga barra Instalar/Compartilhar */
#network-status {grid-column:1/-1;border:1px solid var(--amber);padding:12px;color:var(--amber);font-size:.85rem;}
dialog {color:var(--text-main);background:var(--bg-card);border:1px solid var(--glass-border);border-radius:24px;padding:28px;max-width:460px;width:calc(100% - 28px);max-height:calc(100dvh - 36px);overflow:auto;box-shadow:0 24px 90px #0008;}
dialog::backdrop {background:#020b15cc;backdrop-filter:blur(5px);}
dialog h2 {padding-right:24px;font-size:1.35rem;line-height:1.3;}
dialog p {font-size:.88rem;color:var(--text-muted);line-height:1.6;}
.dialog-close {position:absolute;right:12px;top:12px;width:40px;height:40px;border:0;background:transparent;color:var(--text-main);font-size:1.8rem;cursor:pointer;}
.share-qr {display:block;width:min(100%,290px);height:auto;margin:20px auto;border-radius:8px;}
dialog label {display:block;font-size:.75rem;color:var(--text-muted);margin-bottom:8px;}
#share-url {width:100%;padding:12px;border:1px solid var(--glass-border);background:var(--bg-deep);color:var(--text-main);border-radius:8px;font-size:.8rem;}
.dialog-actions {display:flex;flex-wrap:wrap;gap:8px;margin-top:14px;}
[hidden] {display:none!important;}
@media(max-width:420px) {.brand-lockup {gap:8px;}.brand-lockup img {width:36px;height:36px;}.brand-title {font-size:1.35rem!important;} .app-tools button {font-size:.73rem;padding:10px 12px;}}
/* ============================================================
   SPRINT 30 · v3.11.0 · 2026-10-15T20:30:00-03:00 · Jossian Brito
   Toca-discos do player: logo girando à esquerda + equalizador à direita
   (substitui o espectro circular do SPRINT 13 em volta de um logo de 84 px).

   MEDIDA ÚNICA: --disc (diâmetro do disco). Tudo deriva dela, como o
   diâmetro do hélice dita o resto do Kort nozzle:
     - disco   = --disc × --disc  (redondo, border-radius 50%)
     - barras  = altura de 72% do disco → equalizador "abraçado" ao disco,
                 centrado na mesma linha d'água (align-items:center).
   --disc = clamp(120px, 34vw, 210px): 34% da largura da tela, nunca menos
   de 120 px nem mais de 210 px (computador). Na aba Rádio do celular, que
   tem de caber numa tela só, a regra da aba fixa 112 px.

   GIRO (sentido horário): rotate(0 → 360deg) em CSS é horário. Uma volta
   a cada 6 s = 10 rpm. Um LP gira a 33⅓ rpm (1,8 s/volta) — rápido demais
   para ler o logo; 10 rpm é o "giro de cortesia" de um disco na vitrine.
   A animação existe sempre, mas fica PAUSADA (animation-play-state) e só
   anda com .is-spinning, que o equalizer.js liga no evento "playing" e
   desliga em pause/ended/waiting/error. Pausar (e não remover) a animação
   faz o disco parar onde está, como um prato que perde a tração, em vez
   de pular de volta para 0°.
   Movimento reduzido: regra explícita abaixo (o disco fica parado).
   ============================================================ */
.spectrum {margin:0 0 26px;}
.spectrum-deck {--disc:clamp(120px,34vw,210px); display:flex; align-items:center; justify-content:center; gap:clamp(16px,5vw,32px);}
/* o disco: sulcos de vinil (gradiente radial repetido a cada 3 px) e o logo como selo central */
.official-cover.radio-disc {flex:0 0 var(--disc); width:var(--disc); height:var(--disc); padding:0; border-radius:50%; display:grid; place-items:center;
  background:repeating-radial-gradient(circle,#0b141b 0 1.5px,#17262f 1.5px 3px);
  box-shadow:0 0 0 2px #ffffff12, 0 10px 28px #0007, inset 0 0 0 3px #0009;
  animation:disc-spin 6s linear infinite; animation-play-state:paused;}
.radio-disc img {width:80%; height:80%; border-radius:50%; object-fit:contain;}
.radio-disc.is-spinning {animation-play-state:running;}
@keyframes disc-spin {to {transform:rotate(360deg);}}
@media(prefers-reduced-motion:reduce) {.radio-disc {animation:none;}}
/* o equalizador: barras da mesma largura, crescendo de baixo para cima.
   Cada barra = height 100% × scaleY(nível), nível 0,035…1 vindo do analisador. */
#spectrum-bars {flex:0 1 240px; min-width:0; height:calc(var(--disc) * .72); display:flex; align-items:flex-end; justify-content:space-between; gap:3px; pointer-events:none;}
#spectrum-bars span {flex:1 1 0; max-width:8px; height:100%; background:linear-gradient(to top,var(--accent) 25%,var(--amber)); border-radius:3px; transform:scaleY(.035); transform-origin:center bottom;}
.spectrum-caption {display:flex;justify-content:center;align-items:center;gap:6px 14px;flex-wrap:wrap;margin-top:12px;font-size:.6rem;letter-spacing:.08em;color:var(--accent);}
#spectrum-status {color:var(--text-muted);letter-spacing:0;}
:root {--bg-deep:#07131d;--bg-card:#101f2b;--accent:#69d5e7;--accent-glow:rgba(55,170,191,.16);--text-main:#ecf4f5;--text-muted:#a3b6c3;--amber:#f1bd70;}
body {font-family:Inter,system-ui,-apple-system,'Segoe UI',sans-serif; background-image:radial-gradient(ellipse at 15% 0%,#14303d,transparent 55%);}
button,input {font:inherit;}
.app-shell {max-width:1200px;grid-template-columns:minmax(0,1.08fr) minmax(0,1fr);gap:28px;}
.brand-title {font-family:Inter,system-ui,sans-serif;font-weight:800;letter-spacing:-.045em;background:none;-webkit-text-fill-color:var(--text-main);filter:none;}
.brand-tagline {font-size:.8rem;letter-spacing:.14em;text-transform:uppercase;}
.card {box-shadow:0 12px 40px #0002;border-radius:22px;}
.nautical-cover {position:relative;isolation:isolate;overflow:hidden;min-height:224px;border-radius:14px;margin:0 0 28px;background:radial-gradient(circle at 72% 32%,#3b8690 0,transparent 44%),linear-gradient(135deg,#12303b,#1b5663);color:#f3ede0;padding:22px;}
.nautical-cover::before,.nautical-cover::after {content:'';position:absolute;z-index:-1;width:390px;height:390px;border:1px solid #9ee1dc44;border-radius:50%;right:-120px;top:-100px;box-shadow:0 0 0 25px #9ee1dc0a,0 0 0 50px #9ee1dc0a,0 0 0 75px #9ee1dc0a;}
.nautical-cover::after {width:230px;height:230px;right:-40px;top:-20px;}
.cover-coordinate {font-size:.58rem;letter-spacing:.22em;}
.compass-mark {position:absolute;right:54px;top:10px;font-size:125px;color:var(--amber);font-family:Georgia,serif;}
.cover-bottom {display:flex;align-items:end;justify-content:space-between;margin-top:48px;gap:20px;}
.cover-bottom>span:first-child {font-size:2.8rem;line-height:.95;letter-spacing:-.05em;font-weight:800;}
.cover-bottom>span:last-child {font-size:.58rem;line-height:1.7;letter-spacing:.13em;text-align:right;}
.player-card {background:var(--bg-card);}
.live-status {margin-bottom:20px;}
.now-playing-label {font-size:.75rem;color:var(--text-muted);}
.eyebrow {color:var(--amber);font-size:.65rem;}
#program-current {font-size:clamp(1.8rem,3vw,2.65rem);letter-spacing:-.035em;margin:12px 0;}
.program-duration {font-size:.76rem;color:var(--text-muted);margin:0 0 10px;}
progress {width:100%;height:4px;border:0;border-radius:5px;overflow:hidden;accent-color:var(--amber);margin-bottom:24px;}
progress::-webkit-progress-bar {background:var(--glass-border);} progress::-webkit-progress-value {background:var(--amber);}
.next-program {border:0;border-left:2px solid var(--amber);border-radius:0;background:#ffffff04;}
.next-program span {letter-spacing:.1em;font-size:.62rem;margin-bottom:5px;}
.play-wrapper {flex-direction:row;justify-content:center;gap:18px;padding:6px 0 24px;}
.btn-play-main {width:66px;height:66px;box-shadow:0 6px 28px #69d5e730;color:#082e37;}
#play-text {font-family:inherit!important;font-size:.95rem!important;letter-spacing:.02em;text-transform:none!important;}
summary {cursor:pointer;min-height:44px;align-content:center;font-size:.85rem;font-weight:600;}
summary span {float:right;font-size:.72rem;color:var(--text-muted);font-weight:400;padding-top:3px;}
.effects-panel {border-top:1px solid var(--glass-border);padding-top:8px;}
.effects-panel .anchor-controls {margin-top:14px;}
.digital-clock-container {margin:0 0 16px;padding:16px;flex-direction:row;flex-wrap:wrap;gap:8px;justify-content:space-between;background:transparent;border:0;border-bottom:1px solid var(--glass-border);border-radius:0;}
#digital-date {font-family:inherit!important;text-shadow:none!important;letter-spacing:0!important;font-size:.78rem!important;}
.digital-clock-container>span:nth-child(2) {order:3;flex-basis:100%;font-size:.62rem!important;letter-spacing:.03em!important;}
#digital-clock {font-family:inherit;font-size:1.1rem;font-variant-numeric:tabular-nums;text-shadow:none;}
.schedule-toolbar h2 {font-size:1.05rem;letter-spacing:-.02em;}
.schedule-days {display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:4px;overflow:visible;}
.schedule-days button {min-width:0;padding:10px 2px;font-size:.68rem;}
.schedule-list {max-height:650px;}
.schedule-item {border-radius:10px;border-bottom:1px solid var(--glass-border);background:transparent;padding:16px 10px;}
.schedule-item.is-current {border-left:3px solid var(--amber);background:linear-gradient(90deg,#e4b46816,transparent);}
.service-note {font-size:.8rem;line-height:1.6;color:var(--text-muted);}
.mini-player {display:none;}
body.light-theme {--accent:#086b7b;--amber:#885100;--bg-deep:#eef3f2;--bg-card:#fff;--text-muted:#506474;background-image:none;}
body.light-theme .nautical-cover {--amber:#f1bd70;}
@media(max-width:760px) {
 .app-shell {padding-bottom:130px!important;}
 .nautical-cover {min-height:200px;}
 .cover-bottom>span:first-child {font-size:2.4rem;}
 .schedule-days button {font-size:.6rem;}
 .mini-player {display:flex;position:fixed;z-index:10001;left:12px;right:12px;bottom:12px;bottom:max(12px,env(safe-area-inset-bottom));align-items:center;gap:12px;padding:12px 14px;background:var(--bg-card);border:1px solid var(--glass-border);border-radius:18px;box-shadow:0 8px 40px #0008;}
 .mini-player>div {min-width:0;flex:1;}
 .mini-player small {display:block;color:var(--accent);font-size:.55rem;letter-spacing:.1em;}
 .mini-player strong {display:block;font-size:.85rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:4px 0;}
 #mini-status {display:block;font-size:.65rem;color:var(--text-muted);}
 .mini-symbol {color:var(--amber);font-size:2rem;}
 #mini-play {width:46px;height:46px;flex-shrink:0;border:0;border-radius:50%;background:var(--accent);color:var(--bg-deep);cursor:pointer;}
}
@media(max-width:760px) {
 .app-shell {display:flex;flex-direction:column;padding:20px 14px 36px;gap:18px;}
 .app-shell>section {width:100%;}
 .card {padding:20px;}
 #card-prog {order:1;} #more-panel {order:2;} #card-mapa {order:3;} .footer-actions {order:4;} footer {order:5;}
 .schedule-list {max-height:440px;} .map-container {height:260px;}
}
@media(prefers-reduced-motion:reduce) {
 *,*::before,*::after {animation:none!important;transition:none!important;scroll-behavior:auto!important;}
 #global-anchor-overlay {display:none;}
}

/* SPRINT 14 · v2.6.0 · Jossian Brito · Tripulação a bordo (listeners.js) */
.crew-row { display:flex; flex-wrap:wrap; align-items:center; gap:10px; margin:-12px 0 18px; }
.crew-row[hidden], .crew-peak[hidden] { display:none; }
.crew-badge, .crew-peak { display:inline-flex; align-items:center; gap:6px; padding:5px 12px; border-radius:999px;
  border:1px solid var(--glass-border); background:var(--bg-card); font-size:0.75rem; color:var(--text-muted); }
.crew-badge { border-color:var(--accent); }
.crew-badge strong { color:var(--accent); font-size:0.9rem; }
.crew-peak strong { color:var(--text-main); }
.crew-bump strong { animation:crew-bump .45s ease; }
@keyframes crew-bump { 40% { transform:scale(1.4); } }
@media (prefers-reduced-motion: reduce) { .crew-bump strong { animation:none; } }

/* SPRINT 15 · v2.7.0 · Jossian Brito · Tábua de Maré (tides.js) */
#card-mare {grid-column:1/-1;}
#card-mare[hidden] {display:none;}
.sr-only {position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;}
.tide-head {display:flex;justify-content:space-between;align-items:flex-start;gap:12px;flex-wrap:wrap;}
.tide-date {font-size:.85rem;color:var(--text-muted);margin-top:6px;}
#tide-port {min-height:44px;padding:8px 12px;border-radius:12px;border:1px solid var(--accent);background:var(--bg-deep);color:var(--text-main);font:inherit;font-size:.85rem;max-width:100%;}
.tide-nav {display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:14px 0;}
.tide-nav button {min-height:40px;min-width:44px;padding:6px 12px;border:1px solid var(--glass-border);border-radius:12px;background:var(--bg-deep);color:var(--text-main);cursor:pointer;font:inherit;font-size:.8rem;}
.tide-nav button:disabled {opacity:.45;cursor:default;}
.tide-ref {font-size:.72rem;padding:5px 10px;border-radius:999px;border:1px solid var(--glass-border);color:var(--text-muted);}
.tide-ref[data-level="direta"] {border-color:#22c55e;color:#22c55e;}
.tide-ref[data-level="próxima"] {border-color:var(--accent);color:var(--accent);}
.tide-ref[data-level="aproximada"] {border-color:#f59e0b;color:#f59e0b;}
.tide-summary {display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin-bottom:8px;}
.tide-now-box {display:flex;align-items:baseline;gap:8px;}
.tide-now-box[hidden] {display:none;}
.tide-now-box span {font-size:.72rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:.1em;}
.tide-now-box strong {white-space:nowrap;font-size:1.6rem;color:var(--accent);font-variant-numeric:tabular-nums;}
.tide-now-box em {font-style:normal;font-size:.8rem;color:var(--text-muted);}
.tide-upcoming {font-size:.85rem;margin:0;}
.tide-chart {width:100%;height:150px;display:block;margin:6px 0 10px;}
.tide-area {fill:var(--accent-glow);}
.tide-line {fill:none;stroke:var(--accent);stroke-width:2.5;vector-effect:non-scaling-stroke;}
.tide-zero {stroke:var(--text-muted);stroke-dasharray:4 4;stroke-width:1;vector-effect:non-scaling-stroke;opacity:.6;}
.tide-grid {stroke:var(--glass-border);stroke-width:1;vector-effect:non-scaling-stroke;}
.tide-axis {fill:var(--text-muted);font-size:11px;text-anchor:middle;}
.tide-chart {overflow:visible;}
.tide-dot.is-high {fill:var(--accent);} .tide-dot.is-low {fill:var(--text-muted);}
.tide-now {stroke:#f59e0b;stroke-width:1.5;vector-effect:non-scaling-stroke;}
.tide-now-dot {fill:#f59e0b;}
.tide-list {list-style:none;padding:0;margin:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:8px;}
.tide-item {display:flex;flex-direction:column;gap:2px;padding:10px 12px;border:1px solid var(--glass-border);border-radius:14px;font-variant-numeric:tabular-nums;}
.tide-item.is-next {border-color:var(--accent);}
.tide-kind {font-size:.7rem;letter-spacing:.08em;color:var(--text-muted);}
.tide-item.is-high .tide-kind {color:var(--accent);}
.tide-time {font-size:1.1rem;font-weight:700;}
.tide-level {font-size:.85rem;color:var(--text-muted);}
.tide-note {font-size:.78rem;color:#f59e0b;margin:10px 0 0;}
.tide-note:empty {display:none;}
.tide-disclaimer {font-size:.7rem;color:var(--text-muted);line-height:1.5;margin:10px 0 0;}

/* SPRINT 18 · v3.0.0 · Jossian Brito · Programação SAAM · Suape */
#card-saam {grid-column:1/-1;}
#card-saam[hidden], #saam-main[hidden], #saam-lock[hidden], .saam-banner[hidden] {display:none;}
.saam-sub {font-size:.8rem;color:var(--text-muted);margin:6px 0 0;line-height:1.5;}
.saam-form {display:flex;gap:8px;margin-top:12px;flex-wrap:wrap;}
.saam-form input {flex:1;min-width:120px;min-height:44px;padding:8px 14px;border-radius:12px;border:1px solid var(--accent);background:var(--bg-deep);color:var(--text-main);font:inherit;font-size:1.1rem;letter-spacing:.3em;}
.saam-form button, .saam-controls button {min-height:44px;padding:8px 16px;border-radius:12px;border:1px solid var(--accent);background:var(--accent);color:#082f49;font:inherit;font-weight:700;cursor:pointer;}
.saam-msg {font-size:.8rem;color:#f59e0b;min-height:1.2em;}
.saam-sync {font-size:.8rem;margin:10px 0;}
.saam-controls {display:flex;gap:10px;align-items:center;flex-wrap:wrap;}
#saam-alert-btn {background:var(--bg-deep);color:var(--text-main);}
#saam-alert-btn.is-on {background:#16a34a;border-color:#16a34a;color:#fff;}
.saam-tests {display:flex;gap:6px;align-items:center;font-size:.75rem;color:var(--text-muted);}
.saam-tests button {min-width:44px;padding:6px 10px;background:var(--bg-deep);color:var(--text-main);border-color:var(--glass-border);}
.saam-banner {margin:0 0 10px;padding:12px 14px;border-radius:14px;font-weight:700;font-size:.9rem;animation:saam-pulse 1s ease 3;}
.saam-banner.is-confirmada {background:#14532d;color:#dcfce7;}
.saam-banner.is-cancelada {background:#7f1d1d;color:#fee2e2;}
.saam-banner.is-antecipada {background:#78350f;color:#fef3c7;}
@keyframes saam-pulse {50% {transform:scale(1.02);}}
@media (prefers-reduced-motion: reduce) {.saam-banner {animation:none;}}
.saam-list {margin-top:12px;display:flex;flex-direction:column;gap:8px;}
.saam-dia {font-size:.75rem;letter-spacing:.12em;text-transform:uppercase;color:var(--accent);margin:12px 0 2px;}
.saam-item {display:flex;gap:12px;padding:12px;border:1px solid var(--glass-border);border-left:4px solid var(--text-muted);border-radius:14px;}
.saam-item.sit-confirmada {border-left-color:#22c55e;}
.saam-item.sit-prevista {border-left-color:var(--accent);}
.saam-item.sit-em-andamento {border-left-color:#f59e0b;}
.saam-item.sit-realizada, .saam-item.sit-cancelada {opacity:.55;}
.saam-item.sit-cancelada {border-left-color:#ef4444;}
.saam-hora {font-size:1.3rem;font-weight:700;font-variant-numeric:tabular-nums;min-width:58px;}
.saam-corpo {min-width:0;flex:1;}
.saam-navio {font-weight:700;overflow-wrap:anywhere;}
.saam-linha {display:flex;flex-wrap:wrap;gap:6px 10px;font-size:.75rem;color:var(--text-muted);margin-top:4px;align-items:center;}
.saam-mnb, .saam-sit {padding:2px 8px;border-radius:999px;border:1px solid var(--glass-border);}
.saam-mnb.mnb-EA {border-color:#22c55e;color:#22c55e;}
.saam-mnb.mnb-DS {border-color:#f59e0b;color:#f59e0b;}
.saam-mnb.mnb-DA {border-color:#a78bfa;color:#a78bfa;}
.sit-confirmada .saam-sit {border-color:#22c55e;color:#22c55e;}
.saam-rbq {color:var(--text-main);}
.saam-obs {font-size:.75rem;color:#f59e0b;margin-top:4px;}
.saam-events {list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:6px;}
.saam-ev {display:flex;flex-direction:column;gap:2px;padding:8px 10px;border-radius:10px;border:1px solid var(--glass-border);font-size:.8rem;}
.saam-ev small {color:var(--text-muted);}
.saam-ev.is-confirmada {border-color:#22c55e;} .saam-ev.is-cancelada {border-color:#ef4444;} .saam-ev.is-antecipada {border-color:#f59e0b;}
.saam-vazio {font-size:.8rem;color:var(--text-muted);}
.saam-link {background:none;border:none;color:var(--accent);text-decoration:underline;cursor:pointer;font:inherit;padding:0;}

/* ============================================================
   SPRINT 19 · v3.1.0 · 2026-10-12T19:30-03:00 · Jossian Brito
   Layout B — tela única com abas (só no celular, ≤ 760 px)
   - A página não rola: quem rola, se precisar, é só o conteúdo
     da aba (.app-shell vira o "porão" com rolagem própria).
   - Cabeçalho fixo no topo; barra de abas fixa embaixo;
     faixa "ao vivo" (mini-player) logo acima da barra em todas
     as abas menos Rádio (lá o player completo já está na tela).
   - A aba ativa vem de <body data-aba> (tabs.js); cada bloco
     declara a sua em data-tab. Computador: grade inalterada.
   ============================================================ */
.tabbar {display:none;}
@media(max-width:760px) {
 html, body {height:100%;}
 body {overflow:hidden; min-height:0;}
 .app-shell {height:100vh; height:100dvh; overflow-y:auto; overscroll-behavior:contain; -webkit-overflow-scrolling:touch; gap:12px!important; padding:0 12px calc(84px + env(safe-area-inset-bottom))!important;}
 body:not([data-aba="radio"]) .app-shell {padding-bottom:calc(160px + env(safe-area-inset-bottom))!important;}

 /* cabeçalho compacto e fixo (como o passadiço: sempre à vista) */
 header.app-header {position:sticky; top:0; z-index:20; flex-direction:row; justify-content:flex-start; margin:0 -12px; padding:10px 108px 10px 12px; background:var(--bg-deep); border-bottom:1px solid var(--glass-border);}
 header.app-header .brand-tagline {display:none;}
 header.app-header .brand-lockup img {width:34px; height:34px;}
 header.app-header .brand-title {font-size:1.2rem!important;}
 .theme-toggle-btn {top:8px; right:12px; width:38px; height:38px;}
 .help-btn {top:8px; right:58px; width:38px; height:38px;}

 /* só a aba ativa aparece */
 body[data-aba="radio"]    .app-shell>[data-tab]:not([data-tab="radio"]),
 body[data-aba="mare"]     .app-shell>[data-tab]:not([data-tab="mare"]),
 body[data-aba="manobras"] .app-shell>[data-tab]:not([data-tab="manobras"]),
 body[data-aba="portos"]   .app-shell>[data-tab]:not([data-tab="portos"]) {display:none!important;}

 /* aba Rádio: capa menor para caber player + faixa sem rolar */
 body[data-aba="radio"] .spectrum {margin-bottom:12px;}
 body[data-aba="radio"] .program-feature h1 {margin:6px 0;}
 body[data-aba="radio"] .play-wrapper {margin-top:10px;}
 body[data-aba="radio"] .app-shell>.player-card {margin-top:4px;}

 /* aba Portos: painel sempre aberto e mapa ocupando a altura útil */
 body[data-aba="portos"] #mariner-panel>summary {display:none;}
 body[data-aba="portos"] #card-mapa .map-container {height:calc(100dvh - 440px); min-height:260px;}

 /* faixa ao vivo acima da barra de abas */
 .mini-player {bottom:calc(76px + env(safe-area-inset-bottom))!important;}
 body[data-aba="radio"] .mini-player {display:none!important;}

 /* barra de abas */
 .tabbar {display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); position:fixed; left:0; right:0; bottom:0; z-index:10002; padding:6px 6px max(8px, env(safe-area-inset-bottom)); background:var(--bg-card); border-top:1px solid var(--glass-border);}
 .tabbar button {position:relative; min-height:56px; border:0; background:transparent; color:var(--text-muted); display:flex; flex-direction:column; align-items:center; justify-content:center; gap:4px; font:inherit; font-size:.7rem; font-weight:600; cursor:pointer; -webkit-tap-highlight-color:transparent;}
 .tabbar button.is-active {color:var(--accent);}
 .tabbar button:focus-visible {outline:2px solid var(--accent); outline-offset:-4px; border-radius:12px;}
 .tab-badge {position:absolute; top:4px; left:calc(50% + 6px); min-width:16px; height:16px; padding:0 4px; border-radius:8px; background:#f59e0b; color:#1c1917; font-size:10px; line-height:16px; text-align:center;}
 .tab-badge[hidden] {display:none;}
}

/* ============================================================
   SPRINT 20 · v3.2.0 · 2026-10-12T17:00-03:00 · Jossian Brito
   Botão ?, Manual de bordo (folha) e Tour guiado (manual.js)
   ============================================================ */
header.app-header {padding-right:108px;}
.help-btn {position:absolute; top:10px; right:50px; width:40px; height:40px; border-radius:12px; border:2px solid var(--accent); background:var(--bg-card); color:var(--text-main); font:inherit; font-weight:700; font-size:1.15rem; cursor:pointer; display:flex; align-items:center; justify-content:center;}
.help-btn:focus-visible, .manual-chip:focus-visible, .manual-item summary:focus-visible {outline:2px solid var(--accent); outline-offset:2px;}

dialog.manual-dialog {padding:20px; max-width:520px;}
dialog.manual-dialog[open] {display:flex; flex-direction:column; gap:10px;}
.manual-topo {display:flex; align-items:flex-start; justify-content:space-between; gap:12px;}
.manual-topo h2 {margin:4px 0 0;}
.manual-topo .dialog-close {position:static; flex-shrink:0;}
.manual-novidades {display:flex; flex-direction:column; gap:2px; padding:10px 12px; border:1px solid var(--accent); border-radius:12px; font-size:.8rem;}
.manual-novidades b {color:var(--accent);}
.manual-chips {display:flex; gap:6px; overflow-x:auto; padding-bottom:2px;}
.manual-chip {min-height:36px; padding:4px 14px; border-radius:999px; border:1px solid var(--glass-border); background:var(--bg-deep); color:var(--text-main); font:inherit; font-size:.78rem; font-weight:700; white-space:nowrap; cursor:pointer;}
.manual-chip[aria-pressed="true"] {background:var(--accent); border-color:var(--accent); color:var(--bg-deep);}
dialog .manual-resumo {margin:0; font-size:.8rem;}
.manual-lista {display:flex; flex-direction:column; gap:8px; overflow-y:auto; min-height:0;}
.manual-item {border:1px solid var(--glass-border); border-radius:12px; background:var(--bg-deep);}
.manual-item summary {min-height:48px; display:flex; align-items:center; gap:10px; padding:0 12px; font-weight:700; font-size:.9rem; cursor:pointer; list-style:none;}
.manual-item summary::-webkit-details-marker {display:none;}
.manual-item summary::before {content:''; width:8px; height:8px; border-radius:50%; background:var(--accent); flex-shrink:0;}
.manual-item[data-secao="mare"] summary::before {background:#22c55e;}
.manual-item[data-secao="manobras"] summary::before {background:#f59e0b;}
.manual-item[data-secao="portos"] summary::before {background:#a78bfa;}
.manual-item[data-secao="app"] summary::before {background:var(--text-muted);}
.manual-item summary::after {content:'+'; margin-left:auto; color:var(--text-muted); font-size:1.1rem;}
.manual-item[open] summary::after {content:'−';}
dialog .manual-item p {margin:0; padding:0 12px 12px 30px; font-size:.85rem;}
.manual-rodape {display:flex; gap:8px; padding-top:10px; border-top:1px solid var(--glass-border);}
.manual-ir, .manual-tour {min-height:46px; border-radius:12px; font:inherit; font-weight:700; cursor:pointer;}
.manual-ir {flex:1; border:0; background:var(--accent); color:var(--bg-deep);}
.manual-tour {padding:0 14px; border:1px solid var(--glass-border); background:var(--bg-deep); color:var(--text-main); font-weight:600;}
@media(max-width:760px) {
 dialog.manual-dialog {width:100%; max-width:none; height:100dvh; max-height:none; margin:0; border-radius:0; border:0; padding:16px 16px max(16px, env(safe-area-inset-bottom));}
}

.tour-camada {position:fixed; inset:0; z-index:10010;}
.tour-camada[hidden] {display:none;}
.tour-foco {position:fixed; border:3px solid var(--accent); border-radius:14px; box-shadow:0 0 0 200vmax rgba(2,6,23,.8); pointer-events:none; transition:all .25s ease;}
.tour-caixa {position:fixed; left:16px; right:16px; max-width:420px; margin:0 auto; box-sizing:border-box; padding:16px; border-radius:16px; background:#f8fafc; color:#0f172a; display:flex; flex-direction:column; gap:8px; box-shadow:0 12px 40px rgba(0,0,0,.5); transition:top .25s ease;}
.tour-passo {font-size:.7rem; letter-spacing:.12em; font-weight:700; color:#b45309;}
.tour-caixa h2 {margin:0; font-size:1.1rem;}
.tour-caixa p {margin:0; font-size:.9rem; line-height:1.5; color:#334155;}
.tour-acoes {display:flex; gap:8px; align-items:center; margin-top:4px;}
.tour-espaco {flex:1;}
.tour-acoes button {min-height:44px; padding:0 14px; border-radius:12px; font:inherit; font-weight:600; cursor:pointer;}
.tour-pular {border:0; background:transparent; color:#475569;}
.tour-voltar {border:1px solid #cbd5e1; background:#fff; color:#0f172a;}
.tour-voltar:disabled {opacity:.4; cursor:default;}
.tour-prox {border:0; background:#0369a1; color:#fff; font-weight:700;}
@media (prefers-reduced-motion: reduce) {.tour-foco, .tour-caixa {transition:none;}}

/* ============================================================
   SPRINT 21 · v3.3.0 · 2026-10-12T17:30-03:00 · Jossian Brito
   Grade semanal recolhível (mesmo estilo dos outros painéis)
   ============================================================ */
.schedule-panel {margin-top:14px; border-top:1px solid var(--glass-border); padding-top:6px;}
.schedule-panel>summary {min-height:48px;}
.schedule-panel[open]>summary {margin-bottom:8px;}
@media(max-width:760px) {
 body[data-aba="radio"] #card-prog .digital-clock-container {padding:6px 0;}
}

/* ============================================================
   SPRINT 22 · v3.4.0 · 2026-10-12T18:30-03:00 · Jossian Brito
   Nível medido ao vivo (tide-live.js) — Rio Grande / SiMCosta
   Verde = medido (mesma cor da linha no gráfico); laranja = alerta
   ============================================================ */
.tide-live {margin:4px 0 10px; padding:10px 12px; border:1px solid #22c55e; border-radius:14px; background:rgba(34,197,94,.07); display:flex; flex-direction:column; gap:4px;}
.tide-live[hidden] {display:none;}
.tide-live p {margin:0;}
.tide-live-head {font-size:.7rem; letter-spacing:.08em; text-transform:uppercase; color:#22c55e; font-weight:700; display:flex; align-items:center; gap:6px;}
.tide-live-dot {width:8px; height:8px; border-radius:50%; background:#22c55e; animation:tide-pulso 2s ease-in-out infinite;}
@keyframes tide-pulso {50% {opacity:.35;}}
.tide-live-valor {display:flex; align-items:baseline; gap:10px;}
.tide-live-valor strong {font-size:1.6rem; font-variant-numeric:tabular-nums; color:var(--text-main);}
.tide-live-valor sup {font-size:.7rem; color:var(--text-muted); margin-left:1px;}
.tide-live-valor em {font-style:normal; font-size:.8rem; color:var(--text-muted);}
.tide-live-surge {font-size:.85rem; font-weight:600;}
.tide-live-surge[data-forte="sim"] {color:#f59e0b;}
.tide-live-sub {font-size:.75rem; color:var(--text-muted);}
.tide-live-cred {font-size:.68rem; color:var(--text-muted); line-height:1.45;}
.tide-live.is-off {border-color:var(--glass-border); background:transparent;}
.tide-live.is-off .tide-live-head {color:var(--text-muted);}
.tide-real {fill:none; stroke:#22c55e; stroke-width:2.5; vector-effect:non-scaling-stroke;}
body.light-theme .tide-live-head, body.light-theme .tide-real {color:#15803d; stroke:#15803d;}
body.light-theme .tide-live {border-color:#15803d;}
body.light-theme .tide-live-dot {background:#15803d;}
body.light-theme .tide-live-surge[data-forte="sim"] {color:#b45309;}
@media (prefers-reduced-motion: reduce) {.tide-live-dot {animation:none;}}

/* ============================================================
   SPRINT 25 · v3.7.0 · 2026-10-15T01:30-03:00 · Jossian Brito
   Aba Rádio compacta (proposta P2-A aprovada pelo Comandante)
   v3.7.1 · 2026-10-15T03:00-03:00 · [FIX] linha de ouvintes sobre o
   selo STANDBY e painel "Mais" escondido com ouvintes conectados
   (achado pelo Comandante no Moto G Power, 412×823).
   Meta: no celular (390×844) a aba Rádio cabe numa tela só.
   - Faixa atual (♪) dentro do player, logo abaixo do programa.
   - Instalar, QR, Store, Deezer e Alexa no painel recolhível
     "Mais da TugLife" (fechado no celular, aberto no computador).
   - Relógio numa linha só; rodapé só no computador.
   Como arrumar o convés antes da manobra: o que se usa sempre fica
   à mão; o resto vai para o paiol, a um toque de distância.
   ============================================================ */
.now-track {margin:0 0 12px; font-size:.85rem; line-height:1.45; color:var(--text-muted); min-height:1.2em; overflow-wrap:anywhere;}
.more-panel>summary {min-height:48px; display:flex; align-items:center; justify-content:space-between; gap:8px; cursor:pointer; font-weight:700; list-style:none;}
.more-panel>summary::-webkit-details-marker {display:none;}
.more-panel>summary::before {content:'▸'; color:var(--accent);}
.more-panel[open]>summary::before {content:'▾';}
.more-panel>summary>span {margin-left:auto; font-size:.75rem; font-weight:500; color:var(--text-muted);}
.more-panel .app-tools {margin-top:10px;}
.more-panel .footer-actions {justify-content:flex-start; margin:12px 0 0;}
/* computador: painel aberto e tudo numa linha só */
@media(min-width:761px) {
 .app-shell>.more-panel {padding:10px 24px 14px;}
 .more-corpo {display:flex; flex-wrap:wrap; align-items:center; gap:10px;}
 .more-corpo .app-tools, .more-corpo .footer-actions {margin:0; width:auto;}   /* a regra geral dava 100% ao footer-actions */
}
@media(max-width:760px) {
 body[data-aba="radio"] .player-card {padding:14px 16px;}
 body[data-aba="radio"] .live-status {margin-bottom:6px;}
 /* v3.7.1 [FIX] a linha de ouvintes tinha margin-top:-12px, feita para os 20 px
    de folga do selo; com 6 px ela subia sobre o STANDBY. Sem margem negativa
    e com selos mais finos (mais baixos) ela cabe sem encavalar. */
 body[data-aba="radio"] .crew-row {margin:0 0 4px; gap:6px;}
 body[data-aba="radio"] .crew-badge, body[data-aba="radio"] .crew-peak {padding:2px 10px; font-size:.75rem;}
 /* v3.11.0: disco de 112 px (era um logo de 84 px) e equalizador ao lado;
    a folga vem do botão Ouvir, que perdeu o respiro de 24 px embaixo. */
 body[data-aba="radio"] .spectrum-deck {--disc:112px;}
 body[data-aba="radio"] .spectrum {margin-bottom:4px;}
 /* legenda do espectro some: o selo Standby/Ao vivo no topo já diz o estado */
 body[data-aba="radio"] .spectrum-caption {display:none;}
 body[data-aba="radio"] .program-feature {padding:2px 0 6px;}   /* v3.11.0: era 4px 0 10px */
 body[data-aba="radio"] .program-feature h1 {font-size:1.6rem;}
 body[data-aba="radio"] .now-track {margin-bottom:8px;}
 /* v3.11.0: barra de progresso com 10 px de respiro (era 24) — paga o disco maior */
 body[data-aba="radio"] .program-feature progress {margin-bottom:10px;}
 /* v3.7.1: "Próximo programa" numa linha só (rótulo à esquerda, valor à direita) */
 body[data-aba="radio"] .next-program {padding:6px 12px; display:flex; align-items:baseline; gap:10px;}
 body[data-aba="radio"] .next-program span {display:inline; margin:0; white-space:nowrap;}
 body[data-aba="radio"] .play-wrapper {margin-top:4px; padding:0 0 6px;}   /* v3.11.0: era 6px 0 24px */
 /* relógio numa linha: data à esquerda, hora à direita; sem a linha do fuso */
 body[data-aba="radio"] #card-prog {padding:10px 16px 4px;}
 body[data-aba="radio"] #card-prog .digital-clock-container {margin:0; padding:2px 0 6px; flex-wrap:nowrap; align-items:center; border-bottom:0;}
 body[data-aba="radio"] #card-prog .digital-clock-container>span:nth-child(2) {display:none;}
 body[data-aba="radio"] #digital-date {margin:0!important; font-size:.7rem!important;}
 body[data-aba="radio"] #digital-clock {font-size:1.1rem;}
 body[data-aba="radio"] .schedule-panel {margin-top:4px; padding-top:2px;}
 /* v3.7.1 [FIX] <details> não pegava o width:100% das <section>: fechado, ficava estreito */
 body[data-aba="radio"] .more-panel {padding:4px 16px; width:100%; box-sizing:border-box;}
 /* ao rolar até o painel, para acima da barra de abas fixa */
 body[data-aba="radio"] .more-panel {scroll-margin-bottom:calc(84px + env(safe-area-inset-bottom));}
 .app-shell>footer {display:none;}
}

/* ============================================================
   SPRINT 26 · v3.8.0 · 2026-10-15T00:30-03:00 · Jossian Brito
   Faixa "Nova versão disponível · Atualizar" (pwa.js + sw.js)
   Fixa logo abaixo do cabeçalho, em qualquer aba, por cima do
   conteúdo (não empurra o layout da aba Rádio). Âmbar = aviso.
   ============================================================ */
.update-bar {position:fixed; left:12px; right:12px; top:calc(env(safe-area-inset-top) + 64px); z-index:10005; max-width:480px; margin:0 auto; box-sizing:border-box; display:flex; align-items:center; gap:10px; padding:8px 8px 8px 14px; border:1px solid var(--amber); border-radius:14px; background:var(--bg-card); box-shadow:0 8px 28px rgba(0,0,0,.45);}
.update-bar[hidden] {display:none;}
.update-text {flex:1; font-size:.85rem; line-height:1.35; color:var(--text-main);}
.update-go {min-height:44px; padding:0 16px; border:0; border-radius:10px; background:var(--amber); color:#1c1917; font:inherit; font-weight:700; cursor:pointer;}
.update-go:disabled {opacity:.6; cursor:default;}
.update-close {min-width:44px; min-height:44px; border:0; background:transparent; color:var(--text-muted); font-size:1.3rem; cursor:pointer;}
.update-go:focus-visible, .update-close:focus-visible {outline:2px solid var(--accent); outline-offset:2px;}
@media(min-width:761px) {.update-bar {top:24px;}}

/* ============================================================
   SPRINT 26 · v3.8.0 · 2026-10-15T00:45-03:00 · Jossian Brito
   Faixa "Ao vivo" da Maré recolhida (tide-live.js)
   Fechada: uma linha (● Medido 0,49 m ↓ · −4 cm da previsão ⓘ).
   Aberta: os detalhes de antes. Laranja da maré meteorológica
   continua valendo na linha fechada (informação de segurança).
   ============================================================ */
.tide-live {padding:0; gap:0;}
.tide-live.is-off>.tide-live-head {padding:10px 12px;}
.tide-live-resumo {width:100%; box-sizing:border-box; min-height:44px; display:flex; align-items:center; gap:8px; padding:6px 8px 6px 12px; border:0; background:transparent; color:var(--text-main); font:inherit; text-align:left; cursor:pointer; border-radius:14px;}
.tide-live-resumo:focus-visible {outline:2px solid #22c55e; outline-offset:2px;}
.tide-live-rotulo {white-space:nowrap; font-size:.7rem; letter-spacing:.08em; text-transform:uppercase; font-weight:700; color:#22c55e;}
.tide-live.is-off .tide-live-rotulo {color:var(--text-muted); text-transform:none; letter-spacing:0; font-weight:600; font-size:.8rem;}
.tide-live-num {white-space:nowrap; font-size:1.05rem; font-weight:700; font-variant-numeric:tabular-nums;}
.tide-live-seta {color:var(--text-muted);}
.tide-live-meteo {font-size:.8rem; color:var(--text-muted); white-space:nowrap;}
.tide-live-meteo::before {content:'· ';}
.tide-live-meteo[data-forte="sim"] {color:#f59e0b; font-weight:700;}
.tide-live-info {margin-left:auto; flex-shrink:0; width:24px; height:24px; border-radius:50%; border:1.5px solid currentColor; display:inline-flex; align-items:center; justify-content:center; font-size:.8rem; font-weight:700; font-style:italic; font-family:Georgia,serif; color:#22c55e;}
.tide-live.is-aberto .tide-live-info {font-style:normal; font-family:inherit;}
.tide-live.is-off .tide-live-info {color:var(--text-muted);}
.tide-live-detalhes {display:flex; flex-direction:column; gap:4px; padding:2px 12px 10px;}
.tide-live-detalhes[hidden] {display:none;}
.sr-only {position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0;}
body.light-theme .tide-live-rotulo, body.light-theme .tide-live-info {color:#15803d;}
body.light-theme .tide-live-meteo[data-forte="sim"] {color:#b45309;}

/* ============================================================
   SPRINT 27 · v3.9.0 · 2026-10-15T16:40:00-03:00 · Jossian Brito
   Programação SAAM · Rio de Janeiro (saam-rj.js)
   Reaproveita .saam-item/.saam-linha do card de Suape; aqui só o
   que é novo: filtro de áreas (rolagem lateral, como a fileira de
   portos), faixa da barra, chips dos rebocadores e cores por tipo
   (Entrada verde, Saída âmbar, Mudança lilás — mesmas de Suape).
   ============================================================ */
#card-saam-rj {grid-column:1/-1;}
#card-saam-rj[hidden], .saamrj-barra[hidden] {display:none;}
#card-saam-rj .tide-disclaimer a {color:var(--accent);}
.saamrj-areas {display:flex;gap:6px;overflow-x:auto;padding:2px 0 6px;scrollbar-width:none;}
.saamrj-areas::-webkit-scrollbar {display:none;}
.saamrj-area {flex:none;min-height:36px;padding:6px 12px;border-radius:999px;border:1px solid var(--glass-border);background:var(--bg-deep);color:var(--text-main);font:inherit;font-size:.75rem;cursor:pointer;white-space:nowrap;}
.saamrj-area.is-on {background:var(--accent);border-color:var(--accent);color:#082f49;font-weight:700;}
.saamrj-barra {display:flex;flex-direction:column;gap:2px;font-size:.75rem;color:var(--text-muted);margin:6px 0 0;}
.saamrj-barra .is-fechada {color:#ef4444;font-weight:700;}
.saam-item.saamrj-tipo-E {border-left-color:#22c55e;}
.saam-item.saamrj-tipo-S {border-left-color:#f59e0b;}
.saam-item.saamrj-tipo-M {border-left-color:#a78bfa;}
.saam-item.is-passada {opacity:.55;}
.saam-mnb.saamrj-mnb-E {border-color:#22c55e;color:#22c55e;}
.saam-mnb.saamrj-mnb-S {border-color:#f59e0b;color:#f59e0b;}
.saam-mnb.saamrj-mnb-M {border-color:#a78bfa;color:#a78bfa;}
.saam-linha small {color:var(--text-muted);}
.saamrj-rb {display:inline-flex;align-items:baseline;gap:4px;padding:2px 8px;border-radius:999px;border:1px solid var(--glass-border);}
.saamrj-rb.is-aviso {border-color:#f59e0b;}
.saamrj-fainas {font-size:.65rem;letter-spacing:.04em;}

/* ============================================================
   SPRINT 28 · v3.9.1 · 2026-10-15T17:30:00-03:00 · Jossian Brito
   Programações SAAM recolhíveis: o cabeçalho do card vira o
   <summary> (toque em qualquer ponto abre/fecha). À direita, o
   resumo (🔒 PIN ou "N manobras") e a seta ▸/▾ — a mesma linguagem
   do painel "Mais da TugLife".
   ============================================================ */
.saam-panel>summary.saam-head {display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:48px;list-style:none;cursor:pointer;}
.saam-panel>summary.saam-head::-webkit-details-marker {display:none;}
.saam-panel>summary.saam-head::after {content:'▸';color:var(--accent);font-size:1rem;flex:none;}
.saam-panel[open]>summary.saam-head::after {content:'▾';}
.saam-panel[open]>summary.saam-head {margin-bottom:6px;}
.saam-panel>summary .saam-sub {margin-top:2px;}
.saam-resumo {margin-left:auto;flex:none;font-size:.75rem;font-weight:700;color:var(--text-muted);padding:2px 10px;border:1px solid var(--glass-border);border-radius:999px;white-space:nowrap;}
.saam-panel>summary:focus-visible {outline:2px solid var(--accent);outline-offset:2px;border-radius:8px;}
#saamrj-main[hidden], #saamrj-lock[hidden] {display:none;}

/* ============================================================
   SPRINT 29 · v3.10.0 · 2026-10-15T18:45:00-03:00 · Jossian Brito
   Contador de visitas (visitas.js). Duas linhas com o mesmo texto:
   • .visitas-rodape → no rodapé, visível no computador;
   • .visitas-mais   → no painel "Mais da TugLife", para o celular,
     onde o rodapé fica oculto (≤ 760 px). No computador ela some
     para não repetir a informação.
   Ficam ocultas ([hidden]) até a função devolver os números.
   ============================================================ */
.visitas-linha {font-size:.75rem;color:var(--text-muted);}
.visitas-linha[hidden] {display:none!important;}
.visitas-mais {margin:10px 0 0;}
@media (min-width:761px) { .visitas-mais {display:none!important;} }
