Компонент ResponsiveFilter — это адаптивная панель фильтров, которая автоматически меняет поведение в зависимости от ширины экрана. На мобильных устройствах открывается как нижний шторка (bottom sheet), на десктопах — как выпадающая панель с автоматическим позиционированием.
- Основное назначение: адаптивный контейнер для фильтров таблицы или списка.
- Ключевые возможности:
- Мобильный режим (
< 640px): кнопка + нижняя шторка с оверлеем и анимацией снизу. - Десктопный режим (
≥ 640px): кнопка + выпадающая панель с позиционированием. - Автоматический выбор позиции панели (сверху/снизу) в зависимости от доступного пространства.
- Перерасчёт позиции при скролле и ресайзе.
- Оверлей для закрытия по клику вне панели.
- Кастомизация кнопки через слот
button или проп buttonContent.
| Проп | Тип | По умолчанию | Описание |
|---|
buttonContent | String | Object | Function | | Содержимое кнопки-триггера. Может быть заменено через слот button. |
anchor | Object | { to: 'bottom start', gap: 12 } | Настройки позиционирования для десктопной панели. |
classNames | Object | {} | Объект для кастомизации классов кнопки. Ключ: button. |
| Имя слота | Описание |
|---|
button | Кастомное содержимое кнопки-триггера. Заменяет buttonContent. |
default | Содержимое выпадающей панели/шторки (фильтры). |
- Кнопка:
Button с variant="outlined". - Панель: фиксированная снизу шторка с закруглёнными верхними углами.
- Анимация: появление снизу (
translate-y-full → translate-y-0). - Оверлей: полупрозрачный фон с блюром.
- Портал: телепортируется в
body с z-index: 101.
- Кнопка:
Button с variant="outlined" и пунктирной рамкой. - Панель: абсолютно позиционированная панель с тенью.
- Анимация: появление с небольшим сдвигом вниз (
translate-y-2 → translate-y-0). - Оверлей: прозрачный, для закрытия по клику вне панели.
- Позиционирование: автоматически выбирает отображение сверху или снизу от кнопки.
| Состояние | Стиль |
|---|
| Закрыта | Пунктирная рамка (border-dashed). |
| Открыта | Сплошная рамка с цветным кольцом (border-primary-600 ring-3 ring-primary-500/50). |
<ResponsiveFilter button-content="Фильтры">
<div class="p-4">
<h4 class="mb-3 font-medium">Фильтры</h4>
<div class="space-y-3">
<Select v-model="status" label="Статус" :data="statuses" />
<Select v-model="category" label="Категория" :data="categories" />
<Button color="primary" class="w-full" @click="applyFilters">Применить</Button>
</div>
</div>
</ResponsiveFilter>