@cloud-ru/uikit-product-header 5.0.17
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 +3498 -0
- package/LICENSE +201 -0
- package/README.md +322 -0
- package/dist/cjs/components/HeaderLayout/HeaderLayout.d.ts +12 -0
- package/dist/cjs/components/HeaderLayout/HeaderLayout.js +25 -0
- package/dist/cjs/components/HeaderLayout/index.d.ts +1 -0
- package/dist/cjs/components/HeaderLayout/index.js +17 -0
- package/dist/cjs/components/HeaderLayout/styles.module.css +35 -0
- package/dist/cjs/components/Logo/Logo.d.ts +20 -0
- package/dist/cjs/components/Logo/Logo.js +61 -0
- package/dist/cjs/components/Logo/index.d.ts +1 -0
- package/dist/cjs/components/Logo/index.js +17 -0
- package/dist/cjs/components/Logo/styles.module.css +28 -0
- package/dist/cjs/components/MainMenu/Content/Content.d.ts +20 -0
- package/dist/cjs/components/MainMenu/Content/Content.js +36 -0
- package/dist/cjs/components/MainMenu/Content/index.d.ts +1 -0
- package/dist/cjs/components/MainMenu/Content/index.js +17 -0
- package/dist/cjs/components/MainMenu/Content/styles.module.css +40 -0
- package/dist/cjs/components/MainMenu/MainMenu.d.ts +4 -0
- package/dist/cjs/components/MainMenu/MainMenu.js +16 -0
- package/dist/cjs/components/MainMenu/MenuDesktop/MenuDesktop.d.ts +2 -0
- package/dist/cjs/components/MainMenu/MenuDesktop/MenuDesktop.js +34 -0
- package/dist/cjs/components/MainMenu/MenuDesktop/index.d.ts +1 -0
- package/dist/cjs/components/MainMenu/MenuDesktop/index.js +17 -0
- package/dist/cjs/components/MainMenu/MenuDesktop/styles.module.css +94 -0
- package/dist/cjs/components/MainMenu/MenuMobile/MenuMobile.d.ts +2 -0
- package/dist/cjs/components/MainMenu/MenuMobile/MenuMobile.js +31 -0
- package/dist/cjs/components/MainMenu/MenuMobile/index.d.ts +1 -0
- package/dist/cjs/components/MainMenu/MenuMobile/index.js +17 -0
- package/dist/cjs/components/MainMenu/MenuMobile/styles.module.css +23 -0
- package/dist/cjs/components/MainMenu/Search/SearchDesktop/SearchDesktop.d.ts +2 -0
- package/dist/cjs/components/MainMenu/Search/SearchDesktop/SearchDesktop.js +18 -0
- package/dist/cjs/components/MainMenu/Search/SearchDesktop/index.d.ts +1 -0
- package/dist/cjs/components/MainMenu/Search/SearchDesktop/index.js +17 -0
- package/dist/cjs/components/MainMenu/Search/SearchDesktop/styles.module.css +17 -0
- package/dist/cjs/components/MainMenu/Search/SearchMobile/SearchMobile.d.ts +2 -0
- package/dist/cjs/components/MainMenu/Search/SearchMobile/SearchMobile.js +42 -0
- package/dist/cjs/components/MainMenu/Search/SearchMobile/constants.d.ts +4 -0
- package/dist/cjs/components/MainMenu/Search/SearchMobile/constants.js +7 -0
- package/dist/cjs/components/MainMenu/Search/SearchMobile/hooks.d.ts +12 -0
- package/dist/cjs/components/MainMenu/Search/SearchMobile/hooks.js +40 -0
- package/dist/cjs/components/MainMenu/Search/SearchMobile/index.d.ts +1 -0
- package/dist/cjs/components/MainMenu/Search/SearchMobile/index.js +17 -0
- package/dist/cjs/components/MainMenu/Search/SearchMobile/styles.module.css +57 -0
- package/dist/cjs/components/MainMenu/Search/SearchSettingsButton/SearchSettingsButton.d.ts +4 -0
- package/dist/cjs/components/MainMenu/Search/SearchSettingsButton/SearchSettingsButton.js +13 -0
- package/dist/cjs/components/MainMenu/Search/SearchSettingsButton/index.d.ts +1 -0
- package/dist/cjs/components/MainMenu/Search/SearchSettingsButton/index.js +17 -0
- package/dist/cjs/components/MainMenu/Search/SearchSettingsButton/styles.module.css +11 -0
- package/dist/cjs/components/MainMenu/Search/index.d.ts +3 -0
- package/dist/cjs/components/MainMenu/Search/index.js +19 -0
- package/dist/cjs/components/MainMenu/Search/types.d.ts +14 -0
- package/dist/cjs/components/MainMenu/Search/types.js +2 -0
- package/dist/cjs/components/MainMenu/Search/useSearch.d.ts +8 -0
- package/dist/cjs/components/MainMenu/Search/useSearch.js +169 -0
- package/dist/cjs/components/MainMenu/hooks.d.ts +10 -0
- package/dist/cjs/components/MainMenu/hooks.js +108 -0
- package/dist/cjs/components/MainMenu/index.d.ts +4 -0
- package/dist/cjs/components/MainMenu/index.js +20 -0
- package/dist/cjs/components/MainMenu/styles.module.css +28 -0
- package/dist/cjs/components/MainMenu/types.d.ts +49 -0
- package/dist/cjs/components/MainMenu/types.js +2 -0
- package/dist/cjs/components/PathBreadcrumbs/PathBreadcrumbs.d.ts +7 -0
- package/dist/cjs/components/PathBreadcrumbs/PathBreadcrumbs.js +12 -0
- package/dist/cjs/components/PathBreadcrumbs/index.d.ts +1 -0
- package/dist/cjs/components/PathBreadcrumbs/index.js +17 -0
- package/dist/cjs/components/PathBreadcrumbs/styles.module.css +5 -0
- package/dist/cjs/components/PlatformLogo/Container.d.ts +12 -0
- package/dist/cjs/components/PlatformLogo/Container.js +28 -0
- package/dist/cjs/components/PlatformLogo/index.d.ts +4 -0
- package/dist/cjs/components/PlatformLogo/index.js +9 -0
- package/dist/cjs/components/PlatformLogo/styles.module.css +11 -0
- package/dist/cjs/components/UserMenu/UserMenu.d.ts +14 -0
- package/dist/cjs/components/UserMenu/UserMenu.js +54 -0
- package/dist/cjs/components/UserMenu/hooks/useLogoutItem.d.ts +6 -0
- package/dist/cjs/components/UserMenu/hooks/useLogoutItem.js +21 -0
- package/dist/cjs/components/UserMenu/hooks/useProfileItem.d.ts +3 -0
- package/dist/cjs/components/UserMenu/hooks/useProfileItem.js +29 -0
- package/dist/cjs/components/UserMenu/hooks/useThemeItem.d.ts +6 -0
- package/dist/cjs/components/UserMenu/hooks/useThemeItem.js +75 -0
- package/dist/cjs/components/UserMenu/hooks/useUserMenuItems.d.ts +13 -0
- package/dist/cjs/components/UserMenu/hooks/useUserMenuItems.js +42 -0
- package/dist/cjs/components/UserMenu/index.d.ts +2 -0
- package/dist/cjs/components/UserMenu/index.js +18 -0
- package/dist/cjs/components/UserMenu/styles.module.css +21 -0
- package/dist/cjs/components/UserMenu/types.d.ts +20 -0
- package/dist/cjs/components/UserMenu/types.js +8 -0
- package/dist/cjs/components/index.d.ts +6 -0
- package/dist/cjs/components/index.js +22 -0
- package/dist/cjs/hooks/index.d.ts +1 -0
- package/dist/cjs/hooks/index.js +17 -0
- package/dist/cjs/hooks/useLocalStorage.d.ts +1 -0
- package/dist/cjs/hooks/useLocalStorage.js +13 -0
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.js +18 -0
- package/dist/esm/components/HeaderLayout/HeaderLayout.d.ts +12 -0
- package/dist/esm/components/HeaderLayout/HeaderLayout.js +19 -0
- package/dist/esm/components/HeaderLayout/index.d.ts +1 -0
- package/dist/esm/components/HeaderLayout/index.js +1 -0
- package/dist/esm/components/HeaderLayout/styles.module.css +35 -0
- package/dist/esm/components/Logo/Logo.d.ts +20 -0
- package/dist/esm/components/Logo/Logo.js +54 -0
- package/dist/esm/components/Logo/index.d.ts +1 -0
- package/dist/esm/components/Logo/index.js +1 -0
- package/dist/esm/components/Logo/styles.module.css +28 -0
- package/dist/esm/components/MainMenu/Content/Content.d.ts +20 -0
- package/dist/esm/components/MainMenu/Content/Content.js +30 -0
- package/dist/esm/components/MainMenu/Content/index.d.ts +1 -0
- package/dist/esm/components/MainMenu/Content/index.js +1 -0
- package/dist/esm/components/MainMenu/Content/styles.module.css +40 -0
- package/dist/esm/components/MainMenu/MainMenu.d.ts +4 -0
- package/dist/esm/components/MainMenu/MainMenu.js +13 -0
- package/dist/esm/components/MainMenu/MenuDesktop/MenuDesktop.d.ts +2 -0
- package/dist/esm/components/MainMenu/MenuDesktop/MenuDesktop.js +28 -0
- package/dist/esm/components/MainMenu/MenuDesktop/index.d.ts +1 -0
- package/dist/esm/components/MainMenu/MenuDesktop/index.js +1 -0
- package/dist/esm/components/MainMenu/MenuDesktop/styles.module.css +94 -0
- package/dist/esm/components/MainMenu/MenuMobile/MenuMobile.d.ts +2 -0
- package/dist/esm/components/MainMenu/MenuMobile/MenuMobile.js +25 -0
- package/dist/esm/components/MainMenu/MenuMobile/index.d.ts +1 -0
- package/dist/esm/components/MainMenu/MenuMobile/index.js +1 -0
- package/dist/esm/components/MainMenu/MenuMobile/styles.module.css +23 -0
- package/dist/esm/components/MainMenu/Search/SearchDesktop/SearchDesktop.d.ts +2 -0
- package/dist/esm/components/MainMenu/Search/SearchDesktop/SearchDesktop.js +12 -0
- package/dist/esm/components/MainMenu/Search/SearchDesktop/index.d.ts +1 -0
- package/dist/esm/components/MainMenu/Search/SearchDesktop/index.js +1 -0
- package/dist/esm/components/MainMenu/Search/SearchDesktop/styles.module.css +17 -0
- package/dist/esm/components/MainMenu/Search/SearchMobile/SearchMobile.d.ts +2 -0
- package/dist/esm/components/MainMenu/Search/SearchMobile/SearchMobile.js +36 -0
- package/dist/esm/components/MainMenu/Search/SearchMobile/constants.d.ts +4 -0
- package/dist/esm/components/MainMenu/Search/SearchMobile/constants.js +4 -0
- package/dist/esm/components/MainMenu/Search/SearchMobile/hooks.d.ts +12 -0
- package/dist/esm/components/MainMenu/Search/SearchMobile/hooks.js +34 -0
- package/dist/esm/components/MainMenu/Search/SearchMobile/index.d.ts +1 -0
- package/dist/esm/components/MainMenu/Search/SearchMobile/index.js +1 -0
- package/dist/esm/components/MainMenu/Search/SearchMobile/styles.module.css +57 -0
- package/dist/esm/components/MainMenu/Search/SearchSettingsButton/SearchSettingsButton.d.ts +4 -0
- package/dist/esm/components/MainMenu/Search/SearchSettingsButton/SearchSettingsButton.js +7 -0
- package/dist/esm/components/MainMenu/Search/SearchSettingsButton/index.d.ts +1 -0
- package/dist/esm/components/MainMenu/Search/SearchSettingsButton/index.js +1 -0
- package/dist/esm/components/MainMenu/Search/SearchSettingsButton/styles.module.css +11 -0
- package/dist/esm/components/MainMenu/Search/index.d.ts +3 -0
- package/dist/esm/components/MainMenu/Search/index.js +3 -0
- package/dist/esm/components/MainMenu/Search/types.d.ts +14 -0
- package/dist/esm/components/MainMenu/Search/types.js +1 -0
- package/dist/esm/components/MainMenu/Search/useSearch.d.ts +8 -0
- package/dist/esm/components/MainMenu/Search/useSearch.js +161 -0
- package/dist/esm/components/MainMenu/hooks.d.ts +10 -0
- package/dist/esm/components/MainMenu/hooks.js +101 -0
- package/dist/esm/components/MainMenu/index.d.ts +4 -0
- package/dist/esm/components/MainMenu/index.js +4 -0
- package/dist/esm/components/MainMenu/styles.module.css +28 -0
- package/dist/esm/components/MainMenu/types.d.ts +49 -0
- package/dist/esm/components/MainMenu/types.js +1 -0
- package/dist/esm/components/PathBreadcrumbs/PathBreadcrumbs.d.ts +7 -0
- package/dist/esm/components/PathBreadcrumbs/PathBreadcrumbs.js +6 -0
- package/dist/esm/components/PathBreadcrumbs/index.d.ts +1 -0
- package/dist/esm/components/PathBreadcrumbs/index.js +1 -0
- package/dist/esm/components/PathBreadcrumbs/styles.module.css +5 -0
- package/dist/esm/components/PlatformLogo/Container.d.ts +12 -0
- package/dist/esm/components/PlatformLogo/Container.js +20 -0
- package/dist/esm/components/PlatformLogo/index.d.ts +4 -0
- package/dist/esm/components/PlatformLogo/index.js +6 -0
- package/dist/esm/components/PlatformLogo/styles.module.css +11 -0
- package/dist/esm/components/UserMenu/UserMenu.d.ts +14 -0
- package/dist/esm/components/UserMenu/UserMenu.js +48 -0
- package/dist/esm/components/UserMenu/hooks/useLogoutItem.d.ts +6 -0
- package/dist/esm/components/UserMenu/hooks/useLogoutItem.js +18 -0
- package/dist/esm/components/UserMenu/hooks/useProfileItem.d.ts +3 -0
- package/dist/esm/components/UserMenu/hooks/useProfileItem.js +23 -0
- package/dist/esm/components/UserMenu/hooks/useThemeItem.d.ts +6 -0
- package/dist/esm/components/UserMenu/hooks/useThemeItem.js +72 -0
- package/dist/esm/components/UserMenu/hooks/useUserMenuItems.d.ts +13 -0
- package/dist/esm/components/UserMenu/hooks/useUserMenuItems.js +39 -0
- package/dist/esm/components/UserMenu/index.d.ts +2 -0
- package/dist/esm/components/UserMenu/index.js +2 -0
- package/dist/esm/components/UserMenu/styles.module.css +21 -0
- package/dist/esm/components/UserMenu/types.d.ts +20 -0
- package/dist/esm/components/UserMenu/types.js +5 -0
- package/dist/esm/components/index.d.ts +6 -0
- package/dist/esm/components/index.js +6 -0
- package/dist/esm/hooks/index.d.ts +1 -0
- package/dist/esm/hooks/index.js +1 -0
- package/dist/esm/hooks/useLocalStorage.d.ts +1 -0
- package/dist/esm/hooks/useLocalStorage.js +10 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +2 -0
- package/package.json +68 -0
- package/src/components/HeaderLayout/HeaderLayout.tsx +46 -0
- package/src/components/HeaderLayout/index.ts +1 -0
- package/src/components/HeaderLayout/styles.module.scss +38 -0
- package/src/components/Logo/Logo.tsx +93 -0
- package/src/components/Logo/index.ts +1 -0
- package/src/components/Logo/styles.module.scss +30 -0
- package/src/components/MainMenu/Content/Content.tsx +137 -0
- package/src/components/MainMenu/Content/index.ts +1 -0
- package/src/components/MainMenu/Content/styles.module.scss +35 -0
- package/src/components/MainMenu/MainMenu.tsx +51 -0
- package/src/components/MainMenu/MenuDesktop/MenuDesktop.tsx +120 -0
- package/src/components/MainMenu/MenuDesktop/index.ts +1 -0
- package/src/components/MainMenu/MenuDesktop/styles.module.scss +108 -0
- package/src/components/MainMenu/MenuMobile/MenuMobile.tsx +83 -0
- package/src/components/MainMenu/MenuMobile/index.ts +1 -0
- package/src/components/MainMenu/MenuMobile/styles.module.scss +26 -0
- package/src/components/MainMenu/Search/SearchDesktop/SearchDesktop.tsx +46 -0
- package/src/components/MainMenu/Search/SearchDesktop/index.ts +1 -0
- package/src/components/MainMenu/Search/SearchDesktop/styles.module.scss +21 -0
- package/src/components/MainMenu/Search/SearchMobile/SearchMobile.tsx +102 -0
- package/src/components/MainMenu/Search/SearchMobile/constants.ts +4 -0
- package/src/components/MainMenu/Search/SearchMobile/hooks.ts +43 -0
- package/src/components/MainMenu/Search/SearchMobile/index.ts +1 -0
- package/src/components/MainMenu/Search/SearchMobile/styles.module.scss +72 -0
- package/src/components/MainMenu/Search/SearchSettingsButton/SearchSettingsButton.tsx +22 -0
- package/src/components/MainMenu/Search/SearchSettingsButton/index.ts +1 -0
- package/src/components/MainMenu/Search/SearchSettingsButton/styles.module.scss +13 -0
- package/src/components/MainMenu/Search/index.ts +3 -0
- package/src/components/MainMenu/Search/types.ts +20 -0
- package/src/components/MainMenu/Search/useSearch.tsx +212 -0
- package/src/components/MainMenu/hooks.tsx +135 -0
- package/src/components/MainMenu/index.ts +4 -0
- package/src/components/MainMenu/styles.module.scss +28 -0
- package/src/components/MainMenu/types.ts +62 -0
- package/src/components/PathBreadcrumbs/PathBreadcrumbs.tsx +21 -0
- package/src/components/PathBreadcrumbs/index.ts +1 -0
- package/src/components/PathBreadcrumbs/styles.module.scss +10 -0
- package/src/components/PlatformLogo/Container.tsx +32 -0
- package/src/components/PlatformLogo/index.ts +8 -0
- package/src/components/PlatformLogo/styles.module.scss +13 -0
- package/src/components/UserMenu/UserMenu.tsx +138 -0
- package/src/components/UserMenu/hooks/useLogoutItem.tsx +28 -0
- package/src/components/UserMenu/hooks/useProfileItem.tsx +41 -0
- package/src/components/UserMenu/hooks/useThemeItem.tsx +116 -0
- package/src/components/UserMenu/hooks/useUserMenuItems.ts +77 -0
- package/src/components/UserMenu/index.ts +2 -0
- package/src/components/UserMenu/styles.module.scss +21 -0
- package/src/components/UserMenu/types.ts +24 -0
- package/src/components/index.ts +6 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useLocalStorage.ts +15 -0
- package/src/index.ts +2 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { MouseEventHandler } from 'react';
|
|
2
|
+
import { WithSupportProps } from '@snack-uikit/utils';
|
|
3
|
+
export declare const HEADER_LOGO_MODE: {
|
|
4
|
+
readonly develop: "develop";
|
|
5
|
+
readonly stage: "stage";
|
|
6
|
+
readonly hybrid: "hybrid";
|
|
7
|
+
readonly prod: "prod";
|
|
8
|
+
};
|
|
9
|
+
type ValueOf<T> = T[keyof T];
|
|
10
|
+
export type HeaderLogoMode = ValueOf<typeof HEADER_LOGO_MODE>;
|
|
11
|
+
export type LogoProps = WithSupportProps<{
|
|
12
|
+
loading?: boolean;
|
|
13
|
+
path?: string;
|
|
14
|
+
mode?: HeaderLogoMode;
|
|
15
|
+
href: string;
|
|
16
|
+
onClick?: MouseEventHandler<HTMLAnchorElement>;
|
|
17
|
+
className?: string;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function Logo({ path, loading, mode, href, onClick, className, ...rest }: LogoProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
import cn from 'classnames';
|
|
14
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
15
|
+
import { CloudLogoDevSVG, CloudLogoHybridSVG, CloudLogoStageSVG, CloudLogoSVG } from '@sbercloud/uikit-product-icons';
|
|
16
|
+
import { Skeleton } from '@snack-uikit/skeleton';
|
|
17
|
+
import { extractDataTestProps } from '@snack-uikit/utils';
|
|
18
|
+
import styles from './styles.module.css';
|
|
19
|
+
export const HEADER_LOGO_MODE = {
|
|
20
|
+
develop: 'develop',
|
|
21
|
+
stage: 'stage',
|
|
22
|
+
hybrid: 'hybrid',
|
|
23
|
+
prod: 'prod',
|
|
24
|
+
};
|
|
25
|
+
export function Logo(_a) {
|
|
26
|
+
var { path, loading, mode, href, onClick, className } = _a, rest = __rest(_a, ["path", "loading", "mode", "href", "onClick", "className"]);
|
|
27
|
+
const [error, setError] = useState(false);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
setError(false);
|
|
30
|
+
}, [path, loading]);
|
|
31
|
+
const logo = useMemo(() => {
|
|
32
|
+
if (path && !error) {
|
|
33
|
+
return (_jsx("img", { src: path, alt: 'logo', className: styles.logoImg, onLoad: () => {
|
|
34
|
+
setError(false);
|
|
35
|
+
}, onError: () => {
|
|
36
|
+
setError(true);
|
|
37
|
+
} }));
|
|
38
|
+
}
|
|
39
|
+
if (mode === HEADER_LOGO_MODE.develop) {
|
|
40
|
+
return _jsx(CloudLogoDevSVG, { size: 64 });
|
|
41
|
+
}
|
|
42
|
+
if (mode === HEADER_LOGO_MODE.stage) {
|
|
43
|
+
return _jsx(CloudLogoStageSVG, { size: 74 });
|
|
44
|
+
}
|
|
45
|
+
if (mode === HEADER_LOGO_MODE.hybrid) {
|
|
46
|
+
return _jsx(CloudLogoHybridSVG, { size: 78 });
|
|
47
|
+
}
|
|
48
|
+
return _jsx(CloudLogoSVG, { size: 24 });
|
|
49
|
+
}, [error, mode, path]);
|
|
50
|
+
if (loading) {
|
|
51
|
+
return (_jsx("div", { className: styles.skeletonWrapper, children: _jsx(Skeleton, { width: 24, height: 24, loading: true, borderRadius: 4 }) }));
|
|
52
|
+
}
|
|
53
|
+
return (_jsx("a", Object.assign({ className: cn(styles.logo, className), href: href, tabIndex: 0, onClick: onClick }, extractDataTestProps(rest), { children: logo })));
|
|
54
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Logo';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Logo';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
a.logo{
|
|
2
|
+
display:flex;
|
|
3
|
+
flex-shrink:0;
|
|
4
|
+
padding:var(--dimension-1m, 8px);
|
|
5
|
+
cursor:pointer;
|
|
6
|
+
border-radius:var(--dimension-050m, 4px);
|
|
7
|
+
min-width:40px;
|
|
8
|
+
box-sizing:border-box;
|
|
9
|
+
max-height:40px;
|
|
10
|
+
min-height:40px;
|
|
11
|
+
align-items:center;
|
|
12
|
+
}
|
|
13
|
+
a.logo:focus-visible{
|
|
14
|
+
outline-width:var(--border-state-focus-s-border-width, 2px);
|
|
15
|
+
outline-style:var(--border-state-focus-s-border-style, solid);
|
|
16
|
+
outline-color:var(--border-state-focus-s-border-color, );
|
|
17
|
+
outline-color:var(--sys-available-complementary, #1c1c24);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.skeletonWrapper{
|
|
21
|
+
padding:var(--dimension-1m, 8px);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.logoImg{
|
|
25
|
+
width:auto;
|
|
26
|
+
max-height:24px;
|
|
27
|
+
min-height:24px;
|
|
28
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ReactElement, ReactNode } from 'react';
|
|
2
|
+
import { LinksGroup } from '../types';
|
|
3
|
+
export type ContentProps = {
|
|
4
|
+
searchValue?: string;
|
|
5
|
+
serviceGroups?: LinksGroup[];
|
|
6
|
+
search?: ReactNode;
|
|
7
|
+
banners?: ReactNode;
|
|
8
|
+
cards?: ReactElement[];
|
|
9
|
+
footer?: ReactNode;
|
|
10
|
+
favorite?: {
|
|
11
|
+
value: string[];
|
|
12
|
+
onChange: (productId: string) => (addingValue: boolean) => void;
|
|
13
|
+
};
|
|
14
|
+
isMobile?: boolean;
|
|
15
|
+
initialEmpty?: boolean;
|
|
16
|
+
className?: string;
|
|
17
|
+
onLinkChange?: (value: string) => void;
|
|
18
|
+
onClose?(): void;
|
|
19
|
+
};
|
|
20
|
+
export declare function Content({ searchValue, banners, search, serviceGroups, className, footer, favorite, isMobile, onClose, onLinkChange, }: ContentProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useMemo } from 'react';
|
|
3
|
+
import { CardServiceSmall } from '@sbercloud/uikit-product-card-predefined';
|
|
4
|
+
import { useLocale } from '@sbercloud/uikit-product-locale';
|
|
5
|
+
import { TitleClickable } from '@sbercloud/uikit-product-title-clickable';
|
|
6
|
+
import styles from './styles.module.css';
|
|
7
|
+
export function Content({ searchValue, banners, search, serviceGroups, className, footer, favorite, isMobile, onClose, onLinkChange, }) {
|
|
8
|
+
const { t } = useLocale('Header');
|
|
9
|
+
const wrappedClick = useCallback(({ disabled, onClick }, cb) => (e) => {
|
|
10
|
+
if (disabled) {
|
|
11
|
+
e === null || e === void 0 ? void 0 : e.preventDefault();
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (!(e === null || e === void 0 ? void 0 : e.metaKey)) {
|
|
15
|
+
e === null || e === void 0 ? void 0 : e.preventDefault();
|
|
16
|
+
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
17
|
+
}
|
|
18
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(e);
|
|
19
|
+
cb === null || cb === void 0 ? void 0 : cb();
|
|
20
|
+
}, [onClose]);
|
|
21
|
+
const cards = useMemo(() => serviceGroups === null || serviceGroups === void 0 ? void 0 : serviceGroups.map(({ id, label, items }) => (_jsxs("div", { className: styles.card, id: id, "data-test-id": `header__drawer-menu__group-card-${id}`, children: [!label.onClick ? (_jsx("span", { className: styles.cardTitle, children: label.text })) : (_jsx(TitleClickable, { title: label.text, href: '#', onClick: label.onClick })), _jsx("div", { className: styles.cardBody, "data-mobile": isMobile || undefined, children: items.map(service => (_jsx(CardServiceSmall, { title: service.label, emblem: { icon: service.icon }, "data-test-id": `header__drawer-menu__link-${service.id}`, outline: true, href: service.href, onClick: wrappedClick(service, () => onLinkChange === null || onLinkChange === void 0 ? void 0 : onLinkChange(service.id)), favorite: favorite
|
|
22
|
+
? {
|
|
23
|
+
checked: favorite === null || favorite === void 0 ? void 0 : favorite.value.includes(service.id),
|
|
24
|
+
onChange: favorite === null || favorite === void 0 ? void 0 : favorite.onChange(service.id),
|
|
25
|
+
visibilityStrategy: isMobile ? 'always' : 'hover',
|
|
26
|
+
enabled: !service.disabled,
|
|
27
|
+
}
|
|
28
|
+
: undefined, promoBadge: service.badge }, String(id) + service.id))) })] }, String(id)))), [favorite, isMobile, onLinkChange, serviceGroups, wrappedClick]);
|
|
29
|
+
return (_jsxs(_Fragment, { children: [(Boolean(serviceGroups === null || serviceGroups === void 0 ? void 0 : serviceGroups.length) || searchValue) && search, _jsxs("div", { className: className, children: [!searchValue && banners, cards, !(cards === null || cards === void 0 ? void 0 : cards.length) && !searchValue && (_jsx("div", { className: styles.noData, "data-test-id": 'header__drawer-menu__no-data', children: t('noData') })), !(cards === null || cards === void 0 ? void 0 : cards.length) && searchValue && (_jsx("div", { className: styles.noData, "data-test-id": 'header__drawer-menu__no-data-found', children: t('noDataFound') })), footer] })] }));
|
|
30
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Content';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Content';
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
.card{
|
|
2
|
+
background-color:var(--sys-neutral-background1-level, #fdfdfd);
|
|
3
|
+
display:flex;
|
|
4
|
+
flex-direction:column;
|
|
5
|
+
padding:var(--dimension-2m, 16px);
|
|
6
|
+
gap:var(--dimension-1m, 8px);
|
|
7
|
+
border-radius:var(--dimension-1m, 8px);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.cardTitle{
|
|
11
|
+
font-family:var(--sans-title-m-font-family, SB Sans Interface);
|
|
12
|
+
font-weight:var(--sans-title-m-font-weight, Semibold);
|
|
13
|
+
line-height:var(--sans-title-m-line-height, 24px);
|
|
14
|
+
font-size:var(--sans-title-m-font-size, 16px);
|
|
15
|
+
letter-spacing:var(--sans-title-m-letter-spacing, 0.15px);
|
|
16
|
+
paragraph-spacing:var(--sans-title-m-paragraph-spacing, 8.8px);
|
|
17
|
+
color:var(--sys-neutral-text-main, #41424e);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.cardBody{
|
|
21
|
+
display:grid;
|
|
22
|
+
grid-template-columns:repeat(2, minmax(150px, 1fr));
|
|
23
|
+
gap:var(--dimension-1m, 8px);
|
|
24
|
+
}
|
|
25
|
+
.cardBody[data-mobile]{
|
|
26
|
+
grid-template-columns:repeat(auto-fit, minmax(200px, 1fr));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.noData{
|
|
30
|
+
font-family:var(--sans-body-l-font-family, SB Sans Interface);
|
|
31
|
+
font-weight:var(--sans-body-l-font-weight, Regular);
|
|
32
|
+
line-height:var(--sans-body-l-line-height, 24px);
|
|
33
|
+
font-size:var(--sans-body-l-font-size, 16px);
|
|
34
|
+
letter-spacing:var(--sans-body-l-letter-spacing, 0.1px);
|
|
35
|
+
paragraph-spacing:var(--sans-body-l-paragraph-spacing, 8.8px);
|
|
36
|
+
color:var(--sys-neutral-text-light, #8b8e9b);
|
|
37
|
+
display:flex;
|
|
38
|
+
justify-content:center;
|
|
39
|
+
padding:var(--dimension-2m, 16px);
|
|
40
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { MainMenuProps } from './types';
|
|
2
|
+
export declare function MainMenu({ open: openProp, setOpen: setOpenProp, settingItems, leftTop, rightTop, serviceGroups, favorite, search, isMobile, onLinkChange, disabled, }: MainMenuProps & {
|
|
3
|
+
disabled?: boolean;
|
|
4
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { MainMenuSVG } from '@sbercloud/uikit-product-icons';
|
|
3
|
+
import { ButtonFunction } from '@snack-uikit/button';
|
|
4
|
+
import { useValueControl } from '@snack-uikit/utils';
|
|
5
|
+
import { MenuDesktop } from './MenuDesktop';
|
|
6
|
+
import { MenuMobile } from './MenuMobile';
|
|
7
|
+
export function MainMenu({ open: openProp, setOpen: setOpenProp, settingItems, leftTop, rightTop, serviceGroups, favorite, search, isMobile, onLinkChange, disabled, }) {
|
|
8
|
+
const [open = false, setOpen] = useValueControl({ value: openProp, onChange: setOpenProp });
|
|
9
|
+
const MenuComponent = isMobile ? MenuMobile : MenuDesktop;
|
|
10
|
+
return (_jsxs(_Fragment, { children: [_jsx(ButtonFunction, { disabled: disabled, size: 'm', icon: _jsx(MainMenuSVG, {}), onClick: () => {
|
|
11
|
+
setOpen(true);
|
|
12
|
+
}, "data-test-id": 'header__drawer-menu-button' }), _jsx(MenuComponent, { onLinkChange: onLinkChange, settingItems: settingItems, serviceGroups: serviceGroups, search: search, leftTop: leftTop, rightTop: rightTop, favorite: favorite, open: open, setOpen: setOpen })] }));
|
|
13
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import cn from 'classnames';
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { DrawerCustom } from '@snack-uikit/drawer';
|
|
5
|
+
import { isBaseItemProps, List } from '@snack-uikit/list';
|
|
6
|
+
import { Scroll } from '@snack-uikit/scroll';
|
|
7
|
+
import { useValueControl } from '@snack-uikit/utils';
|
|
8
|
+
import { Content } from '../Content';
|
|
9
|
+
import { useMenuItems } from '../hooks';
|
|
10
|
+
import { SearchDesktop } from '../Search';
|
|
11
|
+
import styles from './styles.module.css';
|
|
12
|
+
export function MenuDesktop({ open: openProp, setOpen: setOpenProp, settingItems, leftTop, rightTop, serviceGroups, favorite, search, onLinkChange, }) {
|
|
13
|
+
const [open = false, setOpen] = useValueControl({ value: openProp, onChange: setOpenProp });
|
|
14
|
+
const { groupItems, scrollRef, searchRef, resultItems } = useMenuItems({
|
|
15
|
+
serviceGroups,
|
|
16
|
+
search,
|
|
17
|
+
favorite,
|
|
18
|
+
});
|
|
19
|
+
const isInitialEmptyCards = (serviceGroups === null || serviceGroups === void 0 ? void 0 : serviceGroups.length) === 0;
|
|
20
|
+
const isNeedRightBlock = rightTop || !isInitialEmptyCards;
|
|
21
|
+
const settingItemsWithClassName = settingItems.filter(isBaseItemProps).map(item => (Object.assign(Object.assign({}, item), { className: styles.item })));
|
|
22
|
+
const groupItemsWithClass = useMemo(() => groupItems.map(item => (Object.assign(Object.assign({}, item), { className: styles.item }))), [groupItems]);
|
|
23
|
+
return (_jsx(DrawerCustom, { open: open, onClose: () => {
|
|
24
|
+
setOpen(false);
|
|
25
|
+
}, size: isNeedRightBlock ? 'm' : 's', position: 'left', className: styles.drawer, rootClassName: styles.drawerRoot, "data-test-id": 'header__drawer-menu', "data-small": !isNeedRightBlock || undefined, children: _jsxs("div", { className: styles.menu, children: [_jsxs("div", { className: styles.left, "data-test-id": 'header__drawer-menu__left', children: [leftTop && _jsx("div", { className: styles.leftTop, children: leftTop }), !isInitialEmptyCards && (_jsx(List, { items: groupItemsWithClass, pinBottom: settingItemsWithClassName, scroll: true, size: 'm', barHideStrategy: 'never', className: styles.list })), !leftTop && isInitialEmptyCards && _jsx("div", {}), isInitialEmptyCards && settingItemsWithClassName.length > 0 && (_jsx("div", { className: cn(styles.list, styles.halfList), children: _jsx(List, { items: settingItems.filter(isBaseItemProps).map(item => (Object.assign(Object.assign({}, item), { className: styles.item }))), size: 'm', barHideStrategy: 'never' }) }))] }), isNeedRightBlock && (_jsx("div", { className: styles.right, "data-test-id": 'header__drawer-menu__right', children: _jsxs(Scroll, { paddingAbsolute: true, className: styles.scroll, ref: scrollRef, barHideStrategy: 'never', children: [isInitialEmptyCards && rightTop && _jsx("div", { className: styles.bannersWrap, children: rightTop }), !isInitialEmptyCards && (_jsx(Content, { onClose: () => {
|
|
26
|
+
setOpen(false);
|
|
27
|
+
}, className: styles.rightContent, search: search && _jsx(SearchDesktop, Object.assign({}, search, { ref: searchRef })), searchValue: search && search.searchValue, banners: rightTop, favorite: favorite, serviceGroups: resultItems, onLinkChange: onLinkChange }))] }) }))] }) }));
|
|
28
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MenuDesktop';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MenuDesktop';
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
.drawer [data-test-id=drawer__close-button]{
|
|
2
|
+
display:none;
|
|
3
|
+
}
|
|
4
|
+
.drawer svg{
|
|
5
|
+
fill:currentColor;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.scroll{
|
|
9
|
+
padding:28px 28px 0 12px;
|
|
10
|
+
box-sizing:border-box;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.left{
|
|
14
|
+
display:flex;
|
|
15
|
+
flex-direction:column;
|
|
16
|
+
padding:32px 16px 24px 32px;
|
|
17
|
+
gap:16px;
|
|
18
|
+
justify-content:space-between;
|
|
19
|
+
position:relative;
|
|
20
|
+
box-sizing:border-box;
|
|
21
|
+
width:272px;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.drawerRoot [data-test-id=header__drawer-menu][data-small]{
|
|
25
|
+
width:316px;
|
|
26
|
+
}
|
|
27
|
+
.drawerRoot [data-test-id=header__drawer-menu][data-small] .left{
|
|
28
|
+
width:316px;
|
|
29
|
+
}
|
|
30
|
+
.drawerRoot [data-test-id=header__drawer-menu]:not([data-small]){
|
|
31
|
+
min-width:744px;
|
|
32
|
+
overflow:hidden;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.leftTop{
|
|
36
|
+
display:flex;
|
|
37
|
+
flex-direction:column;
|
|
38
|
+
gap:var(--dimension-1m, 8px);
|
|
39
|
+
flex-grow:1;
|
|
40
|
+
min-height:var(--dimension-7m, 56px);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.right{
|
|
44
|
+
display:flex;
|
|
45
|
+
flex-direction:column;
|
|
46
|
+
height:100dvh;
|
|
47
|
+
flex:1;
|
|
48
|
+
min-width:0;
|
|
49
|
+
position:relative;
|
|
50
|
+
}
|
|
51
|
+
.right::before{
|
|
52
|
+
content:"";
|
|
53
|
+
position:absolute;
|
|
54
|
+
top:32px;
|
|
55
|
+
left:0;
|
|
56
|
+
background-color:var(--sys-neutral-decor-default, #dde0ea);
|
|
57
|
+
width:1px;
|
|
58
|
+
bottom:24px;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.rightContent{
|
|
62
|
+
display:flex;
|
|
63
|
+
flex-direction:column;
|
|
64
|
+
gap:8px;
|
|
65
|
+
padding:4px;
|
|
66
|
+
padding-bottom:24px;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.menu{
|
|
70
|
+
display:flex;
|
|
71
|
+
height:100%;
|
|
72
|
+
box-sizing:border-box;
|
|
73
|
+
background-color:var(--sys-neutral-background, #eeeff3);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.list{
|
|
77
|
+
margin-left:-31px !important;
|
|
78
|
+
margin-right:-16px !important;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.halfList{
|
|
82
|
+
border-top:1px solid var(--sys-neutral-decor-default, #dde0ea);
|
|
83
|
+
padding-top:8px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.item{
|
|
87
|
+
padding-left:22px !important;
|
|
88
|
+
box-sizing:border-box;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.bannersWrap{
|
|
92
|
+
padding:var(--dimension-050m, 4px);
|
|
93
|
+
padding-top:var(--dimension-025m, 2px);
|
|
94
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useLocale } from '@sbercloud/uikit-product-locale';
|
|
3
|
+
import { MobileDrawerCustom } from '@sbercloud/uikit-product-mobile-drawer';
|
|
4
|
+
import { isBaseItemProps, List } from '@snack-uikit/list';
|
|
5
|
+
import { Scroll } from '@snack-uikit/scroll';
|
|
6
|
+
import { useValueControl } from '@snack-uikit/utils';
|
|
7
|
+
import { Content } from '../Content';
|
|
8
|
+
import { useMenuItems } from '../hooks';
|
|
9
|
+
import { SearchMobile } from '../Search';
|
|
10
|
+
import styles from './styles.module.css';
|
|
11
|
+
export function MenuMobile({ open: openProp, setOpen: setOpenProp, settingItems, leftTop, rightTop, serviceGroups, favorite, search, onLinkChange, }) {
|
|
12
|
+
const [open = false, setOpen] = useValueControl({ value: openProp, onChange: setOpenProp });
|
|
13
|
+
const { t } = useLocale('Header');
|
|
14
|
+
const isInitialEmptyCards = (serviceGroups === null || serviceGroups === void 0 ? void 0 : serviceGroups.length) === 0;
|
|
15
|
+
const { searchRef, resultItems } = useMenuItems({
|
|
16
|
+
serviceGroups,
|
|
17
|
+
search,
|
|
18
|
+
favorite,
|
|
19
|
+
});
|
|
20
|
+
return (_jsxs(MobileDrawerCustom, { open: open, onClose: () => {
|
|
21
|
+
setOpen(false);
|
|
22
|
+
}, className: styles.drawerMobile, swipeEnabled: false, "data-test-id": 'header__drawer-menu-mobile', closeOnPopstate: true, children: [_jsx(MobileDrawerCustom.Header, { title: t('navigation') }), _jsx(Scroll, { barHideStrategy: 'never', children: _jsxs("div", { className: styles.scrollMobile, children: [top && _jsx("div", { className: styles.rightContent, children: leftTop }), !isInitialEmptyCards && (_jsx(Content, { isMobile: true, onClose: () => {
|
|
23
|
+
setOpen(false);
|
|
24
|
+
}, onLinkChange: onLinkChange, search: search && _jsx(SearchMobile, Object.assign({}, search, { ref: searchRef })), className: styles.rightContent, searchValue: search && search.searchValue, banners: rightTop, favorite: favorite, serviceGroups: resultItems })), isInitialEmptyCards && rightTop && _jsx("div", { className: styles.bannersWrap, children: rightTop }), settingItems.length > 0 && (_jsx(List, { className: styles.settings, items: [{ type: 'group', items: [], divider: true }, ...settingItems.filter(isBaseItemProps)], size: 'm', barHideStrategy: 'never' }))] }) })] }));
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MenuMobile';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MenuMobile';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
.rightContent{
|
|
2
|
+
display:flex;
|
|
3
|
+
flex-direction:column;
|
|
4
|
+
gap:var(--dimension-1m, 8px);
|
|
5
|
+
padding-top:4px;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.drawerMobile{
|
|
9
|
+
background-color:var(--sys-neutral-background, #eeeff3) !important;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.scrollMobile{
|
|
13
|
+
padding:var(--dimension-2m, 16px);
|
|
14
|
+
padding-top:0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.bannersWrap{
|
|
18
|
+
margin-top:var(--dimension-1m, 8px);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.settings{
|
|
22
|
+
margin-top:var(--dimension-1m, 8px);
|
|
23
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, useState } from 'react';
|
|
3
|
+
import { useLocale } from '@sbercloud/uikit-product-locale';
|
|
4
|
+
import { ChipToggle } from '@snack-uikit/chips';
|
|
5
|
+
import { Search } from '@snack-uikit/search';
|
|
6
|
+
import { SearchSettingsButton } from '../SearchSettingsButton';
|
|
7
|
+
import styles from './styles.module.css';
|
|
8
|
+
export const SearchDesktop = forwardRef(({ searchValue, searchFn, searchFunctions, onChangeSearchFn, onSearchValueChange }, ref) => {
|
|
9
|
+
const { t } = useLocale('Header');
|
|
10
|
+
const [areSearchSettingsVisible, setAreSearchSettingsVisible] = useState(false);
|
|
11
|
+
return (_jsxs("div", { className: styles.searchItem, ref: ref, children: [_jsx(Search, { size: 'm', outline: true, placeholder: t('searchByServices'), value: searchValue, onChange: onSearchValueChange, "data-test-id": 'header__drawer-menu__search', className: styles.search, postfix: _jsx(SearchSettingsButton, { onClick: () => setAreSearchSettingsVisible(prevOpen => !prevOpen) }) }), areSearchSettingsVisible && (_jsx("div", { className: styles.searchSettingsChips, children: searchFunctions.map(item => (_jsx(ChipToggle, { label: item.label, checked: searchFn === item.id, onChange: () => onChangeSearchFn(item.id), "data-test-id": `header__drawer-menu__search-option-${item.id}`, size: 'xs' }, item.id))) }))] }));
|
|
12
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SearchDesktop';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SearchDesktop';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
.searchItem{
|
|
2
|
+
position:sticky;
|
|
3
|
+
z-index:1;
|
|
4
|
+
top:0;
|
|
5
|
+
background-color:var(--sys-neutral-background, #eeeff3);
|
|
6
|
+
padding:4px;
|
|
7
|
+
padding-bottom:var(--dimension-1m, 8px);
|
|
8
|
+
display:flex;
|
|
9
|
+
flex-direction:column;
|
|
10
|
+
gap:var(--dimension-1m, 8px);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.searchSettingsChips{
|
|
14
|
+
display:flex;
|
|
15
|
+
flex-direction:row;
|
|
16
|
+
gap:var(--dimension-050m, 4px);
|
|
17
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, useState } from 'react';
|
|
3
|
+
import { SearchSVG } from '@sbercloud/uikit-product-icons';
|
|
4
|
+
import { useLocale } from '@sbercloud/uikit-product-locale';
|
|
5
|
+
import { MobileModalCustom } from '@sbercloud/uikit-product-mobile-modal';
|
|
6
|
+
import { ButtonElevated } from '@snack-uikit/button';
|
|
7
|
+
import { List } from '@snack-uikit/list';
|
|
8
|
+
import { Search } from '@snack-uikit/search';
|
|
9
|
+
import { Typography } from '@snack-uikit/typography';
|
|
10
|
+
import { SearchSettingsButton } from '../SearchSettingsButton';
|
|
11
|
+
import { SEARCH_TRANSITION_TIMEOUT } from './constants';
|
|
12
|
+
import { useSearchAnimation } from './hooks';
|
|
13
|
+
import styles from './styles.module.css';
|
|
14
|
+
export const SearchMobile = forwardRef(({ searchValue, searchFn, searchFunctions, onChangeSearchFn, onSearchValueChange }, ref) => {
|
|
15
|
+
const { t } = useLocale('Header');
|
|
16
|
+
const [areSearchSettingsVisible, setAreSearchSettingsVisible] = useState(false);
|
|
17
|
+
const { searchRef: newSearchRef, animationState, toggleSearchActive, isSearchActive, searchInputTabIndex, } = useSearchAnimation();
|
|
18
|
+
return (_jsx("div", { className: styles.searchItem, ref: ref, children: _jsxs("div", { className: styles.searchWrap, style: {
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
'--sc-header-animation-enter': SEARCH_TRANSITION_TIMEOUT.enter,
|
|
22
|
+
'--sc-header-animation-exit': SEARCH_TRANSITION_TIMEOUT.exit,
|
|
23
|
+
}, children: [_jsx(Typography.SansTitleM, { children: t('services') }), _jsxs("div", { className: styles.searchMobile, "data-transition-status": animationState.status, "data-is-mounted": animationState.isMounted || undefined, children: [_jsx(Search, { size: 'm', placeholder: t('searchByServices'), value: searchValue, onChange: onSearchValueChange, "data-test-id": 'header__drawer-menu__search', ref: newSearchRef, tabIndex: searchInputTabIndex, postfix: _jsx(SearchSettingsButton, { onClick: () => setAreSearchSettingsVisible(true) }) }), _jsxs(MobileModalCustom, { open: areSearchSettingsVisible, onClose: () => setAreSearchSettingsVisible(false), closeOnPopstate: true, closeButtonEnabled: true, children: [_jsx(MobileModalCustom.Header, { title: t('searchSettingsMobileModalHeader') }), _jsx("div", { className: styles.searchModalBody, children: _jsx(List, { className: styles.searchSettingsMobileOptions, items: searchFunctions.map(item => ({
|
|
24
|
+
id: item.id,
|
|
25
|
+
content: {
|
|
26
|
+
option: item.label,
|
|
27
|
+
},
|
|
28
|
+
})), size: 'm', selection: {
|
|
29
|
+
mode: 'single',
|
|
30
|
+
value: searchFn,
|
|
31
|
+
onChange: value => {
|
|
32
|
+
onChangeSearchFn(value);
|
|
33
|
+
setAreSearchSettingsVisible(false);
|
|
34
|
+
},
|
|
35
|
+
} }) })] })] }), _jsx(ButtonElevated, { size: 'm', className: styles.searchButton, icon: _jsx(SearchSVG, {}), onClick: toggleSearchActive, "data-test-id": 'header__drawer-menu__close-search-icon', "data-search-active": isSearchActive || undefined })] }) }));
|
|
36
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function useSearchAnimation(): {
|
|
2
|
+
searchRef: import("react").RefObject<HTMLInputElement>;
|
|
3
|
+
toggleSearchActive: () => void;
|
|
4
|
+
isSearchActive: boolean;
|
|
5
|
+
animationState: Readonly<{
|
|
6
|
+
status: import("react-transition-state").TransitionStatus;
|
|
7
|
+
isMounted: boolean;
|
|
8
|
+
isEnter: boolean;
|
|
9
|
+
isResolved: boolean;
|
|
10
|
+
}>;
|
|
11
|
+
searchInputTabIndex: number | undefined;
|
|
12
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import useTransition from 'react-transition-state';
|
|
3
|
+
import { SEARCH_TRANSITION_TIMEOUT } from './constants';
|
|
4
|
+
export function useSearchAnimation() {
|
|
5
|
+
const searchRef = useRef(null);
|
|
6
|
+
const [isSearchActive, setIsSearchActive] = useState(false);
|
|
7
|
+
const searchInputTabIndex = isSearchActive ? undefined : -1;
|
|
8
|
+
const [animationState, toggle] = useTransition({
|
|
9
|
+
mountOnEnter: true,
|
|
10
|
+
unmountOnExit: true,
|
|
11
|
+
initialEntered: isSearchActive,
|
|
12
|
+
timeout: SEARCH_TRANSITION_TIMEOUT,
|
|
13
|
+
});
|
|
14
|
+
useEffect(() => toggle(isSearchActive), [isSearchActive]);
|
|
15
|
+
const toggleSearchActive = () => setIsSearchActive(prevState => !prevState);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
var _a;
|
|
18
|
+
if (isSearchActive) {
|
|
19
|
+
(_a = searchRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
20
|
+
}
|
|
21
|
+
return () => {
|
|
22
|
+
if (isSearchActive) {
|
|
23
|
+
setIsSearchActive(false);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}, [isSearchActive]);
|
|
27
|
+
return {
|
|
28
|
+
searchRef,
|
|
29
|
+
toggleSearchActive,
|
|
30
|
+
isSearchActive,
|
|
31
|
+
animationState,
|
|
32
|
+
searchInputTabIndex,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SearchMobile';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SearchMobile';
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
.searchItem{
|
|
2
|
+
position:sticky;
|
|
3
|
+
z-index:1;
|
|
4
|
+
top:-0.5px;
|
|
5
|
+
background-color:var(--sys-neutral-background, #eeeff3);
|
|
6
|
+
display:flex;
|
|
7
|
+
flex-direction:column;
|
|
8
|
+
gap:var(--dimension-1m, 8px);
|
|
9
|
+
padding:0;
|
|
10
|
+
padding-bottom:var(--dimension-1m, 8px);
|
|
11
|
+
padding-top:1px;
|
|
12
|
+
margin-top:7px;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.searchWrap{
|
|
16
|
+
position:relative;
|
|
17
|
+
display:flex;
|
|
18
|
+
justify-content:space-between;
|
|
19
|
+
align-items:center;
|
|
20
|
+
color:var(--sys-neutral-text-main, #41424e);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.searchMobile{
|
|
24
|
+
position:absolute;
|
|
25
|
+
top:0;
|
|
26
|
+
bottom:0;
|
|
27
|
+
height:100%;
|
|
28
|
+
right:0;
|
|
29
|
+
overflow:hidden;
|
|
30
|
+
display:flex;
|
|
31
|
+
align-items:center;
|
|
32
|
+
transition-timing-function:ease-in-out;
|
|
33
|
+
transition-property:all;
|
|
34
|
+
transition-duration:calc(var(--sc-header-animation-enter) * 1ms);
|
|
35
|
+
width:100%;
|
|
36
|
+
max-width:var(--size-button-m, 40px);
|
|
37
|
+
box-sizing:border-box;
|
|
38
|
+
opacity:0;
|
|
39
|
+
}
|
|
40
|
+
.searchMobile[data-transition-status=entering], .searchMobile[data-transition-status=entered]{
|
|
41
|
+
max-width:100%;
|
|
42
|
+
right:0;
|
|
43
|
+
width:100%;
|
|
44
|
+
opacity:1;
|
|
45
|
+
transition-duration:calc(var(--sc-header-animation-exit) * 1ms);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.searchButton[data-appearance=primary]{
|
|
49
|
+
background-color:var(--sys-neutral-background2-level, #ffffff);
|
|
50
|
+
}
|
|
51
|
+
.searchButton[data-search-active]{
|
|
52
|
+
visibility:hidden;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.searchModalBody{
|
|
56
|
+
padding:var(--dimension-2m, 16px) 0;
|
|
57
|
+
}
|