@meduza/ui-kit-2 0.1.95 → 0.1.97

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/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.95",
2
+ "version": "0.1.97",
3
3
  "license": "MIT",
4
4
  "description": "UIKit for Meduza",
5
5
  "repository": "https://github.com/meduza-corp/ui-kit-2.git",
@@ -110,7 +110,7 @@
110
110
  "ts-loader": "^8.0.1",
111
111
  "tsconfig-paths-webpack-plugin": "^3.2.0",
112
112
  "tsdx": "^0.13.2",
113
- "tslib": "^2.0.0",
113
+ "tslib": "^2.3.0",
114
114
  "typescript": "^4.0.3",
115
115
  "typescript-plugin-css-modules": "^2.4.0",
116
116
  "utils": "^0.3.1"
@@ -15,4 +15,5 @@ export interface RawHtmlBlockProps {
15
15
  isInBookmarks?: boolean | undefined
16
16
  bookmarkAction?: (service: CallToActions, place: string) => void
17
17
  lightBox?: LightboxContext | null | undefined
18
+ lang: 'ru' | 'en'
18
19
  }
@@ -15,7 +15,8 @@ export const RawHtmlBlock: React.FC<RawHtmlBlockProps> = ({
15
15
  isListened,
16
16
  isInBookmarks,
17
17
  bookmarkAction,
18
- lightBox
18
+ lightBox,
19
+ lang
19
20
  }) => {
20
21
  const context = {
21
22
  lightBox: lightBox || null
@@ -56,6 +57,7 @@ export const RawHtmlBlock: React.FC<RawHtmlBlockProps> = ({
56
57
  isListened={isListened}
57
58
  isInBookmarks={isInBookmarks}
58
59
  bookmarkAction={bookmarkAction}
60
+ lang={lang}
59
61
  />
60
62
  </BlockProvider>
61
63
  )
@@ -0,0 +1,209 @@
1
+ @import '../vars.css';
2
+
3
+ .root {
4
+ position: relative;
5
+ z-index: 10;
6
+
7
+ display: block;
8
+ overflow: hidden;
9
+
10
+ text-decoration: none;
11
+
12
+ color: #000;
13
+ border-radius: 8px;
14
+ outline-width: 0;
15
+
16
+ @media $mobile {
17
+ color: #fff;
18
+ }
19
+ }
20
+
21
+ .root:hover {
22
+ @media $mobile {
23
+ opacity: 0.95;
24
+ }
25
+ }
26
+
27
+ .root::after {
28
+ position: absolute;
29
+ z-index: 20;
30
+ top: 0;
31
+ right: 0;
32
+ bottom: 0;
33
+ left: 0;
34
+
35
+ content: '';
36
+
37
+ border-radius: 8px;
38
+ }
39
+
40
+ .root::before {
41
+ display: block;
42
+
43
+ width: 100%;
44
+ }
45
+
46
+ .root::after {
47
+ box-shadow: inset 0 4px #b88b59, inset 0 5px rgba(0, 0, 0, 0.2),
48
+ inset 0 0 0 1px rgba(0, 0, 0, 0.1);
49
+ }
50
+
51
+ .root,
52
+ .wrapper {
53
+ margin: 16px 0;
54
+
55
+ @media $portraitTablet {
56
+ margin: 25px 0;
57
+ }
58
+ }
59
+
60
+ .overlay,
61
+ .overlayHeader {
62
+ position: absolute;
63
+ z-index: 10;
64
+ right: 0;
65
+ left: 0;
66
+ }
67
+
68
+ .overlay {
69
+ bottom: 0;
70
+
71
+ height: 295px;
72
+ }
73
+
74
+ .overlayHeader {
75
+ top: 0;
76
+
77
+ height: 150px;
78
+ }
79
+
80
+ .body {
81
+ display: flex;
82
+ flex-flow: column nowrap;
83
+ justify-content: flex-end;
84
+
85
+ padding: 12px 15px;
86
+
87
+ background-color: #f7f7f7;
88
+
89
+ @media $mobile {
90
+ position: absolute;
91
+ z-index: 10;
92
+ right: 0;
93
+ bottom: 0;
94
+ left: 0;
95
+
96
+ min-height: 295px;
97
+ padding: 20px;
98
+
99
+ background-color: transparent;
100
+ }
101
+ }
102
+
103
+ .hasGradient .body {
104
+ @media $mobile {
105
+ position: absolute;
106
+ z-index: 10;
107
+ right: 0;
108
+ bottom: 0;
109
+ left: 0;
110
+
111
+ min-height: 295px;
112
+
113
+ background-color: transparent;
114
+ }
115
+ }
116
+
117
+ .picture {
118
+ position: relative;
119
+ }
120
+
121
+ .picture::after {
122
+ position: absolute;
123
+ z-index: 10;
124
+ right: 1px;
125
+ bottom: 0;
126
+ left: 1px;
127
+
128
+ content: '';
129
+
130
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
131
+
132
+ @media $mobile {
133
+ content: '';
134
+ }
135
+ }
136
+
137
+ .tag {
138
+ position: absolute;
139
+ z-index: 10;
140
+ top: 14px;
141
+ right: 15px;
142
+ left: 15px;
143
+
144
+ color: rgba(255, 255, 255, 0.7);
145
+
146
+ font-size: 12px;
147
+
148
+ @media $landscapeTablet {
149
+ top: 16px;
150
+ right: 20px;
151
+ left: 20px;
152
+ }
153
+ }
154
+
155
+ .center {
156
+ width: 100%;
157
+ max-width: 650px;
158
+ margin-right: auto;
159
+ margin-left: auto;
160
+ }
161
+
162
+ .title {
163
+ font-family: $secondaryFont;
164
+ font-size: 19px;
165
+ font-weight: 700;
166
+ line-height: 23px;
167
+
168
+ @media $landscapeTablet {
169
+ font-size: 1.3rem;
170
+ line-height: 1.6rem;
171
+ }
172
+ }
173
+
174
+ .price {
175
+ display: block;
176
+ }
177
+
178
+ /* Themes */
179
+
180
+ .dark {
181
+ color: #000;
182
+ }
183
+
184
+ .dark .tag {
185
+ color: rgba(0, 0, 0, 0.7);
186
+ }
187
+
188
+ .light {
189
+ @media $mobile {
190
+ color: #fff;
191
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
192
+ }
193
+ }
194
+
195
+ /* Display */
196
+
197
+ .mobile {
198
+ @media $mobile {
199
+ display: none;
200
+ }
201
+ }
202
+
203
+ .desktop {
204
+ display: none;
205
+
206
+ @media $mobile {
207
+ display: block;
208
+ }
209
+ }
@@ -0,0 +1,12 @@
1
+ @import '../vars.css';
2
+
3
+ .root {
4
+ display: block;
5
+
6
+ max-width: 650px;
7
+ margin: 0 auto;
8
+ }
9
+
10
+ .card + .card {
11
+ margin-top: 40px;
12
+ }
@@ -0,0 +1,52 @@
1
+ import React from 'react'
2
+ import { ShopRelatedBlock } from '.'
3
+ import { PreviewWrapper } from '../_storybook/PreviewWrapper'
4
+
5
+ import styles from './ShopRelatedBlock.stories.module.css'
6
+ import mock from './mock.json'
7
+
8
+ export default {
9
+ title: 'Main / ShopRelatedBlock',
10
+ component: ShopRelatedBlock,
11
+ parameters: {
12
+ themeWrapperSideBySide: true
13
+ }
14
+ }
15
+
16
+ const Example: React.FC = () => {
17
+ return (
18
+ <>
19
+ <div className={styles.root}>
20
+ <div className={styles.card}>
21
+ <ShopRelatedBlock block={mock.rich} styleContext={['no_mods']} />
22
+ </div>
23
+ <div className={styles.card}>
24
+ <ShopRelatedBlock block={mock.rich_dark} styleContext={['no_mods']} />
25
+ </div>
26
+ <div className={styles.card}>
27
+ <ShopRelatedBlock
28
+ block={mock.rich_and_featured_mobile}
29
+ styleContext={['no_mods']}
30
+ />
31
+ </div>
32
+ <div className={styles.card}>
33
+ <ShopRelatedBlock
34
+ block={mock.rich_and_featured_desktop}
35
+ styleContext={['no_mods']}
36
+ />
37
+ </div>
38
+ </div>
39
+ </>
40
+ )
41
+ }
42
+
43
+ export const Default: React.FC = () => (
44
+ <>
45
+ <PreviewWrapper theme="light">
46
+ <Example />
47
+ </PreviewWrapper>
48
+ {/* <PreviewWrapper theme="dark">
49
+ <Example />
50
+ </PreviewWrapper> */}
51
+ </>
52
+ )
@@ -0,0 +1,20 @@
1
+ import React from 'react'
2
+ import { render } from '@testing-library/react'
3
+ import { ShopRelatedBlock } from '.'
4
+ import { ShopRelatedBlockProps } from './ShopRelatedBlock.types'
5
+
6
+ import styles from './ShopRelatedBlock.module.css'
7
+
8
+ describe('Related Rich Block', () => {
9
+ let props: ShopRelatedBlockProps
10
+
11
+ const renderComponent = () => render(<ShopRelatedBlock {...props} />)
12
+
13
+ it('should have root style', () => {
14
+ const { getByTestId } = renderComponent()
15
+
16
+ const ShopRelatedBlock = getByTestId('realated-rich-block')
17
+
18
+ expect(ShopRelatedBlock).toHaveClass(styles.root)
19
+ })
20
+ })
@@ -0,0 +1,4 @@
1
+ export interface ShopRelatedBlockProps {
2
+ block?: any
3
+ styleContext?: any
4
+ }
@@ -0,0 +1,120 @@
1
+ /* eslint-disable react/jsx-no-target-blank */
2
+ import React, { useEffect } from 'react'
3
+
4
+ import { useInView } from 'react-intersection-observer'
5
+ import { ShopRelatedBlockProps } from './ShopRelatedBlock.types'
6
+
7
+ import postMessage from '../utils/postMessage'
8
+ import { makeClassName, ClassNames } from '../utils/makeClassName'
9
+ import makeStyleContext from '../utils/makeStyleContext'
10
+ import generateGradient from '../utils/generateGradient'
11
+
12
+ import { Tag } from '../Tag'
13
+ import { Image } from '../Image'
14
+
15
+ import styles from './ShopRelatedBlock.module.css'
16
+
17
+ export const ShopRelatedBlock: React.FC<ShopRelatedBlockProps> = ({
18
+ block: {
19
+ only_on: onlyOn,
20
+ data: {
21
+ url,
22
+ cover: {
23
+ urls,
24
+ gradients,
25
+ tag,
26
+ layout,
27
+ ratio,
28
+ first_title: firstTitle,
29
+ second_title: secondTitle
30
+ }
31
+ }
32
+ },
33
+ styleContext
34
+ }) => {
35
+ const style: React.CSSProperties = {}
36
+ const styleHeader: React.CSSProperties = {}
37
+
38
+ const [ref, inView] = useInView({
39
+ threshold: 0,
40
+ triggerOnce: true
41
+ })
42
+
43
+ useEffect(() => {
44
+ if (inView) {
45
+ if (
46
+ (onlyOn === 'mobile' && window.innerWidth <= 511) ||
47
+ (onlyOn === 'desktop' && window.innerWidth >= 512) ||
48
+ !onlyOn
49
+ ) {
50
+ postMessage('richRelated', url, 'view')
51
+ }
52
+ }
53
+ }, [inView])
54
+
55
+ const handleClick = () => {
56
+ postMessage('richRelated', url, 'click')
57
+ }
58
+
59
+ let classNames: ClassNames = [
60
+ [styles.root, true],
61
+ [styles.hasGradient, !!gradients],
62
+ [styles[onlyOn], !!onlyOn && !!styles[onlyOn]]
63
+ ]
64
+
65
+ if (styleContext) {
66
+ classNames = makeStyleContext(classNames, styleContext, styles)
67
+ }
68
+
69
+ if (gradients) {
70
+ styleHeader.backgroundImage = generateGradient(
71
+ gradients.bg_rgb,
72
+ 'mediaBlockTop'
73
+ )
74
+
75
+ const theme = [gradients.text_rgb === '0,0,0' ? 'dark' : 'light']
76
+ classNames = makeStyleContext(classNames, theme, styles)
77
+
78
+ if (onlyOn === 'desktop') {
79
+ style.backgroundImage = generateGradient(
80
+ gradients.bg_rgb,
81
+ 'mediaBlockBottom'
82
+ )
83
+ }
84
+ }
85
+
86
+ return (
87
+ <a
88
+ data-testid="related-rich-block"
89
+ className={makeClassName(classNames)}
90
+ href={url}
91
+ target="_blank"
92
+ onClick={(): void => handleClick()}
93
+ ref={ref}
94
+ >
95
+ {layout === 'rich' && (
96
+ <>
97
+ <div className={styles.overlay} style={style} />
98
+ <div className={styles.overlayHeader} style={styleHeader} />
99
+ </>
100
+ )}
101
+
102
+ <div className={styles.tag}>
103
+ <Tag size="small" theme="inherit" styleContext="richRelated">
104
+ {tag}
105
+ </Tag>
106
+ </div>
107
+ <div className={styles.cover}>
108
+ <div className={styles.picture}>
109
+ <Image optimized={urls} ratio={ratio} display="narrow" />
110
+ </div>
111
+ </div>
112
+ <div className={styles.body}>
113
+ <h2 className={styles.title}>
114
+ {firstTitle}
115
+ <span className={styles.price}>{secondTitle}</span>
116
+ </h2>
117
+ </div>
118
+ </a>
119
+ )
120
+ }
@@ -0,0 +1,153 @@
1
+ {
2
+ "rich": {
3
+ "type": "related_shop",
4
+ "data": {
5
+ "url": "https://meduza.io/",
6
+
7
+ "cover": {
8
+ "ratio": 1.5,
9
+ "layout": "rich",
10
+ "urls": {
11
+ "w325": {
12
+ "1x": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
13
+ "2x": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
14
+ "1x_webp": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
15
+ "2x_webp": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg"
16
+ },
17
+ "w600": {
18
+ "1x": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
19
+ "2x": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
20
+ "1x_webp": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
21
+ "2x_webp": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg"
22
+ }
23
+ },
24
+ "gradients": {
25
+ "text_rgb": "0,0,0",
26
+ "bg_rgb": "214, 216, 207"
27
+ },
28
+ "tag": "Можно купить",
29
+ "first_title": "Шторка для камеры",
30
+ "second_title": "500р."
31
+ }
32
+ },
33
+ "only_on": "mobile"
34
+ },
35
+
36
+ "rich_dark": {
37
+ "type": "related_rich",
38
+ "data": {
39
+ "url": "https://meduza.io/",
40
+ "fallback": {
41
+ "data": {
42
+ "title": "Не богато вышло",
43
+ "related": [
44
+ {
45
+ "title": "«Если кто-нибудь видит меня и слышит, пожалуйста, распространите это видео любым способом! Чтобы я существовал!»",
46
+ "second": "Автор фильма «Котлован» — о том, как сделал его из обращений россиян к Путину",
47
+ "layout": "rich",
48
+ "url": "feature/2018/09/18/na-rossiyskuyu-bolnitsu-pervye-podali-v-sud-za-otkaz-v-poseschenii-umirayuschego-v-reanimatsii-rodstvennika-sud-vstal-na-storonu-medikov",
49
+ "id": "0-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
50
+ }
51
+ ]
52
+ },
53
+ "only_on": "desktop"
54
+ },
55
+ "cover": {
56
+ "ratio": 1.5,
57
+ "layout": "rich",
58
+ "urls": {
59
+ "w325": {
60
+ "1x": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
61
+ "2x": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
62
+ "1x_webp": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
63
+ "2x_webp": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg"
64
+ },
65
+ "w600": {
66
+ "1x": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
67
+ "2x": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
68
+ "1x_webp": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
69
+ "2x_webp": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg"
70
+ }
71
+ },
72
+ "first_title": "Шторка для камеры",
73
+ "second_title": "500р.",
74
+
75
+ "tag": "Можно купить",
76
+ "gradients": {
77
+ "text_rgb": "255,255,255",
78
+ "bg_rgb": "0,0,0"
79
+ }
80
+ }
81
+ },
82
+ "only_on": "desktop"
83
+ },
84
+
85
+ "rich_and_featured_desktop": {
86
+ "type": "related_rich",
87
+ "data": {
88
+ "url": "https://meduza.io/",
89
+
90
+ "cover": {
91
+ "ratio": 1.5,
92
+ "layout": "rich",
93
+ "urls": {
94
+ "w325": {
95
+ "1x": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
96
+ "2x": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
97
+ "1x_webp": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
98
+ "2x_webp": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg"
99
+ },
100
+ "w600": {
101
+ "1x": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
102
+ "2x": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
103
+ "1x_webp": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg",
104
+ "2x_webp": "//meduza.io/image/attachments/images/006/942/207/original/SvVDNHQAimcm6VGxS21y1A.jpg"
105
+ }
106
+ },
107
+ "first_title": "Шторка для камеры",
108
+ "second_title": "500р.",
109
+
110
+ "tag": "Можно купить",
111
+ "gradients": {
112
+ "text_rgb": "0,0,0",
113
+ "bg_rgb": "214, 216, 207"
114
+ }
115
+ }
116
+ },
117
+ "only_on": "desktop"
118
+ },
119
+
120
+ "rich_and_featured_mobile": {
121
+ "type": "related_rich",
122
+ "data": {
123
+ "url": "https://meduza.io/",
124
+
125
+ "cover": {
126
+ "ratio": 0.63,
127
+ "layout": "rich",
128
+ "urls": {
129
+ "w325": {
130
+ "1x": "http://meduza.io/impro/YW9jtqBkQc7dgyPKdgtvS8JlSvPyIgY7p-7-9C49csw/fill/325/0/ce/1/aHR0cHM6Ly9tZWR1/emEuaW8vaW1hZ2Uv/YXR0YWNobWVudHMv/aW1hZ2VzLzAwNC81/NDMvOTE4L29yaWdp/bmFsLzRDeHQwdFR5/YWhlUGhnZHd4YVBz/R1EuanBn.jpg",
131
+ "2x": "http://meduza.io/impro/jQf0sx4Df9y23YQ0HKyGauLGYB6kMxQ_jR2QExB4_Q0/fill/650/0/ce/1/aHR0cHM6Ly9tZWR1/emEuaW8vaW1hZ2Uv/YXR0YWNobWVudHMv/aW1hZ2VzLzAwNC81/NDMvOTE4L29yaWdp/bmFsLzRDeHQwdFR5/YWhlUGhnZHd4YVBz/R1EuanBn.jpg",
132
+ "1x_webp": "http://meduza.io/impro/dROSpimx8lYjBAbaWxhjPzPggOoz_RxV8useloSPgbQ/fill/325/0/ce/1/aHR0cHM6Ly9tZWR1/emEuaW8vaW1hZ2Uv/YXR0YWNobWVudHMv/aW1hZ2VzLzAwNC81/NDMvOTE4L29yaWdp/bmFsLzRDeHQwdFR5/YWhlUGhnZHd4YVBz/R1EuanBn.webp",
133
+ "2x_webp": "http://meduza.io/impro/dgkov3ooEbjTSe1sUvY-NLVUr6y56Dbmtpke_g-i65c/fill/650/0/ce/1/aHR0cHM6Ly9tZWR1/emEuaW8vaW1hZ2Uv/YXR0YWNobWVudHMv/aW1hZ2VzLzAwNC81/NDMvOTE4L29yaWdp/bmFsLzRDeHQwdFR5/YWhlUGhnZHd4YVBz/R1EuanBn.webp"
134
+ },
135
+ "w600": {
136
+ "1x": "http://meduza.io/impro/03bNGjN3Exb5vIT4jm4-VouBTahiFgH9gF8MhGd5hdw/fill/600/0/ce/1/aHR0cHM6Ly9tZWR1/emEuaW8vaW1hZ2Uv/YXR0YWNobWVudHMv/aW1hZ2VzLzAwNC81/NDMvOTE4L29yaWdp/bmFsLzRDeHQwdFR5/YWhlUGhnZHd4YVBz/R1EuanBn.jpg",
137
+ "2x": "http://meduza.io/impro/k7qCc2LDxE-qv6L2P5LBGo-Qmdlm68WxC2OIi6yg_SY/fill/1200/0/ce/1/aHR0cHM6Ly9tZWR1/emEuaW8vaW1hZ2Uv/YXR0YWNobWVudHMv/aW1hZ2VzLzAwNC81/NDMvOTE4L29yaWdp/bmFsLzRDeHQwdFR5/YWhlUGhnZHd4YVBz/R1EuanBn.jpg",
138
+ "1x_webp": "http://meduza.io/impro/4So4ZS9GWd3WTs4fUY7Lbk4CiKkoPhUQiigwXxZVGo0/fill/600/0/ce/1/aHR0cHM6Ly9tZWR1/emEuaW8vaW1hZ2Uv/YXR0YWNobWVudHMv/aW1hZ2VzLzAwNC81/NDMvOTE4L29yaWdp/bmFsLzRDeHQwdFR5/YWhlUGhnZHd4YVBz/R1EuanBn.webp",
139
+ "2x_webp": "http://meduza.io/impro/VZ5TtAH8GN9hENkyuoPhG7TvCLemOhHf1fgJKG9i5T4/fill/1200/0/ce/1/aHR0cHM6Ly9tZWR1/emEuaW8vaW1hZ2Uv/YXR0YWNobWVudHMv/aW1hZ2VzLzAwNC81/NDMvOTE4L29yaWdp/bmFsLzRDeHQwdFR5/YWhlUGhnZHd4YVBz/R1EuanBn.webp"
140
+ }
141
+ },
142
+ "tag": "Можно купить",
143
+ "gradients": {
144
+ "text_rgb": "255,255,255",
145
+ "bg_rgb": "0,0,0"
146
+ },
147
+ "first_title": "Шторка для камеры",
148
+ "second_title": "500р."
149
+ }
150
+ },
151
+ "only_on": "mobile"
152
+ }
153
+ }
package/src/index.tsx CHANGED
@@ -40,4 +40,5 @@ export * from './Footnote'
40
40
  export * from './RelatedRichBlock'
41
41
  export * from './SensitiveBlock'
42
42
  export * from './DonatesTeaser'
43
+ export * from './ShopRelatedBlock'
43
44
  // /* PLOP_INJECT_LINK */ //