* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    font-family: 'Inter', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}

/* Restaura fonte do Font Awesome (o * acima sobrescreve e quebra ícones) */
.fa, .fas, .far, .fal, .fab, .fad,
i.fa, i.fas, i.far, i.fal, i.fab, i.fad,
[class^="fa-"], [class*=" fa-"] {
    font-family: "Font Awesome 6 Free", "Font Awesome 5 Free", "Font Awesome 6 Brands", "Font Awesome 5 Brands", "FontAwesome" !important;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    display: inline-block;
    font-style: normal;
    font-variant: normal;
    text-rendering: auto;
    line-height: 1;
}
.fas, i.fas, .fa-solid {
    font-weight: 900 !important;
}
.far, i.far, .fa-regular {
    font-weight: 400 !important;
}
.fab, i.fab, .fa-brands {
    font-weight: 400 !important;
}

:root {
    /* Tokens alinhados ao design system WA (cf. skill wa-disparador-frontend §4.1):
       wa.bg/panel = #111111, wa.chat = #0b141a (doodle base), wa.in-msg = #202c33,
       wa.out-msg = #005C4B, wa.active = #262626, wa.text = #FFFFFF,
       wa.muted = #9E9E9E, wa.border = #222222, wa.accent = #25D366 */
    --bg-body: #111111;
    --bg-sidebar: #111111;
    --bg-chat: #0b141a;
    --bg-header: #111111;
    --bg-input: #111111;
    --bg-bubble-in: #202c33;
    --bg-bubble-out: #005c4b;
    --bg-hover: #262626;
    --text-primary: #FFFFFF;
    --text-secondary: #9E9E9E;
    --icon-color: #9E9E9E;
    --border-color: #222222;
    --green: #25D366;
    --blue-tick: #53bdeb;
    /* Tokens auxiliares: usados onde rgba(255,255,255,a) não traduz pra fundo claro */
    --border-soft: rgba(255, 255, 255, 0.06);
    --surface-hover: rgba(255, 255, 255, 0.06);
    /* Ticks ✓/✓✓ (enviado/entregue) e textos apagados DENTRO do balão.
       Branco 45% funciona no dark, mas some no balão verde claro do light. */
    --tick-muted: rgba(255, 255, 255, 0.45);
    --nav-accent: #00E676;
    --shadow-elev-1: 0 1px 2px rgba(0, 0, 0, 0.4);
    /* Acentos verdes — no dark mantêm os 3 tons; no light viram #0D856F */
    --accent-solid: #00C853;       /* botão primary bg */
    --accent-strong: #00E676;      /* hover/active highlight */
    --accent-on-tint: #7BE7AF;     /* texto sobre fundo verde com alpha */
    --accent-deep: #008f6f;        /* hover do botão primary */

    /* ── Superfícies compartilhadas (cards/modais/inputs fora do chat) ── */
    --bg-surface: #1C1C1E;         /* card/modal elevado */
    --bg-inset: #262626;           /* input/select dentro de card */
    --overlay: rgba(0, 0, 0, 0.55);/* backdrop de modal */
    --shadow-modal: 0 24px 80px rgba(0, 0, 0, 0.6);
    --shadow-pop: 0 12px 40px rgba(0, 0, 0, 0.5);
    /* Texto/elemento sobre o verde sólido (--green/--accent-solid). No dark o verde
       é claro (#25D366) e pede texto escuro; no light vira teal escuro e pede branco. */
    --on-accent: #111b21;

    /* ── Cores semânticas de status ──
       Cada uma tem: cor forte (ícone/dot/borda), texto-sobre-tint (badges/pills)
       e tint (fundo alpha). NUNCA usar o hex pastel direto (#FF8A82, #7CB3FF…):
       pastel só funciona em fundo escuro. */
    --danger: #FF453A;
    --danger-soft: #FF8A82;              /* texto sobre --danger-tint */
    --danger-tint: rgba(255, 69, 58, 0.12);
    --danger-border: rgba(255, 69, 58, 0.45);
    --warn: #FF9F0A;                     /* âmbar (atenção) */
    --warn-soft: #FFCE7A;                /* texto sobre --warn-tint */
    --warn-strong: #FFD60A;              /* amarelo (KPI/SLA) */
    --warn-tint: rgba(255, 159, 10, 0.15);
    --info: #0A84FF;
    --info-soft: #7CB3FF;                /* texto sobre --info-tint */
    --info-tint: rgba(10, 132, 255, 0.15);
    --ok-soft: #66bb6a;                  /* texto "concluído" sobre tint */
    --ok-tint: rgba(37, 211, 102, 0.15);
    --fup: #f96900;                      /* laranja de follow-up/disparo */
    --fup-tint: rgba(249, 105, 0, 0.14);
    --teal: #00a884;                     /* teal WA (botões pegar-lead, switches) */
}

/* === LIGHT THEME ===
   Aplicado quando <html data-theme="light">. Override só os tokens —
   o resto do CSS continua usando var(--…) e troca automaticamente. */
:root[data-theme="light"] {
    --bg-body: #FFFFFF;
    --bg-sidebar: #FDFDFD;
    --bg-chat: #EFEAE2;
    --bg-header: #FDFDFD;
    --bg-input: #FFFFFF;
    --bg-bubble-in: #FFFFFF;
    --bg-bubble-out: #D9FDD3;
    --bg-hover: #E9EDEF;
    --text-primary: #111B21;
    --text-secondary: #667781;
    --icon-color: #54656F;
    --border-color: #D1D7DB;
    /* --green e --blue-tick não mudam (brand-stable) */
    --border-soft: rgba(17, 27, 33, 0.08);
    --surface-hover: rgba(17, 27, 33, 0.05);
    --tick-muted: #667781;   /* cinza do WhatsApp light: legível no balão verde claro */
    --nav-accent: #0D856F;
    --shadow-elev-1: 0 1px 2px rgba(0, 0, 0, 0.08);
    /* Light mode: todos os acentos verdes viram o teal solicitado */
    --accent-solid: #0D856F;
    --accent-strong: #0D856F;
    --accent-on-tint: #0D856F;
    --accent-deep: #0D856F;
    --green: #0D856F;              /* brand verde também adapta no light */

    /* Superfícies compartilhadas */
    --bg-surface: #FFFFFF;
    --bg-inset: #FFFFFF;
    --overlay: rgba(17, 27, 33, 0.45);
    --shadow-modal: 0 24px 80px rgba(17, 27, 33, 0.18);
    --shadow-pop: 0 12px 40px rgba(17, 27, 33, 0.16);
    --on-accent: #FFFFFF;          /* texto branco sobre o teal */

    /* Semânticas de status — versões escuras, legíveis em fundo claro */
    --danger: #D3382C;
    --danger-soft: #B3261E;
    --danger-tint: rgba(211, 56, 44, 0.10);
    --danger-border: rgba(211, 56, 44, 0.40);
    --warn: #B45309;
    --warn-soft: #8A5A00;
    --warn-strong: #9A6700;
    --warn-tint: rgba(180, 83, 9, 0.12);
    --info: #0B57D0;
    --info-soft: #0B57D0;
    --info-tint: rgba(11, 87, 208, 0.10);
    --ok-soft: #1E7E34;
    --ok-tint: rgba(13, 133, 111, 0.12);
    --fup: #C2410C;
    --fup-tint: rgba(194, 65, 12, 0.12);
    --teal: #0D856F;
}

html,
body {
    height: 100%;
    width: 100%;
    background-color: var(--bg-body);
    color: var(--text-primary);
    overflow: hidden;
}

/* === BOTÕES (padrão do app) ===
   Mesmas regras que modelos/, listas/, master/ e campanhas.css já repetem inline.
   Aqui elas viram o padrão pra quem só carrega este arquivo (chat/ e equipe/, que
   usavam as classes sem nunca defini-las e caíam no botão nativo do browser).
   Quem define inline continua vencendo — o <style> da página vem depois deste link. */
.btn-primary {
    background: var(--accent-solid);
    border: 0;
    color: #fff;
    padding: 10px 18px;
    border-radius: 10px;
    font-weight: 600;
    font-family: inherit;
    font-size: 14px;
    cursor: pointer;
    box-shadow: 0 2px 8px rgba(0, 200, 83, 0.25);
    transition: background-color .15s ease;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    text-decoration: none;
}
.btn-primary:hover { background: var(--accent-strong); }
.btn-primary:disabled { background: var(--bg-hover); color: var(--text-secondary); box-shadow: none; cursor: not-allowed; }

.btn-secondary {
    background: transparent;
    border: 1px solid var(--border-color);
    color: var(--text-primary);
    padding: 9px 14px;
    border-radius: 10px;
    font-family: inherit;
    font-size: 13px;
    cursor: pointer;
    transition: background-color .15s ease, border-color .15s ease;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    text-decoration: none;
}
.btn-secondary:hover { background: var(--surface-hover); border-color: var(--text-secondary); }

/* === SHELL: nav (esq) + conteúdo (dir) === */
.app-shell {
    display: flex;
    /* 100vh no iOS conta a barra de URL do Safari: o shell fica MAIS ALTO que a tela
       visível e o campo de digitação some por baixo dela. dvh é a altura real, que se
       ajusta quando a barra recolhe. As duas linhas são de propósito — quem não conhece
       dvh (Safari < 15.4, Chrome < 108) ignora a segunda e fica com o 100vh de antes. */
    height: 100vh;
    height: 100dvh;
    width: 100%;
    overflow: hidden;
}

/* === NAV — padrão dark do app (alinhado ao login redesign) === */
.app-nav {
    width: 240px;
    flex: none;
    background: var(--bg-sidebar);
    border-right: 1px solid var(--border-soft);
    padding: 14px 12px;
    display: flex;
    flex-direction: column;
    gap: 6px;
    font-family: 'Inter', system-ui, -apple-system, sans-serif;
    color: var(--text-primary);
    transition: width .25s ease;
    position: relative;
    overflow: hidden;
}
/* Sanfona: colapsado quando .collapsed (mouse fora). Hover expande. */
.app-nav.collapsed { width: 64px; }
.app-nav.collapsed:hover { width: 240px; }
.app-nav.collapsed:not(:hover) .nav-item span,
.app-nav.collapsed:not(:hover) .brand span,
.app-nav.collapsed:not(:hover) .nav-user .name {
    opacity: 0; width: 0; pointer-events: none; white-space: nowrap; overflow: hidden;
}
.app-nav .nav-item span,
.app-nav .brand span,
.app-nav .nav-user .name {
    transition: opacity .15s ease;
}
.nav-pin-btn {
    position: absolute;
    top: 12px; right: 8px;
    background: transparent; border: 0;
    color: var(--icon-color);
    width: 26px; height: 26px;
    display: flex; align-items: center; justify-content: center;
    border-radius: 6px; cursor: pointer;
    transition: color .15s ease, background-color .15s ease, transform .25s ease, opacity .15s ease;
    z-index: 2;
}
.nav-pin-btn:hover { color: var(--text-primary); background: var(--surface-hover); }
.app-nav.pinned .nav-pin-btn { color: var(--nav-accent); transform: rotate(45deg); }
.app-nav.collapsed:not(:hover) .nav-pin-btn { opacity: 0; pointer-events: none; }
.app-nav .brand {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px;
    margin-bottom: 14px;
    color: var(--text-primary);
    font-weight: 700;
    letter-spacing: -0.01em;
}
.app-nav .brand-mark {
    width: 28px;
    height: 28px;
    border-radius: 8px;
    display: none;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    overflow: hidden;
}
.app-nav .brand-mark img { width: 100%; height: 100%; display: block; }
.app-nav .brand-wordmark { display: block; width: 100%; max-width: 160px; height: auto; }
/* Logo branca no dark (padrão), logo preta no light — só uma fica visível */
.app-nav .brand-wordmark-light { display: none; }
:root[data-theme="light"] .app-nav .brand-wordmark-dark { display: none; }
:root[data-theme="light"] .app-nav .brand-wordmark-light { display: block; }
.app-nav.collapsed:not(:hover) .brand-mark { display: flex; }
.app-nav.collapsed:not(:hover) .brand-wordmark { display: none; }
.app-nav .nav-item {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 9px 10px;
    border-radius: 8px;
    font-size: 13.5px;
    color: var(--text-secondary);
    text-decoration: none;
    cursor: pointer;
    transition: background-color .15s ease, color .15s ease;
}
.app-nav .nav-item .nav-ico {
    width: 18px;
    height: 18px;
    flex: none;
}
.app-nav .nav-item:hover {
    background: var(--surface-hover);
    color: var(--text-primary);
}
.app-nav .nav-item.active {
    background: var(--surface-hover);
    color: var(--nav-accent);
}

/* ─── Grupo (pai) com submenu ─── */
.app-nav .nav-group { display: flex; flex-direction: column; gap: 2px; }
.app-nav .nav-parent {
    border: 0; background: transparent;
    width: 100%; font-family: inherit;
    text-align: left;
}
.app-nav .nav-parent .nav-chevron {
    margin-left: auto; flex: none;
    color: var(--icon-color);
    transition: transform .15s ease, color .15s ease, opacity .15s ease;
}
.app-nav .nav-group.open .nav-parent .nav-chevron {
    transform: rotate(180deg);
    color: var(--text-primary);
}
.app-nav .nav-submenu {
    display: none;
    flex-direction: column;
    gap: 1px;
    padding-left: 30px;
    margin-top: 2px;
}
.app-nav .nav-group.open .nav-submenu { display: flex; }
.app-nav .nav-subitem {
    display: flex; align-items: center; gap: 10px;
    padding: 7px 10px; border-radius: 6px;
    font-size: 12.5px;
    color: var(--text-secondary);
    text-decoration: none; cursor: pointer;
    transition: background-color .15s ease, color .15s ease;
}
.app-nav .nav-subitem:hover {
    background: var(--surface-hover);
    color: var(--text-primary);
}
.app-nav .nav-subitem.active {
    color: var(--nav-accent);
    background: rgba(0, 200, 83, 0.08);
}
.app-nav .nav-subitem .nav-subdot {
    width: 6px; height: 6px; border-radius: 50%;
    background: currentColor; opacity: 0.55; flex: none;
}
.app-nav .nav-subitem.active .nav-subdot { opacity: 1; }

/* Collapsed sidebar (sem hover): esconde chevron e submenu */
.app-nav.collapsed:not(:hover) .nav-chevron { opacity: 0; }
.app-nav.collapsed:not(:hover) .nav-submenu { display: none !important; }

.app-nav .nav-sep {
    height: 1px;
    background: var(--border-soft);
    margin: 8px 4px;
}
.app-nav .nav-spacer { flex: 1; min-height: 8px; }
.app-nav .nav-footer {
    padding-top: 12px;
    border-top: 1px solid var(--border-soft);
}
.app-nav .nav-user {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 6px;
    border-radius: 8px;
}
.app-nav .nav-user img {
    width: 28px;
    height: 28px;
    border-radius: 50%;
    object-fit: cover;
    flex: none;
}
.app-nav .nav-user .name {
    flex: 1;
    min-width: 0;
    font-size: 13px;
    color: var(--text-primary);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* 2a linha do rodape: tema + sair. Antes tudo (avatar, nome, tema, sair) dividia UMA
   linha de ~180px — com o nome truncando em "Douglas Fer...". Separando, o nome ganha
   a linha inteira e os botoes ficam confortaveis embaixo. */
.app-nav .nav-user-actions {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 2px 6px 0 6px;
}
/* Menu recolhido (so icones): centraliza os dois botoes, senao ficam colados na borda. */
.app-nav.collapsed:not(:hover) .nav-user-actions {
    justify-content: center;
    padding-left: 0;
    padding-right: 0;
}
/* Na 2a linha o sair vai pra DIREITA (o tema fica na esquerda). */
.app-nav .nav-user-actions a.logout { margin-left: auto; }
.app-nav .nav-user a.logout,
.app-nav .nav-user-actions a.logout {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 6px;
    color: var(--icon-color);
    text-decoration: none;
    transition: background-color .15s ease, color .15s ease;
}
.app-nav .nav-user a.logout:hover,
.app-nav .nav-user-actions a.logout:hover {
    color: var(--text-primary);
    background: var(--surface-hover);
}

/* === THEME TOGGLE BUTTON (sidebar footer, ao lado do logout) === */
.app-nav .nav-user .nav-theme-btn,
.app-nav .nav-user-actions .nav-theme-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border: 0;
    background: transparent;
    border-radius: 6px;
    color: var(--icon-color);
    cursor: pointer;
    padding: 0;
    transition: background-color .15s ease, color .15s ease;
}
.app-nav .nav-user .nav-theme-btn:hover,
.app-nav .nav-user-actions .nav-theme-btn:hover {
    color: var(--text-primary);
    background: var(--surface-hover);
}
/* Glifo do botao de tema: vem do data-MODO (escolha do usuario), nao do data-theme.
   Em 'auto' o tema efetivo e claro OU escuro, mas o botao tem que dizer "AUTO" — por isso
   as regras antigas (que liam data-theme) nao serviam mais. */
.app-nav .nav-theme-btn .theme-ico-sun,
.app-nav .nav-theme-btn .theme-ico-moon,
.app-nav .nav-theme-btn .theme-ico-auto { display: none; }
.app-nav .nav-theme-btn[data-modo="light"] .theme-ico-sun  { display: block; }
.app-nav .nav-theme-btn[data-modo="dark"]  .theme-ico-moon { display: block; }
.app-nav .nav-theme-btn[data-modo="auto"]  .theme-ico-auto { display: block; }
.app-nav .nav-theme-btn .theme-ico-auto {
    font-size: 9px; font-weight: 700; letter-spacing: .5px; line-height: 1;
}

/* esconde a nav em telas pequenas — chat ocupa toda a largura */
@media (max-width: 768px) {
    /* Nav vira GAVETA deslizante (em vez de sumir). Abre pelo hambúrguer. */
    .app-nav {
        position: fixed; top: 0; left: 0; bottom: 0; z-index: 1101;
        width: 240px !important; transform: translateX(-100%);
        transition: transform .25s ease;
    }
    .app-nav.nav-open { transform: translateX(0); box-shadow: 2px 0 18px rgba(0,0,0,.55); }
    /* No mobile a nav é sempre cheia (ignora collapse de desktop) */
    .app-nav .nav-item span, .app-nav .nav-user .name,
    .app-nav .brand span, .app-nav .nav-subitem span { opacity: 1 !important; width: auto !important; }
    .app-nav .nav-pin-btn { display: none; }
    /* Botão hambúrguer flutuante */
    #navHamburger {
        position: fixed; top: 9px; left: 9px; z-index: 1100;
        width: 40px; height: 40px; border: 1px solid var(--border-soft); border-radius: 50%;
        background: var(--bg-hover); color: var(--text-primary); cursor: pointer;
        display: flex; align-items: center; justify-content: center;
        box-shadow: var(--shadow-elev-1);
    }
    /* Overlay escuro atrás da gaveta */
    #navOverlay {
        position: fixed; inset: 0; z-index: 1100; background: rgba(0, 0, 0, .5);
        opacity: 0; pointer-events: none; transition: opacity .2s;
    }
    #navOverlay.show { opacity: 1; pointer-events: auto; }
}
@media (min-width: 769px) {
    #navHamburger, #navOverlay { display: none !important; }
}
@media (max-width: 768px) {
    /* Empurra o conteúdo do chat pra direita do hambúrguer (não cobre avatar/voltar) */
    .sidebar-header, .chat-header { padding-left: 50px; }
}

/* Container do conteúdo do painel master quando renderizado dentro de .app-shell */
.master-main {
    flex: 1;
    min-width: 0;
    overflow-y: auto;
}

.app-container {
    display: flex;
    flex: 1;
    min-width: 0;
    height: 100%;
    position: relative;
    overflow: hidden;
}

/* === SIDEBAR === */
.sidebar {
    width: 30%;
    min-width: 320px;
    max-width: 440px;
    background-color: var(--bg-sidebar);
    border-right: 1px solid var(--border-color);
    display: flex;
    flex-direction: column;
    z-index: 10;
    transition: transform 0.3s ease;
}

.sidebar-header {
    height: 56px;
    background-color: var(--bg-header);
    display: flex;
    align-items: center;
    padding: 0 16px;
    justify-content: space-between;
}

.avatar {
    width: 40px;
    height: 40px;
    border-radius: 50% !important;
    object-fit: cover;
    flex-shrink: 0;
}


.header-actions {
    display: flex;
    align-items: center;
    gap: 4px;
}

/* === SEARCH === */
.sidebar-search {
    padding: 7px 12px;
    background-color: var(--bg-sidebar);
}

.search-box {
    display: flex;
    align-items: center;
    background-color: var(--bg-hover);
    border-radius: 8px;
    padding: 0 12px;
    height: 35px;
    gap: 14px;
}

.search-box i {
    color: var(--text-secondary);
    font-size: 13px;
}

.search-box input {
    flex: 1;
    background: none;
    border: none;
    outline: none;
    font-size: 13px;
    color: var(--text-primary);
}

.search-box input::placeholder {
    color: var(--text-secondary);
}

/* === FILTERS === */
.sidebar-filters {
    display: flex;
    gap: 6px;
    padding: 4px 12px 8px 12px;
    overflow-x: auto;
    background-color: var(--bg-sidebar);
}

.filter-chip {
    padding: 5px 12px;
    border-radius: 16px;
    font-size: 12px;
    font-weight: 500;
    border: none;
    cursor: pointer;
    white-space: nowrap;
    background-color: var(--bg-hover);
    color: var(--text-secondary);
    transition: all 0.15s;
}

.filter-chip:hover {
    background-color: var(--bg-hover);
    color: var(--text-primary);
}

.filter-chip.active {
    background-color: var(--green);
    color: var(--on-accent);
}

/* === CONTACT LIST === */
.contact-list {
    flex: 1;
    overflow-y: auto;
}

/* Loading inicial da lista de conversas (enquanto o get_chats responde).
   Barra INDETERMINADA de propósito: o get_chats é uma requisição única e bloqueante —
   não existe progresso parcial pra reportar, então a barra indica atividade, não
   porcentagem. Mesma linguagem visual da barra de sync de histórico (sync_progress.js). */
.chatlist-loading {
    padding: 34px 24px;
    text-align: center;
    color: var(--text-secondary);
}
.chatlist-loading .cl-bar {
    height: 4px;
    max-width: 220px;
    margin: 0 auto 14px auto;
    border-radius: 4px;
    background: var(--surface-hover);
    overflow: hidden;
}
.chatlist-loading .cl-fill {
    height: 100%;
    width: 40%;
    border-radius: 4px;
    background: var(--accent-solid);
    animation: clSweep 1.15s ease-in-out infinite;
}
@keyframes clSweep {
    0%   { margin-left: -40%; }
    100% { margin-left: 100%; }
}
.chatlist-loading small { font-size: 12.5px; }

.contact-item {
    display: flex;
    padding: 10px 15px;
    align-items: center;
    cursor: pointer;
    transition: background 0.15s;
}

.contact-item:hover {
    background-color: var(--bg-hover);
}

.contact-item.active {
    background-color: var(--bg-hover);
}

.contact-item img {
    width: 49px;
    height: 49px;
    border-radius: 50%;
    margin-right: 13px;
    object-fit: cover;
    flex-shrink: 0;
}

.contact-info {
    flex: 1;
    display: flex;
    flex-direction: column;
    min-width: 0;
    padding-bottom: 10px;
}

.contact-info-top {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
}

.contact-name {
    font-size: 16px;
    font-weight: 400;
    color: var(--text-primary);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    flex: 1;
    margin-right: 8px;
}

.contact-time {
    font-size: 12px;
    color: var(--text-secondary);
    flex-shrink: 0;
}

.contact-info-bottom {
    display: flex;
    align-items: center;
    margin-top: 3px;
}

/* Etiquetas atribuídas ao contato — linha abaixo do preview */
.contact-labels-row {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin-top: 5px;
}
.contact-label-pill {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    color: #fff;
    font-size: 10px;
    font-weight: 600;
    padding: 2px 8px;
    border-radius: 9999px;
    line-height: 1.4;
    max-width: 100%;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.contact-preview {
    font-size: 13px;
    color: var(--text-secondary);
    text-overflow: ellipsis;
    white-space: nowrap;
    overflow: hidden;
    flex: 1;
}

.contact-badge {
    background-color: var(--green);
    color: var(--on-accent);
    font-size: 11px;
    font-weight: 700;
    min-width: 20px;
    height: 20px;
    border-radius: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0 5px;
    margin-left: 8px;
}

/* === BARRA DE AÇÕES DO CHAT (acima do campo de digitação) === */
.chat-actions-bar {
    width: 100%;
    flex: none;
    background-color: var(--bg-sidebar);
    border-top: 1px solid var(--border-color);
    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: flex-start;
    padding: 6px 12px;
    gap: 6px;
    z-index: 9;
}
.chat-actions-bar .cab-btn {
    width: 40px;
    height: 40px;
    border: 0;
    border-radius: 10px;
    background: transparent;
    color: var(--icon-color);
    font-size: 16px;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: background-color .15s ease, color .15s ease, transform .1s ease;
}
.chat-actions-bar .cab-btn:hover:not(:disabled) {
    background: rgba(0,200,83,0.10);
    color: var(--nav-accent);
}
.chat-actions-bar .cab-btn:active:not(:disabled) { transform: scale(0.94); }
.chat-actions-bar .cab-btn:disabled {
    opacity: 0.35;
    cursor: not-allowed;
}

/* === BADGE DE DISPARO EM ANDAMENTO === */
.disparo-badge {
    position: absolute;
    top: 64px;
    left: 50%;
    transform: translateX(-50%);
    max-width: 90%;
    z-index: 50;
    background: rgba(249, 105, 0, 0.96);
    color: #FFFFFF;
    padding: 8px 14px;
    border-radius: 9999px;
    font-size: 13px;
    font-weight: 500;
    display: flex;
    align-items: center;
    gap: 10px;
    cursor: pointer;
    box-shadow: 0 6px 18px rgba(0,0,0,0.45);
    border: 1px solid rgba(255,255,255,0.10);
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
    animation: badgeIn .25s ease;
}
@keyframes badgeIn { from { opacity:0; transform: translateX(-50%) translateY(-6px); } to { opacity:1; transform: translateX(-50%) translateY(0); } }
.disparo-badge .badge-ico { display: inline-flex; align-items: center; justify-content: center; }
.disparo-badge .badge-ico i { font-size: 14px; }
.disparo-badge.pulse .badge-ico i { animation: badgePulse 1.2s infinite; }
@keyframes badgePulse { 0%,100% { opacity: 1; } 50% { opacity: 0.45; } }
.disparo-badge .badge-text { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 340px; }
.disparo-badge .badge-hint { font-size: 11px; opacity: 0.75; margin-left: 6px; }
.disparo-badge.done { background: rgba(0, 138, 60, 0.96); }
.disparo-badge.failed, .disparo-badge.cancelled {
    background: rgba(140, 30, 30, 0.95);
}
@media (max-width: 700px) {
    .disparo-badge { font-size: 12px; padding: 7px 12px; }
    .disparo-badge .badge-text { max-width: 200px; }
}

@media (max-width: 1024px) {
    .chat-actions-bar { padding: 4px 10px; }
}

/* === CHAT AREA === */
.chat-area {
    flex: 1;
    display: flex;
    flex-direction: column;
    background-color: var(--bg-chat);
    position: relative;
}

.chat-header {
    height: 56px;
    background-color: var(--bg-header);
    display: flex;
    align-items: center;
    padding: 0 16px;
    z-index: 5;
}

.menu-toggle {
    display: none;
    background: none;
    border: none;
    color: var(--icon-color);
    font-size: 22px;
    margin-right: 10px;
    cursor: pointer;
}

.chat-header-info {
    display: flex;
    align-items: center;
    flex: 1;
    min-width: 0;
}

.chat-header-info img {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    margin-right: 12px;
    object-fit: cover;
}

.chat-header-title {
    font-size: 16px;
    font-weight: 500;
    color: var(--text-primary);
}

/* === MESSAGES ===
   Doodle vetorial dark — tile 280x280, self-hosted em assets/img/wa-doodle-dark.svg.
   Path absoluto pra funcionar dentro de subpastas (/chat/, /modelos/ etc). */
.chat-messages {
    flex: 1;
    overflow-y: auto;
    padding: 20px 7%;
    display: flex;
    flex-direction: column;
    gap: 8px;
    background-color: var(--bg-chat);
    background-image: url('../img/wa-doodle-dark.svg');
    background-size: 280px 280px;
    background-repeat: repeat;
    background-attachment: fixed;
}
/* No light mode o doodle dark fica ilegível — esconde e usa só a cor de fundo */
:root[data-theme="light"] .chat-messages {
    background-image: none;
}


.message {
    max-width: 85%;
    display: flex;
    align-items: flex-end;
    margin-bottom: 2px;
    animation: fadeInSlideUp 0.25s cubic-bezier(0.1, 0.82, 0.25, 1);
}

.msg-bubble {
    position: relative;
    padding: 6px 7px 8px 9px;
    border-radius: 14px;
    font-size: 14.2px;
    line-height: 19px;
    color: var(--text-primary);
    box-shadow: 0 1px 0.5px rgba(0, 0, 0, 0.13);
    max-width: 100%;
    word-wrap: break-word;
    min-width: 85px;
    /* Evita balões 'esmagados' em mensagens curtas */
}


@keyframes fadeInSlideUp {
    0% {
        opacity: 0;
        transform: translateY(10px) scale(0.98);
    }

    100% {
        opacity: 1;
        transform: translateY(0) scale(1);
    }
}

.msg-received {
    align-self: flex-start;
    flex-direction: row;
    justify-content: flex-start;
}

.msg-received .msg-bubble {
    background-color: var(--bg-bubble-in);
    border-top-left-radius: 0;
}

.msg-sent {
    align-self: flex-end;
    flex-direction: row;
    justify-content: flex-end;
}

.msg-sent .msg-bubble {
    background-color: var(--bg-bubble-out);
    border-top-right-radius: 0;
}

/* Tails */
.msg-bubble::after {
    content: "";
    position: absolute;
    top: 0;
    width: 10px;
    height: 13px;
}

.msg-sent .msg-bubble::after {
    right: -8px;
    background-color: var(--bg-bubble-out);
    clip-path: polygon(0 0, 0 100%, 100% 0);
}

.msg-received .msg-bubble::after {
    left: -8px;
    background-color: var(--bg-bubble-in);
    clip-path: polygon(100% 0, 0 0, 100% 100%);
}



.msg-time {
    font-size: 11px;
    color: var(--text-secondary);
    white-space: nowrap;
    /* Padrão WhatsApp: time fica posicionado no canto inferior direito do balão */
    position: absolute;
    bottom: 4px;
    right: 8px;
    margin: 0;
    line-height: 1;
}

/* Bubble sempre relative pra acomodar o time absoluto */
.msg-bubble { position: relative; }

/* Tag "Encaminhada" estilo WhatsApp */
.msg-forwarded-tag {
    display: flex;
    align-items: center;
    gap: 5px;
    font-size: 12px;
    color: var(--text-secondary);
    font-style: italic;
    margin-bottom: 4px;
}
.msg-forwarded-tag i {
    font-size: 11px;
}

/* Técnica WhatsApp: ghost element no final do texto reserva espaço pro time.
   - Em textos curtos: ghost fica na mesma linha → time sobreposto cai bem ao lado.
   - Em textos longos: ghost segue na última linha → time fica abaixo do texto.
   - Time absoluto sempre no canto inferior direito da bolha (vai sobre o ghost). */
.msg-text-content::after {
    content: "";
    display: inline-block;
    width: 64px;       /* largura aproximada de "11:05 ✓✓" */
    height: 14px;
    pointer-events: none;
}
/* Texto enviado precisa de mais espaço (tem 2 ticks ao invés de só hora) */
.msg-sent .msg-text-content::after {
    width: 78px;
}
.msg-bubble {
    padding-bottom: 18px;  /* espaço vertical pra linha do time absoluto */
}

/* Quando o balão tem imagem (com ou sem texto), o time fica como overlay no canto inferior direito da própria imagem */
.msg-image .msg-bubble { position: relative; }
.msg-image:not(.has-text) .msg-bubble .msg-time {
    position: absolute;
    bottom: 6px;
    right: 8px;
    margin: 0;
    padding: 2px 8px;
    background: rgba(0, 0, 0, 0.55);
    color: #fff !important;
    border-radius: 10px;
    z-index: 2;
    backdrop-filter: blur(2px);
    -webkit-backdrop-filter: blur(2px);
}
.msg-image:not(.has-text) .msg-bubble .msg-time .status-icon i {
    color: #fff !important;
}
/* Mantém azul do "lido" mesmo no overlay */
.msg-image:not(.has-text) .msg-bubble .msg-time .status-icon i.fa-check-double[style*="53bdeb"] {
    color: var(--blue-tick) !important;
}

/* === MEDIA === */
.msg-image .msg-bubble {
    width: 300px;
    max-width: 85vw;
    padding: 2px !important;
    /* overflow VISIBLE de propósito: o badge de reação fica em bottom:-12px, pendurado
       pra fora da bolha — com overflow:hidden ele era CORTADO em cima da imagem.
       O arredondamento da mídia não depende mais do clip da bolha: a .msg-media-img tem
       border-radius própria (11px = raio 14px da bolha - 3px de padding), o que reproduz
       exatamente o recorte que o overflow fazia. */
    overflow: visible;
}

.message.has-text.msg-image .msg-bubble {
    padding-bottom: 4px !important;
}

.message.has-text.msg-image .msg-bubble>span {
    padding: 6px 10px 4px 10px;
    display: block;
}

.msg-media-img {
    width: 100%;
    height: 320px;
    object-fit: cover;
    /* 11px = raio da bolha (14px) - padding (3px). Antes eram 6px, mas o
       overflow:hidden da bolha clipava por cima e o que se via era o raio dela.
       Agora que o overflow é visible (pro badge de reação não ser cortado), a
       imagem precisa carregar esse raio sozinha pra o visual não mudar. */
    border-radius: 11px;
    display: block;
    cursor: pointer;
}


.msg-time-overlay {
    position: absolute;
    bottom: 5px;
    right: 5px;
    background: linear-gradient(to top, rgba(0,0,0,0.5), transparent);
    padding: 15px 8px 5px 20px;
    border-bottom-right-radius: 8px;
    z-index: 2;
    pointer-events: none;
    display: none;
}

.msg-bubble .msg-time-overlay {
    display: flex;
    align-items: center;
}

.msg-time-overlay .msg-time {
    margin: 0 !important;
    color: #fff !important;
    font-size: 11px !important;
    font-weight: 500;
}

.msg-media-video {
    width: 100%;
    max-height: 330px;
    border-radius: 6px;
    margin-bottom: 4px;
    display: block;
}


/* Custom Audio Player WhatsApp Style */
.msg-audio-wrapper {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 4px 2px;
    min-width: 280px;
}

.audio-play-btn {
    background: none;
    border: none;
    color: var(--text-secondary);
    font-size: 24px;
    cursor: pointer;
    width: 32px;
    height: 32px;
    display: flex;
    align-items: center;
    justify-content: center;
}

.audio-visualizer-container {
    flex: 1;
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 8px;
}

.audio-progress-bar {
    width: 100%;
    height: 3px;
    background: var(--border-soft);
    position: relative;
    border-radius: 2px;
    cursor: pointer;
}

.audio-progress-fill {
    height: 100%;
    background: var(--blue-tick);
    /* WhatsApp blue for voice notes */
    width: 0%;
    border-radius: 2px;
}

.audio-progress-handle {
    width: 12px;
    height: 12px;
    background: var(--blue-tick);
    border-radius: 50%;
    position: absolute;
    top: 50%;
    left: 0%;
    transform: translate(-50%, -50%);
}

.audio-avatar-wrapper {
    position: relative;
    width: 48px;
    height: 48px;
    flex-shrink: 0;
    border-radius: 50%;
    overflow: hidden;
}

.audio-avatar-img {
    width: 100%;
    height: 100%;
    border-radius: 50%;
    object-fit: cover;
    display: block;
}

.audio-mic-badge {
    position: absolute;
    bottom: -1px;
    left: -2px;
    background: var(--bg-header);
    width: 20px;
    height: 20px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 11px;
    color: var(--blue-tick);
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
}

.audio-meta-info {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-top: -2px;
    font-size: 11px;
    color: var(--text-secondary);
}


.message img,
.message video {
    max-width: 100%;
    border-radius: 6px;
    margin-bottom: 4px;
}

.message audio {
    width: 280px;
    height: 36px;
}

/* === INPUT === */
.chat-input-area {
    min-height: 62px;
    background-color: var(--bg-input);
    padding: 5px 10px;
    display: flex;
    align-items: center;
    gap: 5px;
}

.btn-icon {
    background: none;
    border: none;
    color: var(--icon-color);
    font-size: 22px;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 42px;
    height: 42px;
    border-radius: 50%;
    flex-shrink: 0;
    transition: color 0.15s;
}

.btn-icon:hover {
    color: var(--text-primary);
}

.input-container {
    flex: 1;
    background-color: var(--bg-hover);
    border-radius: 8px;
    padding: 9px 12px;
    display: flex;
    align-items: flex-end; /* textarea cresce pra cima */
}

.input-container input,
.input-container textarea {
    width: 100%;
    background: none;
    border: none;
    color: var(--text-primary);
    font-size: 15px;
    line-height: 20px;
    outline: none;
    font-family: inherit;
    margin: 0;
    padding: 0;
}

/* Textarea: auto-grow controlado por JS (height = scrollHeight, capped) +
   rolagem interna quando passar do limite, igual WhatsApp Web. */
.input-container textarea {
    display: block;
    resize: none;
    overflow-y: auto;
    min-height: 20px;
    max-height: 120px; /* ~6 linhas */
    word-wrap: break-word;
    overflow-wrap: break-word;
}

/* Scrollbar interna do textarea (mesma do resto: 6px, thumb white/0.15) */
.input-container textarea::-webkit-scrollbar { width: 6px; }
.input-container textarea::-webkit-scrollbar-thumb {
    background: var(--border-soft);
    border-radius: 3px;
}
.input-container textarea::-webkit-scrollbar-thumb:hover {
    background: var(--border-color);
}

.input-container input::placeholder,
.input-container textarea::placeholder {
    color: var(--text-secondary);
}

/* === MOBILE / TABLET (admin é mobile-first até 1024px) === */
@media screen and (max-width: 1024px) {
    .sidebar {
        position: absolute;
        left: -100%;
        width: 100%;
        min-width: unset;
        max-width: unset;
        height: 100%;
        z-index: 100;
    }

    .sidebar.active {
        left: 0;
    }

    .menu-toggle {
        display: block;
    }

    .message {
        max-width: 85%;
    }

    .chat-messages {
        padding: 12px 4%;
    }

    /* Fix para o input no mobile */
    .chat-input-area {
        padding: 5px 8px;
        min-height: 54px;
    }

    .btn-icon {
        width: 38px;
        height: 38px;
        font-size: 20px;
    }

    .input-container {
        padding: 6px 10px;
    }

    .input-container input {
        font-size: 14px;
    }

    /* Ajuste para evitar que o teclado esconda o input em alguns navegadores */
    .app-container {
        height: 100dvh;
    }
}

/* Footer sticky em mobile — garante que input fica acima do teclado virtual */
@media screen and (max-width: 1024px) {
    .chat-area > footer,
    .chat-area footer {
        position: sticky;
        bottom: 0;
        z-index: 50;
        background-color: var(--bg-input);
    }
}

/* Mobile puro (< 500px): ajustes finos adicionais */
@media screen and (max-width: 500px) {
    .chat-header {
        padding: 0 8px;
    }
    .sidebar-header {
        padding: 0 8px;
    }
    .sidebar-header .header-actions .btn-icon {
        margin-left: 2px;
        width: 36px;
        height: 36px;
        font-size: 18px;
    }
}

/* === TELA NOVA CONVERSA (estilo WhatsApp) === */
.newchat-screen {
    position: fixed;
    top: 0; left: 0; right: 0; bottom: 0;
    background: var(--bg-sidebar);
    z-index: 10500;
    display: none;
    flex-direction: column;
}
.newchat-screen.show { display: flex; }

.newchat-header {
    display: flex; align-items: center;
    background: var(--green);
    color: #fff;
    padding: 12px 12px;
    min-height: 60px;
    gap: 8px;
}
.newchat-header .btn-icon { color: #fff; width: 40px; height: 40px; }
.newchat-header .btn-icon:hover { color: rgba(255,255,255,0.75); }
.newchat-title { flex: 1; min-width: 0; }
.newchat-title h3 { margin: 0; font-size: 17px; font-weight: 600; }
.newchat-subtitle { font-size: 12px; opacity: .85; margin-top: 2px; }

.newchat-search { padding: 10px 14px; background: var(--bg-sidebar); border-bottom: 1px solid var(--border-color); }

.newchat-actions { background: var(--bg-sidebar); padding: 4px 0; border-bottom: 1px solid var(--border-color); }
.newchat-action-item {
    display: flex; align-items: center; gap: 14px;
    width: 100%; background: none; border: none;
    color: var(--text-primary);
    padding: 12px 16px;
    font-size: 15px; cursor: pointer; text-align: left;
}
.newchat-action-item:hover:not([disabled]) { background: var(--bg-hover); }
.newchat-action-item[disabled] { cursor: not-allowed; opacity: .55; }
.newchat-action-item .action-icon {
    width: 44px; height: 44px; border-radius: 50%;
    display: flex; align-items: center; justify-content: center;
    color: #fff; font-size: 18px; flex-shrink: 0;
}

.newchat-section-label {
    padding: 10px 16px 6px 16px;
    color: var(--green);
    font-size: 12px; font-weight: 600;
    background: var(--bg-sidebar);
    border-top: 6px solid var(--bg-body);
}

.newchat-list {
    flex: 1;
    overflow-y: auto;
    background: var(--bg-sidebar);
}
.nc-contact-item {
    display: flex; align-items: center; gap: 12px;
    padding: 10px 16px;
    cursor: pointer;
    border-bottom: 1px solid rgba(134,150,160,0.08);
    transition: background 0.15s;
}
.nc-contact-item:hover { background: var(--bg-hover); }
.nc-contact-item img { width: 44px; height: 44px; border-radius: 50%; object-fit: cover; flex-shrink: 0; }
.nc-contact-item .info { flex: 1; min-width: 0; }
/* Nome + telefone na MESMA linha. Vira flex pra o nome truncar e o telefone NAO:
   com ellipsis no container inteiro, um nome longo comeria justamente o telefone. */
.nc-contact-item .nome {
    font-size: 15px; color: var(--text-primary); font-weight: 500;
    display: flex; align-items: baseline; gap: 8px; min-width: 0;
}
.nc-contact-item .nc-nome-txt {
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0;
}
.nc-contact-item .nc-tel {
    font-size: 12px; color: var(--text-secondary); font-weight: 400;
    white-space: nowrap; flex-shrink: 0;   /* nunca encolhe: e o dado que se quer ver */
}
.nc-contact-item .sub { font-size: 12px; color: var(--text-secondary); margin-top: 2px; }
/* Dentro do .nome (agora flex) o vertical-align nao vale e o margin-left somaria ao gap:
   o alinhamento vem do align-items e o espaco do gap. flex-shrink:0 pra nao amassar. */
.nc-contact-item .badge-wa { background: var(--green); color: #fff; font-size: 9px; padding: 1px 6px; border-radius: 8px; flex-shrink: 0; }

/* Filtro por listas (chips na tela Nova Conversa) */
.newchat-labels-filter {
    display: flex;
    gap: 6px;
    padding: 8px 16px;
    overflow-x: auto;
    background: var(--bg-sidebar);
    border-bottom: 1px solid var(--border-color);
}
.newchat-labels-filter:empty { display: none; }
.label-chip {
    display: inline-flex; align-items: center; gap: 5px;
    padding: 5px 12px;
    border-radius: 14px;
    font-size: 12px; font-weight: 500;
    color: #fff;
    cursor: pointer;
    border: 1px solid transparent;
    white-space: nowrap;
    flex-shrink: 0;
    transition: opacity 0.15s, border-color 0.15s;
}
.label-chip:not(.active) { opacity: 0.55; }
.label-chip.active { border-color: rgba(255,255,255,0.35); }
:root[data-theme="light"] .label-chip.active { border-color: rgba(17,27,33,0.35); }
.label-chip .count { opacity: 0.85; font-size: 11px; }
.label-chip[data-id="0"] { background: var(--bg-hover); color: var(--text-primary); }

/* Picker de cores no modal "Nova Lista" */
.color-swatch {
    width: 100%; aspect-ratio: 1;
    border-radius: 50%;
    cursor: pointer;
    border: 3px solid transparent;
    transition: border-color 0.15s, transform 0.15s;
}
.color-swatch:hover { transform: scale(1.1); }
.color-swatch.selected { border-color: var(--text-primary); }

/* Chips no painel "Dados do Contato" */
.contact-label-chip {
    display: inline-flex; align-items: center; gap: 4px;
    padding: 3px 10px; border-radius: 12px;
    font-size: 11px; color: #fff; font-weight: 500;
    cursor: default;
}
.contact-label-chip .remove {
    cursor: pointer;
    margin-left: 4px;
    opacity: 0.7;
    font-size: 10px;
}
.contact-label-chip .remove:hover { opacity: 1; }

/* Linhas no modal "Atribuir Listas" */
.assign-label-row {
    display: flex; align-items: center; gap: 12px;
    padding: 10px 12px;
    border-radius: 8px;
    cursor: pointer;
    transition: background 0.15s;
}
.assign-label-row:hover { background: var(--bg-hover); }
.assign-label-row .swatch {
    width: 22px; height: 22px;
    border-radius: 50%;
    flex-shrink: 0;
}
.assign-label-row .nome { flex: 1; color: var(--text-primary); font-size: 14px; }
.assign-label-row .check { color: var(--green); }

@media screen and (min-width: 1025px) {
    /* Desktop: mostra como modal centralizado, não tela cheia */
    .newchat-screen.show {
        top: 5vh; bottom: 5vh; left: 50%;
        right: auto;
        transform: translateX(-50%);
        width: 460px; max-width: 90vw;
        border-radius: 12px;
        overflow: hidden;
        box-shadow: 0 10px 40px rgba(0,0,0,.6);
    }
}

/* === FORÇAR VISIBILIDADE DOS BOTÕES NO INPUT (mobile-first) === */
/* Garante que attach + send sempre apareçam, em qualquer tela */
.chat-input-area #btnAttach,
.chat-input-area #btnSend {
    display: inline-flex !important;
    visibility: visible !important;
    opacity: 1 !important;
    flex-shrink: 0 !important;
    min-width: 38px;
}
.chat-input-area .input-container {
    min-width: 0; /* permite encolher para deixar espaço aos botões */
}

/* === STATUS ICON (ticks de mensagem - tamanho legível) === */
.status-icon { display: inline-flex; align-items: center; margin-left: 3px; font-size: 14px; line-height: 1; }
.status-icon i { font-size: 14px !important; }
@media screen and (max-width: 1024px) {
    .status-icon i { font-size: 15px !important; }
}

/* === REPLY-BAR responsivo (texto longo não quebra layout) === */
@media screen and (max-width: 1024px) {
    .reply-bar { padding: 6px 10px; }
    .reply-bar-text {
        max-width: calc(100vw - 100px);
        font-size: 12px;
    }
    .reply-bar-name { font-size: 11px; }
}

/* Em desktop também limita o texto do reply (era ilimitado e quebrava com mensagens longas) */
.reply-bar-text {
    max-width: 100%;
    display: block;
}

/* === Quoted message DENTRO de uma bolha (citação na mensagem enviada/recebida) === */
.quoted-message {
    background: rgba(0,0,0,0.18);
}
/* Light: tint escura de 18% pesa demais no balão branco/verde-claro */
:root[data-theme="light"] .quoted-message,
:root[data-theme="light"] .msg-quoted {
    background: rgba(17,27,33,0.06);
}
.quoted-message {
    border-left: 3px solid var(--green);
    padding: 6px 10px;
    border-radius: 6px;
    margin-bottom: 6px;
    font-size: 13px;
    overflow: hidden;
}
.quoted-message .quoted-text {
    color: var(--text-secondary);
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    -webkit-box-orient: vertical;
    word-break: break-word;
    max-width: 100%;
}

/* === MELHORIAS ESTILO WHATSAPP === */
/* Bolhas mais arredondadas */
.message {
    border-radius: 10px !important;
    word-wrap: break-word;
    overflow-wrap: break-word;
}
/* Quebra texto longo em palavras gigantes (URLs, sequências) */
.message-text, .msg-content, .message .text {
    word-break: break-word;
    overflow-wrap: anywhere;
}
/* Foco no input ao digitar — recipe do skill: ring 3px alpha 0.10–0.18 */
.input-container:focus-within {
    box-shadow: 0 0 0 3px rgba(37, 211, 102, 0.18);
}
/* Scrollbar customizada (recipe do skill: 6px / thumb white/0.15, hover 0.25) */
.contact-list::-webkit-scrollbar,
.chat-messages::-webkit-scrollbar {
    width: 6px;
}
.contact-list::-webkit-scrollbar-thumb,
.chat-messages::-webkit-scrollbar-thumb {
    background: var(--border-soft);
    border-radius: 3px;
}
.contact-list::-webkit-scrollbar-thumb:hover,
.chat-messages::-webkit-scrollbar-thumb:hover {
    background: var(--border-color);
}

/* === LOGIN === */
.login-body {
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 100vh;
    min-height: 100dvh;   /* fallback acima; ver nota no .app-shell */
    background-color: var(--bg-body);
    background-image: radial-gradient(circle at 50% 0%, var(--bg-header) 0%, var(--bg-body) 70%);
}

.login-container {
    width: 100%;
    max-width: 400px;
    padding: 20px;
}

.login-box {
    background-color: var(--bg-header);
    border-radius: 12px;
    padding: 40px;
    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
    border: 1px solid var(--border-color);
}

.login-header {
    text-align: center;
    margin-bottom: 30px;
}

.login-header h2 {
    color: var(--text-primary);
    font-size: 24px;
    font-weight: 600;
    margin-bottom: 8px;
}

.login-header p {
    color: var(--text-secondary);
    font-size: 14px;
}

.form-group {
    margin-bottom: 20px;
}

.form-group label {
    display: block;
    margin-bottom: 8px;
    color: var(--text-secondary);
    font-size: 14px;
}

.form-group input {
    width: 100%;
    padding: 12px 15px;
    background-color: var(--bg-hover);
    border: 1px solid var(--border-color);
    border-radius: 8px;
    color: var(--text-primary);
    font-size: 15px;
    outline: none;
    transition: border-color 0.2s;
}

.form-group input:focus {
    border-color: var(--green);
}

.btn-login {
    width: 100%;
    padding: 14px;
    background-color: var(--green);
    color: #fff;
    border: none;
    border-radius: 8px;
    font-size: 16px;
    font-weight: 500;
    cursor: pointer;
    transition: background-color 0.2s;
}

.btn-login:hover {
    background-color: var(--accent-deep);
}

.alert-error {
    background-color: var(--danger-tint);
    color: var(--danger-soft);
    padding: 12px;
    border-radius: 8px;
    border: 1px solid var(--danger-border);
    text-align: center;
    margin-bottom: 20px;
    font-size: 14px;
}

/* === REPLY BAR === */
.reply-bar {
    background-color: var(--bg-input);
    padding: 8px 16px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    border-top: 1px solid var(--border-color);
}

.reply-bar-content {
    display: flex;
    align-items: stretch;
    flex: 1;
    gap: 8px;
    min-width: 0;
}

.reply-bar-line {
    width: 4px;
    border-radius: 2px;
    background-color: var(--green);
}

.reply-bar-info {
    display: flex;
    flex-direction: column;
    min-width: 0;
    flex: 1;
}

.reply-bar-name {
    font-size: 12px;
    font-weight: 600;
    color: var(--green);
}

.reply-bar-text {
    font-size: 13px;
    color: var(--text-secondary);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.reply-bar-close {
    font-size: 18px !important;
}

/* === MEDIA OVERLAY === */
.media-send-overlay {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(11, 20, 26, 0.97);
    z-index: 2000;
    display: flex;
    flex-direction: column;
}

/* O overlay de mídia é escuro FIXO nos 2 temas — por isso o texto/ícones do
   header são claros hardcoded (var(--text-primary) ficaria invisível no light). */
.media-send-header {
    height: 56px;
    padding: 0 20px;
    display: flex;
    align-items: center;
    gap: 16px;
    color: #E9EDEF;
}

.media-send-header .btn-icon {
    color: #AEBAC1;
}

.media-send-header span {
    font-size: 16px;
    font-weight: 500;
}

.media-send-body {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 30px;
    overflow: hidden;
}

.media-send-body img,
.media-send-body video {
    max-width: 85%;
    max-height: 85%;
    object-fit: contain;
    border-radius: 6px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.6);
}

.media-send-footer {
    padding: 20px 8%;
    background-color: var(--bg-header);
    display: flex;
    align-items: center;
    gap: 12px;
}

.media-send-caption {
    flex: 1;
    background-color: var(--bg-hover);
    border-radius: 8px;
    padding: 10px 14px;
}

.media-send-caption input {
    width: 100%;
    background: none;
    border: none;
    color: var(--text-primary);
    font-size: 15px;
    outline: none;
}

.media-send-caption input::placeholder {
    color: var(--text-secondary);
}

.btn-send-media {
    width: 50px;
    height: 50px;
    border-radius: 50%;
    background-color: var(--green);
    color: #fff;
    border: none;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 22px;
    cursor: pointer;
    transition: all 0.2s;
}

.btn-send-media:hover {
    background-color: var(--accent-deep);
}

/* === RECORDING === */
.recording-bar {
    background-color: var(--bg-input);
    padding: 10px 16px;
    display: flex;
    align-items: center;
    gap: 12px;
    border-top: 1px solid var(--border-color);
}

.recording-pulse {
    color: #ef5350;
    font-size: 12px;
    animation: pulse 1s ease-in-out infinite;
}

@keyframes pulse {

    0%,
    100% {
        opacity: 1;
    }

    50% {
        opacity: 0.3;
    }
}

.recording-bar span {
    flex: 1;
    font-size: 14px;
    color: var(--text-primary);
    font-family: monospace;
}

.recording-send {
    color: var(--green) !important;
}

/* === QUOTED === */
.msg-quoted {
    background-color: rgba(0, 0, 0, 0.2);
    border-left: 3px solid var(--green);
    border-radius: 4px;
    padding: 5px 8px;
    margin-bottom: 5px;
    cursor: pointer;
}

.msg-quoted-name {
    font-size: 11px;
    font-weight: 600;
    color: var(--green);
    display: block;
}

.msg-quoted-text {
    font-size: 12px;
    color: var(--text-secondary);
    display: block;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 250px;
}

/* === WHATSAPP DROPDOWN === */
.msg-options {
    position: absolute;
    top: 2px;
    right: 4px;
    z-index: 10;
}

.msg-options-btn {
    background: radial-gradient(circle at center, rgba(11, 20, 26, 0.8) 0%, transparent 100%);
    border: none;
    color: var(--text-secondary);
    font-size: 18px;
    cursor: pointer;
    opacity: 0;
    transition: opacity 0.2s;
    padding: 2px 6px;
    border-radius: 4px;
}

.message:hover .msg-options-btn {
    opacity: 1;
}

.msg-received .msg-options-btn {
    background: radial-gradient(circle at center, rgba(32, 44, 51, 0.8) 0%, transparent 100%);
}
:root[data-theme="light"] .msg-options-btn,
:root[data-theme="light"] .msg-received .msg-options-btn {
    background: radial-gradient(circle at center, rgba(255, 255, 255, 0.85) 0%, transparent 100%);
}

/* === Hover affordances dentro da mensagem (estilo WA Web) ===
   - .msg-chevron-btn: dentro do balão, canto sup. direito; abre o menu
   - .msg-react-btn:   ao lado do balão (lado oposto ao remetente); abre o menu
   Ambos só aparecem em devices com hover (desktop). Em touch/mobile, o
   long-press existente continua sendo o gesto canônico. */
.msg-chevron-btn,
.msg-react-btn {
    position: absolute;
    border: 0;
    cursor: pointer;
    opacity: 0;
    pointer-events: none;
    transition: opacity .15s ease, background-color .15s ease;
    z-index: 4;
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: inherit;
    padding: 0;
}

.msg-chevron-btn {
    top: 2px;
    right: 4px;
    width: 24px;
    height: 22px;
    border-radius: 12px;
    background: linear-gradient(180deg, rgba(0,0,0,0.0) 0%, rgba(0,0,0,0.35) 100%);
    color: rgba(255,255,255,0.85);
    font-size: 11px;
}
/* No balão recebido (cinza claro do bubble-in) o gradient fica mais sutil */
.msg-received .msg-chevron-btn {
    background: linear-gradient(180deg, rgba(32,44,51,0.0) 0%, rgba(32,44,51,0.85) 100%);
}
.msg-chevron-btn:hover {
    background: rgba(0,0,0,0.55);
}
/* Light: balões claros pedem gradiente claro + chevron cinza (estilo WA Web light) */
:root[data-theme="light"] .msg-chevron-btn,
:root[data-theme="light"] .msg-received .msg-chevron-btn {
    background: linear-gradient(180deg, rgba(255,255,255,0) 0%, rgba(255,255,255,0.92) 100%);
    color: #54656F;
}
:root[data-theme="light"] .msg-chevron-btn:hover {
    background: rgba(255,255,255,0.92);
}

.msg-react-btn {
    bottom: 4px;
    width: 32px;
    height: 32px;
    border-radius: 50%;
    background-color: var(--bg-bubble-in);
    border: 1px solid var(--border-color);
    color: var(--text-secondary);
    font-size: 14px;
}
.msg-react-btn:hover {
    background-color: var(--bg-hover);
    color: var(--text-primary);
}
.msg-sent .msg-react-btn    { left: -42px; }
.msg-received .msg-react-btn { right: -42px; }

/* Ponte invisível pra cobrir o gap entre o balão e o botão de reação.
   Sem isso, o mouse atravessava ~10px de área vazia e o hover caía,
   sumindo o botão. Como o ::before é filho do botão, hover sobre ele
   conta como hover na .message e mantém a affordance visível. */
.msg-react-btn::before {
    content: '';
    position: absolute;
    top: -12px;
    bottom: -12px;
    width: 14px;
}
.msg-sent .msg-react-btn::before    { right: -14px; }
.msg-received .msg-react-btn::before { left: -14px; }

/* Aparece só quando dá hover na mensagem em devices com hover real */
@media (hover: hover) {
    .message:hover .msg-chevron-btn,
    .message:hover .msg-react-btn {
        opacity: 1;
        pointer-events: auto;
    }
}

/* Em msg-image SEM texto: chevron tem que aparecer acima do overlay do tempo,
   posicionado um pouco mais alto e com fundo mais forte */
.msg-image:not(.has-text) .msg-chevron-btn {
    top: 6px;
    right: 6px;
    background: rgba(0,0,0,0.55);
}

.msg-options-menu {
    position: absolute;
    top: 25px;
    background-color: var(--bg-header);
    border-radius: 4px;
    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.5);
    display: none;
    min-width: 140px;
    padding: 8px 0;
    z-index: 20;
}

.msg-received .msg-options-menu {
    left: 0;
}

.msg-sent .msg-options-menu {
    right: 0;
}

.msg-options-menu.show {
    display: block;
    animation: scaleIn 0.15s ease-out;
}

@keyframes scaleIn {
    from {
        opacity: 0;
        transform: scale(0.95);
    }

    to {
        opacity: 1;
        transform: scale(1);
    }
}

.msg-options-menu.open-up {
    top: auto;
    bottom: 30px;
}

.msg-options-item {
    padding: 10px 20px;
    font-size: 14px;
    color: var(--text-primary);
    cursor: pointer;
    transition: background-color 0.15s;
}

.msg-options-item:hover {
    background-color: var(--bg-hover);
}

/* === ENCAMINHAR MODAL === */
/* Modal — recipe do skill §6.4: overlay alpha 0.55, blur 20px, dialog rounded-xl (20px),
   shadow-modal (0 24px 80px rgba(0,0,0,0.6)), section title 20px font-bold */
.modal-overlay {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.55);
    z-index: 3000;
    display: none;
    align-items: center;
    justify-content: center;
    backdrop-filter: blur(20px);
    -webkit-backdrop-filter: blur(20px);
}

.modal-overlay.show {
    display: flex;
}


.modal-content {
    background-color: var(--bg-sidebar);
    width: 90%;
    max-width: 480px;
    border-radius: 20px;
    box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
    display: flex;
    flex-direction: column;
    max-height: 85vh;
    border: 1px solid var(--border-color);
}

.modal-header {
    padding: 24px 24px 16px 24px;
    background-color: transparent;
    border-top-left-radius: 20px;
    border-top-right-radius: 20px;
    display: flex;
    justify-content: space-between;
    align-items: center;
}

.modal-header h3 {
    font-size: 20px;
    font-weight: 700;
    color: var(--text-primary);
}

.modal-close {
    background: none;
    border: none;
    color: var(--text-secondary);
    font-size: 20px;
    cursor: pointer;
}

.modal-body {
    padding: 10px 0;
    overflow-y: auto;
    flex: 1;
}

.modal-contact-item {
    display: flex;
    align-items: center;
    padding: 10px 20px;
    cursor: pointer;
    transition: background-color 0.2s;
}

.modal-contact-item:hover {
    background-color: var(--bg-hover);
}

.modal-contact-item img {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    margin-right: 15px;
}

.modal-footer {
    padding: 16px 24px 24px 24px;
    background-color: transparent;
    border-bottom-left-radius: 20px;
    border-bottom-right-radius: 20px;
    text-align: right;
}

.btn-forward {
    background-color: var(--green);
    color: #fff;
    border: none;
    padding: 10px 20px;
    border-radius: 10px;
    cursor: pointer;
    font-weight: 600;
    font-size: 14px;
    transition: background-color 0.15s, opacity 0.15s;
}

.btn-forward:hover:not(:disabled) {
    background-color: var(--nav-accent);
}

.btn-forward:disabled {
    opacity: 0.4;
    cursor: not-allowed;
}

@keyframes highlightFlash {
    0% {
        background-color: rgba(0, 168, 132, 0.4);
    }

    100% {
        background-color: transparent;
    }
}

/* === CUSTOM WHATSAPP CHECKBOX === */
.msg-selection-wrapper {
    display: none;
    position: relative;
    width: 24px;
    height: 24px;
    margin: 0 15px 10px 10px;
    flex-shrink: 0;
    align-self: center;
    /* Centraliza com a bolha */
}

.selection-mode .msg-selection-wrapper {
    display: block;
}

.msg-selection-checkbox {
    position: absolute;
    opacity: 0;
    cursor: pointer;
    height: 100%;
    width: 100%;
    z-index: 5;
    margin: 0 !important;
}

.msg-selection-custom {
    position: absolute;
    top: 0;
    left: 0;
    height: 22px;
    width: 22px;
    background-color: transparent;
    border: 2px solid var(--icon-color);
    border-radius: 4px;
    /* Quadrado com quinas arredondadas */
    z-index: 1;
    transition: all 0.2s ease;
}

.msg-selection-checkbox:checked~.msg-selection-custom {
    background-color: var(--green);
    border-color: var(--green);
}

.msg-selection-custom:after {
    content: "";
    position: absolute;
    display: none;
    left: 6px;
    top: 2px;
    width: 6px;
    height: 11px;
    border: solid white;
    border-width: 0 2.5px 2.5px 0;
    transform: rotate(45deg);
}

.msg-selection-checkbox:checked~.msg-selection-custom:after {
    display: block;
}

.selection-mode .message {
    cursor: pointer;
}


.selection-mode .chat-messages {
    padding-bottom: 80px !important;
}

.selection-mode .msg-options-btn {
    display: none !important;
}

.forward-selection-bar {
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;
    height: 60px;
    background-color: var(--bg-header);
    display: none;
    align-items: center;
    padding: 0 20px;
    justify-content: space-between;
    z-index: 100;
    box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.3);
}

.forward-selection-bar.active {
    display: flex;
}

.selection-count {
    font-size: 16px;
    font-weight: 500;
}

.selection-actions {
    display: flex;
    gap: 15px;
    align-items: center;
}

.btn-cancel-selection {
    background: none;
    border: none;
    color: var(--text-secondary);
    font-size: 20px;
    cursor: pointer;
}

.btn-next-forward {
    background: none;
    border: none;
    color: var(--green);
    font-size: 24px;
    cursor: pointer;
}


/* Attach Menu */
.attach-menu {
    position: absolute;
    bottom: 80px;
    left: 20px;
    background-color: var(--bg-header);
    border-radius: 12px;
    padding: 10px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
    display: none;
    flex-direction: column;
    gap: 5px;
    z-index: 2000;
}

.attach-menu.active {
    display: flex;
    animation: slideUpAttach 0.2s ease-out;
}

@keyframes slideUpAttach {
    from {
        transform: translateY(20px);
        opacity: 0;
    }

    to {
        transform: translateY(0);
        opacity: 1;
    }
}

.attach-item {
    background: none;
    border: none;
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 10px 15px;
    color: var(--text-primary);
    cursor: pointer;
    border-radius: 8px;
    transition: background 0.2s;
    width: 100%;
}

.attach-item:hover {
    background-color: var(--bg-hover);
}

.attach-item i {
    width: 32px;
    height: 32px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    color: white;
    font-size: 14px;
}

/* Special Bubble Styles */
.msg-sticker .msg-bubble {
    background: none !important;
    box-shadow: none !important;
    padding: 0 !important;
}

.msg-sticker .msg-bubble::after {
    display: none !important;
}

.msg-sticker .msg-time {
    background: rgba(0, 0, 0, 0.4);
    padding: 2px 6px;
    border-radius: 10px;
    margin-right: 5px;
}

.msg-image .msg-bubble {
    padding: 3px !important;
}

.msg-media-sticker {
    width: 160px;
    height: 160px;
    object-fit: contain;
    display: block;
}

/* Floating Reactions */
.msg-quick-reactions-floating {
    display: flex;
    justify-content: space-around;
    padding: 8px 12px;
    background: var(--bg-bubble-in);
    border-radius: 30px;
    gap: 10px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
    margin-bottom: 10px;
    position: absolute;
    top: -55px;
    width: max-content;
    max-width: calc(100vw - 32px);
    z-index: 1001;
}

/* Ancora ao lado da mensagem pra não cortar emojis quando o balão fica
   perto da borda. Recebidas (esquerda) crescem pra direita; enviadas
   (direita) crescem pra esquerda. Substitui o `left:50%; translateX(-50%)`
   que cortava quando a fila era mais larga que o balão. */
.message.msg-received .msg-quick-reactions-floating { left: 0; right: auto; }
.message.msg-sent .msg-quick-reactions-floating { right: 0; left: auto; }

.msg-quick-reactions-floating span {
    font-size: 20px;
    cursor: pointer;
    transition: transform 0.1s ease;
}

.msg-quick-reactions-floating span:hover {
    transform: scale(1.3);
}

.msg-quick-reactions-floating .action-react {
    font-size: 14px;
    color: var(--text-secondary);
    display: flex;
    align-items: center;
    justify-content: center;
}

/* Chat Selection */
#chatMessages {
    user-select: none;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
}

/* Copy fix: allow selection in some parts if needed, but per request, disable overall */
.message {
    cursor: default;
}
/* === Header do chat no mobile estilo WhatsApp (hamburguer + logo + avatar) === */
@media (max-width: 768px) {
    .sidebar-header { padding-left: 52px; justify-content: flex-start; gap: 10px; }
    .sidebar-header .mobile-brand { height: 24px; width: auto; display: block; }
    .sidebar-header .avatar { order: 9; margin-left: auto; }
    .app-nav .header-actions.moved-to-nav {
        display: flex; gap: 6px; padding: 12px 14px; margin-top: 6px;
        border-top: 1px solid var(--border-color);
    }
    .app-nav .header-actions.moved-to-nav .btn-icon {
        background: none; border: 0; color: var(--text-primary); font-size: 20px;
        width: 42px; height: 42px; cursor: pointer;
    }
    .app-nav .header-actions.moved-to-nav #closeSidebar { display: none !important; }

    /* Espaco pro hamburguer nas demais paginas (cada uma tem seu header proprio) */
    .dash-header, .modelos-header, .listas-header, .camp-header, .disparos-header { padding-left: 50px; }

    /* Conversa aberta: esconde o hamburguer flutuante (o botao voltar assume) */
    body.conversa-aberta #navHamburger { display: none !important; }
}
@media (min-width: 769px) {
    .sidebar-header .mobile-brand { display: none; }
}

/* === Banner de instalação do PWA === */
#pwaInstallBar {
    position: fixed; left: 12px; right: 12px; bottom: 12px; z-index: 1200;
    background: var(--bg-surface); color: var(--text-primary); border-radius: 12px; padding: 11px 12px;
    border: 1px solid var(--border-soft);
    display: flex; align-items: center; gap: 11px; box-shadow: var(--shadow-pop);
    max-width: 520px; margin: 0 auto;
}
#pwaInstallBar .pwa-ico { width: 34px; height: 34px; border-radius: 8px; flex: 0 0 auto; }
#pwaInstallBar .pwa-txt { flex: 1; font-size: 13px; line-height: 1.3; }
#pwaInstallBar .pwa-go {
    background: var(--green); color: var(--on-accent); border: 0; border-radius: 8px;
    padding: 8px 14px; font-weight: 700; cursor: pointer; flex: 0 0 auto;
}
#pwaInstallBar .pwa-x {
    background: none; border: 0; color: var(--icon-color); font-size: 22px; line-height: 1;
    cursor: pointer; padding: 0 2px; flex: 0 0 auto;
}

/* === Fix: trava overflow horizontal na conversa (layout quebrava ao responder) === */
@media (max-width: 1024px) {
    .chat-area { overflow-x: clip; }
    .chat-messages { overflow-x: hidden; min-width: 0; }
    .message { max-width: 85%; min-width: 0; }
    .msg-bubble, .quoted-message { max-width: 100%; overflow-wrap: anywhere; word-break: break-word; }
}

/* === Reply bar: citacao SEMPRE em 1 linha truncada (texto longo/enters quebravam) === */
.reply-bar-content, .reply-bar-info { min-width: 0; max-width: 100%; overflow: hidden; }
#replyBarText, .reply-bar-text {
    display: block !important;
    max-width: 100% !important;
    white-space: nowrap !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
    min-width: 0;
}

/* === Citacao DENTRO do balao (.msg-quoted): quebra palavra longa, max 3 linhas, nao estoura === */
.msg-quoted { max-width: 100%; min-width: 0; overflow: hidden; }
.msg-quoted-name { display: block; overflow-wrap: anywhere; word-break: break-word; }
.msg-quoted-text {
    display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
    overflow: hidden; max-width: 100%;
    overflow-wrap: anywhere; word-break: break-word;
}

/* === Conversa centralizada em telas largas (desktop/tablet) — era full-width espalhada === */
@media (min-width: 769px) {
    .chat-messages {
        padding-left: max(16px, calc((100% - 760px) / 2));
        padding-right: max(16px, calc((100% - 760px) / 2));
    }
}

/* === Mobile: contato nao fica "cinza preso" depois de voltar da conversa === */
@media (max-width: 1024px) {
    .contact-item.active { background-color: transparent; }
}

/* === Grupo: nome do autor nao estoura a bolha + avatar do remetente a esquerda === */
.msg-author { display: block; max-width: 100%; word-break: break-word; overflow-wrap: anywhere; line-height: 1.2; }
.msg-received .msg-group-avatar {
    width: 30px; height: 30px; border-radius: 50%;
    margin-right: 6px; margin-bottom: 1px; flex-shrink: 0;
    align-self: flex-end; object-fit: cover;
}
.msg-sent .msg-group-avatar { display: none; }

/* === iOS: usa altura dinamica (input nao fica abaixo do visivel). dvh ignorado em browser antigo === */
@media (max-width: 1024px) {
    .app-shell { height: 100dvh; }
}

/* === Quebra REAL de palavra/string longa (PIX, URL): anywhere reduz o min-content,
   deixando o balao encolher. O break-word inline do .msg-text-content nao reduzia,
   entao a string longa esticava a coluna inteira e empurrava as msgs pra fora. === */
.msg-text-content, .msg-bubble, .msg-quoted-text, .msg-author {
    overflow-wrap: anywhere !important;
}

/* Pega tambem spans internos (ex: link/PIX com overflow-wrap:break-word inline) */
.msg-bubble * { overflow-wrap: anywhere !important; }

/* === Grupo: balao desconta o avatar pra caber (avatar+balao nao estouram a direita) === */
.msg-group-avatar + .msg-bubble { max-width: calc(100% - 42px); }
@media (max-width: 768px) {
    .message { max-width: 82%; } /* um respiro a mais no mobile */
}

/* === Audio: nao forcar 280px no mobile (alargava a coluna e cortava as msgs enviadas) === */
@media (max-width: 768px) {
    .msg-audio-wrapper { min-width: 0; width: 250px; max-width: 100%; }
}

/* === Audio: player responsivo no mobile (vw) + microfone SOBREPOSTO (nao cortado) === */
@media (max-width: 768px) {
    .msg-audio-wrapper { min-width: 0 !important; width: 62vw !important; max-width: 100% !important; }
    .message audio { width: 100% !important; max-width: 100% !important; }
}
.audio-avatar-wrapper { overflow: visible !important; }
.audio-mic-badge { z-index: 3; }

/* === Trava a selecao nativa (palavra azul) + callout de copiar no long-press das mensagens === */
.chat-messages, .message, .msg-bubble, .msg-text-content, .msg-quoted, .msg-quoted-text, .msg-author {
    -webkit-touch-callout: none !important;
    -webkit-user-select: none !important;
    -moz-user-select: none !important;
    -ms-user-select: none !important;
    user-select: none !important;
}

/* === Trava selecao nativa em TODO o app (long-press na lista/mensagens nao seleciona); inputs ok === */
.app-shell {
    -webkit-touch-callout: none !important;
    -webkit-user-select: none !important;
    -moz-user-select: none !important;
    -ms-user-select: none !important;
    user-select: none !important;
}
.app-shell input, .app-shell textarea, .app-shell [contenteditable="true"] {
    -webkit-user-select: text !important;
    user-select: text !important;
    -webkit-touch-callout: default !important;
}

/* === Citacao: bloco normal que QUEBRA (o -webkit-box do line-clamp expandia pra 1 linha e estourava) === */
.msg-quoted-text {
    display: block !important;
    -webkit-line-clamp: unset !important;
    white-space: normal !important;
    overflow-wrap: anywhere !important;
    word-break: break-word !important;
    max-width: 100% !important;
    overflow: hidden;
}

/* === Some com o avatar pessoal do header da LISTA de conversas (fica so na barra lateral) === */
#userMainAvatar { display: none !important; }

/* === Avatar do audio redondo de novo (a regra .message img:6px estava vencendo) ===
   wrapper segue overflow:visible (pro microfone aparecer); o redondo vem do proprio img */
.audio-avatar-img { border-radius: 50% !important; }

/* === Ondinhas (waveform) no audio: barras cinza + tocadas em azul; ✓✓ organizado === */
.audio-progress-bar { height: 24px !important; background: transparent !important; }
.aw-bars {
    position: absolute; inset: 0;
    display: flex; align-items: center; gap: 2px;
    pointer-events: none;
}
.aw-bar { flex: 1 1 0; min-height: 3px; border-radius: 4px; background: currentColor; }
.aw-base { color: var(--border-soft); }            /* nao tocado (cinza) */
.audio-progress-fill {
    position: absolute !important; inset: 0 !important;
    width: auto !important; height: auto !important;
    background: transparent !important; border-radius: 0 !important;
    clip-path: inset(0 100% 0 0);                  /* JS expande conforme toca */
    overflow: visible;
}
.aw-fill { color: var(--blue-tick); }              /* tocado (azul) */
.audio-progress-handle { z-index: 2; }
.audio-meta-info { justify-content: flex-start !important; gap: 6px; }
.audio-meta-info .audio-speed-btn { margin-left: auto; }

/* === Reply-bar: largura travada por vw (nao depende do flex) — previa nao estoura === */
#replyBarText, .reply-bar-text {
    max-width: calc(100vw - 90px) !important;
    white-space: nowrap !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
    display: block !important;
}

/* ============================================================
   Mensagens: documento, cartao de contato (vCard) e placeholder
   de midia. (estilos que existiam so local e nunca foram ao ar)
   ============================================================ */
/* Placeholder enquanto mídia está sendo baixada do Evolution em background */
/* Documento clicável com download forçado */
.msg-document {
    display: flex; align-items: center; gap: 10px;
    background: rgba(0,0,0,0.12);
    padding: 10px 12px; border-radius: 8px;
    cursor: pointer;
    transition: background-color .12s;
}

.msg-document:hover { background: rgba(0,0,0,0.20); }

.msg-document .msg-doc-ico { font-size: 22px; color: var(--icon-color); flex: none; }

.msg-document .msg-doc-name {
    flex: 1; min-width: 0;
    word-break: break-all;
    font-size: 14px;
}

.msg-document .msg-doc-dl {
    font-size: 14px; color: var(--icon-color); opacity: 0.7;
    padding: 6px; border-radius: 6px;
    transition: opacity .12s, background-color .12s;
}

.msg-document:hover .msg-doc-dl { opacity: 1; background: var(--surface-hover); }

/* Cartão de contato (vCard) com botão "Iniciar conversa" */
.msg-contact-card {
    border: 1px solid var(--border-color);
    border-radius: 8px;
    padding: 10px;
    min-width: 220px;
}

.msg-contact-card .msg-contact-head {
    display: flex; align-items: center; gap: 10px;
    margin-bottom: 10px;
}

.msg-contact-card .msg-contact-head > i {
    font-size: 30px; color: var(--icon-color); flex: none;
}

.msg-contact-card .msg-contact-info { flex: 1; min-width: 0; }

.msg-contact-card .msg-contact-name {
    font-weight: 600; font-size: 14px;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.msg-contact-card .msg-contact-tel {
    font-size: 12px; color: var(--text-secondary);
    font-family: monospace; margin-top: 2px;
}

.msg-contact-card .msg-contact-btn {
    width: 100%;
    background: rgba(37,211,102,0.12); color: var(--green);
    border: 1px solid rgba(37,211,102,0.30);
    padding: 8px 12px; border-radius: 6px;
    font-family: inherit; font-size: 13px; font-weight: 600;
    cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 6px;
    transition: background-color .12s;
}

.msg-contact-card .msg-contact-btn:hover { background: rgba(37,211,102,0.20); }

.msg-contact-card .msg-contact-btn:disabled { opacity: 0.6; cursor: not-allowed; }

.msg-media-loading {
    display: flex; align-items: center; gap: 10px;
    padding: 18px 16px; min-width: 200px;
    background: rgba(0,0,0,0.12); border-radius: 6px;
    margin-bottom: 4px; font-size: 13px;
    color: var(--text-secondary);
}

.msg-media-loading > i { font-size: 22px; opacity: 0.55; flex: none; }

.msg-media-loading .ldr-spin {
    width: 14px; height: 14px; border-radius: 50%;
    border: 2px solid var(--border-color);
    border-top-color: var(--text-secondary);
    animation: ldrSpin .8s linear infinite; flex: none;
}

/* === Header do chat: nome longo TRUNCA (não empurra os botões 📋/🎨/⋮ e o menu pra fora da tela) === */
.chat-header-info { overflow: hidden; }
.chat-header-info .name-edit-wrap { min-width: 0; flex: 1 1 auto; overflow: hidden; }
.chat-header-title {
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    display: block; min-width: 0;
}
.chat-header-actions { flex: 0 0 auto; }

/* === SAFE AREA (notch / Dynamic Island / barra do home) ==========================
   O chat/index.php usa `viewport-fit=cover`, que manda o iOS desenhar a página até a
   borda FÍSICA da tela — por baixo do notch e da barra do home. Isso só é seguro se o
   CSS devolver o espaço, e não havia um único env(safe-area-inset-*) no projeto: o
   header ficava atrás da câmera em iPhone com recorte.

   Fica tudo aqui no fim, de propósito:
   - .sidebar-header (:496), .chat-header (:822) e as versões mobile (:1364, :1367) setam
     padding com SHORTHAND (`padding: 0 16px`), que zera qualquer padding-top declarado
     antes. Por vir depois no arquivo, este bloco vence sem precisar editar aquelas
     regras — e um dia some inteiro sem deixar rastro.
   - box-sizing é border-box (:4), então padding COME a altura. Daí o calc() somando o
     inset à altura original, senão o conteúdo do header seria esmagado.

   env() vale 0 em aparelho sem recorte, então Android, desktop e iPhone antigo não
   mudam um pixel. O risco fica concentrado onde já está quebrado. */

.sidebar-header,
.chat-header {
    padding-top: env(safe-area-inset-top);
    height: calc(56px + env(safe-area-inset-top));
}

/* A tela "nova conversa" é position:fixed top:0 — cobre o notch inteira. */
.newchat-header {
    padding-top: calc(12px + env(safe-area-inset-top));
    min-height: calc(60px + env(safe-area-inset-top));
}

/* Overlay de mídia (fullscreen, top:0) — mesma história do newchat. */
.media-send-header {
    padding-top: env(safe-area-inset-top);
    height: calc(56px + env(safe-area-inset-top));
}

/* Elementos ancorados na viewport com `position: fixed; top: N` NÃO herdam o padding do
   header — ficam colados no topo físico. Foi o que sobrou no PWA depois do primeiro
   round: o header desceu certinho, mas o hambúrguer flutuante continuou em cima do
   relógio. Estes precisam do inset somado ao próprio `top`/padding, um a um. */
@media (max-width: 768px) {
    #navHamburger {
        top: calc(9px + env(safe-area-inset-top));
    }
    /* A gaveta ocupa top:0 → bottom:0: o conteúdo dela (logo + itens) também passa por
       baixo do relógio quando abre, e o rodapé por baixo da barra do home. */
    .app-nav {
        padding-top: env(safe-area-inset-top);
        padding-bottom: env(safe-area-inset-bottom);
    }
}

/* Rodapé: a barra do home indicator fica POR CIMA do campo de digitação. */
.chat-input-area {
    padding-bottom: calc(5px + env(safe-area-inset-bottom));
    min-height: calc(62px + env(safe-area-inset-bottom));
}
@media (max-width: 1024px) {
    .chat-input-area {
        min-height: calc(54px + env(safe-area-inset-bottom));
    }
}

/* Barra flutuante do PWA: sobe acima do home indicator. */
#pwaInstallBar {
    bottom: calc(12px + env(safe-area-inset-bottom));
}

/* Banner de conexão: position:fixed top:0, é o elemento mais alto da página. */
#connBanner {
    padding-top: calc(10px + env(safe-area-inset-top)) !important;
}

/* Landscape: no iPhone deitado o recorte vai pra LATERAL, e aí o que some é o começo
   do texto/ícone, não o topo. Só as bordas externas do shell — nada de padding no meio. */
@media (orientation: landscape) {
    .app-shell {
        padding-left: env(safe-area-inset-left);
        padding-right: env(safe-area-inset-right);
    }
}
