@cloud-ru/ds-uikit-product-header 2.1.3 → 2.1.4-preview-22cd4af5.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/MainMenu/helperComponents/Content/Content.js +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.d.ts +1 -8
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.js +2 -2
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +6 -2
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +13 -10
- package/dist/cjs/components/MainMenu/helperComponents/Content/styles.module.css +15 -0
- package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +3 -3
- package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/constants.d.ts +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/constants.js +3 -3
- package/dist/cjs/components/MainMenu/hooks/useMainMenuDnd.js +12 -0
- package/dist/cjs/components/MainMenu/styles.module.css +8 -0
- package/dist/cjs/style.css +36 -10
- package/dist/esm/components/MainMenu/helperComponents/Content/Content.js +1 -1
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.d.ts +1 -8
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.js +2 -2
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +6 -2
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +1 -1
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +13 -10
- package/dist/esm/components/MainMenu/helperComponents/Content/styles.module.css +15 -0
- package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +4 -4
- package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/constants.d.ts +1 -1
- package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/constants.js +2 -2
- package/dist/esm/components/MainMenu/hooks/useMainMenuDnd.js +10 -1
- package/dist/esm/components/MainMenu/styles.module.css +8 -0
- package/dist/esm/style.css +36 -10
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +28 -28
- package/src/components/MainMenu/helperComponents/Content/Content.tsx +3 -1
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.tsx +1 -11
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.tsx +9 -4
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.scss +27 -19
- package/src/components/MainMenu/helperComponents/Content/styles.module.scss +22 -0
- package/src/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.tsx +4 -4
- package/src/components/MainMenu/helperComponents/MenuDesktop/constants.ts +2 -2
- package/src/components/MainMenu/helperComponents/MenuDesktop/styles.module.scss +6 -2
- package/src/components/MainMenu/hooks/useMainMenuDnd.tsx +12 -1
- package/src/components/MainMenu/styles.module.scss +10 -0
|
@@ -116,5 +116,5 @@ function Content({ searchValue, search, rightTop, segments, searchGroups = empty
|
|
|
116
116
|
appearance: 'neutral',
|
|
117
117
|
}, content: isSearching ? t('noDataFound') : t('noData'), "data-test-id": isSearching ? constants_1.TEST_IDS.noDataFound : constants_1.TEST_IDS.noData, "data-mobile": isMobile || undefined, className: styles_module_scss_1.default.noData }));
|
|
118
118
|
})();
|
|
119
|
-
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [search, (0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.content, className), "data-mobile": isMobile || undefined, "data-empty": (!loading && !hasCards) || undefined, children: [!isSearching && ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsxs)(MountAnimation_1.MountAnimation, { type: mountAnimationType, className: styles_module_scss_1.default.top, children: [(0, jsx_runtime_1.jsx)(ContentToolbar_1.ContentToolbar, { segment: segmentId, onSegmentChange: setSegmentId, segmentItems: segmentItems, allGroupsExpanded: allGroupsExpanded, onToggleAllGroupsExpanded: handleToggleAllGroupsExpanded, preferences: preferences, isMobile: isMobile, loading: loading }), rightTop] }) })), cards, footer] })] }));
|
|
119
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [search, (0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.content, className), "data-mobile": isMobile || undefined, "data-empty": (!loading && !hasCards) || undefined, children: [!isSearching && ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsxs)(MountAnimation_1.MountAnimation, { type: mountAnimationType, className: styles_module_scss_1.default.top, children: [(0, jsx_runtime_1.jsx)(ContentToolbar_1.ContentToolbar, { segment: segmentId, onSegmentChange: setSegmentId, segmentItems: segmentItems, allGroupsExpanded: allGroupsExpanded, onToggleAllGroupsExpanded: handleToggleAllGroupsExpanded, preferences: preferences, isMobile: isMobile, loading: loading }), (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.rightTop, "data-mobile": isMobile || undefined, children: rightTop })] }) })), cards, footer] })] }));
|
|
120
120
|
}
|
|
@@ -1,8 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export type SortableGroupDragHandleProps = {
|
|
3
|
-
/** ARIA-атрибуты `dnd-kit` draggable-элемента. */
|
|
4
|
-
attributes?: DraggableAttributes;
|
|
5
|
-
/** Обработчики событий `dnd-kit` для инициации перетаскивания. */
|
|
6
|
-
listeners?: DraggableSyntheticListeners;
|
|
7
|
-
};
|
|
8
|
-
export declare function SortableGroupDragHandle({ attributes, listeners }: SortableGroupDragHandleProps): import("react/jsx-runtime").JSX.Element;
|
|
1
|
+
export declare function SortableGroupDragHandle(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -9,7 +9,7 @@ const system_1 = require("@cloud-ru/ds-icons/interface/system");
|
|
|
9
9
|
const utils_1 = require("@cloud-ru/ds-utils");
|
|
10
10
|
const locale_1 = require("../../../../../../../locale");
|
|
11
11
|
const styles_module_scss_1 = __importDefault(require('../styles.module.css'));
|
|
12
|
-
function SortableGroupDragHandle(
|
|
12
|
+
function SortableGroupDragHandle() {
|
|
13
13
|
const { t } = locale_1.headerLocale.useTranslations();
|
|
14
|
-
return ((0, jsx_runtime_1.jsx)("button", {
|
|
14
|
+
return ((0, jsx_runtime_1.jsx)("button", { type: 'button', className: styles_module_scss_1.default.dragHandle, "aria-label": t('dragGroup'), "data-test-id": 'header__drawer-menu__group-card-drag-handle', onClick: utils_1.stopEventPropagation, children: (0, jsx_runtime_1.jsx)(system_1.DragDropSVG, { size: 24 }) }));
|
|
15
15
|
}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
import { DraggableAttributes, DraggableSyntheticListeners } from '@dnd-kit/core';
|
|
1
2
|
import { LinksGroup, LinksGroupTitle } from '../../../../../types';
|
|
2
|
-
import { SortableGroupDragHandleProps } from './SortableGroupDragHandle';
|
|
3
3
|
export type SortableGroupHeaderProps = Pick<LinksGroup, 'icon'> & {
|
|
4
4
|
label: LinksGroupTitle;
|
|
5
5
|
isExpanded?: boolean;
|
|
6
6
|
enableServiceDrag?: boolean;
|
|
7
7
|
isMobile?: boolean;
|
|
8
|
-
|
|
8
|
+
/** ARIA-атрибуты `dnd-kit` draggable-элемента. */
|
|
9
|
+
attributes?: DraggableAttributes;
|
|
10
|
+
/** Обработчики событий `dnd-kit` для инициации перетаскивания. */
|
|
11
|
+
listeners?: DraggableSyntheticListeners;
|
|
12
|
+
};
|
|
9
13
|
declare function SortableGroupHeaderBase({ label, icon, isExpanded, enableServiceDrag, attributes, listeners, isMobile, }: SortableGroupHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
10
14
|
export declare const SortableGroupHeader: import("react").MemoExoticComponent<typeof SortableGroupHeaderBase>;
|
|
11
15
|
export {};
|
|
@@ -18,6 +18,6 @@ function SortableGroupHeaderBase({ label, icon, isExpanded, enableServiceDrag, a
|
|
|
18
18
|
e.stopPropagation();
|
|
19
19
|
label?.onClick?.(e);
|
|
20
20
|
}, [label]);
|
|
21
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.header, "data-expanded": isExpanded || undefined, children: [(0, jsx_runtime_1.jsx)(typography_1.Typography, { variant: 'title', size: 'm', className: styles_module_scss_1.default.headerTitle, "data-test-id": 'header__drawer-menu__group-card-title', children: label.onClick || label.href ? ((0, jsx_runtime_1.jsx)(uikit_product_title_clickable_1.TitleClickable, { ...(label.href ? { as: 'a', href: label.href } : { as: 'div' }), onClick: handleLabelClick, title: label.text, icon: (0, utils_1.getLinkEmblem)({ icon }) })) : (label.text) }), (enableServiceDrag || !isMobile) && ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.headerActions, "data-always-visible": isMobile || undefined, children: [enableServiceDrag && (0, jsx_runtime_1.jsx)(SortableGroupDragHandle_1.SortableGroupDragHandle, {
|
|
21
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.header, "data-expanded": isExpanded || undefined, ...attributes, ...listeners, tabIndex: -1, children: [(0, jsx_runtime_1.jsx)(typography_1.Typography, { variant: 'title', size: 'm', className: styles_module_scss_1.default.headerTitle, "data-test-id": 'header__drawer-menu__group-card-title', children: label.onClick || label.href ? ((0, jsx_runtime_1.jsx)(uikit_product_title_clickable_1.TitleClickable, { ...(label.href ? { as: 'a', href: label.href } : { as: 'div' }), onClick: handleLabelClick, title: label.text, icon: (0, utils_1.getLinkEmblem)({ icon }) })) : (label.text) }), (enableServiceDrag || !isMobile) && ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.headerActions, "data-always-visible": isMobile || undefined, children: [enableServiceDrag && (0, jsx_runtime_1.jsx)(SortableGroupDragHandle_1.SortableGroupDragHandle, {}), !isMobile && ((0, jsx_runtime_1.jsx)(button_1.Button, { view: 'elevated', appearance: 'neutral', size: 's', icon: isExpanded ? (0, jsx_runtime_1.jsx)(system_1.ChevronUpSVG, {}) : (0, jsx_runtime_1.jsx)(system_1.ChevronDownSVG, {}), "data-test-id": 'header__drawer-menu__group-card-collapse' }))] }))] }));
|
|
22
22
|
}
|
|
23
23
|
exports.SortableGroupHeader = (0, react_1.memo)(SortableGroupHeaderBase);
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
outline:none;
|
|
9
9
|
}
|
|
10
10
|
.headerActions[data-always-visible]{
|
|
11
|
+
pointer-events:auto;
|
|
11
12
|
opacity:1;
|
|
12
13
|
}
|
|
13
14
|
|
|
@@ -63,20 +64,25 @@
|
|
|
63
64
|
animation:none;
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
|
-
.group[data-drag-preview]{
|
|
67
|
-
cursor:grabbing;
|
|
68
|
-
}
|
|
69
67
|
.group[data-drag-preview] .header{
|
|
70
|
-
cursor:grabbing;
|
|
71
68
|
background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(136, 146, 170, 0.0784313725)));
|
|
72
69
|
}
|
|
73
70
|
.group[data-drag-preview] .header .headerActions{
|
|
74
71
|
pointer-events:auto;
|
|
75
72
|
opacity:1;
|
|
76
73
|
}
|
|
74
|
+
.group:has(:focus-visible) .headerActions{
|
|
75
|
+
pointer-events:auto;
|
|
76
|
+
opacity:1;
|
|
77
|
+
}
|
|
78
|
+
@media (hover: hover){
|
|
79
|
+
.group:hover .headerActions{
|
|
80
|
+
pointer-events:auto;
|
|
81
|
+
opacity:1;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
77
84
|
|
|
78
85
|
.groupDragPreview{
|
|
79
|
-
cursor:grabbing;
|
|
80
86
|
container-type:inline-size;
|
|
81
87
|
border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
|
|
82
88
|
}
|
|
@@ -119,7 +125,6 @@
|
|
|
119
125
|
|
|
120
126
|
.groupBody{
|
|
121
127
|
display:grid;
|
|
122
|
-
grid-template-columns:repeat(3, minmax(auto, 1fr));
|
|
123
128
|
gap:var(--sn-primitive-dimension-4, 4px);
|
|
124
129
|
}
|
|
125
130
|
.groupBody:not([data-subcategory-body]){
|
|
@@ -128,10 +133,8 @@
|
|
|
128
133
|
.groupBody:not([data-show-description]){
|
|
129
134
|
gap:0;
|
|
130
135
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
grid-template-columns:repeat(2, minmax(auto, 1fr));
|
|
134
|
-
}
|
|
136
|
+
.groupBody:not([data-mobile]){
|
|
137
|
+
grid-template-columns:repeat(auto-fill, minmax(240px, 1fr));
|
|
135
138
|
}
|
|
136
139
|
.groupBody[data-mobile]{
|
|
137
140
|
grid-template-columns:repeat(1, minmax(200px, 1fr));
|
|
@@ -21,6 +21,21 @@
|
|
|
21
21
|
gap:inherit;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
.rightTop{
|
|
25
|
+
width:100%;
|
|
26
|
+
min-width:0;
|
|
27
|
+
}
|
|
28
|
+
.rightTop:not([data-mobile]){
|
|
29
|
+
display:grid;
|
|
30
|
+
grid-template-columns:repeat(auto-fit, minmax(max(286px, (100% - var(--sn-primitive-dimension-4, 4px)) / 2), 1fr));
|
|
31
|
+
gap:var(--sn-primitive-dimension-4, 4px);
|
|
32
|
+
}
|
|
33
|
+
.rightTop[data-mobile]{
|
|
34
|
+
display:flex;
|
|
35
|
+
flex-direction:column;
|
|
36
|
+
gap:var(--sn-primitive-dimension-8, 8px);
|
|
37
|
+
}
|
|
38
|
+
|
|
24
39
|
.noData{
|
|
25
40
|
flex:1 1 auto;
|
|
26
41
|
place-self:center center;
|
|
@@ -21,7 +21,7 @@ const MountAnimation_1 = require("../MountAnimation");
|
|
|
21
21
|
const Search_1 = require("../Search");
|
|
22
22
|
const constants_2 = require("./constants");
|
|
23
23
|
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
24
|
-
function MenuDesktop({ open = false, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth = constants_2.
|
|
24
|
+
function MenuDesktop({ open = false, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth = constants_2.MENU_WIDTH_DEFAULT, onWidthChangeEnd, draggerTooltip, loading, }) {
|
|
25
25
|
const { scrollRef, searchRef, resultItems } = (0, useMenuItems_1.useMenuItems)({
|
|
26
26
|
segments,
|
|
27
27
|
search,
|
|
@@ -60,8 +60,8 @@ function MenuDesktop({ open = false, setOpen, settingItems, platformGroups, segm
|
|
|
60
60
|
return ((0, jsx_runtime_1.jsx)(drawer_1.DrawerCustom, { open: open, onClose: handleCloseDrawer, width: isNeedRightBlock ? 'm' : 's', position: 'left', className: styles_module_scss_1.default.drawer, rootClassName: styles_module_scss_1.default.drawerRoot, "data-test-id": constants_1.TEST_IDS.mainMenu.drawer, "data-small": !isNeedRightBlock || undefined, disableMotions: true, showButtonClosed: false, resizable: isNeedRightBlock
|
|
61
61
|
? {
|
|
62
62
|
min: constants_2.MENU_WIDTH_MIN,
|
|
63
|
-
max:
|
|
64
|
-
default:
|
|
63
|
+
max: 'full',
|
|
64
|
+
default: defaultWidth,
|
|
65
65
|
onResizeEnd: onWidthChangeEnd,
|
|
66
66
|
draggerTooltip,
|
|
67
67
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.MENU_WIDTH_DEFAULT = exports.MENU_WIDTH_MIN = exports.MENU_WIDTH_STORAGE_KEY = void 0;
|
|
4
4
|
exports.MENU_WIDTH_STORAGE_KEY = 'cloud-ru-main-menu-user-width';
|
|
5
5
|
// паддинг справа 24px у дровера нужно компенсировать
|
|
6
|
-
exports.MENU_WIDTH_MIN =
|
|
7
|
-
exports.
|
|
6
|
+
exports.MENU_WIDTH_MIN = 630 + 24;
|
|
7
|
+
exports.MENU_WIDTH_DEFAULT = 1208 + 24;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.useMainMenuDndOverlay = useMainMenuDndOverlay;
|
|
4
7
|
exports.useMainMenuDnd = useMainMenuDnd;
|
|
@@ -11,6 +14,7 @@ const portal_context_1 = require("@cloud-ru/ds-portal-context");
|
|
|
11
14
|
const react_1 = require("react");
|
|
12
15
|
const react_dom_1 = require("react-dom");
|
|
13
16
|
const ServiceCard_1 = require("../helperComponents/ServiceCard");
|
|
17
|
+
const styles_module_scss_1 = __importDefault(require('../styles.module.css'));
|
|
14
18
|
const utils_1 = require("../utils");
|
|
15
19
|
const restrictGroupDragToVerticalAxis = args => {
|
|
16
20
|
if (args.active?.id != null && (0, utils_1.isServiceSourceDragId)(args.active.id)) {
|
|
@@ -87,6 +91,14 @@ function useMainMenuDnd({ favorite, servicesById, showDescription }) {
|
|
|
87
91
|
}
|
|
88
92
|
function MainMenuDndContext({ children, sensors, modifiers, collisionDetection, onDragStart, onDragEnd, onDragCancel, dragOverlay, overlayContextValue, }) {
|
|
89
93
|
const portalContextRef = (0, portal_context_1.usePortalContext)();
|
|
94
|
+
const isDragging = Boolean(dragOverlay);
|
|
95
|
+
(0, react_1.useEffect)(() => {
|
|
96
|
+
if (!isDragging)
|
|
97
|
+
return;
|
|
98
|
+
/* Для предотвращения случайных взаимодействий с любыми другими элементами при перетаскивании */
|
|
99
|
+
document.body.classList.add(styles_module_scss_1.default.dragging);
|
|
100
|
+
return () => document.body.classList.remove(styles_module_scss_1.default.dragging);
|
|
101
|
+
}, [isDragging]);
|
|
90
102
|
// `DragOverlay` рендерит `position: fixed` без собственного портала. Drawer-обёртка
|
|
91
103
|
// (`.snack-rc-drawer-content-wrapper`) держит `will-change: transform`, а это, как и
|
|
92
104
|
// настоящий transform, создаёт containing block для fixed-потомков — оверлей резолвится
|
package/dist/cjs/style.css
CHANGED
|
@@ -300,6 +300,7 @@
|
|
|
300
300
|
outline:none;
|
|
301
301
|
}
|
|
302
302
|
.headerActions[data-always-visible]{
|
|
303
|
+
pointer-events:auto;
|
|
303
304
|
opacity:1;
|
|
304
305
|
}
|
|
305
306
|
|
|
@@ -355,20 +356,25 @@
|
|
|
355
356
|
animation:none;
|
|
356
357
|
}
|
|
357
358
|
}
|
|
358
|
-
.group[data-drag-preview]{
|
|
359
|
-
cursor:grabbing;
|
|
360
|
-
}
|
|
361
359
|
.group[data-drag-preview] .header{
|
|
362
|
-
cursor:grabbing;
|
|
363
360
|
background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(136, 146, 170, 0.0784313725)));
|
|
364
361
|
}
|
|
365
362
|
.group[data-drag-preview] .header .headerActions{
|
|
366
363
|
pointer-events:auto;
|
|
367
364
|
opacity:1;
|
|
368
365
|
}
|
|
366
|
+
.group:has(:focus-visible) .headerActions{
|
|
367
|
+
pointer-events:auto;
|
|
368
|
+
opacity:1;
|
|
369
|
+
}
|
|
370
|
+
@media (hover: hover){
|
|
371
|
+
.group:hover .headerActions{
|
|
372
|
+
pointer-events:auto;
|
|
373
|
+
opacity:1;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
369
376
|
|
|
370
377
|
.groupDragPreview{
|
|
371
|
-
cursor:grabbing;
|
|
372
378
|
container-type:inline-size;
|
|
373
379
|
border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
|
|
374
380
|
}
|
|
@@ -411,7 +417,6 @@
|
|
|
411
417
|
|
|
412
418
|
.groupBody{
|
|
413
419
|
display:grid;
|
|
414
|
-
grid-template-columns:repeat(3, minmax(auto, 1fr));
|
|
415
420
|
gap:var(--sn-primitive-dimension-4, 4px);
|
|
416
421
|
}
|
|
417
422
|
.groupBody:not([data-subcategory-body]){
|
|
@@ -420,10 +425,8 @@
|
|
|
420
425
|
.groupBody:not([data-show-description]){
|
|
421
426
|
gap:0;
|
|
422
427
|
}
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
grid-template-columns:repeat(2, minmax(auto, 1fr));
|
|
426
|
-
}
|
|
428
|
+
.groupBody:not([data-mobile]){
|
|
429
|
+
grid-template-columns:repeat(auto-fill, minmax(240px, 1fr));
|
|
427
430
|
}
|
|
428
431
|
.groupBody[data-mobile]{
|
|
429
432
|
grid-template-columns:repeat(1, minmax(200px, 1fr));
|
|
@@ -575,6 +578,21 @@
|
|
|
575
578
|
gap:inherit;
|
|
576
579
|
}
|
|
577
580
|
|
|
581
|
+
.rightTop{
|
|
582
|
+
width:100%;
|
|
583
|
+
min-width:0;
|
|
584
|
+
}
|
|
585
|
+
.rightTop:not([data-mobile]){
|
|
586
|
+
display:grid;
|
|
587
|
+
grid-template-columns:repeat(auto-fit, minmax(max(286px, (100% - var(--sn-primitive-dimension-4, 4px)) / 2), 1fr));
|
|
588
|
+
gap:var(--sn-primitive-dimension-4, 4px);
|
|
589
|
+
}
|
|
590
|
+
.rightTop[data-mobile]{
|
|
591
|
+
display:flex;
|
|
592
|
+
flex-direction:column;
|
|
593
|
+
gap:var(--sn-primitive-dimension-8, 8px);
|
|
594
|
+
}
|
|
595
|
+
|
|
578
596
|
.noData{
|
|
579
597
|
flex:1 1 auto;
|
|
580
598
|
place-self:center center;
|
|
@@ -939,6 +957,14 @@
|
|
|
939
957
|
.staticCard{
|
|
940
958
|
position:relative;
|
|
941
959
|
}
|
|
960
|
+
.dragging,
|
|
961
|
+
.dragging *{
|
|
962
|
+
cursor:grabbing !important;
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
.dragging *{
|
|
966
|
+
pointer-events:none !important;
|
|
967
|
+
}
|
|
942
968
|
.container{
|
|
943
969
|
display:flex;
|
|
944
970
|
align-items:center;
|
|
@@ -110,5 +110,5 @@ export function Content({ searchValue, search, rightTop, segments, searchGroups
|
|
|
110
110
|
appearance: 'neutral',
|
|
111
111
|
}, content: isSearching ? t('noDataFound') : t('noData'), "data-test-id": isSearching ? TEST_IDS.noDataFound : TEST_IDS.noData, "data-mobile": isMobile || undefined, className: styles.noData }));
|
|
112
112
|
})();
|
|
113
|
-
return (_jsxs(_Fragment, { children: [search, _jsxs("div", { className: cn(styles.content, className), "data-mobile": isMobile || undefined, "data-empty": (!loading && !hasCards) || undefined, children: [!isSearching && (_jsx(_Fragment, { children: _jsxs(MountAnimation, { type: mountAnimationType, className: styles.top, children: [_jsx(ContentToolbar, { segment: segmentId, onSegmentChange: setSegmentId, segmentItems: segmentItems, allGroupsExpanded: allGroupsExpanded, onToggleAllGroupsExpanded: handleToggleAllGroupsExpanded, preferences: preferences, isMobile: isMobile, loading: loading }), rightTop] }) })), cards, footer] })] }));
|
|
113
|
+
return (_jsxs(_Fragment, { children: [search, _jsxs("div", { className: cn(styles.content, className), "data-mobile": isMobile || undefined, "data-empty": (!loading && !hasCards) || undefined, children: [!isSearching && (_jsx(_Fragment, { children: _jsxs(MountAnimation, { type: mountAnimationType, className: styles.top, children: [_jsx(ContentToolbar, { segment: segmentId, onSegmentChange: setSegmentId, segmentItems: segmentItems, allGroupsExpanded: allGroupsExpanded, onToggleAllGroupsExpanded: handleToggleAllGroupsExpanded, preferences: preferences, isMobile: isMobile, loading: loading }), _jsx("div", { className: styles.rightTop, "data-mobile": isMobile || undefined, children: rightTop })] }) })), cards, footer] })] }));
|
|
114
114
|
}
|
|
@@ -1,8 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export type SortableGroupDragHandleProps = {
|
|
3
|
-
/** ARIA-атрибуты `dnd-kit` draggable-элемента. */
|
|
4
|
-
attributes?: DraggableAttributes;
|
|
5
|
-
/** Обработчики событий `dnd-kit` для инициации перетаскивания. */
|
|
6
|
-
listeners?: DraggableSyntheticListeners;
|
|
7
|
-
};
|
|
8
|
-
export declare function SortableGroupDragHandle({ attributes, listeners }: SortableGroupDragHandleProps): import("react/jsx-runtime").JSX.Element;
|
|
1
|
+
export declare function SortableGroupDragHandle(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -3,7 +3,7 @@ import { DragDropSVG } from '@cloud-ru/ds-icons/interface/system';
|
|
|
3
3
|
import { stopEventPropagation } from '@cloud-ru/ds-utils';
|
|
4
4
|
import { headerLocale } from '../../../../../../../locale/index.js';
|
|
5
5
|
import styles from '../styles.module.css';
|
|
6
|
-
export function SortableGroupDragHandle(
|
|
6
|
+
export function SortableGroupDragHandle() {
|
|
7
7
|
const { t } = headerLocale.useTranslations();
|
|
8
|
-
return (_jsx("button", {
|
|
8
|
+
return (_jsx("button", { type: 'button', className: styles.dragHandle, "aria-label": t('dragGroup'), "data-test-id": 'header__drawer-menu__group-card-drag-handle', onClick: stopEventPropagation, children: _jsx(DragDropSVG, { size: 24 }) }));
|
|
9
9
|
}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
import { DraggableAttributes, DraggableSyntheticListeners } from '@dnd-kit/core';
|
|
1
2
|
import { LinksGroup, LinksGroupTitle } from '../../../../../types.js';
|
|
2
|
-
import { SortableGroupDragHandleProps } from './SortableGroupDragHandle.js';
|
|
3
3
|
export type SortableGroupHeaderProps = Pick<LinksGroup, 'icon'> & {
|
|
4
4
|
label: LinksGroupTitle;
|
|
5
5
|
isExpanded?: boolean;
|
|
6
6
|
enableServiceDrag?: boolean;
|
|
7
7
|
isMobile?: boolean;
|
|
8
|
-
|
|
8
|
+
/** ARIA-атрибуты `dnd-kit` draggable-элемента. */
|
|
9
|
+
attributes?: DraggableAttributes;
|
|
10
|
+
/** Обработчики событий `dnd-kit` для инициации перетаскивания. */
|
|
11
|
+
listeners?: DraggableSyntheticListeners;
|
|
12
|
+
};
|
|
9
13
|
declare function SortableGroupHeaderBase({ label, icon, isExpanded, enableServiceDrag, attributes, listeners, isMobile, }: SortableGroupHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
10
14
|
export declare const SortableGroupHeader: import("react").MemoExoticComponent<typeof SortableGroupHeaderBase>;
|
|
11
15
|
export {};
|
|
@@ -12,6 +12,6 @@ function SortableGroupHeaderBase({ label, icon, isExpanded, enableServiceDrag, a
|
|
|
12
12
|
e.stopPropagation();
|
|
13
13
|
label?.onClick?.(e);
|
|
14
14
|
}, [label]);
|
|
15
|
-
return (_jsxs("div", { className: styles.header, "data-expanded": isExpanded || undefined, children: [_jsx(Typography, { variant: 'title', size: 'm', className: styles.headerTitle, "data-test-id": 'header__drawer-menu__group-card-title', children: label.onClick || label.href ? (_jsx(TitleClickable, { ...(label.href ? { as: 'a', href: label.href } : { as: 'div' }), onClick: handleLabelClick, title: label.text, icon: getLinkEmblem({ icon }) })) : (label.text) }), (enableServiceDrag || !isMobile) && (_jsxs("div", { className: styles.headerActions, "data-always-visible": isMobile || undefined, children: [enableServiceDrag && _jsx(SortableGroupDragHandle, {
|
|
15
|
+
return (_jsxs("div", { className: styles.header, "data-expanded": isExpanded || undefined, ...attributes, ...listeners, tabIndex: -1, children: [_jsx(Typography, { variant: 'title', size: 'm', className: styles.headerTitle, "data-test-id": 'header__drawer-menu__group-card-title', children: label.onClick || label.href ? (_jsx(TitleClickable, { ...(label.href ? { as: 'a', href: label.href } : { as: 'div' }), onClick: handleLabelClick, title: label.text, icon: getLinkEmblem({ icon }) })) : (label.text) }), (enableServiceDrag || !isMobile) && (_jsxs("div", { className: styles.headerActions, "data-always-visible": isMobile || undefined, children: [enableServiceDrag && _jsx(SortableGroupDragHandle, {}), !isMobile && (_jsx(Button, { view: 'elevated', appearance: 'neutral', size: 's', icon: isExpanded ? _jsx(ChevronUpSVG, {}) : _jsx(ChevronDownSVG, {}), "data-test-id": 'header__drawer-menu__group-card-collapse' }))] }))] }));
|
|
16
16
|
}
|
|
17
17
|
export const SortableGroupHeader = memo(SortableGroupHeaderBase);
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
outline:none;
|
|
9
9
|
}
|
|
10
10
|
.headerActions[data-always-visible]{
|
|
11
|
+
pointer-events:auto;
|
|
11
12
|
opacity:1;
|
|
12
13
|
}
|
|
13
14
|
|
|
@@ -63,20 +64,25 @@
|
|
|
63
64
|
animation:none;
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
|
-
.group[data-drag-preview]{
|
|
67
|
-
cursor:grabbing;
|
|
68
|
-
}
|
|
69
67
|
.group[data-drag-preview] .header{
|
|
70
|
-
cursor:grabbing;
|
|
71
68
|
background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(136, 146, 170, 0.0784313725)));
|
|
72
69
|
}
|
|
73
70
|
.group[data-drag-preview] .header .headerActions{
|
|
74
71
|
pointer-events:auto;
|
|
75
72
|
opacity:1;
|
|
76
73
|
}
|
|
74
|
+
.group:has(:focus-visible) .headerActions{
|
|
75
|
+
pointer-events:auto;
|
|
76
|
+
opacity:1;
|
|
77
|
+
}
|
|
78
|
+
@media (hover: hover){
|
|
79
|
+
.group:hover .headerActions{
|
|
80
|
+
pointer-events:auto;
|
|
81
|
+
opacity:1;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
77
84
|
|
|
78
85
|
.groupDragPreview{
|
|
79
|
-
cursor:grabbing;
|
|
80
86
|
container-type:inline-size;
|
|
81
87
|
border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
|
|
82
88
|
}
|
|
@@ -119,7 +125,6 @@
|
|
|
119
125
|
|
|
120
126
|
.groupBody{
|
|
121
127
|
display:grid;
|
|
122
|
-
grid-template-columns:repeat(3, minmax(auto, 1fr));
|
|
123
128
|
gap:var(--sn-primitive-dimension-4, 4px);
|
|
124
129
|
}
|
|
125
130
|
.groupBody:not([data-subcategory-body]){
|
|
@@ -128,10 +133,8 @@
|
|
|
128
133
|
.groupBody:not([data-show-description]){
|
|
129
134
|
gap:0;
|
|
130
135
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
grid-template-columns:repeat(2, minmax(auto, 1fr));
|
|
134
|
-
}
|
|
136
|
+
.groupBody:not([data-mobile]){
|
|
137
|
+
grid-template-columns:repeat(auto-fill, minmax(240px, 1fr));
|
|
135
138
|
}
|
|
136
139
|
.groupBody[data-mobile]{
|
|
137
140
|
grid-template-columns:repeat(1, minmax(200px, 1fr));
|
|
@@ -21,6 +21,21 @@
|
|
|
21
21
|
gap:inherit;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
.rightTop{
|
|
25
|
+
width:100%;
|
|
26
|
+
min-width:0;
|
|
27
|
+
}
|
|
28
|
+
.rightTop:not([data-mobile]){
|
|
29
|
+
display:grid;
|
|
30
|
+
grid-template-columns:repeat(auto-fit, minmax(max(286px, (100% - var(--sn-primitive-dimension-4, 4px)) / 2), 1fr));
|
|
31
|
+
gap:var(--sn-primitive-dimension-4, 4px);
|
|
32
|
+
}
|
|
33
|
+
.rightTop[data-mobile]{
|
|
34
|
+
display:flex;
|
|
35
|
+
flex-direction:column;
|
|
36
|
+
gap:var(--sn-primitive-dimension-8, 8px);
|
|
37
|
+
}
|
|
38
|
+
|
|
24
39
|
.noData{
|
|
25
40
|
flex:1 1 auto;
|
|
26
41
|
place-self:center center;
|
|
@@ -13,9 +13,9 @@ import { MenuBottom } from '../MenuBottom/index.js';
|
|
|
13
13
|
import { MenuHeaderBrand } from '../MenuHeaderBrand/index.js';
|
|
14
14
|
import { MountAnimation } from '../MountAnimation/index.js';
|
|
15
15
|
import { Search } from '../Search/index.js';
|
|
16
|
-
import {
|
|
16
|
+
import { MENU_WIDTH_DEFAULT, MENU_WIDTH_MIN } from './constants.js';
|
|
17
17
|
import styles from './styles.module.css';
|
|
18
|
-
export function MenuDesktop({ open = false, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth =
|
|
18
|
+
export function MenuDesktop({ open = false, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth = MENU_WIDTH_DEFAULT, onWidthChangeEnd, draggerTooltip, loading, }) {
|
|
19
19
|
const { scrollRef, searchRef, resultItems } = useMenuItems({
|
|
20
20
|
segments,
|
|
21
21
|
search,
|
|
@@ -54,8 +54,8 @@ export function MenuDesktop({ open = false, setOpen, settingItems, platformGroup
|
|
|
54
54
|
return (_jsx(DrawerCustom, { open: open, onClose: handleCloseDrawer, width: isNeedRightBlock ? 'm' : 's', position: 'left', className: styles.drawer, rootClassName: styles.drawerRoot, "data-test-id": TEST_IDS.mainMenu.drawer, "data-small": !isNeedRightBlock || undefined, disableMotions: true, showButtonClosed: false, resizable: isNeedRightBlock
|
|
55
55
|
? {
|
|
56
56
|
min: MENU_WIDTH_MIN,
|
|
57
|
-
max:
|
|
58
|
-
default:
|
|
57
|
+
max: 'full',
|
|
58
|
+
default: defaultWidth,
|
|
59
59
|
onResizeEnd: onWidthChangeEnd,
|
|
60
60
|
draggerTooltip,
|
|
61
61
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export const MENU_WIDTH_STORAGE_KEY = 'cloud-ru-main-menu-user-width';
|
|
2
2
|
// паддинг справа 24px у дровера нужно компенсировать
|
|
3
|
-
export const MENU_WIDTH_MIN =
|
|
4
|
-
export const
|
|
3
|
+
export const MENU_WIDTH_MIN = 630 + 24;
|
|
4
|
+
export const MENU_WIDTH_DEFAULT = 1208 + 24;
|
|
@@ -3,9 +3,10 @@ import { DndContext, DragOverlay, KeyboardSensor, PointerSensor, useSensor, useS
|
|
|
3
3
|
import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
|
|
4
4
|
import { sortableKeyboardCoordinates } from '@dnd-kit/sortable';
|
|
5
5
|
import { usePortalContext } from '@cloud-ru/ds-portal-context';
|
|
6
|
-
import { createContext, useCallback, useContext, useMemo, useState } from 'react';
|
|
6
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';
|
|
7
7
|
import { createPortal } from 'react-dom';
|
|
8
8
|
import { ServiceCard } from '../helperComponents/ServiceCard/index.js';
|
|
9
|
+
import styles from '../styles.module.css';
|
|
9
10
|
import { favoriteListCollisionDetection, getDragReferenceY, isServiceDragId, isServiceSourceDragId, parseServiceDragId, resolveFavoriteOrderOnDragEnd, } from '../utils/index.js';
|
|
10
11
|
const restrictGroupDragToVerticalAxis = args => {
|
|
11
12
|
if (args.active?.id != null && isServiceSourceDragId(args.active.id)) {
|
|
@@ -82,6 +83,14 @@ export function useMainMenuDnd({ favorite, servicesById, showDescription }) {
|
|
|
82
83
|
}
|
|
83
84
|
export function MainMenuDndContext({ children, sensors, modifiers, collisionDetection, onDragStart, onDragEnd, onDragCancel, dragOverlay, overlayContextValue, }) {
|
|
84
85
|
const portalContextRef = usePortalContext();
|
|
86
|
+
const isDragging = Boolean(dragOverlay);
|
|
87
|
+
useEffect(() => {
|
|
88
|
+
if (!isDragging)
|
|
89
|
+
return;
|
|
90
|
+
/* Для предотвращения случайных взаимодействий с любыми другими элементами при перетаскивании */
|
|
91
|
+
document.body.classList.add(styles.dragging);
|
|
92
|
+
return () => document.body.classList.remove(styles.dragging);
|
|
93
|
+
}, [isDragging]);
|
|
85
94
|
// `DragOverlay` рендерит `position: fixed` без собственного портала. Drawer-обёртка
|
|
86
95
|
// (`.snack-rc-drawer-content-wrapper`) держит `will-change: transform`, а это, как и
|
|
87
96
|
// настоящий transform, создаёт containing block для fixed-потомков — оверлей резолвится
|
package/dist/esm/style.css
CHANGED
|
@@ -300,6 +300,7 @@
|
|
|
300
300
|
outline:none;
|
|
301
301
|
}
|
|
302
302
|
.headerActions[data-always-visible]{
|
|
303
|
+
pointer-events:auto;
|
|
303
304
|
opacity:1;
|
|
304
305
|
}
|
|
305
306
|
|
|
@@ -355,20 +356,25 @@
|
|
|
355
356
|
animation:none;
|
|
356
357
|
}
|
|
357
358
|
}
|
|
358
|
-
.group[data-drag-preview]{
|
|
359
|
-
cursor:grabbing;
|
|
360
|
-
}
|
|
361
359
|
.group[data-drag-preview] .header{
|
|
362
|
-
cursor:grabbing;
|
|
363
360
|
background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(136, 146, 170, 0.0784313725)));
|
|
364
361
|
}
|
|
365
362
|
.group[data-drag-preview] .header .headerActions{
|
|
366
363
|
pointer-events:auto;
|
|
367
364
|
opacity:1;
|
|
368
365
|
}
|
|
366
|
+
.group:has(:focus-visible) .headerActions{
|
|
367
|
+
pointer-events:auto;
|
|
368
|
+
opacity:1;
|
|
369
|
+
}
|
|
370
|
+
@media (hover: hover){
|
|
371
|
+
.group:hover .headerActions{
|
|
372
|
+
pointer-events:auto;
|
|
373
|
+
opacity:1;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
369
376
|
|
|
370
377
|
.groupDragPreview{
|
|
371
|
-
cursor:grabbing;
|
|
372
378
|
container-type:inline-size;
|
|
373
379
|
border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
|
|
374
380
|
}
|
|
@@ -411,7 +417,6 @@
|
|
|
411
417
|
|
|
412
418
|
.groupBody{
|
|
413
419
|
display:grid;
|
|
414
|
-
grid-template-columns:repeat(3, minmax(auto, 1fr));
|
|
415
420
|
gap:var(--sn-primitive-dimension-4, 4px);
|
|
416
421
|
}
|
|
417
422
|
.groupBody:not([data-subcategory-body]){
|
|
@@ -420,10 +425,8 @@
|
|
|
420
425
|
.groupBody:not([data-show-description]){
|
|
421
426
|
gap:0;
|
|
422
427
|
}
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
grid-template-columns:repeat(2, minmax(auto, 1fr));
|
|
426
|
-
}
|
|
428
|
+
.groupBody:not([data-mobile]){
|
|
429
|
+
grid-template-columns:repeat(auto-fill, minmax(240px, 1fr));
|
|
427
430
|
}
|
|
428
431
|
.groupBody[data-mobile]{
|
|
429
432
|
grid-template-columns:repeat(1, minmax(200px, 1fr));
|
|
@@ -575,6 +578,21 @@
|
|
|
575
578
|
gap:inherit;
|
|
576
579
|
}
|
|
577
580
|
|
|
581
|
+
.rightTop{
|
|
582
|
+
width:100%;
|
|
583
|
+
min-width:0;
|
|
584
|
+
}
|
|
585
|
+
.rightTop:not([data-mobile]){
|
|
586
|
+
display:grid;
|
|
587
|
+
grid-template-columns:repeat(auto-fit, minmax(max(286px, (100% - var(--sn-primitive-dimension-4, 4px)) / 2), 1fr));
|
|
588
|
+
gap:var(--sn-primitive-dimension-4, 4px);
|
|
589
|
+
}
|
|
590
|
+
.rightTop[data-mobile]{
|
|
591
|
+
display:flex;
|
|
592
|
+
flex-direction:column;
|
|
593
|
+
gap:var(--sn-primitive-dimension-8, 8px);
|
|
594
|
+
}
|
|
595
|
+
|
|
578
596
|
.noData{
|
|
579
597
|
flex:1 1 auto;
|
|
580
598
|
place-self:center center;
|
|
@@ -939,6 +957,14 @@
|
|
|
939
957
|
.staticCard{
|
|
940
958
|
position:relative;
|
|
941
959
|
}
|
|
960
|
+
.dragging,
|
|
961
|
+
.dragging *{
|
|
962
|
+
cursor:grabbing !important;
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
.dragging *{
|
|
966
|
+
pointer-events:none !important;
|
|
967
|
+
}
|
|
942
968
|
.container{
|
|
943
969
|
display:flex;
|
|
944
970
|
align-items:center;
|