diff --git a/assets/theme.css b/assets/theme.css index c787122..15a285e 100644 --- a/assets/theme.css +++ b/assets/theme.css @@ -59,9 +59,10 @@ body { background: var(--sidebar-bg); padding: 1rem; } -.sidebar ul { list-style: none; padding: 0; } -.sidebar ul ul { padding-left: 1rem; } -.sidebar a { text-decoration: none; color: var(--text-color); } +.sidebar ul { list-style: none; padding: 0; margin: 0; } +.sidebar li { margin: 0.25rem 0; } +.sidebar a { text-decoration: none; color: var(--text-color); display: block; padding: 0.25rem 0; } +.sidebar ul ul { padding-left: 1rem; margin-left: 0.5rem; border-left: 2px solid #ccc; } main { flex: 1; padding: 1rem; @@ -74,7 +75,7 @@ main { top: 0; height: 100%; overflow-y: auto; - transition: left 0.3s ease; + transition: none; z-index: 1000; } body.sidebar-open .sidebar { left: 0; } diff --git a/src/generator/index.js b/src/generator/index.js index e9cbeb3..a3b2bdf 100644 --- a/src/generator/index.js +++ b/src/generator/index.js @@ -26,10 +26,29 @@ function buildNav(pages) { const tree = {}; for (const page of pages) { const rel = page.file.replace(/\\/g, '/'); + if (rel === 'index.md') { + if (!tree.children) tree.children = []; + tree.children.push({ + name: 'index.md', + children: [], + page: page.data, + path: `/${rel.replace(/\.md$/, '.html')}`, + order: page.data.order || 0 + }); + continue; + } const parts = rel.split('/'); let node = tree; for (let i = 0; i < parts.length; i++) { const part = parts[i]; + const isLast = i === parts.length - 1; + const isIndex = isLast && part === 'index.md'; + if (isIndex) { + node.page = page.data; + node.path = `/${rel.replace(/\.md$/, '.html')}`; + node.order = page.data.order || 0; + break; + } if (!node.children) node.children = []; let child = node.children.find(c => c.name === part); if (!child) { @@ -37,12 +56,12 @@ function buildNav(pages) { node.children.push(child); } node = child; - if (i === parts.length - 1) { + if (isLast) { node.page = page.data; node.path = `/${rel.replace(/\.md$/, '.html')}`; + node.order = page.data.order || 0; } } - node.order = page.data.order || 0; } function sort(node) { @@ -92,8 +111,9 @@ async function generate({ contentDir = 'content', outputDir = '_site', configPat const mdObj = await runHook('onParseMarkdown', { file: rel, content: raw }); if (mdObj && mdObj.content) raw = mdObj.content; const parsed = matter(raw); - const title = parsed.data.title || path.basename(rel, '.md'); const tokens = lexer(parsed.content || ''); + const firstHeading = tokens.find(t => t.type === 'heading'); + const title = parsed.data.title || (firstHeading ? firstHeading.text : path.basename(rel, '.md')); const headings = tokens.filter(t => t.type === 'heading').map(t => t.text).join(' '); pages.push({ file: rel, data: { ...parsed.data, title } }); searchDocs.push({ id: rel.replace(/\.md$/, '.html'), url: '/' + rel.replace(/\.md$/, '.html'), title, headings });