@witchcraft/layout 0.5.6 → 0.5.8

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/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@witchcraft/layout",
3
3
  "configKey": "witchcraftLayout",
4
- "version": "0.5.6",
4
+ "version": "0.5.8",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.2",
7
7
  "unbuild": "unknown"
package/dist/module.mjs CHANGED
@@ -17,6 +17,7 @@ const module$1 = defineNuxtModule({
17
17
  addTemplate({
18
18
  filename: "witchcraft-layout.css",
19
19
  write: true,
20
+ // keep in sync with demo tailwind.css's relevant section
20
21
  getContents: () => [
21
22
  `@source "${resolve("runtime/components")}";`,
22
23
  // the drag actions handlers and utils they use add some styles
@@ -353,7 +353,7 @@ declare const __VLS_component: import("vue").DefineComponent<__VLS_PublicProps,
353
353
  moveType: infer M;
354
354
  } ? M : never, TContextContext extends TContext extends {
355
355
  context: infer C;
356
- } ? C : never>(e: PointerEvent, type: TContextMoveType extends never ? T : TContextMoveType, data: T extends "edge" ? import("../types/index.js").EdgeMoveStartData : T extends "frame" ? import("../types/index.js").FrameMoveStartData : undefined, { moveEvent, endEvent, context }?: {
356
+ } ? C : never>(e: PointerEvent | undefined, type: TContextMoveType extends never ? T : TContextMoveType, data: T extends "edge" ? import("../types/index.js").EdgeMoveStartData : T extends "frame" ? import("../types/index.js").FrameMoveStartData : undefined, { moveEvent, endEvent, context }?: {
357
357
  moveEvent?: string;
358
358
  endEvent?: string;
359
359
  context?: {
@@ -353,7 +353,7 @@ declare const __VLS_component: import("vue").DefineComponent<__VLS_PublicProps,
353
353
  moveType: infer M;
354
354
  } ? M : never, TContextContext extends TContext extends {
355
355
  context: infer C;
356
- } ? C : never>(e: PointerEvent, type: TContextMoveType extends never ? T : TContextMoveType, data: T extends "edge" ? import("../types/index.js").EdgeMoveStartData : T extends "frame" ? import("../types/index.js").FrameMoveStartData : undefined, { moveEvent, endEvent, context }?: {
356
+ } ? C : never>(e: PointerEvent | undefined, type: TContextMoveType extends never ? T : TContextMoveType, data: T extends "edge" ? import("../types/index.js").EdgeMoveStartData : T extends "frame" ? import("../types/index.js").FrameMoveStartData : undefined, { moveEvent, endEvent, context }?: {
357
357
  moveEvent?: string;
358
358
  endEvent?: string;
359
359
  context?: {
@@ -7,7 +7,7 @@ export declare function useFrames(win: Ref<LayoutWindow>, handler: IActionHandle
7
7
  moveType: infer M;
8
8
  } ? M : never, TContextContext extends TContext extends {
9
9
  context: infer C;
10
- } ? C : never>(e: PointerEvent, type: TContextMoveType extends never ? T : TContextMoveType, data: T extends "edge" ? EdgeMoveStartData : T extends "frame" ? FrameMoveStartData : undefined, { moveEvent, endEvent, context }?: {
10
+ } ? C : never>(e: PointerEvent | undefined, type: TContextMoveType extends never ? T : TContextMoveType, data: T extends "edge" ? EdgeMoveStartData : T extends "frame" ? FrameMoveStartData : undefined, { moveEvent, endEvent, context }?: {
11
11
  moveEvent?: string;
12
12
  endEvent?: string;
13
13
  context?: {
@@ -37,7 +37,7 @@ export function useFrames(win, handler) {
37
37
  () => isMoving.value && showMoving.value ? { ...win.value.frames, ...allTouchingFrames.value } : win.value.frames
38
38
  );
39
39
  const moveHoveredFrame = computed(() => {
40
- if (isMoving.value) {
40
+ if (isMoving.value && movePoint.value) {
41
41
  for (const id of keys(frames.value)) {
42
42
  if (isPointInRect(frames.value[id], movePoint.value)) {
43
43
  return frames.value[id];
@@ -117,13 +117,15 @@ export function useFrames(win, handler) {
117
117
  });
118
118
  controller = new AbortController();
119
119
  controller.signal.addEventListener("abort", () => resetState());
120
- e.preventDefault();
120
+ e?.preventDefault();
121
121
  window.addEventListener(moveEvent, onMove, { signal: controller.signal });
122
122
  window.addEventListener(endEvent, moveEnd, { signal: controller.signal });
123
- const point = toWindowCoord(win.value, e);
124
- movePoint.value = point;
125
- moveStartPoint = { ...point };
126
- moveDirStore.update(point);
123
+ if (e) {
124
+ const point = toWindowCoord(win.value, e);
125
+ movePoint.value = point;
126
+ moveStartPoint = { ...point };
127
+ moveDirStore.update(point);
128
+ }
127
129
  eventContext.value = context;
128
130
  isMoving.value = type;
129
131
  showMoving.value = true;
@@ -1 +1 @@
1
- @import "tailwindcss";@import "../../../playground/.nuxt/witchcraft-ui.css";@import "../../../playground/.nuxt/witchcraft-layout.css";@source "../../../src/runtime/demo";button{cursor:pointer}
1
+ @import "tailwindcss";@import "../../../playground/.nuxt/witchcraft-ui.css";@import "../../../playground/.nuxt/witchcraft-layout.css";@source "../../../src/runtime/demo";@source "../../../src/runtime/move";@source "../../../src/runtime/components";@source "../../../src/runtime/utils/createSplitDecoShapes";button{cursor:pointer}
@@ -44,7 +44,7 @@ export declare class ActionHandler<TRawActions extends IAction[], TActions exten
44
44
  */
45
45
  defaultOnMoveChange?: IAction["onMoveChange"]);
46
46
  eventHandler(e: KeyboardEvent | PointerEvent, state: MoveState, forceRecalculateEdges: () => void): undefined;
47
- onMoveChange<T extends "start" | "move" | "end">(type: T, e: T extends "end" ? PointerEvent | undefined : PointerEvent, state: MoveState, forceRecalculateEdges: () => void, cancel: (e: PointerEvent | KeyboardEvent | undefined, state: MoveState) => void, resolve: T extends "end" ? undefined : ((opts: ActionResolve) => void)): MoveChangeResult;
47
+ onMoveChange<T extends "start" | "move" | "end">(type: T, e: T extends "end" | "start" ? PointerEvent | undefined : PointerEvent, state: MoveState, forceRecalculateEdges: () => void, cancel: (e: PointerEvent | KeyboardEvent | undefined, state: MoveState) => void, resolve: T extends "end" ? undefined : ((opts: ActionResolve) => void)): MoveChangeResult;
48
48
  onMoveApply(state: MoveState, forceRecalculateEdges: () => void): ActionHandlerApplyResult;
49
49
  onMoveEnded(): void;
50
50
  cancel(e: PointerEvent | KeyboardEvent | undefined, state: MoveState): void;
@@ -99,7 +99,7 @@ export class CloseAction {
99
99
  return false;
100
100
  }
101
101
  onMoveChange(type, _e, state) {
102
- if (state.moveDistance <= this.minDragDistance) {
102
+ if (type === "end" || state.moveDistance <= this.minDragDistance) {
103
103
  return { updateEdges: false, shapes: [] };
104
104
  }
105
105
  const {
@@ -150,7 +150,7 @@ export class CloseAction {
150
150
  const decos = this._getDecos(state);
151
151
  this.state.lastReturn = {
152
152
  updateEdges: !isMovingFromWindowEdge,
153
- shapes: type === "end" ? [] : decos.flatMap((_) => _.shapes)
153
+ shapes: decos.flatMap((_) => _.shapes)
154
154
  };
155
155
  return this.state.lastReturn;
156
156
  }
@@ -94,7 +94,7 @@ export class FrameDragAction {
94
94
  return false;
95
95
  }
96
96
  onMoveChange(type, _e, state) {
97
- if (state.moveDistance <= this.minDragDistance) {
97
+ if (type === "start" || state.moveDistance <= this.minDragDistance) {
98
98
  return { updateEdges: false, shapes: [], showMoving: false };
99
99
  }
100
100
  const { win, movingFrameId, moveHoveredFrame } = state;
@@ -120,7 +120,7 @@ export class SplitAction {
120
120
  }
121
121
  onMoveChange(type, _e, state) {
122
122
  const { moveHoveredFrame, moveDistance } = state;
123
- if (moveDistance <= this.minDragDistance) {
123
+ if (type === "end" || moveDistance <= this.minDragDistance) {
124
124
  return { updateEdges: false, shapes: [], showMoving: false };
125
125
  }
126
126
  let ok = false;
@@ -145,7 +145,7 @@ export class SplitAction {
145
145
  };
146
146
  this.state.lastReturn = {
147
147
  updateEdges: true,
148
- shapes: type === "end" ? [] : [errorDeco],
148
+ shapes: [errorDeco],
149
149
  showMoving: false
150
150
  };
151
151
  return this.state.lastReturn;
@@ -153,7 +153,7 @@ export class SplitAction {
153
153
  }
154
154
  this.state.lastReturn = {
155
155
  updateEdges: false,
156
- shapes: type === "end" ? [] : decos.flatMap((_) => _.shapes),
156
+ shapes: decos.flatMap((_) => _.shapes),
157
157
  showMoving: false
158
158
  };
159
159
  return this.state.lastReturn;
@@ -1937,7 +1937,7 @@ export interface IAction {
1937
1937
  *
1938
1938
  * See also {@link ActionHandler.onMoveChange} to understand it's lifecycle as it is the extended version of.
1939
1939
  */
1940
- onMoveChange: <T extends "start" | "move" | "end">(type: T, e: T extends "end" ? PointerEvent | undefined : PointerEvent, state: MoveState, forceRecalculateEdges: () => void,
1940
+ onMoveChange: <T extends "start" | "move" | "end">(type: T, e: T extends "end" | "start" ? PointerEvent | undefined : PointerEvent, state: MoveState, forceRecalculateEdges: () => void,
1941
1941
  /** Calls moveEnd with updateEdges: false. This can technically be called from "end", it should still work. */
1942
1942
  cancel: (e: PointerEvent | KeyboardEvent | undefined, state: MoveState) => void,
1943
1943
  /** Saves result to resolve moveStart promise, updates edges if you passed updateEdges then aborts the handler (only onMoveEnded will fire after) . Not available during "end" event. It's designed for resolving from other external evente (e.g. key events). */
@@ -2039,7 +2039,7 @@ export interface IActionHandler {
2039
2039
  * - onMoveApply(...) (IF moveEnd was called with apply: true, otherwise this is skipped)
2040
2040
  * - onMoveEnded() // do cleanup here, always called at the very end
2041
2041
  */
2042
- onMoveChange<T extends "start" | "move" | "end">(type: T, e: T extends "end" ? PointerEvent | undefined : PointerEvent, state: MoveState, forceRecalculateEdges: () => void,
2042
+ onMoveChange<T extends "start" | "move" | "end">(type: T, e: T extends "end" | "start" ? PointerEvent | undefined : PointerEvent, state: MoveState, forceRecalculateEdges: () => void,
2043
2043
  /** Calls moveEnd with apply: false. This can technically be called from "end", it should still work. */
2044
2044
  cancel: (e: PointerEvent | KeyboardEvent | undefined, state: MoveState) => void,
2045
2045
  /** Saves result to resolve moveStart promise, updates edges if you passed updateEdges then aborts the handler (only onMoveEnded will fire after) . Not available during "end" event. It's designed for resolving from other external evente (e.g. key events). */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@witchcraft/layout",
3
3
  "description": "Headless layout manager.",
4
- "version": "0.5.6",
4
+ "version": "0.5.8",
5
5
  "main": "./dist/runtime/index.js",
6
6
  "type": "module",
7
7
  "sideEffects": false,
package/src/module.ts CHANGED
@@ -35,6 +35,7 @@ export default defineNuxtModule<ModuleOptions>({
35
35
  addTemplate({
36
36
  filename: "witchcraft-layout.css",
37
37
  write: true,
38
+ // keep in sync with demo tailwind.css's relevant section
38
39
  getContents: () => [
39
40
  `@source "${resolve("runtime/components")}";`,
40
41
  // the drag actions handlers and utils they use add some styles
@@ -72,9 +72,9 @@ export function useFrames(
72
72
  )
73
73
 
74
74
  const moveHoveredFrame = computed(() => {
75
- if (isMoving.value) {
75
+ if (isMoving.value && movePoint.value) {
76
76
  for (const id of keys(frames.value)) {
77
- if (isPointInRect(frames.value[id], movePoint.value!)) {
77
+ if (isPointInRect(frames.value[id], movePoint.value)) {
78
78
  return frames.value[id]
79
79
  }
80
80
  }
@@ -161,7 +161,7 @@ export function useFrames(
161
161
  TContextMoveType extends TContext extends { moveType: infer M } ? M : never,
162
162
  TContextContext extends TContext extends { context: infer C } ? C : never
163
163
  >(
164
- e: PointerEvent,
164
+ e: PointerEvent | undefined,
165
165
  type: TContextMoveType extends never ? T : TContextMoveType,
166
166
  // someday this will work
167
167
  data: T extends "edge" ? EdgeMoveStartData : T extends "frame" ? FrameMoveStartData : undefined,
@@ -189,14 +189,16 @@ export function useFrames(
189
189
  controller = new AbortController()
190
190
  controller.signal.addEventListener("abort", () => resetState())
191
191
 
192
- e.preventDefault()
192
+ e?.preventDefault()
193
193
  window.addEventListener(moveEvent, onMove as EventListener, { signal: controller.signal })
194
194
  window.addEventListener(endEvent, moveEnd as EventListener, { signal: controller.signal })
195
195
 
196
- const point = toWindowCoord(win.value, e)
197
- movePoint.value = point
198
- moveStartPoint = { ...point }
199
- moveDirStore.update(point)
196
+ if (e) {
197
+ const point = toWindowCoord(win.value, e)
198
+ movePoint.value = point
199
+ moveStartPoint = { ...point }
200
+ moveDirStore.update(point)
201
+ }
200
202
  eventContext.value = context
201
203
 
202
204
  isMoving.value = type as any
@@ -5,6 +5,10 @@
5
5
 
6
6
  /* Only needed for the dev playground: the demo App.vue lives outside the Vite project root, so Tailwind's auto-scan doesn't find the [&.deco-...] classes it defines. */
7
7
  @source "../../../src/runtime/demo";
8
+ /* Only needed for the non-nuxt demo, makes sure classes are added even if .nuxt/witchcraft-layout.css is not generated or is outdated. Keep in sync with nuxt module list. */
9
+ @source "../../../src/runtime/move";
10
+ @source "../../../src/runtime/components";
11
+ @source "../../../src/runtime/utils/createSplitDecoShapes";
8
12
 
9
13
  button {
10
14
  cursor: pointer;
@@ -123,7 +123,7 @@ export class ActionHandler<
123
123
 
124
124
  onMoveChange<T extends "start" | "move" | "end">(
125
125
  type: T,
126
- e: T extends "end" ? PointerEvent | undefined : PointerEvent,
126
+ e: T extends "end" | "start" ? PointerEvent | undefined : PointerEvent,
127
127
  state: MoveState,
128
128
  forceRecalculateEdges: () => void,
129
129
  cancel: (e: PointerEvent | KeyboardEvent | undefined, state: MoveState) => void,
@@ -155,7 +155,7 @@ export class CloseAction implements IAction {
155
155
  _e: PointerEvent | undefined,
156
156
  state: MoveState
157
157
  ): ActionChangeResult {
158
- if (state.moveDistance <= this.minDragDistance) {
158
+ if (type === "end" || state.moveDistance <= this.minDragDistance) {
159
159
  return { updateEdges: false, shapes: [] }
160
160
  }
161
161
  const {
@@ -207,7 +207,7 @@ export class CloseAction implements IAction {
207
207
  const decos = this._getDecos(state)
208
208
  this.state.lastReturn = {
209
209
  updateEdges: !isMovingFromWindowEdge,
210
- shapes: type === "end" ? [] : decos.flatMap(_ => _.shapes)
210
+ shapes: decos.flatMap(_ => _.shapes)
211
211
  }
212
212
  return this.state.lastReturn
213
213
  }
@@ -155,7 +155,7 @@ export class FrameDragAction implements IAction {
155
155
  _e: PointerEvent | undefined,
156
156
  state: MoveState
157
157
  ): ActionChangeResult {
158
- if (state.moveDistance <= this.minDragDistance) {
158
+ if (type === "start" || state.moveDistance <= this.minDragDistance) {
159
159
  return { updateEdges: false, shapes: [], showMoving: false }
160
160
  }
161
161
  const { win, movingFrameId, moveHoveredFrame } = state
@@ -179,7 +179,7 @@ export class SplitAction implements IAction {
179
179
  state: MoveState
180
180
  ): ActionChangeResult {
181
181
  const { moveHoveredFrame, moveDistance } = state
182
- if (moveDistance <= this.minDragDistance) {
182
+ if (type === "end" || moveDistance <= this.minDragDistance) {
183
183
  return { updateEdges: false, shapes: [], showMoving: false }
184
184
  }
185
185
  let ok = false
@@ -205,7 +205,7 @@ export class SplitAction implements IAction {
205
205
  }
206
206
  this.state.lastReturn = {
207
207
  updateEdges: true,
208
- shapes: type === "end" ? [] : [errorDeco],
208
+ shapes: [errorDeco],
209
209
  showMoving: false
210
210
  }
211
211
  return this.state.lastReturn
@@ -213,7 +213,7 @@ export class SplitAction implements IAction {
213
213
  }
214
214
  this.state.lastReturn = {
215
215
  updateEdges: false,
216
- shapes: type === "end" ? [] : decos.flatMap(_ => _.shapes),
216
+ shapes: decos.flatMap(_ => _.shapes),
217
217
  showMoving: false
218
218
  }
219
219
  return this.state.lastReturn
@@ -552,7 +552,7 @@ export interface IAction {
552
552
  */
553
553
  onMoveChange: <T extends "start" | "move" | "end">(
554
554
  type: T,
555
- e: T extends "end" ? PointerEvent | undefined : PointerEvent,
555
+ e: T extends "end" | "start" ? PointerEvent | undefined : PointerEvent,
556
556
  state: MoveState,
557
557
  forceRecalculateEdges: () => void,
558
558
  /** Calls moveEnd with updateEdges: false. This can technically be called from "end", it should still work. */
@@ -665,7 +665,7 @@ export interface IActionHandler {
665
665
  */
666
666
  onMoveChange<T extends "start" | "move" | "end">(
667
667
  type: T,
668
- e: T extends "end" ? PointerEvent | undefined : PointerEvent,
668
+ e: T extends "end" | "start" ? PointerEvent | undefined : PointerEvent,
669
669
  state: MoveState,
670
670
  forceRecalculateEdges: () => void,
671
671
  /** Calls moveEnd with apply: false. This can technically be called from "end", it should still work. */