## Responsive sources
Wire `ensureResponsiveImage` (multi-width × multi-format srcset) into the three
remaining single-`<img>` components:
- ImageBlock (body): widths 600 + 1200, fit follows transform params
- ImageGalleryBlock (single-image branch): widths 600 + 1280, fit=contain
- PostCard (post-list cards): widths 400 + 800, fit=cover, ar=3:2
`resolveContentImages` now sets `block.resolvedResponsive` alongside the legacy
`resolvedImageSrc`, so every Svelte block component renders `<picture>` if
the responsive shape is present and falls back to a plain `<img>` otherwise.
Posts list pages (`/posts`, `/posts/page/N`, `/posts/tag/.../page/N`) call a
new `resolvePostCardResponsive` helper instead of one-shot `ensureTransformedImage`.
## Drop AVIF from defaults
Server-side AVIF encoding on the CMS is 5-10× slower than WebP. The bandwidth
win is marginal for this site and the build time hit is severe (multi-minute
hangs on each new variant). Default formats are now `["webp", "jpeg"]` for
`ensureResponsiveImage`, in `Layout.astro`'s TopBanner hero, and in the
post-card helper. Callers can still opt back into AVIF per-call.
## Module split for client-safe types
`ResponsiveImage` is now defined in a tiny `rusty-image-types.ts` and
duplicated in `rusty-image.ts` so Svelte components can `import type` the
shape without dragging `rusty-image.ts` (and its `node:crypto`/`node:fs`
imports) into the browser bundle.
`resolvePostCardResponsive` lives in a new `server-image.ts` for the same
reason — `blog-utils.ts` is imported by Svelte islands, so its server-only
helpers move out.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Extracts buildPostSearchIndex + selectUpcomingEvents into blog-utils so
all four routes (posts index, posts pagination, tag, tag pagination)
share the same feature set.
Adds 12 new keys (blog_search_*, blog_year_*, blog_upcoming_events,
blog_results_*, blog_filter_reset, blog_no_results, blog_rss_subscribe)
and uses them in place of the hardcoded German strings.
- Year dropdown derived from post.created, sorted desc
- Combines with search (AND); "Filter zurücksetzen" clears both
- Renamed isSearching→isFiltering to reflect combined state
- Search input limited to sm:max-w-sm (full width only on mobile)
- mdi:magnify prefix, mdi:close clear, mdi:calendar-clock on events,
mdi:rss next to RSS link
- Client-side search on /posts/ (full archive, ~2-char threshold)
- Upcoming-events block at top of /posts/ from isEvent+eventDate posts
- RSS feed at /posts/rss.xml via @astrojs/rss
- Layout head: rss autodiscovery link
- RSS subscribe link below the listing
- Style tweaks on QuoteBlock and PostOverviewBlock
Inputs are only set for workflow_dispatch — on push the env vars were
empty, causing generate-api-types to try localhost:3000 and fail with
ECONNREFUSED. Add || defaults so push builds hit cms.pm86.de.
Adds i18n-keyed link under the PostOverview block linking to /posts/.
New key post_overview_all wired through translations prop from
ContentRows → PostOverviewBlock.
- Updated .gitignore to include raw image files for better asset management.
- Added optional icon and color properties to Tag and TagItem interfaces for improved tag customization.
- Enhanced BlogOverview and PostCard components to support new tag features, including icon and color display.
- Refined Card component to accept target and rel attributes for better link handling.
- Improved layout responsiveness in ContentRows and PostCard components.
- Updated OrganisationsBlock to include a new CTA link feature for adding organizations.
- Enhanced QuoteBlock styling for better visual emphasis on quotes.
- Refactored image handling in various components to ensure consistent display and performance.
- Introduced utility functions for resolving body content and filtering hidden posts in blog utilities.
- Introduced new environment variables for Formbricks in .env.backup and .env.example.
- Updated package.json and yarn.lock to include React and related types for improved functionality.
- Added new favicon images and manifest for better branding and user experience.
- Implemented new Svelte components for enhanced content management, including Badge, Card, OrganisationsBlock, and OpnFormBlock.
- Updated ContentRows component to support new block types.