Dropdown
Installation
npm i @snack-uikit/dropdown
Description
- Пакет
@snack-uikit/dropdownэкспортирует компонентDropdown— универсальный выпадающий контейнер для отображения дополнительного контента (меню, подсказки, произвольные блоки) относительно управляющего элемента. - В основе
Dropdownиспользуется внутренний компонентPopoverPrivate, за счёт чего доступны гибкие настройки положения (placement), стратегии ширины (widthStrategy), отступа (offset) и поведения при кликах/наведении/фокусе. - Компонент может работать в контролируемом режиме через пропы
openиonOpenChange, поддерживает закрытие по клику вне (outsideClick), по клавишеEsc(closeOnEscapeKey) и при изменении истории браузера (closeOnPopstate). - В качестве триггера можно использовать либо дочерний React-элемент (
children), либо вынесенный наружу элемент черезtriggerRef; при отсутствии и того, и другогоDropdownне отрисовывается. - Ширина выпадающего контейнера задаётся стратегией
widthStrategy: можно зафиксировать её равной ширине триггера, сделать не меньше ширины триггера или полностью подогнать под контент. - Отступ между триггером и контейнером контролируется явно через проп
offsetили через CSS-переменную--offset, пробрасываемую вtriggerClassName(пример ниже); при одновременном указании приоритет имеет значение пропаoffset. - Figma:
Dropdown.
Чтобы указать оффсет через стили, нужно в triggerClassName передать CSS-переменную --offset:
Например:
.triggerClassName {
--offset: #{$some-var};
}
Важное уточнение: если переменная передается через scss-переменную, она должна быть обернута в #{ }.
Если значение явно передано через проп offset, то будет применено значение пропа.
Example
import { Dropdown } from '@snack-uikit/dropdown';
import { ButtonFilled } from '@snack-uikit/button';
function DropdownExample() {
return (
<Dropdown
content={
<div>
<div>Строка 1 контента</div>
<div>Строка 2 контента</div>
<div>Строка 3 контента</div>
</div>
}
placement='bottom-start'
widthStrategy='gte'
offset={8}
data-test-id='dropdown'
>
<ButtonFilled label='Открыть выпадающее меню' />
</Dropdown>
);
}
Dropdown
Props
| name | type | default value | description |
|---|---|---|---|
| content* | ReactNode |
- | |
| className | string |
- | CSS-класс |
| triggerClassName | string |
- | CSS-класс триггера |
| open | boolean |
- | Управляет состоянием показан/не показан. |
| onOpenChange | (isOpen: boolean) => void |
- | Колбек отображения компонента. Срабатывает при изменении состояния open. |
| hoverDelayOpen | number |
- | Задержка открытия по ховеру |
| hoverDelayClose | number |
- | Задержка закрытия по ховеру |
| widthStrategy | enum PopoverWidthStrategy: "auto", "gte", "eq" |
gte | Стратегия управления шириной контейнера поповера - auto - соответствует ширине контента, - gte - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, - eq - Equal, строго равен ширине таргета. |
| offset | number |
0 | Отступ поповера от его триггер-элемента (в пикселях). |
| children | ReactNode | ChildrenFunction |
- | Триггер поповера (подробнее читайте ниже) |
| closeOnEscapeKey | boolean |
true | Закрывать ли по нажатию на кнопку Esc |
| triggerClickByKeys | boolean |
true | Вызывается ли попоповер по нажатию клавиш Enter/Space (при trigger = click) |
| triggerRef | ForwardedRef<ReferenceType | HTMLElement> |
- | Ref ссылка на триггер |
| outsideClick | boolean | OutsideClickHandler |
- | Закрывать ли при клике вне поповера |
| fallbackPlacements | Placement[] |
- | Цепочка расположений которая будет применяться к поповеру от первого к последнему если при текущем он не влезает. |
| disableSpanWrapper | boolean |
- | Отключает для isValidElement внешнюю обертку триггера Пригодится для элементов с position: absolute |
| closeOnPopstate | boolean |
- | Закрывать ли поповер при пекреходе по истории браузера |
| trigger | enum Trigger: "click", "hover", "focusVisible", "focus", "hoverAndFocusVisible", "hoverAndFocus", "clickAndFocusVisible" |
click | Условие отображения поповера: - click - открывать по клику - hover - открывать по ховеру - focusVisible - открывать по focus-visible - focus - открывать по фокусу - hoverAndFocusVisible - открывать по ховеру и focus-visible - hoverAndFocus - открывать по ховеру и фокусу - clickAndFocusVisible - открывать по клику и focus-visible |
| placement | enum Placement: "left", "left-start", "left-end", "right", "right-start", "right-end", "top", "top-start", "top-end", "bottom", "bottom-start", "bottom-end" |
bottom-start | Положение поповера относительно своего триггера (children). |