@doyourjob/gravity-ui-page-constructor 5.31.179 → 5.31.181

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 (49) hide show
  1. package/build/cjs/blocks/AboutHeader/AboutHeader.js +1 -1
  2. package/build/cjs/blocks/Audio/Audio.js +15 -4
  3. package/build/cjs/blocks/ScienceSuggest/ScienceSuggest.d.ts +4 -0
  4. package/build/cjs/blocks/ScienceSuggest/ScienceSuggest.js +12 -0
  5. package/build/cjs/blocks/ScienceSuggest/i18n/en.json +3 -0
  6. package/build/cjs/blocks/ScienceSuggest/i18n/index.d.ts +1 -0
  7. package/build/cjs/blocks/ScienceSuggest/i18n/index.js +9 -0
  8. package/build/cjs/blocks/ScienceSuggest/i18n/ru.json +3 -0
  9. package/build/cjs/blocks/ScienceSuggest/schema.d.ts +51 -0
  10. package/build/cjs/blocks/ScienceSuggest/schema.js +19 -0
  11. package/build/cjs/blocks/index.d.ts +1 -0
  12. package/build/cjs/blocks/index.js +3 -1
  13. package/build/cjs/constructor-items.d.ts +1 -0
  14. package/build/cjs/constructor-items.js +1 -0
  15. package/build/cjs/models/constructor-items/blocks.d.ts +10 -3
  16. package/build/cjs/models/constructor-items/blocks.js +1 -0
  17. package/build/cjs/schema/constants.d.ts +1 -0
  18. package/build/cjs/schema/constants.js +2 -1
  19. package/build/cjs/schema/validators/blocks.d.ts +1 -0
  20. package/build/cjs/schema/validators/blocks.js +1 -0
  21. package/build/cjs/sub-blocks/NewPostCard/schema.d.ts +32 -0
  22. package/build/cjs/sub-blocks/NewPostCard/schema.js +34 -22
  23. package/build/esm/blocks/AboutHeader/AboutHeader.js +2 -2
  24. package/build/esm/blocks/Audio/Audio.js +15 -4
  25. package/build/esm/blocks/ScienceSuggest/ScienceSuggest.d.ts +4 -0
  26. package/build/esm/blocks/ScienceSuggest/ScienceSuggest.js +9 -0
  27. package/build/esm/blocks/ScienceSuggest/i18n/en.json +3 -0
  28. package/build/esm/blocks/ScienceSuggest/i18n/index.d.ts +1 -0
  29. package/build/esm/blocks/ScienceSuggest/i18n/index.js +5 -0
  30. package/build/esm/blocks/ScienceSuggest/i18n/ru.json +3 -0
  31. package/build/esm/blocks/ScienceSuggest/schema.d.ts +51 -0
  32. package/build/esm/blocks/ScienceSuggest/schema.js +16 -0
  33. package/build/esm/blocks/index.d.ts +1 -0
  34. package/build/esm/blocks/index.js +1 -0
  35. package/build/esm/constructor-items.d.ts +1 -0
  36. package/build/esm/constructor-items.js +2 -1
  37. package/build/esm/models/constructor-items/blocks.d.ts +10 -3
  38. package/build/esm/models/constructor-items/blocks.js +1 -0
  39. package/build/esm/schema/constants.d.ts +1 -0
  40. package/build/esm/schema/constants.js +3 -2
  41. package/build/esm/schema/validators/blocks.d.ts +1 -0
  42. package/build/esm/schema/validators/blocks.js +1 -0
  43. package/build/esm/sub-blocks/NewPostCard/schema.d.ts +32 -0
  44. package/build/esm/sub-blocks/NewPostCard/schema.js +33 -21
  45. package/package.json +1 -1
  46. package/schema/index.js +1 -1
  47. package/server/models/constructor-items/blocks.d.ts +10 -3
  48. package/server/models/constructor-items/blocks.js +1 -0
  49. package/widget/index.js +1 -1
@@ -19,6 +19,6 @@ const AboutHeaderBlock = ({ title, text, caption, image, logo }) => {
19
19
  react_1.default.createElement("div", { className: b('wrap') },
20
20
  react_1.default.createElement("div", { className: b('caption') }, caption),
21
21
  react_1.default.createElement(components_1.Image, { src: logo, className: b('logo') })),
22
- text && react_1.default.createElement(components_1.HTML, { className: b('text') }, text))))));
22
+ text && (react_1.default.createElement(components_1.YFMWrapper, { content: text, modifiers: { constructor: true }, className: b('text') })))))));
23
23
  };
24
24
  exports.default = react_1.default.memo(AboutHeaderBlock);
@@ -23,8 +23,10 @@ const Audio = ({ url }) => {
23
23
  const [duration, setDuration] = (0, react_1.useState)(0);
24
24
  const [volume, setVolume] = (0, react_1.useState)(1);
25
25
  const [isDragging, setIsDragging] = (0, react_1.useState)(false);
26
+ const [isLoading, setIsLoading] = (0, react_1.useState)(true);
26
27
  // FIX: сброс состояния при смене url
27
28
  (0, react_1.useEffect)(() => {
29
+ setIsLoading(true);
28
30
  setCurrentTime(0);
29
31
  setDuration(0);
30
32
  setIsPlaying(false);
@@ -141,11 +143,15 @@ const Audio = ({ url }) => {
141
143
  }
142
144
  };
143
145
  const onDurationChange = () => setDuration(audio.duration);
146
+ const onCanPlay = () => setIsLoading(false);
147
+ const onWaiting = () => setIsLoading(true);
144
148
  audio.addEventListener('play', onPlay);
145
149
  audio.addEventListener('pause', onPause);
146
150
  audio.addEventListener('ended', onEnded);
147
151
  audio.addEventListener('timeupdate', onTimeUpdate);
148
152
  audio.addEventListener('durationchange', onDurationChange);
153
+ audio.addEventListener('canplay', onCanPlay);
154
+ audio.addEventListener('waiting', onWaiting);
149
155
  // eslint-disable-next-line consistent-return
150
156
  return () => {
151
157
  audio.removeEventListener('play', onPlay);
@@ -153,6 +159,8 @@ const Audio = ({ url }) => {
153
159
  audio.removeEventListener('ended', onEnded);
154
160
  audio.removeEventListener('timeupdate', onTimeUpdate);
155
161
  audio.removeEventListener('durationchange', onDurationChange);
162
+ audio.removeEventListener('canplay', onCanPlay);
163
+ audio.removeEventListener('waiting', onWaiting);
156
164
  };
157
165
  }, []);
158
166
  // FIX: ref-копия isDragging для замыкания в timeupdate (без перепривязки слушателей)
@@ -171,10 +179,13 @@ const Audio = ({ url }) => {
171
179
  return 'M3 9h4l5-5v16l-5-5H3V9zm13.5 3a4.5 4.5 0 0 0-2.5-4v8a4.5 4.5 0 0 0 2.5-4zm-2.5-7a7 7 0 0 1 0 14V14a5 5 0 0 0 0-10V5z';
172
180
  }, [isMuted, volume]);
173
181
  return (react_1.default.createElement("div", { className: b() },
174
- react_1.default.createElement("audio", { ref: audioRef, src: url, preload: "auto" }),
175
- react_1.default.createElement("button", { className: b('play-btn'), onClick: togglePlay, "aria-label": isPlaying ? 'Pause' : 'Play', type: "button" }, isPlaying ? (react_1.default.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
176
- react_1.default.createElement("path", { d: "M6 19h4V5H6v14zm8-14v14h4V5h-4z" }))) : (react_1.default.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
177
- react_1.default.createElement("path", { d: "M8 5v14l11-7z" })))),
182
+ react_1.default.createElement("audio", { ref: audioRef, src: url, preload: "metadata" }),
183
+ react_1.default.createElement("button", { className: b('play-btn', { loading: isLoading }), onClick: togglePlay, "aria-label": isPlaying ? 'Pause' : 'Play', type: "button" },
184
+ isLoading && react_1.default.createElement("span", { className: b('spinner') }),
185
+ !isLoading &&
186
+ (isPlaying ? (react_1.default.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
187
+ react_1.default.createElement("path", { d: "M6 19h4V5H6v14zm8-14v14h4V5h-4z" }))) : (react_1.default.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
188
+ react_1.default.createElement("path", { d: "M8 5v14l11-7z" }))))),
178
189
  react_1.default.createElement("div", { className: b('timeline') },
179
190
  react_1.default.createElement("div", { ref: progressRef, className: b('progress-bar'),
180
191
  // FIX: убран onClick — onMouseDown уже обрабатывает клик без дублирования
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { ScienceSuggestBlockProps } from '../../models';
3
+ declare const _default: React.MemoExoticComponent<({ items }: ScienceSuggestBlockProps) => JSX.Element>;
4
+ export default _default;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importDefault(require("react"));
5
+ const sub_blocks_1 = require("../../sub-blocks");
6
+ const Slider_1 = tslib_1.__importDefault(require("../Slider/Slider"));
7
+ const i18n_1 = require("./i18n");
8
+ const slidesToShow = { xl: 3, lg: 2, sm: 1 };
9
+ const ScienceSuggestBlock = ({ items }) => {
10
+ return (react_1.default.createElement(Slider_1.default, { slidesToShow: slidesToShow, title: { text: (0, i18n_1.i18n)('title') } }, items.map((item) => (react_1.default.createElement(sub_blocks_1.NewPostCard, Object.assign({ key: item.slug }, item))))));
11
+ };
12
+ exports.default = react_1.default.memo(ScienceSuggestBlock);
@@ -0,0 +1,3 @@
1
+ {
2
+ "title": "See also"
3
+ }
@@ -0,0 +1 @@
1
+ export declare const i18n: (key: "title", params?: import("@gravity-ui/i18n").Params | undefined) => string;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.i18n = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const i18n_1 = require("@gravity-ui/uikit/i18n");
6
+ const cn_1 = require("../../../utils/cn");
7
+ const en_json_1 = tslib_1.__importDefault(require("./en.json"));
8
+ const ru_json_1 = tslib_1.__importDefault(require("./ru.json"));
9
+ exports.i18n = (0, i18n_1.addComponentKeysets)({ en: en_json_1.default, ru: ru_json_1.default }, `${cn_1.NAMESPACE}ScienceSuggestBlock`);
@@ -0,0 +1,3 @@
1
+ {
2
+ "title": "См. также"
3
+ }
@@ -0,0 +1,51 @@
1
+ export declare const ScienceSuggestBlock: {
2
+ 'science-suggest-block': {
3
+ additionalProperties: boolean;
4
+ required: string[];
5
+ properties: {
6
+ items: {
7
+ type: string;
8
+ items: {
9
+ additionalProperties: boolean;
10
+ required: never[];
11
+ properties: {
12
+ slug: {
13
+ type: string;
14
+ };
15
+ url: {
16
+ type: string;
17
+ };
18
+ title: {
19
+ type: string;
20
+ };
21
+ date: {
22
+ type: string;
23
+ };
24
+ readingTime: {
25
+ type: string;
26
+ };
27
+ image: {
28
+ type: string;
29
+ };
30
+ description: {
31
+ type: string;
32
+ };
33
+ topic: {
34
+ type: string;
35
+ };
36
+ author: {
37
+ type: string;
38
+ };
39
+ pinned: {
40
+ type: string;
41
+ };
42
+ };
43
+ };
44
+ };
45
+ type: {};
46
+ when: {
47
+ type: string;
48
+ };
49
+ };
50
+ };
51
+ };
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScienceSuggestBlock = void 0;
4
+ const common_1 = require("../../schema/validators/common");
5
+ const schema_1 = require("../../sub-blocks/NewPostCard/schema");
6
+ exports.ScienceSuggestBlock = {
7
+ 'science-suggest-block': {
8
+ additionalProperties: false,
9
+ required: ['items'],
10
+ properties: Object.assign(Object.assign({}, common_1.BaseProps), { items: {
11
+ type: 'array',
12
+ items: {
13
+ additionalProperties: false,
14
+ required: [],
15
+ properties: schema_1.NewPostCardProps,
16
+ },
17
+ } }),
18
+ },
19
+ };
@@ -53,3 +53,4 @@ export { default as BenchmarkBlock } from './Benchmark/Benchmark';
53
53
  export { default as SidebarWidgetBlock } from './SidebarWidget/SidebarWidget';
54
54
  export { default as CatBlock } from './Cat/Cat';
55
55
  export { default as AudioBlock } from './Audio/Audio';
56
+ export { default as ScienceSuggestBlock } from './ScienceSuggest/ScienceSuggest';
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.HighlightTableBlock = exports.PressReleasesBlock = exports.RelevantReportsBlock = exports.RelevantReportsCardsBlock = exports.RelevantPostsBlock = exports.ScienceFeedBlock = exports.BlogFeedBlock = exports.EventsSectionBlock = exports.ResourceHubPostsBlock = exports.EventsFeedBlock = exports.LinkTableBlock = exports.FormWallBlock = exports.ReportsSectionsBlock = exports.ReportsCardsBlock = exports.AboutHeaderBlock = exports.ScienceHeaderBlock = exports.ReportsBlock = exports.QuotesBlock = exports.ServicesBlock = exports.SolutionsBlock = exports.MarqueeLinksBlock = exports.FormBlock = exports.FilterCardLayoutBlock = exports.FilterBlock = exports.ShareBlock = exports.BannerMinifyBlock = exports.ContentLayoutBlock = exports.CardLayoutBlock = exports.HeaderSliderBlock = exports.IconsBlock = exports.HeaderMinifyBlock = exports.HeaderBlock = exports.TabLinksBlock = exports.TabsHighlightTableBlock = exports.TabsBlock = exports.TableBlock = exports.QuestionsBlock = exports.ScrollerBlock = exports.BenefitsBlock = exports.AdvantagesBlock = exports.PromoFeaturesBlock = exports.ExtendedFeaturesBlock = exports.SliderNewBlock = exports.SliderBlock = exports.MapBlock = exports.MediaBlock = exports.InfoBlock = exports.CompaniesBlock = exports.LogoRotatorBlock = exports.BannerBlock = void 0;
7
- exports.AudioBlock = exports.CatBlock = exports.SidebarWidgetBlock = exports.BenchmarkBlock = exports.MiniCaseBlock = void 0;
7
+ exports.ScienceSuggestBlock = exports.AudioBlock = exports.CatBlock = exports.SidebarWidgetBlock = exports.BenchmarkBlock = exports.MiniCaseBlock = void 0;
8
8
  var Banner_1 = require("./Banner/Banner");
9
9
  Object.defineProperty(exports, "BannerBlock", { enumerable: true, get: function () { return __importDefault(Banner_1).default; } });
10
10
  var LogoRotator_1 = require("./LogoRotator/LogoRotator");
@@ -115,3 +115,5 @@ var Cat_1 = require("./Cat/Cat");
115
115
  Object.defineProperty(exports, "CatBlock", { enumerable: true, get: function () { return __importDefault(Cat_1).default; } });
116
116
  var Audio_1 = require("./Audio/Audio");
117
117
  Object.defineProperty(exports, "AudioBlock", { enumerable: true, get: function () { return __importDefault(Audio_1).default; } });
118
+ var ScienceSuggest_1 = require("./ScienceSuggest/ScienceSuggest");
119
+ Object.defineProperty(exports, "ScienceSuggestBlock", { enumerable: true, get: function () { return __importDefault(ScienceSuggest_1).default; } });
@@ -46,6 +46,7 @@ export declare const blockMap: {
46
46
  "quotes-block": ({ theme: localTheme, items, background, backgroundColor, }: import("./models").QuotesBlockProps) => JSX.Element;
47
47
  "reports-block": ({ title, typeKey, empty }: import("./models").ReportsBlockProps) => JSX.Element;
48
48
  "science-header-block": import("react").MemoExoticComponent<({ topic, title, description, author, date, readingTime, image, shareOptions, shareUrl, }: import("./models").ScienceHeaderBlockProps) => JSX.Element>;
49
+ "science-suggest-block": import("react").MemoExoticComponent<({ items }: import("./models").ScienceSuggestBlockProps) => JSX.Element>;
49
50
  "about-header-block": import("react").MemoExoticComponent<({ title, text, caption, image, logo }: import("./models").AboutHeaderBlockProps) => JSX.Element>;
50
51
  "sidebar-widget-block": ({ image, title, text, url, blank }: import("./models").SidebarWidgetBlockProps) => JSX.Element;
51
52
  "reports-cards-block": ({ title, typeKey, postscript, empty }: import("./models").ReportsCardsBlockProps) => JSX.Element;
@@ -55,6 +55,7 @@ exports.blockMap = {
55
55
  [models_1.BlockType.QuotesBlock]: blocks_1.QuotesBlock,
56
56
  [models_1.BlockType.ReportsBlock]: blocks_1.ReportsBlock,
57
57
  [models_1.BlockType.ScienceHeaderBlock]: blocks_1.ScienceHeaderBlock,
58
+ [models_1.BlockType.ScienceSuggestBlock]: blocks_1.ScienceSuggestBlock,
58
59
  [models_1.BlockType.AboutHeaderBlock]: blocks_1.AboutHeaderBlock,
59
60
  [models_1.BlockType.SidebarWidgetBlock]: blocks_1.SidebarWidgetBlock,
60
61
  [models_1.BlockType.ReportsCardsBlock]: blocks_1.ReportsCardsBlock,
@@ -5,7 +5,7 @@ import { GridColumnSize, GridColumnSizesType, IndentValue } from '../../grid/typ
5
5
  import { BlockBackgroundType, ThemeSupporting } from '../../utils';
6
6
  import { AnalyticsEventsBase } from '../common';
7
7
  import { AnchorProps, Animatable, BackgroundImageProps, ButtonProps, CardBorder, ContentSize, ContentTextSize, ContentTheme, FileLinkProps, HeaderBreadCrumbsProps, HeaderImageSize, HeaderOffset, HeaderWidth, ImageDeviceProps, ImageProps, Justify, LegendTableMarkerType, LinkProps, MapProps, MediaDirection, MediaProps, MediaView, ReportFileType, TagProps, TextSize, TextTheme, Themable, ThemedImage, ThemedMediaProps, ThemedMediaVideoProps, TitleItemBaseProps, TitleItemProps, TitleTextSize, WithBorder, YandexFormProps } from './common';
8
- import { BannerCardProps, HubspotFormProps, SubBlock, SubBlockModels } from './sub-blocks';
8
+ import { BannerCardProps, HubspotFormProps, NewPostCardProps, SubBlock, SubBlockModels } from './sub-blocks';
9
9
  export declare enum BlockType {
10
10
  AdvantagesBlock = "advantages-block",
11
11
  BenefitsBlock = "benefits-block",
@@ -61,7 +61,8 @@ export declare enum BlockType {
61
61
  BenchmarkBlock = "benchmark-block",
62
62
  SidebarWidgetBlock = "sidebar-widget-block",
63
63
  CatBlock = "cat-block",
64
- AudioBlock = "audio-block"
64
+ AudioBlock = "audio-block",
65
+ ScienceSuggestBlock = "science-suggest-block"
65
66
  }
66
67
  export declare const BlockTypes: BlockType[];
67
68
  export declare const HeaderBlockTypes: BlockType[];
@@ -769,6 +770,9 @@ export interface ScienceHeaderBlockProps {
769
770
  shareOptions?: ShareOptions[];
770
771
  shareUrl?: string;
771
772
  }
773
+ export interface ScienceSuggestBlockProps {
774
+ items: NewPostCardProps[];
775
+ }
772
776
  export interface AboutHeaderBlockProps {
773
777
  title: string;
774
778
  text?: string;
@@ -887,6 +891,9 @@ export type ReportsBlockModel = {
887
891
  export type ScienceHeaderBlockModel = {
888
892
  type: BlockType.ScienceHeaderBlock;
889
893
  } & ScienceHeaderBlockProps;
894
+ export type ScienceSuggestBlockModel = {
895
+ type: BlockType.ScienceSuggestBlock;
896
+ } & ScienceSuggestBlockProps;
890
897
  export type AboutHeaderBlockModel = {
891
898
  type: BlockType.AboutHeaderBlock;
892
899
  } & AboutHeaderBlockProps;
@@ -941,6 +948,6 @@ export type SliderNewBlockModel = {
941
948
  export type SidebarWidgetBlockModel = {
942
949
  type: BlockType.SidebarWidgetBlock;
943
950
  } & SidebarWidgetBlockProps;
944
- type BlockModels = SliderBlockModel | ExtendedFeaturesBlockModel | PromoFeaturesBlockModel | QuestionsBlockModel | BannerBlockModel | LogoRotatorBlockModel | AdvantagesBlockModel | BenefitsBlockModel | ScrollerBlockModel | CompaniesBlockModel | MediaBlockModel | MapBlockModel | InfoBlockModel | TableBlockModel | HighlightTableBlockModel | MiniCaseBlockModel | TabsBlockModel | TabsHighlightTableBlockModel | TabLinksBlockModel | HeaderBlockModel | HeaderMinifyBlockModel | IconsBlockModel | HeaderSliderBlockModel | CardLayoutBlockModel | ContentLayoutBlockModel | BannerMinifyBlockModel | ShareBLockModel | FilterBlockModel | FilterCardLayoutBlockModel | FormBlockModel | MarqueeLinksBlockModel | SolutionsBlockModel | ServicesBlockModel | QuotesBlockModel | ReportsBlockModel | ScienceHeaderBlockModel | AboutHeaderBlockModel | ReportsCardsBlockModel | ReportsSectionsBlockModel | LinkTableBlockModel | EventsFeedBlockModel | ResourceHubPostsBlockModel | BenchmarkBlockModel | EventsSectionBlockModel | BlogFeedBlockModel | ScienceFeedBlockModel | RelevantPostsBlockModel | RelevantReportsCardsBlockModel | RelevantReportsBlockModel | PressReleasesBlockModel | FormWallBlockModel | SliderNewBlockModel | SidebarWidgetBlockModel | CatBlockModel | AudioBlockModel;
951
+ type BlockModels = SliderBlockModel | ExtendedFeaturesBlockModel | PromoFeaturesBlockModel | QuestionsBlockModel | BannerBlockModel | LogoRotatorBlockModel | AdvantagesBlockModel | BenefitsBlockModel | ScrollerBlockModel | CompaniesBlockModel | MediaBlockModel | MapBlockModel | InfoBlockModel | TableBlockModel | HighlightTableBlockModel | MiniCaseBlockModel | TabsBlockModel | TabsHighlightTableBlockModel | TabLinksBlockModel | HeaderBlockModel | HeaderMinifyBlockModel | IconsBlockModel | HeaderSliderBlockModel | CardLayoutBlockModel | ContentLayoutBlockModel | BannerMinifyBlockModel | ShareBLockModel | FilterBlockModel | FilterCardLayoutBlockModel | FormBlockModel | MarqueeLinksBlockModel | SolutionsBlockModel | ServicesBlockModel | QuotesBlockModel | ReportsBlockModel | ScienceHeaderBlockModel | AboutHeaderBlockModel | ReportsCardsBlockModel | ReportsSectionsBlockModel | LinkTableBlockModel | EventsFeedBlockModel | ResourceHubPostsBlockModel | BenchmarkBlockModel | EventsSectionBlockModel | BlogFeedBlockModel | ScienceFeedBlockModel | RelevantPostsBlockModel | RelevantReportsCardsBlockModel | RelevantReportsBlockModel | PressReleasesBlockModel | FormWallBlockModel | SliderNewBlockModel | SidebarWidgetBlockModel | CatBlockModel | AudioBlockModel | ScienceSuggestBlockModel;
945
952
  export type Block = BlockModels & BlockBaseProps;
946
953
  export {};
@@ -58,6 +58,7 @@ var BlockType;
58
58
  BlockType["SidebarWidgetBlock"] = "sidebar-widget-block";
59
59
  BlockType["CatBlock"] = "cat-block";
60
60
  BlockType["AudioBlock"] = "audio-block";
61
+ BlockType["ScienceSuggestBlock"] = "science-suggest-block";
61
62
  })(BlockType = exports.BlockType || (exports.BlockType = {}));
62
63
  exports.BlockTypes = Object.values(BlockType);
63
64
  exports.HeaderBlockTypes = [
@@ -3805,6 +3805,7 @@ export declare const cardSchemas: {
3805
3805
  optionName: string;
3806
3806
  } | {
3807
3807
  optionName: string;
3808
+ /** @deprecated */
3808
3809
  type: string;
3809
3810
  additionalProperties: boolean;
3810
3811
  required: string[];
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.constructorCardSchemaNames = exports.constructorBlockSchemaNames = exports.cardSchemas = exports.blockSchemas = void 0;
4
4
  const blocks_1 = require("./validators/blocks");
5
5
  const sub_blocks_1 = require("./validators/sub-blocks");
6
- exports.blockSchemas = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, sub_blocks_1.Divider), blocks_1.ExtendedFeaturesBlock), blocks_1.PromoFeaturesBlock), blocks_1.AdvantagesBlock), blocks_1.BenefitsBlock), blocks_1.ScrollerBlock), blocks_1.SliderBlock), blocks_1.QuestionsBlock), blocks_1.HeaderBlock), blocks_1.HeaderMinifyBlock), blocks_1.BannerBlock), blocks_1.LogoRotatorBlock), blocks_1.CompaniesBlock), blocks_1.MediaBlock), blocks_1.MapBlock), blocks_1.InfoBlock), blocks_1.TableBlock), blocks_1.HighlightTableBlock), blocks_1.MiniCaseBlock), blocks_1.TabsBlock), blocks_1.TabsHighlightTableBlock), blocks_1.TabLinksBlock), blocks_1.HeaderSliderBlock), blocks_1.IconsBlock), blocks_1.CardLayoutBlock), blocks_1.ContentLayoutBlock), blocks_1.BannerMinifyBlock), blocks_1.ShareBlock), blocks_1.FilterBlock), blocks_1.FilterCardLayoutBlock), blocks_1.FormBlock), blocks_1.SliderNewBlock), blocks_1.MarqueeLinksBlock), blocks_1.SolutionsBlock), blocks_1.ServicesBlock), blocks_1.QuotesBlock), blocks_1.ReportsBlock), blocks_1.ScienceHeaderBlock), blocks_1.AboutHeaderBlock), blocks_1.SidebarWidgetBlock), blocks_1.ReportsCardsBlock), blocks_1.ReportsSectionsBlock), blocks_1.LinkTableBlock), blocks_1.EventsFeedBlock), blocks_1.ResourceHubPostsBlock), blocks_1.BenchmarkBlock), blocks_1.EventsSectionBlock), blocks_1.BlogFeedBlock), blocks_1.ScienceFeedBlock), blocks_1.RelevantPostsBlock), blocks_1.RelevantReportsCardsBlock), blocks_1.RelevantReportsBlock), blocks_1.PressReleasesBlock), blocks_1.FormWallBlock), blocks_1.CatBlock), blocks_1.AudioBlock);
6
+ exports.blockSchemas = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, sub_blocks_1.Divider), blocks_1.ExtendedFeaturesBlock), blocks_1.PromoFeaturesBlock), blocks_1.AdvantagesBlock), blocks_1.BenefitsBlock), blocks_1.ScrollerBlock), blocks_1.SliderBlock), blocks_1.QuestionsBlock), blocks_1.HeaderBlock), blocks_1.HeaderMinifyBlock), blocks_1.BannerBlock), blocks_1.LogoRotatorBlock), blocks_1.CompaniesBlock), blocks_1.MediaBlock), blocks_1.MapBlock), blocks_1.InfoBlock), blocks_1.TableBlock), blocks_1.HighlightTableBlock), blocks_1.MiniCaseBlock), blocks_1.TabsBlock), blocks_1.TabsHighlightTableBlock), blocks_1.TabLinksBlock), blocks_1.HeaderSliderBlock), blocks_1.IconsBlock), blocks_1.CardLayoutBlock), blocks_1.ContentLayoutBlock), blocks_1.BannerMinifyBlock), blocks_1.ShareBlock), blocks_1.FilterBlock), blocks_1.FilterCardLayoutBlock), blocks_1.FormBlock), blocks_1.SliderNewBlock), blocks_1.MarqueeLinksBlock), blocks_1.SolutionsBlock), blocks_1.ServicesBlock), blocks_1.QuotesBlock), blocks_1.ReportsBlock), blocks_1.ScienceHeaderBlock), blocks_1.AboutHeaderBlock), blocks_1.SidebarWidgetBlock), blocks_1.ReportsCardsBlock), blocks_1.ReportsSectionsBlock), blocks_1.LinkTableBlock), blocks_1.EventsFeedBlock), blocks_1.ResourceHubPostsBlock), blocks_1.BenchmarkBlock), blocks_1.EventsSectionBlock), blocks_1.BlogFeedBlock), blocks_1.ScienceFeedBlock), blocks_1.RelevantPostsBlock), blocks_1.RelevantReportsCardsBlock), blocks_1.RelevantReportsBlock), blocks_1.PressReleasesBlock), blocks_1.FormWallBlock), blocks_1.CatBlock), blocks_1.AudioBlock), blocks_1.ScienceSuggestBlock);
7
7
  exports.cardSchemas = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, sub_blocks_1.MediaCardBlock), blocks_1.BannerCard), sub_blocks_1.PriceDetailedBlock), sub_blocks_1.BackgroundCard), sub_blocks_1.Quote), sub_blocks_1.BasicCard), sub_blocks_1.PriceCardBlock), sub_blocks_1.ImageCard), sub_blocks_1.ContentLayoutCard), sub_blocks_1.Card), sub_blocks_1.PostCard), sub_blocks_1.NewPostCard), sub_blocks_1.FeedCard), sub_blocks_1.EventPersonCard), sub_blocks_1.AttachmentCard), sub_blocks_1.CaseStudyCard), sub_blocks_1.StoryCard);
8
8
  exports.constructorBlockSchemaNames = [
9
9
  'divider',
@@ -66,6 +66,7 @@ exports.constructorBlockSchemaNames = [
66
66
  'about-header-block',
67
67
  'cat-block',
68
68
  'audio-block',
69
+ 'science-suggest-block',
69
70
  ];
70
71
  exports.constructorCardSchemaNames = [
71
72
  'media-card',
@@ -53,3 +53,4 @@ export * from '../../blocks/AboutHeader/schema';
53
53
  export * from '../../blocks/SidebarWidget/schema';
54
54
  export * from '../../blocks/Cat/schema';
55
55
  export * from '../../blocks/Audio/schema';
56
+ export * from '../../blocks/ScienceSuggest/schema';
@@ -56,3 +56,4 @@ tslib_1.__exportStar(require("../../blocks/AboutHeader/schema"), exports);
56
56
  tslib_1.__exportStar(require("../../blocks/SidebarWidget/schema"), exports);
57
57
  tslib_1.__exportStar(require("../../blocks/Cat/schema"), exports);
58
58
  tslib_1.__exportStar(require("../../blocks/Audio/schema"), exports);
59
+ tslib_1.__exportStar(require("../../blocks/ScienceSuggest/schema"), exports);
@@ -1,3 +1,35 @@
1
+ export declare const NewPostCardProps: {
2
+ slug: {
3
+ type: string;
4
+ };
5
+ url: {
6
+ type: string;
7
+ };
8
+ title: {
9
+ type: string;
10
+ };
11
+ date: {
12
+ type: string;
13
+ };
14
+ readingTime: {
15
+ type: string;
16
+ };
17
+ image: {
18
+ type: string;
19
+ };
20
+ description: {
21
+ type: string;
22
+ };
23
+ topic: {
24
+ type: string;
25
+ };
26
+ author: {
27
+ type: string;
28
+ };
29
+ pinned: {
30
+ type: string;
31
+ };
32
+ };
1
33
  export declare const NewPostCard: {
2
34
  'new-post-card': {
3
35
  additionalProperties: boolean;
@@ -1,31 +1,43 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NewPostCard = void 0;
3
+ exports.NewPostCard = exports.NewPostCardProps = void 0;
4
4
  const common_1 = require("../../schema/validators/common");
5
+ exports.NewPostCardProps = {
6
+ slug: {
7
+ type: 'string',
8
+ },
9
+ url: {
10
+ type: 'string',
11
+ },
12
+ title: {
13
+ type: 'string',
14
+ },
15
+ date: {
16
+ type: 'string',
17
+ },
18
+ readingTime: {
19
+ type: 'number',
20
+ },
21
+ image: {
22
+ type: 'string',
23
+ },
24
+ description: {
25
+ type: 'string',
26
+ },
27
+ topic: {
28
+ type: 'string',
29
+ },
30
+ author: {
31
+ type: 'string',
32
+ },
33
+ pinned: {
34
+ type: 'boolean',
35
+ },
36
+ };
5
37
  exports.NewPostCard = {
6
38
  'new-post-card': {
7
39
  additionalProperties: false,
8
40
  required: [],
9
- properties: Object.assign(Object.assign({}, common_1.BaseProps), { slug: {
10
- type: 'string',
11
- }, url: {
12
- type: 'string',
13
- }, title: {
14
- type: 'string',
15
- }, date: {
16
- type: 'string',
17
- }, readingTime: {
18
- type: 'number',
19
- }, image: {
20
- type: 'string',
21
- }, description: {
22
- type: 'string',
23
- }, topic: {
24
- type: 'string',
25
- }, author: {
26
- type: 'string',
27
- }, pinned: {
28
- type: 'boolean',
29
- } }),
41
+ properties: Object.assign(Object.assign({}, common_1.BaseProps), exports.NewPostCardProps),
30
42
  },
31
43
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { HTML, Image } from '../../components';
2
+ import { Image, YFMWrapper } from '../../components';
3
3
  import { Col, Row } from '../../grid';
4
4
  import { block } from '../../utils/cn';
5
5
  import './AboutHeader.css';
@@ -17,6 +17,6 @@ const AboutHeaderBlock = ({ title, text, caption, image, logo }) => {
17
17
  React.createElement("div", { className: b('wrap') },
18
18
  React.createElement("div", { className: b('caption') }, caption),
19
19
  React.createElement(Image, { src: logo, className: b('logo') })),
20
- text && React.createElement(HTML, { className: b('text') }, text))))));
20
+ text && (React.createElement(YFMWrapper, { content: text, modifiers: { constructor: true }, className: b('text') })))))));
21
21
  };
22
22
  export default React.memo(AboutHeaderBlock);
@@ -20,8 +20,10 @@ export const Audio = ({ url }) => {
20
20
  const [duration, setDuration] = useState(0);
21
21
  const [volume, setVolume] = useState(1);
22
22
  const [isDragging, setIsDragging] = useState(false);
23
+ const [isLoading, setIsLoading] = useState(true);
23
24
  // FIX: сброс состояния при смене url
24
25
  useEffect(() => {
26
+ setIsLoading(true);
25
27
  setCurrentTime(0);
26
28
  setDuration(0);
27
29
  setIsPlaying(false);
@@ -138,11 +140,15 @@ export const Audio = ({ url }) => {
138
140
  }
139
141
  };
140
142
  const onDurationChange = () => setDuration(audio.duration);
143
+ const onCanPlay = () => setIsLoading(false);
144
+ const onWaiting = () => setIsLoading(true);
141
145
  audio.addEventListener('play', onPlay);
142
146
  audio.addEventListener('pause', onPause);
143
147
  audio.addEventListener('ended', onEnded);
144
148
  audio.addEventListener('timeupdate', onTimeUpdate);
145
149
  audio.addEventListener('durationchange', onDurationChange);
150
+ audio.addEventListener('canplay', onCanPlay);
151
+ audio.addEventListener('waiting', onWaiting);
146
152
  // eslint-disable-next-line consistent-return
147
153
  return () => {
148
154
  audio.removeEventListener('play', onPlay);
@@ -150,6 +156,8 @@ export const Audio = ({ url }) => {
150
156
  audio.removeEventListener('ended', onEnded);
151
157
  audio.removeEventListener('timeupdate', onTimeUpdate);
152
158
  audio.removeEventListener('durationchange', onDurationChange);
159
+ audio.removeEventListener('canplay', onCanPlay);
160
+ audio.removeEventListener('waiting', onWaiting);
153
161
  };
154
162
  }, []);
155
163
  // FIX: ref-копия isDragging для замыкания в timeupdate (без перепривязки слушателей)
@@ -168,10 +176,13 @@ export const Audio = ({ url }) => {
168
176
  return 'M3 9h4l5-5v16l-5-5H3V9zm13.5 3a4.5 4.5 0 0 0-2.5-4v8a4.5 4.5 0 0 0 2.5-4zm-2.5-7a7 7 0 0 1 0 14V14a5 5 0 0 0 0-10V5z';
169
177
  }, [isMuted, volume]);
170
178
  return (React.createElement("div", { className: b() },
171
- React.createElement("audio", { ref: audioRef, src: url, preload: "auto" }),
172
- React.createElement("button", { className: b('play-btn'), onClick: togglePlay, "aria-label": isPlaying ? 'Pause' : 'Play', type: "button" }, isPlaying ? (React.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
173
- React.createElement("path", { d: "M6 19h4V5H6v14zm8-14v14h4V5h-4z" }))) : (React.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
174
- React.createElement("path", { d: "M8 5v14l11-7z" })))),
179
+ React.createElement("audio", { ref: audioRef, src: url, preload: "metadata" }),
180
+ React.createElement("button", { className: b('play-btn', { loading: isLoading }), onClick: togglePlay, "aria-label": isPlaying ? 'Pause' : 'Play', type: "button" },
181
+ isLoading && React.createElement("span", { className: b('spinner') }),
182
+ !isLoading &&
183
+ (isPlaying ? (React.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
184
+ React.createElement("path", { d: "M6 19h4V5H6v14zm8-14v14h4V5h-4z" }))) : (React.createElement("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20" },
185
+ React.createElement("path", { d: "M8 5v14l11-7z" }))))),
175
186
  React.createElement("div", { className: b('timeline') },
176
187
  React.createElement("div", { ref: progressRef, className: b('progress-bar'),
177
188
  // FIX: убран onClick — onMouseDown уже обрабатывает клик без дублирования
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { ScienceSuggestBlockProps } from '../../models';
3
+ declare const _default: React.MemoExoticComponent<({ items }: ScienceSuggestBlockProps) => JSX.Element>;
4
+ export default _default;
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { NewPostCard } from '../../sub-blocks';
3
+ import SliderBlock from '../Slider/Slider';
4
+ import { i18n } from './i18n';
5
+ const slidesToShow = { xl: 3, lg: 2, sm: 1 };
6
+ const ScienceSuggestBlock = ({ items }) => {
7
+ return (React.createElement(SliderBlock, { slidesToShow: slidesToShow, title: { text: i18n('title') } }, items.map((item) => (React.createElement(NewPostCard, Object.assign({ key: item.slug }, item))))));
8
+ };
9
+ export default React.memo(ScienceSuggestBlock);
@@ -0,0 +1,3 @@
1
+ {
2
+ "title": "See also"
3
+ }
@@ -0,0 +1 @@
1
+ export declare const i18n: (key: "title", params?: import("@gravity-ui/i18n").Params | undefined) => string;
@@ -0,0 +1,5 @@
1
+ import { addComponentKeysets } from '@gravity-ui/uikit/i18n';
2
+ import { NAMESPACE } from '../../../utils/cn';
3
+ import en from './en.json';
4
+ import ru from './ru.json';
5
+ export const i18n = addComponentKeysets({ en, ru }, `${NAMESPACE}ScienceSuggestBlock`);
@@ -0,0 +1,3 @@
1
+ {
2
+ "title": "См. также"
3
+ }
@@ -0,0 +1,51 @@
1
+ export declare const ScienceSuggestBlock: {
2
+ 'science-suggest-block': {
3
+ additionalProperties: boolean;
4
+ required: string[];
5
+ properties: {
6
+ items: {
7
+ type: string;
8
+ items: {
9
+ additionalProperties: boolean;
10
+ required: never[];
11
+ properties: {
12
+ slug: {
13
+ type: string;
14
+ };
15
+ url: {
16
+ type: string;
17
+ };
18
+ title: {
19
+ type: string;
20
+ };
21
+ date: {
22
+ type: string;
23
+ };
24
+ readingTime: {
25
+ type: string;
26
+ };
27
+ image: {
28
+ type: string;
29
+ };
30
+ description: {
31
+ type: string;
32
+ };
33
+ topic: {
34
+ type: string;
35
+ };
36
+ author: {
37
+ type: string;
38
+ };
39
+ pinned: {
40
+ type: string;
41
+ };
42
+ };
43
+ };
44
+ };
45
+ type: {};
46
+ when: {
47
+ type: string;
48
+ };
49
+ };
50
+ };
51
+ };
@@ -0,0 +1,16 @@
1
+ import { BaseProps } from '../../schema/validators/common';
2
+ import { NewPostCardProps } from '../../sub-blocks/NewPostCard/schema';
3
+ export const ScienceSuggestBlock = {
4
+ 'science-suggest-block': {
5
+ additionalProperties: false,
6
+ required: ['items'],
7
+ properties: Object.assign(Object.assign({}, BaseProps), { items: {
8
+ type: 'array',
9
+ items: {
10
+ additionalProperties: false,
11
+ required: [],
12
+ properties: NewPostCardProps,
13
+ },
14
+ } }),
15
+ },
16
+ };
@@ -53,3 +53,4 @@ export { default as BenchmarkBlock } from './Benchmark/Benchmark';
53
53
  export { default as SidebarWidgetBlock } from './SidebarWidget/SidebarWidget';
54
54
  export { default as CatBlock } from './Cat/Cat';
55
55
  export { default as AudioBlock } from './Audio/Audio';
56
+ export { default as ScienceSuggestBlock } from './ScienceSuggest/ScienceSuggest';
@@ -53,3 +53,4 @@ export { default as BenchmarkBlock } from './Benchmark/Benchmark';
53
53
  export { default as SidebarWidgetBlock } from './SidebarWidget/SidebarWidget';
54
54
  export { default as CatBlock } from './Cat/Cat';
55
55
  export { default as AudioBlock } from './Audio/Audio';
56
+ export { default as ScienceSuggestBlock } from './ScienceSuggest/ScienceSuggest';