@floegence/floe-webapp-core 0.36.8 → 0.36.10
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/deck/DeckCell.d.ts +3 -6
- package/dist/components/deck/DeckCell.js +35 -44
- package/dist/components/deck/DeckGrid.d.ts +2 -16
- package/dist/components/deck/DeckGrid.js +122 -122
- package/dist/components/deck/DropZonePreview.js +15 -15
- package/dist/components/deck/WidgetResizeHandle.d.ts +3 -1
- package/dist/components/deck/WidgetResizeHandle.js +46 -80
- package/dist/components/deck/deckGridMetrics.d.ts +41 -0
- package/dist/components/deck/deckGridMetrics.js +52 -0
- package/dist/components/deck/deckPointerSession.d.ts +52 -0
- package/dist/components/deck/deckPointerSession.js +113 -0
- package/dist/context/DeckContext.d.ts +13 -8
- package/dist/context/DeckContext.js +250 -242
- package/dist/deck.js +22 -21
- package/dist/floe.css +2 -0
- package/dist/full.js +384 -382
- package/dist/hooks/useDeckDrag.d.ts +4 -3
- package/dist/hooks/useDeckDrag.js +42 -72
- package/dist/index.js +54 -53
- package/dist/styles.css +1 -1
- package/dist/utils/gridCollision.d.ts +1 -0
- package/dist/utils/gridCollision.js +21 -17
- package/package.json +1 -1
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import { effect as
|
|
2
|
-
import { createSignal as
|
|
3
|
-
import { cn as
|
|
4
|
-
import { useDeck as
|
|
5
|
-
import { applyResizeDelta as
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const ne = {
|
|
1
|
+
import { effect as m, className as h, setAttribute as p, template as b, use as v, delegateEvents as E } from "solid-js/web";
|
|
2
|
+
import { createSignal as R, onCleanup as S } from "solid-js";
|
|
3
|
+
import { cn as D } from "../../utils/cn.js";
|
|
4
|
+
import { useDeck as y } from "../../context/DeckContext.js";
|
|
5
|
+
import { applyResizeDelta as k } from "../../utils/gridLayout.js";
|
|
6
|
+
import { startDeckPointerSession as C } from "./deckPointerSession.js";
|
|
7
|
+
var M = /* @__PURE__ */ b("<div style=touch-action:none>");
|
|
8
|
+
const P = {
|
|
10
9
|
n: "top-0 left-2 right-2 h-2 cursor-ns-resize",
|
|
11
10
|
s: "bottom-0 left-2 right-2 h-2 cursor-ns-resize",
|
|
12
11
|
e: "right-0 top-2 bottom-2 w-2 cursor-ew-resize",
|
|
@@ -15,7 +14,7 @@ const ne = {
|
|
|
15
14
|
nw: "top-0 left-0 w-4 h-4 cursor-nwse-resize",
|
|
16
15
|
se: "bottom-0 right-0 w-4 h-4 cursor-nwse-resize",
|
|
17
16
|
sw: "bottom-0 left-0 w-4 h-4 cursor-nesw-resize"
|
|
18
|
-
},
|
|
17
|
+
}, A = {
|
|
19
18
|
n: "ns-resize",
|
|
20
19
|
s: "ns-resize",
|
|
21
20
|
e: "ew-resize",
|
|
@@ -25,85 +24,52 @@ const ne = {
|
|
|
25
24
|
se: "nwse-resize",
|
|
26
25
|
sw: "nesw-resize"
|
|
27
26
|
};
|
|
28
|
-
function
|
|
29
|
-
const
|
|
30
|
-
let
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
w?.(), w = ee({
|
|
37
|
-
kind: "resize",
|
|
38
|
-
cursor: re[i.edge],
|
|
39
|
-
lockUserSelect: !0
|
|
40
|
-
});
|
|
41
|
-
}, E = () => {
|
|
42
|
-
m() && (l !== null && typeof cancelAnimationFrame < "u" && (cancelAnimationFrame(l), l = null), C(!1), h = null, r = null, A = null, I(!1), f.endResize(!0));
|
|
43
|
-
}, H = () => {
|
|
44
|
-
if (!r) return;
|
|
45
|
-
const e = A ?? r.getBoundingClientRect(), t = 48, n = 24, o = s - e.top, a = e.bottom - s;
|
|
46
|
-
let c = 0;
|
|
47
|
-
if (o < t ? c = -Math.ceil((t - o) / t * n) : a < t && (c = Math.ceil((t - a) / t * n)), c === 0) return;
|
|
48
|
-
const z = r.scrollTop, v = Math.max(0, Math.min(z + c, r.scrollHeight - r.clientHeight));
|
|
49
|
-
v !== z && (r.scrollTop = v);
|
|
50
|
-
}, Y = () => {
|
|
51
|
-
if (l !== null || typeof requestAnimationFrame > "u") return;
|
|
52
|
-
const e = () => {
|
|
53
|
-
if (!m()) {
|
|
54
|
-
l = null;
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
D(), l = requestAnimationFrame(e);
|
|
58
|
-
};
|
|
59
|
-
l = requestAnimationFrame(e);
|
|
60
|
-
}, $ = (e) => {
|
|
27
|
+
function G(t) {
|
|
28
|
+
const s = y(), [u, d] = R(!1);
|
|
29
|
+
let c, o = null;
|
|
30
|
+
const a = (e) => {
|
|
31
|
+
o?.stop({
|
|
32
|
+
commit: e
|
|
33
|
+
}), o = null;
|
|
34
|
+
}, g = (e) => {
|
|
61
35
|
if (e.pointerType === "mouse" && e.button !== 0) return;
|
|
62
36
|
e.preventDefault(), e.stopPropagation();
|
|
63
|
-
const
|
|
64
|
-
if (!
|
|
65
|
-
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
const W = a + c, X = Math.round(t / T), q = Math.round(n / W), k = f.getWidgetMinConstraints(i.widget.type), x = V(i.widget.position, i.edge, X, q, k.minColSpan, k.minRowSpan, o);
|
|
83
|
-
f.updateResize(x);
|
|
84
|
-
}, M = (e) => {
|
|
85
|
-
if (h === e.pointerId) {
|
|
86
|
-
try {
|
|
87
|
-
g?.releasePointerCapture(e.pointerId);
|
|
88
|
-
} catch {
|
|
37
|
+
const n = e.currentTarget?.closest(".deck-grid");
|
|
38
|
+
if (!n) return;
|
|
39
|
+
a(!1), s.startResize(t.widget.id, t.edge, e.clientX, e.clientY);
|
|
40
|
+
const r = s.resizeState();
|
|
41
|
+
!r || r.widgetId !== t.widget.id || r.edge !== t.edge || (d(!0), o = C({
|
|
42
|
+
kind: "resize",
|
|
43
|
+
widgetId: t.widget.id,
|
|
44
|
+
gridEl: n,
|
|
45
|
+
captureEl: c,
|
|
46
|
+
pointerEvent: e,
|
|
47
|
+
cursor: A[t.edge],
|
|
48
|
+
onMove: (i) => {
|
|
49
|
+
const l = Math.round(i.deltaX / i.cellWidth), z = Math.round(i.deltaY / i.cellHeight), w = s.getWidgetMinConstraints(t.widget.type), f = k(t.widget.position, t.edge, l, z, w.minColSpan, w.minRowSpan, i.cols);
|
|
50
|
+
s.updateResize(f);
|
|
51
|
+
},
|
|
52
|
+
onEnd: ({
|
|
53
|
+
commit: i
|
|
54
|
+
}) => {
|
|
55
|
+
o = null, d(!1), s.endResize(i);
|
|
89
56
|
}
|
|
90
|
-
|
|
91
|
-
}
|
|
57
|
+
}));
|
|
92
58
|
};
|
|
93
|
-
return
|
|
94
|
-
var e =
|
|
95
|
-
e
|
|
96
|
-
var
|
|
97
|
-
return typeof
|
|
98
|
-
var
|
|
99
|
-
return
|
|
59
|
+
return S(() => a(!1)), (() => {
|
|
60
|
+
var e = M();
|
|
61
|
+
e.$$pointerdown = g;
|
|
62
|
+
var n = c;
|
|
63
|
+
return typeof n == "function" ? v(n, e) : c = e, m((r) => {
|
|
64
|
+
var i = D("absolute z-30", P[t.edge], "hover:bg-primary/30 transition-colors", u() && "bg-primary/50"), l = t.edge;
|
|
65
|
+
return i !== r.e && h(e, r.e = i), l !== r.t && p(e, "data-widget-resize-handle", r.t = l), r;
|
|
100
66
|
}, {
|
|
101
67
|
e: void 0,
|
|
102
68
|
t: void 0
|
|
103
69
|
}), e;
|
|
104
70
|
})();
|
|
105
71
|
}
|
|
106
|
-
|
|
72
|
+
E(["pointerdown"]);
|
|
107
73
|
export {
|
|
108
|
-
|
|
74
|
+
G as WidgetResizeHandle
|
|
109
75
|
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { GridPosition } from '../../utils/gridCollision';
|
|
2
|
+
export declare const DECK_GRID_COLS = 24;
|
|
3
|
+
export declare const DECK_DEFAULT_ROWS = 24;
|
|
4
|
+
export declare const DECK_GAP = 4;
|
|
5
|
+
export declare const DECK_MIN_ROW_HEIGHT = 20;
|
|
6
|
+
export declare const DECK_PADDING = 4;
|
|
7
|
+
export interface DeckGridConfig {
|
|
8
|
+
cols: number;
|
|
9
|
+
rowHeight: number;
|
|
10
|
+
gap: number;
|
|
11
|
+
defaultRows: number;
|
|
12
|
+
}
|
|
13
|
+
export interface DeckGridMeasurements extends DeckGridConfig {
|
|
14
|
+
cellWidth: number;
|
|
15
|
+
cellHeight: number;
|
|
16
|
+
}
|
|
17
|
+
export interface DeckGridSurfaceMeasurements extends DeckGridMeasurements {
|
|
18
|
+
paddingLeft: number;
|
|
19
|
+
paddingRight: number;
|
|
20
|
+
paddingTop: number;
|
|
21
|
+
paddingBottom: number;
|
|
22
|
+
}
|
|
23
|
+
export interface DeckGridPixelRect {
|
|
24
|
+
left: number;
|
|
25
|
+
top: number;
|
|
26
|
+
width: number;
|
|
27
|
+
height: number;
|
|
28
|
+
}
|
|
29
|
+
export declare const DECK_GRID_CONFIG: {
|
|
30
|
+
readonly cols: 24;
|
|
31
|
+
readonly defaultRows: 24;
|
|
32
|
+
readonly gap: 4;
|
|
33
|
+
readonly rowHeight: 20;
|
|
34
|
+
};
|
|
35
|
+
export declare function getGridConfigFromElement(gridEl: HTMLElement): DeckGridConfig;
|
|
36
|
+
export declare function measureDeckGrid(gridEl: HTMLElement, options?: {
|
|
37
|
+
paddingLeft?: number;
|
|
38
|
+
paddingRight?: number;
|
|
39
|
+
}): DeckGridMeasurements | null;
|
|
40
|
+
export declare function measureDeckGridSurface(gridEl: HTMLElement): DeckGridSurfaceMeasurements | null;
|
|
41
|
+
export declare function positionToDeckPixelRect(position: GridPosition, measurements: DeckGridSurfaceMeasurements): DeckGridPixelRect;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const l = 24, r = 24, D = 4, _ = 20, h = 4, s = {
|
|
2
|
+
cols: 24,
|
|
3
|
+
defaultRows: 24,
|
|
4
|
+
gap: 4,
|
|
5
|
+
rowHeight: 20
|
|
6
|
+
};
|
|
7
|
+
function g(t) {
|
|
8
|
+
return {
|
|
9
|
+
cols: parseInt(t.dataset.gridCols || String(24), 10),
|
|
10
|
+
rowHeight: parseFloat(t.dataset.rowHeight || String(20)),
|
|
11
|
+
gap: parseInt(t.dataset.gap || String(4), 10),
|
|
12
|
+
defaultRows: parseInt(t.dataset.defaultRows || String(24), 10)
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function p(t, n) {
|
|
16
|
+
const o = g(t), a = n?.paddingLeft ?? 0, d = n?.paddingRight ?? 0, c = t.clientWidth - a - d, e = o.gap * (o.cols - 1), i = (c - e) / o.cols;
|
|
17
|
+
return !Number.isFinite(i) || i <= 0 ? null : {
|
|
18
|
+
...o,
|
|
19
|
+
cellWidth: i,
|
|
20
|
+
cellHeight: o.rowHeight + o.gap
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function C(t) {
|
|
24
|
+
const n = t.ownerDocument.defaultView?.getComputedStyle(t) ?? getComputedStyle(t), o = parseFloat(n.paddingLeft) || 0, a = parseFloat(n.paddingRight) || 0, d = parseFloat(n.paddingTop) || 0, c = parseFloat(n.paddingBottom) || 0, e = p(t, { paddingLeft: o, paddingRight: a });
|
|
25
|
+
return e ? {
|
|
26
|
+
...e,
|
|
27
|
+
paddingLeft: o,
|
|
28
|
+
paddingRight: a,
|
|
29
|
+
paddingTop: d,
|
|
30
|
+
paddingBottom: c
|
|
31
|
+
} : null;
|
|
32
|
+
}
|
|
33
|
+
function f(t, n) {
|
|
34
|
+
return {
|
|
35
|
+
left: n.paddingLeft + t.col * (n.cellWidth + n.gap),
|
|
36
|
+
top: n.paddingTop + t.row * (n.rowHeight + n.gap),
|
|
37
|
+
width: t.colSpan * n.cellWidth + Math.max(0, t.colSpan - 1) * n.gap,
|
|
38
|
+
height: t.rowSpan * n.rowHeight + Math.max(0, t.rowSpan - 1) * n.gap
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
r as DECK_DEFAULT_ROWS,
|
|
43
|
+
D as DECK_GAP,
|
|
44
|
+
l as DECK_GRID_COLS,
|
|
45
|
+
s as DECK_GRID_CONFIG,
|
|
46
|
+
_ as DECK_MIN_ROW_HEIGHT,
|
|
47
|
+
h as DECK_PADDING,
|
|
48
|
+
g as getGridConfigFromElement,
|
|
49
|
+
p as measureDeckGrid,
|
|
50
|
+
C as measureDeckGridSurface,
|
|
51
|
+
f as positionToDeckPixelRect
|
|
52
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type HotInteractionKind } from '../../utils/hotInteraction';
|
|
2
|
+
export interface DeckPointerSessionSnapshot {
|
|
3
|
+
pointerId: number;
|
|
4
|
+
kind: HotInteractionKind;
|
|
5
|
+
widgetId: string;
|
|
6
|
+
gridEl: HTMLElement;
|
|
7
|
+
gridRect: DOMRect;
|
|
8
|
+
gridPaddingLeft: number;
|
|
9
|
+
gridPaddingRight: number;
|
|
10
|
+
startClientX: number;
|
|
11
|
+
startClientY: number;
|
|
12
|
+
startScrollTop: number;
|
|
13
|
+
lastClientX: number;
|
|
14
|
+
lastClientY: number;
|
|
15
|
+
lastAppliedClientX: number;
|
|
16
|
+
lastAppliedClientY: number;
|
|
17
|
+
lastAppliedScrollTop: number;
|
|
18
|
+
rafId: number | null;
|
|
19
|
+
stopHotInteraction: (() => void) | null;
|
|
20
|
+
}
|
|
21
|
+
export interface DeckPointerSessionFrame {
|
|
22
|
+
snapshot: DeckPointerSessionSnapshot;
|
|
23
|
+
deltaX: number;
|
|
24
|
+
deltaY: number;
|
|
25
|
+
cols: number;
|
|
26
|
+
rowHeight: number;
|
|
27
|
+
gap: number;
|
|
28
|
+
cellWidth: number;
|
|
29
|
+
cellHeight: number;
|
|
30
|
+
}
|
|
31
|
+
export interface StartDeckPointerSessionOptions {
|
|
32
|
+
kind: HotInteractionKind;
|
|
33
|
+
widgetId: string;
|
|
34
|
+
gridEl: HTMLElement;
|
|
35
|
+
captureEl?: HTMLElement | null;
|
|
36
|
+
pointerEvent: PointerEvent;
|
|
37
|
+
cursor: string;
|
|
38
|
+
onMove: (frame: DeckPointerSessionFrame) => void;
|
|
39
|
+
onEnd: (options: {
|
|
40
|
+
commit: boolean;
|
|
41
|
+
snapshot: DeckPointerSessionSnapshot;
|
|
42
|
+
}) => void;
|
|
43
|
+
}
|
|
44
|
+
export interface DeckPointerSessionController {
|
|
45
|
+
snapshot: () => DeckPointerSessionSnapshot;
|
|
46
|
+
updatePointer: (event: Pick<PointerEvent, 'pointerId' | 'clientX' | 'clientY'>) => void;
|
|
47
|
+
stop: (options?: {
|
|
48
|
+
commit?: boolean;
|
|
49
|
+
event?: Pick<PointerEvent, 'pointerId' | 'clientX' | 'clientY'>;
|
|
50
|
+
}) => void;
|
|
51
|
+
}
|
|
52
|
+
export declare function startDeckPointerSession(options: StartDeckPointerSessionOptions): DeckPointerSessionController;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { startHotInteraction as X } from "../../utils/hotInteraction.js";
|
|
2
|
+
import { measureDeckGrid as h } from "./deckGridMetrics.js";
|
|
3
|
+
function C(e) {
|
|
4
|
+
const d = e.lastClientY - e.gridRect.top, t = e.gridRect.bottom - e.lastClientY;
|
|
5
|
+
let n = 0;
|
|
6
|
+
if (d < 48 ? n = -Math.ceil((48 - d) / 48 * 24) : t < 48 && (n = Math.ceil((48 - t) / 48 * 24)), n === 0) return !1;
|
|
7
|
+
const a = e.gridEl.scrollTop, o = Math.max(0, Math.min(a + n, e.gridEl.scrollHeight - e.gridEl.clientHeight));
|
|
8
|
+
return o === a ? !1 : (e.gridEl.scrollTop = o, !0);
|
|
9
|
+
}
|
|
10
|
+
function v(e) {
|
|
11
|
+
const i = e.gridEl.scrollTop;
|
|
12
|
+
if (e.lastClientX === e.lastAppliedClientX && e.lastClientY === e.lastAppliedClientY && i === e.lastAppliedScrollTop)
|
|
13
|
+
return null;
|
|
14
|
+
e.lastAppliedClientX = e.lastClientX, e.lastAppliedClientY = e.lastClientY, e.lastAppliedScrollTop = i;
|
|
15
|
+
const l = h(e.gridEl, {
|
|
16
|
+
paddingLeft: e.gridPaddingLeft,
|
|
17
|
+
paddingRight: e.gridPaddingRight
|
|
18
|
+
});
|
|
19
|
+
return l ? {
|
|
20
|
+
snapshot: e,
|
|
21
|
+
deltaX: e.lastClientX - e.startClientX,
|
|
22
|
+
deltaY: e.lastClientY - e.startClientY + (i - e.startScrollTop),
|
|
23
|
+
cols: l.cols,
|
|
24
|
+
rowHeight: l.rowHeight,
|
|
25
|
+
gap: l.gap,
|
|
26
|
+
cellWidth: l.cellWidth,
|
|
27
|
+
cellHeight: l.cellHeight
|
|
28
|
+
} : null;
|
|
29
|
+
}
|
|
30
|
+
function L(e) {
|
|
31
|
+
const i = e.gridEl.ownerDocument, l = i.defaultView ?? window, d = l.getComputedStyle(e.gridEl), t = {
|
|
32
|
+
pointerId: e.pointerEvent.pointerId,
|
|
33
|
+
kind: e.kind,
|
|
34
|
+
widgetId: e.widgetId,
|
|
35
|
+
gridEl: e.gridEl,
|
|
36
|
+
gridRect: e.gridEl.getBoundingClientRect(),
|
|
37
|
+
gridPaddingLeft: parseFloat(d.paddingLeft) || 0,
|
|
38
|
+
gridPaddingRight: parseFloat(d.paddingRight) || 0,
|
|
39
|
+
startClientX: e.pointerEvent.clientX,
|
|
40
|
+
startClientY: e.pointerEvent.clientY,
|
|
41
|
+
startScrollTop: e.gridEl.scrollTop,
|
|
42
|
+
lastClientX: e.pointerEvent.clientX,
|
|
43
|
+
lastClientY: e.pointerEvent.clientY,
|
|
44
|
+
lastAppliedClientX: e.pointerEvent.clientX,
|
|
45
|
+
lastAppliedClientY: e.pointerEvent.clientY,
|
|
46
|
+
lastAppliedScrollTop: e.gridEl.scrollTop,
|
|
47
|
+
rafId: null,
|
|
48
|
+
stopHotInteraction: X({
|
|
49
|
+
kind: e.kind,
|
|
50
|
+
cursor: e.cursor,
|
|
51
|
+
lockUserSelect: !0
|
|
52
|
+
})
|
|
53
|
+
};
|
|
54
|
+
let n = !0;
|
|
55
|
+
const a = () => {
|
|
56
|
+
if (t.rafId = null, !n) return;
|
|
57
|
+
const r = C(t), c = v(t);
|
|
58
|
+
c && e.onMove(c), n && r && o();
|
|
59
|
+
}, o = () => {
|
|
60
|
+
if (!(!n || t.rafId !== null)) {
|
|
61
|
+
if (typeof l.requestAnimationFrame != "function") {
|
|
62
|
+
a();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
t.rafId = l.requestAnimationFrame(a);
|
|
66
|
+
}
|
|
67
|
+
}, I = () => {
|
|
68
|
+
if (!(!e.captureEl || typeof e.captureEl.releasePointerCapture != "function"))
|
|
69
|
+
try {
|
|
70
|
+
e.captureEl.releasePointerCapture(t.pointerId);
|
|
71
|
+
} catch {
|
|
72
|
+
}
|
|
73
|
+
}, Y = () => {
|
|
74
|
+
i.removeEventListener("pointermove", g, !0), i.removeEventListener("pointerup", p, !0), i.removeEventListener("pointercancel", m, !0), e.captureEl?.removeEventListener("lostpointercapture", s);
|
|
75
|
+
}, u = (r) => {
|
|
76
|
+
if (!n) return;
|
|
77
|
+
const c = r?.event;
|
|
78
|
+
if (!(c && c.pointerId !== t.pointerId)) {
|
|
79
|
+
if (c && (t.lastClientX = c.clientX, t.lastClientY = c.clientY), n = !1, t.rafId !== null && typeof l.cancelAnimationFrame == "function" && (l.cancelAnimationFrame(t.rafId), t.rafId = null), r?.commit !== !1) {
|
|
80
|
+
C(t);
|
|
81
|
+
const E = v(t);
|
|
82
|
+
E && e.onMove(E);
|
|
83
|
+
}
|
|
84
|
+
Y(), I(), t.stopHotInteraction?.(), t.stopHotInteraction = null, e.onEnd({
|
|
85
|
+
commit: r?.commit !== !1,
|
|
86
|
+
snapshot: t
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}, f = (r) => {
|
|
90
|
+
!n || r.pointerId !== t.pointerId || (t.lastClientX = r.clientX, t.lastClientY = r.clientY, o());
|
|
91
|
+
}, g = (r) => {
|
|
92
|
+
f(r);
|
|
93
|
+
}, p = (r) => {
|
|
94
|
+
u({ event: r });
|
|
95
|
+
}, m = (r) => {
|
|
96
|
+
u({ event: r, commit: !1 });
|
|
97
|
+
}, s = () => {
|
|
98
|
+
u();
|
|
99
|
+
};
|
|
100
|
+
if (i.addEventListener("pointermove", g, !0), i.addEventListener("pointerup", p, !0), i.addEventListener("pointercancel", m, !0), e.captureEl?.addEventListener("lostpointercapture", s), e.captureEl && typeof e.captureEl.setPointerCapture == "function")
|
|
101
|
+
try {
|
|
102
|
+
e.captureEl.setPointerCapture(t.pointerId);
|
|
103
|
+
} catch {
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
snapshot: () => t,
|
|
107
|
+
updatePointer: f,
|
|
108
|
+
stop: u
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export {
|
|
112
|
+
L as startDeckPointerSession
|
|
113
|
+
};
|
|
@@ -30,14 +30,18 @@ export interface DragState {
|
|
|
30
30
|
widgetId: string;
|
|
31
31
|
originalPosition: GridPosition;
|
|
32
32
|
currentPosition: GridPosition;
|
|
33
|
-
/** Pixel offset for smooth visual following */
|
|
34
|
-
pixelOffset: {
|
|
35
|
-
x: number;
|
|
36
|
-
y: number;
|
|
37
|
-
};
|
|
38
33
|
startX: number;
|
|
39
34
|
startY: number;
|
|
40
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* High-frequency visual motion for an active drag session.
|
|
38
|
+
* This never participates in collision checks or final commit.
|
|
39
|
+
*/
|
|
40
|
+
export interface DragMotionState {
|
|
41
|
+
widgetId: string;
|
|
42
|
+
deltaX: number;
|
|
43
|
+
deltaY: number;
|
|
44
|
+
}
|
|
41
45
|
/**
|
|
42
46
|
* Resize state for a widget being resized
|
|
43
47
|
*/
|
|
@@ -73,10 +77,11 @@ export interface DeckContextValue {
|
|
|
73
77
|
/** Get widget state accessor for a specific widget */
|
|
74
78
|
getWidgetState: (widgetId: string) => Record<string, unknown>;
|
|
75
79
|
dragState: Accessor<DragState | null>;
|
|
80
|
+
dragMotion: Accessor<DragMotionState | null>;
|
|
76
81
|
startDrag: (widgetId: string, startX: number, startY: number) => void;
|
|
77
|
-
updateDrag: (currentPosition: GridPosition,
|
|
78
|
-
|
|
79
|
-
|
|
82
|
+
updateDrag: (currentPosition: GridPosition, motion: {
|
|
83
|
+
deltaX: number;
|
|
84
|
+
deltaY: number;
|
|
80
85
|
}) => void;
|
|
81
86
|
endDrag: (commit: boolean) => void;
|
|
82
87
|
resizeState: Accessor<ResizeState | null>;
|