@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,20 @@
1
+ // Shamelessly stolen from: https://github.com/kaisermann/svelte-css-vars
2
+ export default (node, props) => {
3
+ Object.entries(props).forEach(([key, value]) => {
4
+ node.style.setProperty(`--${key}`, value);
5
+ });
6
+
7
+ return {
8
+ update(newProps) {
9
+ Object.entries(newProps).forEach(([key, value]) => {
10
+ node.style.setProperty(`--${key}`, value);
11
+ delete props[key];
12
+ });
13
+
14
+ Object.keys(props).forEach((name) => {
15
+ node.style.removeProperty(`--${name}`);
16
+ });
17
+ props = newProps;
18
+ },
19
+ };
20
+ };
@@ -0,0 +1,25 @@
1
+ // Shamelessly stolen from https://github.com/sveltejs/svelte/issues/7583#issue-1260717165
2
+ let observer;
3
+ let callbacks;
4
+
5
+ export default (element, onResize) => {
6
+ if (!observer) {
7
+ callbacks = new WeakMap();
8
+ observer = new ResizeObserver(entries => {
9
+ for (const entry of entries) {
10
+ const onResize = callbacks.get(entry.target);
11
+ if (onResize) onResize(entry.target);
12
+ }
13
+ });
14
+ }
15
+
16
+ callbacks.set(element, onResize);
17
+ observer.observe(element);
18
+
19
+ return {
20
+ destroy: () => {
21
+ callbacks.delete(element);
22
+ observer.unobserve(element);
23
+ },
24
+ };
25
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,47 @@
1
+ <script>/** Set to true for embeddables. */
2
+ export let embedded = false;
3
+ /** Add an id to the article tag to target it with custom CSS. */
4
+ export let id = null;
5
+ /** ARIA role of the article. */
6
+ export let role = null;
7
+ /** Set custom widths for the normal, wide and wider column dimensions */
8
+ export let columnWidths = {
9
+ narrower: 330,
10
+ narrow: 510,
11
+ normal: 660,
12
+ wide: 930,
13
+ wider: 1200,
14
+ };
15
+ import cssVariables from '$lib/actions/cssVariables/index.js';
16
+ $: columnWidthVars = {
17
+ 'narrower-column-width': columnWidths.narrower + 'px',
18
+ 'narrow-column-width': columnWidths.narrow + 'px',
19
+ 'normal-column-width': columnWidths.normal + 'px',
20
+ 'wide-column-width': columnWidths.wide + 'px',
21
+ 'wider-column-width': columnWidths.wider + 'px',
22
+ };
23
+ </script>
24
+
25
+ <main>
26
+ <article
27
+ id="{id}"
28
+ class:embedded
29
+ role="{role}"
30
+ use:cssVariables="{columnWidthVars}"
31
+ >
32
+ <!-- Article content -->
33
+ <slot />
34
+ </article>
35
+ </main>
36
+
37
+ <style>article {
38
+ width: 100%;
39
+ display: block;
40
+ margin: 0;
41
+ padding: 0 15px;
42
+ overflow-x: hidden;
43
+ background-color: var(--theme-colour-background, transparent);
44
+ }
45
+ article.embedded {
46
+ overflow: auto;
47
+ }</style>
@@ -0,0 +1,341 @@
1
+ <script>import { throttle } from 'lodash-es';
2
+ import { onMount } from 'svelte';
3
+ import Block from '../Block/Block.svelte';
4
+ /** Width of the chart within the text well. */
5
+ export let width = 'normal'; // options: wide, wider, widest, fluid
6
+ /** Height of the component */
7
+ export let height = 600;
8
+ /**
9
+ * If set, makes the height a ratio of the component's width.
10
+ * @type {number}
11
+ */
12
+ export let heightRatio = null;
13
+ /**
14
+ * Before image src
15
+ * @required
16
+ */
17
+ export let beforeSrc = null;
18
+ /**
19
+ * Before image altText
20
+ * @required
21
+ */
22
+ export let beforeAlt = null;
23
+ /**
24
+ * After image src
25
+ * @required
26
+ */
27
+ export let afterSrc = null;
28
+ /**
29
+ * After image altText
30
+ * @required
31
+ */
32
+ export let afterAlt = null;
33
+ /** Drag handle colour */
34
+ export let handleColour = 'white';
35
+ /** Drag handle opacity */
36
+ export let handleInactiveOpacity = 0.6;
37
+ /** Margin at the edge of the image to stop dragging */
38
+ export let handleMargin = 20;
39
+ /** Percentage of the component width the handle will travel ona key press */
40
+ export let keyPressStep = 0.05;
41
+ /** Initial offset of the handle, between 0 and 1. */
42
+ export let offset = 0.5;
43
+ const random4 = () => Math.floor((1 + Math.random()) * 0x10000)
44
+ .toString(16)
45
+ .substring(1);
46
+ /**
47
+ * Add an ID to target with SCSS.
48
+ * @type {string}
49
+ */
50
+ export let id = 'before-after-' + random4() + random4();
51
+ let img;
52
+ let imgOffset = null;
53
+ let sliding = false;
54
+ let figure;
55
+ let beforeOverlayWidth = 0;
56
+ let isFocused = false;
57
+ let containerWidth;
58
+ $: containerHeight =
59
+ containerWidth && heightRatio ? containerWidth * heightRatio : height;
60
+ const onFocus = () => (isFocused = true);
61
+ const onBlur = () => (isFocused = false);
62
+ const handleKeyDown = (e) => {
63
+ if (!isFocused)
64
+ return;
65
+ const { keyCode } = e;
66
+ const margin = handleMargin / w;
67
+ if (keyCode === 39) {
68
+ offset = Math.min(1 - margin, offset + keyPressStep);
69
+ }
70
+ else if (keyCode === 37) {
71
+ offset = Math.max(0 + margin, offset - keyPressStep);
72
+ }
73
+ };
74
+ const measureImage = () => {
75
+ if (img && img.complete)
76
+ imgOffset = img.getBoundingClientRect();
77
+ };
78
+ const resize = () => {
79
+ measureImage();
80
+ };
81
+ const measureLoadedImage = (e) => {
82
+ if (e.type === 'load') {
83
+ imgOffset = e.target.getBoundingClientRect();
84
+ }
85
+ };
86
+ const move = (e) => {
87
+ if (sliding && imgOffset) {
88
+ const el = e.touches ? e.touches[0] : e;
89
+ const figureOffset = figure
90
+ ? parseInt(window.getComputedStyle(figure).marginLeft.slice(0, -2))
91
+ : 0;
92
+ let x = el.pageX - figureOffset - imgOffset.left;
93
+ x =
94
+ x < handleMargin
95
+ ? handleMargin
96
+ : x > w - handleMargin
97
+ ? w - handleMargin
98
+ : x;
99
+ offset = x / w;
100
+ }
101
+ };
102
+ const start = (e) => {
103
+ sliding = true;
104
+ move(e);
105
+ };
106
+ const end = () => {
107
+ sliding = false;
108
+ };
109
+ $: w = (imgOffset && imgOffset.width) || 0;
110
+ $: x = w * offset;
111
+ $: figStyle = `width:100%;height:${containerHeight}px;`;
112
+ $: imgStyle = 'width:100%;height:100%;';
113
+ $: beforeOverlayClip =
114
+ x < beforeOverlayWidth ? Math.abs(x - beforeOverlayWidth) : 0;
115
+ if (!(beforeSrc && beforeAlt && afterSrc && afterAlt)) {
116
+ console.warn('Missing required src or alt props for BeforeAfter component');
117
+ }
118
+ onMount(() => {
119
+ // This is necessary b/c on:load doesn't reliably fire on the image...
120
+ const interval = setInterval(() => {
121
+ if (imgOffset)
122
+ clearInterval(interval);
123
+ if (img && img.complete && !imgOffset)
124
+ measureImage();
125
+ }, 50);
126
+ });
127
+ </script>
128
+
129
+ <svelte:window
130
+ on:touchmove="{move}"
131
+ on:touchend="{end}"
132
+ on:mousemove="{move}"
133
+ on:mouseup="{end}"
134
+ on:resize="{throttle(resize, 100)}"
135
+ on:keydown="{handleKeyDown}"
136
+ />
137
+
138
+ {#if beforeSrc && beforeAlt && afterSrc && afterAlt}
139
+ <Block width="{width}" id="{id}" cls="photo before-after">
140
+ <div
141
+ style="height: {containerHeight}px;"
142
+ bind:clientWidth="{containerWidth}"
143
+ >
144
+ <figure
145
+ style="{figStyle}"
146
+ class="before-after-container"
147
+ on:touchstart="{start}"
148
+ on:mousedown="{start}"
149
+ bind:this="{figure}"
150
+ aria-labelledby="{$$slots.caption && `${id}-caption`}"
151
+ >
152
+ <img
153
+ bind:this="{img}"
154
+ src="{afterSrc}"
155
+ alt="{afterAlt}"
156
+ on:load="{measureLoadedImage}"
157
+ on:mousedown|preventDefault
158
+ style="{imgStyle}"
159
+ class="after"
160
+ aria-describedby="{$$slots.beforeOverlay && `${id}-before`}"
161
+ />
162
+
163
+ <img
164
+ src="{beforeSrc}"
165
+ alt="{beforeAlt}"
166
+ on:mousedown|preventDefault
167
+ style="clip: rect(0 {x}px {containerHeight}px 0);{imgStyle}"
168
+ class="before"
169
+ aria-describedby="{$$slots.afterOverlay && `${id}-after`}"
170
+ />
171
+ {#if $$slots.beforeOverlay}
172
+ <div
173
+ id="image-before-label"
174
+ class="overlay-container before"
175
+ bind:clientWidth="{beforeOverlayWidth}"
176
+ style="clip-path: inset(0 {beforeOverlayClip}px 0 0);"
177
+ >
178
+ <!-- Overlay for before image -->
179
+ <slot
180
+ name="beforeOverlay"
181
+ description="{`${id}-before-description`}"
182
+ />
183
+ </div>
184
+ {/if}
185
+ {#if $$slots.afterOverlay}
186
+ <div id="image-after-label" class="overlay-container after">
187
+ <!-- Overlay for after image -->
188
+ <slot
189
+ name="afterOverlay"
190
+ description="{`${id}-after-description`}"
191
+ />
192
+ </div>
193
+ {/if}
194
+ <div
195
+ tabindex="0"
196
+ class="handle"
197
+ style="left: calc({offset *
198
+ 100}% - 20px); --before-after-handle-colour: {handleColour}; --before-after-handle-inactive-opacity: {handleInactiveOpacity};"
199
+ on:focus="{onFocus}"
200
+ on:blur="{onBlur}"
201
+ >
202
+ <div class="arrow-left"></div>
203
+ <div class="arrow-right"></div>
204
+ </div>
205
+ </figure>
206
+ </div>
207
+ {#if $$slots.caption}
208
+ <aside class="before-after-caption" id="{`${id}-caption`}">
209
+ <!-- Caption for image credits -->
210
+ <slot name="caption" />
211
+ </aside>
212
+ {/if}
213
+ </Block>
214
+ {/if}
215
+
216
+ <style>figure.before-after-container {
217
+ overflow: hidden;
218
+ position: relative;
219
+ box-sizing: content-box;
220
+ margin: 0 auto;
221
+ }
222
+ figure.before-after-container img {
223
+ top: 0;
224
+ left: 0;
225
+ z-index: 20;
226
+ margin: 0;
227
+ display: block;
228
+ max-width: 100%;
229
+ -webkit-user-select: none;
230
+ -moz-user-select: none;
231
+ user-select: none;
232
+ -o-object-fit: cover;
233
+ object-fit: cover;
234
+ position: absolute;
235
+ }
236
+ figure.before-after-container img.after {
237
+ z-index: 21;
238
+ }
239
+ figure.before-after-container img.before {
240
+ z-index: 22;
241
+ }
242
+ figure.before-after-container .overlay-container {
243
+ position: absolute;
244
+ }
245
+ figure.before-after-container .overlay-container :global(p) {
246
+ font-family: var(--theme-font-family-note, "Knowledge", "Source Sans Pro", Arial, sans-serif);
247
+ font-size: 1rem;
248
+ line-height: 1.2rem;
249
+ }
250
+ figure.before-after-container .overlay-container :global(p:last-child) {
251
+ margin-bottom: 0;
252
+ }
253
+ figure.before-after-container .overlay-container.before {
254
+ left: 0;
255
+ z-index: 23;
256
+ }
257
+ figure.before-after-container .overlay-container.after {
258
+ right: 0;
259
+ z-index: 21;
260
+ }
261
+
262
+ .handle {
263
+ z-index: 30;
264
+ width: 40px;
265
+ height: 40px;
266
+ cursor: move;
267
+ background: none;
268
+ -webkit-user-select: none;
269
+ -moz-user-select: none;
270
+ user-select: none;
271
+ position: absolute;
272
+ border-radius: 50px;
273
+ top: calc(50% - 20px);
274
+ border: 4px solid var(--before-after-handle-colour);
275
+ opacity: var(--before-after-handle-inactive-opacity, 0.6);
276
+ }
277
+ .handle:hover, .handle:active, .handle:focus {
278
+ opacity: 1;
279
+ }
280
+ .handle:before, .handle:after {
281
+ content: "";
282
+ height: 9999px;
283
+ position: absolute;
284
+ left: calc(50% - 2px);
285
+ border: 2px solid var(--before-after-handle-colour);
286
+ }
287
+ .handle:before {
288
+ top: 40px;
289
+ }
290
+ .handle:after {
291
+ bottom: 40px;
292
+ }
293
+ .handle .arrow-right,
294
+ .handle .arrow-left {
295
+ width: 0;
296
+ height: 0;
297
+ -webkit-user-select: none;
298
+ -moz-user-select: none;
299
+ user-select: none;
300
+ position: relative;
301
+ border-top: 10px solid transparent;
302
+ border-bottom: 10px solid transparent;
303
+ }
304
+ .handle .arrow-right {
305
+ left: 19px;
306
+ bottom: 14px;
307
+ border-left: 10px solid var(--before-after-handle-colour);
308
+ }
309
+ .handle .arrow-left {
310
+ left: 3px;
311
+ top: 6px;
312
+ border-right: 10px solid var(--before-after-handle-colour);
313
+ }
314
+
315
+ aside.before-after-caption {
316
+ margin: 0 auto;
317
+ font-family: var(--theme-font-family-note, "Knowledge", "Source Sans Pro", Arial, sans-serif);
318
+ color: var(--theme-colour-text-secondary, #666666);
319
+ }
320
+ aside.before-after-caption :global(p) {
321
+ font-family: var(--theme-font-family-note, "Knowledge", "Source Sans Pro", Arial, sans-serif);
322
+ color: var(--theme-colour-text-secondary, #666666);
323
+ font-size: 0.9rem;
324
+ line-height: 1.2rem;
325
+ }
326
+ aside.before-after-caption :global(p:last-of-type) {
327
+ margin-bottom: 0;
328
+ }
329
+ @media (max-width: 540px) {
330
+ aside.before-after-caption :global(p) {
331
+ font-size: 0.8rem;
332
+ line-height: 1.1rem;
333
+ }
334
+ }
335
+ aside.before-after-caption :global(p) :global(a) {
336
+ color: currentColor;
337
+ text-decoration: underline;
338
+ }
339
+ aside.before-after-caption :global(p) :global(a:hover) {
340
+ text-decoration: underline;
341
+ }</style>
@@ -0,0 +1,177 @@
1
+ <script>/** Width of the block within the article well. */
2
+ export let width = 'normal';
3
+ /** Add an id to the block tag to target it with custom CSS. */
4
+ export let id = '';
5
+ /** Add extra classes to the block tag to target it with custom CSS. */
6
+ export let cls = '';
7
+ /** Snap block to column widths, rather than fluidly resizing them. */
8
+ export let snap = false;
9
+ /** ARIA [role](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles) for the block */
10
+ export let role = null;
11
+ /** ARIA [label](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-label) for the block */
12
+ export let ariaLabel = null;
13
+ </script>
14
+
15
+ <div
16
+ id="{id}"
17
+ class="article-block {width} {cls}"
18
+ class:snap="{snap && width !== 'fluid' && width !== 'widest'}"
19
+ role="{role}"
20
+ aria-label="{ariaLabel}"
21
+ >
22
+ <!-- block content -->
23
+ <slot />
24
+ </div>
25
+
26
+ <style>.paragraph-size {
27
+ font-size: 1.3rem;
28
+ line-height: 2.1rem;
29
+ }
30
+ .paragraph-size.font-sans {
31
+ font-size: 1.1rem;
32
+ line-height: 1.75rem;
33
+ }
34
+ @media (max-width: 540px) {
35
+ .paragraph-size {
36
+ font-size: 1.1rem;
37
+ line-height: 1.8rem;
38
+ }
39
+ .paragraph-size.font-sans {
40
+ font-size: 1rem;
41
+ line-height: 1.6rem;
42
+ }
43
+ }
44
+ .paragraph-size.important {
45
+ font-size: 1.3rem !important;
46
+ line-height: 2.1rem !important;
47
+ }
48
+ .paragraph-size.important.font-sans {
49
+ font-size: 1.1rem !important;
50
+ line-height: 1.8rem !important;
51
+ }
52
+ @media (max-width: 540px) {
53
+ .paragraph-size.important {
54
+ font-size: 1.1rem !important;
55
+ line-height: 1.8rem !important;
56
+ }
57
+ .paragraph-size.important.font-sans {
58
+ font-size: 1rem !important;
59
+ line-height: 1.6rem !important;
60
+ }
61
+ }
62
+
63
+ .small-size {
64
+ font-size: 0.9rem;
65
+ line-height: 1.2rem;
66
+ }
67
+ @media (max-width: 540px) {
68
+ .small-size {
69
+ font-size: 0.8rem;
70
+ line-height: 1.1rem;
71
+ }
72
+ }
73
+ .small-size.important {
74
+ font-size: 0.9rem !important;
75
+ line-height: 1.2rem !important;
76
+ }
77
+ @media (max-width: 540px) {
78
+ .small-size.important {
79
+ font-size: 0.8rem !important;
80
+ line-height: 1.1rem !important;
81
+ }
82
+ }
83
+
84
+ .blockquote-size {
85
+ font-size: 1.6rem;
86
+ line-height: 2.1rem;
87
+ }
88
+ @media (max-width: 540px) {
89
+ .blockquote-size {
90
+ font-size: 1.3rem;
91
+ line-height: 1.9rem;
92
+ }
93
+ }
94
+ .blockquote-size.important {
95
+ font-size: 1.6rem !important;
96
+ line-height: 2rem !important;
97
+ }
98
+ @media (max-width: 540px) {
99
+ .blockquote-size.important {
100
+ font-size: 1.3rem !important;
101
+ line-height: 1.8rem !important;
102
+ }
103
+ }
104
+
105
+ div.article-block {
106
+ max-width: var(--normal-column-width, 660px);
107
+ margin-left: auto;
108
+ margin-right: auto;
109
+ margin-top: 0;
110
+ }
111
+ div.article-block:not(:last-child) {
112
+ margin-bottom: 3rem;
113
+ }
114
+ div.article-block.narrower {
115
+ max-width: var(--narrower-column-width, 330px);
116
+ }
117
+ div.article-block.narrow {
118
+ max-width: var(--narrow-column-width, 510px);
119
+ }
120
+ div.article-block.wide {
121
+ max-width: var(--wide-column-width, 930px);
122
+ }
123
+ div.article-block.wider {
124
+ max-width: var(--wider-column-width, 1200px);
125
+ }
126
+ div.article-block.widest {
127
+ max-width: 100%;
128
+ }
129
+ div.article-block.fluid {
130
+ width: calc(100% + 30px);
131
+ margin-left: -15px;
132
+ max-width: none;
133
+ }
134
+ div.article-block.snap {
135
+ width: 330px;
136
+ }
137
+ @media (min-width: 540px) {
138
+ div.article-block.snap:not(.skip-narrow) {
139
+ width: 510px;
140
+ }
141
+ }
142
+ @media (min-width: 690px) {
143
+ div.article-block.snap:not(.skip-normal) {
144
+ width: 660px;
145
+ }
146
+ }
147
+ @media (min-width: 360px) {
148
+ div.article-block.snap.narrower {
149
+ width: 330px;
150
+ }
151
+ }
152
+ @media (min-width: 540px) {
153
+ div.article-block.snap.narrow {
154
+ width: 510px;
155
+ }
156
+ }
157
+ @media (min-width: 960px) {
158
+ div.article-block.snap.wide {
159
+ width: 930px;
160
+ }
161
+ }
162
+ @media (min-width: 960px) {
163
+ div.article-block.snap.wider:not(.skip-wide) {
164
+ width: 930px;
165
+ }
166
+ }
167
+ @media (min-width: 1230px) {
168
+ div.article-block.snap.wider:not(.skip-wider) {
169
+ width: 1200px;
170
+ }
171
+ }
172
+ div.article-block.snap.widest, div.article-block.snap.fluid {
173
+ width: inherit;
174
+ }
175
+ div.article-block.snap.fluid {
176
+ width: calc(100% + 30px);
177
+ }</style>