diff --git a/apps/web/src/layout/Sidebar.tsx b/apps/web/src/layout/Sidebar.tsx
index 4f18822..84079ce 100644
--- a/apps/web/src/layout/Sidebar.tsx
+++ b/apps/web/src/layout/Sidebar.tsx
@@ -8,6 +8,7 @@ import type {
} from '@dorfteich/shared';
import { buildTree, collectSubtreeIds, labelDepth } from '@dorfteich/shared';
import { useQuery, useQueryClient } from '@tanstack/react-query';
+import { ChevronRight, FileText, Folder, FolderOpen } from 'lucide-react';
import { useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Link } from 'react-router-dom';
@@ -527,11 +528,14 @@ function PageTreeLevel(props: PageTreeLevelProps): React.JSX.Element {
)}
onClick={() => onToggleCollapsed(node.id)}
>
- ▸
+
) : (
)}
+
+ {hasChildren ? isCollapsed ? : : }
+
{canReorder && (
diff --git a/apps/web/src/styles/base.css b/apps/web/src/styles/base.css
index ec884b3..b7dc451 100644
--- a/apps/web/src/styles/base.css
+++ b/apps/web/src/styles/base.css
@@ -198,23 +198,40 @@ button {
white-space: nowrap;
}
+/* In the tree, the nested children is a SECOND flex item of the
+ .sidebar__page-item - . Stack it below the parent row (#122) — the
+ base rule's flex row centered the parent vertically BESIDE its children. */
+.sidebar__pages--tree .sidebar__page-item {
+ flex-direction: column;
+ align-items: stretch;
+ gap: 0;
+}
+
.sidebar__tree-children {
- margin: 0 0 0 var(--space-3);
+ /* Per-level indent: about two characters is plenty (#122). */
+ margin: 0 0 0 1.25em;
}
.sidebar__caret {
flex: 0 0 auto;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
width: 1rem;
border: 0;
background: none;
padding: 0;
cursor: pointer;
color: var(--color-text-muted);
- font-size: 0.7rem;
transform: rotate(90deg);
transition: transform 0.12s ease;
}
+.sidebar__caret svg {
+ width: 0.9rem;
+ height: 0.9rem;
+}
+
.sidebar__caret--collapsed {
transform: rotate(0deg);
}
@@ -223,6 +240,19 @@ button {
cursor: default;
}
+/* Folder pages vs. leaf pages read differently at a glance (#122). */
+.sidebar__page-icon {
+ flex: 0 0 auto;
+ display: inline-flex;
+ align-items: center;
+ color: var(--color-text-muted);
+}
+
+.sidebar__page-icon svg {
+ width: 0.875rem;
+ height: 0.875rem;
+}
+
/* Label view (issue #108): pages grouped under the label tree. */
.sidebar__label-group {
margin-bottom: var(--space-2);
@@ -322,11 +352,12 @@ button {
.sidebar__page {
display: block;
- padding: var(--space-1) var(--space-2);
+ /* Compact rows (#122): deep imported trees need to fit on one screen. */
+ padding: 0.125rem var(--space-2);
border-radius: var(--radius);
color: var(--color-text);
text-decoration: none;
- font-size: 0.95rem;
+ font-size: 0.875rem;
}
.sidebar__page:hover {