Files
Starlight_Lancher/.agents/skills/lark-im/references/card/lark-im-card-style.md

282 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Card Style Guide
选择组件组合和视觉样式的决策指南。字段写法见 `card-2.0-schema.md`
---
## 好看的标准P0P7唯一裁判基准
**先读这一节。** 下面的「意图→组件」表和「视觉规范」都是为这套标准服务的手段;构造和自检卡片时**以 P0P7 为准**。
**目标函数**:一张好卡片 = 让收件人在**约 2 秒一瞥**内 get 到「这是什么 + 最重要的是什么 + 要不要操作」,且观感**有序、克制、不嘈杂**。高效传达与视觉舒适在此统一。
**用力分配**P0 必过(前置闸)→ P1P3 强约束(阻断)→ P4P5 基础卫生 → P6P7 加分。
每条都附**结构化验证句**——卡片不能渲染成图,只能对 JSON 结构推理,所以验证靠「数结构」而非「眯眼看」。
| | 准则 | 可操作要求 | 结构化验证(自检句) |
|---|---|---|---|
| **P0** | **符合诉求**(前置闸·阻断) | 精确承载用户要的信息/意图/操作,不缺、不多、不跑题;意图类型与组件组合匹配 | 把诉求拆成信息点清单,逐点在 JSON 里找到承载组件;操作诉求逐个找到交互组件。有缺=不过 |
| **P1** | **层级**(强约束·阻断) | header 承载「这是什么」body 内**有且仅有一个**最强焦点(最大字号/最重色/指标卡大数字),其余为支撑;标题用 `**加粗**`、次要信息用 grey | 列出所有文本的「字号+粗细+颜色」三元组,能否排出主>次>辅三层;焦点是否唯一 |
| **P2** | **分组**(强约束·阻断) | 同主题字段收进同一容器(`column_set`/`interactive_container`/背景块),不同主题分容器;块边界靠容器底色/描边/间距,**而非一路 `hr` 平铺** | 数顶层视觉块个数;是否存在「多主题挤在同一无分隔 markdown / 一路 hr 平铺」反模式 |
| **P3** | **复杂度适中**(强约束·阻断·双边带) | 下限:不得纯文字流水账,至少有分块+层级+适度色彩/图标;上限:视觉块 25、主色系 ≤3、组件不堆砌、焦点唯一 | ①是否 >1 个视觉块且含≥1 个非纯文本结构元素(背景块/指标卡/图标/表格);②块数 ≤5、主色系 ≤3。两端都满足才过 |
| **P4** | **对比**(基础卫生) | 标题与正文字号或粗细至少差一档;强调用色/放大;正文不滥用 `#/##/###`(数值焦点放大除外,见 P1 | 标题与正文是否在「字号或粗细」上至少差一档 |
| **P5** | **对齐**(基础卫生) | 间距优先交容器 `vertical_spacing`/`horizontal_spacing`/`padding`**不滥用散设 margin 造成疏密无规律**间距值收敛到一套档位2/4/8/12px顶层容器间距一致 | 是否存在无规律的散落 margin间距取值种类是否 ≤4 |
| **P6** | **语义一致**(加分) | 红=降/警/失败、绿=升/成/通过、grey=次要;主色系起始色由 header 决定、取邻近色环;同色同义 | 同一颜色是否对应同一语义header 模板色与块色是否同色系 |
| **P7** | **健壮**(加分) | 并列/指标列默认 `weighted``none`、**慎用 `stretch`**(防移动端拉伸);需要时配 `config.style.color` 的 light/dark不靠固定像素宽硬排 | 是否存在 stretch 拉伸风险;深浅色是否都可读 |
---
## 意图 → 组件组合
### 通知类(无交互或只读)
| 用户意图 | 推荐组件组合 | header.template |
|---|---|---|
| 纯文字通知 / 系统公告 | `column_set`(通知正文,带 `blue-50` 背景)+ `button(open_url)` | `blue` |
| 活动公告(带主视觉图) | `img`(主图)+ `markdown`(时间/地点)+ `column_set`(详情对)+ `button(open_url)` | `turquoise` / `blue` |
| 成功 / 完成状态通知 | `column_set`(关键字段,带 `green-50` 背景)+ `markdown`(结论加粗) | `green` |
| 审批结果反馈(已通过 / 已拒绝) | `column_set`(申请信息)+ `column_set`(审批结论 + icon`green-50`/`red-50` 背景) | `green` / `red` |
| 生日 / 节日祝福 | `img`(主图)+ `column_set`(人名/日期)+ `button(open_url)` | `orange` |
| 产品 / 功能上线推广 | `img`(主图)+ `markdown`(亮点)+ `column_set`(功能高亮块)+ `button(open_url)` | `blue` / `violet` |
| 多图展示图集、AI 生成图) | `img_combination` 或 多个 `img` + `markdown`(说明)+ `button(callback)` | `default` |
### 提醒 + 操作类
| 用户意图 | 推荐组件组合 | header.template |
|---|---|---|
| 提醒 + 一键操作 | `column_set`(详情,带 `yellow-50` 背景)+ `button(callback)` | `yellow` |
| 任务清单 / 待办跟踪 | `checker` × N每项带 `behaviors: callback`+ `button(callback)`(全部完成操作) | `blue` |
| 告警触发(需立即处理) | `column_set`(告警指标,带 `red-50` 背景)+ `column_set`(描述 + input 快速备注)+ `button(callback)` | `red` |
| 告警已解决 / 状态变更 | `column_set`(解决时间 / 负责人,带 `green-50` 背景)+ `markdown`(结论加粗) | `green` |
| 审批待处理(含备注输入) | `column_set`(申请信息,带 `grey-50` 背景)+ `column_set`input 审批意见)+ `button(callback)` × 2通过 / 拒绝) | `default` |
| 日历 / 日程提醒(含参与人) | `column_set`(时间 / 地点,带 `yellow-50` 背景)+ `person_list`(参与人)+ `button(callback)` | `yellow` |
| 危险操作确认 | `column_set`(说明,带 `red-50` 背景)+ `button(callback)` + `confirm` 弹窗配置 | `red` |
### 数据 / 报告类
| 用户意图 | 推荐组件组合 | header.template |
|---|---|---|
| 日报 / 工作汇报 | `column_set`(指标,带背景色)+ `interactive_container`(进展分块,带描边)× N内容过长的块用 `collapsible_panel` 折叠次要细节 | `blue` / `default` |
| 数据看板(含图表) | `column_set`(指标,带 `blue-50` 背景)+ `chart` + `table`(根节点,不可嵌套)+ `markdown`(说明) | `blue` |
| 排行榜 | `column_set` 固定列宽(序号 + 头像 `img` + 名字 + 指标)循环条目 | `grey` |
| 订单 / 工单详情 | `div.fields`(字段对)或 `column_set`(需彩色背景块时)+ `button(callback)` | `orange` |
### 表单 / 收集类
| 用户意图 | 推荐组件组合 | header.template |
|---|---|---|
| 纯文字表单收集 | `form`(内含 `input` + `button(form_action_type: submit)` | `blue` |
| 带下拉选择的表单(单选) | `form`(内含 `select_static` / `select_person` + `input` + `button` | `wathet` |
| 带多选的表单 | `form`(内含 `multi_select_static` / `multi_select_person` + `input` + `button` | `wathet` |
| 含日期 / 时间的表单 | `form`(内含 `date_picker` / `picker_time` / `picker_datetime` + `input` + `button` | `blue` |
| 设备 / 服务反馈 | `form`(内含 `select_static`(满意度)+ `input`(备注)+ `button` | `yellow` |
| 多步骤进度 / 引导 | `column_set`(横向步骤,带 `blue-50` 背景)+ `markdown`(当前状态)+ `button` | `blue` |
### 推荐 / 选择类
| 用户意图 | 推荐组件组合 | header.template |
|---|---|---|
| 推荐列表(带图卡片,可点击) | `interactive_container`(内含 `img` + `markdown`× N + `button(open_url)` | `blue` |
| AI 引导选项 / 功能菜单 | `markdown`(欢迎语)+ `interactive_container`(内含 `markdown` 选项说明)× N | 无 header |
| Bot 功能引导 / 教程 | `column_set`(步骤说明,带背景)+ `button` × 2主操作 / 次操作) | `blue` |
| 服务台 / 多操作入口 | `column_set`(说明,带背景)+ `button` × N≤3 个主操作,`type` 区分主次);次要操作超过 3 个时改用 `overflow`(折叠菜单) | 无 header |
### 社交 / 互动类
| 用户意图 | 推荐组件组合 | header.template |
|---|---|---|
| 工作圈 / 社交分享 | `img_combination`(多图)+ `markdown`(正文)+ `button(open_url)` × 2 | `blue` |
| 成交 / 业绩公告 | `img`(庆祝图)+ `markdown`(成绩)+ `column_set`(关键数字) | `green` |
---
## 视觉规范(实现 P0P7 的具体战术)
组件选型只解决「有没有」,下面各条是落地上面 P0P7 的具体手段,括号标注它主要服务的原则。
> **P3 特例 — 数据看板类**`chart + table + column_set + markdown` 是四种不同组件各出现一次不算「堆砌」P3 上限照常满足;但仍须保证每类只出现一次。
### 0. Header 图标(服务 P3 · 视觉质感底线)
**几乎所有卡片都应配 header icon**——这是提升「精致感」成本最低的一步,缺失会让 header 显得空洞、平价。
```json
"header": {
"title": { "tag": "plain_text", "content": "卡片标题" },
"template": "blue",
"icon": { "tag": "standard_icon", "token": "calendar_colorful" }
}
```
- `token` 必须从 `resource/icons.md` 的精确枚举中选择;禁止根据名称规律自行拼接 token。没有合适的 token 时省略 icon。
- 场景速查:日历 `calendar_colorful`、待办 `todo_colorful`、投票 `vote_colorful`、妙记 `file-lark-minutes_colorful`、多维表格 `wiki-bitable_colorful`、表单 `file-form_colorful`、社区 `larkcommunity_colorful`、招聘 `hirelogo_colorful`、飞书品牌 `lark-logo_colorful`、Meego `meego_colorful`、AI `myai_colorful`、aPaaS `apaas_colorful`、审批 `approval_colorful`、通用 AI `ai-common_colorful`
### 1. 配色纪律(服务 P6 语义一致)
- **邻近色环**`Red → Carmine → Orange → Yellow → Green → Turquoise → Wathet → Blue → Violet → Purple →回到Red`。一张卡只能取色环上**相邻**的颜色,严禁跳跃(❌ blue + green + red
- **最多 3 种主色系**(不含 grey / white
- **起始色由 header 决定**
- header `blue` → blue / violet / purple
- header `green` → green / turquoise / wathet
- header `red` → red / carmine / orange
- 无 header → 默认 blue / violet / purple
- **深浅语义**(写法 `blue-50``blue-600``grey-500`
- `-50` 区块背景 · `-100` 标签背景 · `-500` 正文文字 · `-600`/`-700` 强调文字
### 2. 间距纪律(服务 P5 对齐 · 视觉决定性因素)
- **body padding 推荐**`"padding": "12px 12px 20px 12px"`(上右下左;底部 20px 留白更舒适)。
- **优先不用 `markdown` / `column``margin` 控间距**:交给父容器的 `vertical_spacing` / `horizontal_spacing` / `padding` 统一管理,多数情况显式置 `0px`;仅在需要精细缩进(如层级左缩进)时才设非零值。
- 容器内 `vertical_spacing` 推荐值:`2px`(高亮块内标题↔正文)/ `4px`(正文段落、列表项)/ `8px`(需拉开的元素)。
- **容器间智能 margin**:某个顶级容器若**不是** body 最后一个元素 → 设 `"margin": "0px 0px 12px 0px"`;若**是**最后一个 → `"0px"` 或不设,避免卡片底部多余留白。
### 3. 指标卡模式(服务 P1 焦点 · 出现 KPI / 数值 / 统计词时强制使用)
触发:内容含 `KPI/ROI/CTR/UV/PV/DAU/GMV/转化率/增长率/总数/营收` 等数值类信息。
- 多个指标并列放进一个 `column_set``flex_mode` **默认用 `"none"`、慎用 `"stretch"`**防移动端拉伸变形P7仅在各列内容等宽、确认移动端不变形时才用 stretch。
- 数值:用 `##` 放大(**唯一允许用 markdown 标题的特例**),可配 `<font>` 上色。
- 描述:`<font color='grey'>` + `text_size: "notation"`
- 居中 `text_align: "center"`;列背景 `background_style: "grey-50"``padding: "12px"``vertical_spacing: "2px"`
```json
{
"tag": "column_set",
"flex_mode": "none",
"horizontal_spacing": "12px",
"columns": [
{ "tag": "column", "width": "weighted", "weight": 1,
"background_style": "grey-50", "corner_radius": "8px",
"padding": "12px", "vertical_spacing": "2px",
"elements": [
{ "tag": "markdown", "content": "## <font color='blue'>5,483</font>", "text_align": "center" },
{ "tag": "markdown", "content": "<font color='grey'>GMV($)</font>", "text_align": "center", "text_size": "notation" }
] }
]
}
```
### 4. 描边卡片模式(服务 P2 分组 · 进展 / 事项 / 列表项分块展示)
`interactive_container` 给每个事项块加描边 + 圆角,视觉上比彩色底色更轻盈,适合进展/工单/任务列表等「多条目」场景。
```json
{
"tag": "interactive_container",
"width": "fill",
"has_border": true,
"border_color": "blue-100",
"corner_radius": "8px",
"background_style": "blue-50",
"padding": "12px 12px 12px 12px",
"vertical_spacing": "4px",
"margin": "0px 0px 12px 0px",
"elements": [
{
"tag": "markdown",
"content": "**<font color='blue'>事项标题</font>**"
},
{
"tag": "markdown",
"content": "事项正文内容……",
"text_size": "normal"
}
]
}
```
- `border_color` 跟随主色系(蓝系用 `blue-100`,绿系用 `green-100`)。
- 不需要交互时可省略 `behaviors`;需要点击回调时加 `"behaviors": [{"type":"callback","value":{...}}]`
- **不能在内部放 `form``table`**。
### 5. 高亮块模式(服务 P2 分组 · 多分类信息成块展示)
两层结构:外层 `column_set` 管布局,内层 `column` 管样式(彩色背景)。
- 每个 `column``background_style` 用浅色(如 `blue-50` / `green-50``padding: "12px 12px 12px 12px"``vertical_spacing: "4px"``weight: 1`
- 块内首行用 `**<font color='blue'>分类标题</font>**` 着色加粗,正文紧随。
- **布局选择**:分类 ≤ 3 个且内容简短 → 水平,优先用 `flex_mode: "bisect"`2 列)或 `"trisect"`3 列);各列字数严格等宽且已确认移动端不变形时才用 `stretch`(慎用,见 §9**分类 ≥ 4 个、奇数、或任一块内容 > 3 行 → 垂直**(每块独占一行)。配色按上面第 1 条邻近色环依次取色。
- ⚠️ **版本依赖**`column.background_style` 需客户端 **≥ v7.9**,旧版静默丢背景。要求强健壮性时改用 `interactive_container``background_style`(无版本限制)替代 column 背景色。
### 6. Header 三件套(服务 P1 层级 · 语境补全)
header 有三层能力,**尽量用满**(至少用 `title` + `icon``subtitle``text_tag_list` 按实际诉求取舍)——这是成本最低、语境最清晰的一步:
- `title`:这是什么(必填)
- `subtitle`:一句上下文(谁发 / 什么时间 / 什么状态≤1 行,`plain_text`
- `text_tag_list`状态标签≤3 个,颜色语义与 P6 保持一致(`blue`=信息、`yellow`=待处理、`red`=紧急、`green`=完成)
```json
"header": {
"title": { "tag": "plain_text", "content": "发版审批" },
"subtitle": { "tag": "plain_text", "content": "2026-06-25 · 后端服务" },
"template": "blue",
"icon": { "tag": "standard_icon", "token": "approval_colorful" },
"text_tag_list": [
{ "tag": "text_tag", "text": { "tag": "plain_text", "content": "待审批" }, "color": "yellow" }
]
}
```
**禁止**:在 `header.title` 里写 emoji把 subtitle 信息改塞进 body 第一行 markdown让 header 空洞;严肃场景(审批/告警/财务)在 title 或 body 标题里用装饰性 emoji。
### 7. 字段对用 `div.fields`,不要用 `column_set` 模拟(服务 P5 对齐)
详情型"label: value"(订单字段、审批信息、日程详情)首选 `div.fields`——原生对齐,结构更轻:
```json
{
"tag": "div",
"fields": [
{ "is_short": true, "text": { "tag": "lark_md", "content": "**提交人**\n张三" } },
{ "is_short": true, "text": { "tag": "lark_md", "content": "**部门**\n研发中台" } },
{ "is_short": true, "text": { "tag": "lark_md", "content": "**提交时间**\n2026-06-25 10:30" } },
{ "is_short": true, "text": { "tag": "lark_md", "content": "**优先级**\n<font color='red'>P0</font>" } }
]
}
```
`is_short: true` 的字段自动两两并排,对齐由组件保证。`column_set` 留给**需要彩色背景块 / 不等宽 / 嵌套复杂结构**的场景,不要用它模拟简单字段对。
### 8. 长文本必须设 `lines` 截断(服务 P3 复杂度上限)
凡接收动态数据的文本字段,必须设最大行数避免卡片被撑爆:
| 位置 | 字段 | 推荐上限 |
|---|---|---|
| `div.text` | `lines` | 正文 ≤4次要说明 ≤2 |
| `person_list` | `lines` | ≤2 |
| `table.header_style` | `lines` | ≤1 |
| `collapsible_panel` | 默认折叠 | 长文本优先用折叠面板而非截断 |
不设 `lines` 的动态文本 = P3 上限的隐患。
### 9. `flex_mode` 决策表(服务 P7 健壮)
| 场景 | 推荐 flex_mode | 原因 |
|---|---|---|
| 指标卡并列(内容不等长) | `none` + `width: weighted` | 防移动端拉伸;各列按比例压缩 |
| 2 列等宽内容(字数相近) | `bisect` | 语义最清晰的两等分 |
| 3 列等宽内容 | `trisect` | 三等分,不写 weight |
| 多 tag / 多图标横排,允许换行 | `flow` | 窄屏自动折行,不挤压 |
| 明确要求两端对齐撑满且内容等宽 | `stretch` | 慎用:移动端窄屏内容过长时会拉伸变形 |
> `stretch` 只在各列字数高度相近、且已确认移动端不变形时使用;其余场景默认 `none`。
### 10. `chart` 配色纳入 P6 纪律
`chart.color_theme` 必须与全卡色系保持一致:
- **默认**`brand`(单色系,跟随飞书品牌色)或 `primary`(主色单色系),安全选项。
- **禁止**`rainbow`——会把色环上的跳跃色全打进图表,直接击穿 P6 的"主色系 ≤3 + 邻近色环"约束。
- **例外**:数据维度 ≥4 个系列、且各系列无主次关系(如区域对比图)时,可用 `complementary` 或在 `chart_spec` 里自定义与主色系邻近的颜色数组。
### 11. `laser` 样式的克制规则(服务 P6 语义一致)
`button.type: "laser"``background_style: "laser"` 是高饱和渐变效果:
- **允许**AI 生成类、节日庆祝类、营销推广类,每卡 **≤1 处**,且位置在主操作按钮或视觉焦点块。
- **禁止**审批、告警、财务、工单、日程等严肃场景——laser 在这些场景里显得轻浮廉价。
- **默认不用**Step 1 设计方案里若要用,需显式说明"×× 场景适合 laser 风格"并得到确认。