@gravity-ui/page-constructor 3.11.0 → 3.12.1

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 (87) hide show
  1. package/README.md +6 -6
  2. package/build/cjs/components/Media/Image/Image.js +3 -2
  3. package/build/cjs/hooks/useHeightCalculator.js +1 -1
  4. package/build/cjs/models/navigation.d.ts +3 -2
  5. package/build/{esm/navigation/components/Header/Header.css → cjs/navigation/components/DesktopNavigation/DesktopNavigation.css} +28 -36
  6. package/build/cjs/navigation/components/DesktopNavigation/DesktopNavigation.d.ts +4 -0
  7. package/build/cjs/navigation/components/DesktopNavigation/DesktopNavigation.js +21 -0
  8. package/build/cjs/navigation/components/MobileMenuButton/MobileMenuButton.css +7 -0
  9. package/build/cjs/navigation/components/MobileMenuButton/MobileMenuButton.d.ts +3 -0
  10. package/build/cjs/navigation/components/MobileMenuButton/MobileMenuButton.js +15 -0
  11. package/build/cjs/navigation/components/MobileNavigation/MobileNavigation.css +10 -5
  12. package/build/cjs/navigation/components/MobileNavigation/MobileNavigation.d.ts +1 -10
  13. package/build/cjs/navigation/components/MobileNavigation/MobileNavigation.js +7 -30
  14. package/build/cjs/navigation/components/Navigation/Navigation.css +8 -13
  15. package/build/cjs/navigation/components/Navigation/Navigation.d.ts +4 -7
  16. package/build/cjs/navigation/components/Navigation/Navigation.js +37 -15
  17. package/build/cjs/navigation/components/NavigationItem/NavigationItem.css +28 -0
  18. package/build/cjs/navigation/components/NavigationItem/NavigationItem.d.ts +3 -9
  19. package/build/cjs/navigation/components/NavigationItem/NavigationItem.js +15 -6
  20. package/build/cjs/navigation/components/NavigationItem/components/GithubButton/GithubButton.d.ts +1 -1
  21. package/build/cjs/navigation/components/NavigationItem/components/NavigationButton/NavigationButton.d.ts +1 -1
  22. package/build/cjs/navigation/components/NavigationItem/components/NavigationDropdown/NavigationDropdown.d.ts +5 -4
  23. package/build/cjs/navigation/components/NavigationItem/components/NavigationDropdown/NavigationDropdown.js +12 -7
  24. package/build/cjs/navigation/components/NavigationItem/components/NavigationLink/NavigationLink.d.ts +1 -1
  25. package/build/cjs/navigation/components/NavigationList/NavigationList.d.ts +3 -0
  26. package/build/cjs/navigation/components/NavigationList/NavigationList.js +11 -0
  27. package/build/cjs/navigation/components/NavigationListItem/NavigationListItem.d.ts +4 -13
  28. package/build/cjs/navigation/components/NavigationListItem/NavigationListItem.js +6 -13
  29. package/build/cjs/navigation/components/NavigationPopup/NavigationPopup.css +5 -4
  30. package/build/cjs/navigation/components/NavigationPopup/NavigationPopup.d.ts +1 -8
  31. package/build/cjs/navigation/components/NavigationPopup/NavigationPopup.js +6 -6
  32. package/build/cjs/navigation/containers/Layout/Layout.js +2 -2
  33. package/build/cjs/navigation/models.d.ts +63 -0
  34. package/build/cjs/navigation/{constants.js → models.js} +7 -1
  35. package/build/cjs/navigation/utils.d.ts +11 -1
  36. package/build/cjs/navigation/utils.js +19 -1
  37. package/build/esm/components/Media/Image/Image.js +3 -2
  38. package/build/esm/hooks/useHeightCalculator.js +1 -1
  39. package/build/esm/models/navigation.d.ts +3 -2
  40. package/build/{cjs/navigation/components/Header/Header.css → esm/navigation/components/DesktopNavigation/DesktopNavigation.css} +28 -36
  41. package/build/esm/navigation/components/DesktopNavigation/DesktopNavigation.d.ts +5 -0
  42. package/build/esm/navigation/components/DesktopNavigation/DesktopNavigation.js +19 -0
  43. package/build/esm/navigation/components/MobileMenuButton/MobileMenuButton.css +7 -0
  44. package/build/esm/navigation/components/MobileMenuButton/MobileMenuButton.d.ts +4 -0
  45. package/build/esm/navigation/components/MobileMenuButton/MobileMenuButton.js +11 -0
  46. package/build/esm/navigation/components/MobileNavigation/MobileNavigation.css +10 -5
  47. package/build/esm/navigation/components/MobileNavigation/MobileNavigation.d.ts +1 -10
  48. package/build/esm/navigation/components/MobileNavigation/MobileNavigation.js +9 -31
  49. package/build/esm/navigation/components/Navigation/Navigation.css +8 -13
  50. package/build/esm/navigation/components/Navigation/Navigation.d.ts +4 -7
  51. package/build/esm/navigation/components/Navigation/Navigation.js +35 -15
  52. package/build/esm/navigation/components/NavigationItem/NavigationItem.css +28 -0
  53. package/build/esm/navigation/components/NavigationItem/NavigationItem.d.ts +4 -9
  54. package/build/esm/navigation/components/NavigationItem/NavigationItem.js +16 -6
  55. package/build/esm/navigation/components/NavigationItem/components/GithubButton/GithubButton.d.ts +1 -1
  56. package/build/esm/navigation/components/NavigationItem/components/NavigationButton/NavigationButton.d.ts +1 -1
  57. package/build/esm/navigation/components/NavigationItem/components/NavigationDropdown/NavigationDropdown.d.ts +5 -4
  58. package/build/esm/navigation/components/NavigationItem/components/NavigationDropdown/NavigationDropdown.js +12 -7
  59. package/build/esm/navigation/components/NavigationItem/components/NavigationLink/NavigationLink.d.ts +1 -1
  60. package/build/esm/navigation/components/NavigationList/NavigationList.d.ts +3 -0
  61. package/build/esm/navigation/components/NavigationList/NavigationList.js +7 -0
  62. package/build/esm/navigation/components/NavigationListItem/NavigationListItem.d.ts +4 -14
  63. package/build/esm/navigation/components/NavigationListItem/NavigationListItem.js +5 -10
  64. package/build/esm/navigation/components/NavigationPopup/NavigationPopup.css +5 -4
  65. package/build/esm/navigation/components/NavigationPopup/NavigationPopup.d.ts +1 -8
  66. package/build/esm/navigation/components/NavigationPopup/NavigationPopup.js +6 -6
  67. package/build/esm/navigation/containers/Layout/Layout.js +2 -2
  68. package/build/esm/navigation/models.d.ts +63 -0
  69. package/build/esm/navigation/{constants.js → models.js} +6 -0
  70. package/build/esm/navigation/utils.d.ts +11 -1
  71. package/build/esm/navigation/utils.js +17 -0
  72. package/package.json +20 -13
  73. package/server/models/navigation.d.ts +3 -2
  74. package/widget/index.js +1 -1
  75. package/CHANGELOG.md +0 -1484
  76. package/build/cjs/navigation/components/Header/Header.d.ts +0 -8
  77. package/build/cjs/navigation/components/Header/Header.js +0 -86
  78. package/build/cjs/navigation/components/NavigationDropdownItem/NavigationDropdownItem.d.ts +0 -11
  79. package/build/cjs/navigation/components/NavigationDropdownItem/NavigationDropdownItem.js +0 -15
  80. package/build/cjs/navigation/components/NavigationListItem/NavigationListItem.css +0 -27
  81. package/build/cjs/navigation/constants.d.ts +0 -6
  82. package/build/esm/navigation/components/Header/Header.d.ts +0 -9
  83. package/build/esm/navigation/components/Header/Header.js +0 -82
  84. package/build/esm/navigation/components/NavigationDropdownItem/NavigationDropdownItem.d.ts +0 -11
  85. package/build/esm/navigation/components/NavigationDropdownItem/NavigationDropdownItem.js +0 -13
  86. package/build/esm/navigation/components/NavigationListItem/NavigationListItem.css +0 -27
  87. package/build/esm/navigation/constants.d.ts +0 -6
@@ -1,20 +1,15 @@
1
1
  /* use this for style redefinitions to awoid problems with
2
2
  unpredictable css rules order in build */
3
3
  .pc-navigation {
4
- font-size: var(--yc-text-body-2-font-size);
5
- line-height: var(--yc-text-body-2-line-height);
6
- }
7
- .pc-navigation__links {
8
- position: relative;
4
+ position: sticky;
5
+ z-index: 98;
6
+ top: 0;
9
7
  display: flex;
8
+ justify-content: center;
10
9
  align-items: center;
11
- margin: 0;
12
- padding: 0;
13
- list-style: none;
14
- }
15
- .pc-navigation__links-item {
16
- position: relative;
10
+ height: var(--header-height);
11
+ background-color: var(--yc-color-base-background);
17
12
  }
18
- .pc-navigation__links-item:not(:last-child) {
19
- margin-right: 20px;
13
+ .pc-navigation_with-border {
14
+ box-shadow: inset 0 -1px 0 var(--yc-color-line-generic);
20
15
  }
@@ -1,12 +1,9 @@
1
1
  import React from 'react';
2
- import { NavigationItemModel } from '../../../models/navigation';
2
+ import { HeaderData, ThemedNavigationLogoData } from '../../../models';
3
3
  import './Navigation.css';
4
4
  export interface NavigationProps {
5
- links: NavigationItemModel[];
6
- activeItemId?: string;
7
- className?: string;
8
- highlightActiveItem?: boolean;
9
- onActiveItemChange: (id?: string) => void;
5
+ logo: ThemedNavigationLogoData;
6
+ data: HeaderData;
10
7
  }
11
- declare const Navigation: React.FC<NavigationProps>;
8
+ export declare const Navigation: React.FC<NavigationProps>;
12
9
  export default Navigation;
@@ -1,21 +1,41 @@
1
- import React, { useCallback, useContext, useEffect } from 'react';
2
- import OverflowScroller from '../../../components/OverflowScroller/OverflowScroller';
3
- import { LocationContext } from '../../../context/locationContext';
1
+ import React, { useEffect, useMemo, useState } from 'react';
2
+ import _ from 'lodash';
3
+ import OutsideClick from '../../../components/OutsideClick/OutsideClick';
4
+ import { Col, Grid, Row } from '../../../grid';
4
5
  import { block } from '../../../utils';
5
- import { ItemColumnName } from '../../constants';
6
- import { NavigationListItem } from '../NavigationListItem/NavigationListItem';
6
+ import { getNavigationItemWithIconSize } from '../../utils';
7
+ import DesktopNavigation from '../DesktopNavigation/DesktopNavigation';
8
+ import MobileNavigation from '../MobileNavigation/MobileNavigation';
7
9
  import './Navigation.css';
8
10
  const b = block('navigation');
9
- const Navigation = ({ className, onActiveItemChange, links, activeItemId, }) => {
10
- const { asPath, pathname } = useContext(LocationContext);
11
- const hidePopup = useCallback(() => {
12
- onActiveItemChange();
13
- }, [onActiveItemChange]);
11
+ export const Navigation = ({ data, logo }) => {
12
+ const { leftItems, rightItems, iconSize = 20, withBorder = false } = data;
13
+ const [isSidebarOpened, setIsSidebarOpened] = useState(false);
14
+ const [activeItemId, setActiveItemId] = useState(undefined);
15
+ const [showBorder, setShowBorder] = useState(withBorder);
16
+ const getNavigationItem = getNavigationItemWithIconSize(iconSize);
17
+ const leftItemsWithIconSize = useMemo(() => leftItems.map(getNavigationItem), [getNavigationItem, leftItems]);
18
+ const rightItemsWithIconSize = useMemo(() => rightItems === null || rightItems === void 0 ? void 0 : rightItems.map(getNavigationItem), [getNavigationItem, rightItems]);
19
+ const onActiveItemChange = (id) => {
20
+ setActiveItemId(id);
21
+ };
22
+ const onSidebarOpenedChange = (isOpen) => setIsSidebarOpened(isOpen);
14
23
  useEffect(() => {
15
- hidePopup();
16
- }, [hidePopup, asPath, pathname]);
17
- return (React.createElement(OverflowScroller, { className: b(null, className), onScrollStart: hidePopup },
18
- React.createElement("nav", null,
19
- React.createElement("ul", { className: b('links') }, links.map((link, index) => (React.createElement(NavigationListItem, { key: index, className: b('links-item'), item: link, index: index, activeItemId: activeItemId, hidePopup: hidePopup, column: ItemColumnName.Left, onActiveItemChange: onActiveItemChange })))))));
24
+ const showBorderOnScroll = () => {
25
+ if (!showBorder) {
26
+ setShowBorder(window.scrollY > 0);
27
+ }
28
+ };
29
+ const scrollHandler = _.debounce(showBorderOnScroll, 20);
30
+ window.addEventListener('scroll', scrollHandler, { passive: true });
31
+ return () => window.removeEventListener('scroll', scrollHandler);
32
+ });
33
+ return (React.createElement(Grid, { className: b({ 'with-border': showBorder }) },
34
+ React.createElement(Row, null,
35
+ React.createElement(Col, null,
36
+ React.createElement("nav", null,
37
+ React.createElement(DesktopNavigation, { logo: logo, activeItemId: activeItemId, onActiveItemChange: onActiveItemChange, leftItemsWithIconSize: leftItemsWithIconSize, rightItemsWithIconSize: rightItemsWithIconSize, isSidebarOpened: isSidebarOpened, onSidebarOpenedChange: onSidebarOpenedChange }),
38
+ React.createElement(OutsideClick, { onOutsideClick: () => onSidebarOpenedChange(false) },
39
+ React.createElement(MobileNavigation, { topItems: leftItems, bottomItems: rightItems, isOpened: isSidebarOpened, activeItemId: activeItemId, onActiveItemChange: onActiveItemChange })))))));
20
40
  };
21
41
  export default Navigation;
@@ -0,0 +1,28 @@
1
+ /* use this for style redefinitions to awoid problems with
2
+ unpredictable css rules order in build */
3
+ .pc-navigation-item {
4
+ cursor: pointer;
5
+ outline: none;
6
+ color: inherit;
7
+ text-decoration: none;
8
+ }
9
+ .pc-navigation-item:last-child {
10
+ margin-bottom: 0;
11
+ }
12
+ .utilityfocus .pc-navigation-item:focus {
13
+ outline: 2px solid #ffdb4d;
14
+ }
15
+ .pc-navigation-item__content:hover, .pc-navigation-item__content:active {
16
+ color: var(--yc-color-text-link);
17
+ }
18
+ .pc-navigation-item_menu-layout_desktop {
19
+ height: var(--header-height);
20
+ line-height: var(--header-height);
21
+ margin-bottom: 0;
22
+ }
23
+ .pc-navigation-item_menu-layout_mobile {
24
+ margin-bottom: 24px;
25
+ }
26
+ .pc-navigation-item_menu-layout_dropdown {
27
+ margin-bottom: 0;
28
+ }
@@ -1,10 +1,5 @@
1
- import React, { MouseEventHandler } from 'react';
2
- import { NavigationItemData } from '../../../models';
3
- export interface NavigationItemProps {
4
- data: NavigationItemData;
5
- className?: string;
6
- onClick?: MouseEventHandler;
7
- isOpened?: boolean;
8
- }
9
- declare const NavigationItem: React.ForwardRefExoticComponent<NavigationItemProps & React.RefAttributes<HTMLElement>>;
1
+ import React from 'react';
2
+ import { NavigationItemProps } from '../../models';
3
+ import './NavigationItem.css';
4
+ declare const NavigationItem: React.FC<NavigationItemProps>;
10
5
  export default NavigationItem;
@@ -1,12 +1,16 @@
1
1
  import { __rest } from "tslib";
2
2
  import React, { useMemo } from 'react';
3
+ import { omit } from 'lodash';
3
4
  import { BlockIdContext } from '../../../context/blockIdContext';
4
5
  import { NavigationItemType } from '../../../models';
6
+ import { block } from '../../../utils';
5
7
  import SocialIcon from '../SocialIcon/SocialIcon';
6
8
  import { GithubButton } from './components/GithubButton/GithubButton';
7
9
  import { NavigationButton } from './components/NavigationButton/NavigationButton';
8
10
  import { NavigationDropdown } from './components/NavigationDropdown/NavigationDropdown';
9
11
  import { NavigationLink } from './components/NavigationLink/NavigationLink';
12
+ import './NavigationItem.css';
13
+ const b = block('navigation-item');
10
14
  const ANALYTICS_ID = 'navigation';
11
15
  //todo: add types support form component in map
12
16
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -17,13 +21,19 @@ const NavigationItemsMap = {
17
21
  [NavigationItemType.Link]: NavigationLink,
18
22
  [NavigationItemType.GithubButton]: GithubButton,
19
23
  };
20
- const NavigationItem = React.forwardRef((_a, ref) => {
21
- var { data, className } = _a, props = __rest(_a, ["data", "className"]);
24
+ const NavigationItem = (_a) => {
25
+ var { data, className, menuLayout } = _a, props = __rest(_a, ["data", "className", "menuLayout"]);
22
26
  const { type = NavigationItemType.Link } = data;
23
27
  const Component = NavigationItemsMap[type];
24
- const componentProps = useMemo(() => (Object.assign(Object.assign(Object.assign({ className }, data), props), { ref })), [className, data, props, ref]);
28
+ const componentProps = useMemo(() => {
29
+ const componentProperties = Object.assign(Object.assign({}, data), props);
30
+ if (type !== NavigationItemType.Dropdown) {
31
+ return omit(componentProperties, 'hidePopup', 'isActive');
32
+ }
33
+ return componentProperties;
34
+ }, [data, props, type]);
25
35
  return (React.createElement(BlockIdContext.Provider, { value: ANALYTICS_ID },
26
- React.createElement(Component, Object.assign({}, componentProps))));
27
- });
28
- NavigationItem.displayName = 'NavigationItem';
36
+ React.createElement("li", { className: b({ 'menu-layout': menuLayout }, className) },
37
+ React.createElement(Component, Object.assign({}, componentProps, { className: b('content') })))));
38
+ };
29
39
  export default NavigationItem;
@@ -1,5 +1,5 @@
1
1
  import { NavigationGithubButton } from '../../../../../models';
2
- import { NavigationItemProps } from '../../NavigationItem';
2
+ import { NavigationItemProps } from '../../../../models';
3
3
  import './GithubButton.css';
4
4
  type NavigationGithubButtonProps = NavigationItemProps & NavigationGithubButton;
5
5
  export declare const GithubButton: ({ text, url, className, label, size, icon, }: NavigationGithubButtonProps) => JSX.Element;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { ButtonProps } from '../../../../../models';
3
- import { NavigationItemProps } from '../../NavigationItem';
3
+ import { NavigationItemProps } from '../../../../models';
4
4
  import './NavigationButton.css';
5
5
  type NavigationButtonProps = Pick<NavigationItemProps, 'className'> & ButtonProps;
6
6
  export declare const NavigationButton: React.FC<NavigationButtonProps>;
@@ -1,5 +1,6 @@
1
- import React from 'react';
2
- import { DropdownItemData } from '../../../../../models';
3
- import { NavigationItemProps } from '../../NavigationItem';
1
+ import { NavigationDropdownItem } from '../../../../../models';
2
+ import { NavigationItemProps } from '../../../../models';
4
3
  import './NavigationDropdown.css';
5
- export declare const NavigationDropdown: React.ForwardRefExoticComponent<NavigationItemProps & DropdownItemData & React.RefAttributes<HTMLElement>>;
4
+ type NavigationDropdownProps = NavigationItemProps & NavigationDropdownItem;
5
+ export declare const NavigationDropdown: ({ text, icon, className, iconSize, hidePopup, items, isActive, ...props }: NavigationDropdownProps) => JSX.Element;
6
+ export {};
@@ -1,15 +1,20 @@
1
- import React from 'react';
1
+ import { __rest } from "tslib";
2
+ import React, { Fragment, useRef } from 'react';
2
3
  import { ToggleArrow } from '../../../../../components';
3
4
  import { getMediaImage } from '../../../../../components/Media/Image/utils';
4
5
  import { block } from '../../../../../utils';
6
+ import NavigationPopup from '../../../NavigationPopup/NavigationPopup';
5
7
  import { ContentWrapper } from '../ContentWrapper/ContentWrapper';
6
8
  import './NavigationDropdown.css';
7
9
  const b = block('navigation-dropdown');
8
10
  const TOGGLE_ARROW_SIZE = 12;
9
- export const NavigationDropdown = React.forwardRef(({ text, icon, isOpened, className, iconSize, onClick }, ref) => {
11
+ export const NavigationDropdown = (_a) => {
12
+ var { text, icon, className, iconSize, hidePopup, items, isActive } = _a, props = __rest(_a, ["text", "icon", "className", "iconSize", "hidePopup", "items", "isActive"]);
10
13
  const iconData = icon && getMediaImage(icon);
11
- return (React.createElement("span", { ref: ref, onClick: onClick, className: b(null, className) },
12
- React.createElement(ContentWrapper, { text: text, icon: iconData, iconSize: iconSize }),
13
- React.createElement(ToggleArrow, { className: b('arrow'), size: TOGGLE_ARROW_SIZE, type: 'vertical', iconType: "navigation", open: isOpened })));
14
- });
15
- NavigationDropdown.displayName = 'NavigationDropdown';
14
+ const anchorRef = useRef(null);
15
+ return (React.createElement(Fragment, null,
16
+ React.createElement("span", Object.assign({ ref: anchorRef }, props, { className: b(null, className) }),
17
+ React.createElement(ContentWrapper, { text: text, icon: iconData, iconSize: iconSize }),
18
+ React.createElement(ToggleArrow, { className: b('arrow'), size: TOGGLE_ARROW_SIZE, type: 'vertical', iconType: "navigation", open: isActive })),
19
+ React.createElement(NavigationPopup, { open: isActive, onClose: hidePopup, items: items, anchorRef: anchorRef })));
20
+ };
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { NavigationLinkItem } from '../../../../../models';
3
- import { NavigationItemProps } from '../../NavigationItem';
3
+ import { NavigationItemProps } from '../../../../models';
4
4
  import './NavigationLink.css';
5
5
  type NavigationLinkProps = NavigationItemProps & NavigationLinkItem;
6
6
  export declare const NavigationLink: React.FC<NavigationLinkProps>;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { NavigationListProps } from '../../models';
3
+ export declare const NavigationList: React.FC<NavigationListProps>;
@@ -0,0 +1,7 @@
1
+ import { __rest } from "tslib";
2
+ import React from 'react';
3
+ import NavigationListItem from '../NavigationListItem/NavigationListItem';
4
+ export const NavigationList = (_a) => {
5
+ var { className, itemClassName, items } = _a, props = __rest(_a, ["className", "itemClassName", "items"]);
6
+ return (React.createElement("ul", { className: className }, items.map((item, index) => (React.createElement(NavigationListItem, Object.assign({ key: index, index: index, data: item, className: itemClassName }, props))))));
7
+ };
@@ -1,14 +1,4 @@
1
- import { ClassNameProps, NavigationItemModel } from '../../../models';
2
- import { ItemColumnName } from '../../constants';
3
- import './NavigationListItem.css';
4
- type NavigationListItemProps = {
5
- item: NavigationItemModel;
6
- index: number;
7
- column: ItemColumnName;
8
- activeItemId?: string;
9
- highlightActiveItem?: boolean;
10
- hidePopup: () => void;
11
- onActiveItemChange: (id?: string) => void;
12
- } & ClassNameProps;
13
- export declare const NavigationListItem: ({ item, className, index, activeItemId, highlightActiveItem, hidePopup, column, onActiveItemChange, }: NavigationListItemProps) => JSX.Element;
14
- export {};
1
+ import React from 'react';
2
+ import { NavigationListItemProps } from '../../models';
3
+ declare const NavigationListItem: React.FC<NavigationListItemProps>;
4
+ export default NavigationListItem;
@@ -1,12 +1,9 @@
1
+ import { __rest } from "tslib";
1
2
  import React from 'react';
2
- import { NavigationItemType } from '../../../models';
3
- import { block } from '../../../utils';
4
3
  import { getItemClickHandler } from '../../utils';
5
- import NavigationDropdownItem from '../NavigationDropdownItem/NavigationDropdownItem';
6
4
  import NavigationItem from '../NavigationItem/NavigationItem';
7
- import './NavigationListItem.css';
8
- const b = block('navigation-list-item');
9
- export const NavigationListItem = ({ item, className, index, activeItemId, highlightActiveItem, hidePopup, column, onActiveItemChange, }) => {
5
+ const NavigationListItem = (_a) => {
6
+ var { column, index, activeItemId, onActiveItemChange } = _a, props = __rest(_a, ["column", "index", "activeItemId", "onActiveItemChange"]);
10
7
  const id = `${column}-${index}`;
11
8
  const isActive = id === activeItemId;
12
9
  const onClick = getItemClickHandler({
@@ -15,8 +12,6 @@ export const NavigationListItem = ({ item, className, index, activeItemId, highl
15
12
  activeItemId,
16
13
  onActiveItemChange,
17
14
  });
18
- return (React.createElement("li", { className: b(null, className) },
19
- item.type === NavigationItemType.Dropdown ? (React.createElement(NavigationDropdownItem, { className: b('content'), data: item, onClick: onClick, isActive: isActive, hidePopup: hidePopup })) : (React.createElement(NavigationItem, { className: b('content'), data: item, onClick: onClick })),
20
- highlightActiveItem && isActive && (React.createElement("div", { className: b('slider-container') },
21
- React.createElement("div", { className: b('slider') })))));
15
+ return (React.createElement(NavigationItem, Object.assign({ isActive: isActive, onClick: onClick, hidePopup: onActiveItemChange }, props)));
22
16
  };
17
+ export default NavigationListItem;
@@ -14,13 +14,14 @@ unpredictable css rules order in build */
14
14
  background: var(--yc-color-base-float);
15
15
  box-shadow: 0 3px 10px var(--yc-color-sfx-shadow);
16
16
  }
17
- @media (max-width: 768px) {
18
- .pc-navigation-popup {
19
- display: none;
20
- }
17
+ .pc-navigation-popup__list {
18
+ margin: 0;
19
+ padding: 0;
20
+ list-style: none;
21
21
  }
22
22
  .pc-navigation-popup__link {
23
23
  height: 36px;
24
+ line-height: 20px;
24
25
  padding: 8px 12px;
25
26
  border-radius: 8px;
26
27
  }
@@ -1,12 +1,5 @@
1
1
  import React from 'react';
2
- import { NavigationLinkItem } from '../../../models';
2
+ import { NavigationPopupProps } from '../../models';
3
3
  import './NavigationPopup.css';
4
- export interface NavigationPopupProps {
5
- open: boolean;
6
- items: NavigationLinkItem[];
7
- onClose: () => void;
8
- className?: string;
9
- anchorRef: React.RefObject<Element>;
10
- }
11
4
  export declare const NavigationPopup: React.FC<NavigationPopupProps>;
12
5
  export default NavigationPopup;
@@ -1,15 +1,15 @@
1
1
  import React from 'react';
2
2
  import { Popup } from '@gravity-ui/uikit';
3
3
  import { block } from '../../../utils';
4
+ import { NavigationLayout } from '../../models';
4
5
  import NavigationItem from '../NavigationItem/NavigationItem';
5
6
  import './NavigationPopup.css';
6
7
  const b = block('navigation-popup');
7
8
  const OFFSET_RESET = [0, 0];
8
- export const NavigationPopup = ({ anchorRef, items, onClose, className, open, }) => {
9
- return (React.createElement(Popup
9
+ export const NavigationPopup = ({ anchorRef, items, onClose, className, open, }) => (React.createElement(Popup
10
+ // Workaround to recalculate position on every opening. Required for valid position calculation for scrolled header links.
11
+ , {
10
12
  // Workaround to recalculate position on every opening. Required for valid position calculation for scrolled header links.
11
- , {
12
- // Workaround to recalculate position on every opening. Required for valid position calculation for scrolled header links.
13
- anchorRef: open ? anchorRef : undefined, className: b(null, className), open: open, onClose: onClose, onOutsideClick: onClose, keepMounted: true, disablePortal: true, strategy: "fixed", placement: "bottom-start", offset: OFFSET_RESET }, items.map((item) => (React.createElement(NavigationItem, { key: item.text, className: b('link'), data: item })))));
14
- };
13
+ anchorRef: open ? anchorRef : undefined, className: b(null, className), open: open, onClose: onClose, onOutsideClick: onClose, keepMounted: true, disablePortal: true, strategy: "fixed", placement: "bottom-start", offset: OFFSET_RESET },
14
+ React.createElement("ul", { className: b('list') }, items.map((item) => (React.createElement(NavigationItem, { key: item.text, className: b('link'), data: item, menuLayout: NavigationLayout.Dropdown }))))));
15
15
  export default NavigationPopup;
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
2
  import { block } from '../../../utils';
3
- import Header from '../../components/Header/Header';
3
+ import Navigation from '../../components/Navigation/Navigation';
4
4
  import './Layout.css';
5
5
  const b = block('layout');
6
6
  const Layout = ({ children, navigation }) => (React.createElement("div", { className: b() },
7
- navigation && React.createElement(Header, { data: navigation.header, logo: navigation.logo }),
7
+ navigation && React.createElement(Navigation, { data: navigation.header, logo: navigation.logo }),
8
8
  React.createElement("main", { className: b('content') }, children)));
9
9
  export default Layout;
@@ -0,0 +1,63 @@
1
+ import { MouseEventHandler } from 'react';
2
+ import { ClassNameProps, NavigationItemData, NavigationItemModel, NavigationLinkItem, ThemedNavigationLogoData } from '../models';
3
+ export interface MobileMenuButtonProps {
4
+ isSidebarOpened: boolean;
5
+ onSidebarOpenedChange: (arg: boolean) => void;
6
+ }
7
+ export declare enum ItemColumnName {
8
+ Left = "left",
9
+ Right = "right",
10
+ Top = "top",
11
+ Bottom = "bottom"
12
+ }
13
+ export declare enum NavigationLayout {
14
+ Desktop = "desktop",
15
+ Mobile = "mobile",
16
+ Dropdown = "dropdown"
17
+ }
18
+ export interface ActiveItemProps {
19
+ activeItemId?: string;
20
+ onActiveItemChange: (id?: string) => void;
21
+ }
22
+ export interface MenuLayoutProps {
23
+ menuLayout?: NavigationLayout;
24
+ }
25
+ export interface NavigationItemProps extends ClassNameProps, MenuLayoutProps {
26
+ data: NavigationItemData;
27
+ onClick?: MouseEventHandler;
28
+ isActive?: boolean;
29
+ isTopLevel?: boolean;
30
+ hidePopup?: () => void;
31
+ }
32
+ export interface NavigationListItemProps extends MenuLayoutProps, ActiveItemProps, ClassNameProps {
33
+ data: NavigationItemModel;
34
+ column: ItemColumnName;
35
+ index: number;
36
+ }
37
+ export interface NavigationListProps extends Pick<NavigationListItemProps, 'column'>, MenuLayoutProps, ActiveItemProps, ClassNameProps {
38
+ items: NavigationItemModel[];
39
+ itemClassName?: string;
40
+ }
41
+ export interface ItemsWrapperProps extends Pick<NavigationListProps, 'items'>, ActiveItemProps, ClassNameProps {
42
+ }
43
+ export interface DesktopNavigationProps extends MobileMenuButtonProps, ActiveItemProps {
44
+ logo: ThemedNavigationLogoData;
45
+ leftItemsWithIconSize: NavigationItemModel[];
46
+ rightItemsWithIconSize?: NavigationItemModel[];
47
+ }
48
+ export interface MobileNavigationProps extends ClassNameProps, ActiveItemProps {
49
+ isOpened?: boolean;
50
+ topItems?: NavigationItemModel[];
51
+ bottomItems?: NavigationItemModel[];
52
+ }
53
+ export interface NavigationProps extends MobileMenuButtonProps, ActiveItemProps {
54
+ logo: ThemedNavigationLogoData;
55
+ leftItemsWithIconSize: NavigationItemModel[];
56
+ rightItemsWithIconSize?: NavigationItemModel[];
57
+ }
58
+ export interface NavigationPopupProps extends ClassNameProps {
59
+ open: boolean;
60
+ items: NavigationLinkItem[];
61
+ onClose: () => void;
62
+ anchorRef: React.RefObject<Element>;
63
+ }
@@ -5,3 +5,9 @@ export var ItemColumnName;
5
5
  ItemColumnName["Top"] = "top";
6
6
  ItemColumnName["Bottom"] = "bottom";
7
7
  })(ItemColumnName || (ItemColumnName = {}));
8
+ export var NavigationLayout;
9
+ (function (NavigationLayout) {
10
+ NavigationLayout["Desktop"] = "desktop";
11
+ NavigationLayout["Mobile"] = "mobile";
12
+ NavigationLayout["Dropdown"] = "dropdown";
13
+ })(NavigationLayout || (NavigationLayout = {}));
@@ -1,5 +1,6 @@
1
1
  import { MouseEventHandler } from 'react';
2
- import { ItemColumnName } from './constants';
2
+ import { NavigationButtonItem, NavigationDropdownItem, NavigationItemModel, NavigationItemType } from '../models';
3
+ import { ItemColumnName } from './models';
3
4
  type GetItemClickHandlerArgs = {
4
5
  column: ItemColumnName;
5
6
  index: number;
@@ -7,4 +8,13 @@ type GetItemClickHandlerArgs = {
7
8
  onActiveItemChange: (id?: string) => void;
8
9
  };
9
10
  export declare const getItemClickHandler: ({ column, index, onActiveItemChange, }: GetItemClickHandlerArgs) => MouseEventHandler;
11
+ export declare function getNavigationItemWithIconSize(iconSize?: number): (item: NavigationItemModel) => NavigationButtonItem | NavigationDropdownItem | {
12
+ type: NavigationItemType.Link;
13
+ url: string;
14
+ arrow?: boolean | undefined;
15
+ target?: string | undefined;
16
+ text: string;
17
+ icon?: import("../models").ImageProps | undefined;
18
+ iconSize?: number | undefined;
19
+ };
10
20
  export {};
@@ -1,3 +1,4 @@
1
+ import { NavigationItemType, } from '../models';
1
2
  export const getItemClickHandler = ({ column, index, onActiveItemChange, activeItemId }) => (e) => {
2
3
  const id = `${column}-${index}`;
3
4
  if (e) {
@@ -5,3 +6,19 @@ export const getItemClickHandler = ({ column, index, onActiveItemChange, activeI
5
6
  }
6
7
  onActiveItemChange(id === activeItemId ? undefined : `${column}-${index}`);
7
8
  };
9
+ const isButtonItem = (item) => item.type === NavigationItemType.Button;
10
+ const isDropdownItem = (item) => item.type === NavigationItemType.Dropdown;
11
+ const iconSizeKey = 'iconSize';
12
+ export function getNavigationItemWithIconSize(iconSize = 20) {
13
+ const getItem = (item) => {
14
+ const newItem = Object.assign({}, item);
15
+ if ('items' in newItem && isDropdownItem(newItem)) {
16
+ newItem.items = newItem.items.map(getItem);
17
+ }
18
+ if (!(iconSizeKey in newItem) && !isButtonItem(newItem)) {
19
+ newItem.iconSize = iconSize;
20
+ }
21
+ return newItem;
22
+ };
23
+ return getItem;
24
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/page-constructor",
3
- "version": "3.11.0",
3
+ "version": "3.12.1",
4
4
  "description": "Gravity UI Page Constructor",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -65,8 +65,8 @@
65
65
  "lint": "run-p lint:js lint:styles lint:prettier typecheck",
66
66
  "typecheck": "tsc --noEmit",
67
67
  "dev": "npm run storybook:start",
68
- "storybook:start": "TS_NODE_PROJECT=.storybook/tsconfig.json start-storybook -p 7009",
69
- "storybook:build": "TS_NODE_PROJECT=.storybook/tsconfig.json build-storybook -c .storybook -o storybook-static",
68
+ "storybook:start": "sb dev -p 7009",
69
+ "storybook:build": "sb build -c .storybook -o storybook-static",
70
70
  "start": "node dist",
71
71
  "clean": "gulp clean",
72
72
  "build:client": "gulp",
@@ -82,13 +82,14 @@
82
82
  "dependencies": {
83
83
  "@gravity-ui/dynamic-forms": "^1.9.2",
84
84
  "@gravity-ui/i18n": "^1.0.0",
85
+ "ajv": "^8.12.0",
85
86
  "bem-cn-lite": "^4.0.0",
86
87
  "final-form": "^4.20.9",
87
88
  "github-buttons": "2.23.0",
88
89
  "lodash": "^4.17.21",
89
90
  "react-final-form": "^6.5.9",
90
91
  "react-player": "^2.9.0",
91
- "react-slick": "^0.28.1",
92
+ "react-slick": "^0.29.0",
92
93
  "react-spring": "^9.3.0",
93
94
  "react-transition-group": "^4.4.2",
94
95
  "react-waypoint": "^10.1.0",
@@ -104,22 +105,25 @@
104
105
  },
105
106
  "devDependencies": {
106
107
  "@babel/core": "^7.22.8",
108
+ "@babel/preset-env": "^7.22.9",
109
+ "@babel/preset-react": "^7.22.5",
110
+ "@babel/preset-typescript": "^7.22.5",
107
111
  "@commitlint/cli": "^17.1.2",
108
112
  "@commitlint/config-conventional": "^17.1.0",
109
113
  "@doc-tools/transform": "2.12.0",
110
- "@gravity-ui/babel-preset": "^1.0.1",
111
114
  "@gravity-ui/eslint-config": "^2.0.0",
112
115
  "@gravity-ui/icons": "^2.1.0",
113
116
  "@gravity-ui/prettier-config": "^1.0.1",
114
117
  "@gravity-ui/stylelint-config": "^1.0.0",
115
118
  "@gravity-ui/tsconfig": "^1.0.0",
116
119
  "@gravity-ui/uikit": "^4.1.0",
117
- "@storybook/addon-actions": "^6.3.12",
118
- "@storybook/addon-essentials": "^6.5.10",
119
- "@storybook/addon-knobs": "^6.3.1",
120
- "@storybook/addon-viewport": "^6.3.12",
120
+ "@storybook/addon-actions": "^7.1.0",
121
+ "@storybook/addon-essentials": "^7.1.0",
122
+ "@storybook/addon-knobs": "^7.0.2",
123
+ "@storybook/addon-viewport": "^7.1.0",
121
124
  "@storybook/preset-scss": "^1.0.3",
122
- "@storybook/react": "^6.5.16",
125
+ "@storybook/react": "^7.1.0",
126
+ "@storybook/react-webpack5": "^7.1.0",
123
127
  "@testing-library/jest-dom": "^5.16.5",
124
128
  "@testing-library/react": "^13.4.0",
125
129
  "@testing-library/user-event": "^14.4.3",
@@ -132,6 +136,7 @@
132
136
  "@types/react-transition-group": "^4.4.4",
133
137
  "@types/sanitize-html": "2.6.1",
134
138
  "@types/uuid": "^9.0.0",
139
+ "@types/webpack-env": "^1.18.1",
135
140
  "autoprefixer": "^10.4.14",
136
141
  "babel-loader": "^8.3.0",
137
142
  "css-loader": "^5.2.7",
@@ -168,15 +173,17 @@
168
173
  "rimraf": "^3.0.2",
169
174
  "sass": "^1.63.6",
170
175
  "sass-loader": "^10.4.1",
176
+ "storybook": "^7.1.0",
171
177
  "style-loader": "^2.0.0",
172
178
  "stylelint": "^14.11.0",
173
179
  "svg-sprite-loader": "^6.0.11",
180
+ "terser-webpack-plugin": "^5.3.9",
174
181
  "ts-jest": "^29.0.3",
175
182
  "tslib": "^2.4.0",
176
183
  "typescript": "^4.9.4",
177
- "webpack": "^4.46.0",
178
- "webpack-cli": "^4.10.0",
179
- "webpack-shell-plugin": "^0.4.10"
184
+ "webpack": "^5.88.2",
185
+ "webpack-cli": "^5.1.4",
186
+ "webpack-shell-plugin-next": "^2.3.1"
180
187
  },
181
188
  "lint-staged": {
182
189
  "*.{css,scss}": [