/* static/css/base.css */ /** * ====================== * ESTILOS BASE * ====================== */ /* Reset e configurações básicas */ * { box-sizing: border-box; } body { font-family: 'Arial', sans-serif; background-color: var(--background-color); color: var(--text-color); margin: 0; padding: 0; transition: background-color var(--transition-normal), color var(--transition-normal); line-height: 1.6; } /* Scrollbars globais */ ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-thumb { background-color: var(--scrollbar-thumb); border-radius: var(--spacing-sm); } ::-webkit-scrollbar-track { background-color: var(--scrollbar-track); } /* Estados de foco acessíveis */ *:focus { outline: 2px solid var(--primary-color); outline-offset: 2px; } /* Seleção de texto */ ::selection { background-color: var(--primary-color); color: var(--count-tag-text-color); } /* Prevenção de seleção durante drag */ .no-select { user-select: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; } /* Estados de cursor durante drag */ body.dragging * { cursor: grabbing !important; } /* Responsividade base */ @media (max-width: 768px) { body { font-size: 14px; } } /* Utilitários de display */ .hidden { display: none !important; } .visible { display: block !important; } /* Utilitários de posicionamento */ .fixed { position: fixed; } .relative { position: relative; } .absolute { position: absolute; } /* Utilitários de flexbox */ .flex { display: flex; } .flex-column { flex-direction: column; } .justify-center { justify-content: center; } .align-center { align-items: center; } .justify-between { justify-content: space-between; } /* Utilitários de espaçamento */ .m-0 { margin: 0; } .p-0 { padding: 0; } .m-sm { margin: var(--spacing-sm); } .p-sm { padding: var(--spacing-sm); } .m-md { margin: var(--spacing-md); } .p-md { padding: var(--spacing-md); } .m-lg { margin: var(--spacing-lg); } .p-lg { padding: var(--spacing-lg); } /* Utilitários de texto */ .text-center { text-align: center; } .text-left { text-align: left; } .text-right { text-align: right; } .font-bold { font-weight: bold; } .font-normal { font-weight: normal; } /* Utilitários de cores */ .text-primary { color: var(--primary-color); } .text-muted { color: var(--card-text-color); } /* Utilitários de bordas */ .rounded-sm { border-radius: var(--radius-sm); } .rounded-md { border-radius: var(--radius-md); } .rounded-lg { border-radius: var(--radius-lg); } .rounded-full { border-radius: var(--radius-full); } /* Utilitários de sombras */ .shadow-sm { box-shadow: 0 1px 3px var(--shadow-color); } .shadow-md { box-shadow: 0 4px 8px var(--shadow-color); } .shadow-lg { box-shadow: 0 8px 16px var(--shadow-color); } /* static/css/components.css */ /** * ====================== * COMPONENTES DA INTERFACE * ====================== */ /* Cabeçalho dos cards */ .card-header { display: flex; justify-content: space-between; align-items: center; position: relative; margin-bottom: var(--spacing-sm); } /* Botão de menu dos cards */ .menu-button { background: none; border: none; cursor: pointer; color: var(--text-color); position: relative; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; } .menu-button i { color: var(--text-color); } .menu-button:hover { color: var(--count-tag-background); } .menu-button::before { content: ''; position: absolute; top: -8px; right: -8px; bottom: -8px; left: -8px; } /* Menu dropdown dos cards */ .card-menu { position: absolute; top: 32px; right: 0; background-color: var(--card-background); border: 1px solid var(--border-color); z-index: 1000; min-width: 150px; box-shadow: 0 2px 5px var(--shadow-color); } .menu-item { padding: 10px; cursor: pointer; color: var(--text-color); } .menu-item:hover { background-color: var(--menu-item-hover-bg); } /* Informações do agente */ .agent-info { font-size: 12px; color: var(--card-text-color); position: sticky; bottom: 0; right: var(--spacing-md); pointer-events: none; font-style: italic; opacity: 0.8; } /* Botão de refresh - posicionamento correto */ .refresh-container { position: fixed; bottom: 20px; right: 20px; z-index: 1000; } .refresh-button { background-color: var(--count-tag-background); color: var(--count-tag-text-color); border: none; padding: 15px; font-size: 16px; border-radius: var(--radius-full); cursor: pointer; transition: all var(--transition-normal); box-shadow: 0 4px 6px var(--shadow-color); display: flex; align-items: center; justify-content: center; width: 60px; height: 60px; } .refresh-button:hover { background-color: var(--count-tag-background); box-shadow: 0 6px 8px var(--shadow-color); transform: translateY(-2px); } .refresh-button:active { transform: translateY(1px); box-shadow: 0 2px 4px var(--shadow-color); } .refresh-button:disabled { background-color: var(--border-color); cursor: not-allowed; box-shadow: none; transform: none; } /* Botão de download - posicionamento correto */ .download-container { position: fixed; bottom: 20px; right: 90px; z-index: 1000; } .download-button { background-color: rgba(0,123,255,0.1); border: none; border-radius: var(--radius-full); padding: 10px; color: white; cursor: pointer; transition: background-color var(--transition-normal); } .download-button:hover { background-color: var(--count-tag-background); box-shadow: 0 6px 8px var(--shadow-color); transform: translateY(-2px); } /* Tabs do Kanban */ #tabs-container { margin-bottom: 20px; } .kanban-tabs { display: flex; list-style: none; padding: 0; margin: 0; border-bottom: 1px solid #ccc; overflow-x: auto; } .kanban-tab { padding: 10px 20px; cursor: pointer; border: none; background: none; outline: none; border-bottom: 2px solid transparent; font-size: 16px; transition: border-color 0.3s; flex-shrink: 0; } .kanban-tab:hover { border-color: #aaa; } .kanban-tab.active { border-bottom: 2px solid #007bff; font-weight: bold; color: #007bff; } /* Responsividade dos componentes */ @media (max-width: 768px) { .action-buttons { bottom: var(--spacing-sm); right: var(--spacing-sm); } .refresh-button, .download-button { width: 50px; height: 50px; } .card-menu { min-width: 120px; } .menu-item { padding: var(--spacing-sm); font-size: 13px; } .kanban-tab { padding: var(--spacing-sm) var(--spacing-md); font-size: 14px; } } /* Tema escuro para componentes */ @media (prefers-color-scheme: dark) { .refresh-button { background-color: var(--count-tag-background); color: var(--count-tag-text-color); } .download-button { background-color: rgba(0,123,255,0.1); color: white; } .download-button:hover { background-color: var(--count-tag-background); } .card-menu { background-color: var(--card-background); border-color: var(--border-color); box-shadow: 0 4px 12px rgba(55,158,255,0.2); } .menu-item { color: var(--text-color); border-color: var(--border-color); } .menu-item:hover { background-color: var(--menu-item-hover-bg); } } /* static/css/filters.css */ /** * ====================== * SISTEMA DE FILTROS * ====================== */ /* Container principal dos filtros - MINIMALISTA */ .filters-container { margin-bottom: 16px; display: flex; gap: 12px; align-items: center; padding: 0; flex-wrap: wrap; } /* Container dos filtros principais - COMPACTO */ .filters-left { display: flex; gap: 12px; align-items: center; background: rgba(255, 255, 255, 0.95); padding: 12px 16px; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.08); border: 1px solid rgba(0,0,0,0.06); flex: 1; min-height: 48px; } @media (max-width: 768px) { .filters-container { flex-direction: column; gap: 8px; align-items: stretch; } .filters-left { flex-direction: column; gap: 8px; padding: 12px; } } /* Grupos de filtros - MINIMALISTA */ .filter-group { display: flex; align-items: center; gap: 8px; padding: 0; margin: 0; } .filter-group.search-group { flex: 1; max-width: 300px; } /* Headers ocultos para design minimalista */ .filter-header { display: none; } /* Labels compactos */ .filter-label { font-size: 12px; color: #6b7280; font-weight: 500; margin: 0 12px 0 0; white-space: nowrap; } /* Wrapper para elementos com ícones */ .filter-wrapper { position: relative; display: block; } /* Wrapper para elementos com ícones melhorado */ .filter-wrapper { position: relative; display: block; } /* Select compacto */ .filter-select { appearance: none; -webkit-appearance: none; -moz-appearance: none; width: 220px; padding: 8px 28px 8px 12px; border: 1px solid #e5e7eb; border-radius: 6px; background: white; font-size: 13px; color: #374151; cursor: pointer; transition: all 0.2s ease; } .filter-select:hover { border-color: #d1d5db; } .filter-select:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1); } /* Ícone dropdown compacto */ .dropdown-icon { position: absolute; right: 8px; top: 50%; transform: translateY(-50%); color: #9ca3af; width: 16px; height: 16px; pointer-events: none; } /* Wrapper da busca compacto */ .search-wrapper { position: relative; display: flex; align-items: center; flex: 1; max-width: 300px; } /* Input de busca compacto */ .search-input { width: 100%; padding: 10px 16px 10px 33px; font-size: 13px; color: #374151; background: white; border: 1px solid #e5e7eb; border-radius: 6px; transition: all 0.2s ease; line-height: 1.2; min-height: 40px; box-sizing: border-box; } .search-input:hover { border-color: #d1d5db; } .search-input:focus { outline: none; border-color: #10b981; box-shadow: 0 0 0 2px rgba(16, 185, 129, 0.1); } .search-input::placeholder { color: #9ca3af; } /* Ícone de busca compacto */ .search-icon { position: relative; left: 25px; top: 50%; color: #9ca3af; width: 16px; height: 16px; pointer-events: none; z-index: 2; flex-shrink: 0; } #admin-filters #search-input { font-size: 14px; background-color: var(--card-background); color: var(--text-color); border: 0 solid var(--border-color); border-radius: var(--radius-sm); transition: border-color var(--transition-fast), box-shadow var(--transition-fast); } /* Botão de limpar compacto */ .clear-button { position: relative; right: 30px; background: none; border: none; color: #9ca3af; cursor: pointer; padding: 4px; border-radius: 4px; display: none; transition: all 0.2s ease; z-index: 2; width: 24px; height: 24px; align-items: center; justify-content: center; } .clear-button:hover { color: #6b7280; } .clear-button.show { display: flex; align-items: center; justify-content: center; } /* Texto de ajuda oculto */ .filter-hint { display: none; } /* Container de filtros de agentes */ .agent-filters-container { background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%); padding: var(--spacing-lg); border-radius: var(--radius-lg); box-shadow: 0 4px 12px rgba(0,0,0,0.08); border: 1px solid #e9ecef; min-width: 300px; max-width: 350px; } /* Grupo de filtros de agentes - MINIMALISTA */ .agent-filters-group { display: flex; align-items: center; gap: 8px; padding: 0; margin: 0; } /* Container de checkboxes compacto */ .agent-checkbox-container { display: flex; flex-wrap: wrap; gap: 4px; padding: 0; margin: 0; background: none; border: none; max-height: none; overflow: visible; box-shadow: none; } /* Controles de seleção compactos */ .agent-selection-controls { display: flex; gap: 4px; margin: 0; } .agent-control-button { font-size: 11px; color: #6b7280; background: none; border: none; padding: 2px 6px; cursor: pointer; border-radius: 3px; transition: all 0.2s ease; font-weight: 500; } .agent-control-button:hover { background: #f3f4f6; color: #374151; } .agent-control-button.select-all { color: #3b82f6; } .agent-control-button.select-all:hover { background: #eff6ff; color: #2563eb; } /* Labels de checkbox compactos */ .checkbox-label { display: flex; align-items: center; gap: 4px; padding: 2px 6px; border-radius: 4px; cursor: pointer; transition: all 0.2s ease; user-select: none; border: 1px solid transparent; background: #f8fafc; font-size: 12px; } .checkbox-label:hover { background-color: #e2e8f0; transform: none; } /* Checkbox de agente compacto */ .agent-checkbox { width: 14px; height: 14px; cursor: pointer; accent-color: #3b82f6; } /* Nome do agente compacto */ .agent-name { font-size: 12px; color: #64748b; font-weight: 500; } /* Container de estatísticas - MINIMALISTA */ .total-contacts-container { display: flex; align-items: center; gap: 6px; padding: 8px 12px; background: var(--surface-color, #f8fafc); border-radius: 6px; border: 1px solid var(--border-color, #e2e8f0); color: var(--text-muted, #64748b); font-size: 13px; min-width: auto; } .total-contacts-icon { color: var(--text-muted, #64748b); width: 14px; height: 14px; opacity: 0.7; } .total-contacts-text { font-weight: 500; font-size: 13px; color: var(--text-muted, #64748b); } /* Controles de seleção */ .selection-controls { display: flex; gap: 12px; margin-bottom: 16px; } .control-button { flex: 1; padding: var(--spacing-sm) 16px; font-size: 12px; background: #f3f4f6; border: 1px solid #e5e7eb; border-radius: 6px; cursor: pointer; transition: all var(--transition-fast); font-weight: 500; } .control-button.select-all { color: #8b5cf6; } .control-button.clear-all { color: #6b7280; } .control-button:hover { background: #e5e7eb; } /* Container de checkboxes */ .checkbox-container { display: flex; flex-direction: column; gap: var(--spacing-sm); background: white; padding: 16px; border-radius: var(--radius-md); border: 1px solid #e5e7eb; max-height: 200px; overflow-y: auto; box-shadow: inset 0 1px 3px rgba(0,0,0,0.1); } /* Labels de checkbox */ .checkbox-label { display: flex; align-items: center; gap: 12px; padding: var(--spacing-sm) 12px; border-radius: 6px; cursor: pointer; transition: all var(--transition-fast); user-select: none; border: 1px solid transparent; } .checkbox-label:hover { background-color: #f8fafc; border-color: #e2e8f0; } /* Checkbox de agente */ .agent-checkbox { width: 18px; height: 18px; cursor: pointer; accent-color: #8b5cf6; border-radius: var(--radius-sm); } /* Nome do agente */ .agent-name { font-size: 14px; color: #374151; font-weight: 500; } /* Container de estatísticas */ .stats-container { display: flex; align-items: center; justify-content: center; gap: 12px; padding: 16px var(--spacing-xl); background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: var(--radius-lg); box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4); margin-top: 16px; color: white; min-height: 60px; } .stats-icon { width: 24px; height: 24px; color: white; opacity: 0.9; } .total-contacts { font-weight: 600; font-size: 18px; color: white; text-shadow: 0 1px 3px rgba(0,0,0,0.3); } .stats-separator { width: 1px; height: 30px; background: rgba(255,255,255,0.3); } .filter-status-icon { width: 20px; height: 20px; color: white; opacity: 0.7; } .filter-status-text { font-size: 14px; color: white; opacity: 0.9; } /* Responsividade dos filtros */ @media (max-width: 768px) { .filters-row { flex-direction: column; gap: 16px; } .filters-left { min-width: auto; flex-direction: column; gap: 16px; padding: var(--spacing-lg); } .filter-group { min-width: auto; } .filter-group.search-group { min-width: auto; } .agent-filters-container { min-width: auto; max-width: none; } .search-input { padding: 10px 40px 10px 44px; } .stats-container { flex-direction: column; gap: var(--spacing-sm); text-align: center; min-height: auto; padding: var(--spacing-lg); } .stats-separator { width: 30px; height: 1px; } } /* Tema escuro para filtros */ @media (prefers-color-scheme: dark) { .filters-left { background: linear-gradient(135deg, #26292b 0%, #1c1f21 100%); border-color: #555; } .filter-select, .search-input { background: #26292b; border-color: #555; color: #d7dbdf; } .filter-select:focus, .search-input:focus { border-color: #017ff8; } .filter-label, .agent-name { color: #d7dbdf; } .filter-hint { color: #999; } .agent-filters-container { background: linear-gradient(135deg, #26292b 0%, #1c1f21 100%); border-color: #555; } .checkbox-container { background: #26292b; border-color: #555; } .checkbox-label:hover { background-color: #333; border-color: #666; } .control-button { background: #333; border-color: #555; color: #d7dbdf; } .control-button:hover { background: #444; } .clear-button { background: #333; color: #999; } .clear-button:hover { background: #444; color: #d7dbdf; } .search-input::placeholder { color: #6b7280; } .total-contacts-container { background: #26292b; border-color: #555; color: #d7dbdf; } .total-contacts-icon { color: #d7dbdf; } .total-contacts-text { color: #d7dbdf; } } /* Estados de foco aprimorados */ .filter-select:focus-visible, .search-input:focus-visible { outline: 2px solid var(--primary-color); outline-offset: 2px; } .checkbox-label:focus-visible { outline: 2px solid var(--primary-color); outline-offset: -2px; } /* Estados de carregamento */ .filters-container.loading { opacity: 0.6; pointer-events: none; } .filters-container.loading::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(255,255,255,0.8); z-index: 10; } /* static/css/kanban.css */ /** * ====================== * ESTILOS DO KANBAN * ====================== */ /* Layout principal do Kanban */ .kanban-board { display: flex; flex-wrap: nowrap; justify-content: flex-start; padding: 20px; gap: 20px; overflow-x: auto; scroll-behavior: smooth; } /* Colunas do Kanban */ .kanban-column { flex: 0 0 auto; width: 350px; background-color: var(--column-background); border-radius: 8px; padding: 15px; box-shadow: 0 4px 8px var(--shadow-color); height: 82vh; overflow-y: auto; overflow-x: hidden; position: relative; transition: background-color 0.3s, box-shadow 0.3s; } /* Scrollbars das colunas */ .kanban-column::-webkit-scrollbar { width: 6px; } .kanban-column::-webkit-scrollbar-thumb { background-color: var(--scrollbar-thumb); border-radius: 10px; } .kanban-column::-webkit-scrollbar-track { background-color: var(--scrollbar-track); } .kanban-board::-webkit-scrollbar { height: 16px; width: 6px; } .kanban-board::-webkit-scrollbar:horizontal { height: 16px; } .kanban-board::-webkit-scrollbar-thumb { background-color: var(--scrollbar-thumb); border-radius: 10px; } .kanban-board::-webkit-scrollbar-thumb:horizontal { background-color: var(--scrollbar-thumb); border-radius: 10px; min-width: 20px; } .kanban-board::-webkit-scrollbar-track { background-color: var(--scrollbar-track); } .kanban-board::-webkit-scrollbar-track:horizontal { background-color: var(--scrollbar-track); } /* Cabeçalho das colunas */ .column-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; } .kanban-column h2 { margin: 0; color: var(--text-color); font-size: 1.5rem; transition: color 0.3s; } /* Tags de contagem */ .count-tag { background-color: var(--background-color); color: var(--text-color); padding: 5px 10px; font-weight: bold; min-width: 14px; text-align: center; border-radius: 8px; font-size: 12px; opacity: 0.8; } /* Cards do Kanban */ .kanban-card { background-color: var(--card-background); border-radius: 8px; padding: 15px; margin-bottom: 10px; box-shadow: 0 2px 5px var(--shadow-color); cursor: grab; color: var(--card-text-color); display: flex; flex-direction: column; position: relative; user-select: none; touch-action: none; } .kanban-card:active { cursor: grabbing; } /* Estados de drag */ .sortable-drag, .sortable-chosen, .sortable-ghost, .kanban-card:active { cursor: grabbing !important; } .sortable-ghost { opacity: 0.5; background-color: var(--column-background); border: 1.5px dashed var(--text-color); box-shadow: 0 4px 6px var(--shadow-color); cursor: grab; } /* Estados globais de dragging */ body.dragging * { cursor: grabbing !important; } /* Card destacado */ .kanban-card.highlighted-card { position: relative; z-index: 10; transform: scale(1.03); box-shadow: 0 0 10px rgba(0,0,0,0.15); } .kanban-card.highlighted-card::before { content: ''; position: absolute; top: -5px; left: -5px; right: -5px; bottom: -5px; border: 2px solid #ff9900; border-radius: 5px; pointer-events: none; z-index: -1; } /* Conteúdo dos cards */ .kanban-card h3 { margin: 0 0 10px; font-size: 1.25rem; color: var(--text-color); opacity: 0.8; } .kanban-card p { margin: 5px 0; font-size: 0.9rem; color: var(--card-text-color); } /* Tags de status */ .status-tag { display: inline-block; padding: 5px 10px; border-radius: 50px; color: white; font-size: 0.8rem; margin-top: 5px; text-transform: capitalize; max-width: 1px; } /* Container de tags */ .tag-container { display: flex; gap: 5px; margin-top: 10px; justify-content: flex-end; } .tag-circle { width: 12px; height: 12px; border-radius: 50%; display: inline-block; cursor: pointer; opacity: 0.5; } .tag-circle:hover { box-shadow: 0 0 5px rgba(0,0,0,0.5); } /* Cores das tags de status */ .dark-blue { background-color: #34495e; } .dark-cyan { background-color: #16a085; } .dark-pink { background-color: #e84393; } .dark-orange { background-color: #e67e22; } .dark-purple { background-color: #8e44ad; } .dark-green { background-color: #27ae60; } /* Bordas das colunas por cor */ .border-dark-blue { border-top: 4px solid #34495e; } .border-dark-cyan { border-top: 4px solid #16a085; } .border-dark-pink { border-top: 4px solid #e84393; } .border-dark-orange { border-top: 4px solid #e67e22; } .border-dark-purple { border-top: 4px solid #8e44ad; } .border-dark-green { border-top: 4px solid #27ae60; } /* Mensagem quando não há colunas */ .no-columns-message { text-align: center; color: var(--card-text-color); font-style: italic; padding: var(--spacing-xl); background-color: var(--column-background); border-radius: var(--radius-md); border: 2px dashed var(--border-color); margin: var(--spacing-lg); } /* Responsividade do Kanban */ @media (max-width: 768px) { .kanban-board { flex-wrap: wrap; justify-content: space-between; padding: 10px; } .kanban-column { max-height: none; } } /* Tema escuro específico para Kanban */ @media (prefers-color-scheme: dark) { .sortable-ghost { background-color: var(--card-background); border: 2px dashed var(--text-color); } .no-columns-message { background-color: var(--column-background); border-color: var(--border-color); } } /* static/css/main.css */ /** * ====================== * CSS PRINCIPAL MODULAR * ====================== * * Este arquivo importa todos os módulos CSS em ordem de prioridade. * Estrutura modular para melhor manutenibilidade e organização. */ /* 1. Variáveis e configurações globais */ @import url('./variables.css'); /* 2. Reset e estilos base */ @import url('./base.css'); /* 3. Layout principal do Kanban */ @import url('./kanban.css'); /* 4. Componentes da interface */ @import url('./components.css'); /* 5. Modais e overlays */ @import url('./modals.css'); /* 6. Sistema de filtros */ @import url('./filters.css'); /** * ====================== * COMPATIBILIDADE LEGACY * ====================== * * Estilos específicos que ainda não foram categorizados * ou que precisam de compatibilidade com código existente */ /* Estilos inline do HTML que foram movidos aqui */ #admin-filters.filters-container { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; padding: var(--spacing-sm) var(--spacing-md); margin-bottom: 0; background-color: var(--column-background); border: 0 solid var(--border-color); border-radius: var(--radius-sm); gap: var(--spacing-sm); } #admin-filters .filters-left { display: flex; align-items: center; flex-wrap: wrap; gap: var(--spacing-sm); } #admin-filters #search-input::placeholder { color: var(--card-text-color); } #admin-filters #search-input:focus { outline: none; border-color: var(--count-tag-background); box-shadow: 0 0 0 3px var(--shadow-color); } #checkbox-container.checkbox-container { display: flex; flex-wrap: wrap; gap: var(--spacing-sm); } .checkbox-label { display: flex; align-items: center; font-size: 14px; color: var(--text-color); cursor: pointer; background-color: var(--card-background); border: 0 solid var(--border-color); padding: var(--spacing-xs) var(--spacing-sm); border-radius: var(--radius-sm); transition: background-color var(--transition-fast), border-color var(--transition-fast); } .checkbox-label input[type="checkbox"] { margin-right: var(--spacing-xs); } .checkbox-label:hover { background-color: var(--scrollbar-track); border-color: var(--count-tag-background); } #total-contacts.total-contacts { font-size: 14px; font-weight: bold; color: var(--count-tag-background); margin-left: auto; } .agent-info { font-size: 12px; color: var(--card-text-color); margin-left: var(--spacing-xs); } /* Responsividade para compatibilidade */ @media (max-width: 600px) { #admin-filters.filters-container { flex-direction: column; align-items: flex-start; } #admin-filters .filters-left { flex-direction: column; align-items: flex-start; } #total-contacts.total-contacts { margin: 0; margin-top: var(--spacing-sm); text-align: left; } } /* Estilos críticos que podem ter sido perdidos */ .kanban-card { position: relative; /* transition: transform var(--transition-fast), box-shadow var(--transition-fast); */ } .kanban-card.highlighted-card { position: relative; z-index: 10; transform: scale(1.03); box-shadow: 0 0 10px rgba(0,0,0,0.15); } .kanban-card.highlighted-card::before { content: ''; position: absolute; top: -5px; left: -5px; right: -5px; bottom: -5px; border: 2px solid #ff9900; border-radius: 5px; pointer-events: none; z-index: -1; } /* Ensure proper positioning for main content */ #main-content { position: relative; } /** * ====================== * INFORMAÇÕES DA REFATORAÇÃO * ====================== */ /* Estrutura dos módulos CSS: 1. variables.css - Todas as variáveis CSS customizadas 2. base.css - Reset, estilos base e utilitários 3. kanban.css - Layout e estilos específicos do Kanban 4. components.css - Componentes reutilizáveis da interface 5. modals.css - Modais, overlays e animações 6. filters.css - Sistema completo de filtros Esta refatoração melhora: - Manutenibilidade do código - Reutilização de componentes - Organização lógica dos estilos - Performance de desenvolvimento - Facilidade de debugging */ /* static/css/modals.css */ /** * ====================== * MODAIS E OVERLAYS * ====================== */ /* Overlay do modal */ .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: var(--modal-overlay-bg); z-index: 200; display: flex; align-items: center; justify-content: center; animation: fadeIn var(--transition-fast) ease-out; } /* Conteúdo do modal */ .modal-content { background: var(--modal-content-bg); padding: var(--spacing-xl); width: 90%; max-width: 400px; border-radius: var(--radius-lg); text-align: center; color: var(--text-color); box-shadow: 0 10px 25px var(--shadow-color); animation: slideIn var(--transition-normal) ease-out; position: relative; } /* Título do modal */ .modal-content h3 { margin: 0 0 var(--spacing-lg); color: var(--text-color); font-size: 1.5rem; font-weight: 600; } /* Botões do modal */ .modal-content button { background-color: var(--primary-color); color: var(--count-tag-text-color); border: 1px solid var(--border-color); padding: 12px 24px; border-radius: var(--radius-md); cursor: pointer; font-size: 16px; font-weight: 500; transition: all var(--transition-fast); margin: var(--spacing-xs); min-width: 100px; } .modal-content button:hover { background-color: #006cd5; box-shadow: 0 4px 8px var(--shadow-color); transform: translateY(-1px); } .modal-content button:focus { outline: none; box-shadow: 0 0 0 3px rgba(1,127,248,0.3); } .modal-content button:active { transform: translateY(0); } /* Botão secundário do modal */ .modal-content button.secondary { background-color: transparent; color: var(--card-text-color); border: 2px solid var(--border-color); } .modal-content button.secondary:hover { background-color: var(--menu-item-hover-bg); color: var(--text-color); } /* Lista de colunas */ .column-list { list-style: none; padding: 0; margin: var(--spacing-lg) 0; max-height: 300px; overflow-y: auto; } .column-list li { padding: var(--spacing-md); cursor: pointer; border-bottom: 1px solid var(--border-color); color: var(--text-color); transition: all var(--transition-fast); border-radius: var(--radius-sm); margin-bottom: var(--spacing-xs); } .column-list li:last-child { border-bottom: none; margin-bottom: 0; } .column-list li:hover { background-color: var(--menu-item-hover-bg); transform: translateX(4px); box-shadow: 0 2px 4px var(--shadow-color); } /* Tela de carregamento */ #loading-screen { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(135deg, var(--shadow-color), var(--scrollbar-thumb)); display: flex; justify-content: center; align-items: center; z-index: 9999; font-family: 'Arial', sans-serif; color: white; } .loader-container { text-align: center; animation: fadeIn var(--transition-slow) ease-out; } .loader { display: inline-block; width: 80px; height: 80px; border: 4px solid rgba(255,255,255,0.3); border-radius: var(--radius-full); border-top-color: #fff; animation: spin 1s ease-in-out infinite; } #loading-text { margin-top: var(--spacing-lg); font-size: 1.2em; font-weight: 300; opacity: 0.9; animation: pulse 2s ease-in-out infinite; } /* Animações */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes slideIn { from { opacity: 0; transform: translateY(-30px) scale(0.9); } to { opacity: 1; transform: translateY(0) scale(1); } } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @keyframes pulse { 0%, 100% { opacity: 0.9; } 50% { opacity: 0.6; } } @keyframes gradient { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } /* Responsividade dos modais */ @media (max-width: 768px) { .modal-content { width: 95%; padding: var(--spacing-lg); margin: var(--spacing-sm); } .modal-content h3 { font-size: 1.3rem; } .modal-content button { padding: var(--spacing-sm) var(--spacing-lg); font-size: 14px; width: 100%; margin: var(--spacing-xs) 0; } .column-list { max-height: 200px; } .column-list li { padding: var(--spacing-sm); font-size: 14px; } .loader { width: 60px; height: 60px; } #loading-text { font-size: 1rem; } } /* Tema escuro para modais */ @media (prefers-color-scheme: dark) { .modal-content button { background-color: var(--primary-color); color: var(--count-tag-text-color); border-color: var(--border-color); } .modal-content button:hover { background-color: #006cd5; box-shadow: 0 4px 6px var(--shadow-color); } .modal-content button.secondary { background-color: transparent; color: var(--card-text-color); border-color: var(--border-color); } .modal-content button.secondary:hover { background-color: var(--menu-item-hover-bg); color: var(--text-color); } .column-list li { color: var(--text-color); border-color: var(--border-color); } .column-list li:hover { background-color: var(--menu-item-hover-bg); } #loading-screen { background: linear-gradient(135deg, #151718, #1c1f21); } } /* Estados de acessibilidade */ .modal-content button:focus-visible { outline: 2px solid var(--primary-color); outline-offset: 2px; } .column-list li:focus-visible { outline: 2px solid var(--primary-color); outline-offset: -2px; } /* Indicador de carregamento no botão */ .modal-content button.loading { position: relative; color: transparent; } .modal-content button.loading::after { content: ''; position: absolute; top: 50%; left: 50%; width: 16px; height: 16px; margin: -8px 0 0 -8px; border: 2px solid transparent; border-top-color: currentColor; border-radius: var(--radius-full); animation: spin 0.8s linear infinite; } /* static/css/variables.css */ /** * ====================== * VARIÁVEIS CSS GLOBAIS * ====================== */ :root { /* Cores principais */ --background-color: #f1f3f5; --text-color: #2c3e50; --primary-color: #0090ff; /* Cores de superfície */ --column-background: #f8f9fa; --card-background: #ffffff; --card-text-color: #7f8c8d; /* Bordas e sombras */ --border-color: #bdc3c7; --shadow-color: rgba(0,0,0,0.1); --shadow-hover: rgba(0,0,0,0.15); /* Scrollbars */ --scrollbar-thumb: #bdc3c7; --scrollbar-track: #ecf0f1; /* Tags e contadores */ --count-tag-background: #0090ff; --count-tag-text-color: #fff; /* Interações */ --menu-item-hover-bg: #f0f0f0; --button-hover-transform: translateY(-2px); /* Modais */ --modal-overlay-bg: rgba(0,0,0,0.5); --modal-content-bg: #ffffff; /* Animações */ --transition-fast: 0.2s ease; --transition-normal: 0.3s ease; --transition-slow: 0.5s ease; /* Espacamentos */ --spacing-xs: 5px; --spacing-sm: 10px; --spacing-md: 15px; --spacing-lg: 20px; --spacing-xl: 24px; /* Bordas arredondadas */ --radius-sm: 4px; --radius-md: 8px; --radius-lg: 12px; --radius-full: 50%; /* Tamanhos */ --column-width: 300px; --button-size: 60px; --card-padding: 15px; --column-height: 82vh; } /* Tema escuro */ @media (prefers-color-scheme: dark) { :root { --background-color: #151718; --text-color: #d7dbdf; --column-background: #1c1f21; --card-background: #26292b; --card-text-color: #d7dbdf; --border-color: #017ff8; --shadow-color: rgba(55,158,255,0.1); --shadow-hover: rgba(55,158,255,0.2); --scrollbar-thumb: #555; --scrollbar-track: #1c1f21; --count-tag-background: #0090ff; --count-tag-text-color: #ffffff; --menu-item-hover-bg: #333; --modal-overlay-bg: rgba(0,0,0,0.75); --modal-content-bg: #26292b; } }