7a34807fa0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
88 lines
3.8 KiB
Vue
88 lines
3.8 KiB
Vue
<template>
|
|
<aside class="w-64 bg-white border-r border-gray-200 flex flex-col h-full shrink-0">
|
|
<!-- Logo -->
|
|
<div class="px-6 py-5 border-b border-gray-100">
|
|
<h1 class="text-lg font-bold text-indigo-600 tracking-tight">DocScanner</h1>
|
|
<p class="text-xs text-gray-400 mt-0.5">AI Document Classifier</p>
|
|
</div>
|
|
|
|
<!-- Nav -->
|
|
<nav class="flex-1 px-3 py-4 overflow-y-auto">
|
|
<router-link
|
|
to="/"
|
|
class="nav-link"
|
|
:class="{ 'nav-link-active': $route.path === '/' }"
|
|
>
|
|
<svg class="w-4 h-4 mr-2 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" />
|
|
</svg>
|
|
Home
|
|
</router-link>
|
|
|
|
<router-link
|
|
to="/topics"
|
|
class="nav-link"
|
|
:class="{ 'nav-link-active': $route.path.startsWith('/topics') }"
|
|
>
|
|
<svg class="w-4 h-4 mr-2 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
d="M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z" />
|
|
</svg>
|
|
All Topics
|
|
</router-link>
|
|
|
|
<!-- Topics list -->
|
|
<div class="mt-3">
|
|
<p class="px-3 text-xs font-semibold text-gray-400 uppercase tracking-wider mb-1">Topics</p>
|
|
<div v-if="topicsStore.loading" class="px-3 py-1 text-xs text-gray-400">Loading…</div>
|
|
<div v-else-if="topicsStore.topics.length === 0" class="px-3 py-1 text-xs text-gray-400">No topics yet</div>
|
|
<router-link
|
|
v-for="topic in topicsStore.topics"
|
|
:key="topic.id"
|
|
:to="`/topics/${encodeURIComponent(topic.name)}`"
|
|
class="nav-link text-sm"
|
|
:class="{ 'nav-link-active': $route.params.name === topic.name }"
|
|
>
|
|
<span
|
|
class="w-2.5 h-2.5 rounded-full mr-2 shrink-0"
|
|
:style="{ backgroundColor: topic.color }"
|
|
></span>
|
|
<span class="truncate">{{ topic.name }}</span>
|
|
<span class="ml-auto text-xs text-gray-400">{{ topic.doc_count }}</span>
|
|
</router-link>
|
|
</div>
|
|
</nav>
|
|
|
|
<!-- Settings link -->
|
|
<div class="px-3 py-4 border-t border-gray-100">
|
|
<router-link
|
|
to="/settings"
|
|
class="nav-link"
|
|
:class="{ 'nav-link-active': $route.path === '/settings' }"
|
|
>
|
|
<svg class="w-4 h-4 mr-2 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
|
|
</svg>
|
|
Settings
|
|
</router-link>
|
|
</div>
|
|
</aside>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { useTopicsStore } from '../../stores/topics.js'
|
|
const topicsStore = useTopicsStore()
|
|
</script>
|
|
|
|
<style scoped>
|
|
.nav-link {
|
|
@apply flex items-center px-3 py-2 rounded-lg text-gray-600 hover:bg-gray-100 hover:text-gray-900 transition-colors text-sm font-medium;
|
|
}
|
|
.nav-link-active {
|
|
@apply bg-indigo-50 text-indigo-700;
|
|
}
|
|
</style>
|