# Sistema de Temas Este documento descreve o sistema de temas dinâmico implementado na aplicação de análise financeira. ## Visão Geral O sistema de temas permite alternar entre modo claro e escuro, proporcionando uma experiência visual otimizada para diferentes condições de iluminação e preferências do usuário. ## Componentes Principais ### 1. ThemeManager (`src/ui/theme_manager.py`) Gerenciador centralizado responsável por: - Controle do tema atual (claro/escuro) - Definição de paletas de cores - Geração de CSS customizado - Alternância entre temas #### Funcionalidades: ```python # Obter tema atual current_theme = theme_manager.get_current_theme() # Definir tema theme_manager.set_theme(ThemeType.DARK) # Alternar tema theme_manager.toggle_theme() # Obter CSS customizado css = theme_manager.get_custom_css() ``` ### 2. DarkThemeUIComponents (`src/ui/dark_theme_components.py`) Componentes de interface com suporte a tema escuro: - Cabeçalho adaptável - Formatação de padrões harmônicos - Alertas de Fibonacci - Análise de sentimento - Recomendações de trading - Rodapé responsivo ## Paletas de Cores ### Tema Claro - **Fundo Principal**: `#ffffff` (`--bg-primary`, `--bg`) - **Fundo Secundário**: `#f8f9fa` (`--bg-secondary`, `--surface`) - **Texto Principal**: `#495057` - **Texto Secundário**: `#6c757d` - **Bordas**: `#dee2e6` - **Accent**: `#007bff` ### Tema Escuro - **Fundo Principal**: `#0f172a` (`--bg-primary`, `--bg`) - **Fundo Secundário**: `#1e293b` (`--bg-secondary`, `--surface`) - **Texto Principal**: `#f1f5f9` - **Texto Secundário**: `#cbd5e1` - **Bordas**: `#475569` - **Accent**: `#60a5fa` ## Implementação ### CSS Dinâmico O sistema utiliza variáveis CSS para permitir alternância dinâmica: ```css :root { --bg-primary: #ffffff; --bg-secondary: #f8f9fa; --bg: #ffffff; --surface: #f8f9fa; --text-primary: #495057; --text-secondary: #6c757d; --border-color: #dee2e6; --accent-color: #007bff; } [data-theme="dark"] { --bg-primary: #0f172a; --bg-secondary: #1e293b; --bg: #0f172a; --surface: #1e293b; --text-primary: #f1f5f9; --text-secondary: #cbd5e1; --border-color: #475569; --accent-color: #60a5fa; } ``` ### Componentes Adaptáveis Todos os componentes HTML utilizam as variáveis CSS: ```python def create_component(): return f"""
Conteúdo do componente
""" ``` ## Benefícios ### 1. Experiência do Usuário - **Redução da Fadiga Visual**: Modo escuro reduz o cansaço em ambientes com pouca luz - **Personalização**: Usuários podem escolher o tema de sua preferência - **Acessibilidade**: Melhor contraste para diferentes necessidades visuais ### 2. Técnicos - **Manutenibilidade**: Sistema centralizado facilita atualizações - **Consistência**: Paleta de cores padronizada em toda a aplicação - **Performance**: CSS otimizado com variáveis nativas - **Escalabilidade**: Fácil adição de novos temas ## Uso na Interface ### Botão de Alternância de Tema A aplicação agora inclui um botão de alternância de tema integrado ao cabeçalho: - **Localização**: Canto superior direito da interface - **Ícones**: 🌙 para tema escuro, ☀️ para tema claro - **Funcionalidade**: Alternância instantânea entre temas - **Atualização Dinâmica**: CSS aplicado via JavaScript sem recarregar a página #### Implementação do Botão ```python # No GradioInterface.create_interface() with gr.Row(): with gr.Column(scale=4): header_html = gr.HTML(self.ui_components.create_header()) with gr.Column(scale=1, min_width=120): theme_toggle_btn = gr.Button( "🌙 Tema Escuro", elem_id="theme-toggle", size="sm" ) # Evento de alternância theme_toggle_btn.click( fn=self._toggle_theme, outputs=[theme_toggle_btn, theme_update_html] ) ``` #### Função de Alternância ```python def _toggle_theme(self): """Alterna entre tema claro e escuro""" theme_manager.toggle_theme() current_theme = theme_manager.get_current_theme() if current_theme == ThemeType.DARK: button_text = "🌙 Tema Escuro" theme_name = "dark" else: button_text = "☀️ Tema Claro" theme_name = "light" # JavaScript para atualização dinâmica do CSS js_code = f""" """ return button_text, js_code ``` ### Integração com Gradio A interface Gradio utiliza o sistema de temas através do `GradioInterface`: ```python class GradioInterface: def _get_custom_css(self) -> str: return theme_manager.get_custom_css() def create_header(self) -> str: return DarkThemeUIComponents.create_header() def _apply_initial_theme(self): """Aplica o tema padrão na inicialização""" current_theme = theme_manager.get_current_theme() theme_name = "dark" if current_theme == ThemeType.DARK else "light" return f""" """ ``` ### Componentes Suportados - ✅ Cabeçalho da aplicação - ✅ Botão de alternância de tema - ✅ Padrões harmônicos - ✅ Alertas de Fibonacci - ✅ Análise de sentimento - ✅ Recomendações de trading - ✅ Respostas do bot - ✅ Rodapé da aplicação - ✅ Aplicação automática do tema na inicialização ## Configuração ### Tema Padrão A aplicação agora inicia com o tema escuro como padrão: ```python # No theme_manager.py - Inicialização global theme_manager = ThemeManager(ThemeType.DARK) # CSS para aplicação automática do tema body[data-theme="dark"] { background: var(--bg-primary); color: var(--text-primary); } ``` #### Aplicação Automática na Inicialização O tema é aplicado automaticamente quando a interface carrega: ```python # No create_interface() theme_update_html.load( fn=self._apply_initial_theme, outputs=theme_update_html ) ``` ### Personalização Para adicionar novos temas: 1. Estender o enum `ThemeType` 2. Adicionar paleta de cores no `ThemeManager` 3. Atualizar o CSS customizado 4. Implementar componentes específicos se necessário ## Funcionalidades Implementadas - ✅ **Botão de Alternância**: Interface intuitiva para trocar temas - ✅ **Tema Escuro Padrão**: Aplicação inicia com tema escuro - ✅ **Atualização Dinâmica**: CSS aplicado via JavaScript sem reload - ✅ **Aplicação Automática**: Tema aplicado na inicialização da interface - ✅ **Integração Completa**: Todos os componentes suportam alternância ## Futuras Melhorias - [ ] Detecção automática do tema do sistema - [ ] Persistência da preferência do usuário - [ ] Temas adicionais (alto contraste, sepia) - [ ] Animações de transição entre temas - [ ] API para temas personalizados - [ ] Atalhos de teclado para alternância ## Conclusão O sistema de temas proporciona uma experiência visual moderna e adaptável, melhorando significativamente a usabilidade da aplicação em diferentes contextos de uso.