CC招车系统 · 乘客端原型 Skill
本 Skill 只做一件事:在不破坏既有设计语言的前提下,扩展 CC招车乘客端 HTML/CSS 原型。每一次产出都必须像出自同一只手——和 pages/01-home.html 到 pages/08-profile.html 那 25 张原图风格一致。
这不是通用的移动端设计 Skill。项目已经在以下选择上落锚,不可替换:
- OKLCH 色彩空间(不用 HSL,也不用 hex,除非现有代码已有)
- BEM 命名(Block / Block__Element / Block--Modifier;不用 Tailwind / CSS-in-JS / 工具类杂烩,除了
base.css里那一小撮.flex / .gap-N / .text-2工具) - iPhone 15 Pro 393×852 外框(
.phone类),12px 暗色外圈,48px 圆角,大投影 - WebView 容器架构 —— H5 原型运行在微信小程序的 WebView 内,小程序壳会在顶部注入它自己的
cc-navbar(home + 标题 + capsule),所以原型 HTML 自身不渲染.navbar;页面从.phone__statusbar直接进.biz-tabs/ 业务内容。.navbar块仍保留在base.css里,为将来的 UniApp 落地预留(届时会包在#ifndef H5内),但当前所有pages/*.html都不渲染它。这条契约必须遵守。 - 按页面层级选 topbar:
- 顶层 / Tab 目的地(主页 / 订单 / 我的 / 兑换):不渲染任何页面级 topbar——小程序壳的
cc-navbar已经占了那个位置。页面顺序是.phone__statusbar→.biz-tabs(仅主页有)→ 业务内容。 - push / 子页 / 模态页:48px 高的 topbar(‹ 返回 + 标题 + ✕ 关闭)。两种实现:
- 通用
.subnav(来自base.css)—— 02 城市搜索 / 03c / 03d 弹框在用 - 页面私有 topbar 家族 ——
.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。
- 通用
- 顶层 / Tab 目的地(主页 / 订单 / 我的 / 兑换):不渲染任何页面级 topbar——小程序壳的
- OKLCH token 集中定义在
tokens.css,全局通过var(--color-*)消费。允许的硬编码颜色只有两处:业态 tab 选中下划线渐变#19a0f0→#196afa(老乘客端的品牌签名),以及.tabbar__item--active的oklch(40% 0.18 260)(已经是 OKLCH 形式,但故意比--color-brand-500(oklch(56% 0.230 263))更暗、更冷、彩度更低)。复刻时一字不改。 - 中文 UI(简体中文),面向乘客的网约车 / 班线 / 包车场景
如果你开始想引 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。
-
交付物,按任务类型分:
- 任务 A 或 B → 一份完整的、可直接落到
pages/的独立 HTML 页面。页面必须<link rel="stylesheet" href="../styles/tokens.css">和<link rel="stylesheet" href="../styles/base.css">,然后在 head 里写一个<style>块放页面私有样式,body 里是.phone标记。骨架模板见references/page-blueprints.md。 - 任务 C → 给
base.css的 CSS 增量(或保留为页面私有的指引)+ 演示用法的 HTML 片段 + 宿主页面的接入 patch。 - 任务 D →
tokens.css或base.css的 diff,外加一段简短影响分析:哪些现有页面/块用到了被改的 token/块,改动后会变成什么样。
- 任务 A 或 B → 一份完整的、可直接落到
-
index.html入口卡片 —— 如果新建了页面(任务 A 或部分 B),同时给出可粘贴到index.html对应biz-section下的<article class="frame">…</article>块。沿用既有编号约定:业态根页 2 位数字,变体追加字母(01g、03c、04d)。 -
渲染预览给用户看,分两种宿主:
- 如果当前 host 有
show_widget/mockup类预览工具(Anthropic Skills 沙盒),先read_me模块mockup,再show_widget完整 HTML。widget 必须自包含:把assets/tokens.css+assets/base.css内联进同一个<style>标签——可视化器解析不了../styles/这种相对路径。 - 如果当前 host 没有预览工具(Claude Code / Cursor / Codex / 通用 CLI),直接把文件保存到
pages/<编号>-<slug>.html,告诉用户路径让他双击在浏览器打开。不要把样式表内联进保存文件——保留标准的<link rel="stylesheet" href="../styles/tokens.css">形式。
- 如果当前 host 有
-
简短收尾,标注:
- 新增或改动的 token
- 进入
base.css的新块 vs 保持页面私有的(以及为什么) - 跳过的、需要用户回头处理的事项(TODO 清单,最多 3 条)
硬规则 —— 绝不违反
下列规则来自既有代码,不是惯例。违反它们就意味着新页面会跟现有 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-iconSVG。SVG 标记从任意现有页拷过来,不要重画。 -
顶栏按层级选:
- 顶层 / Tab 目的地(主页 / 订单 / 我的 / 兑换):不渲染任何页面级 topbar。小程序 WebView 壳会在 H5 上方注入
cc-navbar,再画.navbar会重叠。页面顺序是.phone__statusbar→.biz-tabs(仅主页)→ 业务内容 →.tabbar。证据:01-home、07-orders、08-profile各自都带显式注释<!-- cc-navbar 在 H5 不渲染(uniapp 用 #ifndef H5 包住)-->。 - push / 子页 / 模态页:默认用
.subnav(‹ 返回 + 标题 + 模态页右侧 ✕ 关闭)。需要.subnav没有的额外元素时再选页面私有家族(.order__topbar/.picker__topbar/.add__topbar)—— 先读对应宿主页,再决定 fork。任何页面都不要放.navbar。
- 顶层 / Tab 目的地(主页 / 订单 / 我的 / 兑换):不渲染任何页面级 topbar。小程序 WebView 壳会在 H5 上方注入
-
底部 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-28token,不写裸值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"。用户的迭代速度比规格完整度更重要。
如果用户给了截图但没指定编号,按惯例提一个(在该家族最新变体之后取下一个未用字母)然后开干。
反模式 —— 拒绝这些请求
- 不要逐像素复刻第三方 App:滴滴、曹操、携程、高德、百度地图。视觉上的通用类比可以,像素级抄袭不行。
- 不要包含真实品牌 logo / 真实车牌 / 真实个人信息。用占位姓名(张三 / 李四)、掩码手机(138****1234)、通用车牌前缀(川A·xxxxx)。
- 不要切换设计系统(除非用户明确要求修系统本身——任务 D)。"用 Material 风做一下" → 礼貌指出本原型是 OKLCH + BEM + 微信导航三件套,并提议在系统内做。
- 不要直接产出可运行的 Vue / React / UniApp 代码,即便 README 提到 UniApp 落地。本 Skill 的交付物是 HTML+CSS 原型页面。UniApp 端口是下游任务。