feat(dashboard): mobile layout, glass UI, context bottom nav + OIDC PKCE (#1079)

* feat(dashboard): mobile layout, glass tiles, plain-text countdown, place photos

- Rework the mobile dashboard: cover hero, separate boarding-pass card,
  trimmed atlas (trips + days only), stacked widgets
- New floating bottom tab bar with a centred context-aware + button
  (new trip / place / journey / entry depending on the page)
- Move profile + notifications into a small top strip on the dashboard
- Desktop: glassmorphic tiles (light + dark), neutral dark palette,
  plain-text countdown module, real place photos in the boarding pass

* i18n(dashboard): translate new dashboard keys across all locales

Fill the dashboard-rework keys (hero, atlas, fx, tz, upcoming, copy
dialog, aria labels, countdown) that were left as English placeholders,
plus the new startsIn/aria keys, for all 19 languages.

* feat(oidc): send PKCE (S256) in the OIDC login flow

The OIDC client now generates a code_verifier per login, sends the
S256 code_challenge on the authorize request and the code_verifier on
the token exchange. Works whether the provider has PKCE optional or
required (fixes login against providers that require PKCE, e.g. Pocket ID).
This commit is contained in:
Maurice
2026-05-27 23:19:03 +02:00
committed by GitHub
parent 0d2657ee37
commit 6d2dd37414
34 changed files with 1692 additions and 1296 deletions
+9
View File
@@ -122,6 +122,8 @@ const dashboard: TranslationStrings = {
'dashboard.hero.dayLeft': 'Tag übrig',
'dashboard.hero.daysLeft': 'Tage übrig',
'dashboard.hero.lastDay': 'Letzter Tag',
'dashboard.hero.untilStart': 'Bis Start',
'dashboard.hero.startsIn': 'Reise beginnt in',
'dashboard.atlas.countriesVisited': 'Atlas · Besuchte Länder',
'dashboard.atlas.ofTotal': 'von {total}',
'dashboard.atlas.tripsTotal': 'Reisen gesamt',
@@ -155,5 +157,12 @@ const dashboard: TranslationStrings = {
'dashboard.confirm.copy.wont3': 'Dateien & Fotos',
'dashboard.confirm.copy.wont4': 'Freigabe-Tokens',
'dashboard.confirm.copy.confirm': 'Reise kopieren',
'dashboard.aria.toggleView': 'Ansicht wechseln',
'dashboard.aria.filter': 'Filter',
'dashboard.aria.duplicate': 'Duplizieren',
'dashboard.aria.refreshRates': 'Kurse aktualisieren',
'dashboard.aria.swapCurrencies': 'Währungen tauschen',
'dashboard.aria.addTimezone': 'Zeitzone hinzufügen',
'dashboard.aria.removeTimezone': '{city} entfernen',
};
export default dashboard;