Files
music-hub/apps/web/src/routes/auth/verify/+page.svelte
Robin Choice 8bf72c2482 Full MVP: workspace layout, visual refresh, PWA, production deploy
Major changes since initial commit:

Schema: version branching (parentVersionId, branchLabel), share links,
guest comments, track status enum (sketch/in_progress/final/released),
track sections, cover art for projects and tracks.

API: 29+ endpoints — auth, projects, tracks, versions, comments, share
links (public + management), uploads (cover), activity feed, onboarding
demo seed. Email templates in German with brand styling.

Web: SvelteKit 5 workspace layout with persistent sidebar, breadcrumb
top-bar, collapsible right panel. SoundCloud-style waveform player with
round play button, avatar comment markers, keyboard shortcuts (Space/JKL/C).
Full German UI. Cover art with gradient fallback. Track status pills.
Activity feed dashboard. Welcome modal with demo-seed trigger. Landing
page with 7-section scroll layout. Login on /login. Public /listen/:token
page for guest feedback.

Visual: Inter Variable font, Magenta→Orange gradient accent, warm dark
neutrals, Lucide-style inline SVG icon set, spring animations on modals,
glass-effect toasts, responsive from 360px to 2560px+.

PWA: manifest, service worker, icons, iOS/Android installable.

Production: adapter-node, server-side API proxy hook, docker-compose with
Postgres + MinIO + auto-migration + health checks. Env example included.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 11:47:48 +02:00

57 lines
1.0 KiB
Svelte

<script lang="ts">
import { onMount } from 'svelte';
import { goto } from '$app/navigation';
import { page } from '$app/stores';
import { verifyToken } from '$lib/stores/auth.js';
let error = $state('');
onMount(async () => {
const token = $page.url.searchParams.get('token');
if (!token) {
error = 'Kein Token angegeben';
return;
}
try {
await verifyToken(token);
goto('/dashboard');
} catch (err) {
error = err instanceof Error ? err.message : 'Login fehlgeschlagen';
}
});
</script>
<div class="verify-page">
{#if error}
<div class="error-card">
<h2>Login fehlgeschlagen</h2>
<p>{error}</p>
<a href="/login">Erneut versuchen</a>
</div>
{:else}
<p>Login läuft…</p>
{/if}
</div>
<style>
.verify-page {
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
color: #888;
}
.error-card {
text-align: center;
}
.error-card h2 {
color: #ef4444;
}
a {
color: #6366f1;
}
</style>