From b7093b703abf3bf71a4f7b84573f33eaed68132a Mon Sep 17 00:00:00 2001 From: Peter Meier Date: Tue, 5 May 2026 01:06:22 +0200 Subject: [PATCH] style(design): consistency sweep + UX upgrades MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Palette: gray/zinc/slate/neutral → stein, red → fire, amber → erde, sky → himmel, green → wald - Footer: replaced raw rgb with stein tokens - Radius: unified to rounded-xs across cards, buttons, inputs, pagination - Buttons: .btn-primary/.btn-secondary now font-medium; added secondary - Card hover: -translate-y-0.5 + shadow + wald-300 border - Header active link: wald border-bottom + wald-700 text - Mobile nav: bigger touch targets + wald active accent - Pagination: prev/next text labels + wald-500 active state with separated shape/color classes to avoid Tailwind conflicts - Lead paragraph: scoped .markdown > p:first-child for top-level MarkdownBlock only via [data-block-type="markdown"] - Section dividers: subtle wald-200 gradient between content rows - Global focus-visible ring (wald-500) - Inline hex → palette tokens (Badge amber, Tag custom-color contrast) - Font weights snapped to design system (300/400/500/600/700) - transition-all → transition-colors where only color changes - Removed em-dashes from user-visible templates Co-Authored-By: Claude Opus 4.7 --- src/app.css | 61 ++++++++++++-- src/lib/components/Accordion.svelte | 2 +- src/lib/components/Badge.svelte | 2 +- src/lib/components/BlogOverview.svelte | 34 ++++---- src/lib/components/Card.svelte | 10 +-- src/lib/components/Comments.svelte | 80 +++++++++---------- src/lib/components/ContentRows.svelte | 2 +- src/lib/components/EventBadges.svelte | 4 +- src/lib/components/EventMap.svelte | 2 +- src/lib/components/Footer.svelte | 16 ++-- src/lib/components/Header.svelte | 47 ++++------- src/lib/components/Pagination.svelte | 28 ++++--- src/lib/components/PostActions.svelte | 12 +-- src/lib/components/PostCard.svelte | 8 +- src/lib/components/Search.svelte | 28 +++---- src/lib/components/Tag.svelte | 4 +- src/lib/components/TopBanner.svelte | 12 +-- .../components/blocks/CalendarBlock.svelte | 8 +- .../blocks/DeadlineBannerBlock.svelte | 8 +- src/lib/components/blocks/FilesBlock.svelte | 14 ++-- src/lib/components/blocks/IframeBlock.svelte | 6 +- src/lib/components/blocks/ImageBlock.svelte | 6 +- .../blocks/ImageGalleryBlock.svelte | 8 +- .../blocks/OrganisationsBlock.svelte | 16 ++-- .../blocks/PostOverviewBlock.svelte | 2 +- src/lib/components/blocks/QuoteBlock.svelte | 6 +- .../blocks/QuoteCarouselBlock.svelte | 10 +-- .../blocks/SearchableTextBlock.svelte | 8 +- .../components/blocks/StrommixBlock.svelte | 12 +-- .../blocks/YoutubeVideoBlock.svelte | 2 +- .../blocks/YoutubeVideoGalleryBlock.svelte | 8 +- src/lib/iconify-mdi-subset.generated.json | 6 ++ src/lib/ui/Badge.svelte | 2 +- src/lib/ui/Tooltip.svelte | 2 +- src/routes/+error.svelte | 12 +-- src/routes/+layout.svelte | 8 +- src/routes/+page.svelte | 6 +- src/routes/post/[slug]/+page.svelte | 4 +- src/routes/posts/+page.svelte | 2 +- src/routes/posts/page/[page]/+page.svelte | 2 +- src/routes/posts/tag/[tag]/+page.svelte | 2 +- .../posts/tag/[tag]/page/[page]/+page.svelte | 2 +- 42 files changed, 280 insertions(+), 234 deletions(-) diff --git a/src/app.css b/src/app.css index 5452a41..32960d1 100644 --- a/src/app.css +++ b/src/app.css @@ -315,13 +315,65 @@ main ol:not(.not-prose) li { /* Buttons – Wald (Primary) */ .btn-primary { - @apply inline-block no-underline transition-colors duration-200 font-light px-4 py-2 rounded-md shadow-sm bg-btn-bg text-btn-txt; + @apply inline-block no-underline transition-colors duration-200 font-medium px-4 py-2 rounded-xs shadow-sm bg-btn-bg text-btn-txt; } .btn-primary:hover { @apply bg-btn-hover-bg; } +/* Buttons – Stein outline (Secondary) */ +.btn-secondary { + @apply inline-block no-underline transition-colors duration-200 font-medium px-4 py-2 rounded-xs border border-stein-300 bg-white text-stein-700 shadow-sm; +} + +.btn-secondary:hover { + @apply bg-stein-100 border-stein-400; +} + +/* Globaler Focus-Ring – wald-Akzent für Tastatur-Nutzer (a11y + Polish) */ +*:focus-visible { + outline: 2px solid var(--color-wald-500); + outline-offset: 2px; + border-radius: 2px; +} + +/* Lead-Paragraph: erstes

in einem Top-Level MarkdownBlock größer + leichter + (Editorial). Bewusst nur via [data-block-type="markdown"] gescopt — sonst + würden auch Card-Beschreibungen mit `.markdown` getroffen. */ +[data-block-type="markdown"] .markdown > p:first-child { + font-size: 1.25rem; + line-height: 1.55; + font-weight: 300; + color: var(--text-secondary); + margin-bottom: 1.25em; +} + +@media (min-width: 768px) { + [data-block-type="markdown"] .markdown > p:first-child { + font-size: 1.375rem; + } +} + +/* Content-Row-Trenner: subtiler wald-Verlauf zwischen content-rows (Forest-Identität) */ +.content-row + .content-row { + position: relative; + margin-top: 2rem; +} +.content-row + .content-row::before { + content: ""; + display: block; + height: 1px; + background: linear-gradient( + 90deg, + transparent, + var(--color-wald-200), + transparent + ); + margin: 0 auto 2rem; + max-width: 50%; +} + /* Content-Blöcke */ .content p { @apply mb-4; @@ -372,7 +424,7 @@ main ol:not(.not-prose) li { /* Markdown-Bilder: /cms-images-Transform, max-height begrenzt Höhe; Link öffnet Bild in neuem Tab */ .markdown img { - @apply max-w-full w-full my-2 border border-stein-200 rounded-md bg-stein-200 shadow-sm inline-block; + @apply max-w-full w-full my-2 border border-stein-200 rounded-xs bg-stein-200 shadow-sm inline-block; max-height: 30vh; } @@ -423,7 +475,7 @@ main code, main pre, .content pre, .markdown pre { - @apply mt-3 mb-4 overflow-x-auto rounded-md border border-stein-200 bg-stein-100 px-4 py-3 text-stein-800 leading-normal; + @apply mt-3 mb-4 overflow-x-auto rounded-xs border border-stein-200 bg-stein-100 px-4 py-3 text-stein-800 leading-normal; } main pre code, @@ -462,9 +514,6 @@ blockquote[data-block-type="quote"] cite { font-family: var(--font-secondary); } -.content-row + .content-row { - margin-top: 1.5rem; -} /* Footer */ footer a, diff --git a/src/lib/components/Accordion.svelte b/src/lib/components/Accordion.svelte index 582f78a..411580d 100644 --- a/src/lib/components/Accordion.svelte +++ b/src/lib/components/Accordion.svelte @@ -32,7 +32,7 @@ } -

+
{label} diff --git a/src/lib/components/Badge.svelte b/src/lib/components/Badge.svelte index cf1df17..efd127a 100644 --- a/src/lib/components/Badge.svelte +++ b/src/lib/components/Badge.svelte @@ -11,7 +11,7 @@ switch (c) { case "green": return "bg-wald-50 text-wald-700 border border-wald-200"; case "blue": return "bg-himmel-50 text-himmel-700 border border-himmel-200"; - case "amber": return "bg-[#fdf8ec] text-[#a6780a] border border-[#f0d98a]"; + case "amber": return "bg-erde-50 text-erde-700 border border-erde-200"; default: return "bg-stein-100 text-stein-600 border border-stein-200"; } } diff --git a/src/lib/components/BlogOverview.svelte b/src/lib/components/BlogOverview.svelte index a98a6ec..55fe79a 100644 --- a/src/lib/components/BlogOverview.svelte +++ b/src/lib/components/BlogOverview.svelte @@ -133,7 +133,7 @@