From 69d41d0b703ba376a939ed5574cf02a70c92fa8b Mon Sep 17 00:00:00 2001 From: Robin Choice Date: Thu, 23 Apr 2026 11:12:24 +0200 Subject: [PATCH] feat: onboarding flow + mobile bottom nav + mobile polish Co-Authored-By: Claude Sonnet 4.6 --- .../dashboard/OnboardingFlow.svelte | 567 ++++++++++++++++++ .../lib/components/workspace/BottomNav.svelte | 115 ++++ apps/web/src/routes/(app)/+layout.svelte | 8 + .../src/routes/(app)/dashboard/+page.svelte | 8 +- .../[projectId]/tracks/[trackId]/+page.svelte | 18 +- 5 files changed, 710 insertions(+), 6 deletions(-) create mode 100644 apps/web/src/lib/components/dashboard/OnboardingFlow.svelte create mode 100644 apps/web/src/lib/components/workspace/BottomNav.svelte diff --git a/apps/web/src/lib/components/dashboard/OnboardingFlow.svelte b/apps/web/src/lib/components/dashboard/OnboardingFlow.svelte new file mode 100644 index 0000000..15890e3 --- /dev/null +++ b/apps/web/src/lib/components/dashboard/OnboardingFlow.svelte @@ -0,0 +1,567 @@ + + +{#if open} + +{/if} + + diff --git a/apps/web/src/lib/components/workspace/BottomNav.svelte b/apps/web/src/lib/components/workspace/BottomNav.svelte new file mode 100644 index 0000000..de29644 --- /dev/null +++ b/apps/web/src/lib/components/workspace/BottomNav.svelte @@ -0,0 +1,115 @@ + + + + + diff --git a/apps/web/src/routes/(app)/+layout.svelte b/apps/web/src/routes/(app)/+layout.svelte index 01973bf..d3bdd43 100644 --- a/apps/web/src/routes/(app)/+layout.svelte +++ b/apps/web/src/routes/(app)/+layout.svelte @@ -3,6 +3,7 @@ import { goto } from '$app/navigation'; import { user, authLoading, checkAuth } from '$lib/stores/auth.js'; import Sidebar from '$lib/components/workspace/Sidebar.svelte'; + import BottomNav from '$lib/components/workspace/BottomNav.svelte'; import ShortcutsModal from '$lib/components/ui/ShortcutsModal.svelte'; import { onKey } from '$lib/utils/shortcuts.js'; @@ -43,6 +44,7 @@
{@render children()}
+ @@ -79,6 +81,12 @@ flex-direction: column; } + @media (max-width: 640px) { + .main { + padding-bottom: calc(56px + env(safe-area-inset-bottom, 0px)); + } + } + .backdrop { position: fixed; inset: 0; diff --git a/apps/web/src/routes/(app)/dashboard/+page.svelte b/apps/web/src/routes/(app)/dashboard/+page.svelte index 5fa70a0..0e824f9 100644 --- a/apps/web/src/routes/(app)/dashboard/+page.svelte +++ b/apps/web/src/routes/(app)/dashboard/+page.svelte @@ -6,7 +6,7 @@ import CoverImage from '$lib/components/ui/CoverImage.svelte'; import TopBar from '$lib/components/workspace/TopBar.svelte'; import ActivityItem from '$lib/components/dashboard/ActivityItem.svelte'; - import WelcomeModal from '$lib/components/dashboard/WelcomeModal.svelte'; + import OnboardingFlow from '$lib/components/dashboard/OnboardingFlow.svelte'; import { timeAgo } from '$lib/utils/format.js'; type ProjectMembership = { @@ -44,8 +44,8 @@ events = aRes.events; if (projects.length === 0) { - const dismissed = typeof localStorage !== 'undefined' && localStorage.getItem('welcome-dismissed') === '1'; - if (!dismissed) welcomeOpen = true; + const done = typeof localStorage !== 'undefined' && localStorage.getItem('onboarding-done') === '1'; + if (!done) welcomeOpen = true; } } finally { loading = false; @@ -148,7 +148,7 @@ {/if} - +