@cloud-ru/ds-list 2.2.10-preview-5c9b8135.0 → 2.3.1

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 CHANGED
@@ -3,6 +3,18 @@
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.1 (2026-10-05)
7
+
8
+ ### Bug Fixes
9
+
10
+ - **FF-9172:** gen-props resolves indexed access to the field type ([baf31c4](https://github.com/cloud-ru-tech/snack-v2/commit/baf31c4053e76c81d681c9c19a6622f009f40413))
11
+
12
+ # 2.3.0 (2026-10-05)
13
+
14
+ ### Features
15
+
16
+ - **FF-9204:** add disableSpanWrapper prop ([2f4bc67](https://github.com/cloud-ru-tech/snack-v2/commit/2f4bc675bb984f18c788913dd8f5136cd4be3ed9))
17
+
6
18
  ## 2.2.9 (2026-10-02)
7
19
 
8
20
  **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 }) }) }) }) }) }));