diff --git a/neode-ui/package.json b/neode-ui/package.json index 7c5f58d2..f1bdb2fe 100644 --- a/neode-ui/package.json +++ b/neode-ui/package.json @@ -15,7 +15,8 @@ "build:docker": "vite build", "build:production": "NODE_ENV=production vue-tsc -b && vite build --mode production", "preview": "vite preview", - "type-check": "vue-tsc --noEmit" + "type-check": "vue-tsc --noEmit", + "prebuild": "cp ../../loop-start.mp3 public/assets/audio/ 2>/dev/null || true" }, "dependencies": { "dockerode": "^4.0.9", @@ -42,4 +43,4 @@ "vue-tsc": "^3.1.3", "ws": "^8.18.0" } -} +} \ No newline at end of file diff --git a/neode-ui/public/assets/audio/loop-start.mp3 b/neode-ui/public/assets/audio/loop-start.mp3 new file mode 100644 index 00000000..17ad6a34 Binary files /dev/null and b/neode-ui/public/assets/audio/loop-start.mp3 differ diff --git a/neode-ui/src/App.vue b/neode-ui/src/App.vue index de4a8b0f..e69b2be8 100644 --- a/neode-ui/src/App.vue +++ b/neode-ui/src/App.vue @@ -96,7 +96,7 @@ const isReady = ref(false) * - User has already seen the intro * - User is on a direct route (refresh/bookmark) */ -onMounted(() => { +onMounted(async () => { window.addEventListener('keydown', onKeyDown) const seenIntro = localStorage.getItem('neode_intro_seen') === '1' const isDirectRoute = route.path !== '/' @@ -104,8 +104,8 @@ onMounted(() => { if (seenIntro || isDirectRoute) { showSplash.value = false document.body.classList.add('splash-complete') - // Set isReady immediately for direct routes or when intro is already seen - // Router will handle navigation + // Wait for router to finish initial navigation before showing content (fixes hard refresh) + await router.isReady() isReady.value = true } // If splash should show, wait for it to complete diff --git a/neode-ui/src/components/SplashScreen.vue b/neode-ui/src/components/SplashScreen.vue index 4b078e5d..c966d6b7 100644 --- a/neode-ui/src/components/SplashScreen.vue +++ b/neode-ui/src/components/SplashScreen.vue @@ -96,9 +96,20 @@ + +
+

+ Tap to start +

+
+