From 757d0493a07b8937c4c9af83b30211a0a470e38b Mon Sep 17 00:00:00 2001 From: Marcel Date: Mon, 30 Mar 2026 07:19:41 +0200 Subject: [PATCH] feat(admin): responsive entity nav and collapsible list panels (Phase 9) EntityNav: hidden on mobile, 48px icon strip at tablet (md), full labels+counts at desktop (lg). Each list panel collapses to a 32px handle via localStorage-persisted state; auto-collapses when navigating to the "+New" route. Mobile routing hides the list panel when a detail route is active. Co-Authored-By: Claude Sonnet 4.6 --- frontend/messages/de.json | 2 + frontend/messages/en.json | 2 + frontend/messages/es.json | 2 + frontend/src/routes/admin/+layout.svelte | 22 ++- frontend/src/routes/admin/EntityNav.svelte | 126 ++++++++++-- .../src/routes/admin/groups/+layout.svelte | 11 +- .../admin/groups/GroupsListPanel.svelte | 141 +++++++++----- .../routes/admin/groups/layout.svelte.spec.ts | 33 +++- frontend/src/routes/admin/tags/+layout.svelte | 10 +- .../routes/admin/tags/TagsListPanel.svelte | 102 +++++++--- .../routes/admin/tags/layout.svelte.spec.ts | 30 ++- .../src/routes/admin/users/+layout.svelte | 16 +- .../routes/admin/users/UsersListPanel.svelte | 182 +++++++++++------- .../routes/admin/users/layout.svelte.spec.ts | 39 +++- 14 files changed, 540 insertions(+), 178 deletions(-) diff --git a/frontend/messages/de.json b/frontend/messages/de.json index 9b24a14c..fdd201d6 100644 --- a/frontend/messages/de.json +++ b/frontend/messages/de.json @@ -161,6 +161,8 @@ "admin_tag_edit_heading": "Schlagwort: {name}", "admin_tag_updated": "Schlagwort umbenannt.", "admin_unsaved_warning": "Du hast ungespeicherte Änderungen – speichere oder verwerfe, bevor du wechselst.", + "admin_btn_collapse_list": "Liste einklappen", + "admin_btn_expand_list": "Liste ausklappen", "admin_btn_edit_tag_label": "Schlagwort bearbeiten", "admin_tag_delete_confirm": "Wirklich löschen? Das Schlagwort wird aus allen Dokumenten entfernt.", "admin_btn_delete_tag_label": "Schlagwort löschen", diff --git a/frontend/messages/en.json b/frontend/messages/en.json index eda45cda..3c501a2a 100644 --- a/frontend/messages/en.json +++ b/frontend/messages/en.json @@ -161,6 +161,8 @@ "admin_tag_edit_heading": "Tag: {name}", "admin_tag_updated": "Tag renamed.", "admin_unsaved_warning": "You have unsaved changes — save or discard before switching.", + "admin_btn_collapse_list": "Collapse list", + "admin_btn_expand_list": "Expand list", "admin_btn_edit_tag_label": "Edit tag", "admin_tag_delete_confirm": "Really delete? The tag will be removed from all documents.", "admin_btn_delete_tag_label": "Delete tag", diff --git a/frontend/messages/es.json b/frontend/messages/es.json index 49263510..b65254cf 100644 --- a/frontend/messages/es.json +++ b/frontend/messages/es.json @@ -161,6 +161,8 @@ "admin_tag_edit_heading": "Etiqueta: {name}", "admin_tag_updated": "Etiqueta renombrada.", "admin_unsaved_warning": "Tienes cambios sin guardar — guarda o descarta antes de cambiar.", + "admin_btn_collapse_list": "Contraer lista", + "admin_btn_expand_list": "Expandir lista", "admin_btn_edit_tag_label": "Editar etiqueta", "admin_tag_delete_confirm": "¿Realmente eliminar? La etiqueta se eliminará de todos los documentos.", "admin_btn_delete_tag_label": "Eliminar etiqueta", diff --git a/frontend/src/routes/admin/+layout.svelte b/frontend/src/routes/admin/+layout.svelte index 6c9558dd..ba3e1849 100644 --- a/frontend/src/routes/admin/+layout.svelte +++ b/frontend/src/routes/admin/+layout.svelte @@ -13,16 +13,18 @@ let { data, children } = $props(); Height fills from below the global header (64px) to bottom of viewport. -->
- - + +
diff --git a/frontend/src/routes/admin/EntityNav.svelte b/frontend/src/routes/admin/EntityNav.svelte index 36334284..f0c35b81 100644 --- a/frontend/src/routes/admin/EntityNav.svelte +++ b/frontend/src/routes/admin/EntityNav.svelte @@ -24,71 +24,154 @@ const currentPath = $derived(page.url.pathname); const isActive = (section: string) => currentPath.startsWith(`/admin/${section}`); -