@gaulatti/giorgia 0.1.57

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 (194) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +45 -0
  3. package/dist/carousels.d.ts +1 -0
  4. package/dist/carousels.js +65 -0
  5. package/dist/components/live-program/LiveProgram.d.ts +9 -0
  6. package/dist/components/live-program/LiveProgram.js +751 -0
  7. package/dist/components/live-program/assets.d.ts +14 -0
  8. package/dist/components/live-program/assets.js +14 -0
  9. package/dist/components/live-program/components/Marquee.d.ts +16 -0
  10. package/dist/components/live-program/components/Marquee.js +88 -0
  11. package/dist/components/live-program/components/MarqueeCurtain.d.ts +5 -0
  12. package/dist/components/live-program/components/MarqueeCurtain.js +30 -0
  13. package/dist/components/live-program/components/WorldClocks.d.ts +19 -0
  14. package/dist/components/live-program/components/WorldClocks.js +101 -0
  15. package/dist/components/live-program/components/slides/ArticleSlide.d.ts +14 -0
  16. package/dist/components/live-program/components/slides/ArticleSlide.js +32 -0
  17. package/dist/components/live-program/components/slides/CallsignSlide.d.ts +6 -0
  18. package/dist/components/live-program/components/slides/CallsignSlide.js +49 -0
  19. package/dist/components/live-program/components/slides/LiveEventSlide.d.ts +9 -0
  20. package/dist/components/live-program/components/slides/LiveEventSlide.js +86 -0
  21. package/dist/components/live-program/components/slides/slideStyles.d.ts +1 -0
  22. package/dist/components/live-program/components/slides/slideStyles.js +64 -0
  23. package/dist/components/live-program/events.d.ts +34 -0
  24. package/dist/components/live-program/events.js +167 -0
  25. package/dist/components/live-program/hooks/useSSE.d.ts +11 -0
  26. package/dist/components/live-program/hooks/useSSE.js +107 -0
  27. package/dist/components/live-program/i18n.d.ts +4 -0
  28. package/dist/components/live-program/i18n.js +305 -0
  29. package/dist/components/live-program/segments/ArticlesSegment.d.ts +6 -0
  30. package/dist/components/live-program/segments/ArticlesSegment.js +160 -0
  31. package/dist/components/live-program/segments/EarthquakeSegment.d.ts +16 -0
  32. package/dist/components/live-program/segments/EarthquakeSegment.js +130 -0
  33. package/dist/components/live-program/segments/LiveEventSegment.d.ts +4 -0
  34. package/dist/components/live-program/segments/LiveEventSegment.js +27 -0
  35. package/dist/components/live-program/segments/MarketsSegment.d.ts +12 -0
  36. package/dist/components/live-program/segments/MarketsSegment.js +76 -0
  37. package/dist/components/live-program/segments/WeatherSegment.d.ts +15 -0
  38. package/dist/components/live-program/segments/WeatherSegment.js +119 -0
  39. package/dist/components/live-program/segments/fetchLiveEvents.d.ts +20 -0
  40. package/dist/components/live-program/segments/fetchLiveEvents.js +76 -0
  41. package/dist/components/live-program/segments/index.d.ts +8 -0
  42. package/dist/components/live-program/segments/index.js +8 -0
  43. package/dist/components/live-program/segments/types.d.ts +23 -0
  44. package/dist/components/live-program/segments/types.js +1 -0
  45. package/dist/components/live-program/segments/usePlaylistEngine.d.ts +9 -0
  46. package/dist/components/live-program/segments/usePlaylistEngine.js +108 -0
  47. package/dist/components/live-program/utils/broadcastTime.d.ts +12 -0
  48. package/dist/components/live-program/utils/broadcastTime.js +33 -0
  49. package/dist/fonts/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGD_jZtU.ttf +0 -0
  50. package/dist/fonts/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGFPjZtU.ttf +0 -0
  51. package/dist/fonts/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGGHiZtU.ttf +0 -0
  52. package/dist/fonts/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGGHjZtU.ttf +0 -0
  53. package/dist/fonts/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGIbkZtU.ttf +0 -0
  54. package/dist/fonts/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGL_kZtU.ttf +0 -0
  55. package/dist/fonts/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGMjkZtU.ttf +0 -0
  56. package/dist/fonts/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGOHjZtU.ttf +0 -0
  57. package/dist/fonts/LDIcapOFNxEwR-Bd1O9uYNmnUQomAgE25imKSbHhROjLsZBWTSrQGOHkZtU.ttf +0 -0
  58. package/dist/fonts/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-2fRUAw.ttf +0 -0
  59. package/dist/fonts/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-6_RUAw.ttf +0 -0
  60. package/dist/fonts/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-DPNUAw.ttf +0 -0
  61. package/dist/fonts/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-NfNUAw.ttf +0 -0
  62. package/dist/fonts/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-a_NUAw.ttf +0 -0
  63. package/dist/fonts/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7c8R496.ttf +0 -0
  64. package/dist/fonts/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7dbR496.ttf +0 -0
  65. package/dist/fonts/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7diR496.ttf +0 -0
  66. package/dist/fonts/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7e8QI96.ttf +0 -0
  67. package/dist/fonts/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7eOQI96.ttf +0 -0
  68. package/dist/fonts/TK3_WkUHHAIjg75cFRf3bXL8LICs13FvgUE.ttf +0 -0
  69. package/dist/fonts/TK3_WkUHHAIjg75cFRf3bXL8LICs169vgUE.ttf +0 -0
  70. package/dist/fonts/TK3_WkUHHAIjg75cFRf3bXL8LICs18NvgUE.ttf +0 -0
  71. package/dist/fonts/TK3_WkUHHAIjg75cFRf3bXL8LICs1_FvgUE.ttf +0 -0
  72. package/dist/fonts/TK3_WkUHHAIjg75cFRf3bXL8LICs1xZogUE.ttf +0 -0
  73. package/dist/fonts/TK3_WkUHHAIjg75cFRf3bXL8LICs1y9ogUE.ttf +0 -0
  74. package/dist/fonts/fonts.css +378 -0
  75. package/dist/fonts/j8_16_LD37rqfuwxyIuaZhE6cRXOLtm2gfTGgQ.ttf +0 -0
  76. package/dist/fonts/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-BYipBw.ttf +0 -0
  77. package/dist/fonts/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-IYmpBw.ttf +0 -0
  78. package/dist/fonts/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-PYqpBw.ttf +0 -0
  79. package/dist/fonts/j8_46_LD37rqfuwxyIuaZhE6cRXOLtm2gfT-WYupBw.ttf +0 -0
  80. package/dist/fonts/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oYiRNDM.ttf +0 -0
  81. package/dist/fonts/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oZ8RNDM.ttf +0 -0
  82. package/dist/fonts/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oZ8RdDM.ttf +0 -0
  83. package/dist/fonts/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oZORNDM.ttf +0 -0
  84. package/dist/fonts/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oabQ9DM.ttf +0 -0
  85. package/dist/fonts/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05oaiQ9DM.ttf +0 -0
  86. package/dist/fonts/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05ob8Q9DM.ttf +0 -0
  87. package/dist/fonts/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05ob8RNDM.ttf +0 -0
  88. package/dist/fonts/jizMREVItHgc8qDIbSTKq4XkRiUawTk7f45UM9y05obVQ9DM.ttf +0 -0
  89. package/dist/fonts/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduh8MKUBw.ttf +0 -0
  90. package/dist/fonts/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhHMWUBw.ttf +0 -0
  91. package/dist/fonts/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhLsSUBw.ttf +0 -0
  92. package/dist/fonts/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhLsWUBw.ttf +0 -0
  93. package/dist/fonts/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhcMWUBw.ttf +0 -0
  94. package/dist/fonts/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhh8KUBw.ttf +0 -0
  95. package/dist/fonts/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhrsKUBw.ttf +0 -0
  96. package/dist/fonts/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhrsWUBw.ttf +0 -0
  97. package/dist/fonts/jizOREVItHgc8qDIbSTKq4XkRg8T88bjFuXOnduhycKUBw.ttf +0 -0
  98. package/dist/homepage-distributor.d.ts +55 -0
  99. package/dist/homepage-distributor.js +68 -0
  100. package/dist/instagram-image-template.d.ts +9 -0
  101. package/dist/instagram-image-template.js +51 -0
  102. package/dist/live-program/main.d.ts +1 -0
  103. package/dist/live-program/main.js +10 -0
  104. package/dist/live-program-page/fifthbell/audio/pipes.ogg +0 -0
  105. package/dist/live-program-page/fifthbell/images/berlin.jpg +0 -0
  106. package/dist/live-program-page/fifthbell/images/fifthbell.png +0 -0
  107. package/dist/live-program-page/fifthbell/images/nyc.jpg +0 -0
  108. package/dist/live-program-page/fifthbell/images/nyse.jpg +0 -0
  109. package/dist/live-program-page/fifthbell/images/santiago.jpg +0 -0
  110. package/dist/live-program-page/fifthbell/images/seismograph.jpg +0 -0
  111. package/dist/live-program-page/fifthbell/images/tokyo.jpg +0 -0
  112. package/dist/live-program-page/index.html +16 -0
  113. package/dist/live-program-page/live-program.css +3 -0
  114. package/dist/live-program-page/live-program.js +76 -0
  115. package/dist/outlet-config.d.ts +29 -0
  116. package/dist/outlet-config.js +29 -0
  117. package/dist/renderer.browser.d.ts +2 -0
  118. package/dist/renderer.browser.js +132 -0
  119. package/dist/renderer.core.d.ts +9 -0
  120. package/dist/renderer.core.js +354 -0
  121. package/dist/renderer.d.ts +6 -0
  122. package/dist/renderer.js +4 -0
  123. package/dist/renderer.node.d.ts +16 -0
  124. package/dist/renderer.node.js +166 -0
  125. package/dist/types/canonical-article.d.ts +249 -0
  126. package/dist/types/canonical-article.js +236 -0
  127. package/dist/utils/sofascore.d.ts +3 -0
  128. package/dist/utils/sofascore.js +31 -0
  129. package/dist/version.d.ts +1 -0
  130. package/dist/version.js +4 -0
  131. package/package.json +89 -0
  132. package/src/partial-deps.json +53 -0
  133. package/src/styles/compiled.css +2 -0
  134. package/src/templates/layouts/404.hbs +5 -0
  135. package/src/templates/layouts/article-page.hbs +5 -0
  136. package/src/templates/layouts/category-page.hbs +5 -0
  137. package/src/templates/layouts/homepage.hbs +5 -0
  138. package/src/templates/layouts/link-in-bio.hbs +226 -0
  139. package/src/templates/layouts/live-story.hbs +5 -0
  140. package/src/templates/layouts/media-page.hbs +5 -0
  141. package/src/templates/layouts/search-page.hbs +5 -0
  142. package/src/templates/partials/blocks/audio.hbs +12 -0
  143. package/src/templates/partials/blocks/data-table.hbs +23 -0
  144. package/src/templates/partials/blocks/divider.hbs +1 -0
  145. package/src/templates/partials/blocks/heading.hbs +9 -0
  146. package/src/templates/partials/blocks/image.hbs +6 -0
  147. package/src/templates/partials/blocks/info-box.hbs +8 -0
  148. package/src/templates/partials/blocks/instagram.hbs +28 -0
  149. package/src/templates/partials/blocks/key-points.hbs +8 -0
  150. package/src/templates/partials/blocks/list.hbs +13 -0
  151. package/src/templates/partials/blocks/live-update.hbs +24 -0
  152. package/src/templates/partials/blocks/pull-quote.hbs +6 -0
  153. package/src/templates/partials/blocks/rich-text.hbs +1 -0
  154. package/src/templates/partials/blocks/tiktok.hbs +15 -0
  155. package/src/templates/partials/blocks/x.hbs +74 -0
  156. package/src/templates/partials/blocks/youtube.hbs +12 -0
  157. package/src/templates/partials/components/article-main.hbs +159 -0
  158. package/src/templates/partials/components/breaking-news/live-updates-column.hbs +29 -0
  159. package/src/templates/partials/components/breaking-news.hbs +56 -0
  160. package/src/templates/partials/components/category/header.hbs +5 -0
  161. package/src/templates/partials/components/category/main-grid.hbs +55 -0
  162. package/src/templates/partials/components/category/main.hbs +7 -0
  163. package/src/templates/partials/components/category/more-grid.hbs +26 -0
  164. package/src/templates/partials/components/editorial-hero.hbs +73 -0
  165. package/src/templates/partials/components/headline.hbs +15 -0
  166. package/src/templates/partials/components/hero-editorial.hbs +1 -0
  167. package/src/templates/partials/components/hero.hbs +1 -0
  168. package/src/templates/partials/components/home/landing.hbs +111 -0
  169. package/src/templates/partials/components/home/main.hbs +63 -0
  170. package/src/templates/partials/components/home/more-stories.hbs +23 -0
  171. package/src/templates/partials/components/home/must-read.hbs +77 -0
  172. package/src/templates/partials/components/live-story/main.hbs +229 -0
  173. package/src/templates/partials/components/media/main.hbs +220 -0
  174. package/src/templates/partials/components/not-found/main.hbs +28 -0
  175. package/src/templates/partials/components/search/main.hbs +420 -0
  176. package/src/templates/partials/components/snack.hbs +92 -0
  177. package/src/templates/partials/components/spotlight-hero.hbs +59 -0
  178. package/src/templates/partials/components/trending.hbs +14 -0
  179. package/src/templates/partials/components/ui/accordion.hbs +30 -0
  180. package/src/templates/partials/components/ui/breadcrumb.hbs +16 -0
  181. package/src/templates/partials/components/ui/icon-button.hbs +19 -0
  182. package/src/templates/partials/components/ui/loading-spinner.hbs +27 -0
  183. package/src/templates/partials/components/ui/pagination.hbs +56 -0
  184. package/src/templates/partials/components/ui/scroll-area.hbs +12 -0
  185. package/src/templates/partials/components/ui/status-badge.hbs +21 -0
  186. package/src/templates/partials/footers/footer-full.hbs +79 -0
  187. package/src/templates/partials/footers/footer-minimal.hbs +5 -0
  188. package/src/templates/partials/headers/header-main.hbs +400 -0
  189. package/src/templates/partials/headers/header-minimal.hbs +16 -0
  190. package/src/templates/partials/nav/nav-categories.hbs +5 -0
  191. package/src/templates/partials/shell/doc-end.hbs +282 -0
  192. package/src/templates/partials/shell/doc-start-404.hbs +41 -0
  193. package/src/templates/partials/shell/doc-start-standard.hbs +86 -0
  194. package/src/templates/templates/instagram-image.hbs +175 -0
@@ -0,0 +1,282 @@
1
+ </div>
2
+ <script>
3
+ (function () {
4
+ function getLocale() {
5
+ var lang = document.documentElement.getAttribute('lang') || 'en';
6
+ if (lang === 'es') return 'es';
7
+ if (lang === 'it') return 'it';
8
+ return 'en';
9
+ }
10
+
11
+ function formatRelativeTimestamp(isoString) {
12
+ if (!isoString) return '';
13
+
14
+ var date = new Date(isoString);
15
+ if (Number.isNaN(date.getTime())) return '';
16
+
17
+ var locale = getLocale();
18
+ var rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });
19
+ var diffMs = Date.now() - date.getTime();
20
+ var diffMinutes = Math.max(1, Math.floor(diffMs / 60000));
21
+
22
+ if (diffMinutes < 60) {
23
+ return rtf.format(-diffMinutes, 'minute');
24
+ }
25
+
26
+ var diffHours = Math.max(1, Math.floor(diffMinutes / 60));
27
+ if (diffHours < 24) {
28
+ return rtf.format(-diffHours, 'hour');
29
+ }
30
+
31
+ var diffDays = Math.max(1, Math.floor(diffHours / 24));
32
+ return rtf.format(-diffDays, 'day');
33
+ }
34
+
35
+ function hydrateRelativeTimes(root) {
36
+ var scope = root || document;
37
+ var timestamps = scope.querySelectorAll('.article-time[data-timestamp]');
38
+
39
+ timestamps.forEach(function (node) {
40
+ var isoString = node.getAttribute('data-timestamp');
41
+ var formatted = formatRelativeTimestamp(isoString);
42
+ if (formatted) {
43
+ node.textContent = formatted;
44
+ }
45
+ });
46
+ }
47
+
48
+ window.__brokawHydrateRelativeTimes = hydrateRelativeTimes;
49
+
50
+ function initRelativeTimes() {
51
+ hydrateRelativeTimes(document);
52
+ window.setInterval(function () {
53
+ hydrateRelativeTimes(document);
54
+ }, 60000);
55
+ }
56
+
57
+ if (document.readyState === 'loading') {
58
+ document.addEventListener('DOMContentLoaded', initRelativeTimes);
59
+ } else {
60
+ initRelativeTimes();
61
+ }
62
+ })();
63
+ </script>
64
+ <script>
65
+ (function () {
66
+ function setSlideState(slides, dots, index) {
67
+ slides.forEach(function (slide, slideIndex) {
68
+ var active = slideIndex === index;
69
+ var wasActive = slide.classList.contains('active');
70
+
71
+ if (active) {
72
+ slide.classList.remove('hidden');
73
+ slide.classList.add('active');
74
+ slide.classList.remove('pointer-events-none');
75
+
76
+ if (!wasActive) {
77
+ slide.classList.remove('opacity-100');
78
+ slide.classList.add('opacity-0');
79
+ window.requestAnimationFrame(function () {
80
+ slide.classList.remove('opacity-0');
81
+ slide.classList.add('opacity-100');
82
+ });
83
+ } else {
84
+ slide.classList.remove('opacity-0');
85
+ slide.classList.add('opacity-100');
86
+ }
87
+ } else {
88
+ slide.classList.remove('active');
89
+ slide.classList.remove('opacity-100');
90
+ slide.classList.add('opacity-0');
91
+ slide.classList.add('hidden');
92
+ slide.classList.add('pointer-events-none');
93
+ }
94
+ });
95
+ dots.forEach(function (dot, dotIndex) {
96
+ dot.classList.toggle('active', dotIndex === index);
97
+ });
98
+ }
99
+
100
+ function initCarousels(root) {
101
+ var scopes = (root || document).querySelectorAll('[data-carousel]');
102
+ scopes.forEach(function (scope) {
103
+ if (scope.dataset.carouselBound === 'true') return;
104
+
105
+ var slides = Array.prototype.slice.call(scope.querySelectorAll('.carousel-slide'));
106
+ if (slides.length === 0) {
107
+ scope.dataset.carouselBound = 'true';
108
+ return;
109
+ }
110
+
111
+ var dots = Array.prototype.slice.call(scope.querySelectorAll('.carousel-dot'));
112
+ var nextButton = scope.querySelector('.carousel-next');
113
+ var activeIndex = slides.findIndex(function (slide) {
114
+ return slide.classList.contains('active');
115
+ });
116
+ var currentIndex = activeIndex >= 0 ? activeIndex : 0;
117
+ var timer = null;
118
+
119
+ function clearTimer() {
120
+ if (timer === null) return;
121
+ window.clearInterval(timer);
122
+ timer = null;
123
+ }
124
+
125
+ function startTimer() {
126
+ clearTimer();
127
+ if (slides.length < 2) return;
128
+
129
+ timer = window.setInterval(function () {
130
+ if (!document.contains(scope)) {
131
+ clearTimer();
132
+ return;
133
+ }
134
+ currentIndex = (currentIndex + 1) % slides.length;
135
+ setSlideState(slides, dots, currentIndex);
136
+ }, 6000);
137
+ }
138
+
139
+ function goToSlide(nextIndex) {
140
+ currentIndex = nextIndex;
141
+ setSlideState(slides, dots, currentIndex);
142
+ startTimer();
143
+ }
144
+
145
+ dots.forEach(function (dot, dotIndex) {
146
+ dot.addEventListener('click', function () {
147
+ goToSlide(dotIndex);
148
+ });
149
+ });
150
+
151
+ if (nextButton) {
152
+ nextButton.addEventListener('click', function () {
153
+ goToSlide((currentIndex + 1) % slides.length);
154
+ });
155
+ }
156
+
157
+ scope.addEventListener('mouseenter', clearTimer);
158
+ scope.addEventListener('mouseleave', startTimer);
159
+
160
+ setSlideState(slides, dots, currentIndex);
161
+ startTimer();
162
+ scope.dataset.carouselBound = 'true';
163
+ });
164
+ }
165
+
166
+ window.__brokawInitCarousels = initCarousels;
167
+ if (document.readyState === 'loading') {
168
+ document.addEventListener('DOMContentLoaded', function () {
169
+ initCarousels(document);
170
+ });
171
+ } else {
172
+ initCarousels(document);
173
+ }
174
+ })();
175
+ </script>
176
+ <script>
177
+ (function () {
178
+ var WIDGET_HOST = 'widgets.sofascore.com';
179
+ var WIDGET_PATH = '/embed/attackMomentum';
180
+
181
+ function getWidgetTheme() {
182
+ return document.documentElement.classList.contains('dark') ? 'dark' : 'light';
183
+ }
184
+
185
+ function updateSofascoreIframe(iframe, theme) {
186
+ if (!(iframe instanceof HTMLIFrameElement)) return;
187
+ var src = iframe.getAttribute('src');
188
+ if (!src) return;
189
+
190
+ try {
191
+ var url = new URL(src, window.location.origin);
192
+ if (url.hostname !== WIDGET_HOST) return;
193
+ if (!url.pathname.includes(WIDGET_PATH)) return;
194
+
195
+ if (url.searchParams.get('widgetTheme') === theme) return;
196
+
197
+ url.searchParams.set('widgetTheme', theme);
198
+ iframe.setAttribute('src', url.toString());
199
+ } catch (_error) {
200
+ // Ignore malformed iframe src values.
201
+ }
202
+ }
203
+
204
+ function syncSofascoreTheme() {
205
+ var theme = getWidgetTheme();
206
+ var iframes = document.querySelectorAll('iframe[src*="widgets.sofascore.com/embed/attackMomentum"]');
207
+ iframes.forEach(function (iframe) {
208
+ updateSofascoreIframe(iframe, theme);
209
+ });
210
+ }
211
+
212
+ if (document.readyState === 'loading') {
213
+ document.addEventListener('DOMContentLoaded', syncSofascoreTheme);
214
+ } else {
215
+ syncSofascoreTheme();
216
+ }
217
+
218
+ var observer = new MutationObserver(function () {
219
+ syncSofascoreTheme();
220
+ });
221
+ observer.observe(document.documentElement, {
222
+ attributes: true,
223
+ attributeFilter: ['class'],
224
+ });
225
+ })();
226
+ </script>
227
+ <script>
228
+ (function () {
229
+ if (typeof gtag !== 'function') return;
230
+
231
+ /**
232
+ * Scroll depth tracking
233
+ * Tracks when users scroll to certain percentages of the page.
234
+ */
235
+ var scrollMilestones = [25, 50, 75, 100];
236
+ var scrollReached = {};
237
+
238
+ function checkScrollDepth() {
239
+ var scrolled = window.scrollY || document.documentElement.scrollTop;
240
+ var docHeight = document.documentElement.scrollHeight - window.innerHeight;
241
+ if (docHeight <= 0) return;
242
+ var pct = Math.min(100, Math.round((scrolled / docHeight) * 100));
243
+ for (var i = 0; i < scrollMilestones.length; i++) {
244
+ var milestone = scrollMilestones[i];
245
+ if (!scrollReached[milestone] && pct >= milestone) {
246
+ scrollReached[milestone] = true;
247
+ gtag('event', 'scroll_depth', { percent_scrolled: milestone });
248
+ }
249
+ }
250
+ }
251
+
252
+ window.addEventListener('scroll', checkScrollDepth, { passive: true });
253
+ checkScrollDepth();
254
+
255
+ /**
256
+ * Outbound link click tracking
257
+ * Tracks clicks on links that navigate away from the current site.
258
+ */
259
+ document.addEventListener('click', function (e) {
260
+ var target = e.target;
261
+ while (target && target.tagName !== 'A') {
262
+ target = target.parentElement;
263
+ }
264
+ if (!target) return;
265
+ var href = target.getAttribute('href');
266
+ if (!href || href.charAt(0) === '#' || href.indexOf('mailto:') === 0 || href.indexOf('tel:') === 0) return;
267
+ try {
268
+ var url = new URL(href, window.location.href);
269
+ if (url.hostname && url.hostname !== window.location.hostname) {
270
+ gtag('event', 'outbound_click', {
271
+ link_url: url.href,
272
+ link_domain: url.hostname,
273
+ link_text: (target.textContent || '').trim().slice(0, 100),
274
+ transport_type: 'beacon'
275
+ });
276
+ }
277
+ } catch (_) {}
278
+ });
279
+ })();
280
+ </script>
281
+ </body>
282
+ </html>
@@ -0,0 +1,41 @@
1
+ <!doctype html>
2
+ <html lang='{{language}}'>
3
+ <head>
4
+ <meta charset='UTF-8' />
5
+ <meta name='viewport' content='width=device-width, initial-scale=1' />
6
+ <link rel='preload' as='style' href='https://cdn.fifthbell.com/content/fonts/fonts.css' onload="this.rel='stylesheet';this.media='all'" />
7
+ <noscript><link href='https://cdn.fifthbell.com/content/fonts/fonts.css' rel='stylesheet' /></noscript>
8
+ <meta name='description' content='{{#if seo.metaDescription}}{{seo.metaDescription}}{{else}}Page not found{{/if}}' />
9
+ <link rel='canonical' href='{{canonicalUrl}}' />
10
+ <title>{{#if seo.metaTitle}}{{seo.metaTitle}}{{else}}404 - Page Not Found | fifthbell{{/if}}</title>
11
+ <style>{{{styles}}}</style>
12
+ {{#if rumConfig}}
13
+ <script>
14
+ (function(n,i,v,r,s,c,u,x,z){
15
+ x=window;z=x[s]=x[s]||function(){z.q.push(arguments)};z.q=[];u=i.createElement(v);
16
+ u.async=1;u.src=r;u.setAttribute('crossorigin','');i.head.appendChild(u);
17
+ })(window,document,'script','https://rum.aws.amazon.com/loader.js','RUM');
18
+ RUM('create', {{{jsonString rumConfig.appMonitorName}}}, {
19
+ identityPoolId: {{{jsonString rumConfig.identityPoolId}}},
20
+ guestRoleArn: {{{jsonString rumConfig.guestRoleArn}}},
21
+ sessionSampleRate: 1,
22
+ endpoint: {{{jsonString 'https://dataplane.rum.us-east-1.amazonaws.com'}}},
23
+ telemetries: ['performance', 'errors', 'http'],
24
+ allowCookies: true
25
+ });
26
+ </script>
27
+ {{/if}}
28
+ {{#if gaConfig}}
29
+ <script async src='https://www.googletagmanager.com/gtag/js?id={{{gaConfig.measurementId}}}'></script>
30
+ <script>
31
+ window.dataLayer = window.dataLayer || [];
32
+ function gtag(){dataLayer.push(arguments);}
33
+ gtag('js', new Date());
34
+ gtag('config', {{{jsonString gaConfig.measurementId}}}, {
35
+ content_group: '404'
36
+ });
37
+ </script>
38
+ {{/if}}
39
+ </head>
40
+ <body class='bg-white dark:bg-slate-950 text-slate-900 dark:text-slate-100 transition-colors'>
41
+ <div class='min-h-screen flex flex-col'>
@@ -0,0 +1,86 @@
1
+ <!doctype html>
2
+ <html lang='{{language}}'{{#if mourningMode}} class='dark'{{/if}}>
3
+ <head>
4
+ <meta charset='UTF-8' />
5
+ <meta name='viewport' content='width=device-width, initial-scale=1' />
6
+ <link href='https://cdn.fifthbell.com/content/fonts/fonts.css' rel='stylesheet' />
7
+ {{#if (eq layout 'homepage')}}
8
+ {{#if hero.url}}
9
+ <link rel='preload' as='image' href='{{hero.url}}' fetchpriority='high' />
10
+ {{/if}}
11
+ {{else}}
12
+ {{#if featuredImage.url}}
13
+ <link rel='preload' as='image' href='{{featuredImage.url}}' fetchpriority='high' />
14
+ {{/if}}
15
+ {{/if}}
16
+ <meta name='description' content='{{#if seo.metaDescription}}{{seo.metaDescription}}{{else if excerpt}}{{excerpt}}{{else}}{{resolveHeadTitle this}}{{/if}}' />
17
+ <link rel='canonical' href='{{canonicalUrl}}' />
18
+ <meta property='og:title' content='{{resolveHeadTitle this}}' />
19
+ <meta property='og:description' content='{{#if seo.metaDescription}}{{seo.metaDescription}}{{else}}{{excerpt}}{{/if}}' />
20
+ <meta property='og:url' content='{{canonicalUrl}}' />
21
+ <meta property='og:site_name' content='fifthbell' />
22
+ {{#if (eq layout 'article-page')}}
23
+ <meta property='og:type' content='article' />
24
+ {{else}}
25
+ <meta property='og:type' content='website' />
26
+ {{/if}}
27
+ {{#with (socialImageUrl (coalesce seo.ogImage featuredImage.url)) as |socialImage|}}
28
+ {{#if socialImage}}
29
+ <meta property='og:image' content='{{socialImage}}' />
30
+ <meta property='og:image:type' content='image/jpeg' />
31
+ <meta property='og:image:width' content='1200' />
32
+ <meta property='og:image:height' content='630' />
33
+ <meta property='og:image:alt' content='{{#if featuredImage.alt}}{{featuredImage.alt}}{{else}}{{resolveHeadTitle this}}{{/if}}' />
34
+ {{/if}}
35
+ <meta name='twitter:card' content='{{#if socialImage}}summary_large_image{{else}}summary{{/if}}' />
36
+ {{#if socialImage}}
37
+ <meta name='twitter:image' content='{{socialImage}}' />
38
+ <meta name='twitter:image:src' content='{{socialImage}}' />
39
+ <meta name='twitter:image:alt' content='{{#if featuredImage.alt}}{{featuredImage.alt}}{{else}}{{resolveHeadTitle this}}{{/if}}' />
40
+ {{/if}}
41
+ {{/with}}
42
+ <meta name='twitter:site' content='@thisisfifthbell' />
43
+ <meta name='twitter:title' content='{{resolveHeadTitle this}}' />
44
+ <meta name='twitter:description' content='{{#if seo.metaDescription}}{{seo.metaDescription}}{{else}}{{excerpt}}{{/if}}' />
45
+ <title>{{resolveHeadTitle this}}</title>
46
+ <style>{{{styles}}}</style>
47
+ {{#if rumConfig}}
48
+ <script>
49
+ (function(n,i,v,r,s,c,u,x,z){
50
+ x=window;z=x[s]=x[s]||function(){z.q.push(arguments)};z.q=[];u=i.createElement(v);
51
+ u.async=1;u.src=r;u.setAttribute('crossorigin','');i.head.appendChild(u);
52
+ })(window,document,'script','https://rum.aws.amazon.com/loader.js','RUM');
53
+ RUM('create', {{{jsonString rumConfig.appMonitorName}}}, {
54
+ identityPoolId: {{{jsonString rumConfig.identityPoolId}}},
55
+ guestRoleArn: {{{jsonString rumConfig.guestRoleArn}}},
56
+ sessionSampleRate: 1,
57
+ endpoint: {{{jsonString 'https://dataplane.rum.us-east-1.amazonaws.com'}}},
58
+ telemetries: ['performance', 'errors', 'http'],
59
+ allowCookies: true
60
+ });
61
+ </script>
62
+ {{/if}}
63
+ {{#if gaConfig}}
64
+ <script async src='https://www.googletagmanager.com/gtag/js?id={{{gaConfig.measurementId}}}'></script>
65
+ <script>
66
+ window.dataLayer = window.dataLayer || [];
67
+ function gtag(){dataLayer.push(arguments);}
68
+ gtag('js', new Date());
69
+ gtag('config', {{{jsonString gaConfig.measurementId}}}, {
70
+ content_group: {{{jsonString layout}}}
71
+ });
72
+ gtag('event', 'page_metadata', {
73
+ content_type: {{{jsonString layout}}},
74
+ content_id: {{{jsonString id}}},
75
+ content_language: {{{jsonString language}}},
76
+ author_name: {{{jsonString authors.[0].name}}},
77
+ author_slug: {{{jsonString authors.[0].slug}}},
78
+ category_name: {{{jsonString categories.[0].name}}},
79
+ category_slug: {{{jsonString categories.[0].slug}}},
80
+ published_at: {{{jsonString publishedAt}}}
81
+ });
82
+ </script>
83
+ {{/if}}
84
+ </head>
85
+ <body class='bg-white dark:bg-slate-950 text-slate-900 dark:text-slate-100 transition-colors'>
86
+ <div class='min-h-screen flex flex-col'>
@@ -0,0 +1,175 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=1080, initial-scale=1.0" />
6
+ <link href="https://cdn.fifthbell.com/content/fonts/fonts.css" rel="stylesheet">
7
+ <style>
8
+ * { margin: 0; padding: 0; box-sizing: border-box; }
9
+ body {
10
+ width: 1080px;
11
+ height: 1350px;
12
+ overflow: hidden;
13
+ background-color: #000;
14
+ position: relative;
15
+ }
16
+
17
+ .hero-image {
18
+ position: absolute;
19
+ inset: 0;
20
+ height: 100%;
21
+ background-color: #000;
22
+ }
23
+
24
+ .hero-image img {
25
+ width: 100%;
26
+ height: 100%;
27
+ object-fit: cover;
28
+ opacity: 0.9;
29
+ }
30
+
31
+ .card-container {
32
+ position: absolute;
33
+ left: 0;
34
+ right: 0;
35
+ bottom: 0;
36
+ display: flex;
37
+ flex-direction: column;
38
+ z-index: 10;
39
+ }
40
+
41
+ .card-container header {
42
+ display: flex;
43
+ align-items: center;
44
+ background-color: rgba(0, 0, 0, 0.70);
45
+ backdrop-filter: blur(8px);
46
+ -webkit-backdrop-filter: blur(8px);
47
+ position: relative;
48
+ z-index: 1;
49
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.6);
50
+ }
51
+
52
+ .card-container header .category-label {
53
+ margin-left: 32px;
54
+ }
55
+
56
+ .logo-container {
57
+ display: flex;
58
+ align-items: center;
59
+ justify-content: flex-start;
60
+ padding: 0 32px;
61
+ background-color: #b21100;
62
+ }
63
+
64
+ .brand-logo {
65
+ display: flex;
66
+ align-items: center;
67
+ }
68
+
69
+ .qr-container {
70
+ display: flex;
71
+ align-items: center;
72
+ justify-content: center;
73
+ padding: 0 16px;
74
+ background-color: #ffffff;
75
+ }
76
+
77
+ .qr-code {
78
+ width: 119px;
79
+ height: 119px;
80
+ padding: 10px;
81
+ display: flex;
82
+ justify-content: center;
83
+ align-items: center;
84
+ }
85
+
86
+ .qr-code svg {
87
+ width: 100%;
88
+ height: 100%;
89
+ display: block;
90
+ }
91
+
92
+ .card-container main {
93
+ display: flex;
94
+ flex-direction: column;
95
+ background-color: rgba(0, 0, 0, 0.35);
96
+ backdrop-filter: blur(16px);
97
+ -webkit-backdrop-filter: blur(16px);
98
+ padding: 110px;
99
+ padding-top: 36px;
100
+ }
101
+
102
+ .accent-bar {
103
+ width: 64px;
104
+ height: 6px;
105
+ background-color: #b21100;
106
+ margin-bottom: 24px;
107
+ }
108
+
109
+ .category-label {
110
+ font-family: 'Encode Sans Condensed', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
111
+ font-size: 80px;
112
+ line-height: 119px;
113
+ font-weight: 600;
114
+ color: #ffffff;
115
+ text-transform: uppercase;
116
+ letter-spacing: 0.02em;
117
+ }
118
+
119
+ .title-text {
120
+ font-family: 'Encode Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
121
+ font-size: 68px;
122
+ line-height: 1.1;
123
+ font-weight: 700;
124
+ color: #ffffff;
125
+ text-wrap: balance;
126
+ display: -webkit-box;
127
+ -webkit-line-clamp: 5;
128
+ -webkit-box-orient: vertical;
129
+ overflow: hidden;
130
+ }
131
+ </style>
132
+ </head>
133
+ <body>
134
+ <div class="hero-image">
135
+ <img src="{{imageUrl}}" alt="Featured Image" />
136
+ </div>
137
+
138
+ <div class="card-container">
139
+ <header>
140
+ <div class="logo-container">
141
+ <div class="brand-logo" style="color: white; width: 140px; height: 119px; display: flex; align-items: center; justify-content: end;">
142
+ <svg width="61" height="61" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
143
+ <path d="M10.268 21a2 2 0 0 0 3.464 0"></path>
144
+ <path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326"></path>
145
+ <path d="M4 2C2.8 3.7 2 5.7 2 8"></path>
146
+ <path d="M22 8a10 10 0 0 0-2-6"></path>
147
+ </svg>
148
+ </div>
149
+ </div>
150
+ {{#if qrCodeHtml}}
151
+ {{{qrCodeHtml}}}
152
+ {{else if url}}
153
+ {{{instagramQrCode url}}}
154
+ {{/if}}
155
+ <div class="category-label">{{categoryName}}</div>
156
+ </header>
157
+ <main>
158
+ <div class="accent-bar"></div>
159
+ <h1 class="title-text">{{title}}</h1>
160
+ </main>
161
+ </div>
162
+
163
+ <script>
164
+ window.onload = () => {
165
+ if (document.fonts) {
166
+ document.fonts.ready.then(() => {
167
+ setTimeout(() => { document.body.setAttribute('data-ready', '1'); }, 300);
168
+ });
169
+ } else {
170
+ setTimeout(() => { document.body.setAttribute('data-ready', '1'); }, 1000);
171
+ }
172
+ };
173
+ </script>
174
+ </body>
175
+ </html>