Скелетон заранее занимает место загружаемого содержимого и повторяет его
форму: строки текста, аватар, изображение. При замене интерфейс не смещается.
Для короткой операции без известной геометрии берите
спиннер, для отсутствия данных —
заполнитель.
Минимальную разметку показывает пример выше: контейнер sf-skeleton и
внутри него фигуры sf-skeleton-text.
sf-skeleton выстраивает фигуры столбцом без промежутков и несёт класс
движения. Без класса движения фигуры статичны.
sf-skeleton-text — одна фигура. Её высоту задаёт размер
sf-skeleton-text--size-*, ширину — утилиты ширины (w-full, w-1/2) или
размеры Framework.
Форму меняют классы на самой фигуре: sf-skeleton-circle,
sf-skeleton-square, sf-skeleton-rounded, sf-skeleton-icon.
Контейнер скрыт от экранного диктора (aria-hidden="true"); область
будущего содержимого получает aria-busy="true".
Варианты
Форма
Без класса формы фигура — строка со скруглением элемента интерфейса.
sf-skeleton-circle даёт круг для аватара или иконки, sf-skeleton-square
убирает скругление, sf-skeleton-rounded задаёт то же скругление, что и по
умолчанию. sf-skeleton-icon делает ширину равной высоте — для квадратной
иконки или круглого аватара вместе с sf-skeleton-circle.
Классы sf-skeleton-text--size-1/7 … sf-skeleton-text--size-7 задают высоту
фигуры по шкале кегля Framework. Для строки берите размер будущего текста.
Строка-фигура высотой с кегль стоит посередине высоты строки того же размера,
и строки идут одна за другой, как строки текста. Поэтому загружающийся блок
занимает ровно столько места, сколько займёт текст, и страница не прыгает,
когда приходят данные. Круг, квадрат, иконка и фигура с заданной высотой
занимают ровно свою высоту. Переменные --sf-skeleton-text--height (фигура)
и --sf-skeleton-text--line (её строка) задаются отдельно.
Ступени 1/7, 1/6 и 1/5 тоньше любого текста — ими рисуют разделитель или
черту под заголовком.
Класс на контейнере задаёт движение всех его фигур:
sf-skeleton--animation-pulse мягко меняет прозрачность,
sf-skeleton--animation-wave проводит по фигуре блик,
sf-skeleton--animation-none оставляет фигуры статичными. При системной
настройке уменьшения движения pulse и wave отключаются.
Фигуры скрыты от экранного диктора через aria-hidden="true" и не получают
фокус.
Область будущего содержимого на время загрузки получает aria-busy="true",
а после замены — aria-busy="false". Если загрузка заметно долгая, сообщите
о ней текстом в sr-only или областью с role="status".
Ошибка загрузки заменяет скелетон понятным сообщением и действием
восстановления.
В режиме принудительных цветов фигуры рисуются системным цветом текста, а
блик отключается.
JavaScript
Компонент регистрирует класс Skeleton, который собирает контейнер с
фигурами из параметров. SF.Loader появляется к событию sf-loader-init на
window; SF.Loader.ready('Skeleton', callback) передаёт класс, когда он
зарегистрирован.
Параметры: count (от 1 до 20 фигур), size (ступень высоты), width и
height (список через запятую, по фигуре на значение: проценты или размеры
Framework вроде d2), animation (pulse — по умолчанию, wave, none),
variant (text, circle, square, rounded), type: 'icon' для
квадратной фигуры. Контейнер получает aria-hidden="true" сам. Событий
компонент не отправляет.
Классы и переменные собраны из CSS выпуска и обновляются вместе с ним.
Переменные
Компонент читает свои переменные, а модификаторы задают им значения; таблица показывает, из чего складывается вид. Переменные компонента — его внутренняя проводка, а не поверхность настройки: их имена и устройство могут меняться. Вид проекта меняют общие токены, а глубокий вид Smart-компонента — его шаблон (см. Переменные компонента). Значение по умолчанию — из базового правила блока (.sf-skeleton); переменную без него задают только модификаторы.
Переменная
По умолчанию
Задаёт
--sf-skeleton-base
var(--sf-ui-skeleton)
background
--sf-skeleton-duration
calc(var(--sf-duration-slow) * 3)
animation
--sf-skeleton-highlight
var(--sf-surface-container-active)
background-image
--sf-skeleton-text--height
не задана; задают модификаторы, например .sf-skeleton-text--size-1: var(--sf-text-size-1)