@gx-design-vue/pro-layout 0.1.0-alpha.22 → 0.1.0-alpha.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/PageTransition/index.d.ts +1 -1
- package/dist/components/Tabs/hooks/useTabDrag.d.ts +3 -1
- package/dist/components/Tabs/hooks/useTabDrag.js +36 -12
- package/dist/hooks/useLayoutBase.d.ts +8 -8
- package/dist/pro-layout.esm.js +327 -318
- package/dist/pro-layout.js +3 -3
- package/package.json +5 -5
|
@@ -48,8 +48,8 @@ declare const GPageTransition: import("vue").DefineComponent<import("vue").Extra
|
|
|
48
48
|
default: string;
|
|
49
49
|
};
|
|
50
50
|
}>> & Readonly<{}>, {
|
|
51
|
-
reverse: boolean;
|
|
52
51
|
direction: string;
|
|
52
|
+
reverse: boolean;
|
|
53
53
|
name: string;
|
|
54
54
|
disabled: boolean;
|
|
55
55
|
}, SlotsType<GPageTransitionSlots>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
@@ -14,7 +14,9 @@ interface TabDragItemProps {
|
|
|
14
14
|
/**
|
|
15
15
|
* 页签拖拽排序 —— 精简复刻 dnd-kit 的 useDraggable + sortable 实时让位。
|
|
16
16
|
*
|
|
17
|
-
* -
|
|
17
|
+
* - 按住延迟(200ms)区分点击与拖拽:未超时松手视为点击,让原生 click 走切换
|
|
18
|
+
* - 延迟期间位移超过容差(10px)→ 取消拖拽意图(视为滑动/滚动)
|
|
19
|
+
* - 计时器触发后:draggingKey 赋值 → 拖拽样式出现(cursor: grabbing + 阴影)
|
|
18
20
|
* - 拖拽项 `transform: translateX(delta)` 跟随指针
|
|
19
21
|
* - 同组其他 tab 按虚拟插入位置实时 `translate` 让位(CSS translate 属性)
|
|
20
22
|
* - drop 锚点只在 `item.group === dragGroup` 内查找 → 天然不跨级
|
|
@@ -4,8 +4,13 @@ import { nextTick, ref } from "vue";
|
|
|
4
4
|
import { useEventListener } from "@vueuse/core";
|
|
5
5
|
//#region src/components/Tabs/hooks/useTabDrag.ts
|
|
6
6
|
const IGNORE_SELECTOR = "button, a, input, [data-drag-ignore=\"true\"]";
|
|
7
|
-
/**
|
|
8
|
-
|
|
7
|
+
/**
|
|
8
|
+
* 按住延迟(ms),参考 dnd-kit DelayConstraint 默认值。
|
|
9
|
+
* 在此时间内未松手且未发生大位移 → 激活拖拽;否则视为点击或滑动。
|
|
10
|
+
*/
|
|
11
|
+
const DRAG_DELAY = 200;
|
|
12
|
+
/** 延迟期间允许的最大位移(px),超过则取消拖拽意图(视为滑动/滚动) */
|
|
13
|
+
const DRAG_DELAY_TOLERANCE = 10;
|
|
9
14
|
const SCROLL_RESTORE_FRAMES = 2;
|
|
10
15
|
const DISPLACEMENT_DURATION = 160;
|
|
11
16
|
const DISPLACEMENT_EASING = "cubic-bezier(0.2, 0, 0, 1)";
|
|
@@ -15,7 +20,9 @@ function isIgnoredTarget(target) {
|
|
|
15
20
|
/**
|
|
16
21
|
* 页签拖拽排序 —— 精简复刻 dnd-kit 的 useDraggable + sortable 实时让位。
|
|
17
22
|
*
|
|
18
|
-
* -
|
|
23
|
+
* - 按住延迟(200ms)区分点击与拖拽:未超时松手视为点击,让原生 click 走切换
|
|
24
|
+
* - 延迟期间位移超过容差(10px)→ 取消拖拽意图(视为滑动/滚动)
|
|
25
|
+
* - 计时器触发后:draggingKey 赋值 → 拖拽样式出现(cursor: grabbing + 阴影)
|
|
19
26
|
* - 拖拽项 `transform: translateX(delta)` 跟随指针
|
|
20
27
|
* - 同组其他 tab 按虚拟插入位置实时 `translate` 让位(CSS translate 属性)
|
|
21
28
|
* - drop 锚点只在 `item.group === dragGroup` 内查找 → 天然不跨级
|
|
@@ -36,6 +43,8 @@ function useTabDrag(options) {
|
|
|
36
43
|
let groupRects = /* @__PURE__ */ new Map();
|
|
37
44
|
let pendingKey = "";
|
|
38
45
|
let pendingStartX = 0;
|
|
46
|
+
/** 按住延迟计时器(参考 dnd-kit DelayConstraint) */
|
|
47
|
+
let dragDelayTimer;
|
|
39
48
|
const { scroll: scrollOnDragMove, start: startAutoScroll, stop: stopAutoScroll } = useAutoScroll(scrollEl, () => pointerClientX, { onScroll: updateDragPosition });
|
|
40
49
|
function getGroupItems() {
|
|
41
50
|
return items.value.filter((item) => item.group === dragGroup);
|
|
@@ -149,8 +158,8 @@ function useTabDrag(options) {
|
|
|
149
158
|
function beginDrag(clientX) {
|
|
150
159
|
isDragging.value = true;
|
|
151
160
|
dragStartClientX = clientX;
|
|
152
|
-
dragStartScrollLeft = scrollEl.value?.scrollLeft ?? 0;
|
|
153
161
|
pointerClientX = clientX;
|
|
162
|
+
dragStartScrollLeft = scrollEl.value?.scrollLeft ?? 0;
|
|
154
163
|
dragEl = queryTabEl(draggingKey.value);
|
|
155
164
|
recordGroupRects();
|
|
156
165
|
const dragRect = groupRects.get(draggingKey.value);
|
|
@@ -176,16 +185,25 @@ function useTabDrag(options) {
|
|
|
176
185
|
if (isIgnoredTarget(event.target)) return;
|
|
177
186
|
if (enabled && !enabled.value) return;
|
|
178
187
|
event.preventDefault();
|
|
188
|
+
clearPendingDrag();
|
|
179
189
|
pendingKey = item.key;
|
|
180
190
|
pendingStartX = event.clientX;
|
|
181
|
-
draggingKey.value = item.key;
|
|
182
191
|
dragGroup = item.group;
|
|
192
|
+
dragDelayTimer = setTimeout(() => {
|
|
193
|
+
if (!pendingKey) return;
|
|
194
|
+
draggingKey.value = pendingKey;
|
|
195
|
+
pointerClientX = pendingStartX;
|
|
196
|
+
beginDrag(pendingStartX);
|
|
197
|
+
}, DRAG_DELAY);
|
|
183
198
|
}
|
|
184
199
|
function handleMousemove(event) {
|
|
185
200
|
if (!isDragging.value) {
|
|
186
201
|
if (!pendingKey) return;
|
|
187
|
-
if (Math.abs(event.clientX - pendingStartX)
|
|
188
|
-
|
|
202
|
+
if (Math.abs(event.clientX - pendingStartX) > DRAG_DELAY_TOLERANCE) {
|
|
203
|
+
clearPendingDrag();
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
return;
|
|
189
207
|
}
|
|
190
208
|
pointerClientX = event.clientX;
|
|
191
209
|
updateDragPosition();
|
|
@@ -222,16 +240,22 @@ function useTabDrag(options) {
|
|
|
222
240
|
dragEl = null;
|
|
223
241
|
groupRects = /* @__PURE__ */ new Map();
|
|
224
242
|
dragPointerOffsetX = 0;
|
|
243
|
+
dragGroup = void 0;
|
|
244
|
+
clearPendingDrag();
|
|
245
|
+
}
|
|
246
|
+
/** 清理延迟计时器与待定状态 */
|
|
247
|
+
function clearPendingDrag() {
|
|
248
|
+
if (dragDelayTimer != null) {
|
|
249
|
+
clearTimeout(dragDelayTimer);
|
|
250
|
+
dragDelayTimer = void 0;
|
|
251
|
+
}
|
|
225
252
|
pendingKey = "";
|
|
253
|
+
draggingKey.value = "";
|
|
226
254
|
dragGroup = void 0;
|
|
227
255
|
}
|
|
228
256
|
function handleMouseup() {
|
|
229
257
|
if (isDragging.value) endDrag();
|
|
230
|
-
else if (pendingKey)
|
|
231
|
-
pendingKey = "";
|
|
232
|
-
draggingKey.value = "";
|
|
233
|
-
dragGroup = void 0;
|
|
234
|
-
}
|
|
258
|
+
else if (pendingKey) clearPendingDrag();
|
|
235
259
|
}
|
|
236
260
|
const documentTarget = typeof document === "undefined" ? void 0 : document;
|
|
237
261
|
useEventListener(documentTarget, "mousemove", handleMousemove);
|
|
@@ -39,30 +39,30 @@ declare function useLayoutBase(props?: {
|
|
|
39
39
|
openKeys: import("vue").ComputedRef<string[]>;
|
|
40
40
|
proClasses: import("vue").ComputedRef<{
|
|
41
41
|
content?: string;
|
|
42
|
+
header?: string;
|
|
43
|
+
sider?: string;
|
|
44
|
+
breadcrumb?: string;
|
|
45
|
+
logo?: string;
|
|
42
46
|
siderHeader?: string;
|
|
43
47
|
siderFooter?: string;
|
|
44
48
|
footer?: string;
|
|
45
|
-
header?: string;
|
|
46
|
-
breadcrumb?: string;
|
|
47
49
|
root?: string;
|
|
48
|
-
sider?: string;
|
|
49
50
|
siderChildren?: string;
|
|
50
|
-
logo?: string;
|
|
51
51
|
logoImage?: string;
|
|
52
52
|
menu?: string;
|
|
53
53
|
tabs?: string;
|
|
54
54
|
}>;
|
|
55
55
|
proStyles: import("vue").ComputedRef<{
|
|
56
56
|
content?: import("vue").CSSProperties;
|
|
57
|
+
header?: import("vue").CSSProperties;
|
|
58
|
+
sider?: import("vue").CSSProperties;
|
|
59
|
+
breadcrumb?: import("vue").CSSProperties;
|
|
60
|
+
logo?: import("vue").CSSProperties;
|
|
57
61
|
siderHeader?: import("vue").CSSProperties;
|
|
58
62
|
siderFooter?: import("vue").CSSProperties;
|
|
59
63
|
footer?: import("vue").CSSProperties;
|
|
60
|
-
header?: import("vue").CSSProperties;
|
|
61
|
-
breadcrumb?: import("vue").CSSProperties;
|
|
62
64
|
root?: import("vue").CSSProperties;
|
|
63
|
-
sider?: import("vue").CSSProperties;
|
|
64
65
|
siderChildren?: import("vue").CSSProperties;
|
|
65
|
-
logo?: import("vue").CSSProperties;
|
|
66
66
|
logoImage?: import("vue").CSSProperties;
|
|
67
67
|
menu?: import("vue").CSSProperties;
|
|
68
68
|
tabs?: import("vue").CSSProperties;
|