diff --git a/main.py b/main.py
index 9e631ac..4d24ac2 100644
--- a/main.py
+++ b/main.py
@@ -792,43 +792,13 @@ def _render_folder_index_page(
template = string.Template(content)
- # Build folder index sidebar HTML
- prefix = path.rstrip("/") or ""
- lines: list[str] = []
-
- # Breadcrumb
- lines.append("")
- lines.append('/ ')
- if prefix:
- parts = prefix.split("/")
- accumulated = ""
- for part in parts:
- accumulated += f"{part}/"
- lines.append(f'{part} ')
- lines.append(" ")
-
- # Folders
- for folder in folders:
- folder_path = f"{prefix}{folder}/" if prefix else f"{folder}/"
- lines.append(
- f'
"
- )
-
- # Files
- for file in files:
- file_path = f"{prefix}{file}" if prefix else file
- href_params = ""
- if current_order is not None and current_delay is not None:
- href_params = f"?order={current_order}&delay={current_delay}"
- lines.append(
- f'"
- )
-
- folder_index_html = "\n".join(lines)
+ # Build folder index sidebar HTML using recursive tree renderer
+ folder_path = path.rstrip("/") or None
+ folder_index_html = _render_folder_index_html(
+ current_path=folder_path,
+ current_order=current_order,
+ current_delay=current_delay,
+ )
content = template.substitute(
img_url="#",
diff --git a/tests/test_navigate.py b/tests/test_navigate.py
index 56f58c9..167f43b 100644
--- a/tests/test_navigate.py
+++ b/tests/test_navigate.py
@@ -106,6 +106,24 @@ class TestNavigatePage:
response = await client_zip_navigate.get("/navigate/")
assert "/navigate/top.txt" in response.text
+ async def test_subfolder_index_shows_nested_files(
+ self, client_zip_navigate: AsyncClient
+ ) -> None:
+ """Subfolder index shows files within that folder."""
+ response = await client_zip_navigate.get("/navigate/folder/")
+ assert response.status_code == 200
+ assert "/navigate/folder/deep.txt" in response.text
+ assert "/navigate/folder/image.png" in response.text
+
+ async def test_subfolder_index_shows_full_tree(
+ self, client_zip_navigate: AsyncClient
+ ) -> None:
+ """Subfolder index sidebar shows full tree from root."""
+ response = await client_zip_navigate.get("/navigate/folder/")
+ assert response.status_code == 200
+ # Should still show root-level items in the tree
+ assert "/navigate/top.txt" in response.text
+
async def test_file_page_has_sidebar(
self, client_zip_navigate: AsyncClient
) -> None: