# TVU Pack — Product Introduction

> **项目介绍 / 起手必读**。TVU Pack 的产品设计 / mockup / code 任务，起手先读本文件（见 `consumer-product-conventions` skill Rule 8）。
> **归属**：当前项目资料，留消费产品侧——**不进 `tvu-design-system` 真源**（实证 2026-07-09：roster 曾误 commit 进 DS `domain-tvu.md`，已 revert）。
> Jira @mention 必须用 **ADF + accountId**（markdown `@Name` 不触发通知）。

---

## 1. 项目简介 Overview

**TVU Pack** 是 TVU **背包（pack）产品线**的设计项目。核心产品 **RPS One（TM1100）** 及 V3 / V4 pack 系列。

- **V4 三形态**：RPS One（TM1100，4 路）/ TM1000 V4 / TM1000 V4 4K。
- **Scope**：只做背包（pack）相关需求；**Receiver / SaaS / MicroApps 不在 scope**。
- **Jira 项目**：`ENG_TVU One V4`（project key `V4`）；历史需求也覆盖 V3（V7.7+）。
- **V3 / V4 功能差异对比**（销售口径，2026-08-04）：[`docs/reference/2026-08-04-tm1000-v3-vs-v4-feature-comparison.md`](reference/2026-08-04-tm1000-v3-vs-v4-feature-comparison.md)

---

## 2. 团队 Roster + 选人规律 Team & Assignment

> owner 2026-07-09 提供权威名单。Jira @mention 必须用 **ADF + accountId**。

| 角色 / 领域 Role | 姓名 Name | Jira accountId |
|---|---|---|
| **PM（V3 + V4）** | **Trevor Yao** | `5e59a401a17f930c9b9627c2` |
| **项目开发负责人（V3 + V4，dev lead）** | **Dave Hu** | `5e61b34ecf54800ce3a05065` |
| **V4 LCD / Touch Screen 开发** | Edward Wu | `5e72ce9e3e46490c3801b891` |
| **V3 LCD / Touch Screen 开发** | Asher Guo | `5e81c6a88078210c2a438ab0` |
| **Config-T 开发（V3 + V4）** | Bonnie Zhou | `622808804160640069c9fe1a` |
| **拨号 / 网络模块（V3 + V4）** | Danner Dai | `5e61bee6cf54800ce3a05119` |
| **系统 / 平台号（V3 + V4）** | Jack Wu / Ren | `5b510f176185bd2c255831e4` / `62c8022ae16ddfe82be0b42e` |
| **音视频（V3 + V4）** | Dave Hu / Fujianfang / Allen | `5e61b34e…` / `60ab79f9b4624d0069f40d9a` / Allen Wang `5e61be81157ed50cd2ba494f` 或 Allen Wei `5f08ff225ee2c3002351befc`（待确认哪个）|

**选人规律 Assignment logic**（交付 @mention / 「某模块找谁」时按此）：

- **界面拆单**：LCD → V4 **Edward** / V3 **Asher**；Config-T → **Bonnie**（V3+V4）。同一 feature 跨两端按界面拆 Jira 单分派（实证 CPU 温度告警：V4-2335 LCD→Edward / V4-2356 Config-T→Bonnie）。
- **模块归口**：拨号 / 网络 → Danner；系统 / 平台号 → Jack & Ren；音视频 → Dave / Fujian / Allen。
- **交付收尾（§6-JIRA ④）**：@PM = **Trevor Yao**；FYI 待开发负责人按界面选对应开发者（可加 dev lead Dave Hu）。

⚠️ **Danner 是拨号 / 网络模块负责人，不是 PM**；PM 是 **Trevor**。

---

## 3. 产品设计规则 Product-Design Conventions

### 3.1 Figma 页面组织 — 新需求页归位

LCD / Config-T 的 Figma 文件是「**扁平页列表 + 破折号分隔页当分组标题**」的结构，按产品版本分两大组，每组下再按状态分隔：

```
------- V4 (V8.0+) -------
  -- To be confirmed --      ← 新需求 mockup 页放这里
  -- To be developed --
  -- Release to QA --
------- V3 (V7.7+) -------
  -- To be confirmed --      ← 新需求 mockup 页放这里
  -- To be developed --
  -- Release to QA --
```

**规则**：一个新需求的 mockup 页建好后，**必须归到对应版本组的「To be confirmed」下**——V4 需求 → `V4 > To be confirmed`；V3 需求 → `V3 > To be confirmed`。**newest-first**（新页排在该组顶部）。页面命名沿用 `< V4-XXXX > <Title> YYYYMMDD`。

> 实证 2026-07-09 V4-2333：新建页默认漂在文件末尾，须移到 `V4 > To be confirmed` 组顶部。

### 3.2 LCD 直播状态样式参考（Standby / Live / Online / Offline）

**权威参考页**：LCD 文件 `8062:545`（"Optimization the flow of Go Live"，含单路 + 多路的 Standby ↔ Live 样式）。LCD 新需求涉及直播 / 待播 / 无源态时，头部 + 状态文字 + 按钮色**按下表、色值直接取参考页，勿自造**。

| 态 | 头部 | 状态文字（左上） | 主按钮 | 备注 |
|---|---|---|---|---|
| **Standby**（待播） | **绿色头部色带**（~32px 高 VECTOR 线性渐变：左端透明 `#AFE94E` → 右端实心绿 `#189335`） | "Standby"，绿渐变 | 绿（`Live` / `Live all`） | — |
| **Live**（on-air） | **红色头部色带**（VECTOR 线性渐变：左端透明 `#F5515F` → 右端实心深红 `#CA1A1A`） | "● LIVE"，实心红 `#D0021B`（前带红圆点） | 红（`Stop` / `Stop all`） | **多路**：在播画面缩略图加**红边框**；partial 直播只给在播通道加红框 |
| **Online**（无源在线） | 无色带，深色顶 + 状态文字 | "Online" | —（本期 V4-2333：`Test Signal`） | 参考本项目 V4-2333 屏1 `9359:492` |
| **Offline** | 同 Online | "Offline"（仅左上文字改，其余同 Online） | — | — |

> 实证 2026-07-09 V4-2333：Live 态必须是**整条红头部色带**（非仅状态文字变红）；红带 VECTOR 直接克隆参考页 `8062:7678`（Standby 绿带 = `8062:7806`）。

### 3.3 新建 Figma page 画布默认深色

本项目产品 UI **默认 Dark 主题**。在 LCD / Config-T 文件里**新建 page 时，画布背景取现有页面的深灰**（`#6A6A6A`，rgb ≈ 0.417），**不要用 Figma 默认浅灰 `#F5F5F5`**——深色 mockup 放浅底刺眼、且与其它页面不一致。做法：读一个现有页 `page.backgrounds` 套到新页。

> 实证 2026-07-09 V4-2333：新建页默认浅灰，用户指出刺眼后改为深灰对齐现有页。

### 3.4 提交动作措辞 —— **按端统一**：Config-T = `Apply` · LCD = `OK`

**这条 2026-08-06 轮三十由 owner 改成按端统一**（原为两端都叫 `Apply`）。跨端强行统一一个词不成立 —— 两个 surface 各有自己的既有惯例，各自内部一致才是判据。

| Surface | 提交动作 label | 不用 |
|---|---|---|
| **Config-T（Local UI）** | **`Apply`** | `Update` / `Save` / `Submit` / `OK` |
| **LCD / Touch Screen** | **`OK`** | `Apply` / `Save` / `Submit` |

- **Config-T 侧理由 = 与产品既有页面一致**（owner 2026-08-06 原话：「Update 按钮改成 Apply 按钮是为了跟其他 config-T 页面保持一致」）。实测支撑：`V4-1827` IP Source Item 内有 **12+ 处** `Apply`；`V4-2285/2286`、`TM3-1930` 另有实心形态的 `Apply`。
- **LCD 侧理由 = owner 以设备实机为准拍板**（原话：「LCD 触摸屏上面好像全是 OK 按钮……我刚刚已经全部改回 OK 了，就用这个措辞」）。
  - ⚠️ **已登记的已知偏差**：Figma 设计真源里 LCD 端**同类表单配置页的既有先例其实是 `Apply`** —— `V4-1542`「configure LAN IP on the touch screen」实测 `Apply` ×7（其中 4 处是同一个 file-local `LCD Button` instance），而 6 个 LCD 页扫下来 `OK` 只出现 2 次且均非表单提交底栏。证据已呈报，owner 重申以实机为准 ⇒ **以 `OK` 为准，并接受与 V4-1542 的跨页不一致**。若后续统一，V4-1542 是要一并改的那一处。
- **状态语义（两端同）**：与已保存值一致 ⇒ 禁用（灰）；任一字段不同 ⇒ 可点（绿）。**禁用走组件的真变体，不叠加降透明度**（M32.4）—— Config-T 用 `button/no icon` 的 `Enable` 轴，LCD 用 `LCD Button` 的 `Status` 轴。
- **Config-T 形态在产品内有两种**，都可接受、按所在页面既有形态选：`button/no icon` ghost 绿 62×32（旧库 `TVU UX Library`）· `web button` 的 `Button/Disable` 实心 76×36。
- **LCD 实现注意**：file-local `LCD Button` 的轴是 `Type: Back|Home|Primary × Status: Normal|Disabled|Live|Stop`，**没有 `OK` 也没有 `Apply` 变体**（`Type=Primary` 默认文案是 `Start`），现有 `OK` 全部靠**文本覆盖**。其字体 Verdana 在 MCP 环境不可写 ⇒ **AI 改不了 LCD 按钮文案，只能出待改清单交 owner**。实测：切 `Status` 变体时文本覆盖会**存活**（节点 id 变、`characters` 保留），故切变体安全。

- **Config-T 两个动作按钮之间的间距 = 16px，且必须绑 DS token `Spacing/M`，不许写死数值**（owner 2026-08-06 轮三十补正，原话「调整为 token 变量值为 16px Token 变量」）。
  - token：`Spacing/M`（key `bc1d646c…`，DS `TVU Design System` 集合；Dark / Light 两 mode 均 alias 到 `Basic Size/#16`）⇒ **绑语义层、不绑 `Basic Size/#16` 原始值**（§C5 语义优先）。
  - 落点是**只装那两个按钮的那一层容器** —— 本项目 Config-T 有两种结构：`row · actions`（按钮直挂，如 CT1 / CT3）与 `row · actions · buttons`（如 CT1a/CT2/CT4/CT5/CT6/CT7/CT8）。**绑前先确认该容器的 children 只有那两个按钮**，否则会连带改掉 hint↔按钮组的间距。
  - **右缘不变量优先于间距**：改间距后必须实测「第二个按钮右缘 = 控件右缘」仍成立（本项目该值 = 2058，见 D38 ④），并复跑 `pnpm audit:mockup-geometry-consistency`。

### 3.4.1 提交后必须反馈结果（两端）

**任何提交动作按下后都要给结果反馈**，不能默默完成（2026-08-06 轮三十 owner 追加：「点击 Apply 按钮后需要给成功和失败的提醒」）：

| 结果 | 组件 | 之后的状态 |
|---|---|---|
| 成功 | DS `Message` `status=success, size=L` | 提交键回到禁用；字段保留刚应用的取值 |
| 失败 | DS `Message` `status=error, size=L` | **设备侧无任何变化**；字段保留新取值；提交键**保持可点**以便重试 |

- 文案范式：句子 + em dash + 句点。成功 `Parameters applied — test signal reconnected.` · 失败 **`Couldn't apply parameters — please try again.`**
- ⛔ **失败提示不许编原因，也不许写「未改变」这类会与 dirty 规则打架的话**（owner 2026-08-06 走查补正）。初版写 `— test signal unchanged.` 被判不合理：它把「设备侧状态未改变」与「没有待应用改动」混成一句，而按 dirty 规则「没改动 ⇒ 提交键不可点」⇒ 与图上提交键可点正面矛盾，读者会把「没改动」读成失败原因。**正解 = 只说「失败 + 下一步」**；「设备侧无变化 / 改动仍保留 / 可直接重试」写进 annot 与验收条，不挤进 toast。**具体失败原因枚举属 dev 的错误码，效果图文案是占位、不是 spec。**
- 落位按宿主页面既有 toast 范式，**不要自创**：Config-T = 帧内 relX 528 / relY 48（`ABSOLUTE`）· LCD = **水平居中 + 距帧顶 8px**（两处既有先例实测一致）。
- `Message` 组件无 theme 轴（D21），**按发布原样用、不改色**。

### 3.5 「丢弃未保存改动」确认弹窗 — 项目统一范式

owner 2026-08-06 定稿（原话：「后续其他的类似需要也都要用这个文案和样式，宽度可以适当调整」）。**任何「带未应用改动离开」的确认，都用这一套，不要另起**：

| 维度 | 取值 |
|---|---|
| 组件 | DS `Notification`，变体 **`theme=dark, form=dialog, type=default`**，`closable=true` |
| 尺寸 | 480×153（**宽度可按场景调整，其余不动**） |
| 标题 | `Confirm discard changes?`（Roboto Medium 16） |
| 正文 | `Your changes have not been saved. Discard changes?`（Roboto Regular 14） |
| 按钮 | `Cancel`（次要）+ `Discard`（红，破坏性） |
| 遮罩 | 全帧 scrim：黑 20% + `BACKGROUND_BLUR` 8（M41 默认档） |

- ⚠️ **不要用 `form=pop confirm`** —— 该变体的 `Notification_content` SLOT 是空的且排在正文之后，塞标题会渲染到正文下方并右对齐（2026-08-06 实证）。
- ⛔ **本范式只作用于 Config-T（Local UI），不作用于 LCD** —— 2026-08-06 轮三十 owner 拍板 **LCD 端不做 discard 确认**（原话：「LCD 端的 discard 弹窗不做」）。LCD 上带未应用改动离开 = **直接丢弃、无二次确认**；改动安全网由 §3.4.1 的提交结果反馈承担。（本条此前写的「LCD 端形态不同、文案相同 ⇒ 复用覆盖式列表范式」已作废。）
- 触发时机按 feature 定，但**动作类按钮（Start / Stop 之类）默认不触发** —— 它们按已保存值执行。

> 落点说明：3.4 / 3.4.1 / 3.5 属**项目资料**（措辞与取值），按 DS §M-DISCIPLINE.SOURCE 三问判定不进设计系统真源。完整决策见 [`docs/specs/2026-07-28-v4-2333-test-signal-parameters-design.md`](./specs/2026-07-28-v4-2333-test-signal-parameters-design.md) **D40**（提交范式）+ **D41**（措辞按端统一 · LCD 撤 discard · 提交结果双态）。

---

## 4. Figma 文件索引 Figma Files

见 [`FIGMA_LINKS.md`](./FIGMA_LINKS.md)。关键文件：

- **LCD / Touch Screen**：`0054ib0nLmt27bC3QlGDl7`
- **Config-T (Local UI)**：`rJJjWWs51n2iFOlCIC7aYG`
- **TVU UX Design System 库**（组件真源，非产品文件）：`YbsPRUVmNdsbN40NNwh1Gn`
