# Обновите темы и плагины для поддержки автоматического темного режима

**URL:** https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595
**Category:** Developer Guides
**Tags:** how-to, auto-dark, theme-guides
**Created:** [20.Август.2020 22:29:35 UTC](https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595 "2020-08-20T22:29:35Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### Author: ![Discourse](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/discourse/32/148734_2.png) [@Discourse](https://meta.discourse.org/u/Discourse)
#### Post date: [20.Август.2020 22:29:35 UTC](https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595/1 "2020-08-20T22:29:35Z")

</div>

Ранее все цвета в Discourse хранились как переменные SCSS. Для поддержки [автоматического переключения цветовой схемы в тёмном режиме](https://meta.discourse.org/t/automatic-dark-mode-color-scheme-switching/161593) мы преобразовали эти цвета в ядре в пользовательские свойства CSS. Теперь вы можете легко просмотреть полный список в инспекторе:

 ![image](https://global.discourse-cdn.com/meta/original/4X/e/0/b/e0b7d84289dbbfe9dd3c53b934a51c60f05d8232.jpeg)

Темам и плагинам необходимо заменить все переменные SCSS `$color`, используемые в стилях, на эквивалентные пользовательские свойства CSS `--color`. В большинстве случаев это простая задача поиска и замены:

```diff
- background-color: $primary-very-low;
+ background-color: var(--primary-very-low);

```

Однако есть случаи, когда тема или плагин использует более сложную вариацию цвета, например, при затемнении или осветлении с помощью функций цвета SCSS. В таких случаях требуется более сложная рефакторинг, и для этого мы добавили возможность расширять определения цветов в темах и плагинах.

#### В плагинах

[Этот коммит](https://github.com/discourse/discourse-encrypt/commit/d8758ec7657ce073e6d42b30c4a7c5a2cd0ffeae) в плагине discourse-encrypt является хорошим и простым примером такой рефакторинга. Он перемещает объявление SCSS `mix($color1, $color2)` в отдельный файл и сохраняет его как пользовательское свойство CSS. Затем новый файл регистрируется как актив `:color_definitions`, что гарантирует включение вновь объявленного свойства цвета в таблицу определений цветов.

#### В темах

В темах вы можете сделать то же самое, объявив пользовательские свойства CSS в таблице стилей `common/color_definitions.scss`. Вы можете посмотреть этот [коммит в теме graceful](https://github.com/discourse/graceful/commit/b44f048cd97bf33b8d3316974844476a25466ee0) в качестве примера.

### Дополнительные примечания

- при использовании прозрачных цветов через функцию `rgba($color, 0.5)` SCSS принимает HEX и RGB цвета в первом параметре, тогда как пользовательские свойства CSS принимают только RGB цвета. Вот почему мы добавили вспомогательную функцию `hexToRGB()` и некоторые свойства с суффиксом `--rgb` в определениях цветов. Пример:

```scss
// color_definitions.scss
:root {
  --primary: #{$primary};
  --primary-rgb: #{hexToRGB($primary)};
}

// другой файл стилей
.element {
  background-color: rgba(var(--primary-rgb), 0.05);
}

```

- обратите внимание, что в приведённом выше фрагменте переменная SCSS интерполируется при передаче в пользовательское свойство. Это требование SCSS, подробнее см. [Sass: Property Declarations](https://sass-lang.com/documentation/style-rules/declarations).
- объявление CSS `var()` может использовать значение по умолчанию, если первое значение недоступно. Например, при записи `var(--color1, red)` CSS вернёт красный цвет, если свойство `--color1` не найдено. В плагинах мы используем переменные цвета SCSS в качестве значений по умолчанию для обеспечения совместимости с предыдущими версиями Discourse. Таким образом, приведённый выше пример с значением по умолчанию будет выглядеть так:

```diff
- background-color: $primary-very-low;
+ background-color: var(--primary-very-low, $primary-very-low);

```

* * *

Этот документ находится под версионным контролем — предложите изменения [на GitHub](https://github.com/discourse/discourse/blob/main/docs/developer-guides/docs/05-themes-components/20-dark-mode.md).

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [21.Август.2020 00:47:15 UTC](https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595/2 "2020-08-21T00:47:15Z")

</div>

> [@pmusaraj](#):
>
> Темам и плагинам необходимо заменить все переменные SCSS `$color`, используемые в таблицах стилей, на эквивалентные свойства CSS `--color`. Я

Я не очень разбираюсь в этом, и мне потребуется время, чтобы разобраться самостоятельно. . . Это значит, что все темы, которые ранее ссылались на цвета, теперь будут сломаны?

---

<div class="post-metadata">

### Author: ![pmusaraj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pmusaraj/32/119489_2.png) [@pmusaraj](https://meta.discourse.org/u/pmusaraj)
#### Post date: [21.Август.2020 00:51:00 UTC](https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595/3 "2020-08-21T00:51:00Z")

</div>

Нет, вовсе нет. SCSS-переменные в темах продолжат работать еще долгое время.

Однако любые цвета, выводимые через SCSS-переменные, останутся статичными, то есть их нельзя будет динамически переключить на новую цветовую схему при переходе браузера из обычного режима в темный. Таким образом, эти темы и плагины продолжат работать, но они не будут совместимы с автоматическим переключением в темный режим.

---

<div class="post-metadata">

### Author: ![tomtjes](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tomtjes/32/131271_2.png) [@tomtjes](https://meta.discourse.org/u/tomtjes)
#### Post date: [08.Сентябрь.2020 18:16:17 UTC](https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595/4 "2020-09-08T18:16:17Z")

</div>

Спасибо за инструкции. Можно ли также менять фоновое изображение в зависимости от тёмного/светлого режима? (Я использовал компонент переключателя темы для этого.) Возможно ли использовать CSS-класс, указывающий на текущий режим?

---

<div class="post-metadata">

### Author: ![pmusaraj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pmusaraj/32/119489_2.png) [@pmusaraj](https://meta.discourse.org/u/pmusaraj)
#### Post date: [09.Сентябрь.2020 16:18:14 UTC](https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595/5 "2020-09-09T16:18:14Z")

</div>

Отличный вопрос! Я попробовал это и заметил, что мы некорректно поддерживали использование фоновых изображений или переменных темы в специальном файле стилей для определений цветов. Поэтому я внес некоторые исправления в ядро, и теперь вы сможете это сделать (обязательно обновите ядро до последней версии).

Итак, если у вас в теме или компоненте темы есть два изображения с SCSS-переменными `$bg-light` и `$bg-dark` соответственно, вы можете добавить следующее в ваш файл стилей `color_definitions.scss`:

```scss

$bg: url(dark-light-choose($bg-light, $bg-dark));

:root {
  --custom-bg: #{$bg};
}

```

А затем вы можете использовать `var(--custom-bg)` в вашем обычном файле стилей.

---

<div class="post-metadata">

### Author: ![riking](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/riking/32/170938_2.png) [@riking](https://meta.discourse.org/u/riking)
#### Post date: [17.Сентябрь.2020 08:39:54 UTC](https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595/6 "2020-09-17T08:39:54Z")

</div>

Для изображения достаточно использовать стандартный CSS-медиазапрос prefers-dark-theme.

---

<div class="post-metadata">

### Author: ![pmusaraj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pmusaraj/32/119489_2.png) [@pmusaraj](https://meta.discourse.org/u/pmusaraj)
#### Post date: [17.Сентябрь.2020 13:18:54 UTC](https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595/7 "2020-09-17T13:18:54Z")

</div>

> [@riking](#):
>
> vanilla предпочитает медиа-запрос CSS для тёмной темы

Это не будет работать во всех случаях, так как медиа-запрос не учитывает предпочтения пользователя. Пользователи могут отключить автоматическое переключение тёмного режима, но медиа-запрос об этом не узнает, и в результате будет отображаться фон, предназначенный для тёмной цветовой схемы.

---

<div class="post-metadata">

### Author: ![j127](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/j127/32/79093_2.png) [@j127](https://meta.discourse.org/u/j127)
#### Post date: [02.Август.2025 23:23:15 UTC](https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595/8 "2025-08-02T23:23:15Z")

</div>

Возможно ли, чтобы Discourse также добавлял CSS-класс к тегу `<body>` для цветовой схемы или её идентификатора? Это, казалось бы, значительно упростило бы задачу.

Я пытаюсь решить проблему при конвертации темы, где требуется множество различных CSS-правил и переменных, и это превращается в сложный хаос в файле `color_definitions.scss`.

Если бы я мог просто сделать что-то вроде этого в изолированном SCSS-файле в теме, то на то, что сейчас занимает много времени на разбирательство с `color_definitions.scss`, ушло бы всего 5 минут:

```scss
body.dark-palette .some-thing {
  // какие-то стили
}

body.light-palette .some-thing {
  // какие-то стили
}

```

Возможно, я не понимаю наилучший способ сделать это, но кажется, что для каждой переменной приходится выполнять множество действий — настройка одной CSS-переменной занимает 17 строк в редакторе далеко от того небольшого места, где она будет использоваться:

- определение значения светлого режима в SCSS-переменной (это может занимать 6 строк в редакторе для чего-то вроде линейного градиента);
- определение значения темного режима в SCSS-переменной (еще 6 строк);
- определение SCSS-переменной с использованием `dark-light-choose` (4 строки из-за длинных имен переменных);
- присвоение этой последней SCSS-переменной CSS-переменной в `:root` (1 строка).

Также требуется время, чтобы придумать названия для всех четырех элементов, поскольку они являются глобальными.

---

<div class="post-metadata">

### Author: ![pmusaraj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pmusaraj/32/119489_2.png) [@pmusaraj](https://meta.discourse.org/u/pmusaraj)
#### Post date: [04.Август.2025 14:25:20 UTC](https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595/9 "2025-08-04T14:25:20Z")

</div>

Да, в файлах определений цветов может оказаться много строк кода, особенно для градиентов.

Тем не менее, на мой взгляд, это всё ещё наиболее подходящее «место» для этого. Да, это находится отдельно от элемента, где он используется, но это удобное единое место для управления цветами и градиентами, которые переключаются в зависимости от светлой или тёмной темы.

Альтернативой может быть использование чего-то подобного:

```css
@container style(--scheme-type: light){
  body{
    background: red;
  }
}

```

Наши цветовые схемы включают свойство `--scheme-type`, которое равно `light` для светлых схем и `dark` для тёмных. Современные браузеры поддерживают запросы к контейнерам, поэтому этот подход позволит решить вашу задачу без добавления класса к тегу body на странице.

---

<div class="post-metadata">

### Author: ![j127](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/j127/32/79093_2.png) [@j127](https://meta.discourse.org/u/j127)
#### Post date: [06.Август.2025 14:04:43 UTC](https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595/10 "2025-08-06T14:04:43Z")

</div>

Мои навыки работы с CSS/SCSS не очень хороши. Возможно, это проще для тех, кто глубоко погружён в эти технологии.

Это приводило к беспорядку в файле `color_definitions.scss`, поэтому я переместил его в другой файл в папке `scss/`, чтобы иметь возможность его импортировать. Я не уверен, как лучше всё назвать, поэтому сейчас это выглядит так.

 ![SCSS file organizaztion](https://global.discourse-cdn.com/meta/original/4X/e/4/3/e43475f3030d9093637776daf35687cee18b9900.png)

Думаю, было бы проще реализовать это через класс body (или, возможно, добавив больше примеров), но в любом случае сейчас это работает. Я не знаю, как работают контейнерные запросы, но позже изучу эту тему.

---

<div class="post-metadata">

### Author: ![panic](https://avatars.discourse-cdn.com/v4/letter/p/3ab097/32.png) [@panic](https://meta.discourse.org/u/panic)
#### Post date: [14.Ноябрь.2025 10:45:01 UTC](https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595/11 "2025-11-14T10:45:01Z")

</div>

Обратите внимание, что на сегодняшний день (14.11.2025) запросы стилей для пользовательских свойств не работают в Firefox ([1795622 - (container-style-queries) [css-contain-3] [meta] Support style() container queries](https://bugzilla.mozilla.org/show_bug.cgi?id=1795622)).
