@cloud-ru/ds-list 2.0.4-preview-9005559b.0 → 2.0.4-preview-5926424e.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -900,6 +900,7 @@ export function DroplistWithHeader() {
900
900
  | `selection` | `SelectionMultipleState` \| `SelectionSingleState` | — | Настройки выбора элементов. `mode: 'single'` — один выбранный элемент (`value: ItemId`), <br/> `mode: 'multiple'` — множественный выбор (`value: ItemId[]`). Без `selection` выбора нет — <br/> клик вызывает только `onClick` элемента. |
901
901
  | `size` | `"l"` \| `"m"` \| `"s"` | — | Размер списка |
902
902
  | `slotAfterTitle` | `ReactNode` | — | Только mobile (`BottomSheet`): slot справа от заголовка. |
903
+ | `snapPoints` | `SnapPoint` | — | Массив фиксированных позиций sheet'а от меньшей к большей. По дефолту `undefined` — <br/> sheet `height: auto` с одним snap'ом по высоте контента. <br/> Пример: `[0.5, 1]` — sheet открывается на половину экрана, drag вверх раскрывает <br/> до full-viewport; drag вниз ниже `0.5` ведёт к закрытию. <br/> Контракт массива (движок не сортирует и не дедуплицирует — порядок и различимость на <br/> стороне потребителя): <br/> - строго по возрастанию: индекс `0` — самая компактная позиция, последний — top / expanded; <br/> - значения должны резолвиться в различные высоты (`['50%', 0.5]` на типичном вьюпорте дадут <br/> одну высоту → дубль-индекс будет недостижим свайпом); <br/> - `'fit-content'` имеет смысл только как ЕДИНСТВЕННЫЙ snap (без `snapPoints`); внутри массива <br/> фиксированных позиций его «контентная» высота не определена. |
903
904
  | `trigger` | `"click"` \| `"clickAndFocusVisible"` \| `"focus"` \| `"focusVisible"` \| `"hover"` \| `"hoverAndFocus"` \| `"hoverAndFocusVisible"` | — | Условие отображения поповера: <br/> - `click` - открывать по клику <br/> - `hover` - открывать по ховеру <br/> - `focusVisible` - открывать по focus-visible <br/> - `focus` - открывать по фокусу <br/> - `hoverAndFocusVisible` - открывать по ховеру и focus-visible <br/> - `hoverAndFocus` - открывать по ховеру и фокусу <br/> - `clickAndFocusVisible` - открывать по клику и focus-visible |
904
905
  | `triggerClassName` | `string` | — | CSS-класс триггера |
905
906
  | `triggerElemRef` | `RefObject<HTMLElement>` | — | Ссылка на элемент-триггер для дроплиста |
@@ -962,8 +963,6 @@ export function DroplistWithHeader() {
962
963
 
963
964
  - `Item` = `BaseItem | GroupItem | GroupSelectItem | NextListItem | AccordionItem`
964
965
 
965
- - `ItemId` = `string | number`
966
-
967
966
  **ScrollProps**
968
967
 
969
968
  | Prop | Type | Default | Description |
@@ -1,4 +1,5 @@
1
1
  import { DragEndEvent } from '@dnd-kit/core';
2
+ import { BottomSheetProps } from '@cloud-ru/ds-bottom-sheet';
2
3
  import { DropdownProps } from '@cloud-ru/ds-dropdown';
3
4
  import { WithSupportProps } from '@cloud-ru/ds-utils';
4
5
  import { FocusEvent, KeyboardEvent, ReactNode, RefObject } from 'react';
@@ -161,7 +162,7 @@ type DroplistMobileSlots = {
161
162
  * (список size `l` в `BottomSheet`), иначе — `DesktopDroplist` (анкорный popover). Mobile-слоты
162
163
  * применяются только на mobile.
163
164
  */
164
- export type DroplistProps = BaseDroplistProps & DroplistMobileSlots;
165
+ export type DroplistProps = BaseDroplistProps & DroplistMobileSlots & Pick<BottomSheetProps, 'snapPoints'>;
165
166
  /**
166
167
  * Props адаптивного `ReorderableDroplist`: props `ReorderableList` + popover/mobile-обвязка
167
168
  * `Droplist`. Отдельный компонент по той же причине, что и `ReorderableList`.
@@ -173,7 +174,7 @@ export type DroplistImplProps = DesktopDroplistProps & DroplistMobileSlots;
173
174
  * @internal Props mobile-реализации (`BottomSheet`): реализация дроплиста без popover-пропов
174
175
  * + mobile-слоты.
175
176
  */
176
- export type MobileDroplistProps = Omit<DesktopDroplistProps, 'trigger' | 'placement' | 'widthStrategy' | 'triggerElemRef' | 'listRef' | 'triggerClassName'> & DroplistMobileSlots;
177
+ export type MobileDroplistProps = Omit<DesktopDroplistProps, 'trigger' | 'placement' | 'widthStrategy' | 'triggerElemRef' | 'listRef' | 'triggerClassName'> & Pick<BottomSheetProps, 'snapPoints'> & DroplistMobileSlots;
177
178
  export type ListPrivateProps = Omit<ListImplProps, 'pinTop' | 'pinBottom' | 'items' | 'hasListInFocusChain' | 'onItemsReorder' | 'virtualized'> & {
178
179
  nested?: boolean;
179
180
  active?: boolean;
@@ -6,4 +6,4 @@ import { MobileDroplistProps } from '../../components/Lists/types';
6
6
  * вложенного списка, в шапке появляется его заголовок и кнопка «назад». Internal — наружу не реэкспортится;
7
7
  * рендерится адаптивным `Droplist` на `layoutType='mobile'`.
8
8
  */
9
- export declare function MobileDroplist({ items, selection, open: openProp, onOpenChange, children, search, label, actionButton, slotAfterTitle, onBackButtonClick, virtualized, closeDroplistOnItemClick, scroll, container, closeOnPopstate, size, footer, onItemsReorder, ...rest }: MobileDroplistProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function MobileDroplist({ items, selection, open: openProp, onOpenChange, children, search, label, actionButton, slotAfterTitle, onBackButtonClick, virtualized, closeDroplistOnItemClick, scroll, container, closeOnPopstate, size, snapPoints, footer, onItemsReorder, ...rest }: MobileDroplistProps): import("react/jsx-runtime").JSX.Element;
@@ -20,7 +20,7 @@ const utils_2 = require("./utils");
20
20
  * вложенного списка, в шапке появляется его заголовок и кнопка «назад». Internal — наружу не реэкспортится;
21
21
  * рендерится адаптивным `Droplist` на `layoutType='mobile'`.
22
22
  */
23
- function MobileDroplist({ items, selection, open: openProp, onOpenChange, children, search, label, actionButton, slotAfterTitle, onBackButtonClick, virtualized, closeDroplistOnItemClick, scroll, container, closeOnPopstate, size,
23
+ function MobileDroplist({ items, selection, open: openProp, onOpenChange, children, search, label, actionButton, slotAfterTitle, onBackButtonClick, virtualized, closeDroplistOnItemClick, scroll, container, closeOnPopstate, size, snapPoints,
24
24
  // `footer` уводим в sticky-футер `BottomSheet` (кнопки действия прилипают к низу sheet'а, а не
25
25
  // скроллятся вместе со списком). `header` + `headerDivider` / `footerDivider` НЕ деструктурируем —
26
26
  // они уходят в `...rest` на корневой `List` (он рендерит шапку и её divider).
@@ -143,6 +143,6 @@ footer, onItemsReorder, ...rest }) {
143
143
  container: container?.current ?? containerRef, open: isRoot ? open : true,
144
144
  // Dismiss (backdrop / swipe / Esc): на корне — закрыть весь droplist; глубже — вернуться на уровень вверх,
145
145
  // как ждёт пользователь на mobile (а не закрывать всю цепочку разом).
146
- onClose: isRoot ? handleClose : popLevel, withDividers: true, title: title, onBackButtonClick: handleBack, actionButton: isRoot ? actionButton : undefined, slotAfterTitle: isRoot ? slotAfterTitle : undefined, content: content, footer: isRoot ? footer : undefined, snapPoints: expanded ? [1] : undefined, closeOnPopstate: closeOnPopstate ?? true }, isRoot ? 'root' : String(item?.id ?? levelIndex)));
146
+ onClose: isRoot ? handleClose : popLevel, withDividers: true, title: title, onBackButtonClick: handleBack, actionButton: isRoot ? actionButton : undefined, slotAfterTitle: isRoot ? slotAfterTitle : undefined, content: content, footer: isRoot ? footer : undefined, snapPoints: expanded ? [1] : snapPoints, closeOnPopstate: closeOnPopstate ?? true }, isRoot ? 'root' : String(item?.id ?? levelIndex)));
147
147
  })] }));
148
148
  }
@@ -1,4 +1,5 @@
1
1
  import { DragEndEvent } from '@dnd-kit/core';
2
+ import { BottomSheetProps } from '@cloud-ru/ds-bottom-sheet';
2
3
  import { DropdownProps } from '@cloud-ru/ds-dropdown';
3
4
  import { WithSupportProps } from '@cloud-ru/ds-utils';
4
5
  import { FocusEvent, KeyboardEvent, ReactNode, RefObject } from 'react';
@@ -161,7 +162,7 @@ type DroplistMobileSlots = {
161
162
  * (список size `l` в `BottomSheet`), иначе — `DesktopDroplist` (анкорный popover). Mobile-слоты
162
163
  * применяются только на mobile.
163
164
  */
164
- export type DroplistProps = BaseDroplistProps & DroplistMobileSlots;
165
+ export type DroplistProps = BaseDroplistProps & DroplistMobileSlots & Pick<BottomSheetProps, 'snapPoints'>;
165
166
  /**
166
167
  * Props адаптивного `ReorderableDroplist`: props `ReorderableList` + popover/mobile-обвязка
167
168
  * `Droplist`. Отдельный компонент по той же причине, что и `ReorderableList`.
@@ -173,7 +174,7 @@ export type DroplistImplProps = DesktopDroplistProps & DroplistMobileSlots;
173
174
  * @internal Props mobile-реализации (`BottomSheet`): реализация дроплиста без popover-пропов
174
175
  * + mobile-слоты.
175
176
  */
176
- export type MobileDroplistProps = Omit<DesktopDroplistProps, 'trigger' | 'placement' | 'widthStrategy' | 'triggerElemRef' | 'listRef' | 'triggerClassName'> & DroplistMobileSlots;
177
+ export type MobileDroplistProps = Omit<DesktopDroplistProps, 'trigger' | 'placement' | 'widthStrategy' | 'triggerElemRef' | 'listRef' | 'triggerClassName'> & Pick<BottomSheetProps, 'snapPoints'> & DroplistMobileSlots;
177
178
  export type ListPrivateProps = Omit<ListImplProps, 'pinTop' | 'pinBottom' | 'items' | 'hasListInFocusChain' | 'onItemsReorder' | 'virtualized'> & {
178
179
  nested?: boolean;
179
180
  active?: boolean;
@@ -6,4 +6,4 @@ import { MobileDroplistProps } from '../../components/Lists/types.js';
6
6
  * вложенного списка, в шапке появляется его заголовок и кнопка «назад». Internal — наружу не реэкспортится;
7
7
  * рендерится адаптивным `Droplist` на `layoutType='mobile'`.
8
8
  */
9
- export declare function MobileDroplist({ items, selection, open: openProp, onOpenChange, children, search, label, actionButton, slotAfterTitle, onBackButtonClick, virtualized, closeDroplistOnItemClick, scroll, container, closeOnPopstate, size, footer, onItemsReorder, ...rest }: MobileDroplistProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function MobileDroplist({ items, selection, open: openProp, onOpenChange, children, search, label, actionButton, slotAfterTitle, onBackButtonClick, virtualized, closeDroplistOnItemClick, scroll, container, closeOnPopstate, size, snapPoints, footer, onItemsReorder, ...rest }: MobileDroplistProps): import("react/jsx-runtime").JSX.Element;
@@ -14,7 +14,7 @@ import { buildLevelItems, nextListOption, resolveItemByPath } from './utils.js';
14
14
  * вложенного списка, в шапке появляется его заголовок и кнопка «назад». Internal — наружу не реэкспортится;
15
15
  * рендерится адаптивным `Droplist` на `layoutType='mobile'`.
16
16
  */
17
- export function MobileDroplist({ items, selection, open: openProp, onOpenChange, children, search, label, actionButton, slotAfterTitle, onBackButtonClick, virtualized, closeDroplistOnItemClick, scroll, container, closeOnPopstate, size,
17
+ export function MobileDroplist({ items, selection, open: openProp, onOpenChange, children, search, label, actionButton, slotAfterTitle, onBackButtonClick, virtualized, closeDroplistOnItemClick, scroll, container, closeOnPopstate, size, snapPoints,
18
18
  // `footer` уводим в sticky-футер `BottomSheet` (кнопки действия прилипают к низу sheet'а, а не
19
19
  // скроллятся вместе со списком). `header` + `headerDivider` / `footerDivider` НЕ деструктурируем —
20
20
  // они уходят в `...rest` на корневой `List` (он рендерит шапку и её divider).
@@ -137,6 +137,6 @@ footer, onItemsReorder, ...rest }) {
137
137
  container: container?.current ?? containerRef, open: isRoot ? open : true,
138
138
  // Dismiss (backdrop / swipe / Esc): на корне — закрыть весь droplist; глубже — вернуться на уровень вверх,
139
139
  // как ждёт пользователь на mobile (а не закрывать всю цепочку разом).
140
- onClose: isRoot ? handleClose : popLevel, withDividers: true, title: title, onBackButtonClick: handleBack, actionButton: isRoot ? actionButton : undefined, slotAfterTitle: isRoot ? slotAfterTitle : undefined, content: content, footer: isRoot ? footer : undefined, snapPoints: expanded ? [1] : undefined, closeOnPopstate: closeOnPopstate ?? true }, isRoot ? 'root' : String(item?.id ?? levelIndex)));
140
+ onClose: isRoot ? handleClose : popLevel, withDividers: true, title: title, onBackButtonClick: handleBack, actionButton: isRoot ? actionButton : undefined, slotAfterTitle: isRoot ? slotAfterTitle : undefined, content: content, footer: isRoot ? footer : undefined, snapPoints: expanded ? [1] : snapPoints, closeOnPopstate: closeOnPopstate ?? true }, isRoot ? 'root' : String(item?.id ?? levelIndex)));
141
141
  })] }));
142
142
  }