From 2d77fa545631eb49aa61eb68461b0dd8d1c6a709 Mon Sep 17 00:00:00 2001 From: Amit Haridas Date: Sat, 6 Jun 2026 08:28:24 +0530 Subject: [PATCH] feat(renderer): Breadcrumb shows heading symbols (settings toggleable) --- src/renderer/components/layout/Breadcrumb.tsx | 35 ++++++++++++- tests/component/layout/Breadcrumb.test.tsx | 50 +++++++++++++++++++ 2 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 tests/component/layout/Breadcrumb.test.tsx diff --git a/src/renderer/components/layout/Breadcrumb.tsx b/src/renderer/components/layout/Breadcrumb.tsx index 3333913..f3c8e91 100644 --- a/src/renderer/components/layout/Breadcrumb.tsx +++ b/src/renderer/components/layout/Breadcrumb.tsx @@ -1,7 +1,38 @@ +import { useFileStore } from '@/stores/file-store'; +import { useEditorStore } from '@/stores/editor-store'; +import { useSettingsStore } from '@/stores/settings-store'; + +function extractHeadings(content: string): { level: number; text: string }[] { + const lines = content.split('\n'); + const headings: { level: number; text: string }[] = []; + for (const line of lines) { + const m = line.match(/^(#{1,6})\s+(.+)$/); + if (m) headings.push({ level: m[1].length, text: m[2].trim() }); + } + return headings; +} + export function Breadcrumb() { + const activeTabId = useFileStore((s) => s.activeTabId); + const openTabs = useFileStore((s) => s.openTabs); + const buffer = useEditorStore((s) => (activeTabId ? s.buffers.get(activeTabId) : undefined)); + const showSymbols = useSettingsStore((s) => s.breadcrumbSymbols); + + const tab = activeTabId ? openTabs.find((t) => t.id === activeTabId) : null; + const headings = showSymbols && buffer ? extractHeadings(buffer.content).slice(0, 3) : []; + return ( -