页面区域与布局
当前约定
第一列入口由内容树生成,页面无需声明菜单归属。slots 只控制路径和元信息是否装配;框架负责布局。正文 main 是内建区域,不通过 front matter 指向 fragment。
slots.breadcrumb 装配 shell 内的 nav.slot.path-navigation[data-slot="breadcrumb"],其子节点是路径列。data-slot="breadcrumb" 保留区域语义;屏幕上 nav 使用 display: contents,各列直接参与 .page-shell 的横向 Grid。列尺寸和打印分组见 公共页面列。
布局、路径列、集合与更新模块的命名见 UI 命名与职责。内部 slot_flags 保存区域开关,不再表示片段来源。
第一列入口
当前语言的根页面集合包含首页自身及直接子页 Home.Pages,再合并父页面为首页的 taxonomy 根页;这份结构集合完整保留,用于路径归属。第一列只显示其中顶层声明布尔值 root_nav: true 的页面,默认不显示。名称取 LinkTitle/Title,网址取 RelPermalink,顺序取页面 weight。来源变化只更新选中项,不替换可见入口列表。
入口可在自己的 front matter 中用 icon: folder 声明 SVG,或用 icon: { text: "©" } 声明字符图标;省略时使用 folder,不存在的图标会让构建失败。当前语言、外观、我的入口分别声明 language、theme、my,更新入口声明 icon: { text: "↻" }。
- 不能只取
Home.Sections,因为语言、外观、我的和/all/入口是普通页面。 - 不能只取
Site.Pages,因为build.list: local的系统页只列在其父页集合中。 - taxonomy 根需要单独合并,不能假定它们都在
Home.Pages中。 build.list: never的内部节点不作为入口。weight只需在入口本身定义,不应 cascade 到所有文章。
首页在 content/_index*.md 声明 root_nav: true、linkTitle、icon 和 weight,使用普通条目组件,正文使用 page-home。站点自己的根页面决定可见入口和文案。
nav_primary、slots.primary_nav、slots.utilities 和 slots.breadcrumb_root 已移除,对应的主菜单、系统下拉及 breadcrumb model fragment 不再参与装配。新增入口应建立真实根页面或 taxonomy 根,声明 root_nav: true 并提供名称与顺序。
原首页快捷列表已经移除;分类法不再声明 banyan_taxonomy.show_in_home/home_weight。第一列是否显示由页面 root_nav 决定,顺序使用页面 weight。
支持的 slots
页面 front matter 中的 slots: 只支持以下键;省略或设置为 false 表示不装配该区域。
| 键 | 值 | 用途 |
|---|---|---|
breadcrumb | true/false | 当前页面的集合路径及各级条目 |
meta | true/false | 正文右侧辅助列中的路径、taxonomy、日期与外链 |
文章布局另行提供章节导航,不需要 list 或新的 slot 声明,详见 布局与章节定位。slots.meta: false 只关闭元信息,仍可显示章节。document-aside 是布局 block,Markdown 内容不能将它声明为 slot。
未知 slot 名和错误值类型均应在构建时失败。slots.footer、版权页脚片段及其专用模板和样式已移除。旧 show_breadcrumb、show_meta、breadcrumb_variant 和布局导向的 rail-*/stage-* 声明不属于当前约定。
页面基础样式由 baseof.html 直接调用 system-ui/page-styles.html,页面入口不能替换或漏掉它。CSS 归属与发布名见 UI 命名与职责。真正渲染 .prose 的入口显式调用 feature-document/styles.html;集合页只在实际输出正文时调用,预取诊断页也显式调用同一装配器。不通过页面类型或渲染后的 HTML 标签猜测需要哪些正文组件。
推荐写法
目录、分类法和产品集合页:
slots:
breadcrumb: true
文章页可通过其目录的 cascade 继承以下声明,无需再逐篇设置:
slots:
breadcrumb: true
meta: true
语言、外观页面用顶层 list: choice 声明选择行,并分别由 page-language、page-appearance 布局提供选项,由语言、外观脚本处理操作;我的等系统页无需列表声明。它们都无需为了显示第一列设置 slots。布局、集合 provider 和产品属性仍是各自独立的配置。
Powered by 总览 content/powered-by/index*.md 使用 page-powered-by 布局和 powered-by shortcode;框架说明与构建信息直接展示,变更记录链接上游仓库。PWA 段落内嵌 feature-updates/panel.html,该页通过 body-extra 加载 js/updates/page.js。site_update.labels 提供静态界面与运行时文案,检查只检查、不激活或重载;构建时间只显示一次。总览无子页或额外路径列,语言和外观布局仍各自装配返回控件。
站点默认描述和文章源码仓库配置分别使用 hugo.toml 中的 params.description 与 params.content_source,不再通过隐藏的 fragments/site-meta 页面承载。通用值全站共用,需要本地化时由 languages.<lang>.params 覆盖。slots.meta 只控制当前页面的日期、taxonomy 等元信息装配。
首页链接已统一到普通入口。关于、微信、RSS、GitHub、备案等信息通过各自真实根页面访问,Powered by 入口展示技术总览并内嵌 PWA 状态面板;SEO 元数据仍由独立的 head 模板输出。
与导航状态和布局的边界
slots 决定页面装配哪些区域;from / sort / sorts 表示当次浏览来源及排序。有效 from 决定来源根,没有有效来源时按真实内容祖先确定归属。来源根须声明 root_nav: true 才有对应的第一列选中项;隐藏的目录仍保留右侧路径和探索能力。不能从公开网址前缀推断归属:例如 Xvenv 的正文位于 d/products/,直接访问归属隐藏的目录,第一列不选中;通过产品分类进入时选中“工具 - 分类”。
系统页使用普通链接,不携带 return;语言与外观页的返回行为见 导航状态协议。切换语言留在对应语言的设置页,不改变当前系统入口的选中态。首页选中自身;其他页面匹配自身和最近的可列出祖先,但不把首页当成所有页面的默认选中项。没有可列出根祖先的内部页不强行选中入口。
第一列的存在不表示页面具有 collection browser。集合路径仍由 slots.breadcrumb、集合来源和 provider 决定;不要新增 slots.browser_mode,也不要把来源、排序和列状态写入 front matter。
同一份入口列表和 slot 声明用于各屏幕宽度。整页横向画幅保持原有浏览位置;外观选择页在跟随系统、浅色和深色之间切换,所有页面共同消费 params.appearance.palette 指定文件中的语义色变量,默认使用 css/theme.css,也可选择 css/theme-monochrome.css。配色文件选择不属于 slot 契约,详见 配色约定。