@reuters-graphics/graphics-components 0.0.1-beta.1

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 (195) hide show
  1. package/README.md +7 -0
  2. package/dist/@types/actions/cssVariables/index.d.ts +4 -0
  3. package/dist/@types/actions/resizeObserver/index.d.ts +4 -0
  4. package/dist/@types/components/@types/global.d.ts +28 -0
  5. package/dist/@types/components/Article/Article.svelte.d.ts +32 -0
  6. package/dist/@types/components/BeforeAfter/BeforeAfter.svelte.d.ts +57 -0
  7. package/dist/@types/components/Block/Block.svelte.d.ts +24 -0
  8. package/dist/@types/components/BodyText/BodyText.svelte.d.ts +20 -0
  9. package/dist/@types/components/DatawrapperChart/DatawrapperChart.svelte.d.ts +52 -0
  10. package/dist/@types/components/EmbedPreviewerLink/EmbedPreviewerLink.svelte.d.ts +16 -0
  11. package/dist/@types/components/FeaturePhoto/FeaturePhoto.svelte.d.ts +43 -0
  12. package/dist/@types/components/Framer/Framer.svelte.d.ts +29 -0
  13. package/dist/@types/components/Framer/Resizer/index.svelte.d.ts +27 -0
  14. package/dist/@types/components/Framer/stores.d.ts +1 -0
  15. package/dist/@types/components/Framer/uniqNames.d.ts +2 -0
  16. package/dist/@types/components/GraphicBlock/AriaHidden.svelte.d.ts +20 -0
  17. package/dist/@types/components/GraphicBlock/GraphicBlock.svelte.d.ts +64 -0
  18. package/dist/@types/components/GraphicBlock/TextBlock.svelte.d.ts +19 -0
  19. package/dist/@types/components/Headline/Headline.svelte.d.ts +29 -0
  20. package/dist/@types/components/Hero/Hero.svelte.d.ts +41 -0
  21. package/dist/@types/components/NoteText/NoteText.svelte.d.ts +20 -0
  22. package/dist/@types/components/PaddingReset/index.svelte.d.ts +27 -0
  23. package/dist/@types/components/PhotoPack/PhotoPack.svelte.d.ts +50 -0
  24. package/dist/@types/components/PhotoPack/docProps.d.ts +38 -0
  25. package/dist/@types/components/PymChild/PymChild.svelte.d.ts +16 -0
  26. package/dist/@types/components/ReutersLogo/ReutersLogo.svelte.d.ts +18 -0
  27. package/dist/@types/components/SEO/SEO.svelte.d.ts +66 -0
  28. package/dist/@types/components/SEO/analytics.d.ts +2 -0
  29. package/dist/@types/components/SEO/publisherTags.d.ts +2 -0
  30. package/dist/@types/components/Scroller/Background.svelte.d.ts +20 -0
  31. package/dist/@types/components/Scroller/Embedded/Background.svelte.d.ts +19 -0
  32. package/dist/@types/components/Scroller/Embedded/Foreground.svelte.d.ts +18 -0
  33. package/dist/@types/components/Scroller/Embedded/index.svelte.d.ts +19 -0
  34. package/dist/@types/components/Scroller/Foreground.svelte.d.ts +17 -0
  35. package/dist/@types/components/Scroller/Scroller.svelte.d.ts +76 -0
  36. package/dist/@types/components/Sharer/Sharer.svelte.d.ts +19 -0
  37. package/dist/@types/components/Sharer/utils/copyToClipboard.d.ts +2 -0
  38. package/dist/@types/components/Sharer/utils/facebook.d.ts +2 -0
  39. package/dist/@types/components/Sharer/utils/meta.d.ts +2 -0
  40. package/dist/@types/components/Sharer/utils/twitter.d.ts +2 -0
  41. package/dist/@types/components/SiteFooter/CompanyLinks.svelte.d.ts +23 -0
  42. package/dist/@types/components/SiteFooter/LegalLinks.svelte.d.ts +23 -0
  43. package/dist/@types/components/SiteFooter/QuickLinks.svelte.d.ts +23 -0
  44. package/dist/@types/components/SiteFooter/Referrals/IntersectionObserver.svelte.d.ts +39 -0
  45. package/dist/@types/components/SiteFooter/Referrals/Link.svelte.d.ts +29 -0
  46. package/dist/@types/components/SiteFooter/Referrals/Referrals.svelte.d.ts +23 -0
  47. package/dist/@types/components/SiteFooter/Referrals/index.svelte.d.ts +23 -0
  48. package/dist/@types/components/SiteFooter/SiteFooter.svelte.d.ts +23 -0
  49. package/dist/@types/components/SiteFooter/svgs/Facebook.svelte.d.ts +23 -0
  50. package/dist/@types/components/SiteFooter/svgs/Graphics.svelte.d.ts +19 -0
  51. package/dist/@types/components/SiteFooter/svgs/Instagram.svelte.d.ts +23 -0
  52. package/dist/@types/components/SiteFooter/svgs/LinkedIn.svelte.d.ts +23 -0
  53. package/dist/@types/components/SiteFooter/svgs/Pictures.svelte.d.ts +19 -0
  54. package/dist/@types/components/SiteFooter/svgs/Twitter.svelte.d.ts +23 -0
  55. package/dist/@types/components/SiteFooter/svgs/Videos.svelte.d.ts +19 -0
  56. package/dist/@types/components/SiteFooter/svgs/YouTube.svelte.d.ts +23 -0
  57. package/dist/@types/components/SiteHeader/MobileMenu/index.svelte.d.ts +27 -0
  58. package/dist/@types/components/SiteHeader/NavBar/DownArrow.svelte.d.ts +23 -0
  59. package/dist/@types/components/SiteHeader/NavBar/NavDropdown/MoreDropdown.svelte.d.ts +23 -0
  60. package/dist/@types/components/SiteHeader/NavBar/NavDropdown/SectionDropdown.svelte.d.ts +25 -0
  61. package/dist/@types/components/SiteHeader/NavBar/NavDropdown/Spinner/index.svelte.d.ts +19 -0
  62. package/dist/@types/components/SiteHeader/NavBar/NavDropdown/StoryCard/index.svelte.d.ts +25 -0
  63. package/dist/@types/components/SiteHeader/NavBar/NavDropdown/StoryCard/time.d.ts +1 -0
  64. package/dist/@types/components/SiteHeader/NavBar/NavDropdown/index.svelte.d.ts +27 -0
  65. package/dist/@types/components/SiteHeader/NavBar/index.svelte.d.ts +23 -0
  66. package/dist/@types/components/SiteHeader/NavBar/utils/index.d.ts +1 -0
  67. package/dist/@types/components/SiteHeader/SiteHeader.svelte.d.ts +14 -0
  68. package/dist/@types/components/SiteHeader/svgs/Close.svelte.d.ts +19 -0
  69. package/dist/@types/components/SiteHeader/svgs/Menu.svelte.d.ts +23 -0
  70. package/dist/@types/components/Spinner/Spinner.svelte.d.ts +28 -0
  71. package/dist/@types/components/Theme/@types/component.d.ts +28 -0
  72. package/dist/@types/components/Theme/Theme.svelte.d.ts +54 -0
  73. package/dist/@types/components/Theme/themes/dark.d.ts +2 -0
  74. package/dist/@types/components/Theme/themes/light.d.ts +22 -0
  75. package/dist/@types/components/Theme/utils/flatten.d.ts +1 -0
  76. package/dist/@types/components/Theme/utils/merge.d.ts +4 -0
  77. package/dist/@types/components/Video/Controls.svelte.d.ts +45 -0
  78. package/dist/@types/components/Video/Video.svelte.d.ts +46 -0
  79. package/dist/@types/components/Visible/Visible.svelte.d.ts +29 -0
  80. package/dist/@types/index.d.ts +24 -0
  81. package/dist/actions/cssVariables/index.js +20 -0
  82. package/dist/actions/resizeObserver/index.js +25 -0
  83. package/dist/components/@types/global.js +1 -0
  84. package/dist/components/Article/Article.svelte +47 -0
  85. package/dist/components/BeforeAfter/BeforeAfter.svelte +341 -0
  86. package/dist/components/Block/Block.svelte +177 -0
  87. package/dist/components/BodyText/BodyText.svelte +193 -0
  88. package/dist/components/DatawrapperChart/DatawrapperChart.svelte +105 -0
  89. package/dist/components/EmbedPreviewerLink/EmbedPreviewerLink.svelte +26 -0
  90. package/dist/components/FeaturePhoto/FeaturePhoto.svelte +113 -0
  91. package/dist/components/Framer/Framer.svelte +136 -0
  92. package/dist/components/Framer/Resizer/index.svelte +223 -0
  93. package/dist/components/Framer/stores.js +3 -0
  94. package/dist/components/Framer/uniqNames.js +54 -0
  95. package/dist/components/GraphicBlock/AriaHidden.svelte +13 -0
  96. package/dist/components/GraphicBlock/GraphicBlock.svelte +269 -0
  97. package/dist/components/GraphicBlock/TextBlock.svelte +12 -0
  98. package/dist/components/Headline/Headline.svelte +109 -0
  99. package/dist/components/Hero/Hero.svelte +78 -0
  100. package/dist/components/NoteText/NoteText.svelte +124 -0
  101. package/dist/components/PaddingReset/index.svelte +17 -0
  102. package/dist/components/PhotoPack/PhotoPack.svelte +156 -0
  103. package/dist/components/PhotoPack/docProps.js +20 -0
  104. package/dist/components/PymChild/PymChild.svelte +10 -0
  105. package/dist/components/ReutersLogo/ReutersLogo.svelte +21 -0
  106. package/dist/components/SEO/SEO.svelte +179 -0
  107. package/dist/components/SEO/analytics.js +332 -0
  108. package/dist/components/SEO/publisherTags.js +26 -0
  109. package/dist/components/Scroller/Background.svelte +30 -0
  110. package/dist/components/Scroller/Embedded/Background.svelte +14 -0
  111. package/dist/components/Scroller/Embedded/Foreground.svelte +203 -0
  112. package/dist/components/Scroller/Embedded/index.svelte +18 -0
  113. package/dist/components/Scroller/Foreground.svelte +42 -0
  114. package/dist/components/Scroller/Scroller.svelte +210 -0
  115. package/dist/components/Sharer/Sharer.svelte +157 -0
  116. package/dist/components/Sharer/utils/copyToClipboard.js +10 -0
  117. package/dist/components/Sharer/utils/facebook.js +22 -0
  118. package/dist/components/Sharer/utils/meta.js +7 -0
  119. package/dist/components/Sharer/utils/twitter.js +22 -0
  120. package/dist/components/SiteFooter/CompanyLinks.svelte +173 -0
  121. package/dist/components/SiteFooter/LegalLinks.svelte +202 -0
  122. package/dist/components/SiteFooter/QuickLinks.svelte +259 -0
  123. package/dist/components/SiteFooter/Referrals/IntersectionObserver.svelte +45 -0
  124. package/dist/components/SiteFooter/Referrals/Link.svelte +73 -0
  125. package/dist/components/SiteFooter/Referrals/Referrals.svelte +56 -0
  126. package/dist/components/SiteFooter/Referrals/index.svelte +53 -0
  127. package/dist/components/SiteFooter/SiteFooter.svelte +41 -0
  128. package/dist/components/SiteFooter/data.json +210 -0
  129. package/dist/components/SiteFooter/svgs/Facebook.svelte +18 -0
  130. package/dist/components/SiteFooter/svgs/Graphics.svelte +18 -0
  131. package/dist/components/SiteFooter/svgs/Instagram.svelte +20 -0
  132. package/dist/components/SiteFooter/svgs/LinkedIn.svelte +18 -0
  133. package/dist/components/SiteFooter/svgs/Pictures.svelte +14 -0
  134. package/dist/components/SiteFooter/svgs/Twitter.svelte +18 -0
  135. package/dist/components/SiteFooter/svgs/Videos.svelte +14 -0
  136. package/dist/components/SiteFooter/svgs/YouTube.svelte +18 -0
  137. package/dist/components/SiteHeader/MobileMenu/index.svelte +199 -0
  138. package/dist/components/SiteHeader/NavBar/DownArrow.svelte +26 -0
  139. package/dist/components/SiteHeader/NavBar/NavDropdown/MoreDropdown.svelte +112 -0
  140. package/dist/components/SiteHeader/NavBar/NavDropdown/SectionDropdown.svelte +118 -0
  141. package/dist/components/SiteHeader/NavBar/NavDropdown/Spinner/index.svelte +49 -0
  142. package/dist/components/SiteHeader/NavBar/NavDropdown/StoryCard/index.svelte +99 -0
  143. package/dist/components/SiteHeader/NavBar/NavDropdown/StoryCard/time.js +70 -0
  144. package/dist/components/SiteHeader/NavBar/NavDropdown/index.svelte +277 -0
  145. package/dist/components/SiteHeader/NavBar/index.svelte +234 -0
  146. package/dist/components/SiteHeader/NavBar/utils/index.js +2 -0
  147. package/dist/components/SiteHeader/SiteHeader.svelte +235 -0
  148. package/dist/components/SiteHeader/data.json +1 -0
  149. package/dist/components/SiteHeader/scss/_breakpoints.scss +59 -0
  150. package/dist/components/SiteHeader/scss/_colors.scss +25 -0
  151. package/dist/components/SiteHeader/scss/_eases.scss +9 -0
  152. package/dist/components/SiteHeader/scss/_grids.scss +126 -0
  153. package/dist/components/SiteHeader/scss/_z-indexes.scss +15 -0
  154. package/dist/components/SiteHeader/svgs/Close.svelte +14 -0
  155. package/dist/components/SiteHeader/svgs/Menu.svelte +19 -0
  156. package/dist/components/Spinner/Spinner.svelte +91 -0
  157. package/dist/components/Theme/@types/component.js +3 -0
  158. package/dist/components/Theme/Theme.svelte +37 -0
  159. package/dist/components/Theme/themes/dark.js +23 -0
  160. package/dist/components/Theme/themes/light.js +22 -0
  161. package/dist/components/Theme/utils/flatten.js +39 -0
  162. package/dist/components/Theme/utils/merge.js +23 -0
  163. package/dist/components/Video/Controls.svelte +68 -0
  164. package/dist/components/Video/Video.svelte +278 -0
  165. package/dist/components/Visible/Visible.svelte +54 -0
  166. package/dist/index.js +31 -0
  167. package/dist/scss/_mixins.scss +6 -0
  168. package/dist/scss/_variables.scss +2 -0
  169. package/dist/scss/bootstrap/_main.scss +34 -0
  170. package/dist/scss/bootstrap/_variables.scss +10 -0
  171. package/dist/scss/colours/thematic/_nord.scss +40 -0
  172. package/dist/scss/colours/thematic/_tr.scss +27 -0
  173. package/dist/scss/components/_hero-title.scss +118 -0
  174. package/dist/scss/fonts/_font-faces.scss +129 -0
  175. package/dist/scss/fonts/_mixins.scss +25 -0
  176. package/dist/scss/fonts/_rules.scss +19 -0
  177. package/dist/scss/fonts/_variables.scss +26 -0
  178. package/dist/scss/main.scss +16 -0
  179. package/dist/scss/mixins/_block.scss +62 -0
  180. package/dist/scss/mixins/_body-text.scss +113 -0
  181. package/dist/scss/mixins/_graphic.scss +66 -0
  182. package/dist/scss/mixins/_note-text.scss +34 -0
  183. package/dist/scss/mixins/_visually-hidden.scss +12 -0
  184. package/dist/scss/spacers/_rules.scss +65 -0
  185. package/dist/scss/spacers/_variables.scss +19 -0
  186. package/dist/scss/typography/_box-shadow.scss +11 -0
  187. package/dist/scss/typography/_font-size.scss +81 -0
  188. package/dist/scss/typography/_letter-spacing.scss +15 -0
  189. package/dist/scss/typography/_main.scss +5 -0
  190. package/dist/scss/typography/_mixins.scss +26 -0
  191. package/dist/scss/typography/_rules.scss +83 -0
  192. package/dist/scss/typography/_text-shadow.scss +13 -0
  193. package/dist/scss/typography/_transform.scss +7 -0
  194. package/dist/scss/typography/_variables.scss +39 -0
  195. package/package.json +210 -0
@@ -0,0 +1,23 @@
1
+ /** @type {import('../@types/component').Theme} */
2
+ export default {
3
+ colour: {
4
+ background: '#2e3440',
5
+ 'text-primary': '#ffffff',
6
+ 'text-secondary': 'rgb(255 255 255 / 60%)',
7
+ accent: ' #ef3c2a',
8
+ 'brand-logo': '#fa6400',
9
+ 'brand-rules': '#999999',
10
+ 'brand-shadow': 'rgb(255 255 255 / 10%)',
11
+ },
12
+ font: {
13
+ 'size-base': '1.375',
14
+ 'family-serif': 'freight-book, serif',
15
+ 'family-sans-serif': 'Knowledge, sans-serif',
16
+ 'family-monospace':
17
+ 'Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',
18
+ 'family-hed': 'var(--theme-font-family-sans-serif)',
19
+ 'family-subhed': 'var(--theme-font-family-sans-serif)',
20
+ 'family-body': 'var(--theme-font-family-serif)',
21
+ 'family-note': 'var(--theme-font-family-sans-serif)',
22
+ },
23
+ };
@@ -0,0 +1,22 @@
1
+ export default {
2
+ colour: {
3
+ background: '#ffffff',
4
+ 'text-primary': '#404040',
5
+ 'text-secondary': '#666666',
6
+ accent: ' #fa6400',
7
+ 'brand-logo': '#fa6400',
8
+ 'brand-rules': '#d0d0d0',
9
+ 'brand-shadow': 'rgb(64 64 64 / 80%)',
10
+ },
11
+ font: {
12
+ 'size-base': '1.375',
13
+ 'family-serif': 'freight-book, serif',
14
+ 'family-sans-serif': 'Knowledge, sans-serif',
15
+ 'family-monospace':
16
+ 'Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',
17
+ 'family-hed': 'var(--theme-font-family-sans-serif)',
18
+ 'family-subhed': 'var(--theme-font-family-sans-serif)',
19
+ 'family-body': 'var(--theme-font-family-serif)',
20
+ 'family-note': 'var(--theme-font-family-sans-serif)',
21
+ },
22
+ };
@@ -0,0 +1,39 @@
1
+ function isBuffer(obj) {
2
+ return (
3
+ obj &&
4
+ obj.constructor &&
5
+ typeof obj.constructor.isBuffer === 'function' &&
6
+ obj.constructor.isBuffer(obj)
7
+ );
8
+ }
9
+
10
+ const transformKey = (key) => key.replace(/[^a-z0-9-]/gi, '');
11
+
12
+ export default function flatten(target) {
13
+ const delimiter = '-';
14
+ const output = {};
15
+
16
+ function step(object, prev, currentDepth = 1) {
17
+ Object.keys(object).forEach(function (key) {
18
+ const value = object[key];
19
+ const isArray = Array.isArray(value);
20
+ const type = Object.prototype.toString.call(value);
21
+ const isbuffer = isBuffer(value);
22
+ const isObject = type === '[object Object]' || type === '[object Array]';
23
+
24
+ const newKey = prev
25
+ ? prev + delimiter + transformKey(key)
26
+ : transformKey(key);
27
+
28
+ if (!isArray && !isbuffer && isObject && Object.keys(value).length) {
29
+ return step(value, newKey, currentDepth + 1);
30
+ }
31
+
32
+ output[newKey] = value;
33
+ });
34
+ }
35
+
36
+ step(target);
37
+
38
+ return output;
39
+ }
@@ -0,0 +1,23 @@
1
+ function isObject(item) {
2
+ return item && typeof item === 'object' && !Array.isArray(item);
3
+ }
4
+
5
+ /**
6
+ * Deep merges theme objects.
7
+ */
8
+ export default function merge(target, ...sources) {
9
+ if (!sources.length) return target;
10
+ const source = sources.shift();
11
+
12
+ if (isObject(target) && isObject(source)) {
13
+ for (const key in source) {
14
+ if (isObject(source[key])) {
15
+ if (!target[key]) Object.assign(target, { [key]: {} });
16
+ merge(target[key], source[key]);
17
+ } else {
18
+ Object.assign(target, { [key]: source[key] });
19
+ }
20
+ }
21
+ }
22
+ return merge(target, ...sources);
23
+ }
@@ -0,0 +1,68 @@
1
+ <script>
2
+ import Fa from 'svelte-fa';
3
+ import { faReply, faPlay, faPause } from '@fortawesome/free-solid-svg-icons';
4
+ import { createEventDispatcher } from 'svelte';
5
+
6
+ const dispatch = createEventDispatcher();
7
+
8
+ export let paused;
9
+ export let clickedOnPauseBtn;
10
+ export let controlsOpacity;
11
+ export let controlsPosition;
12
+ export let widthVideoContainer;
13
+ export let heightVideoContainer;
14
+ export let controlsBorderOffset;
15
+ export let resetCondition;
16
+ export let separateReplayIcon;
17
+ export let controlsColour;
18
+
19
+ function forwardBtnClick() {
20
+ paused = !paused;
21
+ clickedOnPauseBtn = paused === true; // so video doesn't autoplay when coming into view again if paused previously
22
+ dispatch('pausePlayEvent', {
23
+ paused: paused,
24
+ clickedOnPauseBtn: clickedOnPauseBtn,
25
+ });
26
+ }
27
+ </script>
28
+
29
+ <button
30
+ on:click="{forwardBtnClick}"
31
+ style="
32
+ opacity: {controlsOpacity};
33
+ top: {controlsPosition === 'top left' || controlsPosition === 'top right'
34
+ ? `${10}px`
35
+ : `${heightVideoContainer - controlsBorderOffset}px`};
36
+ left: {controlsPosition === 'top left' || controlsPosition === 'bottom left'
37
+ ? `${10}px`
38
+ : `${widthVideoContainer - controlsBorderOffset}px`};
39
+ "
40
+ >
41
+ {#if resetCondition}
42
+ <i class="play-pause-icon replay">
43
+ {#if separateReplayIcon}
44
+ <Fa icon="{faReply}" size="2x" color="{controlsColour}" />
45
+ {:else}
46
+ <Fa icon="{faPlay}" size="2x" color="{controlsColour}" />
47
+ {/if}
48
+ </i>
49
+ {:else if paused === false}
50
+ <i class="play-pause-icon pause">
51
+ <Fa icon="{faPause}" size="2x" color="{controlsColour}" />
52
+ </i>
53
+ {:else if paused === true}
54
+ <i class="play-pause-icon play">
55
+ <Fa icon="{faPlay}" size="2x" color="{controlsColour}" />
56
+ </i>
57
+ {:else}
58
+ error
59
+ {/if}
60
+ </button>
61
+
62
+ <style>button {
63
+ z-index: 2;
64
+ position: absolute;
65
+ cursor: pointer;
66
+ background-color: transparent;
67
+ border: none;
68
+ }</style>
@@ -0,0 +1,278 @@
1
+ <script>import IntersectionObserver from 'svelte-intersection-observer';
2
+ import Controls from './Controls.svelte';
3
+ import Block from '../Block/Block.svelte';
4
+ /// //////////////////////////////////
5
+ /// /////////// Props ////////////////
6
+ /// //////////////////////////////////
7
+ /**
8
+ * Video src.
9
+ */
10
+ export let src = '';
11
+ export let ariaHidden = true;
12
+ export let ariaDescription = null;
13
+ export let caption = '';
14
+ /**
15
+ * Width of the block within the article well.
16
+ * @type {string}
17
+ */
18
+ export let width = 'normal';
19
+ /**
20
+ * Preload options. `auto` is ignored if `autoplay` is true. Can also be `none` or `metadata`.
21
+ * @type {string}
22
+ */
23
+ export let preloadVideo = 'auto';
24
+ /**
25
+ * Whether the video should loop.
26
+ */
27
+ export let loopVideo = true;
28
+ /**
29
+ * Whether video should have sound or not.
30
+ */
31
+ export let muteVideo = true;
32
+ export let allowSoundToAutoplay = false; // for video with sound, whether video should be allowed to autoplay if the user has previously interacted with DOM
33
+ export let playVideoWhenInView = true; // whether the video should play when it comes into view or just on page load
34
+ export let playVideoThreshold = 0.5; // if video plays with intersection observer, how much of it should be into view to start playing
35
+ export let possibleToPlayPause = true; // whether to have the option to pause and play video
36
+ export let showControls = true; // whetner to show the play / pause buttons
37
+ export let hoverToSeeControls = false; // whether you need to hover over the video to see the controls
38
+ export let separateReplayIcon = false; // whether to use a separate replay icon or use the play icon for replay as well
39
+ export let controlsColour = '#333'; // change the colour of the play/pause button
40
+ export let controlsOpacity = 0.5; // change the opacity of the play/pause button
41
+ $: interactiveControlsOpacity = 0;
42
+ export let controlsPosition = 'top left'; // have four options for controls position - top right, top left, bottom right, bottom left
43
+ /// //////////////////////////////////
44
+ /// /////// Internal Logic ///////////
45
+ /// //////////////////////////////////
46
+ // Internal props
47
+ let time = 0;
48
+ let duration;
49
+ let paused = true;
50
+ let clickedOnPauseBtn = false; // special variable to track if user clicked on 'pause' btn to help with audio logic
51
+ $: resetCondition = time >= duration; // - 0.1;
52
+ // Dimensions etc other useful things
53
+ let heightVideo;
54
+ let widthVideo;
55
+ let heightVideoContainer;
56
+ let widthVideoContainer;
57
+ const controlsBorderOffset = 50;
58
+ // For intersection observer
59
+ let intersecting;
60
+ let element;
61
+ let videoElement;
62
+ // For video with sound, check if there has been an interaction with the DOM
63
+ let interactedWithDom = false;
64
+ const setInteractedWithDom = () => {
65
+ interactedWithDom = true;
66
+ };
67
+ // Play the video (with no sound) if it's intersecting; pause when it's no longer intersecting
68
+ $: if (playVideoWhenInView && intersecting && muteVideo)
69
+ paused = false;
70
+ $: if (playVideoWhenInView && !intersecting)
71
+ paused = true;
72
+ // Special case for video with sound
73
+ // Only ff you've clicked on play button or interacted with DOM in any way previously, video with audio will play
74
+ $: if (allowSoundToAutoplay &&
75
+ playVideoWhenInView &&
76
+ intersecting &&
77
+ !muteVideo &&
78
+ interactedWithDom &&
79
+ !clickedOnPauseBtn // so video doesn't autoplay when coming into view again if paused previously
80
+ ) {
81
+ paused = false;
82
+ }
83
+ $: if (allowSoundToAutoplay && !muteVideo && !interactedWithDom) {
84
+ paused = true;
85
+ }
86
+ $: if (!possibleToPlayPause)
87
+ showControls = true;
88
+ // To get the pause state passed up from the Controls
89
+ const pausePlayEvent = (e) => {
90
+ const fwdPaused = e.detail.paused;
91
+ const fwdClickedOnPauseBtn = e.detail.clickedOnPauseBtn;
92
+ paused = fwdPaused;
93
+ clickedOnPauseBtn = fwdClickedOnPauseBtn;
94
+ };
95
+ // Warning to missing aria attributes
96
+ if (ariaHidden && !ariaDescription) {
97
+ console.warn('Must provide aria description for video components if ariaHidden is true.');
98
+ }
99
+ </script>
100
+
101
+ <svelte:window
102
+ on:click="{setInteractedWithDom}"
103
+ on:touchstart="{setInteractedWithDom}"
104
+ />
105
+
106
+ <Block width="{width}" cls="video-container">
107
+ <div
108
+ on:mouseover="{() => {
109
+ interactiveControlsOpacity = controlsOpacity;
110
+ }}"
111
+ on:focus="{() => {
112
+ interactiveControlsOpacity = controlsOpacity;
113
+ }}"
114
+ on:mouseout="{() => {
115
+ interactiveControlsOpacity = 0;
116
+ }}"
117
+ on:blur="{() => {
118
+ interactiveControlsOpacity = 0;
119
+ }}"
120
+ >
121
+ {#if (ariaHidden && ariaDescription) || !ariaHidden}
122
+ {#if ariaDescription}
123
+ <p class="visually-hidden">{ariaDescription}</p>
124
+ {/if}
125
+
126
+ {#if playVideoWhenInView}
127
+ <!-- Video element with Intersection Observer -->
128
+ <IntersectionObserver
129
+ element="{element}"
130
+ bind:intersecting
131
+ threshold="{playVideoThreshold}"
132
+ once="{false}"
133
+ >
134
+ <div
135
+ bind:this="{element}"
136
+ class="video-wrapper"
137
+ aria-hidden="{ariaHidden}"
138
+ bind:clientWidth="{widthVideoContainer}"
139
+ bind:clientHeight="{heightVideoContainer}"
140
+ >
141
+ {#if possibleToPlayPause}
142
+ {#if showControls}
143
+ <Controls
144
+ on:pausePlayEvent="{pausePlayEvent}"
145
+ paused="{paused}"
146
+ clickedOnPauseBtn="{clickedOnPauseBtn}"
147
+ controlsOpacity="{hoverToSeeControls
148
+ ? interactiveControlsOpacity
149
+ : controlsOpacity}"
150
+ controlsPosition="{controlsPosition}"
151
+ widthVideoContainer="{widthVideoContainer}"
152
+ heightVideoContainer="{heightVideoContainer}"
153
+ controlsBorderOffset="{controlsBorderOffset}"
154
+ resetCondition="{resetCondition}"
155
+ separateReplayIcon="{separateReplayIcon}"
156
+ controlsColour="{controlsColour}"
157
+ />
158
+ {:else}
159
+ <button
160
+ on:click="{() => {
161
+ paused === true ? (paused = false) : (paused = true);
162
+ }}"
163
+ style="position: absolute; top: 0; left: 0; width: {widthVideoContainer}px; height: {heightVideoContainer}px;"
164
+ ></button>
165
+ {/if}
166
+ {/if}
167
+ <video
168
+ bind:this="{videoElement}"
169
+ src="{src}"
170
+ width="100%"
171
+ muted="{muteVideo}"
172
+ playsinline
173
+ preload="{preloadVideo}"
174
+ loop="{loopVideo}"
175
+ bind:currentTime="{time}"
176
+ bind:duration
177
+ bind:paused
178
+ bind:clientWidth="{widthVideo}"
179
+ bind:clientHeight="{heightVideo}"
180
+ style="{showControls
181
+ ? 'position: relative'
182
+ : 'position: relative'}"
183
+ >
184
+ <track kind="captions" />
185
+ </video>
186
+ </div>
187
+ </IntersectionObserver>
188
+ {:else}
189
+ <!-- Video element without Intersection observer -->
190
+ <div
191
+ class="video-wrapper"
192
+ aria-hidden="{ariaHidden}"
193
+ bind:clientWidth="{widthVideoContainer}"
194
+ bind:clientHeight="{heightVideoContainer}"
195
+ >
196
+ {#if possibleToPlayPause}
197
+ {#if showControls}
198
+ <Controls
199
+ on:pausePlayEvent="{pausePlayEvent}"
200
+ paused="{paused}"
201
+ clickedOnPauseBtn="{clickedOnPauseBtn}"
202
+ controlsOpacity="{controlsOpacity}"
203
+ controlsPosition="{controlsPosition}"
204
+ widthVideoContainer="{widthVideoContainer}"
205
+ heightVideoContainer="{heightVideoContainer}"
206
+ controlsBorderOffset="{controlsBorderOffset}"
207
+ resetCondition="{resetCondition}"
208
+ separateReplayIcon="{separateReplayIcon}"
209
+ controlsColour="{controlsColour}"
210
+ />
211
+ {:else}
212
+ <button
213
+ on:click="{() => {
214
+ paused === true ? (paused = false) : (paused = true);
215
+ }}"
216
+ style="position: absolute; top: 0; left: 0; width: {widthVideoContainer}px; height: {heightVideoContainer}px;"
217
+ ></button>
218
+ {/if}
219
+ {/if}
220
+ <video
221
+ bind:this="{videoElement}"
222
+ src="{src}"
223
+ width="100%"
224
+ muted="{muteVideo}"
225
+ playsinline
226
+ preload="{preloadVideo}"
227
+ loop="{loopVideo}"
228
+ bind:currentTime="{time}"
229
+ bind:duration
230
+ bind:paused
231
+ autoplay
232
+ bind:clientWidth="{widthVideo}"
233
+ bind:clientHeight="{heightVideo}"
234
+ style="{showControls ? 'position: relative' : 'position: relative'}"
235
+ >
236
+ <track kind="captions" />
237
+ </video>
238
+ </div>
239
+ {/if}
240
+ {#if caption}
241
+ <figcaption>{caption}</figcaption>
242
+ {/if}
243
+ {/if}
244
+ </div>
245
+ </Block>
246
+
247
+ <style>.video-wrapper {
248
+ position: relative;
249
+ }
250
+ .video-wrapper video {
251
+ pointer-events: none;
252
+ }
253
+
254
+ .visually-hidden {
255
+ position: absolute !important;
256
+ width: 1px !important;
257
+ height: 1px !important;
258
+ padding: 0 !important;
259
+ margin: -1px !important;
260
+ overflow: hidden !important;
261
+ clip: rect(0, 0, 0, 0) !important;
262
+ -webkit-clip-path: polygon(0px 0px, 0px 0px, 0px 0px);
263
+ clip-path: polygon(0px 0px, 0px 0px, 0px 0px);
264
+ white-space: nowrap !important;
265
+ border: 0 !important;
266
+ }
267
+
268
+ figcaption {
269
+ font-size: 0.8rem;
270
+ color: var(--theme-colour-text-secondary, #666666);
271
+ }
272
+
273
+ button {
274
+ border: none;
275
+ margin: 0;
276
+ padding: 0;
277
+ background: none;
278
+ }</style>
@@ -0,0 +1,54 @@
1
+ <script>import { onMount } from 'svelte';
2
+ /**
3
+ * Whether to change visibility just once.
4
+ *
5
+ * Useful for loading expensive images or other media and then keeping them around once they're first loaded.
6
+ */
7
+ export let once = false;
8
+ /** Set Intersection Observer [rootMargin](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API#rootmargin) `top`. */
9
+ export let top = 0;
10
+ /** Set Intersection Observer [rootMargin](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API#rootmargin) `bottom`. */
11
+ export let bottom = 0;
12
+ /** Set Intersection Observer [rootMargin](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API#rootmargin) `left`. */
13
+ export let left = 0;
14
+ /** Set Intersection Observer [rootMargin](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API#rootmargin) `right`. */
15
+ export let right = 0;
16
+ /** Set the Intersection Observer [threshold](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API#threshold). */
17
+ export let threshold = 0;
18
+ let visible = false;
19
+ let container;
20
+ onMount(() => {
21
+ if (typeof IntersectionObserver !== 'undefined') {
22
+ const rootMargin = `${bottom}px ${left}px ${top}px ${right}px`;
23
+ const observer = new IntersectionObserver((entries) => {
24
+ visible = entries[0].isIntersecting;
25
+ if (visible && once) {
26
+ observer.unobserve(container);
27
+ }
28
+ }, {
29
+ rootMargin,
30
+ threshold,
31
+ });
32
+ observer.observe(container);
33
+ return () => observer.unobserve(container);
34
+ }
35
+ function handler() {
36
+ const bcr = container.getBoundingClientRect();
37
+ visible =
38
+ bcr.bottom + bottom > 0 &&
39
+ bcr.right + right > 0 &&
40
+ bcr.top - top < window.innerHeight &&
41
+ bcr.left - left < window.innerWidth;
42
+ if (visible && once) {
43
+ window.removeEventListener('scroll', handler);
44
+ }
45
+ }
46
+ window.addEventListener('scroll', handler);
47
+ return () => window.removeEventListener('scroll', handler);
48
+ });
49
+ </script>
50
+
51
+ <div bind:this="{container}">
52
+ <!-- An element or component -->
53
+ <slot visible="{visible}" />
54
+ </div>
package/dist/index.js ADDED
@@ -0,0 +1,31 @@
1
+ // Components
2
+ export { default as Article } from './components/Article/Article.svelte';
3
+ export { default as BeforeAfter } from './components/BeforeAfter/BeforeAfter.svelte';
4
+ export { default as Block } from './components/Block/Block.svelte';
5
+ export { default as BodyText } from './components/BodyText/BodyText.svelte';
6
+ export { default as DatawrapperChart } from './components/DatawrapperChart/DatawrapperChart.svelte';
7
+ export { default as EmbedPreviewerLink } from './components/EmbedPreviewerLink/EmbedPreviewerLink.svelte';
8
+ export { default as FeaturePhoto } from './components/FeaturePhoto/FeaturePhoto.svelte';
9
+ export { default as Framer } from './components/Framer/Framer.svelte';
10
+ export { default as GraphicBlock } from './components/GraphicBlock/GraphicBlock.svelte';
11
+ export { default as Headline } from './components/Headline/Headline.svelte';
12
+ export { default as Hero } from './components/Hero/Hero.svelte';
13
+ export { default as NoteText } from './components/NoteText/NoteText.svelte';
14
+ export { default as PymChild } from './components/PymChild/PymChild.svelte';
15
+ export { default as ReutersLogo } from './components/ReutersLogo/ReutersLogo.svelte';
16
+ export { default as Scroller } from './components/Scroller/Scroller.svelte';
17
+ export { default as SEO } from './components/SEO/SEO.svelte';
18
+ export { default as Sharer } from './components/Sharer/Sharer.svelte';
19
+ export { default as SiteFooter } from './components/SiteFooter/SiteFooter.svelte';
20
+ export { default as SiteHeader } from './components/SiteHeader/SiteHeader.svelte';
21
+ export { default as Spinner } from './components/Spinner/Spinner.svelte';
22
+ export {
23
+ default as Theme,
24
+ // @ts-ignore
25
+ themes
26
+ } from './components/Theme/Theme.svelte';
27
+ export { default as Video } from './components/Video/Video.svelte';
28
+ export { default as Visible } from './components/Visible/Visible.svelte';
29
+
30
+ // Utilities
31
+ export { getPhotoPackPropsFromDoc } from './components/PhotoPack/docProps';
@@ -0,0 +1,6 @@
1
+ @import 'mixins/block';
2
+ @import 'mixins/body-text';
3
+ @import 'fonts/mixins';
4
+ @import 'mixins/graphic';
5
+ @import 'mixins/note-text';
6
+ @import 'mixins/visually-hidden';
@@ -0,0 +1,2 @@
1
+ @import "fonts/variables";
2
+ @import "typography/variables";
@@ -0,0 +1,34 @@
1
+ // Bootstrap overrides...
2
+ @import "variables";
3
+
4
+
5
+ // Configuration
6
+ @import "bootstrap/scss/functions";
7
+ @import "bootstrap/scss/variables";
8
+ @import "bootstrap/scss/maps";
9
+ @import "bootstrap/scss/mixins";
10
+ @import "bootstrap/scss/utilities";
11
+
12
+ // Layout & components
13
+ @import "bootstrap/scss/root";
14
+ @import "bootstrap/scss/reboot";
15
+ @import "bootstrap/scss/type";
16
+ @import "bootstrap/scss/images";
17
+ @import "bootstrap/scss/containers";
18
+ @import "bootstrap/scss/grid";
19
+ @import "bootstrap/scss/tables";
20
+ @import "bootstrap/scss/forms";
21
+ @import "bootstrap/scss/buttons";
22
+ @import "bootstrap/scss/transitions";
23
+ @import "bootstrap/scss/dropdown";
24
+ @import "bootstrap/scss/button-group";
25
+
26
+ // // Helpers
27
+ // @import "bootstrap/scss/helpers";
28
+
29
+ // // Utilities
30
+ // @import "bootstrap/scss/utilities/api";
31
+
32
+
33
+ // // This should go somewhere...
34
+ // $hr-border-width: $border-width !default;
@@ -0,0 +1,10 @@
1
+ // Controls spacing like bootstrap's margin classes...
2
+ $spacer: 1rem;
3
+ $spacers: (
4
+ 0: 0,
5
+ 1: $spacer * .25,
6
+ 2: $spacer * .5,
7
+ 3: $spacer,
8
+ 4: $spacer * 1.5,
9
+ 5: $spacer * 3,
10
+ );
@@ -0,0 +1,40 @@
1
+ $nord-0: #2E3440;
2
+ $nord-polar-night-0: #2E3440;
3
+ $nord-black: #2E3440;
4
+ $nord-1: #3B4252;
5
+ $nord-polar-night-1: #3B4252;
6
+ $nord-2: #434C5E;
7
+ $nord-polar-night-2: #434C5E;
8
+ $nord-3: #4C566A;
9
+ $nord-polar-night-3: #4C566A;
10
+ $nord-4: #D8DEE9;
11
+ $nord-snow-storm-0: #D8DEE9;
12
+ $nord-5: #E5E9F0;
13
+ $nord-snow-storm-1: #E5E9F0;
14
+ $nord-6: #ECEFF4;
15
+ $nord-snow-storm-2: #ECEFF4;
16
+ $nord-white: #ECEFF4;
17
+ $nord-7: #8FBCBB;
18
+ $nord-frost-0: #8FBCBB;
19
+ $nord-8: #88C0D0;
20
+ $nord-frost-1: #88C0D0;
21
+ $nord-9: #81A1C1;
22
+ $nord-frost-2: #81A1C1;
23
+ $nord-10: #5E81AC;
24
+ $nord-frost-3: #5E81AC;
25
+ $nord-blue: #5E81AC;
26
+ $nord-11: #BF616A;
27
+ $nord-aurora-0: #BF616A;
28
+ $nord-red: #BF616A;
29
+ $nord-12: #D08770;
30
+ $nord-aurora-1: #D08770;
31
+ $nord-orange: #D08770;
32
+ $nord-13: #EBCB8B;
33
+ $nord-aurora-2: #EBCB8B;
34
+ $nord-yellow: #EBCB8B;
35
+ $nord-14: #A3BE8C;
36
+ $nord-aurora-3: #A3BE8C;
37
+ $nord-green: #A3BE8C;
38
+ $nord-15: #B48EAD;
39
+ $nord-aurora-4: #B48EAD;
40
+ $nord-purple: #B48EAD;
@@ -0,0 +1,27 @@
1
+ // Brand colours from RCOM's raptor system
2
+ // https://github.com/tr/rcom-arc_raptor-ui/blob/develop/packages/rcom-raptor-ui_atomic/styles/_colors.scss
3
+ $tr-orange: #fa6400;
4
+ $tr-dark-orange: #dc4300;
5
+ $tr-light-orange: #ffa100;
6
+ $tr-dark-grey: #404040;
7
+ $tr-medium-grey: #666666;
8
+ $tr-light-grey: #afafaf;
9
+ $tr-muted-grey: #d0d0d0;
10
+ $tr-contrast-grey: #949494;
11
+ $tr-hover-background-grey: #f8f8f8;
12
+ $tr-light-muted-grey: #f4f4f4;
13
+ $tr-ultra-light-grey: #fafafa;
14
+ $tr-dark-blue: #005da2;
15
+ $tr-light-blue: #0099c4;
16
+ $tr-muted-blue: #4386B9;
17
+ $tr-lighter-blue: #7FACCE;
18
+ $tr-superlight-blue: #e5eef5;
19
+ $tr-dark-purple: #621f95;
20
+ $tr-light-purple: #6e3ab7;
21
+ $tr-dark-red: #a00000;
22
+ $tr-light-red: #dc0a0a;
23
+ $tr-dark-green: #387c2b;
24
+ $tr-light-green: #77a22d;
25
+ $black: #000;
26
+ $white: #fff;
27
+ $ad-placeholder: #ffb1b1;