В Naive UI система тем основана на токенах, которые представляют собой переменные, определяющие внешний вид компонентов. Каждый токен управляет конкретным визуальным аспектом: цветами, отступами, размерами шрифтов, закруглением углов, тенями и другими стилевыми свойствами. Понимание и переопределение этих токенов позволяет гибко настраивать интерфейс под конкретный дизайн.
Глобальные токены Глобальные токены применяются
ко всем компонентам, если не переопределены локально. Они включают
базовые цвета темы (primary, success,
warning, error), шрифты и размеры. Пример
базовой структуры токенов:
import { createTheme, globalLight } from 'naive-ui'
const customTheme = createTheme({
name: 'custom-light',
base: globalLight,
overrides: {
common: {
primaryColor: '#42b983',
textColor1: '#333333',
borderRadius: '8px'
}
}
})
Здесь common содержит базовые токены для цвета, текста и
радиусов углов. Все компоненты, использующие эти токены, будут
отображаться в новых цветах и с изменённым радиусом.
Локальные токены компонентов Каждый компонент
имеет собственный набор токенов, который может переопределять глобальные
значения. Например, кнопка (Button) имеет токены:
buttonTextColorbuttonBorderRadiusbuttonColorHoverbuttonColorPressedПереопределение выглядит так:
import { createTheme, globalLight } from 'naive-ui'
const customButtonTheme = createTheme({
name: 'custom-button',
base: globalLight,
overrides: {
Button: {
buttonTextColor: '#ffffff',
buttonColorHover: '#369f6b',
buttonBorderRadius: '12px'
}
}
})
При этом глобальные токены primaryColor остаются
неизменными, если явно не заданы в локальных токенах.
Naive UI использует строгую иерархию:
overrides) – применяются
глобально к группе компонентов.base) – значения по
умолчанию из light или dark темы.Понимание этой иерархии важно для корректного переопределения стилей: локальный токен всегда перекрывает глобальный.
Цветовая система в Naive UI использует:
primaryColor,
infoColor, successColor,
warningColor, errorColor)baseColor,
tableHeaderColor, popoverColor)textColor1,
textColor2, textColor3)Пример комплексного переопределения:
import { createTheme, globalLight } from 'naive-ui'
const darkCustomTheme = createTheme({
name: 'dark-custom',
base: globalLight,
overrides: {
common: {
primaryColor: '#ff6b6b',
textColor1: '#f0f0f0',
textColor2: '#cccccc',
baseColor: '#1e1e1e',
borderRadius: '10px'
},
Button: {
buttonColorHover: '#ff8787',
buttonColorPressed: '#ff4d4d'
},
Input: {
inputBorder: '1px solid #555555',
inputColor: '#2b2b2b'
}
}
})
В этом примере глобальные токены задают основной цвет интерфейса, а локальные – особенности отдельных компонентов.
Naive UI поддерживает динамическое обновление токенов во время работы приложения, что позволяет создавать пользовательские переключатели темы:
import { useTheme, globalLight } from 'naive-ui'
import { ref } from 'vue'
const isDark = ref(false)
function toggleTheme() {
const themeOverrides = isDark.value
? {
common: { primaryColor: '#ff6b6b', baseColor: '#1e1e1e' }
}
: {
common: { primaryColor: '#42b983', baseColor: '#ffffff' }
}
useTheme(globalLight, themeOverrides)
isDark.value = !isDark.value
}
Такое решение позволяет мгновенно менять внешний вид всех компонентов без перезагрузки страницы.
Некоторые токены можно задавать через функции, что позволяет создавать зависимые значения:
import { createTheme, globalLight } from 'naive-ui'
const dynamicTheme = createTheme({
name: 'dynamic-theme',
base: globalLight,
overrides: {
common: {
primaryColor: '#42b983',
primaryColorHover: (token) => lighten(token.primaryColor, 10),
primaryColorPressed: (token) => darken(token.primaryColor, 10)
}
}
})
Здесь lighten и darken – функции для
изменения яркости цвета. Использование функций позволяет строить
адаптивные темы, где hover и pressed состояния
автоматически зависят от основного цвета.
Понимание и грамотное использование токенов темы в Naive UI открывает возможность создавать плавно настраиваемые интерфейсы, соблюдая единую визуальную идентичность и одновременно поддерживая разнообразие компонентов.