@gravity-ui/page-constructor 4.1.2 → 4.3.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 (80) hide show
  1. package/build/cjs/blocks/ExtendedFeatures/ExtendedFeatures.js +7 -3
  2. package/build/cjs/blocks/PromoFeaturesBlock/PromoFeaturesBlock.js +1 -1
  3. package/build/cjs/blocks/Questions/QuestionBlockItem/QuestionBlockItem.css +50 -0
  4. package/build/cjs/blocks/Questions/QuestionBlockItem/QuestionBlockItem.d.ts +2 -0
  5. package/build/cjs/blocks/Questions/QuestionBlockItem/QuestionBlockItem.js +27 -0
  6. package/build/cjs/blocks/Questions/Questions.css +0 -48
  7. package/build/cjs/blocks/Questions/Questions.js +7 -27
  8. package/build/cjs/blocks/Questions/models.d.ts +10 -0
  9. package/build/cjs/blocks/Questions/models.js +13 -0
  10. package/build/cjs/components/BackLink/BackLink.d.ts +2 -1
  11. package/build/cjs/components/BackLink/BackLink.js +2 -2
  12. package/build/cjs/components/FileLink/FileLink.js +2 -2
  13. package/build/cjs/components/FullscreenImage/FullscreenImage.js +1 -1
  14. package/build/cjs/components/FullscreenImage/i18n/en.json +2 -1
  15. package/build/cjs/components/FullscreenImage/i18n/ru.json +2 -1
  16. package/build/cjs/components/Image/i18n/en.json +1 -1
  17. package/build/cjs/components/Image/i18n/ru.json +1 -1
  18. package/build/cjs/components/Link/Link.d.ts +2 -2
  19. package/build/cjs/components/Link/Link.js +6 -6
  20. package/build/cjs/components/Media/Media.js +1 -2
  21. package/build/cjs/components/Media/Video/Video.js +3 -3
  22. package/build/cjs/components/ReactPlayer/ReactPlayer.js +4 -3
  23. package/build/cjs/components/ReactPlayer/i18n/en.json +3 -0
  24. package/build/cjs/components/ReactPlayer/i18n/index.d.ts +2 -0
  25. package/build/cjs/components/ReactPlayer/i18n/index.js +8 -0
  26. package/build/cjs/components/ReactPlayer/i18n/ru.json +3 -0
  27. package/build/cjs/components/constants.d.ts +0 -4
  28. package/build/cjs/components/constants.js +1 -5
  29. package/build/cjs/grid/Col/Col.d.ts +2 -1
  30. package/build/cjs/grid/Col/Col.js +2 -2
  31. package/build/cjs/models/constructor-items/blocks.d.ts +4 -0
  32. package/build/cjs/models/constructor-items/common.d.ts +7 -3
  33. package/build/cjs/sub-blocks/Content/ContentList/ContentList.js +11 -1
  34. package/build/cjs/sub-blocks/LayoutItem/utils.d.ts +1 -0
  35. package/build/cjs/utils/blocks.d.ts +1 -1
  36. package/build/cjs/utils/blocks.js +2 -2
  37. package/build/esm/blocks/ExtendedFeatures/ExtendedFeatures.js +7 -3
  38. package/build/esm/blocks/PromoFeaturesBlock/PromoFeaturesBlock.js +1 -1
  39. package/build/esm/blocks/Questions/QuestionBlockItem/QuestionBlockItem.css +50 -0
  40. package/build/esm/blocks/Questions/QuestionBlockItem/QuestionBlockItem.d.ts +3 -0
  41. package/build/esm/blocks/Questions/QuestionBlockItem/QuestionBlockItem.js +23 -0
  42. package/build/esm/blocks/Questions/Questions.css +0 -48
  43. package/build/esm/blocks/Questions/Questions.js +6 -26
  44. package/build/esm/blocks/Questions/models.d.ts +10 -0
  45. package/build/esm/blocks/Questions/models.js +10 -0
  46. package/build/esm/components/BackLink/BackLink.d.ts +2 -1
  47. package/build/esm/components/BackLink/BackLink.js +2 -2
  48. package/build/esm/components/FileLink/FileLink.js +2 -2
  49. package/build/esm/components/FullscreenImage/FullscreenImage.js +1 -1
  50. package/build/esm/components/FullscreenImage/i18n/en.json +2 -1
  51. package/build/esm/components/FullscreenImage/i18n/ru.json +2 -1
  52. package/build/esm/components/Image/i18n/en.json +1 -1
  53. package/build/esm/components/Image/i18n/ru.json +1 -1
  54. package/build/esm/components/Link/Link.d.ts +2 -2
  55. package/build/esm/components/Link/Link.js +7 -7
  56. package/build/esm/components/Media/Media.js +1 -2
  57. package/build/esm/components/Media/Video/Video.js +3 -3
  58. package/build/esm/components/ReactPlayer/ReactPlayer.js +4 -3
  59. package/build/esm/components/ReactPlayer/i18n/en.json +3 -0
  60. package/build/esm/components/ReactPlayer/i18n/index.d.ts +2 -0
  61. package/build/esm/components/ReactPlayer/i18n/index.js +5 -0
  62. package/build/esm/components/ReactPlayer/i18n/ru.json +3 -0
  63. package/build/esm/components/constants.d.ts +0 -4
  64. package/build/esm/components/constants.js +0 -4
  65. package/build/esm/grid/Col/Col.d.ts +2 -1
  66. package/build/esm/grid/Col/Col.js +2 -2
  67. package/build/esm/models/constructor-items/blocks.d.ts +4 -0
  68. package/build/esm/models/constructor-items/common.d.ts +7 -3
  69. package/build/esm/sub-blocks/Content/ContentList/ContentList.js +11 -1
  70. package/build/esm/sub-blocks/LayoutItem/utils.d.ts +1 -0
  71. package/build/esm/utils/blocks.d.ts +1 -1
  72. package/build/esm/utils/blocks.js +2 -2
  73. package/package.json +3 -3
  74. package/server/components/constants.d.ts +0 -4
  75. package/server/components/constants.js +1 -5
  76. package/server/models/constructor-items/blocks.d.ts +4 -0
  77. package/server/models/constructor-items/common.d.ts +7 -3
  78. package/server/utils/blocks.d.ts +1 -1
  79. package/server/utils/blocks.js +2 -2
  80. package/widget/index.js +1 -1
@@ -18,6 +18,7 @@ const DEFAULT_SIZES = {
18
18
  };
19
19
  const ExtendedFeaturesBlock = ({ title, description, items, colSizes = DEFAULT_SIZES, animated, }) => {
20
20
  const theme = (0, theme_1.useTheme)();
21
+ const itemTitleHeadingTag = title ? 'h3' : 'h2';
21
22
  return (react_1.default.createElement(components_1.AnimateBlock, { className: b(), animate: animated },
22
23
  react_1.default.createElement(components_1.Title, { title: title, subtitle: description, className: b('header') }),
23
24
  react_1.default.createElement("div", { className: b('items') },
@@ -31,9 +32,12 @@ const ExtendedFeaturesBlock = ({ title, description, items, colSizes = DEFAULT_S
31
32
  return (react_1.default.createElement(grid_1.Col, { className: b('item'), key: text || itemTitle, sizes: colSizes },
32
33
  iconData && react_1.default.createElement(Image_1.default, Object.assign({}, iconData, { className: b('icon') })),
33
34
  react_1.default.createElement("div", { className: b('container') },
34
- itemTitle && (react_1.default.createElement("h5", { className: b('item-title') },
35
- react_1.default.createElement(components_1.HTML, null, itemTitle),
36
- label && (react_1.default.createElement("span", { className: b('item-label') }, label)))),
35
+ itemTitle &&
36
+ react_1.default.createElement(itemTitleHeadingTag, {
37
+ className: b('item-title'),
38
+ }, react_1.default.createElement(react_1.default.Fragment, null,
39
+ react_1.default.createElement(components_1.HTML, null, itemTitle),
40
+ label && (react_1.default.createElement("span", { className: b('item-label') }, label)))),
37
41
  react_1.default.createElement(sub_blocks_1.Content, { text: text, links: itemLinks, size: "s", colSizes: { all: 12, md: 12 }, buttons: buttons, additionalInfo: additionalInfo }))));
38
42
  })))));
39
43
  };
@@ -30,7 +30,7 @@ const PromoFeaturesBlock = (props) => {
30
30
  [themeMod]: Boolean(themeMod),
31
31
  }) },
32
32
  react_1.default.createElement("div", { className: b('card-info') },
33
- react_1.default.createElement("h4", { className: b('card-title') }, cardTitle),
33
+ react_1.default.createElement("h3", { className: b('card-title') }, cardTitle),
34
34
  react_1.default.createElement("div", { className: b('card-text') },
35
35
  react_1.default.createElement(YFMWrapper_1.default, { content: text, modifiers: { constructor: true } }))),
36
36
  media && react_1.default.createElement(Media_1.default, Object.assign({ className: b('card-media') }, media))));
@@ -0,0 +1,50 @@
1
+ .pc-QuestionsBlockItem__title {
2
+ margin: 0;
3
+ }
4
+
5
+ /* use this for style redefinitions to awoid problems with
6
+ unpredictable css rules order in build */
7
+ .pc-QuestionsBlockItem {
8
+ padding-bottom: 32px;
9
+ border-bottom: 1px solid var(--g-color-line-generic);
10
+ }
11
+ .pc-QuestionsBlockItem + .pc-QuestionsBlockItem {
12
+ padding-top: 32px;
13
+ }
14
+ .pc-QuestionsBlockItem__title {
15
+ font-size: var(--g-text-header-1-font-size);
16
+ line-height: var(--g-text-header-1-line-height);
17
+ color: var(--pc-text-header-color);
18
+ font-weight: var(--g-text-accent-font-weight);
19
+ position: relative;
20
+ padding-right: 24px;
21
+ cursor: pointer;
22
+ }
23
+ .pc-QuestionsBlockItem__title a {
24
+ outline: none;
25
+ color: var(--g-color-text-link);
26
+ text-decoration: none;
27
+ cursor: pointer;
28
+ }
29
+ .utilityfocus .pc-QuestionsBlockItem__title a:focus {
30
+ outline: 2px solid #ffdb4d;
31
+ }
32
+ .pc-QuestionsBlockItem__title a:hover, .pc-QuestionsBlockItem__title a:active {
33
+ --pc-text-header-color: var(--g-color-text-link-hover);
34
+ color: var(--g-color-text-link-hover);
35
+ }
36
+ .pc-QuestionsBlockItem__arrow {
37
+ position: absolute;
38
+ right: 0;
39
+ top: 0;
40
+ color: var(--g-color-text-primary);
41
+ }
42
+ .pc-QuestionsBlockItem__link {
43
+ font-size: var(--g-text-body-2-font-size);
44
+ line-height: var(--g-text-body-2-line-height);
45
+ }
46
+ .pc-QuestionsBlockItem__text {
47
+ font-size: var(--g-text-body-2-font-size);
48
+ line-height: var(--g-text-body-2-line-height);
49
+ margin-top: 12px;
50
+ }
@@ -0,0 +1,2 @@
1
+ import { QuestionBlockItemProps } from '../../../models';
2
+ export declare const QuestionBlockItem: ({ title: itemTitle, text: itemText, link, listStyle, isOpened, onClick, }: QuestionBlockItemProps) => JSX.Element;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QuestionBlockItem = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ const uikit_1 = require("@gravity-ui/uikit");
7
+ const components_1 = require("../../../components");
8
+ const Link_1 = tslib_1.__importDefault(require("../../../components/Link/Link"));
9
+ const utils_1 = require("../../../utils");
10
+ const models_1 = require("../models");
11
+ const b = (0, utils_1.block)('QuestionsBlockItem');
12
+ const QuestionBlockItem = ({ title: itemTitle, text: itemText, link, listStyle = 'dash', isOpened, onClick, }) => {
13
+ const { onKeyDown } = (0, uikit_1.useActionHandlers)(onClick);
14
+ return (react_1.default.createElement("div", { className: b(), itemScope: true, itemProp: models_1.FaqMicrodataValues.QuestionProp, itemType: models_1.FaqMicrodataValues.QuestionType, role: 'listitem' },
15
+ react_1.default.createElement("h3", { className: b('title'), onClick: onClick, "aria-expanded": isOpened, role: 'button', tabIndex: 0, onKeyDown: onKeyDown },
16
+ react_1.default.createElement(components_1.HTML, { itemProp: models_1.FaqMicrodataValues.QuestionNameProp }, itemTitle),
17
+ react_1.default.createElement(components_1.ToggleArrow, { open: isOpened, size: 16, type: 'vertical', iconType: "navigation", className: b('arrow') })),
18
+ react_1.default.createElement(components_1.Foldable, { isOpened: isOpened },
19
+ react_1.default.createElement("div", { className: b('text'), itemScope: true, itemProp: models_1.FaqMicrodataValues.AnswerProp, itemType: models_1.FaqMicrodataValues.AnswerType, "aria-hidden": !isOpened },
20
+ react_1.default.createElement(components_1.YFMWrapper, { content: itemText, modifiers: {
21
+ constructor: true,
22
+ constructorListStyle: true,
23
+ constructorListStyleDash: listStyle === 'dash',
24
+ }, itemProp: models_1.FaqMicrodataValues.QuestionTextProp }),
25
+ link && react_1.default.createElement(Link_1.default, Object.assign({}, link, { tabIndex: isOpened ? 0 : -1, className: b('link') }))))));
26
+ };
27
+ exports.QuestionBlockItem = QuestionBlockItem;
@@ -1,7 +1,3 @@
1
- .pc-QuestionsBlock__item-title {
2
- margin: 0;
3
- }
4
-
5
1
  /* use this for style redefinitions to awoid problems with
6
2
  unpredictable css rules order in build */
7
3
  .pc-QuestionsBlock__title {
@@ -10,50 +6,6 @@ unpredictable css rules order in build */
10
6
  margin-bottom: 32px;
11
7
  margin-right: 64px;
12
8
  }
13
- .pc-QuestionsBlock__item {
14
- padding-bottom: 32px;
15
- border-bottom: 1px solid var(--g-color-line-generic);
16
- }
17
- .pc-QuestionsBlock__item + .pc-QuestionsBlock__item {
18
- padding-top: 32px;
19
- }
20
- .pc-QuestionsBlock__item-title {
21
- font-size: var(--g-text-header-1-font-size);
22
- line-height: var(--g-text-header-1-line-height);
23
- color: var(--pc-text-header-color);
24
- font-weight: var(--g-text-accent-font-weight);
25
- position: relative;
26
- padding-right: 24px;
27
- cursor: pointer;
28
- }
29
- .pc-QuestionsBlock__item-title a {
30
- outline: none;
31
- color: var(--g-color-text-link);
32
- text-decoration: none;
33
- cursor: pointer;
34
- }
35
- .utilityfocus .pc-QuestionsBlock__item-title a:focus {
36
- outline: 2px solid #ffdb4d;
37
- }
38
- .pc-QuestionsBlock__item-title a:hover, .pc-QuestionsBlock__item-title a:active {
39
- --pc-text-header-color: var(--g-color-text-link-hover);
40
- color: var(--g-color-text-link-hover);
41
- }
42
- .pc-QuestionsBlock__text {
43
- font-size: var(--g-text-body-2-font-size);
44
- line-height: var(--g-text-body-2-line-height);
45
- margin-top: 12px;
46
- }
47
- .pc-QuestionsBlock__arrow {
48
- position: absolute;
49
- right: 0;
50
- top: 0;
51
- color: var(--g-color-text-primary);
52
- }
53
- .pc-QuestionsBlock__link {
54
- font-size: var(--g-text-body-2-font-size);
55
- line-height: var(--g-text-body-2-line-height);
56
- }
57
9
  @media (max-width: 769px) {
58
10
  .pc-QuestionsBlock__title {
59
11
  margin-right: 0;
@@ -2,54 +2,34 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importStar(require("react"));
5
- const components_1 = require("../../components");
6
- const Link_1 = tslib_1.__importDefault(require("../../components/Link/Link"));
7
5
  const grid_1 = require("../../grid");
8
6
  const sub_blocks_1 = require("../../sub-blocks");
9
7
  const utils_1 = require("../../utils");
8
+ const QuestionBlockItem_1 = require("./QuestionBlockItem/QuestionBlockItem");
9
+ const models_1 = require("./models");
10
10
  const b = (0, utils_1.block)('QuestionsBlock');
11
- const FaqMicrodataValues = {
12
- PageType: 'https://schema.org/FAQPage',
13
- QuestionType: 'https://schema.org/Question',
14
- QuestionProp: 'mainEntity',
15
- QuestionNameProp: 'name',
16
- QuestionTextProp: 'text',
17
- AnswerType: 'https://schema.org/Answer',
18
- AnswerProp: 'acceptedAnswer',
19
- AnswerTextProp: 'text',
20
- };
21
11
  const QuestionsBlock = (props) => {
22
12
  const { title, text, additionalInfo, links, buttons, items } = props;
23
13
  const [opened, setOpened] = (0, react_1.useState)([0]);
24
14
  const toggleItem = (index) => {
25
15
  let newState;
26
16
  if (opened.includes(index)) {
27
- newState = opened.filter((intemIndex) => intemIndex !== index);
17
+ newState = opened.filter((itemIndex) => itemIndex !== index);
28
18
  }
29
19
  else {
30
20
  newState = [...opened, index];
31
21
  }
32
22
  setOpened(newState);
33
23
  };
34
- return (react_1.default.createElement("div", { className: b(), itemScope: true, itemType: FaqMicrodataValues.PageType },
24
+ return (react_1.default.createElement("div", { className: b(), itemScope: true, itemType: models_1.FaqMicrodataValues.PageType },
35
25
  react_1.default.createElement(grid_1.Row, null,
36
26
  react_1.default.createElement(grid_1.Col, { sizes: { all: 12, md: 4 } },
37
27
  react_1.default.createElement("div", { className: b('title') },
38
28
  react_1.default.createElement(sub_blocks_1.Content, { title: title, text: text, additionalInfo: additionalInfo, links: links, buttons: buttons, colSizes: { all: 12, md: 12 } }))),
39
- react_1.default.createElement(grid_1.Col, { sizes: { all: 12, md: 8 } }, items.map(({ title: itemTitle, text: itemText, link, listStyle = 'dash' }, index) => {
29
+ react_1.default.createElement(grid_1.Col, { sizes: { all: 12, md: 8 }, role: 'list' }, items.map(({ title: itemTitle, text: itemText, link, listStyle = 'dash' }, index) => {
40
30
  const isOpened = opened.includes(index);
41
- return (react_1.default.createElement("div", { key: itemTitle, className: b('item'), itemScope: true, itemProp: FaqMicrodataValues.QuestionProp, itemType: FaqMicrodataValues.QuestionType },
42
- react_1.default.createElement("h4", { className: b('item-title'), onClick: () => toggleItem(index) },
43
- react_1.default.createElement(components_1.HTML, { itemProp: FaqMicrodataValues.QuestionNameProp }, itemTitle),
44
- react_1.default.createElement(components_1.ToggleArrow, { open: isOpened, size: 16, type: 'vertical', iconType: "navigation", className: b('arrow') })),
45
- react_1.default.createElement(components_1.Foldable, { isOpened: isOpened },
46
- react_1.default.createElement("div", { className: b('text'), itemScope: true, itemProp: FaqMicrodataValues.AnswerProp, itemType: FaqMicrodataValues.AnswerType },
47
- react_1.default.createElement(components_1.YFMWrapper, { content: itemText, modifiers: {
48
- constructor: true,
49
- constructorListStyle: true,
50
- constructorListStyleDash: listStyle === 'dash',
51
- }, itemProp: FaqMicrodataValues.QuestionTextProp }),
52
- link && react_1.default.createElement(Link_1.default, Object.assign({}, link, { className: b('link') }))))));
31
+ const onClick = () => toggleItem(index);
32
+ return (react_1.default.createElement(QuestionBlockItem_1.QuestionBlockItem, { key: itemTitle, title: itemTitle, text: itemText, link: link, listStyle: listStyle, isOpened: isOpened, onClick: onClick }));
53
33
  })))));
54
34
  };
55
35
  exports.default = QuestionsBlock;
@@ -0,0 +1,10 @@
1
+ export declare const FaqMicrodataValues: {
2
+ readonly PageType: "https://schema.org/FAQPage";
3
+ readonly QuestionType: "https://schema.org/Question";
4
+ readonly QuestionProp: "mainEntity";
5
+ readonly QuestionNameProp: "name";
6
+ readonly QuestionTextProp: "text";
7
+ readonly AnswerType: "https://schema.org/Answer";
8
+ readonly AnswerProp: "acceptedAnswer";
9
+ readonly AnswerTextProp: "text";
10
+ };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FaqMicrodataValues = void 0;
4
+ exports.FaqMicrodataValues = {
5
+ PageType: 'https://schema.org/FAQPage',
6
+ QuestionType: 'https://schema.org/Question',
7
+ QuestionProp: 'mainEntity',
8
+ QuestionNameProp: 'name',
9
+ QuestionTextProp: 'text',
10
+ AnswerType: 'https://schema.org/Answer',
11
+ AnswerProp: 'acceptedAnswer',
12
+ AnswerTextProp: 'text',
13
+ };
@@ -1,7 +1,8 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { ButtonSize } from '@gravity-ui/uikit';
3
+ import { Tabbable } from '../../models';
3
4
  export type Theme = 'default' | 'special';
4
- export interface BackLinkProps {
5
+ export interface BackLinkProps extends Tabbable {
5
6
  url: string;
6
7
  title: ReactNode;
7
8
  theme?: Theme;
@@ -9,7 +9,7 @@ const icons_1 = require("../../icons");
9
9
  const models_1 = require("../../models");
10
10
  function BackLink(props) {
11
11
  const { history } = (0, react_1.useContext)(locationContext_1.LocationContext);
12
- const { url, title, theme = 'default', size = 'l', className, shouldHandleBackAction = false, onClick, } = props;
12
+ const { url, title, theme = 'default', size = 'l', className, shouldHandleBackAction = false, onClick, tabIndex, } = props;
13
13
  const handleAnalytics = (0, hooks_1.useAnalytics)(models_1.DefaultEventNames.ShareButton, url);
14
14
  const backActionHandler = (0, react_1.useCallback)(async () => {
15
15
  handleAnalytics();
@@ -26,7 +26,7 @@ function BackLink(props) {
26
26
  history.push({ pathname: url });
27
27
  }
28
28
  }, [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 },
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, tabIndex: tabIndex },
30
30
  react_1.default.createElement(uikit_1.Icon, { data: icons_1.ArrowSidebar, size: 24 }),
31
31
  react_1.default.createElement("span", null, title)));
32
32
  }
@@ -41,13 +41,13 @@ const LabelSizeMap = {
41
41
  };
42
42
  const FileLink = (props) => {
43
43
  const { hostname } = (0, react_1.useContext)(locationContext_1.LocationContext);
44
- const { href, text, type = 'vertical', textSize = 'm', className, theme = 'default', onClick, } = props;
44
+ const { href, text, type = 'vertical', textSize = 'm', className, theme = 'default', onClick, tabIndex, } = props;
45
45
  const fileExt = getFileExt(href);
46
46
  const labelTheme = (FileExtensionThemes[fileExt] || 'unknown');
47
47
  const labelSize = LabelSizeMap[textSize];
48
48
  return (react_1.default.createElement("div", { className: b({ ext: fileExt, type, size: textSize, theme }, className) },
49
49
  react_1.default.createElement(uikit_1.Label, { className: b('file-label'), size: labelSize, theme: labelTheme }, fileExt),
50
50
  react_1.default.createElement("div", { className: b('link') },
51
- react_1.default.createElement("a", Object.assign({ href: href }, (0, utils_1.getLinkProps)(href, hostname), { onClick: onClick }), text))));
51
+ react_1.default.createElement("a", Object.assign({ href: href, onClick: onClick, tabIndex: tabIndex }, (0, utils_1.getLinkProps)(href, hostname)), text))));
52
52
  };
53
53
  exports.default = FileLink;
@@ -25,7 +25,7 @@ const FullscreenImage = (props) => {
25
25
  react_1.default.createElement(uikit_1.Icon, { data: icons_1.Fullscreen, width: FULL_SCREEN_ICON_SIZE, height: FULL_SCREEN_ICON_SIZE, className: b('icon') }))),
26
26
  isOpened && (react_1.default.createElement(uikit_1.Modal, { open: isOpened, onClose: closeModal, className: b('modal') },
27
27
  react_1.default.createElement("div", { className: b('modal-content') },
28
- react_1.default.createElement("div", { className: b('icon-wrapper', { visible: true }), onClick: closeModal },
28
+ react_1.default.createElement("div", { className: b('icon-wrapper', { visible: true }), onClick: closeModal, "aria-label": (0, i18n_1.default)('close') },
29
29
  react_1.default.createElement(uikit_1.Icon, { data: icons_1.PreviewClose, width: CLOSE_ICON_SIZE, height: CLOSE_ICON_SIZE, className: b('icon', { hover: true }) })),
30
30
  react_1.default.createElement(Image_1.default, Object.assign({}, props, { className: b('modal-image', modalImageClass) })))))));
31
31
  };
@@ -1,3 +1,4 @@
1
1
  {
2
- "img-alt": "Full screen image"
2
+ "img-alt": "Full screen image",
3
+ "close": "Close"
3
4
  }
@@ -1,3 +1,4 @@
1
1
  {
2
- "img-alt": "Полноэкранное изображение"
2
+ "img-alt": "Полноэкранное изображение",
3
+ "close": "Закрыть"
3
4
  }
@@ -1,3 +1,3 @@
1
1
  {
2
- "img-alt": "Image alt"
2
+ "img-alt": ""
3
3
  }
@@ -1,3 +1,3 @@
1
1
  {
2
- "img-alt": "Альтернатива изображению"
2
+ "img-alt": ""
3
3
  }
@@ -1,4 +1,4 @@
1
- import { ClassNameProps, LinkProps, WithChildren } from '../../models';
2
- export type LinkFullProps = LinkProps & ClassNameProps;
1
+ import { ClassNameProps, LinkProps, Tabbable, WithChildren } from '../../models';
2
+ export type LinkFullProps = LinkProps & ClassNameProps & Tabbable;
3
3
  declare const LinkBlock: (props: WithChildren<LinkFullProps>) => JSX.Element;
4
4
  export default LinkBlock;
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importStar(require("react"));
5
5
  const uikit_1 = require("@gravity-ui/uikit");
6
- const localeContext_1 = require("../../context/localeContext/localeContext");
7
- const locationContext_1 = require("../../context/locationContext/locationContext");
6
+ const localeContext_1 = require("../../context/localeContext");
7
+ const locationContext_1 = require("../../context/locationContext");
8
8
  const hooks_1 = require("../../hooks");
9
9
  const useMetrika_1 = require("../../hooks/useMetrika");
10
10
  const icons_1 = require("../../icons");
@@ -27,7 +27,7 @@ function getArrowSize(size) {
27
27
  }
28
28
  }
29
29
  const LinkBlock = (props) => {
30
- const { text, url, arrow, metrikaGoals, pixelEvents, analyticsEvents, theme = 'file-link', colorTheme = 'light', textSize = 'm', className, target, children, } = props;
30
+ const { text, url, arrow, metrikaGoals, pixelEvents, analyticsEvents, theme = 'file-link', colorTheme = 'light', textSize = 'm', className, target, children, tabIndex, } = props;
31
31
  const handleMetrika = (0, useMetrika_1.useMetrika)();
32
32
  const handleAnalytics = (0, hooks_1.useAnalytics)(models_1.DefaultEventNames.Link, url);
33
33
  const { hostname } = (0, react_1.useContext)(locationContext_1.LocationContext);
@@ -41,14 +41,14 @@ const LinkBlock = (props) => {
41
41
  const getLinkByType = () => {
42
42
  switch (theme) {
43
43
  case 'back':
44
- return react_1.default.createElement(BackLink_1.default, { title: children || text, url: href, onClick: onClick });
44
+ return (react_1.default.createElement(BackLink_1.default, { title: children || text, url: href, onClick: onClick, tabIndex: tabIndex }));
45
45
  case 'file-link':
46
46
  case 'underline':
47
- return (react_1.default.createElement(FileLink_1.default, { text: children || text, href: href, type: "horizontal", textSize: textSize, onClick: onClick }));
47
+ return (react_1.default.createElement(FileLink_1.default, { text: children || text, href: href, type: "horizontal", textSize: textSize, onClick: onClick, tabIndex: tabIndex }));
48
48
  case 'normal': {
49
49
  const linkProps = (0, utils_1.getLinkProps)(url, hostname, target);
50
50
  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,
51
+ return (react_1.default.createElement("a", Object.assign({ className: b('link', { theme: colorTheme, 'has-arrow': arrow }), href: href, onClick: onClick, tabIndex: tabIndex }, linkProps), arrow ? (react_1.default.createElement(react_1.Fragment, null,
52
52
  react_1.default.createElement("span", { className: b('content') }, content),
53
53
  WORD_JOINER_SYM,
54
54
  react_1.default.createElement(uikit_1.Icon, { className: b('arrow'), data: icons_1.Chevron, size: getArrowSize(textSize) }))) : (content)));
@@ -11,8 +11,7 @@ const Image_1 = tslib_1.__importDefault(require("./Image/Image"));
11
11
  const Video_1 = tslib_1.__importDefault(require("./Video/Video"));
12
12
  const b = (0, utils_1.block)('Media');
13
13
  const Media = (props) => {
14
- const { image, video, youtube, dataLens, color, height, previewImg, parallax = false, metrika, fullscreen, analyticsEvents, } = props;
15
- const { className, imageClassName, videoClassName, youtubeClassName, playVideo = true, isBackground, playButton, customBarControlsClassName, } = props;
14
+ const { image, video, youtube, dataLens, color, height, previewImg, parallax = false, metrika, fullscreen, analyticsEvents, className, imageClassName, videoClassName, youtubeClassName, playVideo = true, isBackground, playButton, customBarControlsClassName, } = props;
16
15
  const [hasVideoFallback, setHasVideoFallback] = (0, react_1.useState)(false);
17
16
  const content = (0, react_1.useMemo)(() => {
18
17
  let result = [];
@@ -30,8 +30,8 @@ const Video = (props) => {
30
30
  }
31
31
  }, [playVideo, video, setHasVideoFallback]);
32
32
  const reactPlayerBlock = (0, react_1.useMemo)(() => {
33
- const { src, loop, controls, muted, autoplay = true, elapsedTime, playButton } = video;
34
- return (react_1.default.createElement(ReactPlayer_1.default, { className: b('react-player', videoClassName), src: src, previewImgUrl: previewImg, loop: Boolean(loop), controls: controls, muted: muted, autoplay: autoplay && playVideo, elapsedTime: elapsedTime, playButton: playButton || commonPlayButton, customBarControlsClassName: customBarControlsClassName, metrika: metrika, analyticsEvents: analyticsEvents, height: height }));
33
+ const { src, loop, controls, muted, autoplay = true, elapsedTime, playButton, ariaLabel, } = video;
34
+ return (react_1.default.createElement(ReactPlayer_1.default, { className: b('react-player', videoClassName), src: src, previewImgUrl: previewImg, loop: Boolean(loop), controls: controls, muted: muted, autoplay: autoplay && playVideo, elapsedTime: elapsedTime, playButton: playButton || commonPlayButton, customBarControlsClassName: customBarControlsClassName, metrika: metrika, analyticsEvents: analyticsEvents, height: height, ariaLabel: ariaLabel }));
35
35
  }, [
36
36
  video,
37
37
  height,
@@ -48,7 +48,7 @@ const Video = (props) => {
48
48
  react_1.default.createElement("video", { disablePictureInPicture: true, playsInline: true,
49
49
  // @ts-ignore
50
50
  // eslint-disable-next-line react/no-unknown-property
51
- pip: "false", className: b('item'), ref: ref, preload: "metadata", muted: true }, (0, utils_2.getVideoTypesWithPriority)(video.src).map(({ src, type }, index) => (react_1.default.createElement("source", { key: index, src: src, type: type })))))) : null;
51
+ pip: "false", className: b('item'), ref: ref, preload: "metadata", muted: true, "aria-label": video.ariaLabel }, (0, utils_2.getVideoTypesWithPriority)(video.src).map(({ src, type }, index) => (react_1.default.createElement("source", { key: index, src: src, type: type })))))) : null;
52
52
  }, [video, videoClassName, hasVideoFallback, height]);
53
53
  switch (video.type) {
54
54
  case models_1.MediaVideoType.Player:
@@ -14,6 +14,7 @@ const icons_1 = require("../../icons");
14
14
  const models_1 = require("../../models");
15
15
  const utils_1 = require("../../utils");
16
16
  const CustomBarControls_1 = tslib_1.__importDefault(require("./CustomBarControls"));
17
+ const i18n_1 = tslib_1.__importDefault(require("./i18n"));
17
18
  const utils_2 = require("./utils");
18
19
  const b = (0, utils_1.block)('ReactPlayer');
19
20
  const FPS = 60;
@@ -21,7 +22,7 @@ const FPS = 60;
21
22
  exports.ReactPlayerBlock = react_1.default.forwardRef((props, originRef) => {
22
23
  const isMobile = (0, react_1.useContext)(mobileContext_1.MobileContext);
23
24
  const { metrika } = (0, react_1.useContext)(metrikaContext_1.MetrikaContext);
24
- const { src, previewImgUrl, loop = false, controls = models_1.MediaVideoControlsType.Default, muted: initiallyMuted = false, elapsedTime, playButton, className, customBarControlsClassName, showPreview, onClickPreview, metrika: videoMetrika, analyticsEvents, height, } = props;
25
+ const { src, previewImgUrl, loop = false, controls = models_1.MediaVideoControlsType.Default, muted: initiallyMuted = false, elapsedTime, playButton, className, customBarControlsClassName, showPreview, onClickPreview, metrika: videoMetrika, analyticsEvents, height, ariaLabel, } = props;
25
26
  const { type = models_1.PlayButtonType.Default, theme = models_1.PlayButtonThemes.Blue, text, className: buttonClassName, } = playButton || {};
26
27
  const autoPlay = Boolean(!isMobile && !previewImgUrl && props.autoplay);
27
28
  const mute = initiallyMuted || autoPlay;
@@ -105,7 +106,7 @@ exports.ReactPlayerBlock = react_1.default.forwardRef((props, originRef) => {
105
106
  playButtonContent = react_1.default.createElement(uikit_1.Icon, { className: b('icon'), data: icons_1.PlayVideo, size: 24 });
106
107
  break;
107
108
  }
108
- return (react_1.default.createElement("button", { className: b('button', { theme, text: Boolean(text) }, buttonClassName) }, playButtonContent));
109
+ return (react_1.default.createElement("button", { className: b('button', { theme, text: Boolean(text) }, buttonClassName), "aria-label": (0, i18n_1.default)('play') }, playButtonContent));
109
110
  }, [type, theme, text, buttonClassName]);
110
111
  const changeMute = (0, react_1.useCallback)((isMuted) => {
111
112
  if (isMuted && playerRef) {
@@ -195,7 +196,7 @@ exports.ReactPlayerBlock = react_1.default.forwardRef((props, originRef) => {
195
196
  }, elapsedTimePercent: elapsedTimePercent }));
196
197
  }, [controls, isPlaying, customBarControlsClassName, changeMute]);
197
198
  return (react_1.default.createElement("div", { className: b({ wrapper: !currentHeight }, className), ref: ref, onClick: handleClick },
198
- react_1.default.createElement(react_player_1.default, { className: b('player'), url: videoSrc, muted: muted, controls: controls === models_1.MediaVideoControlsType.Default, height: currentHeight || '100%', width: width || '100%', light: previewImgUrl, playing: isPlaying, playIcon: playIcon, progressInterval: FPS, onClickPreview: handleClickPreview, onStart: onStart, onReady: setPlayerRef, onPlay: onPlay, onPause: onPause, onProgress: onProgress, onEnded: onEnded }),
199
+ react_1.default.createElement(react_player_1.default, { className: b('player'), url: videoSrc, muted: muted, controls: controls === models_1.MediaVideoControlsType.Default, height: currentHeight || '100%', width: width || '100%', light: previewImgUrl, playing: isPlaying, playIcon: playIcon, progressInterval: FPS, onClickPreview: handleClickPreview, onStart: onStart, onReady: setPlayerRef, onPlay: onPlay, onPause: onPause, onProgress: onProgress, onEnded: onEnded, "aria-label": ariaLabel }),
199
200
  renderCustomBarControls(muted, playedPercent)));
200
201
  });
201
202
  function getHeight(width) {
@@ -0,0 +1,3 @@
1
+ {
2
+ "play": "Play"
3
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: (key: string, params?: import("@gravity-ui/i18n").Params | undefined) => string;
2
+ export default _default;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const registerKeyset_1 = require("../../../utils/registerKeyset");
5
+ const en_json_1 = tslib_1.__importDefault(require("./en.json"));
6
+ const ru_json_1 = tslib_1.__importDefault(require("./ru.json"));
7
+ const COMPONENT = 'ReactPlayer';
8
+ exports.default = (0, registerKeyset_1.registerKeyset)({ en: en_json_1.default, ru: ru_json_1.default }, COMPONENT);
@@ -0,0 +1,3 @@
1
+ {
2
+ "play": "Воспроизвести"
3
+ }
@@ -1,8 +1,4 @@
1
1
  import { Theme } from '../models';
2
2
  export declare const DEFAULT_THEME = Theme.Light;
3
3
  export declare const UIKIT_ROOT_CLASS = "g-root";
4
- export declare const KEY: {
5
- ENTER: string;
6
- TAB: string;
7
- };
8
4
  export declare const HEADER_HEIGHT = 64;
@@ -1,11 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HEADER_HEIGHT = exports.KEY = exports.UIKIT_ROOT_CLASS = exports.DEFAULT_THEME = void 0;
3
+ exports.HEADER_HEIGHT = exports.UIKIT_ROOT_CLASS = exports.DEFAULT_THEME = void 0;
4
4
  const models_1 = require("../models");
5
5
  exports.DEFAULT_THEME = models_1.Theme.Light;
6
6
  exports.UIKIT_ROOT_CLASS = 'g-root';
7
- exports.KEY = {
8
- ENTER: 'Enter',
9
- TAB: 'Tab',
10
- };
11
7
  exports.HEADER_HEIGHT = 64;
@@ -5,5 +5,6 @@ import { GridColumnClassParams } from '../types';
5
5
  export interface GridColumnProps extends GridColumnClassParams, Refable<HTMLDivElement>, QAProps {
6
6
  style?: CSSProperties;
7
7
  children?: React.ReactNode;
8
+ role?: React.AriaRole;
8
9
  }
9
- export declare const Col: React.ForwardRefExoticComponent<Pick<WithChildren<GridColumnProps>, "style" | "children" | "sizes" | "className" | "hidden" | "qa" | "reset" | "visible" | "offsets" | "orders" | "alignSelf" | "justifyContent"> & React.RefAttributes<HTMLDivElement>>;
10
+ export declare const Col: React.ForwardRefExoticComponent<Pick<WithChildren<GridColumnProps>, "style" | "children" | "sizes" | "className" | "hidden" | "role" | "qa" | "reset" | "visible" | "offsets" | "orders" | "alignSelf" | "justifyContent"> & React.RefAttributes<HTMLDivElement>>;
@@ -5,7 +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
  exports.Col = (0, react_1.forwardRef)((props, ref) => {
8
- const { children, style, qa } = props, rest = tslib_1.__rest(props, ["children", "style", "qa"]);
9
- return (react_1.default.createElement("div", { ref: ref, className: (0, utils_1.getColClass)(rest), style: style, "data-qa": qa }, children));
8
+ const { children, style, qa, role } = props, rest = tslib_1.__rest(props, ["children", "style", "qa", "role"]);
9
+ return (react_1.default.createElement("div", { ref: ref, className: (0, utils_1.getColClass)(rest), style: style, "data-qa": qa, role: role }, children));
10
10
  });
11
11
  exports.Col.displayName = 'Col';
@@ -141,6 +141,10 @@ export interface QuestionItem {
141
141
  export interface QuestionsProps extends Omit<ContentBlockProps, 'colSizes' | 'centered' | 'size' | 'theme'> {
142
142
  items: QuestionItem[];
143
143
  }
144
+ export interface QuestionBlockItemProps extends QuestionItem {
145
+ isOpened: boolean;
146
+ onClick: () => void;
147
+ }
144
148
  export interface BannerBlockProps extends BannerCardProps, Animatable {
145
149
  }
146
150
  export interface CompaniesBlockProps extends Animatable {
@@ -1,6 +1,6 @@
1
1
  import { CSSProperties, ReactNode } from 'react';
2
2
  import { ButtonView, ButtonProps as UikitButtonProps } from '@gravity-ui/uikit';
3
- import { ThemeSupporting } from '../../utils/theme';
3
+ import { ThemeSupporting } from '../../utils';
4
4
  import { AnalyticsEventsBase, ClassNameProps, PixelEventType, QAProps } from '../common';
5
5
  export declare enum AuthorType {
6
6
  Column = "column",
@@ -61,6 +61,9 @@ export interface Stylable {
61
61
  export interface Animatable {
62
62
  animated?: boolean;
63
63
  }
64
+ export interface Tabbable {
65
+ tabIndex?: number;
66
+ }
64
67
  export interface Background {
65
68
  image?: string;
66
69
  color?: string;
@@ -106,7 +109,7 @@ export interface MediaVideoProps extends AnalyticsEventsBase {
106
109
  controls?: MediaVideoControlsType;
107
110
  metrika?: MetrikaVideo;
108
111
  }
109
- export interface LinkProps extends AnalyticsEventsBase, Stylable {
112
+ export interface LinkProps extends AnalyticsEventsBase, Stylable, Tabbable {
110
113
  url: string;
111
114
  text?: string;
112
115
  textSize?: TextSize;
@@ -117,7 +120,7 @@ export interface LinkProps extends AnalyticsEventsBase, Stylable {
117
120
  metrikaGoals?: MetrikaGoal;
118
121
  pixelEvents?: ButtonPixel;
119
122
  }
120
- export interface FileLinkProps extends ClassNameProps {
123
+ export interface FileLinkProps extends ClassNameProps, Tabbable {
121
124
  href: string;
122
125
  text: ReactNode;
123
126
  type?: FileLinkType;
@@ -157,6 +160,7 @@ export interface MediaVideoProps {
157
160
  playButton?: PlayButtonProps;
158
161
  controls?: MediaVideoControlsType;
159
162
  metrika?: MetrikaVideo;
163
+ ariaLabel?: string;
160
164
  }
161
165
  export type ThemedMediaVideoProps = ThemeSupporting<MediaVideoProps>;
162
166
  export interface MediaComponentVideoProps extends AnalyticsEventsBase {
@@ -9,6 +9,15 @@ const utils_1 = require("../../../components/Media/Image/utils");
9
9
  const theme_1 = require("../../../context/theme");
10
10
  const utils_2 = require("../../../utils");
11
11
  const b = (0, utils_2.block)('content-list');
12
+ function getHeadingLevel(size) {
13
+ switch (size) {
14
+ case 's':
15
+ return 'h4';
16
+ case 'l':
17
+ default:
18
+ return 'h3';
19
+ }
20
+ }
12
21
  const ContentList = ({ list, size }) => {
13
22
  const theme = (0, theme_1.useTheme)();
14
23
  return (react_1.default.createElement("div", { className: b({ size }) }, list === null || list === void 0 ? void 0 : list.map((item) => {
@@ -18,7 +27,8 @@ const ContentList = ({ list, size }) => {
18
27
  return (react_1.default.createElement("div", { className: b('item'), key: (0, uuid_1.v4)() },
19
28
  react_1.default.createElement(Image_1.default, Object.assign({}, iconData, { className: b('icon') })),
20
29
  react_1.default.createElement("div", null,
21
- title && react_1.default.createElement("h4", { className: b('title') }, title),
30
+ title &&
31
+ react_1.default.createElement(getHeadingLevel(size), { className: b('title') }, title),
22
32
  text && (react_1.default.createElement(components_1.YFMWrapper, { className: b('text'), content: text, modifiers: { constructor: true } })))));
23
33
  })));
24
34
  };