
Security News
The Changelog Podcast: Practical Steps to Stay Safe on npm
Learn the essential steps every developer should take to stay secure on npm and reduce exposure to supply chain attacks.
@snack-uikit/droplist
Advanced tools
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>
)
}
ItemSingle и ItemMultipleoption: stringЗаголовок айтема
caption?: stringВторичный заголовок
description?: stringОписание айтема
tagLabel?: stringТекст тэга
size?: Size - sРазмер айтема, возможные значения:
sizes.Ssizes.Msizes.Ldisabled?: booleanФлаг, задизейблен ли айтем
icon?: ReactElementИконка (из пакета icons)
avatar?: Omit<AvatarProps, 'size'>Пропсы для аватара (@nack-ui/avatar), исключая размер.
className?: stringCSS-класс контейнера
tabIndex?: numberЗначение аттрибута tabIndex
checked: booleanФлаг, выбран ли айтем
hasChecked: booleanФлаг, есть ли в подменю выбранные айтемы. (подсвечивает айтем)
onChange: (checked: boolean): voidКолбэк выбора айтема
indeterminate?: booleanФлаг неопределенного состояния (полувыбранный чекбокс)
Компонент Container использует под собой компонент PopoverPrivate (readme ниже);
content: ReactNodeсодержимое дроплиста
open?: boolean - [undefined]управляет состоянием показан/не показан.
onOpenChange?: (isOpen: boolean) => void - [undefined]колбек отображения компонента. Срабатывает при изменении состояния open.
placement?: Placement - topположение дроплиста относительно своего таргета (children).
Возможные значения: Left, LeftStart, LeftEnd, Right, RightStart, RightEnd, Top, TopStart, TopEnd, Bottom, BottomStart, BottomEnd
trigger?: Trigger - clickтриггер открытия/закрытия дроплиста.
Click - открывать по кликуHover - открывать по ховеруFocusVisible - открывать по focus-visibleFocus - открывать по фокусуHoverAndFocusVisible - открывать по ховеру и focus-visibleHoverAndFocus - открывать по ховеру и фокусуClickAndFocusVisible - открывать по клику и focus-visiblehoverDelayOpen?: numberзадержка отображения при ховере в мс
hoverDelayClose?: numberзадержка закрытия при ховере в мс
widthStrategy?: PopoverWidthStrategyстратегия управления шириной контейнера дроплиста
auto - соответствует ширине контента,gte - Great Then or Equal, равен ширине таргета или больше ее, если контент в дроплисте шире,eq - Equal, строго равен ширине таргета.className?: stringCSS-класс на контейнере дроплиста.
triggerClassName?: stringCSS-класс на обёртке триггера поповера.
offset?: numberОтступ дроплиста от его target-элемента (в пикселях).
closeOnEscapeKey?: boolean - [true]Закрывается ли поповер по нажатию клавиши Escape
triggerClickByKeys?: boolean - [true]Вызывается ли попоповер по нажатию клавиш Enter/Space (при trigger = click)
Повторяет пропсы компонента dropdown за исключением
triggerElement: ReactNodeтриггер-элемент, относительно которого открывается Droplist
children: ReactNodeсодержимое дроплиста
| 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). |
FAQs
## Installation `npm i @snack-uikit/droplist`
We found that @snack-uikit/droplist demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Learn the essential steps every developer should take to stay secure on npm and reduce exposure to supply chain attacks.

Security News
Experts push back on new claims about AI-driven ransomware, warning that hype and sponsored research are distorting how the threat is understood.

Security News
Ruby's creator Matz assumes control of RubyGems and Bundler repositories while former maintainers agree to step back and transfer all rights to end the dispute.