0.13.18 • Published 3 days ago

@snack-uikit/droplist v0.13.18

Weekly downloads
-
License
Apache-2.0
Repository
github
Last release
3 days ago

Droplist

Installation

npm i @snack-uikit/droplist

Changelog

Пакет экспортирует 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 и ItemMultiple

option: string

Заголовок айтема

caption?: string

Вторичный заголовок

description?: string

Описание айтема

tagLabel?: string

Текст тэга

size?: Size - s

Размер айтема, возможные значения:

  • sizes.S
  • sizes.M
  • sizes.L

disabled?: boolean

Флаг, задизейблен ли айтем

icon?: ReactElement

Иконка (из пакета icons)

avatar?: Omit<AvatarProps, 'size'>

Пропсы для аватара (@nack-ui/avatar), исключая размер.

className?: string

CSS-класс контейнера

tabIndex?: number

Значение аттрибута tabIndex

checked: boolean

Флаг, выбран ли айтем

hasChecked: boolean

Флаг, есть ли в подменю выбранные айтемы. (подсвечивает айтем)

onChange: (checked: boolean): void

Колбэк выбора айтема

ItemMultiple

indeterminate?: boolean

Флаг неопределенного состояния (полувыбранный чекбокс)

Dropdown

Компонент 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-visible
  • Focus - открывать по фокусу
  • HoverAndFocusVisible - открывать по ховеру и focus-visible
  • HoverAndFocus - открывать по ховеру и фокусу
  • ClickAndFocusVisible - открывать по клику и focus-visible

hoverDelayOpen?: number

задержка отображения при ховере в мс

hoverDelayClose?: number

задержка закрытия при ховере в мс

widthStrategy?: PopoverWidthStrategy

стратегия управления шириной контейнера дроплиста

  • auto - соответствует ширине контента,
  • gte - Great Then or Equal, равен ширине таргета или больше ее, если контент в дроплисте шире,
  • eq - Equal, строго равен ширине таргета.

className?: string

CSS-класс на контейнере дроплиста.

triggerClassName?: string

CSS-класс на обёртке триггера поповера.

offset?: number

Отступ дроплиста от его target-элемента (в пикселях).

closeOnEscapeKey?: boolean - [true]

Закрывается ли поповер по нажатию клавиши Escape

triggerClickByKeys?: boolean - [true]

Вызывается ли попоповер по нажатию клавиш Enter/Space (при trigger = click)

Droplist

Повторяет пропсы компонента dropdown за исключением

triggerElement: ReactNode

триггер-элемент, относительно которого открывается Droplist

children: ReactNode

содержимое дроплиста

Droplist

Props

nametypedefault valuedescription
triggerElement*ReactNode \| ChildrenFunction-
classNamestring-CSS-класс
triggerClassNamestring-CSS-класс триггера
openboolean-Управляет состоянием показан/не показан.
onOpenChange(isOpen: boolean) => void-Колбек отображения компонента. Срабатывает при изменении состояния open.
hoverDelayOpennumber-Задержка открытия по ховеру
hoverDelayClosenumber-Задержка закрытия по ховеру
widthStrategyenum PopoverWidthStrategy: "auto", "gte", "eq"autoСтратегия управления шириной контейнера поповера - auto - соответствует ширине контента, - gte - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, - eq - Equal, строго равен ширине таргета.
offsetnumber0Отступ поповера от его триггер-элемента (в пикселях).
closeOnEscapeKeybooleantrueЗакрывать ли по нажатию на кнопку Esc
triggerClickByKeysbooleantrueВызывается ли попоповер по нажатию клавиш Enter/Space (при trigger = click)
triggerRefForwardedRef<HTMLElement \| ReferenceType>-Ref ссылка на триггер
outsideClickboolean \| OutsideClickHandler-Закрывать ли при клике вне поповера
fallbackPlacementsPlacement[]-Цепочка расположений которая будет применяться к поповеру от первого к последнему если при текущем он не влезает.
triggerenum Trigger: "click", "hover", "focusVisible", "focus", "hoverAndFocusVisible", "hoverAndFocus", "clickAndFocusVisible"-Условие отображения поповера: - click - открывать по клику - hover - открывать по ховеру - focusVisible - открывать по focus-visible - focus - открывать по фокусу - hoverAndFocusVisible - открывать по ховеру и focus-visible - hoverAndFocus - открывать по ховеру и фокусу - clickAndFocusVisible - открывать по клику и focus-visible
placementenum Placement: "left", "left-start", "left-end", "right", "right-start", "right-end", "top", "top-start", "top-end", "bottom", "bottom-start", "bottom-end"topПоложение поповера относительно своего триггера (children).
firstElementRefCallbackRefCallback<HTMLElement>-
onFocusLeave(direction: "left" \| "top" \| "bottom" \| "common") => void-
sizeenum Size: "s", "m", "l"-
scrollRefRefObject<HTMLElement>-
useScrollboolean-

Dropdown

Props

nametypedefault valuedescription
children*ReactNode \| ChildrenFunction-Триггер поповера (подробнее читайте ниже)
content*ReactNode-
classNamestring-CSS-класс
triggerClassNamestring-CSS-класс триггера
openboolean-Управляет состоянием показан/не показан.
onOpenChange(isOpen: boolean) => void-Колбек отображения компонента. Срабатывает при изменении состояния open.
hoverDelayOpennumber-Задержка открытия по ховеру
hoverDelayClosenumber-Задержка закрытия по ховеру
widthStrategyenum PopoverWidthStrategy: "auto", "gte", "eq"gteСтратегия управления шириной контейнера поповера - auto - соответствует ширине контента, - gte - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, - eq - Equal, строго равен ширине таргета.
offsetnumber0Отступ поповера от его триггер-элемента (в пикселях).
closeOnEscapeKeybooleantrueЗакрывать ли по нажатию на кнопку Esc
triggerClickByKeysbooleantrueВызывается ли попоповер по нажатию клавиш Enter/Space (при trigger = click)
triggerRefForwardedRef<HTMLElement \| ReferenceType>-Ref ссылка на триггер
outsideClickboolean \| OutsideClickHandler-Закрывать ли при клике вне поповера
fallbackPlacementsPlacement[]-Цепочка расположений которая будет применяться к поповеру от первого к последнему если при текущем он не влезает.
triggerenum Trigger: "click", "hover", "focusVisible", "focus", "hoverAndFocusVisible", "hoverAndFocus", "clickAndFocusVisible"clickУсловие отображения поповера: - click - открывать по клику - hover - открывать по ховеру - focusVisible - открывать по focus-visible - focus - открывать по фокусу - hoverAndFocusVisible - открывать по ховеру и focus-visible - hoverAndFocus - открывать по ховеру и фокусу - clickAndFocusVisible - открывать по клику и focus-visible
placementenum Placement: "left", "left-start", "left-end", "right", "right-start", "right-end", "top", "top-start", "top-end", "bottom", "bottom-start", "bottom-end"bottom-startПоложение поповера относительно своего триггера (children).
0.13.18

3 days ago

0.13.17

16 days ago

0.13.16

18 days ago

0.13.15

19 days ago

0.13.14

2 months ago

0.13.13

2 months ago

0.13.12

2 months ago

0.13.11

2 months ago

0.13.10

2 months ago

0.13.8

3 months ago

0.13.9

2 months ago

0.13.6

3 months ago

0.13.7

3 months ago

0.13.5

3 months ago

0.13.4

3 months ago

0.13.3

3 months ago

0.13.2

3 months ago

0.13.1

3 months ago

0.13.0

3 months ago

0.12.5

4 months ago

0.12.4

4 months ago

0.12.3

5 months ago

0.12.2

5 months ago

0.12.1

5 months ago

0.12.0

5 months ago

0.11.2

5 months ago

0.11.1

5 months ago

0.11.0

5 months ago