Complete type migration removing all 33+ local interfaces and as-unknown-as
casts. All components now use contracts types directly with type-safe
relationship resolution via payload-helpers.ts.
Key changes:
- New payload-helpers.ts: resolveRelation, getMediaUrl, getMediaAlt, socialLinksToMap
- types.ts: thin re-export layer from contracts (backward-compatible aliases)
- api.ts: direct contracts types, no bridge casts, typed getSeoSettings
- All 17 block components: correct CMS field names (headline, subline, cta group, etc.)
- All route files: page.seo.metaTitle (not page.meta.title), getMediaUrl for unions
- structuredData.ts: proper types for all schema generators
- Footer: social links from separate collection via socialLinksToMap()
- Header/Footer: resolveMedia for logo
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Critical fixes:
- Add group class to Card component for image zoom on hover
- Create Skeleton, EmptyState, and Pagination UI components
- Add proper empty state to PostsListBlock instead of returning null
Visual consistency:
- Fix Button hover states (subtler secondary/tertiary transitions)
- Add badge variants for FavoritesBlock with German labels
- Increase overlay opacity in HeroBlock/VideoBlock for better contrast
Accessibility improvements:
- Add skip-to-content link in layout for keyboard navigation
- Add focus-visible states to FAQ accordion and Testimonials carousel
- Implement focus trap in MobileMenu with proper ARIA attributes
- Enhance 404 page with helpful navigation links
Polish:
- Fix DividerBlock text contrast
- Fix lint errors (Link component, const declaration)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>