Skip to content
F Fastry
astro-rocket тёмный-режим цветовой-режим системная-тема

Система, Светлая, Тёмная — как работает цветовой режим Fastry

Полное описание трёхпозиционной системы цветовых режимов Fastry: тёмный/светлый/системный, начальная загрузка без мерцания, View Transitions и переключение в шапке.

A

Almaz

2 мин. чтения

Fastry использует трёхпозиционную систему цветовых режимов — Системный / Светлый / Тёмный — вместо бинарного переключателя. В этом посте объясняется, как она работает, как предотвращает мерцание и как её настроить.

Как это работает

Система состоит из трёх взаимодействующих частей:

  1. Атрибуты на <html> — SSR-запасной вариант для посетителей с отключённым JavaScript
  2. Скрипт начальной загрузки — выполняется до отрисовки страницы и согласовывает все три значения из хранилища
  3. Переключатель в шапке — выпадающее меню для выбора режима

Элемент HTML

В src/layouts/BaseLayout.astro элемент <html> содержит:

<html lang="ru" class="scroll-smooth dark" data-theme="blue" data-theme-mode="system">

Три части состояния взаимодействуют:

  • class="dark" — SSR-запасной вариант для посетителей с отключённым JS. Вариант тёмной темы Tailwind привязан к нему.
  • data-theme-mode="system" — отражает сохранённый выбор пользователя и управляет иконкой в шапке.
  • data-theme="blue" — палитра цветов по умолчанию.

Для посетителей с включённым JavaScript встроенный скрипт начальной загрузки в <head> выполняется до отрисовки body и согласовывает все три значения из хранилища.

Хранилище

  • localStorage.theme'system' | 'light' | 'dark' — сохранённый цветовой режим пользователя (по умолчанию 'system')

В режиме 'system' начальная загрузка также подписывается на window.matchMedia('(prefers-color-scheme: dark)') и применяется при каждом изменении ОС.

Предотвращение мерцания (Flash of Wrong Theme)

Главная проблема цветовых режимов — мерцание неправильной темы, когда страница сначала отрисовывается в светлом режиме, а затем JS переключает на тёмный. Fastry решает это с помощью встроенного скрипта в <head>:

<script>
  (function bootstrapColorMode() {
    const theme = localStorage.getItem('theme');
    const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
    // Применяем правильный класс ДО отрисовки body
    // ...
  })();
</script>

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

View Transitions

Система цветовых режимов полностью совместима с View Transitions API. При навигации между страницами выбранный режим сохраняется без сброса.

Настройка режима по умолчанию

Чтобы изменить режим по умолчанию для новых посетителей, отредактируйте атрибуты в src/layouts/BaseLayout.astro:

<!-- Светлый режим по умолчанию -->
<html lang="ru" class="scroll-smooth" data-theme-mode="light">

<!-- Тёмный режим по умолчанию -->
<html lang="ru" class="scroll-smooth dark" data-theme-mode="dark">

<!-- Системный по умолчанию (рекомендуется) -->
<html lang="ru" class="scroll-smooth dark" data-theme-mode="system">

Сохранённый выбор пользователя всегда имеет приоритет после выполнения начальной загрузки.

Компонент переключателя

Переключатель цветового режима находится в шапке в виде пилюли. Он показывает текущий режим и позволяет переключаться между тремя состояниями. Компонент находится в src/components/layout/ и использует только нативный JavaScript — никаких фреймворков.

Полная документация и исходный код доступны в репозитории Fastry.

Поделиться:

Похожие записи

Мультиязычность: родная интернационализация в Fastry 1.3.0

Как работает новая опциональная система i18n, что она добавляет при включении и точные шаги для запуска сайта на английском и втором языке.

A Almaz
2 мин. чтения
astro-rocket i18n интернационализация руководство v1-3-0

Комментарии к постам блога — Giscus с ленивой загрузкой

Fastry поддерживает комментарии в блоге на основе Giscus и GitHub Discussions. Скрипт загружается лениво — читатели платят нулевую стоимость, если не прокручивают до низа.

A Almaz
2 мин. чтения
astro-rocket функции блог комментарии giscus

Независимое меню подвала — разные ссылки в шапке и подвале

Fastry теперь позволяет настраивать меню подвала независимо от навигации шапки. Добавьте ссылку на Политику конфиденциальности, Импринт или Политику Cookie без загромождения основной навигации.

A Almaz
2 мин. чтения
astro-rocket функции подвал навигация

Подписывайтесь

Будьте в курсе — новые статьи, мысли и обновления.