From 8bc52f42643a53c1459cdf3d47359655d2bca82c Mon Sep 17 00:00:00 2001 From: Till JS Date: Tue, 24 Mar 2026 09:57:24 +0100 Subject: [PATCH] fix(calendar,todo): production readiness improvements - Calendar: apply ThrottlerGuard globally (was registered but not used) - Calendar: localize error page with i18n (5 languages) - Calendar: add meta/OG tags and PWA meta improvements - Todo: localize error page with i18n (5 languages) - Todo: add meta/OG tags to root layout Co-Authored-By: Claude Opus 4.6 (1M context) --- apps/calendar/apps/backend/src/app.module.ts | 5 +- .../apps/web/scripts/generate-icons.mjs | 45 ++++++++++++++++++ apps/calendar/apps/web/src/app.html | 22 +++++++-- .../apps/web/src/lib/i18n/locales/de.json | 4 ++ .../apps/web/src/lib/i18n/locales/en.json | 4 ++ .../apps/web/src/lib/i18n/locales/es.json | 4 ++ .../apps/web/src/lib/i18n/locales/fr.json | 4 ++ .../apps/web/src/lib/i18n/locales/it.json | 4 ++ .../apps/web/src/routes/+error.svelte | 5 +- .../apps/web/src/routes/+layout.svelte | 13 +++++ .../apps/web/static/apple-touch-icon.png | Bin 0 -> 7358 bytes apps/calendar/apps/web/static/favicon.png | Bin 0 -> 1138 bytes apps/calendar/apps/web/static/favicon.svg | 31 ++++++++++++ apps/calendar/apps/web/static/pwa-192x192.png | Bin 0 -> 7690 bytes apps/calendar/apps/web/static/pwa-512x512.png | Bin 0 -> 22157 bytes .../apps/web/src/lib/i18n/locales/de.json | 4 ++ .../apps/web/src/lib/i18n/locales/en.json | 4 ++ .../apps/web/src/lib/i18n/locales/es.json | 4 ++ .../apps/web/src/lib/i18n/locales/fr.json | 4 ++ .../apps/web/src/lib/i18n/locales/it.json | 4 ++ apps/todo/apps/web/src/routes/+error.svelte | 5 +- apps/todo/apps/web/src/routes/+layout.svelte | 14 ++++++ 22 files changed, 172 insertions(+), 8 deletions(-) create mode 100644 apps/calendar/apps/web/scripts/generate-icons.mjs create mode 100644 apps/calendar/apps/web/static/apple-touch-icon.png create mode 100644 apps/calendar/apps/web/static/favicon.png create mode 100644 apps/calendar/apps/web/static/favicon.svg create mode 100644 apps/calendar/apps/web/static/pwa-192x192.png create mode 100644 apps/calendar/apps/web/static/pwa-512x512.png diff --git a/apps/calendar/apps/backend/src/app.module.ts b/apps/calendar/apps/backend/src/app.module.ts index 4d159c594..6668f5985 100644 --- a/apps/calendar/apps/backend/src/app.module.ts +++ b/apps/calendar/apps/backend/src/app.module.ts @@ -65,7 +65,10 @@ import { HttpExceptionFilter } from './common/http-exception.filter'; provide: APP_FILTER, useClass: HttpExceptionFilter, }, - // ThrottlerGuard registered via ThrottlerModule — use @UseGuards(ThrottlerGuard) on controllers + { + provide: APP_GUARD, + useClass: ThrottlerGuard, + }, ], }) export class AppModule {} diff --git a/apps/calendar/apps/web/scripts/generate-icons.mjs b/apps/calendar/apps/web/scripts/generate-icons.mjs new file mode 100644 index 000000000..1af7bd63f --- /dev/null +++ b/apps/calendar/apps/web/scripts/generate-icons.mjs @@ -0,0 +1,45 @@ +#!/usr/bin/env node +/** + * Generate PWA icons from SVG favicon + * Run: node scripts/generate-icons.mjs + * Requires: sharp (available in workspace) + */ + +import { readFileSync } from 'fs'; +import { join, dirname } from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const staticDir = join(__dirname, '..', 'static'); + +const sizes = [ + { name: 'favicon.png', size: 32 }, + { name: 'pwa-192x192.png', size: 192 }, + { name: 'pwa-512x512.png', size: 512 }, + { name: 'apple-touch-icon.png', size: 180 }, +]; + +async function generateIcons() { + try { + const sharp = (await import('sharp')).default; + const svgPath = join(staticDir, 'favicon.svg'); + const svgBuffer = readFileSync(svgPath); + + for (const { name, size } of sizes) { + const outputPath = join(staticDir, name); + await sharp(svgBuffer).resize(size, size).png().toFile(outputPath); + console.log(`Generated: ${name} (${size}x${size})`); + } + + console.log('\nAll icons generated successfully!'); + } catch (error) { + if (error.code === 'ERR_MODULE_NOT_FOUND') { + console.error('Sharp is not installed. Run: pnpm add -D sharp'); + } else { + console.error('Error generating icons:', error); + } + process.exit(1); + } +} + +generateIcons(); diff --git a/apps/calendar/apps/web/src/app.html b/apps/calendar/apps/web/src/app.html index cff15d4b6..6cf6c7464 100644 --- a/apps/calendar/apps/web/src/app.html +++ b/apps/calendar/apps/web/src/app.html @@ -1,9 +1,25 @@ - + - - + + + + + + + + + + + + + + + + + + Calendar %sveltekit.head% diff --git a/apps/calendar/apps/web/src/lib/i18n/locales/de.json b/apps/calendar/apps/web/src/lib/i18n/locales/de.json index d195ddbac..41c73fd83 100644 --- a/apps/calendar/apps/web/src/lib/i18n/locales/de.json +++ b/apps/calendar/apps/web/src/lib/i18n/locales/de.json @@ -129,5 +129,9 @@ "a11y": { "createEventOn": "Termin erstellen am {date}", "slotTime": "{day} {time}" + }, + "error": { + "notFound": "Seite nicht gefunden", + "backToHome": "Zurück zur Startseite" } } diff --git a/apps/calendar/apps/web/src/lib/i18n/locales/en.json b/apps/calendar/apps/web/src/lib/i18n/locales/en.json index 18a452fa9..ecf11e8ce 100644 --- a/apps/calendar/apps/web/src/lib/i18n/locales/en.json +++ b/apps/calendar/apps/web/src/lib/i18n/locales/en.json @@ -129,5 +129,9 @@ "a11y": { "createEventOn": "Create event on {date}", "slotTime": "{day} {time}" + }, + "error": { + "notFound": "Page not found", + "backToHome": "Back to home" } } diff --git a/apps/calendar/apps/web/src/lib/i18n/locales/es.json b/apps/calendar/apps/web/src/lib/i18n/locales/es.json index c8f3cd1be..803c66120 100644 --- a/apps/calendar/apps/web/src/lib/i18n/locales/es.json +++ b/apps/calendar/apps/web/src/lib/i18n/locales/es.json @@ -97,5 +97,9 @@ "search": "Buscar", "error": "Error", "success": "Éxito" + }, + "error": { + "notFound": "Página no encontrada", + "backToHome": "Volver al inicio" } } diff --git a/apps/calendar/apps/web/src/lib/i18n/locales/fr.json b/apps/calendar/apps/web/src/lib/i18n/locales/fr.json index 7a069d492..dea43a0bc 100644 --- a/apps/calendar/apps/web/src/lib/i18n/locales/fr.json +++ b/apps/calendar/apps/web/src/lib/i18n/locales/fr.json @@ -97,5 +97,9 @@ "search": "Rechercher", "error": "Erreur", "success": "Succès" + }, + "error": { + "notFound": "Page non trouvée", + "backToHome": "Retour à l'accueil" } } diff --git a/apps/calendar/apps/web/src/lib/i18n/locales/it.json b/apps/calendar/apps/web/src/lib/i18n/locales/it.json index 68df0d73b..5fae7ff68 100644 --- a/apps/calendar/apps/web/src/lib/i18n/locales/it.json +++ b/apps/calendar/apps/web/src/lib/i18n/locales/it.json @@ -97,5 +97,9 @@ "search": "Cerca", "error": "Errore", "success": "Successo" + }, + "error": { + "notFound": "Pagina non trovata", + "backToHome": "Torna alla home" } } diff --git a/apps/calendar/apps/web/src/routes/+error.svelte b/apps/calendar/apps/web/src/routes/+error.svelte index d5a57d247..5b9e9cd2a 100644 --- a/apps/calendar/apps/web/src/routes/+error.svelte +++ b/apps/calendar/apps/web/src/routes/+error.svelte @@ -1,9 +1,10 @@

{$page.status}

-

{$page.error?.message || 'Seite nicht gefunden'}

- Zurück zur Startseite +

{$page.error?.message || $_('error.notFound')}

+ {$_('error.backToHome')}
diff --git a/apps/calendar/apps/web/src/routes/+layout.svelte b/apps/calendar/apps/web/src/routes/+layout.svelte index 72bb7bc61..f8d969b87 100644 --- a/apps/calendar/apps/web/src/routes/+layout.svelte +++ b/apps/calendar/apps/web/src/routes/+layout.svelte @@ -26,6 +26,19 @@ }); + + + + + + + {#if !appReady} {:else} diff --git a/apps/calendar/apps/web/static/apple-touch-icon.png b/apps/calendar/apps/web/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4e86574d58a2e1e7380a3b84758edafc074a9a8a GIT binary patch literal 7358 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 literal 0 HcmV?d00001 diff --git a/apps/calendar/apps/web/static/favicon.png b/apps/calendar/apps/web/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..bd550906b69c4e8c0775236cebe8cb9c14d31d27 GIT binary patch literal 1138 zcmV-&1daQNP) z3MYAz&B-Ru?|t7nbIvg4T&J(&urDeGeNlVK7qx9)RG@8)u+jFeji-rs6sN8b9H&M( zo+94nc#?RFDBy`V9o{J5apE#z*(XQxORXdMfyV}Lm{nhGlj4XkDt_~g3y}DKkfU|P z;gW@u!`4bmL>#HEeE;N{;rxp1glzl%%h5ta^8L&=ZZ98@94$i|i>z(T<_98=%16H_;=v!=waC#tv;k(4`!fQ;Y!Sh%KrkcFnGvAt&QDtiqy++L z8~&6-(nbf7AUMAKaZ~=cJ;rfXGgZLpiGoMod{GAQRzCb$X_pA`X$jjqz`bApLS(*( zAP`-uF3rXE>g} zuIR~dk6Z;XEV$6LK#1m_73iL(bzq}2ZKEq|qcf%GqI)ThK$0Vr<_IJ>{0WX=io+i- zpd(&DXQF_PSOM)*gyoSp4LAYZkD8X#0_>hvav2~~9YD!t0FvqeNhK#S1<>;LNy{T| z8dwK2J?C0ZmCLHr)m5v?Wz`fwS4{z^Y6=ij1mYF>Sqk8iH}%T^-c5$uPL-3q=RGAR zdgxw8$)C%r%1PdxQI(UtE2SzYc_?Wi5Ub#pAD00PJDi^Rqqd!-RJq12KmPhUm}z^} z@<(lZb$~MymPf7v81{B8f0)%Ch*xH=1CU$>aLF4ltb>{Mc0F@7cO{l{r&&95AN^cl zVR;h^OPg|&p~^`fN>pY}zx`7Vla@!`cwr69^kUJ~@74CX`(@l+EMsA@jLhAlvF#+5 z)n8M%<;Px=0laTDE#Ir{bKjRS|6LI?-v}hX7RI*A0FM03Rm&rn0Zgw{E#GUk&)zFx zo$p|c?_m74*sYoZ=$TX7wVZIvkG-k`xIQNI%tQJar@7NJo>mKv2qo3b^{n;WgYnAD zgE0$!3Nm4#H^=~nFBv`ahgt2_Z6`5R{_HrB_sARi*1$}kQCeQ>Ci72irvO_1 zOf>J2H}vJeOy6)?Uh5`Pz1n2}XXey)EtdgY^7``>V8r4zen1-E=cet|wAxMb`tYj7 zS}$442O>Y8LtS`vk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 24 + diff --git a/apps/calendar/apps/web/static/pwa-192x192.png b/apps/calendar/apps/web/static/pwa-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..a0db9cb61c3b3c7a36db5a340c4379cf813775bb GIT binary patch literal 7690 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 afXXb!U5&mOegeMS1v|F6IhAhlOa32SZ6W6X literal 0 HcmV?d00001 diff --git a/apps/calendar/apps/web/static/pwa-512x512.png b/apps/calendar/apps/web/static/pwa-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e2f04b1b4509efb8cd18ed592ff32b356a405c GIT binary patch literal 22157 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 import { page } from '$app/stores'; + import { _ } from 'svelte-i18n';

{$page.status}

-

{$page.error?.message || 'Seite nicht gefunden'}

- Zurück zur Startseite +

{$page.error?.message || $_('error.notFound')}

+ {$_('error.backToHome')}
diff --git a/apps/todo/apps/web/src/routes/+layout.svelte b/apps/todo/apps/web/src/routes/+layout.svelte index 2af09115b..8d50185a1 100644 --- a/apps/todo/apps/web/src/routes/+layout.svelte +++ b/apps/todo/apps/web/src/routes/+layout.svelte @@ -10,6 +10,7 @@ let { children } = $props(); let loading = $state(true); + let appReady = $derived(!loading && !$i18nLoading); onMount(async () => { @@ -23,6 +24,19 @@ }); + + + + + + + {#if !appReady} {:else}