Меню является одним из ключевых элементов пользовательского интерфейса, позволяя организовать навигацию, действия и управление контентом. В контексте SvelteKit UI libraries меню реализуются через готовые компоненты с богатым набором API, поддержкой реактивности и доступностью (accessibility).
1. Компонент Menu В большинстве UI библиотек для SvelteKit меню представлено как контейнер, содержащий MenuTrigger и MenuContent:
<Menu>
<MenuTrigger>
<button>Открыть меню</button>
</MenuTrigger>
<MenuContent>
<MenuItem>Пункт 1</MenuItem>
<MenuItem>Пункт 2</MenuItem>
<MenuItem disabled>Пункт 3 (неактивен)</MenuItem>
</MenuContent>
</Menu>
Меню в SvelteKit может управляться через bind к состоянию открытости:
<script>
let open = false;
</script>
<Menu bind:open>
<MenuTrigger>
<button>Меню {open ? 'Открыто' : 'Закрыто'}</button>
</MenuTrigger>
<MenuContent>
<MenuItem on:click={() => open = false}>Закрыть меню</MenuItem>
</MenuContent>
</Menu>
Для доступности меню важно, чтобы оно корректно реагировало на клавиатурные события:
В SvelteKit UI компоненты меню автоматически обрабатывают эти события, но при необходимости можно добавлять собственные обработчики:
<Menu on:keydown={(e) => console.log(e.key)}>
...
</Menu>
Меню часто включает логические группы и разделители для улучшения читаемости:
<MenuContent>
<MenuGroup label="Основные действия">
<MenuItem>Создать</MenuItem>
<MenuItem>Редактировать</MenuItem>
</MenuGroup>
<MenuSeparator />
<MenuGroup label="Дополнительно">
<MenuItem>Настройки</MenuItem>
<MenuItem>Справка</MenuItem>
</MenuGroup>
</MenuContent>
Сложные интерфейсы требуют вложенных меню. SvelteKit UI библиотеки поддерживают SubMenu, позволяя создавать иерархические структуры:
<Menu>
<MenuTrigger>
<button>Главное меню</button>
</MenuTrigger>
<MenuContent>
<MenuItem>Пункт 1</MenuItem>
<SubMenu>
<SubMenuTrigger>Дополнительно</SubMenuTrigger>
<SubMenuContent>
<MenuItem>Подпункт 1</MenuItem>
<MenuItem>Подпункт 2</MenuItem>
</SubMenuContent>
</SubMenu>
</MenuContent>
</Menu>
Меню в SvelteKit UI libs поддерживает кастомизацию через CSS-переменные, классы и встроенные пропсы:
<MenuContent class="custom-menu">
<MenuItem class="highlighted">Особый пункт</MenuItem>
</MenuContent>
<style>
.custom-menu {
background-color: #1f2937;
color: white;
border-radius: 8px;
padding: 8px;
}
.highlighted {
font-weight: bold;
}
</style>
Меню часто строится на основе данных из массива:
<script>
const items = ['Создать', 'Редактировать', 'Удалить'];
</script>
<Menu>
<MenuTrigger>
<button>Действия</button>
</MenuTrigger>
<MenuContent>
{#each items as item}
<MenuItem>{item}</MenuItem>
{/each}
</MenuContent>
</Menu>
Для плавного UX меню поддерживают анимацию через transition:
<MenuContent transition:fade>
<MenuItem>Пункт 1</MenuItem>
<MenuItem>Пункт 2</MenuItem>
</MenuContent>
<script>
import { fade } from 'svelte/transition';
</script>
Меню может открываться или закрываться программно через методы API:
<Menu bind:open>
<MenuTrigger>
<button on:click={() => open = !open}>Тоггл меню</button>
</MenuTrigger>
<MenuContent>
<MenuItem on:click={() => console.log('Пункт выбран')}>Пункт</MenuItem>
</MenuContent>
</Menu>
Меню поддерживают ARIA атрибуты:
role="menu" для контейнера меню.role="menuitem" для пунктов.aria-disabled="true" для неактивных элементов.SvelteKit UI компоненты автоматически устанавливают нужные атрибуты, обеспечивая корректную работу с экранными читалками и клавиатурной навигацией.
Меню в SvelteKit UI libs — это гибкий и расширяемый компонент, который сочетает реактивность, доступность, динамическое управление и простую кастомизацию. Он подходит для создания как простых навигационных списков, так и сложных интерактивных интерфейсов с подменю и динамическим содержимым.