Anteriormente, todas as cores no Discourse eram armazenadas como variáveis SCSS. Para suportar a troca automática de esquema de cores do modo escuro, convertemos essas cores no núcleo para propriedades CSS personalizadas. Você pode ver facilmente a lista completa no inspetor agora:
Temas e plugins precisam trocar todas as variáveis SCSS $color usadas em folhas de estilo pelas equivalentes propriedades CSS --color. Na maioria dos casos, esta é uma tarefa simples de localizar e substituir:
- background-color: $primary-very-low;
+ background-color: var(--primary-very-low);
Mas há alguns casos em que um tema ou plugin está usando uma variação mais complexa de uma cor, por exemplo, ao escurecer ou clarear usando funções de cor SCSS. Esses casos exigem uma refatoração mais complexa, e para isso adicionamos a capacidade de estender as definições de cores em temas e plugins.
Em plugins
Este commit no plugin discourse-encrypt é um bom e simples exemplo de tal refatoração. Ele move uma declaração SCSS mix($color1, $color2) para um arquivo separado e a armazena como uma propriedade customizada CSS. Então, o novo arquivo é registrado como um asset :color_definitions, o que garante que a propriedade de cor recém-declarada seja incluída na folha de estilo de definições de cores.
Em temas
Em temas, você pode fazer a mesma coisa declarando propriedades customizadas CSS na folha de estilo common/color_definitions.scss. Você pode ver este commit no tema graceful como um exemplo.
Algumas notas adicionais
- ao usar cores transparentes através da função
rgba($color, 0.5), o SCSS aceita cores HEX e RGB no primeiro parâmetro, enquanto as propriedades customizadas CSS só aceitam uma cor RGB. É por isso que introduzimos o helperhexToRGB()e algumas propriedades com o sufixo--rgbnas definições de cores. Um exemplo:
// color_definitions.scss
:root {
--primary: #{$primary};
--primary-rgb: #{hexToRGB($primary)};
}
// outra folha de estilo
.element {
background-color: rgba(var(--primary-rgb), 0.05);
}
- note que no trecho acima, a variável SCSS é interpolada quando passada para uma propriedade customizada. Isso é um requisito no SCSS, veja Sass: Property Declarations para mais detalhes.
- a declaração CSS
var()pode ter um valor de fallback para um segundo valor se o primeiro não estiver disponível, como em, ao escrevervar(--color1, red), o CSS fará fallback para a cor vermelha se a propriedade--color1não for encontrada. Em plugins, usamos as variáveis de cor SCSS como fallbacks para garantir compatibilidade com versões anteriores do Discourse. Então, o exemplo anterior ficaria assim com um fallback:
- background-color: $primary-very-low;
+ background-color: var(--primary-very-low, $primary-very-low);
Este documento é controlado por versão - sugira alterações no github.

