beebcca4de
- 生成任务锚点新增「资源总览」档:资源总览页仍贴画布顶边内缩 0.85rem,资源栏目画布页让开顶部钉住的整宽栏目标题栏(42px + 0.5rem),两档切换走 margin-top 过渡(减动效下关掉)。 - 生成浮层的顶边与可用高度改为按占位卡的真实屏幕位置算(卡下沿到安全底边),不再假设卡片贴在安全带上沿——占位落到下半屏时浮层底边不再越过画布下沿被切掉。 - 生成浮层新增水平收口:按「浮层左右各留 12px」把锚点收进画布可视范围,卡片靠边时浮层不再有一半落到画布之外;宽度口径与面板 CSS 同源(min(560px, 100% - 24px))。 - 新增画布卡片手势的共享判据 resourceCanvasGestureExceededDragThreshold(阈值仍取 RESOURCE_CANVAS_DRAG_THRESHOLD):资源卡与生成占位卡共用同一份「拖动还是点击」判断。 - 生成占位卡修掉拖动收尾误触点击:越过阈值才算拖动、登记一次性点击抑制(consumeDragClick)由宿主消费,「拖动中」样式也从越过阈值那一刻起才亮。 - 生成占位卡的删除按钮起手手势不再被当成「点卡片」:按起手点判定,松手落回卡片时不触发开合生成浮层。 - 图标规范面板的参考选择注释按现行判据改写(只有图集 icon-spritesheet 不接受用户参考),入口矩阵文档同步补「参考图(@ 引用)」口径并修掉「本地 IPC 没有参考图入参」的旧说法。 - 补齐回归用例:手势模型判据、占位卡拖动/点击与阈值、宿主级「拖完不弹浮层且普通点击仍开合」、浮层顶边与水平收口、锚点分档与跨文件标题栏高度守卫、逐条生成入口的 @ 与判据一致、图标规范面板的 @ 与提交带引用。 - 共享记忆 pitfalls.md 记录两条排障口径:卡类手势必须只有一份阈值与点击抑制判据;画布浮层几何只能按真实屏幕位置算、分页锚点必须让开钉死的标题栏。
50 lines
1.7 KiB
TypeScript
50 lines
1.7 KiB
TypeScript
import { describe, expect, test } from 'vitest';
|
|
|
|
import { resourceCanvasGestureExceededDragThreshold } from '../src/features/resource-canvas/resourceCanvasCardGestureModel';
|
|
import { RESOURCE_CANVAS_DRAG_THRESHOLD } from '../src/view/project-development/resourceCanvasLayoutModel';
|
|
|
|
describe('画布卡片手势:拖动 / 点击的唯一判据', () => {
|
|
const gesture = (deltaX: number, deltaY: number) =>
|
|
resourceCanvasGestureExceededDragThreshold({
|
|
startClientX: 100,
|
|
startClientY: 100,
|
|
clientX: 100 + deltaX,
|
|
clientY: 100 + deltaY,
|
|
});
|
|
|
|
test('正好到阈值算拖动,差一点点仍算点击(与资源卡同一个阈值)', () => {
|
|
expect(RESOURCE_CANVAS_DRAG_THRESHOLD).toBe(5);
|
|
expect(gesture(RESOURCE_CANVAS_DRAG_THRESHOLD, 0)).toBe(true);
|
|
expect(gesture(RESOURCE_CANVAS_DRAG_THRESHOLD - 0.1, 0)).toBe(false);
|
|
expect(gesture(0, 0)).toBe(false);
|
|
});
|
|
|
|
test('位移按欧氏距离算:斜向 3/4 就是 5', () => {
|
|
expect(gesture(3, 4)).toBe(true);
|
|
expect(gesture(2, 3)).toBe(false);
|
|
});
|
|
|
|
test('阈值可覆盖(各档手势需要更紧或更松时只改参数,不改判据)', () => {
|
|
expect(
|
|
resourceCanvasGestureExceededDragThreshold({
|
|
startClientX: 0,
|
|
startClientY: 0,
|
|
clientX: 1,
|
|
clientY: 0,
|
|
threshold: 1,
|
|
}),
|
|
).toBe(true);
|
|
});
|
|
|
|
test('几何非法时按「没有拖动」算:宁可把拖动当点击,也不能把点击误判成拖动', () => {
|
|
expect(
|
|
resourceCanvasGestureExceededDragThreshold({
|
|
startClientX: Number.NaN,
|
|
startClientY: 100,
|
|
clientX: 200,
|
|
clientY: 100,
|
|
}),
|
|
).toBe(false);
|
|
});
|
|
});
|