feat(frist): Deadline-Banner im AnnouncementBanner-Look (rot), nur ein Balken
- Look wie AnnouncementBanner: kompakte zentrierte Leiste, weiße Schrift, 0.7rem, variant-Farbe (urgent=rot), flex-wrap → fließt/stackt sauber mobil - Countdown als dunkles Badge (bg-black/20) - Layout: aktive Frist verdrängt NEU-Banner → nie 2 Balken über der Navi Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,30 +1,27 @@
|
||||
<script lang="ts">
|
||||
import { getBlockLayoutClasses } from "$lib/block-layout";
|
||||
import type { DeadlineBannerBlockData } from "$lib/block-types";
|
||||
import Icon from "@iconify/svelte";
|
||||
import "$lib/iconify-offline";
|
||||
|
||||
let { block }: { block: DeadlineBannerBlockData } = $props();
|
||||
|
||||
const layoutClasses = $derived(getBlockLayoutClasses(block.layout));
|
||||
const showCountdown = $derived(block.showCountdown !== false);
|
||||
|
||||
// Farbgebung nach variant — "urgent" fällt auf (rot), damit die Frist wirkt.
|
||||
const styles = $derived.by(() => {
|
||||
// Look wie AnnouncementBanner (kompakte, zentrierte Leiste) — nur farbig.
|
||||
// "urgent" = rot, damit die Frist wirkt.
|
||||
const barClass = $derived.by(() => {
|
||||
switch (block.variant) {
|
||||
case "urgent":
|
||||
return { bar: "bg-fire-600", text: "text-white", link: "text-white hover:text-white/80" };
|
||||
case "accent":
|
||||
return { bar: "bg-himmel-100", text: "text-himmel-900", link: "text-himmel-900 hover:text-himmel-700" };
|
||||
return "bg-himmel-600";
|
||||
case "info":
|
||||
return { bar: "bg-wald-50", text: "text-wald-900", link: "text-wald-900 hover:text-wald-700" };
|
||||
return "bg-wald-600";
|
||||
case "urgent":
|
||||
return "bg-fire-600";
|
||||
default:
|
||||
return { bar: "bg-gray-50", text: "text-gray-900", link: "text-gray-900 hover:text-gray-700" };
|
||||
return "bg-stein-700";
|
||||
}
|
||||
});
|
||||
|
||||
let dismissed = $state(false);
|
||||
|
||||
type ResolvedItem = {
|
||||
title?: string;
|
||||
terminZeit?: string;
|
||||
@@ -116,56 +113,37 @@
|
||||
const sentence = $derived.by(() => {
|
||||
const parts: string[] = [];
|
||||
if (text) parts.push(text);
|
||||
if (dateStr) parts.push(`am ${dateStr}`);
|
||||
// Datum nur im Auto-Modus anhängen — im Manual-Text steht es meist schon.
|
||||
if (dateStr && block.mode === "auto") parts.push(`am ${dateStr}`);
|
||||
return parts.join(" ");
|
||||
});
|
||||
|
||||
const hasContent = $derived(!!(sentence || countdownStr));
|
||||
</script>
|
||||
|
||||
{#if hasContent && !dismissed}
|
||||
{#if hasContent}
|
||||
<div
|
||||
class="deadline-banner {layoutClasses}"
|
||||
class="deadline-banner {layoutClasses} w-full {barClass} text-white print:hidden"
|
||||
data-block="DeadlineBanner" data-block-type="deadline_banner"
|
||||
data-block-slug={block._slug}
|
||||
role="note"
|
||||
style="font-size: 0.7rem;"
|
||||
>
|
||||
<div
|
||||
class="gradient-blob-bg {styles.bar} py-2.5"
|
||||
>
|
||||
<div class="container-custom flex items-center gap-x-6">
|
||||
<p class="my-0! flex-1 text-sm/6 {styles.text}">
|
||||
{sentence}{#if countdownStr}{sentence ? " · " : ""}<span
|
||||
class="font-semibold">{countdownStr}</span
|
||||
>{/if}{#if href}
|
||||
{" "}<a
|
||||
{href}
|
||||
target={newTab ? "_blank" : undefined}
|
||||
rel={newTab ? "noopener noreferrer" : undefined}
|
||||
class="font-semibold whitespace-nowrap {styles.link}"
|
||||
>
|
||||
{ctaLabel} <Icon
|
||||
icon="lucide:arrow-right"
|
||||
class="inline-block size-4 align-[-0.15em]"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
</a>
|
||||
{/if}
|
||||
</p>
|
||||
<div class="shrink-0">
|
||||
<button
|
||||
type="button"
|
||||
onclick={() => (dismissed = true)}
|
||||
class="-m-3 p-3 focus-visible:-outline-offset-4"
|
||||
>
|
||||
<span class="sr-only">Schließen</span>
|
||||
<Icon
|
||||
icon="lucide:x"
|
||||
class="size-5 {styles.text}"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container-custom flex flex-wrap items-center justify-center gap-x-3 gap-y-1.5 py-2 text-center">
|
||||
{#if sentence}
|
||||
<span>{sentence}</span>
|
||||
{/if}
|
||||
{#if countdownStr}
|
||||
<span class="whitespace-nowrap rounded-full bg-black/20 px-2 py-0.5 font-bold">{countdownStr}</span>
|
||||
{/if}
|
||||
{#if href}
|
||||
<a
|
||||
{href}
|
||||
target={newTab ? "_blank" : undefined}
|
||||
rel={newTab ? "noopener noreferrer" : undefined}
|
||||
class="whitespace-nowrap font-semibold underline underline-offset-2 hover:no-underline"
|
||||
>{ctaLabel} →</a>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
Reference in New Issue
Block a user