# 桌面与「添加到桌面」（卡片实例）业务闭环 设计

日期：2026-10-21。对象：C 端个人工作台（W6）的桌面外壳——桌面上放的东西从「模块」改成「卡片实例」后，「添加到桌面」面板（原叫「全部模块」）里怎么选、怎么预览、怎么放，桌面上怎么换内容、改尺寸、移走，以及多张卡共用一个模块的数据时各处怎么跟着改。不含各模块卡片里的业务规则（在各模块自己的 `设计.md` 第 6 节）。**状态：第一轮已确认（白晨 10-21 认可说明页 [index.html](index.html) 的版式 F「四档对照」）；第二轮已交（10-21：标准答案表、验收场景、[接口契约](契约.md)，白晨不再确认）。**12.1「替你定了的」7 条白晨没有逐条表态，仍是本文提案、按默认做。性质三分：**白晨已定**／**本文提案**／**待白晨定**，每条标明；事实带 `路径:行号`（路径从仓库根算起），推断与待验证单独标出（3.2）。

修订：10-21 第一版；第二版按[评审](评审.md)改（12.1 第 1 条加选项 E，待办小卡「下一件」移出本包）；**第三版（10-21 晚）对齐两件白晨 10-21 定下的事**：①编辑桌面重做定稿（岛、草稿、撤销／取消／完成、左上角圆钮移走、右下角拖弧改尺寸，面板改名「添加到桌面」、照旧；[原型](../../prototypes/2026-10-21-编辑桌面重做/README.md)、[收口档案](../../reports/acceptance/2026-10-21-编辑桌面重做.md)，提交 `023f7125`）；②**同档等大，行高 292**（[card-sizes.md](../../../.claude/skills/designing-module-loops/card-sizes.md)）。第三版的改动：入口与操作改按编辑桌面定稿写（4.2～4.5）；第 6 节按固定尺寸重写，删掉「高度随内容」；任务三与编辑桌面定稿冲突的部分（原 12.1 第 14 条）白晨 10-21 已拍板：同一模块可以放多张，面板里每个预览只有「放上桌面」，「已在桌面上」「改成X卡」「从桌面移走」都去掉，记进 12.2；原第 5、15 条白晨 10-21 确认，记进 12.2；第 1 条（面板里怎么看各档）白晨 A、E 都没选、要「一次看到多个档位」，按他的方向新设计了版式 F「四档对照」作为默认（6.6.1）；原 12.1 第 3、10、11、13 条已由编辑桌面定稿定掉，挪到 12.2；第 9 节补登被推翻的旧规则。逐条对照见[评审](评审.md)末尾「10-21 对齐编辑桌面重做」。同日再改（白晨经主控转达）：会议、待办、日程、随手记的卡以各模块自己的原型为准，6.4 只留内容种类与预览那一句，原型直接嵌各模块原型，见评审末尾「10-21 跟随各模块原型」。**第二轮（10-21）**：导出标准答案表（`原型/标准答案表.json`）；写验收场景（第 11 节对照）与[接口契约](契约.md)；4.1.1 改两处（所有原生模块都写 `contents`；改卡「同时给」本期会发生），7.1「每张下面」去掉宽高（与 7.5、原型一致）；都是本文提案，不改说明页画面。

与旧清单的关系：本文改写 10-19 能力清单 [03-配置与桌面定制](../../specs/2026-10-18-V1重做能力清单/03-配置与桌面定制.md) 2.6「全部模块」里与「一个模块一张」有关的条目，冲突以本文为准，被取代的条目列在第 9 节（那份文首的注明由主控补）。2.5「编辑桌面」已由编辑桌面重做定稿取代，本文照它。会议小卡两种内容的正文在[会议设计](../会议/设计.md)第 6 节，本文只写桌面外壳一侧。

用词：**模块**＝一类功能和它的数据（会议、待办……）；**卡片**（卡片实例）＝桌面上的一张卡，有自己的键、尺寸、内容种类、位置；**内容种类**＝同一档尺寸下这张卡画什么（会议小卡的「下一场」「今日概览」）；**预览**＝「添加到桌面」里按真实大小画出的那张卡；**岛**＝编辑桌面时顶栏正中那条墨色胶囊（编辑桌面定稿）；**草稿**＝编辑桌面里的改动，按「完成」才保存。

## 0. 为什么要做

### 0.1 白晨 10-21 提出的事（经组长派单转述，2026-10-21）

| 任务 | 原话要点 |
| --- | --- |
| 二 同尺寸多种内容 | 「像 iOS 小组件那样，一个组件在同一个大小下可能有两种不同的能力。」先例：会议小卡有「下一场」和「今日概览」两种（[会议设计](../会议/设计.md)第 6 节，白晨 10-21 已定） |
| 三 可重复添加 | 「目前『全部模块』不支持同一个组件添加两次，这是不对的。小组件跟大组件可能承担的是同一个功能下不同的职能，所以应该可以重复添加。所以『已在桌面上』和『从桌面上移除』这种功能在全部模块里要删掉。」（10-21 凌晨） |
| 四 预览各尺寸 | 「选中一个模块以后，它不同大小的样子应该要能预览，用户能看到它在不同大小下长什么样子、能做什么作用，他必须能看到才能选合适大小的组件。这在原来的设计上是缺失的。」 |
| 同档等大 | 同一档尺寸的卡，不管放什么内容，宽高都一样，像 iOS 小组件；行高 292（`card-sizes.md`，白晨 10-21） |

三件任务的核心是一处改动：**桌面上放的从「模块」变成「卡片」，一个模块可以对应多张卡**。任务二回答「卡片画什么」，任务三回答「卡片怎么来、怎么走」，任务四回答「放之前怎么看清」。

**与编辑桌面定稿的先后**（主控 10-21 更正）：任务三是 10-21 凌晨提的；编辑桌面重做第二版的拍板与合入更晚（提交 `023f7125`，10-21 11:18）。定稿里「『添加到桌面』面板照旧」（[编辑桌面重做 README](../../prototypes/2026-10-21-编辑桌面重做/README.md) 第二版第 5 条）指面板本身留着，原型和产品里面板仍是一个模块一张、有「已在桌面上」「改成X卡」「从桌面移走」（只是进了草稿）。两者冲突，第三版初稿列为待定；**白晨 10-21 随后拍板**（经主控转述原话：「这个以我说的为准啊，添加到桌面面板里，要保留的要保留，不要保留这个已经在桌面上，从桌面移走，并且同一模块可以放多张，以我现在说的作为最终结论」）：同一模块可以放多张，面板里去掉「已在桌面上」「从桌面移走」，推翻编辑桌面定稿里面板照旧的这部分（12.2）。「改成X卡」他随后也定了去掉（白晨 10-21，经主控转述）：面板里每个预览只有「放上桌面」，改尺寸靠拖弧、移走靠卡上圆钮。

### 0.2 现状（10-21 编辑桌面定稿合入以后）

**编辑桌面**（定稿，`apps/web/src/features/desk/EditDeskContext.tsx`、`editDraft.ts`、`useDeskResize.ts`、`apps/web/src/features/shell/EditIsland.tsx`）：顶栏右边的滑杆图标进入；正中的输入胶囊变成墨色的岛，左边一句状态（平时「调整桌面 · N 处改动」，`EditDeskContext.tsx:234`），右边「＋」「撤销」「取消」「完成」（没改动时只有「＋」和「完成」）；卡左上角墨色小圆钮移走（`CardFrame.tsx:172`），右下角的弧拖动改尺寸、松手吸附四档；手机上卡底有上移、下移（`CardFrame.tsx:180-181`）。所有改动进草稿，「完成」才保存（`EditDeskContext.tsx:153`），「取消」整桌还原（`:163`）；移走不再弹「放回去」，靠撤销。编辑桌面时卡与卡的间距从 18 拉开到 30（`apps/web/src/theme/tokens.css:107` 的 `--grid-gap-edit`，`apps/web/src/features/desk/card.css:75`；手机照旧 12，`card.css:152`）。原来的卡底浮条（把手、四档、×）已去掉。

**「添加到桌面」面板**（原叫「全部模块」；`apps/web/src/features/desk/AllModulesPanel.tsx`，能力清单 03 P-46～P-55，白晨 10-19 定；10-21 编辑桌面定稿照旧）：

- 从岛上的「＋」与网格末尾「添加模块」格打开（`AllModulesPanel.tsx:2-4`）；桌面空着时平时也有「添加模块」格。
- 左边格子、右栏常驻。右栏常驻是白晨 10-20 第三轮定的（[收口档案](../../reports/acceptance/2026-10-20-使用指引第三轮.md):13）；他验收后只提了一处「全部模块的窗口再大一点，右侧不用上下翻」（:18），实现据此把面板加宽到 1120、高一屏减边距、最高 880，右栏 420（`apps/web/src/features/desk/modules.css:29-32`）——**1120 与 420 是实现的改法，不是白晨定的数**。
- 格子上已在桌面的模块写「在桌面上」（`AllModulesPanel.tsx:125`，`nativeCard` 只取第一张，`:68`）；插件格同样（`plugOnDesk`，`:92`、`:141`）。
- 右栏一个「卡片尺寸」分段、一张迷你卡，初始尺寸取桌面上那张的（`:174`）；编辑态里按钮「放上桌面」／「已在桌面上」（置灰）／「改成X卡」，旁边「从桌面移走」（`:227-234`），三者都进草稿：先关面板，隔 0.14 秒再改草稿，结果写在岛上（编辑桌面收口档案:58）。不在编辑态时（只有桌面空着才打得开）放上当场保存，提示「已放上桌面：X」。

**现有「卡片尺寸」分段为什么不够**（本文分析，评审 10-21 提出）：

1. **看不出真实大小**：迷你卡画在右栏的两列小网格里，中卡（桌面上 679）、整行（1376）都被压成同一宽度，大卡也不比中卡高。
2. **每档没有「能做什么」**：只有整个模块一句「长什么样」（`AllModulesPanel.tsx:213` 的 `meta.look`）。
3. **同一档的几种内容没处放**：分段只按尺寸切，一档只画一张（任务二）。

**网格**：4 条轨道，行高 `minmax(156px, auto)`，卡高随内容（`card.css:8`；手机 `minmax(128px, auto)`，`:148`）。白晨 10-21 定同档等大以后，这条要改成固定行高 292（第 6 节、`card-sizes.md`）。

**后端**：卡片一行一张（`apps/api/app/cards/models.py:42-71`），键是卡片 id（uuid）；排序、改尺寸、删除都按卡片 id（`apps/api/app/desk/schemas.py:69-73`、`apps/api/app/desk/router.py:71,90`）。四档尺寸 `small／half／tall／full`（`apps/api/app/cards/schemas.py:83`），各模块允许哪几档在清单 `CardInfo`（`apps/api/app/modules/manifest.py:103-118`）。**「一个模块只放一张」只在应用层挡**：`add_native` 见到同模块原生卡就 409 `module_on_desk`（`apps/api/app/desk/service.py:71-72`），数据库没有唯一约束。**没有表示「内容种类」的字段**；原生卡的 `config_override` 一直写空。会议小卡现在只按尺寸画，没有「今日概览」（`apps/web/src/features/meetings/MeetingCard.tsx:175`、`:299`）。

所以存储模型本来就是「卡片实例」。要改的是：加内容种类；固定行高；放开 409、把几处「按模块找卡」改成按卡片（白晨 10-21 定同一模块可以放多张）。

### 0.3 「一个模块只放一张」是不是白晨定过的

- 规则本身来自实现（`apps/api/app/desk/service.py:3-4`），`docs/decisions/` 里没有这一条。
- 白晨 10-19 认可了建立在它之上的三条：P-50 格子写「在桌面上」、P-51「已在桌面上」「改成X卡」、P-53「全部模块」里要「从桌面移走」（问题 16 A）。**白晨 10-21 凌晨提任务三时要删掉这三条**；同日晚些时候定稿的编辑桌面又让面板「照旧」（0.1）；**白晨 10-21 随后拍板以任务三为准**（12.2）。P-51 的「改成X卡」随后也定了去掉。
- 因此要重新回答的问题：①同模块多张卡怎么区分（7.4 卡片的叫法）；②会议同步、生成完成提示这类「每个模块一份」的事由谁触发（5.2、第 8 节）；③别处「滚到某模块的卡」找哪一张（4.6）；④分享桌面导出、导入时同模块去重（另行处理）；⑤同尺寸同内容两张允不允许（12.1 第 4 条）。

### 0.4 代码里假设「一个模块最多一张」的地方（改成卡片实例后怎么办）

白晨 10-21 定同一模块可以放多张，下表除第 10、12 条外都要改。

| # | 位置 | 现在 | 改成 |
| --- | --- | --- | --- |
| 1 | `apps/api/app/desk/service.py:71-72` | 同模块 409 | 删掉这条检查；卡片总数上限 50 照旧（`apps/api/app/cards/service.py:30`、`desk/service.py:67-70`） |
| 2 | `desk/service.py:3-4`、`desk/router.py:60`、`apps/web/src/lib/api/modules/desk.ts:9` | 注释与接口描述写「只放一张」 | 改写；重新导出 `apps/api/openapi.json` |
| 3 | `AllModulesPanel.tsx:68,125,141,174,213,227-234` | `nativeCard` 取第一张；「在桌面上」；按桌面那张定初始尺寸；「已在桌面上／改成X卡／从桌面移走」 | 换成 6.6 的对照板（任务四）；删掉「在桌面上」「已在桌面上」「改成X卡」「从桌面移走」（白晨 10-21）；插件已连接时的「管理连接」（`:292`）保留 |
| 4 | `apps/web/src/features/desk/highlight.ts:13`、`locate.ts:12`、`locate.ts:29-31` | `querySelector('[data-module=X]')` 取 DOM 里第一张；描圈只圈第一张 | 按 4.6 的「按模块找卡」规则；**描圈圈命中行所在的那张卡** |
| 5 | `apps/web/src/features/capsule/deskGo.ts:16` 起 | 在 `[data-module=X]` 下找某一条 | 在该模块所有卡里找画出这一条的那张，都没有就打开详情层（4.6） |
| 6 | `apps/web/src/features/capsule/askActions.ts:64-67` | `deskCard("notes")` 判断随手记板在不在视口 | 只有画出最近便签的随手记卡在视口里才算看得到 |
| 7 | `apps/web/src/features/capsule/NotePane.tsx:60` | 「桌面随手记」滚到第一张 | 滚到桌面顺序里第一张随手记卡（4.6） |
| 8 | `apps/web/src/features/onboarding/FirstDay.tsx:99` | 聚焦第一张随手记卡的输入框 | 桌面顺序里第一张带输入便签的随手记卡；没有就打开随手记详情层（照现状） |
| 9 | `apps/web/src/features/today/BriefNews.tsx:85`、`WorkGroups.tsx:229` | `highlightCard("news"/"todos")` | 同第 4 条 |
| 10 | `apps/web/src/features/guide/script.ts:48,105,112` | 演示舞台里按模块找卡 | 不改：舞台是脚本画的，只有一张 |
| 11 | `apps/web/src/features/connections/ConnectionsLayer.tsx:160-170` | 断开前列出受影响的卡，按名字去重 | 写张数：「会议（2 张）」（7.4） |
| 12 | `apps/api/app/onboarding/service.py:185-199` | 两问答完放卡时按模块去重 | 不改：只在桌面一张卡都没有时问（P-01） |
| 13 | `apps/api/app/share/service.py:125-136` 等 | 导入按 `native:<模块>` 去重；导出没有 `content` | 本期没有入口，列进「另行处理」第 1 条 |
| 14 | `apps/web/src/features/meetings/MeetingCard.tsx:80` | 会议卡挂上时触发一次同步 | 改为打开桌面触发（会议设计 4.6 第 3 条）；**预览里的会议卡不触发同步**（第 8 节）——这一条两种选项都要改 |
| 15 | `MeetingCard.tsx:91`、`apps/web/src/features/meetings/actions.ts:75-93` | 每张挂上的会议卡各跑一份「生成完成」检查，预览卡也跑 | 预览卡不跑（两种选项都要改）；桌面上的会议卡只由一处跑（5.2）；待验证 V-1 |
| 16 | `apps/web/src/features/devshell/DeskSample.tsx:68,74,81` | 按模块高亮、`key={s.module}` | 按卡片键 |
| 17 | 测试替身 `apps/web/src/test/backendDesk.ts:39`、`backendS5.ts:67,136`；`test/v1.ts:29` | 复刻 409 与去重 | 随实现改 |
| 18 | `apps/web/src/features/desk/CardFrame.tsx:138` | 卡片读屏名 `aria-label` 是模块名 | 改成卡片叫法（7.4）；**先改端到端测试找卡的写法**（`testing/e2e/e2e/steps/编辑桌面.steps.ts:21`、`会前提醒.steps.ts:50`） |
| 19 | `apps/web/src/lib/errorText.ts:33`；`apps/web/src/lib/api/generated/sdk.gen.ts:297` | `module_on_desk` 的中文 | 删掉这条文案；重新生成 SDK |
| 20 | `apps/api/app/desk/tests/test_service.py:70-77`、`:92-101`；`apps/api/tests/integration/test_t14_desk_http.py:122-131` | 断言同模块 409 | 第一条改成「同模块再放一张成功」；后两条改成断言别名归一化（`test_service.py:80-89` 已有读取一侧） |
| 21 | `MeetingCard.tsx:84`（`useGuide`） | 每张会议卡各有一个使用指引问号 | 每张都画，没有「主卡」 |
| 22 | 随手记设计 `docs/modules/随手记/设计.md:313`；`docs/specs/2026-10-18-V1重做能力清单/05-日程.md:75`（C-20） | 小签飞进待办卡那一行；把待办拖进日程卡 | 小签飞向 4.6 第 1 条找到的那张；拖放时每张接受拖放的日程卡都亮一圈 |
| 23 | `testing/e2e/e2e/support/handoff.ts:24` | 桌面上已有待办卡就不再补 | 改成「有画出列表的待办卡」 |
| 24 | `apps/web/src/features/desk/card.css:8,148`；`tokens.css:107` 的 `--grid-row-min` | 行高 `minmax(156px, auto)`、手机 `minmax(128px, auto)`，卡高随内容 | **固定行高**：宽屏、中屏 292；手机等于轨道宽 m（`card-sizes.md`）；卡身 `overflow: hidden`；各模块卡片按第 6 节放得下（两种选项都要改） |

**风险最大的不是后端**，而是第 4～9 条的「按模块找卡」与第 18 条端到端测试的找卡写法；实现计划把这两件排在最前，各自先写会失败的测试（评审 10-21）。第 24 条是同档等大带来的，所有模块的卡片组件都要过一遍。

## 1. 目标与范围外

**目标**

- 同一档尺寸可以有几种内容，放上时选、编辑桌面里能换（任务二，白晨 10-21）。
- 选中模块后，按真实大小看到每档尺寸、每种内容的样子和一句作用，从预览直接放上（任务四，白晨 10-21）。
- 同一档的卡宽高固定，内容适应格子；放不下的写「还有 N 件」或在卡里滚，不撑高、不就地展开（白晨 10-21）。
- 一个模块可以在桌面上放多张（任务三，白晨 10-21 拍板）；每张卡有自己的尺寸、内容、位置，互不影响。
- 卡片多几张不多取一次数据、不多调一次外部系统（第 8 节）。
- 每个操作都有结论：岛上一句、或提示条一句；没有停住不动的情况（4.5）。

**范围外**

- 智能叠放（同一位置自动换内容）：不做（白晨 10-21，会议设计第 1 节）。
- 每张卡自己的筛选设置：本期不做（白晨 10-21 确认，12.2）。
- 各模块卡片在各档、各内容下的具体版式与文案：在各模块 `设计.md` 第 6、7 节；本文 6.4 只给每档有哪几种内容与预览下面那一句；会议、待办、日程、随手记的卡以各模块原型为准，本包原型直接嵌它们，不另画。
- 编辑桌面本身的交互（拖动换位置、拖弧、键盘、撤销栈、岛的动效）：照编辑桌面定稿，本文不改。
- 分享桌面、组合包：本期没有入口（问题 7 A、P-49，白晨 10-19）。
- 「减少动态效果」：以后再说（白晨 10-18）。

## 2. 影响因素与外部返回

### 2.1 因素表

| 因素 | 取值 | 影响行为吗 | 影响什么 |
| --- | --- | --- | --- |
| 面板版式（12.1 第 1 条） | F 四档对照（默认）／A／E／D | 是 | 选中模块后右边怎么摆各档（6.6.1） |
| 模块允许的尺寸 | 四档／只有中（资讯） | 是 | 对照板摆几张；只有一档的卡不画弧（编辑桌面定稿） |
| 这一档的内容种类数 | 1／2 及以上 | 是 | 编辑桌面里卡右上角有没有内容小牌；预览标题写不写内容名；卡片叫法带不带内容名（7.4） |
| 窗口宽度 | ≥1101／761～1100／≤760（手机另看轨道宽 m） | 是 | 卡的宽高（6.0）、每档列几条（四个模块看各自第 6 节）、面板整屏（P-47） |
| 是否在编辑桌面 | 是／否 | 是 | 放上进草稿还是当场保存（4.2）；把手与内容小牌只在编辑桌面；列距 30 |
| 模块要不要外部连接 | 会议要腾讯会议／其余不要 | 是 | 预览数据来源（6.6.3）、卡片未连接态 |
| 外部连接状态 | 已连接／未连接／授权失效／暂时连不上／调用次数用完 | 是 | 前三种决定预览用你的数据还是示例；后两种照会议设计 4.3 画在卡上 |
| 你的这个模块有没有数据 | 有／没有 | 是 | 没有时预览用示例并标明，桌面上的卡画空态 |
| 桌面上这个模块已有几张 | 0／1／多 | 是 | 不影响能不能放（白晨 10-21）；影响移走时岛上的副句（7.3）、「按模块找卡」（4.6） |
| 桌面卡片总数 | 少于 50／50 | 是 | 达上限时「放上桌面」不可用并说明（4.2） |
| 草稿里有没有改动 | 0／N | 是 | 岛上有没有「撤销」「取消」；「完成」时调不调接口（4.5） |
| 新卡是否在视口内 | 在／不在 | 是 | 放上后滚不滚（13.2） |
| 请求结果（「完成」时、桌面空着时放上） | 成功／失败／超时 | 是 | 4.5 |
| 两个标签页同时改 | 是／否 | 是 | 以后端为准，另一页下次重取覆盖（4.5） |
| 卡片是同模块的第几张 | 第一张／后来的 | 否 | 每张都是平等的实例，没有「主卡」 |
| 减少动态效果 | 开／关 | 否 | 白晨 10-18：以后再说 |

### 2.2 读写会拿到的返回（本模块只读写工作台自己的后端）

| 操作 | 什么时候发 | 返回 |
| --- | --- | --- |
| 放上桌面 `POST /api/desk/cards` | 编辑桌面里按「完成」时；桌面空着、不在编辑态时当场 | 成功（新卡）；422 `card_limit_reached`；422 尺寸或内容不允许（防御）；5xx／超时 |
| 改卡 `PATCH /api/desk/cards/{id}`（尺寸、内容） | 「完成」时 | 成功；404（卡已被另一页移走）；422；5xx／超时 |
| 移走 `DELETE /api/desk/cards/{id}` | 「完成」时 | 成功；404（已不在，当作成功）；5xx／超时 |
| 排序 `PUT /api/desk/order` | 「完成」时 | 成功；失败 |
| 读桌面 `GET /api/desk` | 照现有 | 成功；失败照现有 |

「完成」时按「先移走、再放上、再改卡、最后排序」依次存（原型 `engine.js` 的 `DK.doneEdit`；产品 `EditDeskContext.tsx` 的 `runSave`）。外部系统（腾讯会议）只经会议模块的同步，本模块不直接调用（第 8 节）。

## 3. 实测事实

### 3.1 已确认（读代码，2026-10-21；没有调用外部系统）

| 事实 | 出处 |
| --- | --- |
| 卡片表一张卡一行，键是 uuid；排序、改尺寸、删除都按卡片键 | `apps/api/app/cards/models.py:42-71`；`apps/api/app/desk/schemas.py:69-73`；`apps/api/app/desk/router.py:71,90` |
| 同模块只挡在应用层，无数据库唯一约束 | `apps/api/app/desk/service.py:71-72`；`apps/api/app/alembic/versions/0002_cards.py` 无 unique |
| 改尺寸的请求体是严格模式、只有必填的 `size` | `apps/api/app/desk/schemas.py:63-66`（`NativeCardPatch`） |
| 放卡带了尺寸就记 `size_chosen=true` | `apps/api/app/desk/service.py:83-84` |
| 卡片上限 50，与插件卡共用 | `apps/api/app/cards/service.py:30`；`apps/api/app/desk/service.py:67-70` |
| 没有内容种类字段；原生卡 `config_override` 恒为空 | `apps/api/app/cards/schemas.py:131-219`；`apps/api/app/desk/service.py` `add_native` |
| 各模块数据表不引用卡片键 | `apps/api/app` 下引用 `card_id`／`card_instances` 的只有 `desk/`、`cards/`、迁移与 `migration_guard.py` |
| 同模块多张卡共用前端查询，同时挂上的几张只发一次请求；全站没设保鲜时间，之后新挂上的卡会再读一次工作台后端 | `MeetingCard.tsx:80-81`；`apps/web/src/features/todos/TodoCard.tsx:34`；`apps/web/src/features/calendar/CalendarCard.tsx:69-70`；`apps/web/src/features/notes/NoteCard.tsx:15`；`apps/web/src/lib/queryDefaults.ts:11` |
| 会议同步的节流在后端：打开桌面 30 分钟、刷新 30 秒、作业 50 秒 | `apps/api/app/meetings/sync_state.py:39-41`；会议设计第 6、8 节 |
| 面板里的迷你预览挂的是真卡组件，会议预览因此会挂上同步查询 | `AllModulesPanel.tsx` 预览部分；`MeetingCard.tsx:80` |
| 编辑桌面草稿：改动数＝撤销栈步数，和进来时一样就是 0 | `apps/web/src/features/desk/editDraft.ts:5,36` |
| 编辑态外，插件卡、HTML 卡的卡片菜单「移除」照旧当场存、提示条带「放回去」 | `apps/web/src/features/desk/DeskGrid.tsx:13,53-58` |
| 网格 4 条轨道、`grid-auto-flow: dense`，行高随内容；手机两条轨道 | `apps/web/src/features/desk/card.css:8,148` |

### 3.2 推断与待验证

| 编号 | 内容 | 依据 | 最小实验 |
| --- | --- | --- | --- |
| V-1 | 两张会议卡同时在桌面时，「生成完成」提示条不会弹两次 | 两张卡读写同一份待处理名单（`actions.ts:83-89`） | 前端单元测试：挂两张会议卡，模拟生成完成，数提示条 |
| V-2 | 现在面板里选中会议、会议卡不在桌面上时，会触发一次 `POST /api/meetings/sync` | 预览挂真卡 | 移走会议卡、打开面板选会议，看网络面板（模拟腾讯会议） |
| V-3 | 固定行高 292 以后，现有各模块卡片在某些档放不下（如待办中卡、日程大卡） | 现在卡高随内容，日程大卡实测 679×463～495（日程设计第 6 节） | 产品里把 `--grid-row-min` 改成固定 292，四个模块逐档截图，量 `scrollHeight > clientHeight` |
| V-4 | 手机上拖弧只吸附出小、中、大三档，整行与中在手机上一样大，拖不出 | 原型 `DK.snapSize` 按列数、行数吸附；手机两列时整行与中同为 366×177 | 产品 `useDeskResize.ts` 手机宽度下拖弧，看能不能落到整行 |

## 4. 单张卡片：模型与分支

### 4.1 卡片实例模型（本文提案）

| 字段 | 现在 | 本文 | 为什么 |
| --- | --- | --- | --- |
| 卡片键 `id` | 有（uuid） | 照旧；前端列表、动效、把手、定位都按它 | 已是实例键 |
| 模块 `module` | 有 | 照旧，不再唯一 | 任务三 |
| 尺寸 `size` | 有 | 照旧；外框按第 6 节固定 | — |
| 内容种类 `content` | 无 | **新增**：可为空的短字符串；空＝这一档的默认内容 | 任务二；单独一列，便于按清单校验 |
| 位置 `position` | 有 | 照旧；新卡＝最大值＋1 | 「系统不会替你挪卡片」（P-34） |
| 每张卡的设置 | `config_override` 恒空 | **本期不用** | 白晨 10-21 确认（12.2） |
| `size_chosen` | 有 | 照旧：改尺寸记、只换内容不记 | 同档等大以后待办不再靠它决定列几件（待办设计第 6 节），但字段照留 |

- **数据按模块共享，不按卡**（本文提案）：卡片只决定「画什么」，同模块所有卡读同一份数据、同一次取数；换内容、改尺寸、多放一张都不取数（第 8 节）。
- **清单里登记内容种类**（本文提案）：模块清单 `CardInfo` 加 `contents`：每档一个有序列表，每项 `key`、`name`（内容名）、`say`（一句作用）；第一项是这一档的默认内容。前端只读清单，不写死。原型的同一份数据在 `原型/data.js` 的 `DK.MODS`。
- **旧布局迁移**：加一列、全部为空，不转数据；空即默认内容，旧卡样子不变（会议小卡默认「下一场」＝现在的样子）。**只有旧卡为空**，新卡一律写明确的 `key`（4.1.1）。

#### 4.1.1 接口约定（本文提案；第二轮写进契约）

| 处 | 约定 |
| --- | --- |
| 清单 `CardInfo.contents` | 可选。写了的话：每个允许的尺寸至少一项、同一档里 `key` 不重复、不能出现没开放的尺寸（清单加载时校验，不合格后端拒绝启动）。**本期所有原生模块都写**（第二轮改，本文提案）：6.5 的六个模块每档一种、key 一律 `main`、名字是档名、一句作用取 7.5，这样预览下那一句都从清单来；`content` 只有插件卡、自定义 HTML 卡为空；这一档只有一种内容时界面不显示内容名（6.1） |
| 放上桌面 `NativeCardIn` | 加 `content: str \| None = None`；给了就校验在 `contents[size]` 里，不在返回 422 `card_content_not_allowed` |
| 改卡 `NativeCardPatch` | `size`、`content` 都改为可选，至少给一个（都不给 422）。只给 `size`：由后端执行 4.4 的去留规则，记 `size_chosen=true`；只给 `content`：只改内容，不动 `size_chosen`；同时给：按给的写，`content` 校验在新尺寸里。编辑桌面「完成」时，与进来时比尺寸变了的卡一律同时给尺寸与草稿里的内容（草稿按同一条去留规则算过；先换内容再改尺寸时只给尺寸会丢掉选择），只换了内容的只给内容（第二轮改，本文提案；原写「本期不会发生」不对）。原型 `DK.savePlan` |
| 去留怎么判断 | 按换算后的 `key`：存的是空或已不在清单里的，先换成原尺寸的默认 `key`，再看新尺寸有没有这个 `key`；有就写它，没有就写新尺寸的默认 `key`。结果一律写明确的 `key` |
| 存储 | 新卡一律写明确的 `key`：从预览放上写那个预览的 `key`；从两问、第一天清单等别处放卡写这一档的默认 `key`。只有旧卡为空 |
| 现有函数 | `resize_native`（`desk/service.py:98`）改成「改卡」：`size` 可为空、加 `content`；`apps/api/app/clock_exempt.py:23` 的登记随之改名 |
| 读取 | 返回的 `content` 一律是换算好的 `key`，前端不自己推默认；读到旧 `key` 不报错 |
| 前端草稿 | 改尺寸时先按同一条规则算出新内容画上（`editDraft.ts` 加 `content`），「完成」时以返回值为准 |

### 4.2 放上（任务三、四）

入口照编辑桌面定稿：编辑桌面里岛上的「＋」、网格末尾「添加模块」格；桌面空着时平时也有「添加模块」格（P-42）。顶栏不再有「全部模块」按钮。面板标题一律「添加到桌面」。

| 情况 | 处理 |
| --- | --- |
| 编辑桌面里，点某个预览的「放上桌面」 | 面板先关（淡出），隔 0.14 秒新卡进草稿、排在桌面最后，带着这个预览的尺寸与内容；新卡从「添加模块」那一格长出来，不在屏幕里时页面滚到它；岛上写「放上了「{卡片叫法}」」，改动数加一。**不发请求**，按「完成」才存（编辑桌面定稿） |
| 桌面空着、不在编辑态，从「添加模块」格打开 | 按钮变「正在放上…」并禁用其余「放上桌面」（防连点）；成功后面板收起，新卡出现，提示条「已放上桌面：{卡片叫法}」（照现有实现）；失败见 4.5 |
| 这个模块桌面上已有卡 | 照样「放上桌面」，再放一张；不提示、不标记，不另取数（白晨 10-21） |
| 桌面已有 50 张（含草稿里放上的） | 对照板页头下一条说明（7.2），所有「放上桌面」不可用；不弹提示条 |
| 需要外部连接、但没连接或授权失效（会议） | 照样能放；预览用示例（6.6.3）；桌面上的卡画未连接态（会议设计 4.3） |
| 插件卡、自定义 HTML 卡 | 照现有实现：本来就能放多张；后端先建卡才画得出来，编辑态里也当场建，并进草稿的底稿，「取消」不撤它（编辑桌面收口档案；`AllModulesPanel.tsx:16-18`）。插件格只去掉「在桌面上」，只留连接状态 |

### 4.3 移走（任务三）

- **移走在编辑桌面里做**：卡左上角的墨色小圆钮（编辑桌面定稿）。卡缩小淡出、别的卡补位；岛上写「已移走「{卡片叫法}」」，副句「可撤销」；桌面上还有同模块的卡时，副句写「桌面上还有 {N} 张{模块名}卡 · 可撤销」（本文提案）。不确认（照 P-41）。
- **不再有「放回去」**：要回来点岛上的「撤销」（或 ⌘Z），卡回到原位，尺寸、内容、卡片键都不变（草稿里没删过，`editDraft.ts`）；按「取消」整桌回到进来时的样子。
- 面板里不再有「从桌面移走」（白晨 10-21）；移走只用卡上的圆钮。
- **最后一张移走后模块的数据不受影响**：数据与卡片无关（3.1）；会议的同步、作业照常；随时能在面板里「打开」或再放上。
- 编辑态外：原生卡没有移走入口；插件卡、HTML 卡的卡片菜单「移除」照现有当场存，提示条「已从桌面移走「X」，模块照常运行」带「放回去」（编辑桌面收口档案:75，`DeskGrid.tsx:53-58`）。

### 4.4 换内容、改尺寸（任务二）

- **换内容在编辑桌面里做**：这一档有两种以上内容的卡，右上角压一枚墨色小牌，写当前内容名（12.1 第 7 条）；点开弹出「卡片内容 · {模块名}（{尺寸}）」，每项内容名＋一句作用，当前那项打勾；点一项立即在草稿里生效、菜单收起；点外面或 Esc 收起。岛上写「「{模块名}（{尺寸}）」换成「{内容名}」」。这一档只有一种内容时没有小牌。
- **改尺寸靠拖弧**（编辑桌面定稿）：拖右下角的弧，松手吸附到四档之一；跟手的尺寸牌写「{尺寸} · {N} 列 · {N} 行」；岛上写「「{模块名}」改成{X卡}」。面板里没有「改成…」（白晨 10-21）。
- **改尺寸时内容的去留**（本文提案）：新尺寸里有同一个 `key` 的内容就保留，没有就换成新尺寸的默认内容；改回原尺寸时也是那一档的默认内容，**不记上一次在那一档选过什么**（代价是「今日概览」小卡改成中再改回小，会变成「下一场」；撤销能退回去）。后端执行，前端草稿照算（4.1.1）。
- 换内容、改尺寸都不取数、不调外部系统；卡的外框随尺寸变成那一档的固定大小，内容按新格子重排（第 6 节）。

### 4.5 保存、失败、两个标签页

| 情况 | 处理 |
| --- | --- |
| 按「完成」，有改动 | 按钮先隐去，岛收成「✓ 已保存 · {N} 处改动」停 0.9 秒再变回输入胶囊；后台依次存（2.2）（编辑桌面定稿） |
| 按「完成」，没有改动（含改过又改回） | 直接收起，不调接口 |
| 「完成」时保存失败 | 提示条「未能保存桌面：{原因}」，桌面按后端实际存下的样子重读（照 `EditDeskContext.tsx:8-9`） |
| 按「取消」 | 各卡滑回进来时的样子，岛上写「已还原，桌面没动」再收回；草稿里放上的卡消失 |
| 桌面空着时放上失败 | 面板留着、按钮恢复，提示条「未能放上桌面：{原因}」；超时由通用请求超时兜底，**最长 80 秒**（`apps/web/src/lib/limits.ts:16`） |
| 「完成」时卡已被另一页移走（404） | 移走当作成功；改卡失败的按「完成时保存失败」处理并重读（本文提案） |
| 「完成」时另一页先放满了 50 张（422） | 同「完成时保存失败」，原因写「桌面上已有 50 张卡片」 |
| 两个标签页同时改 | 后存的覆盖排序；另一页下次重取桌面时更新，不弹提示 |

### 4.6 与其他模块的交界（正文在本文）

**按模块找卡**（用于简报「全部…」、问 AI 的出处、随手记胶囊、第一天清单，即 0.4 第 4～9 条）：

1. 要找某一条（如会议「周例会」）：在桌面顺序里找**第一张画出了这一条的卡**，滚过去并高亮那一行；同模块的卡都没画出这一条（包括列在「还有 N 件」里没画出来的），就打开详情层并定位到它。
2. 只要「这个模块的卡」：桌面顺序里**第一张画出列表的卡**；一张都没有就打开详情层。
3. 要往随手记里输入：桌面顺序里第一张带输入便签的随手记卡。
4. **描圈**：圈第 1 条命中行所在的那张卡；没有命中行时圈第 2 条找到的那张。
5. **小签飞向、拖放目标**：见 0.4 第 22 条。

原型 DK-20 演示第 1 条。**各模块给桌面的**：每个模块在清单里登记各档的内容种类（4.1）；卡片组件按 `size × content` 在第 6 节的固定格子里画。**写入外部系统**：不适用。

## 5. 多张卡同时存在

### 5.1 同模块的几张卡长什么样

- 卡头一样（模块名、图标、连接状态），不加「第几张」。区分靠尺寸与内容（iOS 同）。
- 读屏与岛上的话用卡片叫法区分（7.4）；一模一样的两张叫法相同，读屏在重名时另加「第几张」。
- 每张都是平等的实例，没有「主卡」；顺序只归你（P-34）。

### 5.2 只做一次的事（本文提案）

| 事 | 规则 |
| --- | --- |
| 会议同步 | 打开桌面触发一次，与会议卡张数、有没有会议卡都无关（会议设计 4.6 第 3 条）；30 分钟节流在后端 |
| 刷新（会议四档都有） | 点任一张都是模块级的一次同步，30 秒节流共享；同模块的刷新图标一起转，提示条只出一次「已同步」 |
| 生成完成的提示条、会前横幅 | 只在桌面上有会议卡时弹，照现状：几张会议卡只由一处检查，预览卡不检查；桌面上一张会议卡都没有时不弹，记着的留到下次（`apps/web/src/features/meetings/actions.ts:73-74`） |
| 待办在一张卡上勾掉 | 数据只有一份，同模块其他卡立即跟着变（DK-19） |
| 连接、断开 | 所有同模块卡一起变；断开确认里写张数（0.4 第 11 条） |

## 6. 尺寸 × 内容

### 6.0 尺寸（白晨 10-21 定：同档等大，行高 292）

照 [card-sizes.md](../../../.claude/skills/designing-module-loops/card-sizes.md)：**同一档的卡宽高固定，不随内容变**；卡身 `overflow: hidden`；网格行用固定高。`W` 是窗口宽（超过 1440 按 1440）。

| 屏宽 | 小 | 中 | 大 | 整行 |
| --- | --- | --- | --- | --- |
| 宽屏 1440 | 330.5 × 292 | 679 × 292 | 679 × 602 | 1376 × 292 |
| 中屏 1000（761～1100：小与中同宽 (W−82)÷2） | 459 × 292 | 459 × 292 | 459 × 602 | 936 × 292 |
| 手机 390（≤760：轨道 m＝(W−36)÷2，行高＝m） | 177 × 177 | 366 × 177 | 366 × 366 | 366 × 177 |

- 手机一行的高等于小卡的宽，小卡、大卡是正方形（白晨 10-21 确认，12.2）。手机窄于 390 时 m 跟着变小（360 宽：小 162 × 162、中 336 × 162、大 336 × 336），**每档列几条按 m 现算**，不写死（会议、待办、日程、随手记由各模块原型算；其余模块是本原型 `engine.js` 的 `DK.fitPhone`）。
- 编辑桌面时列距 30（编辑桌面定稿），轨道变窄，行高不变：1440 宽小 321.5 × 292、中 673 × 292、大 673 × 614（两行加一个 30 的行距）、整行 1376 × 292；手机列距照旧 12（`card.css:152`），尺寸不变（12.1 第 16 条）。
- 预览（6.6）按桌面上同一档的大小画，再整体按同一个比例缩放显示，比例写明（6.6.1、6.6.2）。

### 6.1 通用规则

- **外框定死**：不许内容把卡撑高，不许在卡里就地展开（「展开全部」「还有 N 场等你处理」点了一律打开详情层）。
- **放不下时只有三种做法**（`card-sizes.md`）：①列表只列放得下的几条，末行「还有 N 件／场／条」，点了打开详情层；②时间轴、整天的日程、会议整行的横排这类连续内容，在卡内声明一个滚动区（原型 `data-scroll`），其余部分不滚；③状态句多的换版式（把次要状态挪到卡头），不加高。
- **各种状态同一个框**：空、加载、出错、未连接、冻结都画在同一尺寸里，不因为字少变矮。
- **字号不低于定稿原型**；手机卡头图标块 28、刷新钮缩到 28 × 28（点按区比常规的 40 小，本文提案，实现时再看真机）。
- **内容种类回答「这一档的卡替你看哪件事」**：同一档里的几种内容是不同的职能，不是同一份内容换个排版；只是多几行、少几行的不算两种内容。命名 2～4 个字，每种配一句「能做什么、适合什么时候放」，不超过 40 字。每档至少一种，第一种是默认；不自动切换（白晨 10-21，会议设计第 6 节）。内容种类只由模块清单决定，各模块文档定义。
- **一档只有一种内容时，内容名只在内部用**：清单里照样有 `key` 与名字，界面上不显示。6.4 表里这些名字是本文起的，不上界面。

### 6.2 换内容的入口（12.1 第 7 条，替你定了的）

- **卡右上角的内容小牌**：编辑桌面里，有两种以上内容的卡右上角压一枚墨色小牌（与左上角移走圆钮同一套样子），写当前内容名＋下箭头；点开内容菜单，电脑上放在卡的旁边（右边放不下放左边），手机上在小牌下方或上方。
- 备选 B：卡内顶部分段（会议原型 MB-11 的画法），一点就换，但挤占小卡空间、三种以上放不下。原型 `opt=7:B` 可看。
- 原「编辑态顶栏说明加半句」作废：编辑桌面定稿去掉了那条说明，岛上只写刚才做了什么。

### 6.3 改尺寸时内容的去留

见 4.4。

### 6.4 四个模块：每档有哪几种内容、卡上放什么

**会议、待办、日程、随手记四个模块的卡，以各模块自己的设计文档第 6 节与原型为准，本包不另画一套，也不要求它们改**（白晨 10-21 经主控转达：四个模块已各自按固定尺寸重做、白晨首轮认可，各模块 `原型/` 就是卡的正本画法）。本包只管「添加到桌面」与编辑桌面这一层：每档有哪几种内容、预览下面那一句作用、放上和换内容的规则。卡里放什么、放不下怎么办、空／出错／未连接时什么样，一律看各模块文档：

| 模块 | 默认 | 卡上放什么看 | 本包原型与说明页嵌哪一帧（时刻统一 10:05，各模块虚构的那一天） |
| --- | --- | --- | --- |
| 会议 | 中 | [会议设计](../会议/设计.md)第 6 节、[会议原型](../会议/原型/README.md) | `../会议/原型/index.html?frame=<档>&cfg=default&at=1005`，小卡加 `variant=next`／`overview`；未连接（没连过、授权失效同一种画法，会议设计 4.3）用 `at=1735` |
| 待办 | 中 | [待办设计](../待办/设计.md)第 6 节、[待办原型](../待办/原型/README.md) | `../待办/原型/index.html?frame=<档>&cfg=new&at=1005`；一件都没有用 `at=0900`；DK-19 勾掉一件用 `do=done:t3` |
| 日程 | 大 | [日程设计](../日程/设计.md)第 6 节、[日程原型](../日程/原型/README.md) | `../日程/原型/index.html?frame=<档>&at=1005` |
| 随手记 | 整行 | [随手记设计](../随手记/设计.md)第 6 节、[随手记原型](../随手记/原型/README.md) | `../随手记/原型/index.html?frame=<档>&cfg=day&at=1005` |

内容种类与预览下面那一句（`原型/data.js` 的 `DK.MODS[...].contents`；内容种类照各模块第 6 节，句子是本文提案、文案正本在 7.5，句子里说的放几件以各模块为准）。句子要短：四档对照里小卡缩到 70% 只有约 230 宽，一行放 19 个字左右，最多折两行、不截断（白晨 10-21「很多字都是省略号」后改短）：

| 模块 | 档 · 内容（key） | 一句作用 |
| --- | --- | --- |
| 会议 | 小 · 下一场（next，默认） | 只看下一场会，适合放在角落。 |
| | 小 · 今日概览（overview） | 今天几场会、几场待处理。 |
| | 中 · 今天的会（today） | 头条加接下来两场会。 |
| | 大 · 时间轴（timeline） | 头条加今天全部会议的时间轴，会多时放。 |
| | 整行 · 横排（strip） | 左边头条，右边横排今天的各场会。 |
| 待办 | 小 · 计数（count） | 今天到期与逾期各几件。 |
| | 中 · 列表（list） | 未完成的待办，日常放这张。 |
| | 大 · 列表（list） | 比中卡多列几件，事多时放。 |
| | 整行 · 列表（list） | 待办分左右两栏，横跨整行。 |
| 日程 | 小 · 下一件（next） | 只看接下来的一件安排。 |
| | 中 · 接下来（next3） | 接下来的几件安排。 |
| | 大 · 日视图（day） | 今天的时间轴、空档与冲突。 |
| | 整行 · 日视图（day） | 同大卡的日视图，横向更宽。 |
| 随手记 | 小 · 记一句（input） | 只放输入便签，想到就记。 |
| | 中 · 最近两条（recent） | 输入便签加最近两张便签。 |
| | 大 · 标签与最近（tags） | 标签、输入便签加最近几张。 |
| | 整行 · 便签板（board） | 整块便签板：标签、输入和最近便签。 |

只有会议小卡一档有两种内容；其余各档一种（待办小卡加第二种见「另行处理」第 5 条）。

**编辑态的卡**：编辑桌面列距 30（`tokens.css:107`），格子比平时窄（1440 时小卡 321.5、中卡与大卡 673 宽，大卡 614 高）。各模块文档只定了平时的尺寸，编辑态的卡在产品里是同一个组件按格子重排；原型里的做法是让模块原型按「外框正好等于这一格」的屏宽排（小卡按 1404、中卡与大卡按 1428），宽度与字号、文案、排法都是模块原型自己的；只有大卡的高差 12（模块原型 602，格子 614），按格子纵向拉伸 2%（列为与各模块原型的冲突，见包首页 README）。

### 6.5 其他模块（只列，不展开）

云端文件夹、回顾、收件箱、项目、文档：四档、每档一种内容，四档用同一句作用（7.5；本期各档内容不分，能力清单 03 P-39，白晨 10-19 问题 12 A）。资讯：只有中一档。本原型画的样子（示意，各模块以后自己定）：

| 模块 | 小 | 中 | 大 | 整行 | 手机 |
| --- | --- | --- | --- | --- | --- |
| 云端文件夹 | 大数字「N 个文件 · 云端」＋一句 | 3 份（名字＋一句）＋「还有 N 份」 | 最多 8 份 | 一排 4 格文件（中屏 3）＋「还有 N 份」 | 中、整行 2 份＋「还有 N 份」，大按 m 现算（390 宽最多 8 份） |
| 回顾 | 上次回顾哪一周＋一句＋「生成本周回顾」 | 同小 | 同小 | 同小 | 小卡只留上次回顾与「点开生成本周回顾」 |
| 收件箱 | 大数字「N 条今天进来」＋「已分好 N 条」 | 3 条 | 3 条 | 3 条 | 3 条（360 宽 2 条＋「还有 1 条」） |
| 项目 | 1 件（名字、步骤、进度条）＋「还有 N 件」 | 2 件 | 3 件 | 3 件 | 按 m 现算 |
| 文档 | 最近一份＋时刻与一句 | 3 份 | 3 份 | 3 份 | 中、整行 2 份 |
| 资讯 | — | 2 条（名字＋一句） | — | — | 2 条 |

插件卡：照现有实现（视图即内容），本文不改；固定尺寸后插件视图同样要放得下，由插件契约另定。

### 6.6 预览（任务四）

#### 6.6.1 放在哪：版式 F「四档对照」（白晨 10-21 认可；12.2）

白晨 10-21 看了 A（保留格子与右栏，点「看全部尺寸」进一页长的模块页）和 E（名单＋一次看一档）两种，都没选，原话：「你考虑一下设计一下吧。我比较倾向于要能够一次看到多个档位」。主控转述的要求：一次能看到多个档位（最好四档同屏，至少能并排比较）；按真实比例，可以整体缩放但要标明，缩放后看不清就只把某一档放大看；每档旁边「放上桌面」；内容种类能切换；结合编辑桌面定稿的面板（左格子、右栏）。

**F 四档对照（白晨 10-21 认可）**：

- **面板加宽**：宽 min(窗口宽 − 80, 1600)、高 窗口高 − 12、离顶 6（白晨 10-20「窗口再大一点」的方向；现在的 1120 × 880 是实现的改法）。
- **左边是紧凑的单列名单**（白晨 10-21 看了说「好像有点挤，很多字都是省略号」后改，原来是两列大格子、宽 300）：宽 200，每行图标＋名字、高 42，分组小标题照旧，选中行底色加深；格子上不写「在桌面上」。
- **右边是选中模块的对照板**：页头一行（图标、模块名、用途一句、「需要：连接腾讯会议」；右上是比例、收起的「详细说明」（点开在下面浮出，会议的演示缩略图在里面）、「打开」；放不下时折行，不截断）；说明条（7.2）；下面把各档**按桌面网格摆在一起**——大卡在左占两行，中卡在右上，小卡在中卡下面（有两种内容的小卡两张并排），整行在最下面；只有某几档的模块只摆那几档（资讯只有中）。
- **同一个比例**：所有卡按桌面上的大小、同一个比例缩小，比例取「四档连同卡下说明在面板可视高里放得下」的最大值、不超过 1、不低于 0.5（宽屏）；原型实测会议：1280 × 800 约 59%、1440 × 900 约 70%、1920 × 1080 约 91%（有说明条时低一些，1440 × 900 约 61%）。比例写在页头右上「按桌面大小同比缩到 {N}%，点卡放大看」。
- **每张下面两行**：第一行档名（有两种以上内容时带内容名，如「小 · 今日概览」）加右边紧凑的「＋ 放上桌面」；第二行一句作用，完整显示，窄了折行（最多两行），不截断。不写像素宽高（对使用的人没用），宽高只在放大看里写。作用句因此要短（7.5）。
- **内容种类**：小卡的两种内容并排都画出来；别的档有两种以上内容时（现在没有），档名下面一排内容分段切换。
- **放大看**：点任一张卡，它按原大画在面板里（整行在面板里放不下原大时等比缩小并注明），下面一句作用全文和「放上桌面」；「回到四档」或 Esc 回去。
- **窄窗口（761～1100）**：面板放不下格子和对照板并排：先是格子，点了整块换成对照板（顶上「← 全部模块」），对照板按宽放满（1000 宽约 97%），要上下翻。
- **手机**：面板整屏，先格子，点了进对照板，按手机桌面的两列原大摆（大、中、两张小、整行），要上下翻。

**和 A、E、D 比**（1440 × 900，原型实测）：

| | 一次看几档 | 按真实比例 | 字看得清吗 | 格子与右栏 | 点几次 |
| --- | --- | --- | --- | --- | --- |
| F 四档对照（默认） | 四档同一屏 | 是，同一个比例并写明（70%） | 卡里正文缩后约 9 号字，偏小；点一张放大看原大 | 格子收成单列名单；右栏加宽成对照板 | 选中就看到四档；看清一张多点一次 |
| A 保留格子与右栏 | 右栏一张示意；下一页四档一长页（会议约 2200 像素，一屏约 800） | 示意是缩小的；下一页原大 | 看得清 | 照旧 | 进下一页多点一次 |
| E 名单＋一次看一档 | 一档 | 是，原大 | 看得清 | 格子换成名单 | 每档点一次 |
| D 名单＋一页长的模块页 | 一长页要翻（约 2100 像素） | 是 | 看得清 | 格子换成名单 | 不用多点 |

**为什么这样摆**：四档按桌面摆法至少三行（大卡占两行、整行单独一行），原大要 876 高，另有三行卡下说明（每行约 44）；1440 × 900 下面板给对照板的高约 780，所以四档同屏最多一起缩到约 70%——**卡在高度这一维**：宽度上能放到 81%（对照区宽约 1120），高度只够 70%。同一个比例才看得出谁大谁小、谁放得多；看清细节靠放大看。按桌面网格摆，而不是四张排成一行，是因为放上去的样子就是这样，卡与卡的大小关系一眼对得上。**代价**：卡里正文 12～14 号字在 70% 下约 8.5～10 号，偏小，要点开看；要让 13 号正文缩后不小于 10 号得到 77%，1440 × 900 的高度不够（1920 × 1080 下 91%，够）；按技能说明页「每帧缩放不小于 0.75」的可读性要求，对照板在 1440 × 900 本身不满足，靠放大看补；窄窗口与手机做不到四档同屏。A、E、D 在原型控制带「第 1 条」里还能切换，供对照。

#### 6.6.2 真实大小与比例（本文提案）

- 预览的宽高按你当前窗口下桌面上同一档的大小算（6.0 的表；按平时的列距 18，不按编辑桌面的 30——预览画的是放上、完成以后的样子），再按 6.6.1 的比例整体缩放；缩放只是显示，比例写明。
- 机检：预览按缩放还原后的宽高与 6.0 的表相差不超过 0.5（包首页「交开发前核对」）。
- 预览不能点进详情层、不能勾选；点卡只是放大看；只有「放上桌面」会改桌面；读屏把卡当图片略过（照现有 `inert`），放大看的入口按钮写「放大看「会议（小 · 下一场）」」。
- **桌面空间不够**：网格只往下长，不存在「放不下某一档」；唯一的限制是总数 50（4.2）。

#### 6.6.3 预览用什么数据（12.1 第 6 条，替你定了的）

- 能用你的数据就用你的：读这个模块已存的数据，**不为预览调外部系统、不触发会议同步**（第 8 节）。
- 「画不出」的定义：用你的数据画出来是这一档的未连接态或空态。这时换成示例数据，卡头和预览标题旁标「示例」，页顶说明条写原因（7.2）。会议、待办、日程、随手记四个模块各备一份示例数据；其余模块直接画你的空态。原型里这四个模块的预览嵌的是各模块原型（6.4），它们没有「示例」这一态：示例预览嵌的是各模块原型平时那一帧、只在标题旁标「示例」；腾讯会议没连接时，会议预览嵌会议原型平时那一帧并加 `sample=1`：数据照常演示，卡头连接标签写「腾讯会议 · 示例数据」（会议设计 7.4，10-21 主控定），与标题旁的「示例」一致；桌面上那张从没连过的会议卡才嵌 `cfg=never`（整卡「未连接腾讯会议」）。
- 示例数据只在预览里出现；放上桌面后卡片永远画你的真实状态。
- 数据很少时几档看起来差不多，靠每个预览下的一句作用区分（评审 10-21）。

#### 6.6.4 预览下的按钮（白晨 10-21）

每个预览下面只有「放上桌面」：模块在不在桌面上都一样，已经在桌面上的也能再放一张；不写「已在桌面上」，没有「改成X卡」「从桌面移走」；格子上不写「在桌面上」。达上限时不可用（4.2）。桌面空着、不在编辑态时放上当场保存。

## 7. 文案（本文提案：正式、书面，称呼「你」）

### 7.1 「添加到桌面」

| 位置 | 文案 |
| --- | --- |
| 标题 | 添加到桌面（编辑桌面定稿；从岛上「＋」与「添加模块」格打开都是这个） |
| 标题旁小字 | 「打开」直接用，不占桌面；「放上桌面」才出现在首页（照 P-48） |
| 搜索框占位 | 搜索模块；没搜到：没有叫「{词}」的模块（只搜模块名）（照 P-55） |
| 名单分组 | 模块 {N} 个；来自插件　外部账号在连接管理里连接（照 P-49） |
| 插件行尾 | 已连接／未连接／无需连接／还没接入（不写「在桌面上」，白晨 10-21） |
| 未选中 | 选一个模块看看　选中后可以一次看到它各档尺寸的样子，再挑一种放上桌面。 |
| 需要连接 | 需要：连接腾讯会议 |
| 比例（F） | 按桌面大小同比缩到 {N}%，点卡放大看／不缩时：和你桌面上一样大 |
| 每张下面（F） | {档名}（有两种以上内容时：{档名} · {内容名}）　放上桌面；下一行{一句作用}（不写宽高，见 7.5） |
| 放大看（F） | 回到四档；{档名}　{宽} × {高}　原大／在你的桌面上是这个大小，这里按 {N}% 显示；读屏：放大看「{卡片叫法}」 |
| 按钮 | 放上桌面；请求中（只在桌面空着、不在编辑态时）：正在放上…；打开 |
| 示例标签 | 示例 |
| A、E、D（只在原型里对照） | 文案见原型；不进产品 |

### 7.2 对照板说明条

| 情况 | 文案 | 按钮 |
| --- | --- | --- |
| 腾讯会议未连接 | 你还没有连接腾讯会议，下面的预览用的是示例数据。连接后，卡片显示你自己的会议。 | 连接腾讯会议 |
| 授权失效 | 腾讯会议授权已失效，下面的预览用的是示例数据。重新连接后，卡片显示你自己的会议。 | 重新连接 |
| 没有内容 | 你现在没有{对象}，下面的预览用的是示例数据。{对象}：今天的会议／未完成的待办／今天的日程／便签 | — |
| 达上限 | 桌面上已有 50 张卡片，达到上限。请先在编辑桌面里移走不用的卡片，再放新的。 | — |

### 7.3 岛上的话与提示条

编辑桌面里的结果一律写在岛上，不弹提示条（编辑桌面定稿）；岛上没写到的照定稿原样。

| 情况 | 岛上（主句 · 副句） |
| --- | --- |
| 平时 | 调整桌面 · {N} 处改动（没有改动时只有「调整桌面」） |
| 放上 | 放上了「{卡片叫法}」 |
| 改尺寸 | 「{模块名}」改成{X卡}（小卡、中卡、大卡、整行） |
| 换内容 | 「{模块名}（{尺寸}）」换成「{内容名}」 |
| 移走 | 已移走「{卡片叫法}」 · 可撤销；还有同模块的卡时：已移走「{卡片叫法}」 · 桌面上还有 {N} 张{模块名}卡 · 可撤销 |
| 撤销 | 撤销了一步 |
| 完成 | ✓ 已保存 · {N} 处改动 |
| 取消 | 已还原，桌面没动 |
| 手机上移、下移 | 上移「{卡片叫法}」／下移「{卡片叫法}」 |

| 提示条（编辑桌面以外） | 文案 |
| --- | --- |
| 桌面空着时放上成功 | 已放上桌面：{卡片叫法} |
| 桌面空着时放上失败 | 未能放上桌面：{原因} |
| 「完成」时保存失败 | 未能保存桌面：{原因} |
| 插件卡、HTML 卡在编辑态外移除 | 已从桌面移走「{名字}」，模块照常运行（带「放回去」，编辑桌面定稿） |
| 刷新（会议） | 已同步（会议设计 13.3：30 秒内没有同步不说） |

{原因}：`card_limit_reached` 写「桌面上已有 50 张卡片」；超时、断网、5xx 写「服务暂时不可用，请稍后再试」。

### 7.4 卡片的叫法（读屏、岛上的话）

`{模块名}（{尺寸}{ · 内容名}）`，这一档只有一种内容时不写内容名：「会议（小 · 今日概览）」「会议（中）」「待办（小）」。一模一样的两张卡叫法相同；读屏只在桌面上有重名时在叫法后加「，第 {N} 张」。读屏：移走圆钮「从桌面移走「会议（小 · 今日概览）」」；弧「拖动改「会议（中）」的大小」；内容小牌「换内容，现在是「今日概览」」；内容菜单标题「卡片内容 · 会议（小）」；断开连接的确认里「会议（2 张）」。插件卡与自定义 HTML 卡沿用现有名字（`DeskGrid.tsx:43` 的 `cardTitle`）。

### 7.5 「还有 N 件」与卡里其余新句子

| 位置 | 文案 | 出处 |
| --- | --- | --- |
| 列表放不下 | 还有 {N} 件（项目）／还有 {N} 条（收件箱、资讯）／还有 {N} 份（云端文件夹、文档）；点了打开该模块详情层。会议、待办、日程、随手记照各自设计文档 | 本文提案（`card-sizes.md` 规则 2） |
| 回顾手机小卡 | 点开生成本周回顾 | 本文提案 |
| 对照板页头用途一句 | 取模块清单的 `description`，「用户」改成「你」 | 照现有 |
| 对照板每张卡下 | 第一行：{档名}（有两种以上内容时「{档名} · {内容名}」）＋「放上桌面」；第二行：这一档的一句作用（下一行）。不写宽高；放大看里写「{宽} × {高}」 | 本文提案（白晨 10-21「有点挤，很多字都是省略号」后改成两行） |
| 四个模块各档的一句作用（6.4） | 会议：小 · 下一场「只看下一场会，适合放在角落。」小 · 今日概览「今天几场会、几场待处理。」中「头条加接下来两场会。」大「头条加今天全部会议的时间轴，会多时放。」整行「左边头条，右边横排今天的各场会。」待办：小「今天到期与逾期各几件。」中「未完成的待办，日常放这张。」大「比中卡多列几件，事多时放。」整行「待办分左右两栏，横跨整行。」日程：小「只看接下来的一件安排。」中「接下来的几件安排。」大「今天的时间轴、空档与冲突。」整行「同大卡的日视图，横向更宽。」随手记：小「只放输入便签，想到就记。」中「输入便签加最近两张便签。」大「标签、输入便签加最近几张。」整行「整块便签板：标签、输入和最近便签。」 | 本文提案；每句不超过约 19 个字，1440 × 900 的四档对照里小卡一行放下 |
| 其余模块的一句作用（6.5） | 云端文件夹：最近改过的文件，各一句摘要。回顾：上次回顾的哪一周；点了才生成。收件箱：今天收进来几条，已分好几条。项目：每件事的步骤进度。文档：最近几份文档，各一句摘要。资讯：几条行业动态，各一句摘要。 | 本文提案 |
| 插件页 | 来自插件 · 已连接／未连接；需要：{准备什么}；选择视图；去连接管理连接；连接管理只管外部账号的连接；连上后就能放上桌面。已连接时另有：管理连接 | 照现有 |

原型里以「评审注：」或「演示：」开头的灰字是给评审看的说明，不是产品文案，不进本表。

## 8. 外部调用次数

**规则：多卡不增加调用次数，预览不调用**（本文提案）。

1. 取数按模块：同模块所有卡与预览共用一个查询键（3.1）。换内容、改尺寸不取数；本条只保证外部调用与同步不增加，验收不数读已存数据的次数。
2. 会议同步只由会议模块的时机触发（卡片挂上不再触发，0.4 第 14 条）：打开桌面、点刷新、作业；与会议卡张数无关。
3. 预览只读已存数据：会议预览不挂同步查询（现状会挂，V-2），不连接时用示例数据，0 次调用。
4. 每日估算不变：照会议设计第 8 节；桌面上放 1 张还是 3 张会议卡都一样。原型 DK-18：三张会议卡刷新一次只加 2 次调用，30 秒内再点 0 次、不提示。

## 9. 被取代的旧规则

| 条目 | 原内容 | 本文 | 谁推翻的 |
| --- | --- | --- | --- |
| 网格行高（`card.css:8`；定稿原型、各模块文档「卡高随内容」） | 行高 `minmax(156px, auto)`，卡高随内容 | 同档等大，行高 292；手机行高＝轨道宽 | **白晨 10-21 定：同档等大，行高 292**（`card-sizes.md`） |
| 待办「没改过尺寸全列」（10-19 问题 3 A；待办设计第 12 节第 2 条） | 没改过尺寸的卡全列，改过的中 3、大 6、整行 6 | 同一档只有一种列法，按格子算（待办设计第 6 节） | 白晨 10-21（同档等大） |
| 日程「手机整天摊开」（日程设计第 6 节） | 手机上日视图整天摊开 | 手机大卡 366 见方，日视图在卡内滚 | 白晨 10-21（同档等大） |
| 本文第二版 6.6.2「高度随内容自然撑开，最低一行 156」 | 预览高度随内容 | 预览与桌面同档一样大 | 白晨 10-21（同档等大） |
| P-34 编辑态说明、P-36 卡底浮条、P-41 移走提示条带「放回去」 | 浮条（把手、四档、×）；提示条「放回去」 | 圆钮、弧、岛、撤销；本文第二版的「浮条上加内容按钮」改成卡右上角内容小牌 | 白晨 10-21（编辑桌面重做定稿） |
| P-42 入口「编辑态顶栏『全部模块』」 | 顶栏有「全部模块」 | 岛上的「＋」与「添加模块」格；面板名「添加到桌面」 | 白晨 10-21（编辑桌面重做定稿） |
| 本文第二版 12.1 第 3、10、11、13 条 | 新卡怎么出现、放上后关不关面板、放回去亮不亮、移走最后一张时「它」的措辞 | 由编辑桌面定稿定掉（12.2） | 白晨 10-21（编辑桌面重做定稿） |
| P-50 格子「在桌面上」、P-51「已在桌面上」「改成X卡」、P-53 面板里「从桌面移走」（编辑桌面定稿照旧） | 有 | 都去掉；同一模块可以放多张 | 白晨 10-21（推翻编辑桌面定稿里面板照旧的这部分） |
| P-51 预览 | 一个尺寸分段＋一张迷你卡 | 各档各内容同一屏、同一个比例，每个一句作用（6.6） | 白晨 10-21（任务四） |
| P-51 预览下的「卡片长什么样」 | `meta.look` 一句 | 由每个预览的一句作用代替 | 本文提案 |
| P-47 外框、P-51 预览（10-20 右栏常驻 420） | 右栏一张迷你卡 | 版式 F：面板加宽，左边单列名单，右边四档对照（6.6.1） | 白晨 10-21（要「一次看到多个档位」，看了版式 F 认可；12.2） |
| 03 第一节「做」（`03-配置与桌面定制.md:25`）、第五节验收第 5 点（`:285`） | 「全部模块（打开、放上桌面、移走）」 | 去掉「移走」；加「按尺寸看各档并放上」「同一模块再放一张」 | 白晨 10-21 |
| P-29 断开（`:88`） | 断开前写清哪些卡会变成「未连接」 | 照旧，写法改为带张数「会议（2 张）」 | 本文提案 |
| P-39 各尺寸下卡里显示什么 | 本阶段不分档 | 不变；本文只加「同一档可有几种内容」的机制 | — |

## 10. 原型

位置 [原型/index.html](原型/index.html)，说明见 [原型/README.md](原型/README.md)。静态 HTML／CSS／JS，断网可开；视觉是定稿原型浮彩亮（`base.css`、手画图标逐段复制，出处见文件头）；岛、圆钮、弧、凹槽照编辑桌面重做定稿原型重画。界面交互原型，不需要时间滑块，画面停在 10:05；会议、待办、日程、随手记的卡直接嵌各模块自己的原型（6.4），其余模块是本原型的示意。

- 控制带：任务二、三、四与「自由操作」四个入口；分支编号 DK-01～DK-28；开关：腾讯会议（已连接／未连接／授权失效）、没有未完成的待办、桌面已有 50 张、下一次请求失败（完成时保存／桌面空着时放上）；方案切换（12.1 的第 1、7、8 条，打开时一律是默认）；「模拟：从简报定位到「周例会」」。
- 画面由 `engine.js`（卡片实例、内容种类、编辑草稿、放上的两种做法、移走、改尺寸时内容的去留、拖弧吸附、每档列几条、按模块取数、预览数据来源、按模块找卡）按状态推出；几何照 `card-sizes.md`（`engine.js` 的 `DK.geo`）；桌面按卡片键增量更新，动效在 `motion.js`。
- 状态说明栏：刚才命中的规则、草稿的改动数、桌面上每张卡片实例（键、模块、尺寸、内容、怎么来的）、按模块的数据读取与腾讯会议调用次数、操作记录。
- 说明页用的画面：`frame=small｜half｜tall｜full`（一张卡，外框是表值）、`panel`、`desk`，以及按 1:1 裁出的局部画面 `gallery`、`gallery-page`、`desk-row`、`toolbar`；另有 `cfg`、`do`、`opt`、`loop`、`rows`、`secs`、`vw`（细节见原型 README）。
- 机检：`/tmp/size-desk/check.js`（不在仓库里；用法见包首页「交开发前核对」）。
- 标准答案表：`原型/标准答案表.json`（`node 原型/export-golden.js` 生成，`--check` 只核对；结构与回放见[原型 README](原型/README.md)「标准答案表」）。规则引擎第二轮把岛上的话、提示条、尺寸牌（`DK.msg`）、说明条（`DK.notices`）、对照板的摆法与档名（`DK.BOARD_ORDER`、`DK.boardShow`、`DK.boardTitle`）、几何（`DK.geo`）、「完成」时调哪些接口（`DK.savePlan`）从画面层收进 `engine.js`，说明页与原型画面不变。

## 11. 验收场景

| 分支 | 场景一句话 |
| --- | --- |
| DK-01 | 选中会议：右边四档五种按桌面的样子摆在一起、同一个比例缩放并写明比例，每张一句作用与「放上桌面」（默认版式 F） |
| DK-02 | 腾讯会议未连接：预览用示例并标「示例」、页顶说明；照样能放上，桌面上是未连接态 |
| DK-03 | 授权失效：预览用示例；桌面上每张会议卡都画「重新连接」，小卡与手机写短句 |
| DK-04 | 没有未完成的待办：待办预览用示例，桌面上的待办卡画空态，与有数据时同样大 |
| DK-05 | 资讯只允许中一档：只列「中」 |
| DK-06 | 编辑桌面里放上：面板先关，新卡从「添加模块」格长出来，岛上「放上了…」，改动数加一 |
| DK-07 | 同模块、同尺寸、同内容再放一张，允许 |
| DK-08 | 桌面空着、不在编辑态：放上当场保存，提示条「已放上桌面：…」 |
| DK-09 | 已有 50 张：说明条，所有「放上桌面」不可用 |
| DK-10 | 「完成」时保存失败：提示条说明原因，桌面按后端实际存下的样子 |
| DK-11 | 编辑桌面里点会议小卡右上角的内容小牌，选「今日概览」，卡就地换内容，大小不变 |
| DK-12 | 撤销：岛上「撤销」退一步 |
| DK-13 | 改尺寸：「今日概览」拖弧改中变「今天的会」，再改回小是默认「下一场」 |
| DK-14 | 移走（圆钮）：岛上「已移走…」、可撤销；桌面上还有同模块的卡时副句写还剩几张 |
| DK-15 | 移走最后一张会议卡：会议数据与同步不受影响 |
| DK-16 | 撤销移走：原位置、原尺寸、原内容、原卡片键 |
| DK-17 | 取消：草稿里的改动全部还原，岛上「已还原，桌面没动」 |
| DK-18 | 三张会议卡刷新一次只同步一次，图标一起转；30 秒内再点不调用、不提示 |
| DK-19 | 两张待办卡，中卡上勾掉一件，小卡的计数同时少一 |
| DK-20 | 按模块找卡：从简报定位「周例会」，选中画出它的那张；都没有就打开详情层 |
| DK-21 | 版式 D（只在原型里对照）：左边名单、右边一页长的模块页 |
| DK-22 | 761～1100 与 390：对照板按当前窗口的几何画；先格子，点了进对照板 |
| DK-23 | 版式 A 第一层（只在原型里对照）：格子＋右栏，右栏一张按比例缩小的示意 |
| DK-24 | 版式 E（只在原型里对照）：一次看一档，点尺寸换档 |
| DK-25 | 版式 A 的下一页（只在原型里对照）：点「看全部尺寸」进一页长的模块页 |
| DK-26 | 完成：岛上停「✓ 已保存 · N 处改动」；改过又改回算 0 处、不调接口 |
| DK-27 | 拖弧改尺寸：尺寸牌写「大 · 2 列 · 2 行」，松手吸附 |
| DK-28 | 对照板里点大卡：按原大画出，下面一句作用与「放上桌面」；「回到四档」回去 |
| 尺寸 | 同一档每张卡宽高与 6.0 的表相差不超过 0.5；卡身里除滚动区外没有被裁掉而没写「还有 N 件」的内容（1440、1000、390、360） |

**已写成场景**（2026-10-21 第二轮，`../../../acceptance/编辑桌面.feature` 末尾「桌面与全部模块」一段，另改写同文件 AC-A81、AC-A82 各一条；新增 29 条场景、改写 2 条，均挂 `@fixme` 待实现时补步骤；AC 编号 A204～A225，已登记在 `acceptance/AC.md`）：

| 分支 | AC | 层 | 说明 |
| --- | --- | --- | --- |
| DK-01、DK-05 | A204 | 端到端 | 一条场景走两个分支（会议五张、资讯只一张） |
| DK-02、DK-03、DK-04 | A206 | 端到端 | 三条 |
| DK-06 | A207 | 端到端 | |
| DK-07 | A82（改写）、A208 | 端到端；集成 | A82 原「在面板里移走」改成「已在桌面上的再放一张」；A208 是后端不再 409、上限照旧 |
| DK-08 | A209 | 端到端 | 另一条是桌面空着时放上失败（标准答案表 `EXTRA-add-fail`） |
| DK-09 | A210 | 端到端 | |
| DK-10 | A211 | 端到端 | |
| DK-11 | A212 | 端到端 | |
| DK-12 | A214 | 端到端 | |
| DK-13 | A213 | 集成；端到端 | 集成一条管后端的去留，端到端一条管拖回小卡 |
| DK-14 | A215 | 端到端 | |
| DK-15 | A216 | 端到端 | |
| DK-16 | A81（改写） | 端到端 | 岛上改用卡片叫法「已移走「日程（大）」」 |
| DK-17 | A80（不改） | 端到端 | 现有「编辑中换了位置又移走一张卡，点「取消」…」已覆盖 |
| DK-18 | A218 | 端到端 | 两条：多张会议卡刷新只同步一次；桌面上没有会议卡时打开桌面也同步、窗口切回可见 30 分钟节流（会议设计 4.6、会议契约 3.2 的交界，由桌面外壳发） |
| DK-19 | A219 | 端到端 | |
| DK-20 | A220 | 端到端 | 两条：找到画出它的那张、都没画出时打开详情层 |
| DK-21、DK-23、DK-24、DK-25 | 不写 | — | 版式 A、E、D 只在原型里对照，不进产品 |
| DK-22 | A221 | 端到端 | |
| DK-26 | A217 | 端到端 | |
| DK-27 | A80（不改） | 端到端 | 现有「编辑桌面时拖动换位置、把一张卡改成小卡…」已覆盖拖弧吸附；尺寸牌的字写前端普通测试 |
| DK-28 | A205 | 端到端 | |
| 尺寸 | A222 | 端到端 | 两条：宽屏 1440、手机 390；机检的全量（1000、360 与编辑态）写前端普通测试 |
| 卡片叫法、断开时写张数（7.4、0.4 第 11、18 条） | A223 | 端到端 | |
| 旧卡读作默认内容（4.1、4.1.1） | A224 | 集成 | |
| 内容种类的校验（4.1.1） | A225 | 集成 | |

## 12. 待白晨定与白晨已定

### 12.1 待白晨定（按重要性；不表态按默认做，都可逆）

默认值的规则（技能第 8 步）：白晨定过的沿用；没定过的取本文的新方案；新方案要推翻白晨定过的，默认仍是白晨定的那个，新方案标「推翻 MM-DD 已定」作为推荐。原型与说明页的默认画面一律是下表「默认」一列。编号即原型地址参数 `opt=<编号>:<选项>`（第 1、7、8 条能切换）。跳号不重排：第 2 条早先移出本包（另行处理第 5 条）；第 3、10、11、13 条已由编辑桌面定稿定掉；第 1、5、14、15 条白晨 10-21 已定（12.2）；「改成X卡」白晨 10-21 也定了去掉，并在第 14 条里。

**请白晨看的**：没有了（第 1 条白晨 10-21 认可版式 F，移到 12.2）。

**替你定了的**（默认就是推荐，说明页列成一张表、不放画面；不同意再提）

| # | 问题 | 做法（默认＝推荐） | 理由 | 默认从哪来 |
| --- | --- | --- | --- | --- |
| 4 | 同模块、同尺寸、同内容两张允许吗 | 允许 | 少一条规则和一句报错；iOS 同 | 本文提案 |
| 6 | 预览用你的数据还是一律示例 | 能用你的就用你的，画不出时用示例并标明（6.6.3） | 放上去就是这个样子 | 本文提案 |
| 7 | 编辑桌面里换内容的入口（`opt=7`） | 卡右上角的内容小牌，点开选（6.2）；备选卡内分段 | 编辑桌面定稿把移走放左上角圆钮、改尺寸放右下角弧，卡上已没有浮条；小牌与圆钮同一套样子，三种以上也放得下、带一句作用 | 本文提案（会议设计第 6 节把「编辑桌面上怎么切换」留给桌面外壳）；第二版的「浮条上的内容名」随浮条去掉而作废 |
| 8 | 换内容的动效（`opt=8`） | 交叉淡化（13.2）；备选翻面 | 卡没动、只换内容；翻面会让人以为换了一张卡 | 本文提案 |
| 9 | 平时要不要卡片「⋯」菜单 | 不加 | 换内容、改尺寸、移走都在编辑桌面里做 | 白晨 10-21（会议设计第 6 节：小卡内容「在编辑态由用户选」） |
| 12 | 桌面上没有会议卡时，「生成完成」提示条弹不弹 | 不弹，照现状（5.2） | 不新增行为 | 现有实现（`actions.ts:73-74`） |
| 16 | 编辑桌面时卡多大 | 列距 30（编辑桌面定稿），宽随之变窄（1440 宽小卡 321.5），行高不变（大卡 614） | 高度不变，改尺寸时内容不跳 | 编辑桌面定稿定了列距；行高不变是本文提案（`card-sizes.md`「说明页与原型只画非编辑态」，本模块例外：编辑桌面是本模块的主场景） |

### 12.2 白晨已定（本文沿用）

| 问题 | 结论 | 谁、哪天 |
| --- | --- | --- |
| **同一档卡片大小** | **同档等大，行高 292**：同一档宽高固定，不随内容变（1440 宽小 330.5 × 292、中 679 × 292、大 679 × 602、整行 1376 × 292）；推翻「卡高随内容」、待办「没改过尺寸全列」、日程「手机整天摊开」 | **白晨 10-21 定：同档等大，行高 292**（`card-sizes.md`） |
| **原 12.1 第 14 条：同一模块能不能放多张、面板里的按钮** | **同一模块可以放多张；「添加到桌面」里每个预览只有「放上桌面」，去掉「已在桌面上」「改成X卡」「从桌面移走」**（格子上也不写「在桌面上」）；改尺寸靠拖弧、移走靠卡上圆钮 | **白晨 10-21 拍板**（「这个以我说的为准……不要保留这个已经在桌面上，从桌面移走，并且同一模块可以放多张，以我现在说的作为最终结论」，经主控转述），推翻 10-21 编辑桌面定稿里面板照旧的这部分；「改成X卡」是随后第二次拍板去掉的 |
| 原 12.1 第 5 条：每张卡自己的设置 | 本期不做 | 白晨 10-21 |
| 原 12.1 第 15 条：手机上卡多大 | 两列；小卡正方形 177 × 177，中、整行 366 × 177，大卡 366 × 366（390 宽）；更窄的手机跟着轨道变小，列几条按格子现算 | 白晨 10-21 |
| 编辑桌面 | 岛（「＋」「撤销」「取消」「完成」）、草稿（「完成」才保存、「取消」整桌还原）、左上角圆钮移走、右下角拖弧吸附四档、卡间距 30、移走靠撤销不再「放回去」；面板入口在岛上「＋」与「添加模块」格、面板本身照旧（按钮见上一行） | 白晨 10-21（编辑桌面重做定稿，`023f7125`） |
| 原 12.1 第 3 条：新卡怎么出现 | 面板先关，新卡从「添加模块」那一格长出来，在屏幕外就滚过去，岛上写结果 | 白晨 10-21（编辑桌面重做定稿） |
| 原 12.1 第 10 条：放上后面板关不关 | 关 | 白晨 10-21（编辑桌面重做定稿） |
| 原 12.1 第 11、13 条：放回去亮不亮、移走最后一张时提示条的「它」 | 编辑桌面里移走不再弹提示条、不再「放回去」，靠撤销；两条不再有 | 白晨 10-21（编辑桌面重做定稿） |
| 选模块时能不能看到各尺寸 | 要能看到每档的样子和作用 | 白晨 10-21 |
| 会议小卡两种内容 | 「下一场」「今日概览」，用户选定、不自动切换；四档都有刷新 | 白晨 10-21（会议设计第 6 节） |
| 智能叠放 | 不做 | 白晨 10-21 |
| 尺寸档 | 小／中／大／整行（后端 small／half／tall／full） | 白晨 10-18、10-19（P-40、问题 11 A） |
| 手机编辑 | 能进，上移下移代替拖动 | 白晨 10-19（问题 14 B）；10-21 编辑桌面定稿保留 |
| 面板的格子与右栏 | 格子、选中框滑动、右栏常驻；「窗口再大一点，右侧不用上下翻」（右栏在版式 F 里加宽成对照板，12.1 第 1 条） | 白晨 10-19、10-20；10-21 编辑桌面定稿照旧 |
| 原 12.1 第 1 条：面板里怎么看各档 | **版式 F「四档对照」**：左边单列名单，右边把选中模块的各档按桌面网格摆在一起、同一个比例缩放并写明（1440 × 900 约 70%），卡下两行写名字、「放上桌面」与一句作用（不截断），点一张放大看原大（6.6.1）；A、E 都不要 | 白晨 10-21（先说「我比较倾向于要能够一次看到多个档位」；看了第一版说「好像有点挤，很多字都是省略号」，改后认可：「效果我觉得 OK 的」） |

## 13. 动效

### 13.1 原则

表达因果（新卡从哪来、出现在哪）；只有要你注意的才亮；沿用编辑桌面定稿与定稿原型的时长与曲线：位移让位 220ms、面板与提示条缓动 `cubic-bezier(.32,.72,0,1)`、面板进场 260ms、面板关后 140ms 再改草稿（`AFTER_CLOSE`）；减少动态效果按白晨 10-18「以后再说」。

### 13.2 有备选的变化

| 变化 | 默认 | 推荐 | 做法 | 为什么 | 没选的 |
| --- | --- | --- | --- | --- | --- |
| 换内容（12.1 第 8 条） | A 交叉淡化 | A | 旧内容淡出 120ms、新内容淡入 180ms；卡的大小不变 | 卡没动、只换内容 | B 翻面（转到 90° 160ms、换内容、转回 200ms）：会让人以为换了一张卡；原型 `opt=8:B` 可看 |

### 13.3 只有一个方案的变化

- 新卡放上（编辑桌面定稿）：面板淡出；新卡从「添加模块」那一格的位置长到它的格子（420ms），在屏幕外就先滚过去。
- 换选中模块：对照板各块依次上浮淡入 320ms、错开 35ms（沿用现有右栏）。
- 放大看（F）：放大的那张淡入 180ms，「回到四档」淡出。
- 内容菜单：淡入、上移 4 像素 180ms。
- 移走：卡缩小淡出 200ms，别的卡补位 220ms。
- 改尺寸：拖弧时卡跟手，松手吸附；其余卡从旧位置滑到新位置 220ms（编辑桌面定稿）。
- 岛上的话：换的时候上下滑入滑出（编辑桌面定稿）。
- 刷新：同模块所有卡的刷新图标一起转一圈 700ms（会议设计 13.3）。

### 13.4 实现提示

桌面列表按卡片键增量更新；位移用 FLIP（原型 `motion.js` 的 `MO.flip`，产品 `useFlip.ts`）；滚动只滚桌面自己的滚动容器，不用会连带外层滚动的 `scrollIntoView`（原型在 iframe 里踩过）。

## 14. 依据

- 白晨 10-21 三件任务原话（组长派单转述）；主控 10-21 关于任务三与编辑桌面定稿先后的更正。
- 白晨 10-21 同档等大：[card-sizes.md](../../../.claude/skills/designing-module-loops/card-sizes.md)。
- 编辑桌面重做定稿：[原型 README](../../prototypes/2026-10-21-编辑桌面重做/README.md)、[收口档案](../../reports/acceptance/2026-10-21-编辑桌面重做.md)、提交 `023f7125`。
- [会议设计](../会议/设计.md)第 1、4.3、4.6、6、8、13 节（白晨 10-21 定稿）；[待办设计](../待办/设计.md)、[日程设计](../日程/设计.md)、[随手记设计](../随手记/设计.md)第 6 节（只读，未改）。
- 能力清单 [03-配置与桌面定制](../../specs/2026-10-18-V1重做能力清单/03-配置与桌面定制.md) P-34～P-55 与第三节 17 问（白晨 10-19）。
- [使用指引第三轮收口档案](../../reports/acceptance/2026-10-20-使用指引第三轮.md):13、:18、:21。
- [未决问题](../../decisions/未决问题.md)第 101～104 号：待办、日程、随手记的卡以那三份为准，本包直接嵌它们的原型，不另列表。
- [评审](评审.md)（独立评审子代理，2026-10-21）、末尾「设计者回应」与「10-21 对齐编辑桌面重做」。
- 代码（读于 2026-10-21，编辑桌面合入以后）：见 0.2、0.4、3.1 的出处。

## 另行处理（顺带发现，不展开）

1. 分享桌面：导入按 `native:<模块>` 去重（`apps/api/app/share/service.py:125-136`），导出没有 `content`。本期没有入口；以后开放时导出带每张卡的尺寸与内容，导入不按模块去重。
2. 产品 `AllModulesPanel.tsx:3` 的注释写面板「宽 1000、预览栏 380」，与 `modules.css:29-32` 的 1120、420 不一致（注释过时，随实现改）。
3. 能力清单 03 文首需注明 P-42、P-47、P-50、P-51、P-53 等被本文或编辑桌面定稿取代（主控做）。
4. `docs/README.md` 索引登记本包（主控做）。
5. **待办小卡加第二种内容「下一件」**（原 12.1 第 2 条，评审 10-21 判为阻断后移出）：待办模块的新能力，建议在待办设计确认时一起考虑。
6. 固定行高后，插件视图卡（飞书日历、腾讯会议插件）同样要放得下；插件视图由插件渲染，要在插件契约里写明各档的格子大小（本文不展开）。
