@cloud-ru/ds-list 2.2.10-preview-5c9b8135.0 → 2.3.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/CHANGELOG.md +6 -0
- package/README.md +4 -21
- package/dist/cjs/components/Lists/types.d.ts +2 -2
- package/dist/cjs/helperComponents/DesktopDroplist/DesktopDroplist.d.ts +1 -1
- package/dist/cjs/helperComponents/DesktopDroplist/DesktopDroplist.js +2 -2
- package/dist/esm/components/Lists/types.d.ts +2 -2
- package/dist/esm/helperComponents/DesktopDroplist/DesktopDroplist.d.ts +1 -1
- package/dist/esm/helperComponents/DesktopDroplist/DesktopDroplist.js +2 -2
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +18 -18
- package/src/components/Lists/types.ts +9 -2
- package/src/helperComponents/DesktopDroplist/DesktopDroplist.tsx +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# 2.3.0 (2026-10-05)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
- **FF-9204:** add disableSpanWrapper prop ([2f4bc67](https://github.com/cloud-ru-tech/snack-v2/commit/2f4bc675bb984f18c788913dd8f5136cd4be3ed9))
|
|
11
|
+
|
|
6
12
|
## 2.2.9 (2026-10-02)
|
|
7
13
|
|
|
8
14
|
**Note:** Version bump only for package @ds/list
|
package/README.md
CHANGED
|
@@ -953,6 +953,7 @@ export function DroplistWithHeader() {
|
|
|
953
953
|
| `data-test-id` | `string` | — | |
|
|
954
954
|
| `dataError` | `boolean` | — | Загрузка данных завершилась ошибкой: показывается `errorDataState` |
|
|
955
955
|
| `dataFiltered` | `boolean` | — | Текущий пустой список — результат поиска/фильтра: показывается `noResultsState` вместо `noDataState` |
|
|
956
|
+
| `disableSpanWrapper` | `boolean` | — | Отключает для `isValidElement` внешнюю обертку триггера <br/> Пригодится для элементов с `position: absolute` <br/> Работает для триггеров, которые умеют отдать свою DOM-ноду: нативные элементы, `forwardRef`-компоненты <br/> и компоненты, помеченные `withInnerRefSupport` из `@cloud-ru/ds-utils`. Остальные всё равно получают `<span>` — <br/> без ноды поповеру не от чего считать позицию; в dev-режиме об этом печатается предупреждение. |
|
|
956
957
|
| `errorDataState` | `EmptyStateProps` | — | Экран при ошибке запроса |
|
|
957
958
|
| `footer` | `ReactNode ;` | — | Кастомизируемый элемент в конце списка |
|
|
958
959
|
| `footerActiveElementsRefs` | `RefObject<HTMLElement>[]` | — | Список ссылок на кастомные элементы, помещенные в специальную секцию внизу списка |
|
|
@@ -969,7 +970,7 @@ export function DroplistWithHeader() {
|
|
|
969
970
|
| `noResultsState` | `EmptyStateProps` | — | Экран при отсутствии результатов поиска или фильтров |
|
|
970
971
|
| `onBackButtonClick` | `(() => void)` | — | Только mobile (`BottomSheet`): callback back-кнопки. |
|
|
971
972
|
| `onOpenChange` | `((isOpen: boolean) => void)` | — | Колбек отображения компонента. Срабатывает при изменении состояния open. |
|
|
972
|
-
| `onScroll` | `
|
|
973
|
+
| `onScroll` | `OriginalScrollProps` | — | Колбек на скролл прокручиваемого списка |
|
|
973
974
|
| `open` | `boolean` | — | Управляет состоянием показан/не показан. |
|
|
974
975
|
| `pinBottom` | `BaseItemWithoutNonGroup` \| `CommonGroupItem` \| `Item` \| `ScrollProps` | — | Элементы списка, закрепленные снизу |
|
|
975
976
|
| `pinTop` | `BaseItemWithoutNonGroup` \| `CommonGroupItem` \| `Item` \| `ScrollProps` | — | Элементы списка, закрепленные сверху |
|
|
@@ -1025,8 +1026,6 @@ export function DroplistWithHeader() {
|
|
|
1025
1026
|
| `toggleOn` | `"expandIcon"` \| `"item"` | — | Что переключает раскрытие вложенного списка: <br/> <br> - `item` — клик по всей строке (по умолчанию), <br/> <br> - `expandIcon` — только клик по шеврону; клик по строке остаётся потребителю <br/> (например, когда `itemWrapRender` оборачивает строку в ссылку). <br/> Клавиатура (`Enter` / `Space` / `ArrowRight` на строке) раскрывает группу в обоих режимах. |
|
|
1026
1027
|
| `value` | `ItemId` | — | |
|
|
1027
1028
|
|
|
1028
|
-
- `CollapseToggleOn` = `"expandIcon"` \| `"item"`
|
|
1029
|
-
|
|
1030
1029
|
**CommonGroupItem**
|
|
1031
1030
|
|
|
1032
1031
|
| Prop | Type | Default | Description |
|
|
@@ -1036,7 +1035,7 @@ export function DroplistWithHeader() {
|
|
|
1036
1035
|
| `groupVariant` | `"subtitle"` \| `"subtitleTertiary"` | — | Визуальный стиль заголовка группы |
|
|
1037
1036
|
| `hidden` | `boolean \| undefined` | — | Скрыть группу из списка |
|
|
1038
1037
|
| `label` | `string \| undefined` | — | Заголовок группы |
|
|
1039
|
-
| `truncate` | `
|
|
1038
|
+
| `truncate` | `TruncateStringProps` | — | Настройки усечения длинного заголовка группы |
|
|
1040
1039
|
|
|
1041
1040
|
**EmptyStateProps**
|
|
1042
1041
|
|
|
@@ -1050,28 +1049,12 @@ export function DroplistWithHeader() {
|
|
|
1050
1049
|
|
|
1051
1050
|
- `Item` = `BaseItem | GroupItem | GroupSelectItem | NextListItem | AccordionItem`
|
|
1052
1051
|
|
|
1053
|
-
**ItemContent**
|
|
1054
|
-
|
|
1055
|
-
| Prop | Type | Default | Description |
|
|
1056
|
-
|------|------|---------|-------------|
|
|
1057
|
-
| `caption` | `string \| undefined` | — | |
|
|
1058
|
-
| `className` | `string \| undefined` | — | |
|
|
1059
|
-
| `data-test-id` | `string \| undefined` | — | |
|
|
1060
|
-
| `description` | `string \| undefined` | — | |
|
|
1061
|
-
| `disabled` | `boolean \| undefined` | — | |
|
|
1062
|
-
| `label` | `string \| number` | — | |
|
|
1063
|
-
| `truncate` | `TruncateProps` | — | |
|
|
1064
|
-
|
|
1065
|
-
- `ItemId` = `string | number`
|
|
1066
|
-
|
|
1067
|
-
- `OnChangeHandler` = `(value: T) => void`
|
|
1068
|
-
|
|
1069
1052
|
**ScrollProps**
|
|
1070
1053
|
|
|
1071
1054
|
| Prop | Type | Default | Description |
|
|
1072
1055
|
|------|------|---------|-------------|
|
|
1073
1056
|
| `barHideStrategy` | `"leave"` \| `"move"` \| `"never"` \| `"scroll"` | — | Управление скрытием скролл баров: <br/> <br> - `Never` - показывать всегда <br/> <br> - `Leave` - скрывать когда курсор покидает компонент <br/> <br> - `Scroll` - показывать только когда происходит скроллинг <br/> <br> - `Move` - показывать при движении курсора над компонентом |
|
|
1074
|
-
| `onScroll` | `
|
|
1057
|
+
| `onScroll` | `OriginalScrollProps` | — | Колбек на скролл прокручиваемого списка |
|
|
1075
1058
|
| `scroll` | `boolean \| undefined` | — | Включить ли скролл для основной части списка |
|
|
1076
1059
|
| `scrollContainerRef` | `Ref<HTMLElement> \| undefined` | — | Ссылка на контейнер, который скроллится |
|
|
1077
1060
|
| `scrollRef` | `Ref<HTMLElement> \| undefined` | — | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
|
|
@@ -133,7 +133,7 @@ type DroplistOwnProps = {
|
|
|
133
133
|
children: ReactNode | ((params: {
|
|
134
134
|
onKeyDown?: (e: KeyboardEvent<HTMLElement>) => void;
|
|
135
135
|
}) => ReactNode);
|
|
136
|
-
} & Pick<DropdownProps, 'trigger' | 'placement' | 'widthStrategy' | 'open' | 'onOpenChange' | 'triggerClassName' | 'closeOnPopstate'>;
|
|
136
|
+
} & Pick<DropdownProps, 'trigger' | 'placement' | 'widthStrategy' | 'open' | 'onOpenChange' | 'triggerClassName' | 'disableSpanWrapper' | 'closeOnPopstate'>;
|
|
137
137
|
/** Props списка, которые дроплист пробрасывает в `List` (навигацией управляет он сам). */
|
|
138
138
|
type DroplistListProps<T> = Omit<T, 'tabIndex' | 'onKeyDown' | 'hasListInFocusChain' | 'keyboardNavigationRef'>;
|
|
139
139
|
/** Базовые props дроплиста: собственные + props обычного `List`. */
|
|
@@ -174,7 +174,7 @@ export type DroplistImplProps = DesktopDroplistProps & DroplistMobileSlots;
|
|
|
174
174
|
* @internal Props mobile-реализации (`BottomSheet`): реализация дроплиста без popover-пропов
|
|
175
175
|
* + mobile-слоты.
|
|
176
176
|
*/
|
|
177
|
-
export type MobileDroplistProps = Omit<DesktopDroplistProps, 'trigger' | 'placement' | 'widthStrategy' | 'triggerElemRef' | 'listRef' | 'triggerClassName'> & Pick<BottomSheetProps, 'snapPoints' | 'withDividers'> & DroplistMobileSlots;
|
|
177
|
+
export type MobileDroplistProps = Omit<DesktopDroplistProps, 'trigger' | 'placement' | 'widthStrategy' | 'triggerElemRef' | 'listRef' | 'triggerClassName' | 'disableSpanWrapper'> & Pick<BottomSheetProps, 'snapPoints' | 'withDividers'> & DroplistMobileSlots;
|
|
178
178
|
export type ListPrivateProps = Omit<ListImplProps, 'pinTop' | 'pinBottom' | 'items' | 'hasListInFocusChain' | 'onItemsReorder' | 'virtualized'> & {
|
|
179
179
|
nested?: boolean;
|
|
180
180
|
active?: boolean;
|
|
@@ -4,4 +4,4 @@ import { DesktopDroplistProps } from '../../components/Lists/types';
|
|
|
4
4
|
* не реэкспортится; рендерится адаптивным `Droplist` на не-mobile раскладке. Так как вызывается
|
|
5
5
|
* только на desktop-раскладке, внутренний адаптивный `Dropdown` всегда рендерит popover.
|
|
6
6
|
*/
|
|
7
|
-
export declare function DesktopDroplist({ items: itemsProp, search, pinBottom: pinBottomProp, pinTop: pinTopProp, footerActiveElementsRefs, children, trigger, placement, widthStrategy, triggerElemRef: triggerElemRefProp, container, open: openProp, onOpenChange, collapse, triggerClassName, selection, contentRender, size, marker, closeDroplistOnItemClick, className, listRef: listRefProp, untouchableScrollbars, virtualized, closeOnPopstate, header, headerDivider, footer, footerDivider, onItemsReorder, ...props }: DesktopDroplistProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare function DesktopDroplist({ items: itemsProp, search, pinBottom: pinBottomProp, pinTop: pinTopProp, footerActiveElementsRefs, children, trigger, placement, widthStrategy, triggerElemRef: triggerElemRefProp, container, open: openProp, onOpenChange, collapse, triggerClassName, disableSpanWrapper, selection, contentRender, size, marker, closeDroplistOnItemClick, className, listRef: listRefProp, untouchableScrollbars, virtualized, closeOnPopstate, header, headerDivider, footer, footerDivider, onItemsReorder, ...props }: DesktopDroplistProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -21,7 +21,7 @@ const styles_module_scss_1 = __importDefault(require('../../components/Lists/sty
|
|
|
21
21
|
* не реэкспортится; рендерится адаптивным `Droplist` на не-mobile раскладке. Так как вызывается
|
|
22
22
|
* только на desktop-раскладке, внутренний адаптивный `Dropdown` всегда рендерит popover.
|
|
23
23
|
*/
|
|
24
|
-
function DesktopDroplist({ items: itemsProp, search, pinBottom: pinBottomProp = [], pinTop: pinTopProp = [], footerActiveElementsRefs, children, trigger, placement, widthStrategy, triggerElemRef: triggerElemRefProp, container, open: openProp, onOpenChange, collapse = {}, triggerClassName, selection, contentRender, size = constants_1.DEFAULT_SIZE, marker = true, closeDroplistOnItemClick = false, className, listRef: listRefProp, untouchableScrollbars = false, virtualized = false, closeOnPopstate, header, headerDivider, footer, footerDivider, onItemsReorder, ...props }) {
|
|
24
|
+
function DesktopDroplist({ items: itemsProp, search, pinBottom: pinBottomProp = [], pinTop: pinTopProp = [], footerActiveElementsRefs, children, trigger, placement, widthStrategy, triggerElemRef: triggerElemRefProp, container, open: openProp, onOpenChange, collapse = {}, triggerClassName, disableSpanWrapper, selection, contentRender, size = constants_1.DEFAULT_SIZE, marker = true, closeDroplistOnItemClick = false, className, listRef: listRefProp, untouchableScrollbars = false, virtualized = false, closeOnPopstate, header, headerDivider, footer, footerDivider, onItemsReorder, ...props }) {
|
|
25
25
|
const { hasSearch, openCollapseItems, toggleOpenCollapseItem, searchItem, flattenItems, focusFlattenItems, memorizedItems, ids, expandedIds, firstItemId, onDragEnd, sortableIds, } = (0, hooks_1.useListItemsModel)({
|
|
26
26
|
items: itemsProp,
|
|
27
27
|
pinTop: pinTopProp,
|
|
@@ -135,7 +135,7 @@ function DesktopDroplist({ items: itemsProp, search, pinBottom: pinBottomProp =
|
|
|
135
135
|
// Divider под topBar рисуется, если явно запрошен header'ом либо когда в topBar
|
|
136
136
|
// есть поиск: строка поиска визуально отделяется от тела списка (как в PinTopGroupItem
|
|
137
137
|
// у inline-List). @cloud-ru/ds-dropdown рисует один divider на весь topBar (headline + search).
|
|
138
|
-
headerDivider: headerDivider || hasSearch, search: searchNode, footer: footerNode, footerDivider: footerDivider, container: container, outsideClick: true, triggerClassName: triggerClassName, fallbackPlacements: constants_1.DEFAULT_FALLBACK_PLACEMENTS, trigger: trigger, placement: placement, widthStrategy: effectiveWidthStrategy, triggerRef: !triggerElemRefProp ? triggerElemRef : (isValid && triggerElemRefProp) || undefined, open: open, onOpenChange: handleOpenChange, closeOnPopstate: closeOnPopstate,
|
|
138
|
+
headerDivider: headerDivider || hasSearch, search: searchNode, footer: footerNode, footerDivider: footerDivider, container: container, outsideClick: true, triggerClassName: triggerClassName, disableSpanWrapper: disableSpanWrapper, fallbackPlacements: constants_1.DEFAULT_FALLBACK_PLACEMENTS, trigger: trigger, placement: placement, widthStrategy: effectiveWidthStrategy, triggerRef: !triggerElemRefProp ? triggerElemRef : (isValid && triggerElemRefProp) || undefined, open: open, onOpenChange: handleOpenChange, closeOnPopstate: closeOnPopstate,
|
|
139
139
|
// dnd-kit (`MouseSensor`/`TouchSensor`) слушает `mouseup`/`touchend` на document
|
|
140
140
|
// в bubble-фазе — гашение этих хендлеров на floating ломает завершение drag.
|
|
141
141
|
stopPropagation: onItemsReorder ? { onMouseUp: false, onTouchEnd: false } : undefined, children: triggerElem }) }) }) }) }) }));
|
|
@@ -133,7 +133,7 @@ type DroplistOwnProps = {
|
|
|
133
133
|
children: ReactNode | ((params: {
|
|
134
134
|
onKeyDown?: (e: KeyboardEvent<HTMLElement>) => void;
|
|
135
135
|
}) => ReactNode);
|
|
136
|
-
} & Pick<DropdownProps, 'trigger' | 'placement' | 'widthStrategy' | 'open' | 'onOpenChange' | 'triggerClassName' | 'closeOnPopstate'>;
|
|
136
|
+
} & Pick<DropdownProps, 'trigger' | 'placement' | 'widthStrategy' | 'open' | 'onOpenChange' | 'triggerClassName' | 'disableSpanWrapper' | 'closeOnPopstate'>;
|
|
137
137
|
/** Props списка, которые дроплист пробрасывает в `List` (навигацией управляет он сам). */
|
|
138
138
|
type DroplistListProps<T> = Omit<T, 'tabIndex' | 'onKeyDown' | 'hasListInFocusChain' | 'keyboardNavigationRef'>;
|
|
139
139
|
/** Базовые props дроплиста: собственные + props обычного `List`. */
|
|
@@ -174,7 +174,7 @@ export type DroplistImplProps = DesktopDroplistProps & DroplistMobileSlots;
|
|
|
174
174
|
* @internal Props mobile-реализации (`BottomSheet`): реализация дроплиста без popover-пропов
|
|
175
175
|
* + mobile-слоты.
|
|
176
176
|
*/
|
|
177
|
-
export type MobileDroplistProps = Omit<DesktopDroplistProps, 'trigger' | 'placement' | 'widthStrategy' | 'triggerElemRef' | 'listRef' | 'triggerClassName'> & Pick<BottomSheetProps, 'snapPoints' | 'withDividers'> & DroplistMobileSlots;
|
|
177
|
+
export type MobileDroplistProps = Omit<DesktopDroplistProps, 'trigger' | 'placement' | 'widthStrategy' | 'triggerElemRef' | 'listRef' | 'triggerClassName' | 'disableSpanWrapper'> & Pick<BottomSheetProps, 'snapPoints' | 'withDividers'> & DroplistMobileSlots;
|
|
178
178
|
export type ListPrivateProps = Omit<ListImplProps, 'pinTop' | 'pinBottom' | 'items' | 'hasListInFocusChain' | 'onItemsReorder' | 'virtualized'> & {
|
|
179
179
|
nested?: boolean;
|
|
180
180
|
active?: boolean;
|
|
@@ -4,4 +4,4 @@ import { DesktopDroplistProps } from '../../components/Lists/types.js';
|
|
|
4
4
|
* не реэкспортится; рендерится адаптивным `Droplist` на не-mobile раскладке. Так как вызывается
|
|
5
5
|
* только на desktop-раскладке, внутренний адаптивный `Dropdown` всегда рендерит popover.
|
|
6
6
|
*/
|
|
7
|
-
export declare function DesktopDroplist({ items: itemsProp, search, pinBottom: pinBottomProp, pinTop: pinTopProp, footerActiveElementsRefs, children, trigger, placement, widthStrategy, triggerElemRef: triggerElemRefProp, container, open: openProp, onOpenChange, collapse, triggerClassName, selection, contentRender, size, marker, closeDroplistOnItemClick, className, listRef: listRefProp, untouchableScrollbars, virtualized, closeOnPopstate, header, headerDivider, footer, footerDivider, onItemsReorder, ...props }: DesktopDroplistProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare function DesktopDroplist({ items: itemsProp, search, pinBottom: pinBottomProp, pinTop: pinTopProp, footerActiveElementsRefs, children, trigger, placement, widthStrategy, triggerElemRef: triggerElemRefProp, container, open: openProp, onOpenChange, collapse, triggerClassName, disableSpanWrapper, selection, contentRender, size, marker, closeDroplistOnItemClick, className, listRef: listRefProp, untouchableScrollbars, virtualized, closeOnPopstate, header, headerDivider, footer, footerDivider, onItemsReorder, ...props }: DesktopDroplistProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -15,7 +15,7 @@ import styles from '../../components/Lists/styles.module.css';
|
|
|
15
15
|
* не реэкспортится; рендерится адаптивным `Droplist` на не-mobile раскладке. Так как вызывается
|
|
16
16
|
* только на desktop-раскладке, внутренний адаптивный `Dropdown` всегда рендерит popover.
|
|
17
17
|
*/
|
|
18
|
-
export function DesktopDroplist({ items: itemsProp, search, pinBottom: pinBottomProp = [], pinTop: pinTopProp = [], footerActiveElementsRefs, children, trigger, placement, widthStrategy, triggerElemRef: triggerElemRefProp, container, open: openProp, onOpenChange, collapse = {}, triggerClassName, selection, contentRender, size = DEFAULT_SIZE, marker = true, closeDroplistOnItemClick = false, className, listRef: listRefProp, untouchableScrollbars = false, virtualized = false, closeOnPopstate, header, headerDivider, footer, footerDivider, onItemsReorder, ...props }) {
|
|
18
|
+
export function DesktopDroplist({ items: itemsProp, search, pinBottom: pinBottomProp = [], pinTop: pinTopProp = [], footerActiveElementsRefs, children, trigger, placement, widthStrategy, triggerElemRef: triggerElemRefProp, container, open: openProp, onOpenChange, collapse = {}, triggerClassName, disableSpanWrapper, selection, contentRender, size = DEFAULT_SIZE, marker = true, closeDroplistOnItemClick = false, className, listRef: listRefProp, untouchableScrollbars = false, virtualized = false, closeOnPopstate, header, headerDivider, footer, footerDivider, onItemsReorder, ...props }) {
|
|
19
19
|
const { hasSearch, openCollapseItems, toggleOpenCollapseItem, searchItem, flattenItems, focusFlattenItems, memorizedItems, ids, expandedIds, firstItemId, onDragEnd, sortableIds, } = useListItemsModel({
|
|
20
20
|
items: itemsProp,
|
|
21
21
|
pinTop: pinTopProp,
|
|
@@ -129,7 +129,7 @@ export function DesktopDroplist({ items: itemsProp, search, pinBottom: pinBottom
|
|
|
129
129
|
// Divider под topBar рисуется, если явно запрошен header'ом либо когда в topBar
|
|
130
130
|
// есть поиск: строка поиска визуально отделяется от тела списка (как в PinTopGroupItem
|
|
131
131
|
// у inline-List). @cloud-ru/ds-dropdown рисует один divider на весь topBar (headline + search).
|
|
132
|
-
headerDivider: headerDivider || hasSearch, search: searchNode, footer: footerNode, footerDivider: footerDivider, container: container, outsideClick: true, triggerClassName: triggerClassName, fallbackPlacements: DEFAULT_FALLBACK_PLACEMENTS, trigger: trigger, placement: placement, widthStrategy: effectiveWidthStrategy, triggerRef: !triggerElemRefProp ? triggerElemRef : (isValid && triggerElemRefProp) || undefined, open: open, onOpenChange: handleOpenChange, closeOnPopstate: closeOnPopstate,
|
|
132
|
+
headerDivider: headerDivider || hasSearch, search: searchNode, footer: footerNode, footerDivider: footerDivider, container: container, outsideClick: true, triggerClassName: triggerClassName, disableSpanWrapper: disableSpanWrapper, fallbackPlacements: DEFAULT_FALLBACK_PLACEMENTS, trigger: trigger, placement: placement, widthStrategy: effectiveWidthStrategy, triggerRef: !triggerElemRefProp ? triggerElemRef : (isValid && triggerElemRefProp) || undefined, open: open, onOpenChange: handleOpenChange, closeOnPopstate: closeOnPopstate,
|
|
133
133
|
// dnd-kit (`MouseSensor`/`TouchSensor`) слушает `mouseup`/`touchend` на document
|
|
134
134
|
// в bubble-фазе — гашение этих хендлеров на floating ломает завершение drag.
|
|
135
135
|
stopPropagation: onItemsReorder ? { onMouseUp: false, onTouchEnd: false } : undefined, children: triggerElem }) }) }) }) }) }));
|