ナビゲーションのレンダリング
Methanol は、ctx.pagesTree を通じて階層化されたナビゲーションツリーを提供します。このデータは、現在のナビゲーションルート(isRoot)の設定に基づき適切にスコープされており、hidden や exclude などの規則が適用済みです。
ノードデータの構造例:
{
type: 'page' | 'directory',
title: '...',
name: '...',
routePath: '/guide/',
routeHref: '/docs/guide/', // Base Path 対応済み
children: []
}
最小構成のサイドバー実装例
const NavTree = ({ nodes, currentHref }) => (
<ul>
{(nodes || []).map((node) => {
const label = node.title || node.name || node.routePath
if (node.type === 'directory') {
return (
<li>
{node.routeHref ? <a href={node.routeHref}>{label}</a> : <span>{label}</span>}
{node.children?.length ? <NavTree nodes={node.children} currentHref={currentHref} /> : null}
</li>
)
}
const isActive = node.routeHref && node.routeHref === currentHref
return (
<li>
<a href={node.routeHref} aria-current={isActive ? 'page' : null}>
{label}
</a>
</li>
)
})}
</ul>
)
export default function PageTemplate({ PageContent, ExtraHead, ctx }) {
return (
<>
<html>
<head>
<ExtraHead />
</head>
<body>
<aside>
<NavTree nodes={ctx.pagesTree} currentHref={ctx.page.routeHref} />
</aside>
<main>
<PageContent />
</main>
</body>
</html>
</>
)
}
実装のアドバイス
- リンク先には必ず
routeHrefを使用してください(site.baseの設定が自動的に反映されます)。 - ディレクトリのインデックスページの場合、
routePathの末尾には常に/が付与されます(例:/guide/)。