89f45896b7
V04 (方案 §5):PhotoLightbox 模板重构为深色沉浸布局——顶栏(关闭/位置 计数/⋯ 减少动画菜单)+ 舞台(contain 大图 + 边缘 ‹› + 粒子/互动占位层)+ 缩略图条 + 底部操作栏;业务逻辑(序列导航/缩放手势/签名刷新/下载/点赞) 原样保留。 - 新增 viewer/position.ts:§5.2 位置计数真实回退(solo→照片预览;无 total 未到末页→已加载 N 张;全部加载→i/n;不伪造总数) - 新增 ThumbnailStrip:当前 ±3 窗口(≤7 项)、主色 2px 描边、thumb 变体、 滚入可见(遵守减少动画)、点击选择不新增历史 - 新增 PhotoActionBar:Like(coral 心形+计数+连续点赞提示)/Share/ Download 均分大触控;下载关闭整项移除;原图二级菜单(▾ + 长按) - 模态可用性:body 滚动锁、焦点进入/困住/归还触发元素、Esc 先收菜单、 菜单内左右键不抢占、dvh + 安全区、chrome 区手势/滚轮隔离 - 分享 V04 最小实现(复制当前深链,support/clipboard 从 AlbumHeader 提取共用);navigator.share 编排属 Task 5 - zh-CN/en 新词条;vitest 新增 23 例(位置回退/缩略图/操作栏/焦点/滚锁) Co-Authored-By: Claude Code <noreply@anthropic.com>
42 lines
1.6 KiB
TypeScript
42 lines
1.6 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { positionDisplay } from '../viewer/position';
|
|
|
|
// UI-02 §5.2 位置计数形态判定(纯数据层):三种真实回退 + 前瞻 total 形态。
|
|
// 组件侧当前传 total=null(公开端点游标分页无总数);lightbox.spec 覆盖
|
|
// loaded / index / preview 三种模式的端到端渲染。
|
|
describe('viewer position display fallbacks (UI-02 §5.2)', () => {
|
|
it('shows i / total only when the API provides an accurate total', () => {
|
|
expect(positionDisplay({ index: 11, loaded: 24, total: 248, atEnd: false, solo: false })).toEqual({
|
|
kind: 'total',
|
|
current: 12,
|
|
total: 248,
|
|
});
|
|
});
|
|
|
|
it('shows the loaded count while more pages remain and no total exists', () => {
|
|
expect(positionDisplay({ index: 2, loaded: 24, total: null, atEnd: false, solo: false })).toEqual({
|
|
kind: 'loaded',
|
|
count: 24,
|
|
});
|
|
});
|
|
|
|
it('shows i / n of the filtered sequence once all pages are loaded', () => {
|
|
expect(positionDisplay({ index: 4, loaded: 30, total: null, atEnd: true, solo: false })).toEqual({
|
|
kind: 'index',
|
|
current: 5,
|
|
total: 30,
|
|
});
|
|
});
|
|
|
|
it('never fabricates a position for unpositioned or solo deep-link entries', () => {
|
|
// solo:即使有准确 total,也不知道目标在筛选序列中的自然位置。
|
|
expect(positionDisplay({ index: 24, loaded: 25, total: 248, atEnd: true, solo: true })).toEqual({
|
|
kind: 'preview',
|
|
});
|
|
// 下标未知(-1,防御分支)。
|
|
expect(positionDisplay({ index: -1, loaded: 3, total: null, atEnd: true, solo: false })).toEqual({
|
|
kind: 'preview',
|
|
});
|
|
});
|
|
});
|