---
name: daoyou-item-preview
description: 万界道友物品预览的固定展示与接入规范。新增道具、调整预览字段/文案/层级/折叠交互，或重构 ItemSlot、ItemPreview、presentation 适配器时使用；覆盖背包及复用预览的炼器、货架等入口。纯战斗规则、掉落数值或持久化变更不单独触发。
---

# 物品预览规范

本规范固化多轮验收的展示选择。接入与重构默认保持这些选择，不借机重新设计。用户明确提出新要求时以新要求为准，并同步更新对应规范；历史截图、旧实现和验收日志不覆盖最新要求。

## 使用方式

1. 先读本文件，再按受影响类型读取 [分类基线](references/type-baselines.md)。公共组件变更需核对全部类型。
2. 核对当前共享物品定义、事实 schema 和适配器，列明本次变化的名称、头部顺序、正文、描述、交互。未要求变化的部分沿用基线。
3. 在拥有该职责的层修改，以文末清单验收。新增类型复用结构和语义；没有事实来源的字段不生成，不自行添加装饰或解释。

## 固定信息结构

顺序：**图标＋完整名称＋有意义的头部字段 → 分组数据／效果 → 独立描述 → 业务操作**。调用方的必要情境提示可位于头部之后。

- 借鉴梦幻西游的信息层次，保留本项目纸墨视觉。不要复制棕金皮肤，不给不同类型另造卡片、尺寸或主题。
- 头部由每类显式列出顺序。类型、要求、数量都不是必填；不先默认生成再逐类删除。每条信息必须有新增意义。
- 正文只保留有用的数据、效果与真实限制。空字段、空分组不占位；不补“暂无”“进入背包后判断”等兜底解释。
- 普通信息采用“分组标题 → 内容”。传承技能／功法已作为物品名时，不再添加同名标题形成第三层缩进。
- 命名能力可使用单层展开项；展开内容仅普通行。可折叠分组也仅包含普通行，不扩成任意递归详情树。
- 描述独立放在最后的信息栏。精简重复字段不等于截短描述；尤其图纸保留完整描述。没有描述事实的装备不编造背景文案。
- 不默认展示“无丹毒”“不占服用额度”等不存在的副作用或限制；这不是删除真实代价、真实使用限制的理由。

## 文案与视觉

- 数值用阿拉伯数字与符号：`1%`、`5%`、`1张`；不用“1个百分点”“五个百分点”等混合表达。只改表达，不改变加法／乘法、单位或计算结果。
- 要求用最短准确条件，如 `炼气初期`、`不高于金丹`、`金丹及以上`。不附“可御使”“当前境界可以服用”等赘语。
- 名称改动归共享物品定义，保证格子、预览、目录等一致，不只在浮层裁掉后缀。
- 沿用 `ItemPreviewView`：名称 `text-base leading-6 font-semibold`（16px），正文 `text-sm leading-6`（14px/24px）；名称按既定分级着色，分组标题琥珀色，收益青色，代价／限制朱色，描述次级墨色。
- 数值数据用 Tailwind 默认 `font-mono`，正文仍用正文字体；不要改全局等宽字体或新增数字字体 token。见 [数字排版规范](../../../docs/numeric-typography.md)。
- 颜色表达语义，缩进表达所属关系，不因内容少就加边框、标签、摘要或重复标题填满空间。
- 传承灵印的技能简述用次级墨色，默认收起的具体效果用正文色；展开入口用青色，让意象描述与数值规则一眼可分。
- 物品格与预览头部直接使用 `GameIcon purpose="artwork"`，图标契约仅接受字符串（emoji 或 `icon:名称`），不传入 React 元素。归元灵露统一使用 💧；emoji 与注册图片都遵循本地图片显示强度，名称、数量、角标和空格提示保持清晰。透明度交给共享组件，不在适配器或页面内计算。

## 组件职责：数据决定内容，视图只渲染

以下路径均相对 `apps/web/src/components/feature/items/`：

| 层 | 固定职责 |
| --- | --- |
| 共享物品定义／事实 | 正式名称、属性和规则的来源；不得为预览另造一份业务事实 |
| `presentation/types.ts` | 结构化契约：头部 field/quantity/status，正文 line/disclosure、分组与描述 |
| `presentation/{basic,equipment,consumable}.ts` | 读取本类事实，返回轻量 summary 和延迟执行的 preview(options)；自行决定完整有序的字段、分组、数量与状态 |
| `presentation/registry.ts` | 用 `satisfies Record<ItemDefinition['kind'], ItemAdapter>` 静态检查类型覆盖 |
| `itemPresentation.ts` | 格子、聊天和货架等轻量摘要入口；不提前构建效果正文 |
| `itemPreviewModel.ts` | 解析适配器，组装标题、图标、颜色和内容；不判断道具种类 |
| `ItemPreview.tsx` | 接入既有参数，传递查看上下文、数量标签和调用方操作 |
| `ItemPreviewView.tsx` | 仅渲染模型与统一样式／展开交互；不查定义、计算规则、判断 kind 或具体物品 ID |
| `ItemSlot.tsx`／业务调用方 | 浮层定位、开关、模态壳、情境提示和操作；API 写入与玩法选择不进纯预览 |

新增同类道具通常只改共享定义；新增 kind 才补适配器与注册。类型差异在适配器集中表达，同一 kind 的消耗品子类型在消耗品适配器处理。不要把这些差异搬到公共渲染层，也不要引入运行时插件系统或每物品一套 JSX。

消耗品分组用 `role`（effect/preview/restriction/source）和 `collapsible` 表达语义。符箓使用 `talismanDetailRows` 结构化行，确认文本由相同行格式化。禁止根据 key 子串、标题相等、切割中文冒号等方式反推语义；已删的无效字段应停止生成，不靠视图过滤掩盖。

## 交互边界

- PC 悬停延迟 350ms，移出后取消待打开的预览，允许移入浮层操作；默认触屏点击、键盘聚焦使用同一预览。备料等启用 `quickOnTouch` 的入口由触屏轻点执行快捷操作、长按 500ms 查看预览；移动手指时取消长按，长按后的点击不得重复执行操作。沿用原生 `popover=auto`、单个打开、Esc 关闭、视口避让和长内容内部滚动，不改成详情抽屉。
- 仅打开的预览挂载正文和业务操作。展开器蕴／器诀不能关闭浮层；处理 popover 的 toggle 时保持 `event.target === event.currentTarget` 边界，避免接收子级 details 事件。
- 物品栏不提供“移动”“合并”及对应目标选择、取消移动状态。拖拽移动是后续需求，不提前实现。
- 装备／卸下、转存、拆分、整理等现有适用操作仍由业务入口负责。转存不是已删除的格位移动。
- 物品栏预览不展示装备比较或差值箭头；替换、存入、取出等操作使用短文案。堆叠丹药的服用数量与操作排在同一紧凑区域，支持直接输入、逐颗增减和设为本次最多数量。
- 复杂参悟、灵兽技能选择等留在对应玩法页，不塞进预览。真实消耗和写入逻辑不由展示模型决定。

## 验收与防回退

- 对照分类基线逐项核对名称、头部顺序、数量、默认折叠、直接消耗、描述。不得恢复双加合计、归元后消耗、重复类型、三层传承标题或移动／合并。
- 检查公共模型组装与渲染是否新增 kind/ID 特判；摘要入口是否开始调用详细预览；正文是否出现任意 JSX 或从文案反解析数据。
- 改公共展示时覆盖装备、图纸、传承灵印、归元灵露、功法玉简、丹药、灵果，以及材料、灵种、符箓；同一物品在背包和受影响的其他入口命名、内容一致。
- UI 改动运行 `pnpm run lint`、`pnpm run build`，按 [测试规范](../../../docs/testing.md) 做本地浏览器检查：桌面／360px、长名称、长描述、空分组、键盘、触屏点击、Esc、展开后浮层仍在；涉及批量服用时检查数量上下限与快捷操作。不得用“编译通过”代替交互验收。
- 不在前端／服务端添加单元测试。改动纯共享领域逻辑时遵循领域 skill 和仓库测试规则；只改本规范时验证 skill、链接和 diff 即可。报告已执行与未执行的检查。

## 关联规范

- 场景布局同时遵循 [daoyou-game-ui](../daoyou-game-ui/SKILL.md)；预览本身是查看数据的决策层，不套用场景首屏的隐藏数值原则来删效果。
- 修改共享物品事实或规则时同时使用 [daoyou-game-core-domain](../daoyou-game-core-domain/SKILL.md)。
- [展示实现与历史记录](../../../docs/item-presentation-ui.md) 用于查代码脉络；历史记录中已被本规范替代的文案、操作和字体方案不可恢复。
