From 9db0829a7c2d6dd5b4e92bdf9f9807375db6f98f Mon Sep 17 00:00:00 2001 From: Shewart Date: Sat, 3 Oct 2026 00:55:48 +0200 Subject: [PATCH 1/6] fix(sidebar): link a folder's index page from its label instead of listing it twice A folder with an index.md showed its title twice: as the section label and as a page right under it. The label now links to the index page (highlighted when current) and the page isn't repeated; collapsible sections keep a separate chevron toggle. aria-expanded is written as "true"/"false", since Blazor dropped the attribute when false. --- .../Chrome/DocsSidebar.razor.css | 34 +++++++++- .../Chrome/DocsSidebarNode.razor | 48 ++++++++++++-- .../ShellDocs.Tests/SidebarIndexPageTests.cs | 64 +++++++++++++++++++ 3 files changed, 140 insertions(+), 6 deletions(-) create mode 100644 tests/ShellDocs.Tests/SidebarIndexPageTests.cs diff --git a/src/ShellDocs.Components/Chrome/DocsSidebar.razor.css b/src/ShellDocs.Components/Chrome/DocsSidebar.razor.css index 708080f..e7ee97b 100644 --- a/src/ShellDocs.Components/Chrome/DocsSidebar.razor.css +++ b/src/ShellDocs.Components/Chrome/DocsSidebar.razor.css @@ -117,10 +117,42 @@ margin-left: 0.25rem; transition: transform 200ms cubic-bezier(0.16, 1, 0.3, 1); } -::deep .sidebar-section[data-open="true"] > .sidebar-section-toggle .sidebar-section-chevron { +::deep .sidebar-section[data-open="true"] > .sidebar-section-toggle .sidebar-section-chevron, +::deep .sidebar-section[data-open="true"] > .sidebar-section-row .sidebar-section-chevron { transform: rotate(90deg); } +/* A section whose folder has an index.md: the label links to that page; in a + collapsible section the chevron is its own toggle button. */ +::deep .sidebar-section-link { + text-decoration: none; + border-radius: calc(var(--radius) - 3px); + transition: background 150ms, color 150ms; +} +::deep .sidebar-section-link:hover { background: var(--muted); } +::deep .sidebar-section-link.active { background: var(--accent); } +::deep .sidebar-section[data-depth="0"] > .sidebar-section-link { padding: 0.3rem 0.5rem; margin: 0.15rem 0 0.35rem 0; } +::deep .sidebar-section > .sidebar-section-label.sidebar-section-row { + padding: 0; + gap: 0; +} +::deep .sidebar-section-row > .sidebar-section-link { + display: inline-flex; + align-items: center; + gap: 0.55rem; + flex: 1; + min-width: 0; + color: inherit; + padding: 0.45rem 0.25rem 0.45rem 0.55rem; +} +::deep .sidebar-section-row > .sidebar-section-toggle { + display: inline-flex; + align-items: center; + padding: 0.45rem 0.5rem; + color: inherit; +} +::deep .sidebar-section-row > .sidebar-section-toggle .sidebar-section-chevron { margin-left: 0; } + /* grid-rows 0fr→1fr animates to natural height without a fixed max-height; the inner wrapper needs min-height: 0 to collapse fully. */ ::deep .sidebar-section-shell { diff --git a/src/ShellDocs.Components/Chrome/DocsSidebarNode.razor b/src/ShellDocs.Components/Chrome/DocsSidebarNode.razor index 202079b..fd7631e 100644 --- a/src/ShellDocs.Components/Chrome/DocsSidebarNode.razor +++ b/src/ShellDocs.Components/Chrome/DocsSidebarNode.razor @@ -11,10 +11,28 @@ else if (Node.Kind == NodeKind.Section)