@gravity-ui/page-constructor 1.7.0-alpha.6 → 1.7.0-alpha.8

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 (39) hide show
  1. package/README.md +58 -36
  2. package/build/cjs/components/OverflowScroller/OverflowScroller.css +2 -0
  3. package/build/cjs/components/RouterLink/RouterLink.d.ts +1 -1
  4. package/build/cjs/components/index.d.ts +1 -0
  5. package/build/cjs/components/index.js +39 -40
  6. package/build/cjs/components/navigation/components/Header/Header.css +1 -1
  7. package/build/cjs/components/navigation/components/Header/Header.js +16 -22
  8. package/build/cjs/components/navigation/components/MobileNavigation/MobileNavigation.js +1 -1
  9. package/build/cjs/components/navigation/components/Navigation/Navigation.d.ts +9 -2
  10. package/build/cjs/components/navigation/components/Navigation/Navigation.js +19 -18
  11. package/build/cjs/components/navigation/components/NavigationPopup/NavigationPopup.js +1 -2
  12. package/build/cjs/components/navigation/components/index.d.ts +7 -0
  13. package/build/cjs/components/navigation/components/index.js +20 -0
  14. package/build/cjs/components/navigation/containers/Layout/Layout.css +10 -0
  15. package/build/cjs/components/navigation/containers/Layout/Layout.d.ts +7 -0
  16. package/build/cjs/components/navigation/containers/Layout/Layout.js +11 -0
  17. package/build/cjs/containers/PageConstructor/PageConstructor.d.ts +3 -4
  18. package/build/cjs/containers/PageConstructor/PageConstructor.js +11 -11
  19. package/build/cjs/models/navigation.d.ts +2 -1
  20. package/build/esm/components/OverflowScroller/OverflowScroller.css +2 -0
  21. package/build/esm/components/RouterLink/RouterLink.d.ts +1 -1
  22. package/build/esm/components/index.d.ts +1 -0
  23. package/build/esm/components/index.js +1 -0
  24. package/build/esm/components/navigation/components/Header/Header.css +1 -1
  25. package/build/esm/components/navigation/components/Header/Header.js +16 -22
  26. package/build/esm/components/navigation/components/MobileNavigation/MobileNavigation.js +1 -1
  27. package/build/esm/components/navigation/components/Navigation/Navigation.d.ts +9 -2
  28. package/build/esm/components/navigation/components/Navigation/Navigation.js +19 -18
  29. package/build/esm/components/navigation/components/NavigationPopup/NavigationPopup.js +2 -3
  30. package/build/esm/components/navigation/components/index.d.ts +7 -0
  31. package/build/esm/components/navigation/components/index.js +7 -0
  32. package/build/esm/components/navigation/containers/Layout/Layout.css +10 -0
  33. package/build/esm/components/navigation/containers/Layout/Layout.d.ts +8 -0
  34. package/build/esm/components/navigation/containers/Layout/Layout.js +9 -0
  35. package/build/esm/containers/PageConstructor/PageConstructor.d.ts +3 -4
  36. package/build/esm/containers/PageConstructor/PageConstructor.js +11 -11
  37. package/build/esm/models/navigation.d.ts +2 -1
  38. package/package.json +1 -4
  39. package/server/models/navigation.d.ts +2 -1
package/README.md CHANGED
@@ -32,59 +32,81 @@ const Page: WithChildren<PageProps> = ({content}) => (
32
32
 
33
33
  ```typescript
34
34
  interface PageConstructorProps {
35
- content: PageContent; //Blocks data in JSON format.
36
- shouldRenderBlock?: ShouldRenderBlock; // A function that is invoked when rendering each block and lets you set conditions for its display.
37
- custom?: Custom; //Custom blocks (see `Customization`).
38
- renderMenu?: () => React.ReactNode; //A function that renders the page menu with navigation (we plan to add rendering for the default menu version).
35
+ content: PageContent; //Blocks data in JSON format.
36
+ shouldRenderBlock?: ShouldRenderBlock; // A function that is invoked when rendering each block and lets you set conditions for its display.
37
+ custom?: Custom; //Custom blocks (see `Customization`).
38
+ renderMenu?: () => React.ReactNode; //A function that renders the page menu with navigation (we plan to add rendering for the default menu version).
39
+ navigation?: NavigationData; // Navigation data for using navigation component in JSON format
39
40
  }
40
41
 
41
42
  interface PageConstructorProviderProps {
42
- isMobile?: boolean; //A flag indicating that the code is executed in mobile mode.
43
- locale?: LocaleContextProps; //Info about the language and domain (used when generating and formatting links).
44
- location?: Location; //API of the browser or router history, the page URL.
45
- metrika?: Metrika; //Functions for sending analytics
46
- ssrConfig?: SSR; //A flag indicating that the code is run on the server size.
47
- theme?: 'light' | 'dark'; //Theme to render the page with.
43
+ isMobile?: boolean; //A flag indicating that the code is executed in mobile mode.
44
+ locale?: LocaleContextProps; //Info about the language and domain (used when generating and formatting links).
45
+ location?: Location; //API of the browser or router history, the page URL.
46
+ metrika?: Metrika; //Functions for sending analytics
47
+ ssrConfig?: SSR; //A flag indicating that the code is run on the server size.
48
+ theme?: 'light' | 'dark'; //Theme to render the page with.
48
49
  }
49
50
 
50
51
  export interface PageContent extends Animatable {
51
- blocks: Block[];
52
- menu?: Menu;
53
- background?: MediaProps;
54
- footnotes?: string[];
52
+ blocks: Block[];
53
+ menu?: Menu;
54
+ background?: MediaProps;
55
+ footnotes?: string[];
55
56
  }
56
57
 
57
58
  interface Custom {
58
- blocks?: CustomItems;
59
- subBlocks?:CustomItems;
60
- headers?: CustomItems;
61
- loadable?: LoadableConfig;
59
+ blocks?: CustomItems;
60
+ subBlocks?: CustomItems;
61
+ headers?: CustomItems;
62
+ loadable?: LoadableConfig;
62
63
  }
63
64
 
64
65
  type ShouldRenderBlock = (block: Block, blockKey: string) => Boolean;
65
66
 
66
- interface Location = {
67
- history?: History;
68
- search?: string;
69
- hash?: string;
70
- pathname?: string;
71
- hostname?: string;
72
- };
73
-
74
- interface Locale = {
75
- lang?: Lang;
76
- tld?: string;
77
- };
78
-
79
- interface SSR = {
80
- isServer?: boolean;
67
+ interface Location {
68
+ history?: History;
69
+ search?: string;
70
+ hash?: string;
71
+ pathname?: string;
72
+ hostname?: string;
81
73
  }
82
74
 
83
- interface Metrika = {
84
- metrika?: any;
85
- pixel?: any;
75
+ interface Locale {
76
+ lang?: Lang;
77
+ tld?: string;
86
78
  }
87
79
 
80
+ interface SSR {
81
+ isServer?: boolean;
82
+ }
83
+
84
+ interface Metrika {
85
+ metrika?: any;
86
+ pixel?: any;
87
+ }
88
+
89
+ interface NavigationData {
90
+ logo: NavigationLogo;
91
+ header: HeaderData;
92
+ }
93
+
94
+ interface NavigationLogo {
95
+ icon: ImageProps;
96
+ text?: string;
97
+ url?: string;
98
+ }
99
+
100
+ interface HeaderData {
101
+ leftItems: NavigationItem[];
102
+ rightItems?: NavigationItem[];
103
+ }
104
+
105
+ interface NavigationLogo {
106
+ icon: ImageProps;
107
+ text?: string;
108
+ url?: string;
109
+ }
88
110
  ```
89
111
 
90
112
  ### Custom blocks
@@ -9,10 +9,12 @@
9
9
  .pc-overflow-scroller__scroller {
10
10
  position: absolute;
11
11
  z-index: 10;
12
+ top: 0;
12
13
  display: flex;
13
14
  justify-content: flex-end;
14
15
  align-items: center;
15
16
  width: 32px;
17
+ height: calc(100% - 1px);
16
18
  cursor: pointer;
17
19
  color: var(--yc-color-text-secondary);
18
20
  background: linear-gradient(to left, var(--yc-color-base-background) 70%, var(--pc-transparent) 100%) no-repeat;
@@ -1,7 +1,7 @@
1
1
  import { WithChildren } from '../../models';
2
2
  export interface RouterLinkProps {
3
3
  href: string;
4
- [key: string]: any;
4
+ [key: string]: unknown;
5
5
  }
6
6
  declare const RouterLink: ({ href, children }: WithChildren<RouterLinkProps>) => JSX.Element;
7
7
  export default RouterLink;
@@ -34,4 +34,5 @@ export { default as Author } from './Author/Author';
34
34
  export { default as RouterLink } from './RouterLink/RouterLink';
35
35
  export { default as HTML } from './HTML/HTML';
36
36
  export { default as Header } from './navigation/components/Header/Header';
37
+ export * as Navigation from './navigation/components/index';
37
38
  export type { RouterLinkProps } from './RouterLink/RouterLink';
@@ -1,78 +1,77 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Header = exports.HTML = exports.RouterLink = exports.Author = exports.OverflowScroller = exports.Control = exports.YandexForm = exports.YFMWrapper = exports.VideoBlock = exports.UnpublishedLabel = exports.ToggleArrow = exports.Title = exports.Table = exports.ReactPlayer = exports.OutsideClick = exports.Media = exports.Links = exports.Link = exports.Image = exports.HeightCalculator = exports.HeaderBreadcrumbs = exports.FullWidthBackground = exports.FullscreenImage = exports.Foldable = exports.FileLink = exports.ErrorWrapper = exports.CardBase = exports.Button = exports.BlockHeader = exports.BlockBase = exports.BalancedMasonry = exports.BackLink = exports.BackgroundMedia = exports.BackgroundImage = exports.AnimateBlock = exports.Anchor = void 0;
3
+ exports.Navigation = exports.Header = exports.HTML = exports.RouterLink = exports.Author = exports.OverflowScroller = exports.Control = exports.YandexForm = exports.YFMWrapper = exports.VideoBlock = exports.UnpublishedLabel = exports.ToggleArrow = exports.Title = exports.Table = exports.ReactPlayer = exports.OutsideClick = exports.Media = exports.Links = exports.Link = exports.Image = exports.HeightCalculator = exports.HeaderBreadcrumbs = exports.FullWidthBackground = exports.FullscreenImage = exports.Foldable = exports.FileLink = exports.ErrorWrapper = exports.CardBase = exports.Button = exports.BlockHeader = exports.BlockBase = exports.BalancedMasonry = exports.BackLink = exports.BackgroundMedia = exports.BackgroundImage = exports.AnimateBlock = exports.Anchor = void 0;
4
+ const tslib_1 = require("tslib");
7
5
  var Anchor_1 = require("./Anchor/Anchor");
8
- Object.defineProperty(exports, "Anchor", { enumerable: true, get: function () { return __importDefault(Anchor_1).default; } });
6
+ Object.defineProperty(exports, "Anchor", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(Anchor_1).default; } });
9
7
  var AnimateBlock_1 = require("./AnimateBlock/AnimateBlock");
10
- Object.defineProperty(exports, "AnimateBlock", { enumerable: true, get: function () { return __importDefault(AnimateBlock_1).default; } });
8
+ Object.defineProperty(exports, "AnimateBlock", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(AnimateBlock_1).default; } });
11
9
  var BackgroundImage_1 = require("./BackgroundImage/BackgroundImage");
12
- Object.defineProperty(exports, "BackgroundImage", { enumerable: true, get: function () { return __importDefault(BackgroundImage_1).default; } });
10
+ Object.defineProperty(exports, "BackgroundImage", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(BackgroundImage_1).default; } });
13
11
  var BackgroundMedia_1 = require("./BackgroundMedia/BackgroundMedia");
14
- Object.defineProperty(exports, "BackgroundMedia", { enumerable: true, get: function () { return __importDefault(BackgroundMedia_1).default; } });
12
+ Object.defineProperty(exports, "BackgroundMedia", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(BackgroundMedia_1).default; } });
15
13
  var BackLink_1 = require("./BackLink/BackLink");
16
- Object.defineProperty(exports, "BackLink", { enumerable: true, get: function () { return __importDefault(BackLink_1).default; } });
14
+ Object.defineProperty(exports, "BackLink", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(BackLink_1).default; } });
17
15
  var BalancedMasonry_1 = require("./BalancedMasonry/BalancedMasonry");
18
- Object.defineProperty(exports, "BalancedMasonry", { enumerable: true, get: function () { return __importDefault(BalancedMasonry_1).default; } });
16
+ Object.defineProperty(exports, "BalancedMasonry", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(BalancedMasonry_1).default; } });
19
17
  var BlockBase_1 = require("./BlockBase/BlockBase");
20
- Object.defineProperty(exports, "BlockBase", { enumerable: true, get: function () { return __importDefault(BlockBase_1).default; } });
18
+ Object.defineProperty(exports, "BlockBase", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(BlockBase_1).default; } });
21
19
  var BlockHeader_1 = require("./BlockHeader/BlockHeader");
22
- Object.defineProperty(exports, "BlockHeader", { enumerable: true, get: function () { return __importDefault(BlockHeader_1).default; } });
20
+ Object.defineProperty(exports, "BlockHeader", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(BlockHeader_1).default; } });
23
21
  var Button_1 = require("./Button/Button");
24
- Object.defineProperty(exports, "Button", { enumerable: true, get: function () { return __importDefault(Button_1).default; } });
22
+ Object.defineProperty(exports, "Button", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(Button_1).default; } });
25
23
  var CardBase_1 = require("./CardBase/CardBase");
26
- Object.defineProperty(exports, "CardBase", { enumerable: true, get: function () { return __importDefault(CardBase_1).default; } });
24
+ Object.defineProperty(exports, "CardBase", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(CardBase_1).default; } });
27
25
  var ErrorWrapper_1 = require("./ErrorWrapper/ErrorWrapper");
28
- Object.defineProperty(exports, "ErrorWrapper", { enumerable: true, get: function () { return __importDefault(ErrorWrapper_1).default; } });
26
+ Object.defineProperty(exports, "ErrorWrapper", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(ErrorWrapper_1).default; } });
29
27
  var FileLink_1 = require("./FileLink/FileLink");
30
- Object.defineProperty(exports, "FileLink", { enumerable: true, get: function () { return __importDefault(FileLink_1).default; } });
28
+ Object.defineProperty(exports, "FileLink", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(FileLink_1).default; } });
31
29
  var Foldable_1 = require("./Foldable/Foldable");
32
- Object.defineProperty(exports, "Foldable", { enumerable: true, get: function () { return __importDefault(Foldable_1).default; } });
30
+ Object.defineProperty(exports, "Foldable", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(Foldable_1).default; } });
33
31
  var FullscreenImage_1 = require("./FullscreenImage/FullscreenImage");
34
- Object.defineProperty(exports, "FullscreenImage", { enumerable: true, get: function () { return __importDefault(FullscreenImage_1).default; } });
32
+ Object.defineProperty(exports, "FullscreenImage", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(FullscreenImage_1).default; } });
35
33
  var FullWidthBackground_1 = require("./FullWidthBackground/FullWidthBackground");
36
- Object.defineProperty(exports, "FullWidthBackground", { enumerable: true, get: function () { return __importDefault(FullWidthBackground_1).default; } });
34
+ Object.defineProperty(exports, "FullWidthBackground", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(FullWidthBackground_1).default; } });
37
35
  var HeaderBreadcrumbs_1 = require("./HeaderBreadcrumbs/HeaderBreadcrumbs");
38
- Object.defineProperty(exports, "HeaderBreadcrumbs", { enumerable: true, get: function () { return __importDefault(HeaderBreadcrumbs_1).default; } });
36
+ Object.defineProperty(exports, "HeaderBreadcrumbs", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(HeaderBreadcrumbs_1).default; } });
39
37
  var HeightCalculator_1 = require("./HeightCalculator/HeightCalculator");
40
- Object.defineProperty(exports, "HeightCalculator", { enumerable: true, get: function () { return __importDefault(HeightCalculator_1).default; } });
38
+ Object.defineProperty(exports, "HeightCalculator", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(HeightCalculator_1).default; } });
41
39
  var Image_1 = require("./Image/Image");
42
- Object.defineProperty(exports, "Image", { enumerable: true, get: function () { return __importDefault(Image_1).default; } });
40
+ Object.defineProperty(exports, "Image", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(Image_1).default; } });
43
41
  var Link_1 = require("./Link/Link");
44
- Object.defineProperty(exports, "Link", { enumerable: true, get: function () { return __importDefault(Link_1).default; } });
42
+ Object.defineProperty(exports, "Link", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(Link_1).default; } });
45
43
  var Links_1 = require("./Link/Links");
46
- Object.defineProperty(exports, "Links", { enumerable: true, get: function () { return __importDefault(Links_1).default; } });
44
+ Object.defineProperty(exports, "Links", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(Links_1).default; } });
47
45
  var Media_1 = require("./Media/Media");
48
- Object.defineProperty(exports, "Media", { enumerable: true, get: function () { return __importDefault(Media_1).default; } });
46
+ Object.defineProperty(exports, "Media", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(Media_1).default; } });
49
47
  var OutsideClick_1 = require("./OutsideClick/OutsideClick");
50
- Object.defineProperty(exports, "OutsideClick", { enumerable: true, get: function () { return __importDefault(OutsideClick_1).default; } });
48
+ Object.defineProperty(exports, "OutsideClick", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(OutsideClick_1).default; } });
51
49
  var ReactPlayer_1 = require("./ReactPlayer/ReactPlayer");
52
- Object.defineProperty(exports, "ReactPlayer", { enumerable: true, get: function () { return __importDefault(ReactPlayer_1).default; } });
50
+ Object.defineProperty(exports, "ReactPlayer", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(ReactPlayer_1).default; } });
53
51
  var Table_1 = require("./Table/Table");
54
- Object.defineProperty(exports, "Table", { enumerable: true, get: function () { return __importDefault(Table_1).default; } });
52
+ Object.defineProperty(exports, "Table", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(Table_1).default; } });
55
53
  var Title_1 = require("./Title/Title");
56
- Object.defineProperty(exports, "Title", { enumerable: true, get: function () { return __importDefault(Title_1).default; } });
54
+ Object.defineProperty(exports, "Title", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(Title_1).default; } });
57
55
  var ToggleArrow_1 = require("./ToggleArrow/ToggleArrow");
58
- Object.defineProperty(exports, "ToggleArrow", { enumerable: true, get: function () { return __importDefault(ToggleArrow_1).default; } });
56
+ Object.defineProperty(exports, "ToggleArrow", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(ToggleArrow_1).default; } });
59
57
  var UnpublishedLabel_1 = require("./UnpublishedLabel/UnpublishedLabel");
60
- Object.defineProperty(exports, "UnpublishedLabel", { enumerable: true, get: function () { return __importDefault(UnpublishedLabel_1).default; } });
58
+ Object.defineProperty(exports, "UnpublishedLabel", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(UnpublishedLabel_1).default; } });
61
59
  var VideoBlock_1 = require("./VideoBlock/VideoBlock");
62
- Object.defineProperty(exports, "VideoBlock", { enumerable: true, get: function () { return __importDefault(VideoBlock_1).default; } });
60
+ Object.defineProperty(exports, "VideoBlock", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(VideoBlock_1).default; } });
63
61
  var YFMWrapper_1 = require("./YFMWrapper/YFMWrapper");
64
- Object.defineProperty(exports, "YFMWrapper", { enumerable: true, get: function () { return __importDefault(YFMWrapper_1).default; } });
62
+ Object.defineProperty(exports, "YFMWrapper", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(YFMWrapper_1).default; } });
65
63
  var YandexForm_1 = require("./YandexForm/YandexForm");
66
- Object.defineProperty(exports, "YandexForm", { enumerable: true, get: function () { return __importDefault(YandexForm_1).default; } });
64
+ Object.defineProperty(exports, "YandexForm", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(YandexForm_1).default; } });
67
65
  var Control_1 = require("./Control/Control");
68
- Object.defineProperty(exports, "Control", { enumerable: true, get: function () { return __importDefault(Control_1).default; } });
66
+ Object.defineProperty(exports, "Control", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(Control_1).default; } });
69
67
  var OverflowScroller_1 = require("./OverflowScroller/OverflowScroller");
70
- Object.defineProperty(exports, "OverflowScroller", { enumerable: true, get: function () { return __importDefault(OverflowScroller_1).default; } });
68
+ Object.defineProperty(exports, "OverflowScroller", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(OverflowScroller_1).default; } });
71
69
  var Author_1 = require("./Author/Author");
72
- Object.defineProperty(exports, "Author", { enumerable: true, get: function () { return __importDefault(Author_1).default; } });
70
+ Object.defineProperty(exports, "Author", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(Author_1).default; } });
73
71
  var RouterLink_1 = require("./RouterLink/RouterLink");
74
- Object.defineProperty(exports, "RouterLink", { enumerable: true, get: function () { return __importDefault(RouterLink_1).default; } });
72
+ Object.defineProperty(exports, "RouterLink", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(RouterLink_1).default; } });
75
73
  var HTML_1 = require("./HTML/HTML");
76
- Object.defineProperty(exports, "HTML", { enumerable: true, get: function () { return __importDefault(HTML_1).default; } });
74
+ Object.defineProperty(exports, "HTML", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(HTML_1).default; } });
77
75
  var Header_1 = require("./navigation/components/Header/Header");
78
- Object.defineProperty(exports, "Header", { enumerable: true, get: function () { return __importDefault(Header_1).default; } });
76
+ Object.defineProperty(exports, "Header", { enumerable: true, get: function () { return (0, tslib_1.__importDefault)(Header_1).default; } });
77
+ exports.Navigation = (0, tslib_1.__importStar)(require("./navigation/components/index"));
@@ -9,7 +9,7 @@ unpredictable css rules order in build */
9
9
  align-items: center;
10
10
  height: var(--header-height);
11
11
  background-color: var(--yc-color-base-background);
12
- box-shadow: inset 0px -1px 0px var(--yc-color-line-generic);
12
+ box-shadow: inset 0 -1px 0 var(--yc-color-line-generic);
13
13
  }
14
14
  .header__wrapper {
15
15
  display: flex;
@@ -13,6 +13,13 @@ const NavigationItem_1 = (0, tslib_1.__importDefault)(require("../NavigationItem
13
13
  const Logo_1 = (0, tslib_1.__importDefault)(require("../Logo/Logo"));
14
14
  const icons_1 = require("../../../../icons");
15
15
  const b = (0, bem_cn_lite_1.default)('header');
16
+ const MobileMenuButton = ({ isSidebarOpened, onSidebarOpenedChange, }) => {
17
+ const iconProps = { icon: isSidebarOpened ? icons_1.NavigationClose : icons_1.NavigationOpen, iconSize: 36 };
18
+ return (react_1.default.createElement(Control_1.default, Object.assign({ className: b('mobile-menu-button'), onClick: (e) => {
19
+ e.stopPropagation();
20
+ onSidebarOpenedChange(!isSidebarOpened);
21
+ }, size: "l" }, iconProps)));
22
+ };
16
23
  const Header = ({ data, logo }) => {
17
24
  const { leftItems, rightItems } = data;
18
25
  const [isSidebarOpened, setIsSidebarOpened] = (0, react_1.useState)(false);
@@ -26,32 +33,19 @@ const Header = ({ data, logo }) => {
26
33
  const hideSidebar = (0, react_1.useCallback)(() => {
27
34
  setIsSidebarOpened(false);
28
35
  }, []);
29
- const renderLogo = (react_1.default.createElement("div", { className: b('left') },
30
- react_1.default.createElement(Logo_1.default, Object.assign({}, logo, { className: b('logo') }))));
31
- const renderLeft = (react_1.default.createElement("div", { className: b('navigation-container') },
32
- react_1.default.createElement(Navigation_1.default, { className: b('navigation'), links: leftItems, activeItemIndex: activeItemIndex, onActiveItemChange: onActiveItemChange })));
33
- const renderMobileMenuButton = () => {
34
- const iconProps = { icon: isSidebarOpened ? icons_1.NavigationClose : icons_1.NavigationOpen, iconSize: 36 };
35
- return (react_1.default.createElement(Control_1.default, Object.assign({ className: b('mobile-menu-button'), onClick: (e) => {
36
- e.stopPropagation();
37
- onSidebarOpenedChange(!isSidebarOpened);
38
- }, size: "l" }, iconProps)));
39
- };
40
- const renderRightItems = (react_1.default.createElement("div", { className: b('buttons') }, rightItems &&
41
- rightItems.map((button) => (react_1.default.createElement(NavigationItem_1.default, { key: button.text, data: button, className: b('button') })))));
42
- const renderRight = (react_1.default.createElement("div", { className: b('right') },
43
- renderMobileMenuButton(),
44
- rightItems && renderRightItems));
45
- const renderMobileNavigation = (react_1.default.createElement(OutsideClick_1.default, { onOutsideClick: () => onSidebarOpenedChange(false) },
46
- react_1.default.createElement(MobileNavigation_1.default, { topItems: leftItems, bottomItems: rightItems, isOpened: isSidebarOpened, activeItemIndex: activeItemIndex, onActiveItemChange: onActiveItemChange, onClose: hideSidebar })));
47
36
  return (react_1.default.createElement(grid_1.Grid, { className: b() },
48
37
  react_1.default.createElement(grid_1.Row, null,
49
38
  react_1.default.createElement(grid_1.Col, null,
50
39
  react_1.default.createElement("header", { className: b('wrapper') },
51
- logo && renderLogo,
52
- leftItems && renderLeft,
53
- renderRight,
54
- renderMobileNavigation)))));
40
+ logo && (react_1.default.createElement("div", { className: b('left') },
41
+ react_1.default.createElement(Logo_1.default, Object.assign({}, logo, { className: b('logo') })))),
42
+ react_1.default.createElement("div", { className: b('navigation-container') },
43
+ react_1.default.createElement(Navigation_1.default, { className: b('navigation'), links: leftItems, activeItemIndex: activeItemIndex, onActiveItemChange: onActiveItemChange })),
44
+ react_1.default.createElement("div", { className: b('right') },
45
+ react_1.default.createElement(MobileMenuButton, { isSidebarOpened: isSidebarOpened, onSidebarOpenedChange: onSidebarOpenedChange }),
46
+ rightItems && (react_1.default.createElement("div", { className: b('buttons') }, rightItems.map((button) => (react_1.default.createElement(NavigationItem_1.default, { key: button.text, data: button, className: b('button') })))))),
47
+ react_1.default.createElement(OutsideClick_1.default, { onOutsideClick: () => onSidebarOpenedChange(false) },
48
+ react_1.default.createElement(MobileNavigation_1.default, { topItems: leftItems, bottomItems: rightItems, isOpened: isSidebarOpened, activeItemIndex: activeItemIndex, onActiveItemChange: onActiveItemChange, onClose: hideSidebar })))))));
55
49
  };
56
50
  exports.Header = Header;
57
51
  exports.default = exports.Header;
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const bem_cn_lite_1 = (0, tslib_1.__importDefault)(require("bem-cn-lite"));
5
5
  const react_1 = (0, tslib_1.__importStar)(require("react"));
6
- const Foldable_1 = (0, tslib_1.__importDefault)(require("../../../Foldable/Foldable"));
7
6
  const uikit_1 = require("@gravity-ui/uikit");
7
+ const Foldable_1 = (0, tslib_1.__importDefault)(require("../../../Foldable/Foldable"));
8
8
  const navigation_1 = require("../../../../models/navigation");
9
9
  const NavigationItem_1 = (0, tslib_1.__importDefault)(require("../NavigationItem/NavigationItem"));
10
10
  const b = (0, bem_cn_lite_1.default)('mobile-navigation');
@@ -1,5 +1,5 @@
1
- import React from 'react';
2
- import { NavigationItem as NavigationItemModel } from '../../../../models/navigation';
1
+ import React, { MouseEventHandler } from 'react';
2
+ import { NavigationDropdownItem, NavigationItem as NavigationItemModel } from '../../../../models/navigation';
3
3
  export interface NavigationProps {
4
4
  links: NavigationItemModel[];
5
5
  activeItemIndex: number;
@@ -7,5 +7,12 @@ export interface NavigationProps {
7
7
  className?: string;
8
8
  highlightActiveItem?: boolean;
9
9
  }
10
+ export interface NavigationDropdownProps {
11
+ data: NavigationDropdownItem;
12
+ onClick: MouseEventHandler;
13
+ isActive: boolean;
14
+ position: number;
15
+ hidePopup: () => void;
16
+ }
10
17
  declare const Navigation: React.FC<NavigationProps>;
11
18
  export default Navigation;
@@ -9,9 +9,17 @@ const navigation_1 = require("../../../../models/navigation");
9
9
  const NavigationPopup_1 = (0, tslib_1.__importDefault)(require("../NavigationPopup/NavigationPopup"));
10
10
  const NavigationItem_1 = (0, tslib_1.__importDefault)(require("../NavigationItem/NavigationItem"));
11
11
  const locationContext_1 = require("../../../../context/locationContext");
12
+ const breakpointContext_1 = require("../../../../context/breakpointContext");
12
13
  const b = (0, bem_cn_lite_1.default)('navigation');
14
+ const NavigationDropdown = ({ data, isActive, position, hidePopup, onClick, }) => {
15
+ const { text, items } = data, popupProps = (0, tslib_1.__rest)(data, ["text", "items"]);
16
+ return (react_1.default.createElement(react_1.Fragment, null,
17
+ react_1.default.createElement(NavigationItem_1.default, { className: b('link'), onClick: onClick, isOpened: isActive, data: { text, type: navigation_1.NavigationItemType.Dropdown } }),
18
+ isActive && (react_1.default.createElement(NavigationPopup_1.default, Object.assign({ left: position, onClose: hidePopup, items: items }, popupProps)))));
19
+ };
13
20
  const Navigation = ({ className, onActiveItemChange, links, activeItemIndex, highlightActiveItem, }) => {
14
21
  const { asPath, pathname } = (0, react_1.useContext)(locationContext_1.LocationContext);
22
+ const breakpoint = (0, react_1.useContext)(breakpointContext_1.BreakpointContext);
15
23
  const itemRefs = (0, react_1.useRef)([]);
16
24
  const [itemPositions, setItemPosition] = (0, react_1.useState)([]);
17
25
  const [lastLeftScroll, setLastLeftScroll] = (0, react_1.useState)(0);
@@ -22,22 +30,6 @@ const Navigation = ({ className, onActiveItemChange, links, activeItemIndex, hig
22
30
  e.stopPropagation();
23
31
  onActiveItemChange(index === activeItemIndex ? -1 : index);
24
32
  }, [activeItemIndex, onActiveItemChange]);
25
- const renderNavDropdown = (data, onClick, isActive, position) => {
26
- const { text, items } = data, popupProps = (0, tslib_1.__rest)(data, ["text", "items"]);
27
- return (react_1.default.createElement(react_1.Fragment, null,
28
- react_1.default.createElement(NavigationItem_1.default, { className: b('link'), onClick: onClick, isOpened: isActive, data: { text, type: navigation_1.NavigationItemType.Dropdown } }),
29
- isActive && (react_1.default.createElement(NavigationPopup_1.default, Object.assign({ left: position, onClose: hidePopup, items: items }, popupProps)))));
30
- };
31
- const slider = (react_1.default.createElement("div", { className: b('slider-container') },
32
- react_1.default.createElement("div", { className: b('slider') })));
33
- const content = (react_1.default.createElement("nav", null,
34
- react_1.default.createElement("ul", { className: b('links') }, links.map((link, index) => {
35
- const isActive = index === activeItemIndex;
36
- const onClick = getItemClickHandler(index);
37
- return (react_1.default.createElement("li", { ref: (el) => itemRefs.current.push(el), key: index, className: b('links-item') },
38
- link.type === navigation_1.NavigationItemType.Dropdown ? (renderNavDropdown(link, onClick, isActive, itemPositions[index])) : (react_1.default.createElement(NavigationItem_1.default, { data: link, onClick: onClick })),
39
- highlightActiveItem && isActive && slider));
40
- }))));
41
33
  const calculateItemPositions = (0, react_1.useCallback)(() => {
42
34
  if (itemRefs.current.length) {
43
35
  const currentItemPositions = itemRefs.current.map((itemRef) => (itemRef && itemRef.getBoundingClientRect().left) || 0);
@@ -64,7 +56,16 @@ const Navigation = ({ className, onActiveItemChange, links, activeItemIndex, hig
64
56
  }, [calculateItemPositions, itemRefs, lastLeftScroll]);
65
57
  (0, react_1.useEffect)(() => {
66
58
  hidePopup();
67
- }, [hidePopup, asPath, pathname]);
68
- return (react_1.default.createElement(OverflowScroller_1.default, { className: b(null, className), onScrollStart: hidePopup, onScrollEnd: calculateItemPositions }, content));
59
+ }, [hidePopup, asPath, pathname, breakpoint]);
60
+ return (react_1.default.createElement(OverflowScroller_1.default, { className: b(null, className), onScrollStart: hidePopup, onScrollEnd: calculateItemPositions },
61
+ react_1.default.createElement("nav", null,
62
+ react_1.default.createElement("ul", { className: b('links') }, links.map((link, index) => {
63
+ const isActive = index === activeItemIndex;
64
+ const onClick = getItemClickHandler(index);
65
+ return (react_1.default.createElement("li", { ref: (el) => itemRefs.current.push(el), key: index, className: b('links-item') },
66
+ link.type === navigation_1.NavigationItemType.Dropdown ? (react_1.default.createElement(NavigationDropdown, { data: link, onClick: onClick, isActive: isActive, position: itemPositions[index], hidePopup: hidePopup })) : (react_1.default.createElement(NavigationItem_1.default, { data: link, onClick: onClick })),
67
+ highlightActiveItem && isActive && (react_1.default.createElement("div", { className: b('slider-container') },
68
+ react_1.default.createElement("div", { className: b('slider') })))));
69
+ })))));
69
70
  };
70
71
  exports.default = Navigation;
@@ -37,10 +37,9 @@ const NavigationPopup = ({ items, left, onClose }) => {
37
37
  if (!document || !document.body) {
38
38
  return null;
39
39
  }
40
- const renderDefaultPopup = (react_1.default.createElement(react_1.Fragment, null, items.map((item) => (react_1.default.createElement(NavigationItem_1.default, { key: item.text, className: b('link'), data: item })))));
41
40
  return (react_1.default.createElement(uikit_1.Portal, null,
42
41
  react_1.default.createElement("div", { ref: popupRef, className: b(), style: { left: calculatedLeft } },
43
- react_1.default.createElement(index_1.OutsideClick, { onOutsideClick: onClose }, renderDefaultPopup))));
42
+ react_1.default.createElement(index_1.OutsideClick, { onOutsideClick: onClose }, items.map((item) => (react_1.default.createElement(NavigationItem_1.default, { key: item.text, className: b('link'), data: item })))))));
44
43
  };
45
44
  exports.NavigationPopup = NavigationPopup;
46
45
  exports.default = exports.NavigationPopup;
@@ -0,0 +1,7 @@
1
+ export { default as Header } from './Header/Header';
2
+ export { default as NavigationItem } from './NavigationItem/NavigationItem';
3
+ export { default as Logo } from './Logo/Logo';
4
+ export { default as MobileNavigation } from './MobileNavigation/MobileNavigation';
5
+ export { default as Navigation } from './Navigation/Navigation';
6
+ export { default as NavigationPopup } from './NavigationPopup/NavigationPopup';
7
+ export { default as SocialIcon } from './SocialIcon/SocialIcon';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SocialIcon = exports.NavigationPopup = exports.Navigation = exports.MobileNavigation = exports.Logo = exports.NavigationItem = exports.Header = void 0;
7
+ var Header_1 = require("./Header/Header");
8
+ Object.defineProperty(exports, "Header", { enumerable: true, get: function () { return __importDefault(Header_1).default; } });
9
+ var NavigationItem_1 = require("./NavigationItem/NavigationItem");
10
+ Object.defineProperty(exports, "NavigationItem", { enumerable: true, get: function () { return __importDefault(NavigationItem_1).default; } });
11
+ var Logo_1 = require("./Logo/Logo");
12
+ Object.defineProperty(exports, "Logo", { enumerable: true, get: function () { return __importDefault(Logo_1).default; } });
13
+ var MobileNavigation_1 = require("./MobileNavigation/MobileNavigation");
14
+ Object.defineProperty(exports, "MobileNavigation", { enumerable: true, get: function () { return __importDefault(MobileNavigation_1).default; } });
15
+ var Navigation_1 = require("./Navigation/Navigation");
16
+ Object.defineProperty(exports, "Navigation", { enumerable: true, get: function () { return __importDefault(Navigation_1).default; } });
17
+ var NavigationPopup_1 = require("./NavigationPopup/NavigationPopup");
18
+ Object.defineProperty(exports, "NavigationPopup", { enumerable: true, get: function () { return __importDefault(NavigationPopup_1).default; } });
19
+ var SocialIcon_1 = require("./SocialIcon/SocialIcon");
20
+ Object.defineProperty(exports, "SocialIcon", { enumerable: true, get: function () { return __importDefault(SocialIcon_1).default; } });
@@ -0,0 +1,10 @@
1
+ .layout {
2
+ display: flex;
3
+ flex-direction: column;
4
+ min-height: 100vh;
5
+ }
6
+ .layout__content {
7
+ display: flex;
8
+ flex-grow: 1;
9
+ flex-direction: column;
10
+ }
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { NavigationData } from '../../../../models';
3
+ export interface LayoutProps {
4
+ navigation?: NavigationData;
5
+ }
6
+ declare const Layout: React.FC<LayoutProps>;
7
+ export default Layout;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = (0, tslib_1.__importDefault)(require("react"));
5
+ const bem_cn_lite_1 = (0, tslib_1.__importDefault)(require("bem-cn-lite"));
6
+ const Header_1 = (0, tslib_1.__importDefault)(require("../../components/Header/Header"));
7
+ const b = (0, bem_cn_lite_1.default)('layout');
8
+ const Layout = ({ children, navigation }) => (react_1.default.createElement("div", { className: b() },
9
+ navigation && react_1.default.createElement(Header_1.default, { data: navigation.header, logo: navigation.logo }),
10
+ react_1.default.createElement("main", { className: b('content') }, children)));
11
+ exports.default = Layout;
@@ -1,15 +1,14 @@
1
1
  import React from 'react';
2
- import { ShouldRenderBlock, CustomConfig, PageContent, CustomItems } from '../../models';
3
- import { blockMap, subBlockMap } from '../../constructor-items';
4
- import { NavigationData } from '../../models/navigation';
5
2
  import '@doc-tools/transform/dist/js/yfm';
3
+ import { ShouldRenderBlock, CustomConfig, PageContent, CustomItems, NavigationData } from '../../models';
4
+ import { blockMap, subBlockMap } from '../../constructor-items';
6
5
  export declare type ItemMap = typeof blockMap & typeof subBlockMap & CustomItems;
7
6
  export interface PageConstructorProps {
8
7
  content?: PageContent;
9
8
  shouldRenderBlock?: ShouldRenderBlock;
10
9
  custom?: CustomConfig;
11
10
  renderMenu?: () => React.ReactNode;
12
- navigationData?: NavigationData;
11
+ navigation?: NavigationData;
13
12
  }
14
13
  export declare const Constructor: (props: PageConstructorProps) => JSX.Element;
15
14
  export declare const PageConstructor: (props: PageConstructorProps) => JSX.Element;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PageConstructor = exports.Constructor = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = (0, tslib_1.__importStar)(require("react"));
6
+ require("@doc-tools/transform/dist/js/yfm");
6
7
  const models_1 = require("../../models");
7
8
  const constructor_items_1 = require("../../constructor-items");
8
9
  const grid_1 = require("../../grid");
@@ -15,8 +16,7 @@ const ConstructorRow_1 = require("./components/ConstructorRow");
15
16
  const ConstructorFootnotes_1 = require("./components/ConstructorFootnotes");
16
17
  const ConstructorItem_1 = require("./components/ConstructorItem");
17
18
  const ConstructorBlocks_1 = require("./components/ConstructorBlocks");
18
- const Header_1 = (0, tslib_1.__importDefault)(require("../../components/navigation/components/Header/Header"));
19
- require("@doc-tools/transform/dist/js/yfm");
19
+ const Layout_1 = (0, tslib_1.__importDefault)(require("../../components/navigation/containers/Layout/Layout"));
20
20
  const b = (0, utils_1.block)('page-constructor');
21
21
  const Constructor = (props) => {
22
22
  const { context, headerBlockTypes } = (0, react_1.useMemo)(() => {
@@ -31,7 +31,7 @@ const Constructor = (props) => {
31
31
  });
32
32
  }, [props.custom]);
33
33
  const { themeValue: theme } = (0, react_1.useContext)(ThemeValueContext_1.ThemeValueContext);
34
- const { content: { blocks = [], background = {}, footnotes = [] } = {}, renderMenu, shouldRenderBlock, navigationData, } = props;
34
+ const { content: { blocks = [], background = {}, footnotes = [] } = {}, renderMenu, shouldRenderBlock, navigation, } = props;
35
35
  const hasFootnotes = footnotes.length > 0;
36
36
  const isHeaderBlock = (block) => headerBlockTypes.includes(block.type);
37
37
  const header = blocks === null || blocks === void 0 ? void 0 : blocks.find(isHeaderBlock);
@@ -41,14 +41,14 @@ const Constructor = (props) => {
41
41
  react_1.default.createElement("div", { className: b() },
42
42
  react_1.default.createElement("div", { className: b('wrapper') },
43
43
  themedBackground && (react_1.default.createElement(BackgroundMedia_1.default, Object.assign({}, themedBackground, { className: b('background') }))),
44
- (navigationData === null || navigationData === void 0 ? void 0 : navigationData.header) && (react_1.default.createElement(Header_1.default, { logo: navigationData === null || navigationData === void 0 ? void 0 : navigationData.logo, data: navigationData === null || navigationData === void 0 ? void 0 : navigationData.header })),
45
- renderMenu && renderMenu(),
46
- header && react_1.default.createElement(ConstructorItem_1.ConstructorHeader, { data: header }),
47
- react_1.default.createElement(grid_1.Grid, null,
48
- restBlocks && (react_1.default.createElement(ConstructorRow_1.ConstructorRow, null,
49
- react_1.default.createElement(ConstructorBlocks_1.ConstructorBlocks, { items: restBlocks, shouldRenderBlock: shouldRenderBlock }))),
50
- hasFootnotes && (react_1.default.createElement(ConstructorRow_1.ConstructorRow, null,
51
- react_1.default.createElement(ConstructorFootnotes_1.ConstructorFootnotes, { items: footnotes }))))))));
44
+ react_1.default.createElement(Layout_1.default, { navigation: navigation },
45
+ renderMenu && renderMenu(),
46
+ header && react_1.default.createElement(ConstructorItem_1.ConstructorHeader, { data: header }),
47
+ react_1.default.createElement(grid_1.Grid, null,
48
+ restBlocks && (react_1.default.createElement(ConstructorRow_1.ConstructorRow, null,
49
+ react_1.default.createElement(ConstructorBlocks_1.ConstructorBlocks, { items: restBlocks, shouldRenderBlock: shouldRenderBlock }))),
50
+ hasFootnotes && (react_1.default.createElement(ConstructorRow_1.ConstructorRow, null,
51
+ react_1.default.createElement(ConstructorFootnotes_1.ConstructorFootnotes, { items: footnotes })))))))));
52
52
  };
53
53
  exports.Constructor = Constructor;
54
54
  const PageConstructor = (props) => {
@@ -31,9 +31,10 @@ export interface NavigationSocialItem extends Omit<NavigationItemBase, 'text'> {
31
31
  url: string;
32
32
  }
33
33
  export declare type NavigationItem = NavigationLinkItem | NavigationButtonItem | NavigationDropdownItem;
34
- export interface NavigationLogo extends Omit<NavigationItemBase, 'text'> {
34
+ export interface NavigationLogo {
35
35
  icon: ImageProps;
36
36
  text?: string;
37
+ url?: string;
37
38
  }
38
39
  export interface HeaderData {
39
40
  leftItems: NavigationItem[];
@@ -9,10 +9,12 @@
9
9
  .pc-overflow-scroller__scroller {
10
10
  position: absolute;
11
11
  z-index: 10;
12
+ top: 0;
12
13
  display: flex;
13
14
  justify-content: flex-end;
14
15
  align-items: center;
15
16
  width: 32px;
17
+ height: calc(100% - 1px);
16
18
  cursor: pointer;
17
19
  color: var(--yc-color-text-secondary);
18
20
  background: linear-gradient(to left, var(--yc-color-base-background) 70%, var(--pc-transparent) 100%) no-repeat;
@@ -1,7 +1,7 @@
1
1
  import { WithChildren } from '../../models';
2
2
  export interface RouterLinkProps {
3
3
  href: string;
4
- [key: string]: any;
4
+ [key: string]: unknown;
5
5
  }
6
6
  declare const RouterLink: ({ href, children }: WithChildren<RouterLinkProps>) => JSX.Element;
7
7
  export default RouterLink;
@@ -34,4 +34,5 @@ export { default as Author } from './Author/Author';
34
34
  export { default as RouterLink } from './RouterLink/RouterLink';
35
35
  export { default as HTML } from './HTML/HTML';
36
36
  export { default as Header } from './navigation/components/Header/Header';
37
+ export * as Navigation from './navigation/components/index';
37
38
  export type { RouterLinkProps } from './RouterLink/RouterLink';
@@ -34,3 +34,4 @@ export { default as Author } from './Author/Author';
34
34
  export { default as RouterLink } from './RouterLink/RouterLink';
35
35
  export { default as HTML } from './HTML/HTML';
36
36
  export { default as Header } from './navigation/components/Header/Header';
37
+ export * as Navigation from './navigation/components/index';
@@ -9,7 +9,7 @@ unpredictable css rules order in build */
9
9
  align-items: center;
10
10
  height: var(--header-height);
11
11
  background-color: var(--yc-color-base-background);
12
- box-shadow: inset 0px -1px 0px var(--yc-color-line-generic);
12
+ box-shadow: inset 0 -1px 0 var(--yc-color-line-generic);
13
13
  }
14
14
  .header__wrapper {
15
15
  display: flex;
@@ -10,6 +10,13 @@ import Logo from '../Logo/Logo';
10
10
  import { NavigationClose, NavigationOpen } from '../../../../icons';
11
11
  import './Header.css';
12
12
  const b = block('header');
13
+ const MobileMenuButton = ({ isSidebarOpened, onSidebarOpenedChange, }) => {
14
+ const iconProps = { icon: isSidebarOpened ? NavigationClose : NavigationOpen, iconSize: 36 };
15
+ return (React.createElement(Control, Object.assign({ className: b('mobile-menu-button'), onClick: (e) => {
16
+ e.stopPropagation();
17
+ onSidebarOpenedChange(!isSidebarOpened);
18
+ }, size: "l" }, iconProps)));
19
+ };
13
20
  export const Header = ({ data, logo }) => {
14
21
  const { leftItems, rightItems } = data;
15
22
  const [isSidebarOpened, setIsSidebarOpened] = useState(false);
@@ -23,31 +30,18 @@ export const Header = ({ data, logo }) => {
23
30
  const hideSidebar = useCallback(() => {
24
31
  setIsSidebarOpened(false);
25
32
  }, []);
26
- const renderLogo = (React.createElement("div", { className: b('left') },
27
- React.createElement(Logo, Object.assign({}, logo, { className: b('logo') }))));
28
- const renderLeft = (React.createElement("div", { className: b('navigation-container') },
29
- React.createElement(Navigation, { className: b('navigation'), links: leftItems, activeItemIndex: activeItemIndex, onActiveItemChange: onActiveItemChange })));
30
- const renderMobileMenuButton = () => {
31
- const iconProps = { icon: isSidebarOpened ? NavigationClose : NavigationOpen, iconSize: 36 };
32
- return (React.createElement(Control, Object.assign({ className: b('mobile-menu-button'), onClick: (e) => {
33
- e.stopPropagation();
34
- onSidebarOpenedChange(!isSidebarOpened);
35
- }, size: "l" }, iconProps)));
36
- };
37
- const renderRightItems = (React.createElement("div", { className: b('buttons') }, rightItems &&
38
- rightItems.map((button) => (React.createElement(NavigationItem, { key: button.text, data: button, className: b('button') })))));
39
- const renderRight = (React.createElement("div", { className: b('right') },
40
- renderMobileMenuButton(),
41
- rightItems && renderRightItems));
42
- const renderMobileNavigation = (React.createElement(OutsideClick, { onOutsideClick: () => onSidebarOpenedChange(false) },
43
- React.createElement(MobileNavigation, { topItems: leftItems, bottomItems: rightItems, isOpened: isSidebarOpened, activeItemIndex: activeItemIndex, onActiveItemChange: onActiveItemChange, onClose: hideSidebar })));
44
33
  return (React.createElement(Grid, { className: b() },
45
34
  React.createElement(Row, null,
46
35
  React.createElement(Col, null,
47
36
  React.createElement("header", { className: b('wrapper') },
48
- logo && renderLogo,
49
- leftItems && renderLeft,
50
- renderRight,
51
- renderMobileNavigation)))));
37
+ logo && (React.createElement("div", { className: b('left') },
38
+ React.createElement(Logo, Object.assign({}, logo, { className: b('logo') })))),
39
+ React.createElement("div", { className: b('navigation-container') },
40
+ React.createElement(Navigation, { className: b('navigation'), links: leftItems, activeItemIndex: activeItemIndex, onActiveItemChange: onActiveItemChange })),
41
+ React.createElement("div", { className: b('right') },
42
+ React.createElement(MobileMenuButton, { isSidebarOpened: isSidebarOpened, onSidebarOpenedChange: onSidebarOpenedChange }),
43
+ rightItems && (React.createElement("div", { className: b('buttons') }, rightItems.map((button) => (React.createElement(NavigationItem, { key: button.text, data: button, className: b('button') })))))),
44
+ React.createElement(OutsideClick, { onOutsideClick: () => onSidebarOpenedChange(false) },
45
+ React.createElement(MobileNavigation, { topItems: leftItems, bottomItems: rightItems, isOpened: isSidebarOpened, activeItemIndex: activeItemIndex, onActiveItemChange: onActiveItemChange, onClose: hideSidebar })))))));
52
46
  };
53
47
  export default Header;
@@ -1,7 +1,7 @@
1
1
  import block from 'bem-cn-lite';
2
2
  import React, { useRef, useCallback } from 'react';
3
- import Foldable from '../../../Foldable/Foldable';
4
3
  import { Popup, Portal } from '@gravity-ui/uikit';
4
+ import Foldable from '../../../Foldable/Foldable';
5
5
  import { NavigationItemType, } from '../../../../models/navigation';
6
6
  import NavigationItem from '../NavigationItem/NavigationItem';
7
7
  import './MobileNavigation.css';
@@ -1,5 +1,5 @@
1
- import React from 'react';
2
- import { NavigationItem as NavigationItemModel } from '../../../../models/navigation';
1
+ import React, { MouseEventHandler } from 'react';
2
+ import { NavigationDropdownItem, NavigationItem as NavigationItemModel } from '../../../../models/navigation';
3
3
  import './Navigation.css';
4
4
  export interface NavigationProps {
5
5
  links: NavigationItemModel[];
@@ -8,5 +8,12 @@ export interface NavigationProps {
8
8
  className?: string;
9
9
  highlightActiveItem?: boolean;
10
10
  }
11
+ export interface NavigationDropdownProps {
12
+ data: NavigationDropdownItem;
13
+ onClick: MouseEventHandler;
14
+ isActive: boolean;
15
+ position: number;
16
+ hidePopup: () => void;
17
+ }
11
18
  declare const Navigation: React.FC<NavigationProps>;
12
19
  export default Navigation;
@@ -7,10 +7,18 @@ import { NavigationItemType, } from '../../../../models/navigation';
7
7
  import NavigationPopup from '../NavigationPopup/NavigationPopup';
8
8
  import NavigationItem from '../NavigationItem/NavigationItem';
9
9
  import { LocationContext } from '../../../../context/locationContext';
10
+ import { BreakpointContext } from '../../../../context/breakpointContext';
10
11
  import './Navigation.css';
11
12
  const b = block('navigation');
13
+ const NavigationDropdown = ({ data, isActive, position, hidePopup, onClick, }) => {
14
+ const { text, items } = data, popupProps = __rest(data, ["text", "items"]);
15
+ return (React.createElement(Fragment, null,
16
+ React.createElement(NavigationItem, { className: b('link'), onClick: onClick, isOpened: isActive, data: { text, type: NavigationItemType.Dropdown } }),
17
+ isActive && (React.createElement(NavigationPopup, Object.assign({ left: position, onClose: hidePopup, items: items }, popupProps)))));
18
+ };
12
19
  const Navigation = ({ className, onActiveItemChange, links, activeItemIndex, highlightActiveItem, }) => {
13
20
  const { asPath, pathname } = useContext(LocationContext);
21
+ const breakpoint = useContext(BreakpointContext);
14
22
  const itemRefs = useRef([]);
15
23
  const [itemPositions, setItemPosition] = useState([]);
16
24
  const [lastLeftScroll, setLastLeftScroll] = useState(0);
@@ -21,22 +29,6 @@ const Navigation = ({ className, onActiveItemChange, links, activeItemIndex, hig
21
29
  e.stopPropagation();
22
30
  onActiveItemChange(index === activeItemIndex ? -1 : index);
23
31
  }, [activeItemIndex, onActiveItemChange]);
24
- const renderNavDropdown = (data, onClick, isActive, position) => {
25
- const { text, items } = data, popupProps = __rest(data, ["text", "items"]);
26
- return (React.createElement(Fragment, null,
27
- React.createElement(NavigationItem, { className: b('link'), onClick: onClick, isOpened: isActive, data: { text, type: NavigationItemType.Dropdown } }),
28
- isActive && (React.createElement(NavigationPopup, Object.assign({ left: position, onClose: hidePopup, items: items }, popupProps)))));
29
- };
30
- const slider = (React.createElement("div", { className: b('slider-container') },
31
- React.createElement("div", { className: b('slider') })));
32
- const content = (React.createElement("nav", null,
33
- React.createElement("ul", { className: b('links') }, links.map((link, index) => {
34
- const isActive = index === activeItemIndex;
35
- const onClick = getItemClickHandler(index);
36
- return (React.createElement("li", { ref: (el) => itemRefs.current.push(el), key: index, className: b('links-item') },
37
- link.type === NavigationItemType.Dropdown ? (renderNavDropdown(link, onClick, isActive, itemPositions[index])) : (React.createElement(NavigationItem, { data: link, onClick: onClick })),
38
- highlightActiveItem && isActive && slider));
39
- }))));
40
32
  const calculateItemPositions = useCallback(() => {
41
33
  if (itemRefs.current.length) {
42
34
  const currentItemPositions = itemRefs.current.map((itemRef) => (itemRef && itemRef.getBoundingClientRect().left) || 0);
@@ -63,7 +55,16 @@ const Navigation = ({ className, onActiveItemChange, links, activeItemIndex, hig
63
55
  }, [calculateItemPositions, itemRefs, lastLeftScroll]);
64
56
  useEffect(() => {
65
57
  hidePopup();
66
- }, [hidePopup, asPath, pathname]);
67
- return (React.createElement(OverflowScroller, { className: b(null, className), onScrollStart: hidePopup, onScrollEnd: calculateItemPositions }, content));
58
+ }, [hidePopup, asPath, pathname, breakpoint]);
59
+ return (React.createElement(OverflowScroller, { className: b(null, className), onScrollStart: hidePopup, onScrollEnd: calculateItemPositions },
60
+ React.createElement("nav", null,
61
+ React.createElement("ul", { className: b('links') }, links.map((link, index) => {
62
+ const isActive = index === activeItemIndex;
63
+ const onClick = getItemClickHandler(index);
64
+ return (React.createElement("li", { ref: (el) => itemRefs.current.push(el), key: index, className: b('links-item') },
65
+ link.type === NavigationItemType.Dropdown ? (React.createElement(NavigationDropdown, { data: link, onClick: onClick, isActive: isActive, position: itemPositions[index], hidePopup: hidePopup })) : (React.createElement(NavigationItem, { data: link, onClick: onClick })),
66
+ highlightActiveItem && isActive && (React.createElement("div", { className: b('slider-container') },
67
+ React.createElement("div", { className: b('slider') })))));
68
+ })))));
68
69
  };
69
70
  export default Navigation;
@@ -1,6 +1,6 @@
1
1
  import _ from 'lodash';
2
2
  import block from 'bem-cn-lite';
3
- import React, { Fragment, useRef, useState, useEffect, useCallback } from 'react';
3
+ import React, { useRef, useState, useEffect, useCallback } from 'react';
4
4
  import { Portal } from '@gravity-ui/uikit';
5
5
  import { OutsideClick } from '../../../index';
6
6
  import NavigationItem from '../NavigationItem/NavigationItem';
@@ -34,9 +34,8 @@ export const NavigationPopup = ({ items, left, onClose }) => {
34
34
  if (!document || !document.body) {
35
35
  return null;
36
36
  }
37
- const renderDefaultPopup = (React.createElement(Fragment, null, items.map((item) => (React.createElement(NavigationItem, { key: item.text, className: b('link'), data: item })))));
38
37
  return (React.createElement(Portal, null,
39
38
  React.createElement("div", { ref: popupRef, className: b(), style: { left: calculatedLeft } },
40
- React.createElement(OutsideClick, { onOutsideClick: onClose }, renderDefaultPopup))));
39
+ React.createElement(OutsideClick, { onOutsideClick: onClose }, items.map((item) => (React.createElement(NavigationItem, { key: item.text, className: b('link'), data: item })))))));
41
40
  };
42
41
  export default NavigationPopup;
@@ -0,0 +1,7 @@
1
+ export { default as Header } from './Header/Header';
2
+ export { default as NavigationItem } from './NavigationItem/NavigationItem';
3
+ export { default as Logo } from './Logo/Logo';
4
+ export { default as MobileNavigation } from './MobileNavigation/MobileNavigation';
5
+ export { default as Navigation } from './Navigation/Navigation';
6
+ export { default as NavigationPopup } from './NavigationPopup/NavigationPopup';
7
+ export { default as SocialIcon } from './SocialIcon/SocialIcon';
@@ -0,0 +1,7 @@
1
+ export { default as Header } from './Header/Header';
2
+ export { default as NavigationItem } from './NavigationItem/NavigationItem';
3
+ export { default as Logo } from './Logo/Logo';
4
+ export { default as MobileNavigation } from './MobileNavigation/MobileNavigation';
5
+ export { default as Navigation } from './Navigation/Navigation';
6
+ export { default as NavigationPopup } from './NavigationPopup/NavigationPopup';
7
+ export { default as SocialIcon } from './SocialIcon/SocialIcon';
@@ -0,0 +1,10 @@
1
+ .layout {
2
+ display: flex;
3
+ flex-direction: column;
4
+ min-height: 100vh;
5
+ }
6
+ .layout__content {
7
+ display: flex;
8
+ flex-grow: 1;
9
+ flex-direction: column;
10
+ }
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { NavigationData } from '../../../../models';
3
+ import './Layout.css';
4
+ export interface LayoutProps {
5
+ navigation?: NavigationData;
6
+ }
7
+ declare const Layout: React.FC<LayoutProps>;
8
+ export default Layout;
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import block from 'bem-cn-lite';
3
+ import Header from '../../components/Header/Header';
4
+ import './Layout.css';
5
+ const b = block('layout');
6
+ const Layout = ({ children, navigation }) => (React.createElement("div", { className: b() },
7
+ navigation && React.createElement(Header, { data: navigation.header, logo: navigation.logo }),
8
+ React.createElement("main", { className: b('content') }, children)));
9
+ export default Layout;
@@ -1,8 +1,7 @@
1
1
  import React from 'react';
2
- import { ShouldRenderBlock, CustomConfig, PageContent, CustomItems } from '../../models';
3
- import { blockMap, subBlockMap } from '../../constructor-items';
4
- import { NavigationData } from '../../models/navigation';
5
2
  import '@doc-tools/transform/dist/js/yfm';
3
+ import { ShouldRenderBlock, CustomConfig, PageContent, CustomItems, NavigationData } from '../../models';
4
+ import { blockMap, subBlockMap } from '../../constructor-items';
6
5
  import './PageConstructor.css';
7
6
  export declare type ItemMap = typeof blockMap & typeof subBlockMap & CustomItems;
8
7
  export interface PageConstructorProps {
@@ -10,7 +9,7 @@ export interface PageConstructorProps {
10
9
  shouldRenderBlock?: ShouldRenderBlock;
11
10
  custom?: CustomConfig;
12
11
  renderMenu?: () => React.ReactNode;
13
- navigationData?: NavigationData;
12
+ navigation?: NavigationData;
14
13
  }
15
14
  export declare const Constructor: (props: PageConstructorProps) => JSX.Element;
16
15
  export declare const PageConstructor: (props: PageConstructorProps) => JSX.Element;
@@ -1,5 +1,6 @@
1
1
  import { __rest } from "tslib";
2
2
  import React, { useContext, useMemo } from 'react';
3
+ import '@doc-tools/transform/dist/js/yfm';
3
4
  import { HeaderBlockTypes, BlockTypes, } from '../../models';
4
5
  import { blockMap, subBlockMap } from '../../constructor-items';
5
6
  import { Grid } from '../../grid';
@@ -12,8 +13,7 @@ import { ConstructorRow } from './components/ConstructorRow';
12
13
  import { ConstructorFootnotes } from './components/ConstructorFootnotes';
13
14
  import { ConstructorHeader } from './components/ConstructorItem';
14
15
  import { ConstructorBlocks } from './components/ConstructorBlocks';
15
- import Header from '../../components/navigation/components/Header/Header';
16
- import '@doc-tools/transform/dist/js/yfm';
16
+ import Layout from '../../components/navigation/containers/Layout/Layout';
17
17
  import './PageConstructor.css';
18
18
  const b = cnBlock('page-constructor');
19
19
  export const Constructor = (props) => {
@@ -29,7 +29,7 @@ export const Constructor = (props) => {
29
29
  });
30
30
  }, [props.custom]);
31
31
  const { themeValue: theme } = useContext(ThemeValueContext);
32
- const { content: { blocks = [], background = {}, footnotes = [] } = {}, renderMenu, shouldRenderBlock, navigationData, } = props;
32
+ const { content: { blocks = [], background = {}, footnotes = [] } = {}, renderMenu, shouldRenderBlock, navigation, } = props;
33
33
  const hasFootnotes = footnotes.length > 0;
34
34
  const isHeaderBlock = (block) => headerBlockTypes.includes(block.type);
35
35
  const header = blocks === null || blocks === void 0 ? void 0 : blocks.find(isHeaderBlock);
@@ -39,14 +39,14 @@ export const Constructor = (props) => {
39
39
  React.createElement("div", { className: b() },
40
40
  React.createElement("div", { className: b('wrapper') },
41
41
  themedBackground && (React.createElement(BackgroundMedia, Object.assign({}, themedBackground, { className: b('background') }))),
42
- (navigationData === null || navigationData === void 0 ? void 0 : navigationData.header) && (React.createElement(Header, { logo: navigationData === null || navigationData === void 0 ? void 0 : navigationData.logo, data: navigationData === null || navigationData === void 0 ? void 0 : navigationData.header })),
43
- renderMenu && renderMenu(),
44
- header && React.createElement(ConstructorHeader, { data: header }),
45
- React.createElement(Grid, null,
46
- restBlocks && (React.createElement(ConstructorRow, null,
47
- React.createElement(ConstructorBlocks, { items: restBlocks, shouldRenderBlock: shouldRenderBlock }))),
48
- hasFootnotes && (React.createElement(ConstructorRow, null,
49
- React.createElement(ConstructorFootnotes, { items: footnotes }))))))));
42
+ React.createElement(Layout, { navigation: navigation },
43
+ renderMenu && renderMenu(),
44
+ header && React.createElement(ConstructorHeader, { data: header }),
45
+ React.createElement(Grid, null,
46
+ restBlocks && (React.createElement(ConstructorRow, null,
47
+ React.createElement(ConstructorBlocks, { items: restBlocks, shouldRenderBlock: shouldRenderBlock }))),
48
+ hasFootnotes && (React.createElement(ConstructorRow, null,
49
+ React.createElement(ConstructorFootnotes, { items: footnotes })))))))));
50
50
  };
51
51
  export const PageConstructor = (props) => {
52
52
  const { content: { animated = true } = {} } = props, rest = __rest(props, ["content"]);
@@ -31,9 +31,10 @@ export interface NavigationSocialItem extends Omit<NavigationItemBase, 'text'> {
31
31
  url: string;
32
32
  }
33
33
  export declare type NavigationItem = NavigationLinkItem | NavigationButtonItem | NavigationDropdownItem;
34
- export interface NavigationLogo extends Omit<NavigationItemBase, 'text'> {
34
+ export interface NavigationLogo {
35
35
  icon: ImageProps;
36
36
  text?: string;
37
+ url?: string;
37
38
  }
38
39
  export interface HeaderData {
39
40
  leftItems: NavigationItem[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/page-constructor",
3
- "version": "1.7.0-alpha.6",
3
+ "version": "1.7.0-alpha.8",
4
4
  "description": "Gravity UI Page Constructor",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -121,8 +121,5 @@
121
121
  "*.{json,yaml,yml,md}": [
122
122
  "prettier --write"
123
123
  ]
124
- },
125
- "publishConfig": {
126
- "tag": "alpha"
127
124
  }
128
125
  }
@@ -31,9 +31,10 @@ export interface NavigationSocialItem extends Omit<NavigationItemBase, 'text'> {
31
31
  url: string;
32
32
  }
33
33
  export declare type NavigationItem = NavigationLinkItem | NavigationButtonItem | NavigationDropdownItem;
34
- export interface NavigationLogo extends Omit<NavigationItemBase, 'text'> {
34
+ export interface NavigationLogo {
35
35
  icon: ImageProps;
36
36
  text?: string;
37
+ url?: string;
37
38
  }
38
39
  export interface HeaderData {
39
40
  leftItems: NavigationItem[];