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