4 Commits

Author SHA1 Message Date
enricobuehler 66ff3cffa8 Revert "fix(footer): default nav + tagline when the tenant's CMS footer is empty"
Build & Deploy unom website / build (push) Successful in 26s
Build & Deploy unom website / deploy (push) Successful in 5s
This reverts the hardcoded footer fallback. The footer stays fully CMS-driven;
the unom tenant's footer will be populated to mirror punktfunk's instead.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 18:25:19 +02:00
enricobuehler f47f7989e0 fix(footer): default nav + tagline when the tenant's CMS footer is empty
Build & Deploy unom website / build (push) Successful in 26s
Build & Deploy unom website / deploy (push) Successful in 4s
The unom tenant's footer doc has no sections yet (the multi-tenant migration
backfilled the old footer to the punktfunk tenant), so the footer rendered as
an empty, near-invisible bar. Render a sensible default (Übersicht/Rechtliches
links + site tagline) when there are no CMS sections; CMS content overrides it
once the unom footer is populated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 18:19:19 +02:00
enricobuehler 15130ae4df feat: adopt @unom/ui + add Projects section to the landing page
Build & Deploy unom website / build (push) Successful in 41s
Build & Deploy unom website / deploy (push) Successful in 5s
- Pull in @unom/ui (0.8.16) + @unom/style + peers; bump @unom/cms to 0.3.0.
- globals.css now provides the full semantic-token contract @unom/ui consumes
  (primary/accent/background/ring/radius-card/…), expressed with unom's violet
  brand + Inter/Ubuntu.
- Section wraps @unom/ui's Section (in-view animation orchestrator); PostCard,
  LatestPosts, and the hero use AnimatedCard/AnimatedText/AnimatedButton/Heading.
- lib/cms.ts moves to the multi-tenant model (tenant=unom), header/footer as
  per-tenant collections, + findProjects().
- New Projects section lists this tenant's projects on the landing page
  (soft-fails to hidden when empty). Starts with punktfunk.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 18:11:35 +02:00
enricobuehler 7bf10b6a12 i18n: paraglide setup mirroring played/plaza, de unprefixed + /en/ prefixed
Build & Deploy unom website / build (push) Successful in 21s
Build & Deploy unom website / deploy (push) Successful in 4s
- project.inlang/settings.json with locales [de, en], baseLocale de.
- messages/{de,en}.json hold the strings (tagline, blog labels, etc.).
- vite.config.ts: paraglideVitePlugin compiles to src/paraglide/
  (gitignored) on dev/build. Strategy: url → cookie →
  preferredLanguage → baseLocale. URL pattern keeps German at /:path
  (unprefixed) and English at /en/:path so existing URLs stay valid.
- server.tsx wraps the handler in paraglideMiddleware so AsyncLocalStorage
  carries the per-request locale into SSR.
- router.tsx adds rewrite { input: deLocalizeUrl, output: localizeUrl }
  so route matching stays locale-agnostic — the router sees /blog while
  URLs show /en/blog.
- cms.ts narrows getLocale()'s union back to the de|en pair the CMS
  supports, used as the default for find/findGlobal calls.
- Components/routes switch to m.foo() for user-visible strings; date
  formatting picks de-DE / en-GB from getLocale().
- Root html lang reads getLocale() so the document language flips per
  request.

Known minor: TanStack Start's { title } meta entry still serves the base
locale value (og:title and the description meta are localized correctly).
Will track separately.
2026-05-26 19:23:35 +02:00