@cloud-ru/ds-list 1.1.3 → 1.1.4-preview-5ffe9ec9.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/dist/cjs/components/Items/AccordionItem/AccordionItem.js +3 -9
- package/dist/cjs/components/Items/BaseItem/BaseItem.d.ts +6 -6
- package/dist/cjs/components/Items/BaseItem/BaseItem.js +22 -21
- package/dist/cjs/components/Items/BaseItem/styles.module.css +4 -60
- package/dist/cjs/components/Items/NextListItem/NextListItem.js +1 -1
- package/dist/cjs/style.css +4 -60
- package/dist/esm/components/Items/AccordionItem/AccordionItem.js +3 -9
- package/dist/esm/components/Items/BaseItem/BaseItem.d.ts +6 -6
- package/dist/esm/components/Items/BaseItem/BaseItem.js +22 -21
- package/dist/esm/components/Items/BaseItem/styles.module.css +4 -60
- package/dist/esm/components/Items/NextListItem/NextListItem.js +1 -1
- package/dist/esm/style.css +4 -60
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +18 -18
- package/src/components/Items/AccordionItem/AccordionItem.tsx +4 -11
- package/src/components/Items/BaseItem/BaseItem.tsx +33 -45
- package/src/components/Items/BaseItem/styles.module.scss +11 -68
- package/src/components/Items/NextListItem/NextListItem.tsx +1 -1
|
@@ -22,16 +22,10 @@ function AccordionItem({ id, disabled, allChildIds, items, ...option }) {
|
|
|
22
22
|
const isOpen = Boolean(openCollapseItems.includes(id ?? ''));
|
|
23
23
|
const checked = Boolean((indeterminate && !isOpen && isSelectionSingle && value && allChildIds.includes(value)) ||
|
|
24
24
|
(isSelectionMultiple && checkedProp));
|
|
25
|
-
|
|
25
|
+
// Раскрытие переключает вся строка целиком: клик/Enter по телу и ArrowRight с клавиатуры.
|
|
26
|
+
const handleToggle = (0, react_1.useCallback)(() => {
|
|
26
27
|
toggleOpenCollapseItem?.(id ?? '');
|
|
27
28
|
}, [id, toggleOpenCollapseItem]);
|
|
28
29
|
const itemsJSX = (0, hooks_1.useRenderItems)(items);
|
|
29
|
-
|
|
30
|
-
// ТОЛЬКО переключает collapse — `option.onClick` сюда не зовём, иначе у потребителя,
|
|
31
|
-
// который вешает на onClick собственный toggle, выходит двойное переключение.
|
|
32
|
-
// Клик по телу строки (выбор/навигация) идёт через `option.onClick` в BaseItem.
|
|
33
|
-
const handleExpandIconClick = () => {
|
|
34
|
-
toggleOpenCollapseItem?.(id ?? '');
|
|
35
|
-
};
|
|
36
|
-
return ((0, jsx_runtime_1.jsx)(helperComponents_1.CollapseBlockPrivate, { header: (0, jsx_runtime_1.jsx)(BaseItem_1.BaseItem, { ...option, id: id, disabled: disabled, open: isOpen, expandIcon: isOpen ? (0, jsx_runtime_1.jsx)(system_1.ChevronUpSVG, {}) : (0, jsx_runtime_1.jsx)(system_1.ChevronDownSVG, {}), onExpandIconClick: handleExpandIconClick, isParentNode: true, onOpenNestedList: handleKeyDown, checked: checked, indeterminate: indeterminate, onSelect: !disabled ? handleOnSelect : undefined }), expanded: isOpen, "data-test-id": `${constants_1.TEST_IDS.accordionItem}-${id}`, children: (0, jsx_runtime_1.jsx)(contexts_1.CollapseLevelContext.Provider, { value: { level: level + 1 }, children: itemsJSX }) }));
|
|
30
|
+
return ((0, jsx_runtime_1.jsx)(helperComponents_1.CollapseBlockPrivate, { header: (0, jsx_runtime_1.jsx)(BaseItem_1.BaseItem, { ...option, id: id, disabled: disabled, open: isOpen, expandIcon: isOpen ? (0, jsx_runtime_1.jsx)(system_1.ChevronUpSVG, {}) : (0, jsx_runtime_1.jsx)(system_1.ChevronDownSVG, {}), onToggleExpand: handleToggle, isParentNode: true, onOpenNestedList: handleToggle, checked: checked, indeterminate: indeterminate, onSelect: !disabled ? handleOnSelect : undefined }), expanded: isOpen, "data-test-id": `${constants_1.TEST_IDS.accordionItem}-${id}`, children: (0, jsx_runtime_1.jsx)(contexts_1.CollapseLevelContext.Provider, { value: { level: level + 1 }, children: itemsJSX }) }));
|
|
37
31
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { KeyboardEvent,
|
|
1
|
+
import { KeyboardEvent, ReactNode } from 'react';
|
|
2
2
|
import { FlattenBaseItem } from '../types';
|
|
3
3
|
type AllBaseItemProps = FlattenBaseItem & {
|
|
4
4
|
expandIcon?: ReactNode;
|
|
@@ -8,11 +8,11 @@ type AllBaseItemProps = FlattenBaseItem & {
|
|
|
8
8
|
isParentNode?: boolean;
|
|
9
9
|
onOpenNestedList?(e?: KeyboardEvent<HTMLElement>): void;
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Переключение раскрытия вложенного списка. Триггер — вся строка целиком (клик или
|
|
12
|
+
* Enter/Space), шеврон `groupIndicator` при этом остаётся неинтерактивным индикатором
|
|
13
|
+
* состояния.
|
|
14
14
|
*/
|
|
15
|
-
|
|
15
|
+
onToggleExpand?(): void;
|
|
16
16
|
/**
|
|
17
17
|
* Слот ручки drag&drop (Figma `centeredWrapper`) — рендерится первым в строке, перед
|
|
18
18
|
* маркером/чекбоксом. Интерактивность (обработчики `@dnd-kit`) и содержимое (иконка)
|
|
@@ -20,5 +20,5 @@ type AllBaseItemProps = FlattenBaseItem & {
|
|
|
20
20
|
*/
|
|
21
21
|
dragHandle?: ReactNode;
|
|
22
22
|
};
|
|
23
|
-
export declare function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList,
|
|
23
|
+
export declare function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, onToggleExpand, isParentNode, className, inactive, itemWrapRender, dragHandle, ...rest }: AllBaseItemProps): string | number | boolean | Iterable<ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
|
|
24
24
|
export {};
|
|
@@ -15,7 +15,7 @@ const styles_module_scss_1 = __importDefault(require('../styles.module.css'));
|
|
|
15
15
|
const utils_2 = require("../utils");
|
|
16
16
|
const constants_2 = require("./constants");
|
|
17
17
|
const styles_module_scss_2 = __importDefault(require('./styles.module.css'));
|
|
18
|
-
function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList,
|
|
18
|
+
function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, onToggleExpand, isParentNode, className, inactive, itemWrapRender, dragHandle, ...rest }) {
|
|
19
19
|
const interactive = !inactive;
|
|
20
20
|
const { size = constants_1.DEFAULT_SIZE, marker, contentRender, firstItemId, focusFlattenItems } = (0, contexts_1.useNewListContext)();
|
|
21
21
|
const { level = 0 } = (0, contexts_1.useCollapseLevelContext)();
|
|
@@ -50,7 +50,12 @@ function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown,
|
|
|
50
50
|
// `onClick` в публичном API типизирован под `MouseEvent` (это семантически клик по
|
|
51
51
|
// пункту меню), поэтому keyboard-событие пробрасывается под тем же типом.
|
|
52
52
|
onClick?.(e);
|
|
53
|
-
if (
|
|
53
|
+
if (isParentNode) {
|
|
54
|
+
// Раскрытие вложенного списка триггерит вся строка целиком: шеврон `groupIndicator` —
|
|
55
|
+
// только индикатор состояния, собственной интерактивности у него нет.
|
|
56
|
+
onToggleExpand?.();
|
|
57
|
+
}
|
|
58
|
+
else if (interactive) {
|
|
54
59
|
handleChange();
|
|
55
60
|
}
|
|
56
61
|
if (!isSelectionMultiple && closeDroplistOnItemClick) {
|
|
@@ -66,13 +71,21 @@ function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown,
|
|
|
66
71
|
return;
|
|
67
72
|
}
|
|
68
73
|
if (e.key === 'Enter' || e.key === ' ') {
|
|
69
|
-
if (
|
|
70
|
-
|
|
74
|
+
if (isParentNode) {
|
|
75
|
+
// В multiple-режиме Enter/Space на группе выбирает всю ветку, иначе — раскрывает её.
|
|
76
|
+
if (isSelectionMultiple && onSelect) {
|
|
77
|
+
onSelect();
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
onToggleExpand?.();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Повторяем клик по элементу: `handleItemClick` сам вызывает `handleChange` /
|
|
85
|
+
// `closeDroplist`. Отдельный `handleChange` здесь не нужен — иначе в multiple-режиме
|
|
86
|
+
// выбор переключался бы дважды (toggle + откат) и Enter не менял бы состояние.
|
|
87
|
+
handleItemClick(e);
|
|
71
88
|
}
|
|
72
|
-
// Повторяем клик по элементу: `handleItemClick` сам вызывает `handleChange` /
|
|
73
|
-
// `closeDroplist`. Отдельный `handleChange` здесь не нужен — иначе в multiple-режиме
|
|
74
|
-
// выбор переключался бы дважды (toggle + откат) и Enter не менял бы состояние.
|
|
75
|
-
!isParentNode && handleItemClick(e);
|
|
76
89
|
e.stopPropagation();
|
|
77
90
|
e.preventDefault();
|
|
78
91
|
}
|
|
@@ -82,16 +95,6 @@ function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown,
|
|
|
82
95
|
e.stopPropagation();
|
|
83
96
|
}
|
|
84
97
|
};
|
|
85
|
-
const handleExpandIconClick = (e) => {
|
|
86
|
-
if (disabled) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
// Триггер раскрытия изолирован от клика по строке: всплытие останавливаем,
|
|
90
|
-
// чтобы клик по шеврону не активировал выбор/навигацию пункта.
|
|
91
|
-
e.stopPropagation();
|
|
92
|
-
e.preventDefault();
|
|
93
|
-
onExpandIconClick?.(e);
|
|
94
|
-
};
|
|
95
98
|
const props = (0, utils_1.extractSupportProps)(rest);
|
|
96
99
|
let contentNode;
|
|
97
100
|
if (content && (0, utils_2.isContentItem)(content)) {
|
|
@@ -108,9 +111,7 @@ function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown,
|
|
|
108
111
|
const stateLayerState = isSelectionSingle && isChecked && !switchProp && !isParentNode
|
|
109
112
|
? 'activatedOnBackground'
|
|
110
113
|
: 'emptyNeutralOnBackground';
|
|
111
|
-
const itemJSX = ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.itemWrapper, styles_module_scss_2.default.innerWrapper, className), "data-inactive": inactive || undefined, "data-disabled": disabled || undefined, "data-variant": mode || undefined, "data-checked": (isParentNode && isChecked) || (!isParentNode && isChecked && !switchProp) || undefined, children: [(0, jsx_runtime_1.jsx)("span", { className: styles_module_scss_1.default.stateLayer, "aria-hidden": true, "data-state": stateLayerState }), (0, jsx_runtime_1.jsxs)("li", { "data-type": 'outside', role: 'menuitem', "data-test-id": props['data-test-id'] || `${constants_1.TEST_IDS.baseItem}_${id}`, ref: itemRef, className: (0, classnames_1.default)(styles_module_scss_1.default.listItem, styles_module_scss_2.default.droplistItem), "data-size": size, onClick: handleItemClick, onMouseDown: handleItemMouseDown, tabIndex: firstItemId && id === focusFlattenItems[firstItemId]?.originalId ? 0 : -1, "data-non-pointer": (inactive && !onClick) || undefined, "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: [dragHandle && (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_2.default.dragHandle, children: dragHandle }), !switchProp && isSelectionSingle && marker && !isParentNode && interactive && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_2.default.markerContainer, "data-test-id": constants_1.TEST_IDS.baseItemMarker })), !switchProp && isSelectionMultiple && interactive && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_2.default.checkbox, children: (0, jsx_runtime_1.jsx)(toggles_1.Checkbox, { size: constants_2.TOGGLE_SIZE_MAP[size], disabled: disabled, tabIndex: -1, onChange: isParentNode ? handleCheckboxChange : undefined, checked: isChecked, "data-test-id": constants_1.TEST_IDS.baseItemCheckbox, onClick: handleCheckboxClick, indeterminate: indeterminate }) })), beforeContent && (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_2.default.beforeContent, children: beforeContent }), contentNode, afterContent && (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_2.default.afterContent, children: afterContent }), switchProp && interactive && ((0, jsx_runtime_1.jsx)(toggles_1.Switch, { size: constants_2.TOGGLE_SIZE_MAP[size], disabled: disabled, checked: isChecked, "data-test-id": constants_1.TEST_IDS.baseItemSwitch, showIcon: showSwitchIcon })), !switchProp &&
|
|
112
|
-
expandIcon &&
|
|
113
|
-
(onExpandIconClick ? ((0, jsx_runtime_1.jsxs)("button", { type: 'button', className: styles_module_scss_2.default.groupIndicator, "data-size": size, "data-open": open || undefined, "data-test-id": constants_1.TEST_IDS.groupIndicator, tabIndex: -1, disabled: disabled, onClick: handleExpandIconClick, onMouseDown: e => e.stopPropagation(), children: [(0, jsx_runtime_1.jsx)("span", { className: styles_module_scss_2.default.groupIndicatorState, "aria-hidden": true }), expandIcon] })) : ((0, jsx_runtime_1.jsx)("span", { className: styles_module_scss_2.default.expandableIcon, children: expandIcon })))] })] }));
|
|
114
|
+
const itemJSX = ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.itemWrapper, styles_module_scss_2.default.innerWrapper, className), "data-inactive": inactive || undefined, "data-disabled": disabled || undefined, "data-variant": mode || undefined, "data-checked": (isParentNode && isChecked) || (!isParentNode && isChecked && !switchProp) || undefined, children: [(0, jsx_runtime_1.jsx)("span", { className: styles_module_scss_1.default.stateLayer, "aria-hidden": true, "data-state": stateLayerState }), (0, jsx_runtime_1.jsxs)("li", { "data-type": 'outside', role: 'menuitem', "data-test-id": props['data-test-id'] || `${constants_1.TEST_IDS.baseItem}_${id}`, ref: itemRef, className: (0, classnames_1.default)(styles_module_scss_1.default.listItem, styles_module_scss_2.default.droplistItem), "data-size": size, onClick: handleItemClick, onMouseDown: handleItemMouseDown, tabIndex: firstItemId && id === focusFlattenItems[firstItemId]?.originalId ? 0 : -1, "data-non-pointer": (inactive && !onClick) || undefined, "data-variant": mode || undefined, "data-open": open || undefined, "aria-expanded": isParentNode ? Boolean(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: [dragHandle && (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_2.default.dragHandle, children: dragHandle }), !switchProp && isSelectionSingle && marker && !isParentNode && interactive && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_2.default.markerContainer, "data-test-id": constants_1.TEST_IDS.baseItemMarker })), !switchProp && isSelectionMultiple && interactive && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_2.default.checkbox, children: (0, jsx_runtime_1.jsx)(toggles_1.Checkbox, { size: constants_2.TOGGLE_SIZE_MAP[size], disabled: disabled, tabIndex: -1, onChange: isParentNode ? handleCheckboxChange : undefined, checked: isChecked, "data-test-id": constants_1.TEST_IDS.baseItemCheckbox, onClick: handleCheckboxClick, indeterminate: indeterminate }) })), beforeContent && (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_2.default.beforeContent, children: beforeContent }), contentNode, afterContent && (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_2.default.afterContent, children: afterContent }), switchProp && interactive && ((0, jsx_runtime_1.jsx)(toggles_1.Switch, { size: constants_2.TOGGLE_SIZE_MAP[size], disabled: disabled, checked: isChecked, "data-test-id": constants_1.TEST_IDS.baseItemSwitch, showIcon: showSwitchIcon })), !switchProp && expandIcon && ((0, jsx_runtime_1.jsx)("span", { className: styles_module_scss_2.default.groupIndicator, "data-open": open || undefined, "data-test-id": constants_1.TEST_IDS.groupIndicator, "aria-hidden": true, children: expandIcon }))] })] }));
|
|
114
115
|
if (!itemWrapRender) {
|
|
115
116
|
return itemJSX;
|
|
116
117
|
}
|
|
@@ -56,62 +56,22 @@
|
|
|
56
56
|
color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
.expandableIcon{
|
|
60
|
-
display:flex;
|
|
61
|
-
align-items:center;
|
|
62
|
-
color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
|
|
63
|
-
fill:currentcolor;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
59
|
.groupIndicator{
|
|
67
|
-
|
|
68
|
-
position:relative;
|
|
60
|
+
pointer-events:none;
|
|
69
61
|
display:flex;
|
|
70
62
|
flex-shrink:0;
|
|
71
63
|
align-items:center;
|
|
72
64
|
justify-content:center;
|
|
73
|
-
padding:0;
|
|
74
|
-
border:none;
|
|
75
|
-
border-radius:var(--sn-primitive-dimension-8, 8px);
|
|
76
65
|
color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
|
|
77
|
-
|
|
78
|
-
-moz-appearance:none;
|
|
79
|
-
appearance:none;
|
|
80
|
-
background:transparent;
|
|
81
|
-
outline:none;
|
|
66
|
+
fill:currentcolor;
|
|
82
67
|
}
|
|
83
68
|
.groupIndicator svg{
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
width:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
87
|
-
height:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
88
|
-
}
|
|
89
|
-
.groupIndicator:focus-visible{
|
|
90
|
-
outline:var(--sn-theme-color-available-complementary, #000000) solid var(--sn-primitive-strokeWeight-strokeSemiBold, 2px);
|
|
91
|
-
outline-offset:calc(0px - var(--sn-primitive-strokeWeight-strokeSemiBold, 2px));
|
|
69
|
+
width:100%;
|
|
70
|
+
height:100%;
|
|
92
71
|
}
|
|
93
72
|
.groupIndicator[data-open]{
|
|
94
73
|
border-radius:var(--sn-primitive-dimension-2, 2px);
|
|
95
74
|
color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
.groupIndicatorState{
|
|
99
|
-
pointer-events:none;
|
|
100
|
-
position:absolute;
|
|
101
|
-
inset:0;
|
|
102
|
-
border-radius:inherit;
|
|
103
|
-
background:transparent;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
.groupIndicator:hover > .groupIndicatorState{
|
|
107
|
-
background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-hovered-filled, var(--sn-brand-color-state-neutral-forLightMode-hovered-background, rgba(188, 195, 220, 0.1490196078)));
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
.groupIndicator:active > .groupIndicatorState{
|
|
111
|
-
background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-pressed-filled, var(--sn-brand-color-state-neutral-forLightMode-pressed-background, rgba(188, 195, 220, 0.3019607843)));
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
.groupIndicator[data-open] > .groupIndicatorState{
|
|
115
75
|
background:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
|
|
116
76
|
}
|
|
117
77
|
|
|
@@ -157,10 +117,6 @@
|
|
|
157
117
|
padding-top:var(--sn-list-anatomy-size-s-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-s, var(--sn-primitive-dimension-6, 6px)));
|
|
158
118
|
padding-bottom:var(--sn-list-anatomy-size-s-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-s, var(--sn-primitive-dimension-6, 6px)));
|
|
159
119
|
}
|
|
160
|
-
.droplistItem[data-size=s] .expandableIcon{
|
|
161
|
-
width:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
162
|
-
height:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
163
|
-
}
|
|
164
120
|
.droplistItem[data-size=s] .groupIndicator{
|
|
165
121
|
width:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
166
122
|
height:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
@@ -204,10 +160,6 @@
|
|
|
204
160
|
padding-top:var(--sn-list-anatomy-size-m-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-m, var(--sn-primitive-dimension-8, 8px)));
|
|
205
161
|
padding-bottom:var(--sn-list-anatomy-size-m-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-m, var(--sn-primitive-dimension-8, 8px)));
|
|
206
162
|
}
|
|
207
|
-
.droplistItem[data-size=m] .expandableIcon{
|
|
208
|
-
width:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
209
|
-
height:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
210
|
-
}
|
|
211
163
|
.droplistItem[data-size=m] .groupIndicator{
|
|
212
164
|
width:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
213
165
|
height:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
@@ -251,10 +203,6 @@
|
|
|
251
203
|
padding-top:var(--sn-list-anatomy-size-l-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-l, var(--sn-primitive-dimension-10, 10px)));
|
|
252
204
|
padding-bottom:var(--sn-list-anatomy-size-l-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-l, var(--sn-primitive-dimension-10, 10px)));
|
|
253
205
|
}
|
|
254
|
-
.droplistItem[data-size=l] .expandableIcon{
|
|
255
|
-
width:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
256
|
-
height:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
257
|
-
}
|
|
258
206
|
.droplistItem[data-size=l] .groupIndicator{
|
|
259
207
|
width:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
260
208
|
height:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
@@ -280,11 +228,7 @@
|
|
|
280
228
|
cursor:inherit;
|
|
281
229
|
}
|
|
282
230
|
|
|
283
|
-
.innerWrapper[data-disabled] .expandableIcon{
|
|
284
|
-
color:var(--sn-theme-color-available-version-textDisabled, var(--sn-brand-color-text-version-disabled, rgba(65, 66, 78, 0.3490196078)));
|
|
285
|
-
}
|
|
286
231
|
.innerWrapper[data-disabled] .groupIndicator{
|
|
287
|
-
cursor:not-allowed;
|
|
288
232
|
color:var(--sn-theme-color-available-version-textDisabled, var(--sn-brand-color-text-version-disabled, rgba(65, 66, 78, 0.3490196078)));
|
|
289
233
|
}
|
|
290
234
|
.innerWrapper[data-disabled] .beforeContent,
|
|
@@ -67,5 +67,5 @@ function NextListItem({ items, placement = 'right-start', id, scroll, scrollRef,
|
|
|
67
67
|
}, scrollRef: scrollRef, limitedScrollHeight: true, untouchableScrollbars: untouchableScrollbars, loading: loading, dataError: dataError, dataFiltered: dataFiltered }), trigger: 'hover', open: isOpen || open, onOpenChange: value => {
|
|
68
68
|
setOpen(value);
|
|
69
69
|
onSublistOpenChanged?.(value, id);
|
|
70
|
-
}, placement: placement, widthStrategy: 'auto', children: (0, jsx_runtime_1.jsx)(BaseItem_1.BaseItem, { ...option, disabled: disabled, open: isOpen || open, expandIcon: (0, jsx_runtime_1.jsx)(system_1.ChevronRightSVG, {}), id: id, isParentNode: true, indeterminate: indeterminate, checked: checked, onOpenNestedList: openSublist,
|
|
70
|
+
}, placement: placement, widthStrategy: 'auto', children: (0, jsx_runtime_1.jsx)(BaseItem_1.BaseItem, { ...option, disabled: disabled, open: isOpen || open, expandIcon: (0, jsx_runtime_1.jsx)(system_1.ChevronRightSVG, {}), id: id, isParentNode: true, indeterminate: indeterminate, checked: checked, onOpenNestedList: openSublist, onToggleExpand: openSublist, onSelect: handleOnSelect }) }));
|
|
71
71
|
}
|
package/dist/cjs/style.css
CHANGED
|
@@ -56,62 +56,22 @@
|
|
|
56
56
|
color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
.expandableIcon{
|
|
60
|
-
display:flex;
|
|
61
|
-
align-items:center;
|
|
62
|
-
color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
|
|
63
|
-
fill:currentcolor;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
59
|
.groupIndicator{
|
|
67
|
-
|
|
68
|
-
position:relative;
|
|
60
|
+
pointer-events:none;
|
|
69
61
|
display:flex;
|
|
70
62
|
flex-shrink:0;
|
|
71
63
|
align-items:center;
|
|
72
64
|
justify-content:center;
|
|
73
|
-
padding:0;
|
|
74
|
-
border:none;
|
|
75
|
-
border-radius:var(--sn-primitive-dimension-8, 8px);
|
|
76
65
|
color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
|
|
77
|
-
|
|
78
|
-
-moz-appearance:none;
|
|
79
|
-
appearance:none;
|
|
80
|
-
background:transparent;
|
|
81
|
-
outline:none;
|
|
66
|
+
fill:currentcolor;
|
|
82
67
|
}
|
|
83
68
|
.groupIndicator svg{
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
width:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
87
|
-
height:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
88
|
-
}
|
|
89
|
-
.groupIndicator:focus-visible{
|
|
90
|
-
outline:var(--sn-theme-color-available-complementary, #000000) solid var(--sn-primitive-strokeWeight-strokeSemiBold, 2px);
|
|
91
|
-
outline-offset:calc(0px - var(--sn-primitive-strokeWeight-strokeSemiBold, 2px));
|
|
69
|
+
width:100%;
|
|
70
|
+
height:100%;
|
|
92
71
|
}
|
|
93
72
|
.groupIndicator[data-open]{
|
|
94
73
|
border-radius:var(--sn-primitive-dimension-2, 2px);
|
|
95
74
|
color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
.groupIndicatorState{
|
|
99
|
-
pointer-events:none;
|
|
100
|
-
position:absolute;
|
|
101
|
-
inset:0;
|
|
102
|
-
border-radius:inherit;
|
|
103
|
-
background:transparent;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
.groupIndicator:hover > .groupIndicatorState{
|
|
107
|
-
background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-hovered-filled, var(--sn-brand-color-state-neutral-forLightMode-hovered-background, rgba(188, 195, 220, 0.1490196078)));
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
.groupIndicator:active > .groupIndicatorState{
|
|
111
|
-
background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-pressed-filled, var(--sn-brand-color-state-neutral-forLightMode-pressed-background, rgba(188, 195, 220, 0.3019607843)));
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
.groupIndicator[data-open] > .groupIndicatorState{
|
|
115
75
|
background:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
|
|
116
76
|
}
|
|
117
77
|
|
|
@@ -157,10 +117,6 @@
|
|
|
157
117
|
padding-top:var(--sn-list-anatomy-size-s-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-s, var(--sn-primitive-dimension-6, 6px)));
|
|
158
118
|
padding-bottom:var(--sn-list-anatomy-size-s-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-s, var(--sn-primitive-dimension-6, 6px)));
|
|
159
119
|
}
|
|
160
|
-
.droplistItem[data-size=s] .expandableIcon{
|
|
161
|
-
width:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
162
|
-
height:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
163
|
-
}
|
|
164
120
|
.droplistItem[data-size=s] .groupIndicator{
|
|
165
121
|
width:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
166
122
|
height:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
@@ -204,10 +160,6 @@
|
|
|
204
160
|
padding-top:var(--sn-list-anatomy-size-m-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-m, var(--sn-primitive-dimension-8, 8px)));
|
|
205
161
|
padding-bottom:var(--sn-list-anatomy-size-m-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-m, var(--sn-primitive-dimension-8, 8px)));
|
|
206
162
|
}
|
|
207
|
-
.droplistItem[data-size=m] .expandableIcon{
|
|
208
|
-
width:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
209
|
-
height:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
210
|
-
}
|
|
211
163
|
.droplistItem[data-size=m] .groupIndicator{
|
|
212
164
|
width:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
213
165
|
height:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
@@ -251,10 +203,6 @@
|
|
|
251
203
|
padding-top:var(--sn-list-anatomy-size-l-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-l, var(--sn-primitive-dimension-10, 10px)));
|
|
252
204
|
padding-bottom:var(--sn-list-anatomy-size-l-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-l, var(--sn-primitive-dimension-10, 10px)));
|
|
253
205
|
}
|
|
254
|
-
.droplistItem[data-size=l] .expandableIcon{
|
|
255
|
-
width:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
256
|
-
height:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
257
|
-
}
|
|
258
206
|
.droplistItem[data-size=l] .groupIndicator{
|
|
259
207
|
width:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
260
208
|
height:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
@@ -280,11 +228,7 @@
|
|
|
280
228
|
cursor:inherit;
|
|
281
229
|
}
|
|
282
230
|
|
|
283
|
-
.innerWrapper[data-disabled] .expandableIcon{
|
|
284
|
-
color:var(--sn-theme-color-available-version-textDisabled, var(--sn-brand-color-text-version-disabled, rgba(65, 66, 78, 0.3490196078)));
|
|
285
|
-
}
|
|
286
231
|
.innerWrapper[data-disabled] .groupIndicator{
|
|
287
|
-
cursor:not-allowed;
|
|
288
232
|
color:var(--sn-theme-color-available-version-textDisabled, var(--sn-brand-color-text-version-disabled, rgba(65, 66, 78, 0.3490196078)));
|
|
289
233
|
}
|
|
290
234
|
.innerWrapper[data-disabled] .beforeContent,
|
|
@@ -19,16 +19,10 @@ export function AccordionItem({ id, disabled, allChildIds, items, ...option }) {
|
|
|
19
19
|
const isOpen = Boolean(openCollapseItems.includes(id ?? ''));
|
|
20
20
|
const checked = Boolean((indeterminate && !isOpen && isSelectionSingle && value && allChildIds.includes(value)) ||
|
|
21
21
|
(isSelectionMultiple && checkedProp));
|
|
22
|
-
|
|
22
|
+
// Раскрытие переключает вся строка целиком: клик/Enter по телу и ArrowRight с клавиатуры.
|
|
23
|
+
const handleToggle = useCallback(() => {
|
|
23
24
|
toggleOpenCollapseItem?.(id ?? '');
|
|
24
25
|
}, [id, toggleOpenCollapseItem]);
|
|
25
26
|
const itemsJSX = useRenderItems(items);
|
|
26
|
-
|
|
27
|
-
// ТОЛЬКО переключает collapse — `option.onClick` сюда не зовём, иначе у потребителя,
|
|
28
|
-
// который вешает на onClick собственный toggle, выходит двойное переключение.
|
|
29
|
-
// Клик по телу строки (выбор/навигация) идёт через `option.onClick` в BaseItem.
|
|
30
|
-
const handleExpandIconClick = () => {
|
|
31
|
-
toggleOpenCollapseItem?.(id ?? '');
|
|
32
|
-
};
|
|
33
|
-
return (_jsx(CollapseBlockPrivate, { header: _jsx(BaseItem, { ...option, id: id, disabled: disabled, open: isOpen, expandIcon: isOpen ? _jsx(ChevronUpSVG, {}) : _jsx(ChevronDownSVG, {}), onExpandIconClick: handleExpandIconClick, isParentNode: true, onOpenNestedList: handleKeyDown, checked: checked, indeterminate: indeterminate, onSelect: !disabled ? handleOnSelect : undefined }), expanded: isOpen, "data-test-id": `${TEST_IDS.accordionItem}-${id}`, children: _jsx(CollapseLevelContext.Provider, { value: { level: level + 1 }, children: itemsJSX }) }));
|
|
27
|
+
return (_jsx(CollapseBlockPrivate, { header: _jsx(BaseItem, { ...option, id: id, disabled: disabled, open: isOpen, expandIcon: isOpen ? _jsx(ChevronUpSVG, {}) : _jsx(ChevronDownSVG, {}), onToggleExpand: handleToggle, isParentNode: true, onOpenNestedList: handleToggle, checked: checked, indeterminate: indeterminate, onSelect: !disabled ? handleOnSelect : undefined }), expanded: isOpen, "data-test-id": `${TEST_IDS.accordionItem}-${id}`, children: _jsx(CollapseLevelContext.Provider, { value: { level: level + 1 }, children: itemsJSX }) }));
|
|
34
28
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { KeyboardEvent,
|
|
1
|
+
import { KeyboardEvent, ReactNode } from 'react';
|
|
2
2
|
import { FlattenBaseItem } from '../types.js';
|
|
3
3
|
type AllBaseItemProps = FlattenBaseItem & {
|
|
4
4
|
expandIcon?: ReactNode;
|
|
@@ -8,11 +8,11 @@ type AllBaseItemProps = FlattenBaseItem & {
|
|
|
8
8
|
isParentNode?: boolean;
|
|
9
9
|
onOpenNestedList?(e?: KeyboardEvent<HTMLElement>): void;
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Переключение раскрытия вложенного списка. Триггер — вся строка целиком (клик или
|
|
12
|
+
* Enter/Space), шеврон `groupIndicator` при этом остаётся неинтерактивным индикатором
|
|
13
|
+
* состояния.
|
|
14
14
|
*/
|
|
15
|
-
|
|
15
|
+
onToggleExpand?(): void;
|
|
16
16
|
/**
|
|
17
17
|
* Слот ручки drag&drop (Figma `centeredWrapper`) — рендерится первым в строке, перед
|
|
18
18
|
* маркером/чекбоксом. Интерактивность (обработчики `@dnd-kit`) и содержимое (иконка)
|
|
@@ -20,5 +20,5 @@ type AllBaseItemProps = FlattenBaseItem & {
|
|
|
20
20
|
*/
|
|
21
21
|
dragHandle?: ReactNode;
|
|
22
22
|
};
|
|
23
|
-
export declare function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList,
|
|
23
|
+
export declare function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, onToggleExpand, isParentNode, className, inactive, itemWrapRender, dragHandle, ...rest }: AllBaseItemProps): string | number | boolean | Iterable<ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
|
|
24
24
|
export {};
|
|
@@ -9,7 +9,7 @@ import commonStyles from '../styles.module.css';
|
|
|
9
9
|
import { isContentItem, isPrimitiveContent } from '../utils.js';
|
|
10
10
|
import { TOGGLE_SIZE_MAP } from './constants.js';
|
|
11
11
|
import styles from './styles.module.css';
|
|
12
|
-
export function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList,
|
|
12
|
+
export function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, onToggleExpand, isParentNode, className, inactive, itemWrapRender, dragHandle, ...rest }) {
|
|
13
13
|
const interactive = !inactive;
|
|
14
14
|
const { size = DEFAULT_SIZE, marker, contentRender, firstItemId, focusFlattenItems } = useNewListContext();
|
|
15
15
|
const { level = 0 } = useCollapseLevelContext();
|
|
@@ -44,7 +44,12 @@ export function BaseItem({ beforeContent, afterContent, content, onClick, onMous
|
|
|
44
44
|
// `onClick` в публичном API типизирован под `MouseEvent` (это семантически клик по
|
|
45
45
|
// пункту меню), поэтому keyboard-событие пробрасывается под тем же типом.
|
|
46
46
|
onClick?.(e);
|
|
47
|
-
if (
|
|
47
|
+
if (isParentNode) {
|
|
48
|
+
// Раскрытие вложенного списка триггерит вся строка целиком: шеврон `groupIndicator` —
|
|
49
|
+
// только индикатор состояния, собственной интерактивности у него нет.
|
|
50
|
+
onToggleExpand?.();
|
|
51
|
+
}
|
|
52
|
+
else if (interactive) {
|
|
48
53
|
handleChange();
|
|
49
54
|
}
|
|
50
55
|
if (!isSelectionMultiple && closeDroplistOnItemClick) {
|
|
@@ -60,13 +65,21 @@ export function BaseItem({ beforeContent, afterContent, content, onClick, onMous
|
|
|
60
65
|
return;
|
|
61
66
|
}
|
|
62
67
|
if (e.key === 'Enter' || e.key === ' ') {
|
|
63
|
-
if (
|
|
64
|
-
|
|
68
|
+
if (isParentNode) {
|
|
69
|
+
// В multiple-режиме Enter/Space на группе выбирает всю ветку, иначе — раскрывает её.
|
|
70
|
+
if (isSelectionMultiple && onSelect) {
|
|
71
|
+
onSelect();
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
onToggleExpand?.();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// Повторяем клик по элементу: `handleItemClick` сам вызывает `handleChange` /
|
|
79
|
+
// `closeDroplist`. Отдельный `handleChange` здесь не нужен — иначе в multiple-режиме
|
|
80
|
+
// выбор переключался бы дважды (toggle + откат) и Enter не менял бы состояние.
|
|
81
|
+
handleItemClick(e);
|
|
65
82
|
}
|
|
66
|
-
// Повторяем клик по элементу: `handleItemClick` сам вызывает `handleChange` /
|
|
67
|
-
// `closeDroplist`. Отдельный `handleChange` здесь не нужен — иначе в multiple-режиме
|
|
68
|
-
// выбор переключался бы дважды (toggle + откат) и Enter не менял бы состояние.
|
|
69
|
-
!isParentNode && handleItemClick(e);
|
|
70
83
|
e.stopPropagation();
|
|
71
84
|
e.preventDefault();
|
|
72
85
|
}
|
|
@@ -76,16 +89,6 @@ export function BaseItem({ beforeContent, afterContent, content, onClick, onMous
|
|
|
76
89
|
e.stopPropagation();
|
|
77
90
|
}
|
|
78
91
|
};
|
|
79
|
-
const handleExpandIconClick = (e) => {
|
|
80
|
-
if (disabled) {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
// Триггер раскрытия изолирован от клика по строке: всплытие останавливаем,
|
|
84
|
-
// чтобы клик по шеврону не активировал выбор/навигацию пункта.
|
|
85
|
-
e.stopPropagation();
|
|
86
|
-
e.preventDefault();
|
|
87
|
-
onExpandIconClick?.(e);
|
|
88
|
-
};
|
|
89
92
|
const props = extractSupportProps(rest);
|
|
90
93
|
let contentNode;
|
|
91
94
|
if (content && isContentItem(content)) {
|
|
@@ -102,9 +105,7 @@ export function BaseItem({ beforeContent, afterContent, content, onClick, onMous
|
|
|
102
105
|
const stateLayerState = isSelectionSingle && isChecked && !switchProp && !isParentNode
|
|
103
106
|
? 'activatedOnBackground'
|
|
104
107
|
: 'emptyNeutralOnBackground';
|
|
105
|
-
const itemJSX = (_jsxs("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: [_jsx("span", { className: commonStyles.stateLayer, "aria-hidden": true, "data-state": stateLayerState }), _jsxs("li", { "data-type": 'outside', role: 'menuitem', "data-test-id": props['data-test-id'] || `${TEST_IDS.baseItem}_${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) || undefined, "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: [dragHandle && _jsx("div", { className: styles.dragHandle, children: dragHandle }), !switchProp && isSelectionSingle && marker && !isParentNode && interactive && (_jsx("div", { className: styles.markerContainer, "data-test-id": TEST_IDS.baseItemMarker })), !switchProp && isSelectionMultiple && interactive && (_jsx("div", { className: styles.checkbox, children: _jsx(Checkbox, { size: TOGGLE_SIZE_MAP[size], disabled: disabled, tabIndex: -1, onChange: isParentNode ? handleCheckboxChange : undefined, checked: isChecked, "data-test-id": TEST_IDS.baseItemCheckbox, onClick: handleCheckboxClick, indeterminate: indeterminate }) })), beforeContent && _jsx("div", { className: styles.beforeContent, children: beforeContent }), contentNode, afterContent && _jsx("div", { className: styles.afterContent, children: afterContent }), switchProp && interactive && (_jsx(Switch, { size: TOGGLE_SIZE_MAP[size], disabled: disabled, checked: isChecked, "data-test-id": TEST_IDS.baseItemSwitch, showIcon: showSwitchIcon })), !switchProp &&
|
|
106
|
-
expandIcon &&
|
|
107
|
-
(onExpandIconClick ? (_jsxs("button", { type: 'button', className: styles.groupIndicator, "data-size": size, "data-open": open || undefined, "data-test-id": TEST_IDS.groupIndicator, tabIndex: -1, disabled: disabled, onClick: handleExpandIconClick, onMouseDown: e => e.stopPropagation(), children: [_jsx("span", { className: styles.groupIndicatorState, "aria-hidden": true }), expandIcon] })) : (_jsx("span", { className: styles.expandableIcon, children: expandIcon })))] })] }));
|
|
108
|
+
const itemJSX = (_jsxs("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: [_jsx("span", { className: commonStyles.stateLayer, "aria-hidden": true, "data-state": stateLayerState }), _jsxs("li", { "data-type": 'outside', role: 'menuitem', "data-test-id": props['data-test-id'] || `${TEST_IDS.baseItem}_${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) || undefined, "data-variant": mode || undefined, "data-open": open || undefined, "aria-expanded": isParentNode ? Boolean(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: [dragHandle && _jsx("div", { className: styles.dragHandle, children: dragHandle }), !switchProp && isSelectionSingle && marker && !isParentNode && interactive && (_jsx("div", { className: styles.markerContainer, "data-test-id": TEST_IDS.baseItemMarker })), !switchProp && isSelectionMultiple && interactive && (_jsx("div", { className: styles.checkbox, children: _jsx(Checkbox, { size: TOGGLE_SIZE_MAP[size], disabled: disabled, tabIndex: -1, onChange: isParentNode ? handleCheckboxChange : undefined, checked: isChecked, "data-test-id": TEST_IDS.baseItemCheckbox, onClick: handleCheckboxClick, indeterminate: indeterminate }) })), beforeContent && _jsx("div", { className: styles.beforeContent, children: beforeContent }), contentNode, afterContent && _jsx("div", { className: styles.afterContent, children: afterContent }), switchProp && interactive && (_jsx(Switch, { size: TOGGLE_SIZE_MAP[size], disabled: disabled, checked: isChecked, "data-test-id": TEST_IDS.baseItemSwitch, showIcon: showSwitchIcon })), !switchProp && expandIcon && (_jsx("span", { className: styles.groupIndicator, "data-open": open || undefined, "data-test-id": TEST_IDS.groupIndicator, "aria-hidden": true, children: expandIcon }))] })] }));
|
|
108
109
|
if (!itemWrapRender) {
|
|
109
110
|
return itemJSX;
|
|
110
111
|
}
|
|
@@ -56,62 +56,22 @@
|
|
|
56
56
|
color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
.expandableIcon{
|
|
60
|
-
display:flex;
|
|
61
|
-
align-items:center;
|
|
62
|
-
color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
|
|
63
|
-
fill:currentcolor;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
59
|
.groupIndicator{
|
|
67
|
-
|
|
68
|
-
position:relative;
|
|
60
|
+
pointer-events:none;
|
|
69
61
|
display:flex;
|
|
70
62
|
flex-shrink:0;
|
|
71
63
|
align-items:center;
|
|
72
64
|
justify-content:center;
|
|
73
|
-
padding:0;
|
|
74
|
-
border:none;
|
|
75
|
-
border-radius:var(--sn-primitive-dimension-8, 8px);
|
|
76
65
|
color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
|
|
77
|
-
|
|
78
|
-
-moz-appearance:none;
|
|
79
|
-
appearance:none;
|
|
80
|
-
background:transparent;
|
|
81
|
-
outline:none;
|
|
66
|
+
fill:currentcolor;
|
|
82
67
|
}
|
|
83
68
|
.groupIndicator svg{
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
width:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
87
|
-
height:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
88
|
-
}
|
|
89
|
-
.groupIndicator:focus-visible{
|
|
90
|
-
outline:var(--sn-theme-color-available-complementary, #000000) solid var(--sn-primitive-strokeWeight-strokeSemiBold, 2px);
|
|
91
|
-
outline-offset:calc(0px - var(--sn-primitive-strokeWeight-strokeSemiBold, 2px));
|
|
69
|
+
width:100%;
|
|
70
|
+
height:100%;
|
|
92
71
|
}
|
|
93
72
|
.groupIndicator[data-open]{
|
|
94
73
|
border-radius:var(--sn-primitive-dimension-2, 2px);
|
|
95
74
|
color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
.groupIndicatorState{
|
|
99
|
-
pointer-events:none;
|
|
100
|
-
position:absolute;
|
|
101
|
-
inset:0;
|
|
102
|
-
border-radius:inherit;
|
|
103
|
-
background:transparent;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
.groupIndicator:hover > .groupIndicatorState{
|
|
107
|
-
background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-hovered-filled, var(--sn-brand-color-state-neutral-forLightMode-hovered-background, rgba(188, 195, 220, 0.1490196078)));
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
.groupIndicator:active > .groupIndicatorState{
|
|
111
|
-
background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-pressed-filled, var(--sn-brand-color-state-neutral-forLightMode-pressed-background, rgba(188, 195, 220, 0.3019607843)));
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
.groupIndicator[data-open] > .groupIndicatorState{
|
|
115
75
|
background:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
|
|
116
76
|
}
|
|
117
77
|
|
|
@@ -157,10 +117,6 @@
|
|
|
157
117
|
padding-top:var(--sn-list-anatomy-size-s-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-s, var(--sn-primitive-dimension-6, 6px)));
|
|
158
118
|
padding-bottom:var(--sn-list-anatomy-size-s-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-s, var(--sn-primitive-dimension-6, 6px)));
|
|
159
119
|
}
|
|
160
|
-
.droplistItem[data-size=s] .expandableIcon{
|
|
161
|
-
width:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
162
|
-
height:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
163
|
-
}
|
|
164
120
|
.droplistItem[data-size=s] .groupIndicator{
|
|
165
121
|
width:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
166
122
|
height:var(--sn-density-size-icon-xs, var(--sn-primitive-dimension-24, 24px));
|
|
@@ -204,10 +160,6 @@
|
|
|
204
160
|
padding-top:var(--sn-list-anatomy-size-m-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-m, var(--sn-primitive-dimension-8, 8px)));
|
|
205
161
|
padding-bottom:var(--sn-list-anatomy-size-m-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-m, var(--sn-primitive-dimension-8, 8px)));
|
|
206
162
|
}
|
|
207
|
-
.droplistItem[data-size=m] .expandableIcon{
|
|
208
|
-
width:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
209
|
-
height:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
210
|
-
}
|
|
211
163
|
.droplistItem[data-size=m] .groupIndicator{
|
|
212
164
|
width:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
213
165
|
height:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
@@ -251,10 +203,6 @@
|
|
|
251
203
|
padding-top:var(--sn-list-anatomy-size-l-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-l, var(--sn-primitive-dimension-10, 10px)));
|
|
252
204
|
padding-bottom:var(--sn-list-anatomy-size-l-listItem-centeredWrapper-paddingVertical, var(--sn-density-spacing-control-container-vertical-l, var(--sn-primitive-dimension-10, 10px)));
|
|
253
205
|
}
|
|
254
|
-
.droplistItem[data-size=l] .expandableIcon{
|
|
255
|
-
width:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
256
|
-
height:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
257
|
-
}
|
|
258
206
|
.droplistItem[data-size=l] .groupIndicator{
|
|
259
207
|
width:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
260
208
|
height:var(--sn-density-size-icon-s, var(--sn-primitive-dimension-24, 24px));
|
|
@@ -280,11 +228,7 @@
|
|
|
280
228
|
cursor:inherit;
|
|
281
229
|
}
|
|
282
230
|
|
|
283
|
-
.innerWrapper[data-disabled] .expandableIcon{
|
|
284
|
-
color:var(--sn-theme-color-available-version-textDisabled, var(--sn-brand-color-text-version-disabled, rgba(65, 66, 78, 0.3490196078)));
|
|
285
|
-
}
|
|
286
231
|
.innerWrapper[data-disabled] .groupIndicator{
|
|
287
|
-
cursor:not-allowed;
|
|
288
232
|
color:var(--sn-theme-color-available-version-textDisabled, var(--sn-brand-color-text-version-disabled, rgba(65, 66, 78, 0.3490196078)));
|
|
289
233
|
}
|
|
290
234
|
.innerWrapper[data-disabled] .beforeContent,
|