Design Skill · Pixso 组件系统
🎨 设计师第一次使用? → 先读 references/designer-guide.md,里面有角色决策树、规范速览卡和推荐交互方式。核心建议:逐楼层生成,不要一次性生成整页——逐楼层还原度远高于整页一次性生成。
💡 本文件为 AI 执行入口,仅包含生成设计稿所需的指令与约束。完整使用说明、目录结构、协议信息请查看 README.md;请勿全量加载所有子文件,按工作流按需读取即可。
🔴 生成任何设计稿前,必读以下硬约束文档:
- global/hard-constraints.md — 变量映射硬约束 + 组件组合规则(合并版):PC / MB 双断点下,字号 / 行高 / 间距 / 栅格 / 图标尺寸的合法取值白名单,以及按钮对齐 / 排列 / 间距、组件栅格挂靠、卡片间距、禁止组合黑名单及自动校验清单。所有几何数值必须严格选自该白名单,禁止四舍五入、推断或造数。
以上约束最高优先级,与下文 #图标处理规范(核心约束) 并列,缺一不可。
数据资源
栅格、响应式断点、设计变量等数据来自 atomgit 上游仓库。使用时通过 WebFetch 实时拉取最新版本,不要 bundle 到本地:
| 用途 | URL |
|---|---|
| 栅格规范 | https://raw.atomgit.com/openeuler/opendesign-token/raw/master/packages/opendesign-token/tokens/grid-token.json |
| 响应式断点 | https://raw.atomgit.com/openeuler/opendesign-token/raw/master/packages/opendesign-token/tokens/responsive-token.json |
| openEuler 主题 Token | https://raw.atomgit.com/openeuler/opendesign-token/raw/master/packages/opendesign-token/tokens/openeuler-token.json |
本 skill 内 bundled 的索引文件(设计稿生产专用,无上游真源):
- references/pixso-mcp-adapter/component-keys.md — 536 个 UI 组件变体的 componentKey 索引
- references/pixso-mcp-adapter/icon-keys.md — 187 个图标的 componentKey 索引
组件索引
每个组件的详细设计规范见 components/{name}.md,涵盖适用场景、变体说明、布局规格、颜色/字体 Token 映射、识别特征。
| 组件 | 说明 | 组件 | 说明 |
|---|---|---|---|
| OAnchor | 锚点 | OMessage | 全局消息 |
| OBanner | 横幅 | ONavigation | 导航 |
| OBreadcrumb | 面包屑 | OPagination | 分页 |
| OButton | 按钮 | ORadio | 单选框 |
| OCard | 卡片 | OScrollbar | 滚动条 |
| OCarousel | 幻灯片指示器 | OSelect | 选择器 |
| OCheckbox | 复选框 | OStep | 步骤条 |
| ODataTable | 数据表格 | OSwitch | 开关 |
| ODialog | 对话框 | OTab | 标签页 |
| ODivider | 分割线 | OTag | 标签 |
| ODropdown | 下拉菜单 | OToggle | 切换按钮 |
| OInput | 输入框 | ||
| OLink | 链接 | ||
| OLoading | 加载 | ||
| OMenu | 菜单 | ||
| OSearch | 搜索框 |
图标处理规范(核心约束)
⚠️ 本节规则优先级最高,所有生成步骤必须遵守。
图标存储机制
OpenEuler 设计系统中,图标以 svgSha 外部引用方式存储在 Pixso 服务器上(非内嵌 SVG 路径)。这意味着:
- 图标 SVG 数据不存在于 DSL 中,无法通过工具直接提取路径
code_to_design内嵌的任何 SVG 均为通用占位符,不属于设计系统图标create_instance生成的组件实例自带正确图标,由 Pixso 在渲染时从服务器解析
图标库资源
OpenEuler 拥有独立图标库 Pixso 文件 kbqInwBrCTGnM0MsPJDgvA,包含 187 个线性图标(24×24px)。完整索引见 references/pixso-mcp-adapter/icon-keys.md。
图标使用规则
SVG 来源优先级(所有场景统一):① references/assets/ 已有文件(Read 内联)→ ② 手写符合线性风格的 SVG 路径 → ③ CSS(兜底,需注释)
SVG 内嵌方式:直接将 <svg> 标签写入 HTML,不使用 <img src>。图标颜色跟随设计系统 Token,默认使用 currentColor 继承父元素色值。
| 属性 | 规格 |
|---|---|
| 尺寸 | 与设计系统图标一致(通常 24×24px,使用 icon_size-m Token) |
| 风格 | 线性(stroke),与 OpenEuler 图标库保持一致 |
| 颜色 | currentColor(继承父元素文字色)或对应 Token 色值 |
| 写法 | <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" ...> 直接内嵌 |
create_instance仍可用于需要 live Symbol 绑定或 Token 联动的特殊场景,但不再作为图标的强制路径。
执行工作流
⚠️ 核心原则:逐楼层生成,不要一次性生成整页。 一次性处理整页所有组件规范会导致上下文溢出、细节丢失。逐楼层生成时,AI 每次只需处理 1~2 个组件规范,还原度显著更高。
第零步:读取硬约束文档 + 拉取上游Token(强制起手式)
读取 global/hard-constraints.md
— 锁定当前目标设备(MB 或 PC)
— 明确该设备下字号 / 行高 / 间距 / 栅格 / 图标尺寸的合法取值集合
— 明确按钮对齐 / 排列优先级 / 间距规则
— 明确组件栅格挂靠要求、卡片间距规则
— 明确禁止组合黑名单(Banner 嵌套、多尺寸 Banner 并排、按钮位置等)
WebFetch 拉取 openEuler 主题 Token(必须执行!)
→ https://raw.atomgit.com/openeuler/opendesign-token/raw/master/packages/opendesign-token/tokens/openeuler-token.json
— 将 JSON 中的颜色/字号/间距变量翻译为 :root CSS 变量
— ⚠️ 禁止凭训练数据"猜测"颜色值!尤其是 --o-color-fill1(页面背景=浅灰,不是纯白)
— 拉取失败时:使用 references/designer-guide.md 中的 Token 语义速查表作为降级数据源
后续所有步骤的几何数值必须落在硬约束的白名单内,组件排布必须符合组合规则。无法对应到约束的需求 → 停下询问用户,禁止造数或静默放行。
第一步:规划页面楼层结构
根据用户需求,将页面拆解为楼层序列。所有落地页遵循固定结构(见 hard-constraints.md §8):
导航楼层(必选)→ [Banner 楼层](可选)→ 楼层 1 → 楼层 2 → … → 页脚楼层(必选)
向用户输出楼层规划,等待确认后才能继续:
我理解本次页面由以下楼层组成,请确认或调整:
1. 导航楼层(ONavigation)
2. Banner 楼层(OBanner,XL/L/M/无)
3. 功能介绍楼层(OCard × N 栅格)
4. 数据统计楼层(自定义数字 + 描述)
5. 页脚楼层(ONavigation Footer)
请确认每个楼层的类型和内容,确认后我将逐楼层读取规范并生成。
楼层模板速查见 #楼层模板索引。用户确认后,进入逐楼层循环。
第二步:读取设计规范(全局,仅执行一次)
使用 get_variable_sets 获取当前文件所有变量集合
使用 get_variables(variableSetId) 读取具体变量值(颜色/字号/间距等)
使用 get_local_styles 获取本地样式(填充色/描边/文字样式)
如需对照上游 Token 真源(语义化变量名、栅格断点),通过 WebFetch 拉取 #数据资源 中的三个 atomgit URL。
逐楼层循环(第三步 ~ 第六步,每个楼层执行一轮)
🔄 对第一步规划中的每个楼层,依次执行第三步到第六步。每次只处理一个楼层,完成验证后再进入下一个楼层。
第三步:确认本楼层涉及的组件
仅列出当前楼层用到的组件,不是整页所有组件:
当前楼层:[楼层名称]
涉及组件:
- OCard(封面卡片,vertical)
- OButton(solid + outline)
- OTag(分类标签)
确认后我将读取对应规范。
用户确认后,逐一读取每个组件的 components/{name}.md,全部读取完毕才能进入下一步。
第四步:读取本楼层组件规范与资源
1. 读取本楼层涉及的每个 components/{name}.md
2. 如有楼层模板(floors/{type}.md),读取模板获取完整规格
3. 检查图标资源:
ls references/assets/<组件名>/
有文件 → Read 每个文件,全部内联到 HTML 对应位置
无文件 → 手写线性风格 SVG 路径,注释注明「assets 中无资源」
4. 独立图标:查 references/pixso-mcp-adapter/icon-keys.md 按中文名匹配
第五步:生成本楼层
选择生成模式(全页统一,首次确定后后续楼层沿用):
| 条件 | 选择 |
|---|---|
| 用户需要 Pixso 可编辑画布、Token 绑定或交互原型 | 模式 A |
| 用户需要可在浏览器直接打开的网站页面 / 未明确说明 | 模式 B(默认) |
模式 A:code_to_design(htmlStr) — 当前楼层的 HTML 片段,包含精确位置与像素级样式
模式 B:生成当前楼层的独立 HTML 片段(含内联 CSS),后续在第七步组装为完整页面
第六步:验证本楼层
逐项核对本楼层的硬约束自检清单:
□ 字号是否来自该设备列的字号集合?字号与行高是否成对?
□ 间距是否来自该设备列的间距集合?
□ 卡片间距是否为 PC 32px / MB 12px?
□ 按钮是否左对齐、solid 唯一、间距 24px?
□ 所有组件是否挂靠栅格容器?
□ 【HTML栅格】楼层内容容器 width + max-width 是否为 1488px(PC)/ 312px(MB)?(禁止 1200px / 1140px / 960px)
□ 【HTML栅格】楼层内容容器是否使用 margin-left: 216px + margin-right: 216px(PC)/ margin-left: 24px + margin-right: 24px(MB)?(禁止 `margin: 0 auto` + `padding: 0 216px` 组合)
□ 【HTML栅格】楼层内容容器 padding 是否为 0?(禁止用 padding 控制楼层边距,padding 仅用于组件内部间距)
□ 【HTML栅格】验证:margin-left + width + margin-right = 画布宽度(PC: 216+1488+216=1920 / MB: 24+312+24=360)
□ 【HTML颜色】`:root` 中的颜色值是否来自上游Token(openeuler-token.json),而非凭训练数据猜测?(尤其检查 `--o-color-fill1` 是否误写为纯白 `#FFFFFF`)
□ 【HTML颜色】`body` 的 `background-color` 是否使用 `var(--o-color-fill1)`?(禁止 `#FFFFFF` / `white`)
模式 A:get_node_dsl(itemId) + get_image(itemId) 验证
模式 B:在浏览器中打开 HTML 片段验证
验证不通过 → 修正后重验,通过后才进入下一个楼层。
第七步:组装所有楼层为完整页面
所有楼层验证通过后,按楼层顺序组装为完整页面:
导航楼层 → Banner 楼层 → 楼层 1 → 楼层 2 → … → 页脚楼层
楼层间距统一使用间距 10(PC 72px / MB 32px)
模式 A:将所有楼层 HTML 拼接为完整页面,通过 code_to_design 输出
模式 B:将所有楼层 HTML 片段组装为完整 HTML 文件,包含统一的 <head> / CSS Reset / Token 引入
第八步:最终验证
□ 页面结构是否符合:导航 → [Banner] → 楼层(s) → 页脚?
□ 楼层间距是否统一为间距 10(PC 72px / MB 32px)?
□ 全页组件组合是否无黑名单违规?
□ 整体视觉一致性检查
通用生成约束(所有楼层共用)
🚨 以下约束无论哪种模式、哪个楼层均强制生效,违反即违规:
- 必须逐一读取当前楼层涉及组件的规范文档
components/{name}.md- 合法的参数来源只有三个:① 对应组件规范文档 ② 硬约束白名单(第零步) ③ 上游 Token 真源
- 三者之外的任何取值均属自定义内容,一律禁止,包括但不限于:近似色值、估算间距、推断圆角、猜测默认变体
- 如果规范文档中找不到所需参数 → 停下,询问用户,禁止自行填充
- 图标:直接内嵌
<svg>路径,禁止色块占位符或<img src>引用- SVG 颜色:
currentColor继承父元素色值,或对应 Token CSS 变量
楼层模板索引
每个楼层模板是一个自包含的生成单元——AI 读了这个文件就能精确生成该楼层,无需再拼凑多个组件规范。模板包含:布局结构、精确尺寸/间距/字号值(直接取自硬约束白名单)、PC 和 MB 双端规格。
| 楼层 | 模板文件 | 典型用途 |
|---|---|---|
| 导航 | floors/navigation.md | 页面顶部导航栏(PC/Mb) |
| Banner | floors/banner.md | 首页/栏目页顶部横幅(XL/L/M) |
| 卡片栅格 | floors/card-grid.md | 功能展示、产品列表、特性介绍 |
| 图文特色 | floors/feature-section.md | 左图右文/左文右图特色介绍 |
| 页脚 | floors/footer.md | 站点地图、版权信息、社交入口 |
节点 ID 获取方式
- 从 Pixso 画布 URL 提取:
?item-id=1:2→ itemId 为1:2 - 使用
mcp__pixso-desktop__get_all_components或mcp__pixso-desktop__get_local_styles返回结果中查找对应 key/id
注意事项
- 当你准备使用某一个组件来生成设计稿时,你应该读取 opendesign-components 的 skill,来看他对应的组件开发 skill 中说明的传参是否足以支持你的想法
- 所有
itemId格式为"数字:数字",例如"123:456" - 若未指定 itemId,工具默认操作当前 Pixso 画布中已选中的节点
- 导出图片时使用
get_export_image并配置 exportSettings(PNG/SVG/PDF 等) - 组件文档中所有色值、字号、间距必须匹配上游 Token 的变量名,禁止使用硬编码值
- 编写组件文档时,参见 global/component-doc-spec.md 中的 Token 匹性要求和格式规范
异常与降级策略
| 异常场景 | 处理方式 |
|---|---|
| WebFetch 拉取上游 Token 失败(超时 / 404) | 使用 Pixso 本地 get_variables / get_local_styles 作为降级数据源,在输出中注明「Token 真源未拉取,使用本地变量」 |
components/{name}.md 不存在 |
停下告知用户该组件暂无设计规范,询问是否继续(无规范 = 无合法参数来源,禁止自行推断) |
| componentKey 在索引中找不到匹配变体 | 使用 get_all_components 实时搜索组件库,按名称模糊匹配;仍无结果 → 停下询问用户 |
| 硬约束白名单无法覆盖需求值 | 停下告知用户该值不在合法取值集合内,给出最接近的白名单值供选择,禁止静默取近似值 |
references/assets/ 中无目标 SVG |
按图标使用规则降级:手写线性风格 SVG 路径,并在 HTML 注释中注明「assets 中无资源」 |
| Pixso MCP 工具调用失败(连接断开 / 权限不足) | 停下告知用户具体报错,建议检查 Pixso 桌面端连接状态;不可跳过该步骤继续生成 |
componentKey 速查
- 完整 536 个 UI 组件变体:references/pixso-mcp-adapter/component-keys.md
- 完整 187 个图标 componentKey:references/pixso-mcp-adapter/icon-keys.md
常用高频变体(Light 模式默认变体,已验证):
| 组件 | 变体 | componentKey |
|---|---|---|
| ONavigation/顶部导航 | PC, Dark=off | 561d3014fbe6f361abfecc203a06f1ab6cad43af |
| ONavigation/顶部导航 | PC, Dark=on | c4522744b94335f4bc8fbc358c2316d3c447b771 |
| ONavigation/顶部导航 | Mb, Dark=off | 7675ede074069cf358a0f164f76e1c6c119a592f |
| 导航 Navigation/底部导航 | PC | 5d66a734f21bfcce1fbe4fce1d79f832b7f08f02 |
| 导航 Navigation/底部导航 | Mb | 62383dfdd93fd29e6dfcb7def1861d22d005324a |
| OBreadcrumb 面包屑 | Dark=off | 7838d75ba480e2c51fe0f741109ba6c9745a6f86 |
| 搜索框 Search | large, Enabled, Light | 504d78f315ae03447c67e6019f787e5656b4aa1a |
| 搜索框 Search | medium, Enabled, Light | bfb0631d6779aa79179e27e84534dd68acd2fa0e |
| OButton 按钮 | solid, medium, Light | eab0e6c545d27376ba67aef7dd233fc58c476234 |
| OButton 按钮 | outline, medium, Light | 3cd0c2f583c60180725e297d3529d67ed62fcad8 |
| OButton 按钮 | text, medium, Light | 2b717cf5c4d422ff4385f6f215d52fa4dcc1c04a |
| OButton 按钮 | solid, large, Light | 1a36bbfd374263c7b4644d4490e8bb65450c2f57 |
| ODropdown 下拉菜单 | medium, solid, Light | 647e1f27461028010d0828c17a8dfb6f245bd449 |
| ODropdown 下拉菜单 | medium, outline, Light | 6c12a6d3766a2055cd8f300e001c589084b2decd |
| ODropdown 下拉菜单 | medium, text, Light | cdf3700ce2d84a8bcf81720f9d64a0c867909268 |
| OPagination 分页 | All, Dark=off | 35bb7a0ef9189834048e73d6832418da0796d993 |
| OPagination 分页 | Simple, Dark=off | c8d2772ff9159d6bc99498f30ba24bb001039139 |
| OCard 卡片 | cover, vertical, Light | a22044aaa494bba137bd3ebba74319449b998694 |
| OCard 卡片 | cover, horizontal, Light | 0fceafcdae43547862ffb167bdcce89f510c3c35 |
| OCard 卡片 | icon, vertical, Light | 6103b3265e752087a546bf1b77a0f1b5bfef888b |
| OCard 卡片 | icon, horizontal, Light | e2a10a804dc8cb9ab507d237c712f65c7cf12f5e |
📎 人工参考附录
- 更新日志:CHANGELOG.md
- 项目说明与目录结构:README.md
- 组件文档编写规范:global/component-doc-spec.md