feat(quote-carousel): add QuoteCarouselBlock component and related types
Deploy / verify (push) Successful in 41s
Deploy / deploy (push) Successful in 1m1s

- Introduced a new QuoteCarouselBlock component for displaying rotating quotes.
- Added QuoteCarouselBlockData interface to define the structure of the quote carousel data.
- Updated existing components and types to integrate the new quote carousel functionality.
- Enhanced blog-utils to support filtering posts by tags more effectively.
- Made various UI improvements in the Footer and PostCard components for better user experience.
This commit is contained in:
Peter Meier
2026-04-18 13:19:59 +02:00
parent 3949df31bb
commit 597b920e7c
8 changed files with 285 additions and 52 deletions
+39 -18
View File
@@ -14,20 +14,6 @@
return tStatic(translations ?? null, key);
}
const justifyClass = $derived(
footer?.row1JustifyContent === "end"
? "justify-end"
: footer?.row1JustifyContent === "between"
? "justify-between"
: footer?.row1JustifyContent === "around"
? "justify-around"
: footer?.row1JustifyContent === "evenly"
? "justify-evenly"
: footer?.row1JustifyContent === "start"
? "justify-start"
: "justify-center",
);
const hasRowContent = $derived(
!!footer &&
((footer.row1Content?.length ?? 0) > 0 ||
@@ -38,16 +24,16 @@
{#if footer}
<footer
class="mt-auto bg-zinc-950 text-white py-6"
class="mt-auto bg-zinc-950 text-white py-10"
data-footer-id={footer.id}
>
<div class="container-custom py-6">
<div class="container-custom">
{#if hasRowContent}
<div class="content-footer text-xs">
<div class="content-footer text-sm text-zinc-200">
<ContentRows layout={footer} translations={translations} />
</div>
{:else}
<p class="text-sm text-white/80 {justifyClass} flex">
<p class="text-sm text-white/80 text-center">
{t(T.footer_copyright) !== T.footer_copyright
? t(T.footer_copyright)
: `© ${new Date().getFullYear()} Windwiderstand`}
@@ -56,3 +42,38 @@
</div>
</footer>
{/if}
<style>
.content-footer :global(.content) {
margin: 0;
}
.content-footer :global(.content-row) {
display: flex;
flex-wrap: wrap;
gap: 2rem;
align-items: flex-start;
}
.content-footer :global(.content-row > *) {
flex: 1 1 200px;
grid-column: auto !important;
min-width: 0;
}
.content-footer :global(.content-row + .content-row) {
margin-top: 2rem;
padding-top: 1.5rem;
border-top: 1px solid rgb(63 63 70);
}
.content-footer :global(a) {
color: rgb(228 228 231);
}
.content-footer :global(a:hover) {
color: rgb(255 255 255);
}
.content-footer :global(h3) {
color: rgb(250 250 250);
}
.content-footer :global(.markdown),
.content-footer :global(.prose) {
color: rgb(212 212 216);
}
</style>