# 原型标注布局规范 适用于 `src/prototypes/` 下所有接入 `@axhub/annotation` 的原型页面。 ## 核心原则 1. **禁止在右侧「原型目录」中展示跨原型导航** - 不得在 `annotation-source.json` 的 `directory.nodes` 中维护 `id: oneos-project-nav` 的「ONE-OS 原型导航」文件夹 - 跨原型跳转统一由 **`/prototypes/oneos-prototype-nav`(原型导航页)** 承担 2. **PRD 说明展示在右侧「原型标注」目录面板** - 产品需求、模块说明、分章节 PRD 等内容,通过 `directory` 的 `markdown` 节点写入 - 用户在右侧工具栏打开「原型标注 / 原型目录」,按章节阅读 Markdown 正文 - **不在**页面正文下方内联展示 PRD 大段内容 3. **去除目录内页面跳转** - `type: link` 跨原型/跨模块链接不在目录树中展示 - `type: route` 页面内跳转节点不在目录树中展示(`route` 仅用于声明 `pageId` 绑定,供按当前页过滤章节) - 页面切换由原型自身导航(按钮、Tab、Hash 等)完成 4. **标注工具栏保留** - 页面元素批注、主题切换、颜色筛选等 `@axhub/annotation` 能力继续可用 ## 标准接入方式 所有新原型与存量改造,**必须**使用公共壳组件: ```tsx import { type AnnotationSourceDocument, type AnnotationViewerOptions, } from '@axhub/annotation'; import { PrototypeAnnotationHost } from '../../common/prototype-annotation-host'; import annotationSourceDocument from './annotation-source.json'; export default function MyPrototypePage() { const annotationOptions = useMemo(() => ({ showToolbar: true, showThemeToggle: true, showColorFilter: true, emptyWhenNoData: false, toolbarEdge: 'right', currentPageId: 'list', // 多页面原型按当前页传入 }), []); return ( <> ); } ``` ### 多页面原型 - `options.currentPageId` 与页面路由保持一致 - `annotation-source.json` 中带 `route` 子节点的文件夹,仅在其 `payload.pageId` 匹配当前页时,才在右侧目录中展示对应 PRD 章节 - 无 `route` 绑定的 PRD 文件夹(如「PRD 全文」「模块总览」)在所有子页面均展示 - 一般**不需要**再实现 `onDirectoryRoute`(目录内已无 `route` 可点击节点) ## annotation-source.json 目录约定 `directory.nodes` 中只允许保留 **本产品说明**,结构建议: ```text directory.nodes ├── folder · 模块说明 / PRD 全文 / 列表页模块 / 新增页模块 … │ ├── markdown · 章节正文(内联 markdown 或 markdownMap) │ └── route · 仅用于声明 pageId 绑定(不在 UI 展示) ``` **禁止写入:** - `id: oneos-project-nav` 导航文件夹 - 依赖 `type: link` 的跨原型跳转(改放原型导航页) **不在目录 UI 展示(但可保留在 JSON 中供过滤):** - `type: link` 节点 - `type: route` 节点(仅作 pageId 绑定元数据) ## 脚本与同步 | 命令 | 作用 | |------|------| | `npm run project-nav:sync` | 更新原型导航页 `nav-menu.json`,并清理各原型目录中的导航节点 | | `node scripts/strip-prototype-nav-from-directory.mjs` | 批量移除 `oneos-project-nav` | | `node scripts/migrate-prototype-annotation-host.mjs` | 将 `AnnotationViewer` 迁移为 `PrototypeAnnotationHost` | 修改 sidebar 菜单或批量整理标注目录后,执行 `npm run project-nav:sync`。 ## Agent 开发检查清单 新建或改造带标注的原型时: - [ ] `index.tsx` 使用 `PrototypeAnnotationHost`,不直接挂载裸 `AnnotationViewer` - [ ] `annotation-source.json` 无 `oneos-project-nav` 节点 - [ ] PRD / 模块说明以 `markdown` 节点写入 `directory`,能在右侧「原型目录」分章节阅读 - [ ] 页面正文下方**无**大块 PRD 内联区域 - [ ] 右侧目录**无**跨原型 link、**无**可点击的 route 页面跳转 - [ ] 跨原型入口统一引导用户打开「原型导航」页 - [ ] 多页面原型正确传入 `currentPageId`,右侧 PRD 章节与当前页匹配 ## 相关文件 | 文件 | 说明 | |------|------| | `src/common/prototype-annotation-host.tsx` | 标注壳:过滤目录 + 批注工具栏 | | `src/common/prototype-annotation-utils.ts` | PRD 目录过滤与导航节点清理 | | `src/prototypes/oneos-prototype-nav/` | 全局原型导航页 | | `scripts/sync-project-prototype-directory.mjs` | 导航菜单同步(不再注入侧边导航树) |