Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>UTM Analytics Pro</title> | |
| <link rel="icon" type="image/x-icon" href="https://cdn-icons-png.flaticon.com/512/2991/2991148.png"> | |
| <link rel="stylesheet" href="style.css"> | |
| <script src="https://cdn.tailwindcss.com"></script> | |
| <script src="https://unpkg.com/feather-icons"></script> | |
| <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script> | |
| <script> | |
| tailwind.config = { | |
| theme: { | |
| extend: { | |
| colors: { | |
| primary: '#4f46e5', // Indigo 600 | |
| secondary: '#64748b', // Slate 500 | |
| } | |
| } | |
| } | |
| } | |
| </script> | |
| </head> | |
| <body class="bg-gray-50 text-slate-800 font-sans antialiased overflow-hidden"> | |
| <!-- App Container --> | |
| <div class="flex h-screen"> | |
| <!-- Sidebar Component --> | |
| <custom-sidebar class="hidden md:flex flex-col w-64 bg-white border-r border-gray-200 h-full"></custom-sidebar> | |
| <!-- Main Content Area --> | |
| <div class="flex-1 flex flex-col h-full relative overflow-hidden"> | |
| <!-- Header Component --> | |
| <custom-header></custom-header> | |
| <!-- Scrollable Content --> | |
| <main class="flex-1 overflow-y-auto p-4 md:p-8" id="main-scroll"> | |
| <!-- Page Header --> | |
| <div class="mb-8"> | |
| <h1 class="text-2xl font-bold text-gray-900">Relatório Detalhado: Vendas vs. Pagamentos por UTM</h1> | |
| <p class="text-secondary mt-1">Analise o desempenho das suas campanhas em tempo real.</p> | |
| </div> | |
| <!-- Warning Banner --> | |
| <div id="limitation-banner" class="bg-amber-50 border border-amber-200 rounded-lg p-4 mb-6 flex items-start gap-3"> | |
| <div class="text-amber-500 mt-0.5"><i data-feather="alert-triangle" class="w-5 h-5"></i></div> | |
| <div> | |
| <h3 class="text-amber-800 font-semibold text-sm">Limitação de Ambiente</h3> | |
| <p class="text-amber-700 text-sm mt-1">Os dados simulados não persistem se você recarregar a página. Mantenha a aba aberta para ver as atualizações.</p> | |
| </div> | |
| </div> | |
| <!-- Filters Section --> | |
| <section class="bg-white rounded-xl shadow-sm border border-gray-200 p-6 mb-8"> | |
| <div class="flex flex-col md:flex-row gap-4 items-end justify-between"> | |
| <div class="flex flex-col md:flex-row gap-4 w-full md:w-auto"> | |
| <!-- Date Range Select --> | |
| <div class="w-full md:w-48"> | |
| <label class="block text-sm font-medium text-gray-700 mb-1">Período</label> | |
| <div class="relative"> | |
| <select id="date-range-select" class="block w-full pl-3 pr-10 py-2 text-base border-gray-300 focus:outline-none focus:ring-primary focus:border-primary sm:text-sm rounded-md border bg-gray-50"> | |
| <option value="hoje">Hoje</option> | |
| <option value="ontem">Ontem</option> | |
| <option value="ultimos7">Últimos 7 dias</option> | |
| <option value="ultimos30">Últimos 30 dias</option> | |
| <option value="customizado">Período customizado</option> | |
| </select> | |
| </div> | |
| </div> | |
| <!-- Custom Date Range (Hidden by default) --> | |
| <div id="custom-date-container" class="w-full md:w-64 hidden"> | |
| <label class="block text-sm font-medium text-gray-700 mb-1">Datas</label> | |
| <input type="date" id="date-start" class="border border-gray-300 rounded-md p-2 text-sm w-1/2 mr-1"> | |
| <input type="date" id="date-end" class="border border-gray-300 rounded-md p-2 text-sm w-1/2"> | |
| </div> | |
| </div> | |
| <!-- Actions --> | |
| <div class="flex gap-3 w-full md:w-auto mt-4 md:mt-0"> | |
| <button id="refresh-btn" class="flex-1 md:flex-none bg-primary hover:bg-indigo-700 text-white px-4 py-2 rounded-lg shadow-sm transition-all duration-200 flex items-center justify-center gap-2 text-sm font-medium"> | |
| <i data-feather="refresh-cw" class="w-4 h-4"></i> Atualizar Dados | |
| </button> | |
| <button id="export-btn" class="flex-1 md:flex-none bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 px-4 py-2 rounded-lg shadow-sm transition-all duration-200 flex items-center justify-center gap-2 text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed"> | |
| <i data-feather="download" class="w-4 h-4"></i> Exportar CSV | |
| </button> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- Alerts Area --> | |
| <div id="alerts-area" class="space-y-4 mb-8"> | |
| <!-- Dynamic Alerts will be injected here --> | |
| </div> | |
| <!-- KPI Cards --> | |
| <section id="kpi-section" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8 hidden"> | |
| <div class="bg-white p-6 rounded-xl shadow-sm border border-gray-200"> | |
| <div class="flex items-center gap-4"> | |
| <div class="p-3 bg-indigo-50 rounded-lg text-primary"> | |
| <i data-feather="package" class="w-6 h-6"></i> | |
| </div> | |
| <div> | |
| <p class="text-sm font-medium text-gray-500">Total Pedidos</p> | |
| <h3 class="text-2xl font-bold text-gray-900" id="kpi-total-orders">0</h3> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bg-white p-6 rounded-xl shadow-sm border border-gray-200"> | |
| <div class="flex items-center gap-4"> | |
| <div class="p-3 bg-emerald-50 rounded-lg text-emerald-600"> | |
| <i data-feather="dollar-sign" class="w-6 h-6"></i> | |
| </div> | |
| <div> | |
| <p class="text-sm font-medium text-gray-500">Vendas Pagas</p> | |
| <h3 class="text-2xl font-bold text-gray-900" id="kpi-paid-sales">R$ 0,00</h3> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bg-white p-6 rounded-xl shadow-sm border border-gray-200"> | |
| <div class="flex items-center gap-4"> | |
| <div class="p-3 bg-blue-50 rounded-lg text-blue-600"> | |
| <i data-feather="pie-chart" class="w-6 h-6"></i> | |
| </div> | |
| <div> | |
| <p class="text-sm font-medium text-gray-500">Taxa Conversão</p> | |
| <h3 class="text-2xl font-bold text-gray-900" id="kpi-conversion-rate">0%</h3> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bg-white p-6 rounded-xl shadow-sm border border-gray-200"> | |
| <div class="flex items-center gap-4"> | |
| <div class="p-3 bg-purple-50 rounded-lg text-purple-600"> | |
| <i data-feather="tag" class="w-6 h-6"></i> | |
| </div> | |
| <div> | |
| <p class="text-sm font-medium text-gray-500">UTMs Únicas</p> | |
| <h3 class="text-2xl font-bold text-gray-900" id="kpi-unique-utms">0</h3> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- Table Section --> | |
| <section class="bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden min-h-[400px]"> | |
| <div class="p-6 border-b border-gray-200 flex justify-between items-center"> | |
| <h2 class="text-lg font-bold text-gray-900">Detalhamento por UTM</h2> | |
| <div class="flex items-center gap-2 text-sm text-gray-500"> | |
| <span>Ordernar por:</span> | |
| <select id="sort-select" class="border-none bg-transparent font-medium text-primary focus:ring-0 cursor-pointer"> | |
| <option value="totalVendas">Vendas (Desc)</option> | |
| <option value="taxaPagamento">Taxa Pagamento (Desc)</option> | |
| <option value="totalPedidos">Pedidos (Desc)</option> | |
| </select> | |
| </div> | |
| </div> | |
| <!-- Loading State --> | |
| <div id="table-loading" class="flex flex-col items-center justify-center p-12"> | |
| <div class="animate-spin rounded-full h-10 w-10 border-b-2 border-primary mb-4"></div> | |
| <p class="text-gray-500">Processando dados dos pedidos...</p> | |
| </div> | |
| <!-- Empty State --> | |
| <div id="table-empty" class="hidden flex flex-col items-center justify-center p-12 text-center"> | |
| <div class="p-4 bg-gray-100 rounded-full mb-4"> | |
| <i data-feather="inbox" class="w-8 h-8 text-gray-400"></i> | |
| </div> | |
| <h3 class="text-lg font-medium text-gray-900">Nenhum dado encontrado</h3> | |
| <p class="text-gray-500 max-w-sm mt-1">Selecione um período e clique em "Atualizar Dados" para visualizar o relatório.</p> | |
| </div> | |
| <!-- Data Table --> | |
| <div class="overflow-x-auto"> | |
| <table class="w-full text-left border-collapse hidden" id="data-table"> | |
| <thead> | |
| <tr class="bg-gray-50 text-gray-500 text-xs uppercase tracking-wider"> | |
| <th class="p-4 font-semibold cursor-pointer hover:bg-gray-100 transition-colors group" onclick="app.handleSort('utmContent')"> | |
| Campanha <i data-feather="chevrons-up-down" class="w-3 h-3 inline ml-1 opacity-50 group-hover:opacity-100"></i> | |
| </th> | |
| <th class="p-4 font-semibold text-right">Pedidos (Pagos/Total)</th> | |
| <th class="p-4 font-semibold text-center">Clientes Únicos</th> | |
| <th class="p-4 font-semibold text-right cursor-pointer hover:bg-gray-100 transition-colors group" onclick="app.handleSort('totalVendas')"> | |
| Total Vendas <i data-feather="chevrons-up-down" class="w-3 h-3 inline ml-1 opacity-50 group-hover:opacity-100"></i> | |
| </th> | |
| <th class="p-4 font-semibold text-right cursor-pointer hover:bg-gray-100 transition-colors group" onclick="app.handleSort('vendasPagas')"> | |
| Vendas Pagas <i data-feather="chevrons-up-down" class="w-3 h-3 inline ml-1 opacity-50 group-hover:opacity-100"></i> | |
| </th> | |
| <th class="p-4 font-semibold text-center cursor-pointer hover:bg-gray-100 transition-colors group" onclick="app.handleSort('taxaPagamento')"> | |
| Taxa Pagamento <i data-feather="chevrons-up-down" class="w-3 h-3 inline ml-1 opacity-50 group-hover:opacity-100"></i> | |
| </th> | |
| </tr> | |
| </thead> | |
| <tbody class="divide-y divide-gray-100 text-sm" id="table-body"> | |
| <!-- Rows injected via JS --> | |
| </tbody> | |
| <tfoot class="bg-gray-50 font-semibold text-gray-900 text-sm"> | |
| <tr id="table-footer"> | |
| <!-- Footer totals injected via JS --> | |
| </tr> | |
| </tfoot> | |
| </table> | |
| </div> | |
| </section> | |
| <footer class="mt-12 mb-6 text-center text-sm text-gray-400"> | |
| © 2023 UTM Analytics Pro. Todos os direitos reservados. | |
| </footer> | |
| </main> | |
| </div> | |
| </div> | |
| <!-- Scripts --> | |
| <script src="components/sidebar.js"></script> | |
| <script src="components/header.js"></script> | |
| <script src="script.js"></script> | |
| <script> | |
| feather.replace(); | |
| </script> | |
| <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script> | |
| </body> | |
| </html> |