@meduza/ui-kit-2 0.1.24 → 0.1.26
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/dist/RelatedBlock/RelatedBlock.types.d.ts +1 -0
- package/dist/ui-kit-2.cjs.development.js +59 -15
- package/dist/ui-kit-2.cjs.development.js.map +1 -1
- package/dist/ui-kit-2.cjs.production.min.js +1 -1
- package/dist/ui-kit-2.cjs.production.min.js.map +1 -1
- package/dist/ui-kit-2.esm.js +59 -15
- package/dist/ui-kit-2.esm.js.map +1 -1
- package/dist/ui-kit.css +1477 -1456
- package/dist/utils/postMessage.d.ts +1 -1
- package/package.json +1 -1
- package/src/Image/index.tsx +1 -1
- package/src/RelatedBlock/RelatedBlock.types.ts +1 -0
- package/src/RelatedBlock/index.tsx +10 -0
- package/src/RelatedRichBlock/RelatedRichBlock.module.css +14 -3
- package/src/RelatedRichBlock/RelatedRichBlock.stories.tsx +1 -0
- package/src/RelatedRichBlock/index.tsx +37 -5
- package/src/RelatedRichBlock/mock.json +5 -5
- package/src/Spoiler/index.tsx +2 -2
- package/src/utils/postMessage.ts +6 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const postMessage: (element: string, action: string) => void;
|
|
1
|
+
declare const postMessage: (category: string, element: string, action: string) => void;
|
|
2
2
|
export default postMessage;
|
package/package.json
CHANGED
package/src/Image/index.tsx
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { RelatedBlockProps } from './RelatedBlock.types'
|
|
3
3
|
import { makeClassName, ClassNames } from '../utils/makeClassName'
|
|
4
|
+
import postMessage from '../utils/postMessage'
|
|
5
|
+
|
|
4
6
|
import makeStyleContext from '../utils/makeStyleContext'
|
|
5
7
|
|
|
6
8
|
import styles from './RelatedBlock.module.css'
|
|
@@ -10,6 +12,7 @@ export const RelatedBlock: React.FC<RelatedBlockProps> = ({
|
|
|
10
12
|
data: { title, related },
|
|
11
13
|
only_on: onlyOn
|
|
12
14
|
},
|
|
15
|
+
trackClick,
|
|
13
16
|
styleContext
|
|
14
17
|
}) => {
|
|
15
18
|
let classNames: ClassNames = [
|
|
@@ -21,6 +24,12 @@ export const RelatedBlock: React.FC<RelatedBlockProps> = ({
|
|
|
21
24
|
classNames = makeStyleContext(classNames, styleContext, styles)
|
|
22
25
|
}
|
|
23
26
|
|
|
27
|
+
const handleClick = (url) => {
|
|
28
|
+
if (trackClick) {
|
|
29
|
+
postMessage('simpleRelated', url, 'click')
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
24
33
|
return (
|
|
25
34
|
<div data-testid="related-block" className={makeClassName(classNames)}>
|
|
26
35
|
<h3 className={styles.header}>{title}</h3>
|
|
@@ -31,6 +40,7 @@ export const RelatedBlock: React.FC<RelatedBlockProps> = ({
|
|
|
31
40
|
href={item.full_url || `/${item.url}`}
|
|
32
41
|
target="_blank"
|
|
33
42
|
rel="noopener noreferrer"
|
|
43
|
+
onClick={(): void => handleClick(item.full_url || item.url)}
|
|
34
44
|
>
|
|
35
45
|
<span className={styles.first}>{item.title}</span>
|
|
36
46
|
{item.second_title && ' '}
|
|
@@ -37,6 +37,15 @@
|
|
|
37
37
|
box-shadow: inset 0 4px #b88b59, inset 0 5px rgba(0, 0, 0, 0.2);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
.root,
|
|
41
|
+
.wrapper {
|
|
42
|
+
margin: 16px 0;
|
|
43
|
+
|
|
44
|
+
@media $portraitTablet {
|
|
45
|
+
margin: 25px 0;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
40
49
|
.overlay,
|
|
41
50
|
.overlayHeader {
|
|
42
51
|
position: absolute;
|
|
@@ -55,12 +64,14 @@
|
|
|
55
64
|
top: 0;
|
|
56
65
|
|
|
57
66
|
height: 150px;
|
|
58
|
-
|
|
59
|
-
|
|
60
67
|
}
|
|
61
68
|
|
|
62
69
|
.isRich .overlayHeader {
|
|
63
|
-
background: linear-gradient(
|
|
70
|
+
background: linear-gradient(
|
|
71
|
+
180deg,
|
|
72
|
+
rgba(0, 0, 0, 0.5) 0%,
|
|
73
|
+
rgba(0, 0, 0, 0) 97%
|
|
74
|
+
);
|
|
64
75
|
}
|
|
65
76
|
|
|
66
77
|
.body {
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/* eslint-disable react/jsx-no-target-blank */
|
|
2
2
|
import React, { useState, useEffect } from 'react'
|
|
3
|
+
import { useInView } from 'react-intersection-observer'
|
|
3
4
|
import { RelatedRichBlockProps } from './RelatedRichBlock.types'
|
|
4
5
|
|
|
6
|
+
import postMessage from '../utils/postMessage'
|
|
5
7
|
import { makeClassName, ClassNames } from '../utils/makeClassName'
|
|
6
8
|
import makeStyleContext from '../utils/makeStyleContext'
|
|
7
9
|
import generateGradient from '../utils/generateGradient'
|
|
@@ -30,15 +32,35 @@ export const RelatedRichBlock: React.FC<RelatedRichBlockProps> = ({
|
|
|
30
32
|
const style: React.CSSProperties = {}
|
|
31
33
|
const styleHeader: React.CSSProperties = {}
|
|
32
34
|
|
|
33
|
-
const [
|
|
35
|
+
const [type, setType] = useState('unset')
|
|
34
36
|
|
|
35
37
|
const cardType = `is${toCapitalize(layout)}`
|
|
36
38
|
|
|
37
39
|
useEffect(() => {
|
|
38
|
-
|
|
39
|
-
setIsRich(true)
|
|
40
|
+
setType(Math.random() >= 0.5 ? 'simpleRelated' : 'richRelated')
|
|
40
41
|
}, [])
|
|
41
42
|
|
|
43
|
+
const [ref, inView] = useInView({
|
|
44
|
+
threshold: 0,
|
|
45
|
+
triggerOnce: true
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (inView) {
|
|
50
|
+
if (
|
|
51
|
+
(onlyOn === 'mobile' && window.innerWidth <= 511) ||
|
|
52
|
+
(onlyOn === 'desktop' && window.innerWidth >= 512) ||
|
|
53
|
+
!onlyOn
|
|
54
|
+
) {
|
|
55
|
+
postMessage(type, url, 'view')
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}, [inView])
|
|
59
|
+
|
|
60
|
+
const handleClick = () => {
|
|
61
|
+
postMessage(type, url, 'click')
|
|
62
|
+
}
|
|
63
|
+
|
|
42
64
|
let classNames: ClassNames = [
|
|
43
65
|
[styles.root, true],
|
|
44
66
|
[styles[cardType], !!layout && !!styles[cardType]],
|
|
@@ -69,8 +91,16 @@ export const RelatedRichBlock: React.FC<RelatedRichBlockProps> = ({
|
|
|
69
91
|
)
|
|
70
92
|
}
|
|
71
93
|
|
|
72
|
-
if (
|
|
73
|
-
return <
|
|
94
|
+
if (type === 'unset') {
|
|
95
|
+
return <div className={styles.wrapper} />
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (type === 'simpleRelated') {
|
|
99
|
+
return (
|
|
100
|
+
<div ref={ref} className={styles.wrapper}>
|
|
101
|
+
<RelatedBlock block={fallback} trackClick={true} />
|
|
102
|
+
</div>
|
|
103
|
+
)
|
|
74
104
|
}
|
|
75
105
|
|
|
76
106
|
return (
|
|
@@ -79,6 +109,8 @@ export const RelatedRichBlock: React.FC<RelatedRichBlockProps> = ({
|
|
|
79
109
|
className={makeClassName(classNames)}
|
|
80
110
|
href={url}
|
|
81
111
|
target="_blank"
|
|
112
|
+
onClick={(): void => handleClick()}
|
|
113
|
+
ref={ref}
|
|
82
114
|
>
|
|
83
115
|
{layout === 'rich' && (
|
|
84
116
|
<>
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
{
|
|
42
42
|
"type": "rich_title",
|
|
43
43
|
"data": {
|
|
44
|
-
"first": "«Если кто-нибудь видит меня и слышит, пожалуйста, распространите это видео любым способом! Чтобы я существовал!»",
|
|
44
|
+
"first": "1 «Если кто-нибудь видит меня и слышит, пожалуйста, распространите это видео любым способом! Чтобы я существовал!»",
|
|
45
45
|
"second": "Автор фильма «Котлован» — о том, как сделал его из обращений россиян к Путину",
|
|
46
46
|
"as": "h3",
|
|
47
47
|
"featured": false
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
{
|
|
115
115
|
"type": "rich_title",
|
|
116
116
|
"data": {
|
|
117
|
-
"first": "«Если кто-нибудь видит меня и слышит, пожалуйста, распространите это видео любым способом! Чтобы я существовал!»",
|
|
117
|
+
"first": "2 «Если кто-нибудь видит меня и слышит, пожалуйста, распространите это видео любым способом! Чтобы я существовал!»",
|
|
118
118
|
"second": "Автор фильма «Котлован» — о том, как сделал его из обращений россиян к Путину",
|
|
119
119
|
"as": "h3",
|
|
120
120
|
"featured": false
|
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
{
|
|
188
188
|
"type": "rich_title",
|
|
189
189
|
"data": {
|
|
190
|
-
"first": "«Если кто-нибудь видит меня и слышит, пожалуйста, распространите это видео любым способом! Чтобы я существовал!»",
|
|
190
|
+
"first": "3 «Если кто-нибудь видит меня и слышит, пожалуйста, распространите это видео любым способом! Чтобы я существовал!»",
|
|
191
191
|
"second": "Автор фильма «Котлован» — о том, как сделал его из обращений россиян к Путину",
|
|
192
192
|
"as": "h3",
|
|
193
193
|
"featured": false
|
|
@@ -260,7 +260,7 @@
|
|
|
260
260
|
{
|
|
261
261
|
"type": "rich_title",
|
|
262
262
|
"data": {
|
|
263
|
-
"first": "«В биеннале есть что-то очень садистское»",
|
|
263
|
+
"first": "4 «В биеннале есть что-то очень садистское»",
|
|
264
264
|
"second": "Куратор Венецианской биеннале современного искусства Ральф Ругофф — как он добивался, чтобы выставка не была для зрителей мучением",
|
|
265
265
|
"as": "h3",
|
|
266
266
|
"featured": true
|
|
@@ -327,7 +327,7 @@
|
|
|
327
327
|
{
|
|
328
328
|
"type": "rich_title",
|
|
329
329
|
"data": {
|
|
330
|
-
"first": "До «обнуления» много говорили, что Путин в 2024 году может уйти в Госсовет. Теперь закон о нем внесли в Думу. Что там сказано?",
|
|
330
|
+
"first": "5 До «обнуления» много говорили, что Путин в 2024 году может уйти в Госсовет. Теперь закон о нем внесли в Думу. Что там сказано?",
|
|
331
331
|
"as": "h3",
|
|
332
332
|
"featured": false
|
|
333
333
|
},
|
package/src/Spoiler/index.tsx
CHANGED
|
@@ -28,13 +28,13 @@ export const Spoiler: React.FC<SpoilerProps> = ({
|
|
|
28
28
|
setSpoiled(!spoiled)
|
|
29
29
|
|
|
30
30
|
if (spoiled) {
|
|
31
|
-
postMessage('closeSpoiler', 'click')
|
|
31
|
+
postMessage('', 'closeSpoiler', 'click')
|
|
32
32
|
const rect = ref.current.getBoundingClientRect()
|
|
33
33
|
if (rect.top < 0) {
|
|
34
34
|
ref.current.scrollIntoView({ behavior: 'smooth' })
|
|
35
35
|
}
|
|
36
36
|
} else {
|
|
37
|
-
postMessage('openSpoiler', 'click')
|
|
37
|
+
postMessage('', 'openSpoiler', 'click')
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
|
package/src/utils/postMessage.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
const POST_MESSAGE_PREFIX = 'mdzKitMsg'
|
|
2
2
|
|
|
3
|
-
const postMessage = (
|
|
3
|
+
const postMessage = (
|
|
4
|
+
category: string,
|
|
5
|
+
element: string,
|
|
6
|
+
action: string
|
|
7
|
+
): void => {
|
|
4
8
|
const target = window.top
|
|
5
9
|
|
|
6
10
|
const msg = `${POST_MESSAGE_PREFIX}=${JSON.stringify({
|
|
11
|
+
category,
|
|
7
12
|
element,
|
|
8
13
|
action
|
|
9
14
|
})}`
|