原型设计技能
by @contsun
通用页面原型设计技能。基于 58种设计风格(默认Figma 风格) UI 的复杂业务系统 HTML 原型开发, 包括标准页面结构、统计卡片、筛选条件、数据表格、弹窗设计。 适用场景:(1) 创建新的管理页面原型 (2) 对照业务文档实现功能模块 (3) 设计弹窗和详情页 (4) 构建带看板和列表视图的页面。 **...
clawhub install prototype-design📖 About This Skill
name: prototype-design description: | 通用页面原型设计技能。基于 58种设计风格(默认Figma 风格) UI 的复杂业务系统 HTML 原型开发, 包括标准页面结构、统计卡片、筛选条件、数据表格、弹窗设计。 适用场景:(1) 创建新的管理页面原型 (2) 对照业务文档实现功能模块 (3) 设计弹窗和详情页 (4) 构建带看板和列表视图的页面。 样式选择:内置58+设计系统,直接引用
references/design-systems/ 目录。
使用时指定 DESIGN_SYSTEM=<名称> 即可应用对应设计风格。
origin: openclaw
last_updated: 2026-04-14
changelog:
- 2026-04-14: 初始版本,从 WMS 项目经验中沉淀
- 2026-04-14: 新增长对话上下文管理章节
- 2026-04-14: 新增 WMS 项目实战经验(10条核心教训)
原型设计技能
When to Use(何时使用)
How to Use(如何使用)
1. 项目初始化
mkdir -p project/{pages,styles,scripts}
cd project
2. 设计系统选择
内置设计系统(references/design-systems/):
figma-DESIGN.mdlinear-DESIGN.mdvercel-DESIGN.md原型设计技能
通用页面原型开发指南,支持58+设计系统风格。
项目结构
project/
├── index.html # 单页应用入口
├── pages/ # 页面模块
│ ├── dashboard.html
│ ├── staff.html
│ └── ...
├── styles/
│ └── main.css # 全局样式
└── scripts/
└── main.js # 全局脚本
设计系统选择
重要:设计系统文件位于 references/design-systems/ 目录。
使用步骤
1. 确定设计风格:根据项目需求选择设计系统 - 管理后台常用:Figma、Linear、Notion、Vercel - 电商/消费:Airbnb、Spotify、Stripe - 企业级:IBM、Salesforce
2. 读取对应 DESIGN.md
cat references/design-systems/figma-DESIGN.md
3. 应用设计规范 - Color Palette → CSS变量 - Typography → 字体规范 - Component Stylings → 组件样式
常用设计系统快速参考
| 风格 | 设计系统 | 特点 |
|------|---------|------|
| 默认 | figma-DESIGN.md | 多彩色、现代 |
| 管理后台 | linear-DESIGN.md | 紫色主题、精致 |
| 简约专业 | vercel-DESIGN.md | 黑白精准、极简 |
| 温暖风格 | notion-DESIGN.md | 暖色极简 |
| 企业级 | stripe-DESIGN.md | 紫色渐变、高级感 |
标准页面结构
页面标题
标题
数值
描述
字段名
字段1 字段2 操作
数据
状态
弹窗设计规范
标准弹窗模板
弹窗样式要点(必记)
| 元素 | 样式属性 | 正确值 | 常见错误 |
|------|---------|--------|---------|
| 外层遮罩 | position | fixed | 用 absolute 会滚动 |
| 遮罩背景 | background | rgba(0,0,0,0.6) | 0.5 太淡,0.7 太浓 |
| 遮罩定位 | top/left/right/bottom | 0(全屏覆盖) | 忘记设置任一边 |
| 弹窗容器 | display | flex | 父级用 flex 居中 |
| 居中方式 | align-items + justify-content | center + center | 缺少任一属性 |
| 内容框圆角 | border-radius | 16px | 12px 不够现代 |
| 内容框宽度 | width | 560px 或 90vw | 固定 px 在小屏幕不友好 |
| 内容框高度 | max-height | 85vh | 80vh 可能显示不全 |
| 阴影 | box-shadow | 0 25px 80px rgba(0,0,0,0.35) | 太淡看不出层次 |
表单项样式要点
| 元素 | 样式属性 | 正确值 |
|------|---------|--------|
| 输入框/下拉框 | padding | 10px 12px |
| 输入框/下拉框 | border-radius | 8px |
| 输入框/下拉框 | border | 1px solid #E5E7EB |
| 输入框/下拉框 | font-size | 14px |
| textarea | resize | none |
| textarea | box-sizing | border-box |
| 必填标记 | color | #EF4444 (红色) |
⚠️ 常见错误
1. 不要使用 CSS 类名:如 class="modal"、class="btn btn-primary" - 这些类通常没有定义样式或样式被覆盖
2. 必须使用内联样式:弹窗组件应完全使用内联样式,避免外部 CSS 干扰
3. 遮罩层必须有 z-index:1000:确保在最上层
4. 内容框不能用 overflow:hidden:内容超出需要滚动,必须用 overflow-y:auto
看板视图
待开始
5
单号
描述
Tab 切换
⚠️ 重要:保持 index.html 同步
问题现象:更新 pages/xxx.html 后,直接打开 index.html 查看不会看到变化。
原因:index.html 是单页应用入口,包含所有页面的内嵌副本。pages/ 目录的修改不会自动同步。
🔴 弹窗必须放在页面 div 内部
常见错误:弹窗 HTML 放在
...页面内容...
...页面内容...
🔴 Tab 切换函数必须使用页面级作用域
常见错误:使用全局选择器 .tabs .tab 会影响所有页面
// ❌ 错误:会选择页面上所有的 tab
const tabs = document.querySelectorAll('.tabs .tab');// ✅ 正确:使用页面级作用域
const tabs = document.querySelectorAll('#page-xxx .tabs > .tab');
Tab 切换函数模板:
function switchXxxTab(tabName) {
// 1. 隐藏所有 tab 内容
document.querySelectorAll('.xxx-tab').forEach(t => t.style.display = 'none');
// 2. 显示选中的 tab 内容
document.getElementById('xxx-' + tabName).style.display = 'block';
// 3. 更新 tab 按钮状态(使用页面级作用域)
const tabs = document.querySelectorAll('#page-xxx .tabs > .tab');
tabs.forEach((t, i) => {
if (i === /* 当前tab索引 */) {
t.style.background = '#EEF2FF';
t.style.color = '#4F46E5';
} else {
t.style.background = '#F3F4F6';
t.style.color = '#6B7280';
}
});
}
✅ 同步脚本
解决方案:每次创建/更新 pages/ 目录的页面后,必须运行以下同步脚本:
cd project
python3 << 'PYEOF'
import os
import re1. 读取当前index.html
with open('index.html', 'r', encoding='utf-8') as f:
content = f.read()2. 获取pages/目录下所有html文件(按文件名排序)
pages_dir = 'pages'
page_files = sorted([f for f in os.listdir(pages_dir) if f.endswith('.html')])3. 对每个页面文件,提取
for page_file in page_files:
with open(os.path.join(pages_dir, page_file), 'r', encoding='utf-8') as f:
page_content = f.read()
# 提取 page-xxx 块的完整内容
match = re.search(r'(]*class="page"[^>]*>.*?