diff --git a/client/src/views/SearchView.vue b/client/src/views/SearchView.vue index 5308f95..1356df1 100644 --- a/client/src/views/SearchView.vue +++ b/client/src/views/SearchView.vue @@ -28,7 +28,7 @@ v-model="searchQuery" @input="performSearch" type="text" - class="w-full h-16 px-6 pr-14 rounded-2xl border-2 border-white/20 bg-white/10 backdrop-blur-lg text-white placeholder-white/50 shadow-lg focus:outline-none focus:border-pink-400 focus:ring-4 focus:ring-pink-400/20 transition-all duration-200 text-lg" + class="w-full h-12 px-5 pr-14 rounded-xl border-2 border-white/20 bg-white/10 backdrop-blur-lg text-white placeholder-white/50 shadow-lg focus:outline-none focus:border-pink-400 focus:ring-2 focus:ring-pink-400/20 transition-all duration-200" placeholder="Search your manuals..." autofocus /> @@ -61,69 +61,62 @@ -
-
+
-
-
- -
- -
-
- - - -
+ +
+ Page {{ result.pageNumber }} + · + + {{ result.boatMake }} {{ result.boatModel }} + + {{ result.title }} +
- -
-

- {{ result.title }} -

-
- - - - - Diagram - - - - - - {{ result.boatMake }} {{ result.boatModel }} - - - - - - Page {{ result.pageNumber }} - -
-

-
+ +

- -
- - - -
-
+ +
+ + Open page → +
+ + + -
+
@@ -164,6 +157,8 @@ const router = useRouter() const { results, loading, searchTime, search } = useSearch() const searchQuery = ref(route.query.q || '') +const activePreview = ref(null) +let previewTimer = null async function performSearch() { if (!searchQuery.value.trim()) { @@ -178,9 +173,33 @@ async function performSearch() { } } -function highlightMatch(text) { - // Meilisearch returns pre-highlighted text with tags - return text || '' +function formatSnippet(text) { + if (!text) return '' + + // Meilisearch returns tags, enhance them with bold + return text + .replace(//g, '') + .replace(/<\/mark>/g, '') +} + +function showPreview(id) { + clearTimeout(previewTimer) + previewTimer = setTimeout(() => { + activePreview.value = id + }, 300) +} + +function hidePreview(id) { + clearTimeout(previewTimer) + previewTimer = setTimeout(() => { + if (activePreview.value === id) { + activePreview.value = null + } + }, 300) +} + +function togglePreview(id) { + activePreview.value = activePreview.value === id ? null : id } function viewDocument(result) { @@ -195,8 +214,7 @@ function viewDocument(result) { } function handleImageError(event) { - // Hide broken image, show fallback icon instead - event.target.style.display = 'none' + event.target.closest('.nv-popover')?.remove() } // Watch for query changes from URL @@ -213,3 +231,147 @@ onMounted(() => { } }) + +