@cloud-ru/ds-uikit-product-header 2.0.3-preview-1298edee.0 → 2.0.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 (54) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/cjs/components/HeaderLayout/styles.module.css +1 -1
  3. package/dist/cjs/components/MainMenu/helperComponents/Banners/styles.module.css +1 -1
  4. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/styles.module.css +2 -2
  5. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +7 -7
  6. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/EmptyState/styles.module.css +3 -3
  7. package/dist/cjs/components/MainMenu/helperComponents/Favorites/styles.module.css +3 -3
  8. package/dist/cjs/components/MainMenu/helperComponents/MenuBottom/MenuBottom.js +1 -1
  9. package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/styles.module.css +1 -1
  10. package/dist/cjs/components/MainMenu/helperComponents/MenuHeaderBrand/styles.module.css +3 -3
  11. package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/MenuMobile.js +1 -2
  12. package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/styles.module.css +1 -1
  13. package/dist/cjs/components/MainMenu/helperComponents/ScrollWithAnimatedStickyPanel/ScrollWithAnimatedStickyPanel.js +6 -18
  14. package/dist/cjs/components/PlatformLogo/styles.module.css +1 -1
  15. package/dist/cjs/components/UserMenu/UserMenu.js +4 -5
  16. package/dist/cjs/components/UserMenu/hooks/useLogoutItem.d.ts +2 -2
  17. package/dist/cjs/components/UserMenu/hooks/useLogoutItem.js +9 -12
  18. package/dist/cjs/components/UserMenu/hooks/useUserMenuItems.js +3 -3
  19. package/dist/cjs/components/UserMenu/styles.module.css +1 -10
  20. package/dist/cjs/constants.d.ts +1 -0
  21. package/dist/cjs/constants.js +3 -1
  22. package/dist/cjs/style.css +24 -33
  23. package/dist/esm/components/HeaderLayout/styles.module.css +1 -1
  24. package/dist/esm/components/MainMenu/helperComponents/Banners/styles.module.css +1 -1
  25. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/styles.module.css +2 -2
  26. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +7 -7
  27. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/EmptyState/styles.module.css +3 -3
  28. package/dist/esm/components/MainMenu/helperComponents/Favorites/styles.module.css +3 -3
  29. package/dist/esm/components/MainMenu/helperComponents/MenuBottom/MenuBottom.js +2 -2
  30. package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/styles.module.css +1 -1
  31. package/dist/esm/components/MainMenu/helperComponents/MenuHeaderBrand/styles.module.css +3 -3
  32. package/dist/esm/components/MainMenu/helperComponents/MenuMobile/MenuMobile.js +2 -3
  33. package/dist/esm/components/MainMenu/helperComponents/MenuMobile/styles.module.css +1 -1
  34. package/dist/esm/components/MainMenu/helperComponents/ScrollWithAnimatedStickyPanel/ScrollWithAnimatedStickyPanel.js +6 -18
  35. package/dist/esm/components/PlatformLogo/styles.module.css +1 -1
  36. package/dist/esm/components/UserMenu/UserMenu.js +7 -8
  37. package/dist/esm/components/UserMenu/hooks/useLogoutItem.d.ts +2 -2
  38. package/dist/esm/components/UserMenu/hooks/useLogoutItem.js +9 -9
  39. package/dist/esm/components/UserMenu/hooks/useUserMenuItems.js +3 -3
  40. package/dist/esm/components/UserMenu/styles.module.css +1 -10
  41. package/dist/esm/constants.d.ts +1 -0
  42. package/dist/esm/constants.js +2 -0
  43. package/dist/esm/style.css +24 -33
  44. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  45. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  46. package/package.json +28 -28
  47. package/src/components/MainMenu/helperComponents/MenuBottom/MenuBottom.tsx +2 -2
  48. package/src/components/MainMenu/helperComponents/MenuMobile/MenuMobile.tsx +2 -3
  49. package/src/components/MainMenu/helperComponents/ScrollWithAnimatedStickyPanel/ScrollWithAnimatedStickyPanel.tsx +10 -21
  50. package/src/components/UserMenu/UserMenu.tsx +7 -11
  51. package/src/components/UserMenu/hooks/useLogoutItem.tsx +12 -12
  52. package/src/components/UserMenu/hooks/useUserMenuItems.ts +4 -4
  53. package/src/components/UserMenu/styles.module.scss +0 -11
  54. package/src/constants.ts +3 -0
@@ -13,7 +13,7 @@
13
13
  grid-column:1/-1;
14
14
  padding:0 var(--sn-primitive-dimension-4, 4px);
15
15
  border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
16
- background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
16
+ background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(136, 146, 170, 0.0784313725)));
17
17
  }
18
18
  .subcategory[data-title-only]{
19
19
  padding:var(--sn-primitive-dimension-4, 4px);
@@ -60,7 +60,7 @@
60
60
  .subcategoryDescription{
61
61
  width:100%;
62
62
  padding-bottom:var(--sn-primitive-dimension-4, 4px);
63
- color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(65, 66, 78, 0.5490196078)));
63
+ color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(0, 0, 0, 0.5803921569)));
64
64
  }
65
65
 
66
66
  .subcategoryTitleDraggable{
@@ -27,7 +27,7 @@
27
27
  }
28
28
  @media (hover: hover){
29
29
  .header:hover{
30
- background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
30
+ background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(136, 146, 170, 0.0784313725)));
31
31
  }
32
32
  .header:hover .headerActions{
33
33
  pointer-events:auto;
@@ -38,7 +38,7 @@
38
38
  .headerTitle{
39
39
  flex:1 0 0;
40
40
  min-width:0;
41
- color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
41
+ color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #000000));
42
42
  }
43
43
 
44
44
  .group{
@@ -53,7 +53,7 @@
53
53
  min-width:0;
54
54
  padding:var(--sn-primitive-dimension-4, 4px) var(--sn-primitive-dimension-8, 8px) var(--sn-primitive-dimension-8, 8px) var(--sn-primitive-dimension-12, 12px);
55
55
  border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
56
- background-color:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-brand-palette-gray-95, #fdfdfd)));
56
+ background-color:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-brand-palette-gray-95, #ffffff)));
57
57
  }
58
58
  .group[data-appear]{
59
59
  animation:group-appear 0.24s cubic-bezier(0.4, 0, 0.2, 1) backwards;
@@ -68,7 +68,7 @@
68
68
  }
69
69
  .group[data-drag-preview] .header{
70
70
  cursor:grabbing;
71
- background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
71
+ background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(136, 146, 170, 0.0784313725)));
72
72
  }
73
73
  .group[data-drag-preview] .header .headerActions{
74
74
  pointer-events:auto;
@@ -99,7 +99,7 @@
99
99
  height:var(--sn-primitive-dimension-24, 24px);
100
100
  border:none;
101
101
  border-radius:var(--sn-button-anatomy-size-s-container-borderRadius, var(--sn-brand-anatomy-radius-button-s, var(--sn-primitive-dimension-2, 2px)));
102
- color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(65, 66, 78, 0.5490196078)));
102
+ color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(0, 0, 0, 0.5803921569)));
103
103
  background-color:transparent;
104
104
  outline:none;
105
105
  }
@@ -206,11 +206,11 @@
206
206
  }
207
207
  .colorMarker[data-block-color=neutral]{
208
208
  visibility:visible;
209
- background-color:var(--sn-theme-color-neutral-decor, var(--sn-brand-color-neutral-80, var(--sn-brand-palette-gray-80, #e3e5ed)));
209
+ background-color:var(--sn-theme-color-neutral-decor, var(--sn-brand-color-neutral-80, var(--sn-brand-palette-gray-80, #e2e2e2)));
210
210
  }
211
211
  .colorMarker[data-block-color=primary]{
212
212
  visibility:visible;
213
- background-color:var(--sn-theme-color-primary-decor, var(--sn-brand-color-primary-80, #caeadb));
213
+ background-color:var(--sn-theme-color-primary-decor, var(--sn-brand-color-primary-80, #dcdcdc));
214
214
  }
215
215
  .colorMarker[data-block-color=orange]{
216
216
  visibility:visible;
@@ -2,8 +2,8 @@
2
2
  flex-shrink:0;
3
3
  width:var(--sn-primitive-dimension-40, 40px);
4
4
  height:var(--sn-primitive-dimension-40, 40px);
5
- fill:var(--sn-theme-color-neutral-decor, var(--sn-brand-color-neutral-80, var(--sn-brand-palette-gray-80, #e3e5ed)));
6
- stroke:var(--sn-theme-color-neutral-text, var(--sn-brand-color-neutral-40, var(--sn-brand-palette-gray-40, #81869c)));
5
+ fill:var(--sn-theme-color-neutral-decor, var(--sn-brand-color-neutral-80, var(--sn-brand-palette-gray-80, #e2e2e2)));
6
+ stroke:var(--sn-theme-color-neutral-text, var(--sn-brand-color-neutral-40, var(--sn-brand-palette-gray-40, #4a4a4a)));
7
7
  }
8
8
 
9
9
  .emptyState{
@@ -15,7 +15,7 @@
15
15
  }
16
16
 
17
17
  .emptyText{
18
- color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(65, 66, 78, 0.5490196078)));
18
+ color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(0, 0, 0, 0.5803921569)));
19
19
  text-align:center;
20
20
  white-space:pre-line;
21
21
  }
@@ -8,7 +8,7 @@
8
8
  min-height:var(--sn-primitive-dimension-88, 88px);
9
9
  padding:var(--sn-primitive-dimension-8, 8px) 0 0;
10
10
  border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
11
- background:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-brand-palette-gray-95, #fdfdfd)));
11
+ background:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-brand-palette-gray-95, #ffffff)));
12
12
  }
13
13
 
14
14
  .header{
@@ -35,8 +35,8 @@
35
35
  min-height:var(--sn-primitive-dimension-44, 44px);
36
36
  }
37
37
  .listScroll[data-insert-new] [data-favorite]{
38
- fill:var(--sn-theme-color-primary-accent, var(--sn-brand-color-primary-50, #389f74));
39
- stroke:var(--sn-theme-color-primary-text, var(--sn-brand-color-primary-40, #22775b));
38
+ fill:var(--sn-theme-color-primary-accent, var(--sn-brand-color-primary-50, #222222));
39
+ stroke:var(--sn-theme-color-primary-text, var(--sn-brand-color-primary-40, #0d0d0d));
40
40
  }
41
41
 
42
42
  .dropTarget{
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Divider } from '@cloud-ru/ds-divider';
3
- import { CardNavigation } from '@cloud-ru/ds-uikit-product-card-predefined';
3
+ import { CardServiceLight } from '@cloud-ru/ds-uikit-product-card-predefined';
4
4
  import { Fragment } from 'react';
5
5
  import { TEST_IDS } from '../../../../constants.js';
6
6
  import { getLinkEmblem } from '../../utils/index.js';
7
7
  import styles from './styles.module.css';
8
8
  export function MenuBottom({ settingItems, leftBottom }) {
9
- return (_jsxs("div", { className: styles.bottom, "data-test-id": TEST_IDS.mainMenu.leftBottom, children: [Boolean(settingItems?.length) && (_jsx("div", { className: styles.bottomItems, "data-test-id": TEST_IDS.mainMenu.leftBottomItems, children: settingItems?.map(item => (_jsxs(Fragment, { children: [item.divider === 'before' && _jsx(Divider, { orientation: 'horizontal', className: styles.bottomDivider }), _jsx(CardNavigation, { ...(item.href ? { href: item.href, as: 'a' } : { as: 'button', type: 'button' }), title: item.label, icon: getLinkEmblem(item), onClick: item.onClick, "data-test-id": `header__drawer-menu__setting-${item.id}` }), item.divider === 'after' && _jsx(Divider, { orientation: 'horizontal', className: styles.bottomDivider })] }, item.id))) })), leftBottom] }));
9
+ return (_jsxs("div", { className: styles.bottom, "data-test-id": TEST_IDS.mainMenu.leftBottom, children: [Boolean(settingItems?.length) && (_jsx("div", { className: styles.bottomItems, "data-test-id": TEST_IDS.mainMenu.leftBottomItems, children: settingItems?.map(item => (_jsxs(Fragment, { children: [item.divider === 'before' && _jsx(Divider, { orientation: 'horizontal', className: styles.bottomDivider }), _jsx(CardServiceLight, { ...(item.href ? { href: item.href, as: 'a' } : { as: 'button', type: 'button' }), title: item.label, icon: getLinkEmblem(item), onClick: item.onClick, "data-test-id": `header__drawer-menu__setting-${item.id}` }), item.divider === 'after' && _jsx(Divider, { orientation: 'horizontal', className: styles.bottomDivider })] }, item.id))) })), leftBottom] }));
10
10
  }
@@ -61,7 +61,7 @@
61
61
  --snack-menu-left-width:263px;
62
62
  position:relative;
63
63
  height:100vh;
64
- background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3)));
64
+ background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #f4f4f4)));
65
65
  }
66
66
 
67
67
  .menuBody{
@@ -3,7 +3,7 @@
3
3
  gap:var(--sn-primitive-dimension-4, 4px);
4
4
  align-items:center;
5
5
  box-sizing:border-box;
6
- background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3)));
6
+ background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #f4f4f4)));
7
7
  }
8
8
  .container[data-mobile]{
9
9
  gap:0;
@@ -15,8 +15,8 @@
15
15
  justify-content:flex-start;
16
16
  }
17
17
  .closeButton.closeButton[data-view=simple][data-appearance=neutral] [data-text-opacity]{
18
- color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
18
+ color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(0, 0, 0, 0.7803921569)));
19
19
  }
20
20
  .closeButton.closeButton[data-view=simple][data-appearance=neutral] [aria-hidden][data-text-opacity]{
21
- color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(65, 66, 78, 0.5490196078)));
21
+ color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(0, 0, 0, 0.5803921569)));
22
22
  }
@@ -1,8 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { Divider } from '@cloud-ru/ds-divider';
3
- import { SNAP_POINTS_PRESET } from '@cloud-ru/ds-list';
4
3
  import { useCallback, useMemo } from 'react';
5
- import { TEST_IDS } from '../../../../constants.js';
4
+ import { BOTTOM_SHEET_FULLSCREEN_SNAP_POINTS, TEST_IDS } from '../../../../constants.js';
6
5
  import { MobileDrawerCustom } from '../../../../mobileOverlays.js';
7
6
  import { MainMenuDndContext } from '../../hooks/useMainMenuDnd.js';
8
7
  import { useMenuItems } from '../../hooks/useMenuItems.js';
@@ -33,5 +32,5 @@ export function MenuMobile({ open = false, setOpen, settingItems, platformGroups
33
32
  const handleClose = useCallback(() => {
34
33
  setOpen?.(false);
35
34
  }, [setOpen]);
36
- return (_jsx(MobileDrawerCustom, { open: open, onClose: handleClose, position: 'bottom', className: styles.drawerMobile, swipeEnabled: false, "data-test-id": TEST_IDS.mainMenu.drawerMobile, closeOnPopstate: true, snapPoints: SNAP_POINTS_PRESET.full, disableMotions: true, children: _jsx(ScrollWithAnimatedStickyPanel, { panel: _jsxs(_Fragment, { children: [_jsx(MenuHeaderBrand, { logo: logo, onClose: handleClose, className: styles.menuHeader, isMobile: true }), _jsx(Divider, { orientation: 'horizontal' })] }), children: _jsxs(MountAnimation, { className: styles.scrollMobile, type: 'fade-slide-up', children: [leftTop, search && _jsx(Search, { ...search, ref: searchRef, isMobile: true }), !isSearching && favorite && _jsx(Favorites, { favorite: favorite, servicesById: servicesById, isMobile: true }), hasSegments && (_jsx(MainMenuDndContext, { children: _jsx(Content, { isMobile: true, searchValue: search && search.value, rightTop: rightTop, favorite: favorite, segments: segments, searchGroups: resultItems, segmentPrefs: segmentPrefs, activeSegmentId: activeSegmentId, onActiveSegmentChange: onActiveSegmentChange, onSegmentOrderChange: onSegmentOrderChange, onSegmentExpandedChange: onSegmentExpandedChange, onSegmentServiceClick: onSegmentServiceClick, loading: loading }) })), !isSearching && hasBottomItems && _jsx(MenuBottom, { settingItems: settingItems, leftBottom: leftBottom })] }) }) }));
35
+ return (_jsx(MobileDrawerCustom, { open: open, onClose: handleClose, position: 'bottom', className: styles.drawerMobile, swipeEnabled: false, "data-test-id": TEST_IDS.mainMenu.drawerMobile, closeOnPopstate: true, snapPoints: BOTTOM_SHEET_FULLSCREEN_SNAP_POINTS, disableMotions: true, children: _jsx(ScrollWithAnimatedStickyPanel, { panel: _jsxs(_Fragment, { children: [_jsx(MenuHeaderBrand, { logo: logo, onClose: handleClose, className: styles.menuHeader, isMobile: true }), _jsx(Divider, { orientation: 'horizontal' })] }), children: _jsxs(MountAnimation, { className: styles.scrollMobile, type: 'fade-slide-up', children: [leftTop, search && _jsx(Search, { ...search, ref: searchRef, isMobile: true }), !isSearching && favorite && _jsx(Favorites, { favorite: favorite, servicesById: servicesById, isMobile: true }), hasSegments && (_jsx(MainMenuDndContext, { children: _jsx(Content, { isMobile: true, searchValue: search && search.value, rightTop: rightTop, favorite: favorite, segments: segments, searchGroups: resultItems, segmentPrefs: segmentPrefs, activeSegmentId: activeSegmentId, onActiveSegmentChange: onActiveSegmentChange, onSegmentOrderChange: onSegmentOrderChange, onSegmentExpandedChange: onSegmentExpandedChange, onSegmentServiceClick: onSegmentServiceClick, loading: loading }) })), !isSearching && hasBottomItems && _jsx(MenuBottom, { settingItems: settingItems, leftBottom: leftBottom })] }) }) }));
37
36
  }
@@ -3,7 +3,7 @@
3
3
  }
4
4
 
5
5
  .drawerMobile{
6
- background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3))) !important;
6
+ background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #f4f4f4))) !important;
7
7
  }
8
8
 
9
9
  .scrollMobile{
@@ -2,10 +2,6 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Scroll } from '@cloud-ru/ds-scroll';
3
3
  import { useCallback, useRef, useState } from 'react';
4
4
  import styles from './styles.module.css';
5
- // Упругая прокрутка у верхней границы (touch-скролл на мобильных не "упирается" жёстко в 0 —
6
- // контент можно немного "оттянуть" дальше) даёт scrollTop, не совпадающий с реальным положением
7
- // контента в этот момент. Диапазон запаса — единицы пикселей; двух хватает с большим запасом.
8
- const TOP_OVERSCROLL_EPSILON_PX = 2;
9
5
  export function ScrollWithAnimatedStickyPanel({ panel, children }) {
10
6
  const [positions, setPositions] = useState({ panelTopShift: 0, containerScroll: 0 });
11
7
  const [panelHeight, setPanelHeight] = useState(0);
@@ -18,13 +14,6 @@ export function ScrollWithAnimatedStickyPanel({ panel, children }) {
18
14
  return;
19
15
  const panelHeight = panelRef.current.offsetHeight;
20
16
  setPanelHeight(panelHeight);
21
- // У верхней границы панель всегда полностью видна — не доверяем накопленному diff. Иначе
22
- // "лишний" ход упругой прокрутки у самого верха читается как скролл вниз и на возврате к
23
- // началу списка панель может остаться скрытой, хотя пользователь как раз скроллит наверх.
24
- if (target.scrollTop <= TOP_OVERSCROLL_EPSILON_PX) {
25
- setPositions({ panelTopShift: 0, containerScroll: target.scrollTop });
26
- return;
27
- }
28
17
  setPositions(prev => {
29
18
  const diff = prev.containerScroll - target.scrollTop;
30
19
  return {
@@ -33,11 +22,10 @@ export function ScrollWithAnimatedStickyPanel({ panel, children }) {
33
22
  };
34
23
  });
35
24
  }, []);
36
- const setPanelRef = useCallback((element) => {
37
- if (element) {
38
- setPanelHeight(element.offsetHeight);
39
- panelRef.current = element;
40
- }
41
- }, []);
42
- return (_jsxs("div", { className: styles.container, style: { '--snack-autohide-panel-height': `${panelHeight}px` }, children: [_jsx(Scroll, { barHideStrategy: 'never', overflow: { x: 'hidden' }, onScroll: handleScroll, children: children }), _jsx("div", { className: styles.panel, ref: setPanelRef, style: { top: positions.panelTopShift }, children: panel })] }));
25
+ return (_jsxs("div", { className: styles.container, style: { '--snack-autohide-panel-height': `${panelHeight}px` }, children: [_jsx(Scroll, { barHideStrategy: 'never', overflow: { x: 'hidden' }, onScroll: handleScroll, children: children }), _jsx("div", { className: styles.panel, ref: element => {
26
+ if (element) {
27
+ setPanelHeight(element.offsetHeight);
28
+ panelRef.current = element;
29
+ }
30
+ }, style: { top: positions.panelTopShift }, children: panel })] }));
43
31
  }
@@ -7,5 +7,5 @@
7
7
  height:var(--sn-primitive-dimension-24, 24px);
8
8
  border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
9
9
  color:var(--sn-theme-color-neutral-onAccent, var(--sn-brand-color-neutral-99, var(--sn-brand-palette-gray-99, #ffffff)));
10
- background:var(--sn-theme-color-neutral-accent, var(--sn-brand-color-neutral-50, var(--sn-brand-palette-gray-50, #8b8fa7)));
10
+ background:var(--sn-theme-color-neutral-accent, var(--sn-brand-color-neutral-50, var(--sn-brand-palette-gray-50, #222222)));
11
11
  }
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Avatar } from '@cloud-ru/ds-avatar';
3
- import { Droplist, SNAP_POINTS_PRESET } from '@cloud-ru/ds-list';
3
+ import { Droplist } from '@cloud-ru/ds-list';
4
4
  import { useValueControl } from '@cloud-ru/ds-utils';
5
5
  import cn from 'classnames';
6
- import { useCallback, useMemo } from 'react';
7
- import { TEST_IDS } from '../../constants.js';
6
+ import { useMemo } from 'react';
7
+ import { BOTTOM_SHEET_FULLSCREEN_SNAP_POINTS, TEST_IDS } from '../../constants.js';
8
8
  import { useDesktopComfortClassName } from '../../hooks/useDesktopComfortClassName.js';
9
9
  import { useMobileLayout } from '../../hooks/useMobileLayout.js';
10
10
  import { headerLocale } from '../../locale/index.js';
@@ -22,9 +22,6 @@ export function UserMenu({ profile = {}, open: openProp, setOpen: setOpenProp, o
22
22
  const comfortClassName = useDesktopComfortClassName();
23
23
  const [open = false, setOpen] = useValueControl({ value: openProp, onChange: setOpenProp });
24
24
  const { fullName = '', inviteCount } = profile;
25
- const handleClose = useCallback(() => {
26
- setOpen(false);
27
- }, [setOpen]);
28
25
  const { pinTop, items: menuItems, pinBottom, } = useUserMenuItems({
29
26
  isMobile,
30
27
  profile,
@@ -33,7 +30,9 @@ export function UserMenu({ profile = {}, open: openProp, setOpen: setOpenProp, o
33
30
  organizationItems,
34
31
  bottomItems,
35
32
  settingItems,
36
- onClose: handleClose,
33
+ onClose: () => {
34
+ setOpen(false);
35
+ },
37
36
  onLogout,
38
37
  });
39
38
  const trigger = useMemo(() => (_jsx(HeaderButton, { tooltip: { tip: triggerTooltip }, isMobile: isMobile, onClick: () => {
@@ -45,5 +44,5 @@ export function UserMenu({ profile = {}, open: openProp, setOpen: setOpenProp, o
45
44
  appearance: 'primary',
46
45
  }
47
46
  : undefined, "data-test-id": TEST_IDS.userMenu.button, icon: _jsx(Avatar, { appearance: 'red', size: 's', name: fullName, showTwoSymbols: true }), "data-pressed": open })), [fullName, inviteCount, onClick, open, setOpen, isMobile, triggerTooltip]);
48
- return (_jsx(Droplist, { open: open, onOpenChange: setOpen, size: 'm', selection: SELECTION_STUB, pinTop: pinTop, items: menuItems, pinBottom: pinBottom, scroll: !isMobile, trigger: 'click', placement: 'bottom-end', className: cn(styles.userMenuDroplist, comfortClassName), closeOnPopstate: true, "data-test-id": TEST_IDS.userMenu.root, label: t('user'), snapPoints: SNAP_POINTS_PRESET.full, withDividers: false, triggerClassName: styles.userMenuDroplistTrigger, children: trigger }));
47
+ return (_jsx(Droplist, { open: open, onOpenChange: setOpen, size: 'm', selection: SELECTION_STUB, pinTop: pinTop, items: menuItems, pinBottom: pinBottom, scroll: !isMobile, trigger: 'click', placement: 'bottom-end', className: cn(styles.userMenuDroplist, comfortClassName), closeOnPopstate: true, "data-test-id": TEST_IDS.userMenu.root, label: t('user'), snapPoints: BOTTOM_SHEET_FULLSCREEN_SNAP_POINTS, children: trigger }));
49
48
  }
@@ -1,4 +1,4 @@
1
- import { BaseItem } from '@cloud-ru/ds-list';
1
+ import { ListProps } from '@cloud-ru/ds-list';
2
2
  export declare function useLogoutItem({ onLogout }: {
3
3
  onLogout?(): void;
4
- }): BaseItem;
4
+ }): ListProps['items'];
@@ -2,16 +2,16 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { ExitSVG } from '@cloud-ru/ds-icons/interface/product';
3
3
  import { useMemo } from 'react';
4
4
  import { headerLocale } from '../../../locale/index.js';
5
- import styles from '../styles.module.css';
6
5
  export function useLogoutItem({ onLogout }) {
7
6
  const { t } = headerLocale.useTranslations();
8
- return useMemo(() => ({
9
- beforeContent: _jsx(ExitSVG, {}),
10
- content: {
11
- label: t('logout'),
7
+ return useMemo(() => [
8
+ {
9
+ beforeContent: _jsx(ExitSVG, {}),
10
+ content: {
11
+ label: t('logout'),
12
+ },
13
+ onClick: onLogout,
14
+ 'data-test-id': 'header__user-menu__logout',
12
15
  },
13
- className: styles.logoutItem,
14
- onClick: onLogout,
15
- 'data-test-id': 'header__user-menu__logout',
16
- }), [onLogout, t]);
16
+ ], [onLogout, t]);
17
17
  }
@@ -35,11 +35,11 @@ export function useUserMenuItems({ profile, theme, onLogout, topItems = EMPTY_AR
35
35
  }
36
36
  pinTop = pinTop.concat(topItems);
37
37
  let pinBottom = bottomItems.concat(logoutItem);
38
+ if (isMobile && Boolean(settingItems?.length)) {
39
+ pinBottom = pinBottom.concat([DIVIDER_ITEM, ...settingItems]);
40
+ }
38
41
  // В шторке прокручивается всё меню, закреплять части незачем; разделитель над организациями добавляем сами
39
42
  if (isMobile) {
40
- if (settingItems?.length) {
41
- pinBottom = [...bottomItems, ...settingItems, DIVIDER_ITEM, logoutItem];
42
- }
43
43
  return {
44
44
  pinTop: [],
45
45
  items: withClose([...pinTop, DIVIDER_ITEM, ...organizationItems, ...pinBottom]),
@@ -1,16 +1,7 @@
1
- .userMenuDroplistTrigger{
2
- display:inline-flex;
3
- }
4
-
5
1
  .userMenuDroplist{
6
2
  width:256px;
7
3
  }
8
4
 
9
5
  .profileSettingsIcon{
10
- color:var(--sn-theme-color-neutral-text, var(--sn-brand-color-neutral-40, var(--sn-brand-palette-gray-40, #81869c)));
11
- }
12
-
13
- .logoutItem span,
14
- .logoutItem svg{
15
- color:var(--sn-theme-color-red-text, var(--sn-brand-palette-red-40, #a93533));
6
+ color:var(--sn-theme-color-neutral-text, var(--sn-brand-color-neutral-40, var(--sn-brand-palette-gray-40, #4a4a4a)));
16
7
  }
@@ -26,3 +26,4 @@ export declare const TEST_IDS: {
26
26
  readonly root: "header__breadcrumbs";
27
27
  };
28
28
  };
29
+ export declare const BOTTOM_SHEET_FULLSCREEN_SNAP_POINTS: number[];
@@ -26,3 +26,5 @@ export const TEST_IDS = {
26
26
  root: 'header__breadcrumbs',
27
27
  },
28
28
  };
29
+ // Только mobile: в мастере bottomSheet панель открывается на всю высоту экрана.
30
+ export const BOTTOM_SHEET_FULLSCREEN_SNAP_POINTS = [1];
@@ -35,7 +35,7 @@
35
35
 
36
36
  .header{
37
37
  box-sizing:border-box;
38
- background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3)));
38
+ background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #f4f4f4)));
39
39
  }
40
40
  .header[data-mobile] .top{
41
41
  padding:0;
@@ -146,7 +146,7 @@
146
146
  overflow:hidden;
147
147
  flex-shrink:1;
148
148
  min-width:0;
149
- color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
149
+ color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #000000));
150
150
  text-overflow:ellipsis;
151
151
  white-space:nowrap;
152
152
  }
@@ -223,7 +223,7 @@
223
223
  grid-column:1/-1;
224
224
  padding:0 var(--sn-primitive-dimension-4, 4px);
225
225
  border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
226
- background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
226
+ background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(136, 146, 170, 0.0784313725)));
227
227
  }
228
228
  .subcategory[data-title-only]{
229
229
  padding:var(--sn-primitive-dimension-4, 4px);
@@ -270,7 +270,7 @@
270
270
  .subcategoryDescription{
271
271
  width:100%;
272
272
  padding-bottom:var(--sn-primitive-dimension-4, 4px);
273
- color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(65, 66, 78, 0.5490196078)));
273
+ color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(0, 0, 0, 0.5803921569)));
274
274
  }
275
275
 
276
276
  .subcategoryTitleDraggable{
@@ -312,7 +312,7 @@
312
312
  }
313
313
  @media (hover: hover){
314
314
  .header:hover{
315
- background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
315
+ background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(136, 146, 170, 0.0784313725)));
316
316
  }
317
317
  .header:hover .headerActions{
318
318
  pointer-events:auto;
@@ -323,7 +323,7 @@
323
323
  .headerTitle{
324
324
  flex:1 0 0;
325
325
  min-width:0;
326
- color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
326
+ color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #000000));
327
327
  }
328
328
 
329
329
  .group{
@@ -338,7 +338,7 @@
338
338
  min-width:0;
339
339
  padding:var(--sn-primitive-dimension-4, 4px) var(--sn-primitive-dimension-8, 8px) var(--sn-primitive-dimension-8, 8px) var(--sn-primitive-dimension-12, 12px);
340
340
  border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
341
- background-color:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-brand-palette-gray-95, #fdfdfd)));
341
+ background-color:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-brand-palette-gray-95, #ffffff)));
342
342
  }
343
343
  .group[data-appear]{
344
344
  animation:group-appear 0.24s cubic-bezier(0.4, 0, 0.2, 1) backwards;
@@ -353,7 +353,7 @@
353
353
  }
354
354
  .group[data-drag-preview] .header{
355
355
  cursor:grabbing;
356
- background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
356
+ background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(136, 146, 170, 0.0784313725)));
357
357
  }
358
358
  .group[data-drag-preview] .header .headerActions{
359
359
  pointer-events:auto;
@@ -384,7 +384,7 @@
384
384
  height:var(--sn-primitive-dimension-24, 24px);
385
385
  border:none;
386
386
  border-radius:var(--sn-button-anatomy-size-s-container-borderRadius, var(--sn-brand-anatomy-radius-button-s, var(--sn-primitive-dimension-2, 2px)));
387
- color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(65, 66, 78, 0.5490196078)));
387
+ color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(0, 0, 0, 0.5803921569)));
388
388
  background-color:transparent;
389
389
  outline:none;
390
390
  }
@@ -491,11 +491,11 @@
491
491
  }
492
492
  .colorMarker[data-block-color=neutral]{
493
493
  visibility:visible;
494
- background-color:var(--sn-theme-color-neutral-decor, var(--sn-brand-color-neutral-80, var(--sn-brand-palette-gray-80, #e3e5ed)));
494
+ background-color:var(--sn-theme-color-neutral-decor, var(--sn-brand-color-neutral-80, var(--sn-brand-palette-gray-80, #e2e2e2)));
495
495
  }
496
496
  .colorMarker[data-block-color=primary]{
497
497
  visibility:visible;
498
- background-color:var(--sn-theme-color-primary-decor, var(--sn-brand-color-primary-80, #caeadb));
498
+ background-color:var(--sn-theme-color-primary-decor, var(--sn-brand-color-primary-80, #dcdcdc));
499
499
  }
500
500
  .colorMarker[data-block-color=orange]{
501
501
  visibility:visible;
@@ -577,8 +577,8 @@
577
577
  flex-shrink:0;
578
578
  width:var(--sn-primitive-dimension-40, 40px);
579
579
  height:var(--sn-primitive-dimension-40, 40px);
580
- fill:var(--sn-theme-color-neutral-decor, var(--sn-brand-color-neutral-80, var(--sn-brand-palette-gray-80, #e3e5ed)));
581
- stroke:var(--sn-theme-color-neutral-text, var(--sn-brand-color-neutral-40, var(--sn-brand-palette-gray-40, #81869c)));
580
+ fill:var(--sn-theme-color-neutral-decor, var(--sn-brand-color-neutral-80, var(--sn-brand-palette-gray-80, #e2e2e2)));
581
+ stroke:var(--sn-theme-color-neutral-text, var(--sn-brand-color-neutral-40, var(--sn-brand-palette-gray-40, #4a4a4a)));
582
582
  }
583
583
 
584
584
  .emptyState{
@@ -590,7 +590,7 @@
590
590
  }
591
591
 
592
592
  .emptyText{
593
- color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(65, 66, 78, 0.5490196078)));
593
+ color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(0, 0, 0, 0.5803921569)));
594
594
  text-align:center;
595
595
  white-space:pre-line;
596
596
  }
@@ -604,7 +604,7 @@
604
604
  min-height:var(--sn-primitive-dimension-88, 88px);
605
605
  padding:var(--sn-primitive-dimension-8, 8px) 0 0;
606
606
  border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
607
- background:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-brand-palette-gray-95, #fdfdfd)));
607
+ background:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-brand-palette-gray-95, #ffffff)));
608
608
  }
609
609
 
610
610
  .header{
@@ -631,8 +631,8 @@
631
631
  min-height:var(--sn-primitive-dimension-44, 44px);
632
632
  }
633
633
  .listScroll[data-insert-new] [data-favorite]{
634
- fill:var(--sn-theme-color-primary-accent, var(--sn-brand-color-primary-50, #389f74));
635
- stroke:var(--sn-theme-color-primary-text, var(--sn-brand-color-primary-40, #22775b));
634
+ fill:var(--sn-theme-color-primary-accent, var(--sn-brand-color-primary-50, #222222));
635
+ stroke:var(--sn-theme-color-primary-text, var(--sn-brand-color-primary-40, #0d0d0d));
636
636
  }
637
637
 
638
638
  .dropTarget{
@@ -772,7 +772,7 @@
772
772
  --snack-menu-left-width:263px;
773
773
  position:relative;
774
774
  height:100vh;
775
- background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3)));
775
+ background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #f4f4f4)));
776
776
  }
777
777
 
778
778
  .menuBody{
@@ -798,7 +798,7 @@
798
798
  gap:var(--sn-primitive-dimension-4, 4px);
799
799
  align-items:center;
800
800
  box-sizing:border-box;
801
- background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3)));
801
+ background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #f4f4f4)));
802
802
  }
803
803
  .container[data-mobile]{
804
804
  gap:0;
@@ -810,17 +810,17 @@
810
810
  justify-content:flex-start;
811
811
  }
812
812
  .closeButton.closeButton[data-view=simple][data-appearance=neutral] [data-text-opacity]{
813
- color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
813
+ color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(0, 0, 0, 0.7803921569)));
814
814
  }
815
815
  .closeButton.closeButton[data-view=simple][data-appearance=neutral] [aria-hidden][data-text-opacity]{
816
- color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(65, 66, 78, 0.5490196078)));
816
+ color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(0, 0, 0, 0.5803921569)));
817
817
  }
818
818
  .menuHeader{
819
819
  height:var(--sn-primitive-dimension-40, 40px);
820
820
  }
821
821
 
822
822
  .drawerMobile{
823
- background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3))) !important;
823
+ background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #f4f4f4))) !important;
824
824
  }
825
825
 
826
826
  .scrollMobile{
@@ -949,21 +949,12 @@
949
949
  height:var(--sn-primitive-dimension-24, 24px);
950
950
  border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
951
951
  color:var(--sn-theme-color-neutral-onAccent, var(--sn-brand-color-neutral-99, var(--sn-brand-palette-gray-99, #ffffff)));
952
- background:var(--sn-theme-color-neutral-accent, var(--sn-brand-color-neutral-50, var(--sn-brand-palette-gray-50, #8b8fa7)));
952
+ background:var(--sn-theme-color-neutral-accent, var(--sn-brand-color-neutral-50, var(--sn-brand-palette-gray-50, #222222)));
953
953
  }
954
- .userMenuDroplistTrigger{
955
- display:inline-flex;
956
- }
957
-
958
954
  .userMenuDroplist{
959
955
  width:256px;
960
956
  }
961
957
 
962
958
  .profileSettingsIcon{
963
- color:var(--sn-theme-color-neutral-text, var(--sn-brand-color-neutral-40, var(--sn-brand-palette-gray-40, #81869c)));
964
- }
965
-
966
- .logoutItem span,
967
- .logoutItem svg{
968
- color:var(--sn-theme-color-red-text, var(--sn-brand-palette-red-40, #a93533));
959
+ color:var(--sn-theme-color-neutral-text, var(--sn-brand-color-neutral-40, var(--sn-brand-palette-gray-40, #4a4a4a)));
969
960
  }