File size: 7,919 Bytes
8a12c0d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c285532
 
8a12c0d
 
 
 
 
 
c285532
 
 
 
 
 
8a12c0d
 
 
 
 
 
 
 
 
 
 
c285532
 
8a12c0d
 
 
 
 
 
 
c285532
 
 
 
 
 
 
 
8a12c0d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
349675c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8a12c0d
 
 
 
 
 
 
 
 
 
 
349675c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8a12c0d
 
 
 
 
349675c
8a12c0d
 
 
 
 
 
349675c
8a12c0d
 
 
 
 
349675c
8a12c0d
 
349675c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8a12c0d
 
 
 
 
 
 
 
 
 
 
349675c
 
 
 
 
 
 
 
8a12c0d
 
 
 
 
 
 
349675c
8a12c0d
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
# 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"""
    <div style="
        background: var(--bg-primary);
        color: var(--text-primary);
        border: 1px solid var(--border-color);
    ">
        Conteúdo do componente
    </div>
    """
```

## 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"""
    <script>
    // Remove CSS anterior
    const oldStyle = document.getElementById('dynamic-theme-css');
    if (oldStyle) oldStyle.remove();
    
    // Adiciona novo CSS
    const style = document.createElement('style');
    style.id = 'dynamic-theme-css';
    style.textContent = `{theme_manager.get_custom_css()}`;
    document.head.appendChild(style);
    
    // Aplica tema ao body
    document.body.setAttribute('data-theme', '{theme_name}');
    </script>
    """
    
    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"""
        <script>
        document.body.setAttribute('data-theme', '{theme_name}');
        const style = document.createElement('style');
        style.id = 'dynamic-theme-css';
        style.textContent = `{theme_manager.get_custom_css()}`;
        document.head.appendChild(style);
        </script>
        """
```

### 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.