From feaf4de7e0439de0304d58197603722f8e5abaa2 Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 17 Mar 2026 04:21:21 +0100 Subject: [PATCH] =?UTF-8?q?Menu=20:=20Bo=C3=AEte=20=C3=A0=20outils=20en=20?= =?UTF-8?q?premier=20+=20sidebar=20collapsible=20ic=C3=B4nes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Boîte à outils (/tools) en 1ère position dans la nav (desktop + mobile) - Sidebar desktop repliable (toggle pictos-only, 14rem → 3.75rem) - labels masqués par transition CSS fluide (max-width + opacity) - état persisté en localStorage (libred-sidebar-collapsed) - Page document : toggle Vue structurée / Aperçu document - sous-toggle En vigueur / Selon les votes - composant DocumentPreview (rendu PDF-like) - filigrane discret, items ordonnés par sort_order - mode projection : proposed_text substitu + encadrement orange - footer horodaté, print-friendly Co-Authored-By: Claude Sonnet 4.6 --- frontend/app/app.vue | 94 ++++- .../components/documents/DocumentPreview.vue | 347 ++++++++++++++++++ frontend/app/pages/documents/[slug].vue | 210 ++++++++++- frontend/app/stores/documents.ts | 28 ++ 4 files changed, 671 insertions(+), 8 deletions(-) create mode 100644 frontend/app/components/documents/DocumentPreview.vue diff --git a/frontend/app/app.vue b/frontend/app/app.vue index 3c4981c..cbb6bb2 100644 --- a/frontend/app/app.vue +++ b/frontend/app/app.vue @@ -4,6 +4,11 @@ const route = useRoute() const { initMood } = useMood() const navigationItems = [ + { + label: 'Boîte à outils', + icon: 'i-lucide-wrench', + to: '/tools', + }, { label: 'Documents', icon: 'i-lucide-book-open', @@ -34,6 +39,9 @@ const navigationItems = [ /** Mobile drawer state. */ const mobileMenuOpen = ref(false) +/** Sidebar collapse state (icons-only mode). */ +const sidebarCollapsed = ref(false) + /** Close mobile menu on route change. */ watch(() => route.path, () => { mobileMenuOpen.value = false @@ -43,8 +51,14 @@ watch(() => route.path, () => { const ws = useWebSocket() const { setupWsNotifications } = useNotifications() +watch(sidebarCollapsed, (val) => { + localStorage.setItem('libred-sidebar-collapsed', String(val)) +}) + onMounted(async () => { initMood() + const savedCollapsed = localStorage.getItem('libred-sidebar-collapsed') + if (savedCollapsed !== null) sidebarCollapsed.value = savedCollapsed === 'true' auth.hydrateFromStorage() if (auth.token) { try { @@ -177,7 +191,7 @@ function isActive(to: string) {
-