npm i @snack-uikit/droplist
Пакет экспортирует 4 компонента:
-
Dropdown
- компонент выпадающего контейнера общего назначения -
Droplist
- компонент выпадащего вложенного меню -
ItemSingle
- айтем списка меню с единичным выбором -
ItemMultiple
- айтем списка меню с множественным выбором
Чтобы указать оффсет через стили надо в triggerClassName передать css-переменную --offset
Например:
.triggerClassName {
--offset: #{$some-var};
}
Важное уточнение, если переменная передается через scss-var она должна быть обернута в #{ }
Если значение явно передано через prop offset
, то будет применено значение пропа.
Для настройки управления/переключения между айметами и триггером с клавиатуры можно воспользоваться хуком Droplist.useKeyboardNavigation<T>({setDroplistOpen})
Пример использования:
const MyComponent = () => {
const [isOpen, setIsOpen] = useState(false);
const {
firstElementRefCallback,
handleDroplistFocusLeave,
handleTriggerKeyDown,
handleDroplistItemKeyDown,
triggerElementRef,
} = Droplist.useKeyboardNavigation<HTMLButtonElement>({ setDroplistOpen: setIsOpen });
const options = Array.from({ length: 10 }).map((_, i) => ({
option: `Option ${i + 1}`,
onKeyDown: handleDroplistItemKeyDown,
onClick: () => {}
}));
return (
<Droplist
open={isOpen}
onOpenChange={setIsOpen}
firstElementRefCallback={firstElementRefCallback}
onFocusLeave={handleDroplistFocusLeave}
triggerElement={
<button
onKeyDown={handleTriggerKeyDown}
ref={triggerElementRef}
>
Click
</button>
}
>
{oprions.map(option =>
<Droplist.ItemSingle {...option} />
)}
</Droplist>
)
}
Заголовок айтема
Вторичный заголовок
Описание айтема
Текст тэга
Размер айтема, возможные значения:
sizes.S
sizes.M
sizes.L
Флаг, задизейблен ли айтем
Иконка (из пакета icons)
Пропсы для аватара (@nack-ui/avatar
), исключая размер.
CSS-класс контейнера
Значение аттрибута tabIndex
Флаг, выбран ли айтем
Флаг, есть ли в подменю выбранные айтемы. (подсвечивает айтем)
Колбэк выбора айтема
Флаг неопределенного состояния (полувыбранный чекбокс)
Компонент Container
использует под собой компонент PopoverPrivate (readme ниже);
содержимое дроплиста
управляет состоянием показан/не показан.
колбек отображения компонента. Срабатывает при изменении состояния open.
положение дроплиста относительно своего таргета (children).
Возможные значения: Left, LeftStart, LeftEnd, Right, RightStart, RightEnd, Top, TopStart, TopEnd, Bottom, BottomStart, BottomEnd
триггер открытия/закрытия дроплиста.
-
Click
- открывать по клику -
Hover
- открывать по ховеру -
FocusVisible
- открывать по focus-visible -
Focus
- открывать по фокусу -
HoverAndFocusVisible
- открывать по ховеру и focus-visible -
HoverAndFocus
- открывать по ховеру и фокусу -
ClickAndFocusVisible
- открывать по клику и focus-visible
задержка отображения при ховере в мс
задержка закрытия при ховере в мс
стратегия управления шириной контейнера дроплиста
-
auto
- соответствует ширине контента, -
gte
- Great Then or Equal, равен ширине таргета или больше ее, если контент в дроплисте шире, -
eq
- Equal, строго равен ширине таргета.
CSS-класс на контейнере дроплиста.
CSS-класс на обёртке триггера поповера.
Отступ дроплиста от его target-элемента (в пикселях).
Закрывается ли поповер по нажатию клавиши Escape
Вызывается ли попоповер по нажатию клавиш Enter/Space (при trigger = click
)
Повторяет пропсы компонента dropdown
за исключением
триггер-элемент, относительно которого открывается Droplist
содержимое дроплиста
name | type | default value | description |
---|---|---|---|
triggerElement* | ReactNode | ChildrenFunction |
- | |
className | string |
- | CSS-класс |
triggerClassName | string |
- | CSS-класс триггера |
open | boolean |
- | Управляет состоянием показан/не показан. |
onOpenChange | (isOpen: boolean) => void |
- | Колбек отображения компонента. Срабатывает при изменении состояния open. |
hoverDelayOpen | number |
- | Задержка открытия по ховеру |
hoverDelayClose | number |
- | Задержка закрытия по ховеру |
widthStrategy | enum PopoverWidthStrategy: "auto" , "gte" , "eq"
|
auto | Стратегия управления шириной контейнера поповера - auto - соответствует ширине контента, - gte - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, - eq - Equal, строго равен ширине таргета. |
offset | number |
0 | Отступ поповера от его триггер-элемента (в пикселях). |
closeOnEscapeKey | boolean |
true | Закрывать ли по нажатию на кнопку Esc
|
triggerClickByKeys | boolean |
true | Вызывается ли попоповер по нажатию клавиш Enter/Space (при trigger = click ) |
triggerRef | ForwardedRef<HTMLElement | ReferenceType> |
- | Ref ссылка на триггер |
outsideClick | boolean | OutsideClickHandler |
- | Закрывать ли при клике вне поповера |
fallbackPlacements | Placement[] |
- | Цепочка расположений которая будет применяться к поповеру от первого к последнему если при текущем он не влезает. |
trigger | enum Trigger: "click" , "hover" , "focusVisible" , "focus" , "hoverAndFocusVisible" , "hoverAndFocus" , "clickAndFocusVisible"
|
- | Условие отображения поповера: - 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"
|
top | Положение поповера относительно своего триггера (children). |
firstElementRefCallback | RefCallback<HTMLElement> |
- | |
onFocusLeave | (direction: "left" | "top" | "bottom" | "common") => void |
- | |
size | enum Size: "s" , "m" , "l"
|
- | |
scrollRef | RefObject<HTMLElement> |
- | |
useScroll | boolean |
- |
name | type | default value | description |
---|---|---|---|
children* | ReactNode | ChildrenFunction |
- | Триггер поповера (подробнее читайте ниже) |
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 | Отступ поповера от его триггер-элемента (в пикселях). |
closeOnEscapeKey | boolean |
true | Закрывать ли по нажатию на кнопку Esc
|
triggerClickByKeys | boolean |
true | Вызывается ли попоповер по нажатию клавиш Enter/Space (при trigger = click ) |
triggerRef | ForwardedRef<HTMLElement | ReferenceType> |
- | Ref ссылка на триггер |
outsideClick | boolean | OutsideClickHandler |
- | Закрывать ли при клике вне поповера |
fallbackPlacements | Placement[] |
- | Цепочка расположений которая будет применяться к поповеру от первого к последнему если при текущем он не влезает. |
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). |