Skip to content

Настройка темы ​

lh-ui-plus предоставляет полноценную систему тем на CSS-переменных: палитра в китайском стиле, тёмная тема, узорные фона, переключение во время выполнения и другие широкие возможности настройки.

Хотите настроить цвета визуально и сразу экспортировать scss? См. Студия тем.

Палитра в китайском стиле ​

Библиотека берёт за основу традиционную эстетику живописи тушью 水墨丹青 и определяет 8 тематических цветов:

ЦветСмыслОсновнойhoverПрименение
Индигосинева 青花瓷#2B4C7C#3D649Eосновные кнопки, ссылки, состояние фокуса
松花绿 (сосново-зелёный)зелень бамбуковых теней#5B8C5A#6FA36Eсостояние успеха
藤黄 (gamboge)золотая осенняя листва#C4A35A#D4B76Fсостояние предупреждения
朱砂 (киноварь) (опасность)красная печатная паста#B23A3A#C45050состояние опасности / ошибки (--lh-danger-*)
Тёмно-серыйлёгкие краски тушью#7A7A7A#8F8F8Fинформационное состояние
Золотойблагородная старинная роскошь#B8860B#D4A843декоративные акценты (--lh-gold-*)
朱砂-красный (акцент)акцентный вариант с уклоном в 朱砂#C43A31#E85D4Aакцентный цвет (--lh-vermilion-*)
Нефритовыйизящество зелёного бамбука#5B8C5A#7AAE7Aуспех / декор (совпадает с 松花绿)

Каждый цвет обычно включает 4 уровня (основной / hover / active / светлый фон), а для основного цвета и золотого дополнительно предусмотрены более светлые тона границ (*-color-border), обеспечивающие подходящий контраст в разных сценариях.

Система тем на CSS-переменных ​

Все цвета темы реализованы через CSS custom properties (--lh-*), всего 88+ переменных, покрывающих следующие категории:

Переменные цветов ​

Префикс переменнойОписаниеПример
--lh-primary-colorбазовое значение основного цвета#2B4C7C
--lh-primary-color-hoverосновной цвет в состоянии hover#3D649E
--lh-primary-color-activeосновной цвет в состоянии active#1F3A5F
--lh-primary-color-bgсветлый фон основного цвета#E8EDF3
--lh-success-colorцвет успеха#5B8C5A
--lh-warning-colorцвет предупреждения#C4A35A
--lh-danger-colorцвет опасности#B23A3A
--lh-info-colorинформационный цвет#7A7A7A

Переменные текста ​

ПеременнаяОписаниеЗначение по умолчанию
--lh-text-primaryосновной текст#2C2C2C
--lh-text-regularобычный текст#5A5A5A
--lh-text-secondaryвспомогательный текст#8A8A8A
--lh-text-placeholderплейсхолдер#B0B0B0
--lh-text-disabledотключённый текст#C8C8C8

Переменные границ ​

ПеременнаяОписаниеЗначение по умолчанию
--lh-border-color-baseобычная граница#D8D3CC
--lh-border-color-lightлёгкая граница#E5E0D8
--lh-border-radius-baseбазовый радиус скругления2px
--lh-border-radius-roundкапсульный радиус скругления20px

Переменные фона ​

ПеременнаяОписаниеЗначение по умолчанию
--lh-bg-colorфон компонентов#FAF6F0 (цвет 宣纸)
--lh-bg-color-pageфон страницы#F5F0EB
--lh-bg-color-overlayфон Overlay-маскиrgba(26, 26, 26, 0.4)

Переменные теней ​

ПеременнаяОписание
--lh-box-shadow-baseобычная тень
--lh-box-shadow-lightлёгкая тень
--lh-box-shadow-lighterочень лёгкая тень

Переменные шрифтов ​

ПеременнаяОписаниеЗначение по умолчанию
--lh-font-familyсемейство шрифтовNoto Serif SC, STSong, SimSun...
--lh-font-size-baseбазовый размер шрифта14px
--lh-font-size-smallмелкий размер шрифта13px
--lh-font-weight-primaryобычная насыщенность шрифта400
--lh-font-line-height-primaryмежстрочный интервал1.8

Переменные отступов ​

ПеременнаяЗначениеНазначение
--lh-spacing-xs4pxминимальный отступ
--lh-spacing-sm8pxмалый отступ
--lh-spacing-md12pxсредний отступ
--lh-spacing-base16pxбазовый отступ
--lh-spacing-lg20pxбольшой отступ
--lh-spacing-xl24pxочень большой отступ

Переменные Z-Index ​

ПеременнаяЗначениеНазначение
--lh-z-index-dropdown1000выпадающее меню
--lh-z-index-modal1050модальное окно
--lh-z-index-tooltip2000всплывающая подсказка

Переменные переходов ​

ПеременнаяЗначениеОписание
--lh-transition-duration-fast0.25sбыстрый переход
--lh-transition-duration-base0.3sпереход по умолчанию
--lh-transition-duration-slow0.4sмедленный переход

Тёмная тема ​

В библиотеку встроены стили тёмной темы: все CSS-переменные автоматически переключаются на адаптированные значения в тёмном режиме.

Способ 1: composable-функция useLhTheme ​

Composition API ​

vue
<script setup lang="ts">
import { useLhTheme } from '@lh-ui/vue3'

const { theme, toggleTheme, setTheme } = useLhTheme()
</script>

<template>
  <div>
    <LhButton @click="toggleTheme">
      {{ theme === 'dark' ? 'Светлая тема' : 'Тёмная тема' }}
    </LhButton>
    <LhButton @click="() => setTheme('light')">Светлая</LhButton>
    <LhButton @click="() => setTheme('dark')">Тёмная</LhButton>
  </div>
</template>

Options API ​

vue
<script>
import { useLhTheme } from '@lh-ui/vue3'

export default {
  setup() {
    const { theme, toggleTheme, setTheme } = useLhTheme()
    return { theme, toggleTheme, setTheme }
  },
}
</script>

<template>
  <div>
    <LhButton @click="toggleTheme">
      {{ theme === 'dark' ? 'Светлая тема' : 'Тёмная тема' }}
    </LhButton>
  </div>
</template>

useLhTheme автоматически сохраняет состояние темы в localStorage (ключ lh-ui-theme) — после обновления страницы тема не теряется.

Способ 2: переключение HTML-атрибутом ​

Установите на корневом элементе data-theme="dark", чтобы глобально включить тёмную тему:

html
<!DOCTYPE html>
<html lang="zh-CN" data-theme="dark">
  <!-- ... -->
</html>

Собственные цвета темы (青花瓷 / 松花绿 / 朱砂-красный) ​

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

Приведённый ниже пример — демонстрация ручного описания пользовательских переменных, значения подобраны для наглядности и не полностью совпадают со встроенными пресетами с теми же именами из раздела Предустановленные темы (cerblue / songhua / zhusha). Чтобы использовать встроенный пресет напрямую, возьмите useLhPresetTheme или getThemeVars(name).

Тема 青花瓷 ​

Основной цвет — глубокий индиго, вдохновлённый традиционным фарфором 青花瓷.

Composition API ​

vue
<script setup lang="ts">
const cerblueTheme = {
  'primary-color': '#2B4C7C',
  'primary-color-hover': '#3D649E',
  'primary-color-active': '#1F3A5F',
  'primary-color-bg': '#E8EDF3',
  'bg-color': '#F0F4F8',
  'border-color-base': '#C8D6E5',
}
</script>

<template>
  <LhConfigProvider :theme-vars="cerblueTheme">
    <LhButton type="primary">Сине-белый фарфор</LhButton>
    <LhInput placeholder="Поле ввода сине-белого фарфора" />
  </LhConfigProvider>
</template>

Options API ​

vue
<script>
import { LhConfigProvider, LhButton, LhInput } from '@lh-ui/vue3'

export default {
  components: { LhConfigProvider, LhButton, LhInput },
  data() {
    return {
      cerblueTheme: {
        'primary-color': '#2B4C7C',
        'primary-color-hover': '#3D649E',
        'primary-color-bg': '#E8EDF3',
        'bg-color': '#F0F4F8',
      },
    }
  },
}
</script>

<template>
  <LhConfigProvider :theme-vars="cerblueTheme">
    <LhButton type="primary">Сине-белый фарфор</LhButton>
  </LhConfigProvider>
</template>

Тема 松花绿 ​

Бамбуково-зелёные акценты создают свежую и естественную атмосферу.

vue
<script setup lang="ts">
const bambooTheme = {
  'primary-color': '#5B8C5A',
  'primary-color-hover': '#6FA36E',
  'primary-color-bg': '#EDF5EC',
  'success-color': '#5B8C5A',
  'bg-color': '#F6FAF5',
}
</script>

<template>
  <LhConfigProvider :theme-vars="bambooTheme">
    <LhButton type="primary">Тенистая бамбуковая тропа</LhButton>
    <LhTag type="success">Молодая листва</LhTag>
  </LhConfigProvider>
</template>

Тема 朱砂-красный ​

Основной тон — красная печатная паста 朱砂, подчёркивающий благородную и торжественную атмосферу.

vue
<script setup lang="ts">
const vermilionTheme = {
  'primary-color': '#C43A31',
  'primary-color-hover': '#E85D4A',
  'primary-color-bg': '#FDF0EE',
  'bg-color': '#FFFBF9',
  'border-color-base': '#F0D5CF',
}
</script>

<template>
  <LhConfigProvider :theme-vars="vermilionTheme">
    <LhButton type="primary">Алый указ</LhButton>
  </LhConfigProvider>
</template>

Система узорных фонов ​

Библиотека предоставляет систему поэтичных узорных фонов в китайском стиле с 6 предустановленными узорами и точным управлением областью применения через белый список patternComponents.

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

Название узораCSS-переменнаяОписание
柳叶 (ивовый лист)var(--lh-pattern-willow)тонкие длинные листья, гармоничная плотность
祥云 (благоприятное облако)var(--lh-pattern-cloud)плавно расходящиеся облака, извилистые линии
水波 (волны)var(--lh-pattern-water)лёгкая рябь, наслаивающаяся рядами
雪花 (снежинка)var(--lh-pattern-snow)шестиугольная снежинка с тонкими ветвями
梅花 (цветение сливы)var(--lh-pattern-plum)пять лепестков вокруг отчётливой сердцевины
竹叶 (лист бамбука)var(--lh-pattern-bamboo)ланцетовидные листья, естественный беспорядок

Глобальная настройка узоров ​

Composition API ​

vue
<script setup lang="ts">
const config = {
  themeVars: {
    'bg-pattern': 'var(--lh-pattern-cloud)',
    'bg-pattern-opacity': '0.15',
  },
  patternComponents: ['button', 'input'] as const,
}
</script>

<template>
  <LhConfigProvider
    :theme-vars="config.themeVars"
    :pattern-components="config.patternComponents"
  >
    <!-- Узор применится к кнопке и полю ввода, но не к Dialog -->
    <LhButton>Кнопка с узором</LhButton>
    <LhInput placeholder="Поле ввода с узором" />
  </LhConfigProvider>
</template>

Options API ​

vue
<script>
export default {
  data() {
    return {
      config: {
        themeVars: {
          'bg-pattern': 'var(--lh-pattern-cloud)',
          'bg-pattern-opacity': '0.15',
        },
        patternComponents: ['button', 'input'],
      },
    }
  },
}
</script>

<template>
  <LhConfigProvider
    :theme-vars="config.themeVars"
    :pattern-components="config.patternComponents"
  >
    <LhButton>Кнопка с узором</LhButton>
  </LhConfigProvider>
</template>

Справочник переменных узора ​

ПеременнаяОписаниеЗначение по умолчанию
--lh-bg-patternURL узорного фонаnone
--lh-bg-pattern-repeatрежим мозаичного размещенияrepeat
--lh-bg-pattern-sizeразмер узора40px
--lh-bg-pattern-opacityпрозрачность узора0.15
--lh-bg-pattern-colorцвет узораvar(--lh-decoration-color, rgba(184, 134, 11, 0.12))
--lh-bg-pattern-blendрежим наложенияsoft-light

Полный пример настройки ​

Полное использование ConfigProvider, объединяющее все возможности: тему, язык, размер, узоры.

Composition API ​

vue
<script setup lang="ts">
import { zhCN } from '@lh-ui/vue3'

const configProvider = {
  size: 'medium' as const,
  locale: zhCN,
  themeVars: {
    'primary-color': '#2B4C7C',
    'bg-pattern': 'var(--lh-pattern-cloud)',
    'bg-pattern-opacity': '0.15',
  },
  patternComponents: ['button', 'input', 'dialog'],
}
</script>

<template>
  <LhConfigProvider
    :size="configProvider.size"
    :locale="configProvider.locale"
    :theme-vars="configProvider.themeVars"
    :pattern-components="configProvider.patternComponents"
  >
    <slot />
  </LhConfigProvider>
</template>

Options API ​

vue
<script>
import { zhCN } from '@lh-ui/vue3'

export default {
  data() {
    return {
      configProvider: {
        size: 'medium',
        locale: zhCN,
        themeVars: {
          'primary-color': '#2B4C7C',
          'bg-pattern': 'var(--lh-pattern-cloud)',
        },
        patternComponents: ['button', 'input', 'dialog'],
      },
    }
  },
}
</script>

<template>
  <LhConfigProvider
    :size="configProvider.size"
    :locale="configProvider.locale"
    :theme-vars="configProvider.themeVars"
    :pattern-components="configProvider.patternComponents"
  >
    <slot />
  </LhConfigProvider>
</template>

Приоритет переменных темы ​

Итоговые CSS-переменные компонента сливаются со следующим приоритетом (последующее перекрывает предыдущее):

  1. Глобальные themeVars ConfigProvider (низший приоритет)
  2. Покомпонентные componentTheme[имя-компонента] ConfigProvider
  3. Собственный проп themeVars компонента
  4. Собственный проп bgPattern компонента (высший приоритет)

Для переменной bg-pattern дополнительно действует белый список patternComponents: глобальный bg-pattern применяется только к компонентам из списка.

Быстрая раскладка sx ​

Пропс sx — декларативный способ задать раскладку компонента инлайн: отступы и размеры без написания CSS. Сейчас поддерживается в компонентах: Button, Input, Dialog, Tooltip, Alert, Card, Empty, Breadcrumb, Pagination, Steps, Tabs, Skeleton.

Принцип ​

sx основан на сетке с базой 8px: числовое значение умножается на 8 и даёт пиксели. Например mt: 2 эквивалентно marginTop: 16px.

Поддерживаемые свойства ​

Отступы ​

СвойствоОписаниеПримерЭквивалент в CSS
mвнешние отступы со всех сторонm: 2margin: 16px
mxгоризонтальные внешние отступыmx: 1marginLeft: 8px; marginRight: 8px
myвертикальные внешние отступыmy: 1marginTop: 8px; marginBottom: 8px
mt, mr, mb, mlодносторонние внешние отступыmt: 2marginTop: 16px
pвнутренние отступы со всех сторонp: 3padding: 24px
pxгоризонтальные внутренние отступыpx: 2paddingLeft: 16px; paddingRight: 16px
pyвертикальные внутренние отступыpy: 1paddingTop: 8px; paddingBottom: 8px
pt, pr, pb, plодносторонние внутренние отступыpt: 2paddingTop: 16px

Размеры ​

СвойствоОписаниеПример
wширина (число — px, строка — как есть)w: 200 или w: '100%'
hвысотаh: 100 или h: 'auto'

Flex-раскладка ​

СвойствоОписаниеПример
displayтип отображенияdisplay: 'flex'
flexсокращение flexflex: '1 1 0%'
flexDirectionнаправление главной осиflexDirection: 'column'
alignItemsвыравнивание по поперечной осиalignItems: 'center'
justifyContentвыравнивание по главной осиjustifyContent: 'flex-end'

Пример использования ​

vue
<script setup lang="ts">
import { ref } from 'vue'

const visible = ref(false)
</script>

<template>
  <!-- Отступы кнопки -->
  <LhButton type="primary" :sx="{ mt: 2, mx: 1 }">Кнопка с отступами</LhButton>

  <!-- Внешние отступы поля ввода -->
  <LhInput placeholder="Вертикальные отступы поля" :sx="{ my: 1 }" />

  <!-- Ширина Dialog: sx поддерживает только w/h и отступы -->
  <LhDialog v-model="visible" title="Пример" :sx="{ w: 480 }">
    <p>Диалог фиксированной ширины</p>
  </LhDialog>
</template>
vue
<script>
export default {
  data() {
    return { visible: false }
  },
}
</script>

<template>
  <LhButton type="primary" :sx="{ mt: 2, mx: 1 }">Кнопка с отступами</LhButton>
</template>

Красота традиций — основа кода