@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,112 @@
1
+ <script>
2
+ import NavDropdown from './index.svelte';
3
+ import { normalizeUrl } from '../utils';
4
+
5
+ export let sections = [];
6
+ </script>
7
+
8
+ <NavDropdown>
9
+ <div class="more-sections">
10
+ <div class="groupContainer">
11
+ {#each sections as section}
12
+ <section
13
+ class="more-section-group"
14
+ class:has-children="{section.children}"
15
+ >
16
+ <a href="{normalizeUrl(section.url)}" class="section-link">
17
+ {section.name}
18
+ </a>
19
+ {#if section.children}
20
+ <ul class="subsections">
21
+ {#each section.children as sub}
22
+ <li>
23
+ <a class="subsection-link" href="{normalizeUrl(sub.url)}"
24
+ >{sub.name}</a
25
+ >
26
+ </li>
27
+ {/each}
28
+ </ul>
29
+ {/if}
30
+ </section>
31
+ {/each}
32
+ </div>
33
+ </div>
34
+ </NavDropdown>
35
+
36
+ <style>@charset "UTF-8";
37
+ /*
38
+ Several components utilize z-index, the CSS property that helps control layout by providing a third axis to arrange content. We utilize a default z-index scale that’s been designed to properly layer navigation, tooltips and popovers, modals, and more.
39
+ These higher values start at an arbitrary number, high and specific enough to ideally avoid conflicts. We need a standard set of these across our layered components—tooltips, popovers, navbars, dropdowns, modals—so we can be reasonably consistent in the behaviors.
40
+ To handle overlapping borders within components (e.g., buttons and inputs in input groups), we use low single digit z-index values of 1, 2, and 3 for default, hover, and active states. On hover/focus/active, we bring a particular element to the forefront with a higher z-index value to show their border over the sibling elements.
41
+ */
42
+ a {
43
+ text-decoration: none;
44
+ }
45
+ a:hover {
46
+ color: inherit;
47
+ text-decoration: underline !important;
48
+ }
49
+
50
+ .more-sections {
51
+ position: relative;
52
+ }
53
+ @media (max-width: 1023px) {
54
+ .more-sections {
55
+ display: flex;
56
+ flex-direction: row;
57
+ -moz-column-gap: 64px;
58
+ column-gap: 64px;
59
+ }
60
+ }
61
+
62
+ .more-section-group.has-children {
63
+ margin-bottom: 20px;
64
+ }
65
+ .more-section-group .subsections {
66
+ display: grid;
67
+ grid-template-columns: repeat(2, 1fr);
68
+ grid-column-gap: 2.2222222222vw;
69
+ padding: 0;
70
+ margin: 0;
71
+ list-style: none;
72
+ }
73
+ @media (max-width: 1023px) {
74
+ .more-section-group .subsections {
75
+ grid-column-gap: 4.2666666667vw;
76
+ }
77
+ }
78
+ @media (min-width: 1440px) {
79
+ .more-section-group .subsections {
80
+ grid-column-gap: 32px;
81
+ }
82
+ }
83
+ .more-section-group .subsections .subsection-link {
84
+ font-size: 16px;
85
+ color: var(--nav-primary, #404040);
86
+ line-height: 18px;
87
+ font-weight: 400;
88
+ display: inline-block;
89
+ padding: 4px 0;
90
+ margin-bottom: 2px;
91
+ text-decoration: none;
92
+ }
93
+ .more-section-group .subsections .subsection-link:hover {
94
+ text-decoration: underline !important;
95
+ }
96
+ .more-section-group .section-link {
97
+ grid-column: 1/-1;
98
+ margin-bottom: 16px;
99
+ line-height: 18px;
100
+ font-size: 16px;
101
+ display: inline-block;
102
+ color: var(--nav-primary, #404040);
103
+ text-decoration: none;
104
+ }
105
+ @media (min-width: 1300px) {
106
+ .more-section-group .section-link {
107
+ font-size: 18px;
108
+ }
109
+ }
110
+ .more-section-group .section-link:hover {
111
+ text-decoration: underline !important;
112
+ }</style>
@@ -0,0 +1,118 @@
1
+ <script>
2
+ import { normalizeUrl } from '../utils';
3
+
4
+ import NavDropdown from './index.svelte';
5
+
6
+ export let section = {};
7
+ export let headingText;
8
+
9
+ $: splitCount =
10
+ section.children && section.children.length > 7
11
+ ? Math.ceil(section.children.length / 2)
12
+ : 0;
13
+ </script>
14
+
15
+ <NavDropdown headingText="{headingText}">
16
+ <a href="{normalizeUrl(section.url)}">
17
+ <span class="heading">
18
+ Browse {section.name}
19
+ </span>
20
+ </a>
21
+ <div class="sections">
22
+ {#if splitCount > 0}
23
+ <ul class="sections-group">
24
+ {#each section.children.slice(0, splitCount) as sub}
25
+ <li>
26
+ <a class="subsection-link" href="{normalizeUrl(sub.url)}">
27
+ {sub.name}
28
+ </a>
29
+ </li>
30
+ {/each}
31
+ </ul>
32
+ {/if}
33
+ <ul class="sections-group">
34
+ {#each section.children.slice(splitCount) as sub}
35
+ <li>
36
+ <a class="subsection-link" href="{normalizeUrl(sub.url)}">
37
+ {sub.name}
38
+ </a>
39
+ </li>
40
+ {/each}
41
+ </ul>
42
+ </div>
43
+ </NavDropdown>
44
+
45
+ <style>a {
46
+ text-decoration: none;
47
+ }
48
+ a:hover {
49
+ color: var(--nav-primary, #404040);
50
+ text-decoration: underline !important;
51
+ }
52
+
53
+ .sections {
54
+ display: flex;
55
+ }
56
+ @media (max-width: 1023px) {
57
+ .sections {
58
+ display: block;
59
+ }
60
+ }
61
+ .sections .sections-group {
62
+ width: 50%;
63
+ list-style: none;
64
+ padding: 0;
65
+ margin: 12px 0 0 0;
66
+ }
67
+ .sections .sections-group:first-child {
68
+ margin-right: 16px;
69
+ }
70
+ @media (max-width: 1023px) {
71
+ .sections .sections-group:nth-child(2) {
72
+ margin-top: 0;
73
+ }
74
+ }
75
+
76
+ .subsection-link {
77
+ line-height: 18px;
78
+ font-weight: 400;
79
+ display: inline-block;
80
+ padding: 4px 0;
81
+ margin-bottom: 2px;
82
+ }
83
+ .subsection-link:hover {
84
+ text-decoration: underline;
85
+ }
86
+
87
+ span.heading {
88
+ line-height: 1.333;
89
+ font-size: 16px;
90
+ font-weight: 500;
91
+ margin: 0;
92
+ padding: 0;
93
+ letter-spacing: 0;
94
+ text-decoration: none;
95
+ text-transform: none;
96
+ font-smooth: always;
97
+ color: var(--nav-primary, #404040);
98
+ -webkit-font-smoothing: antialiased;
99
+ }
100
+ @media (min-width: 1300px) {
101
+ span.heading {
102
+ font-size: 18px;
103
+ }
104
+ }
105
+ span.heading:hover {
106
+ color: inherit;
107
+ text-decoration: underline !important;
108
+ }
109
+
110
+ li > a {
111
+ line-height: 1.75;
112
+ letter-spacing: 0;
113
+ font-size: 16px;
114
+ color: var(--nav-primary, #404040);
115
+ font-weight: 400;
116
+ font-smooth: always;
117
+ -webkit-font-smoothing: antialiased;
118
+ }</style>
@@ -0,0 +1,49 @@
1
+ <div>
2
+ <div class="spinner-container">
3
+ <div class="spinner"></div>
4
+ </div>
5
+ </div>
6
+
7
+ <style>@-webkit-keyframes spinner {
8
+ to {
9
+ transform: rotate(360deg);
10
+ }
11
+ }
12
+ @keyframes spinner {
13
+ to {
14
+ transform: rotate(360deg);
15
+ }
16
+ }
17
+ .spinner-container {
18
+ position: relative;
19
+ height: 0;
20
+ padding-bottom: 100%;
21
+ color: var(--nav-primary, #404040);
22
+ }
23
+
24
+ .spinner {
25
+ position: absolute;
26
+ top: 0;
27
+ left: 0;
28
+ width: 100%;
29
+ height: 100%;
30
+ border-radius: 50%;
31
+ border: 4px solid transparent;
32
+ border-top-color: currentColor;
33
+ -webkit-animation: spinner 0.6s linear infinite;
34
+ animation: spinner 0.6s linear infinite;
35
+ box-sizing: border-box;
36
+ }
37
+ .spinner::before {
38
+ content: "";
39
+ position: absolute;
40
+ display: block;
41
+ left: -4px;
42
+ top: -4px;
43
+ width: 100%;
44
+ height: 100%;
45
+ border: 4px solid currentColor;
46
+ box-sizing: content-box;
47
+ border-radius: 50%;
48
+ opacity: 0.25;
49
+ }</style>
@@ -0,0 +1,99 @@
1
+ <script>
2
+ import { normalizeUrl } from '../../utils';
3
+ import { getTime } from './time';
4
+
5
+ export let story;
6
+ export let withSection = false;
7
+
8
+ $: thumbnail = story.thumbnail;
9
+ </script>
10
+
11
+ <div class="story-card">
12
+ <a href="{normalizeUrl(story.canonical_url)}">
13
+ <div class="story-text" class:has-thumbnail="{thumbnail}">
14
+ {#if withSection}
15
+ <a href="{normalizeUrl(story.primary_section.id)}">
16
+ <span class="label">{story.primary_section.name}</span>
17
+ </a>
18
+ {/if}
19
+ <span>{story.title}</span>
20
+ {#if !withSection}
21
+ <time datetime="{story.display_time}"
22
+ >{getTime(story.display_time)}</time
23
+ >
24
+ {/if}
25
+ </div>
26
+ {#if thumbnail}
27
+ <div class="thumbnail">
28
+ <img
29
+ src="{thumbnail.renditions.square['120w']}"
30
+ alt="{thumbnail.alt_text}"
31
+ />
32
+ </div>
33
+ {/if}
34
+ </a>
35
+ </div>
36
+
37
+ <style>.story-card a {
38
+ display: flex;
39
+ flex-direction: row;
40
+ justify-content: flex-start;
41
+ color: var(--nav-primary, #404040);
42
+ text-decoration: none;
43
+ }
44
+ .story-card a:hover, .story-card a:focus {
45
+ text-decoration: none;
46
+ }
47
+ .story-card a:hover .story-text span, .story-card a:focus .story-text span {
48
+ text-decoration: underline;
49
+ }
50
+ .story-card a:hover .story-text span.label, .story-card a:focus .story-text span.label {
51
+ text-decoration: none;
52
+ }
53
+ .story-card a .story-text {
54
+ margin-right: 10px;
55
+ width: 100%;
56
+ }
57
+ .story-card a .story-text.has-thumbnail {
58
+ width: calc(100% - 84px);
59
+ }
60
+ .story-card a .story-text span {
61
+ color: var(--nav-primary, #404040);
62
+ font-size: 16px;
63
+ font-weight: 500;
64
+ font-family: "Knowledge", "Source Sans Pro", Arial, sans-serif;
65
+ }
66
+ @media (min-width: 1300px) {
67
+ .story-card a .story-text span {
68
+ font-size: 18px;
69
+ }
70
+ }
71
+ .story-card a .story-text span.label {
72
+ font-size: 14px;
73
+ line-height: 1.1;
74
+ margin-bottom: 8px;
75
+ display: block;
76
+ font-weight: 200;
77
+ }
78
+ .story-card a .story-text time {
79
+ font-family: "Knowledge", "Source Sans Pro", Arial, sans-serif;
80
+ margin-top: 8px;
81
+ display: block;
82
+ font-size: 12px;
83
+ font-weight: 400;
84
+ text-decoration: none !important;
85
+ }
86
+ .story-card a .thumbnail {
87
+ width: 84px;
88
+ height: 84px;
89
+ flex: 0 0 84px;
90
+ border-radius: 8px;
91
+ overflow: hidden;
92
+ border: 1px solid #ddd;
93
+ }
94
+ .story-card a .thumbnail img {
95
+ -o-object-fit: cover;
96
+ object-fit: cover;
97
+ width: 100%;
98
+ height: 100%;
99
+ }</style>
@@ -0,0 +1,70 @@
1
+ import advancedFormat from 'dayjs/plugin/advancedFormat.js';
2
+ import dayjs from 'dayjs';
3
+ import localizedFormat from 'dayjs/plugin/localizedFormat.js';
4
+ import relativeTime from 'dayjs/plugin/relativeTime.js';
5
+ import timezone from 'dayjs/plugin/timezone.js';
6
+ import updateLocale from 'dayjs/plugin/updateLocale.js';
7
+ import utc from 'dayjs/plugin/utc.js';
8
+
9
+ dayjs.extend(relativeTime);
10
+ dayjs.extend(localizedFormat);
11
+ dayjs.extend(advancedFormat);
12
+ dayjs.extend(utc);
13
+ dayjs.extend(timezone);
14
+ dayjs.extend(updateLocale);
15
+
16
+ dayjs.updateLocale('en', {
17
+ relativeTime: {
18
+ future: 'in %s',
19
+ past: '%s ago',
20
+ s: 'a few seconds',
21
+ m: 'a min',
22
+ mm: '%d min',
23
+ h: 'an hour',
24
+ hh: '%d hours',
25
+ d: 'a day',
26
+ dd: '%d days',
27
+ M: 'a month',
28
+ MM: '%d months',
29
+ y: 'a year',
30
+ yy: '%d years',
31
+ },
32
+ });
33
+
34
+ const getTimeZone = (local) => {
35
+ if (local) {
36
+ return dayjs.tz.guess();
37
+ }
38
+
39
+ return 'UTC';
40
+ };
41
+
42
+ const diff = (dateFrom, dateTo, measurement = 'day') => {
43
+ return dayjs(dateFrom).diff(dayjs(dateTo), measurement, true);
44
+ };
45
+
46
+ const olderThanHour = (dateFrom, dateTo, hours = 1) => {
47
+ return diff(dateFrom, dateTo, 'hour') < -hours;
48
+ };
49
+
50
+ const isSameDay = (dateFrom, dateTo) => {
51
+ const first = new Date(dateFrom);
52
+ const second = new Date(dateTo);
53
+ return (
54
+ first.getFullYear() === second.getFullYear() &&
55
+ first.getMonth() === second.getMonth() &&
56
+ first.getDate() === second.getDate()
57
+ );
58
+ };
59
+
60
+ export const getTime = (datetime) => {
61
+ const publishTime = dayjs(datetime, { utc: true });
62
+ const showRelativeTime = !olderThanHour(publishTime, Date.now());
63
+ const showTime = isSameDay(publishTime, Date.now());
64
+ const timezone = getTimeZone(false);
65
+ if (showRelativeTime) {
66
+ return dayjs().to(publishTime);
67
+ }
68
+ if (showTime) return dayjs(datetime).tz(timezone).format('h:mm A z');
69
+ return publishTime.format('MMMM D, YYYY');
70
+ };