@gravity-ui/page-constructor 3.0.0-alpha.0 → 3.0.0-alpha.2
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.
- package/CHANGELOG.md +19 -0
- package/build/cjs/blocks/ExtendedFeatures/ExtendedFeatures.js +1 -1
- package/build/cjs/blocks/PromoFeaturesBlock/PromoFeaturesBlock.js +2 -2
- package/build/cjs/blocks/Slider/Slider.js +2 -2
- package/build/cjs/blocks/Tabs/Tabs.js +2 -2
- package/build/cjs/components/Anchor/Anchor.d.ts +2 -2
- package/build/cjs/components/Anchor/Anchor.js +1 -1
- package/build/cjs/components/MediaBase/MediaBase.js +2 -2
- package/build/cjs/components/Title/Title.css +8 -103
- package/build/cjs/components/Title/Title.d.ts +5 -8
- package/build/cjs/components/Title/Title.js +15 -50
- package/build/cjs/components/Title/TitleItem.css +111 -0
- package/build/cjs/components/Title/TitleItem.d.ts +10 -0
- package/build/cjs/components/Title/TitleItem.js +57 -0
- package/build/cjs/components/index.d.ts +1 -1
- package/build/cjs/components/index.js +4 -4
- package/build/cjs/grid/Col/Col.d.ts +1 -1
- package/build/cjs/internal-typings/global.d.ts +18 -16
- package/build/cjs/models/constructor-items/blocks.d.ts +8 -8
- package/build/cjs/models/constructor-items/common.d.ts +4 -4
- package/build/cjs/sub-blocks/Content/Content.js +3 -3
- package/build/cjs/sub-blocks/HubspotForm/HubspotFormContainer.d.ts +2 -1
- package/build/cjs/sub-blocks/HubspotForm/HubspotFormContainer.js +5 -2
- package/build/cjs/sub-blocks/HubspotForm/index.d.ts +1 -1
- package/build/cjs/sub-blocks/HubspotForm/index.js +6 -5
- package/build/cjs/text-transform/config.d.ts +2 -2
- package/build/esm/blocks/ExtendedFeatures/ExtendedFeatures.js +2 -2
- package/build/esm/blocks/PromoFeaturesBlock/PromoFeaturesBlock.js +2 -2
- package/build/esm/blocks/Slider/Slider.js +2 -2
- package/build/esm/blocks/Tabs/Tabs.js +2 -2
- package/build/esm/components/Anchor/Anchor.d.ts +2 -2
- package/build/esm/components/Anchor/Anchor.js +1 -1
- package/build/esm/components/MediaBase/MediaBase.js +2 -2
- package/build/esm/components/Title/Title.css +8 -103
- package/build/esm/components/Title/Title.d.ts +5 -8
- package/build/esm/components/Title/Title.js +17 -49
- package/build/esm/components/Title/TitleItem.css +111 -0
- package/build/esm/components/Title/TitleItem.d.ts +11 -0
- package/build/esm/components/Title/TitleItem.js +53 -0
- package/build/esm/components/index.d.ts +1 -1
- package/build/esm/components/index.js +1 -1
- package/build/esm/grid/Col/Col.d.ts +1 -1
- package/build/esm/internal-typings/global.d.ts +18 -16
- package/build/esm/models/constructor-items/blocks.d.ts +8 -8
- package/build/esm/models/constructor-items/common.d.ts +4 -4
- package/build/esm/sub-blocks/Content/Content.js +3 -3
- package/build/esm/sub-blocks/HubspotForm/HubspotFormContainer.d.ts +2 -1
- package/build/esm/sub-blocks/HubspotForm/HubspotFormContainer.js +6 -3
- package/build/esm/sub-blocks/HubspotForm/index.d.ts +1 -1
- package/build/esm/sub-blocks/HubspotForm/index.js +7 -6
- package/build/esm/text-transform/config.d.ts +2 -2
- package/package.json +1 -1
- package/server/models/constructor-items/blocks.d.ts +8 -8
- package/server/models/constructor-items/common.d.ts +4 -4
- package/server/text-transform/config.d.ts +2 -2
- package/build/cjs/components/Anchor/__tests__/Anchor.test.d.ts +0 -1
- package/build/cjs/components/Anchor/__tests__/Anchor.test.js +0 -21
- package/build/cjs/components/AnimateBlock/__tests__/AnimateBlock.test.d.ts +0 -1
- package/build/cjs/components/AnimateBlock/__tests__/AnimateBlock.test.js +0 -36
- package/build/cjs/components/Author/__tests__/Author.test.d.ts +0 -1
- package/build/cjs/components/Author/__tests__/Author.test.js +0 -49
- package/build/cjs/components/BackLink/__tests__/BackLink.test.d.ts +0 -1
- package/build/cjs/components/BackLink/__tests__/BackLink.test.js +0 -63
- package/build/cjs/components/BlockBase/__tests__/BlockBase.test.d.ts +0 -1
- package/build/cjs/components/BlockBase/__tests__/BlockBase.test.js +0 -44
- package/build/cjs/components/BlockHeader/BlockHeader.css +0 -16
- package/build/cjs/components/BlockHeader/BlockHeader.d.ts +0 -7
- package/build/cjs/components/BlockHeader/BlockHeader.js +0 -22
- package/build/cjs/components/Button/__tests__/Button.test.d.ts +0 -1
- package/build/cjs/components/Button/__tests__/Button.test.js +0 -91
- package/build/cjs/components/ButtonTabs/__tests__/ButtonTabs.test.d.ts +0 -1
- package/build/cjs/components/ButtonTabs/__tests__/ButtonTabs.test.js +0 -58
- package/build/esm/components/Anchor/__tests__/Anchor.test.d.ts +0 -1
- package/build/esm/components/Anchor/__tests__/Anchor.test.js +0 -18
- package/build/esm/components/AnimateBlock/__tests__/AnimateBlock.test.d.ts +0 -1
- package/build/esm/components/AnimateBlock/__tests__/AnimateBlock.test.js +0 -33
- package/build/esm/components/Author/__tests__/Author.test.d.ts +0 -1
- package/build/esm/components/Author/__tests__/Author.test.js +0 -46
- package/build/esm/components/BackLink/__tests__/BackLink.test.d.ts +0 -1
- package/build/esm/components/BackLink/__tests__/BackLink.test.js +0 -60
- package/build/esm/components/BlockBase/__tests__/BlockBase.test.d.ts +0 -1
- package/build/esm/components/BlockBase/__tests__/BlockBase.test.js +0 -41
- package/build/esm/components/BlockHeader/BlockHeader.css +0 -16
- package/build/esm/components/BlockHeader/BlockHeader.d.ts +0 -8
- package/build/esm/components/BlockHeader/BlockHeader.js +0 -21
- package/build/esm/components/Button/__tests__/Button.test.d.ts +0 -1
- package/build/esm/components/Button/__tests__/Button.test.js +0 -88
- package/build/esm/components/ButtonTabs/__tests__/ButtonTabs.test.d.ts +0 -1
- package/build/esm/components/ButtonTabs/__tests__/ButtonTabs.test.js +0 -55
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import React, { Fragment, useContext } from 'react';
|
|
2
|
+
import { HTML, ToggleArrow } from '../';
|
|
3
|
+
import { LocationContext } from '../../context/locationContext';
|
|
4
|
+
import { MobileContext } from '../../context/mobileContext';
|
|
5
|
+
import { block, getHeaderTag, getLinkProps } from '../../utils';
|
|
6
|
+
import Anchor from '../Anchor/Anchor';
|
|
7
|
+
import './TitleItem.css';
|
|
8
|
+
const b = block('title-item');
|
|
9
|
+
export function getArrowSize(size, isMobile) {
|
|
10
|
+
switch (size) {
|
|
11
|
+
case 'xs':
|
|
12
|
+
return 13;
|
|
13
|
+
case 's':
|
|
14
|
+
return 16;
|
|
15
|
+
case 'm':
|
|
16
|
+
return isMobile ? 22 : 24;
|
|
17
|
+
case 'l':
|
|
18
|
+
return isMobile ? 26 : 38;
|
|
19
|
+
default:
|
|
20
|
+
return 20;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const Title = (props) => {
|
|
24
|
+
const isMobile = useContext(MobileContext);
|
|
25
|
+
const { textSize = 'm', text, anchor, justify, url, onClick, custom, className, dataQa, resetMargin = true, } = props;
|
|
26
|
+
const { hostname } = useContext(LocationContext);
|
|
27
|
+
const textMarkup = (React.createElement(React.Fragment, null,
|
|
28
|
+
React.createElement(HTML, { className: b('text') }, text),
|
|
29
|
+
custom && (React.createElement(React.Fragment, null,
|
|
30
|
+
"\u00A0",
|
|
31
|
+
React.createElement("span", { className: b('custom') }, custom)))));
|
|
32
|
+
let content;
|
|
33
|
+
const insideClickableContent = (React.createElement("span", { className: b('wrapper') },
|
|
34
|
+
textMarkup,
|
|
35
|
+
"\u00A0",
|
|
36
|
+
React.createElement(ToggleArrow, { className: b('arrow', { size: textSize }), size: getArrowSize(textSize, isMobile), type: 'horizontal', iconType: "navigation", open: false })));
|
|
37
|
+
if (!url && !onClick) {
|
|
38
|
+
content = textMarkup;
|
|
39
|
+
}
|
|
40
|
+
else if (url) {
|
|
41
|
+
content = (React.createElement("a", Object.assign({ className: b('link'), href: url }, getLinkProps(url, hostname), { onClick: onClick }), insideClickableContent));
|
|
42
|
+
}
|
|
43
|
+
else if (onClick) {
|
|
44
|
+
content = (React.createElement("span", { className: b('link'), onClick: onClick }, insideClickableContent));
|
|
45
|
+
}
|
|
46
|
+
return (React.createElement(Fragment, null,
|
|
47
|
+
anchor && React.createElement(Anchor, { id: anchor, className: b('anchor') }),
|
|
48
|
+
React.createElement(getHeaderTag(textSize), {
|
|
49
|
+
className: b({ size: textSize, justify, 'reset-margin': resetMargin }, className),
|
|
50
|
+
'data-qa': `${dataQa}-header`,
|
|
51
|
+
}, content)));
|
|
52
|
+
};
|
|
53
|
+
export default Title;
|
|
@@ -5,7 +5,7 @@ export { default as BackgroundMedia } from './BackgroundMedia/BackgroundMedia';
|
|
|
5
5
|
export { default as BackLink } from './BackLink/BackLink';
|
|
6
6
|
export { default as BalancedMasonry } from './BalancedMasonry/BalancedMasonry';
|
|
7
7
|
export { default as BlockBase } from './BlockBase/BlockBase';
|
|
8
|
-
export { default as BlockHeader } from './
|
|
8
|
+
export { default as BlockHeader } from './Title/Title';
|
|
9
9
|
export { default as Button } from './Button/Button';
|
|
10
10
|
export { default as CardBase } from './CardBase/CardBase';
|
|
11
11
|
export { default as ErrorWrapper } from './ErrorWrapper/ErrorWrapper';
|
|
@@ -5,7 +5,7 @@ export { default as BackgroundMedia } from './BackgroundMedia/BackgroundMedia';
|
|
|
5
5
|
export { default as BackLink } from './BackLink/BackLink';
|
|
6
6
|
export { default as BalancedMasonry } from './BalancedMasonry/BalancedMasonry';
|
|
7
7
|
export { default as BlockBase } from './BlockBase/BlockBase';
|
|
8
|
-
export { default as BlockHeader } from './
|
|
8
|
+
export { default as BlockHeader } from './Title/Title';
|
|
9
9
|
export { default as Button } from './Button/Button';
|
|
10
10
|
export { default as CardBase } from './CardBase/CardBase';
|
|
11
11
|
export { default as ErrorWrapper } from './ErrorWrapper/ErrorWrapper';
|
|
@@ -7,4 +7,4 @@ export interface GridColumnProps extends GridColumnClassParams, Refable<HTMLDivE
|
|
|
7
7
|
dataQa?: string;
|
|
8
8
|
children?: React.ReactNode;
|
|
9
9
|
}
|
|
10
|
-
export declare const Col: React.ForwardRefExoticComponent<Pick<WithChildren<GridColumnProps>, "style" | "children" | "className" | "
|
|
10
|
+
export declare const Col: React.ForwardRefExoticComponent<Pick<WithChildren<GridColumnProps>, "style" | "children" | "className" | "reset" | "sizes" | "offsets" | "orders" | "hidden" | "visible" | "alignSelf" | "justifyContent" | "dataQa"> & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -10,22 +10,17 @@ declare module '*.svg' {
|
|
|
10
10
|
export default path;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
portalId: string;
|
|
15
|
-
formId: string;
|
|
16
|
-
region?: string;
|
|
17
|
-
target?: string;
|
|
18
|
-
cssClass?: string;
|
|
19
|
-
formInstanceId?: string;
|
|
20
|
-
}
|
|
13
|
+
declare module '*.md';
|
|
21
14
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
15
|
+
declare namespace Hbspt {
|
|
16
|
+
interface CreateFormProps {
|
|
17
|
+
portalId: string;
|
|
18
|
+
formId: string;
|
|
19
|
+
region?: string;
|
|
20
|
+
target?: string;
|
|
21
|
+
cssClass?: string;
|
|
22
|
+
formInstanceId?: string;
|
|
23
|
+
}
|
|
29
24
|
}
|
|
30
25
|
|
|
31
26
|
declare namespace Ymaps {
|
|
@@ -63,4 +58,11 @@ declare namespace Ymaps {
|
|
|
63
58
|
}
|
|
64
59
|
}
|
|
65
60
|
|
|
66
|
-
|
|
61
|
+
interface Window {
|
|
62
|
+
hbspt?: {
|
|
63
|
+
forms: {
|
|
64
|
+
create: (args: Hbspt.CreateFormProps) => unknown;
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
ymaps: Ymaps;
|
|
68
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { ButtonSize } from '@gravity-ui/uikit';
|
|
3
3
|
import { GridColumnSize, GridColumnSizesType } from '../../grid/types';
|
|
4
4
|
import { ThemeSupporting } from '../../utils';
|
|
5
|
-
import { AnchorProps, Animatable, BackgroundImageProps,
|
|
5
|
+
import { AnchorProps, Animatable, BackgroundImageProps, ButtonProps, ContentSize, ContentTextSize, ContentTheme, FileLinkProps, HeaderBreadCrumbsProps, HeaderImageSize, HeaderOffset, HeaderWidth, ImageDeviceProps, Justify, LegendTableMarkerType, LinkProps, MapProps, MediaDirection, MediaProps, TextSize, TextTheme, ThemedImage, ThemedMediaProps, ThemedMediaVideoProps, TitleItemBaseProps, TitleItemProps, TitleProps } from './common';
|
|
6
6
|
import { BannerCardProps, SubBlock, SubBlockModels } from './sub-blocks';
|
|
7
7
|
export declare enum BlockType {
|
|
8
8
|
PromoFeaturesBlock = "promo-features-block",
|
|
@@ -69,7 +69,7 @@ export interface SliderProps extends Childable, Animatable, LoadableChildren {
|
|
|
69
69
|
text: string;
|
|
70
70
|
size?: TextSize;
|
|
71
71
|
};
|
|
72
|
-
title?:
|
|
72
|
+
title?: TitleItemBaseProps;
|
|
73
73
|
description?: string;
|
|
74
74
|
autoplay?: number;
|
|
75
75
|
randomOrder?: boolean;
|
|
@@ -120,7 +120,7 @@ export interface ExtendedFeaturesItem extends Omit<ContentBlockProps, 'theme' |
|
|
|
120
120
|
}
|
|
121
121
|
export interface ExtendedFeaturesProps extends Animatable {
|
|
122
122
|
items: ExtendedFeaturesItem[];
|
|
123
|
-
title?:
|
|
123
|
+
title?: TitleItemProps | string;
|
|
124
124
|
description?: string;
|
|
125
125
|
colSizes?: GridColumnSizesType;
|
|
126
126
|
}
|
|
@@ -132,7 +132,7 @@ export interface PromoFeaturesItem {
|
|
|
132
132
|
}
|
|
133
133
|
export interface PromoFeaturesProps extends Animatable {
|
|
134
134
|
items: PromoFeaturesItem[];
|
|
135
|
-
title?:
|
|
135
|
+
title?: TitleItemProps | string;
|
|
136
136
|
description?: string;
|
|
137
137
|
theme?: 'grey' | 'default';
|
|
138
138
|
}
|
|
@@ -207,14 +207,14 @@ export interface TabsBlockItem extends Omit<ContentBlockProps, 'size' | 'colSize
|
|
|
207
207
|
caption?: string;
|
|
208
208
|
media?: ThemedMediaProps;
|
|
209
209
|
}
|
|
210
|
-
export interface TabsBlockProps extends
|
|
210
|
+
export interface TabsBlockProps extends TitleProps, Animatable {
|
|
211
211
|
tabsColSizes?: GridColumnSizesType;
|
|
212
212
|
centered?: boolean;
|
|
213
213
|
direction?: MediaDirection;
|
|
214
214
|
items: TabsBlockItem[];
|
|
215
215
|
}
|
|
216
216
|
export interface CardLayoutBlockProps extends Childable, Animatable, LoadableChildren {
|
|
217
|
-
title:
|
|
217
|
+
title: TitleItemProps | string;
|
|
218
218
|
description?: string;
|
|
219
219
|
colSizes?: GridColumnSizesType;
|
|
220
220
|
}
|
|
@@ -227,7 +227,7 @@ export type FilterItem = {
|
|
|
227
227
|
card: SubBlockModels;
|
|
228
228
|
};
|
|
229
229
|
export interface FilterBlockProps extends Animatable, LoadableChildren {
|
|
230
|
-
title?:
|
|
230
|
+
title?: TitleItemProps | string;
|
|
231
231
|
description?: string;
|
|
232
232
|
tags: FilterTag[];
|
|
233
233
|
items: FilterItem[];
|
|
@@ -257,7 +257,7 @@ export interface ContentLayoutBlockProps {
|
|
|
257
257
|
fileContent?: FileLinkProps[];
|
|
258
258
|
}
|
|
259
259
|
export interface ContentBlockProps {
|
|
260
|
-
title?:
|
|
260
|
+
title?: TitleItemBaseProps | string;
|
|
261
261
|
text?: string;
|
|
262
262
|
additionalInfo?: string;
|
|
263
263
|
links?: LinkProps[];
|
|
@@ -249,11 +249,11 @@ export interface HeaderBreadCrumbsProps extends ClassNameProps {
|
|
|
249
249
|
metrikaGoals?: MetrikaGoal;
|
|
250
250
|
pixelEvents?: ButtonPixel;
|
|
251
251
|
}
|
|
252
|
-
export interface
|
|
252
|
+
export interface TitleItemProps extends Justifyable, TitleItemBaseProps {
|
|
253
253
|
navTitle?: string;
|
|
254
254
|
anchor?: string;
|
|
255
255
|
}
|
|
256
|
-
export interface
|
|
256
|
+
export interface TitleItemBaseProps {
|
|
257
257
|
text: string;
|
|
258
258
|
textSize?: TextSize;
|
|
259
259
|
url?: string;
|
|
@@ -334,8 +334,8 @@ export interface AuthorProps {
|
|
|
334
334
|
type?: AuthorType;
|
|
335
335
|
dataQa?: string;
|
|
336
336
|
}
|
|
337
|
-
export interface
|
|
338
|
-
title?:
|
|
337
|
+
export interface TitleProps {
|
|
338
|
+
title?: TitleItemProps | string;
|
|
339
339
|
description?: string;
|
|
340
340
|
}
|
|
341
341
|
export {};
|
|
@@ -36,11 +36,11 @@ function getButtonSize(size) {
|
|
|
36
36
|
const Content = (props) => {
|
|
37
37
|
const { title, text, additionalInfo, size = 'l', links, buttons, colSizes = { all: 12, sm: 8 }, centered, theme, className, } = props;
|
|
38
38
|
const titleProps = __rest(!title || typeof title === 'string'
|
|
39
|
-
? { text: title, textSize: getTextSize(size) }
|
|
40
|
-
: title, []);
|
|
39
|
+
? { text: title, textSize: getTextSize(size), resetMargin: true }
|
|
40
|
+
: Object.assign(Object.assign({}, title), { resetMargin: true }), []);
|
|
41
41
|
const hasTitle = Boolean(title);
|
|
42
42
|
return (React.createElement(Col, { className: b({ size, centered, theme }, className), reset: true, sizes: colSizes },
|
|
43
|
-
title && React.createElement(Title,
|
|
43
|
+
title && React.createElement(Title, { title: titleProps }),
|
|
44
44
|
text && (React.createElement("div", { className: b('text', { ['without-title']: !hasTitle }) },
|
|
45
45
|
React.createElement(YFMWrapper, { content: text, modifiers: { constructor: true, [`constructor-size-${size}`]: true } }))),
|
|
46
46
|
additionalInfo && (React.createElement("div", { className: b('notice') },
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
import { HubspotFormProps } from '../../models';
|
|
2
3
|
type HubspotFormContainerPropsKeys = 'className' | 'formId' | 'formInstanceId' | 'portalId' | 'region' | 'formClassName' | 'createDOMElement';
|
|
3
4
|
type HubspotFormContainerProps = Pick<HubspotFormProps, HubspotFormContainerPropsKeys>;
|
|
4
|
-
declare const HubspotFormContainer:
|
|
5
|
+
declare const HubspotFormContainer: React.ForwardRefExoticComponent<HubspotFormContainerProps & React.RefAttributes<HTMLDivElement>>;
|
|
5
6
|
export default HubspotFormContainer;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import React, { useRef } from 'react';
|
|
1
|
+
import React, { forwardRef, useImperativeHandle, useRef } from 'react';
|
|
2
2
|
import { useMount } from '../../hooks';
|
|
3
3
|
import loadHubspotScript from './loadHubspotScript';
|
|
4
|
-
const HubspotFormContainer = (props) => {
|
|
4
|
+
const HubspotFormContainer = forwardRef((props, ref) => {
|
|
5
5
|
const { className, formId, formInstanceId, portalId, region, formClassName, createDOMElement, } = props;
|
|
6
6
|
const containerRef = useRef(null);
|
|
7
7
|
const hsContainerRef = useRef();
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
9
|
+
useImperativeHandle(ref, () => containerRef.current);
|
|
8
10
|
const containerId = formInstanceId
|
|
9
11
|
? `hubspot-form-${formId}-${formInstanceId}`
|
|
10
12
|
: `hubspot-form-${formId}`;
|
|
@@ -42,5 +44,6 @@ const HubspotFormContainer = (props) => {
|
|
|
42
44
|
};
|
|
43
45
|
});
|
|
44
46
|
return React.createElement("div", { className: className, id: containerId, ref: containerRef });
|
|
45
|
-
};
|
|
47
|
+
});
|
|
48
|
+
HubspotFormContainer.displayName = 'HubspotFormContainer';
|
|
46
49
|
export default HubspotFormContainer;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { HubspotFormProps } from '../../models';
|
|
3
3
|
import './HubspotForm.css';
|
|
4
|
-
declare const HubspotForm: React.
|
|
4
|
+
declare const HubspotForm: React.ForwardRefExoticComponent<HubspotFormProps & React.RefAttributes<HTMLDivElement>>;
|
|
5
5
|
export default HubspotForm;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useContext, useMemo } from 'react';
|
|
1
|
+
import React, { forwardRef, useContext, useMemo } from 'react';
|
|
2
2
|
import { MobileContext } from '../../context/mobileContext';
|
|
3
3
|
import { ThemeValueContext } from '../../context/theme/ThemeValueContext';
|
|
4
4
|
import { useAnalytics, useHandleHubspotEvents } from '../../hooks';
|
|
@@ -8,7 +8,7 @@ import { block } from '../../utils';
|
|
|
8
8
|
import HubspotFormContainer from './HubspotFormContainer';
|
|
9
9
|
import './HubspotForm.css';
|
|
10
10
|
const b = block('hubspot-form');
|
|
11
|
-
const HubspotForm = (props) => {
|
|
11
|
+
const HubspotForm = forwardRef((props, ref) => {
|
|
12
12
|
const { className, theme: themeProp, isMobile: isMobileProp, formId, formInstanceId, portalId, region, formClassName, pixelEvents,
|
|
13
13
|
// hubspotEvents, // TODO: decide how to handle them
|
|
14
14
|
analyticsEvents, onBeforeSubmit, onSubmit, onBeforeLoad, onLoad, createDOMElement, onSubmitError, } = props;
|
|
@@ -23,10 +23,10 @@ const HubspotForm = (props) => {
|
|
|
23
23
|
onBeforeSubmit,
|
|
24
24
|
onLoad,
|
|
25
25
|
onSubmitError,
|
|
26
|
-
onSubmit: (
|
|
26
|
+
onSubmit: (event) => {
|
|
27
27
|
handleMetrika === null || handleMetrika === void 0 ? void 0 : handleMetrika({ pixelEvents });
|
|
28
28
|
handleAnalytics(analyticsEvents);
|
|
29
|
-
onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(
|
|
29
|
+
onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(event);
|
|
30
30
|
},
|
|
31
31
|
}), [
|
|
32
32
|
onBeforeLoad,
|
|
@@ -40,6 +40,7 @@ const HubspotForm = (props) => {
|
|
|
40
40
|
onSubmitError,
|
|
41
41
|
]);
|
|
42
42
|
useHandleHubspotEvents(handlers, formId);
|
|
43
|
-
return (React.createElement(HubspotFormContainer, { createDOMElement: createDOMElement, key: [formClassName, formId, formInstanceId, portalId, region].join(), className: b({ theme, mobile }, className), formClassName: formClassName, formId: formId, portalId: portalId, formInstanceId: formInstanceId, region: region }));
|
|
44
|
-
};
|
|
43
|
+
return (React.createElement(HubspotFormContainer, { createDOMElement: createDOMElement, key: [formClassName, formId, formInstanceId, portalId, region].join(), className: b({ theme, mobile }, className), formClassName: formClassName, formId: formId, portalId: portalId, formInstanceId: formInstanceId, region: region, ref: ref }));
|
|
44
|
+
});
|
|
45
|
+
HubspotForm.displayName = 'HubspotForm';
|
|
45
46
|
export default HubspotForm;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TitleItemProps } from '../models';
|
|
2
2
|
import { Parser, Transformer, TransformerRaw, typografTransformer, yfmTransformer } from './common';
|
|
3
3
|
export declare const blockHeaderTransformer: ({
|
|
4
4
|
fields: string[];
|
|
5
5
|
transformer: typeof typografTransformer;
|
|
6
|
-
parser: (transformer: Transformer, title:
|
|
6
|
+
parser: (transformer: Transformer, title: TitleItemProps | string) => string | {
|
|
7
7
|
text: string;
|
|
8
8
|
navTitle?: string | undefined;
|
|
9
9
|
anchor?: string | undefined;
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { ButtonSize } from '@gravity-ui/uikit';
|
|
3
3
|
import { GridColumnSize, GridColumnSizesType } from '../../grid/types';
|
|
4
4
|
import { ThemeSupporting } from '../../utils';
|
|
5
|
-
import { AnchorProps, Animatable, BackgroundImageProps,
|
|
5
|
+
import { AnchorProps, Animatable, BackgroundImageProps, ButtonProps, ContentSize, ContentTextSize, ContentTheme, FileLinkProps, HeaderBreadCrumbsProps, HeaderImageSize, HeaderOffset, HeaderWidth, ImageDeviceProps, Justify, LegendTableMarkerType, LinkProps, MapProps, MediaDirection, MediaProps, TextSize, TextTheme, ThemedImage, ThemedMediaProps, ThemedMediaVideoProps, TitleItemBaseProps, TitleItemProps, TitleProps } from './common';
|
|
6
6
|
import { BannerCardProps, SubBlock, SubBlockModels } from './sub-blocks';
|
|
7
7
|
export declare enum BlockType {
|
|
8
8
|
PromoFeaturesBlock = "promo-features-block",
|
|
@@ -69,7 +69,7 @@ export interface SliderProps extends Childable, Animatable, LoadableChildren {
|
|
|
69
69
|
text: string;
|
|
70
70
|
size?: TextSize;
|
|
71
71
|
};
|
|
72
|
-
title?:
|
|
72
|
+
title?: TitleItemBaseProps;
|
|
73
73
|
description?: string;
|
|
74
74
|
autoplay?: number;
|
|
75
75
|
randomOrder?: boolean;
|
|
@@ -120,7 +120,7 @@ export interface ExtendedFeaturesItem extends Omit<ContentBlockProps, 'theme' |
|
|
|
120
120
|
}
|
|
121
121
|
export interface ExtendedFeaturesProps extends Animatable {
|
|
122
122
|
items: ExtendedFeaturesItem[];
|
|
123
|
-
title?:
|
|
123
|
+
title?: TitleItemProps | string;
|
|
124
124
|
description?: string;
|
|
125
125
|
colSizes?: GridColumnSizesType;
|
|
126
126
|
}
|
|
@@ -132,7 +132,7 @@ export interface PromoFeaturesItem {
|
|
|
132
132
|
}
|
|
133
133
|
export interface PromoFeaturesProps extends Animatable {
|
|
134
134
|
items: PromoFeaturesItem[];
|
|
135
|
-
title?:
|
|
135
|
+
title?: TitleItemProps | string;
|
|
136
136
|
description?: string;
|
|
137
137
|
theme?: 'grey' | 'default';
|
|
138
138
|
}
|
|
@@ -207,14 +207,14 @@ export interface TabsBlockItem extends Omit<ContentBlockProps, 'size' | 'colSize
|
|
|
207
207
|
caption?: string;
|
|
208
208
|
media?: ThemedMediaProps;
|
|
209
209
|
}
|
|
210
|
-
export interface TabsBlockProps extends
|
|
210
|
+
export interface TabsBlockProps extends TitleProps, Animatable {
|
|
211
211
|
tabsColSizes?: GridColumnSizesType;
|
|
212
212
|
centered?: boolean;
|
|
213
213
|
direction?: MediaDirection;
|
|
214
214
|
items: TabsBlockItem[];
|
|
215
215
|
}
|
|
216
216
|
export interface CardLayoutBlockProps extends Childable, Animatable, LoadableChildren {
|
|
217
|
-
title:
|
|
217
|
+
title: TitleItemProps | string;
|
|
218
218
|
description?: string;
|
|
219
219
|
colSizes?: GridColumnSizesType;
|
|
220
220
|
}
|
|
@@ -227,7 +227,7 @@ export type FilterItem = {
|
|
|
227
227
|
card: SubBlockModels;
|
|
228
228
|
};
|
|
229
229
|
export interface FilterBlockProps extends Animatable, LoadableChildren {
|
|
230
|
-
title?:
|
|
230
|
+
title?: TitleItemProps | string;
|
|
231
231
|
description?: string;
|
|
232
232
|
tags: FilterTag[];
|
|
233
233
|
items: FilterItem[];
|
|
@@ -257,7 +257,7 @@ export interface ContentLayoutBlockProps {
|
|
|
257
257
|
fileContent?: FileLinkProps[];
|
|
258
258
|
}
|
|
259
259
|
export interface ContentBlockProps {
|
|
260
|
-
title?:
|
|
260
|
+
title?: TitleItemBaseProps | string;
|
|
261
261
|
text?: string;
|
|
262
262
|
additionalInfo?: string;
|
|
263
263
|
links?: LinkProps[];
|
|
@@ -249,11 +249,11 @@ export interface HeaderBreadCrumbsProps extends ClassNameProps {
|
|
|
249
249
|
metrikaGoals?: MetrikaGoal;
|
|
250
250
|
pixelEvents?: ButtonPixel;
|
|
251
251
|
}
|
|
252
|
-
export interface
|
|
252
|
+
export interface TitleItemProps extends Justifyable, TitleItemBaseProps {
|
|
253
253
|
navTitle?: string;
|
|
254
254
|
anchor?: string;
|
|
255
255
|
}
|
|
256
|
-
export interface
|
|
256
|
+
export interface TitleItemBaseProps {
|
|
257
257
|
text: string;
|
|
258
258
|
textSize?: TextSize;
|
|
259
259
|
url?: string;
|
|
@@ -334,8 +334,8 @@ export interface AuthorProps {
|
|
|
334
334
|
type?: AuthorType;
|
|
335
335
|
dataQa?: string;
|
|
336
336
|
}
|
|
337
|
-
export interface
|
|
338
|
-
title?:
|
|
337
|
+
export interface TitleProps {
|
|
338
|
+
title?: TitleItemProps | string;
|
|
339
339
|
description?: string;
|
|
340
340
|
}
|
|
341
341
|
export {};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TitleItemProps } from '../models';
|
|
2
2
|
import { Parser, Transformer, TransformerRaw, typografTransformer, yfmTransformer } from './common';
|
|
3
3
|
export declare const blockHeaderTransformer: ({
|
|
4
4
|
fields: string[];
|
|
5
5
|
transformer: typeof typografTransformer;
|
|
6
|
-
parser: (transformer: Transformer, title:
|
|
6
|
+
parser: (transformer: Transformer, title: TitleItemProps | string) => string | {
|
|
7
7
|
text: string;
|
|
8
8
|
navTitle?: string | undefined;
|
|
9
9
|
anchor?: string | undefined;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,21 +0,0 @@
|
|
|
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 react_2 = require("@testing-library/react");
|
|
6
|
-
const Anchor_1 = tslib_1.__importDefault(require("../Anchor"));
|
|
7
|
-
const testId = 'anchor';
|
|
8
|
-
const anchorId = 'anchorId';
|
|
9
|
-
describe('Anchor', () => {
|
|
10
|
-
test('Has id', async () => {
|
|
11
|
-
(0, react_2.render)(react_1.default.createElement(Anchor_1.default, { id: anchorId, dataQa: testId }));
|
|
12
|
-
const anchor = react_2.screen.getByTestId(testId);
|
|
13
|
-
expect(anchor).toHaveAttribute('id', anchorId);
|
|
14
|
-
});
|
|
15
|
-
test('Has custom class', async () => {
|
|
16
|
-
const className = 'custom-anchor-class';
|
|
17
|
-
(0, react_2.render)(react_1.default.createElement(Anchor_1.default, { id: anchorId, className: className, dataQa: testId }));
|
|
18
|
-
const anchor = react_2.screen.getByTestId(testId);
|
|
19
|
-
expect(anchor).toHaveClass(className);
|
|
20
|
-
});
|
|
21
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,36 +0,0 @@
|
|
|
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 react_2 = require("@testing-library/react");
|
|
6
|
-
const user_event_1 = tslib_1.__importDefault(require("@testing-library/user-event"));
|
|
7
|
-
const AnimateBlock_1 = tslib_1.__importDefault(require("../AnimateBlock"));
|
|
8
|
-
const qaId = 'animate-block';
|
|
9
|
-
describe('AnimateBlock', () => {
|
|
10
|
-
test('render AnimateBlock by default', async () => {
|
|
11
|
-
(0, react_2.render)(react_1.default.createElement(AnimateBlock_1.default, { qa: qaId }));
|
|
12
|
-
const component = react_2.screen.getByTestId(qaId);
|
|
13
|
-
expect(component).toBeInTheDocument();
|
|
14
|
-
});
|
|
15
|
-
test('add className', () => {
|
|
16
|
-
const className = 'my-class';
|
|
17
|
-
(0, react_2.render)(react_1.default.createElement(AnimateBlock_1.default, { qa: qaId, className: className }));
|
|
18
|
-
const component = react_2.screen.getByTestId(qaId);
|
|
19
|
-
expect(component).toHaveClass(className);
|
|
20
|
-
});
|
|
21
|
-
test('use passed style', () => {
|
|
22
|
-
const style = { color: 'red' };
|
|
23
|
-
(0, react_2.render)(react_1.default.createElement(AnimateBlock_1.default, { style: style, qa: qaId }));
|
|
24
|
-
const component = react_2.screen.getByTestId(qaId);
|
|
25
|
-
expect(component).toHaveStyle(style);
|
|
26
|
-
});
|
|
27
|
-
test('call onScroll', async () => {
|
|
28
|
-
const onScroll = jest.fn();
|
|
29
|
-
const user = user_event_1.default.setup();
|
|
30
|
-
(0, react_2.render)(react_1.default.createElement("div", { style: { paddingTop: 100000 } },
|
|
31
|
-
react_1.default.createElement(AnimateBlock_1.default, { onScroll: onScroll, qa: qaId })));
|
|
32
|
-
const component = react_2.screen.getByTestId(qaId);
|
|
33
|
-
await user.hover(component);
|
|
34
|
-
expect(onScroll).toHaveBeenCalledTimes(1);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,49 +0,0 @@
|
|
|
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 react_2 = require("@testing-library/react");
|
|
6
|
-
const models_1 = require("../../../models");
|
|
7
|
-
const Author_1 = tslib_1.__importDefault(require("../Author"));
|
|
8
|
-
const testId = 'author';
|
|
9
|
-
const author = {
|
|
10
|
-
firstName: 'John',
|
|
11
|
-
secondName: 'Doe',
|
|
12
|
-
description: 'Web designer',
|
|
13
|
-
avatar: 'https://storage.yandexcloud.net/cloud-www-assets/constructor/storybook/images/img-gray.png',
|
|
14
|
-
};
|
|
15
|
-
describe('Author', () => {
|
|
16
|
-
test('Render author by default', async () => {
|
|
17
|
-
(0, react_2.render)(react_1.default.createElement(Author_1.default, { author: author, dataQa: testId }));
|
|
18
|
-
const object = react_2.screen.getByTestId(testId);
|
|
19
|
-
expect(object).toBeInTheDocument();
|
|
20
|
-
});
|
|
21
|
-
test('Has full name', async () => {
|
|
22
|
-
const name = `${author.firstName} ${author.secondName}`;
|
|
23
|
-
(0, react_2.render)(react_1.default.createElement(Author_1.default, { author: author, dataQa: testId }));
|
|
24
|
-
const object = react_2.screen.getByText(name);
|
|
25
|
-
expect(object).toBeInTheDocument();
|
|
26
|
-
});
|
|
27
|
-
test('Has first name only', async () => {
|
|
28
|
-
const name = author.firstName;
|
|
29
|
-
(0, react_2.render)(react_1.default.createElement(Author_1.default, { author: Object.assign(Object.assign({}, author), { secondName: '' }), dataQa: testId }));
|
|
30
|
-
const object = react_2.screen.getByText(name);
|
|
31
|
-
expect(object).toBeInTheDocument();
|
|
32
|
-
});
|
|
33
|
-
test('Has avatar', async () => {
|
|
34
|
-
(0, react_2.render)(react_1.default.createElement(Author_1.default, { author: author, dataQa: testId }));
|
|
35
|
-
const avatar = react_2.screen.getByRole('img');
|
|
36
|
-
expect(avatar).toBeInTheDocument();
|
|
37
|
-
expect(avatar).toHaveAttribute('src', author.avatar);
|
|
38
|
-
});
|
|
39
|
-
test('Has description', async () => {
|
|
40
|
-
(0, react_2.render)(react_1.default.createElement(Author_1.default, { author: author, dataQa: testId }));
|
|
41
|
-
const object = react_2.screen.getByText(author.description);
|
|
42
|
-
expect(object).toBeInTheDocument();
|
|
43
|
-
});
|
|
44
|
-
test.each(new Array(models_1.AuthorType.Column, models_1.AuthorType.Line))('Render with given "%s" type', (type) => {
|
|
45
|
-
(0, react_2.render)(react_1.default.createElement(Author_1.default, { author: author, dataQa: testId, type: type }));
|
|
46
|
-
const object = react_2.screen.getByTestId(testId);
|
|
47
|
-
expect(object).toHaveClass(`pc-author_type_${type}`);
|
|
48
|
-
});
|
|
49
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,63 +0,0 @@
|
|
|
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 react_2 = require("@testing-library/react");
|
|
6
|
-
const user_event_1 = tslib_1.__importDefault(require("@testing-library/user-event"));
|
|
7
|
-
const locationContext_1 = require("../../../context/locationContext");
|
|
8
|
-
const BackLink_1 = tslib_1.__importDefault(require("../BackLink"));
|
|
9
|
-
const backLinkProps = {
|
|
10
|
-
url: '#',
|
|
11
|
-
title: 'Button Title',
|
|
12
|
-
theme: 'default',
|
|
13
|
-
size: 's',
|
|
14
|
-
className: 'customClassName',
|
|
15
|
-
shouldHandleBackAction: true,
|
|
16
|
-
onClick: () => { },
|
|
17
|
-
};
|
|
18
|
-
describe('BackLink', () => {
|
|
19
|
-
test('Default render', async () => {
|
|
20
|
-
(0, react_2.render)(react_1.default.createElement(BackLink_1.default, Object.assign({}, backLinkProps)));
|
|
21
|
-
const backLink = react_2.screen.getByRole('button');
|
|
22
|
-
expect(backLink).toBeInTheDocument();
|
|
23
|
-
});
|
|
24
|
-
test('Has custom class', async () => {
|
|
25
|
-
(0, react_2.render)(react_1.default.createElement(BackLink_1.default, Object.assign({}, backLinkProps)));
|
|
26
|
-
const backLink = react_2.screen.getByRole('button');
|
|
27
|
-
expect(backLink).toHaveClass(backLinkProps.className);
|
|
28
|
-
});
|
|
29
|
-
test('Should render <a /> tag', async () => {
|
|
30
|
-
(0, react_2.render)(react_1.default.createElement(BackLink_1.default, Object.assign({}, backLinkProps, { shouldHandleBackAction: false })));
|
|
31
|
-
const backLink = react_2.screen.getByRole('link');
|
|
32
|
-
expect(backLink).toBeVisible();
|
|
33
|
-
expect(backLink).toHaveAttribute('href', backLinkProps.url);
|
|
34
|
-
});
|
|
35
|
-
test('Should render title', async () => {
|
|
36
|
-
(0, react_2.render)(react_1.default.createElement(BackLink_1.default, Object.assign({}, backLinkProps)));
|
|
37
|
-
const backLink = react_2.screen.getByText(backLinkProps.title);
|
|
38
|
-
expect(backLink).toBeInTheDocument();
|
|
39
|
-
});
|
|
40
|
-
test('Call onClick', async () => {
|
|
41
|
-
const user = user_event_1.default.setup();
|
|
42
|
-
const handleClick = jest.fn();
|
|
43
|
-
(0, react_2.render)(react_1.default.createElement(locationContext_1.LocationContext.Provider, { value: { history: { push: jest.fn() } } },
|
|
44
|
-
react_1.default.createElement(BackLink_1.default, Object.assign({}, backLinkProps, { onClick: handleClick }))));
|
|
45
|
-
const backLink = react_2.screen.getByRole('button');
|
|
46
|
-
await user.click(backLink);
|
|
47
|
-
expect(handleClick).toHaveBeenCalledTimes(1);
|
|
48
|
-
});
|
|
49
|
-
test.each(new Array('s', 'm', 'l', 'xl'))('Render with given "%s" size', (size) => {
|
|
50
|
-
(0, react_2.render)(react_1.default.createElement(BackLink_1.default, Object.assign({}, backLinkProps, { size: size })));
|
|
51
|
-
const backLink = react_2.screen.getByRole('button');
|
|
52
|
-
expect(backLink).toHaveClass(`yc-button_size_${size}`);
|
|
53
|
-
});
|
|
54
|
-
test.each(new Array('default', 'special'))('Render with given "%s" theme', (theme) => {
|
|
55
|
-
const matchView = {
|
|
56
|
-
default: 'flat-secondary',
|
|
57
|
-
special: 'flat-contrast',
|
|
58
|
-
};
|
|
59
|
-
(0, react_2.render)(react_1.default.createElement(BackLink_1.default, Object.assign({}, backLinkProps, { theme: theme })));
|
|
60
|
-
const backLink = react_2.screen.getByRole('button');
|
|
61
|
-
expect(backLink).toHaveClass(`yc-button_view_${matchView[theme]}`);
|
|
62
|
-
});
|
|
63
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|