npm.io
0.5.8 • Published 1 month ago

@snack-uikit/dropdown

Licence
Apache-2.0
Version
0.5.8
Deps
3
Size
36 kB
Vulns
0
Weekly
0
Stars
23

Dropdown

Installation

npm i @snack-uikit/dropdown

Changelog

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).