# 搜索/历史/结果 · 设计说明（search.vue）

> 单元：`search` ｜ group=account ｜ P 依据：P01-E「搜索→搜索页（历史词+热搜榜后台可配）」+ P02 顶栏搜索
> 实现：`vue/src/pages/search.vue` ｜ 组状态帧 fixtures：`design/fixtures/account.states.json`

## 1. 区块与密度对照

| 区块 | 实现落点 | 密度 | 达成 |
|---|---|---|---|
| ① 搜索框 | 返回+输入框（自动聚焦语义：input 帧描边高亮；确认键「搜索」=回车/「搜索」按钮；30 字上限+计数 n/30） | — | ✓ |
| ② 历史词 | searchHistory chips+清空（trash→Sheet 二次确认「将清空全部历史搜索词，确定清空？」，dims B，已实装） | — | ✓ |
| ③ 热搜榜 TOP10 | searchHots 10 条编号列表（前三名价深红+槌图标双通道；「后台可配」角注） | **热榜 10** | ✓ |
| ④ 结果流三域 | dtab chips：拍品/圈子/信息（各带命中数）；拍品域=ItemCard 双列；圈子域=圈卡行（含命中帖说明）；信息域=域内空态 | **域 3** | ✓ |
| ⑤ 无结果兜底 | EmptyState「换个关键词试试」+热搜推荐 chips（empty 帧/信息域 0 命中） | — | ✓ |

## 2. 状态帧

| 帧 | 渲染 |
|---|---|
| normal | 历史词+热搜榜 TOP10 |
| input | 输入「白鹭」+联想示意（联想词由拍品标题派生，不新造业务词） |
| result | 演示词「白鹭」：拍品域 2 条（items 1001/1006 与详情/圈子同源）·圈子域 1 条（GK手办圈·含白鹭开箱帖）·信息域 0（域内兜底） |
| empty | 无结果+热搜推荐 |
| loading | SkeletonList |
| error | ErrorRetry |
| extreme | 30 字顶格压测词（实测 30 字，30/30 计数由真实长度驱动）+压测卡（299999.99/9999，页内本地卡片渲染）置结果首位 |
| guest | N/A（na_reason：浏览免登录） |

## 3. 九维 A–I

- **A**：搜索前置页（normal/input）+结果页（result/empty）两形态。
- **B**：历史清空二次确认；热榜/联想词点击即搜。
- **C**：确认键「搜索」；30 字上限+计数显隐（输入中显示）。
- **D**：命中数 tabular；长词省略。
- **E**：结果卡导航按域（ItemCard→item；圈卡→circle-detail）；域切换保持查询词。
- **F**：按 §0.5。
- **G**：结果分页 10/页语义（「没有更多了」尾标）。
- **H**：域 chip 选中=实底+加重双通道；热榜前三=色+图标双通道。
- **I**：`GET /search?q&domain&page`（占位；本原型结果由 mock 过滤演示）。

## 4. 决策点

| 决策触点 | 对应 |
|---|---|
| 快速直达目标拍品/圈子/信息 | 三域 chip+命中数直给；拍品域复用 ItemCard（8 信息点） |

## 5. 占位与缺口

- result 帧演示词固定「白鹭」（登记 fixtures）；联想词/圈子域命中为演示映射（正式为接口召回）。
- extreme 压测词（实测 30 字）与压测卡样值登记 fixtures（同 home 压测口径）；压测卡为页内本地渲染（出价数独立成行），共享 ItemCard 折行根因提案底座。

## 7. 视觉验收修复轮（2026-10-10）

| 验收问题 | 处置 | 落点 |
|---|---|---|
| [硬·流程断点] 历史清空二次确认 Sheet 未实现（置标志无渲染=死动作） | 已修：`<Sheet title="清空搜索历史">` 实装，取消/确认清空双按钮 | search.vue 模板尾部 |
| [视觉] extreme 压测卡「9999次出价」折行三行（共享 ItemCard `.bids` 无 nowrap） | 已修：压测卡改**页内本地卡片**（出价数+倒计时独立成行，nowrap）；共享 ItemCard 不动，根因提案底座 | search.vue `.xcard/.xmeta` |
| [数据] input 帧计数 0/30 与输入「白鹭」不符 | 已修：计数器按展示词实际长度计算（`shownQ`），input 帧=2/30 | search.vue `shownQ/cnt` |
| [数据] extreme 帧「拍品 2」chip 与 3 张卡不符 | 已修：域计数含压测卡（2+1=3） | search.vue `domainCounts` |
| [数据真值] EXTREME_Q 实测 28 字 ≠ 声称 30 字 | 已修：压测词补足为实测 30 字（`三十字整样本`），计数 30/30 由真实长度驱动 | search.vue `EXTREME_Q` |
| [轻微] loading/error 帧查询词消失回落占位 | 已修：shownQ 在 loading/error 帧保留「白鹭」（§0.4 缓存保留语义） | search.vue `shownQ` |
| [轻微·文档] 本文档压测卡「999+」与实现 9999 不一致 | 已修：本节更正为 9999 | design/search.md §2 |

## 8. 2026-10-10 五页剩余问题修复记录

| 问题 | 处置 | 落点 |
|---|---|---|
| [视觉] extreme 压测卡「压测卡位」顶左渲染、「压」字被裁且被成色胶囊遮挡 | 已修：`.xcov` 去掉 `display:block`（其覆盖 base `.ph` 的 flex 居中），交回 .ph 居中；强检断言标签中心偏差<4px=0 | search.vue `.xcov` |
| [视觉] extreme 压测卡标题第二行切半、无省略号（内容盒 26px 容不下两行 34px） | 已修：`.xttl` height 34→42（8px 上边距+2×17px 行高）；强检判法=可见前两行行盒完整落在元素盒内（line-clamp 容器 scrollHeight 恒大于 clientHeight，高度差判法不可用） | search.vue `.xttl` |
| [数据] 压测卡「9999次出价」直出原始计数 | 已修：走 fmtCount →「999+次出价」（§0.4 统一口径）；强检断言页面含 999+、不含 9999 | search.vue |
| [补帧] 圈子域/信息域/清空确认 Sheet 此前零截图 | 已登记补拍：页内直开参数 `?state=result&domain=circle\|info`、`?sheet=clear` → supplement-domain-circle.png / supplement-domain-info.png / supplement-sheet-clear.png，登记 evidence.json | search.vue + scripts/render.py `SUPPLEMENTS` |
| [伴生观察·未动] 只读帧搜索框显示「2/30」与 §3-C「输入中显示」口径略偏 | 视觉无害不阻断，本轮不改，留口径裁量 | — |
