🎨 Temas#

O Codis possui um sistema de temas completo com suporte a modos claro e escuro, além de suporte a temas criados por plugins.


Temas Built-in#

21 temas inclusos, todos definidos em src/theme/base.py. O nome exibido no menu Exibir → Tema é exatamente o nome interno (sem rebranding) - a tabela abaixo só capitaliza para leitura.

Nome interno Exibição Modo
fluent_dark Fluent Dark Escuro
fluent_light Fluent Light Claro
catppuccin_mocha Catppuccin Mocha Escuro
tokyo_night Tokyo Night Escuro
dracula Dracula Escuro
gruvbox_dark Gruvbox Dark Escuro
gruvbox_light Gruvbox Light Claro
solarized_dark Solarized Dark Escuro
solarized_light Solarized Light Claro
one_dark_pro One Dark Pro Escuro
nord Nord Escuro
monokai_pro Monokai Pro Escuro
github_dark GitHub Dark Escuro
github_light GitHub Light Claro
palenight Palenight Escuro
rose_pine Rosé Pine Escuro
everforest_dark Everforest Dark Escuro
ayu_mirage Ayu Mirage Escuro
midnight_void Midnight Void Escuro
sepia Sepia Claro
high_contrast High Contrast Escuro

Além desses, o modo K-UI aplica uma camada visual holográfica adicional sobre qualquer um dos 21 temas - ver Tema K-UI mais abaixo.

O tema padrão é fluent_dark.


Como Trocar de Tema#

Existem quatro formas de trocar de tema:

  1. Menu: Exibir → Tema - lista todos os temas disponíveis.
  2. Activity Bar: clique no ícone 🎨 na parte inferior da Activity Bar - avança para o próximo tema.
  3. Configurações: Ctrl+, → campo theme.
  4. Paleta de Comandos: Ctrl+Shift+P → "Toggle Theme".

Modos de Aplicação#

Ao trocar de tema, um diálogo pergunta qual modo aplicar:

  • Modo Rápido - repinta todos os widgets sem reconstruir a UI. Mais rápido, mas alguns elementos podem ficar com cores ligeiramente inconsistentes.
  • Modo Completo - destrói e reconstrói toda a interface preservando o estado (workspace e arquivos abertos). Garante consistência total de cores.

Pré-visualização antes de aplicar#

O Seletor de Temas (Exibir → Tema → Abrir Seletor de Temas...) abre um painel dedicado de pré-visualização (src/ui/theme_preview_panel.py) antes de aplicar qualquer tema definitivamente:

  • Grade de cartões com todos os temas disponíveis, mostrando nome e um ícone indicando se é dark ou light
  • Preview ao vivo: cada cartão mostra uma miniatura realista de como ficariam o editor, a sidebar, a tab bar e a barra de status com aquele tema - sem precisar aplicá-lo antes para ver
  • Filtro por nome e por polaridade (mostrar apenas dark, apenas light, ou todos)
  • Navegação totalmente por teclado: setas para mover entre cartões, Enter para confirmar, Escape para cancelar
  • Ao confirmar, ainda é perguntado se a aplicação deve ser Completa ou Rápida (ver seção anterior)

Estrutura de um Tema#

Um tema é um @dataclass Theme definido em src/theme/base.py. Os atributos são organizados por grupos:

Grupo: Janela Principal#

Atributo Descrição
name Identificador único do tema
dark True para escuro, False para claro
bg Cor de fundo da janela
fg Cor de texto principal
fg_muted Cor de texto secundário (menos visível)

Grupo: Editor#

Atributo Descrição
editor_bg Fundo da área de código
cursor Cor do cursor de texto

O texto principal do editor usa fg (não existe um editor_fg separado no dataclass Theme, apesar de mencionado no docstring interno de base.py - trata-se de uma referência desatualizada no comentário do código-fonte).

Grupo: Sidebar e Activity Bar#

Atributo Descrição
sidebar_bg Fundo da sidebar
activity_bg Fundo da Activity Bar

Grupo: Abas#

Atributo Descrição
tabbar_bg Fundo da barra de abas
tab_act_bg Fundo da aba ativa
tab_act_fg Texto da aba ativa
tab_in_fg Texto das abas inativas

Grupo: Painéis e Flutuantes#

Atributo Descrição
panel_bg Fundo do painel inferior
floating_bg Fundo de janelas flutuantes (diálogos)

Grupo: Seleção e Inputs#

Atributo Descrição
sel_bg Fundo de texto selecionado
sel_fg Texto selecionado
input_bg Fundo de campos de texto
border Cor de bordas e divisores

Grupo: Botões#

Atributo Descrição
btn_bg Fundo de botões padrão
btn_hover Fundo de botões ao passar o mouse
btn_fg Texto de botões padrão
btn_primary Fundo de botões de ação primária
btn_primary_fg Texto de botões de ação primária

Grupo: Scrollbar#

Atributo Descrição
scroll_bg Trilha da scrollbar
scroll_thumb Thumb (alça) da scrollbar

Grupo: Diagnósticos#

Atributo Descrição
ok_fg Cor de status positivo
warn_fg Cor de avisos
err_fg Cor de erros

Grupo: Syntax Highlighting#

Atributo Descrição
t_keyword Palavras-chave
t_string Strings
t_comment Comentários
t_number Números
t_func Funções
t_type Tipos / classes
t_operator Operadores
t_decorator Decoradores / anotações

Criando um Tema Customizado#

Método 1: Via Plugin#

A forma mais flexível é criar um plugin que registre o tema:

# meu_plugin.py
from src.plugins.api import PluginAPI, PluginManifest
from src.theme.base import Theme

MANIFEST = PluginManifest(name="meu-tema", version="1.0.0")

def activate(api: PluginAPI) -> None:
    meu_tema = Theme(
        name="meu_tema",
        dark=True,
        bg="#1a1a2e",
        fg="#e0e0e0",
        fg_muted="#888888",
        editor_bg="#16213e",
        cursor="#00d4ff",
        sidebar_bg="#0f3460",
        activity_bg="#0a2540",
        tabbar_bg="#1a1a2e",
        tab_act_bg="#0f3460",
        tab_act_fg="#ffffff",
        tab_in_fg="#aaaaaa",
        panel_bg="#0f0f1a",
        floating_bg="#1a1a2e",
        sel_bg="#0f3460",
        sel_fg="#ffffff",
        input_bg="#0f1f35",
        border="#2d3f6e",
        btn_bg="#1e2d4a",
        btn_hover="#2d3f6e",
        btn_fg="#e0e0e0",
        btn_primary="#00d4ff",
        btn_primary_fg="#000000",
        scroll_bg="#0f1f35",
        scroll_thumb="#2d3f6e",
        ok_fg="#00ff88",
        warn_fg="#ffaa00",
        err_fg="#ff4444",
        t_keyword="#00d4ff",
        t_string="#00ff88",
        t_comment="#555577",
        t_number="#ff8855",
        t_func="#88aaff",
        t_type="#ffdd44",
        t_operator="#cc88ff",
        t_decorator="#ff88cc",
    )
    api.register_theme(meu_tema)

Sobre ~/.codis/themes/#

Esse diretório é criado automaticamente na inicialização do Codis (junto com plugins/, snippets/ etc.), mas não é escaneado nem carregado automaticamente nesta versão - não há nenhum loader de tema que leia arquivos .py soltos dessa pasta. O Método 1 acima (via plugin) é a única forma funcional e suportada de registrar temas customizados.


Compatibilidade HiDPI (Windows)#

No Windows, o Codis aplica automaticamente:

  • SetProcessDpiAwareness(1) via ctypes.windll.shcore
  • tk scaling 1.5
  • Coloração da barra de título nativa (DwmSetWindowAttribute) para combinar com o tema ativo (Windows 11)

Nenhuma configuração manual é necessária.


Tema K-UI#

O tema kui é especial - ele é registrado dinamicamente ao ativar o K-UI. Não é um tema no sentido tradicional: a K-UI renderiza sua própria paleta de cores independente (_pal()), com void escuro (#020209 escuro / #0d0d2b claro), texto luminoso e efeitos visuais que ignoram propositalmente as cores do bg para criar a estética cósmica.

Ver K-UI para detalhes.