@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.
Files changed (240) hide show
  1. package/CHANGELOG.md +3498 -0
  2. package/LICENSE +201 -0
  3. package/README.md +322 -0
  4. package/dist/cjs/components/HeaderLayout/HeaderLayout.d.ts +12 -0
  5. package/dist/cjs/components/HeaderLayout/HeaderLayout.js +25 -0
  6. package/dist/cjs/components/HeaderLayout/index.d.ts +1 -0
  7. package/dist/cjs/components/HeaderLayout/index.js +17 -0
  8. package/dist/cjs/components/HeaderLayout/styles.module.css +35 -0
  9. package/dist/cjs/components/Logo/Logo.d.ts +20 -0
  10. package/dist/cjs/components/Logo/Logo.js +61 -0
  11. package/dist/cjs/components/Logo/index.d.ts +1 -0
  12. package/dist/cjs/components/Logo/index.js +17 -0
  13. package/dist/cjs/components/Logo/styles.module.css +28 -0
  14. package/dist/cjs/components/MainMenu/Content/Content.d.ts +20 -0
  15. package/dist/cjs/components/MainMenu/Content/Content.js +36 -0
  16. package/dist/cjs/components/MainMenu/Content/index.d.ts +1 -0
  17. package/dist/cjs/components/MainMenu/Content/index.js +17 -0
  18. package/dist/cjs/components/MainMenu/Content/styles.module.css +40 -0
  19. package/dist/cjs/components/MainMenu/MainMenu.d.ts +4 -0
  20. package/dist/cjs/components/MainMenu/MainMenu.js +16 -0
  21. package/dist/cjs/components/MainMenu/MenuDesktop/MenuDesktop.d.ts +2 -0
  22. package/dist/cjs/components/MainMenu/MenuDesktop/MenuDesktop.js +34 -0
  23. package/dist/cjs/components/MainMenu/MenuDesktop/index.d.ts +1 -0
  24. package/dist/cjs/components/MainMenu/MenuDesktop/index.js +17 -0
  25. package/dist/cjs/components/MainMenu/MenuDesktop/styles.module.css +94 -0
  26. package/dist/cjs/components/MainMenu/MenuMobile/MenuMobile.d.ts +2 -0
  27. package/dist/cjs/components/MainMenu/MenuMobile/MenuMobile.js +31 -0
  28. package/dist/cjs/components/MainMenu/MenuMobile/index.d.ts +1 -0
  29. package/dist/cjs/components/MainMenu/MenuMobile/index.js +17 -0
  30. package/dist/cjs/components/MainMenu/MenuMobile/styles.module.css +23 -0
  31. package/dist/cjs/components/MainMenu/Search/SearchDesktop/SearchDesktop.d.ts +2 -0
  32. package/dist/cjs/components/MainMenu/Search/SearchDesktop/SearchDesktop.js +18 -0
  33. package/dist/cjs/components/MainMenu/Search/SearchDesktop/index.d.ts +1 -0
  34. package/dist/cjs/components/MainMenu/Search/SearchDesktop/index.js +17 -0
  35. package/dist/cjs/components/MainMenu/Search/SearchDesktop/styles.module.css +17 -0
  36. package/dist/cjs/components/MainMenu/Search/SearchMobile/SearchMobile.d.ts +2 -0
  37. package/dist/cjs/components/MainMenu/Search/SearchMobile/SearchMobile.js +42 -0
  38. package/dist/cjs/components/MainMenu/Search/SearchMobile/constants.d.ts +4 -0
  39. package/dist/cjs/components/MainMenu/Search/SearchMobile/constants.js +7 -0
  40. package/dist/cjs/components/MainMenu/Search/SearchMobile/hooks.d.ts +12 -0
  41. package/dist/cjs/components/MainMenu/Search/SearchMobile/hooks.js +40 -0
  42. package/dist/cjs/components/MainMenu/Search/SearchMobile/index.d.ts +1 -0
  43. package/dist/cjs/components/MainMenu/Search/SearchMobile/index.js +17 -0
  44. package/dist/cjs/components/MainMenu/Search/SearchMobile/styles.module.css +57 -0
  45. package/dist/cjs/components/MainMenu/Search/SearchSettingsButton/SearchSettingsButton.d.ts +4 -0
  46. package/dist/cjs/components/MainMenu/Search/SearchSettingsButton/SearchSettingsButton.js +13 -0
  47. package/dist/cjs/components/MainMenu/Search/SearchSettingsButton/index.d.ts +1 -0
  48. package/dist/cjs/components/MainMenu/Search/SearchSettingsButton/index.js +17 -0
  49. package/dist/cjs/components/MainMenu/Search/SearchSettingsButton/styles.module.css +11 -0
  50. package/dist/cjs/components/MainMenu/Search/index.d.ts +3 -0
  51. package/dist/cjs/components/MainMenu/Search/index.js +19 -0
  52. package/dist/cjs/components/MainMenu/Search/types.d.ts +14 -0
  53. package/dist/cjs/components/MainMenu/Search/types.js +2 -0
  54. package/dist/cjs/components/MainMenu/Search/useSearch.d.ts +8 -0
  55. package/dist/cjs/components/MainMenu/Search/useSearch.js +169 -0
  56. package/dist/cjs/components/MainMenu/hooks.d.ts +10 -0
  57. package/dist/cjs/components/MainMenu/hooks.js +108 -0
  58. package/dist/cjs/components/MainMenu/index.d.ts +4 -0
  59. package/dist/cjs/components/MainMenu/index.js +20 -0
  60. package/dist/cjs/components/MainMenu/styles.module.css +28 -0
  61. package/dist/cjs/components/MainMenu/types.d.ts +49 -0
  62. package/dist/cjs/components/MainMenu/types.js +2 -0
  63. package/dist/cjs/components/PathBreadcrumbs/PathBreadcrumbs.d.ts +7 -0
  64. package/dist/cjs/components/PathBreadcrumbs/PathBreadcrumbs.js +12 -0
  65. package/dist/cjs/components/PathBreadcrumbs/index.d.ts +1 -0
  66. package/dist/cjs/components/PathBreadcrumbs/index.js +17 -0
  67. package/dist/cjs/components/PathBreadcrumbs/styles.module.css +5 -0
  68. package/dist/cjs/components/PlatformLogo/Container.d.ts +12 -0
  69. package/dist/cjs/components/PlatformLogo/Container.js +28 -0
  70. package/dist/cjs/components/PlatformLogo/index.d.ts +4 -0
  71. package/dist/cjs/components/PlatformLogo/index.js +9 -0
  72. package/dist/cjs/components/PlatformLogo/styles.module.css +11 -0
  73. package/dist/cjs/components/UserMenu/UserMenu.d.ts +14 -0
  74. package/dist/cjs/components/UserMenu/UserMenu.js +54 -0
  75. package/dist/cjs/components/UserMenu/hooks/useLogoutItem.d.ts +6 -0
  76. package/dist/cjs/components/UserMenu/hooks/useLogoutItem.js +21 -0
  77. package/dist/cjs/components/UserMenu/hooks/useProfileItem.d.ts +3 -0
  78. package/dist/cjs/components/UserMenu/hooks/useProfileItem.js +29 -0
  79. package/dist/cjs/components/UserMenu/hooks/useThemeItem.d.ts +6 -0
  80. package/dist/cjs/components/UserMenu/hooks/useThemeItem.js +75 -0
  81. package/dist/cjs/components/UserMenu/hooks/useUserMenuItems.d.ts +13 -0
  82. package/dist/cjs/components/UserMenu/hooks/useUserMenuItems.js +42 -0
  83. package/dist/cjs/components/UserMenu/index.d.ts +2 -0
  84. package/dist/cjs/components/UserMenu/index.js +18 -0
  85. package/dist/cjs/components/UserMenu/styles.module.css +21 -0
  86. package/dist/cjs/components/UserMenu/types.d.ts +20 -0
  87. package/dist/cjs/components/UserMenu/types.js +8 -0
  88. package/dist/cjs/components/index.d.ts +6 -0
  89. package/dist/cjs/components/index.js +22 -0
  90. package/dist/cjs/hooks/index.d.ts +1 -0
  91. package/dist/cjs/hooks/index.js +17 -0
  92. package/dist/cjs/hooks/useLocalStorage.d.ts +1 -0
  93. package/dist/cjs/hooks/useLocalStorage.js +13 -0
  94. package/dist/cjs/index.d.ts +2 -0
  95. package/dist/cjs/index.js +18 -0
  96. package/dist/esm/components/HeaderLayout/HeaderLayout.d.ts +12 -0
  97. package/dist/esm/components/HeaderLayout/HeaderLayout.js +19 -0
  98. package/dist/esm/components/HeaderLayout/index.d.ts +1 -0
  99. package/dist/esm/components/HeaderLayout/index.js +1 -0
  100. package/dist/esm/components/HeaderLayout/styles.module.css +35 -0
  101. package/dist/esm/components/Logo/Logo.d.ts +20 -0
  102. package/dist/esm/components/Logo/Logo.js +54 -0
  103. package/dist/esm/components/Logo/index.d.ts +1 -0
  104. package/dist/esm/components/Logo/index.js +1 -0
  105. package/dist/esm/components/Logo/styles.module.css +28 -0
  106. package/dist/esm/components/MainMenu/Content/Content.d.ts +20 -0
  107. package/dist/esm/components/MainMenu/Content/Content.js +30 -0
  108. package/dist/esm/components/MainMenu/Content/index.d.ts +1 -0
  109. package/dist/esm/components/MainMenu/Content/index.js +1 -0
  110. package/dist/esm/components/MainMenu/Content/styles.module.css +40 -0
  111. package/dist/esm/components/MainMenu/MainMenu.d.ts +4 -0
  112. package/dist/esm/components/MainMenu/MainMenu.js +13 -0
  113. package/dist/esm/components/MainMenu/MenuDesktop/MenuDesktop.d.ts +2 -0
  114. package/dist/esm/components/MainMenu/MenuDesktop/MenuDesktop.js +28 -0
  115. package/dist/esm/components/MainMenu/MenuDesktop/index.d.ts +1 -0
  116. package/dist/esm/components/MainMenu/MenuDesktop/index.js +1 -0
  117. package/dist/esm/components/MainMenu/MenuDesktop/styles.module.css +94 -0
  118. package/dist/esm/components/MainMenu/MenuMobile/MenuMobile.d.ts +2 -0
  119. package/dist/esm/components/MainMenu/MenuMobile/MenuMobile.js +25 -0
  120. package/dist/esm/components/MainMenu/MenuMobile/index.d.ts +1 -0
  121. package/dist/esm/components/MainMenu/MenuMobile/index.js +1 -0
  122. package/dist/esm/components/MainMenu/MenuMobile/styles.module.css +23 -0
  123. package/dist/esm/components/MainMenu/Search/SearchDesktop/SearchDesktop.d.ts +2 -0
  124. package/dist/esm/components/MainMenu/Search/SearchDesktop/SearchDesktop.js +12 -0
  125. package/dist/esm/components/MainMenu/Search/SearchDesktop/index.d.ts +1 -0
  126. package/dist/esm/components/MainMenu/Search/SearchDesktop/index.js +1 -0
  127. package/dist/esm/components/MainMenu/Search/SearchDesktop/styles.module.css +17 -0
  128. package/dist/esm/components/MainMenu/Search/SearchMobile/SearchMobile.d.ts +2 -0
  129. package/dist/esm/components/MainMenu/Search/SearchMobile/SearchMobile.js +36 -0
  130. package/dist/esm/components/MainMenu/Search/SearchMobile/constants.d.ts +4 -0
  131. package/dist/esm/components/MainMenu/Search/SearchMobile/constants.js +4 -0
  132. package/dist/esm/components/MainMenu/Search/SearchMobile/hooks.d.ts +12 -0
  133. package/dist/esm/components/MainMenu/Search/SearchMobile/hooks.js +34 -0
  134. package/dist/esm/components/MainMenu/Search/SearchMobile/index.d.ts +1 -0
  135. package/dist/esm/components/MainMenu/Search/SearchMobile/index.js +1 -0
  136. package/dist/esm/components/MainMenu/Search/SearchMobile/styles.module.css +57 -0
  137. package/dist/esm/components/MainMenu/Search/SearchSettingsButton/SearchSettingsButton.d.ts +4 -0
  138. package/dist/esm/components/MainMenu/Search/SearchSettingsButton/SearchSettingsButton.js +7 -0
  139. package/dist/esm/components/MainMenu/Search/SearchSettingsButton/index.d.ts +1 -0
  140. package/dist/esm/components/MainMenu/Search/SearchSettingsButton/index.js +1 -0
  141. package/dist/esm/components/MainMenu/Search/SearchSettingsButton/styles.module.css +11 -0
  142. package/dist/esm/components/MainMenu/Search/index.d.ts +3 -0
  143. package/dist/esm/components/MainMenu/Search/index.js +3 -0
  144. package/dist/esm/components/MainMenu/Search/types.d.ts +14 -0
  145. package/dist/esm/components/MainMenu/Search/types.js +1 -0
  146. package/dist/esm/components/MainMenu/Search/useSearch.d.ts +8 -0
  147. package/dist/esm/components/MainMenu/Search/useSearch.js +161 -0
  148. package/dist/esm/components/MainMenu/hooks.d.ts +10 -0
  149. package/dist/esm/components/MainMenu/hooks.js +101 -0
  150. package/dist/esm/components/MainMenu/index.d.ts +4 -0
  151. package/dist/esm/components/MainMenu/index.js +4 -0
  152. package/dist/esm/components/MainMenu/styles.module.css +28 -0
  153. package/dist/esm/components/MainMenu/types.d.ts +49 -0
  154. package/dist/esm/components/MainMenu/types.js +1 -0
  155. package/dist/esm/components/PathBreadcrumbs/PathBreadcrumbs.d.ts +7 -0
  156. package/dist/esm/components/PathBreadcrumbs/PathBreadcrumbs.js +6 -0
  157. package/dist/esm/components/PathBreadcrumbs/index.d.ts +1 -0
  158. package/dist/esm/components/PathBreadcrumbs/index.js +1 -0
  159. package/dist/esm/components/PathBreadcrumbs/styles.module.css +5 -0
  160. package/dist/esm/components/PlatformLogo/Container.d.ts +12 -0
  161. package/dist/esm/components/PlatformLogo/Container.js +20 -0
  162. package/dist/esm/components/PlatformLogo/index.d.ts +4 -0
  163. package/dist/esm/components/PlatformLogo/index.js +6 -0
  164. package/dist/esm/components/PlatformLogo/styles.module.css +11 -0
  165. package/dist/esm/components/UserMenu/UserMenu.d.ts +14 -0
  166. package/dist/esm/components/UserMenu/UserMenu.js +48 -0
  167. package/dist/esm/components/UserMenu/hooks/useLogoutItem.d.ts +6 -0
  168. package/dist/esm/components/UserMenu/hooks/useLogoutItem.js +18 -0
  169. package/dist/esm/components/UserMenu/hooks/useProfileItem.d.ts +3 -0
  170. package/dist/esm/components/UserMenu/hooks/useProfileItem.js +23 -0
  171. package/dist/esm/components/UserMenu/hooks/useThemeItem.d.ts +6 -0
  172. package/dist/esm/components/UserMenu/hooks/useThemeItem.js +72 -0
  173. package/dist/esm/components/UserMenu/hooks/useUserMenuItems.d.ts +13 -0
  174. package/dist/esm/components/UserMenu/hooks/useUserMenuItems.js +39 -0
  175. package/dist/esm/components/UserMenu/index.d.ts +2 -0
  176. package/dist/esm/components/UserMenu/index.js +2 -0
  177. package/dist/esm/components/UserMenu/styles.module.css +21 -0
  178. package/dist/esm/components/UserMenu/types.d.ts +20 -0
  179. package/dist/esm/components/UserMenu/types.js +5 -0
  180. package/dist/esm/components/index.d.ts +6 -0
  181. package/dist/esm/components/index.js +6 -0
  182. package/dist/esm/hooks/index.d.ts +1 -0
  183. package/dist/esm/hooks/index.js +1 -0
  184. package/dist/esm/hooks/useLocalStorage.d.ts +1 -0
  185. package/dist/esm/hooks/useLocalStorage.js +10 -0
  186. package/dist/esm/index.d.ts +2 -0
  187. package/dist/esm/index.js +2 -0
  188. package/package.json +68 -0
  189. package/src/components/HeaderLayout/HeaderLayout.tsx +46 -0
  190. package/src/components/HeaderLayout/index.ts +1 -0
  191. package/src/components/HeaderLayout/styles.module.scss +38 -0
  192. package/src/components/Logo/Logo.tsx +93 -0
  193. package/src/components/Logo/index.ts +1 -0
  194. package/src/components/Logo/styles.module.scss +30 -0
  195. package/src/components/MainMenu/Content/Content.tsx +137 -0
  196. package/src/components/MainMenu/Content/index.ts +1 -0
  197. package/src/components/MainMenu/Content/styles.module.scss +35 -0
  198. package/src/components/MainMenu/MainMenu.tsx +51 -0
  199. package/src/components/MainMenu/MenuDesktop/MenuDesktop.tsx +120 -0
  200. package/src/components/MainMenu/MenuDesktop/index.ts +1 -0
  201. package/src/components/MainMenu/MenuDesktop/styles.module.scss +108 -0
  202. package/src/components/MainMenu/MenuMobile/MenuMobile.tsx +83 -0
  203. package/src/components/MainMenu/MenuMobile/index.ts +1 -0
  204. package/src/components/MainMenu/MenuMobile/styles.module.scss +26 -0
  205. package/src/components/MainMenu/Search/SearchDesktop/SearchDesktop.tsx +46 -0
  206. package/src/components/MainMenu/Search/SearchDesktop/index.ts +1 -0
  207. package/src/components/MainMenu/Search/SearchDesktop/styles.module.scss +21 -0
  208. package/src/components/MainMenu/Search/SearchMobile/SearchMobile.tsx +102 -0
  209. package/src/components/MainMenu/Search/SearchMobile/constants.ts +4 -0
  210. package/src/components/MainMenu/Search/SearchMobile/hooks.ts +43 -0
  211. package/src/components/MainMenu/Search/SearchMobile/index.ts +1 -0
  212. package/src/components/MainMenu/Search/SearchMobile/styles.module.scss +72 -0
  213. package/src/components/MainMenu/Search/SearchSettingsButton/SearchSettingsButton.tsx +22 -0
  214. package/src/components/MainMenu/Search/SearchSettingsButton/index.ts +1 -0
  215. package/src/components/MainMenu/Search/SearchSettingsButton/styles.module.scss +13 -0
  216. package/src/components/MainMenu/Search/index.ts +3 -0
  217. package/src/components/MainMenu/Search/types.ts +20 -0
  218. package/src/components/MainMenu/Search/useSearch.tsx +212 -0
  219. package/src/components/MainMenu/hooks.tsx +135 -0
  220. package/src/components/MainMenu/index.ts +4 -0
  221. package/src/components/MainMenu/styles.module.scss +28 -0
  222. package/src/components/MainMenu/types.ts +62 -0
  223. package/src/components/PathBreadcrumbs/PathBreadcrumbs.tsx +21 -0
  224. package/src/components/PathBreadcrumbs/index.ts +1 -0
  225. package/src/components/PathBreadcrumbs/styles.module.scss +10 -0
  226. package/src/components/PlatformLogo/Container.tsx +32 -0
  227. package/src/components/PlatformLogo/index.ts +8 -0
  228. package/src/components/PlatformLogo/styles.module.scss +13 -0
  229. package/src/components/UserMenu/UserMenu.tsx +138 -0
  230. package/src/components/UserMenu/hooks/useLogoutItem.tsx +28 -0
  231. package/src/components/UserMenu/hooks/useProfileItem.tsx +41 -0
  232. package/src/components/UserMenu/hooks/useThemeItem.tsx +116 -0
  233. package/src/components/UserMenu/hooks/useUserMenuItems.ts +77 -0
  234. package/src/components/UserMenu/index.ts +2 -0
  235. package/src/components/UserMenu/styles.module.scss +21 -0
  236. package/src/components/UserMenu/types.ts +24 -0
  237. package/src/components/index.ts +6 -0
  238. package/src/hooks/index.ts +1 -0
  239. package/src/hooks/useLocalStorage.ts +15 -0
  240. 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,2 @@
1
+ import { MainMenuProps } from '../types';
2
+ export declare function MenuDesktop({ open: openProp, setOpen: setOpenProp, settingItems, leftTop, rightTop, serviceGroups, favorite, search, onLinkChange, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
@@ -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,2 @@
1
+ import { MainMenuProps } from '../types';
2
+ export declare function MenuMobile({ open: openProp, setOpen: setOpenProp, settingItems, leftTop, rightTop, serviceGroups, favorite, search, onLinkChange, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
@@ -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,2 @@
1
+ import { SearchProps } from '../types';
2
+ export declare const SearchDesktop: import("react").ForwardRefExoticComponent<SearchProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -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,2 @@
1
+ import { SearchProps } from '../types';
2
+ export declare const SearchMobile: import("react").ForwardRefExoticComponent<SearchProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -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,4 @@
1
+ export declare const SEARCH_TRANSITION_TIMEOUT: {
2
+ enter: number;
3
+ exit: number;
4
+ };
@@ -0,0 +1,4 @@
1
+ export const SEARCH_TRANSITION_TIMEOUT = {
2
+ enter: 150,
3
+ exit: 100,
4
+ };
@@ -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
+ }