MIP DESKTOP · 扩展开发
主题与界面
跟随宿主主题,让扩展页面融入同一个工作环境。
宿主负责窗口、标签页与容器,扩展负责页面内部。通过公开主题上下文保持一致,而不是复制宿主组件和整套样式。
使用主题变量
为页面定义合理的默认值,并使用宿主提供的 --mip-* 变量:
:root {
color: var(--mip-text, #1e293b);
background: var(--mip-bg, #f5f8fb);
font: 16px/1.7 system-ui, sans-serif;
}
.panel {
padding: 20px;
color: var(--mip-text, #1e293b);
background: var(--mip-surface, #ffffff);
border: 1px solid var(--mip-border, #dbe5ee);
border-radius: 8px;
}
采用组件库时,在扩展自己的样式中映射变量。不要依赖宿主内部 CSS 类名或把 Desktop 的完整前端依赖复制进包。
应用并监听主题
先读取初始主题,再监听变化;只处理协议公开的主题变量。
import { createExtensionSdk } from '@mip/desktop-extension-sdk/webview';
const sdk = createExtensionSdk();
function applyTheme(theme: ReturnType<typeof sdk.theme.get>) {
if (!theme) return;
document.documentElement.dataset.theme = theme.resolved;
for (const [name, value] of Object.entries(theme.variables)) {
if (name.startsWith('--mip-')) {
document.documentElement.style.setProperty(name, value);
}
}
}
applyTheme(sdk.theme.get());
sdk.lifecycle.add(sdk.theme.onDidChange(applyTheme));
window.addEventListener('pagehide', () => {
void sdk.lifecycle.dispose();
}, { once: true });
未知字段忽略处理,旧宿主缺少主题能力时保留默认样式。页面刷新后重新读取当前上下文。
保持页面职责清楚
扩展页面不重复绘制 Desktop 的窗口栏、主侧栏和标签栏。页面标题、主要操作、内容区和错误状态在自己的容器内组织。
长内容合理限制行宽,表格和代码块在自身区域滚动,避免整页横向溢出。加载、空数据、失败和无权限状态应分别表达。
检查可访问性
- 浅色与深色分别检查文字和控件对比度。
- 为输入提供可见标签,为仅图标按钮提供可访问名称。
- 使用真实按钮和链接,保留键盘焦点提示。
- 窄窗口和系统字号放大后,内容仍可阅读和操作。
- 状态变化提供文字反馈,不能只依赖颜色。
基础契约:Extension API 1.x;具体能力以目标 Desktop 发行版为准。