Флажок
Флажок включает независимый параметр или выбирает несколько значений из списка. Для одного выбора из взаимоисключающих вариантов берите радиокнопку, для мгновенного включения настройки — переключатель.
Пример
Разметка
Минимальную разметку показывает пример выше. Части вложены так:
label.sf-checkbox → sf-checkbox-box с <input type="checkbox"> и
sf-icon → sf-checkbox-container с подписью.
- Оболочка —
<label class="sf-checkbox">: она даёт доступное имя и кликабельную область. Скрипт компонента находит флажки поlabel.sf-checkbox. - Нативный
<input type="checkbox">— источникname,value,checked,disabled, фокуса и отправки формы. Он лежит прямым потомкомsf-checkbox-box: CSS скрывает только такой input, в другом месте он остаётся видимым браузерным флажком. sf-iconпосле input рисует отметку: скрипт пишет в негоcheckдля отмеченного иremoveдля смешанного состояния. Без него индикатор пуст.- Текст — в
sf-checkbox-container: подписьsf-checkbox-labelвнутриsf-checkbox-topили прямо в контейнере, пояснение —sf-checkbox-description.
Варианты
Размер
Три ступени — sf-checkbox--size-1/2, sf-checkbox--size-1 и
sf-checkbox--size-2, как у полей форм, радиокнопки и переключателя. Размер
меняет индикатор, подпись и пояснение вместе. Берите ступень полей и кнопок
той же формы; в списке флажок берёт размер списка.
sf-checkbox--size-1/2
sf-checkbox--size-1
sf-checkbox--size-2
Состав
Подпись обязательна: она даёт флажку доступное имя. Пояснение добавляет
sf-checkbox-description, значок подсказки — sf-icon в sf-checkbox-top
рядом с подписью; размер значка следует за размером флажка. Скрипт
компонента пояснение с input не связывает: дайте пояснению id и напишите
на input aria-describedby с этим id сами.
sf-checkbox-label в контейнере
sf-checkbox-top + sf-checkbox-description
sf-icon в sf-checkbox-top
Положение индикатора
Положение индикатора задаёт порядок двух частей внутри <label>. В начале
строки индикатор подходит обычным формам; в конце — строкам настроек, где
такая композиция едина для всего интерфейса.
Состояния
Все состояния задаёт нативный input; класс на оболочке нужен только ошибке. Наведение и нажатие компонент показывает сам.
Отмечен
Нативный checked заливает индикатор основным цветом и ставит отметку.
Смешанное
Смешанное состояние означает, что выбрана часть дочерних вариантов: индикатор
показывает черту вместо отметки. HTML-атрибута с таким поведением нет, и
третьего отправляемого значения оно не создаёт. Его задаёт свойство
input.indeterminate = true или атрибут data-indeterminate, который скрипт
компонента переносит в свойство один раз при подключении; дальше меняйте
состояние через JavaScript.
Недоступен
Нативный disabled приглушает индикатор и текст в любом состоянии отметки, в том числе в смешанном;
флажок не получает фокус и не отправляется с формой.
disabled
disabled checked
Ошибка
Класс error на оболочке окрашивает рамку индикатора цветом ошибки. Текст
ошибки кладите в пояснение и связывайте с input через aria-describedby,
сам input получает aria-invalid="true".
error, не отмечен
error, отмечен
Фокус
При переходе клавишей Tab индикатор получает кольцо фокуса по
:focus-visible. В примере фокус показан классом focus-visible на input,
который CSS компонента читает наравне с :focus-visible.
focus-visible
focus-visible checked
Доступность
- Видимая подпись лежит внутри того же
<label>, что и input. - Группу флажков оборачивайте в
<fieldset>с<legend>: легенда называет общий вопрос и сообщает, что можно выбрать несколько вариантов. Каждый флажок группы отправляет собственное значение. - Ошибку сообщайте текстом: одного цвета недостаточно.
- Не отмечайте варианты заранее без предметной причины.
- Флажок переключается пробелом; видимый фокус рисует компонент.
- Индикатор в начале строки стоит на логическом начале и зеркалится при письме справа налево.
JavaScript
SF.Checkbox.setState(input, state) меняет состояние нативного флажка и
перерисовывает индикатор:
const input = document.querySelector('input[name="mixed"]');
SF.Checkbox.setState(input, {checked: false, indeterminate: true, disabled: false});
Функция принимает только <input type="checkbox"> и поля checked,
indeterminate, disabled; для другого элемента она возвращает false.
Событие change она не создаёт: после изменения значения приложение само
отправляет нужное событие и обновляет свою модель данных.
Компонент регистрирует класс Checkbox, который собирает флажок из
параметров. SF.Loader появляется к событию sf-loader-init на window;
SF.Loader.ready('Checkbox', callback) передаёт класс, когда он
зарегистрирован.
const whenLoader = (run) => (window.SF?.Loader ? run() : window.addEventListener('sf-loader-init', run, {once: true}));
whenLoader(() => SF.Loader.ready('Checkbox', (Checkbox) => {
const checkbox = new Checkbox({
param: {name: 'updates', value: 'yes', title: 'Получать обновления', size: '1'},
});
document.querySelector('#settings').append(checkbox.render());
}));
Параметры: title, description, help (имя значка подсказки), size
(1/2, 1, 2), name, value, checked, disabled, indeterminate.
attrs переносятся на input, класс из attrs.class — на оболочку.
Классы
| Что | Классы |
|---|---|
| Блок | sf-checkbox |
| Части | sf-checkbox-box, sf-checkbox-container, sf-checkbox-description, sf-checkbox-label, sf-checkbox-top |
| Размеры | sf-checkbox--size-1, sf-checkbox--size-1/2, sf-checkbox--size-2 |
Классы и переменные собраны из CSS выпуска и обновляются вместе с ним.
Переменные
Настройка
Эти переменные — поверхность настройки компонента. Их имена стабильны: переименовать или убрать такую переменную можно только через журнал изменений, с предупреждением, как атрибут. Framework их не задаёт, поэтому значение можно поставить на сам компонент (.sf-checkbox) или на любого предка. Переменные действуют на спокойный вид; наведение, фокус, нажатие, недоступность и ошибка рисуются поверх, поэтому состояния остаются видны.
| Переменная | Что задаёт | По умолчанию |
|---|---|---|
--sf-checkbox-background-color |
Заливка квадрата без отметки; у отмеченного, ошибки и недоступного — своя. | var(--sf-surface-0) |
--sf-checkbox-border-color |
Рамка квадрата без отметки; у отмеченного, наведения, ошибки и недоступного — своя. | var(--sf-outline) |
--sf-checkbox-border-width |
Толщина рамки квадрата со всех сторон. | var(--sf-px) |
--sf-checkbox-radius |
Скругление углов квадрата. | var(--sf-radius--ui) |
--sf-checkbox-size |
Ширина и высота квадрата. | var(--sf-text-height-1); зависит от размера |
--sf-checkbox-gap |
Промежуток между квадратом и подписью. | var(--sf-ui-1--text-space-x); зависит от размера |
.sf-checkbox {
--sf-checkbox-radius: 0;
}
Устройство
Остальные переменные — внутренняя проводка компонента: модификаторы задают им значения, а части их читают. Их имена и устройство могут меняться в любом выпуске, поэтому проект их не задаёт. Значение по умолчанию — из базового правила блока (.sf-checkbox); переменную без него задают только модификаторы.
| Переменная | По умолчанию | Задаёт |
|---|---|---|
--sf-checkbox--gap |
не задана; задают модификаторы, например .sf-checkbox--size-1/2: var(--sf-checkbox-gap, var(--sf-ui-1/2--text-space-x)) |
gap |
--sf-checkbox-box--background-color |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-box: var(--sf-checkbox-background-color, var(--sf-surface-0)) |
background-color |
--sf-checkbox-box--border |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-box: var(--sf-checkbox-border-width, var(--sf-px)) solid |
border, border-color, border-end-end-radius, border-end-start-radius, border-start-end-radius, border-start-start-radius |
--sf-checkbox-box--border-color |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-box: var(--sf-checkbox-border-color, var(--sf-outline)) |
border-color |
--sf-checkbox-box--border-end-end-radius |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-box: var(--sf-checkbox-radius, var(--sf-radius--ui)) |
border-end-end-radius |
--sf-checkbox-box--border-end-start-radius |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-box: var(--sf-checkbox-radius, var(--sf-radius--ui)) |
border-end-start-radius |
--sf-checkbox-box--border-start-end-radius |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-box: var(--sf-checkbox-radius, var(--sf-radius--ui)) |
border-start-end-radius |
--sf-checkbox-box--border-start-start-radius |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-box: var(--sf-checkbox-radius, var(--sf-radius--ui)) |
border-start-start-radius |
--sf-checkbox-box--box-shadow |
не задана; задают модификаторы, например .sf-checkbox[:has(input:not(:disabled):not(.disabled).focus-visible)] .sf-checkbox-box: none |
box-shadow |
--sf-checkbox-box--height |
не задана; задают модификаторы, например .sf-checkbox.sf-checkbox--size-1/2 .sf-checkbox-box: var(--sf-checkbox-size, var(--sf-text-height-1/2)) |
height |
--sf-checkbox-box--width |
не задана; задают модификаторы, например .sf-checkbox.sf-checkbox--size-1/2 .sf-checkbox-box: var(--sf-checkbox-size, var(--sf-text-height-1/2)) |
width |
--sf-checkbox-container--background-color |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-container: transparent |
background-color |
--sf-checkbox-description--color |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-description: var(--sf-on-surface-variant) |
color |
--sf-checkbox-description--font-family |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-description: var(--sf-text--family) |
font-family |
--sf-checkbox-description--font-size |
не задана; задают модификаторы, например .sf-checkbox.sf-checkbox--size-1/2 .sf-checkbox-description: var(--sf-text-size-1/3) |
font-size |
--sf-checkbox-description--font-weight |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-description: var(--sf-font-weight-regular) |
font-weight |
--sf-checkbox-description--line-height |
не задана; задают модификаторы, например .sf-checkbox.sf-checkbox--size-1/2 .sf-checkbox-description: var(--sf-text-height-1/3) |
line-height |
--sf-checkbox-label--background-color |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-label: transparent |
background-color |
--sf-checkbox-label--color |
не задана; задают модификаторы, например .sf-checkbox:not(.error)[:has(input:not(:checked))] .sf-checkbox-label: var(--sf-on-surface) |
color |
--sf-checkbox-label--font-family |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-label: var(--sf-text--family) |
font-family |
--sf-checkbox-label--font-size |
не задана; задают модификаторы, например .sf-checkbox.sf-checkbox--size-1/2 .sf-checkbox-label: var(--sf-text-size-1/2) |
font-size |
--sf-checkbox-label--font-weight |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-label: var(--sf-font-weight-medium) |
font-weight |
--sf-checkbox-label--line-height |
не задана; задают модификаторы, например .sf-checkbox.sf-checkbox--size-1/2 .sf-checkbox-label: var(--sf-text-height-1/2) |
line-height |
--sf-checkbox-top--background-color |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-top: transparent |
background-color |
--sf-checkbox-top--gap |
не задана; задают модификаторы, например .sf-checkbox .sf-checkbox-top: var(--sf-space-1/4) |
gap |