@witchcraft/layout 0.5.9 → 0.5.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.
@@ -1,5 +1,5 @@
1
1
  import type { ComputedRef, InjectionKey, Ref } from "vue";
2
- import type { Direction, Edge, FrameId, IActionHandler, IntersectionEntry, LayoutFrame, LayoutShape, LayoutWindow, MoveState, Orientation, Point } from "./index.js";
2
+ import type { Direction, Edge, EdgeMoveStartData, ExtendedMoveTypes, FrameId, FrameMoveStartData, IActionHandler, IntersectionEntry, LayoutFrame, LayoutShape, LayoutWindow, MoveState, Orientation, Point } from "./index.js";
3
3
  export type LayoutContext = ComputedRef<{
4
4
  /** The owning window, needed so we can correctly scale coordinates. */
5
5
  win: LayoutWindow;
@@ -9,23 +9,19 @@ export type LayoutContext = ComputedRef<{
9
9
  export declare const layoutContextInjectionKey: InjectionKey<LayoutContext>;
10
10
  export interface UseFramesContext {
11
11
  actionHandler: IActionHandler;
12
- moveStart: {
13
- (e: PointerEvent, type: "edge", data: {
14
- edge?: Edge;
15
- intersection?: IntersectionEntry;
16
- }, opts?: {
17
- moveEvent?: string;
18
- endEvent?: string;
19
- context?: Record<string, unknown>;
20
- }): Promise<any>;
21
- (e: PointerEvent, type: "frame", data: {
22
- frameId: FrameId;
23
- }, opts?: {
24
- moveEvent?: string;
25
- endEvent?: string;
26
- context?: Record<string, unknown>;
27
- }): Promise<any>;
28
- };
12
+ moveStart<T extends "edge" | "frame" | "other", TContextType extends keyof ExtendedMoveTypes, TContext extends ExtendedMoveTypes[TContextType], TContextReturn extends TContext extends {
13
+ resolve: infer R;
14
+ } ? R : never, TContextMoveType extends TContext extends {
15
+ moveType: infer M;
16
+ } ? M : never, TContextContext extends TContext extends {
17
+ context: infer C;
18
+ } ? C : never, TType extends [TContextMoveType] extends [never] ? T : TContextMoveType>(e: PointerEvent | undefined, type: TType, data: T extends "edge" ? EdgeMoveStartData : T extends "frame" ? FrameMoveStartData : undefined, opts?: {
19
+ moveEvent?: string;
20
+ endEvent?: string;
21
+ context?: {
22
+ type: TContextType;
23
+ } & TContextContext;
24
+ }): TContext extends never ? Promise<void> : Promise<TContextReturn>;
29
25
  onMove: (e: PointerEvent) => void;
30
26
  moveEnd: (e?: PointerEvent, options?: {
31
27
  apply?: boolean;
@@ -34,6 +30,7 @@ export interface UseFramesContext {
34
30
  moveDirections: Ref<Record<Orientation, Direction | undefined>>;
35
31
  movePoint: Ref<Point | undefined>;
36
32
  isMoving: Ref<false | "frame" | "edge" | "other">;
33
+ showMoving: Ref<boolean>;
37
34
  movingEdges: Ref<Edge[]>;
38
35
  movingIntersection: Ref<IntersectionEntry | undefined>;
39
36
  visualEdges: Ref<Edge[]>;
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.9",
4
+ "version": "0.5.10",
5
5
  "main": "./dist/runtime/index.js",
6
6
  "type": "module",
7
7
  "sideEffects": false,
@@ -28,7 +28,7 @@ import { useAttrs, inject } from "vue"
28
28
  import LayoutShapeRect from "./LayoutShapeRect.vue"
29
29
  import { type EdgeMoveStartData } from "../types/index.js"
30
30
  import { moveContextInjectionKey } from "../types/vue.js"
31
- import type { Edge, EdgeCss } from "../types/index.js"
31
+ import type { Edge, EdgeCss, UseFramesContext } from "../types/index.js"
32
32
 
33
33
  const $attrs = useAttrs()
34
34
 
@@ -39,7 +39,7 @@ defineOptions({
39
39
  const props = defineProps<{
40
40
  edge: Edge
41
41
  css: EdgeCss
42
- onPointerDown?: (e: PointerEvent, type: "edge", data: EdgeMoveStartData) => void
42
+ onPointerDown?: UseFramesContext["moveStart"]
43
43
  }>()
44
44
 
45
45
  const ctx = inject(layoutContextInjectionKey, undefined)
@@ -19,7 +19,7 @@
19
19
  edge: visualEdges[i],
20
20
  }">
21
21
  <LayoutDragEdgeVisible
22
- :edge="visualEdges[i]"
22
+ :edge="visualEdges[i]"
23
23
  :css="css.visible"
24
24
  />
25
25
  </slot>
@@ -20,9 +20,8 @@ import { twMerge } from "@witchcraft/ui/utils/twMerge"
20
20
  import LayoutShapeRect from "./LayoutShapeRect.vue"
21
21
 
22
22
  import { getIntersectionsCss } from "../helpers/getIntersectionsCss.js"
23
- import { type EdgeMoveStartData } from "../types/index.js"
24
23
  import { moveContextInjectionKey } from "../types/vue.js"
25
- import type { IntersectionEntry } from "../types/index.js"
24
+ import type { IntersectionEntry, UseFramesContext } from "../types/index.js"
26
25
 
27
26
  const $attrs = useAttrs()
28
27
 
@@ -33,7 +32,7 @@ defineOptions({
33
32
  const props = defineProps<{
34
33
  css: ReturnType<typeof getIntersectionsCss>[number]
35
34
  intersection: IntersectionEntry
36
- onPointerDown?: (e: PointerEvent, type: "edge", data: EdgeMoveStartData) => void
35
+ onPointerDown?: UseFramesContext["moveStart"]
37
36
  }>()
38
37
 
39
38
  const ctx = inject(layoutContextInjectionKey, undefined)
@@ -26,14 +26,15 @@ import type {
26
26
  LayoutWindow,
27
27
  MoveState,
28
28
  Orientation,
29
- Point
29
+ Point,
30
+ UseFramesContext
30
31
  } from "../types/index.js"
31
32
 
32
33
 
33
34
  export function useFrames(
34
35
  win: Ref<LayoutWindow>,
35
36
  handler: IActionHandler
36
- ) {
37
+ ): UseFramesContext {
37
38
  const movingEdges = ref<Edge[]>([])
38
39
 
39
40
  // each entry corresponds to the frames touching the corresponding dragging edge
@@ -153,16 +154,19 @@ export function useFrames(
153
154
  handler.onMoveEnded()
154
155
  }
155
156
 
157
+
156
158
  function moveStart<
157
159
  T extends "edge" | "frame" | "other",
158
160
  TContextType extends keyof ExtendedMoveTypes,
159
161
  TContext extends ExtendedMoveTypes[TContextType],
160
162
  TContextReturn extends TContext extends { resolve: infer R } ? R : never,
161
163
  TContextMoveType extends TContext extends { moveType: infer M } ? M : never,
162
- TContextContext extends TContext extends { context: infer C } ? C : never
164
+ TContextContext extends TContext extends { context: infer C } ? C : never,
165
+ // cursed https://github.com/microsoft/TypeScript/issues/23182
166
+ TType extends [TContextMoveType] extends [never] ? T : TContextMoveType
163
167
  >(
164
168
  e: PointerEvent | undefined,
165
- type: TContextMoveType extends never ? T : TContextMoveType,
169
+ type: TType,
166
170
  // someday this will work
167
171
  data: T extends "edge" ? EdgeMoveStartData : T extends "frame" ? FrameMoveStartData : undefined,
168
172
  {
@@ -1,7 +1,7 @@
1
1
  import type { ComputedRef, InjectionKey, Ref } from "vue"
2
2
 
3
3
  // eslint-disable-next-line no-restricted-imports
4
- import type { Direction, Edge, FrameId, IActionHandler, IntersectionEntry, LayoutFrame, LayoutShape, LayoutWindow, MoveState, Orientation, Point } from "./index.js"
4
+ import type { Direction, Edge, EdgeMoveStartData, ExtendedMoveTypes, FrameId, FrameMoveStartData, IActionHandler, IntersectionEntry, LayoutFrame, LayoutShape, LayoutWindow, MoveState, Orientation, Point } from "./index.js"
5
5
 
6
6
  export type LayoutContext = ComputedRef<
7
7
  & {
@@ -16,16 +16,35 @@ export const layoutContextInjectionKey = Symbol.for("@witchcraft/layout:context"
16
16
 
17
17
  export interface UseFramesContext {
18
18
  actionHandler: IActionHandler
19
- moveStart: {
20
- (e: PointerEvent, type: "edge", data: { edge?: Edge, intersection?: IntersectionEntry }, opts?: { moveEvent?: string, endEvent?: string, context?: Record<string, unknown> }): Promise<any>
21
- (e: PointerEvent, type: "frame", data: { frameId: FrameId }, opts?: { moveEvent?: string, endEvent?: string, context?: Record<string, unknown> }): Promise<any>
22
- }
19
+ moveStart<
20
+ T extends "edge" | "frame" | "other",
21
+ TContextType extends keyof ExtendedMoveTypes,
22
+ TContext extends ExtendedMoveTypes[TContextType],
23
+ TContextReturn extends TContext extends { resolve: infer R } ? R : never,
24
+ TContextMoveType extends TContext extends { moveType: infer M } ? M : never,
25
+ TContextContext extends TContext extends { context: infer C } ? C : never,
26
+ // cursed https://github.com/microsoft/TypeScript/issues/23182
27
+ TType extends [TContextMoveType] extends [never] ? T : TContextMoveType
28
+ >(
29
+ e: PointerEvent | undefined,
30
+ type: TType,
31
+ // someday this will work
32
+ data: T extends "edge" ? EdgeMoveStartData : T extends "frame" ? FrameMoveStartData : undefined,
33
+ opts?: {
34
+ moveEvent?: string
35
+ endEvent?: string
36
+ context?: { type: TContextType } & TContextContext
37
+ }
38
+ ): TContext extends never
39
+ ? Promise<void>
40
+ : Promise<TContextReturn>
23
41
  onMove: (e: PointerEvent) => void
24
42
  moveEnd: (e?: PointerEvent, options?: { apply?: boolean }) => void
25
43
  cancel: () => void
26
44
  moveDirections: Ref<Record<Orientation, Direction | undefined>>
27
45
  movePoint: Ref<Point | undefined>
28
46
  isMoving: Ref<false | "frame" | "edge" | "other">
47
+ showMoving: Ref<boolean>
29
48
  movingEdges: Ref<Edge[]>
30
49
  movingIntersection: Ref<IntersectionEntry | undefined>
31
50
  visualEdges: Ref<Edge[]>