Кнопка с иконкой запускает действие без видимой подписи: редактировать,
удалить, открыть настройки. Берите её, когда иконка общепринята и места мало;
если действие нельзя однозначно узнать по иконке, нужна
кнопка с текстом.
Минимальную разметку показывает пример выше: нативный
<button type="button"> с классами блока sf-icon-button, содержимого
(sf-icon-button--icon), вида (sf-icon-button--default), схемы
(sf-icon-button--primary) и размера (sf-icon-button--size-1), внутри —
иконка <i class="sf-icon" aria-hidden="true">.
aria-label обязателен: это единственное доступное имя кнопки.
Цвета вида и схемы действуют только вместе с классом содержимого
sf-icon-button--icon или sf-icon-button--close.
Размер иконки следует за размером кнопки: класс размера на иконку не
нужен.
Варианты
Кнопку описывают независимые оси: вид, схема, содержимое, размер,
плотность, радиус и сегменты. На каждой оси кнопка берёт одно значение.
Вид
Вид задаёт вес действия классом sf-icon-button--{вид}, как у
кнопки: default — главное действие,
tonal — важное, но не главное, outline — второстепенное, link — самое
лёгкое, в строке таблицы или панели инструментов. surface нужен на цветном
фоне или поверх изображения: его заливка и граница — полупрозрачные ступени
нейтральной шкалы, а иконка
сохраняет цвет схемы. Класс sf-icon-button--ghost работает так же, как
link; в разметке пишите link.
Схема задаёт цвет классом sf-icon-button--{схема}: primary — акцентное
действие, on-surface — нейтральное, error — необратимое, например
«Удалить». secondary есть только у вида tonal, error нет у вида
surface; прочерк в примере — сочетание, которого нет. Необратимое действие
кнопка только начинает: спросите подтверждение в
модальном окне и выполните действие
после ответа. На время самого действия кнопке ставят класс loading, а не
disabled (см. Недоступная): так окно возвращает фокус на
кнопку.
sf-icon-button--icon — кнопка с иконкой из шрифта sf-icon.
sf-icon-button--close — кнопка со знаком закрытияsf-close: класс окрашивает знак цветом схемы.
Плотность меняет внутренние отступы выбранного размера. Без класса отступы
обычные; spacing-compact подходит плотным таблицам и панелям,
spacing-comfortable и spacing-spacious — крупным одиночным действиям.
Имена tightness-low, tightness-high и tightness-highest работают так же,
как spacing-compact, spacing-comfortable и spacing-spacious; в разметке
пишите spacing-*.
Кнопка берёт смысловой радиус контрола (radius-ui). radius-square
убирает скругление, radius-rounded делает кнопку круглой, radius-default
даёт постоянные 4 px независимо от темы. Общей переменной радиуса, как
--sf-button-radius у кнопок, у кнопок с иконкой нет: радиус задаёт класс на
каждой кнопке.
segment-start, segment-middle и segment-end соединяют соседние кнопки в
один составной элемент: внутренние углы становятся прямыми, общие границы
рисуются один раз. Выбранный сегмент обычно outline, остальные — link.
Группе нужна семантика: role="group" и общее доступное имя.
Класс active вместе с aria-pressed="true" оставляет кнопку-переключатель
нажатой. Доступное имя при переключении не меняется: состояние сообщает
aria-pressed.
Нативный disabled приглушает кнопку любого вида: она не получает фокус и
не срабатывает. Класс disabled только отключает эффекты наведения, нажатия
и фокуса; вид недоступной он даёт лишь варианту sf-icon-button--surface.
На время операции ставьте кнопке класс loading, aria-busy="true" и
aria-disabled="true", а результат сообщайте текстом. loading рисует
полосы и не пропускает указатель, но фокус остаётся на кнопке, и Enter её
по-прежнему нажимает, поэтому обработчик пропускает нажатие, пока стоит
aria-busy. Нативный disabled здесь не подходит: он снимает фокус с кнопки,
фокус уходит на body, и окно подтверждения, закрывшись, тоже возвращает его
в никуда.
При переходе клавишей Tab кнопка получает кольцо фокуса по :focus-visible;
щелчок мышью кольца не показывает. В примере фокус показан классом
focus-visible, который CSS читает наравне с :focus-visible.
aria-label называет действие и объект: «Удалить строку», а не «Корзина».
Иконка декоративная: aria-hidden="true".
Подсказка title не заменяет aria-label: её не видят с клавиатуры и на
сенсорном экране.
Для переключателя используйте aria-pressed; состояние не передавайте
только цветом.
Недоступность задавайте нативным disabled.
Логические отступы и края сегментов зеркалятся при письме справа налево.
JavaScript
Разметка sf-icon-button работает без скрипта. Компонент регистрирует класс
IconButtons, который собирает кнопку из параметров: icon, size, type
(вид), scheme, spacing (compact, comfortable, spacious), radius,
disabled; attrs переносятся на кнопку. Событий компонент не отправляет.
SF.Loader появляется к событию sf-loader-init на window;
SF.Loader.ready('IconButtons', callback) передаёт класс, когда он
зарегистрирован.
Классы и переменные собраны из CSS выпуска и обновляются вместе с ним.
Переменные
Настройка
Эти переменные — поверхность настройки компонента. Их имена стабильны: переименовать или убрать такую переменную можно только через журнал изменений, с предупреждением, как атрибут. Framework их не задаёт, поэтому значение можно поставить на сам компонент (.sf-icon-button) или на любого предка. Переменные действуют на спокойный вид; наведение, фокус, нажатие, недоступность и ошибка рисуются поверх, поэтому состояния остаются видны.
Переменная
Что задаёт
По умолчанию
--sf-icon-button-background-color
Заливка в покое; у наведения, нажатия, фокуса и недоступности — своя.
var(--sf-primary); зависит от вида, схемы
--sf-icon-button-color
Цвет значка и крестика в покое; у недоступной — свой.
var(--sf-on-surface-variant); зависит от вида, схемы
--sf-icon-button-border-color
Цвет рамки в спокойном состоянии; виден при ненулевой ширине рамки.
transparent; зависит от вида
--sf-icon-button-border-width
Толщина рамки со всех сторон (у видов outline и surface — var(--sf-px)).
0; зависит от вида
--sf-icon-button-radius
Скругление углов.
var(--sf-radius--ui)
--sf-icon-button-padding-inline
Отступ до и после значка.
var(--sf-ui-1--space-y-tightness-default); зависит от размера, spacing
--sf-icon-button-padding-block
Отступ сверху и снизу от значка.
var(--sf-ui-1--space-y-tightness-default); зависит от размера, spacing
CSS
.sf-icon-button {
--sf-icon-button-radius: 0;
}
Устройство
Остальные переменные — внутренняя проводка компонента: модификаторы задают им значения, а части их читают. Их имена и устройство могут меняться в любом выпуске, поэтому проект их не задаёт. Значение по умолчанию — из базового правила блока (.sf-icon-button); переменную без него задают только модификаторы.
Переменная
По умолчанию
Задаёт
--sf-icon-button--background-color
не задана; задают модификаторы, например .sf-icon-button.sf-icon-button--default.sf-icon-button--primary.sf-icon-button--icon: var(--sf-icon-button-background-color, var(--sf-primary))
background-color
--sf-icon-button--border-bottom-left-radius
не задана; задают модификаторы, например .sf-icon-button.segment-middle: var(--sf-radius-square)
border-end-start-radius
--sf-icon-button--border-bottom-right-radius
не задана; задают модификаторы, например .sf-icon-button.segment-start: var(--sf-radius-square)
border-end-end-radius
--sf-icon-button--border-bottom-width
var(--sf-icon-button-border-width, 0)
padding-bottom, border-bottom-width
--sf-icon-button--border-color
не задана; задают модификаторы, например .sf-icon-button.sf-icon-button--outline.sf-icon-button--primary.sf-icon-button--icon: var(--sf-icon-button-border-color, var(--sf-outline))
border-color
--sf-icon-button--border-inline-end-width
var(--sf-icon-button-border-width, 0)
padding-inline-end, border-inline-end-width
--sf-icon-button--border-inline-start-width
var(--sf-icon-button-border-width, 0)
padding-inline-start, border-inline-start-width
--sf-icon-button--border-style
не задана; задают модификаторы, например .sf-icon-button--outline: solid
border-style
--sf-icon-button--border-top-left-radius
не задана; задают модификаторы, например .sf-icon-button.segment-middle: var(--sf-radius-square)
border-start-start-radius
--sf-icon-button--border-top-right-radius
не задана; задают модификаторы, например .sf-icon-button.segment-start: var(--sf-radius-square)
border-start-end-radius
--sf-icon-button--border-top-width
var(--sf-icon-button-border-width, 0)
padding-top, border-top-width
--sf-icon-button--border-width
не задана; задают модификаторы, например .sf-icon-button--outline: var(--sf-icon-button-border-width, var(--sf-px))
border-width
--sf-icon-button--focus-ink
не задана; задают модификаторы, например .sf-icon-button.sf-icon-button--default.sf-icon-button--primary: var(--sf-on-primary)
--sf-icon-button--focus-inset
--sf-icon-button--focus-inset
не задана; задают модификаторы, например .sf-icon-button:not(:disabled):not(.disabled).focus-visible: inset 0 0 0 var(--sf-focus--offset) var(--sf-icon-button--focus-ink, transparent)
box-shadow
--sf-icon-button--padding-bottom
не задана; задают модификаторы, например .sf-icon-button--size-1: var(--sf-icon-button-padding-block, var(--sf-ui-1--space-y-tightness-default))
padding-bottom
--sf-icon-button--padding-inline-end
не задана; задают модификаторы, например .sf-icon-button--size-1: var(--sf-icon-button-padding-inline, var(--sf-ui-1--space-y-tightness-default))
padding-inline-end
--sf-icon-button--padding-inline-start
не задана; задают модификаторы, например .sf-icon-button--size-1: var(--sf-icon-button-padding-inline, var(--sf-ui-1--space-y-tightness-default))
padding-inline-start
--sf-icon-button--padding-top
не задана; задают модификаторы, например .sf-icon-button--size-1: var(--sf-icon-button-padding-block, var(--sf-ui-1--space-y-tightness-default))