Install
openclaw skills install cc-passenger-prototype用于扩展 CC招车系统乘客端 HTML/CSS 原型(OKLCH 色彩空间 + BEM 命名 + iPhone 15 Pro 393×852 frame,运行在微信小程序 WebView 中)。任何要在该原型项目上新增或修改的请求都应触发:补齐业态主流程(带货 / 出租车 / 快车 / 拼车 / 代办)、给现有页面加变体(01a / 01b 状态屏、空态 / 报错 / 节日皮)、新增 BEM 块(抽屉 / 弹框 / 底部 sheet)、维护 token 与组件库。触发短语示例:"加一个带货下单页"、"01 主页加变体"、"新增抽屉组件"、"调整 brand 色"、"补齐快车业态"、"对齐截图新增"、"按现有原型扩展"、"基于 base.css 加块",以及任何提到 pages/、base.css、tokens.css、BEM 块名(.home / .od-form / .tripcard 等)或截图编号(01g / 03c / 04d 等)的请求。不要把它当通用移动端 UI Skill 用,也不要用来出 iOS HIG 风稿——本 Skill 仅服务于该项目。
openclaw skills install cc-passenger-prototype本 Skill 只做一件事:在不破坏既有设计语言的前提下,扩展 CC招车乘客端 HTML/CSS 原型。每一次产出都必须像出自同一只手——和 pages/01-home.html 到 pages/08-profile.html 那 25 张原图风格一致。
这不是通用的移动端设计 Skill。项目已经在以下选择上落锚,不可替换:
base.css 里那一小撮 .flex / .gap-N / .text-2 工具).phone 类),12px 暗色外圈,48px 圆角,大投影cc-navbar(home + 标题 + capsule),所以原型 HTML 自身不渲染 .navbar;页面从 .phone__statusbar 直接进 .biz-tabs / 业务内容。.navbar 块仍保留在 base.css 里,为将来的 UniApp 落地预留(届时会包在 #ifndef H5 内),但当前所有 pages/*.html 都不渲染它。这条契约必须遵守。cc-navbar 已经占了那个位置。页面顺序是 .phone__statusbar → .biz-tabs(仅主页有)→ 业务内容。.subnav(来自 base.css)—— 02 城市搜索 / 03c / 03d 弹框在用.order__topbar(04 / 04b / 04d)、.picker__topbar(04c)、.add__topbar(04e)。这 5 个家族共享 48px / fs-16 / 32×32 图标 的契约;它们存在是因为各自需要 .subnav 没有的额外元素(副标题 / 帮助按钮 / 半透 dim 遮罩)。新加子页优先用 .subnav,只在需要 .subnav 没有的额外结构时才 fork 私有 topbar。把它们提升成 .subnav --order/--picker/--add 修饰符是 references/components-bem.md 里登记的 TODO。tokens.css,全局通过 var(--color-*) 消费。允许的硬编码颜色只有两处:业态 tab 选中下划线渐变 #19a0f0→#196afa(老乘客端的品牌签名),以及 .tabbar__item--active 的 oklch(40% 0.18 260)(已经是 OKLCH 形式,但故意比 --color-brand-500(oklch(56% 0.230 263))更暗、更冷、彩度更低)。复刻时一字不改。如果你开始想引 Tailwind、Inter 字体、Material 高度、iOS HIG 模式、hex 色——立刻停。它们都不属于这里。
用户的请求会落到下面 4 类之一。开工前先判定属于哪类:
| 任务类型 | 长什么样 | 主要参考 |
|---|---|---|
| A. 新业态页 | "补齐带货业态"、"加一个快车叫车主流程"、"出租车下单页"、index.html 中任意 frame--todo 占位(业态 09 带货 / 10 出租车 / 11 快车 / 12 拼车 / 13 代办) | references/pages-architecture.md + references/page-blueprints.md |
| B. 现有页面变体 | "01h 春节版主页"、"03e 余票全部售罄态"、"05e 退款中"、任何与既有屏匹配只换状态/皮肤 | references/page-blueprints.md |
| C. 新 BEM 块 / 子页 | "下单页加一个保险弹框"、"个人中心加邀请抽屉"、任何要新增可复用组件或模态 | references/components-bem.md |
| D. token / 库维护 | "把 brand 色调深一点"、"加一个语义色"、"shadow-2 太浅"、"抽象一个 list-card 块" | references/tokens-and-maintenance.md |
写一行 HTML/CSS 之前,先把对应的 reference 文件读完。不要扫读——里面装着字面 token 值、BEM 块契约、以及你需要照抄的过往决策。
落键前:
pages/(如果用户没附上,先索取)。在添加同辈页面前必须先看现有页是怎么搭的。任务 A 至少读 01-home.html、03-line-results.html、05-payment.html,吸收节奏。任务 B 读被改的那一页。任务 C 读宿主页 + base.css 里最接近的现有组件。tokens.css 与 base.css 在视野里。Skill 默认它们是项目的几何中心。绝不在新页面里写 :root { --color-... } 覆盖——真缺 token 就去 tokens.css 加。base.css 里已有的块(.btn、.chip、.tag、.card、.od-dot、.navbar、.subnav、.tabbar、.biz-tabs、.phone、.header-image、.cc-skeleton)。页面私有块在各自页面(.home__*、.tripcard__*、.timetable__* 等)—— 找最接近的复用,不要从头造。完整块清单在 references/components-bem.md。如果第 3 步走完仍然真的需要新块,再考虑提升——见 components-bem.md 里的 "什么时候进 base.css"。
本 Skill 的每次回复,按下列顺序产出:
一段简短开场,说明:任务类型(A/B/C/D)、用了哪一页/哪个块作为种子、有哪些不显然的判断(新加了什么 token、与截图的偏差等)。1–3 句散文,不写 checklist。
交付物,按任务类型分:
pages/ 的独立 HTML 页面。页面必须 <link rel="stylesheet" href="../styles/tokens.css"> 和 <link rel="stylesheet" href="../styles/base.css">,然后在 head 里写一个 <style> 块放页面私有样式,body 里是 .phone 标记。骨架模板见 references/page-blueprints.md。base.css 的 CSS 增量(或保留为页面私有的指引)+ 演示用法的 HTML 片段 + 宿主页面的接入 patch。tokens.css 或 base.css 的 diff,外加一段简短影响分析:哪些现有页面/块用到了被改的 token/块,改动后会变成什么样。index.html 入口卡片 —— 如果新建了页面(任务 A 或部分 B),同时给出可粘贴到 index.html 对应 biz-section 下的 <article class="frame">…</article> 块。沿用既有编号约定:业态根页 2 位数字,变体追加字母(01g、03c、04d)。
渲染预览给用户看,分两种宿主:
show_widget / mockup 类预览工具(Anthropic Skills 沙盒),先 read_me 模块 mockup,再 show_widget 完整 HTML。widget 必须自包含:把 assets/tokens.css + assets/base.css 内联进同一个 <style> 标签——可视化器解析不了 ../styles/ 这种相对路径。pages/<编号>-<slug>.html,告诉用户路径让他双击在浏览器打开。不要把样式表内联进保存文件——保留标准的 <link rel="stylesheet" href="../styles/tokens.css"> 形式。简短收尾,标注:
base.css 的新块 vs 保持页面私有的(以及为什么)下列规则来自既有代码,不是惯例。违反它们就意味着新页面会跟现有 25 张视觉冲突。
外框:每张屏都活在 <div class="phone"><div class="phone__notch"></div><div class="phone__statusbar">…</div><div class="phone__viewport">…</div></div> 里。viewport 高度 calc(852px - 44px) = 808px,display: flex; flex-direction: column;,overflow: hidden。子元素垂直堆叠,固定栏 flex-shrink: 0,可滚动区用 flex: 1 + .scroll-y 填剩余空间。因为 viewport 是 overflow: hidden,静态原型里的弹框/抽屉在 .phone__viewport 内用 position: absolute,不能用 position: fixed(fixed 会逃出手机框)。
状态栏:左侧写真实的 24 小时时间(如 17:09 / 18:05——和用户准备对照的截图时段一致;现有 25 张每张都是不同的真实时间,不要用 iOS 营销时间 9:41);右侧三图标组(信号 / WiFi / 电池)通过 .phone__statusbar-icons + .ios-icon SVG。SVG 标记从任意现有页拷过来,不要重画。
顶栏按层级选:
cc-navbar,再画 .navbar 会重叠。页面顺序是 .phone__statusbar → .biz-tabs(仅主页)→ 业务内容 → .tabbar。证据:01-home、07-orders、08-profile 各自都带显式注释 <!-- cc-navbar 在 H5 不渲染(uniapp 用 #ifndef H5 包住)-->。.subnav(‹ 返回 + 标题 + 模态页右侧 ✕ 关闭)。需要 .subnav 没有的额外元素时再选页面私有家族(.order__topbar / .picker__topbar / .add__topbar)—— 先读对应宿主页,再决定 fork。任何页面都不要放 .navbar。底部 tabbar 在 .phone__viewport 末尾,仅顶层目的地(出行 / 兑换 / 订单 / 我的)有。变体页和子页不显示 tabbar,除非它的原始屏就有。多屏对照文件(如 06-charter.html 把 3 屏装在一份 HTML 里供截图对比)合理地会渲染多次 tabbar——但每屏在逻辑上仍各自是一页。
点击区 ≥ 44×44:所有可交互元素。.btn 默认 36px,那是行内次级动作;主 CTA 用 .btn--block(44px)或 .btn--block-lg(52px、letter-spacing: 4px——这个间距是品牌签名,保留)。
颜色一律走 token。base.css 里允许的两个硬编码值(业态 tabs 渐变、tabbar 选中色)之外的一切都必须 var(--color-*)。哪怕一次性的强调色也走 token。
OD 起讫点用 .od-dot + --start / --end 修饰符。它们带 3px 外环 box-shadow,不要自己重画。
字体:
font-family: var(--font-num)(或 .num 工具类)。var(--font-sans)(PingFang SC 栈),从 body 继承。不要重复声明。--fs-11 到 --fs-28 token,不写裸值 font-size: 14px。间距走 4px 基线:var(--sp-1) 到 var(--sp-10)。不要写 padding: 11px 这种魔数。
圆角走圆角刻度:xs 4 / sm 6 / md 8 / lg 12 / xl 16 / 2xl 20 / pill 999。按钮 & chip → md,卡片 → lg,底部 sheet → 仅顶部两角 2xl。
暗色模式自动:tokens.css 里 @media (prefers-color-scheme: dark) 切 token 即可。绝不在页面或块内写 @media (prefers-color-scheme: dark)——让 token 级联。唯一例外是 .phone__notch,明暗都硬编码为深色(base.css 里已经定好)。
中文文案:所有 UI 字符串、按钮文案、占位提示都是简体中文。数字 / 价格 / 编码用 font-num 字体。
如果用户的需求歧义很大(比如"做一个带货页面"——但带货有 5+ 子屏),不要反问 3 个澄清问题。挑最小合理解释直接做,结尾用一句话提示"接下来建议补齐 X / Y / Z"。用户的迭代速度比规格完整度更重要。
如果用户给了截图但没指定编号,按惯例提一个(在该家族最新变体之后取下一个未用字母)然后开干。