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 @@
-
-
+
-
-
-
-
-
+
+
-
-
-
- {{ result.title }}
-
-
-
-
- Diagram
-
-
-
- {{ result.boatMake }} {{ result.boatModel }}
-
-
-
- Page {{ result.pageNumber }}
-
-
-
-
+
+
-
-
-
+
+
+
+
+
+
-
+
@@ -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(() => {
}
})
+
+