Перейти к основному содержимому

Предустановленные темы

@lh-ui/share поставляется с пятью встроенными пресетами палитр в китайском стиле; @lh-ui/react потребляет их как есть. Пресеты изменяют цветовые переменные --lh-* и ортогональны светлому / тёмному режиму (useLhTheme).

Список пресетов​

ИмяОписание
cerblueФарфорово-синий (по умолчанию)
songhua松花绿 (зеленый сосны)
zhusha朱砂 (киноварь)
shuimo水墨 (тушь)
goldenЗолотая осень

Переключение во время выполнения​

Переключение выполняется через useLhPresetTheme. Переменные пресета записываются в <style id="lh-preset-theme"> (на уровне :root) и применяются глобально:

import { useLhPresetTheme } from '@lh-ui/react'

function PresetSwitcher() {
const { preset, setPreset, presets } = useLhPresetTheme()

return (
<select value={preset} onChange={(e) => setPreset(e.target.value as never)}>
{presets.map((p) => (
<option key={p.name} value={p.name}>
{p.name}
</option>
))}
</select>
)
}

Возвращаемые значения:

ПолеТипОписание
presetThemePresetNameИмя текущего пресета
setPreset(name) => voidПереключить пресет (синхронно записывается в localStorage)
presetsThemePreset[]Полный список пресетов
themeVarsRecord<string, string>Совместимые с ConfigProvider переменные текущего пресета (ключи уже без префикса --lh-)

Связка с ConfigProvider​

Возвращаемое themeVars можно сразу передать в LhConfigProvider, чтобы пресет действовал только на поддерево, а не на всю страницу:

import { LhConfigProvider, useLhPresetTheme } from '@lh-ui/react'

function App() {
const { themeVars } = useLhPresetTheme({ initialPreset: 'zhusha' })
return (
<LhConfigProvider themeVars={themeVars}>
<YourApp />
</LhConfigProvider>
)
}

Антифликер​

Во время сборки сайт сериализует соответствие «имя пресета → текст стиля» в синхронный скрипт в head HTML; он применяет пресет, запомненный в localStorage, до первой отрисовки, чтобы при обновлении страницы не мелькал цвет по умолчанию. Настройка находится в PRESET_FOUC_SCRIPT файла docs/docusaurus.config.ts.

Нельзя использовать inline style

Переменные пресета можно записывать только в элемент <style>, а не в document.documentElement.style: специфичность inline-стиля 1,0,0,0 всегда превосходит таблицы стилей, и при переключении пресета во время выполнения страница продолжит читать устаревшие inline-значения, а весь блок тёмных переменных var-dark.scss будет перекрыт.