@cloud-ru/ds-list 2.2.9 → 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 +1 -0
- 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 +5 -5
- 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>[]` | — | Список ссылок на кастомные элементы, помещенные в специальную секцию внизу списка |
|
|
@@ -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 }) }) }) }) }) }));
|