组件目录
MobileMailboxDrawer 见下方同名示例:复用批准的 Sheet、Button、Avatar、Badge,提供账号栏与文件夹选择。context 包含 accountId/folder,onSelect 由宿主负责更新来源、URL 与列表。切账号保持抽屉打开并进入该账号收件箱;切文件夹后关闭,Escape/遮罩/关闭按钮沿用 Sheet 行为。示例状态只在自身组件中,不影响原型页面。新增账号、汇总邮箱和设置均禁用;不新增原始组件。Sheet 插槽兼容修复已于 2026-10-16 获用户批准,仅同步其源码摘要。
可选 container 用于原型手机画布:通过 SheetContent asChild 与 React Portal 挂载面板,保持原有 ref、事件和无障碍属性;遮罩仍为标准全局模态。不传时采用默认视口定位,目录示例使用该默认方式。
SheetContent 内部使用官方 Slot.Slottable 标记子元素,使可选关闭按钮与 asChild 兼容。asChild 必须传入单个可接收 ref/属性的元素,不可用多个元素或 Fragment 代替实际根节点;showCloseButton=false 时可在内部组合 SheetClose。下方 Sheet 原始组件示例覆盖普通模式、asChild 默认关闭和自定义关闭;此修复不改变颜色、尺寸或默认交互。
这里是批准组件的可视化真源。先复用现有组件与变体,再考虑新增。错误使用语义色,加载状态使用 Skeleton;控件保留键盘焦点,禁用态不允许触发操作。
统一尺寸:可操作目标至少 44px;常用控件默认 44px,紧凑外观也保留触控区域。所有示例可使用键盘操作。
原始组件源码位于 src/components/ui/,示例锚点与批准清单保持一致。 业务中优先复用共享组合;目录说明与示例统一使用中文。
Alert
默认信息与 destructive 错误反馈;使用明确标题与说明。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Avatar
默认 32px,可用 44/48px;无头像时使用文字回退。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Badge
default / secondary / outline / destructive;状态标签不当作按钮。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Card
标题、描述、内容采用统一内边距;无随意阴影。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Checkbox
勾选 / 未选 / 禁用;标签区域至少 44px。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Dialog
打开后焦点进入对话框,Escape 关闭并返回触发器。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Form
React Hook Form + Zod;错误通过关联 ID 绑定字段。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Input
默认 / disabled / aria-invalid;44px 最小高度。
输入格式不正确
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Label
通过 htmlFor 关联对应输入框。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Popover
次级轻量内容,不替代复杂任务对话框。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Radio Group
单选互斥;不要替代多选 checkbox。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Scroll Area
独立滚动区必须保留键盘可达与明确标签。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Select
选择器覆盖默认、禁用、错误;选项区域至少 44px。
请选择邮件范围(固定错误态示例)。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Separator
视觉分割默认 decorative;不通过分隔线表达唯一信息。
上方内容
下方内容
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Sheet
移动次级区域;含标题与说明,Escape 关闭。asChild 必须传入单个可接收 ref 与属性的元素;支持默认或自定义关闭入口。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Skeleton
加载时替代真实结构,外层提供状态说明。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Sonner
短反馈,不替代字段错误;固定 light 主题。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Switch
即时二元设置;可点击标签提供足够触控区域。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Table
数据使用语义表格;行交互需明确按钮。
| 页面 | 状态 |
|---|---|
| 收件箱 | 已完成 |
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Tabs
方向键切换 tab;面板内容保持语义关联。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Textarea
多行输入;保留标签、错误说明和禁用态。
内容不符合要求(固定错误态示例)。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
Tooltip
辅助提示不能成为唯一标签;支持悬停与键盘焦点。
焦点:Tab 检查可见轮廓;禁用:不可操作;错误仅用于输入/反馈;加载使用 Skeleton 或无障碍状态。非交互组件不设置伪焦点或禁用属性。
业务页面提取的组合
ChatRoom
IM 域共享聊天视图:由宿主传入群聊或单聊 room 及发送适配器 send;消息、缓存和发送归属由各自 repository/Query 管理。下方进入实际原型示例,模拟消息仅保留在各自会话内,刷新恢复。
MobileKeyboard
共享模拟键盘:聚焦下方任意输入框后体验;单行完成只收起,多行支持换行。数据与表单验证由宿主通过值适配器管理,不模拟发送邮件。
SearchInput
共享搜索框:统一图标、内边距与无障碍标签。调用方负责搜索状态和过滤;支持 Input 属性与 className。
MailResponseActions
邮件域的回复/转发按钮组,统一图标、翻译和禁用状态。stretch 让移动端按钮等宽,外层负责布局与安全区。
MobileMailboxDrawer
组合批准的 Sheet、Button、Avatar 与 Badge。左侧账号切换,右侧五个文件夹;选择文件夹关闭抽屉。示例仅切换自身状态,不改变原型 URL。新增账号、汇总邮箱、设置禁用。
个人邮箱 · 收件箱
AsyncState · 异步页面状态
位于 src/components/system/async-state.tsx,统一展示加载、空、错误和无结果。 仅错误态且传入 onRetry 时显示重试按钮;示例重试仅展示反馈。
暂无内容
加载失败
没有匹配结果
共享组合组件
共享组合位于 src/components/system/,使用已批准的原始组件及语义令牌,不依赖业务功能域。以下为现有组合的使用边界,不增加原始组件。
- PageFrame:文档和原型中心的内容壳层;默认包含顶部导航,首页使用
showDocsLink={false}避免重复文档入口。 - WorkspaceHeader:品牌、文档入口与语言切换;
enterprise切换企业工作台标题,showDocsLink控制文档入口。 - MobileFrame:移动端画布;桌面展示 390×844 画布,真实移动视口全屏,业务内容自行管理内部滚动。
- MobilePageHeader:移动页标题与返回操作;必须传入
title、backHref、backLabel,右侧通过children插槽扩展。返回链接使用clientLocalePath。 - EnterpriseRail:企业协同应用轨道;
active为mail或calendar,保留客户端导航与内存状态,未实现应用禁用。 - AsyncState:加载、空、错误、无结果;通过
kind选择状态,错误重试通过可选onRetry传入。上方提供四态示例。 - Mermaid:中文机制文档中的流程图;通过
chart传入源码,提供解析失败提示与可展开文本源码。
RootRedirect 仅用于根路径跳转,不用于业务页面。联系人名片、邀请卡、日程弹卡等仍属于各自功能域,不放入共享组件层。
维护规则
业务页面提取的组合记录在 src/registry/compositions.json,与原始组件清单分开维护,并在本目录提供对应锚点示例。当前登记如下:
- SearchInput:位于共享层,收敛桌面邮箱、移动邮箱与会话列表的搜索结构。必须传入
aria-label;原样透传输入属性,搜索、筛选和数据查询仍由调用方负责。 - MobileKeyboard:共享移动端模拟键盘组合,搭配
useMobileKeyboard()。输入框保留已有onChange/ref,通过keyboard.bind(change, kind)连接聚焦与点击,其中 kind 为text、email、multiline。change可连接状态 setter 或表单setValue;页面底部放置<MobileKeyboard keyboard={keyboard} />,搜索可传actionLabel、onAction和actionDisabled,异步操作可传disabled。单行完成仅收起、多行换行;不触发宿主表单提交。组件目录的单行/多行示例共用一个键盘,不影响业务数据。 - ChatRoom:IM 域共享业务聊天视图,传入
room(GroupChat 或 DirectChat)及send(isPending、isError、mutateAsync)。消息查询与变更由宿主所属会话的 repository/Query 管理;视图复用消息气泡、发送锁、输入、共享键盘、底部面板和返回动画。群聊显示成员与会议菜单;单聊显示在线演示状态与日期分隔,图片和邀请仅展示。目录提供真实群聊/单聊原型链接,不新增独立数据服务。 - MailResponseActions:位于邮件功能域,收敛桌面与移动邮件详情的回复/转发按钮。
stretch用于等宽布局;当前保持禁用。跨域通过mail/index.ts公开入口引用。
提取组件只收敛已重复的结构。邮件领域文案和行为留在邮件域,共享层不得依赖业务域;不为提取操作新增原始组件或改写锁定源码。
- 原始组件以
src/registry/components.json为批准清单,每项必须有且只有一个对应示例。索引、示例锚点使用相同的连字符名称。 - 维护示例时同步默认、禁用、加载或错误状态;按组件语义选择适用状态,不为纯展示组件伪造交互。固定错误态示例仅用于检查外观和错误说明关联,不模拟实际表单校验。
- 检查 Tab、方向键、Enter 和 Escape;弹层关闭后焦点应返回触发器。标签、错误信息与输入控件应正确关联。
- 目录说明统一中文,业务文案进入中英文消息文件。跨页面链接使用路径工具,页内索引使用锚点。
- 原始组件源码及依赖由
foundation.lock.json锁定;新增或变更前须明确批准,并同步规范、清单、示例和快照,不为通过校验直接更新快照。
MobileCollaborationNav
移动协同五列底栏,active 为 messages 或 apps;消息和应用可导航,其余禁用。unread 为可选演示计数,不修改已读状态。不读取数据,不依赖邮件域。通过 im/index.ts 公开引用,上方提供两种选中状态示例。