From 76ae64a4d63a0f4c91ada83038eb7634e6d255b8 Mon Sep 17 00:00:00 2001 From: Till JS Date: Wed, 1 Apr 2026 21:52:16 +0200 Subject: [PATCH] =?UTF-8?q?fix(manacore/web):=20build=20fixes=20for=20unif?= =?UTF-8?q?ied=20app=20=E2=80=94=20toast=20store,=20Svelte=205=20syntax,?= =?UTF-8?q?=20icon=20imports?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add missing toast.svelte.ts store for zitare module, fix onclick|stopPropagation to Svelte 5 syntax in calendar, replace non-existent StarFill with Star weight="fill" in contacts, fix calc skins import path, add app-specific shared packages to vite config, and improve login error handling for invalid credentials. Co-Authored-By: Claude Opus 4.6 (1M context) --- apps/manacore/apps/web/package.json | 3 + .../apps/web/src/lib/stores/toast.svelte.ts | 33 ++++ .../routes/(app)/calc/standard/+page.svelte | 2 +- .../src/routes/(app)/calendar/+page.svelte | 5 +- .../src/routes/(app)/contacts/+page.svelte | 5 +- .../routes/(app)/contacts/[id]/+page.svelte | 5 +- apps/manacore/apps/web/vite.config.ts | 7 +- .../shared-auth-ui/src/pages/LoginPage.svelte | 9 +- pnpm-lock.yaml | 152 ++---------------- 9 files changed, 67 insertions(+), 154 deletions(-) create mode 100644 apps/manacore/apps/web/src/lib/stores/toast.svelte.ts diff --git a/apps/manacore/apps/web/package.json b/apps/manacore/apps/web/package.json index 84db01a76..26ed35436 100644 --- a/apps/manacore/apps/web/package.json +++ b/apps/manacore/apps/web/package.json @@ -67,6 +67,9 @@ "@manacore/shared-ui": "workspace:*", "@manacore/shared-utils": "workspace:*", "@manacore/wallpaper-generator": "workspace:*", + "@calc/shared": "workspace:*", + "@clock/shared": "workspace:*", + "@zitare/content": "workspace:*", "date-fns": "^4.1.0", "svelte-dnd-action": "^0.9.68", "svelte-i18n": "^4.0.0" diff --git a/apps/manacore/apps/web/src/lib/stores/toast.svelte.ts b/apps/manacore/apps/web/src/lib/stores/toast.svelte.ts new file mode 100644 index 000000000..a4a1a79dd --- /dev/null +++ b/apps/manacore/apps/web/src/lib/stores/toast.svelte.ts @@ -0,0 +1,33 @@ +// Simple toast notification store + +type ToastType = 'success' | 'error' | 'info' | 'warning'; + +interface Toast { + id: string; + message: string; + type: ToastType; +} + +let toasts = $state([]); + +function addToast(message: string, type: ToastType = 'info', duration = 3000) { + const id = crypto.randomUUID(); + toasts = [...toasts, { id, message, type }]; + + setTimeout(() => { + toasts = toasts.filter((t) => t.id !== id); + }, duration); +} + +export const toast = { + get toasts() { + return toasts; + }, + success: (message: string) => addToast(message, 'success'), + error: (message: string) => addToast(message, 'error'), + info: (message: string) => addToast(message, 'info'), + warning: (message: string) => addToast(message, 'warning'), + dismiss: (id: string) => { + toasts = toasts.filter((t) => t.id !== id); + }, +}; diff --git a/apps/manacore/apps/web/src/routes/(app)/calc/standard/+page.svelte b/apps/manacore/apps/web/src/routes/(app)/calc/standard/+page.svelte index 6a7509f2f..494c4e39b 100644 --- a/apps/manacore/apps/web/src/routes/(app)/calc/standard/+page.svelte +++ b/apps/manacore/apps/web/src/routes/(app)/calc/standard/+page.svelte @@ -10,7 +10,7 @@ CasioSkin, TI84Skin, MinimalSkin, - } from '$lib/modules/calc/components/skins'; + } from '$lib/modules/calc/components'; const allCalculations = useAllCalculations(); diff --git a/apps/manacore/apps/web/src/routes/(app)/calendar/+page.svelte b/apps/manacore/apps/web/src/routes/(app)/calendar/+page.svelte index 3a7b4c54b..c5e2cea45 100644 --- a/apps/manacore/apps/web/src/routes/(app)/calendar/+page.svelte +++ b/apps/manacore/apps/web/src/routes/(app)/calendar/+page.svelte @@ -291,7 +291,10 @@ )}" role="button" tabindex="0" - onclick|stopPropagation={() => openEditEvent(event)} + onclick={(e) => { + e.stopPropagation(); + openEditEvent(event); + }} onkeydown={(e) => e.key === 'Enter' && openEditEvent(event)} > {event.title} diff --git a/apps/manacore/apps/web/src/routes/(app)/contacts/+page.svelte b/apps/manacore/apps/web/src/routes/(app)/contacts/+page.svelte index ea08f4c08..b448bc6bc 100644 --- a/apps/manacore/apps/web/src/routes/(app)/contacts/+page.svelte +++ b/apps/manacore/apps/web/src/routes/(app)/contacts/+page.svelte @@ -22,7 +22,6 @@ MagnifyingGlass, Plus, Star, - StarFill, Archive, Trash, PencilSimple, @@ -260,7 +259,7 @@ {getDisplayName(contact)} {#if contact.isFavorite} - + {/if} {#if contact.company || contact.jobTitle} @@ -290,7 +289,7 @@ title={contact.isFavorite ? 'Favorit entfernen' : 'Zu Favoriten'} > {#if contact.isFavorite} - + {:else} {/if} diff --git a/apps/manacore/apps/web/src/routes/(app)/contacts/[id]/+page.svelte b/apps/manacore/apps/web/src/routes/(app)/contacts/[id]/+page.svelte index 69e167698..ff20856e6 100644 --- a/apps/manacore/apps/web/src/routes/(app)/contacts/[id]/+page.svelte +++ b/apps/manacore/apps/web/src/routes/(app)/contacts/[id]/+page.svelte @@ -7,7 +7,6 @@ import { CaretLeft, Star, - StarFill, Archive, Trash, PencilSimple, @@ -132,7 +131,7 @@

{getDisplayName(contact)}

{#if contact.isFavorite} - + {/if}
{#if contact.company || contact.jobTitle} @@ -157,7 +156,7 @@ title={contact.isFavorite ? 'Favorit entfernen' : 'Zu Favoriten'} > {#if contact.isFavorite} - + {:else} {/if} diff --git a/apps/manacore/apps/web/vite.config.ts b/apps/manacore/apps/web/vite.config.ts index ec127b4fe..7cac68c14 100644 --- a/apps/manacore/apps/web/vite.config.ts +++ b/apps/manacore/apps/web/vite.config.ts @@ -5,6 +5,9 @@ import { SvelteKitPWA } from '@vite-pwa/sveltekit'; import { createPWAConfig } from '@manacore/shared-pwa'; import { MANACORE_SHARED_PACKAGES, getBuildDefines } from '@manacore/shared-vite-config'; +/** App-specific shared packages used by migrated modules */ +const APP_SHARED_PACKAGES = ['@clock/shared', '@zitare/content', '@calc/shared']; + export default defineConfig({ plugins: [ tailwindcss(), @@ -27,10 +30,10 @@ export default defineConfig({ strictPort: true, }, ssr: { - noExternal: [...MANACORE_SHARED_PACKAGES], + noExternal: [...MANACORE_SHARED_PACKAGES, ...APP_SHARED_PACKAGES], }, optimizeDeps: { - exclude: [...MANACORE_SHARED_PACKAGES], + exclude: [...MANACORE_SHARED_PACKAGES, ...APP_SHARED_PACKAGES], }, define: { ...getBuildDefines(), diff --git a/packages/shared-auth-ui/src/pages/LoginPage.svelte b/packages/shared-auth-ui/src/pages/LoginPage.svelte index a953eb0f5..de37b9210 100644 --- a/packages/shared-auth-ui/src/pages/LoginPage.svelte +++ b/packages/shared-auth-ui/src/pages/LoginPage.svelte @@ -23,6 +23,7 @@ emailInvalid: string; passwordRequired: string; signInFailed: string; + invalidCredentials?: string; signInSuccess: string; emailVerified?: string; emailNotVerified?: string; @@ -68,6 +69,7 @@ emailInvalid: 'Please enter a valid email address', passwordRequired: 'Password is required', signInFailed: 'Sign in failed', + invalidCredentials: 'Invalid email or password', signInSuccess: 'Successfully signed in. Redirecting...', emailVerified: 'Email successfully verified! Please sign in.', emailNotVerified: 'Email not verified.', @@ -308,7 +310,12 @@ showEmailNotVerified = true; setError(t.emailNotVerified || 'Email not verified.', 'general'); } else { - setError(result.error || t.signInFailed, 'general'); + const errorMsg = (() => { + if (result.error === 'INVALID_CREDENTIALS') return t.invalidCredentials || t.signInFailed; + if (result.error === 'EMAIL_NOT_VERIFIED') return t.emailNotVerified || t.signInFailed; + return result.error || t.signInFailed; + })(); + setError(errorMsg, 'general'); // Detect rate limiting vs account lockout if (result.error?.includes('Too Many') || result.error?.includes('rate limit')) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 71d9a62ab..aab6a383c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2339,6 +2339,12 @@ importers: apps/manacore/apps/web: dependencies: + '@calc/shared': + specifier: workspace:* + version: link:../../../calc/packages/shared + '@clock/shared': + specifier: workspace:* + version: link:../../../clock/packages/shared '@manacore/credits': specifier: workspace:^ version: link:../../../../packages/credits @@ -2414,6 +2420,9 @@ importers: '@manacore/wallpaper-generator': specifier: workspace:* version: link:../../../../packages/wallpaper-generator + '@zitare/content': + specifier: workspace:* + version: link:../../../zitare/packages/content date-fns: specifier: ^4.1.0 version: 4.1.0 @@ -2897,9 +2906,6 @@ importers: typescript: specifier: ^5.5.0 version: 5.9.3 - vitest: - specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) apps/memoro/apps/landing: dependencies: @@ -14453,9 +14459,6 @@ packages: '@vitest/expect@4.1.1': resolution: {integrity: sha512-xAV0fqBTk44Rn6SjJReEQkHP3RrqbJo6JQ4zZ7/uVOiJZRarBtblzrOfFIZeYUrukp2YD6snZG6IBqhOoHTm+A==} - '@vitest/expect@4.1.2': - resolution: {integrity: sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==} - '@vitest/mocker@2.1.9': resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} peerDependencies: @@ -14522,17 +14525,6 @@ packages: vite: optional: true - '@vitest/mocker@4.1.2': - resolution: {integrity: sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==} - peerDependencies: - msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - '@vitest/pretty-format@2.1.9': resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} @@ -14551,9 +14543,6 @@ packages: '@vitest/pretty-format@4.1.1': resolution: {integrity: sha512-GM+TEQN5WhOygr1lp7skeVjdLPqqWMHsfzXrcHAqZJi/lIVh63H0kaRCY8MDhNWikx19zBUK8ceaLB7X5AH9NQ==} - '@vitest/pretty-format@4.1.2': - resolution: {integrity: sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==} - '@vitest/runner@1.6.1': resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} @@ -14575,9 +14564,6 @@ packages: '@vitest/runner@4.1.1': resolution: {integrity: sha512-f7+FPy75vN91QGWsITueq0gedwUZy1fLtHOCMeQpjs8jTekAHeKP80zfDEnhrleviLHzVSDXIWuCIOFn3D3f8A==} - '@vitest/runner@4.1.2': - resolution: {integrity: sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==} - '@vitest/snapshot@1.6.1': resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} @@ -14599,9 +14585,6 @@ packages: '@vitest/snapshot@4.1.1': resolution: {integrity: sha512-kMVSgcegWV2FibXEx9p9WIKgje58lcTbXgnJixfcg15iK8nzCXhmalL0ZLtTWLW9PH1+1NEDShiFFedB3tEgWg==} - '@vitest/snapshot@4.1.2': - resolution: {integrity: sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==} - '@vitest/spy@1.6.1': resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} @@ -14623,9 +14606,6 @@ packages: '@vitest/spy@4.1.1': resolution: {integrity: sha512-6Ti/KT5OVaiupdIZEuZN7l3CZcR0cxnxt70Z0//3CtwgObwA6jZhmVBA3yrXSVN3gmwjgd7oDNLlsXz526gpRA==} - '@vitest/spy@4.1.2': - resolution: {integrity: sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==} - '@vitest/ui@3.2.4': resolution: {integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==} peerDependencies: @@ -14657,9 +14637,6 @@ packages: '@vitest/utils@4.1.1': resolution: {integrity: sha512-cNxAlaB3sHoCdL6pj6yyUXv9Gry1NHNg0kFTXdvSIZXLHsqKH7chiWOkwJ5s5+d/oMwcoG9T0bKU38JZWKusrQ==} - '@vitest/utils@4.1.2': - resolution: {integrity: sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==} - '@volar/kit@2.4.26': resolution: {integrity: sha512-shgNg7PbV8SIxxQLOQh5zMr8KV0JvdG9If0MwJb5L1HMrBU91jBxR0ANi2OJPMMme6/l1vIYm4hCaO6W2JaEcQ==} peerDependencies: @@ -23830,10 +23807,6 @@ packages: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} - tinyrainbow@3.1.0: - resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} - engines: {node: '>=14.0.0'} - tinyspy@2.2.1: resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} @@ -24938,41 +24911,6 @@ packages: jsdom: optional: true - vitest@4.1.2: - resolution: {integrity: sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.2 - '@vitest/browser-preview': 4.1.2 - '@vitest/browser-webdriverio': 4.1.2 - '@vitest/ui': 4.1.2 - happy-dom: '*' - jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@opentelemetry/api': - optional: true - '@types/node': - optional: true - '@vitest/browser-playwright': - optional: true - '@vitest/browser-preview': - optional: true - '@vitest/browser-webdriverio': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} @@ -37383,15 +37321,6 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/expect@4.1.2': - dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@vitest/spy': 4.1.2 - '@vitest/utils': 4.1.2 - chai: 6.2.2 - tinyrainbow: 3.1.0 - '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@20.19.25)(lightningcss@1.30.2)(terser@5.44.1))': dependencies: '@vitest/spy': 2.1.9 @@ -37489,14 +37418,6 @@ snapshots: optionalDependencies: vite: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) - '@vitest/mocker@4.1.2(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))': - dependencies: - '@vitest/spy': 4.1.2 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) - '@vitest/pretty-format@2.1.9': dependencies: tinyrainbow: 1.2.0 @@ -37521,10 +37442,6 @@ snapshots: dependencies: tinyrainbow: 3.0.3 - '@vitest/pretty-format@4.1.2': - dependencies: - tinyrainbow: 3.1.0 - '@vitest/runner@1.6.1': dependencies: '@vitest/utils': 1.6.1 @@ -37562,11 +37479,6 @@ snapshots: '@vitest/utils': 4.1.1 pathe: 2.0.3 - '@vitest/runner@4.1.2': - dependencies: - '@vitest/utils': 4.1.2 - pathe: 2.0.3 - '@vitest/snapshot@1.6.1': dependencies: magic-string: 0.30.21 @@ -37611,13 +37523,6 @@ snapshots: magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/snapshot@4.1.2': - dependencies: - '@vitest/pretty-format': 4.1.2 - '@vitest/utils': 4.1.2 - magic-string: 0.30.21 - pathe: 2.0.3 - '@vitest/spy@1.6.1': dependencies: tinyspy: 2.2.1 @@ -37638,8 +37543,6 @@ snapshots: '@vitest/spy@4.1.1': {} - '@vitest/spy@4.1.2': {} - '@vitest/ui@3.2.4(vitest@3.2.4)': dependencies: '@vitest/utils': 3.2.4 @@ -37704,12 +37607,6 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.0.3 - '@vitest/utils@4.1.2': - dependencies: - '@vitest/pretty-format': 4.1.2 - convert-source-map: 2.0.0 - tinyrainbow: 3.1.0 - '@volar/kit@2.4.26(typescript@5.9.3)': dependencies: '@volar/language-service': 2.4.26 @@ -52431,8 +52328,6 @@ snapshots: tinyrainbow@3.0.3: {} - tinyrainbow@3.1.0: {} - tinyspy@2.2.1: {} tinyspy@3.0.2: {} @@ -54181,35 +54076,6 @@ snapshots: transitivePeerDependencies: - msw - vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)): - dependencies: - '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.2 - '@vitest/runner': 4.1.2 - '@vitest/snapshot': 4.1.2 - '@vitest/spy': 4.1.2 - '@vitest/utils': 4.1.2 - es-module-lexer: 2.0.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.1 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 4.0.0 - tinybench: 2.9.0 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 - tinyrainbow: 3.1.0 - vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) - why-is-node-running: 2.3.0 - optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@types/node': 20.19.25 - jsdom: 29.0.1(@noble/hashes@2.0.1) - transitivePeerDependencies: - - msw - vlq@1.0.1: {} void-elements@3.1.0: {}