-
+
{sentence}{#if countdownStr}{sentence ? " · " : ""}{countdownStr}{/if}{#if href}
@@ -127,7 +141,7 @@
{href}
target={newTab ? "_blank" : undefined}
rel={newTab ? "noopener noreferrer" : undefined}
- class="font-semibold whitespace-nowrap text-gray-900 hover:text-gray-700"
+ class="font-semibold whitespace-nowrap {styles.link}"
>
{ctaLabel} Schließen
diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts
index 1f9dd35..60e08a9 100644
--- a/src/routes/+layout.server.ts
+++ b/src/routes/+layout.server.ts
@@ -18,6 +18,7 @@ import type {
PageConfigEntry,
TopBannerEntry,
} from '$lib/cms';
+import type { DeadlineBannerBlockData } from '$lib/block-types';
import { ensureTransformedImage } from '$lib/rusty-image';
import {
DEFAULT_SOCIAL_IMAGE_URL,
@@ -89,13 +90,14 @@ export const load: LayoutServerLoad = async ({ locals, route }) => {
let bootstrapFooter: FooterEntry | null = null;
let bootstrapConfig: PageConfigEntry | null = null;
let bootstrapTopBanner: TopBannerEntry | null = null;
+ let bootstrapDeadlineBanner: DeadlineBannerBlockData | null = null;
try {
// TTL-Cache über den ganzen Batch — lief vorher ungecacht bei jedem
// SSR-Request. CSV-Key-Head: Webhook-Purge jeder beteiligten Collection
// invalidiert den Eintrag (siehe invalidateCollection in cms.ts).
const batch = await cached(
'navigation',
- 'navigation,footer,page_config,top_banner:layout-bootstrap:de',
+ 'navigation,footer,page_config,top_banner,deadline_banner:layout-bootstrap:de',
() => batchFetch([
{
id: 'navHeader',
@@ -132,12 +134,20 @@ export const load: LayoutServerLoad = async ({ locals, route }) => {
collection: 'top_banner',
slug: 'site-announcement',
},
+ {
+ id: 'deadlineBanner',
+ collection: 'deadline_banner',
+ slug: 'deadline-banner-auslegung-2026',
+ locale: 'de',
+ resolve: 'all',
+ },
]));
bootstrapNavHeader = batchData(batch.results.navHeader);
bootstrapNavSocial = batchData(batch.results.navSocial);
bootstrapFooter = batchData(batch.results.footer);
bootstrapConfig = batchData(batch.results.config);
bootstrapTopBanner = batchData(batch.results.topBanner);
+ bootstrapDeadlineBanner = batchData(batch.results.deadlineBanner);
} catch (err) {
/* CMS nicht erreichbar — alle Felder bleiben null, Page rendert ohne. */
logWarn('layout.bootstrap', err);
@@ -405,5 +415,6 @@ export const load: LayoutServerLoad = async ({ locals, route }) => {
analyticsPm86SiteId:
(pageConfig as { analyticsPm86SiteId?: string } | null)?.analyticsPm86SiteId ?? null,
announcementBanner: bootstrapTopBanner,
+ deadlineBanner: bootstrapDeadlineBanner,
};
};
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index ad067e0..477041c 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -7,6 +7,7 @@
import Footer from '$lib/components/Footer.svelte';
import TopBanner from '$lib/components/TopBanner.svelte';
import AnnouncementBanner from '$lib/components/AnnouncementBanner.svelte';
+ import DeadlineBannerBlock from '$lib/components/blocks/DeadlineBannerBlock.svelte';
import TranslationProvider from '$lib/components/TranslationProvider.svelte';
import Breadcrumbs from '$lib/ui/Breadcrumbs.svelte';
import type { LayoutData } from './$types';
@@ -328,6 +329,9 @@
class="sr-only focus:not-sr-only focus:fixed focus:top-2 focus:left-2 focus:z-[100] focus:bg-white focus:px-3 focus:py-2 focus:shadow focus:outline focus:outline-2 focus:outline-wald-600 focus:rounded-xs"
>Zum Inhalt springen
+ {#if data.deadlineBanner}
+
+ {/if}
{#if data.announcementBanner}
{/if}