@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,74 @@
|
|
|
1
|
+
<figure class='my-8 w-full'>
|
|
2
|
+
<div class='x-embed-shell overflow-hidden w-full' data-tweet-id='{{xTweetId url}}'>
|
|
3
|
+
{{#if (xEmbedUrl url)}}
|
|
4
|
+
<iframe
|
|
5
|
+
title='Embedded X post'
|
|
6
|
+
src='{{xEmbedUrl url}}'
|
|
7
|
+
data-x-embed-frame='true'
|
|
8
|
+
width='100%'
|
|
9
|
+
style='border:0; display:block; width:100%; min-height:260px; height:380px;'
|
|
10
|
+
loading='lazy'
|
|
11
|
+
referrerpolicy='no-referrer-when-downgrade'
|
|
12
|
+
allowfullscreen
|
|
13
|
+
></iframe>
|
|
14
|
+
{{else}}
|
|
15
|
+
<div class='p-4 text-sm text-slate-600 dark:text-slate-300'>
|
|
16
|
+
Post preview unavailable.
|
|
17
|
+
</div>
|
|
18
|
+
{{/if}}
|
|
19
|
+
</div>
|
|
20
|
+
<script>
|
|
21
|
+
(function () {
|
|
22
|
+
const shell = document.currentScript?.previousElementSibling;
|
|
23
|
+
if (!shell) return;
|
|
24
|
+
|
|
25
|
+
const frame = shell.querySelector('iframe[data-x-embed-frame="true"]');
|
|
26
|
+
if (!frame) return;
|
|
27
|
+
|
|
28
|
+
const setFrameHeight = (target, nextHeight) => {
|
|
29
|
+
if (!target || !Number.isFinite(nextHeight)) return;
|
|
30
|
+
const clamped = Math.max(220, Math.min(2200, Math.ceil(nextHeight)));
|
|
31
|
+
target.style.height = `${clamped}px`;
|
|
32
|
+
target.height = String(clamped);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
if (!window.__xEmbedResizeBound) {
|
|
36
|
+
window.__xEmbedResizeBound = true;
|
|
37
|
+
window.addEventListener('message', (event) => {
|
|
38
|
+
if (typeof event.origin !== 'string' || !event.origin.includes('platform.twitter.com')) return;
|
|
39
|
+
|
|
40
|
+
let data = event.data;
|
|
41
|
+
if (typeof data === 'string') {
|
|
42
|
+
try {
|
|
43
|
+
data = JSON.parse(data);
|
|
44
|
+
} catch {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (!data || typeof data !== 'object') return;
|
|
50
|
+
|
|
51
|
+
const candidateHeights = [
|
|
52
|
+
data.height,
|
|
53
|
+
data?.details?.height,
|
|
54
|
+
Array.isArray(data?.params) ? data.params[0] : undefined
|
|
55
|
+
];
|
|
56
|
+
|
|
57
|
+
const nextHeight = candidateHeights.find((value) => typeof value === 'number');
|
|
58
|
+
if (typeof nextHeight !== 'number') return;
|
|
59
|
+
|
|
60
|
+
const allFrames = document.querySelectorAll('iframe[data-x-embed-frame="true"]');
|
|
61
|
+
for (const candidate of allFrames) {
|
|
62
|
+
if (candidate.contentWindow === event.source) {
|
|
63
|
+
setFrameHeight(candidate, nextHeight);
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
})();
|
|
70
|
+
</script>
|
|
71
|
+
<figcaption class='text-sm text-slate-500 dark:text-slate-400 mt-2'>
|
|
72
|
+
<a href='{{url}}' target='_blank' rel='noopener noreferrer' class='hover:underline'>View post on X</a>
|
|
73
|
+
</figcaption>
|
|
74
|
+
</figure>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<figure class='my-8 w-full'>
|
|
2
|
+
<div class='aspect-video overflow-hidden w-full'>
|
|
3
|
+
<iframe
|
|
4
|
+
class='w-full h-full'
|
|
5
|
+
src='https://www.youtube.com/embed/{{videoId}}?enablejsapi=1'
|
|
6
|
+
title='YouTube video player'
|
|
7
|
+
loading='lazy'
|
|
8
|
+
allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share'
|
|
9
|
+
allowfullscreen
|
|
10
|
+
></iframe>
|
|
11
|
+
</div>
|
|
12
|
+
</figure>
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
<main class='flex-1 container mx-auto px-4 grid gap-4 grid-cols-1 lg:grid-cols-12 mt-4'>
|
|
2
|
+
<div class='col-span-12 lg:col-span-4'>
|
|
3
|
+
{{#if featuredImage}}
|
|
4
|
+
<div class='mb-6 overflow-hidden aspect-video bg-slate-100'>
|
|
5
|
+
<img
|
|
6
|
+
src='{{featuredImage.url}}'
|
|
7
|
+
alt='{{featuredImage.alt}}'
|
|
8
|
+
class='w-full h-full object-cover'
|
|
9
|
+
fetchpriority='high'
|
|
10
|
+
loading='eager'
|
|
11
|
+
decoding='async'
|
|
12
|
+
/>
|
|
13
|
+
</div>
|
|
14
|
+
{{/if}}
|
|
15
|
+
|
|
16
|
+
<div class='mb-3 lg:hidden'>
|
|
17
|
+
<span class='text-xs font-bold text-[#b21100] uppercase tracking-wider'>{{#with (lookup categories 0)}}{{name}}{{/with}}</span>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<h1 class='text-4xl font-bold text-slate-900 dark:text-slate-100 mb-4 leading-tight font-serif'>{{title}}</h1>
|
|
21
|
+
<p class='text-slate-600 dark:text-slate-400 text-xl mb-3 font-serif leading-relaxed'>{{excerpt}}</p>
|
|
22
|
+
<p class='text-sm text-slate-500 dark:text-slate-400'><span class='article-time' data-timestamp='{{publishedAt}}'>{{formatDate publishedAt}}</span></p>
|
|
23
|
+
|
|
24
|
+
<div class='mt-6 pt-6 border-t border-slate-200 dark:border-slate-800'>
|
|
25
|
+
<p class='text-xs uppercase tracking-wider text-slate-500 dark:text-slate-500 mb-3 font-sans'>Share</p>
|
|
26
|
+
<div class='flex items-center gap-3'>
|
|
27
|
+
<a href='#' data-share='twitter' class='social-share-btn group p-2 rounded-full border border-slate-300 dark:border-slate-700 hover:border-slate-900 dark:hover:border-slate-100 hover:bg-slate-50 dark:hover:bg-slate-900 transition-all' aria-label='Share on Twitter' title='Share on Twitter'>
|
|
28
|
+
<svg class='w-4 h-4 text-slate-600 dark:text-slate-400 group-hover:text-slate-900 dark:group-hover:text-slate-100 transition-colors' viewBox='0 0 24 24' fill='currentColor'>
|
|
29
|
+
<path d='M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z'></path>
|
|
30
|
+
</svg>
|
|
31
|
+
</a>
|
|
32
|
+
<a href='#' data-share='bluesky' class='social-share-btn group p-2 rounded-full border border-slate-300 dark:border-slate-700 hover:border-[#0085ff] dark:hover:border-[#0085ff] hover:bg-slate-50 dark:hover:bg-slate-900 transition-all' aria-label='Share on Bluesky' title='Share on Bluesky'>
|
|
33
|
+
<svg class='w-4 h-4 text-slate-600 dark:text-slate-400 group-hover:text-[#0085ff] dark:group-hover:text-[#0085ff] transition-colors' viewBox='0 0 600 530' fill='currentColor'>
|
|
34
|
+
<path d='M135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-.0174-2.9357-1.1937.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z'></path>
|
|
35
|
+
</svg>
|
|
36
|
+
</a>
|
|
37
|
+
<a href='#' data-share='facebook' class='social-share-btn group p-2 rounded-full border border-slate-300 dark:border-slate-700 hover:border-[#1877F2] dark:hover:border-[#1877F2] hover:bg-slate-50 dark:hover:bg-slate-900 transition-all' aria-label='Share on Facebook' title='Share on Facebook'>
|
|
38
|
+
<svg class='w-4 h-4 text-slate-600 dark:text-slate-400 group-hover:text-[#1877F2] dark:group-hover:text-[#1877F2] transition-colors' viewBox='0 0 24 24' fill='currentColor'>
|
|
39
|
+
<path d='M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z'></path>
|
|
40
|
+
</svg>
|
|
41
|
+
</a>
|
|
42
|
+
<a href='#' data-share='whatsapp' class='social-share-btn group p-2 rounded-full border border-slate-300 dark:border-slate-700 hover:border-[#25D366] dark:hover:border-[#25D366] hover:bg-slate-50 dark:hover:bg-slate-900 transition-all' aria-label='Share on WhatsApp' title='Share on WhatsApp'>
|
|
43
|
+
<svg class='w-4 h-4 text-slate-600 dark:text-slate-400 group-hover:text-[#25D366] dark:group-hover:text-[#25D366] transition-colors' viewBox='0 0 24 24' fill='currentColor'>
|
|
44
|
+
<path d='M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z'></path>
|
|
45
|
+
</svg>
|
|
46
|
+
</a>
|
|
47
|
+
<a href='#' data-share='linkedin' class='social-share-btn group p-2 rounded-full border border-slate-300 dark:border-slate-700 hover:border-[#0A66C2] dark:hover:border-[#0A66C2] hover:bg-slate-50 dark:hover:bg-slate-900 transition-all' aria-label='Share on LinkedIn' title='Share on LinkedIn'>
|
|
48
|
+
<svg class='w-4 h-4 text-slate-600 dark:text-slate-400 group-hover:text-[#0A66C2] dark:group-hover:text-[#0A66C2] transition-colors' viewBox='0 0 24 24' fill='currentColor'>
|
|
49
|
+
<path d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'></path>
|
|
50
|
+
</svg>
|
|
51
|
+
</a>
|
|
52
|
+
<a href='#' data-share='reddit' class='social-share-btn group p-2 rounded-full border border-slate-300 dark:border-slate-700 hover:border-[#FF4500] dark:hover:border-[#FF4500] hover:bg-slate-50 dark:hover:bg-slate-900 transition-all' aria-label='Share on Reddit' title='Share on Reddit'>
|
|
53
|
+
<svg class='w-4 h-4 text-slate-600 dark:text-slate-400 group-hover:text-[#FF4500] dark:group-hover:text-[#FF4500] transition-colors' viewBox='0 0 24 24' fill='currentColor'>
|
|
54
|
+
<path d='M12 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0zm5.01 4.744c.688 0 1.25.561 1.25 1.249a1.25 1.25 0 0 1-2.498.056l-2.597-.547-.8 3.747c1.824.07 3.48.632 4.674 1.488.308-.309.73-.491 1.207-.491.968 0 1.754.786 1.754 1.754 0 .716-.435 1.333-1.01 1.614a3.111 3.111 0 0 1 .042.52c0 2.694-3.13 4.87-7.004 4.87-3.874 0-7.004-2.176-7.004-4.87 0-.183.015-.366.043-.534A1.748 1.748 0 0 1 4.028 12c0-.968.786-1.754 1.754-1.754.463 0 .898.196 1.207.49 1.207-.883 2.878-1.43 4.744-1.487l.885-4.182a.342.342 0 0 1 .14-.197.35.35 0 0 1 .238-.042l2.906.617a1.214 1.214 0 0 1 1.108-.701zM9.25 12C8.561 12 8 12.562 8 13.25c0 .687.561 1.248 1.25 1.248.687 0 1.248-.561 1.248-1.249 0-.688-.561-1.249-1.249-1.249zm5.5 0c-.687 0-1.248.561-1.248 1.25 0 .687.561 1.248 1.249 1.248.688 0 1.249-.561 1.249-1.249 0-.687-.562-1.249-1.25-1.249zm-5.466 3.99a.327.327 0 0 0-.231.094.33.33 0 0 0 0 .463c.842.842 2.484.913 2.961.913.477 0 2.105-.056 2.961-.913a.361.361 0 0 0 .029-.463.33.33 0 0 0-.464 0c-.547.533-1.684.73-2.512.73-.828 0-1.979-.196-2.512-.73a.326.326 0 0 0-.232-.095z'></path>
|
|
55
|
+
</svg>
|
|
56
|
+
</a>
|
|
57
|
+
<a href='#' data-share='telegram' class='social-share-btn group p-2 rounded-full border border-slate-300 dark:border-slate-700 hover:border-[#26A5E4] dark:hover:border-[#26A5E4] hover:bg-slate-50 dark:hover:bg-slate-900 transition-all' aria-label='Share on Telegram' title='Share on Telegram'>
|
|
58
|
+
<svg class='w-4 h-4 text-slate-600 dark:text-slate-400 group-hover:text-[#26A5E4] dark:group-hover:text-[#26A5E4] transition-colors' viewBox='0 0 24 24' fill='currentColor'>
|
|
59
|
+
<path d='M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z'></path>
|
|
60
|
+
</svg>
|
|
61
|
+
</a>
|
|
62
|
+
<a href='#' data-share='email' class='social-share-btn group p-2 rounded-full border border-slate-300 dark:border-slate-700 hover:border-slate-900 dark:hover:border-slate-100 hover:bg-slate-50 dark:hover:bg-slate-900 transition-all' aria-label='Share via Email' title='Share via Email'>
|
|
63
|
+
<svg class='w-4 h-4 text-slate-600 dark:text-slate-400 group-hover:text-slate-900 dark:group-hover:text-slate-100 transition-colors' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'>
|
|
64
|
+
<rect width='20' height='16' x='2' y='4' rx='2'></rect>
|
|
65
|
+
<path d='m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7'></path>
|
|
66
|
+
</svg>
|
|
67
|
+
</a>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
<div class='hidden lg:flex col-span-1 items-start justify-center'>
|
|
73
|
+
<span class='text-4xl font-bold text-[#b21100] dark:text-[#ff2e1a] text-right md:[writing-mode:vertical-rl] md:[transform:rotate(180deg)]'>{{#with (lookup categories 0)}}{{name}}{{/with}}</span>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<div class='col-span-12 lg:col-span-7 prose dark:prose-invert max-w-none'>
|
|
77
|
+
{{#each body}}
|
|
78
|
+
{{> (lookup . 'type')}}
|
|
79
|
+
{{/each}}
|
|
80
|
+
|
|
81
|
+
{{#if articles.[1]}}
|
|
82
|
+
<section class='not-prose mt-12 pt-6 border-t border-slate-200 dark:border-slate-800'>
|
|
83
|
+
<h2 class='text-sm font-bold uppercase tracking-wider text-slate-500 dark:text-slate-400 mb-6'>Related Articles</h2>
|
|
84
|
+
<div class='grid grid-cols-1 md:grid-cols-2 gap-8'>
|
|
85
|
+
{{#each (slice articles 0 6)}}
|
|
86
|
+
{{> components/snack
|
|
87
|
+
url=url
|
|
88
|
+
title=title
|
|
89
|
+
image=featuredImage.url
|
|
90
|
+
alt=featuredImage.alt
|
|
91
|
+
categories=categories
|
|
92
|
+
excerpt=excerpt
|
|
93
|
+
readTime=(formatDate publishedAt)
|
|
94
|
+
className='flex flex-col h-full'
|
|
95
|
+
}}
|
|
96
|
+
{{/each}}
|
|
97
|
+
</div>
|
|
98
|
+
</section>
|
|
99
|
+
{{/if}}
|
|
100
|
+
</div>
|
|
101
|
+
</main>
|
|
102
|
+
<script>
|
|
103
|
+
(function () {
|
|
104
|
+
if (window.__fifthbellShareBound) return;
|
|
105
|
+
window.__fifthbellShareBound = true;
|
|
106
|
+
|
|
107
|
+
document.addEventListener('click', (event) => {
|
|
108
|
+
const target = event.target;
|
|
109
|
+
if (!target || !(target instanceof Element)) return;
|
|
110
|
+
const button = target.closest('.social-share-btn');
|
|
111
|
+
if (!button) return;
|
|
112
|
+
|
|
113
|
+
event.preventDefault();
|
|
114
|
+
|
|
115
|
+
const platform = button.getAttribute('data-share');
|
|
116
|
+
const url = encodeURIComponent(window.location.href);
|
|
117
|
+
const title = encodeURIComponent(document.querySelector('h1')?.textContent || '');
|
|
118
|
+
let shareUrl = '';
|
|
119
|
+
|
|
120
|
+
switch (platform) {
|
|
121
|
+
case 'twitter':
|
|
122
|
+
shareUrl = `https://twitter.com/intent/tweet?url=${url}&text=${title}`;
|
|
123
|
+
break;
|
|
124
|
+
case 'bluesky':
|
|
125
|
+
shareUrl = `https://bsky.app/intent/compose?text=${title}%20${url}`;
|
|
126
|
+
break;
|
|
127
|
+
case 'facebook':
|
|
128
|
+
shareUrl = `https://www.facebook.com/sharer/sharer.php?u=${url}`;
|
|
129
|
+
break;
|
|
130
|
+
case 'whatsapp':
|
|
131
|
+
shareUrl = `https://wa.me/?text=${title}%20${url}`;
|
|
132
|
+
break;
|
|
133
|
+
case 'linkedin':
|
|
134
|
+
shareUrl = `https://www.linkedin.com/sharing/share-offsite/?url=${url}`;
|
|
135
|
+
break;
|
|
136
|
+
case 'reddit':
|
|
137
|
+
shareUrl = `https://reddit.com/submit?url=${url}&title=${title}`;
|
|
138
|
+
break;
|
|
139
|
+
case 'telegram':
|
|
140
|
+
shareUrl = `https://t.me/share/url?url=${url}&text=${title}`;
|
|
141
|
+
break;
|
|
142
|
+
case 'email':
|
|
143
|
+
shareUrl = `mailto:?subject=${title}&body=${title}%0A%0A${url}`;
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (!shareUrl) return;
|
|
148
|
+
window.open(shareUrl, '_blank', 'width=600,height=400,noopener,noreferrer');
|
|
149
|
+
|
|
150
|
+
if (typeof gtag === 'function') {
|
|
151
|
+
gtag('event', 'share', {
|
|
152
|
+
method: platform,
|
|
153
|
+
content_type: 'article',
|
|
154
|
+
item_id: window.location.pathname
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
})();
|
|
159
|
+
</script>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<section class='flex flex-col h-full'>
|
|
2
|
+
<div class='bg-white dark:bg-slate-900 xl:rounded-lg xl:px-8 px-6 pt-8 pb-6 flex flex-col h-full'>
|
|
3
|
+
<h2 class='text-lg font-medium leading-6 text-slate-900 dark:text-slate-100 mb-6' style='font-variant: small-caps;'>live updates</h2>
|
|
4
|
+
|
|
5
|
+
{{#> 'ui/scroll-area' className='flex-1 min-h-0 w-full'}}
|
|
6
|
+
<div class='flex flex-col w-full gap-0'>
|
|
7
|
+
{{#each updates}}
|
|
8
|
+
<div class='flex gap-4 w-full xl:pb-6 pb-8'>
|
|
9
|
+
<div class='flex flex-col items-center gap-1'>
|
|
10
|
+
<div class='w-2 h-2 rounded-full bg-[#4FC3F7] flex-shrink-0'></div>
|
|
11
|
+
</div>
|
|
12
|
+
<div class='flex flex-col gap-3 flex-grow'>
|
|
13
|
+
<span class='text-base font-medium leading-[22px] text-[#4FC3F7]'>{{#if timestamp}}{{formatDate timestamp}}{{else}}{{time}}{{/if}}</span>
|
|
14
|
+
{{#if html}}
|
|
15
|
+
<div class='text-base leading-[22px] text-slate-900 dark:text-slate-100 [&_img]:w-full [&_img]:h-auto [&_img]:rounded-md [&_img]:mt-2'>
|
|
16
|
+
{{{html}}}
|
|
17
|
+
</div>
|
|
18
|
+
{{else}}
|
|
19
|
+
<p class='text-base leading-[22px] text-slate-900 dark:text-slate-100'>{{text}}</p>
|
|
20
|
+
{{/if}}
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
{{else}}
|
|
24
|
+
<p class='text-base leading-[22px] text-slate-600 dark:text-slate-400'>No live updates yet.</p>
|
|
25
|
+
{{/each}}
|
|
26
|
+
</div>
|
|
27
|
+
{{/ 'ui/scroll-area'}}
|
|
28
|
+
</div>
|
|
29
|
+
</section>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
<div class='mx-auto xl:px-4 pb-8 my-4 {{#if displayClass}}{{displayClass}}{{/if}}'>
|
|
2
|
+
<div class='grid grid-cols-1 xl:grid-cols-2 xl:gap-8 gap-6 mb-4 px-4 xl:px-0'>
|
|
3
|
+
{{#with main}}
|
|
4
|
+
<section class='flex flex-col h-full'>
|
|
5
|
+
<a href='{{url}}' class='relative w-full h-[360px] xl:rounded-t-lg overflow-hidden z-10 block' style='box-shadow: 0px 14px 14px -8px rgba(41, 41, 43, 0.08);'>
|
|
6
|
+
<img src='{{image}}' alt='{{alt}}' class='w-full h-full object-cover' fetchpriority='high' />
|
|
7
|
+
</a>
|
|
8
|
+
|
|
9
|
+
<div class='bg-white dark:bg-slate-900 xl:rounded-b-lg xl:px-8 px-6 pt-8 pb-6 flex flex-col items-center gap-6 h-full'>
|
|
10
|
+
<div class='inline-flex items-center justify-center px-3 py-2 bg-[#cc0000] text-white'>
|
|
11
|
+
<span class='text-xs font-bold tracking-[0.08em] uppercase'>{{category}}</span>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
<div class='flex flex-col items-center gap-2 w-full'>
|
|
15
|
+
<h1 class='text-[40px] font-bold font-encode leading-[45px] text-center tracking-[1px] text-slate-900 dark:text-slate-100'>
|
|
16
|
+
<a href='{{url}}' class='hover:text-[#b21100] dark:hover:text-[#ff2e1a] transition-colors'>{{title}}</a>
|
|
17
|
+
</h1>
|
|
18
|
+
<p class='text-[22px] leading-8 text-center text-slate-600 dark:text-slate-400 font-serif'>{{excerpt}}</p>
|
|
19
|
+
|
|
20
|
+
{{#if liveUrl}}
|
|
21
|
+
<a
|
|
22
|
+
href='{{liveUrl}}'
|
|
23
|
+
class='inline-flex items-center justify-center w-full sm:w-auto px-6 py-3 mt-2 rounded-md bg-[#cc0000] text-white text-sm font-bold uppercase tracking-[0.08em] shadow-[0_10px_20px_-12px_rgba(204,0,0,0.9)] hover:bg-[#b21100] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[#cc0000] transition-colors'
|
|
24
|
+
>
|
|
25
|
+
View Live Story
|
|
26
|
+
</a>
|
|
27
|
+
{{/if}}
|
|
28
|
+
|
|
29
|
+
{{#with (sofascoreWidgetUrl sofascore_id) as |widgetUrl|}}
|
|
30
|
+
<div class='w-full mt-4 mb-2 rounded-lg overflow-hidden border border-slate-200 dark:border-slate-700'>
|
|
31
|
+
<iframe
|
|
32
|
+
width='100%'
|
|
33
|
+
height='286'
|
|
34
|
+
src='{{widgetUrl}}'
|
|
35
|
+
title='SofaScore Attack Momentum'
|
|
36
|
+
frameborder='0'
|
|
37
|
+
scrolling='no'
|
|
38
|
+
loading='lazy'
|
|
39
|
+
referrerpolicy='no-referrer-when-downgrade'
|
|
40
|
+
style='border:0;'
|
|
41
|
+
></iframe>
|
|
42
|
+
{{#with (sofascoreMatchUrl sofascore_id) as |matchUrl|}}
|
|
43
|
+
<div style='font-size:12px;font-family:Arial,sans-serif'>
|
|
44
|
+
<a href='{{matchUrl}}' target='_blank' rel='noreferrer'>{{title}} Live Score</a>
|
|
45
|
+
</div>
|
|
46
|
+
{{/with}}
|
|
47
|
+
</div>
|
|
48
|
+
{{/with}}
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
</section>
|
|
52
|
+
{{/with}}
|
|
53
|
+
|
|
54
|
+
{{> components/breaking-news/live-updates-column updates=updates}}
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<div class='grid grid-cols-1 lg:grid-cols-12 gap-8 mb-4'>
|
|
2
|
+
<section class='lg:col-span-8'>
|
|
3
|
+
{{#with (lookup articles 0)}}
|
|
4
|
+
<article class='mb-8'>
|
|
5
|
+
<a href='{{url}}' class='block mb-4 overflow-hidden aspect-video bg-slate-100'>
|
|
6
|
+
<img src='{{featuredImage.url}}' alt='{{featuredImage.alt}}' class='w-full h-full object-cover transition-transform duration-500 hover:scale-105' />
|
|
7
|
+
</a>
|
|
8
|
+
|
|
9
|
+
<div class='flex items-center text-xs font-bold uppercase tracking-wider text-[#b21100] mb-3'>
|
|
10
|
+
<span>{{#with (lookup categories 0)}}{{name}}{{/with}}</span>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<h2 class='text-4xl font-bold leading-tight text-slate-900 dark:text-slate-100 mb-4 font-encode'>
|
|
14
|
+
<a href='{{url}}' class='hover:underline decoration-[#b21100]'>{{title}}</a>
|
|
15
|
+
</h2>
|
|
16
|
+
|
|
17
|
+
<p class='text-slate-600 dark:text-slate-400 font-serif leading-relaxed line-clamp-3 text-xl mb-3'>{{excerpt}}</p>
|
|
18
|
+
<span class='text-sm text-slate-500 dark:text-slate-400 block font-sans'>{{formatDate updatedAt}}</span>
|
|
19
|
+
</article>
|
|
20
|
+
{{/with}}
|
|
21
|
+
|
|
22
|
+
<div class='grid grid-cols-1 md:grid-cols-2 gap-6'>
|
|
23
|
+
{{#each (slice articles 1 3)}}
|
|
24
|
+
<article class='group'>
|
|
25
|
+
<a href='{{url}}' class='block mb-4 overflow-hidden aspect-[3/2] bg-slate-100'>
|
|
26
|
+
<img src='{{featuredImage.url}}' alt='{{featuredImage.alt}}' class='w-full h-full object-cover transition-transform duration-500 group-hover:scale-105' />
|
|
27
|
+
</a>
|
|
28
|
+
<div class='space-y-2'>
|
|
29
|
+
<span class='text-xs font-bold text-[#b21100] uppercase tracking-wider'>{{#with (lookup categories 0)}}{{name}}{{/with}}</span>
|
|
30
|
+
<h3 class='text-2xl font-bold font-serif leading-tight text-slate-900 dark:text-slate-100 group-hover:underline'>
|
|
31
|
+
<a href='{{url}}'>{{title}}</a>
|
|
32
|
+
</h3>
|
|
33
|
+
<p class='text-xl text-slate-500 dark:text-slate-400 line-clamp-3 font-serif'>{{excerpt}}</p>
|
|
34
|
+
</div>
|
|
35
|
+
</article>
|
|
36
|
+
{{/each}}
|
|
37
|
+
</div>
|
|
38
|
+
</section>
|
|
39
|
+
|
|
40
|
+
<aside class='lg:col-span-4'>
|
|
41
|
+
<div class='flex flex-col justify-between h-full'>
|
|
42
|
+
{{#each (slice articles 3 11)}}
|
|
43
|
+
{{> components/snack
|
|
44
|
+
url=url
|
|
45
|
+
title=title
|
|
46
|
+
image=featuredImage.url
|
|
47
|
+
alt=featuredImage.alt
|
|
48
|
+
readTime=(formatDate updatedAt)
|
|
49
|
+
showExcerpt=false
|
|
50
|
+
className='pt-6 pb-6 border-b border-slate-200 dark:border-slate-800'
|
|
51
|
+
}}
|
|
52
|
+
{{/each}}
|
|
53
|
+
</div>
|
|
54
|
+
</aside>
|
|
55
|
+
</div>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<div class='border-t border-slate-200 dark:border-slate-800 pt-8 mt-8'>
|
|
2
|
+
<div class='flex items-center gap-2 mb-6 border-l-4 border-[#b21100] pl-4'>
|
|
3
|
+
<h2 class='text-2xl font-bold tracking-tight font-serif text-slate-900 dark:text-slate-100'>More in {{title}}</h2>
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
<div class='grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6'>
|
|
7
|
+
{{#each (slice articles 13 25)}}
|
|
8
|
+
<article class='group flex flex-col h-full'>
|
|
9
|
+
<a href='{{url}}' class='block mb-3 overflow-hidden aspect-[3/2] bg-slate-100'>
|
|
10
|
+
<img src='{{featuredImage.url}}' alt='{{featuredImage.alt}}' class='w-full h-full object-cover transition-transform duration-500 group-hover:scale-105' />
|
|
11
|
+
</a>
|
|
12
|
+
<div class='flex-1 flex flex-col'>
|
|
13
|
+
<div class='flex items-center text-xs font-bold uppercase tracking-wider text-[#b21100] mb-2'>
|
|
14
|
+
<span>{{#with (lookup categories 0)}}{{name}}{{/with}}</span>
|
|
15
|
+
<span class='mx-2 text-slate-400 dark:text-slate-500'>•</span>
|
|
16
|
+
<span class='text-slate-500 dark:text-slate-400 font-normal'>{{formatDate updatedAt}}</span>
|
|
17
|
+
</div>
|
|
18
|
+
<h3 class='text-lg font-bold font-encode text-slate-900 dark:text-slate-100 mb-2 leading-snug group-hover:underline decoration-[#b21100]'>
|
|
19
|
+
<a href='{{url}}'>{{title}}</a>
|
|
20
|
+
</h3>
|
|
21
|
+
<p class='text-slate-500 dark:text-slate-400 text-base font-serif line-clamp-3 leading-relaxed'>{{excerpt}}</p>
|
|
22
|
+
</div>
|
|
23
|
+
</article>
|
|
24
|
+
{{/each}}
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<section class='border-b border-slate-200 dark:border-slate-800 bg-white dark:bg-slate-900 pb-8 mb-8 font-sans' data-nosnippet data-carousel='editorial'>
|
|
2
|
+
<div class='container mx-auto px-4 pt-8'>
|
|
3
|
+
<div class='grid grid-cols-1 lg:grid-cols-12 gap-8 items-stretch'>
|
|
4
|
+
<div class='lg:col-span-12 xl:col-span-5 flex flex-col justify-center space-y-4 pt-2 order-2 lg:order-1'>
|
|
5
|
+
<span class='kicker text-[#b21100] dark:text-[#ff2e1a] text-xs font-bold uppercase tracking-widest mb-1 block relative pl-3 before:absolute before:left-0 before:top-1/2 before:-translate-y-1/2 before:w-2 before:h-2 before:bg-[#b21100] before:rounded-sm'>
|
|
6
|
+
Lead Story
|
|
7
|
+
</span>
|
|
8
|
+
|
|
9
|
+
<h1 class='headline text-4xl lg:text-5xl xl:text-6xl font-bold text-slate-900 dark:text-slate-100 tracking-tight leading-[1] font-serif'>
|
|
10
|
+
<a href='{{articleUrl slug=slug categories=categories language=@root.language}}' class='hover:underline decoration-4 decoration-[#b21100]/20 underline-offset-4'>{{title}}</a>
|
|
11
|
+
</h1>
|
|
12
|
+
|
|
13
|
+
<p class='deck text-lg md:text-xl text-slate-600 dark:text-slate-400 font-serif leading-relaxed mt-4'>{{excerpt}}</p>
|
|
14
|
+
|
|
15
|
+
<div class='flex items-center space-x-4 pt-4 border-t border-slate-100 dark:border-slate-800 mt-4'>
|
|
16
|
+
<span class='text-xs font-bold uppercase tracking-wider text-slate-500'>{{#with (lookup categories 0)}}{{name}}{{else}}Top Stories{{/with}}</span>
|
|
17
|
+
<span class='text-xs text-slate-400'>•</span>
|
|
18
|
+
<a href='{{articleUrl slug=slug categories=categories language=@root.language}}' class='text-xs font-bold uppercase tracking-wider text-black dark:text-white hover:text-[#b21100] transition-colors'>Read Now →</a>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
{{#if related.[0]}}
|
|
22
|
+
<div class='grid grid-cols-2 gap-4 pt-4 border-t border-slate-100 dark:border-slate-800 mt-4'>
|
|
23
|
+
{{#each (slice related 0 4)}}
|
|
24
|
+
{{> components/headline
|
|
25
|
+
url=url
|
|
26
|
+
title=title
|
|
27
|
+
time=(formatDate (coalesce updatedAt publishedAt))
|
|
28
|
+
timestamp=(coalesce updatedAt publishedAt)
|
|
29
|
+
image=image
|
|
30
|
+
featuredImage=featuredImage
|
|
31
|
+
titleClass='text-sm lg:text-base leading-tight lg:leading-[22px] font-medium text-slate-900 dark:text-slate-100 font-sans'
|
|
32
|
+
}}
|
|
33
|
+
{{/each}}
|
|
34
|
+
</div>
|
|
35
|
+
{{/if}}
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<div class='lg:col-span-12 xl:col-span-7 relative order-1 lg:order-2 flex flex-col'>
|
|
39
|
+
<div class='carousel-background flex-1 w-full overflow-hidden bg-slate-100 dark:bg-slate-800 relative shadow-sm'>
|
|
40
|
+
{{#if slides}}
|
|
41
|
+
{{#each slides}}
|
|
42
|
+
<div class='carousel-slide {{#if @first}}active opacity-100{{else}}hidden opacity-0{{/if}} absolute inset-0 bg-cover bg-center transition-opacity duration-700' style='background-image: url({{image}});'></div>
|
|
43
|
+
{{/each}}
|
|
44
|
+
{{else}}
|
|
45
|
+
{{#if hero.url}}
|
|
46
|
+
<div class='carousel-slide active opacity-100 absolute inset-0 bg-cover bg-center transition-opacity duration-700' style='background-image: url({{hero.url}});'></div>
|
|
47
|
+
{{else}}
|
|
48
|
+
<div class='carousel-slide active opacity-100 absolute inset-0 bg-cover bg-center transition-opacity duration-700' style='background-image: url(https://images.unsplash.com/photo-1586348943529-beaae6c28db9?w=1440&h=882&fit=crop);'></div>
|
|
49
|
+
{{/if}}
|
|
50
|
+
{{/if}}
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<div class='flex justify-between items-center mt-2 text-xs text-slate-500 font-sans border-t border-slate-100 dark:border-slate-800 pt-2'>
|
|
54
|
+
<div class='flex items-center gap-2'>
|
|
55
|
+
{{#if slides}}
|
|
56
|
+
{{#each slides}}
|
|
57
|
+
<button class='carousel-dot w-2 h-2 rounded-full {{#if @first}}active{{/if}}' data-slide='{{@index}}'></button>
|
|
58
|
+
{{/each}}
|
|
59
|
+
{{else}}
|
|
60
|
+
<button class='carousel-dot w-2 h-2 rounded-full active' data-slide='0'></button>
|
|
61
|
+
{{/if}}
|
|
62
|
+
<button class='carousel-next w-7 h-7 flex items-center justify-center text-slate-700 dark:text-slate-300 hover:text-[#b21100] dark:hover:text-[#ff2e1a] transition-colors' aria-label='Next slide'>
|
|
63
|
+
<svg width='14' height='14' viewBox='0 0 15 27' fill='none'>
|
|
64
|
+
<path d='M1.5 1.5L13.5 13.5L1.5 25.5' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'></path>
|
|
65
|
+
</svg>
|
|
66
|
+
</button>
|
|
67
|
+
</div>
|
|
68
|
+
<span class='italic text-slate-400'>Photo: Agency/Wire</span>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
</section>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<article class='{{#if className}}{{className}}{{else}}flex flex-col gap-2{{/if}}'>
|
|
2
|
+
<div class='flex items-center gap-4'>
|
|
3
|
+
<span class='{{#if timeClass}}{{timeClass}}{{else}}text-[10px] uppercase tracking-wider text-[#b21100] dark:text-[#ff2e1a] font-bold{{/if}}{{#if timestamp}} article-time{{/if}}'{{#if timestamp}} data-timestamp='{{timestamp}}'{{/if}}>{{time}}</span>
|
|
4
|
+
</div>
|
|
5
|
+
<div class='flex gap-2 lg:gap-4 items-start'>
|
|
6
|
+
<div class='flex-1'>
|
|
7
|
+
<h3 class='{{#if titleClass}}{{titleClass}}{{else}}text-sm lg:text-base leading-tight lg:leading-[22px] font-medium text-slate-900 dark:text-slate-100 font-sans{{/if}}'>
|
|
8
|
+
<a href='{{url}}' class='{{#if linkClass}}{{linkClass}}{{else}}hover:text-[#b21100] dark:hover:text-[#ff2e1a] transition-colors{{/if}}'>{{title}}</a>
|
|
9
|
+
</h3>
|
|
10
|
+
</div>
|
|
11
|
+
{{#unless (eq showImage false)}}
|
|
12
|
+
<a href='{{url}}' class='{{#if imageSizeClass}}{{imageSizeClass}}{{else}}w-12 h-12 lg:w-16 lg:h-16{{/if}} flex-shrink-0 rounded {{#if imageFallbackBgClass}}{{imageFallbackBgClass}}{{else}}bg-slate-300 dark:bg-slate-700{{/if}}' style='background: url({{#if image}}{{image}}{{else}}{{featuredImage.url}}{{/if}}) center/cover;'></a>
|
|
13
|
+
{{/unless}}
|
|
14
|
+
</div>
|
|
15
|
+
</article>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{{> components/editorial-hero}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{{> components/spotlight-hero}}
|