---
id: v4-1827-ndi-into-ipsource
title: NDI merged into IP Source page (Config-T)
doc_type: handoff
status: in-dev
target_release: "8.4"
last_updated: 2026-07-27
sources:
  - { type: jira, ref: "V4-1827", url: "https://tvunetworks.atlassian.net/browse/V4-1827" }
  - { type: jira, ref: "FB-7860", url: "https://tvunetworks.atlassian.net/browse/FB-7860" }
  - { type: jira, ref: "V4-2261", url: "https://tvunetworks.atlassian.net/browse/V4-2261" }
figma:
  file: rJJjWWs51n2iFOlCIC7aYG
  nodes:
    - { id: "7884:653", label: "AFTER Section (3 states)", url: "https://www.figma.com/design/rJJjWWs51n2iFOlCIC7aYG/?node-id=7884-653" }
    - { id: "7452:4", label: "PRD (Round-3)", url: "https://www.figma.com/design/rJJjWWs51n2iFOlCIC7aYG/?node-id=7452-4" }
---

# Handoff — V4-1827 NDI merged into IP Source page (Config-T) · Round 3

## 1. 做了什么（Round 3 — NDI 并入 IP Source）
方向从 Round 2（独立 NDI tab + 单源表单 + per-Tx toggle）改为 **NDI 归入现有 IP Source 页，radio 三选一互斥**。目标文件 Config-T `rJJjWWs51n2iFOlCIC7aYG`，工作页 `7452:2`。

- **PRD `7452:4`**：6 段全部按 Round-3 重写（新增 NDI、归入 IP Source、无"移除"措辞）；需求来源 V4-1827/FB-7860/V4-2261/V4-1676 + WebR 全部 setRangeHyperlink；Priority High；副标题带日期。
- **Section 重构**（page 7452:2）：Context `7452:3`（PRD+Jira 卡 `7455:1416`）· BEFORE `7884:652`（现状参考帧 `7862:1721`，2 选 radio）· AFTER `7884:653`（3 状态帧）· `_backup` `7485:1144`（Round-2 单源草稿改名归档、下移 y2100）。
- **AFTER 三状态帧**（clone 现状参考帧改造，均含三选 radio + 分隔线 + per-Tx，950 宽 mirror BEFORE）：
  - `7885:652` **IP Source 选中** — 6 卡网格 + Merge All（IP 绿选中）
  - `7892:790` **NDI 选中** — 单源表单 Source Name + URL ndi:// combobox + Apply（**无 toggle**）+ combobox 展开态浮层 `7898:924`（Discovery 发现源 STUDIO-CAM-01/02、GFX-SERVER (NDI) + 搜索 + 手填三合一）
  - `7892:1066` **HDMI/SDI/USB 选中** — 居中提示 `Local input active — no configuration required.`
  - 3 条 cyan 状态 caption `7899:834/835/836`
  - **交互流程说明卡 `7909:839`**（AFTER section 顶部，M23 navy）：三选 radio → 三态内容区分支流程 + per-Tx 重载，双语。
- **交付卡**（Section `7838:2`，**已从 page 3078 移到工作页 7452:2 x4900**，与 mockup 同页）：UX Delivery 卡 `7839:2`（Why/Changes/Data Contract/Interaction/Acceptance）+ User Journey Map 卡 `7840:2`（5-stage × 5-lens，Ops persona）全按 Round-3 重写。
- **design-record**：`docs/specs/2026-07-21-v4-1827-design-record.md`（已进 REQUEST-INDEX）。

## 2. 关键决策
① NDI 归入 IP Source 页、不新增独立 tab ② 切换控件回归 radio 单选（多方案被否）③ NDI 表单不设 enable toggle（选中即启用）④ radio↔内容区加分隔线 ⑤ 对外措辞"新增"非"移除"（产品现状无 NDI）⑥ combobox 保留 Discovery+Manual 双模式（Trevor 2026-07-20 确认）⑦ Priority High。

## 3. Rule checklist（机械自检 = use_figma in-file 替代，REST 无 token，同 V4-2259 先例）
- **glyph（产品区）= 0** · **font（注释区）= 0**（全 Roboto/Noto；Jira 卡 Inter=库 instance 豁免）
- **overlap = 0**（AFTER 三帧 / caption / 4 Section / 2 交付卡）
- **bilingual-spacing M23.14**：PRD 22/14=1.57 ✓ · UX 20/15=1.33 ✓ · Journey 18/13=1.38 ✓（Journey lens ZH 行距已从 15 收紧到 13）
- **M23.8/M23.8.1**：Jira 卡 issue-key + PRD/副标题全部 ticket + WebR 均 setRangeHyperlink ✓
- **M23.14 (B)**：段名 cyan Medium 15、PRD/UX/Journey 卡 title 下带创建日期 ✓
- REST 机检待补：token 配置后建议补跑 `pnpm audit:mockup-conformance --file rJJjWWs51n2iFOlCIC7aYG`。

## 4. Open scope items（本轮范围外 / backlog）
- ~~NDI 源状态补充态~~ → **已于 2026-07-22 补充交付（Round 3.1，见 §6）**：空态/扫描中/发现失败/连接中/Apply 成功/Apply 失败/超长源名 7 态。**4-Tx 绑定总览**仍拎出（非状态态，是新视图+流程权衡，待 owner 确认诉求）。
- combobox 下拉**真实 NDI 源名清单**（owner/域知识；mockup 用示例名；拿到后可程序化批量替换）。**仍 backlog**。
- LCD 侧 V4-2261（独立单）。
- 产品 UI 遗留 Helvetica → Roboto 统一（不可移植系统字体，非本轮；AFTER 帧内 radio label + 状态态改动文本已统一 Roboto）。

## 5. 待办 / 下一步
- **Jira 回复**（草稿已备，待 owner 过目后发）：`UX Design updated.` + AFTER Section 短锚链接 + @Trevor review + cc Dave Hu / fujianfang / Bonnie Zhou（ADF + accountId 真 mention）。
- **Jira priority Medium → High**（owner 已同意，收尾一并 propose 发送）。
- fixVersion 当前空——待 owner 决定是否锁 8.4。
- parent=V4-1676（8.4）已确认无误；评论区无 AI 重复评论（上轮 38472 未落盘）。

---

## 6. Round 3.1 — NDI 状态态补充（2026-07-22）

补齐 §4 backlog 的 7 个 NDI 数据流 edge/feedback 态。新建独立 Section `V4-1827 · AFTER (states) — NDI discovery & apply feedback` `7917:839`（AFTER Section 正下方 x=3620 y=2100，probe 防叠加通过），7 个局部态帧均 clone 自 NDI 帧② `7892:790`，各配 cyan caption ④–⑩（EN 单语，对齐现有 ①②③）。

| # | 态 | node | 组件/做法 |
|---|---|---|---|
| ④ | 发现源空态 | `7918:839` | combobox 展开：`No NDI sources found…` + `Type an ndi:// address manually`（Drop down Item 去高亮承载提示）|
| ⑤ | 扫描中 | `7918:879` | `Scanning for NDI sources…`（纯文案，dev 加 spinner）|
| ⑥ | 发现失败 | `7918:919` | `NDI Discovery unavailable — check the network`（dev 加 warning icon）|
| ⑦ | 连接中 | `7918:959` | 表单填妥 + Apply=`Connecting…`（disabled）|
| ⑧ | Apply 成功 | `7918:1359` | `Message status=success` 顶部居中：`NDI source applied to Transmitter 1` |
| ⑨ | Apply 失败 | `7918:1399` | `Message status=error`：`Failed to apply — source unreachable…` |
| ⑩ | 超长源名 | `7918:1439` | Item1 尾截断 + `Tooltips` 悬浮全名，Item2 正常长度对比 |

**M49 §3 Feedback UI Inventory（同源）**：④⑤⑥ = Drop down 展开内联态；⑧⑨ = `Message` size=M（success/error 同宽同位顶部居中，no-action，close icon off）；⑦ = 按钮 loading 态。设计取舍：spinner/icon 属动效实现细节交 dev，mockup 用文案 + 状态色（Message 自带绿/红）传语义。

**交付层同步**：Journey 卡 `7840:2` stage3/5 Opportunities 🟡🔴→✅（帧 ④–⑥ / ⑦–⑨）；UX 卡 `7839:2` Acceptance 增补状态态验收项（卡 resize 923→973）；design-record §7.5 + §8。

### Rule checklist（机检 = use_figma in-file 替代，REST 无 FIGMA token，同 V4-2259 先例）
- **overlap / I2 = 0**（Section 14 直接子 = 7 帧 + 7 caption，两两求交无重叠）✓
- **glyph = 0**（产品区 TEXT 无 Unicode 装饰字符充图标；`…`/`—` 为标点非图标）✓
- **font（注释区）**：7 条 caption 全 `Roboto` ✓；Journey/UX 卡改动段落双语字体分段保留（EN Roboto / ZH Noto Sans SC，range 替换 + setRangeFontName）✓
- **library-origin**：新增 instance `Message`×2 `7932:1103`/`7933:1041` + `Tooltips` `7935:1233` 均 `mainComponent.remote=true`（来自 TVU UX Design System library）✓
- **colors（C1）**：空态提示文本复用 placeholder variable 绑定（`1fe2a119…`）✓；Message/Tooltip/combobox Item 继承库 instance 色 ✓；**caption fill = raw cyan unbound**——clone 自现有 ①②③、未碰 fills，与 sibling 一致（file-wide 存量 deferred，不恶化，未逐个绑以保 sibling 一致）
- **字体绕墙**：改既有帧文本碰 Helvetica（Source Name/URL/Apply label）走 `fontName` 覆盖 Roboto（不 load 旧 Helvetica）✓
- REST 五闸（integrity full / colors / typography-icon / library-origin / binding-fidelity）无 token 未跑；token 配置后建议补跑 `pnpm audit:mockup-conformance --file rJJjWWs51n2iFOlCIC7aYG --non-blocking` 复核。

### Round 3.1 backlog（未做）
- NDI 真实源名清单（owner/域知识）· 4-Tx 绑定总览（新视图，待 owner 确认诉求）· LCD 侧 V4-2261。
- Jira 是否就状态态补充补评论 = 待 owner 决定（默认不自动发）。

---

<!-- mockup-handoff -->

## 7. Round 3.2 — 移除 Source Name 字段（2026-07-27）

**owner 决策**：NDI 表单去掉 `Source Name` 输入字段——产品里没有任何位置展示该名称，让用户命名却无处体现＝无回报的录入负担。NDI 源**仅以 `ndi://` URL 标识**。表单收敛为 `URL: ndi://` combobox + `Apply`。

| 层 | 改动 |
|---|---|
| 产品 UI | 8 帧（AFTER 帧② `7892:790` + 状态态 `7918:839/879/919/959/1359/1399/1439`）删 `Frame 38`（label + Input instance）。form 170→114、帧 367→311（auto-layout hug）|
| 布局回收 | 各帧内 ABSOLUTE combobox 浮层 + Tooltip `7944:2126` 上移 56；AFTER caption③ `7899:836` + 帧③ `7892:1066` 上移 56；states 7 组按 k×56 级联上移，Section `7917:839` 3367→2975；PRD 增高 72 → WebR 参考 4 节点下移 72 复位间隙；UX 卡 `7839:2` 973→978 |
| PRD `7452:4` | 功能需求 + 验收标准去 Source Name，各补一条显式条目（源仅以 ndi:// URL 标识 / 表单无 Source Name 字段）|
| UX 卡 `7839:2` | Changes · Data Contract（改为「不存储用户录入的源名称」）· Acceptance |
| Journey 卡 `7840:2` | stage 3 Pairing 的 Actions / Touchpoints |
| 流程卡 `7909:839` · caption | 流程 NDI 分支；caption ② 补 `no name field`；caption ⑩ → `Long discovered source name` |

**顺带修正 Round 3.1 遗留**：UX 卡 Acceptance 末条 EN+ZH 拆行并对齐 sibling 字号；Journey stage 5 Opportunities 正文 cyan → 白。

### Rule checklist（in-file 机检，REST 无 FIGMA_PERSONAL_ACCESS_TOKEN，同 V4-2259 先例）
- REST 总闸实跑结果：`pnpm audit:mockup-conformance --file rJJjWWs51n2iFOlCIC7aYG --non-blocking` → **9/9 子审计 ERROR（could not run）**，缺 token + 无 `figma-data/mockup/<key>.json` 缓存，exit 0（场景 2 非阻塞）。故走 in-file 替代。
- **overlap（I2/I6）= 0**（Section 两两 + `7452:3`/`7884:652`/`7884:653`/`7917:839`/`7838:2` 各自直接子两两）✓
- **I3 overflow-count = 0**（7 个容器均有余量，见 report `slack`）✓
- **产品区 glyph = 0** · **产品区 `Source Name` 残留 = 0** ✓
- **注释区字体违例 = 0**（1 条告警为误报：Journey stage5 ZH 行仅含中文标点 `、。`，Noto Sans SC 正确）✓
- **library-origin**：8 帧内 instance remote 116 / local 0 ✓
- **M23.14**：PRD EN 13/lh22=1.69 vs ZH 11/lh14=1.27，差异化保持 ✓
- **视觉亲验**：帧②、帧⑩、UX 卡、Journey 卡、AFTER/states 两个 Section 全景共 6 张截图逐一看过 ✓
- `Conformance report: docs/handoffs/.conformance/rJJjWWs51n2iFOlCIC7aYG-round3.2-2026-07-27.json`（in-file 机检结构化落盘；REST 五闸仍待 token 补跑）

### 新增技术坑（复用）
`deleteCharacters` + `insertCharacters(i, s, 'BEFORE')` 继承**前一个字符**样式；替换目标在**行首**时前一字符是上一行的换行符 → 把上一行（另一语言）的 font/size/lineHeight/**fill** 整套带过来。本轮 Journey 卡 Actions/Touchpoints 因此整行变 Noto 13 cyan。**对策**：行级替换后逐行复检字体，用同节点内未触碰的同类行作基准回灌 `setRangeFontName/FontSize/LineHeight/Fills`，不硬编码。

### Round 3.2 后仍 open
- NDI 真实源名清单（owner）· 4-Tx 绑定总览（待 owner 确认诉求）· LCD 侧 V4-2261 · 浅色主题画布基准 #F5F5F5 待样本佐证。
- **Jira 未就 Round 3.2 补评论**（默认不发；发前贴草稿确认，走 CLAUDE.md JIRA 精简格式）。
- `_backup` Section `7485:1144` 内 Source Name 字样刻意保留（已归档 out-of-scope）。
