@gravity-ui/blog-constructor 5.4.1 → 5.5.0-alpha.0
Sign up to get free protection for your applications and to get access to all the features.
- package/build/cjs/blocks/CTA/CTA.d.ts +1 -1
- package/build/cjs/blocks/CTA/CTA.js +5 -4
- package/build/cjs/components/FeedHeader/components/Controls/customRenders.js +1 -1
- package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.css +8 -0
- package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.d.ts +1 -1
- package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js +2 -2
- package/build/cjs/components/Search/Search.js +2 -2
- package/build/cjs/constructor/blocksMap.d.ts +1 -1
- package/build/cjs/containers/BlogPostPage/BlogPostPage.css +7 -0
- package/build/cjs/models/blocks.d.ts +1 -2
- package/build/cjs/utils/common.js +8 -5
- package/build/esm/blocks/CTA/CTA.d.ts +1 -1
- package/build/esm/blocks/CTA/CTA.js +6 -5
- package/build/esm/components/FeedHeader/components/Controls/customRenders.js +1 -1
- package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.css +8 -0
- package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.d.ts +1 -1
- package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js +2 -2
- package/build/esm/components/Search/Search.js +1 -1
- package/build/esm/constructor/blocksMap.d.ts +1 -1
- package/build/esm/containers/BlogPostPage/BlogPostPage.css +7 -0
- package/build/esm/models/blocks.d.ts +1 -2
- package/build/esm/utils/common.js +4 -1
- package/package.json +3 -3
- package/server/models/blocks.d.ts +1 -2
@@ -1,3 +1,3 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { CTAProps } from '../../models/blocks';
|
3
|
-
export declare const CTA: ({ items, paddingTop, paddingBottom }: CTAProps) => React.JSX.Element;
|
3
|
+
export declare const CTA: ({ items, paddingTop, paddingBottom, qa }: CTAProps) => React.JSX.Element;
|
@@ -10,7 +10,7 @@ const paddings_1 = require("../../models/paddings");
|
|
10
10
|
const cn_1 = require("../../utils/cn");
|
11
11
|
const common_1 = require("../../utils/common");
|
12
12
|
const b = (0, cn_1.block)('cta');
|
13
|
-
const CTA = ({ items, paddingTop, paddingBottom }) => {
|
13
|
+
const CTA = ({ items, paddingTop, paddingBottom, qa }) => {
|
14
14
|
/**
|
15
15
|
* @deprecated Metrika will be deleted after launch of analyticsEvents
|
16
16
|
*/
|
@@ -18,18 +18,19 @@ const CTA = ({ items, paddingTop, paddingBottom }) => {
|
|
18
18
|
name: constants_1.BlogMetrikaGoalIds.cta,
|
19
19
|
isCrossSite: true,
|
20
20
|
};
|
21
|
+
const qaAttributes = (0, common_1.getQaAttributes)(qa, 'card');
|
21
22
|
return (react_1.default.createElement(Wrapper_1.Wrapper, { paddings: {
|
22
23
|
[paddings_1.PaddingsDirections.top]: paddingTop,
|
23
24
|
[paddings_1.PaddingsDirections.bottom]: paddingBottom,
|
24
|
-
}, className: b('content'), qa:
|
25
|
+
}, className: b('content'), qa: qaAttributes.wrapper }, items.map((content, index) => {
|
25
26
|
var _a;
|
26
27
|
const contentData = (0, common_1.updateContentSizes)(content);
|
27
28
|
(_a = contentData.links) === null || _a === void 0 ? void 0 : _a.forEach((link) => {
|
28
29
|
// eslint-disable-next-line no-not-accumulator-reassign/no-not-accumulator-reassign
|
29
30
|
link.metrikaGoals = (0, common_1.getBlogElementMetrika)(metrikaGoal, link.metrikaGoals);
|
30
31
|
});
|
31
|
-
return (react_1.default.createElement("div", { key: index, className: b('card'), "data-qa":
|
32
|
-
react_1.default.createElement(page_constructor_1.Content, Object.assign({}, contentData))));
|
32
|
+
return (react_1.default.createElement("div", { key: index, className: b('card'), "data-qa": qaAttributes.card },
|
33
|
+
react_1.default.createElement(page_constructor_1.Content, Object.assign({}, contentData, { qa: qaAttributes.content }))));
|
33
34
|
})));
|
34
35
|
};
|
35
36
|
exports.CTA = CTA;
|
@@ -11,7 +11,7 @@ const CustomSwitcher_1 = require("../CustomSwitcher/CustomSwitcher");
|
|
11
11
|
const b = (0, cn_1.block)('feed-controls');
|
12
12
|
const renderSwitcher = ({ initial, list, defaultLabel }) =>
|
13
13
|
// eslint-disable-next-line react/display-name
|
14
|
-
({ onClick, ref }) => (react_1.default.createElement(CustomSwitcher_1.CustomSwitcher, { initial: initial, defaultLabel: defaultLabel, list: list, controlRef: ref, onClick: onClick }));
|
14
|
+
({ onClick, ref, onKeyDown, open }) => (react_1.default.createElement(CustomSwitcher_1.CustomSwitcher, { initial: initial, defaultLabel: defaultLabel, list: list, controlRef: ref, onClick: onClick, onKeyDown: onKeyDown, open: open }));
|
15
15
|
exports.renderSwitcher = renderSwitcher;
|
16
16
|
const renderFilter = ({ value, ref, onChange, onKeyDown }) => (react_1.default.createElement(uikit_1.TextInput, { controlRef: ref, controlProps: { size: 1 }, value: value, view: "clear", placeholder: (0, i18n_1.i18)(i18n_1.Keyset.Search), onUpdate: onChange, onKeyDown: onKeyDown, className: b('popup-filter') }));
|
17
17
|
exports.renderFilter = renderFilter;
|
@@ -12,6 +12,14 @@ unpredictable css rules order in build */
|
|
12
12
|
border-radius: var(--g-border-radius-xl);
|
13
13
|
width: 100%;
|
14
14
|
line-height: 42px;
|
15
|
+
text-align: initial;
|
16
|
+
}
|
17
|
+
.bc-feed-custom-switcher__custom-switcher:focus {
|
18
|
+
outline: 2px solid var(--g-color-line-focus);
|
19
|
+
outline-offset: 0;
|
20
|
+
}
|
21
|
+
.bc-feed-custom-switcher__custom-switcher:focus:not(:focus-visible) {
|
22
|
+
outline: 0;
|
15
23
|
}
|
16
24
|
.bc-feed-custom-switcher__custom-switcher + .yc-popup.yc-popup_open {
|
17
25
|
position: absolute !important;
|
@@ -8,5 +8,5 @@ export type CustomSwitcherProps = {
|
|
8
8
|
list: SelectItem[];
|
9
9
|
controlRef: RenderControlParameters['ref'];
|
10
10
|
} & Omit<RenderControlParameters, 'ref'>;
|
11
|
-
export declare const CustomSwitcher: ({ initial, defaultLabel, list, onClick, controlRef, }: CustomSwitcherProps) => React.JSX.Element;
|
11
|
+
export declare const CustomSwitcher: ({ initial, defaultLabel, list, onClick, controlRef, onKeyDown, open, }: CustomSwitcherProps) => React.JSX.Element;
|
12
12
|
export {};
|
@@ -8,7 +8,7 @@ const DropdownArrow_1 = require("../../../../icons/DropdownArrow");
|
|
8
8
|
const cn_1 = require("../../../../utils/cn");
|
9
9
|
const b = (0, cn_1.block)('feed-custom-switcher');
|
10
10
|
const ICON_SIZE = 12;
|
11
|
-
const CustomSwitcher = ({ initial, defaultLabel, list, onClick, controlRef, }) => {
|
11
|
+
const CustomSwitcher = ({ initial, defaultLabel, list, onClick, controlRef, onKeyDown, open, }) => {
|
12
12
|
const itemsNames = (0, react_1.useMemo)(() => {
|
13
13
|
const items = list
|
14
14
|
.filter((item) => initial.includes(item.value))
|
@@ -16,7 +16,7 @@ const CustomSwitcher = ({ initial, defaultLabel, list, onClick, controlRef, }) =
|
|
16
16
|
return items.length ? items : [defaultLabel];
|
17
17
|
}, [defaultLabel, initial, list]);
|
18
18
|
const hasCounter = itemsNames.length > 1;
|
19
|
-
return (react_1.default.createElement("
|
19
|
+
return (react_1.default.createElement("button", { className: b('custom-switcher'), onClick: onClick, ref: controlRef, onKeyDown: onKeyDown, "aria-expanded": open },
|
20
20
|
react_1.default.createElement("div", { className: b('custom-switcher-element', { content: true }) }, itemsNames === null || itemsNames === void 0 ? void 0 : itemsNames.join(', ')),
|
21
21
|
hasCounter && (react_1.default.createElement("div", { className: b('custom-switcher-element', { counter: true }) }, itemsNames.length)),
|
22
22
|
react_1.default.createElement("div", { className: b('custom-switcher-element', { arrow: true }) },
|
@@ -4,7 +4,7 @@ exports.Search = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
5
5
|
const react_1 = tslib_1.__importStar(require("react"));
|
6
6
|
const uikit_1 = require("@gravity-ui/uikit");
|
7
|
-
const
|
7
|
+
const debounce_1 = tslib_1.__importDefault(require("lodash/debounce"));
|
8
8
|
const useIsIPhone_1 = require("../../hooks/useIsIPhone");
|
9
9
|
const i18n_1 = require("../../i18n");
|
10
10
|
const Close_1 = require("../../icons/Close");
|
@@ -21,7 +21,7 @@ const AUTOFOCUS_TIMEOUT = 0;
|
|
21
21
|
* @returns {JSX|null}
|
22
22
|
*/
|
23
23
|
const Search = ({ className, initialValue, onSubmit, debounce = 300, placeholder = (0, i18n_1.i18)(i18n_1.Keyset.Search), size = 'm', autoFocus = false, value: externalValue, }) => {
|
24
|
-
const handleChange = (0,
|
24
|
+
const handleChange = (0, debounce_1.default)(onSubmit, debounce);
|
25
25
|
const [value, setValue] = (0, react_1.useState)(initialValue);
|
26
26
|
const inputRef = (0, react_1.useRef)(null);
|
27
27
|
const isIPhone = (0, useIsIPhone_1.useIsIPhone)();
|
@@ -4,7 +4,7 @@ declare const _default: {
|
|
4
4
|
"blog-layout-block": ({ fullWidth, mobileOrder, children, paddingTop, paddingBottom, }: import("react").PropsWithChildren<import("../models/blocks").LayoutProps>) => import("react").JSX.Element;
|
5
5
|
"blog-media-block": ({ text, paddingTop, paddingBottom, ...mediaProps }: import("../models/blocks").MediaProps) => import("react").JSX.Element;
|
6
6
|
"blog-banner-block": ({ color, imageSize, image, paddingTop, paddingBottom, qa, ...content }: import("../models/blocks").BannerProps) => import("react").JSX.Element;
|
7
|
-
"blog-cta-block": ({ items, paddingTop, paddingBottom }: import("../models/blocks").CTAProps) => import("react").JSX.Element;
|
7
|
+
"blog-cta-block": ({ items, paddingTop, paddingBottom, qa }: import("../models/blocks").CTAProps) => import("react").JSX.Element;
|
8
8
|
"blog-colored-text-block": ({ background, paddingTop, paddingBottom, qa, ...content }: import("../models/blocks").ColoredTextProps) => import("react").JSX.Element;
|
9
9
|
"blog-author-block": (props: import("../models/blocks").AuthorProps) => import("react").JSX.Element | null;
|
10
10
|
"blog-suggest-block": ({ paddingTop, paddingBottom }: import("../models/blocks").SuggestProps) => import("react").JSX.Element | null;
|
@@ -194,6 +194,7 @@ unpredictable css rules order in build */
|
|
194
194
|
color: var(--g-color-text-link);
|
195
195
|
text-decoration: none;
|
196
196
|
cursor: pointer;
|
197
|
+
border-radius: var(--g-focus-border-radius);
|
197
198
|
}
|
198
199
|
.utilityfocus .yfm_constructor a:focus {
|
199
200
|
outline: 2px solid #ffdb4d;
|
@@ -202,6 +203,12 @@ unpredictable css rules order in build */
|
|
202
203
|
--pc-text-header-color: var(--g-color-text-link-hover);
|
203
204
|
color: var(--g-color-text-link-hover);
|
204
205
|
}
|
206
|
+
.yfm_constructor a:focus {
|
207
|
+
box-shadow: 0 0 0 2px var(--g-color-line-focus);
|
208
|
+
}
|
209
|
+
.yfm_constructor a:focus:not(:focus-visible) {
|
210
|
+
box-shadow: none;
|
211
|
+
}
|
205
212
|
.yfm_constructor table {
|
206
213
|
color: var(--g-color-text-primary);
|
207
214
|
border: 1px solid var(--g-color-line-generic);
|
@@ -18,9 +18,8 @@ export type ColoredTextProps = ContentBlockProps & QAProps & {
|
|
18
18
|
altText?: string;
|
19
19
|
};
|
20
20
|
} & PaddingsYFMProps;
|
21
|
-
export type CTAProps = {
|
21
|
+
export type CTAProps = QAProps & {
|
22
22
|
items: Array<ContentBlockProps>;
|
23
|
-
columnCount?: number;
|
24
23
|
} & PaddingsYFMProps;
|
25
24
|
export type HeaderProps = HeaderBlockProps & PaddingsYFMProps;
|
26
25
|
export type LayoutProps = {
|
@@ -4,7 +4,10 @@ exports.getQaAttributes = exports.scrollOnPageChange = exports.getFeedQueryParam
|
|
4
4
|
const tslib_1 = require("tslib");
|
5
5
|
const url_1 = require("url");
|
6
6
|
const page_constructor_1 = require("@gravity-ui/page-constructor");
|
7
|
-
const
|
7
|
+
const camelCase_1 = tslib_1.__importDefault(require("lodash/camelCase"));
|
8
|
+
const debounce_1 = tslib_1.__importDefault(require("lodash/debounce"));
|
9
|
+
const flatten_1 = tslib_1.__importDefault(require("lodash/flatten"));
|
10
|
+
const memoize_1 = tslib_1.__importDefault(require("lodash/memoize"));
|
8
11
|
const constants_1 = require("../blocks/constants");
|
9
12
|
const i18n_1 = require("../i18n");
|
10
13
|
const QA_ATTRIBUTES_KEYS = ['container', 'content', 'wrapper', 'image', 'button'];
|
@@ -35,7 +38,7 @@ const scrollToHash = (hash, browser) => {
|
|
35
38
|
setTimeout(() => element.scrollIntoView({ behavior: browser === 'Yandex' ? 'auto' : 'smooth' }), 0);
|
36
39
|
};
|
37
40
|
exports.scrollToHash = scrollToHash;
|
38
|
-
exports.getTags = (0,
|
41
|
+
exports.getTags = (0, memoize_1.default)((tags, prefix) => {
|
39
42
|
return tags.map((_a) => {
|
40
43
|
var { slug } = _a, tag = tslib_1.__rest(_a, ["slug"]);
|
41
44
|
const queryParams = new URLSearchParams();
|
@@ -44,7 +47,7 @@ exports.getTags = (0, lodash_1.memoize)((tags, prefix) => {
|
|
44
47
|
});
|
45
48
|
});
|
46
49
|
const stub = (postId) => postId;
|
47
|
-
exports.postLikeStatus = (0,
|
50
|
+
exports.postLikeStatus = (0, debounce_1.default)((postId, hasUserLike) => {
|
48
51
|
(hasUserLike ? stub : stub)(postId);
|
49
52
|
}, 300);
|
50
53
|
const getTagFilterUrl = (tagId, prefix) => {
|
@@ -117,9 +120,9 @@ exports.scrollOnPageChange = scrollOnPageChange;
|
|
117
120
|
const getQaAttributes = (qa, ...customKeys) => {
|
118
121
|
const attributes = {};
|
119
122
|
if (qa) {
|
120
|
-
const keys = QA_ATTRIBUTES_KEYS.concat((0,
|
123
|
+
const keys = QA_ATTRIBUTES_KEYS.concat((0, flatten_1.default)(customKeys));
|
121
124
|
keys.forEach((key) => {
|
122
|
-
attributes[(0,
|
125
|
+
attributes[(0, camelCase_1.default)(key)] = `${qa}-${key}`;
|
123
126
|
});
|
124
127
|
attributes.default = qa;
|
125
128
|
}
|
@@ -1,4 +1,4 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { CTAProps } from '../../models/blocks';
|
3
3
|
import './CTA.css';
|
4
|
-
export declare const CTA: ({ items, paddingTop, paddingBottom }: CTAProps) => React.JSX.Element;
|
4
|
+
export declare const CTA: ({ items, paddingTop, paddingBottom, qa }: CTAProps) => React.JSX.Element;
|
@@ -4,10 +4,10 @@ import { Wrapper } from '../../components/Wrapper/Wrapper';
|
|
4
4
|
import { BlogMetrikaGoalIds } from '../../constants';
|
5
5
|
import { PaddingsDirections } from '../../models/paddings';
|
6
6
|
import { block } from '../../utils/cn';
|
7
|
-
import { getBlogElementMetrika, updateContentSizes } from '../../utils/common';
|
7
|
+
import { getBlogElementMetrika, getQaAttributes, updateContentSizes } from '../../utils/common';
|
8
8
|
import './CTA.css';
|
9
9
|
const b = block('cta');
|
10
|
-
export const CTA = ({ items, paddingTop, paddingBottom }) => {
|
10
|
+
export const CTA = ({ items, paddingTop, paddingBottom, qa }) => {
|
11
11
|
/**
|
12
12
|
* @deprecated Metrika will be deleted after launch of analyticsEvents
|
13
13
|
*/
|
@@ -15,17 +15,18 @@ export const CTA = ({ items, paddingTop, paddingBottom }) => {
|
|
15
15
|
name: BlogMetrikaGoalIds.cta,
|
16
16
|
isCrossSite: true,
|
17
17
|
};
|
18
|
+
const qaAttributes = getQaAttributes(qa, 'card');
|
18
19
|
return (React.createElement(Wrapper, { paddings: {
|
19
20
|
[PaddingsDirections.top]: paddingTop,
|
20
21
|
[PaddingsDirections.bottom]: paddingBottom,
|
21
|
-
}, className: b('content'), qa:
|
22
|
+
}, className: b('content'), qa: qaAttributes.wrapper }, items.map((content, index) => {
|
22
23
|
var _a;
|
23
24
|
const contentData = updateContentSizes(content);
|
24
25
|
(_a = contentData.links) === null || _a === void 0 ? void 0 : _a.forEach((link) => {
|
25
26
|
// eslint-disable-next-line no-not-accumulator-reassign/no-not-accumulator-reassign
|
26
27
|
link.metrikaGoals = getBlogElementMetrika(metrikaGoal, link.metrikaGoals);
|
27
28
|
});
|
28
|
-
return (React.createElement("div", { key: index, className: b('card'), "data-qa":
|
29
|
-
React.createElement(Content, Object.assign({}, contentData))));
|
29
|
+
return (React.createElement("div", { key: index, className: b('card'), "data-qa": qaAttributes.card },
|
30
|
+
React.createElement(Content, Object.assign({}, contentData, { qa: qaAttributes.content }))));
|
30
31
|
})));
|
31
32
|
};
|
@@ -8,6 +8,6 @@ import './Controls.css';
|
|
8
8
|
const b = block('feed-controls');
|
9
9
|
export const renderSwitcher = ({ initial, list, defaultLabel }) =>
|
10
10
|
// eslint-disable-next-line react/display-name
|
11
|
-
({ onClick, ref }) => (React.createElement(CustomSwitcher, { initial: initial, defaultLabel: defaultLabel, list: list, controlRef: ref, onClick: onClick }));
|
11
|
+
({ onClick, ref, onKeyDown, open }) => (React.createElement(CustomSwitcher, { initial: initial, defaultLabel: defaultLabel, list: list, controlRef: ref, onClick: onClick, onKeyDown: onKeyDown, open: open }));
|
12
12
|
export const renderFilter = ({ value, ref, onChange, onKeyDown }) => (React.createElement(TextInput, { controlRef: ref, controlProps: { size: 1 }, value: value, view: "clear", placeholder: i18(Keyset.Search), onUpdate: onChange, onKeyDown: onKeyDown, className: b('popup-filter') }));
|
13
13
|
export const renderOption = (option) => (React.createElement(CustomSelectOption, { data: option }));
|
@@ -12,6 +12,14 @@ unpredictable css rules order in build */
|
|
12
12
|
border-radius: var(--g-border-radius-xl);
|
13
13
|
width: 100%;
|
14
14
|
line-height: 42px;
|
15
|
+
text-align: initial;
|
16
|
+
}
|
17
|
+
.bc-feed-custom-switcher__custom-switcher:focus {
|
18
|
+
outline: 2px solid var(--g-color-line-focus);
|
19
|
+
outline-offset: 0;
|
20
|
+
}
|
21
|
+
.bc-feed-custom-switcher__custom-switcher:focus:not(:focus-visible) {
|
22
|
+
outline: 0;
|
15
23
|
}
|
16
24
|
.bc-feed-custom-switcher__custom-switcher + .yc-popup.yc-popup_open {
|
17
25
|
position: absolute !important;
|
@@ -9,5 +9,5 @@ export type CustomSwitcherProps = {
|
|
9
9
|
list: SelectItem[];
|
10
10
|
controlRef: RenderControlParameters['ref'];
|
11
11
|
} & Omit<RenderControlParameters, 'ref'>;
|
12
|
-
export declare const CustomSwitcher: ({ initial, defaultLabel, list, onClick, controlRef, }: CustomSwitcherProps) => React.JSX.Element;
|
12
|
+
export declare const CustomSwitcher: ({ initial, defaultLabel, list, onClick, controlRef, onKeyDown, open, }: CustomSwitcherProps) => React.JSX.Element;
|
13
13
|
export {};
|
@@ -5,7 +5,7 @@ import { block } from '../../../../utils/cn';
|
|
5
5
|
import './CustomSwitcher.css';
|
6
6
|
const b = block('feed-custom-switcher');
|
7
7
|
const ICON_SIZE = 12;
|
8
|
-
export const CustomSwitcher = ({ initial, defaultLabel, list, onClick, controlRef, }) => {
|
8
|
+
export const CustomSwitcher = ({ initial, defaultLabel, list, onClick, controlRef, onKeyDown, open, }) => {
|
9
9
|
const itemsNames = useMemo(() => {
|
10
10
|
const items = list
|
11
11
|
.filter((item) => initial.includes(item.value))
|
@@ -13,7 +13,7 @@ export const CustomSwitcher = ({ initial, defaultLabel, list, onClick, controlRe
|
|
13
13
|
return items.length ? items : [defaultLabel];
|
14
14
|
}, [defaultLabel, initial, list]);
|
15
15
|
const hasCounter = itemsNames.length > 1;
|
16
|
-
return (React.createElement("
|
16
|
+
return (React.createElement("button", { className: b('custom-switcher'), onClick: onClick, ref: controlRef, onKeyDown: onKeyDown, "aria-expanded": open },
|
17
17
|
React.createElement("div", { className: b('custom-switcher-element', { content: true }) }, itemsNames === null || itemsNames === void 0 ? void 0 : itemsNames.join(', ')),
|
18
18
|
hasCounter && (React.createElement("div", { className: b('custom-switcher-element', { counter: true }) }, itemsNames.length)),
|
19
19
|
React.createElement("div", { className: b('custom-switcher-element', { arrow: true }) },
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
2
2
|
import { Icon, TextInput } from '@gravity-ui/uikit';
|
3
|
-
import
|
3
|
+
import lodashDebounce from 'lodash/debounce';
|
4
4
|
import { useIsIPhone } from '../../hooks/useIsIPhone';
|
5
5
|
import { Keyset, i18 } from '../../i18n';
|
6
6
|
import { Close } from '../../icons/Close';
|
@@ -4,7 +4,7 @@ declare const _default: {
|
|
4
4
|
"blog-layout-block": ({ fullWidth, mobileOrder, children, paddingTop, paddingBottom, }: import("react").PropsWithChildren<import("../models/blocks").LayoutProps>) => import("react").JSX.Element;
|
5
5
|
"blog-media-block": ({ text, paddingTop, paddingBottom, ...mediaProps }: import("../models/blocks").MediaProps) => import("react").JSX.Element;
|
6
6
|
"blog-banner-block": ({ color, imageSize, image, paddingTop, paddingBottom, qa, ...content }: import("../models/blocks").BannerProps) => import("react").JSX.Element;
|
7
|
-
"blog-cta-block": ({ items, paddingTop, paddingBottom }: import("../models/blocks").CTAProps) => import("react").JSX.Element;
|
7
|
+
"blog-cta-block": ({ items, paddingTop, paddingBottom, qa }: import("../models/blocks").CTAProps) => import("react").JSX.Element;
|
8
8
|
"blog-colored-text-block": ({ background, paddingTop, paddingBottom, qa, ...content }: import("../models/blocks").ColoredTextProps) => import("react").JSX.Element;
|
9
9
|
"blog-author-block": (props: import("../models/blocks").AuthorProps) => import("react").JSX.Element | null;
|
10
10
|
"blog-suggest-block": ({ paddingTop, paddingBottom }: import("../models/blocks").SuggestProps) => import("react").JSX.Element | null;
|
@@ -194,6 +194,7 @@ unpredictable css rules order in build */
|
|
194
194
|
color: var(--g-color-text-link);
|
195
195
|
text-decoration: none;
|
196
196
|
cursor: pointer;
|
197
|
+
border-radius: var(--g-focus-border-radius);
|
197
198
|
}
|
198
199
|
.utilityfocus .yfm_constructor a:focus {
|
199
200
|
outline: 2px solid #ffdb4d;
|
@@ -202,6 +203,12 @@ unpredictable css rules order in build */
|
|
202
203
|
--pc-text-header-color: var(--g-color-text-link-hover);
|
203
204
|
color: var(--g-color-text-link-hover);
|
204
205
|
}
|
206
|
+
.yfm_constructor a:focus {
|
207
|
+
box-shadow: 0 0 0 2px var(--g-color-line-focus);
|
208
|
+
}
|
209
|
+
.yfm_constructor a:focus:not(:focus-visible) {
|
210
|
+
box-shadow: none;
|
211
|
+
}
|
205
212
|
.yfm_constructor table {
|
206
213
|
color: var(--g-color-text-primary);
|
207
214
|
border: 1px solid var(--g-color-line-generic);
|
@@ -18,9 +18,8 @@ export type ColoredTextProps = ContentBlockProps & QAProps & {
|
|
18
18
|
altText?: string;
|
19
19
|
};
|
20
20
|
} & PaddingsYFMProps;
|
21
|
-
export type CTAProps = {
|
21
|
+
export type CTAProps = QAProps & {
|
22
22
|
items: Array<ContentBlockProps>;
|
23
|
-
columnCount?: number;
|
24
23
|
} & PaddingsYFMProps;
|
25
24
|
export type HeaderProps = HeaderBlockProps & PaddingsYFMProps;
|
26
25
|
export type LayoutProps = {
|
@@ -1,7 +1,10 @@
|
|
1
1
|
import { __rest } from "tslib";
|
2
2
|
import { format, parse } from 'url';
|
3
3
|
import { isNewMetrikaFormat, } from '@gravity-ui/page-constructor';
|
4
|
-
import
|
4
|
+
import camelCase from 'lodash/camelCase';
|
5
|
+
import debounce from 'lodash/debounce';
|
6
|
+
import flatten from 'lodash/flatten';
|
7
|
+
import memoize from 'lodash/memoize';
|
5
8
|
import { CONTENT_DEFAULT_COL_SIZES, CONTENT_DEFAULT_SIZE, CONTENT_DEFAULT_THEME, DEFAULT_PAGE, DEFAULT_ROWS_PER_PAGE, } from '../blocks/constants';
|
6
9
|
import { Keyset, i18 } from '../i18n';
|
7
10
|
const QA_ATTRIBUTES_KEYS = ['container', 'content', 'wrapper', 'image', 'button'];
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@gravity-ui/blog-constructor",
|
3
|
-
"version": "5.
|
3
|
+
"version": "5.5.0-alpha.0",
|
4
4
|
"description": "Gravity UI Blog Constructor",
|
5
5
|
"license": "MIT",
|
6
6
|
"repository": {
|
@@ -78,7 +78,7 @@
|
|
78
78
|
},
|
79
79
|
"peerDependencies": {
|
80
80
|
"@doc-tools/transform": "^3.3.2",
|
81
|
-
"@gravity-ui/page-constructor": "^4.0.0",
|
81
|
+
"@gravity-ui/page-constructor": "^4.23.0-alpha.0",
|
82
82
|
"@gravity-ui/uikit": "^5.1.0",
|
83
83
|
"react": "^16.0.0 || ^17.0.0 || ^18.0.0"
|
84
84
|
},
|
@@ -89,7 +89,7 @@
|
|
89
89
|
"@commitlint/config-conventional": "^17.4.3",
|
90
90
|
"@doc-tools/transform": "^3.3.2",
|
91
91
|
"@gravity-ui/eslint-config": "^2.0.0",
|
92
|
-
"@gravity-ui/page-constructor": "^4.
|
92
|
+
"@gravity-ui/page-constructor": "^4.23.0-alpha.0",
|
93
93
|
"@gravity-ui/prettier-config": "^1.0.1",
|
94
94
|
"@gravity-ui/stylelint-config": "^1.0.0",
|
95
95
|
"@gravity-ui/tsconfig": "^1.0.0",
|
@@ -18,9 +18,8 @@ export type ColoredTextProps = ContentBlockProps & QAProps & {
|
|
18
18
|
altText?: string;
|
19
19
|
};
|
20
20
|
} & PaddingsYFMProps;
|
21
|
-
export type CTAProps = {
|
21
|
+
export type CTAProps = QAProps & {
|
22
22
|
items: Array<ContentBlockProps>;
|
23
|
-
columnCount?: number;
|
24
23
|
} & PaddingsYFMProps;
|
25
24
|
export type HeaderProps = HeaderBlockProps & PaddingsYFMProps;
|
26
25
|
export type LayoutProps = {
|