Files
bookhoard/frontend/src/routes/+layout.svelte
T
john-okeefe ea70d85f9d docs: Update remaining application name references from 'ebook reader' to 'Bookmann'
- Updated COMPLETE_DOCUMENTATION.md feature descriptions
- Updated user journey reference from 'ebook library' to 'ebook collection'
- Updated all frontend page titles and headers
- Updated Bruno API collection and workspace names
- All references now consistently use 'Bookmann' as the application name
2026-01-21 20:03:30 -05:00

94 lines
2.9 KiB
Svelte

<script lang="ts">
import favicon from '$lib/assets/favicon.svg';
import { authStore } from '$lib/auth';
import { onMount } from 'svelte';
import { SvelteToast } from '@zerodevx/svelte-toast';
import '../app.css';
let { children } = $props();
// Initialize auth state on mount
onMount(() => {
authStore.initialize();
});
// Subscribe to auth state
let auth = $state({ user: null as any, token: null as string | null, loading: true });
authStore.subscribe((state) => {
auth = state;
});
function logout() {
authStore.logout();
}
</script>
<svelte:head>
<link rel="icon" href={favicon} />
</svelte:head>
{#if auth.loading}
<div class="min-h-screen flex items-center justify-center bg-gradient-to-br from-tokyo-bg to-tokyo-bg-dark">
<div class="text-center">
<div class="animate-spin rounded-full h-16 w-16 border-4 border-tokyo-bg-highlight border-t-tokyo-blue mx-auto mb-4"></div>
<p class="text-tokyo-fg-dark animate-pulse">Loading your library...</p>
</div>
</div>
{:else if !auth.token}
<!-- Auth required -->
<div class="min-h-screen flex items-center justify-center bg-gradient-to-br from-tokyo-bg to-tokyo-bg-dark">
<div class="text-center animate-slide-in">
<div class="mb-8">
<h1 class="text-4xl font-bold text-tokyo-fg mb-2">📚 Bookmann</h1>
<p class="text-tokyo-fg-dark text-lg">Your personal digital library</p>
</div>
<div class="space-x-6">
<a
href="/login"
class="btn-primary inline-flex items-center text-sm font-medium shadow-lg hover:shadow-tokyo-purple/25"
>
Sign In
</a>
<a
href="/register"
class="btn-secondary inline-flex items-center text-sm font-medium"
>
Create Account
</a>
</div>
<div class="mt-12 text-tokyo-fg-dark text-sm">
<p>Organize • Read • Enjoy</p>
</div>
</div>
</div>
{:else}
<!-- Authenticated user -->
<header class="bg-tokyo-bg-dark border-b border-tokyo-bg-highlight shadow-lg">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between items-center py-4">
<div class="flex items-center space-x-4">
<h1 class="text-2xl font-bold text-tokyo-fg">📚 Bookmann</h1>
<span class="hidden sm:inline text-sm text-tokyo-fg-dark"></span>
<span class="hidden sm:inline text-sm text-tokyo-fg-dark">Welcome back, {auth.user?.username}</span>
</div>
<div class="flex items-center space-x-4">
<span class="text-sm text-tokyo-fg">Hello, <span class="text-tokyo-cyan font-medium">{auth.user?.username}</span></span>
<button
onclick={logout}
class="btn-danger inline-flex items-center text-sm font-medium shadow-lg hover:shadow-tokyo-red/25 transition-all duration-200"
>
Sign Out
</button>
</div>
</div>
</div>
</header>
<main class="max-w-7xl mx-auto py-8 sm:px-6 lg:px-8 min-h-[calc(100vh-80px)]">
{@render children()}
</main>
{/if}
<!-- Toast notifications -->
<SvelteToast />