fix(manacore/web): build fixes for unified app — toast store, Svelte 5 syntax, icon imports

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) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-04-01 21:52:16 +02:00
parent 709e781ecd
commit 76ae64a4d6
9 changed files with 67 additions and 154 deletions

View file

@ -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"

View file

@ -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<Toast[]>([]);
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);
},
};

View file

@ -10,7 +10,7 @@
CasioSkin,
TI84Skin,
MinimalSkin,
} from '$lib/modules/calc/components/skins';
} from '$lib/modules/calc/components';
const allCalculations = useAllCalculations();

View file

@ -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}

View file

@ -22,7 +22,6 @@
MagnifyingGlass,
Plus,
Star,
StarFill,
Archive,
Trash,
PencilSimple,
@ -260,7 +259,7 @@
{getDisplayName(contact)}
</span>
{#if contact.isFavorite}
<StarFill size={14} class="flex-shrink-0 text-amber-500" />
<Star weight="fill" size={14} class="flex-shrink-0 text-amber-500" />
{/if}
</div>
{#if contact.company || contact.jobTitle}
@ -290,7 +289,7 @@
title={contact.isFavorite ? 'Favorit entfernen' : 'Zu Favoriten'}
>
{#if contact.isFavorite}
<StarFill size={14} />
<Star weight="fill" size={14} />
{:else}
<Star size={14} />
{/if}

View file

@ -7,7 +7,6 @@
import {
CaretLeft,
Star,
StarFill,
Archive,
Trash,
PencilSimple,
@ -132,7 +131,7 @@
<div class="flex items-center gap-2">
<h1 class="text-xl font-bold text-foreground">{getDisplayName(contact)}</h1>
{#if contact.isFavorite}
<StarFill size={18} class="text-amber-500" />
<Star weight="fill" size={18} class="text-amber-500" />
{/if}
</div>
{#if contact.company || contact.jobTitle}
@ -157,7 +156,7 @@
title={contact.isFavorite ? 'Favorit entfernen' : 'Zu Favoriten'}
>
{#if contact.isFavorite}
<StarFill size={18} class="text-amber-500" />
<Star weight="fill" size={18} class="text-amber-500" />
{:else}
<Star size={18} />
{/if}

View file

@ -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(),

View file

@ -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')) {

152
pnpm-lock.yaml generated
View file

@ -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: {}