@kids-reporter/draft-renderer 0.1.0 → 0.2.0

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 (51) hide show
  1. package/lib/block-render-map.js +183 -0
  2. package/lib/block-renderer-fn.js +15 -74
  3. package/lib/block-renderers/embedded-code-block.js +16 -20
  4. package/lib/block-renderers/image-block.js +90 -46
  5. package/lib/block-renderers/index.js +2 -31
  6. package/lib/block-renderers/info-box-block.js +2 -115
  7. package/lib/block-renderers/multimedia.js +127 -0
  8. package/lib/block-renderers/slideshow-block.js +574 -199
  9. package/lib/draft-renderer.js +10 -194
  10. package/lib/entity-decorators/annotation-decorator.js +58 -100
  11. package/lib/entity-decorators/index.js +17 -6
  12. package/lib/entity-decorators/link-decorator.js +4 -7
  13. package/lib/index.js +39 -14
  14. package/lib/theme/index.js +0 -11
  15. package/package.json +10 -6
  16. package/lib/assets/annotation-arrow.png +0 -0
  17. package/lib/assets/audio-pause.png +0 -0
  18. package/lib/assets/audio-play.png +0 -0
  19. package/lib/assets/citation-download.png +0 -0
  20. package/lib/assets/default-og-img.png +0 -0
  21. package/lib/assets/slideshow-arrow-down-dark.png +0 -0
  22. package/lib/assets/slideshow-arrow-down.png +0 -0
  23. package/lib/assets/slideshow-arrow-up.png +0 -0
  24. package/lib/assets/slideshow-close-cross.png +0 -0
  25. package/lib/block-renderers/audio-block.js +0 -162
  26. package/lib/block-renderers/background-image-block.js +0 -257
  27. package/lib/block-renderers/background-video-block.js +0 -272
  28. package/lib/block-renderers/color-box-block.js +0 -94
  29. package/lib/block-renderers/divider-block.js +0 -27
  30. package/lib/block-renderers/media-block.js +0 -65
  31. package/lib/block-renderers/related-post-block.js +0 -73
  32. package/lib/block-renderers/side-index-block.js +0 -49
  33. package/lib/block-renderers/table-block.js +0 -455
  34. package/lib/block-renderers/video-block.js +0 -37
  35. package/lib/components/slideshow-lightbox.js +0 -134
  36. package/lib/components/slideshow-sidebar.js +0 -148
  37. package/lib/const.js +0 -10
  38. package/lib/entity-decorator.js +0 -18
  39. package/lib/public/07d1287fd390346af0c15b930148a5e4.png +0 -0
  40. package/lib/public/5b3cb1a908786c8750f1041860699cc1.png +0 -0
  41. package/lib/public/679d63b1846e81ada28c2f76edbd2931.png +0 -0
  42. package/lib/public/722f90c535fa64c27555ec6ee5f22393.png +0 -0
  43. package/lib/public/903cf84ef5c5ad76634c30bdc0ff8c49.png +0 -0
  44. package/lib/public/dc249b3412c5af890a004508287a3c3d.png +0 -0
  45. package/lib/public/dd45f0788d9c70cabe72430bf08e7413.png +0 -0
  46. package/lib/public/f96d4b486ba2061c460962ae694f4670.png +0 -0
  47. package/lib/shared-style/content-type.js +0 -163
  48. package/lib/shared-style/index.js +0 -108
  49. package/lib/types/index.js +0 -32
  50. package/lib/utils/common.js +0 -44
  51. package/lib/utils/post.js +0 -147
@@ -4,15 +4,15 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.SlideshowBlock = SlideshowBlock;
7
- exports.SlideshowBlockV2 = SlideshowBlockV2;
7
+ exports.SlideshowInArticleBody = SlideshowInArticleBody;
8
8
 
9
- var _reactImage = _interopRequireDefault(require("@readr-media/react-image"));
9
+ var _multimedia = _interopRequireDefault(require("./multimedia"));
10
10
 
11
11
  var _react = _interopRequireWildcard(require("react"));
12
12
 
13
- var _styledComponents = _interopRequireDefault(require("styled-components"));
13
+ var _mediaQuery = _interopRequireDefault(require("@twreporter/core/lib/utils/media-query"));
14
14
 
15
- var _slideshowLightbox = _interopRequireDefault(require("../components/slideshow-lightbox"));
15
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
16
16
 
17
17
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
18
18
 
@@ -20,234 +20,609 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
20
20
 
21
21
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
22
 
23
- const defaultImage = "https://unpkg.com/@kids-reporter/draft-renderer@0.1.0/lib/public/722f90c535fa64c27555ec6ee5f22393.png";
24
- const arrowDown = "https://unpkg.com/@kids-reporter/draft-renderer@0.1.0/lib/public/dd45f0788d9c70cabe72430bf08e7413.png";
25
- const SlideShowDesktopSize = 960;
26
- const SpacingBetweenSlideImages = 12;
27
- const SlideShowBlockWrapper = _styledComponents.default.div`
28
- width: calc(100% + 40px);
29
- transform: translateX(-20px);
30
- position: relative;
31
- ${({
32
- theme
33
- }) => theme.margin.default};
34
-
35
- ${({
36
- theme
37
- }) => theme.breakpoint.xl} {
38
- width: ${SlideShowDesktopSize}px;
39
- display: flex;
40
- align-items: center;
41
- justify-content: center;
42
- flex-wrap: wrap;
43
- transform: translateX(-180px);
44
- gap: ${SpacingBetweenSlideImages}px;
45
- max-height: ${props => props.expandSlideShow ? 'none' : '960px'};
46
- overflow: ${props => props.expandSlideShow ? 'visible' : 'hidden'};
47
- margin-bottom: ${props => props.expandSlideShow ? '32px' : '16px'};
48
- }
23
+ // @ts-ignore pkg does not contain ts header file
24
+ const mockup = {
25
+ mobile: {
26
+ container: {
27
+ width: 375 // px
28
+
29
+ },
30
+ slide: {
31
+ width: 339,
32
+ // px
33
+ height: 189,
34
+ // px
35
+ paddingRight: 2 // px
36
+
37
+ },
38
+ offset: {
39
+ left: 18 // px
40
+
41
+ }
42
+ },
43
+ tablet: {
44
+ container: {
45
+ width: 768 // px
46
+
47
+ },
48
+ slide: {
49
+ width: 687,
50
+ // px
51
+ height: 387,
52
+ // px
53
+ paddingRight: 4 // px
54
+
55
+ },
56
+ offset: {
57
+ left: 41 // px
58
+
59
+ }
60
+ },
61
+ desktop: {
62
+ container: {
63
+ width: 752 // px
64
+
65
+ },
66
+ slide: {
67
+ width: 688,
68
+ // px
69
+ height: 387,
70
+ // px
71
+ paddingRight: 4 // px
72
+
73
+ },
74
+ offset: {
75
+ left: 32 // px
76
+
77
+ }
78
+ },
79
+ hd: {
80
+ container: {
81
+ width: 1034 // px
82
+
83
+ },
84
+ slide: {
85
+ width: 944,
86
+ // px
87
+ height: 531,
88
+ // px
89
+ paddingRight: 4 // px
49
90
 
50
- .slideshow-image {
51
- max-height: ${props => props.shouldLimitFigureHeight ? 'calc(960px - 324px)' : 'none'};
91
+ },
92
+ offset: {
93
+ left: 45 // px
94
+
95
+ }
52
96
  }
97
+ }; // Assuming there are three images [ A, B, C ] for slideshow.
98
+ // If image B is rendered in the center,
99
+ // users can see part of image A(left side) and image C(right side) with masks.
100
+ // When users click right button to see image C, which means, C is in the center,
101
+ // users still can see part of image B(left side) and image A(right side) with masks.
102
+ //
103
+ // Hence, there are four images rendered arround B at the beginning.
104
+ // The image array should be [ C, A, B, C, A ].
105
+ //
106
+ // `slidesOffset` indicates how many slides rendered before/after image B, which is, 2 (A and C).
107
+ //
108
+
109
+ const slidesOffset = 2; // duration of transition of transform(translateX(?px))
110
+
111
+ const duration = 300; // current index to indicate which image should be rendered in the center
112
+
113
+ const defaultCurIndex = 0;
114
+ const SlidesSection = _styledComponents.default.div`
115
+ flex-shrink: 0;
116
+ flex-basis: 100%;
117
+ overflow: hidden;
118
+ position: relative;
119
+
120
+ ${_mediaQuery.default.tabletAndBelow`
121
+ order: 2;
122
+ `}
123
+
124
+ ${_mediaQuery.default.mobileOnly`
125
+ padding-bottom: calc(${mockup.mobile.slide.height}/${mockup.mobile.container.width}*100%);
126
+ `}
127
+
128
+ ${_mediaQuery.default.tabletOnly`
129
+ padding-bottom: calc(${mockup.tablet.slide.height}/${mockup.tablet.container.width}*100%);
130
+ `}
131
+
132
+ ${_mediaQuery.default.desktopOnly`
133
+ padding-bottom: calc(${mockup.desktop.slide.height}/${mockup.desktop.container.width}*100%);
134
+ `}
135
+
136
+ ${_mediaQuery.default.hdOnly`
137
+ padding-bottom: calc(${mockup.hd.slide.height}/${mockup.hd.container.width}*100%);
138
+ `}
53
139
  `;
54
- const SlideShowImage = _styledComponents.default.figure`
55
- width: 100%;
56
- aspect-ratio: 1/1;
140
+ const PrevNextSection = _styledComponents.default.div`
141
+ margin-top: 20px;
142
+
143
+ ${_mediaQuery.default.tabletAndBelow`
144
+ order: 3;
145
+ `}
146
+
147
+ ${_mediaQuery.default.mobileOnly`
148
+ margin-left: 25px;
149
+ `}
150
+
151
+ ${_mediaQuery.default.tabletOnly`
152
+ margin-left: 47px;
153
+ `}
154
+ `;
155
+ const PrevButton = _styledComponents.default.div`
156
+ cursor: pointer;
157
+ width: 59px;
158
+ height: 59px;
159
+ display: inline-flex;
160
+ border: solid 1px;
57
161
 
58
- & + .slideshow-image {
59
- margin-top: ${SpacingBetweenSlideImages}px;
162
+ > svg {
163
+ margin: auto;
164
+ width: 21px;
60
165
  }
61
166
 
62
- ${({
63
- theme
64
- }) => theme.breakpoint.xl} {
65
- flex: 1 0 calc((100% - ${SpacingBetweenSlideImages * 2}px) / 3);
66
- min-width: ${SlideShowDesktopSize / 3 - 8}px;
167
+ ${_mediaQuery.default.hdOnly`
168
+ width: 83px;
169
+ height: 83px;
67
170
 
68
- &:hover {
69
- cursor: pointer;
70
- filter: brightness(15%);
71
- transition: 0.3s;
171
+ > svg {
172
+ width: 31px;
72
173
  }
174
+ `}
73
175
 
74
- & + .slideshow-image {
75
- margin-top: unset;
176
+ &:hover {
177
+ > svg {
178
+ transform: translateX(-5px);
179
+ transition: transform 0.3s ease;
76
180
  }
77
181
  }
78
182
  `;
79
- const FigCaption = _styledComponents.default.figcaption`
80
- font-weight: 400;
81
- line-height: 23px;
82
- color: #000928;
83
- opacity: 0.5;
84
- ${({
85
- theme
86
- }) => theme.fontSize.xs};
87
- padding: 8px 20px 20px 20px;
88
-
89
- ${({
90
- theme
91
- }) => theme.breakpoint.md} {
92
- ${({
93
- theme
94
- }) => theme.fontSize.sm};
95
- }
183
+ const NextButton = (0, _styledComponents.default)(PrevButton)`
184
+ border-left: none;
96
185
 
97
- ${({
98
- theme
99
- }) => theme.breakpoint.xl} {
100
- display: none;
186
+ &:hover {
187
+ > svg {
188
+ transform: translateX(5px);
189
+ }
101
190
  }
102
191
  `;
103
- const GradientMask = _styledComponents.default.div`
104
- display: none;
192
+ const ImageNumberCircle = _styledComponents.default.div`
193
+ display: inline-block;
194
+ width: 80px;
195
+ height: 80px;
196
+ border-radius: 50%;
197
+ vertical-align: top;
105
198
 
106
- ${({
107
- theme
108
- }) => theme.breakpoint.xl} {
109
- cursor: pointer;
110
- display: block;
199
+ position: relative;
200
+
201
+ &::after {
202
+ content: '';
111
203
  position: absolute;
112
- width: 100%;
113
- height: ${SlideShowDesktopSize}px;
114
- bottom: 0;
115
- left: 0;
116
- background: linear-gradient(
117
- to bottom,
118
- rgba(255, 255, 255, 0) 648px,
119
- rgba(255, 255, 255, 1) 960px
120
- );
204
+ width: 62px;
205
+ border-top: solid 1px;
206
+ transform: rotate(-45deg);
207
+ transform-origin: bottom left;
208
+ top: 67px;
209
+ left: 7px;
121
210
  }
122
- `;
123
- const ExpandText = _styledComponents.default.div`
124
- display: none;
125
-
126
- ${({
127
- theme
128
- }) => theme.breakpoint.xl} {
129
- display: block;
130
- font-style: normal;
131
- font-weight: 700;
132
- ${({
133
- theme
134
- }) => theme.fontSize.md};
135
- line-height: 18px;
136
- letter-spacing: 0.03em;
137
- color: #000928;
138
- text-align: center;
139
- cursor: pointer;
140
- position: relative;
141
- margin-bottom: 48px;
142
- transition: all 0.2s ease;
143
-
144
- &:hover::after,
145
- &:active::after {
146
- bottom: -30px;
147
- transition: all 0.2s;
148
- }
211
+
212
+ ${_mediaQuery.default.tabletAndBelow`
213
+ order: 1;
214
+
215
+ /* align right */
216
+ margin-left: auto;
217
+ /* 10px is the border-right width of body */
218
+ margin-right: 10px;
219
+ `}
220
+
221
+ ${_mediaQuery.default.desktopAndAbove`
222
+ margin-top: 6px;
223
+
224
+ /* align right */
225
+ margin-left: auto;
226
+ `}
227
+
228
+ ${_mediaQuery.default.hdOnly`
229
+ margin-right: -18px;
230
+ width: 110px;
231
+ height: 110px;
149
232
 
150
233
  &::after {
151
- content: '';
152
- position: absolute;
153
- bottom: -26px;
154
- left: 50%;
155
- transform: translate(-50%, 0%);
156
- width: 14px;
157
- height: 13px;
158
- background-image: url(${arrowDown});
159
- background-repeat: no-repeat;
160
- background-position: center center;
161
- background-size: 14px;
234
+ width: 89px;
235
+ top: 93px;
236
+ left: 10px;
162
237
  }
163
- }
164
- `; // support old version of slideshow without delay propertiy
238
+ `}
239
+ `;
240
+ const ImageNumber = _styledComponents.default.span`
241
+ position: absolute;
242
+ top: 25px;
243
+ left: 9px;
244
+ font-size: 24px;
245
+ font-weight: bold;
246
+ line-height: 0.79;
165
247
 
166
- const Figure = _styledComponents.default.figure`
167
- position: relative;
168
- margin-block: unset;
169
- margin-inline: unset;
170
- margin: 0 10px;
248
+ ${_mediaQuery.default.hdOnly`
249
+ top: 35px;
250
+ left: 10px;
251
+ `}
252
+ `;
253
+ const ImageTotal = (0, _styledComponents.default)(ImageNumber)`
254
+ top: 46px;
255
+ left: 36px;
256
+
257
+ ${_mediaQuery.default.hdOnly`
258
+ top: 71px;
259
+ left: 50px;
260
+ `}
171
261
  `;
172
- const Image = _styledComponents.default.img`
262
+ const Desc = (0, _styledComponents.default)(_multimedia.default.Caption)`
263
+ align-self: flex-start;
264
+ display: inline-block;
265
+
266
+ /* overwrite Multimedia.Caption styles */
267
+ margin-bottom: 0;
268
+
269
+ ${_mediaQuery.default.tabletAndBelow`
270
+ order: 4;
271
+ padding-top: 15px;
272
+ `}
273
+
274
+ ${_mediaQuery.default.mobileOnly`
275
+ width: calc(180/355*100%);
276
+ `}
277
+
278
+ ${_mediaQuery.default.desktopAndAbove`
279
+ padding-top: 30px;
280
+
281
+ /* overwrite Multimedia.Caption styles */
282
+ float: none;
283
+ `}
284
+ `;
285
+ const EmptyDesc = (0, _styledComponents.default)(Desc)`
286
+ &::after {
287
+ border-bottom: none;
288
+ }
289
+ `;
290
+ const SlidesFlexBox = _styledComponents.default.div`
291
+ position: absolute;
292
+ top: 0;
293
+ left: 0;
294
+ display: flex;
295
+ flex-wrap: nowrap;
173
296
  width: 100%;
297
+ height: 100%;
298
+ ${props => {
299
+ if (props.isSliding) {
300
+ return `transition: transform ${props.duration}ms ease-in-out;`;
301
+ }
302
+ }}
303
+
304
+ ${_mediaQuery.default.mobileOnly`
305
+ transform: translateX(${props => getTranslateX(mockup.mobile, props.translateXUint) / getContainerWidth(mockup.mobile) * 100}%);
306
+ `}
307
+
308
+ ${_mediaQuery.default.tabletOnly`
309
+ transform: translateX(${props => getTranslateX(mockup.tablet, props.translateXUint) / getContainerWidth(mockup.tablet) * 100}%);
310
+ `}
311
+
312
+ ${_mediaQuery.default.desktopOnly`
313
+ transform: translateX(${props => getTranslateX(mockup.desktop, props.translateXUint)}px);
314
+ `}
315
+
316
+ ${_mediaQuery.default.hdOnly`
317
+ transform: translateX(${props => getTranslateX(mockup.hd, props.translateXUint)}px);
318
+ `}
319
+ `;
320
+ const SlideFlexItem = _styledComponents.default.div`
321
+ height: 100%;
322
+ flex-shrink: 0;
323
+
324
+ ${_mediaQuery.default.mobileOnly`
325
+ flex-basis: calc(${getSlideWidth(mockup.mobile)}/${getContainerWidth(mockup.mobile)}*100%);
326
+ padding-right: calc(${mockup.mobile.slide.paddingRight}/${getContainerWidth(mockup.mobile)}*100%);
327
+ `}
328
+
329
+ ${_mediaQuery.default.tabletOnly`
330
+ flex-basis: calc(${getSlideWidth(mockup.tablet)}/${getContainerWidth(mockup.tablet)}*100%);
331
+ padding-right: calc(${mockup.tablet.slide.paddingRight}/${getContainerWidth(mockup.tablet)}*100%);
332
+ `}
333
+
334
+
335
+ ${_mediaQuery.default.desktopOnly`
336
+ flex-basis: ${getSlideWidth(mockup.desktop)}px;
337
+ padding-right: ${mockup.desktop.slide.paddingRight}px;
338
+ `}
339
+
340
+ ${_mediaQuery.default.hdOnly`
341
+ flex-basis: ${getSlideWidth(mockup.hd)}px;
342
+ padding-right: ${mockup.hd.slide.paddingRight}px;
343
+ `}
344
+ `;
345
+ const SlideMask = _styledComponents.default.div`
346
+ position: absolute;
347
+ top: 0;
348
+ height: 100%;
349
+ opacity: 0.55;
350
+ `;
351
+ const LeftSlideMask = (0, _styledComponents.default)(SlideMask)`
352
+ left: 0;
353
+
354
+ ${_mediaQuery.default.mobileOnly`
355
+ width: ${getLeftMaskWidth(mockup.mobile) / getContainerWidth(mockup.mobile) * 100}%;
356
+ `}
357
+
358
+ ${_mediaQuery.default.tabletOnly`
359
+ width: ${getLeftMaskWidth(mockup.tablet) / getContainerWidth(mockup.tablet) * 100}%;
360
+ `}
361
+
362
+ ${_mediaQuery.default.desktopOnly`
363
+ width: ${getLeftMaskWidth(mockup.desktop)}px;
364
+ `}
365
+
366
+ ${_mediaQuery.default.hdOnly`
367
+ width: ${getLeftMaskWidth(mockup.hd)}px;
368
+ `}
174
369
  `;
370
+ const RightSlideMask = (0, _styledComponents.default)(SlideMask)`
371
+ right: 0;
175
372
 
176
- function SlideshowBlock(entity) {
177
- var _images$, _images$$resized, _images$2;
373
+ ${_mediaQuery.default.mobileOnly`
374
+ width: ${getRightMaskWidth(mockup.mobile) / getContainerWidth(mockup.mobile) * 100}%;
375
+ `}
178
376
 
179
- const images = entity.getData();
180
- return /*#__PURE__*/_react.default.createElement(Figure, null, /*#__PURE__*/_react.default.createElement(Image, {
181
- src: images === null || images === void 0 ? void 0 : (_images$ = images[0]) === null || _images$ === void 0 ? void 0 : (_images$$resized = _images$.resized) === null || _images$$resized === void 0 ? void 0 : _images$$resized.original,
182
- alt: images === null || images === void 0 ? void 0 : (_images$2 = images[0]) === null || _images$2 === void 0 ? void 0 : _images$2.name,
183
- onError: e => {
184
- var _images$3, _images$3$imageFile;
377
+ ${_mediaQuery.default.tabletOnly`
378
+ width: ${getRightMaskWidth(mockup.tablet) / getContainerWidth(mockup.tablet) * 100}%;
379
+ `}
185
380
 
186
- return e.currentTarget.src = images === null || images === void 0 ? void 0 : (_images$3 = images[0]) === null || _images$3 === void 0 ? void 0 : (_images$3$imageFile = _images$3.imageFile) === null || _images$3$imageFile === void 0 ? void 0 : _images$3$imageFile.url;
381
+ ${_mediaQuery.default.desktopOnly`
382
+ width: ${getRightMaskWidth(mockup.desktop)}px;
383
+ `}
384
+
385
+ ${_mediaQuery.default.hdOnly`
386
+ width: ${getRightMaskWidth(mockup.hd)}px;
387
+ `}
388
+ `;
389
+ const SlideshowFlexBox = _styledComponents.default.div`
390
+ ${PrevButton} {
391
+ border-color: #d8d8d8;
392
+ }
393
+ ${ImageNumberCircle} {
394
+ background-color: #d0a67d;
395
+ &::after {
396
+ border-color: #fff;
187
397
  }
188
- }));
189
- } // 202206 latest version of slideshow, support delay property
398
+ }
399
+ ${ImageNumber} {
400
+ color: #fff;
401
+ }
402
+ ${SlideMask} {
403
+ background-color: #d0a67d;
404
+ }
190
405
 
406
+ width: 100%;
407
+ display: flex;
408
+ justify-content: space-between;
409
+ flex-wrap: wrap;
410
+
411
+ ${_mediaQuery.default.tabletAndBelow`
412
+ width: 100%;
413
+ `}
414
+
415
+ ${_mediaQuery.default.desktopOnly`
416
+ width: ${mockup.desktop.container.width}px;
417
+ `}
418
+
419
+ ${_mediaQuery.default.hdOnly`
420
+ width: ${mockup.hd.container.width}px;
421
+ `}
422
+ `;
423
+
424
+ function getTranslateX(deviceMockup, unit) {
425
+ const slideWidth = getSlideWidth(deviceMockup); // total slides width including padding
426
+
427
+ let translateX = unit * slideWidth; // add left mask width and padding
428
+
429
+ translateX = translateX + deviceMockup.offset.left;
430
+ return translateX; // px
431
+ }
432
+ /**
433
+ * @param {DeviceMockup} deviceMockup
434
+ * @return {number}
435
+ */
436
+
437
+
438
+ function getContainerWidth(deviceMockup) {
439
+ return deviceMockup.container.width;
440
+ }
441
+ /**
442
+ * @param {DeviceMockup} deviceMockup
443
+ * @return {number}
444
+ */
445
+
446
+
447
+ function getSlideWidth(deviceMockup) {
448
+ return deviceMockup.slide.width + deviceMockup.slide.paddingRight;
449
+ }
450
+ /**
451
+ * @param {DeviceMockup} deviceMockup
452
+ * @return {number}
453
+ */
454
+
455
+
456
+ function getLeftMaskWidth(deviceMockup) {
457
+ return deviceMockup.offset.left - deviceMockup.slide.paddingRight; // px
458
+ }
459
+ /**
460
+ * @param {DeviceMockup} deviceMockup
461
+ * @return {number}
462
+ */
191
463
 
192
- function SlideshowBlockV2(entity) {
193
- const {
194
- images
195
- } = entity.getData();
196
- const [expandSlideShow, setExpandSlideShow] = (0, _react.useState)(false);
197
- const [showLightBox, setShowLightBox] = (0, _react.useState)(false);
198
- const [focusImageIndex, setFocusImageIndex] = (0, _react.useState)(0);
199
- const imagesRefs = (0, _react.useRef)(Array(images.length).fill(null));
200
- (0, _react.useEffect)(() => {
201
- const focusedImageRef = imagesRefs === null || imagesRefs === void 0 ? void 0 : imagesRefs.current[focusImageIndex];
202
464
 
203
- if (focusedImageRef) {
204
- focusedImageRef === null || focusedImageRef === void 0 ? void 0 : focusedImageRef.scrollIntoView({
205
- behavior: 'smooth',
206
- block: 'center'
207
- });
465
+ function getRightMaskWidth(deviceMockup) {
466
+ return deviceMockup.container.width - deviceMockup.offset.left - getSlideWidth(deviceMockup); // px
467
+ }
468
+
469
+ function SlideshowBlock({
470
+ className = '',
471
+ data
472
+ }) {
473
+ var _images$curSlideIndex;
474
+
475
+ const defaultTranslateXUnit = -slidesOffset; // value of curSlideIndex would be in [ 0 ~ props.data.content.length ] range,
476
+ // it indicates which image should be placed in the center
477
+
478
+ const [curSlideIndex, setCurSlideIndex] = (0, _react.useState)(defaultCurIndex);
479
+ const [slideTo, setSlideTo] = (0, _react.useState)(''); // '', 'previous' or 'next'. '' means no sliding.
480
+
481
+ const [translateXUnit, setTranslateXUnit] = (0, _react.useState)(defaultTranslateXUnit);
482
+ const images = ((data === null || data === void 0 ? void 0 : data.images) || []).filter(img => {
483
+ var _img$imageFile;
484
+
485
+ return img === null || img === void 0 ? void 0 : (_img$imageFile = img.imageFile) === null || _img$imageFile === void 0 ? void 0 : _img$imageFile.url;
486
+ });
487
+ const total = images === null || images === void 0 ? void 0 : images.length;
488
+ const desc = images === null || images === void 0 ? void 0 : (_images$curSlideIndex = images[curSlideIndex]) === null || _images$curSlideIndex === void 0 ? void 0 : _images$curSlideIndex.desc;
489
+ const appendedClassName = className + ' avoid-break';
490
+ const slides = (0, _react.useMemo)(() => {
491
+ // add last `slidesOffset` elements into top of images array.
492
+ // add first `slidesOffset` elements into bottom of images array.
493
+ // EX:
494
+ // slidesOffset: 2
495
+ // input images: [ a, b, c, d ]
496
+ // output images: [c, d, a, b, c, d, a, b]
497
+ const _images = [...images.slice(-slidesOffset), ...images, ...images.slice(defaultCurIndex, slidesOffset)];
498
+ return _images === null || _images === void 0 ? void 0 : _images.map((img, index) => {
499
+ var _img$resized, _img$resized2, _img$resized3, _img$resized4;
500
+
501
+ const width = img.imageFile.width ?? 0;
502
+ const height = img.imageFile.height ?? 0;
503
+ const imgSrc = ((_img$resized = img.resized) === null || _img$resized === void 0 ? void 0 : _img$resized.medium) ?? img.imageFile.url;
504
+ const imgSrcSetArr = [];
505
+
506
+ if ((_img$resized2 = img.resized) !== null && _img$resized2 !== void 0 && _img$resized2.small) {
507
+ imgSrcSetArr.push(`${img.resized.medium} 600w`);
508
+ }
509
+
510
+ if ((_img$resized3 = img.resized) !== null && _img$resized3 !== void 0 && _img$resized3.medium) {
511
+ imgSrcSetArr.push(`${img.resized.medium} 1200w`);
512
+ }
513
+
514
+ if ((_img$resized4 = img.resized) !== null && _img$resized4 !== void 0 && _img$resized4.large) {
515
+ imgSrcSetArr.push(`${img.resized.large} 2000w`);
516
+ }
517
+
518
+ const objectFit = width > height ? 'cover' : 'contain';
519
+ return (
520
+ /*#__PURE__*/
521
+ // since the items of _images would have the same id,
522
+ // hence, we append `index` on the key
523
+ _react.default.createElement(SlideFlexItem, {
524
+ key: `slide_${img.id}_${index}`
525
+ }, /*#__PURE__*/_react.default.createElement("img", {
526
+ srcSet: imgSrcSetArr.join(','),
527
+ src: imgSrc,
528
+ style: {
529
+ objectFit,
530
+ width: '100%'
531
+ },
532
+ sizes: "(max-width: 768px) 100vw, (min-width: 1400px) 1000px, 500px"
533
+ }))
534
+ );
535
+ });
536
+ }, [images]);
537
+
538
+ const slideToPrev = () => {
539
+ setSlideTo('previous');
540
+ setTranslateXUnit(translateXUnit + 1);
541
+ };
542
+
543
+ const slideToNext = () => {
544
+ setSlideTo('next');
545
+ setTranslateXUnit(translateXUnit - 1);
546
+ };
547
+
548
+ (0, _react.useEffect)(() => {
549
+ if (slideTo === '') {
550
+ return;
208
551
  }
209
- }, [focusImageIndex]);
210
- const shouldMaskSlideShow = Boolean(images.length > 9 && !expandSlideShow);
211
- const shouldLimitFigureHeight = Boolean(images.length > 1);
212
- const slideShowImages = images.map((image, index) => {
213
- const {
214
- id,
215
- resized,
216
- desc,
217
- name
218
- } = image;
219
- return /*#__PURE__*/_react.default.createElement(SlideShowImage, {
220
- className: "slideshow-image",
221
- key: id,
222
- onClick: () => {
223
- setShowLightBox(!showLightBox);
224
- setFocusImageIndex(index);
552
+
553
+ let _curSlideIndex;
554
+
555
+ if (slideTo === 'previous') {
556
+ _curSlideIndex = curSlideIndex - 1;
557
+
558
+ if (_curSlideIndex < defaultCurIndex) {
559
+ _curSlideIndex = total + _curSlideIndex;
225
560
  }
226
- }, /*#__PURE__*/_react.default.createElement(_reactImage.default, {
227
- images: resized,
228
- defaultImage: defaultImage,
229
- alt: name,
230
- rwd: {
231
- mobile: '100vw',
232
- tablet: '608px',
233
- desktop: '960px',
234
- default: '100%'
235
- },
236
- priority: true
237
- }), desc && /*#__PURE__*/_react.default.createElement(FigCaption, null, desc));
238
- });
239
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(SlideShowBlockWrapper, {
240
- onClick: () => setExpandSlideShow(!expandSlideShow),
241
- expandSlideShow: expandSlideShow,
242
- shouldLimitFigureHeight: shouldLimitFigureHeight
243
- }, slideShowImages, shouldMaskSlideShow && /*#__PURE__*/_react.default.createElement(GradientMask, null)), shouldMaskSlideShow && /*#__PURE__*/_react.default.createElement(ExpandText, {
244
- className: "slideshow-expand-text",
245
- onClick: () => setExpandSlideShow(!expandSlideShow)
246
- }, "\u5C55\u958B\u6240\u6709\u5716\u7247"), showLightBox && /*#__PURE__*/_react.default.createElement(_slideshowLightbox.default, {
247
- focusImageIndex: focusImageIndex,
248
- images: images,
249
- setShowLightBox: setShowLightBox,
250
- setFocusImageIndex: setFocusImageIndex,
251
- imagesRefs: imagesRefs
561
+ } else if (slideTo === 'next') {
562
+ _curSlideIndex = curSlideIndex + 1;
563
+
564
+ if (_curSlideIndex >= total) {
565
+ _curSlideIndex = _curSlideIndex % total;
566
+ }
567
+ }
568
+
569
+ setTimeout(() => {
570
+ setSlideTo('');
571
+ setCurSlideIndex(_curSlideIndex);
572
+ setTranslateXUnit(defaultTranslateXUnit - _curSlideIndex);
573
+ }, duration * 2);
574
+ }, [slideTo, curSlideIndex, translateXUnit]);
575
+ const isSliding = slideTo !== '';
576
+ return /*#__PURE__*/_react.default.createElement(SlideshowFlexBox, {
577
+ className: appendedClassName
578
+ }, /*#__PURE__*/_react.default.createElement(SlidesSection, null, /*#__PURE__*/_react.default.createElement(SlidesFlexBox, {
579
+ translateXUint: translateXUnit,
580
+ duration: duration,
581
+ isSliding: isSliding
582
+ }, slides), /*#__PURE__*/_react.default.createElement(LeftSlideMask, null), /*#__PURE__*/_react.default.createElement(RightSlideMask, null)), /*#__PURE__*/_react.default.createElement(PrevNextSection, null, /*#__PURE__*/_react.default.createElement(PrevButton, {
583
+ onClick: isSliding ? undefined : slideToPrev
584
+ }, /*#__PURE__*/_react.default.createElement(PreArrowSvg, null)), /*#__PURE__*/_react.default.createElement(NextButton, {
585
+ onClick: isSliding ? undefined : slideToNext
586
+ }, /*#__PURE__*/_react.default.createElement(NextArrowSvg, null))), /*#__PURE__*/_react.default.createElement(ImageNumberCircle, null, /*#__PURE__*/_react.default.createElement(ImageNumber, null, curSlideIndex + 1), /*#__PURE__*/_react.default.createElement(ImageTotal, null, total)), desc ? /*#__PURE__*/_react.default.createElement(Desc, null, desc) : /*#__PURE__*/_react.default.createElement(EmptyDesc, null));
587
+ }
588
+
589
+ function NextArrowSvg() {
590
+ return /*#__PURE__*/_react.default.createElement("svg", {
591
+ viewBox: "0 0 31 17",
592
+ width: "31",
593
+ height: "17",
594
+ xmlns: "http://www.w3.org/2000/svg"
595
+ }, /*#__PURE__*/_react.default.createElement("path", {
596
+ d: "M29.33 7.854H0v1h29.256l-7.11 7.148.708.705 8-8.042-.001-.707-8-7.958-.706.709 7.183 7.145z",
597
+ fill: "gray",
598
+ fillRule: "nonzero"
599
+ }));
600
+ }
601
+
602
+ function PreArrowSvg() {
603
+ return /*#__PURE__*/_react.default.createElement("svg", {
604
+ viewBox: "0 0 31 17",
605
+ width: "31",
606
+ height: "17",
607
+ xmlns: "http://www.w3.org/2000/svg"
608
+ }, /*#__PURE__*/_react.default.createElement("path", {
609
+ d: "M2.17 8.5H31.5v1H2.244l7.11 7.147-.708.706-8-8.042.001-.707 8-7.958.706.708L2.17 8.5z",
610
+ fill: "gray"
611
+ }));
612
+ }
613
+
614
+ const ArticleBodyContainer = _styledComponents.default.div`
615
+ width: fit-content;
616
+ margin: 0 auto 27px auto;
617
+ `;
618
+
619
+ function SlideshowInArticleBody({
620
+ className = '',
621
+ data
622
+ }) {
623
+ return /*#__PURE__*/_react.default.createElement(ArticleBodyContainer, {
624
+ className: className
625
+ }, /*#__PURE__*/_react.default.createElement(SlideshowBlock, {
626
+ data: data
252
627
  }));
253
628
  }