Обзор
Этот файл описывает контракт стилизации Select и его дочерних частей через CSS-переменные.
Публичные CSS-переменные
Эти переменные напрямую используются текущей реализацией и являются самыми реалистичными точками переопределения для стилизации на уровне продукта.
| Переменная | Значение | Влияет на |
|---|---|---|
| Общая база высоты и радиуса компонентакорень, combobox, listbox | В этом состоянии изменений не видно | |
| Общий коэффициент радиуса скруглениякорень, combobox, listbox | В этом состоянии изменений не видно | |
Переопределение коэффициента радиуса для триггераSelectCombobox | В этом состоянии изменений не видно | |
Переопределение коэффициента радиуса для панелиSelectListbox | В этом состоянии изменений не видно | |
Цвет текста выбранного значенияSelectValue | В этом состоянии изменений не видно | |
Цвет текста плейсхолдераSelectValue | В этом состоянии изменений не видно | |
Цвет иконки триггераSelectIcon | В этом состоянии изменений не видно |
Переменные уровня частей
Стилизация Select распределена так:
- переменные размера корня в
Select - переменные триггера в
SelectCombobox - переменные цвета значения и плейсхолдера в
SelectValue - переменные цвета иконки в
SelectIcon - переменные поверхности панели в
SelectListbox
Корень
Определены в packages/ui/src/Select/style.module.css:
--select-size--select-br-ratio
Поведение по умолчанию:
smсопоставляет--select-sizeсvar(--spacing-21)mdсопоставляет--select-sizeсvar(--spacing-24)lgсопоставляет--select-sizeсvar(--spacing-27)
Combobox
SelectCombobox использует:
--select-combobox-br-ratio--select-icon-color--select-placeholder-color--select-value-color
Поведение состояний в исходниках:
- вариант
fieldиспользует--fills-tertiaryи--fills-tertiary-hover - состояния фокуса и открытия используют
--color-primary-500 - отключённое состояние переназначает цвета иконки, плейсхолдера и значения на токены отключённого состояния
Значение
SelectValue вычисляет:
--select-value-colorс запасным вариантомvar(--text-color)--select-placeholder-colorс запасным вариантомvar(--label-tertiary)
Благодаря этому стили значения и плейсхолдера можно безопасно переопределять, не переписывая весь дочерний компонент.
Иконка
SelectIcon определяет:
--select-icon-color
Иконка поворачивается в открытом состоянии и наследует цвет из этой переменной.
Listbox
SelectListbox использует:
--select-listbox-br-ratio- общие
--select-sizeи--select-br-ratio
Также он зависит от глобальных токенов поверхности:
--surface-secondary--surface-shadow
Взаимодействие состояний и вариантов
В текущей реализации варианты field и inline не предоставляют отдельных переменных --select-* для вариантов. Их поведение в основном определяется:
data-variant- глобальными токенами поверхности
- токенами фокуса и отключённого состояния
Это значит:
- настройка размера и цвета текста проста
- перестилизация на уровне вариантов всё ещё частично зависит от глобальных токенов темы, а не от локальных переменных компонента
Примеры
Переопределение размера корня
--select-size и --select-br-ratio на корне меняют высоту триггера и скругление триггера и списка.
import type { CSSProperties } from 'react';
import {
Select,
SelectCombobox,
SelectIcon,
SelectListbox,
SelectOption,
SelectValue,
} from '@vega-ui/react';
export default function RootSizeOverride() {
return (Переопределение цвета значения и плейсхолдера
Оба цвета читаются с запасным значением, поэтому достаточно задать их на корне. Плейсхолдер должен заметно отличаться от выбранного значения.
import type { CSSProperties } from 'react';
import {
Select,
SelectCombobox,
SelectIcon,
SelectListbox,
SelectOption,
SelectValue,
} from '@vega-ui/react';
export default function ValueAndPlaceholderColorOverride() {
return (Переопределение иконки и списка
SelectIcon и SelectListbox сами задают --select-icon-color и --select-listbox-br-ratio, поэтому значение на корне перекрывается. Задавайте эти переменные на самих частях.
import type { CSSProperties } from 'react';
import {
Select,
SelectCombobox,
SelectIcon,
SelectListbox,
SelectOption,
SelectValue,
} from '@vega-ui/react';
export default function IconAndListboxOverride() {
return (Что не переопределять
- не полагайтесь на внутренние коэффициенты как на стабильный публичный API, не задокументировав их в дизайн-системе
- не переопределяйте стили так, что ломается видимость фокуса
- не делайте плейсхолдер и выбранный текст визуально неразличимыми
- не меняйте высоту и радиус независимо, не проверив согласованность триггера и списка