@snack-uikit/list 0.33.4 → 0.33.5-preview-620fd545.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.
@@ -31,7 +31,10 @@ function AccordionItem(_a) {
31
31
  const _ref2 = (0, contexts_1.useCollapseContext)(),
32
32
  _ref2$openCollapseIte = _ref2.openCollapseItems,
33
33
  openCollapseItems = _ref2$openCollapseIte === void 0 ? [] : _ref2$openCollapseIte,
34
- toggleOpenCollapseItem = _ref2.toggleOpenCollapseItem;
34
+ toggleOpenCollapseItem = _ref2.toggleOpenCollapseItem,
35
+ _ref2$toggleOn = _ref2.toggleOn,
36
+ toggleOn = _ref2$toggleOn === void 0 ? 'item' : _ref2$toggleOn;
37
+ const isIconTrigger = toggleOn === 'expandIcon';
35
38
  const _ref3 = (0, contexts_1.useSelectionContext)(),
36
39
  value = _ref3.value,
37
40
  isSelectionSingle = _ref3.isSelectionSingle,
@@ -53,7 +56,7 @@ function AccordionItem(_a) {
53
56
  const itemsJSX = (0, hooks_1.useRenderItems)(items);
54
57
  const handleItemClick = e => {
55
58
  var _a;
56
- toggleOpenCollapseItem === null || toggleOpenCollapseItem === void 0 ? void 0 : toggleOpenCollapseItem(id !== null && id !== void 0 ? id : '');
59
+ if (!isIconTrigger) toggleOpenCollapseItem === null || toggleOpenCollapseItem === void 0 ? void 0 : toggleOpenCollapseItem(id !== null && id !== void 0 ? id : '');
57
60
  (_a = option.onClick) === null || _a === void 0 ? void 0 : _a.call(option, e);
58
61
  };
59
62
  return (0, jsx_runtime_1.jsx)(helperComponents_1.CollapseBlockPrivate, {
@@ -61,6 +64,7 @@ function AccordionItem(_a) {
61
64
  id: id,
62
65
  disabled: disabled,
63
66
  expandIcon: isOpen ? (0, jsx_runtime_1.jsx)(icons_1.ChevronUpSVG, {}) : (0, jsx_runtime_1.jsx)(icons_1.ChevronDownSVG, {}),
67
+ onExpandIconClick: isIconTrigger ? () => toggleOpenCollapseItem === null || toggleOpenCollapseItem === void 0 ? void 0 : toggleOpenCollapseItem(id !== null && id !== void 0 ? id : '') : undefined,
64
68
  onClick: handleItemClick,
65
69
  isParentNode: true,
66
70
  onOpenNestedList: handleKeyDown,
@@ -1,4 +1,4 @@
1
- import { KeyboardEvent, ReactNode } from 'react';
1
+ import { KeyboardEvent, MouseEvent, ReactNode } from 'react';
2
2
  import { FlattenBaseItem } from '../types';
3
3
  type AllBaseItemProps = FlattenBaseItem & {
4
4
  expandIcon?: ReactNode;
@@ -7,6 +7,7 @@ type AllBaseItemProps = FlattenBaseItem & {
7
7
  onSelect?(): void;
8
8
  isParentNode?: boolean;
9
9
  onOpenNestedList?(e?: KeyboardEvent<HTMLElement>): void;
10
+ onExpandIconClick?(e: MouseEvent<HTMLElement>): void;
10
11
  };
11
- export declare function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, isParentNode, className, inactive, itemWrapRender, ...rest }: AllBaseItemProps): string | number | boolean | Iterable<ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
12
+ export declare function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, onExpandIconClick, isParentNode, className, inactive, itemWrapRender, ...rest }: AllBaseItemProps): string | number | boolean | Iterable<ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
12
13
  export {};
@@ -47,11 +47,12 @@ function BaseItem(_a) {
47
47
  checkedProp = _a.checked,
48
48
  onSelect = _a.onSelect,
49
49
  onOpenNestedList = _a.onOpenNestedList,
50
+ onExpandIconClick = _a.onExpandIconClick,
50
51
  isParentNode = _a.isParentNode,
51
52
  className = _a.className,
52
53
  inactive = _a.inactive,
53
54
  itemWrapRender = _a.itemWrapRender,
54
- rest = __rest(_a, ["beforeContent", "afterContent", "content", "onClick", "onMouseDown", "id", "expandIcon", "disabled", "open", "itemRef", "switch", "showSwitchIcon", "onKeyDown", "onFocus", "indeterminate", "checked", "onSelect", "onOpenNestedList", "isParentNode", "className", "inactive", "itemWrapRender"]);
55
+ rest = __rest(_a, ["beforeContent", "afterContent", "content", "onClick", "onMouseDown", "id", "expandIcon", "disabled", "open", "itemRef", "switch", "showSwitchIcon", "onKeyDown", "onFocus", "indeterminate", "checked", "onSelect", "onOpenNestedList", "onExpandIconClick", "isParentNode", "className", "inactive", "itemWrapRender"]);
55
56
  const interactive = !inactive;
56
57
  const _ref = (0, contexts_1.useNewListContext)(),
57
58
  _ref$size = _ref.size,
@@ -188,8 +189,16 @@ function BaseItem(_a) {
188
189
  checked: isChecked,
189
190
  "data-test-id": 'list__base-item-switch',
190
191
  showIcon: showSwitchIcon
191
- }), !switchProp && expandIcon && (0, jsx_runtime_1.jsx)("span", {
192
+ }), !switchProp && expandIcon &&
193
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions
194
+ (0, jsx_runtime_1.jsx)("span", {
192
195
  className: styles_module_scss_2.default.expandableIcon,
196
+ "data-test-id": 'list__base-item-expand-icon',
197
+ onClick: onExpandIconClick && (e => {
198
+ e.preventDefault();
199
+ e.stopPropagation();
200
+ onExpandIconClick(e);
201
+ }),
193
202
  children: expandIcon
194
203
  })]
195
204
  })
@@ -222,7 +222,8 @@ function Droplist(_a) {
222
222
  children: (0, jsx_runtime_1.jsx)(contexts_1.CollapseContext.Provider, {
223
223
  value: {
224
224
  openCollapseItems,
225
- toggleOpenCollapseItem
225
+ toggleOpenCollapseItem,
226
+ toggleOn: collapse.toggleOn
226
227
  },
227
228
  children: (0, jsx_runtime_1.jsx)(contexts_1.FocusListContext.Provider, {
228
229
  value: {
@@ -176,7 +176,8 @@ exports.List = (0, react_1.forwardRef)((_a, ref) => {
176
176
  children: (0, jsx_runtime_1.jsx)(contexts_1.CollapseContext.Provider, {
177
177
  value: {
178
178
  openCollapseItems,
179
- toggleOpenCollapseItem
179
+ toggleOpenCollapseItem,
180
+ toggleOn: collapse.toggleOn
180
181
  },
181
182
  children: (0, jsx_runtime_1.jsx)(contexts_1.FocusListContext.Provider, {
182
183
  value: {
@@ -7,6 +7,7 @@ export declare const useCollapseLevelContext: () => CollapseLevelContextType;
7
7
  export type CollapseContextType = {
8
8
  openCollapseItems?: ItemId[];
9
9
  toggleOpenCollapseItem?(id: ItemId): void;
10
+ toggleOn?: 'item' | 'expandIcon';
10
11
  };
11
12
  export declare const CollapseContext: import("react").Context<CollapseContextType>;
12
13
  export declare const useCollapseContext: () => CollapseContextType;
@@ -14,4 +15,10 @@ export type CollapseState = {
14
15
  value?: ItemId[];
15
16
  onChange?(value?: ItemId[]): void;
16
17
  defaultValue?: ItemId[];
18
+ /**
19
+ * Что переключает раскрытие вложенного списка:
20
+ * * `item` - клик по всей строке (по умолчанию),
21
+ * * `expandIcon` - только клик по шеврону.
22
+ */
23
+ toggleOn?: 'item' | 'expandIcon';
17
24
  };
@@ -19,7 +19,8 @@ import { useGroupItemSelection, useRenderItems } from '../hooks';
19
19
  export function AccordionItem(_a) {
20
20
  var { id, disabled, allChildIds, items } = _a, option = __rest(_a, ["id", "disabled", "allChildIds", "items"]);
21
21
  const { level = 0 } = useCollapseLevelContext();
22
- const { openCollapseItems = [], toggleOpenCollapseItem } = useCollapseContext();
22
+ const { openCollapseItems = [], toggleOpenCollapseItem, toggleOn = 'item' } = useCollapseContext();
23
+ const isIconTrigger = toggleOn === 'expandIcon';
23
24
  const { value, isSelectionSingle, isSelectionMultiple } = useSelectionContext();
24
25
  const { indeterminate, handleOnSelect, checked: checkedProp, } = useGroupItemSelection({
25
26
  items,
@@ -36,8 +37,9 @@ export function AccordionItem(_a) {
36
37
  const itemsJSX = useRenderItems(items);
37
38
  const handleItemClick = (e) => {
38
39
  var _a;
39
- toggleOpenCollapseItem === null || toggleOpenCollapseItem === void 0 ? void 0 : toggleOpenCollapseItem(id !== null && id !== void 0 ? id : '');
40
+ if (!isIconTrigger)
41
+ toggleOpenCollapseItem === null || toggleOpenCollapseItem === void 0 ? void 0 : toggleOpenCollapseItem(id !== null && id !== void 0 ? id : '');
40
42
  (_a = option.onClick) === null || _a === void 0 ? void 0 : _a.call(option, e);
41
43
  };
42
- return (_jsx(CollapseBlockPrivate, { header: _jsx(BaseItem, Object.assign({}, option, { id: id, disabled: disabled, expandIcon: isOpen ? _jsx(ChevronUpSVG, {}) : _jsx(ChevronDownSVG, {}), onClick: handleItemClick, isParentNode: true, onOpenNestedList: handleKeyDown, checked: checked, indeterminate: indeterminate, onSelect: !disabled ? handleOnSelect : undefined })), expanded: isOpen, "data-test-id": `list__accordion-item-${id}`, children: _jsx(CollapseLevelContext.Provider, { value: { level: level + 1 }, children: itemsJSX }) }));
44
+ return (_jsx(CollapseBlockPrivate, { header: _jsx(BaseItem, Object.assign({}, option, { id: id, disabled: disabled, expandIcon: isOpen ? _jsx(ChevronUpSVG, {}) : _jsx(ChevronDownSVG, {}), onExpandIconClick: isIconTrigger ? () => toggleOpenCollapseItem === null || toggleOpenCollapseItem === void 0 ? void 0 : toggleOpenCollapseItem(id !== null && id !== void 0 ? id : '') : undefined, onClick: handleItemClick, isParentNode: true, onOpenNestedList: handleKeyDown, checked: checked, indeterminate: indeterminate, onSelect: !disabled ? handleOnSelect : undefined })), expanded: isOpen, "data-test-id": `list__accordion-item-${id}`, children: _jsx(CollapseLevelContext.Provider, { value: { level: level + 1 }, children: itemsJSX }) }));
43
45
  }
@@ -1,4 +1,4 @@
1
- import { KeyboardEvent, ReactNode } from 'react';
1
+ import { KeyboardEvent, MouseEvent, ReactNode } from 'react';
2
2
  import { FlattenBaseItem } from '../types';
3
3
  type AllBaseItemProps = FlattenBaseItem & {
4
4
  expandIcon?: ReactNode;
@@ -7,6 +7,7 @@ type AllBaseItemProps = FlattenBaseItem & {
7
7
  onSelect?(): void;
8
8
  isParentNode?: boolean;
9
9
  onOpenNestedList?(e?: KeyboardEvent<HTMLElement>): void;
10
+ onExpandIconClick?(e: MouseEvent<HTMLElement>): void;
10
11
  };
11
- export declare function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, isParentNode, className, inactive, itemWrapRender, ...rest }: AllBaseItemProps): string | number | boolean | Iterable<ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
12
+ export declare function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, onExpandIconClick, isParentNode, className, inactive, itemWrapRender, ...rest }: AllBaseItemProps): string | number | boolean | Iterable<ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
12
13
  export {};
@@ -21,13 +21,13 @@ import { CHECKBOX_SIZE_MAP } from './constants';
21
21
  import styles from './styles.module.css';
22
22
  export function BaseItem(_a) {
23
23
  var _b;
24
- var { beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, isParentNode, className, inactive, itemWrapRender } = _a, rest = __rest(_a, ["beforeContent", "afterContent", "content", "onClick", "onMouseDown", "id", "expandIcon", "disabled", "open", "itemRef", "switch", "showSwitchIcon", "onKeyDown", "onFocus", "indeterminate", "checked", "onSelect", "onOpenNestedList", "isParentNode", "className", "inactive", "itemWrapRender"]);
24
+ var { beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, onExpandIconClick, isParentNode, className, inactive, itemWrapRender } = _a, rest = __rest(_a, ["beforeContent", "afterContent", "content", "onClick", "onMouseDown", "id", "expandIcon", "disabled", "open", "itemRef", "switch", "showSwitchIcon", "onKeyDown", "onFocus", "indeterminate", "checked", "onSelect", "onOpenNestedList", "onExpandIconClick", "isParentNode", "className", "inactive", "itemWrapRender"]);
25
25
  const interactive = !inactive;
26
26
  const { size = 's', marker, contentRender, firstItemId, focusFlattenItems } = useNewListContext();
27
27
  const { level = 0 } = useCollapseLevelContext();
28
28
  const { closeDroplist, closeDroplistOnItemClick } = useOpenListContext();
29
29
  const { value, onChange, mode, isSelectionSingle, isSelectionMultiple } = useSelectionContext();
30
- const isChecked = isSelectionSingle ? (checkedProp !== null && checkedProp !== void 0 ? checkedProp : value === id) : (checkedProp !== null && checkedProp !== void 0 ? checkedProp : value === null || value === void 0 ? void 0 : value.includes(id !== null && id !== void 0 ? id : ''));
30
+ const isChecked = isSelectionSingle ? checkedProp !== null && checkedProp !== void 0 ? checkedProp : value === id : checkedProp !== null && checkedProp !== void 0 ? checkedProp : value === null || value === void 0 ? void 0 : value.includes(id !== null && id !== void 0 ? id : '');
31
31
  const handleChange = () => {
32
32
  onChange === null || onChange === void 0 ? void 0 : onChange(id);
33
33
  };
@@ -86,7 +86,14 @@ export function BaseItem(_a) {
86
86
  }
87
87
  };
88
88
  const props = extractSupportProps(rest);
89
- const itemJSX = (_jsx("div", { className: cn(commonStyles.itemWrapper, styles.innerWrapper, className), "data-inactive": inactive || undefined, "data-disabled": disabled || undefined, "data-variant": mode || undefined, "data-checked": (isParentNode && isChecked) || (!isParentNode && isChecked && !switchProp) || undefined, children: _jsxs("li", { "data-type": 'outside', role: 'menuitem', "data-test-id": props['data-test-id'] || 'list__base-item_' + id, ref: itemRef, className: cn(commonStyles.listItem, styles.droplistItem), "data-size": size, onClick: handleItemClick, onMouseDown: handleItemMouseDown, tabIndex: firstItemId && id === focusFlattenItems[firstItemId].originalId ? 0 : -1, "data-non-pointer": inactive && !onClick, "data-variant": mode || undefined, "data-open": open || undefined, onKeyDown: handleItemKeyDown, onFocus: handleItemFocus, style: { '--level': level }, "data-level-one": level === 1 || undefined, "data-level-more-one": level > 1 || undefined, "data-checked": (isParentNode && (indeterminate || isChecked)) || (isChecked && !switchProp) || undefined, children: [!switchProp && isSelectionSingle && marker && !isParentNode && interactive && (_jsx("div", { className: styles.markerContainer, "data-test-id": 'list__base-item-marker' })), !switchProp && isSelectionMultiple && interactive && (_jsx("div", { className: styles.checkbox, children: _jsx(Checkbox, { size: CHECKBOX_SIZE_MAP[size !== null && size !== void 0 ? size : 's'], disabled: disabled, tabIndex: -1, onChange: isParentNode ? handleCheckboxChange : undefined, checked: isChecked, "data-test-id": 'list__base-item-checkbox', onClick: handleCheckboxClick, indeterminate: indeterminate }) })), beforeContent && _jsx("div", { className: styles.beforeContent, children: beforeContent }), content && isContentItem(content) ? (((_b = contentRender === null || contentRender === void 0 ? void 0 : contentRender({ id, content, disabled })) !== null && _b !== void 0 ? _b : _jsx(ItemContent, Object.assign({ disabled: disabled }, content)))) : (_jsxs("div", { className: styles.content, children: [" ", content, " "] })), afterContent, switchProp && interactive && (_jsx(Switch, { disabled: disabled, checked: isChecked, "data-test-id": 'list__base-item-switch', showIcon: showSwitchIcon })), !switchProp && expandIcon && _jsx("span", { className: styles.expandableIcon, children: expandIcon })] }) }));
89
+ const itemJSX = (_jsx("div", { className: cn(commonStyles.itemWrapper, styles.innerWrapper, className), "data-inactive": inactive || undefined, "data-disabled": disabled || undefined, "data-variant": mode || undefined, "data-checked": (isParentNode && isChecked) || (!isParentNode && isChecked && !switchProp) || undefined, children: _jsxs("li", { "data-type": 'outside', role: 'menuitem', "data-test-id": props['data-test-id'] || 'list__base-item_' + id, ref: itemRef, className: cn(commonStyles.listItem, styles.droplistItem), "data-size": size, onClick: handleItemClick, onMouseDown: handleItemMouseDown, tabIndex: firstItemId && id === focusFlattenItems[firstItemId].originalId ? 0 : -1, "data-non-pointer": inactive && !onClick, "data-variant": mode || undefined, "data-open": open || undefined, onKeyDown: handleItemKeyDown, onFocus: handleItemFocus, style: { '--level': level }, "data-level-one": level === 1 || undefined, "data-level-more-one": level > 1 || undefined, "data-checked": (isParentNode && (indeterminate || isChecked)) || (isChecked && !switchProp) || undefined, children: [!switchProp && isSelectionSingle && marker && !isParentNode && interactive && (_jsx("div", { className: styles.markerContainer, "data-test-id": 'list__base-item-marker' })), !switchProp && isSelectionMultiple && interactive && (_jsx("div", { className: styles.checkbox, children: _jsx(Checkbox, { size: CHECKBOX_SIZE_MAP[size !== null && size !== void 0 ? size : 's'], disabled: disabled, tabIndex: -1, onChange: isParentNode ? handleCheckboxChange : undefined, checked: isChecked, "data-test-id": 'list__base-item-checkbox', onClick: handleCheckboxClick, indeterminate: indeterminate }) })), beforeContent && _jsx("div", { className: styles.beforeContent, children: beforeContent }), content && isContentItem(content) ? ((_b = contentRender === null || contentRender === void 0 ? void 0 : contentRender({ id, content, disabled })) !== null && _b !== void 0 ? _b : _jsx(ItemContent, Object.assign({ disabled: disabled }, content))) : (_jsxs("div", { className: styles.content, children: [" ", content, " "] })), afterContent, switchProp && interactive && (_jsx(Switch, { disabled: disabled, checked: isChecked, "data-test-id": 'list__base-item-switch', showIcon: showSwitchIcon })), !switchProp && expandIcon && (
90
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions
91
+ _jsx("span", { className: styles.expandableIcon, "data-test-id": 'list__base-item-expand-icon', onClick: onExpandIconClick &&
92
+ (e => {
93
+ e.preventDefault();
94
+ e.stopPropagation();
95
+ onExpandIconClick(e);
96
+ }), children: expandIcon }))] }) }));
90
97
  if (!itemWrapRender) {
91
98
  return itemJSX;
92
99
  }
@@ -131,6 +131,7 @@ export function Droplist(_a) {
131
131
  return (_jsx(NewListContextProvider, { flattenItems: flattenItems, focusFlattenItems: focusFlattenItems, contentRender: contentRender, size: size, marker: marker, firstItemId: firstItemId, virtualized: virtualized, children: _jsx(SelectionProvider, Object.assign({}, selection, { children: _jsx(CollapseContext.Provider, { value: {
132
132
  openCollapseItems,
133
133
  toggleOpenCollapseItem,
134
+ toggleOn: collapse.toggleOn,
134
135
  }, children: _jsx(FocusListContext.Provider, { value: {
135
136
  activeItemId,
136
137
  handleListKeyDownFactory,
@@ -102,6 +102,7 @@ export const List = forwardRef((_a, ref) => {
102
102
  return (_jsx(NewListContextProvider, { flattenItems: flattenItems, focusFlattenItems: focusFlattenItems, contentRender: contentRender, size: size, marker: marker, firstItemId: firstItemId, virtualized: props.virtualized, children: _jsx(SelectionProvider, Object.assign({}, selection, { children: _jsx(CollapseContext.Provider, { value: {
103
103
  openCollapseItems,
104
104
  toggleOpenCollapseItem,
105
+ toggleOn: collapse.toggleOn,
105
106
  }, children: _jsx(FocusListContext.Provider, { value: {
106
107
  activeItemId,
107
108
  handleListKeyDownFactory,
@@ -7,6 +7,7 @@ export declare const useCollapseLevelContext: () => CollapseLevelContextType;
7
7
  export type CollapseContextType = {
8
8
  openCollapseItems?: ItemId[];
9
9
  toggleOpenCollapseItem?(id: ItemId): void;
10
+ toggleOn?: 'item' | 'expandIcon';
10
11
  };
11
12
  export declare const CollapseContext: import("react").Context<CollapseContextType>;
12
13
  export declare const useCollapseContext: () => CollapseContextType;
@@ -14,4 +15,10 @@ export type CollapseState = {
14
15
  value?: ItemId[];
15
16
  onChange?(value?: ItemId[]): void;
16
17
  defaultValue?: ItemId[];
18
+ /**
19
+ * Что переключает раскрытие вложенного списка:
20
+ * * `item` - клик по всей строке (по умолчанию),
21
+ * * `expandIcon` - только клик по шеврону.
22
+ */
23
+ toggleOn?: 'item' | 'expandIcon';
17
24
  };
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "title": "List",
7
- "version": "0.33.4",
7
+ "version": "0.33.5-preview-620fd545.0",
8
8
  "sideEffects": [
9
9
  "*.css",
10
10
  "*.woff",
@@ -54,5 +54,5 @@
54
54
  "peerDependencies": {
55
55
  "@snack-uikit/locale": "*"
56
56
  },
57
- "gitHead": "9e6abdd71a846caf1f1252b9504560a3b796942f"
57
+ "gitHead": "a0ea1647ffd8d5a1b3e980901ed6842844927ac1"
58
58
  }
@@ -17,7 +17,8 @@ type AccordionItemProps = Omit<FlattenAccordionItem, 'type>'> & CommonFlattenPro
17
17
 
18
18
  export function AccordionItem({ id, disabled, allChildIds, items, ...option }: AccordionItemProps) {
19
19
  const { level = 0 } = useCollapseLevelContext();
20
- const { openCollapseItems = [], toggleOpenCollapseItem } = useCollapseContext();
20
+ const { openCollapseItems = [], toggleOpenCollapseItem, toggleOn = 'item' } = useCollapseContext();
21
+ const isIconTrigger = toggleOn === 'expandIcon';
21
22
 
22
23
  const { value, isSelectionSingle, isSelectionMultiple } = useSelectionContext();
23
24
 
@@ -46,7 +47,7 @@ export function AccordionItem({ id, disabled, allChildIds, items, ...option }: A
46
47
  const itemsJSX = useRenderItems(items);
47
48
 
48
49
  const handleItemClick = (e: MouseEvent<HTMLElement>) => {
49
- toggleOpenCollapseItem?.(id ?? '');
50
+ if (!isIconTrigger) toggleOpenCollapseItem?.(id ?? '');
50
51
  option.onClick?.(e);
51
52
  };
52
53
 
@@ -58,6 +59,7 @@ export function AccordionItem({ id, disabled, allChildIds, items, ...option }: A
58
59
  id={id}
59
60
  disabled={disabled}
60
61
  expandIcon={isOpen ? <ChevronUpSVG /> : <ChevronDownSVG />}
62
+ onExpandIconClick={isIconTrigger ? () => toggleOpenCollapseItem?.(id ?? '') : undefined}
61
63
  onClick={handleItemClick}
62
64
  isParentNode
63
65
  onOpenNestedList={handleKeyDown}
@@ -24,6 +24,7 @@ type AllBaseItemProps = FlattenBaseItem & {
24
24
  onSelect?(): void;
25
25
  isParentNode?: boolean;
26
26
  onOpenNestedList?(e?: KeyboardEvent<HTMLElement>): void;
27
+ onExpandIconClick?(e: MouseEvent<HTMLElement>): void;
27
28
  };
28
29
 
29
30
  export function BaseItem({
@@ -45,6 +46,7 @@ export function BaseItem({
45
46
  checked: checkedProp,
46
47
  onSelect,
47
48
  onOpenNestedList,
49
+ onExpandIconClick,
48
50
  isParentNode,
49
51
  className,
50
52
  inactive,
@@ -58,7 +60,7 @@ export function BaseItem({
58
60
  const { closeDroplist, closeDroplistOnItemClick } = useOpenListContext();
59
61
  const { value, onChange, mode, isSelectionSingle, isSelectionMultiple } = useSelectionContext();
60
62
 
61
- const isChecked = isSelectionSingle ? (checkedProp ?? value === id) : (checkedProp ?? value?.includes(id ?? ''));
63
+ const isChecked = isSelectionSingle ? checkedProp ?? value === id : checkedProp ?? value?.includes(id ?? '');
62
64
 
63
65
  const handleChange = () => {
64
66
  onChange?.(id);
@@ -182,7 +184,7 @@ export function BaseItem({
182
184
 
183
185
  {beforeContent && <div className={styles.beforeContent}>{beforeContent}</div>}
184
186
  {content && isContentItem(content) ? (
185
- (contentRender?.({ id, content, disabled }) ?? <ItemContent disabled={disabled} {...content} />)
187
+ contentRender?.({ id, content, disabled }) ?? <ItemContent disabled={disabled} {...content} />
186
188
  ) : (
187
189
  <div className={styles.content}> {content} </div>
188
190
  )}
@@ -197,7 +199,23 @@ export function BaseItem({
197
199
  />
198
200
  )}
199
201
 
200
- {!switchProp && expandIcon && <span className={styles.expandableIcon}>{expandIcon}</span>}
202
+ {!switchProp && expandIcon && (
203
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions
204
+ <span
205
+ className={styles.expandableIcon}
206
+ data-test-id='list__base-item-expand-icon'
207
+ onClick={
208
+ onExpandIconClick &&
209
+ (e => {
210
+ e.preventDefault();
211
+ e.stopPropagation();
212
+ onExpandIconClick(e);
213
+ })
214
+ }
215
+ >
216
+ {expandIcon}
217
+ </span>
218
+ )}
201
219
  </li>
202
220
  </div>
203
221
  );
@@ -216,6 +216,7 @@ export function Droplist({
216
216
  value={{
217
217
  openCollapseItems,
218
218
  toggleOpenCollapseItem,
219
+ toggleOn: collapse.toggleOn,
219
220
  }}
220
221
  >
221
222
  <FocusListContext.Provider
@@ -160,6 +160,7 @@ export const List = forwardRef(
160
160
  value={{
161
161
  openCollapseItems,
162
162
  toggleOpenCollapseItem,
163
+ toggleOn: collapse.toggleOn,
163
164
  }}
164
165
  >
165
166
  <FocusListContext.Provider
@@ -11,6 +11,7 @@ export const useCollapseLevelContext = () => useContext(CollapseLevelContext);
11
11
  export type CollapseContextType = {
12
12
  openCollapseItems?: ItemId[];
13
13
  toggleOpenCollapseItem?(id: ItemId): void;
14
+ toggleOn?: 'item' | 'expandIcon';
14
15
  };
15
16
  export const CollapseContext = createContext<CollapseContextType>({});
16
17
  export const useCollapseContext = () => useContext(CollapseContext);
@@ -19,4 +20,10 @@ export type CollapseState = {
19
20
  value?: ItemId[];
20
21
  onChange?(value?: ItemId[]): void;
21
22
  defaultValue?: ItemId[];
23
+ /**
24
+ * Что переключает раскрытие вложенного списка:
25
+ * * `item` - клик по всей строке (по умолчанию),
26
+ * * `expandIcon` - только клик по шеврону.
27
+ */
28
+ toggleOn?: 'item' | 'expandIcon';
22
29
  };