@witchcraft/layout 0.4.4 → 0.5.1

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.
Files changed (99) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/runtime/components/FrameDragHandle.vue +3 -3
  3. package/dist/runtime/components/LayoutDragEdgeGrabbed.vue +3 -3
  4. package/dist/runtime/components/LayoutDragEdgeHandle.d.vue.ts +2 -2
  5. package/dist/runtime/components/LayoutDragEdgeHandle.vue +2 -2
  6. package/dist/runtime/components/LayoutDragEdgeHandle.vue.d.ts +2 -2
  7. package/dist/runtime/components/LayoutDragEdges.vue +5 -5
  8. package/dist/runtime/components/LayoutEdgesActiveFrame.vue +2 -2
  9. package/dist/runtime/components/LayoutFrame.vue +2 -2
  10. package/dist/runtime/components/LayoutIntersectionHandle.d.vue.ts +2 -2
  11. package/dist/runtime/components/LayoutIntersectionHandle.vue +2 -2
  12. package/dist/runtime/components/LayoutIntersectionHandle.vue.d.ts +2 -2
  13. package/dist/runtime/components/LayoutIntersections.vue +4 -4
  14. package/dist/runtime/components/LayoutWindow.d.vue.ts +44 -44
  15. package/dist/runtime/components/LayoutWindow.vue +27 -27
  16. package/dist/runtime/components/LayoutWindow.vue.d.ts +44 -44
  17. package/dist/runtime/composables/useFrames.d.ts +107 -109
  18. package/dist/runtime/composables/useFrames.js +107 -99
  19. package/dist/runtime/demo/App.vue +16 -16
  20. package/dist/runtime/demo/DemoControls.d.vue.ts +2 -2
  21. package/dist/runtime/demo/DemoControls.vue +4 -4
  22. package/dist/runtime/demo/DemoControls.vue.d.ts +2 -2
  23. package/dist/runtime/helpers/createZoneSideClipPath.d.ts +2 -2
  24. package/dist/runtime/helpers/{findFrameDraggableEdges.d.ts → findFrameMoveableEdges.d.ts} +2 -2
  25. package/dist/runtime/helpers/{findFrameDraggableEdges.js → findFrameMoveableEdges.js} +3 -3
  26. package/dist/runtime/helpers/{findDraggableEdge.d.ts → findMoveableEdge.d.ts} +1 -1
  27. package/dist/runtime/helpers/{findDraggableEdge.js → findMoveableEdge.js} +1 -1
  28. package/dist/runtime/helpers/index.d.ts +2 -2
  29. package/dist/runtime/helpers/index.js +2 -2
  30. package/dist/runtime/layout/createSplitDecoFromDrag.d.ts +1 -1
  31. package/dist/runtime/layout/createSplitDecoFromDrag.js +2 -2
  32. package/dist/runtime/layout/findSafeSplitEdge.d.ts +1 -1
  33. package/dist/runtime/layout/findSafeSplitEdge.js +2 -2
  34. package/dist/runtime/layout/getCloseFrameInfo.js +4 -4
  35. package/dist/runtime/layout/getFrameRearrangeInfo.d.ts +2 -2
  36. package/dist/runtime/layout/getFrameRearrangeInfo.js +8 -8
  37. package/dist/runtime/layout/getFrameSplitInfo.d.ts +1 -1
  38. package/dist/runtime/layout/getFrameSplitInfo.js +2 -2
  39. package/dist/runtime/layout/{getFrameDragZones.d.ts → getFrameZones.d.ts} +3 -3
  40. package/dist/runtime/layout/{getFrameDragZones.js → getFrameZones.js} +1 -1
  41. package/dist/runtime/layout/{getWindowDragZones.d.ts → getWindowZones.d.ts} +1 -1
  42. package/dist/runtime/layout/{getWindowDragZones.js → getWindowZones.js} +1 -1
  43. package/dist/runtime/layout/getZones.d.ts +8 -0
  44. package/dist/runtime/layout/getZones.js +32 -0
  45. package/dist/runtime/layout/index.d.ts +3 -3
  46. package/dist/runtime/layout/index.js +3 -3
  47. package/dist/runtime/{drag/DragActionHandler.d.ts → move/ActionHandler.d.ts} +19 -21
  48. package/dist/runtime/{drag/DragActionHandler.js → move/ActionHandler.js} +21 -18
  49. package/dist/runtime/{drag → move}/CloseAction.d.ts +9 -8
  50. package/dist/runtime/{drag → move}/CloseAction.js +31 -27
  51. package/dist/runtime/{drag → move}/FrameDragAction.d.ts +9 -8
  52. package/dist/runtime/{drag → move}/FrameDragAction.js +23 -22
  53. package/dist/runtime/{drag/DragDirectionStore.d.ts → move/MoveDirectionStore.d.ts} +4 -4
  54. package/dist/runtime/{drag/DragDirectionStore.js → move/MoveDirectionStore.js} +9 -9
  55. package/dist/runtime/{drag → move}/SplitAction.d.ts +10 -9
  56. package/dist/runtime/{drag → move}/SplitAction.js +53 -44
  57. package/dist/runtime/{drag → move}/createDefaultHandlers.d.ts +2 -2
  58. package/dist/runtime/types/index.d.ts +192 -171
  59. package/dist/runtime/types/index.js +2 -2
  60. package/dist/runtime/types/vue.d.ts +14 -16
  61. package/dist/runtime/types/vue.js +1 -1
  62. package/package.json +1 -1
  63. package/src/runtime/components/FrameDragHandle.vue +3 -3
  64. package/src/runtime/components/LayoutDragEdgeGrabbed.vue +3 -3
  65. package/src/runtime/components/LayoutDragEdgeHandle.vue +4 -4
  66. package/src/runtime/components/LayoutDragEdges.vue +5 -5
  67. package/src/runtime/components/LayoutEdgesActiveFrame.vue +2 -2
  68. package/src/runtime/components/LayoutFrame.vue +2 -2
  69. package/src/runtime/components/LayoutIntersectionHandle.vue +4 -4
  70. package/src/runtime/components/LayoutIntersections.vue +4 -4
  71. package/src/runtime/components/LayoutWindow.vue +32 -32
  72. package/src/runtime/composables/useFrames.ts +115 -104
  73. package/src/runtime/demo/App.vue +18 -18
  74. package/src/runtime/demo/DemoControls.vue +5 -5
  75. package/src/runtime/helpers/createZoneSideClipPath.ts +2 -2
  76. package/src/runtime/helpers/{findFrameDraggableEdges.ts → findFrameMoveableEdges.ts} +4 -4
  77. package/src/runtime/helpers/{findDraggableEdge.ts → findMoveableEdge.ts} +1 -1
  78. package/src/runtime/helpers/index.ts +2 -2
  79. package/src/runtime/layout/createSplitDecoFromDrag.ts +2 -2
  80. package/src/runtime/layout/findSafeSplitEdge.ts +4 -4
  81. package/src/runtime/layout/getCloseFrameInfo.ts +4 -4
  82. package/src/runtime/layout/getFrameRearrangeInfo.ts +10 -10
  83. package/src/runtime/layout/getFrameSplitInfo.ts +5 -5
  84. package/src/runtime/layout/{getFrameDragZones.ts → getFrameZones.ts} +4 -4
  85. package/src/runtime/layout/{getWindowDragZones.ts → getWindowZones.ts} +1 -1
  86. package/src/runtime/layout/getZones.ts +48 -0
  87. package/src/runtime/layout/index.ts +3 -3
  88. package/src/runtime/{drag/DragActionHandler.ts → move/ActionHandler.ts} +48 -41
  89. package/src/runtime/{drag → move}/CloseAction.ts +42 -37
  90. package/src/runtime/{drag → move}/FrameDragAction.ts +37 -36
  91. package/src/runtime/{drag/DragDirectionStore.ts → move/MoveDirectionStore.ts} +10 -10
  92. package/src/runtime/{drag → move}/SplitAction.ts +64 -54
  93. package/src/runtime/{drag → move}/createDefaultHandlers.ts +2 -2
  94. package/src/runtime/types/index.ts +90 -69
  95. package/src/runtime/types/vue.ts +14 -14
  96. package/dist/runtime/layout/getDragZones.d.ts +0 -8
  97. package/dist/runtime/layout/getDragZones.js +0 -32
  98. package/src/runtime/layout/getDragZones.ts +0 -48
  99. /package/dist/runtime/{drag → move}/createDefaultHandlers.js +0 -0
@@ -3,7 +3,6 @@ import { keys } from "@alanscodelog/utils/keys"
3
3
  import type { Ref } from "vue"
4
4
  import { computed, onBeforeUnmount, onMounted, ref, watch } from "vue"
5
5
 
6
- import { DragDirectionStore } from "../drag/DragDirectionStore.js"
7
6
  import { cloneFrame } from "../helpers/cloneFrame.js"
8
7
  import { getIntersections } from "../helpers/getIntersections.js"
9
8
  import { getVisualEdges } from "../helpers/getVisualEdges.js"
@@ -12,13 +11,14 @@ import { moveEdge } from "../helpers/moveEdge.js"
12
11
  import { toWindowCoord } from "../helpers/toWindowCoord.js"
13
12
  import { findFramesTouchingEdge } from "../layout/findFramesTouchingEdge.js"
14
13
  import { isPointInRect } from "../layout/isPointInRect.js"
15
- import type { ActionHandler, Direction, DragState, Edge, EdgeDragStartData, FrameDragStartData, FrameId, IntersectionEntry, LayoutFrame, LayoutWindow, Orientation, Point } from "../types/index.js"
14
+ import { MoveDirectionStore } from "../move/MoveDirectionStore.js"
15
+ import type { ActionHandler, ActionHandlerApplyResult, Direction, Edge, EdgeMoveStartData, FrameId, FrameMoveStartData, IntersectionEntry, LayoutFrame, LayoutWindow, MoveState, Orientation, Point } from "../types/index.js"
16
16
 
17
17
  export function useFrames(
18
18
  win: Ref<LayoutWindow>,
19
19
  handler: ActionHandler
20
20
  ) {
21
- const draggingEdges = ref<Edge[]>([])
21
+ const movingEdges = ref<Edge[]>([])
22
22
 
23
23
  // each entry corresponds to the frames touching the corresponding dragging edge
24
24
  const touchingFrames = ref<Record<string, LayoutFrame>[]>([])
@@ -34,31 +34,31 @@ export function useFrames(
34
34
 
35
35
  const touchingFramesArrays = computed(() => touchingFrames.value.map(entry => Object.values(entry)))
36
36
 
37
- const isDragging = ref<false | "frame" | "edge">(false)
38
- const showDragging = ref(false)
39
- const dragPoint = ref<Point | undefined>()
37
+ const isMoving = ref<false | "frame" | "edge">(false)
38
+ const showMoving = ref(false)
39
+ const movePoint = ref<Point | undefined>()
40
40
 
41
- const dragDirections = ref<Record<Orientation, Direction | undefined>>({} as any)
41
+ const moveDirections = ref<Record<Orientation, Direction | undefined>>({} as any)
42
42
 
43
- let dragStartPoint: Point | undefined
44
- const dragDistance = ref(-1)
43
+ let moveStartPoint: Point | undefined
44
+ const moveDistance = ref(-1)
45
45
 
46
- const draggingIntersection = ref<IntersectionEntry | undefined>(undefined)
47
- const isDraggingFromWindowEdge = ref<boolean>(false)
46
+ const movingIntersection = ref<IntersectionEntry | undefined>(undefined)
47
+ const isMovingFromWindowEdge = ref<boolean>(false)
48
48
 
49
- const frameDragFrameId = ref<FrameId | undefined>()
49
+ const movingFrameId = ref<FrameId | undefined>()
50
50
  const eventContext = ref<Record<string, unknown> | undefined>()
51
51
 
52
52
  const frames = computed(() =>
53
- isDragging.value && showDragging.value
53
+ isMoving.value && showMoving.value
54
54
  ? { ...win.value.frames, ...allTouchingFrames.value }
55
55
  : win.value.frames
56
56
  )
57
57
 
58
- const dragHoveredFrame = computed(() => {
59
- if (isDragging.value) {
58
+ const moveHoveredFrame = computed(() => {
59
+ if (isMoving.value) {
60
60
  for (const id of keys(frames.value)) {
61
- if (isPointInRect(frames.value[id], dragPoint.value!)) {
61
+ if (isPointInRect(frames.value[id], movePoint.value!)) {
62
62
  return frames.value[id]
63
63
  }
64
64
  }
@@ -70,77 +70,78 @@ export function useFrames(
70
70
  const intersections = computed(() => getIntersections(visualEdges.value))
71
71
  // avoid expensive calculation of edges when lots of frames are added/removed
72
72
  // all at once (e.g. by clicking on some command many times in a row)
73
- const debounceGetDraggableEdges = debounce((f: LayoutFrame[]) => {
73
+ const debounceGetMoveableEdges = debounce((f: LayoutFrame[]) => {
74
74
  visualEdges.value = getVisualEdges(f, { includeWindowEdges: true })
75
75
  handler.annotateEdges?.(visualEdges.value, f)
76
76
  }, 50, {}) as any
77
77
 
78
- watch([isDragging, frames], () => {
78
+ watch([isMoving, frames], () => {
79
79
  // let request animation force recalc
80
- if (isDragging.value) return
80
+ if (isMoving.value) return
81
81
  // otherwise use more performant debounced version
82
- debounceGetDraggableEdges(Object.values(frames.value))
82
+ debounceGetMoveableEdges(Object.values(frames.value))
83
83
  }, { deep: true })
84
- debounceGetDraggableEdges(Object.values(frames.value))
84
+ debounceGetMoveableEdges(Object.values(frames.value))
85
85
 
86
86
  function forceRecalculateEdges(): void {
87
87
  visualEdges.value = getVisualEdges(Object.values(frames.value), { includeWindowEdges: true })
88
88
  handler.annotateEdges?.(visualEdges.value, Object.values(frames.value))
89
89
  }
90
90
 
91
- const dragDirStore = new DragDirectionStore({
92
- onUpdate: dir => dragDirections.value = dir
91
+ const moveDirStore = new MoveDirectionStore({
92
+ onUpdate: dir => moveDirections.value = dir
93
93
  })
94
94
 
95
95
  const state = computed(() => ({
96
- dragDirections: dragDirections.value,
97
- dragPoint: dragPoint.value,
98
- dragDistance: dragDistance.value,
99
- isDragging: isDragging.value,
100
- showDragging: showDragging.value,
101
- draggingFrameId: frameDragFrameId.value,
102
- draggingEdges: draggingEdges.value,
103
- draggingIntersection: draggingIntersection.value,
96
+ moveDirections: moveDirections.value,
97
+ movePoint: movePoint.value,
98
+ moveDistance: moveDistance.value,
99
+ isMoving: isMoving.value,
100
+ showMoving: showMoving.value,
101
+ movingFrameId: movingFrameId.value,
102
+ movingEdges: movingEdges.value,
103
+ movingIntersection: movingIntersection.value,
104
104
  visualEdges: visualEdges.value,
105
105
  touchingFrames: touchingFrames.value,
106
106
  touchingFramesArrays: touchingFramesArrays.value,
107
107
  frames: frames.value,
108
- dragHoveredFrame: dragHoveredFrame.value,
108
+ moveHoveredFrame: moveHoveredFrame.value,
109
109
  intersections: intersections.value,
110
- isDraggingFromWindowEdge: isDraggingFromWindowEdge.value,
110
+ isMovingFromWindowEdge: isMovingFromWindowEdge.value,
111
111
  eventContext: eventContext.value,
112
112
  win: win.value
113
- } satisfies DragState))
113
+ } satisfies MoveState))
114
114
 
115
115
  let controller: AbortController
116
- let dragResolve: ((result: any) => void) | undefined
117
- let dragResult: any
116
+ let moveResolve: ((result: any) => void) | undefined
117
+ let moveResult: any
118
118
 
119
119
  function resetState(): void {
120
- dragStartPoint = undefined
120
+ moveStartPoint = undefined
121
121
 
122
- dragResolve?.(dragResult)
123
- dragResolve = undefined
124
- dragResult = undefined
122
+ moveResolve?.(moveResult)
123
+ moveResolve = undefined
124
+ moveResult = undefined
125
125
 
126
- draggingEdges.value = []
127
- draggingIntersection.value = undefined
128
- isDragging.value = false
129
- dragPoint.value = undefined
130
- dragDistance.value = -1
126
+ movingEdges.value = []
127
+ movingIntersection.value = undefined
128
+ isMoving.value = false
129
+ movePoint.value = undefined
130
+ moveDistance.value = -1
131
131
  touchingFrames.value = []
132
- frameDragFrameId.value = undefined
132
+ movingFrameId.value = undefined
133
133
  eventContext.value = undefined
134
- dragDirStore.reset()
135
- showDragging.value = false
134
+ moveDirStore.reset()
135
+ showMoving.value = false
136
136
  forceRecalculateEdges()
137
+ handler.onMoveEnded()
137
138
  }
138
139
 
139
- function dragStart<T extends "edge" | "frame">(
140
+ function moveStart<T extends "edge" | "frame">(
140
141
  e: PointerEvent,
141
142
  type: T,
142
143
  // someday this will work
143
- data: T extends "edge" ? EdgeDragStartData : FrameDragStartData,
144
+ data: T extends "edge" ? EdgeMoveStartData : FrameMoveStartData,
144
145
  {
145
146
  moveEvent = "pointermove",
146
147
  endEvent = "pointerup",
@@ -157,40 +158,40 @@ export function useFrames(
157
158
  }
158
159
 
159
160
  const promise = new Promise<any>(resolve => {
160
- dragResolve = resolve
161
+ moveResolve = resolve
161
162
  })
162
163
 
163
164
  controller = new AbortController()
164
165
  controller.signal.addEventListener("abort", () => resetState())
165
166
 
166
167
  e.preventDefault()
167
- window.addEventListener(moveEvent, dragMove as EventListener, { signal: controller.signal })
168
- window.addEventListener(endEvent, dragEnd as EventListener, { signal: controller.signal })
168
+ window.addEventListener(moveEvent, onMove as EventListener, { signal: controller.signal })
169
+ window.addEventListener(endEvent, moveEnd as EventListener, { signal: controller.signal })
169
170
 
170
171
  const point = toWindowCoord(win.value, e)
171
- dragPoint.value = point
172
- dragStartPoint = { ...point }
173
- dragDirStore.update(point)
172
+ movePoint.value = point
173
+ moveStartPoint = { ...point }
174
+ moveDirStore.update(point)
174
175
  eventContext.value = context
175
176
 
176
- isDragging.value = type
177
- showDragging.value = true
177
+ isMoving.value = type
178
+ showMoving.value = true
178
179
 
179
180
  if (type === "frame") {
180
- frameDragFrameId.value = (data as FrameDragStartData).frameId
181
+ movingFrameId.value = (data as FrameMoveStartData).frameId
181
182
  } else {
182
- const { edge, intersection } = data as EdgeDragStartData
183
- draggingIntersection.value = intersection
183
+ const { edge, intersection } = data as EdgeMoveStartData
184
+ movingIntersection.value = intersection
184
185
 
185
- draggingEdges.value = edge
186
+ movingEdges.value = edge
186
187
  ? [edge!]
187
188
  : [
188
- ...(draggingIntersection.value?.sharedEdges.horizontal ?? []),
189
- ...(draggingIntersection.value?.sharedEdges.vertical ?? [])
189
+ ...(movingIntersection.value?.sharedEdges.horizontal ?? []),
190
+ ...(movingIntersection.value?.sharedEdges.vertical ?? [])
190
191
  ]
191
192
 
192
193
 
193
- isDraggingFromWindowEdge.value = draggingEdges.value.some(_ => isWindowEdge(_))
194
+ isMovingFromWindowEdge.value = movingEdges.value.some(_ => isWindowEdge(_))
194
195
 
195
196
  const framesArray = Object.values(win.value.frames)
196
197
 
@@ -198,10 +199,10 @@ export function useFrames(
198
199
  // all frames in touchingFrames must be clones
199
200
  // BUT they must be the same clone even if they are referenced by multiple dragging edges
200
201
  const clones = new Map<string, LayoutFrame>()
201
- for (let i = 0; i < draggingEdges.value.length; i++) {
202
- const draggingEdge = draggingEdges.value[i]
202
+ for (let i = 0; i < movingEdges.value.length; i++) {
203
+ const movingEdge = movingEdges.value[i]
203
204
  touchingFrames.value[i] = {}
204
- for (const { frame } of findFramesTouchingEdge(draggingEdge, framesArray)) {
205
+ for (const { frame } of findFramesTouchingEdge(movingEdge, framesArray)) {
205
206
  if (!clones.has(frame.id)) {
206
207
  const clone = cloneFrame(frame)
207
208
  touchingFrames.value[i][frame.id] = clone
@@ -213,36 +214,40 @@ export function useFrames(
213
214
  }
214
215
  }
215
216
 
216
- const res = handler.onDragChange("start", e, state.value, forceRecalculateEdges, cancel)
217
- showDragging.value = res.showDragging ?? true
217
+ const res = handler.onMoveChange("start", e, state.value, forceRecalculateEdges, cancel, resolve)
218
+ showMoving.value = res.showMoving ?? true
218
219
  return promise
219
220
  }
220
221
 
221
- function dragMove(e: PointerEvent): void {
222
+ function onMove(e: PointerEvent): void {
222
223
  e.preventDefault()
223
224
  const point = toWindowCoord(win.value, e)
224
- const didChange = dragDirStore.update(point)
225
- dragPoint.value = point
225
+ const didChange = moveDirStore.update(point)
226
+ movePoint.value = point
226
227
  // at least one drag move has happened
227
- dragDistance.value = 0
228
- if (dragStartPoint) {
229
- dragDistance.value = Math.sqrt(
230
- Math.pow(point.x - dragStartPoint.x, 2) + Math.pow(point.y - dragStartPoint.y, 2)
228
+ moveDistance.value = 0
229
+ if (moveStartPoint) {
230
+ moveDistance.value = Math.sqrt(
231
+ Math.pow(point.x - moveStartPoint.x, 2) + Math.pow(point.y - moveStartPoint.y, 2)
231
232
  )
232
233
  }
233
234
  if (!didChange) return
234
- const res = handler.onDragChange("move", e, state.value, forceRecalculateEdges, cancel)
235
+ onMoveChange(e, "move", point)
236
+ }
237
+
238
+ function onMoveChange(e: PointerEvent | undefined, type: "move" | "end", point: Point | undefined) {
239
+ const res = handler.onMoveChange(type, e, state.value, forceRecalculateEdges, cancel, type === "end" ? undefined : resolve)
235
240
 
236
241
 
237
- showDragging.value = res.showDragging ?? true
242
+ showMoving.value = res.showMoving ?? true
238
243
  if (!res.updateEdges) return
239
244
 
240
- if (isDragging.value === "edge") {
245
+ if (isMoving.value === "edge" && point) {
241
246
  requestAnimationFrame(() => {
242
- for (let i = 0; i < draggingEdges.value.length; i++) {
243
- const draggingEdge = draggingEdges.value[i]
244
- if (draggingEdge) {
245
- moveEdge(touchingFramesArrays.value[i], draggingEdge, point)
247
+ for (let i = 0; i < movingEdges.value.length; i++) {
248
+ const movingEdge = movingEdges.value[i]
249
+ if (movingEdge) {
250
+ moveEdge(touchingFramesArrays.value[i], movingEdge, point)
246
251
  }
247
252
  }
248
253
  forceRecalculateEdges()
@@ -250,15 +255,17 @@ export function useFrames(
250
255
  }
251
256
  }
252
257
 
253
- function dragEnd(e?: PointerEvent, { apply = true }: { apply?: boolean } = {}): void {
258
+ function moveEnd(e?: PointerEvent, { apply = true }: Partial<Pick<ActionHandlerApplyResult, "apply">> = {}): void {
254
259
  if (e) {
255
260
  const point = toWindowCoord(win.value, e)
256
- dragPoint.value = point
261
+ movePoint.value = point
257
262
  }
258
263
 
264
+ onMoveChange(e, "end", movePoint.value)
265
+
259
266
  if (apply) {
260
- const applyResult = handler.onDragApply(state.value, forceRecalculateEdges)
261
- dragResult = applyResult.result
267
+ const applyResult = handler.onMoveApply(state.value, forceRecalculateEdges)
268
+ moveResult = applyResult.result
262
269
  if (applyResult.apply) {
263
270
  for (const frame of touchingFramesArrays.value.flat()) {
264
271
  win!.value.frames[frame.id] = frame
@@ -266,15 +273,19 @@ export function useFrames(
266
273
  }
267
274
  }
268
275
 
269
- handler.onDragChange("end", e, state.value, forceRecalculateEdges, cancel)
270
-
271
276
  // this can get called from elsewhere
272
- // also takes care of cleanup nd resolving promise
277
+ // also takes care of cleanup, resolving promise, and calling onMoveEnded
273
278
  controller?.abort()
274
279
  }
280
+
275
281
  function cancel(): void {
276
- dragEnd(undefined, { apply: false })
282
+ moveEnd(undefined, { apply: false })
283
+ }
284
+ function resolve({ apply, result: value }: ActionHandlerApplyResult): void {
285
+ moveResult = value
286
+ moveEnd(undefined, { apply })
277
287
  }
288
+
278
289
  const keydownController = new AbortController()
279
290
  const wrappedKeydownHandler = (e: KeyboardEvent): void => {
280
291
  handler.eventHandler(e, state.value, forceRecalculateEdges)
@@ -290,26 +301,26 @@ export function useFrames(
290
301
  })
291
302
 
292
303
  return {
293
- dragStart,
294
- dragEnd,
304
+ moveStart,
305
+ moveEnd,
295
306
  cancel,
296
- dragMove,
297
- dragDirections,
298
- dragPoint,
299
- isDragging,
300
- draggingEdges,
301
- draggingIntersection,
307
+ onMove,
308
+ moveDirections,
309
+ movePoint,
310
+ isMoving,
311
+ movingEdges,
312
+ movingIntersection,
302
313
  visualEdges,
303
314
  touchingFrames,
304
315
  touchingFramesArrays,
305
316
  frames,
306
- dragHoveredFrame,
317
+ moveHoveredFrame,
307
318
  intersections,
308
- isDraggingFromWindowEdge,
319
+ isMovingFromWindowEdge,
309
320
  forceRecalculateEdges,
310
321
  state,
311
- showDragging,
312
- frameDragFrameId,
322
+ showMoving,
323
+ movingFrameId,
313
324
  actionHandler: handler
314
325
  }
315
326
  }
@@ -10,7 +10,7 @@
10
10
  v-if="win"
11
11
  :frames="frames!"
12
12
  :win="win"
13
- :dragActionHandler="dragActionHandler"
13
+ :actionHandler="actionHandler"
14
14
  />
15
15
 
16
16
  <LayoutWindow
@@ -33,8 +33,8 @@
33
33
  :textHints="textHints"
34
34
  textHintsTeleportTo="#status-bar"
35
35
  v-model:win="win"
36
- @is-showing-drag="isShowingDrag = $event"
37
- @drag-state="dragState = $event"
36
+ @is-showing-move="isShowingMove = $event"
37
+ @move-state="moveState = $event"
38
38
  >
39
39
  <LayoutFrame class="
40
40
  flex
@@ -163,7 +163,7 @@ import LayoutIntersections from "../components/LayoutIntersections.vue"
163
163
  import LayoutEdgesActiveFrame from "../components/LayoutEdgesActiveFrame.vue"
164
164
  import LayoutDragEdges from "../components/LayoutDragEdges.vue"
165
165
  import LayoutIntersectionHandle from "../components/LayoutIntersectionHandle.vue"
166
- import type { DragState } from "../types/index.js"
166
+ import type { MoveState } from "../types/index.js"
167
167
  import { applyFrameChanges } from "../layout/applyFrameChanges.js"
168
168
  import { debugFrame } from "../layout/debugFrame.js"
169
169
  import { getFrameCollapseInfo } from "../layout/getFrameCollapseInfo.js"
@@ -179,7 +179,7 @@ import { settings } from "../settings.js"
179
179
  import type { EdgeSide, Layout, Pos, Size } from "../types/index.js"
180
180
  import { throwIfError } from "@alanscodelog/utils/throwIfError"
181
181
  import { useTemplateRef } from "vue"
182
- import { DragActionHandler } from "../drag/DragActionHandler.js"
182
+ import { ActionHandler } from "../move/ActionHandler.js"
183
183
  import LayoutDragEdgeHandle from "../components/LayoutDragEdgeHandle.vue"
184
184
  import LayoutDragEdgeVisible from "../components/LayoutDragEdgeVisible.vue"
185
185
  import LayoutIntersectionVisible from "../components/LayoutIntersectionVisible.vue"
@@ -228,30 +228,30 @@ function layoutInitialize(layout: Layout, { defaultPos, defaultSize }: {
228
228
  }
229
229
 
230
230
  // whether layout window is showing the edge beneath the mouse
231
- // as determined by the DragActionHandler in LayoutWindow
232
- const isShowingDrag = ref(false)
231
+ // as determined by the ActionHandler in LayoutWindow
232
+ const isShowingMove = ref(false)
233
233
  // drag state as returned by useFrames in LayoutWindow
234
- const dragState = ref<DragState | undefined>(undefined)
234
+ const moveState = ref<MoveState | undefined>(undefined)
235
235
 
236
236
  function handleUndock(frameId: string) {
237
237
  const changes = throwIfError(getFrameUndockInfo(win.value!, frameId))
238
- DragActionHandler.debugState("undock", "before", dragState.value!, {}, undefined)
238
+ ActionHandler.debugState("undock", "before", moveState.value!, {}, undefined)
239
239
  applyFrameChanges(win.value!, changes)
240
- DragActionHandler.debugState("undock", "after", dragState.value!, {}, undefined)
240
+ ActionHandler.debugState("undock", "after", moveState.value!, {}, undefined)
241
241
  }
242
242
 
243
243
  function handleCollapse(frameId: string) {
244
244
  const changes = throwIfError(getFrameCollapseInfo(win.value!, frameId))
245
- DragActionHandler.debugState("collapse", "before", dragState.value!, {}, undefined)
245
+ ActionHandler.debugState("collapse", "before", moveState.value!, {}, undefined)
246
246
  applyFrameChanges(win.value!, changes)
247
- DragActionHandler.debugState("collapse", "after", dragState.value!, {}, undefined)
247
+ ActionHandler.debugState("collapse", "after", moveState.value!, {}, undefined)
248
248
  }
249
249
 
250
250
  function handleUncollapse(frameId: string) {
251
251
  const changes = throwIfError(getFrameUncollapseInfo(win.value!, frameId))
252
- DragActionHandler.debugState("uncollapse", "before", dragState.value!, {}, undefined)
252
+ ActionHandler.debugState("uncollapse", "before", moveState.value!, {}, undefined)
253
253
  applyFrameChanges(win.value!, changes)
254
- DragActionHandler.debugState("uncollapse", "after", dragState.value!, {}, undefined)
254
+ ActionHandler.debugState("uncollapse", "after", moveState.value!, {}, undefined)
255
255
  }
256
256
 
257
257
  const collapsedDocks = computed(() => {
@@ -264,13 +264,13 @@ const collapsedDocks = computed(() => {
264
264
  return sides
265
265
  })
266
266
 
267
- const dragActionHandler = computed(() => layoutComponent.value?.dragActionHandler)
267
+ const actionHandler = computed(() => layoutComponent.value?.actionHandler)
268
268
 
269
269
  const textHints = computed(() => {
270
- const isDragging = dragState.value?.isDragging
271
- const textHints = dragActionHandler.value?.textHints ?? {actions:[], errors:[]}
270
+ const isMoving = moveState.value?.isMoving
271
+ const textHints = actionHandler.value?.textHints ?? {actions:[], errors:[]}
272
272
  return [
273
- ...(!isDragging ? [{classes:"", text:"Drag from an edge to create a new frame."}] : []),
273
+ ...(!isMoving ? [{classes:"", text:"Drag from an edge to create a new frame."}] : []),
274
274
  ...textHints.errors.map((_: string) => ({classes:"text-red-500", text:_})),
275
275
  ...textHints.actions.map((_: string) => ({ text:_})),
276
276
  ]
@@ -25,7 +25,7 @@
25
25
  <WButton class="flex-1" @click="copyState">Copy State</WButton>
26
26
  <WCheckbox v-model="renameFrames">Easy Ids</WCheckbox>
27
27
  </div>
28
- <label class="flex flex-col gap-2 text-sm" v-if="dragActionHandler">
28
+ <label class="flex flex-col gap-2 text-sm" v-if="actionHandler">
29
29
  <span>Plugin Debug Logs (true | debug path):</span>
30
30
  <WSimpleInput v-model="debugKey" />
31
31
  </label>
@@ -50,13 +50,13 @@ import { settings } from "../settings.js"
50
50
  import type { LayoutFrame, LayoutWindow } from "../types/index.js"
51
51
  import { throwIfError } from "@alanscodelog/utils/throwIfError";
52
52
  import { walk } from "@alanscodelog/utils/walk"
53
- import type { DragActionHandler } from "../drag/DragActionHandler.js"
53
+ import type { ActionHandler } from "../move/ActionHandler.js"
54
54
  import { rotateLayout } from "../helpers/rotateFrames.js"
55
55
 
56
56
  const props = defineProps<{
57
57
  win: LayoutWindow
58
58
  frames: LayoutFrame[],
59
- dragActionHandler?: DragActionHandler<any>
59
+ actionHandler?: ActionHandler<any>
60
60
  }>()
61
61
 
62
62
  const showDevActions = ref(false)
@@ -112,14 +112,14 @@ function copyState() {
112
112
 
113
113
  const debugKey = ref(import.meta.dev ? "state.win.frames" : "false")
114
114
  watch(debugKey, () => {
115
- if (!props.dragActionHandler) return
115
+ if (!props.actionHandler) return
116
116
  const value = debugKey.value === "true"
117
117
  ? true
118
118
  : debugKey.value === "false"
119
119
  ? false
120
120
  : debugKey.value
121
121
 
122
- for (const plugin of Object.values(props.dragActionHandler.actions)) {
122
+ for (const plugin of Object.values(props.actionHandler.actions)) {
123
123
  plugin.debug = value
124
124
  }
125
125
  })
@@ -6,10 +6,10 @@
6
6
  * Accepts scaled coordinates.
7
7
  */
8
8
 
9
- import type { DragZone } from "../types/index.js"
9
+ import type { Zone } from "../types/index.js"
10
10
 
11
11
  export function createZoneSideClipPath(
12
- zone: DragZone,
12
+ zone: Zone,
13
13
  { frameEdgePx, windowEdgePx }: { frameEdgePx: number, windowEdgePx: number }
14
14
  ): string | undefined {
15
15
  const side = zone.side
@@ -1,4 +1,4 @@
1
- import { findDraggableEdge } from "./findDraggableEdge.js"
1
+ import { findMoveableEdge } from "./findMoveableEdge.js"
2
2
  import { frameToEdges } from "./frameToEdges.js"
3
3
  import { isWindowEdge } from "./isWindowEdge.js"
4
4
  import { sideToOrientation } from "./sideToOrientation.js"
@@ -8,10 +8,10 @@ import type {
8
8
  EdgeSide, LayoutFrame
9
9
  } from "../types/index.js"
10
10
 
11
- export function findFrameDraggableEdges(
11
+ export function findFrameMoveableEdges(
12
12
  frame: LayoutFrame,
13
13
  edges: Edge[],
14
- /** See {@link findDraggableEdge} */
14
+ /** See {@link findMoveableEdge} */
15
15
  exact: boolean = true,
16
16
  sides: EdgeSide[] = ["left", "right", "top", "bottom"]
17
17
  ): { edge: Edge, side: EdgeSide }[] | undefined {
@@ -23,7 +23,7 @@ export function findFrameDraggableEdges(
23
23
  const isWinEdge = isWindowEdge(edge, edgeDirection)
24
24
 
25
25
  if (isWinEdge) continue
26
- const maybeEdge = findDraggableEdge(edge, edges, exact, edgeDirection)
26
+ const maybeEdge = findMoveableEdge(edge, edges, exact, edgeDirection)
27
27
 
28
28
  if (maybeEdge) res.push({ edge: maybeEdge, side })
29
29
  }
@@ -4,7 +4,7 @@ import { isEdgeEqual } from "./isEdgeEqual.js"
4
4
 
5
5
  import type { Edge, Orientation } from "../types/index.js"
6
6
 
7
- export function findDraggableEdge(
7
+ export function findMoveableEdge(
8
8
  edge: Edge,
9
9
  edges: Edge[],
10
10
  /** Whether the edge must match exactly and does not "contain/touch" another frame. */
@@ -23,8 +23,8 @@ export { dirToSide } from "./dirToSide.js"
23
23
  export { doEdgesOverlap } from "./doEdgesOverlap.js"
24
24
  export { doesEdgeContinueEdge } from "./doesEdgeContinueEdge.js"
25
25
  export { edgeToPoints } from "./edgeToPoints.js"
26
- export { findDraggableEdge } from "./findDraggableEdge.js"
27
- export { findFrameDraggableEdges } from "./findFrameDraggableEdges.js"
26
+ export { findMoveableEdge } from "./findMoveableEdge.js"
27
+ export { findFrameMoveableEdges } from "./findFrameMoveableEdges.js"
28
28
  export { framesRedistributeFix } from "./framesRedistributeFix.js"
29
29
  export { frameToEdges } from "./frameToEdges.js"
30
30
  export { frameToPoints } from "./frameToPoints.js"
@@ -8,7 +8,7 @@ export function createSplitDecoFromDrag(
8
8
  frames: Record<string, LayoutFrame>,
9
9
  frame: LayoutFrame,
10
10
  dragDirection: Direction,
11
- dragPoint: Point,
11
+ movePoint: Point,
12
12
  snapAmount: Point = settings.snapPointScaled,
13
13
  minSize: Size = settings.minSizeScaled,
14
14
  classes: {
@@ -22,7 +22,7 @@ export function createSplitDecoFromDrag(
22
22
  const deco: RawSplitDeco & Partial<SplitDeco> = {
23
23
  type: "split",
24
24
  id: frame.id,
25
- position: dragPoint[orientation === "horizontal" ? "x" : "y"],
25
+ position: movePoint[orientation === "horizontal" ? "x" : "y"],
26
26
  direction: dragDirection
27
27
  }
28
28
  deco.shapes = createSplitDecoShapes(frames, deco, snapAmount, minSize, classes)
@@ -8,15 +8,15 @@ import type { Direction, Edge, LayoutFrame, Point, Size } from "../types/index.j
8
8
  export function findSafeSplitEdgeAndPosition(
9
9
  frame: LayoutFrame,
10
10
  dragDirection: Direction,
11
- dragPointOrPosition: Point | number,
11
+ movePointOrPosition: Point | number,
12
12
  snapAmount: Point = settings.snapPointScaled,
13
13
  minSize: Size = settings.minSizeScaled
14
14
  ): { edge: Edge, position: number } {
15
15
  const orientation = dirToOrientation(dragDirection)
16
16
  const position
17
- = typeof dragPointOrPosition === "number"
18
- ? dragPointOrPosition
19
- : dragPointOrPosition[orientation === "horizontal" ? "x" : "y"]
17
+ = typeof movePointOrPosition === "number"
18
+ ? movePointOrPosition
19
+ : movePointOrPosition[orientation === "horizontal" ? "x" : "y"]
20
20
 
21
21
  const coordKey = orientation === "vertical" ? "y" : "x"
22
22
  const sizeKey = orientation === "vertical" ? "height" : "width"
@@ -7,7 +7,7 @@ import { findVisualEdge } from "./findVisualEdge.js"
7
7
 
8
8
  import { cloneFrame } from "../helpers/cloneFrame.js"
9
9
  import { dirToSide } from "../helpers/dirToSide.js"
10
- import { findFrameDraggableEdges } from "../helpers/findFrameDraggableEdges.js"
10
+ import { findFrameMoveableEdges } from "../helpers/findFrameMoveableEdges.js"
11
11
  import { getEdgeOrientation } from "../helpers/getEdgeOrientation.js"
12
12
  import { oppositeSide } from "../helpers/oppositeSide.js"
13
13
  import { settings } from "../settings.js"
@@ -119,9 +119,9 @@ export function getCloseFrameInfo<T extends "edge" | "dir">(
119
119
  : closeDirOrSide as EdgeSide
120
120
  const sideOpposite = oppositeSide(side)
121
121
 
122
- const draggableEdges = findFrameDraggableEdges(frame, visualEdges, !force, [side])
123
- if (!draggableEdges) return new KnownError(LAYOUT_ERROR.CANT_CLOSE_NO_DRAG_EDGE, `Could not find draggable edge for frame ${frame.id}`, { frame })
124
- const { edge: frameEdge } = draggableEdges[0]
122
+ const moveableEdges = findFrameMoveableEdges(frame, visualEdges, !force, [side])
123
+ if (!moveableEdges) return new KnownError(LAYOUT_ERROR.CANT_CLOSE_NO_DRAG_EDGE, `Could not find draggable edge for frame ${frame.id}`, { frame })
124
+ const { edge: frameEdge } = moveableEdges[0]
125
125
 
126
126
  const visualEdge = findVisualEdge(visualEdges, frameEdge)
127
127
  if (visualEdge === undefined) unreachable()