@gravity-ui/page-constructor 1.25.1 → 1.26.0-alpha.0

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 (35) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/build/cjs/blocks/ExtendedFeatures/ExtendedFeatures.css +4 -4
  3. package/build/cjs/blocks/ExtendedFeatures/ExtendedFeatures.js +1 -1
  4. package/build/cjs/blocks/Icons/Icons.js +2 -1
  5. package/build/cjs/blocks/Share/Share.js +2 -1
  6. package/build/cjs/components/BackLink/BackLink.js +2 -1
  7. package/build/cjs/components/Button/Button.js +2 -1
  8. package/build/cjs/components/FileLink/FileLink.js +2 -1
  9. package/build/cjs/components/HeaderBreadcrumbs/HeaderBreadcrumbs.js +2 -1
  10. package/build/cjs/components/Link/Link.js +2 -1
  11. package/build/cjs/components/LinkBase/LinkBase.d.ts +2 -0
  12. package/build/cjs/components/LinkBase/LinkBase.js +19 -0
  13. package/build/cjs/components/Title/Title.js +2 -1
  14. package/build/cjs/models/constructor-items/common.d.ts +2 -0
  15. package/build/cjs/navigation/components/NavigationItem/components/GithubButton/GithubButton.js +2 -1
  16. package/build/cjs/navigation/components/SocialIcon/SocialIcon.js +2 -1
  17. package/build/cjs/sub-blocks/Quote/Quote.js +1 -1
  18. package/build/esm/blocks/ExtendedFeatures/ExtendedFeatures.css +4 -4
  19. package/build/esm/blocks/ExtendedFeatures/ExtendedFeatures.js +1 -1
  20. package/build/esm/blocks/Icons/Icons.js +2 -1
  21. package/build/esm/blocks/Share/Share.js +2 -1
  22. package/build/esm/components/BackLink/BackLink.js +2 -1
  23. package/build/esm/components/Button/Button.js +2 -1
  24. package/build/esm/components/FileLink/FileLink.js +2 -1
  25. package/build/esm/components/HeaderBreadcrumbs/HeaderBreadcrumbs.js +2 -1
  26. package/build/esm/components/Link/Link.js +2 -1
  27. package/build/esm/components/LinkBase/LinkBase.d.ts +2 -0
  28. package/build/esm/components/LinkBase/LinkBase.js +15 -0
  29. package/build/esm/components/Title/Title.js +2 -1
  30. package/build/esm/models/constructor-items/common.d.ts +2 -0
  31. package/build/esm/navigation/components/NavigationItem/components/GithubButton/GithubButton.js +2 -1
  32. package/build/esm/navigation/components/SocialIcon/SocialIcon.js +2 -1
  33. package/build/esm/sub-blocks/Quote/Quote.js +2 -2
  34. package/package.json +1 -1
  35. package/server/models/constructor-items/common.d.ts +2 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.25.2](https://github.com/gravity-ui/page-constructor/compare/v1.25.1...v1.25.2) (2023-03-21)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **ExtendedFeatures:** label position fixed ([#175](https://github.com/gravity-ui/page-constructor/issues/175)) ([fb8d206](https://github.com/gravity-ui/page-constructor/commit/fb8d206ad2378564a1dc7a7295f02da13ae66df1))
9
+
3
10
  ## [1.25.1](https://github.com/gravity-ui/page-constructor/compare/v1.25.0...v1.25.1) (2023-03-20)
4
11
 
5
12
 
@@ -21,7 +21,7 @@ unpredictable css rules order in build */
21
21
  line-height: var(--yc-text-header-1-line-height);
22
22
  color: var(--pc-text-header-color);
23
23
  font-weight: var(--yc-text-accent-font-weight);
24
- display: flex;
24
+ display: block;
25
25
  position: relative;
26
26
  margin-bottom: 8px;
27
27
  }
@@ -42,13 +42,13 @@ unpredictable css rules order in build */
42
42
  font-size: var(--yc-text-caption-2-font-size);
43
43
  line-height: var(--yc-text-caption-2-line-height);
44
44
  position: relative;
45
- top: 5px;
45
+ top: -3px;
46
46
  height: 16px;
47
47
  margin-left: 8px;
48
- padding: 0 5px;
48
+ padding: 1.5px 5px 2px;
49
49
  color: var(--yc-color-base-background);
50
50
  background-color: var(--yc-my-color-brand-normal);
51
- border-radius: 3px;
51
+ border-radius: 4px;
52
52
  }
53
53
  .pc-ExtendedFeaturesBlock__item-text, .pc-ExtendedFeaturesBlock__item-link {
54
54
  font-size: var(--yc-text-body-2-font-size);
@@ -33,7 +33,7 @@ const ExtendedFeaturesBlock = ({ title, description, items, colSizes = DEFAULT_S
33
33
  react_1.default.createElement("div", { className: b('container') },
34
34
  itemTitle && (react_1.default.createElement("h5", { className: b('item-title') },
35
35
  react_1.default.createElement(components_1.HTML, null, itemTitle),
36
- label && (react_1.default.createElement("div", { className: b('item-label') }, label)))),
36
+ label && (react_1.default.createElement("span", { className: b('item-label') }, label)))),
37
37
  react_1.default.createElement(sub_blocks_1.Content, { text: text, links: itemLinks, size: "s", colSizes: { all: 12, md: 12 }, buttons: buttons, additionalInfo: additionalInfo }))));
38
38
  })))));
39
39
  };
@@ -5,12 +5,13 @@ const react_1 = tslib_1.__importStar(require("react"));
5
5
  const utils_1 = require("../../utils");
6
6
  const components_1 = require("../../components");
7
7
  const locationContext_1 = require("../../context/locationContext");
8
+ const LinkBase_1 = require("src/components/LinkBase/LinkBase");
8
9
  const b = (0, utils_1.block)('icons-block');
9
10
  const Icons = ({ title, size = 's', items }) => {
10
11
  const { hostname } = (0, react_1.useContext)(locationContext_1.LocationContext);
11
12
  return (react_1.default.createElement("div", { className: b({ size }) },
12
13
  title && react_1.default.createElement(components_1.BlockHeader, { className: b('header'), title: title, colSizes: { all: 12 } }),
13
- items.map((item) => (react_1.default.createElement("a", Object.assign({ className: b('item'), key: item.url, href: item.url }, (0, utils_1.getLinkProps)(item.url, hostname)),
14
+ items.map((item) => (react_1.default.createElement(LinkBase_1.LinkBase, Object.assign({ className: b('item'), key: item.url, href: item.url }, (0, utils_1.getLinkProps)(item.url, hostname)),
14
15
  react_1.default.createElement(components_1.Image, { className: b('image'), src: item.src }),
15
16
  react_1.default.createElement("p", { className: b('text') }, item.text))))));
16
17
  };
@@ -13,6 +13,7 @@ const Twitter_1 = require("../../icons/Twitter");
13
13
  const Linkedin_1 = require("../../icons/Linkedin");
14
14
  const Vk_1 = require("../../icons/Vk");
15
15
  const Telegram_1 = require("../../icons/Telegram");
16
+ const components_1 = require("../../components");
16
17
  const icons = {
17
18
  facebook: Facebook_1.Facebook,
18
19
  twitter: Twitter_1.Twitter,
@@ -31,7 +32,7 @@ const Share = ({ items, title }) => {
31
32
  const url = (0, utils_1.getAbsolutePath)(hostname, pathname);
32
33
  const socialUrl = (0, utils_1.getShareLink)(url, type);
33
34
  const icon = icons[type];
34
- return (react_1.default.createElement(uikit_1.Button, { key: type, view: "flat", size: "l", target: "_blank", href: socialUrl, className: b('item', { type: type.toLowerCase() }), onClick: handleButtonClick }, icon && react_1.default.createElement(uikit_1.Icon, { data: icon, size: 24, className: b('icon', { type }) })));
35
+ return (react_1.default.createElement(uikit_1.Button, { key: type, view: "flat", size: "l", target: "_blank", href: socialUrl, component: components_1.RouterLink, className: b('item', { type: type.toLowerCase() }), onClick: handleButtonClick }, icon && react_1.default.createElement(uikit_1.Icon, { data: icon, size: 24, className: b('icon', { type }) })));
35
36
  }))));
36
37
  };
37
38
  exports.default = Share;
@@ -7,6 +7,7 @@ const icons_1 = require("../../icons");
7
7
  const locationContext_1 = require("../../context/locationContext");
8
8
  const hooks_1 = require("../../hooks");
9
9
  const models_1 = require("../../models");
10
+ const RouterLink_1 = tslib_1.__importDefault(require("../RouterLink/RouterLink"));
10
11
  function BackLink(props) {
11
12
  const { history } = (0, react_1.useContext)(locationContext_1.LocationContext);
12
13
  const { url, title, theme = 'default', size = 'l', className, shouldHandleBackAction = false, onClick, } = props;
@@ -26,7 +27,7 @@ function BackLink(props) {
26
27
  history.push({ pathname: url });
27
28
  }
28
29
  }, [handleAnalytics, history, onClick, url]);
29
- return (react_1.default.createElement(uikit_1.Button, { className: className, view: theme === 'special' ? 'flat-contrast' : 'flat-secondary', size: size, href: shouldHandleBackAction ? undefined : url, onClick: shouldHandleBackAction ? backActionHandler : undefined },
30
+ return (react_1.default.createElement(uikit_1.Button, { component: RouterLink_1.default, className: className, view: theme === 'special' ? 'flat-contrast' : 'flat-secondary', size: size, href: shouldHandleBackAction ? undefined : url, onClick: shouldHandleBackAction ? backActionHandler : undefined },
30
31
  react_1.default.createElement(uikit_1.Icon, { data: icons_1.ArrowSidebar, size: 24 }),
31
32
  react_1.default.createElement("span", null, title)));
32
33
  }
@@ -10,6 +10,7 @@ const localeContext_1 = require("../../context/localeContext/localeContext");
10
10
  const useMetrika_1 = require("../../hooks/useMetrika");
11
11
  const hooks_1 = require("../../hooks");
12
12
  const icons_1 = require("../../icons");
13
+ const RouterLink_1 = tslib_1.__importDefault(require("../RouterLink/RouterLink"));
13
14
  const b = (0, utils_1.block)('button-block');
14
15
  const Button = (props) => {
15
16
  const handleMetrika = (0, useMetrika_1.useMetrika)();
@@ -42,7 +43,7 @@ const Button = (props) => {
42
43
  image = undefined;
43
44
  }
44
45
  const buttonTheme = theme === 'scale' ? 'accent' : theme;
45
- return (react_1.default.createElement(uikit_1.Button, Object.assign({ className: buttonClass, view: (0, utils_2.toCommonView)(buttonTheme), size: (0, utils_2.toCommonSize)(size), href: url ? (0, utils_1.setUrlTld)(url, tld) : undefined }, buttonProps),
46
+ return (react_1.default.createElement(uikit_1.Button, Object.assign({ className: buttonClass, view: (0, utils_2.toCommonView)(buttonTheme), size: (0, utils_2.toCommonSize)(size), href: url ? (0, utils_1.setUrlTld)(url, tld) : undefined, component: RouterLink_1.default }, buttonProps),
46
47
  icon && buttonImg.position === 'left' ? icon : null,
47
48
  react_1.default.createElement("span", { className: b('content') },
48
49
  image && buttonImg.position === 'left' ? image : null,
@@ -5,6 +5,7 @@ const tslib_1 = require("tslib");
5
5
  const utils_1 = require("../../utils");
6
6
  const react_1 = tslib_1.__importStar(require("react"));
7
7
  const locationContext_1 = require("../../context/locationContext");
8
+ const LinkBase_1 = require("../LinkBase/LinkBase");
8
9
  const b = (0, utils_1.block)('file-link');
9
10
  const FIGMA_URL = 'https://www.figma.com';
10
11
  var FileExtension;
@@ -31,6 +32,6 @@ const FileLink = (props) => {
31
32
  return (react_1.default.createElement("div", { className: b({ ext: fileExt, type, size: textSize, theme }, className) },
32
33
  Object.values(FileExtension).includes(fileExt) && (react_1.default.createElement("div", { className: b('file-label') }, fileExt)),
33
34
  react_1.default.createElement("div", { className: b('link') },
34
- react_1.default.createElement("a", Object.assign({ href: href }, (0, utils_1.getLinkProps)(href, hostname), { onClick: onClick }), text))));
35
+ react_1.default.createElement(LinkBase_1.LinkBase, Object.assign({ href: href }, (0, utils_1.getLinkProps)(href, hostname), { onClick: onClick }), text))));
35
36
  };
36
37
  exports.default = FileLink;
@@ -4,6 +4,7 @@ const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importDefault(require("react"));
5
5
  const utils_1 = require("../../utils");
6
6
  const useMetrika_1 = require("../../hooks/useMetrika");
7
+ const LinkBase_1 = require("../LinkBase/LinkBase");
7
8
  const b = (0, utils_1.block)('header-breadcrumbs');
8
9
  function HeaderBreadcrumbs(props) {
9
10
  const { items, metrikaGoals, pixelEvents, theme = 'light', className } = props;
@@ -12,6 +13,6 @@ function HeaderBreadcrumbs(props) {
12
13
  handleMetrika({ metrikaGoals, pixelEvents });
13
14
  };
14
15
  return (react_1.default.createElement("div", { className: b({ theme }, className) }, items.map((item) => (react_1.default.createElement("div", { className: b('item'), key: item.url },
15
- react_1.default.createElement("a", { href: item.url, className: b('text'), onClick: onClick }, item.text))))));
16
+ react_1.default.createElement(LinkBase_1.LinkBase, { href: item.url, className: b('text'), onClick: onClick }, item.text))))));
16
17
  }
17
18
  exports.default = HeaderBreadcrumbs;
@@ -12,6 +12,7 @@ const localeContext_1 = require("../../context/localeContext/localeContext");
12
12
  const locationContext_1 = require("../../context/locationContext/locationContext");
13
13
  const useMetrika_1 = require("../../hooks/useMetrika");
14
14
  const hooks_1 = require("../../hooks");
15
+ const LinkBase_1 = require("../LinkBase/LinkBase");
15
16
  const b = (0, utils_1.block)('link-block');
16
17
  const WORD_JOINER_SYM = '\u200b';
17
18
  function getArrowSize(size) {
@@ -48,7 +49,7 @@ const LinkBlock = (props) => {
48
49
  case 'normal': {
49
50
  const linkProps = (0, utils_1.getLinkProps)(url, hostname, target);
50
51
  const content = children || text;
51
- return (react_1.default.createElement("a", Object.assign({ className: b('link', { theme: colorTheme, 'has-arrow': arrow }), href: href, onClick: onClick }, linkProps), arrow ? (react_1.default.createElement(react_1.Fragment, null,
52
+ return (react_1.default.createElement(LinkBase_1.LinkBase, Object.assign({ className: b('link', { theme: colorTheme, 'has-arrow': arrow }), href: href, onClick: onClick }, linkProps), arrow ? (react_1.default.createElement(react_1.Fragment, null,
52
53
  react_1.default.createElement("span", { className: b('content') }, content),
53
54
  WORD_JOINER_SYM,
54
55
  react_1.default.createElement(uikit_1.Icon, { className: b('arrow'), data: icons_1.Chevron, size: getArrowSize(textSize) }))) : (content)));
@@ -0,0 +1,2 @@
1
+ import { LinkBaseProps, WithChildren } from '../../models';
2
+ export declare const LinkBase: (props: WithChildren<LinkBaseProps>) => JSX.Element;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LinkBase = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importStar(require("react"));
6
+ const lodash_1 = require("lodash");
7
+ const locationContext_1 = require("../../context/locationContext");
8
+ const RouterLink_1 = tslib_1.__importDefault(require("../RouterLink/RouterLink"));
9
+ const LinkBase = (props) => {
10
+ const { href, children } = props, linkProps = tslib_1.__rest(props, ["href", "children"]);
11
+ const { Link } = (0, react_1.useContext)(locationContext_1.LocationContext);
12
+ if (Link && href && !(linkProps === null || linkProps === void 0 ? void 0 : linkProps.target)) {
13
+ const extractedProps = (0, lodash_1.omit)(linkProps, ['rel', 'ref']);
14
+ return (react_1.default.createElement(RouterLink_1.default, { href: href },
15
+ react_1.default.createElement("a", Object.assign({}, extractedProps), children)));
16
+ }
17
+ return (react_1.default.createElement("a", Object.assign({ href: href }, linkProps), children));
18
+ };
19
+ exports.LinkBase = LinkBase;
@@ -8,6 +8,7 @@ const Anchor_1 = tslib_1.__importDefault(require("../Anchor/Anchor"));
8
8
  const __1 = require("../");
9
9
  const locationContext_1 = require("../../context/locationContext");
10
10
  const mobileContext_1 = require("../../context/mobileContext");
11
+ const LinkBase_1 = require("../LinkBase/LinkBase");
11
12
  const b = (0, utils_1.block)('title-block');
12
13
  function getArrowSize(size, isMobile) {
13
14
  switch (size) {
@@ -40,7 +41,7 @@ const Title = (props) => {
40
41
  content = textMarkup;
41
42
  }
42
43
  else if (url) {
43
- content = (react_1.default.createElement("a", Object.assign({ className: b('link'), href: url }, (0, utils_1.getLinkProps)(url, hostname), { onClick: onClick }), insideClickableContent));
44
+ content = (react_1.default.createElement(LinkBase_1.LinkBase, Object.assign({ className: b('link'), href: url }, (0, utils_1.getLinkProps)(url, hostname), { onClick: onClick }), insideClickableContent));
44
45
  }
45
46
  else if (onClick) {
46
47
  content = (react_1.default.createElement("span", { className: b('link'), onClick: onClick }, insideClickableContent));
@@ -111,6 +111,8 @@ export interface MediaVideoProps extends AnalyticsEventsBase {
111
111
  controls?: MediaVideoControlsType;
112
112
  metrika?: MetrikaVideo;
113
113
  }
114
+ export interface LinkBaseProps extends React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement> {
115
+ }
114
116
  export interface LinkProps extends AnalyticsEventsBase, Stylable {
115
117
  url: string;
116
118
  text?: string;
@@ -5,6 +5,7 @@ const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importStar(require("react"));
6
6
  const utils_1 = require("../../../../../utils");
7
7
  const models_1 = require("../../../../../models");
8
+ const LinkBase_1 = require("../../../../../components/LinkBase/LinkBase");
8
9
  const b = (0, utils_1.block)('github-button');
9
10
  const DEFAULT_LABEL = 'Stars on GitHub';
10
11
  /* More information about github-buttons in https://buttons.github.io/ */
@@ -42,6 +43,6 @@ const GithubButton = ({ text, url, className, label, size, icon, }) => {
42
43
  }, []);
43
44
  return (react_1.default.createElement("div", { className: b(null, className) },
44
45
  react_1.default.createElement("span", { ref: containerRef },
45
- react_1.default.createElement("a", Object.assign({ href: url, ref: linkRef, "data-show-count": "true", "aria-label": label || DEFAULT_LABEL }, (icon && { 'data-icon': models_1.NavigationGithubButtonIcon[icon] }), (size && { 'data-size': size })), text))));
46
+ react_1.default.createElement(LinkBase_1.LinkBase, Object.assign({ href: url, ref: linkRef, "data-show-count": "true", "aria-label": label || DEFAULT_LABEL }, (icon && { 'data-icon': models_1.NavigationGithubButtonIcon[icon] }), (size && { 'data-size': size })), text))));
46
47
  };
47
48
  exports.GithubButton = GithubButton;
@@ -5,10 +5,11 @@ const react_1 = tslib_1.__importDefault(require("react"));
5
5
  const utils_1 = require("../../../utils");
6
6
  const components_1 = require("../../../components");
7
7
  const utils_2 = require("../../../components/Media/Image/utils");
8
+ const LinkBase_1 = require("../../../components/LinkBase/LinkBase");
8
9
  const b = (0, utils_1.block)('social-icon');
9
10
  const SocialIcon = ({ icon, url, className }) => {
10
11
  const iconData = (0, utils_2.getMediaImage)(icon);
11
- return (react_1.default.createElement("a", { href: url, target: "_blank", rel: "noopener noreferrer", className: b(null, className) },
12
+ return (react_1.default.createElement(LinkBase_1.LinkBase, { href: url, target: "_blank", rel: "noopener noreferrer", className: b(null, className) },
12
13
  react_1.default.createElement(components_1.Image, Object.assign({ className: b('icon') }, iconData))));
13
14
  };
14
15
  exports.default = SocialIcon;
@@ -19,7 +19,7 @@ const Quote = (props) => {
19
19
  const handleButtonClick = (0, react_1.useCallback)(() => handleAnalytics(), [handleAnalytics]);
20
20
  const renderFooter = Boolean(author || url) && (react_1.default.createElement("div", { className: b('author-wrapper') },
21
21
  author && (react_1.default.createElement(components_1.Author, { className: b('author', { theme: textTheme }), author: author, type: models_1.AuthorType.Line })),
22
- url && buttonText && (react_1.default.createElement(uikit_1.Button, { view: "outlined", size: "xl", href: url, className: b('link-button', { theme: textTheme }), onClick: handleButtonClick }, buttonText))));
22
+ url && buttonText && (react_1.default.createElement(uikit_1.Button, { view: "outlined", size: "xl", href: url, component: components_1.RouterLink, className: b('link-button', { theme: textTheme }), onClick: handleButtonClick }, buttonText))));
23
23
  return (react_1.default.createElement("div", { className: b({ theme: textTheme, border }), style: color ? { backgroundColor: color } : {} },
24
24
  react_1.default.createElement("div", { key: text, className: b('content-wrapper') },
25
25
  react_1.default.createElement("div", null,
@@ -21,7 +21,7 @@ unpredictable css rules order in build */
21
21
  line-height: var(--yc-text-header-1-line-height);
22
22
  color: var(--pc-text-header-color);
23
23
  font-weight: var(--yc-text-accent-font-weight);
24
- display: flex;
24
+ display: block;
25
25
  position: relative;
26
26
  margin-bottom: 8px;
27
27
  }
@@ -42,13 +42,13 @@ unpredictable css rules order in build */
42
42
  font-size: var(--yc-text-caption-2-font-size);
43
43
  line-height: var(--yc-text-caption-2-line-height);
44
44
  position: relative;
45
- top: 5px;
45
+ top: -3px;
46
46
  height: 16px;
47
47
  margin-left: 8px;
48
- padding: 0 5px;
48
+ padding: 1.5px 5px 2px;
49
49
  color: var(--yc-color-base-background);
50
50
  background-color: var(--yc-my-color-brand-normal);
51
- border-radius: 3px;
51
+ border-radius: 4px;
52
52
  }
53
53
  .pc-ExtendedFeaturesBlock__item-text, .pc-ExtendedFeaturesBlock__item-link {
54
54
  font-size: var(--yc-text-body-2-font-size);
@@ -30,7 +30,7 @@ export const ExtendedFeaturesBlock = ({ title, description, items, colSizes = DE
30
30
  React.createElement("div", { className: b('container') },
31
31
  itemTitle && (React.createElement("h5", { className: b('item-title') },
32
32
  React.createElement(HTML, null, itemTitle),
33
- label && (React.createElement("div", { className: b('item-label') }, label)))),
33
+ label && (React.createElement("span", { className: b('item-label') }, label)))),
34
34
  React.createElement(Content, { text: text, links: itemLinks, size: "s", colSizes: { all: 12, md: 12 }, buttons: buttons, additionalInfo: additionalInfo }))));
35
35
  })))));
36
36
  };
@@ -2,13 +2,14 @@ import React, { useContext } from 'react';
2
2
  import { block, getLinkProps } from '../../utils';
3
3
  import { BlockHeader, Image } from '../../components';
4
4
  import { LocationContext } from '../../context/locationContext';
5
+ import { LinkBase } from 'src/components/LinkBase/LinkBase';
5
6
  import './Icons.css';
6
7
  const b = block('icons-block');
7
8
  const Icons = ({ title, size = 's', items }) => {
8
9
  const { hostname } = useContext(LocationContext);
9
10
  return (React.createElement("div", { className: b({ size }) },
10
11
  title && React.createElement(BlockHeader, { className: b('header'), title: title, colSizes: { all: 12 } }),
11
- items.map((item) => (React.createElement("a", Object.assign({ className: b('item'), key: item.url, href: item.url }, getLinkProps(item.url, hostname)),
12
+ items.map((item) => (React.createElement(LinkBase, Object.assign({ className: b('item'), key: item.url, href: item.url }, getLinkProps(item.url, hostname)),
12
13
  React.createElement(Image, { className: b('image'), src: item.src }),
13
14
  React.createElement("p", { className: b('text') }, item.text))))));
14
15
  };
@@ -10,6 +10,7 @@ import { Twitter } from '../../icons/Twitter';
10
10
  import { Linkedin } from '../../icons/Linkedin';
11
11
  import { Vk } from '../../icons/Vk';
12
12
  import { Telegram } from '../../icons/Telegram';
13
+ import { RouterLink } from '../../components';
13
14
  import './Share.css';
14
15
  const icons = {
15
16
  facebook: Facebook,
@@ -29,7 +30,7 @@ const Share = ({ items, title }) => {
29
30
  const url = getAbsolutePath(hostname, pathname);
30
31
  const socialUrl = getShareLink(url, type);
31
32
  const icon = icons[type];
32
- return (React.createElement(Button, { key: type, view: "flat", size: "l", target: "_blank", href: socialUrl, className: b('item', { type: type.toLowerCase() }), onClick: handleButtonClick }, icon && React.createElement(Icon, { data: icon, size: 24, className: b('icon', { type }) })));
33
+ return (React.createElement(Button, { key: type, view: "flat", size: "l", target: "_blank", href: socialUrl, component: RouterLink, className: b('item', { type: type.toLowerCase() }), onClick: handleButtonClick }, icon && React.createElement(Icon, { data: icon, size: 24, className: b('icon', { type }) })));
33
34
  }))));
34
35
  };
35
36
  export default Share;
@@ -4,6 +4,7 @@ import { ArrowSidebar } from '../../icons';
4
4
  import { LocationContext } from '../../context/locationContext';
5
5
  import { useAnalytics } from '../../hooks';
6
6
  import { DefaultEventNames } from '../../models';
7
+ import RouterLink from '../RouterLink/RouterLink';
7
8
  export default function BackLink(props) {
8
9
  const { history } = useContext(LocationContext);
9
10
  const { url, title, theme = 'default', size = 'l', className, shouldHandleBackAction = false, onClick, } = props;
@@ -23,7 +24,7 @@ export default function BackLink(props) {
23
24
  history.push({ pathname: url });
24
25
  }
25
26
  }, [handleAnalytics, history, onClick, url]);
26
- return (React.createElement(Button, { className: className, view: theme === 'special' ? 'flat-contrast' : 'flat-secondary', size: size, href: shouldHandleBackAction ? undefined : url, onClick: shouldHandleBackAction ? backActionHandler : undefined },
27
+ return (React.createElement(Button, { component: RouterLink, className: className, view: theme === 'special' ? 'flat-contrast' : 'flat-secondary', size: size, href: shouldHandleBackAction ? undefined : url, onClick: shouldHandleBackAction ? backActionHandler : undefined },
27
28
  React.createElement(Icon, { data: ArrowSidebar, size: 24 }),
28
29
  React.createElement("span", null, title)));
29
30
  }
@@ -8,6 +8,7 @@ import { LocaleContext } from '../../context/localeContext/localeContext';
8
8
  import { useMetrika } from '../../hooks/useMetrika';
9
9
  import { useAnalytics } from '../../hooks';
10
10
  import { Github } from '../../icons';
11
+ import RouterLink from '../RouterLink/RouterLink';
11
12
  import './Button.css';
12
13
  const b = block('button-block');
13
14
  const Button = (props) => {
@@ -41,7 +42,7 @@ const Button = (props) => {
41
42
  image = undefined;
42
43
  }
43
44
  const buttonTheme = theme === 'scale' ? 'accent' : theme;
44
- return (React.createElement(CommonButton, Object.assign({ className: buttonClass, view: toCommonView(buttonTheme), size: toCommonSize(size), href: url ? setUrlTld(url, tld) : undefined }, buttonProps),
45
+ return (React.createElement(CommonButton, Object.assign({ className: buttonClass, view: toCommonView(buttonTheme), size: toCommonSize(size), href: url ? setUrlTld(url, tld) : undefined, component: RouterLink }, buttonProps),
45
46
  icon && buttonImg.position === 'left' ? icon : null,
46
47
  React.createElement("span", { className: b('content') },
47
48
  image && buttonImg.position === 'left' ? image : null,
@@ -1,6 +1,7 @@
1
1
  import { block, getLinkProps } from '../../utils';
2
2
  import React, { useContext } from 'react';
3
3
  import { LocationContext } from '../../context/locationContext';
4
+ import { LinkBase } from '../LinkBase/LinkBase';
4
5
  import './FileLink.css';
5
6
  const b = block('file-link');
6
7
  const FIGMA_URL = 'https://www.figma.com';
@@ -27,6 +28,6 @@ const FileLink = (props) => {
27
28
  return (React.createElement("div", { className: b({ ext: fileExt, type, size: textSize, theme }, className) },
28
29
  Object.values(FileExtension).includes(fileExt) && (React.createElement("div", { className: b('file-label') }, fileExt)),
29
30
  React.createElement("div", { className: b('link') },
30
- React.createElement("a", Object.assign({ href: href }, getLinkProps(href, hostname), { onClick: onClick }), text))));
31
+ React.createElement(LinkBase, Object.assign({ href: href }, getLinkProps(href, hostname), { onClick: onClick }), text))));
31
32
  };
32
33
  export default FileLink;
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import { block } from '../../utils';
3
3
  import { useMetrika } from '../../hooks/useMetrika';
4
+ import { LinkBase } from '../LinkBase/LinkBase';
4
5
  import './HeaderBreadcrumbs.css';
5
6
  const b = block('header-breadcrumbs');
6
7
  export default function HeaderBreadcrumbs(props) {
@@ -10,5 +11,5 @@ export default function HeaderBreadcrumbs(props) {
10
11
  handleMetrika({ metrikaGoals, pixelEvents });
11
12
  };
12
13
  return (React.createElement("div", { className: b({ theme }, className) }, items.map((item) => (React.createElement("div", { className: b('item'), key: item.url },
13
- React.createElement("a", { href: item.url, className: b('text'), onClick: onClick }, item.text))))));
14
+ React.createElement(LinkBase, { href: item.url, className: b('text'), onClick: onClick }, item.text))))));
14
15
  }
@@ -9,6 +9,7 @@ import { LocaleContext } from '../../context/localeContext/localeContext';
9
9
  import { LocationContext } from '../../context/locationContext/locationContext';
10
10
  import { useMetrika } from '../../hooks/useMetrika';
11
11
  import { useAnalytics } from '../../hooks';
12
+ import { LinkBase } from '../LinkBase/LinkBase';
12
13
  import './Link.css';
13
14
  const b = block('link-block');
14
15
  const WORD_JOINER_SYM = '\u200b';
@@ -46,7 +47,7 @@ const LinkBlock = (props) => {
46
47
  case 'normal': {
47
48
  const linkProps = getLinkProps(url, hostname, target);
48
49
  const content = children || text;
49
- return (React.createElement("a", Object.assign({ className: b('link', { theme: colorTheme, 'has-arrow': arrow }), href: href, onClick: onClick }, linkProps), arrow ? (React.createElement(Fragment, null,
50
+ return (React.createElement(LinkBase, Object.assign({ className: b('link', { theme: colorTheme, 'has-arrow': arrow }), href: href, onClick: onClick }, linkProps), arrow ? (React.createElement(Fragment, null,
50
51
  React.createElement("span", { className: b('content') }, content),
51
52
  WORD_JOINER_SYM,
52
53
  React.createElement(Icon, { className: b('arrow'), data: Chevron, size: getArrowSize(textSize) }))) : (content)));
@@ -0,0 +1,2 @@
1
+ import { LinkBaseProps, WithChildren } from '../../models';
2
+ export declare const LinkBase: (props: WithChildren<LinkBaseProps>) => JSX.Element;
@@ -0,0 +1,15 @@
1
+ import { __rest } from "tslib";
2
+ import React, { useContext } from 'react';
3
+ import { omit } from 'lodash';
4
+ import { LocationContext } from '../../context/locationContext';
5
+ import RouterLink from '../RouterLink/RouterLink';
6
+ export const LinkBase = (props) => {
7
+ const { href, children } = props, linkProps = __rest(props, ["href", "children"]);
8
+ const { Link } = useContext(LocationContext);
9
+ if (Link && href && !(linkProps === null || linkProps === void 0 ? void 0 : linkProps.target)) {
10
+ const extractedProps = omit(linkProps, ['rel', 'ref']);
11
+ return (React.createElement(RouterLink, { href: href },
12
+ React.createElement("a", Object.assign({}, extractedProps), children)));
13
+ }
14
+ return (React.createElement("a", Object.assign({ href: href }, linkProps), children));
15
+ };
@@ -4,6 +4,7 @@ import Anchor from '../Anchor/Anchor';
4
4
  import { ToggleArrow, HTML } from '../';
5
5
  import { LocationContext } from '../../context/locationContext';
6
6
  import { MobileContext } from '../../context/mobileContext';
7
+ import { LinkBase } from '../LinkBase/LinkBase';
7
8
  import './Title.css';
8
9
  const b = block('title-block');
9
10
  export function getArrowSize(size, isMobile) {
@@ -36,7 +37,7 @@ const Title = (props) => {
36
37
  content = textMarkup;
37
38
  }
38
39
  else if (url) {
39
- content = (React.createElement("a", Object.assign({ className: b('link'), href: url }, getLinkProps(url, hostname), { onClick: onClick }), insideClickableContent));
40
+ content = (React.createElement(LinkBase, Object.assign({ className: b('link'), href: url }, getLinkProps(url, hostname), { onClick: onClick }), insideClickableContent));
40
41
  }
41
42
  else if (onClick) {
42
43
  content = (React.createElement("span", { className: b('link'), onClick: onClick }, insideClickableContent));
@@ -111,6 +111,8 @@ export interface MediaVideoProps extends AnalyticsEventsBase {
111
111
  controls?: MediaVideoControlsType;
112
112
  metrika?: MetrikaVideo;
113
113
  }
114
+ export interface LinkBaseProps extends React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement> {
115
+ }
114
116
  export interface LinkProps extends AnalyticsEventsBase, Stylable {
115
117
  url: string;
116
118
  text?: string;
@@ -1,6 +1,7 @@
1
1
  import React, { useRef, useEffect } from 'react';
2
2
  import { block } from '../../../../../utils';
3
3
  import { NavigationGithubButtonIcon } from '../../../../../models';
4
+ import { LinkBase } from '../../../../../components/LinkBase/LinkBase';
4
5
  import './GithubButton.css';
5
6
  const b = block('github-button');
6
7
  const DEFAULT_LABEL = 'Stars on GitHub';
@@ -39,5 +40,5 @@ export const GithubButton = ({ text, url, className, label, size, icon, }) => {
39
40
  }, []);
40
41
  return (React.createElement("div", { className: b(null, className) },
41
42
  React.createElement("span", { ref: containerRef },
42
- React.createElement("a", Object.assign({ href: url, ref: linkRef, "data-show-count": "true", "aria-label": label || DEFAULT_LABEL }, (icon && { 'data-icon': NavigationGithubButtonIcon[icon] }), (size && { 'data-size': size })), text))));
43
+ React.createElement(LinkBase, Object.assign({ href: url, ref: linkRef, "data-show-count": "true", "aria-label": label || DEFAULT_LABEL }, (icon && { 'data-icon': NavigationGithubButtonIcon[icon] }), (size && { 'data-size': size })), text))));
43
44
  };
@@ -2,11 +2,12 @@ import React from 'react';
2
2
  import { block } from '../../../utils';
3
3
  import { Image } from '../../../components';
4
4
  import { getMediaImage } from '../../../components/Media/Image/utils';
5
+ import { LinkBase } from '../../../components/LinkBase/LinkBase';
5
6
  import './SocialIcon.css';
6
7
  const b = block('social-icon');
7
8
  const SocialIcon = ({ icon, url, className }) => {
8
9
  const iconData = getMediaImage(icon);
9
- return (React.createElement("a", { href: url, target: "_blank", rel: "noopener noreferrer", className: b(null, className) },
10
+ return (React.createElement(LinkBase, { href: url, target: "_blank", rel: "noopener noreferrer", className: b(null, className) },
10
11
  React.createElement(Image, Object.assign({ className: b('icon') }, iconData))));
11
12
  };
12
13
  export default SocialIcon;
@@ -2,7 +2,7 @@ import React, { useCallback, useContext } from 'react';
2
2
  import { Button } from '@gravity-ui/uikit';
3
3
  import { block, getThemedValue } from '../../utils';
4
4
  import { AuthorType, DefaultEventNames } from '../../models';
5
- import { Author, Image, HTML } from '../../components';
5
+ import { Author, Image, HTML, RouterLink } from '../../components';
6
6
  import { ThemeValueContext } from '../../context/theme/ThemeValueContext';
7
7
  import { getMediaImage } from '../../components/Media/Image/utils';
8
8
  import { useAnalytics } from '../../hooks';
@@ -17,7 +17,7 @@ const Quote = (props) => {
17
17
  const handleButtonClick = useCallback(() => handleAnalytics(), [handleAnalytics]);
18
18
  const renderFooter = Boolean(author || url) && (React.createElement("div", { className: b('author-wrapper') },
19
19
  author && (React.createElement(Author, { className: b('author', { theme: textTheme }), author: author, type: AuthorType.Line })),
20
- url && buttonText && (React.createElement(Button, { view: "outlined", size: "xl", href: url, className: b('link-button', { theme: textTheme }), onClick: handleButtonClick }, buttonText))));
20
+ url && buttonText && (React.createElement(Button, { view: "outlined", size: "xl", href: url, component: RouterLink, className: b('link-button', { theme: textTheme }), onClick: handleButtonClick }, buttonText))));
21
21
  return (React.createElement("div", { className: b({ theme: textTheme, border }), style: color ? { backgroundColor: color } : {} },
22
22
  React.createElement("div", { key: text, className: b('content-wrapper') },
23
23
  React.createElement("div", null,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/page-constructor",
3
- "version": "1.25.1",
3
+ "version": "1.26.0-alpha.0",
4
4
  "description": "Gravity UI Page Constructor",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -111,6 +111,8 @@ export interface MediaVideoProps extends AnalyticsEventsBase {
111
111
  controls?: MediaVideoControlsType;
112
112
  metrika?: MetrikaVideo;
113
113
  }
114
+ export interface LinkBaseProps extends React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement> {
115
+ }
114
116
  export interface LinkProps extends AnalyticsEventsBase, Stylable {
115
117
  url: string;
116
118
  text?: string;