Continuando a discussão de Estilizando o Discourse com variáveis: Mostre e Conte:
Eu aprecio totalmente o esforço para melhorar a experiência de tematização do Discourse! No entanto, não estou totalmente convencido de que a abordagem de adicionar muitas variáveis CSS, conforme compartilhado no tópico acima, seja a solução ideal. Queria compartilhar alguns pensamentos sobre o porquê.
Eu mesmo tenho experimentado essa abordagem através do Modelo de Tema Canvas, que essencialmente fornece uma coleção de variáveis ajustáveis para construir temas base:
:root {
/* Layout */
--d-max-width: 1110px;
--canvas-nav-space: 0.75rem;
--canvas-content-padding: 1.5rem;
--canvas-topic-list-padding: 0.8em;
/* Estilos Base */
--canvas-background: var(--secondary);
--canvas-surface: var(--secondary);
--canvas-border: 1px solid var(--primary-500);
--canvas-border-light: 1px solid var(--primary-200);
/* Raio da Borda */
--d-border-radius: 2px;
--d-border-radius-large: 2px;
--d-button-border-radius: 2px;
--d-input-border-radius: var(--d-button-border-radius);
--d-nav-pill-border-radius: var(--d-button-border-radius);
/* Estilos de Botão */
--canvas-button-padding: 0.5em 0.65em;
--canvas-button-primary-padding: 0.5em 0.65em;
/* Cabeçalho */
--canvas-header-height: 4rem;
--canvas-header-background: var(--header_background);
--canvas-header-border: none;
--canvas-header-shadow: var(--shadow-header);
/* Barra Lateral */
--d-sidebar-width: 17em;
--d-sidebar-background: var(--secondary);
--canvas-sidebar-border: 1px solid var(--primary-low);
--canvas-sidebar-scrollbar: var(--scrollbarWidth);
--d-sidebar-row-height: 2.2em;
--d-sidebar-highlight-background: var(--primary-low);
/* E muito mais... */
}
Embora isso funcione razoavelmente bem para ajustes simples, encontrei várias limitações ao tentar dimensionar essa abordagem:
Sobrecarga Cognitiva e Descoberta
Uma lista extensa de variáveis essencialmente requer uma tabela de consulta. Isso parece desconectado de como você normalmente trabalharia em um framework baseado em componentes, onde eu realmente esperaria estilizar componentes. E talvez seja só eu, mas sinto que muda o modelo mental de “Quero estilizar este componente” para “Preciso encontrar o nome da variável correta”.
Falta de Lógica de Cascata
A implementação atual atribui valores codificados diretamente às variáveis sem estabelecer uma hierarquia de cascata adequada:
--d-sidebar-link-color: var(--primary-high);
--d-nav-background-color--active: transparent;
--table-border-width: 1px;
Isso significa que não há herança de variáveis mais gerais como --link-color ou --border-width. Se eu quiser fazer alterações sistemáticas, preciso atualizar várias variáveis específicas em vez de alterar um valor fundamental.
Lacuna de Design para Desenvolvimento
Acho que a abordagem cria atrito ao trabalhar entre ferramentas de design (como Figma) e implementação. Os sistemas de design normalmente usam variáveis semânticas que não se mapeiam um para um com essas variáveis muito específicas de implementação.
Uma abordagem alternativa que abraça a arquitetura de componentes
Acho que poderíamos atingir o mesmo objetivo de forma mais natural combinando variáveis semânticas básicas com segmentação de componentes confiável. Em vez de ter uma longa lista de variáveis específicas, e se pudéssemos contar com classes de componentes únicas e com nomes consistentes em todo o Discourse? Coisas como .d-sidebar, .d-topic-list, .d-header.
Em seguida, combine isso com um conjunto menor de variáveis fundamentais que realmente cascateiam da maneira que o CSS foi projetado para funcionar:
/* Define a base do design */
:root {
--d-border-width: 2px;
--d-surface-color: #3498db;
--d-space-1: 1rem;
}
/* Sobrescreve no nível do componente quando necessário */
.d-topic-list,
.d-sidebar {
--d-border-width: 1px;
}
Para mim, isso parece mais com a forma como o CSS funciona naturalmente. Defino meus estilos globais e, em seguida, os refino onde necessário. Quando quero mudar a aparência das bordas em todo o aplicativo, altero uma variável. Quando quero que a barra lateral seja diferente, segmenta a barra lateral especificamente.

