diff --git a/frontend/src/index.jsx b/frontend/src/index.jsx
index 0248042..3a5b0a1 100644
--- a/frontend/src/index.jsx
+++ b/frontend/src/index.jsx
@@ -17,6 +17,7 @@ import {
Outlet,
useLocation,
useNavigate,
+ useMatch,
matchPath,
} from 'react-router-dom';
import './styles.css';
@@ -397,6 +398,13 @@ const AppLayout = () => {
const [searchQuery, setSearchQuery] = useState('');
const [activeTagFilters, setActiveTagFilters] = useState([]);
const [activeCorrespondentFilters, setActiveCorrespondentFilters] = useState([]);
+ const documentsRouteMatch = useMatch('/documents');
+ const documentsFolderRouteMatch = useMatch('/documents/folder/:folderId');
+ const tagsRouteMatch = useMatch('/tags');
+ const correspondentsRouteMatch = useMatch('/correspondents');
+ const isDocumentsRoute = Boolean(documentsRouteMatch || documentsFolderRouteMatch);
+ const isTagsRoute = Boolean(tagsRouteMatch);
+ const isCorrespondentsRoute = Boolean(correspondentsRouteMatch);
const toggleTagFilter = useCallback((tagId) => {
if (!tagId) return;
setActiveTagFilters((previous) =>
@@ -4239,11 +4247,9 @@ const AppLayout = () => {
onFolderDragStart: handleFolderDragStart,
onFolderDragEnd: handleFolderDragEnd,
draggedFolderId,
- onShowTags: () => navigate('/tags'),
tags,
activeTagIds: activeTagFilters,
onToggleTagFilter: toggleTagFilter,
- onShowCorrespondents: () => navigate('/correspondents'),
correspondents,
activeCorrespondentIds: activeCorrespondentFilters,
onToggleCorrespondentFilter: toggleCorrespondentFilter,
@@ -4489,6 +4495,31 @@ const AppLayout = () => {
)}
+
+
+
+
+
{status && (
diff --git a/frontend/src/sidebar/Sidebar.jsx b/frontend/src/sidebar/Sidebar.jsx
index 22a44e6..d31c5b8 100644
--- a/frontend/src/sidebar/Sidebar.jsx
+++ b/frontend/src/sidebar/Sidebar.jsx
@@ -1,13 +1,5 @@
import React, { useCallback, useMemo } from 'react';
-import { useMatch } from 'react-router-dom';
-import {
- ChevronIcon,
- FolderIcon,
- TagIcon,
- TrashIcon,
- CorrespondentIcon,
- EditIcon,
-} from '../ui/icons';
+import { ChevronIcon, FolderIcon, TrashIcon, EditIcon } from '../ui/icons';
import { getTagColorStyle } from '../utils/colors';
const FolderNode = ({
@@ -137,21 +129,13 @@ const Sidebar = ({
onFolderDragStart,
onFolderDragEnd,
draggedFolderId,
- onShowTags,
tags = [],
activeTagIds = [],
onToggleTagFilter,
- onShowCorrespondents,
correspondents = [],
activeCorrespondentIds = [],
onToggleCorrespondentFilter,
}) => {
- const handleShowTags = onShowTags || (() => {});
- const tagsRouteMatch = useMatch('/tags');
- const isTagsRoute = Boolean(tagsRouteMatch);
- const handleShowCorrespondents = onShowCorrespondents || (() => {});
- const correspondentsRouteMatch = useMatch('/correspondents');
- const isCorrespondentsRoute = Boolean(correspondentsRouteMatch);
const sortedCorrespondents = useMemo(
() =>
[...correspondents].sort((a, b) =>
@@ -224,21 +208,6 @@ const Sidebar = ({
Tags
{tags.length}
-
{
- if (event.key === 'Enter' || event.key === ' ') {
- event.preventDefault();
- handleShowTags();
- }
- }}
- >
-
- All tags
-
{tags.length ? (
tags.map((tag) => {
@@ -269,25 +238,6 @@ const Sidebar = ({
Correspondents
{correspondents.length}
-
{
- onToggleCorrespondentFilter?.(null);
- handleShowCorrespondents();
- }}
- onKeyDown={(event) => {
- if (event.key === 'Enter' || event.key === ' ') {
- event.preventDefault();
- onToggleCorrespondentFilter?.(null);
- handleShowCorrespondents();
- }
- }}
- >
-
- All correspondents
-
{sortedCorrespondents.length ? (
sortedCorrespondents.map((correspondent) => {
diff --git a/frontend/src/styles.css b/frontend/src/styles.css
index 9a5e176..2dd43b3 100644
--- a/frontend/src/styles.css
+++ b/frontend/src/styles.css
@@ -306,6 +306,47 @@ button.icon-button.ghost:hover:not([disabled]) {
margin-left: auto;
}
+.app-bar__links {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.app-bar__link {
+ border: none;
+ background: transparent;
+ color: var(--muted);
+ font: inherit;
+ padding: 0.3rem 0.65rem;
+ border-radius: 999px;
+ cursor: pointer;
+ display: inline-flex;
+ align-items: center;
+ gap: 0.35rem;
+ transition: background 0.15s ease, color 0.15s ease;
+}
+
+.app-bar__link:hover {
+ background: var(--sidebar-hover-bg);
+ color: var(--fg);
+}
+
+.app-bar__link:focus-visible {
+ outline: 2px solid var(--accent);
+ outline-offset: 2px;
+}
+
+.app-bar__link.active {
+ background: var(--sidebar-active-bg);
+ color: var(--fg);
+ font-weight: 600;
+}
+
+.app-bar__link-count {
+ font-size: 0.75rem;
+ color: var(--muted);
+}
+
.app-main {
flex: 1;
display: grid;