{"id":14,"date":"2026-08-29T22:10:08","date_gmt":"2026-08-29T22:10:08","guid":{"rendered":"https:\/\/cotafacil.zapto.org\/?page_id=14"},"modified":"2026-08-29T22:49:45","modified_gmt":"2026-08-29T22:49:45","slug":"cota-facil-nova-interface","status":"publish","type":"page","link":"https:\/\/cotafacil.zapto.org\/index.php\/cota-facil-nova-interface\/","title":{"rendered":"Cota Facil &#8211; Nova Interface"},"content":{"rendered":"<div class=\"painel-pesquisa-container\">\n\n    <div class=\"cotafacil-topo\">\n\n        <div class=\"cotafacil-marca\">\n            <div class=\"cotafacil-logo-texto\">\n                COTA F\u00c1CIL\n            <\/div>\n\n            <div class=\"cotafacil-subtitulo\">\n                Compare pre\u00e7os antes de comprar\n            <\/div>\n        <\/div>\n\n        <div class=\"cotafacil-acoes-topo\">\n\n            <button\n                type=\"button\"\n                class=\"cotafacil-botao-topo\"\n                id=\"btnContaCotafacil\"\n            >\n                Entrar \/ Cadastrar\n            <\/button>\n\n            <button\n                type=\"button\"\n                class=\"cotafacil-botao-topo\"\n                id=\"btnCreditosCotafacil\"\n            >\n                Cr\u00e9ditos\n            <\/button>\n\n\n\n        <\/div>\n\n    <\/div>\n\n    <style id=\"cotafacil-estilo-contadores\">\n.cotafacil-painel-contadores {\n    display: grid;\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n    gap: 8px;\n    margin: 10px 0 12px;\n}\n.cotafacil-contador-card {\n    min-width: 0;\n    background: linear-gradient(145deg, #091523, #142b43);\n    border: 1px solid #2475a5;\n    border-radius: 10px;\n    padding: 10px 8px;\n    text-align: center;\n    box-shadow: 0 0 10px rgba(0, 174, 255, .12);\n}\n.cotafacil-contador-titulo {\n    color: #b8d9ed;\n    font-size: 10px;\n    font-weight: 700;\n    letter-spacing: .7px;\n}\n.cotafacil-contador-numero {\n    color: #5cddff;\n    font-family: \"Courier New\", monospace;\n    font-size: clamp(18px, 3vw, 27px);\n    font-weight: bold;\n    font-variant-numeric: tabular-nums;\n    text-shadow: 0 0 7px rgba(0,191,255,.65);\n    margin: 5px 0;\n}\n#cotafacilPesquisasLegenda,\n#cotafacilPlanoLegenda {\n    color: #a8c4d8;\n    font-size: 10px;\n}\n#cotafacilVencimentoBrasilia {\n    font-size: 10px;\n    overflow-wrap: anywhere;\n    margin-top: 3px;\n}\n@media (max-width: 600px) {\n    .cotafacil-painel-contadores {\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n        gap: 4px;\n        margin: 8px 0 10px;\n    }\n    .cotafacil-contador-card {\n        padding: 8px 4px;\n    }\n    .cotafacil-contador-titulo {\n        font-size: 9px;\n        letter-spacing: 0;\n    }\n    .cotafacil-contador-numero {\n        font-size: clamp(14px, 3.8vw, 20px);\n    }\n    #cotafacilVencimentoBrasilia {\n        font-size: 9px;\n    }\n}\n.cotafacil-orcamento-card {\n    min-width: 0;\n    display: flex;\n    align-items: stretch;\n}\n.cotafacil-orcamento-card #btnTopoOrcamentoCotafacil {\n    width: 100%;\n    min-width: 0;\n    min-height: 100%;\n    padding: 8px 4px;\n    background: linear-gradient(145deg, #091523, #142b43);\n    border: 1px solid #2475a5;\n    border-radius: 10px;\n    color: #5cddff;\n    font-size: 12px;\n    font-weight: 700;\n    white-space: normal;\n    grid-column: auto;\n}\n@media (max-width: 600px) {\n    .cotafacil-orcamento-card #btnTopoOrcamentoCotafacil {\n        font-size: 10px;\n        padding: 6px 2px;\n    }\n    .cotafacil-painel-contadores .cotafacil-contador-numero {\n        font-size: clamp(11px, 3vw, 18px);\n        overflow-wrap: anywhere;\n    }\n}\n<\/style>\n<!-- CONTADORES COTA FACIL -->\n<div id=\"cotafacilPainelContadores\" class=\"cotafacil-painel-contadores\">\n  <div class=\"cotafacil-orcamento-card\">\n    <button\n      type=\"button\"\n      class=\"cotafacil-botao-topo cotafacil-carrinho-topo\"\n      id=\"btnTopoOrcamentoCotafacil\"\n      onclick=\"alert('Meu Or\u00e7amento ser\u00e1 integrado nesta \u00e1rea.')\"\n    >\n      Meu Or\u00e7amento\n      <span id=\"contadorTopoCotafacil\">0<\/span>\n    <\/button>\n  <\/div>\n  <div class=\"cotafacil-contador-card\">\n    <div class=\"cotafacil-contador-titulo\">PESQUISAS GRATUITAS<\/div>\n    <div id=\"cotafacilPesquisasRestantes\" class=\"cotafacil-contador-numero\">--<\/div>\n    <div id=\"cotafacilPesquisasLegenda\">Consultando saldo...<\/div>\n  <\/div>\n  <div class=\"cotafacil-contador-card\">\n    <div class=\"cotafacil-contador-titulo\">VALIDADE DO PLANO<\/div>\n    <div id=\"cotafacilRelogioPlano\" class=\"cotafacil-contador-numero\">00:00:00<\/div>\n    <div id=\"cotafacilPlanoLegenda\">Consultando plano...<\/div>\n    <div id=\"cotafacilVencimentoBrasilia\">Vencimento: consultando...<\/div>\n  <\/div>\n<\/div>\n<div class=\"cotafacil-busca-principal\">\n\n        <input\n            type=\"text\"\n            id=\"inputBuscaMl\"\n            placeholder=\"O que voc\u00ea deseja comparar?\"\n            autocomplete=\"off\"\n        >\n\n        <button\n            type=\"button\"\n            id=\"btnDispararBusca\"\n            onclick=\"dispararPesquisaComercial()\"\n        >\n            PESQUISAR\n        <\/button>\n\n    <\/div>\n\n    <div\n        id=\"statusCarregamento\"\n        class=\"status-mensagem\"\n    ><\/div>\n\n    <div\n        id=\"progressoMlBox\"\n        class=\"progresso-box\"\n        style=\"display:none;\"\n    >\n        <div class=\"progresso-topo\">\n            <span id=\"progressoTexto\">\n                Preparando pesquisa...\n            <\/span>\n\n            <span id=\"progressoPercentual\">\n                0%\n            <\/span>\n        <\/div>\n\n        <div class=\"progresso-trilho\">\n            <div\n                id=\"progressoBarra\"\n                class=\"progresso-barra\"\n            ><\/div>\n        <\/div>\n    <\/div>\n\n    <div id=\"areaResultadosCotacao\" style=\"display:none; margin-top:25px;\">\n\n        <div id=\"resumoOrcamento\" style=\"\n            padding:15px;\n            border:1px solid #dddddd;\n            border-radius:8px;\n            margin-bottom:15px;\n            background:#f8f9fa;\n        \">\n            <strong>Meu Or\u00e7amento<\/strong>\n            <span id=\"contadorOrcamento\" style=\"margin-left:10px;\">\n                0 itens selecionados\n            <\/span>\n        <\/div>\n\n        <div\n            id=\"controlesOrdenacao\"\n            class=\"controles-ordenacao\"\n            style=\"\n                display:none;\n                margin-bottom:15px;\n                gap:12px;\n                flex-wrap:wrap;\n                align-items:flex-end;\n            \"\n        >\n\n            <div style=\"min-width:210px;\">\n                <label for=\"filtroTituloIncluiCotafacil\">\n                    T\u00edtulo cont\u00e9m:\n                <\/label>\n\n                <input\n                    type=\"text\"\n                    id=\"filtroTituloIncluiCotafacil\"\n                    placeholder=\"Ex.: BP5HS\"\n                    style=\"width:100%; box-sizing:border-box;\"\n                >\n            <\/div>\n\n            <div style=\"min-width:210px;\">\n                <label for=\"filtroTituloExcluiCotafacil\">\n                    T\u00edtulo n\u00e3o cont\u00e9m:\n                <\/label>\n\n                <input\n                    type=\"text\"\n                    id=\"filtroTituloExcluiCotafacil\"\n                    placeholder=\"Ex.: cabo\"\n                    style=\"width:100%; box-sizing:border-box;\"\n                >\n            <\/div>\n\n            <div>\n                <label>\n                    Pre\u00e7o total:\n                <\/label>\n\n                <div style=\"display:flex; gap:6px;\">\n                    <input\n                        type=\"text\"\n                        inputmode=\"decimal\"\n                        id=\"filtroPrecoTotalMinCotafacil\"\n                        placeholder=\"M\u00edn.\"\n                        style=\"width:82px;\"\n                    >\n\n                    <input\n                        type=\"text\"\n                        inputmode=\"decimal\"\n                        id=\"filtroPrecoTotalMaxCotafacil\"\n                        placeholder=\"M\u00e1x.\"\n                        style=\"width:82px;\"\n                    >\n                <\/div>\n            <\/div>\n\n            <div>\n                <label>\n                    Pre\u00e7o compar\u00e1vel:\n                <\/label>\n\n                <div style=\"display:flex; gap:6px;\">\n                    <input\n                        type=\"text\"\n                        inputmode=\"decimal\"\n                        id=\"filtroPrecoComparavelMinCotafacil\"\n                        placeholder=\"M\u00edn.\"\n                        style=\"width:82px;\"\n                    >\n\n                    <input\n                        type=\"text\"\n                        inputmode=\"decimal\"\n                        id=\"filtroPrecoComparavelMaxCotafacil\"\n                        placeholder=\"M\u00e1x.\"\n                        style=\"width:82px;\"\n                    >\n                <\/div>\n            <\/div>\n\n            <div>\n                <label for=\"filtroFonteCotafacil\">\n                    Fonte:\n                <\/label>\n\n                <select id=\"filtroFonteCotafacil\">\n                    <option value=\"TODAS\">\n                        Todas\n                    <\/option>\n\n                    <option value=\"MERCADO_LIVRE\">\n                        Mercado Livre\n                    <\/option>\n\n                    <option value=\"SHOPEE\">\n                        Shopee\n                    <\/option>\n\n                    <option value=\"MAGALU\">\n                        Magalu\n                    <\/option>\n                <\/select>\n            <\/div>\n\n            <div>\n                <label for=\"filtroMarcaCotafacil\">\n                    Marca:\n                <\/label>\n\n                <select id=\"filtroMarcaCotafacil\">\n                    <option value=\"TODAS\">\n                        Todas\n                    <\/option>\n                <\/select>\n            <\/div>\n\n            <div\n                id=\"grupoConectividadeCotafacil\"\n                style=\"display:none;\"\n            >\n                <label for=\"filtroConectividadeCotafacil\">\n                    Conectividade:\n                <\/label>\n\n                <select id=\"filtroConectividadeCotafacil\">\n                    <option value=\"TODAS\">Todas<\/option>\n                    <option value=\"COM_FIO\">Com fio<\/option>\n                    <option value=\"SEM_FIO\">Sem fio<\/option>\n                    <option value=\"A_CONFIRMAR\">A confirmar<\/option>\n                <\/select>\n            <\/div>\n\n            <div\n                id=\"grupoLeituraCotafacil\"\n                style=\"display:none;\"\n            >\n                <label for=\"filtroLeituraCotafacil\">\n                    Leitura:\n                <\/label>\n\n                <select id=\"filtroLeituraCotafacil\">\n                    <option value=\"TODAS\">Todas<\/option>\n                    <option value=\"1D\">1D<\/option>\n                    <option value=\"2D\">2D<\/option>\n                    <option value=\"1D_2D\">1D + 2D<\/option>\n                    <option value=\"A_CONFIRMAR\">A confirmar<\/option>\n                <\/select>\n            <\/div>\n\n            <div>\n                <label for=\"filtroStatusCotafacil\">\n                    Status:\n                <\/label>\n\n                <select id=\"filtroStatusCotafacil\">\n                    <option value=\"TODOS\">\n                        Todos\n                    <\/option>\n\n                    <option value=\"RANKING\">\n                        Participa do ranking\n                    <\/option>\n\n                    <option value=\"QUANTIDADE_A_CONFIRMAR\">\n                        Quantidade a confirmar\n                    <\/option>\n\n                    <option value=\"VARIACAO_A_CONFIRMAR\">\n                        Varia\u00e7\u00e3o a confirmar\n                    <\/option>\n\n                    <option value=\"PRODUTO_DIFERENTE\">\n                        Produto diferente\n                    <\/option>\n\n                    <option value=\"FORA_RANKING\">\n                        Outros fora do ranking\n                    <\/option>\n                <\/select>\n            <\/div>\n\n            <div>\n                <label for=\"ordenacaoCotafacil\">\n                    Ordenar ofertas:\n                <\/label>\n\n                <select id=\"ordenacaoCotafacil\">\n                <option value=\"comparavel_asc\">\n                    Menor pre\u00e7o compar\u00e1vel\n                <\/option>\n\n                <option value=\"comparavel_desc\">\n                    Maior pre\u00e7o compar\u00e1vel\n                <\/option>\n\n                <option value=\"preco_asc\">\n                    Menor pre\u00e7o total\n                <\/option>\n\n                <option value=\"preco_desc\">\n                    Maior pre\u00e7o total\n                <\/option>\n\n                <option value=\"nome_asc\">\n                    Nome A\u2013Z\n                <\/option>\n\n                <option value=\"nome_desc\">\n                    Nome Z\u2013A\n                <\/option>\n                <\/select>\n            <\/div>\n        <\/div>\n\n        <div id=\"listaResultadosCotacao\"><\/div>\n\n        <div style=\"\n            display:flex;\n            gap:10px;\n            margin-top:15px;\n            flex-wrap:wrap;\n        \">\n            <button\n                type=\"button\"\n                id=\"btnAdicionarOrcamento\"\n                disabled\n            >\n                Adicionar ao Or\u00e7amento\n            <\/button>\n\n            <button\n                type=\"button\"\n                id=\"btnVerOrcamento\"\n                disabled\n            >\n                Ver Or\u00e7amento\n            <\/button>\n        <\/div>\n\n    <\/div>\n\n<\/div>\n\n\n<div\n    id=\"modalContaCotafacil\"\n    class=\"cotafacil-modal-conta\"\n    style=\"display:none;\"\n>\n    <div class=\"cotafacil-modal-caixa\">\n\n        <button\n            type=\"button\"\n            id=\"fecharModalContaCotafacil\"\n            class=\"cotafacil-modal-fechar\"\n        >\n            \u00d7\n        <\/button>\n\n        <h2 id=\"tituloModalContaCotafacil\">\n            Entrar\n        <\/h2>\n\n        <div\n            id=\"areaLoginCotafacil\"\n        >\n            <input\n                type=\"email\"\n                id=\"loginEmailCotafacil\"\n                placeholder=\"E-mail\"\n            >\n\n            <input\n                type=\"password\"\n                id=\"loginSenhaCotafacil\"\n                placeholder=\"Senha\"\n            >\n\n            <button\n                type=\"button\"\n                id=\"btnEntrarCotafacil\"\n            >\n                Entrar\n            <\/button>\n\n            <p>\n                Ainda n\u00e3o tem conta?\n                <button\n                    type=\"button\"\n                    id=\"abrirCadastroCotafacil\"\n                >\n                    Cadastrar\n                <\/button>\n            <\/p>\n        <\/div>\n\n        <div\n            id=\"areaCadastroCotafacil\"\n            style=\"display:none;\"\n        >\n            <input\n                type=\"text\"\n                id=\"cadastroNomeCotafacil\"\n                placeholder=\"Nome\"\n            >\n\n            <input\n                type=\"email\"\n                id=\"cadastroEmailCotafacil\"\n                placeholder=\"E-mail\"\n            >\n\n            <input\n                type=\"password\"\n                id=\"cadastroSenhaCotafacil\"\n                placeholder=\"Senha\"\n            >\n\n            <button\n                type=\"button\"\n                id=\"btnCadastrarCotafacil\"\n            >\n                Criar conta\n            <\/button>\n\n            <p>\n                J\u00e1 tem conta?\n                <button\n                    type=\"button\"\n                    id=\"abrirLoginCotafacil\"\n                >\n                    Entrar\n                <\/button>\n            <\/p>\n        <\/div>\n\n        <div\n            id=\"mensagemContaCotafacil\"\n        ><\/div>\n\n    <\/div>\n<\/div>\n\n<style>\n\n.cotafacil-modal-conta {\n    position: fixed;\n    inset: 0;\n    background: rgba(0,0,0,0.55);\n    z-index: 999999;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 20px;\n}\n\n.cotafacil-modal-caixa {\n    position: relative;\n    width: 100%;\n    max-width: 420px;\n    background: #ffffff;\n    border-radius: 14px;\n    padding: 28px;\n    box-shadow: 0 18px 50px rgba(0,0,0,0.25);\n}\n\n.cotafacil-modal-caixa h2 {\n    margin: 0 0 20px;\n    text-align: center;\n}\n\n.cotafacil-modal-caixa input {\n    width: 100%;\n    box-sizing: border-box;\n    margin-bottom: 12px;\n    padding: 12px 14px;\n    border: 1px solid #cccccc;\n    border-radius: 8px;\n}\n\n.cotafacil-modal-caixa button {\n    cursor: pointer;\n}\n\n.cotafacil-modal-caixa > div > button {\n    width: 100%;\n    padding: 12px 16px;\n    border: 0;\n    border-radius: 8px;\n    font-weight: 700;\n}\n\n.cotafacil-modal-caixa p {\n    text-align: center;\n    margin: 16px 0 0;\n}\n\n.cotafacil-modal-caixa p button {\n    border: 0;\n    background: transparent;\n    text-decoration: underline;\n    padding: 0;\n}\n\n.cotafacil-modal-fechar {\n    position: absolute;\n    top: 10px;\n    right: 12px;\n    width: auto !important;\n    background: transparent;\n    border: 0;\n    font-size: 28px;\n    line-height: 1;\n}\n\n#mensagemContaCotafacil {\n    margin-top: 14px;\n    text-align: center;\n    font-size: 14px;\n}\n\n.cotafacil-topo {\n    display:flex;\n    justify-content:space-between;\n    align-items:center;\n    gap:20px;\n    margin-bottom:24px;\n}\n\n.cotafacil-marca {\n    min-width:0;\n}\n\n.cotafacil-logo-texto {\n    font-size:28px;\n    font-weight:800;\n    letter-spacing:-0.8px;\n    color:#1f2937;\n}\n\n.cotafacil-subtitulo {\n    margin-top:3px;\n    font-size:15px;\n    color:#6b7280;\n}\n\n.cotafacil-acoes-topo {\n    display:flex;\n    gap:8px;\n    flex-wrap:wrap;\n    justify-content:flex-end;\n}\n\n.cotafacil-botao-topo {\n    background:#ffffff;\n    color:#374151;\n    border:1px solid #d1d5db;\n    border-radius:7px;\n    padding:9px 12px;\n    font-size:13px;\n    cursor:pointer;\n}\n\n.cotafacil-botao-topo:hover {\n    background:#f9fafb;\n}\n\n.cotafacil-carrinho-topo span {\n    display:inline-flex;\n    align-items:center;\n    justify-content:center;\n    min-width:20px;\n    height:20px;\n    margin-left:5px;\n    padding:0 5px;\n    border-radius:10px;\n    background:#3483fa;\n    color:#ffffff;\n    font-size:11px;\n    font-weight:700;\n}\n\n.cotafacil-busca-principal {\n    display:grid;\n    grid-template-columns:minmax(0, 1fr) auto;\n    gap:10px;\n    margin-bottom:14px;\n}\n\n.cotafacil-busca-principal input {\n    width:100%;\n    min-height:48px;\n    padding:0 15px;\n    border:1px solid #cfd4dc;\n    border-radius:8px;\n    background:#ffffff;\n    color:#1f2937;\n    font-size:16px;\n    box-sizing:border-box;\n}\n\n.cotafacil-busca-principal input:focus {\n    border-color:#3483fa;\n    outline:none;\n    box-shadow:0 0 0 2px rgba(52,131,250,0.10);\n}\n\n.cotafacil-busca-principal button {\n    min-height:48px;\n    padding:0 25px;\n    border:0;\n    border-radius:8px;\n    background:#3483fa;\n    color:#ffffff;\n    font-size:14px;\n    font-weight:700;\n    cursor:pointer;\n}\n\n.cotafacil-busca-principal button:hover {\n    filter:brightness(0.96);\n}\n\n@media (max-width:700px) {\n\n    .cotafacil-topo {\n        align-items:flex-start;\n        flex-direction:column;\n        gap:14px;\n    }\n\n    .cotafacil-acoes-topo {\n        width:100%;\n        justify-content:flex-start;\n    }\n\n    .cotafacil-logo-texto {\n        font-size:24px;\n    }\n\n    .cotafacil-busca-principal {\n        grid-template-columns:1fr;\n    }\n\n    .cotafacil-busca-principal button {\n        width:100%;\n    }\n}\n\n\n.painel-pesquisa-container {\n    background: #ffffff;\n    padding: 30px;\n    border-radius: 10px;\n    box-shadow: 0 4px 20px rgba(0,0,0,0.10);\n    max-width: 800px;\n    margin: 40px auto;\n    font-family: Arial, sans-serif;\n}\n\n.painel-pesquisa-container h2 {\n    color: #333333;\n    margin-top: 0;\n    margin-bottom: 10px;\n    font-size: 26px;\n}\n\n.painel-pesquisa-container p {\n    color: #666666;\n    font-size: 15px;\n    line-height: 1.5;\n}\n\n.campo-busca-group {\n    display: flex;\n    gap: 10px;\n    margin-top: 25px;\n}\n\n#inputBuscaMl {\n    flex: 1;\n    padding: 14px;\n    border: 1px solid #cccccc;\n    border-radius: 6px;\n    font-size: 16px;\n    box-sizing: border-box;\n}\n\n#inputBuscaMl:focus {\n    border-color: #3483fa;\n    outline: none;\n    box-shadow: 0 0 0 2px rgba(52,131,250,0.15);\n}\n\n#btnDispararBusca {\n    background-color: #3483fa;\n    color: white;\n    border: none;\n    padding: 14px 22px;\n    font-size: 15px;\n    font-weight: bold;\n    border-radius: 6px;\n    cursor: pointer;\n}\n\n#btnDispararBusca:hover {\n    background-color: #1e62c9;\n}\n\n#btnDispararBusca:disabled {\n    background-color: #aaaaaa;\n    cursor: not-allowed;\n}\n\n.status-mensagem {\n    margin-top: 20px;\n    min-height: 25px;\n    font-size: 15px;\n    font-weight: bold;\n}\n\n.status-processando {\n    color: #1e62c9;\n}\n\n.status-sucesso {\n    color: #2e7d32;\n}\n\n.status-erro {\n    color: #c62828;\n}\n\n.progresso-box {\n    margin-top: 18px;\n}\n\n.progresso-topo {\n    display: flex;\n    justify-content: space-between;\n    margin-bottom: 8px;\n    font-size: 14px;\n    color: #444;\n}\n\n.progresso-trilho {\n    width: 100%;\n    height: 18px;\n    background: #e9ecef;\n    border-radius: 999px;\n    overflow: hidden;\n    position: relative;\n}\n\n.progresso-trilho::after {\n    content: \"\";\n    position: absolute;\n    inset: 0;\n    pointer-events: none;\n    background:\n        repeating-linear-gradient(\n            to right,\n            transparent 0,\n            transparent calc(10% - 2px),\n            rgba(255,255,255,0.90) calc(10% - 2px),\n            rgba(255,255,255,0.90) 10%\n        );\n}\n\n.progresso-barra {\n    width: 0%;\n    height: 100%;\n    background: #3483fa;\n    border-radius: 999px;\n    transition: width 0.4s ease;\n}\n\n@media (max-width: 700px) {\n\n    .campo-busca-group {\n        flex-direction: column;\n    }\n\n    #btnDispararBusca {\n        width: 100%;\n    }\n\n}\n\n\n.cotafacil-imagem-box {\n    width:82px;\n    height:82px;\n    min-width:82px;\n    display:flex;\n    align-items:center;\n    justify-content:center;\n    overflow:hidden;\n    border:1px solid #e5e7eb;\n    border-radius:8px;\n    background:#ffffff;\n    box-sizing:border-box;\n}\n\n.cotafacil-imagem-produto {\n    width:100%;\n    height:100%;\n    object-fit:contain;\n    display:block;\n}\n\n.cotafacil-sem-imagem {\n    padding:6px;\n    background:#f8fafc;\n    color:#9ca3af;\n    font-size:11px;\n    line-height:1.2;\n    text-align:center;\n}\n\n@media (max-width:700px) {\n\n    .cotafacil-imagem-box {\n        width:72px;\n        height:72px;\n        min-width:72px;\n    }\n}\n\n<\/style>\n\n<script>\n\ndocument.addEventListener(\n    'DOMContentLoaded',\n    function() {\n\n        const modal =\n            document.getElementById(\n                'modalContaCotafacil'\n            );\n\n        const fechar =\n            document.getElementById(\n                'fecharModalContaCotafacil'\n            );\n\n        const areaLogin =\n            document.getElementById(\n                'areaLoginCotafacil'\n            );\n\n        const areaCadastro =\n            document.getElementById(\n                'areaCadastroCotafacil'\n            );\n\n        const titulo =\n            document.getElementById(\n                'tituloModalContaCotafacil'\n            );\n\n        const mensagem =\n            document.getElementById(\n                'mensagemContaCotafacil'\n            );\n\n        function mostrarLogin() {\n\n            areaLogin.style.display =\n                'block';\n\n            areaCadastro.style.display =\n                'none';\n\n            titulo.textContent =\n                'Entrar';\n\n            mensagem.textContent =\n                '';\n        }\n\n        function mostrarCadastro() {\n\n            areaLogin.style.display =\n                'none';\n\n            areaCadastro.style.display =\n                'block';\n\n            titulo.textContent =\n                'Cadastrar';\n\n            mensagem.textContent =\n                '';\n        }\n\n        window.abrirModalContaCotafacil =\n            function() {\n\n                mostrarLogin();\n\n                modal.style.display =\n                    'flex';\n            };\n\n        fechar.onclick =\n            function() {\n\n                modal.style.display =\n                    'none';\n            };\n\n        document.getElementById(\n            'abrirCadastroCotafacil'\n        ).onclick =\n            mostrarCadastro;\n\n        document.getElementById(\n            'abrirLoginCotafacil'\n        ).onclick =\n            mostrarLogin;\n\n        document.getElementById(\n            'btnEntrarCotafacil'\n        ).onclick =\n            async function() {\n\n                mensagem.textContent =\n                    'Entrando...';\n\n                const dados =\n                    new URLSearchParams();\n\n                dados.append(\n                    'action',\n                    'cotafacil_login'\n                );\n\n                dados.append(\n                    'email',\n                    document.getElementById(\n                        'loginEmailCotafacil'\n                    ).value\n                );\n\n                dados.append(\n                    'senha',\n                    document.getElementById(\n                        'loginSenhaCotafacil'\n                    ).value\n                );\n\n                try {\n\n                    const resposta =\n                        await fetch(\n                            '\/wp-admin\/admin-ajax.php',\n                            {\n                                method:\n                                    'POST',\n                                credentials:\n                                    'include',\n                                body: dados\n                            }\n                        );\n\n                    const retorno =\n                        await resposta.json();\n\n                    if (\n                        !retorno.success\n                    ) {\n                        mensagem.textContent =\n                            'E-mail ou senha inv\u00e1lidos.';\n                        return;\n                    }\n\n                    mensagem.textContent =\n                        'Login realizado.';\n\n                    window.location.reload();\n\n                } catch (erro) {\n\n                    mensagem.textContent =\n                        'N\u00e3o foi poss\u00edvel entrar.';\n                }\n            };\n\n        document.getElementById(\n            'btnCadastrarCotafacil'\n        ).onclick =\n            async function() {\n\n                mensagem.textContent =\n                    'Criando conta...';\n\n                const dados =\n                    new URLSearchParams();\n\n                dados.append(\n                    'action',\n                    'cotafacil_cadastrar'\n                );\n\n                dados.append(\n                    'nome',\n                    document.getElementById(\n                        'cadastroNomeCotafacil'\n                    ).value\n                );\n\n                dados.append(\n                    'email',\n                    document.getElementById(\n                        'cadastroEmailCotafacil'\n                    ).value\n                );\n\n                dados.append(\n                    'senha',\n                    document.getElementById(\n                        'cadastroSenhaCotafacil'\n                    ).value\n                );\n\n                try {\n\n                    const resposta =\n                        await fetch(\n                            '\/wp-admin\/admin-ajax.php',\n                            {\n                                method:\n                                    'POST',\n                                credentials:\n                                    'include',\n                                body: dados\n                            }\n                        );\n\n                    const retorno =\n                        await resposta.json();\n\n                    if (\n                        !retorno.success\n                    ) {\n                        mensagem.textContent =\n                            'N\u00e3o foi poss\u00edvel criar a conta.';\n                        return;\n                    }\n\n                    mensagem.textContent =\n                        'Conta criada com sucesso.';\n\n                    window.location.reload();\n\n                } catch (erro) {\n\n                    mensagem.textContent =\n                        'N\u00e3o foi poss\u00edvel criar a conta.';\n                }\n            };\n    }\n);\n\nasync function carregarUsuarioCotafacil() {\n\n    const btnConta =\n        document.getElementById(\n            'btnContaCotafacil'\n        );\n\n    const btnCreditos =\n        document.getElementById(\n            'btnCreditosCotafacil'\n        );\n\n    if (!btnConta || !btnCreditos) {\n        return;\n    }\n\n    try {\n\n        const resposta =\n            await fetch(\n                '\/wp-admin\/admin-ajax.php?action=cotafacil_usuario',\n                {\n                    method: 'GET',\n                    credentials: 'include'\n                }\n            );\n\n        if (!resposta.ok) {\n            throw new Error(\n                'Falha ao consultar usu\u00e1rio.'\n            );\n        }\n\n        const dados =\n            await resposta.json();\n\n        window.cotafacilNonceRest =\n            dados.logado && dados.nonce_rest\n                ? dados.nonce_rest\n                : '';\n\n        if (!dados.logado) {\n\n            btnConta.textContent =\n                'Entrar \/ Cadastrar';\n\n            btnCreditos.textContent =\n                'Cr\u00e9ditos';\n\n            btnConta.onclick =\n                function() {\n                    if (\n                        typeof window.abrirModalContaCotafacil\n                        === 'function'\n                    ) {\n                        window.abrirModalContaCotafacil();\n                    }\n                };\n\n            btnCreditos.onclick =\n                function() {\n                    alert(\n                        'Entre na sua conta para consultar seus cr\u00e9ditos.'\n                    );\n                };\n\n            return;\n        }\n\n        btnConta.textContent =\n            dados.nome\n                ? dados.nome\n                : dados.login;\n\n        if (dados.administrador) {\n\n            btnCreditos.textContent =\n                'Acesso livre';\n\n        } else {\n\n            btnCreditos.textContent =\n                String(dados.creditos) +\n                ' cr\u00e9ditos';\n        }\n\n        btnConta.onclick =\n            function() {\n                window.location.href =\n                    '\/wp-admin\/profile.php';\n            };\n\n        btnCreditos.onclick =\n            function() {\n\n                if (dados.administrador) {\n\n                    alert(\n                        'Administrador: pesquisas sem consumo de cr\u00e9ditos.'\n                    );\n\n                } else {\n\n                    alert(\n                        'Saldo dispon\u00edvel: ' +\n                        String(dados.creditos) +\n                        ' cr\u00e9ditos.'\n                    );\n                }\n            };\n\n    } catch (erro) {\n\n        console.error(\n            '[COTA FACIL] Erro ao carregar usu\u00e1rio:',\n            erro\n        );\n    }\n}\n\ndocument.addEventListener(\n    'DOMContentLoaded',\n    function() {\n        carregarUsuarioCotafacil();\n    }\n);\n\nlet pesquisaComercialEmAndamento = false;\n\nasync function dispararPesquisaComercial() {\n    if (pesquisaComercialEmAndamento) return;\n    pesquisaComercialEmAndamento = true;\n\n    const inputProduto = document.getElementById('inputBuscaMl');\n    const btnBusca = document.getElementById('btnDispararBusca');\n    const divStatus = document.getElementById('statusCarregamento');\n    const progressoBox = document.getElementById('progressoMlBox');\n    const progressoBarra = document.getElementById('progressoBarra');\n    const progressoTexto = document.getElementById('progressoTexto');\n    const progressoPercentual = document.getElementById('progressoPercentual');\n\n    \/\/ Verifica\u00e7\u00e3o dos elementos\n    if (!inputProduto || !btnBusca || !divStatus) {\n        console.error('[ML] Elementos do painel n\u00e3o encontrados.');\n        pesquisaComercialEmAndamento = false;\n        return;\n    }\n\n    const termoPesquisa = inputProduto.value.trim();\n\n    \/\/ ==========================================================\n    \/\/ CONFIGURA\u00c7\u00c3O\n    \/\/ ==========================================================\n\n        const URL_BASE =\n    'https:\/\/cotafacil.zapto.org\/ml\/pesquisa-completa';\n\n\n      \n    let urlDownload = null;\n\n    \/\/ ==========================================================\n    \/\/ VALIDA\u00c7\u00c3O\n    \/\/ ==========================================================\n\n    if (!termoPesquisa) {\n\n        divStatus.className =\n            'status-mensagem status-erro';\n\n        divStatus.innerText =\n            '\u26a0\ufe0f Digite o nome do produto.';\n\n        inputProduto.focus();\n\n        pesquisaComercialEmAndamento = false;\n        return;\n    }\n\n    \/\/ ==========================================================\n    \/\/ AUTORIZA\u00c7\u00c3O COTA F\u00c1CIL\n    \/\/ ==========================================================\n\n    btnBusca.disabled = true;\n    inputProduto.disabled = true;\n\n    divStatus.className =\n        'status-mensagem status-processando';\n\n    divStatus.innerText =\n        '\ud83d\udd10 Verificando acesso \u00e0 pesquisa...';\n\n    try {\n\n        const respostaUsuarioCredito =\n            await fetch(\n                '\/wp-admin\/admin-ajax.php?action=cotafacil_usuario',\n                {\n                    method: 'GET',\n                    credentials: 'include'\n                }\n            );\n\n        if (!respostaUsuarioCredito.ok) {\n            throw new Error(\n                'N\u00e3o foi poss\u00edvel verificar sua conta.'\n            );\n        }\n\n        const dadosUsuarioCredito =\n            await respostaUsuarioCredito.json();\n\n        if (!dadosUsuarioCredito.logado) {\n\n            divStatus.className =\n                'status-mensagem status-erro';\n\n            divStatus.innerText =\n                '\u26a0\ufe0f Entre na sua conta para realizar uma pesquisa.';\n\n            btnBusca.disabled = false;\n            inputProduto.disabled = false;\n\n            pesquisaComercialEmAndamento = false;\n            return;\n        }\n\n        const noncePesquisa =\n            dadosUsuarioCredito.nonce_pesquisa;\n\n        if (!noncePesquisa) {\n\n            divStatus.className =\n                'status-mensagem status-erro';\n\n            divStatus.innerText =\n                '\u26a0\ufe0f Sua sess\u00e3o expirou. Atualize a p\u00e1gina e tente novamente.';\n\n            btnBusca.disabled = false;\n            inputProduto.disabled = false;\n\n            pesquisaComercialEmAndamento = false;\n            return;\n        }\n\n        const respostaAutorizacao =\n            await fetch(\n                '\/wp-admin\/admin-ajax.php',\n                {\n                    method: 'POST',\n                    credentials: 'include',\n                    headers: {\n                        'Content-Type':\n                            'application\/x-www-form-urlencoded'\n                    },\n                    body:\n                        new URLSearchParams({\n                            action:\n                                'cotafacil_autorizar_pesquisa',\n                            nonce:\n                                noncePesquisa\n                        }).toString()\n                }\n            );\n\n        let dadosAutorizacao = null;\n\n        try {\n            dadosAutorizacao =\n                await respostaAutorizacao.json();\n        } catch (erroJsonAutorizacao) {\n            dadosAutorizacao = null;\n        }\n\n        if (\n            !respostaAutorizacao.ok ||\n            !dadosAutorizacao ||\n            !dadosAutorizacao.success\n        ) {\n\n            let mensagemAutorizacao =\n                'N\u00e3o foi poss\u00edvel autorizar a pesquisa.';\n\n            if (\n                dadosAutorizacao &&\n                dadosAutorizacao.data &&\n                dadosAutorizacao.data.mensagem\n            ) {\n                mensagemAutorizacao =\n                    dadosAutorizacao.data.mensagem;\n            }\n\n            divStatus.className =\n                'status-mensagem status-erro';\n\n            const codigoErroPesquisa =\n                dadosAutorizacao &&\n                dadosAutorizacao.data\n                    ? dadosAutorizacao.data.codigo\n                    : '';\n\n            if (codigoErroPesquisa === 'SEM_PESQUISAS_GRATUITAS') {\n                mensagemAutorizacao =\n                    'Suas 10 pesquisas gratuitas terminaram. ' +\n                    'Escolha um plano para continuar pesquisando.';\n\n                const contador =\n                    document.getElementById('cotafacilPesquisasRestantes');\n\n                if (contador) {\n                    contador.textContent = '0';\n                }\n            }\n\n            divStatus.innerText =\n                '\u26a0\ufe0f ' + mensagemAutorizacao;\n\n            if (codigoErroPesquisa === 'SEM_PESQUISAS_GRATUITAS') {\n                const botaoPlano = document.createElement('button');\n                botaoPlano.type = 'button';\n                botaoPlano.textContent = 'Contratar plano ilimitado';\n                botaoPlano.style.marginTop = '12px';\n                botaoPlano.style.padding = '12px 20px';\n                botaoPlano.style.cursor = 'pointer';\n\n                botaoPlano.onclick = function() {\n                    window.location.href =\n                        'https:\/\/cotafacil.zapto.org\/?contratar=1';\n                };\n\n                divStatus.appendChild(\n                    document.createElement('div')\n                );\n                divStatus.appendChild(botaoPlano);\n            }\n\n            btnBusca.disabled = false;\n            inputProduto.disabled = false;\n\n            pesquisaComercialEmAndamento = false;\n            return;\n        }\n\n        const dadosCreditoNovo =\n            dadosAutorizacao.data;\n\n        const contadorPesquisas =\n            document.getElementById(\n                'cotafacilPesquisasRestantes'\n            );\n\n        if (\n            contadorPesquisas &&\n            dadosCreditoNovo.pesquisas_gratis_restantes !== undefined\n        ) {\n            contadorPesquisas.textContent =\n                String(dadosCreditoNovo.pesquisas_gratis_restantes);\n        }\n\n        const btnCreditosAtual =\n            document.getElementById(\n                'btnCreditosCotafacil'\n            );\n\n        if (btnCreditosAtual) {\n\n            if (dadosCreditoNovo.administrador) {\n\n                btnCreditosAtual.textContent =\n                    'Acesso livre';\n\n            } else {\n\n                btnCreditosAtual.textContent =\n                    dadosCreditoNovo.plano_ativo\n                        ? 'Plano ilimitado'\n                        : String(\n                            dadosCreditoNovo.pesquisas_gratis_restantes\n                        ) + ' pesquisas gr\u00e1tis';\n            }\n        }\n\n        console.log(\n            '[COTA FACIL] Pesquisa autorizada:',\n            dadosCreditoNovo\n        );\n\n    } catch (erroAutorizacao) {\n\n        console.error(\n            '[COTA FACIL] Erro de autoriza\u00e7\u00e3o:',\n            erroAutorizacao\n        );\n\n        divStatus.className =\n            'status-mensagem status-erro';\n\n        divStatus.innerText =\n            '\u26a0\ufe0f N\u00e3o foi poss\u00edvel verificar seus cr\u00e9ditos. Tente novamente.';\n\n        btnBusca.disabled = false;\n        inputProduto.disabled = false;\n\n        pesquisaComercialEmAndamento = false;\n        return;\n    }\n\n    \/\/ ==========================================================\n    \/\/ BLOQUEIA INTERFACE\n    \/\/ ==========================================================\n\n    btnBusca.disabled = true;\n    inputProduto.disabled = true;\n\n    divStatus.className =\n        'status-mensagem status-processando';\n\n    divStatus.innerText =\n        '\u23f3 Conectando ao sistema...';\n\n    console.log(\n        '[ML] Iniciando pesquisa:',\n        termoPesquisa\n    );\n\n    let progressoAtual = 0;\n    let timerProgresso = null;\n\n    function atualizarProgresso(valor, texto) {\n\n        progressoAtual = Math.max(\n            progressoAtual,\n            Math.min(valor, 100)\n        );\n\n        progressoBox.style.display = 'block';\n        progressoBarra.style.width = progressoAtual + '%';\n        progressoPercentual.innerText =\n            Math.round(progressoAtual) + '%';\n\n        if (texto) {\n            progressoTexto.innerText = texto;\n        }\n    }\n\n    atualizarProgresso(\n        5,\n        'Conectando ao servidor...'\n    );\n\n    timerProgresso = setInterval(function () {\n\n        if (progressoAtual < 97) {\n\n            let incremento = 0.15;\n\n            if (progressoAtual < 25) {\n                incremento = 2.5;\n            } else if (progressoAtual < 50) {\n                incremento = 1.5;\n            } else if (progressoAtual < 70) {\n                incremento = 0.8;\n            } else if (progressoAtual < 85) {\n                incremento = 0.4;\n            } else if (progressoAtual < 93) {\n                incremento = 0.2;\n            }\n\n            let mensagem =\n                'Finalizando pesquisa...';\n\n            if (progressoAtual < 25) {\n                mensagem =\n                    'Buscando pre\u00e7os no Mercado Livre...';\n            } else if (progressoAtual < 50) {\n                mensagem =\n                    'Buscando pre\u00e7os na Shopee...';\n            } else if (progressoAtual < 70) {\n                mensagem =\n                    'Analisando os produtos encontrados...';\n            } else if (progressoAtual < 85) {\n                mensagem =\n                    'Comparando as melhores ofertas...';\n            } else if (progressoAtual < 93) {\n                mensagem =\n                    'Organizando os resultados...';\n            } else {\n                mensagem =\n                    'Finalizando planilha e resultados...';\n            }\n\n            atualizarProgresso(\n                progressoAtual + incremento,\n                mensagem\n            );\n        }\n\n    }, 800);\n\n    try {\n\n        \/\/ ======================================================\n        \/\/ REQUISI\u00c7\u00c3O\n        \/\/ ======================================================\n\n        divStatus.innerText =\n            '\u23f3 Pesquisando produtos no Mercado Livre...';\n\n        \/\/ ======================================================\n        \/\/ 1. BUSCA JSON PARA MOSTRAR OFERTAS NA PAGINA\n        \/\/ ======================================================\n\n        const URL_JSON =\n            URL_BASE +\n            '?q=' +\n            encodeURIComponent(termoPesquisa);\n\n        divStatus.innerText =\n            '\u23f3 Pesquisando ofertas no Mercado Livre, Magazine Luiza e Shopee...';\n\n        let respostaJson =\n            await fetch(URL_JSON, {\n                method: 'GET',\n                credentials: 'include'\n            });\n\n        let tentativasColetor = 0;\n        const maxTentativasColetor = 40;\n\n        while (\n            respostaJson.status === 202\n        ) {\n\n            tentativasColetor += 1;\n\n            console.log(\n                '[COTA FACIL] Pesquisa em andamento. Tentativa:',\n                tentativasColetor\n            );\n\n            divStatus.innerText =\n                '\u23f3 Mercado Livre pesquisando no computador coletor...';\n\n            atualizarProgresso(\n                Math.min(\n                    85,\n                    20 + tentativasColetor\n                ),\n                'Coletando an\u00fancios do Mercado Livre...'\n            );\n\n            if (\n                tentativasColetor >=\n                maxTentativasColetor\n            ) {\n                throw new Error(\n                    'A pesquisa no Mercado Livre demorou mais que o esperado. Tente novamente.'\n                );\n            }\n\n            await new Promise(function(resolve) {\n                setTimeout(resolve, 3000);\n            });\n\n            respostaJson =\n                await fetch(URL_JSON, {\n                    method: 'GET',\n                    credentials: 'include'\n                });\n        }\n\n        if (!respostaJson.ok) {\n\n            const textoErroJson =\n                await respostaJson.text();\n\n            console.error(\n                '[COTA FACIL] Erro JSON:',\n                textoErroJson\n            );\n\n            throw new Error(\n                'N\u00e3o foi poss\u00edvel carregar as ofertas.'\n            );\n        }\n\n        const dadosPesquisa =\n            await respostaJson.json();\n\n        const anuncios =\n            Array.isArray(\n                dadosPesquisa.anuncios\n            )\n                ? dadosPesquisa.anuncios\n                : Array.isArray(\n                    dadosPesquisa.anuncios_comparativo\n                )\n                    ? dadosPesquisa.anuncios_comparativo\n                    : Array.isArray(\n                        dadosPesquisa.comparativo\n                    )\n                        ? dadosPesquisa.comparativo\n                        : [];\n\n        const anunciosBrutosDiagnostico =\n            Array.isArray(\n                dadosPesquisa.anuncios\n            )\n                ? dadosPesquisa.anuncios\n                : [];\n\n        const comparativoDiagnostico =\n            Array.isArray(\n                dadosPesquisa.anuncios_comparativo\n            )\n                ? dadosPesquisa.anuncios_comparativo\n                : (\n                    Array.isArray(\n                        dadosPesquisa.comparativo\n                    )\n                        ? dadosPesquisa.comparativo\n                        : []\n                );\n\n        function contarFontesCotafacil(lista) {\n\n            const resultado = {\n                total: lista.length,\n                mercadoLivre: 0,\n                shopee: 0,\n                magalu: 0,\n                outras: 0\n            };\n\n            lista.forEach(function(item) {\n\n                const fonteItem =\n                    String(\n                        item.fonte ||\n                        'MERCADO_LIVRE'\n                    ).toUpperCase();\n\n                if (\n                    fonteItem ===\n                    'MERCADO_LIVRE'\n                ) {\n                    resultado.mercadoLivre += 1;\n\n                } else if (\n                    fonteItem ===\n                    'SHOPEE'\n                ) {\n                    resultado.shopee += 1;\n\n                } else if (fonteItem === 'MAGALU') {\n                    resultado.magalu += 1;\n\n                } else {\n                    resultado.outras += 1;\n                }\n            });\n\n            return resultado;\n        }\n\n        console.log(\n            '[COTA FACIL FONTES BRUTOS]',\n            JSON.stringify(\n                contarFontesCotafacil(\n                    anunciosBrutosDiagnostico\n                )\n            )\n        );\n\n        console.log(\n            '[COTA FACIL FONTES COMPARATIVO]',\n            JSON.stringify(\n                contarFontesCotafacil(\n                    comparativoDiagnostico\n                )\n            )\n        );\n\n        console.log(\n            '[COTA FACIL FONTES EXIBIDOS]',\n            JSON.stringify(\n                contarFontesCotafacil(\n                    anuncios\n                )\n            )\n        );\n\n        preencherFiltroMarcasCotafacil(\n            anuncios\n        );\n\n        configurarFiltrosLeitorCotafacil(\n            anuncios\n        );\n\n        const areaResultados =\n            document.getElementById(\n                'areaResultadosCotacao'\n            );\n\n        const listaResultados =\n            document.getElementById(\n                'listaResultadosCotacao'\n            );\n\n        const controlesOrdenacao =\n            document.getElementById(\n                'controlesOrdenacao'\n            );\n\n        if (\n            areaResultados ? listaResultados : false\n        ) {\n\n            listaResultados.innerHTML = '';\n\n            if (!anuncios.length) {\n\n                if (controlesOrdenacao) {\n                    controlesOrdenacao.style.display =\n                        'none';\n                }\n\n                const aviso =\n                    document.createElement('div');\n\n                aviso.style.padding = '15px';\n                aviso.style.border =\n                    '1px solid #dddddd';\n                aviso.style.borderRadius =\n                    '8px';\n\n                aviso.innerText =\n                    'Nenhuma oferta dispon\u00edvel para sele\u00e7\u00e3o.';\n\n                listaResultados.appendChild(\n                    aviso\n                );\n\n            } else {\n\n                if (controlesOrdenacao) {\n                    controlesOrdenacao.style.display =\n                        'flex';\n                }\n\n                anuncios.forEach(function (\n                    item\n                ) {\n\n                    const fonte =\n                        item.fonte ||\n                        'MERCADO_LIVRE';\n\n                    const titulo =\n                        item.produto ||\n                        item.title ||\n                        'Produto';\n\n                    const preco =\n                        Number(\n                            item.preco || 0\n                        );\n\n                    const unidade =\n                        item.unidade_comparacao ||\n                        'PECA';\n\n                    const comparavel =\n                        item.preco_comparavel;\n\n                    const participaRanking =\n                        item.participa_ranking !==\n                        false;\n\n                    const card =\n                        document.createElement(\n                            'div'\n                        );\n\n                    card.style.border =\n                        participaRanking\n                            ? '1px solid #dfe6e9'\n                            : '1px solid #f0c36d';\n\n                    card.style.borderRadius =\n                        '12px';\n\n                    card.style.padding =\n                        '16px';\n\n                    card.style.marginBottom =\n                        '12px';\n\n                    card.style.background =\n                        '#ffffff';\n\n                    card.style.boxShadow =\n                        '0 3px 12px rgba(0,0,0,0.06)';\n\n                    card.className =\n                        'cotafacil-resultado-card';\n\n                    card.dataset.precoTotal =\n                        Number.isFinite(preco)\n                            ? String(preco)\n                            : '';\n\n                    card.dataset.precoComparavel =\n                        (\n                            comparavel !== null\n                                ? (\n                                    comparavel !== undefined\n                                        ? Number.isFinite(\n                                            Number(comparavel)\n                                        )\n                                        : false\n                                )\n                                : false\n                        )\n                            ? String(Number(comparavel))\n                            : '';\n\n                    card.dataset.fonteFiltro =\n                        String(\n                            fonte ||\n                            'MERCADO_LIVRE'\n                        ).toUpperCase();\n\n                    card.dataset.statusFiltro =\n                        participaRanking\n                            ? 'RANKING'\n                            : String(\n                                item.compatibilidade ||\n                                'FORA_RANKING'\n                            ).toUpperCase();\n\n                    card.dataset.nomeOrdenacao =\n                        titulo.toLocaleLowerCase(\n                            'pt-BR'\n                        );\n\n                    card.dataset.marcaFiltro =\n                        String(\n                            item.marca ||\n                            item.marca_identificada ||\n                            'A_CONFIRMAR'\n                        ).toUpperCase();\n\n                    const topo =\n                        document.createElement(\n                            'div'\n                        );\n\n                    topo.style.display =\n                        'flex';\n\n                    topo.style.gap =\n                        '12px';\n\n                    topo.style.alignItems =\n                        'flex-start';\n\n                    const checkbox =\n                        document.createElement(\n                            'input'\n                        );\n\n                    checkbox.type =\n                        'checkbox';\n\n                    checkbox.className =\n                        'cotafacil-item-checkbox';\n\n                    checkbox.style.marginTop =\n                        '5px';\n\n                    checkbox.style.transform =\n                        'scale(1.2)';\n\n                    checkbox.dataset.itemId =\n                        item.item_id ||\n                        item.product_id ||\n                        '';\n\n                    checkbox.dataset.produto =\n                        titulo;\n\n                    checkbox.dataset.fonte =\n                        fonte;\n\n                    checkbox.dataset.preco =\n                        String(preco);\n\n                    checkbox.dataset.link =\n                        item.link || '';\n\n                    const imagemBox =\n                        document.createElement(\n                            'div'\n                        );\n\n                    imagemBox.className =\n                        'cotafacil-imagem-box';\n\n                    const imagemUrl =\n                        String(\n                            item.imagem || ''\n                        ).trim();\n\n                    if (imagemUrl) {\n\n                        const imagemProduto =\n                            document.createElement(\n                                'img'\n                            );\n\n                        imagemProduto.className =\n                            'cotafacil-imagem-produto';\n\n                        imagemProduto.src =\n                            imagemUrl;\n\n                        imagemProduto.alt =\n                            titulo;\n\n                        imagemProduto.loading =\n                            'lazy';\n\n                        imagemProduto.decoding =\n                            'async';\n\n                        imagemProduto.referrerPolicy =\n                            'no-referrer';\n\n                        imagemProduto.addEventListener(\n                            'error',\n                            function () {\n                                imagemProduto.style.display =\n                                    'none';\n\n                                imagemBox.classList.add(\n                                    'cotafacil-sem-imagem'\n                                );\n\n                                imagemBox.innerText =\n                                    'Sem foto';\n                            }\n                        );\n\n                        imagemBox.appendChild(\n                            imagemProduto\n                        );\n\n                    } else {\n\n                        imagemBox.classList.add(\n                            'cotafacil-sem-imagem'\n                        );\n\n                        imagemBox.innerText =\n                            'Sem foto';\n                    }\n\n                    const info =\n                        document.createElement(\n                            'div'\n                        );\n\n                    info.style.flex =\n                        '1';\n\n                    info.style.minWidth =\n                        '0';\n\n                    const marketplace =\n                        document.createElement(\n                            'div'\n                        );\n\n                    marketplace.style.display =\n                        'inline-block';\n\n                    marketplace.style.padding =\n                        '4px 8px';\n\n                    marketplace.style.borderRadius =\n                        '999px';\n\n                    marketplace.style.fontSize =\n                        '12px';\n\n                    marketplace.style.fontWeight =\n                        '700';\n\n                    marketplace.style.marginBottom =\n                        '8px';\n\n                    marketplace.style.background =\n                        fonte === 'SHOPEE'\n                            ? '#fff0eb'\n                            : '#fff8d6';\n\n                    marketplace.innerText =\n                        fonte === 'SHOPEE'\n                            ? 'SHOPEE'\n                            : (\n                                fonte === 'MAGALU'\n                                    ? 'MAGALU'\n                                    : 'MERCADO LIVRE'\n                            );\n\n                    const nome =\n                        document.createElement(\n                            'div'\n                        );\n\n                    nome.style.fontWeight =\n                        '700';\n\n                    nome.style.fontSize =\n                        '16px';\n\n                    nome.style.lineHeight =\n                        '1.35';\n\n                    nome.innerText =\n                        titulo;\n\n                    const precoPrincipal =\n                        document.createElement(\n                            'div'\n                        );\n\n                    precoPrincipal.style.marginTop =\n                        '10px';\n\n                    precoPrincipal.style.fontSize =\n                        '22px';\n\n                    precoPrincipal.style.fontWeight =\n                        '700';\n\n                    precoPrincipal.innerText =\n                        preco.toLocaleString(\n                            'pt-BR',\n                            {\n                                style:\n                                    'currency',\n                                currency:\n                                    'BRL'\n                            }\n                        );\n\n                    info.appendChild(\n                        marketplace\n                    );\n\n                    info.appendChild(\n                        nome\n                    );\n\n                    info.appendChild(\n                        precoPrincipal\n                    );\n\n                    if (\n                        [\n                            comparavel !== null,\n                            comparavel !== undefined,\n                            Number.isFinite(Number(comparavel))\n                        ].every(Boolean)\n                    ) {\n\n                        const linhaComparavel =\n                            document.createElement(\n                                'div'\n                            );\n\n                        linhaComparavel.style.marginTop =\n                            '5px';\n\n                        linhaComparavel.style.fontSize =\n                            '13px';\n\n                        linhaComparavel.style.color =\n                            '#666';\n\n                        linhaComparavel.innerText =\n                            'Pre\u00e7o compar\u00e1vel: ' +\n                            Number(\n                                comparavel\n                            ).toLocaleString(\n                                'pt-BR',\n                                {\n                                    style:\n                                        'currency',\n                                    currency:\n                                        'BRL'\n                                }\n                            ) +\n                            ' \/ ' +\n                            unidade;\n\n                        info.appendChild(\n                            linhaComparavel\n                        );\n                    }\n\n                    const marcaBruta =\n                        String(\n                            item.marca ||\n                            item.marca_identificada ||\n                            ''\n                        );\n\n                    const marcaExibicao =\n                        marcaBruta\n                            ? marcaBruta\n                                .replace(\n                                    \/_\/g,\n                                    ' '\n                                )\n                                .toLowerCase()\n                                .replace(\n                                    \/\\b\\w\/g,\n                                    function(letra) {\n                                        return letra.toUpperCase();\n                                    }\n                                )\n                            : 'A confirmar';\n\n                    const marca =\n                        document.createElement(\n                            'div'\n                        );\n\n                    marca.style.marginTop =\n                        '5px';\n\n                    marca.style.fontSize =\n                        '13px';\n\n                    marca.style.color =\n                        '#666';\n\n                    marca.innerText =\n                        'Marca: ' +\n                        marcaExibicao;\n\n                    info.appendChild(\n                        marca\n                    );\n\n                    const conectividadeBruta =\n                        String(\n                            item.conectividade_leitor ||\n                            'A_CONFIRMAR'\n                        ).toUpperCase();\n\n                    const leituraBruta =\n                        String(\n                            item.tipo_leitura_leitor ||\n                            'A_CONFIRMAR'\n                        ).toUpperCase();\n\n                    card.dataset.conectividadeFiltro =\n                        conectividadeBruta;\n\n                    card.dataset.leituraFiltro =\n                        leituraBruta;\n\n                    const textoLeitorCard =\n                        String(\n                            item.produto ||\n                            item.titulo ||\n                            item.title ||\n                            ''\n                        );\n\n                    const ehLeitorCard =\n                        [\n                            \/\\b(leitor|scanner|codigo\\s+de\\s+barras|codigo\\s+barras|qr\\s*code|qrcode|1d|2d)\\b\/i\n                                .test(textoLeitorCard),\n\n                            conectividadeBruta !==\n                                'A_CONFIRMAR',\n\n                            leituraBruta !==\n                                'A_CONFIRMAR'\n                        ].some(Boolean);\n\n                    if (ehLeitorCard) {\n\n                        let conectividadeExibicao =\n                            'A confirmar';\n\n                        if (conectividadeBruta === 'COM_FIO') {\n                            conectividadeExibicao = 'Com fio';\n                        } else if (conectividadeBruta === 'SEM_FIO') {\n                            conectividadeExibicao = 'Sem fio';\n                        }\n\n                        const conectividade =\n                            document.createElement(\n                                'div'\n                            );\n\n                        conectividade.style.marginTop =\n                            '5px';\n\n                        conectividade.style.fontSize =\n                            '13px';\n\n                        conectividade.style.color =\n                            '#666';\n\n                        conectividade.innerText =\n                            'Conectividade: ' +\n                            conectividadeExibicao;\n\n                        info.appendChild(\n                            conectividade\n                        );\n\n                        let leituraExibicao =\n                            'A confirmar';\n\n                        if (leituraBruta === '1D') {\n                            leituraExibicao = '1D';\n                        } else if (leituraBruta === '2D') {\n                            leituraExibicao = '2D';\n                        } else if (leituraBruta === '1D_2D') {\n                            leituraExibicao = '1D + 2D';\n                        }\n\n                        const leitura =\n                            document.createElement(\n                                'div'\n                            );\n\n                        leitura.style.marginTop =\n                            '5px';\n\n                        leitura.style.fontSize =\n                            '13px';\n\n                        leitura.style.color =\n                            '#666';\n\n                        leitura.innerText =\n                            'Leitura: ' +\n                            leituraExibicao;\n\n                        info.appendChild(\n                            leitura\n                        );\n                    }\n\n                    if (item.vendedor) {\n\n                        const vendedor =\n                            document.createElement(\n                                'div'\n                            );\n\n                        vendedor.style.marginTop =\n                            '5px';\n\n                        vendedor.style.fontSize =\n                            '13px';\n\n                        vendedor.style.color =\n                            '#666';\n\n                        vendedor.innerText =\n                            'Vendedor: ' +\n                            item.vendedor;\n\n                        info.appendChild(\n                            vendedor\n                        );\n                    }\n\n                    if (participaRanking) {\n\n                        const ranking =\n                            document.createElement(\n                                'div'\n                            );\n\n                        ranking.style.marginTop =\n                            '7px';\n\n                        ranking.style.fontSize =\n                            '13px';\n\n                        ranking.style.fontWeight =\n                            '600';\n\n                        ranking.innerText =\n                            '\u2713 Participa do ranking autom\u00e1tico';\n\n                        info.appendChild(\n                            ranking\n                        );\n\n                    } else {\n\n                        const alerta =\n                            document.createElement(\n                                'div'\n                            );\n\n                        alerta.style.marginTop =\n                            '7px';\n\n                        alerta.style.fontSize =\n                            '13px';\n\n                        alerta.style.fontWeight =\n                            '600';\n\n                        const compatibilidade =\n                            String(\n                                item.compatibilidade ||\n                                ''\n                            );\n\n                        const motivo =\n                            String(\n                                item.motivo_compatibilidade ||\n                                ''\n                            );\n\n                        let tituloStatus =\n                            '\u26a0 N\u00e3o participa do ranking';\n\n                        if (\n                            compatibilidade ===\n                            'VARIACAO_A_CONFIRMAR'\n                        ) {\n                            tituloStatus =\n                                '\u26a0 Varia\u00e7\u00e3o a confirmar';\n\n                        } else if (\n                            compatibilidade ===\n                            'QUANTIDADE_A_CONFIRMAR'\n                        ) {\n                            tituloStatus =\n                                '\u26a0 Quantidade a confirmar';\n\n                        } else if (\n                            compatibilidade ===\n                            'PRODUTO_DIFERENTE'\n                        ) {\n                            tituloStatus =\n                                '\u26a0 Produto diferente';\n                        }\n\n                        alerta.innerText =\n                            motivo\n                                ? tituloStatus +\n                                  ' \u2014 ' +\n                                  motivo\n                                : tituloStatus;\n\n                        info.appendChild(\n                            alerta\n                        );\n                    }\n\n                    topo.appendChild(\n                        checkbox\n                    );\n\n                    topo.appendChild(\n                        imagemBox\n                    );\n\n                    topo.appendChild(\n                        info\n                    );\n\n                    card.appendChild(\n                        topo\n                    );\n\n                    if (item.link) {\n\n                        const linkCompra =\n                            document.createElement(\n                                'a'\n                            );\n\n                        linkCompra.href =\n                            item.link;\n\n                        linkCompra.target =\n                            '_blank';\n\n                        linkCompra.rel =\n                            'noopener noreferrer';\n\n                        linkCompra.innerText =\n                            fonte === 'SHOPEE'\n                                ? 'Ver oferta na Shopee'\n                                : (fonte === 'MAGALU' ? 'Ver oferta no Magalu' : 'Ver oferta no Mercado Livre');\n\n                        linkCompra.style.display =\n                            'inline-block';\n\n                        linkCompra.style.marginTop =\n                            '12px';\n\n                        linkCompra.style.padding =\n                            '8px 12px';\n\n                        linkCompra.style.borderRadius =\n                            '6px';\n\n                        linkCompra.style.textDecoration =\n                            'none';\n\n                        linkCompra.style.fontWeight =\n                            '600';\n\n                        linkCompra.style.border =\n                            '1px solid #cccccc';\n\n                        card.appendChild(\n                            linkCompra\n                        );\n                    }\n\n                    listaResultados.appendChild(\n                        card\n                    );\n                });\n\n                ordenarResultadosCotafacil();\n            }\n\n            areaResultados.style.display =\n                'block';\n\n            areaResultados.scrollIntoView({\n                behavior: 'smooth',\n                block: 'start'\n            });\n\n            atualizarContadorOrcamento();\n            atualizarBotaoAdicionarOrcamento();\n        }\n\n        atualizarProgresso(\n            90,\n            'Ofertas exibidas. Gerando planilha Excel...'\n        );\n\n        \/\/ ======================================================\n        \/\/ 2. GERA O EXCEL COMO JA FUNCIONAVA\n        \/\/ ======================================================\n\n        const URL_API =\n            URL_BASE +\n            '?q=' +\n            encodeURIComponent(termoPesquisa) +\n            String.fromCharCode(38) + 'excel=1';\n\n        const resposta =\n            await fetch(URL_API, {\n                method: 'GET',\n                credentials: 'include'\n            });\n\n        atualizarProgresso(\n            98,\n            'Pesquisa conclu\u00edda. Recebendo planilha...'\n        );\n\n        console.log(\n            '[ML] Status HTTP:',\n            resposta.status\n        );\n\n        console.log(\n            '[ML] Content-Type:',\n            resposta.headers.get('content-type')\n        );\n\n        \/\/ ======================================================\n        \/\/ ERRO DO SERVIDOR\n        \/\/ ======================================================\n\n        if (!resposta.ok) {\n\n            const textoErro =\n                await resposta.text();\n\n            console.error(\n                '[ML] Resposta de erro:',\n                textoErro\n            );\n\n            let mensagemAmigavel =\n                `Erro ${resposta.status} no servidor.`;\n\n            try {\n\n                const jsonErro =\n                    JSON.parse(textoErro);\n\n                if (jsonErro.erro) {\n                    mensagemAmigavel =\n                        jsonErro.erro;\n                }\n\n            } catch (_) {\n                \/\/ Resposta n\u00e3o era JSON.\n            }\n\n            throw new Error(\n                mensagemAmigavel\n            );\n        }\n\n        \/\/ ======================================================\n        \/\/ VERIFICA CONTENT-TYPE\n        \/\/ ======================================================\n\n        const contentType =\n            resposta.headers.get('content-type') || '';\n\n        if (\n            !contentType.includes(\n                'application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n            )\n        ) {\n\n            console.warn(\n                '[ML] Content-Type inesperado:',\n                contentType\n            );\n        }\n\n        \/\/ ======================================================\n        \/\/ RECEBE EXCEL\n        \/\/ ======================================================\n\n        divStatus.innerText =\n            '\u23f3 Recebendo planilha...';\n\n        const blobPlanilha =\n            await resposta.blob();\n\n        console.log(\n            '[ML] Tamanho do arquivo:',\n            blobPlanilha.size,\n            'bytes'\n        );\n\n        if (\n            !blobPlanilha ||\n            blobPlanilha.size === 0\n        ) {\n\n            throw new Error(\n                'O servidor retornou um arquivo vazio.'\n            );\n        }\n\n        \/\/ ======================================================\n        \/\/ CRIA URL TEMPOR\u00c1RIA\n        \/\/ ======================================================\n\n        urlDownload =\n            window.URL.createObjectURL(\n                blobPlanilha\n            );\n\n        \/\/ ======================================================\n        \/\/ NOME DO ARQUIVO\n        \/\/ ======================================================\n\n        const nomeArquivo =\n            termoPesquisa\n                .toLowerCase()\n                .normalize('NFD')\n                .replace(\/[\\u0300-\\u036f]\/g, '')\n                .replace(\/[^a-z0-9]+\/g, '_')\n                .replace(\/^_+|_+$\/g, '')\n                .substring(0, 80)\n                + '_analise.xlsx';\n\n        \/\/ ======================================================\n        \/\/ DISPARA DOWNLOAD\n        \/\/ ======================================================\n\n        const linkTemporario =\n            document.createElement('a');\n\n        linkTemporario.href =\n            urlDownload;\n\n        linkTemporario.download =\n            nomeArquivo;\n\n        linkTemporario.style.display =\n            'none';\n\n        document.body.appendChild(\n            linkTemporario\n        );\n\n        linkTemporario.click();\n\n        linkTemporario.remove();\n\n        \/\/ ======================================================\n        \/\/ SUCESSO\n        \/\/ ======================================================\n\n        divStatus.className =\n            'status-mensagem status-sucesso';\n\n        atualizarProgresso(\n            100,\n            'Conclu\u00eddo'\n        );\n\n        divStatus.innerText =\n            '\u2705 Pesquisa conclu\u00edda! Excel baixado com sucesso.';\n\n        console.log(\n            '[ML] \u2705 Download iniciado:',\n            nomeArquivo\n        );\n\n    } catch (erro) {\n\n        console.error(\n            '[ML] \u274c Erro:',\n            erro\n        );\n\n        divStatus.className =\n            'status-mensagem status-erro';\n\n        \/*\n         * Erros de CORS normalmente chegam ao JavaScript\n         * apenas como erro de rede. Nesse caso mostramos\n         * uma mensagem mais \u00fatil.\n         *\/\n        if (\n            [\n                erro instanceof TypeError,\n                erro.message.toLowerCase().includes('fetch')\n            ].every(Boolean)\n        ) {\n\n            divStatus.innerText =\n    '\u274c N\u00e3o foi poss\u00edvel concluir a pesquisa. Tente novamente em alguns instantes.'       ;\n        } else {\n\n            divStatus.innerText =\n                `\u274c Falha: ${erro.message}`;\n        }\n\n    } finally {\n\n        if (timerProgresso) {\n            clearInterval(timerProgresso);\n        }\n\n        \/\/ ======================================================\n        \/\/ LIBERA INTERFACE\n        \/\/ ======================================================\n\n        btnBusca.disabled = false;\n        inputProduto.disabled = false;\n        pesquisaComercialEmAndamento = false;\n\n        \/\/ Libera Blob da mem\u00f3ria depois de 1 minuto.\n        if (urlDownload) {\n\n            setTimeout(() => {\n\n                window.URL.revokeObjectURL(\n                    urlDownload\n                );\n\n            }, 60000);\n        }\n    }\n}\n\n\n\/\/ ============================================================\n\/\/ ORDENA\u00c7\u00c3O DOS RESULTADOS COTA F\u00c1CIL\n\/\/ ============================================================\n\nfunction ordenarResultadosCotafacil() {\n\n    const lista =\n        document.getElementById(\n            'listaResultadosCotacao'\n        );\n\n    const seletor =\n        document.getElementById(\n            'ordenacaoCotafacil'\n        );\n\n    if (!lista || !seletor) {\n        return;\n    }\n\n    const cards =\n        Array.from(\n            lista.querySelectorAll(\n                '.cotafacil-resultado-card'\n            )\n        );\n\n    if (!cards.length) {\n        return;\n    }\n\n    const modo =\n        seletor.value ||\n        'comparavel_asc';\n\n    function numeroCard(card, campo) {\n\n        const bruto =\n            card.dataset[campo];\n\n        if (\n            bruto === undefined ||\n            bruto === null ||\n            bruto === ''\n        ) {\n            return null;\n        }\n\n        const valor =\n            Number(bruto);\n\n        return Number.isFinite(valor)\n            ? valor\n            : null;\n    }\n\n    cards.sort(function (a, b) {\n\n        if (\n            modo === 'nome_asc' ||\n            modo === 'nome_desc'\n        ) {\n\n            const nomeA =\n                a.dataset.nomeOrdenacao || '';\n\n            const nomeB =\n                b.dataset.nomeOrdenacao || '';\n\n            const comparacao =\n                nomeA.localeCompare(\n                    nomeB,\n                    'pt-BR'\n                );\n\n            return modo === 'nome_desc'\n                ? -comparacao\n                : comparacao;\n        }\n\n        const campo =\n            modo.startsWith('preco_')\n                ? 'precoTotal'\n                : 'precoComparavel';\n\n        const valorA =\n            numeroCard(a, campo);\n\n        const valorB =\n            numeroCard(b, campo);\n\n        if (\n            valorA === null &&\n            valorB === null\n        ) {\n            return 0;\n        }\n\n        if (valorA === null) {\n            return 1;\n        }\n\n        if (valorB === null) {\n            return -1;\n        }\n\n        const descendente =\n            modo.endsWith('_desc');\n\n        return descendente\n            ? valorB - valorA\n            : valorA - valorB;\n    });\n\n    cards.forEach(function (card) {\n        lista.appendChild(card);\n    });\n}\n\n\n\/\/ ============================================================\n\/\/ FILTROS DOS RESULTADOS COTA FACIL\n\/\/ ============================================================\n\nfunction configurarFiltrosLeitorCotafacil(anuncios) {\n\n    const grupoConectividade =\n        document.getElementById(\n            'grupoConectividadeCotafacil'\n        );\n\n    const grupoLeitura =\n        document.getElementById(\n            'grupoLeituraCotafacil'\n        );\n\n    const filtroConectividade =\n        document.getElementById(\n            'filtroConectividadeCotafacil'\n        );\n\n    const filtroLeitura =\n        document.getElementById(\n            'filtroLeituraCotafacil'\n        );\n\n    const inputBusca =\n        document.getElementById(\n            'inputBuscaMl'\n        );\n\n    const pesquisa =\n        String(\n            inputBusca\n                ? inputBusca.value\n                : ''\n        ).toLowerCase();\n\n    const pesquisaPareceLeitor =\n        \/\\b(leitor|scanner|codigo\\s+de\\s+barras|codigo\\s+barras|qr\\s*code|qrcode|1d|2d)\\b\/i\n            .test(pesquisa);\n\n    const anuncioPareceLeitor =\n        anuncios.some(function(item) {\n\n            const titulo =\n                String(\n                    item.produto ||\n                    item.titulo ||\n                    item.title ||\n                    ''\n                );\n\n            const conectividade =\n                String(\n                    item.conectividade_leitor ||\n                    'A_CONFIRMAR'\n                ).toUpperCase();\n\n            const leitura =\n                String(\n                    item.tipo_leitura_leitor ||\n                    'A_CONFIRMAR'\n                ).toUpperCase();\n\n            return [\n                \/\\b(leitor|scanner|codigo\\s+de\\s+barras|codigo\\s+barras|qr\\s*code|qrcode|1d|2d)\\b\/i\n                    .test(titulo),\n\n                conectividade !== 'A_CONFIRMAR',\n\n                leitura !== 'A_CONFIRMAR'\n            ].some(Boolean);\n        });\n\n    const mostrarFiltros =\n        pesquisaPareceLeitor ||\n        anuncioPareceLeitor;\n\n    if (grupoConectividade) {\n        grupoConectividade.style.display =\n            mostrarFiltros ? '' : 'none';\n    }\n\n    if (grupoLeitura) {\n        grupoLeitura.style.display =\n            mostrarFiltros ? '' : 'none';\n    }\n\n    if (!mostrarFiltros) {\n\n        if (filtroConectividade) {\n            filtroConectividade.value = 'TODAS';\n        }\n\n        if (filtroLeitura) {\n            filtroLeitura.value = 'TODAS';\n        }\n    }\n}\n\n\nfunction preencherFiltroMarcasCotafacil(anuncios) {\n\n    const seletor =\n        document.getElementById(\n            'filtroMarcaCotafacil'\n        );\n\n    if (!seletor) {\n        return;\n    }\n\n    const marcaAtual =\n        seletor.value || 'TODAS';\n\n    const marcas =\n        Array.from(\n            new Set(\n                anuncios\n                    .map(function(item) {\n                        return String(\n                            item.marca ||\n                            item.marca_identificada ||\n                            ''\n                        ).trim();\n                    })\n                    .filter(function(marca) {\n                        return Boolean(marca);\n                    })\n            )\n        ).sort(function(a, b) {\n            return a.localeCompare(\n                b,\n                'pt-BR'\n            );\n        });\n\n    seletor.innerHTML = '';\n\n    const opcaoTodas =\n        document.createElement(\n            'option'\n        );\n\n    opcaoTodas.value =\n        'TODAS';\n\n    opcaoTodas.innerText =\n        'Todas';\n\n    seletor.appendChild(\n        opcaoTodas\n    );\n\n    marcas.forEach(function(marca) {\n\n        const opcao =\n            document.createElement(\n                'option'\n            );\n\n        opcao.value =\n            marca.toUpperCase();\n\n        opcao.innerText =\n            marca\n                .replace(\/_\/g, ' ')\n                .toLowerCase()\n                .replace(\n                    \/\\b\\w\/g,\n                    function(letra) {\n                        return letra.toUpperCase();\n                    }\n                );\n\n        seletor.appendChild(\n            opcao\n        );\n    });\n\n    const aindaExiste =\n        Array.from(\n            seletor.options\n        ).some(function(opcao) {\n            return opcao.value ===\n                marcaAtual;\n        });\n\n    seletor.value =\n        aindaExiste\n            ? marcaAtual\n            : 'TODAS';\n}\n\n\n\/\/ ============================================================\n\/\/ FILTROS DOS RESULTADOS COTA FACIL\n\/\/ ============================================================\n\nfunction filtrarResultadosCotafacil() {\n\n    const lista =\n        document.getElementById(\n            'listaResultadosCotacao'\n        );\n\n    const filtroFonte =\n        document.getElementById(\n            'filtroFonteCotafacil'\n        );\n\n    const filtroStatus =\n        document.getElementById(\n            'filtroStatusCotafacil'\n        );\n\n    const filtroMarca =\n        document.getElementById(\n            'filtroMarcaCotafacil'\n        );\n\n    const filtroConectividade =\n        document.getElementById(\n            'filtroConectividadeCotafacil'\n        );\n\n    const filtroLeitura =\n        document.getElementById(\n            'filtroLeituraCotafacil'\n        );\n\n    const filtroTituloInclui =\n        document.getElementById(\n            'filtroTituloIncluiCotafacil'\n        );\n\n    const filtroTituloExclui =\n        document.getElementById(\n            'filtroTituloExcluiCotafacil'\n        );\n\n    const filtroPrecoTotalMin =\n        document.getElementById(\n            'filtroPrecoTotalMinCotafacil'\n        );\n\n    const filtroPrecoTotalMax =\n        document.getElementById(\n            'filtroPrecoTotalMaxCotafacil'\n        );\n\n    const filtroPrecoComparavelMin =\n        document.getElementById(\n            'filtroPrecoComparavelMinCotafacil'\n        );\n\n    const filtroPrecoComparavelMax =\n        document.getElementById(\n            'filtroPrecoComparavelMaxCotafacil'\n        );\n\n    if (!lista) {\n        return;\n    }\n\n    const fonteSelecionada =\n        filtroFonte ? filtroFonte.value : 'TODAS';\n\n    const statusSelecionado =\n        filtroStatus ? filtroStatus.value : 'TODOS';\n\n    const marcaSelecionada =\n        filtroMarca ? filtroMarca.value : 'TODAS';\n\n    const conectividadeSelecionada =\n        filtroConectividade\n            ? filtroConectividade.value\n            : 'TODAS';\n\n    const leituraSelecionada =\n        filtroLeitura\n            ? filtroLeitura.value\n            : 'TODAS';\n\n    const tituloInclui =\n        String(\n            filtroTituloInclui\n                ? filtroTituloInclui.value\n                : ''\n        )\n        .trim()\n        .toLocaleLowerCase('pt-BR');\n\n    const tituloExclui =\n        String(\n            filtroTituloExclui\n                ? filtroTituloExclui.value\n                : ''\n        )\n        .trim()\n        .toLocaleLowerCase('pt-BR');\n\n    function numeroFiltro(elemento) {\n\n        if (!elemento) {\n            return null;\n        }\n\n        const valor =\n            String(elemento.value || '')\n                .trim()\n                .replace(\/\\.\/g, '')\n                .replace(',', '.');\n\n        if (!valor) {\n            return null;\n        }\n\n        const numero =\n            Number(valor);\n\n        return Number.isFinite(numero)\n            ? numero\n            : null;\n    }\n\n    const precoTotalMin =\n        numeroFiltro(\n            filtroPrecoTotalMin\n        );\n\n    const precoTotalMax =\n        numeroFiltro(\n            filtroPrecoTotalMax\n        );\n\n    const precoComparavelMin =\n        numeroFiltro(\n            filtroPrecoComparavelMin\n        );\n\n    const precoComparavelMax =\n        numeroFiltro(\n            filtroPrecoComparavelMax\n        );\n\n    const cards =\n        Array.from(\n            lista.querySelectorAll(\n                '.cotafacil-resultado-card'\n            )\n        );\n\n    cards.forEach(function(card) {\n\n        const fonteCard =\n            card.dataset.fonteFiltro || '';\n\n        const statusCard =\n            card.dataset.statusFiltro ||\n            'FORA_RANKING';\n\n        const marcaCard =\n            card.dataset.marcaFiltro ||\n            'A_CONFIRMAR';\n\n        const conectividadeCard =\n            card.dataset.conectividadeFiltro ||\n            'A_CONFIRMAR';\n\n        const leituraCard =\n            card.dataset.leituraFiltro ||\n            'A_CONFIRMAR';\n\n        const tituloCard =\n            String(\n                card.dataset.nomeOrdenacao ||\n                ''\n            ).toLocaleLowerCase(\n                'pt-BR'\n            );\n\n        const precoTotalCard =\n            Number(\n                card.dataset.precoTotal\n            );\n\n        const precoComparavelCard =\n            Number(\n                card.dataset.precoComparavel\n            );\n\n        let mostraFonte = true;\n        let mostraStatus = true;\n        let mostraMarca = true;\n        let mostraConectividade = true;\n        let mostraLeitura = true;\n        let mostraTituloInclui = true;\n        let mostraTituloExclui = true;\n        let mostraPrecoTotal = true;\n        let mostraPrecoComparavel = true;\n\n        if (fonteSelecionada !== 'TODAS') {\n            mostraFonte =\n                fonteCard ===\n                fonteSelecionada;\n        }\n\n        if (statusSelecionado !== 'TODOS') {\n\n            if (\n                statusSelecionado ===\n                'FORA_RANKING'\n            ) {\n\n                mostraStatus =\n                    [\n                        statusCard !== 'RANKING',\n                        statusCard !== 'QUANTIDADE_A_CONFIRMAR',\n                        statusCard !== 'VARIACAO_A_CONFIRMAR',\n                        statusCard !== 'PRODUTO_DIFERENTE'\n                    ].every(Boolean);\n\n            } else {\n\n                mostraStatus =\n                    statusCard ===\n                    statusSelecionado;\n            }\n        }\n\n        if (marcaSelecionada !== 'TODAS') {\n\n            mostraMarca =\n                marcaCard ===\n                marcaSelecionada;\n        }\n\n        if (\n            conectividadeSelecionada !==\n            'TODAS'\n        ) {\n\n            mostraConectividade =\n                conectividadeCard ===\n                conectividadeSelecionada;\n        }\n\n        if (\n            leituraSelecionada !==\n            'TODAS'\n        ) {\n\n            mostraLeitura =\n                leituraCard ===\n                leituraSelecionada;\n        }\n\n        if (tituloInclui) {\n\n            mostraTituloInclui =\n                tituloCard.includes(\n                    tituloInclui\n                );\n        }\n\n        if (tituloExclui) {\n\n            mostraTituloExclui =\n                !tituloCard.includes(\n                    tituloExclui\n                );\n        }\n\n        if (precoTotalMin !== null) {\n\n            mostraPrecoTotal =\n                [\n                    mostraPrecoTotal,\n                    Number.isFinite(\n                        precoTotalCard\n                    ),\n                    precoTotalCard >=\n                        precoTotalMin\n                ].every(Boolean);\n        }\n\n        if (precoTotalMax !== null) {\n\n            mostraPrecoTotal =\n                [\n                    mostraPrecoTotal,\n                    Number.isFinite(\n                        precoTotalCard\n                    ),\n                    precoTotalCard <=\n                        precoTotalMax\n                ].every(Boolean);\n        }\n\n        if (\n            precoComparavelMin !== null\n        ) {\n\n            mostraPrecoComparavel =\n                [\n                    mostraPrecoComparavel,\n                    Number.isFinite(\n                        precoComparavelCard\n                    ),\n                    precoComparavelCard >=\n                        precoComparavelMin\n                ].every(Boolean);\n        }\n\n        if (\n            precoComparavelMax !== null\n        ) {\n\n            mostraPrecoComparavel =\n                [\n                    mostraPrecoComparavel,\n                    Number.isFinite(\n                        precoComparavelCard\n                    ),\n                    precoComparavelCard <=\n                        precoComparavelMax\n                ].every(Boolean);\n        }\n\n        card.style.display =\n            [\n                mostraFonte,\n                mostraStatus,\n                mostraMarca,\n                mostraConectividade,\n                mostraLeitura,\n                mostraTituloInclui,\n                mostraTituloExclui,\n                mostraPrecoTotal,\n                mostraPrecoComparavel\n            ].every(Boolean)\n                ? ''\n                : 'none';\n    });\n}\n\n\n\/\/ ============================================================\n\/\/ EVENTOS DOS FILTROS AVANCADOS\n\/\/ ============================================================\n\ndocument.addEventListener(\n    'DOMContentLoaded',\n    function () {\n\n        [\n            'filtroTituloIncluiCotafacil',\n            'filtroTituloExcluiCotafacil',\n            'filtroPrecoTotalMinCotafacil',\n            'filtroPrecoTotalMaxCotafacil',\n            'filtroPrecoComparavelMinCotafacil',\n            'filtroPrecoComparavelMaxCotafacil'\n        ].forEach(function(id) {\n\n            const campo =\n                document.getElementById(\n                    id\n                );\n\n            if (campo) {\n\n                campo.addEventListener(\n                    'input',\n                    function () {\n                        filtrarResultadosCotafacil();\n                    }\n                );\n            }\n        });\n    }\n);\n\n\n\/\/ ============================================================\n\/\/ ENTER NO CAMPO DE PESQUISA\n\/\/ ============================================================\n\ndocument.addEventListener(\n    'DOMContentLoaded',\n    function () {\n\n        const seletorOrdenacao =\n            document.getElementById(\n                'ordenacaoCotafacil'\n            );\n\n        if (seletorOrdenacao) {\n            seletorOrdenacao.addEventListener(\n                'change',\n                function () {\n                    ordenarResultadosCotafacil();\n                }\n            );\n        }\n\n        const filtroFonte =\n            document.getElementById(\n                'filtroFonteCotafacil'\n            );\n\n        if (filtroFonte) {\n            filtroFonte.addEventListener(\n                'change',\n                function () {\n                    filtrarResultadosCotafacil();\n                }\n            );\n        }\n\n        const filtroMarca =\n            document.getElementById(\n                'filtroMarcaCotafacil'\n            );\n\n        if (filtroMarca) {\n            filtroMarca.addEventListener(\n                'change',\n                function () {\n                    filtrarResultadosCotafacil();\n                }\n            );\n        }\n\n        const filtroConectividade =\n            document.getElementById(\n                'filtroConectividadeCotafacil'\n            );\n\n        if (filtroConectividade) {\n            filtroConectividade.addEventListener(\n                'change',\n                function () {\n                    filtrarResultadosCotafacil();\n                }\n            );\n        }\n\n        const filtroLeitura =\n            document.getElementById(\n                'filtroLeituraCotafacil'\n            );\n\n        if (filtroLeitura) {\n            filtroLeitura.addEventListener(\n                'change',\n                function () {\n                    filtrarResultadosCotafacil();\n                }\n            );\n        }\n\n        const filtroStatus =\n            document.getElementById(\n                'filtroStatusCotafacil'\n            );\n\n        if (filtroStatus) {\n            filtroStatus.addEventListener(\n                'change',\n                function () {\n                    filtrarResultadosCotafacil();\n                }\n            );\n        }\n\n        const input =\n            document.getElementById(\n                'inputBuscaMl'\n            );\n\n        if (!input) {\n            console.warn(\n                '[ML] Campo inputBuscaMl n\u00e3o encontrado.'\n            );\n            return;\n        }\n\n        input.addEventListener(\n            'keydown',\n            function (event) {\n\n                if (\n                    [\n                        event.key === 'Enter',\n                        !event.shiftKey\n                    ].every(Boolean)\n                ) {\n\n                    event.preventDefault();\n\n                    dispararPesquisaComercial();\n                }\n            }\n        );\n    }\n);\n\n\/\/ ============================================================\n\/\/ ORCAMENTO \/ CARRINHO COTA FACIL\n\/\/ ============================================================\n\nconst CHAVE_ORCAMENTO_COTA_FACIL = 'cotafacil_orcamento';\n\nfunction carregarOrcamentoCotafacil() {\n    try {\n        const dados = localStorage.getItem(\n            CHAVE_ORCAMENTO_COTA_FACIL\n        );\n\n        if (!dados) {\n            return [];\n        }\n\n        const itens = JSON.parse(dados);\n\n        return Array.isArray(itens)\n            ? itens\n            : [];\n    } catch (erro) {\n        console.error(\n            '[COTA FACIL] Erro ao carregar or\u00e7amento:',\n            erro\n        );\n\n        return [];\n    }\n}\n\nfunction salvarOrcamentoCotafacil(itens) {\n    localStorage.setItem(\n        CHAVE_ORCAMENTO_COTA_FACIL,\n        JSON.stringify(itens)\n    );\n}\n\nfunction atualizarContadorOrcamento() {\n    const contador =\n        document.getElementById(\n            'contadorOrcamento'\n        );\n\n    const btnVer =\n        document.getElementById(\n            'btnVerOrcamento'\n        );\n\n    const itens =\n        carregarOrcamentoCotafacil();\n\n    if (contador) {\n        contador.innerText =\n            itens.length === 1\n                ? '1 item selecionado'\n                : itens.length + ' itens selecionados';\n    }\n\n    if (btnVer) {\n        btnVer.disabled =\n            itens.length === 0;\n    }\n}\n\nfunction obterResultadosMarcados() {\n    return Array.from(\n        document.querySelectorAll(\n            '.cotafacil-item-checkbox:checked'\n        )\n    ).map(function (checkbox) {\n        return {\n            item_id:\n                checkbox.dataset.itemId || '',\n            produto:\n                checkbox.dataset.produto || '',\n            fonte:\n                checkbox.dataset.fonte || '',\n            preco:\n                Number(\n                    checkbox.dataset.preco || 0\n                ),\n            link:\n                checkbox.dataset.link || ''\n        };\n    });\n}\n\nfunction atualizarBotaoAdicionarOrcamento() {\n    const btnAdicionar =\n        document.getElementById(\n            'btnAdicionarOrcamento'\n        );\n\n    if (!btnAdicionar) {\n        return;\n    }\n\n    btnAdicionar.disabled =\n        obterResultadosMarcados().length === 0;\n}\n\nfunction adicionarMarcadosAoOrcamento() {\n    const novos =\n        obterResultadosMarcados();\n\n    if (!novos.length) {\n        return;\n    }\n\n    const atuais =\n        carregarOrcamentoCotafacil();\n\n    const mapa =\n        new Map();\n\n    atuais.forEach(function (item) {\n        const chave =\n            (item.fonte || '') +\n            '|' +\n            (item.item_id || '');\n\n        mapa.set(chave, item);\n    });\n\n    novos.forEach(function (item) {\n        const chave =\n            (item.fonte || '') +\n            '|' +\n            (item.item_id || '');\n\n        mapa.set(chave, item);\n    });\n\n    const resultado =\n        Array.from(mapa.values());\n\n    salvarOrcamentoCotafacil(\n        resultado\n    );\n\n    atualizarContadorOrcamento();\n\n    document\n        .querySelectorAll(\n            '.cotafacil-item-checkbox'\n        )\n        .forEach(function (checkbox) {\n            checkbox.checked = false;\n        });\n\n    atualizarBotaoAdicionarOrcamento();\n}\n\ndocument.addEventListener(\n    'change',\n    function (event) {\n        if (\n            event.target\n                ? event.target.classList.contains(\n                    'cotafacil-item-checkbox'\n                )\n                : false\n        ) {\n            atualizarBotaoAdicionarOrcamento();\n        }\n    }\n);\n\ndocument.addEventListener(\n    'DOMContentLoaded',\n    function () {\n        atualizarContadorOrcamento();\n\n        const btnAdicionar =\n            document.getElementById(\n                'btnAdicionarOrcamento'\n            );\n\n        if (btnAdicionar) {\n            btnAdicionar.addEventListener(\n                'click',\n                adicionarMarcadosAoOrcamento\n            );\n        }\n    }\n);\n\n<\/script>\n\n\n\n\n\n\n\n<script>\n\/* COTAFACIL_CONTADORES_AUTOMATICOS_V1 *\/\n(function () {\n    const saldo = document.getElementById('cotafacilPesquisasRestantes');\n    const saldoLegenda = document.getElementById('cotafacilPesquisasLegenda');\n    const relogio = document.getElementById('cotafacilRelogioPlano');\n    const planoLegenda = document.getElementById('cotafacilPlanoLegenda');\n\n    if (!saldo || !saldoLegenda || !relogio || !planoLegenda) return;\n\n    const vencimentoBrasilia = document.getElementById('cotafacilVencimentoBrasilia');\n\n    function formatarVencimentoBrasilia(timestamp) {\n        const data = new Date(timestamp * 1000);\n        const formatador = new Intl.DateTimeFormat('pt-BR', {\n            timeZone: 'Etc\/GMT+3',\n            day: '2-digit',\n            month: '2-digit',\n            year: 'numeric',\n            hour: '2-digit',\n            minute: '2-digit',\n            second: '2-digit',\n            hourCycle: 'h23'\n        });\n        return formatador.format(data).replace(',', ' \u00e0s') + ' (UTC\u22123)';\n    }\n\n    let vencimento = 0;\n    let diferencaServidor = 0;\n    let consultaConcluida = false;\n\n    function atualizarRelogio() {\n        if (!consultaConcluida) return;\n\n        const agora = Math.floor(Date.now() \/ 1000) + diferencaServidor;\n        const restante = Math.max(0, vencimento - agora);\n\n        if (restante <= 0) {\n            relogio.textContent = '00:00:00';\n            planoLegenda.textContent = 'SEM PLANO ATIVO';\n            return;\n        }\n\n        const dias = Math.floor(restante \/ 86400);\n        const horas = Math.floor((restante % 86400) \/ 3600);\n        const minutos = Math.floor((restante % 3600) \/ 60);\n        const segundos = restante % 60;\n        const dois = n => String(n).padStart(2, '0');\n\n        relogio.textContent =\n            dias + 'd ' + dois(horas) + ':' +\n            dois(minutos) + ':' + dois(segundos);\n\n        planoLegenda.textContent = 'PESQUISAS ILIMITADAS';\n    }\n\n    async function consultarContadores() {\n        try {\n            let nonceRest = window.cotafacilNonceRest || '';\n\n            if (!nonceRest) {\n                for (let tentativa = 0; tentativa < 20; tentativa++) {\n                    await new Promise(resolve => setTimeout(resolve, 500));\n                    nonceRest = window.cotafacilNonceRest || '';\n                    if (nonceRest) break;\n                }\n            }\n\n            if (!nonceRest) {\n                throw new Error('Nonce REST indisponivel');\n            }\n\n            const resposta = await fetch('\/wp-json\/cotafacil\/v1\/meu-plano', {\n                credentials: 'same-origin',\n                cache: 'no-store',\n                headers: {\n                    'X-WP-Nonce': nonceRest\n                }\n            });\n\n            if (!resposta.ok) throw new Error('HTTP ' + resposta.status);\n\n            const dados = await resposta.json();\n\n            if (!dados.ok ||\n                !Number.isFinite(Number(dados.pesquisas_gratis_restantes))) {\n                throw new Error('Saldo indisponivel');\n            }\n\n            saldo.textContent = String(dados.pesquisas_gratis_restantes);\n            saldoLegenda.textContent =\n                'de ' + dados.pesquisas_gratis_total + ' dispon\u00edveis';\n\n            diferencaServidor =\n                Number(dados.servidor_agora) - Math.floor(Date.now() \/ 1000);\n\n            vencimento = Number(dados.plano_vencimento) || 0;\n            consultaConcluida = true;\n\n            if (vencimentoBrasilia) {\n                vencimentoBrasilia.textContent = vencimento > 0\n                    ? 'Vencimento: ' + formatarVencimentoBrasilia(vencimento)\n                    : 'Nenhum plano contratado';\n            }\n\n            atualizarRelogio();\n\n        } catch (erro) {\n            saldoLegenda.textContent = 'Consulta indispon\u00edvel';\n            if (!consultaConcluida) {\n                planoLegenda.textContent = 'Consulta indispon\u00edvel';\n            }\n        }\n    }\n\n    consultarContadores();\n    setInterval(atualizarRelogio, 1000);\n    setInterval(consultarContadores, 60000);\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"blank","meta":{"footnotes":""},"class_list":["post-14","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cotafacil.zapto.org\/index.php\/wp-json\/wp\/v2\/pages\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cotafacil.zapto.org\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cotafacil.zapto.org\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cotafacil.zapto.org\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cotafacil.zapto.org\/index.php\/wp-json\/wp\/v2\/comments?post=14"}],"version-history":[{"count":0,"href":"https:\/\/cotafacil.zapto.org\/index.php\/wp-json\/wp\/v2\/pages\/14\/revisions"}],"wp:attachment":[{"href":"https:\/\/cotafacil.zapto.org\/index.php\/wp-json\/wp\/v2\/media?parent=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}