sf-admin-menu — оформление и поведение боковой навигации административного
приложения: шапка, поиск, пункты с иконками, вложенные панели, компактный
режим и показ пунктов, которые не поместились. Законченный сценарий с
поиском и настройками даёт Smart-компонент
Admin Menu; для обычной
навигации по сайту берите меню.
Минимальную разметку показывает пример выше. Части вложены так:
<aside class="sf-admin-menu"> → панель sf-admin-menu-panel → шапка
sf-admin-menu-head, поиск sf-admin-menu-search, раздел
sf-admin-menu-section sf-admin-menu-main и подвал sf-admin-menu-bottom.
Корень sf-admin-menu с утилитой flex и aria-label; панель — с
утилитами flex flex-col. Ширину панели задаёт компонент.
Шапка sf-admin-menu-head содержит sf-admin-menu-head-container с
иконкой и названием.
Раздел — <nav> с aria-label; в нём список <ul class="p-0 m-0">,
пункты <li class="sf-admin-menu-item-wrap flex flex-col">.
Пункт — ссылка или кнопка sf-admin-menu-item flex items-cross-center с
sf-admin-menu-item-container: иконка sf-icon и подпись в <span>.
После контейнера можно поставить счётчик Badge.
Подвал sf-admin-menu-bottom держит пункты внизу панели, например
настройки.
Варианты
Вложенная панель
Вложенная панель — вторая sf-admin-menu-panel с классом
sf-admin-menu-panel-sub, разделом sf-admin-menu-main-sub и кнопкой
возврата sf-admin-menu-back-button в шапке. Закрытая панель сдвинута за
край меню, класс open показывает её; его ставит и снимает приложение.
Кнопка button[data-menu="имя"] связывает пункт с панелью
section[data-panel="имя"]: по нажатию скрипт переключает у панели утилиты
inline-end-full и inline-end-0.
Класс small на панели сужает её до колонки иконок: подписи пунктов
скрываются, шапка центрируется. Кнопка с атрибутом
data-admin-menu-toggle переключает режим. У пунктов компактной панели
нет видимой подписи — дайте им aria-label.
Если оболочка ограничивает высоту меню, растяните корень и панель утилитой
h-full: скрипт оставит пункты, которые помещаются, а остальные спрячет
за пунктом «Развернуть». Нажатие показывает все пункты с прокруткой и
меняет подпись на «Свернуть». В контейнере с естественной высотой видны все
пункты.
Наведение и нажатие подсвечивают пункт; эти состояния компонент показывает
сам. Класс или атрибут disabled у пункта снимает подсветку при наведении,
но не приглушает его — недоступный пункт лучше убрать.
Текущий раздел
Класс active подсвечивает пункт текущего раздела фоном. Добавьте ссылке
aria-current="page".
Корень — <aside> с aria-label, каждый раздел — <nav> с
aria-label.
Текущему пункту — aria-current="page" вместе с классом active.
Иконки скрывайте через aria-hidden="true"; в компактном режиме имя
пункта даёт aria-label.
Кнопка, которая открывает вложенную панель, называет раздел; кнопка
возврата — то, куда она ведёт.
Пункты — нативные ссылки и кнопки: Tab переходит по ним, Enter
срабатывает.
JavaScript
Скрипт подключается сам и обслуживает каждый .sf-admin-menu, в том числе
добавленный позже; корни внутри Smart-компонента <sf-admin-menu> он
пропускает. Он связывает пункты с вложенными панелями, переключает
компактный режим и
пересчитывает видимые пункты при изменении высоты. Событий скрипт не
отправляет.
SF.AdminMenu.init(scope) подключает меню внутри scope. Компонент
регистрирует класс AdminMenu: SF.Loader появляется к событию
sf-loader-init на window, а SF.Loader.ready('AdminMenu', callback)
вызывает callback, когда скрипт загружен.
Классы и переменные собраны из CSS выпуска и обновляются вместе с ним.
Переменные
Компонент читает свои переменные, а модификаторы задают им значения; таблица показывает, из чего складывается вид. Переменные компонента — его внутренняя проводка, а не поверхность настройки: их имена и устройство могут меняться. Вид проекта меняют общие токены, а глубокий вид Smart-компонента — его шаблон (см. Переменные компонента). Значение по умолчанию — из базового правила блока (.sf-admin-menu); переменную без него задают только модификаторы.
Переменная
По умолчанию
Задаёт
--sf-admin-menu-item--background-color
не задана; задают модификаторы, например .sf-admin-menu-item:not(:disabled):not(.disabled):hover: var(--sf-secondary-container-hover)
background-color
--sf-admin-menu-item--border-color
не задана; задают модификаторы, например .sf-admin-menu-item-segment:not(.disabled):hover .sf-admin-menu-item: var(--sf-transparent)
border-color
--sf-admin-menu-item--border-end-end-radius
не задана; задают модификаторы, например .sf-admin-menu-item.segment-start: 0
border-end-end-radius
--sf-admin-menu-item--border-end-start-radius
не задана; задают модификаторы, например .sf-admin-menu-item.segment-middle: 0
border-end-start-radius
--sf-admin-menu-item--border-start-end-radius
не задана; задают модификаторы, например .sf-admin-menu-item.segment-start: 0
border-start-end-radius
--sf-admin-menu-item--border-start-start-radius
не задана; задают модификаторы, например .sf-admin-menu-item.segment-middle: 0
border-start-start-radius
--sf-admin-menu-item--mask-size
не задана; задают модификаторы, например .sf-admin-menu-item-wrap.settings-on:hover .sf-admin-menu-item.settings-active: calc(var(--sf-space-7) * 2)
mask-image
--sf-admin-menu-item-container--color
не задана; задают модификаторы, например .sf-admin-menu-item:not(:disabled):not(.disabled):hover .sf-admin-menu-item-container: var(--sf-on-secondary-container)
color
--sf-admin-menu-item-segment--background-color
не задана; задают модификаторы, например .sf-admin-menu-item-segment:not(.disabled):hover: `var(