@fifthbell/brokaw 0.1.39
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.
- package/LICENSE +21 -0
- package/README.md +45 -0
- package/dist/carousels.d.ts +1 -0
- package/dist/carousels.js +65 -0
- package/dist/components/live-program/LiveProgram.d.ts +8 -0
- package/dist/components/live-program/LiveProgram.js +526 -0
- package/dist/components/live-program/assets.d.ts +14 -0
- package/dist/components/live-program/assets.js +14 -0
- package/dist/components/live-program/components/Marquee.d.ts +16 -0
- package/dist/components/live-program/components/Marquee.js +88 -0
- package/dist/components/live-program/components/MarqueeCurtain.d.ts +5 -0
- package/dist/components/live-program/components/MarqueeCurtain.js +30 -0
- package/dist/components/live-program/components/WorldClocks.d.ts +19 -0
- package/dist/components/live-program/components/WorldClocks.js +101 -0
- package/dist/components/live-program/components/slides/ArticleSlide.d.ts +14 -0
- package/dist/components/live-program/components/slides/ArticleSlide.js +22 -0
- package/dist/components/live-program/components/slides/CallsignSlide.d.ts +6 -0
- package/dist/components/live-program/components/slides/CallsignSlide.js +49 -0
- package/dist/components/live-program/components/slides/slideStyles.d.ts +1 -0
- package/dist/components/live-program/components/slides/slideStyles.js +64 -0
- package/dist/components/live-program/events.d.ts +34 -0
- package/dist/components/live-program/events.js +167 -0
- package/dist/components/live-program/hooks/useSSE.d.ts +11 -0
- package/dist/components/live-program/hooks/useSSE.js +67 -0
- package/dist/components/live-program/i18n.d.ts +4 -0
- package/dist/components/live-program/i18n.js +290 -0
- package/dist/components/live-program/segments/ArticlesSegment.d.ts +6 -0
- package/dist/components/live-program/segments/ArticlesSegment.js +160 -0
- package/dist/components/live-program/segments/EarthquakeSegment.d.ts +16 -0
- package/dist/components/live-program/segments/EarthquakeSegment.js +130 -0
- package/dist/components/live-program/segments/MarketsSegment.d.ts +12 -0
- package/dist/components/live-program/segments/MarketsSegment.js +87 -0
- package/dist/components/live-program/segments/WeatherSegment.d.ts +15 -0
- package/dist/components/live-program/segments/WeatherSegment.js +184 -0
- package/dist/components/live-program/segments/index.d.ts +6 -0
- package/dist/components/live-program/segments/index.js +6 -0
- package/dist/components/live-program/segments/types.d.ts +23 -0
- package/dist/components/live-program/segments/types.js +1 -0
- package/dist/components/live-program/segments/usePlaylistEngine.d.ts +9 -0
- package/dist/components/live-program/segments/usePlaylistEngine.js +108 -0
- package/dist/components/live-program/utils/broadcastTime.d.ts +12 -0
- package/dist/components/live-program/utils/broadcastTime.js +33 -0
- package/dist/homepage-distributor.d.ts +55 -0
- package/dist/homepage-distributor.js +68 -0
- package/dist/instagram-image-template.d.ts +8 -0
- package/dist/instagram-image-template.js +200 -0
- package/dist/outlet-config.d.ts +23 -0
- package/dist/outlet-config.js +23 -0
- package/dist/renderer.browser.d.ts +2 -0
- package/dist/renderer.browser.js +128 -0
- package/dist/renderer.core.d.ts +9 -0
- package/dist/renderer.core.js +353 -0
- package/dist/renderer.d.ts +3 -0
- package/dist/renderer.js +3 -0
- package/dist/renderer.node.d.ts +2 -0
- package/dist/renderer.node.js +71 -0
- package/dist/types/canonical-article.d.ts +247 -0
- package/dist/types/canonical-article.js +235 -0
- package/dist/utils/sofascore.d.ts +3 -0
- package/dist/utils/sofascore.js +31 -0
- package/package.json +78 -0
- package/src/partial-deps.json +52 -0
- package/src/styles/compiled.css +2 -0
- package/src/templates/layouts/404.hbs +5 -0
- package/src/templates/layouts/article-page.hbs +5 -0
- package/src/templates/layouts/category-page.hbs +5 -0
- package/src/templates/layouts/homepage.hbs +5 -0
- package/src/templates/layouts/link-in-bio.hbs +228 -0
- package/src/templates/layouts/live-story.hbs +5 -0
- package/src/templates/layouts/search-page.hbs +5 -0
- package/src/templates/partials/blocks/audio.hbs +12 -0
- package/src/templates/partials/blocks/data-table.hbs +23 -0
- package/src/templates/partials/blocks/divider.hbs +1 -0
- package/src/templates/partials/blocks/heading.hbs +9 -0
- package/src/templates/partials/blocks/image.hbs +6 -0
- package/src/templates/partials/blocks/info-box.hbs +8 -0
- package/src/templates/partials/blocks/instagram.hbs +28 -0
- package/src/templates/partials/blocks/key-points.hbs +8 -0
- package/src/templates/partials/blocks/list.hbs +13 -0
- package/src/templates/partials/blocks/live-update.hbs +24 -0
- package/src/templates/partials/blocks/pull-quote.hbs +6 -0
- package/src/templates/partials/blocks/rich-text.hbs +1 -0
- package/src/templates/partials/blocks/tiktok.hbs +15 -0
- package/src/templates/partials/blocks/x.hbs +74 -0
- package/src/templates/partials/blocks/youtube.hbs +12 -0
- package/src/templates/partials/components/article-main.hbs +159 -0
- package/src/templates/partials/components/breaking-news/live-updates-column.hbs +29 -0
- package/src/templates/partials/components/breaking-news.hbs +56 -0
- package/src/templates/partials/components/category/header.hbs +5 -0
- package/src/templates/partials/components/category/main-grid.hbs +55 -0
- package/src/templates/partials/components/category/main.hbs +7 -0
- package/src/templates/partials/components/category/more-grid.hbs +26 -0
- package/src/templates/partials/components/editorial-hero.hbs +73 -0
- package/src/templates/partials/components/headline.hbs +15 -0
- package/src/templates/partials/components/hero-editorial.hbs +1 -0
- package/src/templates/partials/components/hero.hbs +1 -0
- package/src/templates/partials/components/home/landing.hbs +111 -0
- package/src/templates/partials/components/home/main.hbs +63 -0
- package/src/templates/partials/components/home/more-stories.hbs +23 -0
- package/src/templates/partials/components/home/must-read.hbs +77 -0
- package/src/templates/partials/components/live-story/main.hbs +229 -0
- package/src/templates/partials/components/not-found/main.hbs +28 -0
- package/src/templates/partials/components/search/main.hbs +420 -0
- package/src/templates/partials/components/snack.hbs +92 -0
- package/src/templates/partials/components/spotlight-hero.hbs +59 -0
- package/src/templates/partials/components/trending.hbs +14 -0
- package/src/templates/partials/components/ui/accordion.hbs +30 -0
- package/src/templates/partials/components/ui/breadcrumb.hbs +16 -0
- package/src/templates/partials/components/ui/icon-button.hbs +19 -0
- package/src/templates/partials/components/ui/loading-spinner.hbs +27 -0
- package/src/templates/partials/components/ui/pagination.hbs +56 -0
- package/src/templates/partials/components/ui/scroll-area.hbs +12 -0
- package/src/templates/partials/components/ui/status-badge.hbs +21 -0
- package/src/templates/partials/footers/footer-full.hbs +79 -0
- package/src/templates/partials/footers/footer-minimal.hbs +5 -0
- package/src/templates/partials/headers/header-main.hbs +397 -0
- package/src/templates/partials/headers/header-minimal.hbs +16 -0
- package/src/templates/partials/nav/nav-categories.hbs +5 -0
- package/src/templates/partials/shell/doc-end.hbs +282 -0
- package/src/templates/partials/shell/doc-start-404.hbs +28 -0
- package/src/templates/partials/shell/doc-start-standard.hbs +68 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<header class='border-b border-slate-200 dark:border-slate-700 relative z-[60] bg-white dark:bg-slate-900 transition-colors' style='view-transition-name: site-header;'>
|
|
2
|
+
<div class='container mx-auto px-4'>
|
|
3
|
+
<nav class='flex items-center justify-center h-16'>
|
|
4
|
+
<div class='bg-[#b21100] text-white p-3'>
|
|
5
|
+
<a href='{{logoLink}}' aria-label='fifthbell - Home'>
|
|
6
|
+
<svg class='w-7 h-7' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'>
|
|
7
|
+
<path d='M10.268 21a2 2 0 0 0 3.464 0'></path>
|
|
8
|
+
<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>
|
|
9
|
+
<path d='M4 2C2.8 3.7 2 5.7 2 8'></path>
|
|
10
|
+
<path d='M22 8a10 10 0 0 0-2-6'></path>
|
|
11
|
+
</svg>
|
|
12
|
+
</a>
|
|
13
|
+
</div>
|
|
14
|
+
</nav>
|
|
15
|
+
</div>
|
|
16
|
+
</header>
|
|
@@ -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,28 @@
|
|
|
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='preconnect' href='https://fonts.googleapis.com' />
|
|
7
|
+
<link rel='preconnect' href='https://fonts.gstatic.com' crossorigin />
|
|
8
|
+
<link
|
|
9
|
+
href='https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400..800;1,400..800&family=Libre+Franklin:ital,wght@0,100..900;1,100..900&display=swap&family=Encode+Sans:wght@100..900&family=Oswald:wght@200..700&display=swap'
|
|
10
|
+
rel='stylesheet'
|
|
11
|
+
/>
|
|
12
|
+
<meta name='description' content='{{#if seo.metaDescription}}{{seo.metaDescription}}{{else}}Page not found{{/if}}' />
|
|
13
|
+
<link rel='canonical' href='{{canonicalUrl}}' />
|
|
14
|
+
<title>{{#if seo.metaTitle}}{{seo.metaTitle}}{{else}}404 - Page Not Found | fifthbell{{/if}}</title>
|
|
15
|
+
<style>{{{styles}}}</style>
|
|
16
|
+
<!-- Google tag (gtag.js) -->
|
|
17
|
+
<script async src='https://www.googletagmanager.com/gtag/js?id=G-9SGVGCR4JL'></script>
|
|
18
|
+
<script>
|
|
19
|
+
window.dataLayer = window.dataLayer || [];
|
|
20
|
+
function gtag(){dataLayer.push(arguments);}
|
|
21
|
+
gtag('js', new Date());
|
|
22
|
+
gtag('config', 'G-9SGVGCR4JL', {
|
|
23
|
+
content_group: '404'
|
|
24
|
+
});
|
|
25
|
+
</script>
|
|
26
|
+
</head>
|
|
27
|
+
<body class='bg-white dark:bg-slate-950 text-slate-900 dark:text-slate-100 transition-colors'>
|
|
28
|
+
<div class='min-h-screen flex flex-col'>
|
|
@@ -0,0 +1,68 @@
|
|
|
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='preconnect' href='https://fonts.googleapis.com' />
|
|
7
|
+
<link rel='preconnect' href='https://fonts.gstatic.com' crossorigin />
|
|
8
|
+
<link
|
|
9
|
+
href='https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400..800;1,400..800&family=Libre+Franklin:ital,wght@0,100..900;1,100..900&display=swap&family=Encode+Sans:wght@100..900&family=Oswald:wght@200..700&display=swap'
|
|
10
|
+
rel='stylesheet'
|
|
11
|
+
/>
|
|
12
|
+
{{#if featuredImage.url}}
|
|
13
|
+
<link rel='preload' as='image' href='{{featuredImage.url}}' fetchpriority='high' />
|
|
14
|
+
{{/if}}
|
|
15
|
+
<meta name='description' content='{{#if seo.metaDescription}}{{seo.metaDescription}}{{else}}{{excerpt}}{{/if}}' />
|
|
16
|
+
<link rel='canonical' href='{{canonicalUrl}}' />
|
|
17
|
+
<meta property='og:title' content='{{resolveHeadTitle this}}' />
|
|
18
|
+
<meta property='og:description' content='{{#if seo.metaDescription}}{{seo.metaDescription}}{{else}}{{excerpt}}{{/if}}' />
|
|
19
|
+
<meta property='og:url' content='{{canonicalUrl}}' />
|
|
20
|
+
<meta property='og:site_name' content='fifthbell' />
|
|
21
|
+
{{#if (eq layout 'article-page')}}
|
|
22
|
+
<meta property='og:type' content='article' />
|
|
23
|
+
{{else}}
|
|
24
|
+
<meta property='og:type' content='website' />
|
|
25
|
+
{{/if}}
|
|
26
|
+
{{#with (socialImageUrl (coalesce seo.ogImage featuredImage.url)) as |socialImage|}}
|
|
27
|
+
{{#if socialImage}}
|
|
28
|
+
<meta property='og:image' content='{{socialImage}}' />
|
|
29
|
+
<meta property='og:image:type' content='image/jpeg' />
|
|
30
|
+
<meta property='og:image:width' content='1200' />
|
|
31
|
+
<meta property='og:image:height' content='630' />
|
|
32
|
+
<meta property='og:image:alt' content='{{#if featuredImage.alt}}{{featuredImage.alt}}{{else}}{{resolveHeadTitle this}}{{/if}}' />
|
|
33
|
+
{{/if}}
|
|
34
|
+
<meta name='twitter:card' content='{{#if socialImage}}summary_large_image{{else}}summary{{/if}}' />
|
|
35
|
+
{{#if socialImage}}
|
|
36
|
+
<meta name='twitter:image' content='{{socialImage}}' />
|
|
37
|
+
<meta name='twitter:image:src' content='{{socialImage}}' />
|
|
38
|
+
<meta name='twitter:image:alt' content='{{#if featuredImage.alt}}{{featuredImage.alt}}{{else}}{{resolveHeadTitle this}}{{/if}}' />
|
|
39
|
+
{{/if}}
|
|
40
|
+
{{/with}}
|
|
41
|
+
<meta name='twitter:site' content='@thisisfifthbell' />
|
|
42
|
+
<meta name='twitter:title' content='{{resolveHeadTitle this}}' />
|
|
43
|
+
<meta name='twitter:description' content='{{#if seo.metaDescription}}{{seo.metaDescription}}{{else}}{{excerpt}}{{/if}}' />
|
|
44
|
+
<title>{{resolveHeadTitle this}}</title>
|
|
45
|
+
<style>{{{styles}}}</style>
|
|
46
|
+
<!-- Google tag (gtag.js) -->
|
|
47
|
+
<script async src='https://www.googletagmanager.com/gtag/js?id=G-9SGVGCR4JL'></script>
|
|
48
|
+
<script>
|
|
49
|
+
window.dataLayer = window.dataLayer || [];
|
|
50
|
+
function gtag(){dataLayer.push(arguments);}
|
|
51
|
+
gtag('js', new Date());
|
|
52
|
+
gtag('config', 'G-9SGVGCR4JL', {
|
|
53
|
+
content_group: {{{jsonString layout}}}
|
|
54
|
+
});
|
|
55
|
+
gtag('event', 'page_metadata', {
|
|
56
|
+
content_type: {{{jsonString layout}}},
|
|
57
|
+
content_id: {{{jsonString id}}},
|
|
58
|
+
content_language: {{{jsonString language}}},
|
|
59
|
+
author_name: {{{jsonString authors.[0].name}}},
|
|
60
|
+
author_slug: {{{jsonString authors.[0].slug}}},
|
|
61
|
+
category_name: {{{jsonString categories.[0].name}}},
|
|
62
|
+
category_slug: {{{jsonString categories.[0].slug}}},
|
|
63
|
+
published_at: {{{jsonString publishedAt}}}
|
|
64
|
+
});
|
|
65
|
+
</script>
|
|
66
|
+
</head>
|
|
67
|
+
<body class='bg-white dark:bg-slate-950 text-slate-900 dark:text-slate-100 transition-colors'>
|
|
68
|
+
<div class='min-h-screen flex flex-col'>
|