Тема
Тема задаёт светлое или тёмное оформление всего интерфейса. Без сохранённого выбора Framework следует системной настройке пользователя; кнопка темы позволяет выбрать схему явно.
Пример
На этом сайте темой управляет панель настроек документации, поэтому в превью кнопки показывают разметку и не переключают тему. На обычной странице кнопки работают сразу после загрузки Core: дополнительный код не нужен.
Разметка
Минимальную разметку показывает пример выше: нативная кнопка с классом
sf-theme-button, доступным именем и aria-pressed.
- Класс
sf-theme-buttonможно добавить к любой кнопке Framework — обычной или кнопке-иконке; своего оформления у него нет. - Кнопка без
data-themeпереключает светлую и тёмную тему. - Кнопка с
data-theme="system","light"или"dark"выбирает этот режим. - Тему Framework задаёт классом
theme-lightилиtheme-darkна элементеhtml; цвета компонентов и утилит следуют за ним.
Варианты
Выбор режима
Группа из трёх кнопок с data-theme даёт явный выбор: системная, светлая или
тёмная тема. Нажата кнопка, чьё значение совпадает с выбранным режимом; без
явного выбора это system. Одиночная кнопка без data-theme подходит для
шапки сайта, группа — для страницы настроек.
Доступность
-
aria-pressedвсех кнопокsf-theme-buttonставит Framework при загрузке и после каждой смены темы, в том числе у кнопок, добавленных позже. Кнопка безdata-themeнажата, когда действует тёмная тема. -
Группа выбора использует
aria-pressed, а не радиокнопки: оберните её в элемент сrole="group"иaria-label(«Выбор темы»). -
Вместе с
aria-pressedFramework ставит нажатой кнопке классactive(у Smart-кнопки — внутренней кнопке), поэтому выбранный режим виден и глазами. -
У кнопки-иконки доступное имя задаёт
aria-label(«Тёмная тема»); оно не меняется при переключении — состояние передаётaria-pressed. Значок тоже не меняется; другой значок для тёмной темы ставит код проекта по событиюsf-theme-change, которое приходит и при запуске:const glyph = document.querySelector('.sf-theme-button:not([data-theme]) .sf-icon'); window.addEventListener('sf-theme-change', (event) => { glyph.textContent = event.detail.theme === 'dark' ? 'light_mode' : 'dark_mode'; }); -
Смена темы не перемещает фокус.
JavaScript
SF.Loader.setTheme(preference) принимает system, light или dark и
возвращает false для другого значения. Явный выбор сохраняется на 30 дней
в cookie sf-theme с путём / и без домена: выбор общий для всех страниц
текущего хоста и не переходит на поддомены. setTheme('system') удаляет
cookie и возвращает управление
системной настройке, за изменением которой Framework следит.
SF.Loader.changeTheme() переключает светлую и тёмную тему, как кнопка без
data-theme.
После смены темы на window возникает событие sf-theme-change с полями
theme (light или dark — действующая тема) и preference (system,
light или dark — выбранный режим) в detail.
window.addEventListener('sf-theme-change', (event) => {
chart.setColors(event.detail.theme);
});
Если тема страницы задаётся иначе, задайте SF_BOOT_CONFIG.theme = false до
запуска Core: тогда Framework не меняет классы темы и не читает сохранённый
выбор.