@cloud-ru/ds-uikit-product-header-legacy 0.1.4-preview-ea035b95.0 → 0.1.4

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/README.md CHANGED
@@ -7,12 +7,12 @@
7
7
  ## Когда использовать
8
8
 
9
9
  - Нужна обратимо совместимая шапка и меню навигации старого кабинета на стеке `@ds/*`.
10
- - Собирается MainMenu с селектором платформ и категориями сервисов: desktop — двухколоночный drawer; mobile — левый одноколоночный drawer (или новое bottom-sheet-меню через `customMobileMenu`).
10
+ - Собирается MainMenu с селектором платформ и категориями сервисов: desktop — двухколоночный drawer; mobile — левый одноколоночный drawer.
11
11
 
12
12
  Когда **не** нужен пакет:
13
13
 
14
14
  - Новая продуктовая шапка без legacy-контрактов:
15
- - используйте **`@cloud-ru/ds-uikit-product-header`**.
15
+ - используйте актуальные layout/header-пакеты Product UI Kit.
16
16
  - Отдельная карточка сервиса вне меню:
17
17
  - используйте **`@cloud-ru/ds-uikit-product-card-predefined`**.
18
18
 
@@ -36,8 +36,7 @@ import {
36
36
 
37
37
  ## Смотри также
38
38
 
39
- - **`MainMenu`** — desktop/mobile drawer, слоты `leftTop` / `search`, интеграция с **`MenuMobile`** через `customMobileMenu`.
40
- - **`@cloud-ru/ds-uikit-product-header`** — новая шапка и mobile bottom sheet для поэтапной миграции.
39
+ - **`MainMenu`** — desktop/mobile drawer и слоты `leftTop` / `search`.
41
40
  - **`@cloud-ru/ds-uikit-product-card-predefined`** — `CardServiceLight` в сетке категорий.
42
41
  - **`@cloud-ru/ds-drawer`** — drawer, на котором собран MainMenu.
43
42
  - **`@cloud-ru/ds-adaptive`** — `AdaptiveProvider` / `layoutType` для поверхности MainMenu.
@@ -250,9 +249,9 @@ Legacy MainMenu — кнопка MainMenuSVG и адаптивный drawer на
250
249
  Legacy MainMenu (Figma `navigationOldDrawer` / `navigationOldDrawerMobile`). Кнопка с `MainMenuSVG` открывает drawer навигации.
251
250
 
252
251
  - **Desktop** — двухколоночный `@cloud-ru/ds-drawer` (`DrawerCustom`): левая колонка 256px, divider, правая с поиском и категориями.
253
- - **Mobile** — по умолчанию левый одноколоночный drawer (не BottomSheet): заголовок «Навигация», scroll-body со sticky-поиском. Через `customMobileMenu` можно подставить mobile-меню из **`@cloud-ru/ds-uikit-product-header`** (bottom sheet).
252
+ - **Mobile** — левый одноколоночный drawer (не BottomSheet): заголовок «Навигация», scroll-body со sticky-поиском.
254
253
 
255
- Поверхность выбирается через `AdaptiveProvider` (`layoutType`).
254
+ Поверхность выбирается через `AdaptiveProvider` (`layoutType`); проп `isMobile` — legacy override.
256
255
 
257
256
  ### Когда использовать
258
257
 
@@ -264,7 +263,7 @@ Legacy MainMenu (Figma `navigationOldDrawer` / `navigationOldDrawerMobile`). К
264
263
  - Только верхняя полоса без drawer:
265
264
  - используйте **`HeaderLayout`**.
266
265
  - Новая продуктовая навигация без legacy-контрактов:
267
- - используйте **`@cloud-ru/ds-uikit-product-header`**.
266
+ - используйте актуальные layout/header-пакеты Product UI Kit.
268
267
 
269
268
  ### Анатомия
270
269
 
@@ -293,19 +292,11 @@ Legacy MainMenu (Figma `navigationOldDrawer` / `navigationOldDrawerMobile`). К
293
292
  1. `leftTop` — в микрофронте и Figma: два `PlatformSelector` (платформа + проект с `avatarName`).
294
293
  2. `search` — свёрнутый `NavigationSearch`; при скролле остаётся sticky (`position: sticky`).
295
294
  3. `rightTop` — баннеры в колонку (`data-mobile` на контейнере).
296
- 4. `serviceGroups` — те же категории в сетке из одной колонки (`data-mobile` на `.services`); favorite на карточках всегда виден.
297
- 5. `settingItems` — `CardServiceLight` + `Divider` внизу scroll-body.
295
+ 4. `serviceGroups` — те же категории; favorite на карточках всегда виден.
296
+ 5. `settingItems` — `@cloud-ru/ds-list` с divider внизу.
298
297
 
299
298
  `sidebarBottomSlot` на mobile **не** рендерится (legacy-поведение).
300
299
 
301
- #### customMobileMenu
302
-
303
- Только на mobile: заменяет встроенный legacy `MenuMobile` (левый drawer). Типичный сценарий — микрофронт с legacy `HeaderLayout` и новым mobile-меню из `@cloud-ru/ds-uikit-product-header`.
304
-
305
- - `MenuMobile` импортируется из `@cloud-ru/ds-uikit-product-header`, **не** из `@cloud-ru/ds-uikit-product-header-legacy`.
306
- - Передаются те же controlled `open` / `setOpen`, что и в `MainMenu` — иначе кнопка-триггер и drawer разойдутся.
307
- - Данные для `MenuMobile` маппятся на API нового header (`segments`, `settingItems` и т.д.) отдельно от legacy-пропов `MainMenu`.
308
-
309
300
  #### open / setOpen
310
301
 
311
302
  Controlled-открытие drawer. Без `open` состояние держит сам компонент. В примерах drawer закрыт до клика по trigger.
@@ -505,44 +496,12 @@ export function MobileSurface() {
505
496
  }
506
497
  ```
507
498
 
508
- #### Новое mobile-меню через `customMobileMenu`
509
-
510
- Controlled-состояние drawer общее для trigger и mobile-меню:
511
-
512
- ```tsx
513
- import { useState } from 'react';
514
- import { MainMenu } from '@cloud-ru/ds-uikit-product-header-legacy';
515
- import { MenuMobile } from '@cloud-ru/ds-uikit-product-header';
516
-
517
- function HeaderMainMenu() {
518
- const [open, setOpen] = useState(false);
519
-
520
- return (
521
- <MainMenu
522
- open={open}
523
- setOpen={setOpen}
524
- serviceGroups={legacyServiceGroups}
525
- /* …остальные legacy-пропы для desktop… */
526
- customMobileMenu={
527
- <MenuMobile
528
- open={open}
529
- setOpen={setOpen}
530
- segments={headerSegments}
531
- /* …пропы API @cloud-ru/ds-uikit-product-header… */
532
- />
533
- }
534
- />
535
- );
536
- }
537
- ```
538
-
539
499
  ### Props
540
500
 
541
501
  **WithSupportProps**
542
502
 
543
503
  | Prop | Type | Default | Description |
544
504
  |------|------|---------|-------------|
545
- | `customMobileMenu` | `ReactNode` | — | Только mobile: заменяет legacy `MenuMobile` (левый drawer). <br/> Например, `MenuMobile` из `@cloud-ru/ds-uikit-product-header` (bottom sheet). <br/> Передавайте те же `open` / `setOpen`, что и в `MainMenu` (controlled), иначе триггер и кастомное меню разойдутся. |
546
505
  | `data-test-id` | `string` | — | |
547
506
  | `disabled` | `boolean` | — | |
548
507
  | `favorite` | `{ value: string[]; onChange: (productId: string) => (addingValue: boolean) => void; }` | — | |
@@ -554,7 +513,7 @@ function HeaderMainMenu() {
554
513
  | `search` | `SearchProps` | — | |
555
514
  | `serviceGroups` | `LinksGroup[]` | — | Основные группы облачных сервисов (инфраструктура, сеть, хранилище и т.п.). <br/> Всегда видны в сетке карточек при пустом поиске; участвуют в избранном и боковой навигации. <br/> При поиске фильтруются вместе с остальными группами и показываются **первыми** в выдаче. |
556
515
  | `setOpen` | `((open: boolean) => void)` | — | |
557
- | `settingItems` | `LinksGroup` | — | Административные сервисы (одна группа, например «Административные сервисы»). <br/> Без поиска: пункты в нижней части левой колонки (desktop), не в сетке карточек. <br/> С поиском: группа попадает в результаты только при совпадении; отображается **последней** <br/> (ниже `serviceGroups` и `platformGroups`). Обычно `favoritesEnabled: false`. <br/> Mobile: `CardServiceLight` + `Divider` внизу scroll-body. |
516
+ | `settingItems` | `LinksGroup` | — | Административные сервисы (одна группа, например «Административные сервисы»). <br/> Без поиска: пункты в нижней части левой колонки (desktop), не в сетке карточек. <br/> С поиском: группа попадает в результаты только при совпадении; отображается **последней** <br/> (ниже `serviceGroups` и `platformGroups`). Обычно `favoritesEnabled: false`. |
558
517
  | `sidebarBottomSlot` | `ReactNode` | — | Нижний слот левой колонки sidebar (Figma `bottom > items`). |
559
518
 
560
519
  ### Storybook
@@ -566,23 +525,18 @@ WithSampleContent (Figma mobile composition):
566
525
  Desktop (`navigationOldDrawer`):
567
526
 
568
527
  Mobile (`navigationOldDrawerMobile`):
569
-
570
- ### Смотри также
571
-
572
- - **`@cloud-ru/ds-uikit-product-header` / MainMenu** — новое меню и экспорт `MenuMobile` (bottom sheet) для `customMobileMenu`.
573
- - **`@cloud-ru/ds-uikit-product-card-predefined`** — `CardServiceLight` в сетке категорий и в `settingItems` на mobile.
574
528
  ### Адаптивность
575
529
 
576
530
  Desktop-first: раскладку берёт `AdaptiveProvider` в корне приложения / Storybook. Переключение toolbar `layoutType=mobile` показывает mobile-поверхность без смены API.
577
531
 
578
532
  | Проп | Desktop | Mobile |
579
533
  |------|---------|--------|
580
- | `customMobileMenu` | | Заменяет legacy `MenuMobile`; без пропа — левый drawer |
534
+ | `isMobile` | Явный override поверхности; без пропа — из контекста | То же |
581
535
  | `sidebarBottomSlot` | Нижний слот левой колонки | Не рендерится |
582
- | `settingItems` | Карточки в левой колонке | `CardServiceLight` + `Divider` внизу scroll-body |
536
+ | `settingItems` | Карточки в левой колонке | `@cloud-ru/ds-list` внизу scroll-body |
583
537
  | `leftTop` | Один селектор платформы | Платформа + проект (два `PlatformSelector`) |
584
538
  | `search` | Вне Scroll, всегда развёрнут | Sticky в scroll-body, сначала свёрнут |
585
- | `rightTop` / `serviceGroups` | Правая колонка | Одноколоночный scroll-body; сетка сервисов — 1 колонка |
539
+ | `rightTop` / `serviceGroups` | Правая колонка | Одноколоночный scroll-body |
586
540
 
587
541
  Форс конкретной раскладки в Storybook — toolbar-global `layoutType` или вложенный `AdaptiveProvider` / `withLayoutType`.
588
542
 
@@ -4,6 +4,6 @@ import { MainMenuProps } from './types';
4
4
  /**
5
5
  * Legacy MainMenu: desktop — двухколоночный drawer; mobile — левый одноколоночный drawer.
6
6
  */
7
- export declare function MainMenu({ open: openProp, setOpen: setOpenProp, leftTop, rightTop, settingItems, serviceGroups, platformGroups, onLinkChange, favorite, search, sidebarBottomSlot, customMobileMenu, disabled, ...rest }: WithSupportProps<MainMenuProps & {
7
+ export declare function MainMenu({ open: openProp, setOpen: setOpenProp, leftTop, rightTop, settingItems, serviceGroups, platformGroups, onLinkChange, favorite, search, sidebarBottomSlot, disabled, ...rest }: WithSupportProps<MainMenuProps & {
8
8
  disabled?: boolean;
9
9
  }>): ReactElement;
@@ -12,21 +12,9 @@ const MenuMobile_1 = require("./helperComponents/MenuMobile");
12
12
  /**
13
13
  * Legacy MainMenu: desktop — двухколоночный drawer; mobile — левый одноколоночный drawer.
14
14
  */
15
- function MainMenu({ open: openProp, setOpen: setOpenProp, leftTop, rightTop, settingItems, serviceGroups, platformGroups, onLinkChange, favorite, search, sidebarBottomSlot, customMobileMenu, disabled, ...rest }) {
15
+ function MainMenu({ open: openProp, setOpen: setOpenProp, leftTop, rightTop, settingItems, serviceGroups, platformGroups, onLinkChange, favorite, search, sidebarBottomSlot, disabled, ...rest }) {
16
16
  const [open = false, setOpen] = (0, utils_1.useValueControl)({ value: openProp, onChange: setOpenProp });
17
17
  const isMobile = (0, useMobileLayout_1.useMobileLayout)();
18
- const menuProps = {
19
- open,
20
- setOpen,
21
- leftTop,
22
- rightTop,
23
- settingItems,
24
- serviceGroups,
25
- platformGroups,
26
- onLinkChange,
27
- favorite,
28
- search,
29
- sidebarBottomSlot,
30
- };
31
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(button_1.Button, { ...(0, utils_1.extractSupportProps)(rest), appearance: 'neutral', view: 'simple', size: 'm', disabled: disabled, icon: (0, jsx_runtime_1.jsx)(product_1.MainMenuSVG, {}), onClick: () => setOpen(true), "data-test-id": constants_1.TEST_IDS.trigger }), isMobile ? (customMobileMenu ?? (0, jsx_runtime_1.jsx)(MenuMobile_1.MenuMobile, { ...menuProps })) : (0, jsx_runtime_1.jsx)(MenuDesktop_1.MenuDesktop, { ...menuProps })] }));
18
+ const MenuComponent = isMobile ? MenuMobile_1.MenuMobile : MenuDesktop_1.MenuDesktop;
19
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(button_1.Button, { ...(0, utils_1.extractSupportProps)(rest), appearance: 'neutral', view: 'simple', size: 'm', disabled: disabled, icon: (0, jsx_runtime_1.jsx)(product_1.MainMenuSVG, {}), onClick: () => setOpen(true), "data-test-id": constants_1.TEST_IDS.trigger }), (0, jsx_runtime_1.jsx)(MenuComponent, { open: open, setOpen: setOpen, leftTop: leftTop, rightTop: rightTop, settingItems: settingItems, serviceGroups: serviceGroups, platformGroups: platformGroups, onLinkChange: onLinkChange, favorite: favorite, search: search, sidebarBottomSlot: sidebarBottomSlot })] }));
32
20
  }
@@ -102,8 +102,6 @@ export type MainMenuProps = {
102
102
  * Без поиска: пункты в нижней части левой колонки (desktop), не в сетке карточек.
103
103
  * С поиском: группа попадает в результаты только при совпадении; отображается **последней**
104
104
  * (ниже `serviceGroups` и `platformGroups`). Обычно `favoritesEnabled: false`.
105
- *
106
- * Mobile: `CardServiceLight` + `Divider` внизу scroll-body.
107
105
  */
108
106
  settingItems?: LinksGroup;
109
107
  /**
@@ -129,12 +127,5 @@ export type MainMenuProps = {
129
127
  search?: SearchProps;
130
128
  /** Нижний слот левой колонки sidebar (Figma `bottom > items`). */
131
129
  sidebarBottomSlot?: ReactNode;
132
- /**
133
- * Только mobile: заменяет legacy `MenuMobile` (левый drawer).
134
- * Например, `MenuMobile` из `@cloud-ru/ds-uikit-product-header` (bottom sheet).
135
- *
136
- * Передавайте те же `open` / `setOpen`, что и в `MainMenu` (controlled), иначе триггер и кастомное меню разойдутся.
137
- */
138
- customMobileMenu?: ReactNode;
139
130
  };
140
131
  export {};
@@ -4,6 +4,6 @@ import { MainMenuProps } from './types.js';
4
4
  /**
5
5
  * Legacy MainMenu: desktop — двухколоночный drawer; mobile — левый одноколоночный drawer.
6
6
  */
7
- export declare function MainMenu({ open: openProp, setOpen: setOpenProp, leftTop, rightTop, settingItems, serviceGroups, platformGroups, onLinkChange, favorite, search, sidebarBottomSlot, customMobileMenu, disabled, ...rest }: WithSupportProps<MainMenuProps & {
7
+ export declare function MainMenu({ open: openProp, setOpen: setOpenProp, leftTop, rightTop, settingItems, serviceGroups, platformGroups, onLinkChange, favorite, search, sidebarBottomSlot, disabled, ...rest }: WithSupportProps<MainMenuProps & {
8
8
  disabled?: boolean;
9
9
  }>): ReactElement;
@@ -9,21 +9,9 @@ import { MenuMobile } from './helperComponents/MenuMobile/index.js';
9
9
  /**
10
10
  * Legacy MainMenu: desktop — двухколоночный drawer; mobile — левый одноколоночный drawer.
11
11
  */
12
- export function MainMenu({ open: openProp, setOpen: setOpenProp, leftTop, rightTop, settingItems, serviceGroups, platformGroups, onLinkChange, favorite, search, sidebarBottomSlot, customMobileMenu, disabled, ...rest }) {
12
+ export function MainMenu({ open: openProp, setOpen: setOpenProp, leftTop, rightTop, settingItems, serviceGroups, platformGroups, onLinkChange, favorite, search, sidebarBottomSlot, disabled, ...rest }) {
13
13
  const [open = false, setOpen] = useValueControl({ value: openProp, onChange: setOpenProp });
14
14
  const isMobile = useMobileLayout();
15
- const menuProps = {
16
- open,
17
- setOpen,
18
- leftTop,
19
- rightTop,
20
- settingItems,
21
- serviceGroups,
22
- platformGroups,
23
- onLinkChange,
24
- favorite,
25
- search,
26
- sidebarBottomSlot,
27
- };
28
- return (_jsxs(_Fragment, { children: [_jsx(Button, { ...extractSupportProps(rest), appearance: 'neutral', view: 'simple', size: 'm', disabled: disabled, icon: _jsx(MainMenuSVG, {}), onClick: () => setOpen(true), "data-test-id": TEST_IDS.trigger }), isMobile ? (customMobileMenu ?? _jsx(MenuMobile, { ...menuProps })) : _jsx(MenuDesktop, { ...menuProps })] }));
15
+ const MenuComponent = isMobile ? MenuMobile : MenuDesktop;
16
+ return (_jsxs(_Fragment, { children: [_jsx(Button, { ...extractSupportProps(rest), appearance: 'neutral', view: 'simple', size: 'm', disabled: disabled, icon: _jsx(MainMenuSVG, {}), onClick: () => setOpen(true), "data-test-id": TEST_IDS.trigger }), _jsx(MenuComponent, { open: open, setOpen: setOpen, leftTop: leftTop, rightTop: rightTop, settingItems: settingItems, serviceGroups: serviceGroups, platformGroups: platformGroups, onLinkChange: onLinkChange, favorite: favorite, search: search, sidebarBottomSlot: sidebarBottomSlot })] }));
29
17
  }
@@ -102,8 +102,6 @@ export type MainMenuProps = {
102
102
  * Без поиска: пункты в нижней части левой колонки (desktop), не в сетке карточек.
103
103
  * С поиском: группа попадает в результаты только при совпадении; отображается **последней**
104
104
  * (ниже `serviceGroups` и `platformGroups`). Обычно `favoritesEnabled: false`.
105
- *
106
- * Mobile: `CardServiceLight` + `Divider` внизу scroll-body.
107
105
  */
108
106
  settingItems?: LinksGroup;
109
107
  /**
@@ -129,12 +127,5 @@ export type MainMenuProps = {
129
127
  search?: SearchProps;
130
128
  /** Нижний слот левой колонки sidebar (Figma `bottom > items`). */
131
129
  sidebarBottomSlot?: ReactNode;
132
- /**
133
- * Только mobile: заменяет legacy `MenuMobile` (левый drawer).
134
- * Например, `MenuMobile` из `@cloud-ru/ds-uikit-product-header` (bottom sheet).
135
- *
136
- * Передавайте те же `open` / `setOpen`, что и в `MainMenu` (controlled), иначе триггер и кастомное меню разойдутся.
137
- */
138
- customMobileMenu?: ReactNode;
139
130
  };
140
131
  export {};