跳转至

组件约定

AI Elements

Chat / Agent UI 使用 shadcn/ui AI Elements 的 Radix patterns,并复用当前 radix-nova 基础组件。

  • 上游基础件落盘:src/components/ui/。安装前用 pnpm exec shadcn view <name> 对比,按需添加,禁止批量覆盖已有组件。
  • 应用组合位于 src/components/agent/:elements/ 为过程展示与队列,composer/ 为输入状态与附件,rendering/ 为科研 Markdown、引用及代码展示。旧 ai-elements/ 目录已移除。
  • 主题跟 shadcn token;不是 Vercel AI SDK useChat(传输层为 ACP)。
  • ui/message、bubble、trace、code-block、attachment、message-scroller 保持上游通用接口,通过 props / children 组合业务;不导入 ACP、Vault、PDF、业务 store 或 IPC。pnpm deps:check 检查这条边界。
  • 保留 AI SDK、Streamdown 等成熟依赖;只有确认无消费者才删除,不为减少依赖重新实现基础能力。

待发送队列与官方 Agent todo Queue 语义不同;模型选择器需要 Command 搜索;Vault 文件树需要多选、拖放和重命名。这些能力用基础组件组合,不能用精简展示示例替代。

提问表单使用 ui/questionnaire,分页、选择、自由输入、校验与焦点由 @shadcn/react/questionnaire 管理;业务只负责 ACP 问题/答案转换、折叠和异步提交恢复。该基础件按官方 Radix 源码与 Nova style 展开,禁止在基础件里处理协议回传。

待发送与已发送图片均使用 Attachment;已发送图片与视觉批注共用 agent/chat-image-gallery.tsx 的预览交互。代码块复用 Code Block 的 Header / Title / Actions,Tauri 剪贴板与文件下载保留在业务层。

引用来源列表用 Trace Sources 组合并按 URI 去重;行内引用用 Hover Card + Button/链接组合,Vault/PDF 跳转仍经项目解析器。Terminal pattern 只接受可验证的 ACP execute 命令、可选 cwd 与文本输出,保留完整 metadata;未知字段回退通用 Tool,退出码只读结构化字段,不能从日志猜测或隐藏参数。

Agent / Reasoning 消息里的 Markdown:Streamdown + PlainTable / PlainCodeBlock(代码块左上角语言标签,悬停复制/下载;无外侧卡片,见 agent.md#消息-markdown-渲染)。

表面与层级

浮层统一走主题阴影阶梯,不在业务组件里写 shadow-lg / shadow-2xl:

Token 用途
shadow-raised 可悬浮的卡片 / 按钮 hover,轻量抬升
shadow-overlay Popover、Dropdown、ContextMenu、Select、Tooltip、Toast、PDF 浮卡
shadow-dialog Dialog / Command 主模态

阴影值定义在 src/index.css(--agentero-shadow-*,暗色单独增强);浮层仍保留 ring-1 ring-foreground/10 发丝边,白底时不靠阴影硬撑边界。菜单容器用 p-1.5、菜单项用 px-2 py-1.5,与 Button 的 24 / 28 / 32 / 36 控件高度阶梯对齐;以屏幕坐标锚定的自绘菜单走 FloatingMenu,与 ContextMenuContent 使用同一表面。

复用层

浮层、列表行和编辑单元格先组合下列共享件,不在业务目录重写同一条交互:

组件 位置 用途
SelectionToolbar + SelectionToolbarAction / SelectionToolbarDivider / SelectionToolbarIconButton components/selection/selection-toolbar.tsx PDF 文本选区、Plaza 选区、高亮标注菜单共用高度、描边、缩放与 dim 行为
FloatingMenu + FloatingMenuItem / FloatingMenuShortcut / FloatingMenuSeparator components/ui/floating-menu.tsx 屏幕坐标锚定的菜单(文件树右键、Plaza 卡片);行距与快捷键对齐 Radix 菜单
PanelCard + PanelCardButton / PanelCardActions / PanelEmptyState components/viewer/panels/panel-primitives.tsx PDF 右栏卡片、整卡跳转、hover 操作条与空态
QuietIconButton components/ui/quiet-icon-button.tsx 24px 静音图标按钮(面板头、hover 操作条、PDF 浮层)
EmptyState components/ui/empty-state.tsx 查看器无内容时的居中提示
WindowHeader components/shell/window-header.tsx 主窗口 / 功能窗口 / 文档窗口共用的 32px 标题栏
EDITABLE_CELL components/library/cell-styles.ts 论文库自定义属性的文本 / 下拉编辑单元格框

新增浮层或列表卡片先查这些入口。行为(键盘、ARIA、定位)重复时抽组件;只有样式重复时用常量或 token。

交互态

列表行(论文库、PDF 目录、设置导航、文件树)的 hover / 选中底色落在整行容器上。只读单元格不再叠加内容宽度的 hover 底色;可编辑单元格用尾随铅笔 / 下拉图标提示,行底色由表格行统一提供。PDF 书签编辑行把 hover 放在整行 <fieldset> 上,尾部操作按钮也共享同一底色。设置页侧栏的选中态保持平层,不加阴影。

业务组件目录

目录 职责
components/shell/ 三栏壳、标题栏、对话框挂载
components/sidebar/ 文件树、Paper Info、LaTeX 面板、魔棒
components/writing/ 写作工作面:阅读 / 写作切换、项目列表、源码与 PDF
components/workspace/ Dockview 宿主与 panel 内容
components/library/ 论文库表
components/editor/ Plate Markdown
components/viewer/ PDF / HTML / 图片。对外只经 viewer/index.ts;内部 pdf/(外壳 + hooks/ + layers/ + chrome/ + cards/ + viewport/)、panels/(右栏面板)
components/agent/ Agent 面板。外壳 + hooks/(面板与 composer 状态)+ composer/(输入区子件)
components/wiki/ 反链列表 / 引用近邻图(graph-panel)
components/settings/ 设置页
components/dialogs/ 命令面板、权限、迁移等
components/ui/ shadcn 基础件;math-text.tsx 用 KaTeX 渲染标题内联公式($\\pi$)

状态订阅

组件经 hooks/use-app-stores.ts selector 订阅;避免整树重渲染。命令式 dock/布局经 registry,不把 DOM ref 塞进 zustand。