@financial-times/cp-content-pipeline-ui 6.6.2 → 6.7.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 (82) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/lib/components/Clip/client/index.d.ts +2 -0
  3. package/lib/components/Clip/client/index.js +27 -1
  4. package/lib/components/Clip/client/index.js.map +1 -1
  5. package/lib/components/Clip/components/Container.js +2 -2
  6. package/lib/components/Clip/components/Container.js.map +1 -1
  7. package/lib/components/Clip/components/VideoDescription.js +2 -2
  8. package/lib/components/Clip/components/VideoDescription.js.map +1 -1
  9. package/lib/components/Clip/components/VideoInfoBox.js +2 -2
  10. package/lib/components/Clip/components/VideoInfoBox.js.map +1 -1
  11. package/lib/components/Clip/template/index.js +0 -1
  12. package/lib/components/Clip/template/index.js.map +1 -1
  13. package/lib/components/Clip/test/index.spec.js +30 -0
  14. package/lib/components/Clip/test/index.spec.js.map +1 -1
  15. package/lib/components/Expander/client/index.d.ts +49 -0
  16. package/lib/components/Expander/client/index.js +124 -0
  17. package/lib/components/Expander/client/index.js.map +1 -0
  18. package/lib/components/Expander/index.d.ts +15 -0
  19. package/lib/components/Expander/index.js +27 -0
  20. package/lib/components/Expander/index.js.map +1 -0
  21. package/lib/components/Expander/test/client/index.spec.d.ts +1 -0
  22. package/lib/components/Expander/test/client/index.spec.js +103 -0
  23. package/lib/components/Expander/test/client/index.spec.js.map +1 -0
  24. package/lib/components/Expander/test/index.spec.d.ts +1 -0
  25. package/lib/components/Expander/test/index.spec.js +57 -0
  26. package/lib/components/Expander/test/index.spec.js.map +1 -0
  27. package/lib/components/Expander/test/snapshot.spec.d.ts +1 -0
  28. package/lib/components/Expander/test/snapshot.spec.js +63 -0
  29. package/lib/components/Expander/test/snapshot.spec.js.map +1 -0
  30. package/lib/components/ImageSet/index.js +1 -1
  31. package/lib/components/ImageSet/index.js.map +1 -1
  32. package/lib/components/LiveBlogPost/client/index.d.ts +5 -0
  33. package/lib/components/LiveBlogPost/client/index.js +12 -0
  34. package/lib/components/LiveBlogPost/client/index.js.map +1 -0
  35. package/lib/components/LiveBlogPost/index.js +9 -21
  36. package/lib/components/LiveBlogPost/index.js.map +1 -1
  37. package/lib/components/LiveBlogWrapper/index.js +1 -1
  38. package/lib/components/LiveBlogWrapper/index.js.map +1 -1
  39. package/lib/components/Recommended/index.js +1 -1
  40. package/lib/components/Recommended/index.js.map +1 -1
  41. package/lib/components/RichText/index.d.ts +1 -1
  42. package/lib/components/Table/index.js +1 -1
  43. package/lib/components/Table/index.js.map +1 -1
  44. package/lib/components/Video/index.js +1 -1
  45. package/lib/components/Video/index.js.map +1 -1
  46. package/lib/components/YoutubeVideo/index.js +1 -1
  47. package/lib/components/YoutubeVideo/index.js.map +1 -1
  48. package/lib/stories/Clip.stories.d.ts +2 -1
  49. package/lib/stories/Clip.stories.js +5 -5
  50. package/lib/stories/Clip.stories.js.map +1 -1
  51. package/lib/stories/Expander.stories.d.ts +54 -0
  52. package/lib/stories/Expander.stories.js +142 -0
  53. package/lib/stories/Expander.stories.js.map +1 -0
  54. package/package.json +3 -5
  55. package/src/components/Clip/client/index.ts +39 -1
  56. package/src/components/Clip/client/main.scss +28 -0
  57. package/src/components/Clip/components/Container.tsx +10 -3
  58. package/src/components/Clip/components/VideoDescription.tsx +5 -3
  59. package/src/components/Clip/components/VideoInfoBox.tsx +3 -3
  60. package/src/components/Clip/components/_video-info-box.scss +0 -4
  61. package/src/components/Clip/template/index.ts +0 -1
  62. package/src/components/Clip/test/__snapshots__/snapshot.spec.tsx.snap +57 -47
  63. package/src/components/Clip/test/index.spec.ts +45 -0
  64. package/src/components/Expander/client/index.ts +197 -0
  65. package/src/components/Expander/client/main.scss +162 -0
  66. package/src/components/Expander/index.tsx +74 -0
  67. package/src/components/Expander/test/__snapshots__/snapshot.spec.tsx.snap +225 -0
  68. package/src/components/Expander/test/client/index.spec.tsx +129 -0
  69. package/src/components/Expander/test/index.spec.tsx +77 -0
  70. package/src/components/Expander/test/snapshot.spec.tsx +73 -0
  71. package/src/components/ImageSet/index.tsx +1 -0
  72. package/src/components/LiveBlogPost/client/index.ts +9 -0
  73. package/src/components/LiveBlogPost/index.tsx +29 -42
  74. package/src/components/LiveBlogWrapper/index.tsx +1 -0
  75. package/src/components/Recommended/index.tsx +1 -0
  76. package/src/components/Table/index.tsx +1 -0
  77. package/src/components/Video/index.tsx +4 -1
  78. package/src/components/YoutubeVideo/index.tsx +4 -1
  79. package/src/stories/Clip.stories.tsx +3 -2
  80. package/src/stories/Expander.stories.scss +3 -0
  81. package/src/stories/Expander.stories.tsx +159 -0
  82. package/tsconfig.tsbuildinfo +1 -1
@@ -2,7 +2,7 @@
2
2
 
3
3
  exports[`Clip Snapshot component rendered on server full-grid default render 1`] = `
4
4
  "<div class=\\"n-content-layout\\" data-layout-width=\\"full-grid\\">
5
- <div class=\\"n-content-layout__container\\">
5
+ <div class=\\"n-content-layout__container\\" data-component=\\"clip-set\\">
6
6
  <div
7
7
  data-cp-clip-layout=\\"full-grid\\"
8
8
  data-cp-clip-poster=\\"\\"
@@ -23,11 +23,11 @@ exports[`Clip Snapshot component rendered on server full-grid default render 1`]
23
23
  class=\\"o-expander o-expander__info-box\\"
24
24
  data-o-expander-shrink-to=\\"hidden\\"
25
25
  data-trackable=\\"clip-info-box\\"
26
- data-o-expander-collapsed-toggle-text=\\" \\"
27
- data-o-expander-expanded-toggle-text=\\" \\"
26
+ data-o-expander-collapsed-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Show video info&lt;/span&gt;\\"
27
+ data-o-expander-expanded-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Hide video info&lt;/span&gt;\\"
28
28
  >
29
29
  <button data-trackable=\\"toggle-open-close\\" class=\\"o-expander__toggle\\">
30
- <span>Expand</span>
30
+ <span class=\\"o-expander__visually-hidden\\">Show video info</span>
31
31
  </button>
32
32
  <div class=\\"o-expander__content video-info\\"></div>
33
33
  </div>
@@ -64,7 +64,7 @@ exports[`Clip Snapshot component rendered on server full-grid default render 1`]
64
64
 
65
65
  exports[`Clip Snapshot component rendered on server full-grid render with attributes 1`] = `
66
66
  "<div class=\\"n-content-layout\\" data-layout-width=\\"full-grid\\">
67
- <div class=\\"n-content-layout__container\\">
67
+ <div class=\\"n-content-layout__container\\" data-component=\\"clip-set\\">
68
68
  <div
69
69
  data-cp-clip-layout=\\"full-grid\\"
70
70
  data-cp-clip-poster=\\"\\"
@@ -85,11 +85,11 @@ exports[`Clip Snapshot component rendered on server full-grid render with attrib
85
85
  class=\\"o-expander o-expander__info-box\\"
86
86
  data-o-expander-shrink-to=\\"hidden\\"
87
87
  data-trackable=\\"clip-info-box\\"
88
- data-o-expander-collapsed-toggle-text=\\" \\"
89
- data-o-expander-expanded-toggle-text=\\" \\"
88
+ data-o-expander-collapsed-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Show video info&lt;/span&gt;\\"
89
+ data-o-expander-expanded-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Hide video info&lt;/span&gt;\\"
90
90
  >
91
91
  <button data-trackable=\\"toggle-open-close\\" class=\\"o-expander__toggle\\">
92
- <span>Expand</span>
92
+ <span class=\\"o-expander__visually-hidden\\">Show video info</span>
93
93
  </button>
94
94
  <div class=\\"o-expander__content video-info\\"></div>
95
95
  </div>
@@ -121,11 +121,13 @@ exports[`Clip Snapshot component rendered on server full-grid render with attrib
121
121
  class=\\"o-expander o-expander__description-box\\"
122
122
  data-o-expander-shrink-to=\\"hidden\\"
123
123
  data-trackable=\\"description-box\\"
124
- data-o-expander-collapsed-toggle-text=\\" \\"
125
- data-o-expander-expanded-toggle-text=\\" \\"
124
+ data-o-expander-collapsed-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Show video description&lt;/span&gt;\\"
125
+ data-o-expander-expanded-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Hide video description&lt;/span&gt;\\"
126
126
  >
127
127
  <button data-trackable=\\"toggle-open-close\\" class=\\"o-expander__toggle\\">
128
- <span>Expand</span>
128
+ <span class=\\"o-expander__visually-hidden\\"
129
+ >Show video description</span
130
+ >
129
131
  </button>
130
132
  <div class=\\"o-expander__content\\">
131
133
  <div class=\\"video-description\\">
@@ -149,7 +151,7 @@ exports[`Clip Snapshot component rendered on server full-grid render with attrib
149
151
  `;
150
152
 
151
153
  exports[`Clip Snapshot component rendered on server in-line render 1`] = `
152
- "<div class=\\"n-content-layout__container--in-line\\">
154
+ "<div class=\\"n-content-layout__container--in-line\\" data-component=\\"clip-set\\">
153
155
  <div
154
156
  data-cp-clip-layout=\\"in-line\\"
155
157
  data-cp-clip-poster=\\"\\"
@@ -170,11 +172,11 @@ exports[`Clip Snapshot component rendered on server in-line render 1`] = `
170
172
  class=\\"o-expander o-expander__info-box\\"
171
173
  data-o-expander-shrink-to=\\"hidden\\"
172
174
  data-trackable=\\"clip-info-box\\"
173
- data-o-expander-collapsed-toggle-text=\\" \\"
174
- data-o-expander-expanded-toggle-text=\\" \\"
175
+ data-o-expander-collapsed-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Show video info&lt;/span&gt;\\"
176
+ data-o-expander-expanded-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Hide video info&lt;/span&gt;\\"
175
177
  >
176
178
  <button data-trackable=\\"toggle-open-close\\" class=\\"o-expander__toggle\\">
177
- <span>Expand</span>
179
+ <span class=\\"o-expander__visually-hidden\\">Show video info</span>
178
180
  </button>
179
181
  <div class=\\"o-expander__content video-info\\"></div>
180
182
  </div>
@@ -209,7 +211,7 @@ exports[`Clip Snapshot component rendered on server in-line render 1`] = `
209
211
  `;
210
212
 
211
213
  exports[`Clip Snapshot component rendered on server in-line render with attributes 1`] = `
212
- "<div class=\\"n-content-layout__container--in-line\\">
214
+ "<div class=\\"n-content-layout__container--in-line\\" data-component=\\"clip-set\\">
213
215
  <div
214
216
  data-cp-clip-layout=\\"in-line\\"
215
217
  data-cp-clip-poster=\\"\\"
@@ -230,11 +232,11 @@ exports[`Clip Snapshot component rendered on server in-line render with attribut
230
232
  class=\\"o-expander o-expander__info-box\\"
231
233
  data-o-expander-shrink-to=\\"hidden\\"
232
234
  data-trackable=\\"clip-info-box\\"
233
- data-o-expander-collapsed-toggle-text=\\" \\"
234
- data-o-expander-expanded-toggle-text=\\" \\"
235
+ data-o-expander-collapsed-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Show video info&lt;/span&gt;\\"
236
+ data-o-expander-expanded-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Hide video info&lt;/span&gt;\\"
235
237
  >
236
238
  <button data-trackable=\\"toggle-open-close\\" class=\\"o-expander__toggle\\">
237
- <span>Expand</span>
239
+ <span class=\\"o-expander__visually-hidden\\">Show video info</span>
238
240
  </button>
239
241
  <div class=\\"o-expander__content video-info\\"></div>
240
242
  </div>
@@ -266,11 +268,13 @@ exports[`Clip Snapshot component rendered on server in-line render with attribut
266
268
  class=\\"o-expander o-expander__description-box\\"
267
269
  data-o-expander-shrink-to=\\"hidden\\"
268
270
  data-trackable=\\"description-box\\"
269
- data-o-expander-collapsed-toggle-text=\\" \\"
270
- data-o-expander-expanded-toggle-text=\\" \\"
271
+ data-o-expander-collapsed-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Show video description&lt;/span&gt;\\"
272
+ data-o-expander-expanded-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Hide video description&lt;/span&gt;\\"
271
273
  >
272
274
  <button data-trackable=\\"toggle-open-close\\" class=\\"o-expander__toggle\\">
273
- <span>Expand</span>
275
+ <span class=\\"o-expander__visually-hidden\\"
276
+ >Show video description</span
277
+ >
274
278
  </button>
275
279
  <div class=\\"o-expander__content\\">
276
280
  <div class=\\"video-description\\">
@@ -294,7 +298,7 @@ exports[`Clip Snapshot component rendered on server in-line render with attribut
294
298
 
295
299
  exports[`Clip Snapshot component rendered on server mid-grid default render 1`] = `
296
300
  "<div class=\\"n-content-layout\\" data-layout-width=\\"full-grid\\">
297
- <div class=\\"n-content-layout__container\\">
301
+ <div class=\\"n-content-layout__container\\" data-component=\\"clip-set\\">
298
302
  <div
299
303
  data-o-grid-colspan=\\"12 S12 M12 L10 XL10\\"
300
304
  class=\\"n-content-layout__container--mid-grid\\"
@@ -319,11 +323,11 @@ exports[`Clip Snapshot component rendered on server mid-grid default render 1`]
319
323
  class=\\"o-expander o-expander__info-box\\"
320
324
  data-o-expander-shrink-to=\\"hidden\\"
321
325
  data-trackable=\\"clip-info-box\\"
322
- data-o-expander-collapsed-toggle-text=\\" \\"
323
- data-o-expander-expanded-toggle-text=\\" \\"
326
+ data-o-expander-collapsed-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Show video info&lt;/span&gt;\\"
327
+ data-o-expander-expanded-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Hide video info&lt;/span&gt;\\"
324
328
  >
325
329
  <button data-trackable=\\"toggle-open-close\\" class=\\"o-expander__toggle\\">
326
- <span>Expand</span>
330
+ <span class=\\"o-expander__visually-hidden\\">Show video info</span>
327
331
  </button>
328
332
  <div class=\\"o-expander__content video-info\\"></div>
329
333
  </div>
@@ -361,7 +365,7 @@ exports[`Clip Snapshot component rendered on server mid-grid default render 1`]
361
365
 
362
366
  exports[`Clip Snapshot component rendered on server mid-grid render with attributes 1`] = `
363
367
  "<div class=\\"n-content-layout\\" data-layout-width=\\"full-grid\\">
364
- <div class=\\"n-content-layout__container\\">
368
+ <div class=\\"n-content-layout__container\\" data-component=\\"clip-set\\">
365
369
  <div
366
370
  data-o-grid-colspan=\\"12 S12 M12 L10 XL10\\"
367
371
  class=\\"n-content-layout__container--mid-grid\\"
@@ -386,11 +390,11 @@ exports[`Clip Snapshot component rendered on server mid-grid render with attribu
386
390
  class=\\"o-expander o-expander__info-box\\"
387
391
  data-o-expander-shrink-to=\\"hidden\\"
388
392
  data-trackable=\\"clip-info-box\\"
389
- data-o-expander-collapsed-toggle-text=\\" \\"
390
- data-o-expander-expanded-toggle-text=\\" \\"
393
+ data-o-expander-collapsed-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Show video info&lt;/span&gt;\\"
394
+ data-o-expander-expanded-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Hide video info&lt;/span&gt;\\"
391
395
  >
392
396
  <button data-trackable=\\"toggle-open-close\\" class=\\"o-expander__toggle\\">
393
- <span>Expand</span>
397
+ <span class=\\"o-expander__visually-hidden\\">Show video info</span>
394
398
  </button>
395
399
  <div class=\\"o-expander__content video-info\\"></div>
396
400
  </div>
@@ -425,14 +429,16 @@ exports[`Clip Snapshot component rendered on server mid-grid render with attribu
425
429
  class=\\"o-expander o-expander__description-box\\"
426
430
  data-o-expander-shrink-to=\\"hidden\\"
427
431
  data-trackable=\\"description-box\\"
428
- data-o-expander-collapsed-toggle-text=\\" \\"
429
- data-o-expander-expanded-toggle-text=\\" \\"
432
+ data-o-expander-collapsed-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Show video description&lt;/span&gt;\\"
433
+ data-o-expander-expanded-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Hide video description&lt;/span&gt;\\"
430
434
  >
431
435
  <button
432
436
  data-trackable=\\"toggle-open-close\\"
433
437
  class=\\"o-expander__toggle\\"
434
438
  >
435
- <span>Expand</span>
439
+ <span class=\\"o-expander__visually-hidden\\"
440
+ >Show video description</span
441
+ >
436
442
  </button>
437
443
  <div class=\\"o-expander__content\\">
438
444
  <div class=\\"video-description\\">
@@ -457,7 +463,7 @@ exports[`Clip Snapshot component rendered on server mid-grid render with attribu
457
463
  `;
458
464
 
459
465
  exports[`Clip Snapshot component rendered on server renders multiple video sources 1`] = `
460
- "<div class=\\"n-content-layout__container--in-line\\">
466
+ "<div class=\\"n-content-layout__container--in-line\\" data-component=\\"clip-set\\">
461
467
  <div
462
468
  data-cp-clip-layout=\\"in-line\\"
463
469
  data-cp-clip-poster=\\"https://whatever/1080x1920.jpg\\"
@@ -478,11 +484,11 @@ exports[`Clip Snapshot component rendered on server renders multiple video sourc
478
484
  class=\\"o-expander o-expander__info-box\\"
479
485
  data-o-expander-shrink-to=\\"hidden\\"
480
486
  data-trackable=\\"clip-info-box\\"
481
- data-o-expander-collapsed-toggle-text=\\" \\"
482
- data-o-expander-expanded-toggle-text=\\" \\"
487
+ data-o-expander-collapsed-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Show video info&lt;/span&gt;\\"
488
+ data-o-expander-expanded-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Hide video info&lt;/span&gt;\\"
483
489
  >
484
490
  <button data-trackable=\\"toggle-open-close\\" class=\\"o-expander__toggle\\">
485
- <span>Expand</span>
491
+ <span class=\\"o-expander__visually-hidden\\">Show video info</span>
486
492
  </button>
487
493
  <div class=\\"o-expander__content video-info\\"></div>
488
494
  </div>
@@ -525,11 +531,13 @@ exports[`Clip Snapshot component rendered on server renders multiple video sourc
525
531
  class=\\"o-expander o-expander__description-box\\"
526
532
  data-o-expander-shrink-to=\\"hidden\\"
527
533
  data-trackable=\\"description-box\\"
528
- data-o-expander-collapsed-toggle-text=\\" \\"
529
- data-o-expander-expanded-toggle-text=\\" \\"
534
+ data-o-expander-collapsed-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Show video description&lt;/span&gt;\\"
535
+ data-o-expander-expanded-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Hide video description&lt;/span&gt;\\"
530
536
  >
531
537
  <button data-trackable=\\"toggle-open-close\\" class=\\"o-expander__toggle\\">
532
- <span>Expand</span>
538
+ <span class=\\"o-expander__visually-hidden\\"
539
+ >Show video description</span
540
+ >
533
541
  </button>
534
542
  <div class=\\"o-expander__content\\">
535
543
  <div class=\\"video-description\\">
@@ -553,7 +561,7 @@ exports[`Clip Snapshot component rendered on server renders multiple video sourc
553
561
 
554
562
  exports[`Clip Snapshot component rendered on server supports new Origami images, fallbacking to the previous implementation 1`] = `
555
563
  "<div class=\\"n-content-layout\\" data-layout-width=\\"full-grid\\">
556
- <div class=\\"n-content-layout__container\\">
564
+ <div class=\\"n-content-layout__container\\" data-component=\\"clip-set\\">
557
565
  <div
558
566
  data-cp-clip-layout=\\"full-grid\\"
559
567
  data-cp-clip-poster=\\"\\"
@@ -574,11 +582,11 @@ exports[`Clip Snapshot component rendered on server supports new Origami images,
574
582
  class=\\"o-expander o-expander__info-box\\"
575
583
  data-o-expander-shrink-to=\\"hidden\\"
576
584
  data-trackable=\\"clip-info-box\\"
577
- data-o-expander-collapsed-toggle-text=\\" \\"
578
- data-o-expander-expanded-toggle-text=\\" \\"
585
+ data-o-expander-collapsed-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Show video info&lt;/span&gt;\\"
586
+ data-o-expander-expanded-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Hide video info&lt;/span&gt;\\"
579
587
  >
580
588
  <button data-trackable=\\"toggle-open-close\\" class=\\"o-expander__toggle\\">
581
- <span>Expand</span>
589
+ <span class=\\"o-expander__visually-hidden\\">Show video info</span>
582
590
  </button>
583
591
  <div class=\\"o-expander__content video-info\\"></div>
584
592
  </div>
@@ -610,11 +618,13 @@ exports[`Clip Snapshot component rendered on server supports new Origami images,
610
618
  class=\\"o-expander o-expander__description-box\\"
611
619
  data-o-expander-shrink-to=\\"hidden\\"
612
620
  data-trackable=\\"description-box\\"
613
- data-o-expander-collapsed-toggle-text=\\" \\"
614
- data-o-expander-expanded-toggle-text=\\" \\"
621
+ data-o-expander-collapsed-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Show video description&lt;/span&gt;\\"
622
+ data-o-expander-expanded-toggle-text=\\"&lt;span class=&#x27;o-expander__visually-hidden&#x27;&gt;Hide video description&lt;/span&gt;\\"
615
623
  >
616
624
  <button data-trackable=\\"toggle-open-close\\" class=\\"o-expander__toggle\\">
617
- <span>Expand</span>
625
+ <span class=\\"o-expander__visually-hidden\\"
626
+ >Show video description</span
627
+ >
618
628
  </button>
619
629
  <div class=\\"o-expander__content\\">
620
630
  <div class=\\"video-description\\">
@@ -763,6 +763,51 @@ describe('Clip', () => {
763
763
  clip.videoEl.addEventListener('playing', listener)
764
764
  clip.videoEl.play()
765
765
  })
766
+
767
+ it('shows loading indicator when waiting event is triggered', (done) => {
768
+ const clip = clips[0]
769
+ const spy = jest.spyOn(clip, 'fadeIn')
770
+
771
+ clip.videoEl.dispatchEvent(new Event('waiting'))
772
+
773
+ setTimeout(() => {
774
+ expect(clip.containerEl.classList.contains('cp-clip--loading')).toBe(
775
+ true
776
+ )
777
+ expect(spy).toHaveBeenCalled()
778
+ done()
779
+ }, 100)
780
+ })
781
+
782
+ it('hides loading indicator when canplay event is triggered', (done) => {
783
+ const clip = clips[0]
784
+ const spy = jest.spyOn(clip, 'fadeOut')
785
+
786
+ clip.videoEl.dispatchEvent(new Event('canplay'))
787
+
788
+ setTimeout(() => {
789
+ expect(clip.containerEl.classList.contains('cp-clip--loading')).toBe(
790
+ false
791
+ )
792
+ expect(spy).toHaveBeenCalledWith(true)
793
+ done()
794
+ }, 100)
795
+ })
796
+
797
+ it('hides loading indicator when canplaythrough event is triggered', (done) => {
798
+ const clip = clips[0]
799
+ const spy = jest.spyOn(clip, 'fadeOut')
800
+
801
+ clip.videoEl.dispatchEvent(new Event('canplaythrough'))
802
+
803
+ setTimeout(() => {
804
+ expect(clip.containerEl.classList.contains('cp-clip--loading')).toBe(
805
+ false
806
+ )
807
+ expect(spy).toHaveBeenCalledWith(true)
808
+ done()
809
+ }, 100)
810
+ })
766
811
  })
767
812
 
768
813
  describe('Captions, credits, and descriptions', () => {
@@ -0,0 +1,197 @@
1
+ /**
2
+ * trackEntireRead
3
+ * @description Track the entire read of a truncated post
4
+ * @param {HTMLElement} post - The post element
5
+ */
6
+ class TrackEntireRead {
7
+ private observer: IntersectionObserver | null = null
8
+ private readElement: Element | null
9
+ // data can be any key value pair that needs to be tracked
10
+ private data: Record<string, string>
11
+ constructor(readElement: Element, data: Record<string, string>) {
12
+ this.readElement = readElement as Element
13
+ this.data = data
14
+ this.init()
15
+ }
16
+
17
+ private init() {
18
+ //Intersection observer that observes readElement and when in view tracks the entire read
19
+ this.observer = new IntersectionObserver((entries) => {
20
+ entries.forEach((entry) => {
21
+ if (entry.isIntersecting) {
22
+ this.handleEntireRead()
23
+ this.observer?.disconnect()
24
+ }
25
+ })
26
+ })
27
+ this.observer.observe(this.readElement as Element)
28
+ }
29
+
30
+ private handleEntireRead = () => {
31
+ const trackingData = {
32
+ action: 'entire_read',
33
+ ...this.data,
34
+ }
35
+ const event = new CustomEvent('oTracking.event', {
36
+ detail: trackingData,
37
+ bubbles: true,
38
+ })
39
+ document.body.dispatchEvent(event)
40
+ }
41
+
42
+ destroy(): void {
43
+ this.observer?.disconnect()
44
+ this.observer = null
45
+ }
46
+ }
47
+ export class ExpanderClient {
48
+ /**
49
+ * The container element for all the elements that should be showned or be hidden.
50
+ */
51
+ private container: Element | null
52
+
53
+ /**
54
+ * An optional element to which the expander will dispatch the events to.
55
+ * If not provided, events will not be dispatched.
56
+ */
57
+ private dispatchBoundary?: Element | Document | null
58
+
59
+ /**
60
+ * Element that will be showned at the end of the content when the expander is expanded.
61
+ * We use this to track when the entire post is read.
62
+ */
63
+ private endContent: Element | null
64
+
65
+ /**
66
+ * Track the entire read of a truncated post
67
+ */
68
+ private trackingEntireRead: TrackEntireRead
69
+
70
+ /**
71
+ * The button that will expand the content
72
+ */
73
+ private expanderButton: HTMLElement | null
74
+
75
+ /**
76
+ * The button that will collapse the content
77
+ */
78
+ private collapserButton: HTMLElement | null
79
+
80
+ /**
81
+ * The tracking data that will be sent when the entire post is read
82
+ */
83
+ private trackingData: Record<string, string>
84
+
85
+ /**
86
+ *
87
+ * @param el
88
+ * @param dispatchBoundary
89
+ */
90
+
91
+ constructor(
92
+ el: Element,
93
+ dispatchBoundary?: Element | Document | null,
94
+ trackingData?: Record<string, string>
95
+ ) {
96
+ this.container = el
97
+ this.trackingData = trackingData || {}
98
+ this.expanderButton = el.querySelector(
99
+ '.cp-expander__expand [data-action="expand"]'
100
+ ) as HTMLElement
101
+ this.collapserButton = el.querySelector(
102
+ '.cp-expander__collapse [data-action="collapse"]'
103
+ ) as HTMLElement
104
+ this.endContent = el.querySelector('.cp-expander__collapse')
105
+
106
+ this.expanderButton?.addEventListener('click', this.handleExpand)
107
+ this.collapserButton?.addEventListener('click', this.handleCollapse)
108
+
109
+ this.container.classList.replace(
110
+ 'cp-expander--not-initialised',
111
+ 'cp-expander--initialised'
112
+ )
113
+ this.dispatchBoundary = dispatchBoundary || this.container
114
+ ;(this.trackingData['post_id'] =
115
+ this.container
116
+ .querySelector('[data-trackable-context-truncated-id]')
117
+ ?.getAttribute('data-trackable-context-truncated-id') || ''),
118
+ (this.trackingEntireRead = new TrackEntireRead(
119
+ this.endContent as Element,
120
+ this.trackingData
121
+ ))
122
+ }
123
+
124
+ expand() {
125
+ this.container?.setAttribute('data-state', 'expanded')
126
+ this.dispatchBoundary?.dispatchEvent(
127
+ new CustomEvent('expander:expanded', {
128
+ bubbles: true,
129
+ detail: {
130
+ component: this.container,
131
+ },
132
+ })
133
+ )
134
+ }
135
+
136
+ collapse() {
137
+ this.container?.setAttribute('data-state', 'collapsed')
138
+ this.container?.scrollIntoView()
139
+ this.dispatchBoundary?.dispatchEvent(
140
+ new CustomEvent('expander:collapsed', {
141
+ bubbles: true,
142
+ detail: {
143
+ component: this.container,
144
+ },
145
+ })
146
+ )
147
+ }
148
+
149
+ private handleExpand = (e: Event) => {
150
+ e.preventDefault()
151
+ this.expand()
152
+ this.expanderButton?.setAttribute('aria-expanded', 'true')
153
+ this.expanderButton?.setAttribute('aria-hidden', 'true')
154
+ this.collapserButton?.setAttribute('aria-expanded', 'true')
155
+ this.collapserButton?.setAttribute('aria-hidden', 'false')
156
+ }
157
+ private handleCollapse = (e: Event) => {
158
+ e.preventDefault()
159
+ this.collapse()
160
+ this.expanderButton?.setAttribute('aria-expanded', 'false')
161
+ this.expanderButton?.setAttribute('aria-hidden', 'false')
162
+ this.collapserButton?.setAttribute('aria-expanded', 'false')
163
+ this.collapserButton?.setAttribute('aria-hidden', 'true')
164
+ }
165
+
166
+ destroy(): void {
167
+ this.container?.setAttribute('data-state', 'collapsed')
168
+ this.container
169
+ ?.querySelector('.cp-expander__expand')
170
+ ?.removeEventListener('click', this.expand)
171
+ this.container
172
+ ?.querySelector('.cp-expander__collapse')
173
+ ?.removeEventListener('click', this.collapse)
174
+ this.container?.classList.remove('cp-expander--initialised')
175
+ this.trackingEntireRead.destroy()
176
+ }
177
+
178
+ static init(data?: {
179
+ rootElement?: HTMLElement | null
180
+ dispatchBoundary?: Element | Document | null
181
+ trackingData?: Record<string, string>
182
+ }): ExpanderClient[] {
183
+ const { rootElement, dispatchBoundary, trackingData } = data || {}
184
+ const root = rootElement || document.body
185
+
186
+ return (Array.from(
187
+ root.querySelectorAll(
188
+ ':not(.cp-expander--initialised)[data-component="expander"]'
189
+ )
190
+ )?.map((el: Element) => {
191
+ if (!el.classList.contains('expander--initialised')) {
192
+ return new ExpanderClient(el, dispatchBoundary, trackingData)
193
+ }
194
+ }) || []) as ExpanderClient[]
195
+ }
196
+ }
197
+ export default ExpanderClient