@cloud-ru/ds-uikit-product-header 2.1.3-preview-97040951.0 → 2.1.3

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 (38) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/cjs/components/MainMenu/helperComponents/Content/Content.js +1 -1
  3. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.d.ts +8 -1
  4. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.js +2 -2
  5. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +2 -6
  6. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +1 -1
  7. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +10 -13
  8. package/dist/cjs/components/MainMenu/helperComponents/Content/styles.module.css +0 -15
  9. package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +1 -1
  10. package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/constants.js +1 -1
  11. package/dist/cjs/components/MainMenu/hooks/useMainMenuDnd.js +0 -12
  12. package/dist/cjs/style.css +10 -36
  13. package/dist/esm/components/MainMenu/helperComponents/Content/Content.js +1 -1
  14. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.d.ts +8 -1
  15. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.js +2 -2
  16. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +2 -6
  17. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +1 -1
  18. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +10 -13
  19. package/dist/esm/components/MainMenu/helperComponents/Content/styles.module.css +0 -15
  20. package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +1 -1
  21. package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/constants.js +1 -1
  22. package/dist/esm/components/MainMenu/hooks/useMainMenuDnd.js +1 -10
  23. package/dist/esm/style.css +10 -36
  24. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  25. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  26. package/package.json +28 -28
  27. package/src/components/MainMenu/helperComponents/Content/Content.tsx +1 -3
  28. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.tsx +11 -1
  29. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.tsx +4 -9
  30. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.scss +19 -27
  31. package/src/components/MainMenu/helperComponents/Content/styles.module.scss +0 -22
  32. package/src/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.tsx +1 -1
  33. package/src/components/MainMenu/helperComponents/MenuDesktop/constants.ts +1 -1
  34. package/src/components/MainMenu/helperComponents/MenuDesktop/styles.module.scss +2 -6
  35. package/src/components/MainMenu/hooks/useMainMenuDnd.tsx +1 -12
  36. package/dist/cjs/components/MainMenu/styles.module.css +0 -8
  37. package/dist/esm/components/MainMenu/styles.module.css +0 -8
  38. package/src/components/MainMenu/styles.module.scss +0 -10
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloud-ru/ds-uikit-product-header",
3
- "version": "2.1.3-preview-97040951.0",
3
+ "version": "2.1.3",
4
4
  "description": "Продуктовая шапка консоли — HeaderLayout, MainMenu, UserMenu, Logo, PathBreadcrumbs и PlatformLogo.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -45,33 +45,33 @@
45
45
  "@dnd-kit/utilities": "^3.2.2",
46
46
  "classnames": "^2.5.1",
47
47
  "fuse.js": "^7.1.0",
48
- "@cloud-ru/ds-accordion": "1.2.1",
49
- "@cloud-ru/ds-avatar": "1.0.11",
50
- "@cloud-ru/ds-adaptive": "1.0.2",
51
- "@cloud-ru/ds-breadcrumbs": "1.0.28",
52
- "@cloud-ru/ds-button": "1.0.4",
53
- "@cloud-ru/ds-card": "1.0.22",
54
- "@cloud-ru/ds-drag-and-drop": "1.1.3",
55
- "@cloud-ru/ds-drawer": "2.0.1-preview-97040951.0",
56
- "@cloud-ru/ds-divider": "1.0.2",
57
- "@cloud-ru/ds-icons": "1.5.0",
58
- "@cloud-ru/ds-list": "2.3.1",
59
- "@cloud-ru/ds-info-block": "1.0.3",
60
- "@cloud-ru/ds-locale": "1.0.0",
61
- "@cloud-ru/ds-portal-context": "1.0.2",
62
- "@cloud-ru/ds-modal": "2.0.0",
63
- "@cloud-ru/ds-promo-tag": "1.0.3",
64
- "@cloud-ru/ds-scroll": "1.0.5",
65
- "@cloud-ru/ds-segment-control": "1.0.13",
66
- "@cloud-ru/ds-search": "1.0.14",
67
- "@cloud-ru/ds-skeleton": "1.0.2",
68
- "@cloud-ru/ds-theme": "2.1.0",
69
- "@cloud-ru/ds-tooltip": "1.0.11",
70
- "@cloud-ru/ds-typography": "1.0.1",
71
- "@cloud-ru/ds-uikit-product-card-predefined": "4.0.8",
72
- "@cloud-ru/ds-uikit-product-switch-row": "1.0.14",
73
- "@cloud-ru/ds-utils": "1.2.0",
74
- "@cloud-ru/ds-uikit-product-title-clickable": "1.0.16"
48
+ "@cloud-ru/ds-accordion": "^1.2.1",
49
+ "@cloud-ru/ds-avatar": "^1.0.11",
50
+ "@cloud-ru/ds-adaptive": "^1.0.2",
51
+ "@cloud-ru/ds-button": "^1.0.4",
52
+ "@cloud-ru/ds-breadcrumbs": "^1.0.29",
53
+ "@cloud-ru/ds-card": "^1.0.22",
54
+ "@cloud-ru/ds-drag-and-drop": "^1.1.3",
55
+ "@cloud-ru/ds-divider": "^1.0.2",
56
+ "@cloud-ru/ds-drawer": "^2.0.0",
57
+ "@cloud-ru/ds-icons": "^1.5.0",
58
+ "@cloud-ru/ds-info-block": "^1.0.3",
59
+ "@cloud-ru/ds-list": "^2.3.2",
60
+ "@cloud-ru/ds-locale": "^1.0.0",
61
+ "@cloud-ru/ds-modal": "^2.0.0",
62
+ "@cloud-ru/ds-portal-context": "^1.0.2",
63
+ "@cloud-ru/ds-promo-tag": "^1.0.3",
64
+ "@cloud-ru/ds-scroll": "^1.0.5",
65
+ "@cloud-ru/ds-search": "^1.0.14",
66
+ "@cloud-ru/ds-skeleton": "^1.0.2",
67
+ "@cloud-ru/ds-segment-control": "^1.0.13",
68
+ "@cloud-ru/ds-theme": "^2.1.0",
69
+ "@cloud-ru/ds-tooltip": "^1.0.11",
70
+ "@cloud-ru/ds-typography": "^1.0.1",
71
+ "@cloud-ru/ds-uikit-product-switch-row": "^1.0.14",
72
+ "@cloud-ru/ds-uikit-product-title-clickable": "^1.0.16",
73
+ "@cloud-ru/ds-utils": "^1.2.0",
74
+ "@cloud-ru/ds-uikit-product-card-predefined": "^4.0.9"
75
75
  },
76
76
  "publishConfig": {
77
77
  "access": "public"
@@ -316,9 +316,7 @@ export function Content({
316
316
  loading={loading}
317
317
  />
318
318
 
319
- <div className={styles.rightTop} data-mobile={isMobile || undefined}>
320
- {rightTop}
321
- </div>
319
+ {rightTop}
322
320
  </MountAnimation>
323
321
  </>
324
322
  )}
@@ -1,14 +1,24 @@
1
+ import { DraggableAttributes, DraggableSyntheticListeners } from '@dnd-kit/core';
1
2
  import { DragDropSVG } from '@cloud-ru/ds-icons/interface/system';
2
3
  import { stopEventPropagation } from '@cloud-ru/ds-utils';
3
4
 
4
5
  import { headerLocale } from '../../../../../../../locale';
5
6
  import styles from '../styles.module.scss';
6
7
 
7
- export function SortableGroupDragHandle() {
8
+ export type SortableGroupDragHandleProps = {
9
+ /** ARIA-атрибуты `dnd-kit` draggable-элемента. */
10
+ attributes?: DraggableAttributes;
11
+ /** Обработчики событий `dnd-kit` для инициации перетаскивания. */
12
+ listeners?: DraggableSyntheticListeners;
13
+ };
14
+
15
+ export function SortableGroupDragHandle({ attributes, listeners }: SortableGroupDragHandleProps) {
8
16
  const { t } = headerLocale.useTranslations();
9
17
 
10
18
  return (
11
19
  <button
20
+ {...attributes}
21
+ {...listeners}
12
22
  type='button'
13
23
  className={styles.dragHandle}
14
24
  aria-label={t('dragGroup')}
@@ -1,4 +1,3 @@
1
- import { DraggableAttributes, DraggableSyntheticListeners } from '@dnd-kit/core';
2
1
  import { Button } from '@cloud-ru/ds-button';
3
2
  import { ChevronDownSVG, ChevronUpSVG } from '@cloud-ru/ds-icons/interface/system';
4
3
  import { Typography } from '@cloud-ru/ds-typography';
@@ -8,18 +7,14 @@ import { memo, MouseEventHandler, useCallback } from 'react';
8
7
  import { LinksGroup, LinksGroupTitle } from '../../../../../types';
9
8
  import { getLinkEmblem } from '../../../../../utils';
10
9
  import styles from '../styles.module.scss';
11
- import { SortableGroupDragHandle } from './SortableGroupDragHandle';
10
+ import { SortableGroupDragHandle, SortableGroupDragHandleProps } from './SortableGroupDragHandle';
12
11
 
13
12
  export type SortableGroupHeaderProps = Pick<LinksGroup, 'icon'> & {
14
13
  label: LinksGroupTitle;
15
14
  isExpanded?: boolean;
16
15
  enableServiceDrag?: boolean;
17
16
  isMobile?: boolean;
18
- /** ARIA-атрибуты `dnd-kit` draggable-элемента. */
19
- attributes?: DraggableAttributes;
20
- /** Обработчики событий `dnd-kit` для инициации перетаскивания. */
21
- listeners?: DraggableSyntheticListeners;
22
- };
17
+ } & SortableGroupDragHandleProps;
23
18
 
24
19
  function SortableGroupHeaderBase({
25
20
  label,
@@ -40,7 +35,7 @@ function SortableGroupHeaderBase({
40
35
  );
41
36
 
42
37
  return (
43
- <div className={styles.header} data-expanded={isExpanded || undefined} {...attributes} {...listeners} tabIndex={-1}>
38
+ <div className={styles.header} data-expanded={isExpanded || undefined}>
44
39
  <Typography
45
40
  variant='title'
46
41
  size='m'
@@ -61,7 +56,7 @@ function SortableGroupHeaderBase({
61
56
 
62
57
  {(enableServiceDrag || !isMobile) && (
63
58
  <div className={styles.headerActions} data-always-visible={isMobile || undefined}>
64
- {enableServiceDrag && <SortableGroupDragHandle />}
59
+ {enableServiceDrag && <SortableGroupDragHandle attributes={attributes} listeners={listeners} />}
65
60
 
66
61
  {!isMobile && (
67
62
  <Button
@@ -17,11 +17,6 @@ $map-block-color-decor: (
17
17
  'pink': base.$sn-theme-color-pink-decor,
18
18
  );
19
19
 
20
- @mixin header-actions-visible {
21
- pointer-events: auto;
22
- opacity: 1;
23
- }
24
-
25
20
  .headerActions {
26
21
  pointer-events: none;
27
22
 
@@ -34,7 +29,7 @@ $map-block-color-decor: (
34
29
  outline: none;
35
30
 
36
31
  &[data-always-visible] {
37
- @include header-actions-visible;
32
+ opacity: 1;
38
33
  }
39
34
  }
40
35
 
@@ -52,7 +47,8 @@ $map-block-color-decor: (
52
47
  &:focus-visible,
53
48
  &:has(:focus-visible) {
54
49
  .headerActions {
55
- @include header-actions-visible;
50
+ pointer-events: auto;
51
+ opacity: 1;
56
52
  }
57
53
  }
58
54
 
@@ -61,7 +57,8 @@ $map-block-color-decor: (
61
57
  background-color: base.$sn-theme-color-neutral-decorTransparent;
62
58
 
63
59
  .headerActions {
64
- @include header-actions-visible;
60
+ pointer-events: auto;
61
+ opacity: 1;
65
62
  }
66
63
  }
67
64
  }
@@ -109,31 +106,22 @@ $map-block-color-decor: (
109
106
  }
110
107
 
111
108
  &[data-drag-preview] {
109
+ cursor: grabbing;
110
+
112
111
  .header {
112
+ cursor: grabbing;
113
113
  background-color: base.$sn-theme-color-neutral-decorTransparent;
114
114
 
115
115
  .headerActions {
116
- @include header-actions-visible;
117
- }
118
- }
119
- }
120
-
121
- &:has(:focus-visible) {
122
- .headerActions {
123
- @include header-actions-visible;
124
- }
125
- }
126
-
127
- @media (hover: hover) {
128
- &:hover {
129
- .headerActions {
130
- @include header-actions-visible;
116
+ pointer-events: auto;
117
+ opacity: 1;
131
118
  }
132
119
  }
133
120
  }
134
121
  }
135
122
 
136
123
  .groupDragPreview {
124
+ cursor: grabbing;
137
125
  container-type: inline-size;
138
126
  border-radius: $group-border-radius;
139
127
  }
@@ -184,6 +172,7 @@ $map-block-color-decor: (
184
172
 
185
173
  .groupBody {
186
174
  display: grid;
175
+ grid-template-columns: repeat(3, minmax(auto, 1fr));
187
176
  gap: base.$sn-primitive-dimension-4;
188
177
 
189
178
  &:not([data-subcategory-body]) {
@@ -195,11 +184,14 @@ $map-block-color-decor: (
195
184
  gap: 0;
196
185
  }
197
186
 
198
- // Drawer десктопного меню ресайзится пользователем (см. MenuDesktop.resizable), поэтому число
199
- // колонок выводится из ширины контейнера автоматически: сколько карточек минимальной ширины влезает.
200
- // Нет токена минимальной ширины карточки.
201
187
  &:not([data-mobile]) {
202
- grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
188
+ // Drawer десктопного меню ресайзится пользователем (см. MenuDesktop.resizable),
189
+ // поэтому колонки реагируют на реальную ширину контейнера (container query
190
+ // от `.rightContent`), а не на ширину viewport.
191
+ // Перестраиваться должно при ширине дровера 1024px, поэтому width тут указан с вычетом
192
+ @container (width <= 728px) {
193
+ grid-template-columns: repeat(2, minmax(auto, 1fr));
194
+ }
203
195
  }
204
196
 
205
197
  &[data-mobile] {
@@ -27,28 +27,6 @@
27
27
  gap: inherit;
28
28
  }
29
29
 
30
- .rightTop {
31
- width: 100%;
32
- min-width: 0;
33
-
34
- &:not([data-mobile]) {
35
- // Не больше двух колонок: минимальная ширина колонки не меньше половины контейнера (за вычетом gap),
36
- // а при ширине меньше 2 × 286px баннеры встают в одну колонку. `auto-fit` схлопывает пустые колонки: один баннер занимает всю ширину.
37
- display: grid;
38
- grid-template-columns: repeat(
39
- auto-fit,
40
- minmax(max(286px, calc((100% - #{base.$sn-primitive-dimension-4}) / 2)), 1fr)
41
- );
42
- gap: base.$sn-primitive-dimension-4;
43
- }
44
-
45
- &[data-mobile] {
46
- display: flex;
47
- flex-direction: column;
48
- gap: base.$sn-primitive-dimension-8;
49
- }
50
- }
51
-
52
30
  .noData {
53
31
  flex: 1 1 auto;
54
32
  place-self: center center;
@@ -167,7 +167,7 @@ export function MenuDesktop({
167
167
  isNeedRightBlock
168
168
  ? {
169
169
  min: MENU_WIDTH_MIN,
170
- max: 'full',
170
+ max: MENU_WIDTH_MAX,
171
171
  default: Math.min(Math.max(defaultWidth, MENU_WIDTH_MIN), MENU_WIDTH_MAX),
172
172
  onResizeEnd: onWidthChangeEnd,
173
173
  draggerTooltip,
@@ -1,6 +1,6 @@
1
1
  export const MENU_WIDTH_STORAGE_KEY = 'cloud-ru-main-menu-user-width';
2
2
 
3
3
  // паддинг справа 24px у дровера нужно компенсировать
4
- export const MENU_WIDTH_MIN = 630 + 24;
4
+ export const MENU_WIDTH_MIN = 960 + 24;
5
5
 
6
6
  export const MENU_WIDTH_MAX = 1208 + 24;
@@ -2,8 +2,6 @@
2
2
  @use '@cloud-ru/ds-figma-variables/build/scss/components/divider.module' as divider;
3
3
  @use '@cloud-ru/ds-figma-variables/build/scss/components/drawer.module' as drawer;
4
4
 
5
- $drawer-sidebar-width: 263px;
6
-
7
5
  .drawer {
8
6
  border-radius: drawer.$sn-drawer-anatomy-container-vertical-positionLeft-container-borderTopLeftRadius
9
7
  drawer.$sn-drawer-anatomy-container-vertical-positionLeft-container-borderTopRightRadius
@@ -42,9 +40,7 @@ $drawer-sidebar-width: 263px;
42
40
  // по умолчанию box-sizing: content-box; и из-за этого max-width определяется некорректно
43
41
  box-sizing: border-box;
44
42
  width: 100%;
45
- max-width: calc(
46
- #{$drawer-sidebar-width} + #{drawer.$sn-drawer-anatomy-container-vertical-positionLeft-paddingRight}
47
- );
43
+ max-width: calc(263px + #{drawer.$sn-drawer-anatomy-container-vertical-positionLeft-paddingRight});
48
44
 
49
45
  .left {
50
46
  width: 100%;
@@ -80,7 +76,7 @@ $drawer-sidebar-width: 263px;
80
76
  .menu {
81
77
  --snack-menu-header-height: #{base.$sn-primitive-dimension-40};
82
78
  // Нет токена ширины левой колонки меню.
83
- --snack-menu-left-width: #{$drawer-sidebar-width};
79
+ --snack-menu-left-width: 263px;
84
80
 
85
81
  position: relative;
86
82
  height: 100vh;
@@ -13,11 +13,10 @@ import {
13
13
  import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
14
14
  import { sortableKeyboardCoordinates } from '@dnd-kit/sortable';
15
15
  import { usePortalContext } from '@cloud-ru/ds-portal-context';
16
- import { createContext, ReactNode, useCallback, useContext, useEffect, useMemo, useState } from 'react';
16
+ import { createContext, ReactNode, useCallback, useContext, useMemo, useState } from 'react';
17
17
  import { createPortal } from 'react-dom';
18
18
 
19
19
  import { ServiceCard } from '../helperComponents/ServiceCard';
20
- import styles from '../styles.module.scss';
21
20
  import { FavoriteProps, InnerLink } from '../types';
22
21
  import {
23
22
  favoriteListCollisionDetection,
@@ -164,16 +163,6 @@ export function MainMenuDndContext({
164
163
  overlayContextValue,
165
164
  }: Partial<MainMenuDndContextProps>) {
166
165
  const portalContextRef = usePortalContext();
167
- const isDragging = Boolean(dragOverlay);
168
-
169
- useEffect(() => {
170
- if (!isDragging) return;
171
-
172
- /* Для предотвращения случайных взаимодействий с любыми другими элементами при перетаскивании */
173
- document.body.classList.add(styles.dragging);
174
-
175
- return () => document.body.classList.remove(styles.dragging);
176
- }, [isDragging]);
177
166
 
178
167
  // `DragOverlay` рендерит `position: fixed` без собственного портала. Drawer-обёртка
179
168
  // (`.snack-rc-drawer-content-wrapper`) держит `will-change: transform`, а это, как и
@@ -1,8 +0,0 @@
1
- .dragging,
2
- .dragging *{
3
- cursor:grabbing !important;
4
- }
5
-
6
- .dragging *{
7
- pointer-events:none !important;
8
- }
@@ -1,8 +0,0 @@
1
- .dragging,
2
- .dragging *{
3
- cursor:grabbing !important;
4
- }
5
-
6
- .dragging *{
7
- pointer-events:none !important;
8
- }
@@ -1,10 +0,0 @@
1
- // Класс ставится на `body` на время drag: превью в `DragOverlay` с `pointer-events: none`,
2
- // поэтому курсор определяется элементами под ним, и `!important` перебивает их собственные.
3
- .dragging,
4
- .dragging * {
5
- cursor: grabbing !important;
6
- }
7
-
8
- .dragging * {
9
- pointer-events: none !important;
10
- }