@gravity-ui/page-constructor 4.1.2 → 4.4.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 (90) 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/HTML/HTML.d.ts +3 -1
  17. package/build/cjs/components/HTML/HTML.js +2 -1
  18. package/build/cjs/components/Image/i18n/en.json +1 -1
  19. package/build/cjs/components/Image/i18n/ru.json +1 -1
  20. package/build/cjs/components/Link/Link.d.ts +2 -2
  21. package/build/cjs/components/Link/Link.js +6 -6
  22. package/build/cjs/components/Media/Media.js +1 -2
  23. package/build/cjs/components/Media/Video/Video.js +3 -3
  24. package/build/cjs/components/ReactPlayer/ReactPlayer.js +4 -3
  25. package/build/cjs/components/ReactPlayer/i18n/en.json +3 -0
  26. package/build/cjs/components/ReactPlayer/i18n/index.d.ts +2 -0
  27. package/build/cjs/components/ReactPlayer/i18n/index.js +8 -0
  28. package/build/cjs/components/ReactPlayer/i18n/ru.json +3 -0
  29. package/build/cjs/components/Table/Table.js +11 -5
  30. package/build/cjs/components/YFMWrapper/YFMWrapper.d.ts +3 -3
  31. package/build/cjs/components/YFMWrapper/YFMWrapper.js +1 -1
  32. package/build/cjs/components/constants.d.ts +0 -4
  33. package/build/cjs/components/constants.js +1 -5
  34. package/build/cjs/grid/Col/Col.d.ts +3 -4
  35. package/build/cjs/grid/Col/Col.js +2 -2
  36. package/build/cjs/models/constructor-items/blocks.d.ts +8 -0
  37. package/build/cjs/models/constructor-items/common.d.ts +11 -4
  38. package/build/cjs/sub-blocks/Content/ContentList/ContentList.js +11 -1
  39. package/build/cjs/sub-blocks/LayoutItem/utils.d.ts +1 -0
  40. package/build/cjs/utils/blocks.d.ts +1 -1
  41. package/build/cjs/utils/blocks.js +2 -2
  42. package/build/esm/blocks/ExtendedFeatures/ExtendedFeatures.js +7 -3
  43. package/build/esm/blocks/PromoFeaturesBlock/PromoFeaturesBlock.js +1 -1
  44. package/build/esm/blocks/Questions/QuestionBlockItem/QuestionBlockItem.css +50 -0
  45. package/build/esm/blocks/Questions/QuestionBlockItem/QuestionBlockItem.d.ts +3 -0
  46. package/build/esm/blocks/Questions/QuestionBlockItem/QuestionBlockItem.js +23 -0
  47. package/build/esm/blocks/Questions/Questions.css +0 -48
  48. package/build/esm/blocks/Questions/Questions.js +6 -26
  49. package/build/esm/blocks/Questions/models.d.ts +10 -0
  50. package/build/esm/blocks/Questions/models.js +10 -0
  51. package/build/esm/components/BackLink/BackLink.d.ts +2 -1
  52. package/build/esm/components/BackLink/BackLink.js +2 -2
  53. package/build/esm/components/FileLink/FileLink.js +2 -2
  54. package/build/esm/components/FullscreenImage/FullscreenImage.js +1 -1
  55. package/build/esm/components/FullscreenImage/i18n/en.json +2 -1
  56. package/build/esm/components/FullscreenImage/i18n/ru.json +2 -1
  57. package/build/esm/components/HTML/HTML.d.ts +3 -1
  58. package/build/esm/components/HTML/HTML.js +2 -1
  59. package/build/esm/components/Image/i18n/en.json +1 -1
  60. package/build/esm/components/Image/i18n/ru.json +1 -1
  61. package/build/esm/components/Link/Link.d.ts +2 -2
  62. package/build/esm/components/Link/Link.js +7 -7
  63. package/build/esm/components/Media/Media.js +1 -2
  64. package/build/esm/components/Media/Video/Video.js +3 -3
  65. package/build/esm/components/ReactPlayer/ReactPlayer.js +4 -3
  66. package/build/esm/components/ReactPlayer/i18n/en.json +3 -0
  67. package/build/esm/components/ReactPlayer/i18n/index.d.ts +2 -0
  68. package/build/esm/components/ReactPlayer/i18n/index.js +5 -0
  69. package/build/esm/components/ReactPlayer/i18n/ru.json +3 -0
  70. package/build/esm/components/Table/Table.js +11 -5
  71. package/build/esm/components/YFMWrapper/YFMWrapper.d.ts +3 -3
  72. package/build/esm/components/YFMWrapper/YFMWrapper.js +1 -1
  73. package/build/esm/components/constants.d.ts +0 -4
  74. package/build/esm/components/constants.js +0 -4
  75. package/build/esm/grid/Col/Col.d.ts +3 -4
  76. package/build/esm/grid/Col/Col.js +2 -2
  77. package/build/esm/models/constructor-items/blocks.d.ts +8 -0
  78. package/build/esm/models/constructor-items/common.d.ts +11 -4
  79. package/build/esm/sub-blocks/Content/ContentList/ContentList.js +11 -1
  80. package/build/esm/sub-blocks/LayoutItem/utils.d.ts +1 -0
  81. package/build/esm/utils/blocks.d.ts +1 -1
  82. package/build/esm/utils/blocks.js +2 -2
  83. package/package.json +3 -3
  84. package/server/components/constants.d.ts +0 -4
  85. package/server/components/constants.js +1 -5
  86. package/server/models/constructor-items/blocks.d.ts +8 -0
  87. package/server/models/constructor-items/common.d.ts +11 -4
  88. package/server/utils/blocks.d.ts +1 -1
  89. package/server/utils/blocks.js +2 -2
  90. 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
  }
@@ -5,12 +5,14 @@ export interface HTMLProps {
5
5
  block?: boolean;
6
6
  className?: string;
7
7
  itemProp?: string;
8
+ id?: string;
8
9
  }
9
- declare const HTML: ({ children, block, className, itemProp }: WithChildren<HTMLProps>) => React.DetailedReactHTMLElement<{
10
+ declare const HTML: ({ children, block, className, itemProp, id }: WithChildren<HTMLProps>) => React.DetailedReactHTMLElement<{
10
11
  dangerouslySetInnerHTML: {
11
12
  __html: string | (string & React.ReactElement<any, string | React.JSXElementConstructor<any>>) | (string & React.ReactFragment) | (string & React.ReactPortal);
12
13
  };
13
14
  className: string | undefined;
14
15
  itemProp: string | undefined;
16
+ id: string | undefined;
15
17
  }, HTMLElement> | null;
16
18
  export default HTML;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importDefault(require("react"));
5
5
  const utils_1 = require("../../utils");
6
- const HTML = ({ children, block = false, className, itemProp }) => {
6
+ const HTML = ({ children, block = false, className, itemProp, id }) => {
7
7
  if (!children) {
8
8
  return null;
9
9
  }
@@ -11,6 +11,7 @@ const HTML = ({ children, block = false, className, itemProp }) => {
11
11
  dangerouslySetInnerHTML: { __html: children },
12
12
  className,
13
13
  itemProp,
14
+ id,
14
15
  });
15
16
  };
16
17
  exports.default = HTML;
@@ -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
+ }
@@ -4,28 +4,34 @@ const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importDefault(require("react"));
5
5
  const __1 = require("../");
6
6
  const utils_1 = require("../../utils");
7
+ function getMarkerId(index) {
8
+ if (isNaN(index)) {
9
+ return undefined;
10
+ }
11
+ return `marker-${index}`;
12
+ }
7
13
  const b = (0, utils_1.block)('table');
8
14
  class Table extends react_1.default.Component {
9
15
  render() {
10
- const { content, legend, marker = 'disk', className } = this.props;
16
+ const { content, legend, marker = 'disk', className, caption } = this.props;
11
17
  if (!content || !content.length || !content[0].length) {
12
18
  return null;
13
19
  }
14
- return (react_1.default.createElement("div", { className: b(null, className) },
20
+ return (react_1.default.createElement("div", { className: b(null, className), role: 'table', "aria-label": caption },
15
21
  this.renderTable(content, marker, legend),
16
22
  legend && this.renderLegend(legend, marker)));
17
23
  }
18
24
  renderTable(content, marker, legend) {
19
25
  const justify = this.getDefaultJustify(content, this.props.justify);
20
- return (react_1.default.createElement("div", { className: b('table') }, content.map((row, i) => (react_1.default.createElement("div", { key: i, className: b('row') }, row.map((cell, j) => (react_1.default.createElement("div", { key: j, className: b('cell', { justify: justify[j] }) }, legend && i && j ? (this.renderMarker(marker, cell)) : (react_1.default.createElement(__1.HTML, null, cell))))))))));
26
+ return (react_1.default.createElement("div", { className: b('table'), role: 'rowgroup' }, content.map((row, i) => (react_1.default.createElement("div", { key: i, className: b('row'), role: 'row' }, row.map((cell, j) => (react_1.default.createElement("div", { key: j, className: b('cell', { justify: justify[j] }), role: 'cell' }, legend && i && j ? (this.renderMarker(marker, cell)) : (react_1.default.createElement(__1.HTML, null, cell))))))))));
21
27
  }
22
28
  renderMarker(type, cell) {
23
- return react_1.default.createElement("div", { className: b('marker', { type, index: String(cell) }) });
29
+ return (react_1.default.createElement("div", { "aria-labelledby": getMarkerId(Number(cell)), className: b('marker', { type, index: String(cell) }) }));
24
30
  }
25
31
  renderLegend(legend, marker) {
26
32
  return (react_1.default.createElement("div", { className: b('legend') }, legend.map((item, index) => (react_1.default.createElement("div", { key: item, className: b('legend-item') },
27
33
  this.renderMarker(marker, String(index)),
28
- react_1.default.createElement(__1.YFMWrapper, { className: b('legent-item-text'), content: item, modifiers: { constructor: true } }))))));
34
+ react_1.default.createElement(__1.YFMWrapper, { className: b('legent-item-text'), content: item, modifiers: { constructor: true }, id: getMarkerId(index) }))))));
29
35
  }
30
36
  getDefaultJustify(content, justify) {
31
37
  return justify || new Array(content[0].length).fill('center');
@@ -1,9 +1,9 @@
1
1
  import { ClassNameProps, Modifiers } from '../../models';
2
- export interface YFMWrapperProps {
3
- className?: string;
2
+ export interface YFMWrapperProps extends ClassNameProps {
4
3
  content: string;
5
4
  modifiers?: Modifiers;
6
5
  itemProp?: string;
6
+ id?: string;
7
7
  }
8
- declare const YFMWrapper: ({ content, modifiers, className, itemProp, }: YFMWrapperProps & ClassNameProps) => JSX.Element;
8
+ declare const YFMWrapper: ({ content, modifiers, className, itemProp, id }: YFMWrapperProps) => JSX.Element;
9
9
  export default YFMWrapper;
@@ -8,5 +8,5 @@ const bem_cn_lite_1 = tslib_1.__importDefault(require("bem-cn-lite"));
8
8
  const snakecase_keys_1 = tslib_1.__importDefault(require("snakecase-keys"));
9
9
  const components_1 = require("../../components");
10
10
  const yfm = (0, bem_cn_lite_1.default)('yfm');
11
- const YFMWrapper = ({ content, modifiers, className, itemProp, }) => (react_1.default.createElement(components_1.HTML, { className: yfm(modifiers ? (0, snakecase_keys_1.default)(modifiers) : {}, className), itemProp: itemProp }, content));
11
+ const YFMWrapper = ({ content, modifiers, className, itemProp, id }) => (react_1.default.createElement(components_1.HTML, { className: yfm(modifiers ? (0, snakecase_keys_1.default)(modifiers) : {}, className), itemProp: itemProp, id: id }, content));
12
12
  exports.default = YFMWrapper;
@@ -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;