开发者指南
Client UI 与 Slot
浏览器侧开发:在 Slot 注册 UI、使用 theme token,并用 React.createElement 编写界面
Client 是插件的浏览器侧半体,负责主题、布局、当前页面状态、工具卡片与 Slot UI。客户端代码运行在浏览器里,不能使用 Node.js 能力;需要文件、命令或服务时,交给 Host 侧,再通过私有 JSON 方法调用。
只写普通 JavaScript
客户端代码不做 TypeScript、JSX 或 bundler 转换。因此:
- 不使用 TypeScript 类型、
as、装饰器、import/require。 - 不使用 JSX;React 代码必须用
React.createElement(...)编写。
// 客户端代码里的 React 元素
React.createElement('div', { className: 'card' }, '内容')在 Slot 注册 UI
客户端 UI 必须注册到已查询到的 Slot 中,apply() 不能直接返回 React 元素。Slot 是客户端架构中的具名可注册位置(保留英文)。
注册前先查询可用的 Slot 树,确认目标 Slot 的注册约定与 props,再按其约定编写代码。这样插件卸载时,注册的 UI 也会随之撤销。
theme token
主题通过 token 表达。浏览器客户端包以 ui-theme 维护 --dsw-* 静态标尺与语义别名(--dsw-alias-*),由 ui-layout 把解析后的主题快照应用到文档。功能包消费语义别名,不再定义另一套全局主题。
在插件里覆盖主题或注入样式时,都要当作可逆副作用:随插件 stop、update 或 undefine 撤销。
样式规则
浏览器客户端组件遵循统一的样式约定:
- 使用 CSS Modules 与
clsx,不引入组件库或 Tailwind。 - 功能组件使用
--dsw-alias-*语义 token,不复制静态色板、不写字面颜色。 - 主题选择器不进入功能组件的 CSS;明暗色覆盖归主题所有方。
- 字号与行高配对使用,优先复用主题排版变量。
- 增加过渡或仅悬停控件时,保留键盘焦点可见性与 reduced-motion 行为。
Host 与 Client 通信
Client 通过包内私有 JSON 方法调用 Host(方向 Client → Host),只有无损 JSON 能跨越边界。不要在插件代码里序列化实时数据——服务、事件、会话等都是内部实时对象;只读取任务需要的叶子字段,再构造最小的自有数据对象。