@cloud-ru/ds-uikit-product-header 1.5.2-preview-b174c2b1.0 → 1.5.2
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/CHANGELOG.md +4 -0
- package/README.md +91 -91
- package/dist/cjs/components/HeaderButton/HeaderButton.d.ts +0 -1
- package/dist/cjs/components/HeaderLayout/HeaderLayout.d.ts +0 -6
- package/dist/cjs/components/Logo/Logo.d.ts +0 -7
- package/dist/cjs/components/MainMenu/MainMenu.js +6 -9
- package/dist/cjs/components/MainMenu/helperComponents/Content/Content.d.ts +0 -6
- package/dist/cjs/components/MainMenu/helperComponents/Content/Content.js +11 -35
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/ContentToolbar.d.ts +0 -9
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.d.ts +4 -23
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.js +10 -38
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.d.ts +4 -7
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.js +4 -9
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.d.ts +0 -2
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +1 -3
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +4 -6
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupSkeleton.d.ts +0 -1
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.d.ts +4 -9
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.js +12 -17
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.d.ts +3 -8
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.js +18 -24
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +0 -17
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.js +2 -4
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.d.ts +4 -4
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.js +3 -3
- package/dist/cjs/components/MainMenu/helperComponents/Content/styles.module.css +0 -16
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/Favorites.d.ts +4 -4
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/Favorites.js +33 -15
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.d.ts +1 -4
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.js +2 -4
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.d.ts +19 -0
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.js +30 -0
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.d.ts +1 -7
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.js +2 -4
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/index.d.ts +1 -2
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/index.js +1 -2
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesDnd.d.ts +25 -0
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/{useFavoritesReorder.js → useFavoritesDnd.js} +22 -21
- package/dist/cjs/components/MainMenu/helperComponents/MenuBottom/MenuBottom.d.ts +0 -2
- package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.d.ts +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +7 -7
- package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/styles.module.css +5 -0
- package/dist/cjs/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.d.ts +0 -3
- package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/MenuMobile.d.ts +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/MenuMobile.js +6 -5
- package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/styles.module.css +7 -0
- package/dist/cjs/components/MainMenu/helperComponents/MountAnimation/MountAnimation.d.ts +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/MountAnimation/MountAnimation.js +1 -4
- package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/ServiceCard.d.ts +6 -30
- package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/ServiceCard.js +21 -30
- package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/styles.module.css +1 -6
- package/dist/cjs/components/MainMenu/hooks/useMainMenuDnd.d.ts +4 -6
- package/dist/cjs/components/MainMenu/hooks/useMainMenuDnd.js +6 -4
- package/dist/cjs/components/MainMenu/hooks/useMenuItems.js +7 -12
- package/dist/cjs/components/MainMenu/types.d.ts +1 -31
- package/dist/cjs/components/MainMenu/utils/filterLinksGroupsFuzzy.d.ts +0 -5
- package/dist/cjs/components/MainMenu/utils/filterLinksGroupsFuzzy.js +7 -21
- package/dist/cjs/components/MainMenu/utils/flatLinksGroups.d.ts +0 -2
- package/dist/cjs/components/MainMenu/utils/flatLinksGroups.js +0 -5
- package/dist/cjs/components/MainMenu/utils/resolveInnerLinksByIds.d.ts +2 -2
- package/dist/cjs/components/MainMenu/utils/resolveInnerLinksByIds.js +4 -2
- package/dist/cjs/components/PathBreadcrumbs/PathBreadcrumbs.d.ts +0 -2
- package/dist/cjs/components/UserMenu/UserMenu.d.ts +0 -13
- package/dist/cjs/components/UserMenu/types.d.ts +0 -7
- package/dist/cjs/style.css +13 -39
- package/dist/esm/components/HeaderButton/HeaderButton.d.ts +0 -1
- package/dist/esm/components/HeaderLayout/HeaderLayout.d.ts +0 -6
- package/dist/esm/components/Logo/Logo.d.ts +0 -7
- package/dist/esm/components/MainMenu/MainMenu.js +7 -10
- package/dist/esm/components/MainMenu/helperComponents/Content/Content.d.ts +0 -6
- package/dist/esm/components/MainMenu/helperComponents/Content/Content.js +13 -37
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/ContentToolbar.d.ts +0 -9
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.d.ts +4 -23
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.js +9 -37
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.d.ts +4 -7
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.js +4 -9
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.d.ts +0 -2
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +1 -3
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +3 -5
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupSkeleton.d.ts +0 -1
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.d.ts +4 -9
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.js +13 -18
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.d.ts +3 -8
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.js +19 -25
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +0 -17
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.js +2 -4
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.d.ts +4 -4
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.js +3 -3
- package/dist/esm/components/MainMenu/helperComponents/Content/styles.module.css +0 -16
- package/dist/esm/components/MainMenu/helperComponents/Favorites/Favorites.d.ts +4 -4
- package/dist/esm/components/MainMenu/helperComponents/Favorites/Favorites.js +35 -17
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.d.ts +1 -4
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.js +1 -3
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.d.ts +19 -0
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.js +24 -0
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.d.ts +1 -7
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.js +1 -3
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/index.d.ts +1 -2
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/index.js +1 -2
- package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesDnd.d.ts +25 -0
- package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/{useFavoritesReorder.js → useFavoritesDnd.js} +22 -21
- package/dist/esm/components/MainMenu/helperComponents/MenuBottom/MenuBottom.d.ts +0 -2
- package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.d.ts +1 -1
- package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +7 -7
- package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/styles.module.css +5 -0
- package/dist/esm/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.d.ts +0 -3
- package/dist/esm/components/MainMenu/helperComponents/MenuMobile/MenuMobile.d.ts +1 -1
- package/dist/esm/components/MainMenu/helperComponents/MenuMobile/MenuMobile.js +6 -5
- package/dist/esm/components/MainMenu/helperComponents/MenuMobile/styles.module.css +7 -0
- package/dist/esm/components/MainMenu/helperComponents/MountAnimation/MountAnimation.d.ts +1 -1
- package/dist/esm/components/MainMenu/helperComponents/MountAnimation/MountAnimation.js +1 -4
- package/dist/esm/components/MainMenu/helperComponents/ServiceCard/ServiceCard.d.ts +6 -30
- package/dist/esm/components/MainMenu/helperComponents/ServiceCard/ServiceCard.js +20 -30
- package/dist/esm/components/MainMenu/helperComponents/ServiceCard/styles.module.css +1 -6
- package/dist/esm/components/MainMenu/hooks/useMainMenuDnd.d.ts +4 -6
- package/dist/esm/components/MainMenu/hooks/useMainMenuDnd.js +8 -6
- package/dist/esm/components/MainMenu/hooks/useMenuItems.js +8 -13
- package/dist/esm/components/MainMenu/types.d.ts +1 -31
- package/dist/esm/components/MainMenu/utils/filterLinksGroupsFuzzy.d.ts +0 -5
- package/dist/esm/components/MainMenu/utils/filterLinksGroupsFuzzy.js +7 -20
- package/dist/esm/components/MainMenu/utils/flatLinksGroups.d.ts +0 -2
- package/dist/esm/components/MainMenu/utils/flatLinksGroups.js +0 -4
- package/dist/esm/components/MainMenu/utils/resolveInnerLinksByIds.d.ts +2 -2
- package/dist/esm/components/MainMenu/utils/resolveInnerLinksByIds.js +4 -2
- package/dist/esm/components/PathBreadcrumbs/PathBreadcrumbs.d.ts +0 -2
- package/dist/esm/components/UserMenu/UserMenu.d.ts +0 -13
- package/dist/esm/components/UserMenu/types.d.ts +0 -7
- package/dist/esm/style.css +13 -39
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +28 -28
- package/src/components/HeaderButton/HeaderButton.tsx +0 -1
- package/src/components/HeaderLayout/HeaderLayout.tsx +0 -6
- package/src/components/Logo/Logo.tsx +0 -7
- package/src/components/MainMenu/MainMenu.tsx +6 -11
- package/src/components/MainMenu/helperComponents/Content/Content.tsx +59 -104
- package/src/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/ContentToolbar.tsx +0 -9
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.tsx +47 -106
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.tsx +30 -20
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.tsx +0 -2
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.tsx +6 -11
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupSkeleton.tsx +0 -1
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.tsx +87 -72
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.tsx +48 -65
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.scss +0 -27
- package/src/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.ts +2 -4
- package/src/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.tsx +7 -8
- package/src/components/MainMenu/helperComponents/Content/styles.module.scss +0 -19
- package/src/components/MainMenu/helperComponents/Favorites/Favorites.tsx +82 -43
- package/src/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.tsx +1 -6
- package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.tsx +78 -0
- package/src/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.tsx +1 -8
- package/src/components/MainMenu/helperComponents/Favorites/components/index.ts +1 -2
- package/src/components/MainMenu/helperComponents/Favorites/hooks/{useFavoritesReorder.tsx → useFavoritesDnd.tsx} +30 -32
- package/src/components/MainMenu/helperComponents/MenuBottom/MenuBottom.tsx +0 -2
- package/src/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.tsx +11 -17
- package/src/components/MainMenu/helperComponents/MenuDesktop/styles.module.scss +6 -0
- package/src/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.tsx +0 -3
- package/src/components/MainMenu/helperComponents/MenuMobile/MenuMobile.tsx +10 -7
- package/src/components/MainMenu/helperComponents/MenuMobile/styles.module.scss +7 -0
- package/src/components/MainMenu/helperComponents/MountAnimation/MountAnimation.tsx +1 -5
- package/src/components/MainMenu/helperComponents/ServiceCard/ServiceCard.tsx +41 -92
- package/src/components/MainMenu/helperComponents/ServiceCard/styles.module.scss +1 -7
- package/src/components/MainMenu/hooks/useMainMenuDnd.tsx +12 -9
- package/src/components/MainMenu/hooks/useMenuItems.tsx +10 -34
- package/src/components/MainMenu/types.ts +1 -31
- package/src/components/MainMenu/utils/filterLinksGroupsFuzzy.ts +8 -29
- package/src/components/MainMenu/utils/flatLinksGroups.ts +0 -5
- package/src/components/MainMenu/utils/resolveInnerLinksByIds.ts +6 -3
- package/src/components/PathBreadcrumbs/PathBreadcrumbs.tsx +0 -2
- package/src/components/UserMenu/UserMenu.tsx +0 -13
- package/src/components/UserMenu/types.ts +0 -7
- package/dist/cjs/components/MainMenu/helperComponents/Content/cardsContext.d.ts +0 -20
- package/dist/cjs/components/MainMenu/helperComponents/Content/cardsContext.js +0 -17
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.d.ts +0 -12
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.js +0 -39
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.d.ts +0 -35
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.js +0 -27
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesList.d.ts +0 -21
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesList.js +0 -31
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.d.ts +0 -28
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.js +0 -20
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.d.ts +0 -24
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.js +0 -36
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/RecentList.d.ts +0 -24
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/RecentList.js +0 -30
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.d.ts +0 -16
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.js +0 -28
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesReorder.d.ts +0 -30
- package/dist/cjs/utils/noop.d.ts +0 -1
- package/dist/cjs/utils/noop.js +0 -5
- package/dist/esm/components/MainMenu/helperComponents/Content/cardsContext.d.ts +0 -20
- package/dist/esm/components/MainMenu/helperComponents/Content/cardsContext.js +0 -13
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.d.ts +0 -12
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.js +0 -35
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.d.ts +0 -35
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.js +0 -24
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesList.d.ts +0 -21
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesList.js +0 -25
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.d.ts +0 -28
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.js +0 -17
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.d.ts +0 -24
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.js +0 -30
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/RecentList.d.ts +0 -24
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/RecentList.js +0 -24
- package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.d.ts +0 -16
- package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.js +0 -25
- package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesReorder.d.ts +0 -30
- package/dist/esm/utils/noop.d.ts +0 -1
- package/dist/esm/utils/noop.js +0 -1
- package/src/components/MainMenu/helperComponents/Content/cardsContext.ts +0 -36
- package/src/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.ts +0 -46
- package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.tsx +0 -71
- package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesList.tsx +0 -59
- package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.tsx +0 -60
- package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.tsx +0 -75
- package/src/components/MainMenu/helperComponents/Favorites/components/RecentList.tsx +0 -62
- package/src/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.ts +0 -32
- package/src/utils/noop.ts +0 -1
package/dist/cjs/style.css
CHANGED
|
@@ -320,8 +320,6 @@
|
|
|
320
320
|
}
|
|
321
321
|
|
|
322
322
|
.group{
|
|
323
|
-
content-visibility:auto;
|
|
324
|
-
contain-intrinsic-size:auto var(--sn-primitive-dimension-128, 128px);
|
|
325
323
|
position:relative;
|
|
326
324
|
overflow-x:clip;
|
|
327
325
|
display:flex;
|
|
@@ -332,14 +330,6 @@
|
|
|
332
330
|
border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
|
|
333
331
|
background-color:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-brand-palette-gray-95, #fdfdfd)));
|
|
334
332
|
}
|
|
335
|
-
.group[data-appear]{
|
|
336
|
-
animation:group-appear 0.24s cubic-bezier(0.4, 0, 0.2, 1) backwards;
|
|
337
|
-
}
|
|
338
|
-
@media (prefers-reduced-motion: reduce){
|
|
339
|
-
.group[data-appear]{
|
|
340
|
-
animation:none;
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
333
|
.group[data-drag-preview]{
|
|
344
334
|
cursor:grabbing;
|
|
345
335
|
}
|
|
@@ -518,23 +508,6 @@
|
|
|
518
508
|
.skeletonService{
|
|
519
509
|
padding:var(--sn-primitive-dimension-4, 4px);
|
|
520
510
|
}
|
|
521
|
-
|
|
522
|
-
@keyframes group-appear{
|
|
523
|
-
from{
|
|
524
|
-
transform:translate(calc(-1 * var(--sn-primitive-dimension-12, 12px)), var(--sn-primitive-dimension-4, 4px));
|
|
525
|
-
opacity:0;
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
.content{
|
|
529
|
-
display:flex;
|
|
530
|
-
flex-direction:column;
|
|
531
|
-
gap:var(--sn-primitive-dimension-4, 4px);
|
|
532
|
-
width:100%;
|
|
533
|
-
min-width:0;
|
|
534
|
-
}
|
|
535
|
-
.content[data-mobile]{
|
|
536
|
-
gap:var(--sn-primitive-dimension-8, 8px);
|
|
537
|
-
}
|
|
538
511
|
.content[data-empty]{
|
|
539
512
|
height:100%;
|
|
540
513
|
}
|
|
@@ -542,12 +515,6 @@
|
|
|
542
515
|
flex:1 1 auto;
|
|
543
516
|
}
|
|
544
517
|
|
|
545
|
-
.top{
|
|
546
|
-
display:flex;
|
|
547
|
-
flex-direction:column;
|
|
548
|
-
gap:inherit;
|
|
549
|
-
}
|
|
550
|
-
|
|
551
518
|
.noData{
|
|
552
519
|
flex:1 1 auto;
|
|
553
520
|
place-self:center center;
|
|
@@ -735,6 +702,11 @@
|
|
|
735
702
|
.rightContent{
|
|
736
703
|
container-type:inline-size;
|
|
737
704
|
overflow-x:clip;
|
|
705
|
+
display:flex;
|
|
706
|
+
flex-direction:column;
|
|
707
|
+
gap:var(--sn-primitive-dimension-4, 4px);
|
|
708
|
+
width:100%;
|
|
709
|
+
min-width:0;
|
|
738
710
|
padding:var(--sn-primitive-dimension-16, 16px);
|
|
739
711
|
}
|
|
740
712
|
|
|
@@ -786,6 +758,13 @@
|
|
|
786
758
|
padding:0 var(--sn-primitive-dimension-4, 4px);
|
|
787
759
|
}
|
|
788
760
|
|
|
761
|
+
.rightContent{
|
|
762
|
+
display:flex;
|
|
763
|
+
flex-direction:column;
|
|
764
|
+
gap:var(--sn-primitive-dimension-8, 8px);
|
|
765
|
+
min-width:0;
|
|
766
|
+
}
|
|
767
|
+
|
|
789
768
|
.drawerMobile{
|
|
790
769
|
background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3))) !important;
|
|
791
770
|
}
|
|
@@ -887,15 +866,10 @@
|
|
|
887
866
|
border-radius:var(--sn-density-radius-3xs, var(--sn-platform-comfort-radius-3xs, var(--sn-primitive-dimension-2, 2px)));
|
|
888
867
|
}
|
|
889
868
|
|
|
890
|
-
.draggableCard
|
|
891
|
-
.staticCard{
|
|
869
|
+
.draggableCard{
|
|
892
870
|
display:flex;
|
|
893
871
|
min-width:0;
|
|
894
872
|
}
|
|
895
|
-
|
|
896
|
-
.staticCard{
|
|
897
|
-
position:relative;
|
|
898
|
-
}
|
|
899
873
|
.breadcrumbs{
|
|
900
874
|
display:flex;
|
|
901
875
|
align-items:center;
|
|
@@ -4,7 +4,6 @@ import { ElementType } from 'react';
|
|
|
4
4
|
export type HeaderButtonProps<T extends ElementType = 'button'> = Omit<ButtonProps<T>, 'size' | 'appearance' | 'view'> & {
|
|
5
5
|
/** Настройки тултипа. `placement` и `disableSpanWrapper` зафиксированы под анатомию хедера */
|
|
6
6
|
tooltip?: Omit<TooltipProps, 'placement'>;
|
|
7
|
-
/** Мобильная раскладка — тултип не показывается (на mobile нет hover). */
|
|
8
7
|
isMobile?: boolean;
|
|
9
8
|
};
|
|
10
9
|
/**
|
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
import { WithSupportProps } from '@cloud-ru/ds-utils';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
export type HeaderLayoutProps = WithSupportProps<{
|
|
4
|
-
/** CSS-класс корневого элемента. */
|
|
5
4
|
className?: string;
|
|
6
|
-
/** Слот главного меню (слева, после логотипа). */
|
|
7
5
|
menu?: ReactNode;
|
|
8
|
-
/** Слот логотипа (крайний левый). */
|
|
9
6
|
logo?: ReactNode;
|
|
10
|
-
/** Слот селектора (например, выбор облака/организации), после меню. */
|
|
11
7
|
select?: ReactNode;
|
|
12
|
-
/** Слот хлебных крошек. На mobile переносится под основную строку хедера. */
|
|
13
8
|
breadcrumbs?: ReactNode;
|
|
14
|
-
/** Слот тулбара — правая часть хедера. */
|
|
15
9
|
toolbar?: ReactNode;
|
|
16
10
|
}>;
|
|
17
11
|
export declare function HeaderLayout({ menu, logo, select, breadcrumbs, toolbar, className, ...rest }: HeaderLayoutProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -3,19 +3,12 @@ import { WithSupportProps } from '@cloud-ru/ds-utils';
|
|
|
3
3
|
import { MouseEventHandler } from 'react';
|
|
4
4
|
import { HeaderLogoMode } from './constants.js';
|
|
5
5
|
export type LogoProps = WithSupportProps<{
|
|
6
|
-
/** Флаг загрузки — логотип показывается в состоянии загрузки кнопки. */
|
|
7
6
|
loading?: boolean;
|
|
8
|
-
/** Путь до кастомного изображения логотипа. Без пропа (или при ошибке загрузки) — дефолтная иконка. */
|
|
9
7
|
path?: string;
|
|
10
|
-
/** Режим окружения — отображается промо-тегом рядом с дефолтной иконкой (не для `'prod'`). */
|
|
11
8
|
mode?: HeaderLogoMode;
|
|
12
|
-
/** Ссылка логотипа. */
|
|
13
9
|
href: string;
|
|
14
|
-
/** Колбэк клика по логотипу. */
|
|
15
10
|
onClick?: MouseEventHandler<HTMLAnchorElement>;
|
|
16
|
-
/** CSS-класс корневого элемента. */
|
|
17
11
|
className?: string;
|
|
18
|
-
/** Настройки тултипа логотипа. */
|
|
19
12
|
tooltip?: TooltipProps;
|
|
20
13
|
}>;
|
|
21
14
|
export declare function Logo({ path, loading, mode, href, onClick, className, tooltip, ...rest }: LogoProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { MainMenuSVG } from '@cloud-ru/ds-icons/interface/product';
|
|
3
3
|
import { useValueControl } from '@cloud-ru/ds-utils';
|
|
4
|
-
import {
|
|
4
|
+
import { useEffect } from 'react';
|
|
5
5
|
import { TEST_IDS } from '../../constants.js';
|
|
6
6
|
import { useMobileLayout } from '../../hooks/useMobileLayout.js';
|
|
7
7
|
import { headerLocale } from '../../locale/index.js';
|
|
@@ -11,16 +11,13 @@ import { MenuMobile } from './helperComponents/MenuMobile/index.js';
|
|
|
11
11
|
export function MainMenu({ open: openProp, setOpen: setOpenProp, settingItems, platformGroups, logo, leftTop, leftBottom, rightTop, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, disabled, defaultWidth, onWidthChangeEnd, draggerTooltip, loading, }) {
|
|
12
12
|
const { t } = headerLocale.useTranslations();
|
|
13
13
|
const [open = false, setOpen] = useValueControl({ value: openProp, onChange: setOpenProp });
|
|
14
|
-
const searchValue = search?.value;
|
|
15
|
-
const onSearchChange = search?.onChange;
|
|
16
14
|
useEffect(() => {
|
|
17
|
-
if (!open &&
|
|
18
|
-
|
|
19
|
-
}, [open,
|
|
20
|
-
const handleOpen = useCallback(() => {
|
|
21
|
-
setOpen(true);
|
|
22
|
-
}, [setOpen]);
|
|
15
|
+
if (!open && search?.value)
|
|
16
|
+
search?.onChange('');
|
|
17
|
+
}, [open, search]);
|
|
23
18
|
const isMobile = useMobileLayout();
|
|
24
19
|
const MenuComponent = isMobile ? MenuMobile : MenuDesktop;
|
|
25
|
-
return (_jsxs(_Fragment, { children: [_jsx(HeaderButton, { tooltip: open ? undefined : { tip: t('services') }, isMobile: isMobile, disabled: disabled, icon: _jsx(MainMenuSVG, {}), onClick:
|
|
20
|
+
return (_jsxs(_Fragment, { children: [_jsx(HeaderButton, { tooltip: open ? undefined : { tip: t('services') }, isMobile: isMobile, disabled: disabled, icon: _jsx(MainMenuSVG, {}), onClick: () => {
|
|
21
|
+
setOpen(true);
|
|
22
|
+
}, "data-test-id": TEST_IDS.mainMenu.drawerButton }), _jsx(MenuComponent, { settingItems: settingItems, segments: segments, segmentPrefs: segmentPrefs, activeSegmentId: activeSegmentId, onActiveSegmentChange: onActiveSegmentChange, onSegmentOrderChange: onSegmentOrderChange, onSegmentExpandedChange: onSegmentExpandedChange, onSegmentServiceClick: onSegmentServiceClick, platformGroups: platformGroups, search: search, logo: logo, leftTop: leftTop, leftBottom: leftBottom, rightTop: rightTop, favorite: favorite, open: open, setOpen: setOpen, preferences: preferences, defaultWidth: defaultWidth, onWidthChangeEnd: onWidthChangeEnd, draggerTooltip: draggerTooltip, loading: loading })] }));
|
|
26
23
|
}
|
|
@@ -40,7 +40,6 @@ export type ContentProps = {
|
|
|
40
40
|
* Колбэк клика по карточке сервиса в сегменте.
|
|
41
41
|
*/
|
|
42
42
|
onSegmentServiceClick?(service: InnerLink, e?: MouseEvent<HTMLElement>): void;
|
|
43
|
-
/** Избранное. Без пропа группа-предок карточек драга из избранного не активируется. */
|
|
44
43
|
favorite?: FavoriteProps;
|
|
45
44
|
/**
|
|
46
45
|
* Настройки меню (модалка по кнопке в тулбаре): описания карточек, цвета групп.
|
|
@@ -48,17 +47,12 @@ export type ContentProps = {
|
|
|
48
47
|
* Не передано — кнопка настроек в тулбаре не отображается.
|
|
49
48
|
*/
|
|
50
49
|
preferences?: MainMenuPreferencesProps;
|
|
51
|
-
/** Текущее значение поисковой строки — переключает контент между каталогом и результатами поиска. */
|
|
52
50
|
searchValue?: string;
|
|
53
|
-
/** Слот поисковой строки — рендерится над контентом. */
|
|
54
51
|
search?: ReactNode;
|
|
55
52
|
/** Слот над тулбаром правой колонки (например, баннеры) */
|
|
56
53
|
rightTop?: ReactNode;
|
|
57
|
-
/** Слот под сеткой карточек. */
|
|
58
54
|
footer?: ReactNode;
|
|
59
|
-
/** Мобильная раскладка. */
|
|
60
55
|
isMobile?: boolean;
|
|
61
|
-
/** CSS-класс корневого элемента. */
|
|
62
56
|
className?: string;
|
|
63
57
|
/** Флаг загрузки данных */
|
|
64
58
|
loading?: boolean;
|
|
@@ -1,22 +1,18 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';
|
|
3
3
|
import { Accordion } from '@cloud-ru/ds-accordion';
|
|
4
4
|
import { CrossSVG, SearchSVG } from '@cloud-ru/ds-icons/interface/system';
|
|
5
5
|
import { InfoBlock } from '@cloud-ru/ds-info-block';
|
|
6
|
-
import {
|
|
6
|
+
import { useValueControl } from '@cloud-ru/ds-utils';
|
|
7
7
|
import cn from 'classnames';
|
|
8
8
|
import { useCallback, useDeferredValue, useMemo } from 'react';
|
|
9
9
|
import { headerLocale } from '../../../../locale/index.js';
|
|
10
|
-
import { noop } from '../../../../utils/noop.js';
|
|
11
10
|
import { shouldBeOpenedInNewTab } from '../../../../utils/shouldBeOpenedInNewTab.js';
|
|
12
11
|
import { getLinksGroupVisibleItemsCount, resolveGroupBlockColor } from '../../utils/index.js';
|
|
13
|
-
import { MountAnimation } from '../MountAnimation/index.js';
|
|
14
|
-
import { CardsContext } from './cardsContext.js';
|
|
15
12
|
import { TEST_IDS } from './constants.js';
|
|
16
13
|
import { ContentToolbar } from './helperComponents/ContentToolbar/index.js';
|
|
17
14
|
import { SortableGroup, SortableGroupSkeleton } from './helperComponents/SortableGroup/index.js';
|
|
18
15
|
import { useContentSegmentsSortable } from './hooks/useContentSegmentsSortable.js';
|
|
19
|
-
import { useProgressiveCount } from './hooks/useProgressiveCount.js';
|
|
20
16
|
import { useSegmentDnd } from './hooks/useSegmentDnd.js';
|
|
21
17
|
import styles from './styles.module.css';
|
|
22
18
|
export function Content({ searchValue, search, rightTop, segments, searchGroups = [], segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, className, footer, favorite, isMobile, preferences, loading, }) {
|
|
@@ -31,8 +27,7 @@ export function Content({ searchValue, search, rightTop, segments, searchGroups
|
|
|
31
27
|
});
|
|
32
28
|
const isSearching = Boolean(searchValue);
|
|
33
29
|
const enableServiceDrag = Boolean(favorite) && !isMobile && !isSearching;
|
|
34
|
-
|
|
35
|
-
const handleLinkClick = useEventHandler((service, e) => {
|
|
30
|
+
const handleLinkClick = useCallback((service, e) => {
|
|
36
31
|
if (service.disabled) {
|
|
37
32
|
e?.preventDefault();
|
|
38
33
|
return;
|
|
@@ -42,11 +37,7 @@ export function Content({ searchValue, search, rightTop, segments, searchGroups
|
|
|
42
37
|
}
|
|
43
38
|
onSegmentServiceClick?.(service, e);
|
|
44
39
|
service.onClick?.(e);
|
|
45
|
-
});
|
|
46
|
-
const handleFavoriteChange = useEventHandler((productId) => (favorite ? favorite.onChange(productId) : noop));
|
|
47
|
-
const favoriteValue = favorite?.value;
|
|
48
|
-
const favoriteIds = useMemo(() => (favoriteValue ? new Set(favoriteValue) : undefined), [favoriteValue]);
|
|
49
|
-
const showGroupsColors = preferences?.showGroupsColors?.value;
|
|
40
|
+
}, [onSegmentServiceClick]);
|
|
50
41
|
const { orderedGroups, expandedIds, onExpandedChange, handleDragEnd: handleSortableDragEnd, } = useContentSegmentsSortable({
|
|
51
42
|
segments,
|
|
52
43
|
activeSegmentId: segmentId,
|
|
@@ -64,50 +55,35 @@ export function Content({ searchValue, search, rightTop, segments, searchGroups
|
|
|
64
55
|
expandedIds,
|
|
65
56
|
onSortableDragEnd: handleSortableDragEnd,
|
|
66
57
|
showDescription,
|
|
67
|
-
showGroupsColors,
|
|
68
|
-
|
|
69
|
-
onFavoriteChange: handleFavoriteChange,
|
|
58
|
+
showGroupsColors: preferences?.showGroupsColors?.value,
|
|
59
|
+
favorite,
|
|
70
60
|
});
|
|
71
|
-
|
|
72
|
-
const renderedGroupsCount = useProgressiveCount(visibleGroups.length, `${segmentId}|${isSearching}`, !loading);
|
|
73
|
-
const renderedGroups = useMemo(() => (renderedGroupsCount < visibleGroups.length ? visibleGroups.slice(0, renderedGroupsCount) : visibleGroups), [visibleGroups, renderedGroupsCount]);
|
|
74
|
-
const expandedIdsSet = useMemo(() => new Set(expandedIds), [expandedIds]);
|
|
75
|
-
const visibleGroupIds = useMemo(() => visibleGroups.map(({ id }) => id), [visibleGroups]);
|
|
76
|
-
const allGroupsExpanded = visibleGroups.length > 0 && visibleGroupIds.every(id => expandedIdsSet.has(id));
|
|
61
|
+
const allGroupsExpanded = visibleGroups.length > 0 && visibleGroups.every(({ id }) => expandedIds.includes(id));
|
|
77
62
|
const handleToggleAllGroupsExpanded = useCallback(() => {
|
|
63
|
+
const visibleIds = visibleGroups.map(({ id }) => id);
|
|
78
64
|
if (allGroupsExpanded) {
|
|
79
|
-
|
|
80
|
-
onExpandedChange(expandedIds.filter(id => !visibleIdsSet.has(id)));
|
|
65
|
+
onExpandedChange(expandedIds.filter(id => !visibleIds.includes(id)));
|
|
81
66
|
return;
|
|
82
67
|
}
|
|
83
|
-
onExpandedChange([...new Set([...expandedIds, ...
|
|
84
|
-
}, [allGroupsExpanded, expandedIds, onExpandedChange,
|
|
85
|
-
const cardsContext = useMemo(() => ({
|
|
86
|
-
showDescription,
|
|
87
|
-
isMobile,
|
|
88
|
-
dragEnabled: enableServiceDrag,
|
|
89
|
-
favoriteIds,
|
|
90
|
-
onFavoriteChange: favoriteIds ? handleFavoriteChange : undefined,
|
|
91
|
-
onServiceClick: handleLinkClick,
|
|
92
|
-
}), [showDescription, isMobile, enableServiceDrag, favoriteIds, handleFavoriteChange, handleLinkClick]);
|
|
68
|
+
onExpandedChange([...new Set([...expandedIds, ...visibleIds])]);
|
|
69
|
+
}, [allGroupsExpanded, expandedIds, onExpandedChange, visibleGroups]);
|
|
93
70
|
const segmentItems = useMemo(() => segments?.map(segment => ({
|
|
94
71
|
value: segment.id,
|
|
95
72
|
label: segment.label,
|
|
96
73
|
icon: segment.icon,
|
|
97
74
|
})), [segments]);
|
|
98
75
|
const hasCards = visibleGroups.length > 0;
|
|
99
|
-
const mountAnimationType = isMobile ? undefined : 'fade-slide-up-right';
|
|
100
76
|
const cards = (() => {
|
|
101
77
|
if (loading) {
|
|
102
78
|
return Array.from({ length: 5 }).map((_, index) => _jsx(SortableGroupSkeleton, { isMobile: isMobile }, index));
|
|
103
79
|
}
|
|
104
80
|
if (hasCards) {
|
|
105
|
-
return (_jsx(SortableContext, { items:
|
|
81
|
+
return (_jsx(SortableContext, { items: visibleGroups.map(({ id }) => id), strategy: verticalListSortingStrategy, children: _jsx(Accordion, { selectionMode: 'multiple', expanded: expandedIds, onExpandedChange: onExpandedChange, children: visibleGroups.map(({ id, label, icon, items, favoritesEnabled, blockColor, highlight }) => (_jsx(SortableGroup, { id: id, icon: icon, label: label, items: items, isExpanded: expandedIds.includes(id), blockColor: resolveGroupBlockColor(blockColor, preferences?.showGroupsColors?.value), showDescription: showDescription, isMobile: isMobile, enableServiceDrag: enableServiceDrag, favorite: favorite, groupFavoritesEnabled: favoritesEnabled, onServiceClick: handleLinkClick, highlight: highlight }, id))) }) }));
|
|
106
82
|
}
|
|
107
83
|
return (_jsx(InfoBlock, { size: 'm', icon: {
|
|
108
84
|
icon: isSearching ? SearchSVG : CrossSVG,
|
|
109
85
|
appearance: 'neutral',
|
|
110
86
|
}, content: isSearching ? t('noDataFound') : t('noData'), "data-test-id": isSearching ? TEST_IDS.noDataFound : TEST_IDS.noData, "data-mobile": isMobile || undefined, className: styles.noData }));
|
|
111
87
|
})();
|
|
112
|
-
return (_jsxs(_Fragment, { children: [search, _jsxs("div", { className: cn(styles.content, className), "data-
|
|
88
|
+
return (_jsxs(_Fragment, { children: [search, _jsxs("div", { className: cn(styles.content, className), "data-empty": (!loading && !hasCards) || undefined, children: [!isSearching && (_jsxs(_Fragment, { children: [_jsx(ContentToolbar, { segment: segmentId, onSegmentChange: setSegmentId, segmentItems: segmentItems, allGroupsExpanded: allGroupsExpanded, onToggleAllGroupsExpanded: handleToggleAllGroupsExpanded, preferences: preferences, isMobile: isMobile, loading: loading }), rightTop] })), cards, footer] })] }));
|
|
113
89
|
}
|
|
@@ -1,27 +1,18 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
import { MainMenuPreferencesProps } from '../../../../types.js';
|
|
3
3
|
export type ContentToolbarSegmentItem = {
|
|
4
|
-
/** Значение сегмента (id). */
|
|
5
4
|
value: string;
|
|
6
|
-
/** Подпись сегмента. */
|
|
7
5
|
label: string;
|
|
8
|
-
/** Иконка сегмента. */
|
|
9
6
|
icon?: ReactNode;
|
|
10
7
|
};
|
|
11
8
|
export type ContentToolbarProps = {
|
|
12
|
-
/** Значение активного сегмента SegmentControl. */
|
|
13
9
|
segment: string;
|
|
14
|
-
/** Колбэк смены активного сегмента. */
|
|
15
10
|
onSegmentChange(segment: string): void;
|
|
16
|
-
/** Пункты SegmentControl. Без пунктов (или с одним) SegmentControl не отображается. */
|
|
17
11
|
segmentItems?: ContentToolbarSegmentItem[];
|
|
18
|
-
/** Все группы сегмента раскрыты — определяет иконку кнопки свернуть/развернуть все. */
|
|
19
12
|
allGroupsExpanded: boolean;
|
|
20
|
-
/** Колбэк клика по кнопке свернуть/развернуть все группы. */
|
|
21
13
|
onToggleAllGroupsExpanded(): void;
|
|
22
14
|
/** Настройки меню (модалка по кнопке). Не передано — кнопка настроек не отображается. */
|
|
23
15
|
preferences?: MainMenuPreferencesProps;
|
|
24
|
-
/** Мобильная раскладка — кнопка свернуть/развернуть все скрывается. */
|
|
25
16
|
isMobile?: boolean;
|
|
26
17
|
/** Флаг загрузки данных — сегменты подгружаются с бэка, поэтому SegmentControl тоже уходит в скелетон. */
|
|
27
18
|
loading?: boolean;
|
|
@@ -1,31 +1,12 @@
|
|
|
1
1
|
import { LinksGroup, LinksGroupBlockColor, LinksGroupTitle } from '../../../../types.js';
|
|
2
|
-
import {
|
|
3
|
-
export type SortableGroupProps =
|
|
4
|
-
/** Id группы. */
|
|
2
|
+
import { SortableGroupCardsProps } from './components/index.js';
|
|
3
|
+
export type SortableGroupProps = Omit<SortableGroupCardsProps, 'groupId'> & Pick<LinksGroup, 'icon'> & {
|
|
5
4
|
id: string;
|
|
6
|
-
/** Заголовок группы. */
|
|
7
5
|
label: LinksGroupTitle;
|
|
8
|
-
/** Раскрыта ли группа. */
|
|
9
6
|
isExpanded?: boolean;
|
|
10
|
-
/** Мобильная раскладка. */
|
|
11
|
-
isMobile?: boolean;
|
|
12
|
-
/** Группу можно перетаскивать (иначе рендерится без `useSortable`). */
|
|
13
|
-
enableServiceDrag?: boolean;
|
|
14
|
-
/** Цвет блока группы. */
|
|
15
7
|
blockColor?: LinksGroupBlockColor;
|
|
16
|
-
/** Визуальное выделение группы. */
|
|
17
8
|
highlight?: boolean;
|
|
18
|
-
/** Разрешено ли добавление карточек группы в избранное. */
|
|
19
9
|
groupFavoritesEnabled?: boolean;
|
|
20
|
-
/** Группа появляется с fade-in при монтировании (на desktop; на mobile анимирует контейнер). */
|
|
21
|
-
appear?: boolean;
|
|
22
10
|
};
|
|
23
|
-
declare function
|
|
24
|
-
export declare
|
|
25
|
-
export type SortableGroupDragPreviewProps = Omit<SortableGroupProps, 'enableServiceDrag'> & Pick<CardsContextValue, 'showDescription' | 'favoriteIds' | 'onFavoriteChange'>;
|
|
26
|
-
/**
|
|
27
|
-
* Превью группы в `DragOverlay`. Рендерится вне `Content`, поэтому свой `CardsContext` собирает
|
|
28
|
-
* сам: без drag-обвязки карточек и без обработчика клика.
|
|
29
|
-
*/
|
|
30
|
-
export declare function SortableGroupDragPreview({ id, label, items, isExpanded, showDescription, isMobile, favoriteIds, onFavoriteChange, groupFavoritesEnabled, blockColor, highlight, }: SortableGroupDragPreviewProps): import("react/jsx-runtime").JSX.Element;
|
|
31
|
-
export {};
|
|
11
|
+
export declare function SortableGroup({ id, icon, label, items, isExpanded, showDescription, isMobile, enableServiceDrag, favorite, groupFavoritesEnabled, onServiceClick, blockColor, highlight, }: SortableGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare function SortableGroupDragPreview({ id, label, items, isExpanded, showDescription, isMobile, favorite, groupFavoritesEnabled, blockColor, highlight, }: Omit<SortableGroupProps, 'enableServiceDrag'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -4,27 +4,14 @@ import { CSS } from '@dnd-kit/utilities';
|
|
|
4
4
|
import { Accordion } from '@cloud-ru/ds-accordion';
|
|
5
5
|
import { DRAG_MODE, DragGhost, DragPreview } from '@cloud-ru/ds-drag-and-drop';
|
|
6
6
|
import { useThemeAppearance } from '@cloud-ru/ds-theme';
|
|
7
|
-
import { memo, useCallback, useState } from 'react';
|
|
8
|
-
import { CardsContext } from '../../cardsContext.js';
|
|
9
7
|
import { TEST_IDS } from '../../constants.js';
|
|
10
8
|
import { SortableGroupCards, SortableGroupHeader } from './components/index.js';
|
|
11
9
|
import styles from './styles.module.css';
|
|
12
|
-
function
|
|
13
|
-
const {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const [isAppearing, setIsAppearing] = useState(Boolean(appear));
|
|
18
|
-
const handleAnimationEnd = useCallback((event) => {
|
|
19
|
-
// `animationend` всплывает от вложенных анимаций — нужна только своя.
|
|
20
|
-
if (event.target === event.currentTarget) {
|
|
21
|
-
setIsAppearing(false);
|
|
22
|
-
}
|
|
23
|
-
}, []);
|
|
24
|
-
return (_jsxs(DragGhost, { innerRef: setNodeRef, id: id, style: style, className: styles.group, dragging: isDragging, mode: DRAG_MODE.Dynamic, "data-appear": isAppearing || undefined, onAnimationEnd: handleAnimationEnd, "data-test-id": `${TEST_IDS.groupCard}-${id}`, children: [_jsx("div", { className: styles.decoration, "data-color-scheme": colorScheme, "data-is-highlighted": highlight || undefined, children: _jsx("div", { className: styles.decorationBackground, children: _jsx("div", { className: styles.colorMarker, "data-block-color": blockColor }) }) }), _jsx(Accordion.CollapseBlockTertiary, { id: id, showChevron: false, afterTitle: _jsx(SortableGroupHeader, { label: label, icon: icon, isExpanded: isExpanded, enableServiceDrag: enableServiceDrag, attributes: attributes, listeners: listeners, isMobile: isMobile }), children: _jsx(SortableGroupCards, { groupId: id, items: items, groupFavoritesEnabled: groupFavoritesEnabled }) })] }));
|
|
25
|
-
}
|
|
26
|
-
function DraggableGroup(props) {
|
|
27
|
-
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: props.id });
|
|
10
|
+
export function SortableGroup({ id, icon, label, items, isExpanded, showDescription, isMobile, enableServiceDrag, favorite, groupFavoritesEnabled = true, onServiceClick, blockColor, highlight, }) {
|
|
11
|
+
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
|
|
12
|
+
id,
|
|
13
|
+
disabled: !enableServiceDrag,
|
|
14
|
+
});
|
|
28
15
|
const style = {
|
|
29
16
|
// CSS.Transform добавляет scaleX/scaleY, из-за чего перетаскиваемая группа "растягивается"
|
|
30
17
|
// при пересечении с соседней группой другой высоты. CSS.Translate использует только сдвиг.
|
|
@@ -33,25 +20,10 @@ function DraggableGroup(props) {
|
|
|
33
20
|
transform: transform ? CSS.Translate.toString(transform) : undefined,
|
|
34
21
|
transition,
|
|
35
22
|
};
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
function SortableGroupBase(props) {
|
|
39
|
-
// Без drag (mobile, поиск, нет избранного) группа не регистрируется в `SortableContext`.
|
|
40
|
-
return props.enableServiceDrag ? _jsx(DraggableGroup, { ...props }) : _jsx(GroupView, { ...props });
|
|
23
|
+
const { colorScheme } = useThemeAppearance().appearance;
|
|
24
|
+
return (_jsxs(DragGhost, { innerRef: setNodeRef, id: id, style: style, className: styles.group, dragging: isDragging, mode: DRAG_MODE.Dynamic, "data-test-id": `${TEST_IDS.groupCard}-${id}`, children: [_jsx("div", { className: styles.decoration, "data-color-scheme": colorScheme, "data-is-highlighted": highlight || undefined, children: _jsx("div", { className: styles.decorationBackground, children: _jsx("div", { className: styles.colorMarker, "data-block-color": blockColor }) }) }), _jsx(Accordion.CollapseBlockTertiary, { id: id, showChevron: false, afterTitle: _jsx(SortableGroupHeader, { label: label, icon: icon, isExpanded: isExpanded, enableServiceDrag: enableServiceDrag, attributes: attributes, listeners: listeners, isMobile: isMobile }), children: _jsx(SortableGroupCards, { groupId: id, items: items, showDescription: showDescription, isMobile: isMobile, enableServiceDrag: enableServiceDrag, favorite: favorite, groupFavoritesEnabled: groupFavoritesEnabled, onServiceClick: onServiceClick }) })] }));
|
|
41
25
|
}
|
|
42
|
-
export
|
|
43
|
-
/**
|
|
44
|
-
* Превью группы в `DragOverlay`. Рендерится вне `Content`, поэтому свой `CardsContext` собирает
|
|
45
|
-
* сам: без drag-обвязки карточек и без обработчика клика.
|
|
46
|
-
*/
|
|
47
|
-
export function SortableGroupDragPreview({ id, label, items, isExpanded, showDescription, isMobile, favoriteIds, onFavoriteChange, groupFavoritesEnabled, blockColor, highlight, }) {
|
|
26
|
+
export function SortableGroupDragPreview({ id, label, items, isExpanded, showDescription, isMobile, favorite, groupFavoritesEnabled, blockColor, highlight, }) {
|
|
48
27
|
const { colorScheme } = useThemeAppearance().appearance;
|
|
49
|
-
|
|
50
|
-
showDescription,
|
|
51
|
-
isMobile,
|
|
52
|
-
dragEnabled: false,
|
|
53
|
-
favoriteIds,
|
|
54
|
-
onFavoriteChange,
|
|
55
|
-
};
|
|
56
|
-
return (_jsx(DragPreview, { className: styles.groupDragPreview, children: _jsxs("div", { className: styles.group, "data-drag-preview": true, children: [_jsx("div", { className: styles.decoration, "data-color-scheme": colorScheme, "data-is-highlighted": highlight || undefined, children: _jsx("div", { className: styles.decorationBackground, children: _jsx("div", { className: styles.colorMarker, "data-block-color": blockColor }) }) }), _jsx("div", { className: styles.groupDragPreviewHeader, children: _jsx(SortableGroupHeader, { label: label, isExpanded: isExpanded, isMobile: isMobile, enableServiceDrag: true }) }), isExpanded && (_jsx(CardsContext.Provider, { value: cardsContext, children: _jsx(SortableGroupCards, { groupId: id, items: items, groupFavoritesEnabled: groupFavoritesEnabled }) }))] }) }));
|
|
28
|
+
return (_jsx(DragPreview, { className: styles.groupDragPreview, children: _jsxs("div", { className: styles.group, "data-drag-preview": true, children: [_jsx("div", { className: styles.decoration, "data-color-scheme": colorScheme, "data-is-highlighted": highlight || undefined, children: _jsx("div", { className: styles.decorationBackground, children: _jsx("div", { className: styles.colorMarker, "data-block-color": blockColor }) }) }), _jsx("div", { className: styles.groupDragPreviewHeader, children: _jsx(SortableGroupHeader, { label: label, isExpanded: isExpanded, isMobile: isMobile, enableServiceDrag: true }) }), isExpanded && (_jsx(SortableGroupCards, { groupId: id, items: items, showDescription: showDescription, isMobile: isMobile, favorite: favorite, groupFavoritesEnabled: groupFavoritesEnabled }))] }) }));
|
|
57
29
|
}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { InnerLink } from '../../../../../types.js';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { ServiceCardProps } from '../../../../ServiceCard/index.js';
|
|
3
|
+
export type SortableGroupCardsProps = Pick<ServiceCardProps, 'showDescription' | 'isMobile' | 'favorite' | 'onServiceClick'> & {
|
|
4
4
|
groupId: string;
|
|
5
|
-
/** Карточки сервисов группы. */
|
|
6
5
|
items: InnerLink[];
|
|
7
|
-
|
|
6
|
+
enableServiceDrag?: boolean;
|
|
8
7
|
groupFavoritesEnabled?: boolean;
|
|
9
8
|
};
|
|
10
|
-
declare function
|
|
11
|
-
export declare const SortableGroupCards: import("react").MemoExoticComponent<typeof SortableGroupCardsBase>;
|
|
12
|
-
export {};
|
|
9
|
+
export declare function SortableGroupCards({ groupId, items, showDescription, isMobile, enableServiceDrag, favorite, groupFavoritesEnabled, onServiceClick, }: SortableGroupCardsProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,22 +1,17 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { memo } from 'react';
|
|
3
2
|
import { isSubCategoryCard } from '../../../../../utils/innerLink.js';
|
|
4
|
-
import {
|
|
5
|
-
import { useCardsContext } from '../../../cardsContext.js';
|
|
3
|
+
import { DraggableServiceCard } from '../../../../ServiceCard/index.js';
|
|
6
4
|
import styles from '../styles.module.css';
|
|
7
5
|
import { SubCategory } from './SubCategory/index.js';
|
|
8
|
-
function
|
|
9
|
-
const { isMobile, showDescription, dragEnabled, favoriteIds, onFavoriteChange, onServiceClick } = useCardsContext();
|
|
10
|
-
const cardFavoriteChange = favoriteIds ? onFavoriteChange : undefined;
|
|
6
|
+
export function SortableGroupCards({ groupId, items, showDescription, isMobile, enableServiceDrag, favorite, groupFavoritesEnabled, onServiceClick, }) {
|
|
11
7
|
return (_jsx("div", { className: styles.groupBody, "data-mobile": isMobile || undefined, children: items.map(service => {
|
|
12
8
|
if (service.hidden) {
|
|
13
9
|
return null;
|
|
14
10
|
}
|
|
15
11
|
const key = String(groupId) + service.id;
|
|
16
12
|
if (isSubCategoryCard(service)) {
|
|
17
|
-
return (_jsx(SubCategory, { groupId: groupId, service: service, groupFavoritesEnabled: groupFavoritesEnabled }, key));
|
|
13
|
+
return (_jsx(SubCategory, { groupId: groupId, service: service, showDescription: showDescription, isMobile: isMobile, dragDisabled: !enableServiceDrag, favorite: favorite, groupFavoritesEnabled: groupFavoritesEnabled, onServiceClick: onServiceClick }, key));
|
|
18
14
|
}
|
|
19
|
-
return (_jsx(
|
|
15
|
+
return (_jsx(DraggableServiceCard, { groupId: groupId, service: service, favorite: favorite, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragDisabled: !enableServiceDrag }, key));
|
|
20
16
|
}) }));
|
|
21
17
|
}
|
|
22
|
-
export const SortableGroupCards = memo(SortableGroupCardsBase);
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { DraggableAttributes, DraggableSyntheticListeners } from '@dnd-kit/core';
|
|
2
2
|
export type SortableGroupDragHandleProps = {
|
|
3
|
-
/** ARIA-атрибуты `dnd-kit` draggable-элемента. */
|
|
4
3
|
attributes?: DraggableAttributes;
|
|
5
|
-
/** Обработчики событий `dnd-kit` для инициации перетаскивания. */
|
|
6
4
|
listeners?: DraggableSyntheticListeners;
|
|
7
5
|
};
|
|
8
6
|
export declare function SortableGroupDragHandle({ attributes, listeners }: SortableGroupDragHandleProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -6,6 +6,4 @@ export type SortableGroupHeaderProps = Pick<LinksGroup, 'icon'> & {
|
|
|
6
6
|
enableServiceDrag?: boolean;
|
|
7
7
|
isMobile?: boolean;
|
|
8
8
|
} & SortableGroupDragHandleProps;
|
|
9
|
-
declare function
|
|
10
|
-
export declare const SortableGroupHeader: import("react").MemoExoticComponent<typeof SortableGroupHeaderBase>;
|
|
11
|
-
export {};
|
|
9
|
+
export declare function SortableGroupHeader({ label, icon, isExpanded, enableServiceDrag, attributes, listeners, isMobile, }: SortableGroupHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -3,15 +3,13 @@ import { Button } from '@cloud-ru/ds-button';
|
|
|
3
3
|
import { ChevronDownSVG, ChevronUpSVG } from '@cloud-ru/ds-icons/interface/system';
|
|
4
4
|
import { Typography } from '@cloud-ru/ds-typography';
|
|
5
5
|
import { TitleClickable } from '@cloud-ru/ds-uikit-product-title-clickable';
|
|
6
|
-
import { memo, useCallback } from 'react';
|
|
7
6
|
import { getLinkEmblem } from '../../../../../utils/index.js';
|
|
8
7
|
import styles from '../styles.module.css';
|
|
9
8
|
import { SortableGroupDragHandle } from './SortableGroupDragHandle.js';
|
|
10
|
-
function
|
|
11
|
-
const handleLabelClick =
|
|
9
|
+
export function SortableGroupHeader({ label, icon, isExpanded, enableServiceDrag, attributes, listeners, isMobile, }) {
|
|
10
|
+
const handleLabelClick = e => {
|
|
12
11
|
e.stopPropagation();
|
|
13
12
|
label?.onClick?.(e);
|
|
14
|
-
}
|
|
13
|
+
};
|
|
15
14
|
return (_jsxs("div", { className: styles.header, "data-expanded": isExpanded || undefined, children: [_jsx(Typography, { variant: 'title', size: 'm', className: styles.headerTitle, "data-test-id": 'header__drawer-menu__group-card-title', children: label.onClick || label.href ? (_jsx(TitleClickable, { ...(label.href ? { as: 'a', href: label.href } : { as: 'div' }), onClick: handleLabelClick, title: label.text, icon: getLinkEmblem({ icon }) })) : (label.text) }), (enableServiceDrag || !isMobile) && (_jsxs("div", { className: styles.headerActions, "data-always-visible": isMobile || undefined, children: [enableServiceDrag && _jsx(SortableGroupDragHandle, { attributes: attributes, listeners: listeners }), !isMobile && (_jsx(Button, { view: 'elevated', appearance: 'neutral', size: 's', icon: isExpanded ? _jsx(ChevronUpSVG, {}) : _jsx(ChevronDownSVG, {}), "data-test-id": 'header__drawer-menu__group-card-collapse' }))] }))] }));
|
|
16
15
|
}
|
|
17
|
-
export const SortableGroupHeader = memo(SortableGroupHeaderBase);
|
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export type SubCategoryProps = {
|
|
3
|
-
/** Id группы-предка. */
|
|
1
|
+
import { ServiceCardProps } from '../../../../../ServiceCard/index.js';
|
|
2
|
+
export type SubCategoryProps = Pick<ServiceCardProps, 'service' | 'onServiceClick' | 'favorite' | 'showDescription' | 'isMobile'> & {
|
|
4
3
|
groupId: string;
|
|
5
|
-
|
|
6
|
-
service: InnerLink;
|
|
7
|
-
/** Разрешено ли добавление карточек группы в избранное. */
|
|
4
|
+
dragDisabled?: boolean;
|
|
8
5
|
groupFavoritesEnabled?: boolean;
|
|
9
6
|
};
|
|
10
|
-
declare function
|
|
11
|
-
export declare const SubCategory: import("react").MemoExoticComponent<typeof SubCategoryBase>;
|
|
12
|
-
export {};
|
|
7
|
+
export declare function SubCategory({ groupId, service, showDescription, isMobile, dragDisabled, favorite, onServiceClick, groupFavoritesEnabled, }: SubCategoryProps): import("react/jsx-runtime").JSX.Element;
|