@cloud-ru/ds-uikit-product-header 2.1.3 → 2.1.4-preview-0fb5d9fa.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.
Files changed (52) hide show
  1. package/README.md +2 -0
  2. package/dist/cjs/components/MainMenu/MainMenu.d.ts +1 -1
  3. package/dist/cjs/components/MainMenu/MainMenu.js +2 -2
  4. package/dist/cjs/components/MainMenu/helperComponents/Content/Content.d.ts +5 -1
  5. package/dist/cjs/components/MainMenu/helperComponents/Content/Content.js +4 -3
  6. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.d.ts +1 -8
  7. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.js +2 -2
  8. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +6 -2
  9. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +1 -1
  10. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +13 -10
  11. package/dist/cjs/components/MainMenu/helperComponents/Content/styles.module.css +15 -0
  12. package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.d.ts +1 -1
  13. package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +4 -4
  14. package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/constants.d.ts +1 -1
  15. package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/constants.js +3 -3
  16. package/dist/cjs/components/MainMenu/hooks/useMainMenuDnd.js +12 -0
  17. package/dist/cjs/components/MainMenu/styles.module.css +8 -0
  18. package/dist/cjs/components/MainMenu/types.d.ts +1 -1
  19. package/dist/cjs/style.css +36 -10
  20. package/dist/esm/components/MainMenu/MainMenu.d.ts +1 -1
  21. package/dist/esm/components/MainMenu/MainMenu.js +2 -2
  22. package/dist/esm/components/MainMenu/helperComponents/Content/Content.d.ts +5 -1
  23. package/dist/esm/components/MainMenu/helperComponents/Content/Content.js +4 -3
  24. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.d.ts +1 -8
  25. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.js +2 -2
  26. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +6 -2
  27. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +1 -1
  28. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +13 -10
  29. package/dist/esm/components/MainMenu/helperComponents/Content/styles.module.css +15 -0
  30. package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.d.ts +1 -1
  31. package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +5 -5
  32. package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/constants.d.ts +1 -1
  33. package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/constants.js +2 -2
  34. package/dist/esm/components/MainMenu/hooks/useMainMenuDnd.js +10 -1
  35. package/dist/esm/components/MainMenu/styles.module.css +8 -0
  36. package/dist/esm/components/MainMenu/types.d.ts +1 -1
  37. package/dist/esm/style.css +36 -10
  38. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  39. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  40. package/package.json +28 -28
  41. package/src/components/MainMenu/MainMenu.tsx +2 -0
  42. package/src/components/MainMenu/helperComponents/Content/Content.tsx +12 -2
  43. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.tsx +1 -11
  44. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.tsx +9 -4
  45. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.scss +27 -19
  46. package/src/components/MainMenu/helperComponents/Content/styles.module.scss +22 -0
  47. package/src/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.tsx +6 -4
  48. package/src/components/MainMenu/helperComponents/MenuDesktop/constants.ts +2 -2
  49. package/src/components/MainMenu/helperComponents/MenuDesktop/styles.module.scss +6 -2
  50. package/src/components/MainMenu/hooks/useMainMenuDnd.tsx +12 -1
  51. package/src/components/MainMenu/styles.module.scss +10 -0
  52. package/src/components/MainMenu/types.ts +1 -0
@@ -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
- @container (width <= 728px){
132
- .groupBody:not([data-mobile]){
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;
@@ -1,2 +1,2 @@
1
1
  import { MainMenuProps } from '../../types.js';
2
- export declare function MenuDesktop({ open, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth, onWidthChangeEnd, draggerTooltip, loading, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function MenuDesktop({ open, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onToggleAllGroupsExpanded, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth, onWidthChangeEnd, draggerTooltip, loading, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
@@ -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 { MENU_WIDTH_MAX, MENU_WIDTH_MIN } from './constants.js';
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 = MENU_WIDTH_MAX, onWidthChangeEnd, draggerTooltip, loading, }) {
18
+ export function MenuDesktop({ open = false, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onToggleAllGroupsExpanded, 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,
@@ -50,12 +50,12 @@ export function MenuDesktop({ open = false, setOpen, settingItems, platformGroup
50
50
  const handleCloseDrawer = useCallback(() => {
51
51
  setOpen?.(false);
52
52
  }, [setOpen]);
53
- const menu = (_jsxs("div", { className: styles.menu, children: [_jsxs("div", { className: styles.menuHeader, children: [_jsx(MenuHeaderBrand, { logo: logo, onClose: handleCloseDrawer, className: styles.menuHeaderBrand }), isNeedRightBlock && search && (_jsxs(_Fragment, { children: [_jsx(Divider, { orientation: 'vertical' }), _jsx(Search, { ...search, ref: searchRef })] }))] }), _jsx(Divider, {}), _jsxs("div", { className: styles.menuBody, children: [_jsxs(MountAnimation, { className: styles.left, "data-test-id": TEST_IDS.mainMenu.left, type: 'slide-right', children: [leftTop && _jsx("div", { className: styles.leftTop, children: leftTop }), isNeedRightBlock && favorite && _jsx(Favorites, { favorite: favorite, servicesById: servicesById }), hasBottomItems && _jsx(MenuBottom, { settingItems: settingItems, leftBottom: leftBottom })] }), isNeedRightBlock && (_jsxs(_Fragment, { children: [_jsx(MountAnimation, { type: 'fade-in', children: _jsx(Divider, { orientation: 'vertical' }) }), _jsx("div", { className: styles.right, "data-test-id": TEST_IDS.mainMenu.right, children: _jsx(Scroll, { paddingAbsolute: true, className: styles.scroll, ref: scrollRef, barHideStrategy: 'never', overflow: { x: 'hidden' }, children: _jsx(Content, { className: styles.rightContent, searchValue: search?.value, rightTop: rightTop, favorite: favorite, segments: segments, searchGroups: resultItems, segmentPrefs: segmentPrefs, activeSegmentId: activeSegmentId, onActiveSegmentChange: onActiveSegmentChange, onSegmentOrderChange: onSegmentOrderChange, onSegmentExpandedChange: onSegmentExpandedChange, onSegmentServiceClick: onSegmentServiceClick, preferences: preferences, loading: loading }) }) })] }))] })] }));
53
+ const menu = (_jsxs("div", { className: styles.menu, children: [_jsxs("div", { className: styles.menuHeader, children: [_jsx(MenuHeaderBrand, { logo: logo, onClose: handleCloseDrawer, className: styles.menuHeaderBrand }), isNeedRightBlock && search && (_jsxs(_Fragment, { children: [_jsx(Divider, { orientation: 'vertical' }), _jsx(Search, { ...search, ref: searchRef })] }))] }), _jsx(Divider, {}), _jsxs("div", { className: styles.menuBody, children: [_jsxs(MountAnimation, { className: styles.left, "data-test-id": TEST_IDS.mainMenu.left, type: 'slide-right', children: [leftTop && _jsx("div", { className: styles.leftTop, children: leftTop }), isNeedRightBlock && favorite && _jsx(Favorites, { favorite: favorite, servicesById: servicesById }), hasBottomItems && _jsx(MenuBottom, { settingItems: settingItems, leftBottom: leftBottom })] }), isNeedRightBlock && (_jsxs(_Fragment, { children: [_jsx(MountAnimation, { type: 'fade-in', children: _jsx(Divider, { orientation: 'vertical' }) }), _jsx("div", { className: styles.right, "data-test-id": TEST_IDS.mainMenu.right, children: _jsx(Scroll, { paddingAbsolute: true, className: styles.scroll, ref: scrollRef, barHideStrategy: 'never', overflow: { x: 'hidden' }, children: _jsx(Content, { className: styles.rightContent, searchValue: search?.value, rightTop: rightTop, favorite: favorite, segments: segments, searchGroups: resultItems, segmentPrefs: segmentPrefs, activeSegmentId: activeSegmentId, onActiveSegmentChange: onActiveSegmentChange, onSegmentOrderChange: onSegmentOrderChange, onSegmentExpandedChange: onSegmentExpandedChange, onSegmentServiceClick: onSegmentServiceClick, onToggleAllGroupsExpanded: onToggleAllGroupsExpanded, preferences: preferences, loading: loading }) }) })] }))] })] }));
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: MENU_WIDTH_MAX,
58
- default: Math.min(Math.max(defaultWidth, MENU_WIDTH_MIN), MENU_WIDTH_MAX),
57
+ max: 'full',
58
+ default: defaultWidth,
59
59
  onResizeEnd: onWidthChangeEnd,
60
60
  draggerTooltip,
61
61
  }
@@ -1,3 +1,3 @@
1
1
  export declare const MENU_WIDTH_STORAGE_KEY = "cloud-ru-main-menu-user-width";
2
2
  export declare const MENU_WIDTH_MIN: number;
3
- export declare const MENU_WIDTH_MAX: number;
3
+ export declare const MENU_WIDTH_DEFAULT: number;
@@ -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 = 960 + 24;
4
- export const MENU_WIDTH_MAX = 1208 + 24;
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-потомков — оверлей резолвится
@@ -0,0 +1,8 @@
1
+ .dragging,
2
+ .dragging *{
3
+ cursor:grabbing !important;
4
+ }
5
+
6
+ .dragging *{
7
+ pointer-events:none !important;
8
+ }
@@ -240,7 +240,7 @@ export type MainMenuSettingsItem = Pick<InnerLink, 'id' | 'label' | 'icon' | 'on
240
240
  /** Разделитель до/после пункта. */
241
241
  divider?: 'before' | 'after';
242
242
  };
243
- export type MainMenuProps = Pick<ContentProps, 'segments' | 'searchGroups' | 'segmentPrefs' | 'activeSegmentId' | 'onActiveSegmentChange' | 'onSegmentOrderChange' | 'onSegmentExpandedChange' | 'onSegmentServiceClick' | 'favorite' | 'preferences' | 'loading' | 'rightTop'> & {
243
+ export type MainMenuProps = Pick<ContentProps, 'segments' | 'searchGroups' | 'segmentPrefs' | 'activeSegmentId' | 'onActiveSegmentChange' | 'onSegmentOrderChange' | 'onSegmentExpandedChange' | 'onToggleAllGroupsExpanded' | 'onSegmentServiceClick' | 'favorite' | 'preferences' | 'loading' | 'rightTop'> & {
244
244
  /** Кнопка открытия меню недоступна для клика. */
245
245
  disabled?: boolean;
246
246
  /**
@@ -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
- @container (width <= 728px){
424
- .groupBody:not([data-mobile]){
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;