/* ========================================================================== CSS GLOBAL & VARIÁVEIS (DESIGN SYSTEM PREMIUM) ========================================================================== */ :root { /* Dark theme (default) */ --bg-primary: #0d0d0d; --bg-secondary: #171717; --bg-tertiary: #212121; --bg-accent: #2f2f2f; --text-primary: #ececec; --text-secondary: #b4b4b4; --text-muted: #9e9e9e; --brand-green: #10a37f; --brand-green-hover: #1a7f64; --brand-glow: rgba(16, 163, 127, 0.15); --error: #ef4444; --error-bg: rgba(239, 68, 68, 0.1); --success: #22c55e; --border-light: rgba(255, 255, 255, 0.08); --border-focus: rgba(16, 163, 127, 0.4); --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; --font-display: 'Outfit', var(--font-sans); --sidebar-width: 280px; --header-height: 56px; --max-chat-width: 768px; --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.05); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.5), 0 10px 10px -5px rgba(0, 0, 0, 0.04); --transition-fast: 0.15s ease; --transition-normal: 0.25s cubic-bezier(0.4, 0, 0.2, 1); --transition-slow: 0.4s cubic-bezier(0.4, 0, 0.2, 1); } /* LIGHT THEME */ [data-theme="light"] { --bg-primary: #f5f5f5; --bg-secondary: #ffffff; --bg-tertiary: #e8e8e8; --bg-accent: #dcdcdc; --text-primary: #1a1a1a; --text-secondary: #4a4a4a; --text-muted: #7a7a7a; --brand-green: #10a37f; --brand-green-hover: #0d8f6f; --brand-glow: rgba(16, 163, 127, 0.1); --border-light: rgba(0, 0, 0, 0.08); --border-focus: rgba(16, 163, 127, 0.4); --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.15), 0 4px 6px -2px rgba(0, 0, 0, 0.05); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.2), 0 10px 10px -5px rgba(0, 0, 0, 0.04); } * { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: var(--font-sans); background-color: var(--bg-primary); color: var(--text-primary); overflow: hidden; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; line-height: 1.5; height: 100vh; width: 100vw; } /* ========================================================================== TELA DE LOGIN ========================================================================== */ .login-body { display: flex; justify-content: center; align-items: center; background-color: #080808; position: relative; overflow: hidden; } .login-glow { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 600px; height: 600px; background: radial-gradient(circle, rgba(16, 163, 127, 0.12) 0%, rgba(0,0,0,0) 70%); z-index: 1; pointer-events: none; } .login-container { width: 100%; max-width: 420px; padding: 24px; z-index: 2; } .login-card { background: rgba(23, 23, 23, 0.65); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid var(--border-light); border-radius: 24px; padding: 40px 32px; box-shadow: var(--shadow-xl); display: flex; flex-direction: column; gap: 32px; transform: translateY(0); transition: transform var(--transition-slow), border-color var(--transition-normal); } .login-card:hover { border-color: rgba(16, 163, 127, 0.2); } .login-header { text-align: center; display: flex; flex-direction: column; align-items: center; gap: 16px; } .logo-orb { width: 64px; height: 64px; background: radial-gradient(135deg, var(--brand-green) 0%, #0c7359 100%); border-radius: 50%; display: flex; justify-content: center; align-items: center; box-shadow: 0 0 20px rgba(16, 163, 127, 0.4); margin-bottom: 8px; } .logo-inner { font-family: var(--font-display); font-size: 28px; font-weight: 700; color: #fff; user-select: none; } .login-header h1 { font-family: var(--font-display); font-size: 28px; font-weight: 700; letter-spacing: -0.5px; } .login-header p { color: var(--text-secondary); font-size: 14px; } .login-form { display: flex; flex-direction: column; gap: 24px; } .input-group { display: flex; flex-direction: column; gap: 8px; } .input-group label { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--text-muted); } .input-wrapper { position: relative; display: flex; align-items: center; } .input-wrapper input { width: 100%; background-color: var(--bg-primary); border: 1px solid var(--border-light); border-radius: 12px; padding: 14px 16px; padding-right: 48px; color: var(--text-primary); font-size: 16px; outline: none; font-family: var(--font-sans); transition: border-color var(--transition-fast), box-shadow var(--transition-fast); } .input-wrapper input:focus { border-color: var(--brand-green); box-shadow: 0 0 0 2px var(--brand-glow); } .toggle-password { position: absolute; right: 14px; background: none; border: none; color: var(--text-muted); cursor: pointer; display: flex; justify-content: center; align-items: center; padding: 4px; transition: color var(--transition-fast); } .toggle-password:hover { color: var(--text-primary); } .toggle-password svg { width: 20px; height: 20px; } .error-message { font-size: 13px; color: #f87171; background-color: var(--error-bg); border: 1px solid rgba(239, 68, 68, 0.2); border-radius: 8px; padding: 10px 14px; display: none; animation: fadeIn var(--transition-fast); } .error-message.visible { display: block; } .btn-submit { background-color: var(--brand-green); border: none; border-radius: 12px; color: white; font-size: 16px; font-weight: 600; padding: 14px; cursor: pointer; display: flex; justify-content: center; align-items: center; gap: 8px; box-shadow: 0 4px 12px rgba(16, 163, 127, 0.2); transition: background-color var(--transition-fast), transform var(--transition-fast), box-shadow var(--transition-fast); } .btn-submit:hover:not(:disabled) { background-color: var(--brand-green-hover); transform: translateY(-1px); box-shadow: 0 6px 16px rgba(16, 163, 127, 0.3); } .btn-submit:active:not(:disabled) { transform: translateY(0); } .btn-submit:disabled { opacity: 0.6; cursor: not-allowed; } .arrow-icon { width: 18px; height: 18px; transition: transform var(--transition-fast); } .btn-submit:hover:not(:disabled) .arrow-icon { transform: translateX(3px); } /* Animações Login */ .shake { animation: shakeAnimation 0.5s ease-in-out; } @keyframes shakeAnimation { 0%, 100% { transform: translateX(0); } 20%, 60% { transform: translateX(-6px); } 40%, 80% { transform: translateX(6px); } } @keyframes fadeIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } } /* ========================================================================== INTERFÁCIL PRINCIPAL - LAYOUT ========================================================================== */ .app-container { display: flex; width: 100vw; height: 100vh; position: relative; } /* Menu Lateral / Sidebar */ .sidebar { width: var(--sidebar-width); background-color: var(--bg-secondary); border-right: 1px solid var(--border-light); display: flex; flex-direction: column; height: 100%; z-index: 10; flex-shrink: 0; transition: transform var(--transition-slow); } .sidebar-header { padding: 16px; display: flex; align-items: center; gap: 12px; border-bottom: 1px solid var(--border-light); } .btn-new-chat { flex: 1; background-color: transparent; border: 1px solid var(--border-light); border-radius: 8px; color: var(--text-primary); font-size: 14px; font-weight: 500; padding: 10px 14px; cursor: pointer; display: flex; align-items: center; gap: 10px; transition: background-color var(--transition-fast), border-color var(--transition-fast); } .btn-new-chat:hover { background-color: var(--bg-accent); border-color: rgba(255, 255, 255, 0.15); } .btn-new-chat svg { width: 16px; height: 16px; } .btn-close-sidebar { background: none; border: none; color: var(--text-secondary); cursor: pointer; padding: 6px; border-radius: 6px; display: none; /* Apenas no mobile */ align-items: center; justify-content: center; transition: background-color var(--transition-fast), color var(--transition-fast); } .btn-close-sidebar:hover { background-color: var(--bg-accent); color: var(--text-primary); } .btn-close-sidebar svg { width: 20px; height: 20px; } /* Histórico de Chat */ .chat-history { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 20px; } .chat-history::-webkit-scrollbar { width: 4px; } .chat-history::-webkit-scrollbar-thumb { background-color: rgba(255, 255, 255, 0.05); border-radius: 2px; } .chat-history::-webkit-scrollbar-thumb:hover { background-color: rgba(255, 255, 255, 0.15); } /* Busca no Histórico */ .sidebar-search { padding: 12px 16px 0; } .sidebar-search-wrapper { display: flex; align-items: center; gap: 8px; background-color: var(--bg-tertiary); border: 1px solid var(--border-light); border-radius: 10px; padding: 8px 12px; transition: border-color var(--transition-fast); } .sidebar-search-wrapper:focus-within { border-color: var(--border-focus); } .search-icon { width: 16px; height: 16px; color: var(--text-muted); flex-shrink: 0; } .search-input { flex: 1; background: none; border: none; outline: none; color: var(--text-primary); font-size: 13px; font-family: var(--font-sans); min-width: 0; } .search-input::placeholder { color: var(--text-muted); } .search-clear { background: none; border: none; color: var(--text-muted); cursor: pointer; padding: 2px; display: flex; align-items: center; border-radius: 4px; flex-shrink: 0; transition: color var(--transition-fast), background-color var(--transition-fast); } .search-clear:hover { color: var(--text-primary); background-color: rgba(255,255,255,0.05); } .search-clear svg { width: 14px; height: 14px; } /* Tags de filtro */ .sidebar-tags { display: flex; flex-wrap: wrap; gap: 6px; padding: 10px 16px 0; } .tag-filter { background-color: var(--bg-tertiary); border: 1px solid var(--border-light); border-radius: 20px; color: var(--text-secondary); font-size: 11.5px; font-weight: 500; padding: 5px 10px; cursor: pointer; white-space: nowrap; transition: all var(--transition-fast); font-family: var(--font-sans); } .tag-filter:hover { background-color: var(--bg-accent); color: var(--text-primary); } .tag-filter.active { background-color: var(--brand-green); border-color: var(--brand-green); color: white; } /* Busca results header */ .search-results-header { padding-bottom: 8px; } .search-results-info { display: flex; align-items: center; justify-content: space-between; font-size: 12px; color: var(--text-muted); } .search-clear-all { background: none; border: none; color: var(--brand-green); cursor: pointer; font-size: 12px; font-family: var(--font-sans); padding: 2px 6px; border-radius: 4px; transition: background-color var(--transition-fast); } .search-clear-all:hover { background-color: var(--brand-glow); } .history-group h3 { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--text-muted); margin-bottom: 8px; padding-left: 8px; } .history-items { display: flex; flex-direction: column; gap: 4px; } .history-item { display: flex; align-items: center; justify-content: space-between; padding: 8px 10px; border-radius: 8px; cursor: pointer; color: var(--text-primary); font-size: 13.5px; gap: 8px; text-decoration: none; position: relative; transition: background-color var(--transition-fast); group-hover: opacity 1; } .history-item:hover { background-color: var(--bg-tertiary); } .history-item.active { background-color: var(--bg-accent); font-weight: 500; } .history-item.pinned { border-left: 2px solid var(--brand-green); padding-left: 8px; } .history-item-content { display: flex; align-items: center; gap: 6px; min-width: 0; flex: 1; } .history-item-title { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1; min-width: 0; } .pin-icon { width: 12px; height: 12px; color: var(--brand-green); flex-shrink: 0; } .history-item-tags { display: flex; gap: 2px; flex-shrink: 0; } .history-tag-badge { font-size: 10px; } .history-item-actions { display: none; align-items: center; gap: 4px; } .history-item:hover .history-item-actions { display: flex; } .btn-history-action { background: none; border: none; color: var(--text-muted); cursor: pointer; padding: 2px; border-radius: 4px; transition: color var(--transition-fast), background-color var(--transition-fast); } .btn-history-action:hover { color: var(--text-primary); background-color: rgba(255,255,255,0.05); } .btn-history-action svg { width: 14px; height: 14px; } /* Rodapé Sidebar */ .sidebar-footer { padding: 16px; border-top: 1px solid var(--border-light); } .user-profile { display: flex; align-items: center; gap: 12px; padding: 6px; border-radius: 12px; position: relative; } .avatar { width: 32px; height: 32px; border-radius: 50%; display: flex; justify-content: center; align-items: center; font-weight: 600; font-size: 14px; color: white; user-select: none; flex-shrink: 0; } .user-avatar { background: linear-gradient(135deg, #a855f7 0%, #7c3aed 100%); } .bot-avatar { background: radial-gradient(135deg, var(--brand-green) 0%, #0a5f49 100%); } .user-info { display: flex; flex-direction: column; flex: 1; overflow: hidden; } .user-name { font-size: 13.5px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .user-status { font-size: 11px; color: var(--text-muted); } .btn-logout { background: none; border: none; color: var(--text-secondary); cursor: pointer; padding: 6px; border-radius: 6px; display: flex; justify-content: center; align-items: center; transition: color var(--transition-fast), background-color var(--transition-fast); } .btn-logout:hover { color: var(--error); background-color: rgba(239, 68, 68, 0.05); } .btn-logout svg { width: 18px; height: 18px; } /* Overlay da Sidebar no Mobile */ .sidebar-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.6); z-index: 9; opacity: 0; pointer-events: none; transition: opacity var(--transition-normal); } /* ========================================================================== ÁREA DE CONVERSA PRINCIPAL ========================================================================== */ .chat-area { flex: 1; display: flex; flex-direction: column; height: 100%; background-color: var(--bg-primary); position: relative; } /* Header */ .chat-header { height: var(--header-height); padding: 0 16px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--border-light); background-color: rgba(13, 13, 13, 0.8); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); position: sticky; top: 0; z-index: 8; } .btn-menu { background: none; border: none; color: var(--text-secondary); cursor: pointer; padding: 8px; border-radius: 8px; display: none; /* Oculto por padrão no desktop */ align-items: center; justify-content: center; transition: color var(--transition-fast), background-color var(--transition-fast); } .btn-menu:hover { color: var(--text-primary); background-color: var(--bg-secondary); } .btn-menu svg { width: 20px; height: 20px; } .model-badge { display: none !important; /* Oculto conforme solicitação do usuário */ align-items: center; gap: 6px; padding: 6px 12px; border-radius: 8px; cursor: pointer; font-size: 14px; font-weight: 500; color: var(--text-secondary); transition: background-color var(--transition-fast), color var(--transition-fast); } .model-badge:hover { background-color: var(--bg-secondary); color: var(--text-primary); } .model-badge svg.chevron { width: 14px; height: 14px; } .btn-new-chat-mobile { background: none; border: none; color: var(--text-secondary); cursor: pointer; padding: 8px; border-radius: 8px; display: none; /* Apenas no mobile */ align-items: center; justify-content: center; transition: color var(--transition-fast), background-color var(--transition-fast); } .btn-new-chat-mobile:hover { color: var(--text-primary); background-color: var(--bg-secondary); } .btn-new-chat-mobile svg { width: 20px; height: 20px; } /* Container de Mensagens */ .messages-container { flex: 1; overflow-y: auto; padding: 24px 16px; display: flex; flex-direction: column; } .messages-container::-webkit-scrollbar { width: 6px; } .messages-container::-webkit-scrollbar-thumb { background-color: rgba(255, 255, 255, 0.05); border-radius: 3px; } .messages-container::-webkit-scrollbar-thumb:hover { background-color: rgba(255, 255, 255, 0.15); } /* Tela de Boas-Vindas */ .welcome-container { max-width: 580px; margin: auto; display: flex; flex-direction: column; align-items: center; text-align: center; gap: 24px; padding: 40px 16px; } .welcome-logo { margin-bottom: 8px; } .welcome-logo .logo-outer { width: 86px; height: 86px; border-radius: 50%; background: radial-gradient(135deg, var(--brand-green) 0%, #0a5f49 100%); display: flex; justify-content: center; align-items: center; box-shadow: 0 0 16px var(--brand-glow); } .welcome-logo .logo-inner { font-family: var(--font-display); font-size: 20px; font-weight: 700; color: white; } .welcome-container h2 { font-family: var(--font-display); font-size: 24px; font-weight: 600; color: var(--text-primary); } .suggestions-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; width: 100%; margin-top: 16px; } .suggestion-card { background-color: var(--bg-secondary); border: 1px solid var(--border-light); border-radius: 12px; padding: 14px 16px; text-align: left; cursor: pointer; display: flex; flex-direction: column; gap: 4px; transition: background-color var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast); } .suggestion-card:hover { background-color: var(--bg-tertiary); border-color: rgba(255, 255, 255, 0.12); transform: translateY(-1px); } .suggestion-card h4 { font-size: 13.5px; font-weight: 500; color: var(--text-primary); } .suggestion-card p { font-size: 12px; color: var(--text-muted); } /* Lista de Conversa */ .conversation-list { display: flex; flex-direction: column; width: 100%; max-width: var(--max-chat-width); margin: 0 auto; } .message-row { display: flex; gap: 16px; padding: 24px 0; border-bottom: 1px solid var(--border-light); animation: fadeInUp var(--transition-normal); } .message-row.user { /* Alinhamento sutil para o usuário se destacar */ } .message-icon { flex-shrink: 0; } .message-content { flex: 1; overflow-x: auto; color: var(--text-primary); font-size: 15px; line-height: 1.6; } .message-content-wrapper { flex: 1; display: flex; flex-direction: column; gap: 4px; min-width: 0; } /* Ações de mensagem (copiar, ouvir, etc) */ .message-actions { display: flex; gap: 4px; opacity: 0.4; transition: opacity var(--transition-fast); margin-top: 4px; } .message-row:hover .message-actions, .message-actions:focus-within { opacity: 1; } @media (max-width: 768px) { .message-actions { opacity: 0.8; } } .msg-action-btn { background: none; border: 1px solid var(--border-light); border-radius: 6px; color: var(--text-muted); cursor: pointer; padding: 4px 8px; display: flex; align-items: center; gap: 4px; font-size: 12px; font-family: var(--font-sans); transition: all var(--transition-fast); } .msg-action-btn:hover { background-color: var(--bg-tertiary); color: var(--text-primary); border-color: rgba(255,255,255,0.15); } .msg-action-btn svg { width: 14px; height: 14px; } .message-content p { margin-bottom: 12px; } .message-content p:last-child { margin-bottom: 0; } .message-content h1, .message-content h2, .message-content h3 { font-family: var(--font-display); font-weight: 600; margin: 16px 0 8px 0; color: var(--text-primary); } .message-content h1 { font-size: 20px; } .message-content h2 { font-size: 18px; } .message-content h3 { font-size: 16px; } .message-content ul, .message-content ol { margin-bottom: 12px; padding-left: 20px; } .message-content li { margin-bottom: 4px; } /* Bloco de Código Markdown */ .code-container { background-color: #1e1e1e; border: 1px solid var(--border-light); border-radius: 8px; margin: 16px 0; overflow: hidden; display: flex; flex-direction: column; } .code-header { background-color: #2d2d2d; padding: 8px 16px; display: flex; justify-content: space-between; align-items: center; font-size: 12px; color: var(--text-secondary); border-bottom: 1px solid var(--border-light); } .code-lang { font-family: monospace; text-transform: lowercase; font-weight: 600; } .btn-copy-code { background: none; border: none; color: var(--text-muted); cursor: pointer; display: flex; align-items: center; gap: 4px; padding: 4px 8px; border-radius: 4px; transition: color var(--transition-fast), background-color var(--transition-fast); } .btn-copy-code:hover { color: var(--text-primary); background-color: rgba(255, 255, 255, 0.05); } .btn-copy-code svg { width: 14px; height: 14px; } .code-container pre { margin: 0; padding: 16px; overflow-x: auto; } .code-container code { font-family: 'Fira Code', 'Courier New', Courier, monospace; font-size: 13.5px; background: none; padding: 0; border-radius: 0; } /* Código inline */ code { font-family: monospace; font-size: 14px; background-color: rgba(255, 255, 255, 0.1); padding: 2px 6px; border-radius: 4px; } /* Cursor de digitação (Streaming) */ .typing-cursor { display: inline-block; width: 8px; height: 15px; background-color: var(--text-primary); margin-left: 2px; vertical-align: middle; animation: blink 0.8s step-end infinite; } /* Rodapé / Input Area */ .chat-footer { padding: 16px; background-color: var(--bg-primary); } .input-container { max-width: var(--max-chat-width); margin: 0 auto; display: flex; flex-direction: column; gap: 12px; } .input-box { background-color: var(--bg-secondary); border: 1px solid var(--border-light); border-radius: 20px; padding: 10px 14px; display: flex; align-items: flex-end; gap: 10px; box-shadow: var(--shadow-lg); transition: border-color var(--transition-fast), box-shadow var(--transition-fast); } .input-box:focus-within { border-color: var(--border-focus); } .input-box textarea { flex: 1; background: none; border: none; outline: none; color: var(--text-primary); font-family: var(--font-sans); font-size: 15px; resize: none; max-height: 200px; padding: 6px 0; line-height: 1.4; } .input-box button[type="submit"] { background-color: var(--text-primary); color: var(--bg-primary); border: none; border-radius: 50%; width: 32px; height: 32px; display: flex; justify-content: center; align-items: center; cursor: pointer; flex-shrink: 0; transition: background-color var(--transition-fast), opacity var(--transition-fast), transform var(--transition-fast); } .input-box button[type="submit"]:hover:not(:disabled) { transform: scale(1.05); } .input-box button[type="submit"]:disabled { opacity: 0.2; cursor: not-allowed; background-color: var(--bg-accent); color: var(--text-muted); } .input-box button[type="submit"] svg { width: 16px; height: 16px; } /* Botão de voz (microfone) */ .btn-voice { background: none !important; border: none !important; color: var(--text-muted) !important; border-radius: 50% !important; width: 32px !important; height: 32px !important; display: flex; justify-content: center; align-items: center; cursor: pointer; flex-shrink: 0; transition: color var(--transition-fast), background-color var(--transition-fast), transform var(--transition-fast); padding: 0 !important; } .btn-voice svg { width: 18px; height: 18px; } .btn-voice:hover { color: var(--text-primary) !important; transform: scale(1.05); } .btn-voice.listening { color: #ef4444 !important; animation: pulse-voice 1.5s ease-in-out infinite; } @keyframes pulse-voice { 0%, 100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.15); opacity: 0.8; } } /* Botão regenerar */ .msg-action-btn.btn-regenerate:hover { color: #10b981 !important; } .msg-action-btn.btn-regenerate:hover svg { transform: rotate(-30deg); } .msg-action-btn.btn-regenerate svg { transition: transform 0.3s ease; } /* Botão editar */ .msg-action-btn.btn-edit:hover { color: #8b5cf6 !important; } .msg-action-btn.btn-edit:hover svg { transform: scale(1.1); } .msg-action-btn.btn-edit svg { transition: transform 0.2s ease; } /* Botão de anexar */ .btn-attach { background: none; border: none; cursor: pointer; padding: 8px; border-radius: 8px; color: var(--text-muted); display: flex; align-items: center; justify-content: center; transition: all 0.2s; flex-shrink: 0; } .btn-attach svg { width: 20px; height: 20px; } .btn-attach:hover { background: var(--hover-bg); color: var(--text-color); } .btn-attach.has-files { color: var(--accent); } /* Preview de anexos na barra de input */ .attachments-preview { display: flex; gap: 6px; padding: 6px 12px; flex-wrap: wrap; border-top: 1px solid var(--border-color); min-height: 0; } .attachment-item { position: relative; display: inline-flex; align-items: center; gap: 6px; padding: 4px 8px 4px 4px; background: var(--hover-bg); border-radius: 8px; font-size: 12px; color: var(--text-color); border: 1px solid var(--border-color); max-width: 150px; } .attachment-item img { width: 36px; height: 36px; object-fit: cover; border-radius: 6px; border: 1px solid var(--border-color); flex-shrink: 0; } .attachment-item .file-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 90px; } .attachment-item .remove-attachment { position: absolute; top: -6px; right: -6px; width: 18px; height: 18px; border-radius: 50%; background: #ef4444; color: white; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: 12px; line-height: 1; } .msg-action-btn.btn-speak svg { transition: transform 0.2s ease; } .msg-action-btn.btn-speak:hover { color: #8b5cf6 !important; } .msg-action-btn.btn-speak:hover svg { transform: scale(1.1); } .msg-action-btn.btn-speak.speaking { color: #8b5cf6 !important; animation: pulse-speak 1.5s ease-in-out infinite; } @keyframes pulse-speak { 0%, 100% { opacity: 1; } 50% { opacity: 0.6; } } .disclaimer { font-size: 11px; color: var(--text-muted); text-align: center; } /* ========================================================================== ANIMAÇÕES ========================================================================== */ @keyframes blink { from, to { background-color: transparent } 50% { background-color: var(--text-primary) } } @keyframes fadeInUp { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } /* ========================================================================== MEDIA QUERIES (RESPONSIVIDADE MOBILE-FIRST) ========================================================================== */ @media (max-width: 768px) { .btn-menu { display: flex; } /* No Mobile, a Sidebar fica escondida por padrão e abre em overlay */ .sidebar { position: absolute; top: 0; left: 0; transform: translateX(-100%); box-shadow: var(--shadow-xl); } .sidebar.open { transform: translateX(0); } .sidebar.open + .sidebar-overlay { opacity: 1; pointer-events: auto; } .btn-close-sidebar { display: flex; } .btn-new-chat-mobile { display: flex; } .suggestions-grid { grid-template-columns: 1fr; } .messages-container { padding: 16px 12px; } .message-row { padding: 16px 0; } .message-content { font-size: 14.5px; } .welcome-container h2 { font-size: 20px; } } @media (min-width: 769px) { /* Em desktop, mantemos o botão menu invisível ou esconde a sidebar sutilmente */ /* Caso queira ocultar a sidebar no desktop, podemos controlar com a classe .sidebar-collapsed no container */ .app-container.sidebar-collapsed .sidebar { display: none; } } /* ========================================================================== ESTILOS DE AVATARES COM FOTO (MINIMALISTAS E ELEGANTES) ========================================================================== */ .avatar-profile-wrapper { position: relative; width: 110px; height: 110px; margin-bottom: 12px; display: flex; justify-content: center; align-items: center; } .avatar-profile-img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; border: 3px solid rgba(16, 163, 127, 0.4); box-shadow: 0 0 20px rgba(16, 163, 127, 0.2); z-index: 2; transition: transform var(--transition-normal), border-color var(--transition-normal); } .avatar-profile-wrapper:hover .avatar-profile-img { transform: scale(1.04); border-color: var(--brand-green); box-shadow: 0 0 25px rgba(16, 163, 127, 0.45); } .avatar-profile-pulse { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 50%; border: 1.5px solid var(--brand-green); opacity: 0.7; z-index: 1; animation: pulseGlow 3s cubic-bezier(0.24, 0, 0.38, 1) infinite; pointer-events: none; } @keyframes pulseGlow { 0% { transform: scale(0.96); opacity: 0.8; } 50% { transform: scale(1.15); opacity: 0; } 100% { transform: scale(0.96); opacity: 0; } } /* Sidebar Avatar */ .sidebar-avatar-wrapper { width: 32px; height: 32px; border-radius: 50%; overflow: hidden; border: 1.5px solid rgba(255, 255, 255, 0.15); display: flex; align-items: center; justify-content: center; } .sidebar-avatar-img { width: 100%; height: 100%; object-fit: cover; } /* Welcome Logo Avatar */ .welcome-avatar-wrapper { width: 86px; height: 86px; border-radius: 50%; overflow: hidden; border: 2px solid rgba(16, 163, 127, 0.3); box-shadow: 0 0 20px var(--brand-glow); display: flex; align-items: center; justify-content: center; transition: transform var(--transition-normal); } .welcome-avatar-wrapper:hover { transform: scale(1.05); border-color: var(--brand-green); } .welcome-avatar-img { width: 100%; height: 100%; object-fit: cover; } /* Chat Message Bot Avatar */ .bot-avatar-img-wrapper { width: 32px; height: 32px; border-radius: 50%; overflow: hidden; border: 1.5px solid rgba(16, 163, 127, 0.3); display: flex; align-items: center; justify-content: center; } .bot-avatar-img { width: 100%; height: 100%; object-fit: cover; } /* Rename Input Inline */ .rename-input { background-color: var(--bg-tertiary) !important; border: 1px solid var(--border-focus) !important; border-radius: 6px !important; color: var(--text-primary) !important; font-size: 13px !important; font-family: var(--font-sans) !important; padding: 4px 6px !important; width: 100% !important; outline: none !important; box-shadow: 0 0 5px var(--brand-glow) !important; } /* ========================================================================== THEME TOGGLE BUTTON ========================================================================== */ .btn-theme-toggle { background: none; border: none; cursor: pointer; padding: 8px; border-radius: 8px; color: var(--text-secondary); transition: background var(--transition-fast), color var(--transition-fast); display: flex; align-items: center; justify-content: center; } .btn-theme-toggle:hover { background: var(--bg-tertiary); color: var(--text-primary); } .btn-theme-toggle svg { width: 20px; height: 20px; } /* Theme toggle in header - right side */ .header-right { display: flex; align-items: center; gap: 4px; } /* ========================================================================== MODAL DE TAGS (substitui prompt()) ========================================================================== */ .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(4px); z-index: 1000; display: flex; align-items: center; justify-content: center; opacity: 0; visibility: hidden; transition: opacity var(--transition-normal), visibility var(--transition-normal); } .modal-overlay.active { opacity: 1; visibility: visible; } .modal-tag { background: var(--bg-secondary); border: 1px solid var(--border-light); border-radius: 16px; padding: 24px; min-width: 320px; max-width: 90vw; box-shadow: var(--shadow-xl); transform: scale(0.9) translateY(20px); transition: transform var(--transition-normal); } .modal-overlay.active .modal-tag { transform: scale(1) translateY(0); } .modal-tag-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; } .modal-tag-title { font-size: 16px; font-weight: 600; color: var(--text-primary); } .modal-tag-close { background: none; border: none; cursor: pointer; padding: 6px; border-radius: 6px; color: var(--text-muted); transition: background var(--transition-fast), color var(--transition-fast); } .modal-tag-close:hover { background: var(--bg-tertiary); color: var(--text-primary); } .modal-tag-list { display: flex; flex-direction: column; gap: 8px; max-height: 300px; overflow-y: auto; } .modal-tag-item { display: flex; align-items: center; gap: 10px; padding: 10px 14px; border-radius: 10px; cursor: pointer; transition: background var(--transition-fast); border: 1px solid transparent; } .modal-tag-item:hover { background: var(--bg-tertiary); } .modal-tag-item.selected { background: var(--brand-glow); border-color: var(--brand-green); } .modal-tag-item input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--brand-green); cursor: pointer; } .modal-tag-item span { font-size: 14px; color: var(--text-primary); } .modal-tag-item.selected span { color: var(--brand-green); font-weight: 500; } .modal-tag-actions { display: flex; gap: 10px; margin-top: 20px; justify-content: flex-end; } .modal-tag-btn { padding: 10px 20px; border-radius: 10px; font-size: 14px; font-weight: 500; cursor: pointer; transition: background var(--transition-fast), transform var(--transition-fast); border: none; } .modal-tag-btn:active { transform: scale(0.97); } .modal-tag-btn.primary { background: var(--brand-green); color: white; } .modal-tag-btn.primary:hover { background: var(--brand-green-hover); } .modal-tag-btn.secondary { background: var(--bg-tertiary); color: var(--text-secondary); } .modal-tag-btn.secondary:hover { background: var(--bg-accent); color: var(--text-primary); } /* ========================================================================== TAG INPUT DISPLAY ========================================================================== */ .tags-display { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; padding: 10px; background: var(--bg-tertiary); border-radius: 10px; min-height: 44px; align-items: center; } .tag-badge { display: inline-flex; align-items: center; gap: 5px; padding: 4px 10px; border-radius: 16px; font-size: 12px; font-weight: 500; background: var(--brand-glow); color: var(--brand-green); border: 1px solid rgba(16, 163, 127, 0.3); } .tag-badge button { background: none; border: none; cursor: pointer; padding: 0; display: flex; align-items: center; color: var(--brand-green); opacity: 0.7; transition: opacity var(--transition-fast); } .tag-badge button:hover { opacity: 1; } .no-tags { color: var(--text-muted); font-size: 12px; font-style: italic; } /* ========================================================================== WELCOME CARDS (tematicos) ========================================================================== */ .welcome-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; max-width: 600px; margin-top: 20px; } @media (max-width: 500px) { .welcome-grid { grid-template-columns: 1fr; } } .suggestion-card { background: var(--bg-secondary); border: 1px solid var(--border-light); border-radius: 14px; padding: 16px; cursor: pointer; text-align: left; transition: background var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast); display: flex; flex-direction: column; gap: 8px; } .suggestion-card:hover { background: var(--bg-tertiary); border-color: var(--brand-green); transform: translateY(-2px); } .suggestion-card .card-icon { font-size: 24px; line-height: 1; } .suggestion-card .card-title { font-size: 14px; font-weight: 600; color: var(--text-primary); } .suggestion-card .card-desc { font-size: 12px; color: var(--text-muted); line-height: 1.4; } /* ========================================================================== SMART ROUTER MEDIA GENERATION (Imagem, Áudio e Vídeo) ========================================================================== */ .media-message-card { background: var(--bg-secondary); border: 1px solid var(--border-light); border-radius: 16px; padding: 16px; margin: 12px 0; max-width: 500px; display: flex; flex-direction: column; gap: 12px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); animation: fadeIn 0.3s ease-out; } .media-img-container, .media-video-container { width: 100%; border-radius: 12px; overflow: hidden; background: rgba(0, 0, 0, 0.2); display: flex; justify-content: center; align-items: center; aspect-ratio: 1/1; } .media-video-container { aspect-ratio: 16/9; } .generated-image { width: 100%; height: 100%; object-fit: cover; border-radius: 12px; transition: transform var(--transition-normal); } .generated-image:hover { transform: scale(1.02); } .generated-video { width: 100%; height: 100%; object-fit: contain; border-radius: 12px; } .media-caption { font-size: 13px; color: var(--text-secondary); font-style: italic; line-height: 1.4; margin: 0; padding: 0 4px; } .media-actions-row { display: flex; gap: 8px; width: 100%; } .media-download-btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; background: linear-gradient(135deg, var(--brand-green) 0%, #1e7e4a 100%); color: #ffffff; border: none; border-radius: 10px; padding: 10px 16px; font-size: 13px; font-weight: 600; text-decoration: none; cursor: pointer; transition: opacity var(--transition-fast), transform var(--transition-fast); flex: 1; box-shadow: 0 2px 8px rgba(30, 190, 110, 0.2); } .media-download-btn:hover { opacity: 0.9; transform: translateY(-1px); } .media-download-btn:active { transform: translateY(0); } .media-download-btn svg { width: 16px; height: 16px; } /* Player de Áudio Customizado */ .custom-audio-player { background: var(--bg-tertiary); border: 1px solid var(--border-light); border-radius: 12px; padding: 12px; display: flex; align-items: center; gap: 12px; width: 100%; } .audio-play-btn { background: var(--brand-green); border: none; color: #ffffff; width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; flex-shrink: 0; transition: transform var(--transition-fast); } .audio-play-btn:hover { transform: scale(1.05); } .audio-play-btn svg { width: 18px; height: 18px; } .audio-play-btn svg.hidden { display: none; } .audio-timeline-container { flex: 1; height: 6px; background: rgba(255, 255, 255, 0.1); border-radius: 3px; position: relative; cursor: pointer; } .audio-timeline { width: 100%; height: 100%; } .audio-progress { height: 100%; background: var(--brand-green); border-radius: 3px; width: 0%; transition: width 0.1s linear; } .audio-time { font-size: 12px; color: var(--text-muted); font-family: monospace; min-width: 32px; text-align: right; } /* Loading de Mídia */ .media-loading { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 24px; gap: 12px; text-align: center; } .media-spinner { width: 32px; height: 32px; border: 3px solid rgba(30, 190, 110, 0.1); border-radius: 50%; border-top-color: var(--brand-green); animation: spin 1s ease-in-out infinite; } .media-loading-text { font-size: 13.5px; color: var(--text-secondary); margin: 0; font-weight: 500; } @keyframes spin { to { transform: rotate(360deg); } } @keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } /* ========================================================================== BARRA DE MODOS DE PROMPT RÁPIDOS (RODAPÉ DO INPUT) ========================================================================== */ .prompt-modes-bar { display: flex; gap: 8px; margin-bottom: 8px; overflow-x: auto; padding: 4px 2px; scrollbar-width: none; /* Firefox */ -ms-overflow-style: none; /* IE/Edge */ } .prompt-modes-bar::-webkit-scrollbar { display: none; /* Chrome, Safari, Opera */ } .btn-prompt-mode { display: flex; align-items: center; gap: 6px; background-color: var(--bg-secondary); border: 1px solid var(--border-light); border-radius: 20px; padding: 6px 14px; color: var(--text-secondary); font-size: 12px; font-weight: 600; cursor: pointer; transition: all var(--transition-fast) cubic-bezier(0.4, 0, 0.2, 1); white-space: nowrap; font-family: var(--font-sans); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } .btn-prompt-mode:hover { transform: translateY(-1.5px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); background-color: var(--bg-tertiary); } .btn-prompt-mode:active { transform: translateY(0); } .btn-prompt-mode .mode-icon { font-size: 14px; } /* Modo Música: Estilos e Cores (Roxo/Violeta) */ .btn-prompt-mode.mode-music { border-color: rgba(168, 85, 247, 0.3); } .btn-prompt-mode.mode-music:hover { border-color: rgb(168, 85, 247); background-color: rgba(168, 85, 247, 0.06); color: rgb(216, 180, 254); } /* Modo Vídeo: Estilos e Cores (Azul/Ciano) */ .btn-prompt-mode.mode-video { border-color: rgba(6, 182, 212, 0.3); } .btn-prompt-mode.mode-video:hover { border-color: rgb(6, 182, 212); background-color: rgba(6, 182, 212, 0.06); color: rgb(165, 243, 252); } /* Modo Imagem: Estilos e Cores (Laranja/Rosa) */ .btn-prompt-mode.mode-image { border-color: rgba(249, 115, 22, 0.3); } .btn-prompt-mode.mode-image:hover { border-color: rgb(249, 115, 22); background-color: rgba(249, 115, 22, 0.06); color: rgb(253, 186, 116); } /* Modo Texto/História: Estilos e Cores (Verde Kemily) */ .btn-prompt-mode.mode-text { border-color: rgba(16, 163, 127, 0.3); } .btn-prompt-mode.mode-text:hover { border-color: var(--brand-green); background-color: rgba(16, 163, 127, 0.06); color: rgb(167, 243, 208); } /* Hover no botao de configuracoes da sidebar */ .btn-settings:hover { color: var(--text-primary) !important; background-color: var(--bg-secondary) !important; } /* Avatar do Usuario no Chat */ .user-avatar-img-wrapper { width: 32px; height: 32px; border-radius: 50%; overflow: hidden; border: 1.5px solid rgba(255, 255, 255, 0.2); display: flex; align-items: center; justify-content: center; background: none !important; } .user-avatar-img { width: 100%; height: 100%; object-fit: cover; } /* Modal de Configurações */ .settings-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.6); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); display: flex; justify-content: center; align-items: center; z-index: 1000; animation: fadeIn 0.2s ease-out; } .settings-modal-content { background-color: var(--bg-primary, #121212); border: 1px solid var(--border-light, #262626); border-radius: 16px; width: 450px; max-width: 90%; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); overflow: hidden; animation: scaleIn 0.2s cubic-bezier(0.16, 1, 0.3, 1); } .settings-modal-header { padding: 16px 20px; border-bottom: 1px solid var(--border-light, #262626); display: flex; justify-content: space-between; align-items: center; } .settings-modal-header h3 { margin: 0; font-size: 1.15rem; color: var(--text-primary, #ffffff); font-weight: 600; } .close-settings-btn { background: none; border: none; color: var(--text-secondary, #a3a3a3); font-size: 1.5rem; cursor: pointer; padding: 4px 8px; border-radius: 4px; line-height: 1; } .close-settings-btn:hover { color: var(--text-primary, #ffffff); background-color: rgba(255, 255, 255, 0.05); } .settings-modal-body { padding: 20px; display: flex; flex-direction: column; gap: 20px; } .settings-group { display: flex; flex-direction: column; gap: 8px; } .settings-group label { font-size: 0.85rem; color: var(--text-secondary, #a3a3a3); font-weight: 500; } .settings-group input[type="text"] { background-color: var(--bg-secondary, #1a1a1a); border: 1px solid var(--border-light, #262626); border-radius: 8px; padding: 10px 12px; color: var(--text-primary, #ffffff); font-size: 0.95rem; outline: none; transition: border-color var(--transition-fast); } .settings-group input[type="text"]:focus { border-color: var(--brand-green, #0ea5e9); } .avatar-preview-container { display: flex; align-items: center; gap: 16px; background-color: var(--bg-secondary, #1a1a1a); border: 1px solid var(--border-light, #262626); padding: 12px; border-radius: 10px; } .preview-avatar-img { width: 50px; height: 50px; border-radius: 50%; object-fit: cover; border: 2px solid var(--brand-green, #0ea5e9); } .btn-change-avatar { background-color: rgba(255, 255, 255, 0.05); border: 1px solid var(--border-light, #262626); color: var(--text-primary, #ffffff); padding: 8px 14px; border-radius: 6px; font-size: 0.85rem; cursor: pointer; transition: background-color 0.2s; } .btn-change-avatar:hover { background-color: rgba(255, 255, 255, 0.1); } .settings-modal-footer { padding: 16px 20px; border-top: 1px solid var(--border-light, #262626); display: flex; justify-content: flex-end; } .btn-save-settings { background: linear-gradient(135deg, var(--brand-green) 0%, #0a5f49 100%); border: none; color: #ffffff; padding: 10px 18px; border-radius: 8px; font-size: 0.9rem; font-weight: 500; cursor: pointer; transition: opacity 0.2s; box-shadow: 0 0 12px var(--brand-glow); } .btn-save-settings:hover { opacity: 0.9; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes scaleIn { from { transform: scale(0.95); opacity: 0; } to { transform: scale(1); opacity: 1; } }