流·Studio 设计系统
本页是 design.md 的可视化样板间。所有 token / 组件均来自 assets/restraint.css —— 看到的就是页面用的。点击色块复制 token,hover / 点击组件看真实交互反馈。
设计哲学
一句话:一台精密设备的工作面板。克制 + 单橙锚点 + 图纸装订线 + Mono 装饰。
三条铁律 // 不可妥协
核心签名 // 4 个不能丢
- 主橙
#fa5d19(Firecrawl 实测)+ 单 hue alpha 阶梯 - 全场 8 px 圆角(Pill 999 例外)
- 主容器左右装订线 + 四角准星
- Mono 装饰
[ 200 OK ]// 05.14[ /v2 ](品牌签名 · Firecrawl 没有)
色彩系统
冷灰底 · 单 hue 橙 · 5 色信号点。点击色块复制 token 名。禁止创建新色值,所有颜色必须用以下 token。
表面 / 背景 // 4 档 · 冷灰无色相
边框 // 3 档 · 差距极小靠语义
3 档相差只 1–2 色阶,肉眼几乎看不出。用语义,不用视觉对比 —— 80% 场景用 --border-faint。
主橙 Heat // 单 hue #fa5d19 + 8 档 alpha
全靠 alpha 叠加,绝不换 hue。hover 不切换深橙,而是用 90% / 16% 这些档位组合。
Accent 多彩点 // 5 色信号 · 限定语义场景
只用于语义信号(代码高亮 / info / 状态色),禁止做大面积装饰 —— 全场依然只有橙色一个 accent。
状态色配套(底 / 边) // 8% / 20% alpha
Selection · Firecrawl 签名细节
页面任何文字选中时,底色 --heat-20 + 字色 --heat。试选下面这行字看效果:
本月营收 ¥327,400 较上月增长 33%,有 5 个项目处于"生成中"状态。其中 2 个需要重新调整模特模板。
Black-Alpha 阶梯
日常用得最多的 token。0–24% 用 rgba(0,0,0,...);32% 起换 rgba(38,38,38,...)(避免叠出"灰中带蓝")。
字体系统 · 中英协作
Inter(英文/数字)+ Alibaba PuHuiTi(中文)+ JetBrains Mono(装饰)。浏览器按字符级 fallthrough,不需要 JS,中英自然分工。
字体族原理 // browser-level character fallthrough
字重档位 // 400 / 500 / 600 · 700 仅徽标
// Bold 700 仅用于 Ctrl K 这种纯英文徽标场景 · 正文严禁 700(中英字重错位会暴露)
字号 / 字重 / 行高(11 档)
数值类必须加 tabular-nums 或 .num。中文正文行高 1.65–1.8。
圆角阶梯
统一 8 px 作为默认主圆角。完全圆 999 px 仅用于 pill / dot。不确定就选 8 · >12 px 直接判错。
间距阶梯
基础栅格 4 px。当不确定 padding 是 16 还是 24 时,选 24。当不确定 margin 是 48 还是 64 时,选 64。
常用阶梯
典型场景
| 场景 | 值 |
|---|---|
| Sidebar 宽度 | 248 px |
| Topbar 高度 | 64 px |
| Content padding | 48 · 28 · 72 |
| 卡片内 padding(大) | 28 · 30 或 24 · 28 |
| 列表行 padding | 14 · 18 ~ 20 · 24 |
| KPI cell padding | 24 · 28 |
| 主区块 margin | 64–104 px |
| 子区块 margin | 36–48 px |
| 卡片网格 gap | 14(子区)/ 24(主区) |
阴影 · 只 3 个允许场景
主 CTA(4 层橙色发光)+ Toast/Dropdown 浮层(白色 6%)。其他场景一律禁阴影。
边框策略 · inside-border
默认边框用 ::before 伪元素绘制(而非真 border),hover 时让 ::before 透明度 → 0,不触发布局抖动。hover 下面的卡看效果。
页面骨架(全站统一)
每个新页面都用同一套 HTML 骨架。shell.js 自动注入 sidebar + topbar,页面只写 <main> 内的 .content 内容。
HTML 模板
<link rel="stylesheet" href="assets/restraint.css">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700
&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<div class="app">
<aside class="sidebar"><!-- shell.js 注入 --></aside>
<main>
<div class="topbar"><!-- shell.js 注入:crumbs · right --></div>
<div class="content">
<div class="page-head">
<div>
<h1>商品库</h1>
<div class="sub"><span class="mono">// 12 个商品</span> · 描述</div>
</div>
<div class="actions">
<button class="btn">导入</button>
<button class="btn btn-primary">+ 新建商品</button>
</div>
</div>
<div class="section-h">
<h2>最近项目</h2>
<a class="more">[ ALL · 12 ] →</a>
</div>
<!-- 内容 -->
</div>
</main>
</div>
<script src="assets/shell.js" defer></script>
主容器装订线
工作台 / 项目列表 / 商品库 / 流水线主区:左右两条 1 px 边线 + 4 角圆弧内凹 SVG 准星。Modal / 编辑器全屏画布不必加。
// container-demo · max-width: 720 · border-x only
Icon 系统
统一 SVG line icon · stroke 1.5 · linecap round · 颜色通过 currentColor 继承。禁用 emoji / filled icon。
尺寸阶梯 // 5 档
颜色场景 // 通过 currentColor 继承
Icon Box // 快捷入口 / Modal 头部用
胶囊 · 严格 3 级分层
同级别尺寸必须完全一致。pill 永远是 999 px(完全圆),靠 dot 体现状态。
L1 · 大胶囊 // h:28 / fs:13 / dot:8 · 项目状态 / 列表行主标签
L2 · 中胶囊 // h:22 / fs:11.5 / dot:6 ★ 默认
最常用尺寸。卡片内 / 表格内默认。
L3 · 小胶囊 // h:18 / fs:10.5 / dot:5 · KPI 角标
对比 // 同色 3 级并列
输入框 · 5 状态
高 36 px / 圆角 8 / inside-border。focused 时橙色 ring 内嵌 1 px,error 时红边 + 红软底。点击下面字段看真实 focus 反馈。
带图标 / 搜索 // 含 Ctrl K 提示
// 关键坑:左侧 icon 必须 z-index: 2(否则被 input 白底盖住)· Ctrl K 用纯文本不用 ⌘(JetBrains Mono 不带该字形)
表单控件 · Checkbox / Radio / Switch
全部用真 SVG indicator,禁止 border-width / rotate(45deg) 凑对勾(在缩放/字体渲染下会变形)。点击下面控件试试。
Checkbox
Radio
Switch
KPI 统计行 · 4 格
1 行 4 格 grid · 共用一个 inside-border 容器 · 无 gap。列与列之间用 1 px 分隔线。
进度条段位
动 = 在运行,静 = 完成/失败。脉动只给"进行中"(橙)。已完成绿、失败红、未开始灰。
列表行
grid: 56px 1fr auto auto auto · gap 22 · padding 20·24。hover 我看整行底色变化。
Tab · 双层结构
主 Tab 用下划线激活(2 px --heat 横线)。副 Tab 用灰度→彩色 icon 反馈。点击切换。
主 Tab
副 Tab · 灰度→彩色
卡片 / 快捷入口
所有卡片统一 8 px 圆角 · 1 px 边框 · 无阴影。快捷入口含 hover / active 状态。
快捷入口 // hover 我
提示框
白底 · 1 px 虚线边框(dashed)· 8 px 圆角 · 加粗标题 + 正文。
弹窗 Modal
居中 460–480 px · 4 角 SVG 准星 · 8 px 圆角 · backdrop-filter: blur(8px) · 弹性入场。点击下方按钮打开 · ESC / 点击遮罩关闭。
Toast 通知
右下角浮出 · 300ms 弹性入场 · 2400ms 自动消失。触发演示:
AI 对话面板
编辑器型页面专用(AI 图片创作 / 流水线 AI 助手 / 商品 AI 优化 / 镜头脚本)。3 个编辑器页定义一致,已成事实组件 — 应抽到 restraint.css。
完整对话面板 // .chat-pane · 试在输入框打字看 focus 反馈
消息气泡规则 // .msg.ai vs .msg.user
| 类型 | 对齐 | 气泡背景 | 气泡边框 |
|---|---|---|---|
.msg.ai | 左对齐(默认) | --surface 白 | --border-faint |
.msg.user | 右对齐(flex-end) | --heat-12 浅橙 | --heat-20 |
// 所有气泡共享:max-width 90% / padding 10·14 / font 13 / line-height 1.6 / radius 8 · 时间戳放气泡下用 mono 11px / alpha-48
打字指示器 // .ai-thinking · 1.2s 交替闪烁
商品 / 资产卡片体系
商品 + 资产 + 人物 + 场景共用一套卡片体系。按"使用场景"选形态,不要为每种内容类型做新类。
三种形态对照 // 选谁?看场景
| 形态 | 类名 | 缩图比 | 缩图宽度 | 使用场景 |
|---|---|---|---|---|
| 网格主卡 | .product-card | 1.4:1 / 1:1 / 3:4 | 自适应宽 | 商品库 / 资产库 / 主网格 |
| 行卡(列表) | .prod-row / .mp-prod-item | 1:1 | 28–36 px | 表单已选行 / 侧栏列表 |
| 选择器卡 | .pl-card / .opt-card | 1:1 或 3:4 | 100–160 px | Modal 内多选 picker |
形态 1 · 网格主卡 // .product-card · 主网格用
// 缩图比例按内容类型选 · 商品 1.4:1(.product-thumb 默认)· 资产 1:1(加 .r-square)· 人物 3:4(加 .r-portrait)
形态 2 · 行卡 // .prod-row · 表单 / 侧栏用
// hover 右侧 X 变红 · 用于"已选商品"列表 / 流水线 stage 选中态
形态 3 · 选择器卡 // .pl-card · Modal 多选 picker · 点击切换 selected
// 3 种状态:默认浅灰 / hover 变白 / selected 橙边 + 浅橙底 + 右上勾
人物 / 演员 / 模特卡
选择器卡的"人物 3:4 竖图"特例。复用 .pl-card 的选中态逻辑,只换缩图比例为 3:4。点击切换:
// 跟 .pl-card 同基础 · 只是 .m-thumb 用 aspect-ratio: 3/4(人物竖图标准) · 多了 .m-meta 行
场景 / 通用资产卡
场景卡 = 资产卡的"1:1 通用"形态。不要做新类,派生类(`.scene-card / .person-card / .background-card`)只语义命名,样式继承 `.asset-card-2`。
// hover 边变橙 + 浅阴影 · 通常宽 240px(可放在 flex 横滑容器里) · 同样 class 也用于素材库 / 人物库 通用卡
其他高频复用组件
以下组件已在 2–5 个页面重复定义,需要尽快抽到 restraint.css。在此先做规范展示。
§4.17.1 流程步骤条 // .stepper · 大尺寸主流程
// 已完成:黑底白字 · 进行中:橙底白字 + 600 字重 · 未开始:白底灰字 · 与 .prog 区别:.prog 是小徽标横在卡片角,.stepper 是大尺寸主流程
§4.17.2 分页 // .pagination · sticky bottom
// 激活页用橙底白字 600 · 页码按钮 30×30 / 4 px 圆角(密集场景小圆角不破节奏)
§4.17.3 视图切换 // .view-toggle · 模式切换组
--accent-black 黑底白字 · 模式开关不抢主橙的舞台§4.17.4 操作型胶囊 // .pill-tip · 可点击的链接式 CTA
// hover 时 bg → 橙 / 字 → 白 + shadow-cta · 与 .pill.info(静态状态徽标)区别:.pill-tip 是可点击操作
§4.17.5 卖点 / 编辑式列表 // .bullet-list · 表单常用
- 1 100% 棉麻 · 透气吸汗
- 2 独家设计 · 限量 200 件
- 3 隐形拉链 · 显瘦剪裁
- +
// 序号 .num 22×22 mono 700 字色 heat · 最后一行 .bl-add 用 dashed 虚线区别于已添加项 · hover 时删除按钮显示
AI 生成结果卡
用于"输入提示词 → 多候选输出"场景(AI 图片 / 视频创作 · 模板生成 · 批量预览)。三个可变接口:① 图片比例 ② 悬浮按钮 ③ 底部按钮,其他全部复用。
完整示例 // hover 图片看右上浮层 · 点击图片看中央反馈 toast
变体 · 9:16 竖图 / 2 列 // --ratio: 9/16 --cols: 2
// 切换 --ratio 和 --cols 即可适配视频 9:16 / 横屏 16:9 / 海报 4:5 / 头像 1:1 · 悬浮按钮和底部按钮按业务定制
三个可变接口对照 // 决策表
| 维度 | 怎么变 | 典型场景 |
|---|---|---|
| ① 图片比例 | style="--ratio: 9/16; --cols: 2" | 1:1 头像 · 9:16 短视频 · 16:9 横屏 · 4:5 海报 |
| ② 悬浮按钮 | .gen-image-actions 内放 1–4 个 .gen-img-btn | 重新生成 · 下载 · 收藏 · 分享 · 用作参考 · 更多 ··· |
| ③ 底部按钮 | .gen-card-actions 内放 .btn-sm | 重新编辑 · 再次生成 · 编辑分镜 · 导出 · 更多 ··· |
Don't // 常见错误
Mono 装饰元素
方括号标签 / 双斜杠注释 / 中点连接 —— 这些是流·Studio 独有的"调试视图感",Firecrawl 没有,绝对保留。
方括号标签
注释样式时间戳
命令路径
数值后缀
// 主体大字 + 小字次级用 <small>
ASCII 散点(背景装饰)
· +XX+
+XXXX·
+X·
强调单词上色
本月营收较上月增长 +33%,有 5 个项目处于"生成中"状态。其中 2 个需要重新调整模特模板。
// 关键名词加深一档(不变橙),橙色只留给 CTA
五种页面级布局模式
页面骨架统一,内容区布局按用途分 5 类。新页面归类后选对应模式。
[ stats.with-corners · KPI 4 列 ] [ section-h ] [ ░░ recent-row × N ░░ ] [ shortcut × N ] [ tip · 虚线提示 ]
[ toolbar: search-inline + chip-wrap × n + view-toggle ] sticky top [ result-meta · 共 N 条 ] [ ░░ 卡片网格 / 列表 ░░ ] [ pagination ] sticky bottom [ bulk-bar(选中后显示) ] 吸底浮动
[ 左栏 · 资产/导航 sticky ] [ 中央 · 画布/参数 ] [ 右栏 · 预览/AI 助手 ] └───────── 整页 viewport 高度锁定 · 不滚 main ────────┘
[ .wizard ]
├─ .steps · 200 px sticky ← 左步数条
└─ .panes · 1fr ← 右滚
├─ .wiz-pane #step-1
├─ .wiz-pane #step-2
└─ .wiz-pane #step-3
┌─────────────────┐
│ │
│ .input × N │
│ .btn-primary │
│ │
└─────────────────┘
待统一清单
扫完 18 个 HTML 发现的偏离点。按影响视觉一致性程度排序。改页面时遇到这些点,顺手改正。
| # | 问题 | 现状 | 应改为 |
|---|---|---|---|
| 1 | 按钮等级混乱 ★ | 各页随意选 .btn / .btn-primary / .btn-ghost,部分页面 2 个一级橙并列,"取消"被做成主橙;尺寸也乱(38/32/44 混) | 按 §4.1 三级体系:一个区域只 1 个一级(主动作) · 二级(并列动作) · 三级(辅助) · 尺寸默认 36 / lg 40 / sm 28 |
| 2 | 输入框高度 | products 38 / projects search 32 / login 36 | 统一 36 |
| 3 | Tab 激活样式 | product-detail 下划线 / library 底色填充 | 统一下划线 + bottom 2 px heat |
| 4 | Hover 底色 | 多数 bg-lighter / 部分 black-alpha-4 | 统一 black-alpha-4 |
| 5 | 卡片标题字号 | projects 13.5 / products 14 | 统一 14 / 500 |
| 6 | 卡片网格列宽 | products 240 / library auto 180 / projects-new 4 列 | 商品 240 · 资产 180 · 通用 auto-fill 220 |
| # | 问题 | 现状 | 应改为 |
|---|---|---|---|
| 7 | Pill 变体不全 | restraint.css 4 种 / library 用了 .pill.archive 没定义 | 补 .pill.archive(灰)/ .pill.warn(honey) |
| 8 | X 关闭按钮 | drawer 30 / modal 32 / toast 28 | 统一 32×32 / 8 px 圆角 |
| 9 | label 字重 | products 500 / product-detail 600 | 统一 500 |
| 10 | mono 装饰 | 部分页有 4 角 [ 200 OK ],部分没 | 主工作台型必有 · 编辑器型可省 |
| 11 | section-h 分隔 | 部分 border-bottom / 部分没 | 统一不用(留白即分隔) |
| # | 问题 | 现状 | 应改为 |
|---|---|---|---|
| 12 | 编辑器页 inline style 过大 | pipeline 795 / model-photo 1393 / platform-cover 1003 行 | 抽 .stepper / .shot-card 到 restraint.css 或 editor.css |
| 13 | 四角准星重复 SVG | 部分页定义自己的 SVG 背景 | 全部改用 .with-corners + .corner-tr/.corner-bl |
| 14 | 滚动条样式残留 | 部分页 inline scrollbar-width: thin | restraint.css 已全局隐藏 · 清理 inline |
| 15 | mono 字体里的中文 | 部分页直接写 font-family: monospace | 全部换 var(--font-mono) |
Don't List · 绝对禁止
任何 mockup / 代码 review 时,对照此清单。每一条违反都判错。
--heat-90 等 alpha 阶梯backdrop-filter 只用于 modal 遮罩新页面 / 改页面 checklist
每次开工前过一遍。3 个阶段都不能跳。
- 已 Read [电商AI平台/design.md](design.md) §1 §3 §8(至少)
- 用 Grep 查 restraint.css 是否已有该组件
- 看本 design-system.html 找视觉参考
- 不确定的设计点 → 先问用户,不要凭感觉
- HTML 用
app > sidebar + main > topbar + content骨架 - head 含
assets/restraint.css+ Inter + JetBrains Mono - body 末尾
assets/shell.js - 标题区用
.page-head > h1 + .sub - 主操作按钮放
.page-head > .actions(自动 40 px 高) - 子区块用
.section-h > h2 + .more - 按钮全
.btn系列 · 不要自己写 - 状态徽标全
.pill.info/.ok/.err/.neutral - 输入框全
.input / .select / .textarea· 字段用.field - 浮层全用现成 Modal / Drawer / Toast
- 图标 SVG line · stroke 1.5 · linecap round ·
stroke="currentColor" - 时间戳 mono 注释
// 05.22 · 周四 - 强调单词加深(不变橙)
<b style="color:var(--accent-black)">3 个</b> - 数字加
.num或tabular-nums - 状态色按语义选
--heat / --accent-forest / --accent-crimson / --accent-honey
- 对照 §8 Don't List 逐条过
- 浏览器打开页面 · 截图 + 跟本 design-system.html 对比
- 测 hover / focus / active / disabled 状态都正确
- 测 dark mode(给 body 加
.darkclass 看是否破) - 移动端缩到 1100 px 以下看响应式
- 不在 master/main 上,在 dev 分支
- 不带
--no-verify,不跳过 hook