@oh-just-another/state 0.58.0 → 0.59.0
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/CHANGELOG.md +67 -0
- package/README.md +76 -27
- package/dist/.tsbuildinfo +1 -1
- package/dist/actions/actionArrange.d.ts +13 -0
- package/dist/actions/actionArrange.d.ts.map +1 -0
- package/dist/actions/actionArrange.js +130 -0
- package/dist/actions/actionArrange.js.map +1 -0
- package/dist/actions/actionClipboard.d.ts +2 -0
- package/dist/actions/actionClipboard.d.ts.map +1 -1
- package/dist/actions/actionClipboard.js +27 -1
- package/dist/actions/actionClipboard.js.map +1 -1
- package/dist/actions/actionText.d.ts +5 -0
- package/dist/actions/actionText.d.ts.map +1 -0
- package/dist/actions/actionText.js +37 -0
- package/dist/actions/actionText.js.map +1 -0
- package/dist/actions/actionView.js +1 -1
- package/dist/actions/index.d.ts +3 -1
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +3 -1
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/registry.d.ts.map +1 -1
- package/dist/actions/registry.js +4 -0
- package/dist/actions/registry.js.map +1 -1
- package/dist/actions/types.d.ts +1 -1
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/actions/types.js.map +1 -1
- package/dist/auto-layout-scheduler.d.ts +1 -3
- package/dist/auto-layout-scheduler.d.ts.map +1 -1
- package/dist/auto-layout-scheduler.js +1 -2
- package/dist/auto-layout-scheduler.js.map +1 -1
- package/dist/built-in-handlers.d.ts.map +1 -1
- package/dist/built-in-handlers.js +14 -1
- package/dist/built-in-handlers.js.map +1 -1
- package/dist/constants.d.ts +48 -23
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +48 -23
- package/dist/constants.js.map +1 -1
- package/dist/dom-events.d.ts +7 -0
- package/dist/dom-events.d.ts.map +1 -1
- package/dist/dom-events.js +12 -0
- package/dist/dom-events.js.map +1 -1
- package/dist/editor/animation-scene.d.ts +21 -0
- package/dist/editor/animation-scene.d.ts.map +1 -0
- package/dist/editor/animation-scene.js +71 -0
- package/dist/editor/animation-scene.js.map +1 -0
- package/dist/editor/animation.d.ts +43 -0
- package/dist/editor/animation.d.ts.map +1 -0
- package/dist/editor/animation.js +80 -0
- package/dist/editor/animation.js.map +1 -0
- package/dist/editor/applies/arrange.d.ts +46 -0
- package/dist/editor/applies/arrange.d.ts.map +1 -0
- package/dist/editor/applies/arrange.js +162 -0
- package/dist/editor/applies/arrange.js.map +1 -0
- package/dist/editor/applies/edge.d.ts +8 -1
- package/dist/editor/applies/edge.d.ts.map +1 -1
- package/dist/editor/applies/edge.js +31 -1
- package/dist/editor/applies/edge.js.map +1 -1
- package/dist/editor/applies/move.d.ts +6 -0
- package/dist/editor/applies/move.d.ts.map +1 -1
- package/dist/editor/applies/move.js +6 -0
- package/dist/editor/applies/move.js.map +1 -1
- package/dist/editor/applies/resize.d.ts +26 -5
- package/dist/editor/applies/resize.d.ts.map +1 -1
- package/dist/editor/applies/resize.js +91 -13
- package/dist/editor/applies/resize.js.map +1 -1
- package/dist/editor/caret-blink.d.ts +18 -0
- package/dist/editor/caret-blink.d.ts.map +1 -0
- package/dist/editor/caret-blink.js +42 -0
- package/dist/editor/caret-blink.js.map +1 -0
- package/dist/editor/container-ops.d.ts.map +1 -1
- package/dist/editor/container-ops.js +2 -2
- package/dist/editor/container-ops.js.map +1 -1
- package/dist/editor/dirty-rect.d.ts +23 -0
- package/dist/editor/dirty-rect.d.ts.map +1 -0
- package/dist/editor/dirty-rect.js +115 -0
- package/dist/editor/dirty-rect.js.map +1 -0
- package/dist/editor/gif-playback.d.ts +45 -0
- package/dist/editor/gif-playback.d.ts.map +1 -0
- package/dist/editor/gif-playback.js +125 -0
- package/dist/editor/gif-playback.js.map +1 -0
- package/dist/editor/hit-test.d.ts +3 -3
- package/dist/editor/hit-test.d.ts.map +1 -1
- package/dist/editor/hit-test.js +40 -15
- package/dist/editor/hit-test.js.map +1 -1
- package/dist/editor/long-press.d.ts.map +1 -1
- package/dist/editor/long-press.js +2 -2
- package/dist/editor/long-press.js.map +1 -1
- package/dist/editor/pinch.d.ts.map +1 -1
- package/dist/editor/pinch.js +6 -6
- package/dist/editor/pinch.js.map +1 -1
- package/dist/editor/pointer-binding.d.ts.map +1 -1
- package/dist/editor/pointer-binding.js +42 -25
- package/dist/editor/pointer-binding.js.map +1 -1
- package/dist/editor/public/arrange-group.d.ts +3 -9
- package/dist/editor/public/arrange-group.d.ts.map +1 -1
- package/dist/editor/public/arrange-group.js +4 -6
- package/dist/editor/public/arrange-group.js.map +1 -1
- package/dist/editor/public/clipboard.d.ts +2 -4
- package/dist/editor/public/clipboard.d.ts.map +1 -1
- package/dist/editor/public/clipboard.js +2 -4
- package/dist/editor/public/clipboard.js.map +1 -1
- package/dist/editor/public/cursor.d.ts +43 -0
- package/dist/editor/public/cursor.d.ts.map +1 -0
- package/dist/editor/public/cursor.js +135 -0
- package/dist/editor/public/cursor.js.map +1 -0
- package/dist/editor/public/frame-name.d.ts +20 -0
- package/dist/editor/public/frame-name.d.ts.map +1 -0
- package/dist/editor/public/frame-name.js +54 -0
- package/dist/editor/public/frame-name.js.map +1 -0
- package/dist/editor/public/image-insert.d.ts +1 -1
- package/dist/editor/public/image-insert.d.ts.map +1 -1
- package/dist/editor/public/layers.d.ts.map +1 -1
- package/dist/editor/public/layers.js +2 -2
- package/dist/editor/public/layers.js.map +1 -1
- package/dist/editor/public/link.d.ts +11 -2
- package/dist/editor/public/link.d.ts.map +1 -1
- package/dist/editor/public/link.js +70 -2
- package/dist/editor/public/link.js.map +1 -1
- package/dist/editor/public/placement.d.ts +60 -2
- package/dist/editor/public/placement.d.ts.map +1 -1
- package/dist/editor/public/placement.js +185 -2
- package/dist/editor/public/placement.js.map +1 -1
- package/dist/editor/public/selection-ops.d.ts +23 -1
- package/dist/editor/public/selection-ops.d.ts.map +1 -1
- package/dist/editor/public/selection-ops.js +79 -2
- package/dist/editor/public/selection-ops.js.map +1 -1
- package/dist/editor/public/text-edit.d.ts +1 -10
- package/dist/editor/public/text-edit.d.ts.map +1 -1
- package/dist/editor/public/text-edit.js +2 -16
- package/dist/editor/public/text-edit.js.map +1 -1
- package/dist/editor/public/z-order.d.ts.map +1 -1
- package/dist/editor/public/z-order.js +4 -4
- package/dist/editor/public/z-order.js.map +1 -1
- package/dist/editor/public/zoom-pan.d.ts +6 -4
- package/dist/editor/public/zoom-pan.d.ts.map +1 -1
- package/dist/editor/public/zoom-pan.js +8 -7
- package/dist/editor/public/zoom-pan.js.map +1 -1
- package/dist/editor/render-orchestrator.d.ts.map +1 -1
- package/dist/editor/render-orchestrator.js +4 -9
- package/dist/editor/render-orchestrator.js.map +1 -1
- package/dist/editor/resize-helpers.d.ts +21 -5
- package/dist/editor/resize-helpers.d.ts.map +1 -1
- package/dist/editor/resize-helpers.js +59 -19
- package/dist/editor/resize-helpers.js.map +1 -1
- package/dist/editor/viewport-helpers.d.ts.map +1 -1
- package/dist/editor/viewport-helpers.js +3 -3
- package/dist/editor/viewport-helpers.js.map +1 -1
- package/dist/editor-events.d.ts +1 -1
- package/dist/editor-events.d.ts.map +1 -1
- package/dist/editor.d.ts +125 -133
- package/dist/editor.d.ts.map +1 -1
- package/dist/editor.js +351 -989
- package/dist/editor.js.map +1 -1
- package/dist/file-drop.d.ts.map +1 -1
- package/dist/file-drop.js +1 -2
- package/dist/file-drop.js.map +1 -1
- package/dist/frame-helpers.d.ts.map +1 -1
- package/dist/frame-helpers.js +5 -5
- package/dist/frame-helpers.js.map +1 -1
- package/dist/group-helpers.d.ts.map +1 -1
- package/dist/group-helpers.js +4 -4
- package/dist/group-helpers.js.map +1 -1
- package/dist/handle.d.ts +61 -6
- package/dist/handle.d.ts.map +1 -1
- package/dist/handle.js +105 -7
- package/dist/handle.js.map +1 -1
- package/dist/hotkeys-binding.d.ts +26 -0
- package/dist/hotkeys-binding.d.ts.map +1 -0
- package/dist/hotkeys-binding.js +35 -0
- package/dist/hotkeys-binding.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/link-selection.d.ts +3 -5
- package/dist/link-selection.d.ts.map +1 -1
- package/dist/link-selection.js +3 -12
- package/dist/link-selection.js.map +1 -1
- package/dist/machine.d.ts +27 -1
- package/dist/machine.d.ts.map +1 -1
- package/dist/machine.js +38 -0
- package/dist/machine.js.map +1 -1
- package/dist/overlay.d.ts +1 -4
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +136 -36
- package/dist/overlay.js.map +1 -1
- package/dist/selection.d.ts.map +1 -1
- package/dist/selection.js +2 -10
- package/dist/selection.js.map +1 -1
- package/dist/util.d.ts +8 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +17 -0
- package/dist/util.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { CARET_BLINK_INTERVAL_MS } from "../constants.js";
|
|
2
|
+
/**
|
|
3
|
+
* Owns the text-edit caret blink (solid/clear toggle on a DOM interval).
|
|
4
|
+
* Extracted from the Editor god-class. `onTick` is the Editor's `notify` so a
|
|
5
|
+
* blink repaints the overlay; the controller never touches the scene.
|
|
6
|
+
*/
|
|
7
|
+
export class CaretBlinkController {
|
|
8
|
+
onTick;
|
|
9
|
+
_on = true;
|
|
10
|
+
timer = null;
|
|
11
|
+
constructor(onTick) {
|
|
12
|
+
this.onTick = onTick;
|
|
13
|
+
}
|
|
14
|
+
get on() {
|
|
15
|
+
return this._on;
|
|
16
|
+
}
|
|
17
|
+
/** Restart blinking from a solid caret. */
|
|
18
|
+
start() {
|
|
19
|
+
this._on = true;
|
|
20
|
+
this.stop();
|
|
21
|
+
// Only run the blink when a DOM clock exists (browser host). Node test
|
|
22
|
+
// envs construct the editor without a window — skip so a dangling interval
|
|
23
|
+
// can't keep the process alive.
|
|
24
|
+
if (typeof window === "undefined")
|
|
25
|
+
return;
|
|
26
|
+
this.timer = setInterval(() => {
|
|
27
|
+
this._on = !this._on;
|
|
28
|
+
this.onTick();
|
|
29
|
+
}, CARET_BLINK_INTERVAL_MS);
|
|
30
|
+
}
|
|
31
|
+
stop() {
|
|
32
|
+
if (this.timer !== null) {
|
|
33
|
+
clearInterval(this.timer);
|
|
34
|
+
this.timer = null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Reset the caret to solid (called on type / move so it never blinks off mid-action). */
|
|
38
|
+
wake() {
|
|
39
|
+
this._on = true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=caret-blink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caret-blink.js","sourceRoot":"","sources":["../../src/editor/caret-blink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IAIF;IAHrB,GAAG,GAAG,IAAI,CAAC;IACX,KAAK,GAA0C,IAAI,CAAC;IAE5D,YAA6B,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;IAAG,CAAC;IAEnD,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,2CAA2C;IAC3C,KAAK;QACH,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,uEAAuE;QACvE,2EAA2E;QAC3E,gCAAgC;QAChC,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;YACrB,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC,EAAE,uBAAuB,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,0FAA0F;IAC1F,IAAI;QACF,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container-ops.d.ts","sourceRoot":"","sources":["../../src/editor/container-ops.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"container-ops.d.ts","sourceRoot":"","sources":["../../src/editor/container-ops.ts"],"names":[],"mappings":"AAAA,OAAO,EAaL,KAAK,KAAK,EACV,KAAK,OAAO,EACZ,KAAK,KAAK,EACX,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG7C;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,EAAE,MAAM,MAAM,KAAG,MAW3D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,KAAK,EAAE,aAAa,SAAS,KAAG,MAAM,GAAG,IAQlF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,GACnC,OAAO,KAAK,EACZ,OAAO,OAAO,EACd,KAAK,MAAM,EACX,QAAQ,QAAQ,KACf,MAmDF,CAAC;AAsCF;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3D,+EAA+E;IAC/E,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;CAClD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kBAAkB,GAAI,KAAK,eAAe,EAAE,aAAa,OAAO,KAAG,IA0D/E,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAC7B,KAAK,eAAe,EACpB,aAAa,SAAS,EACtB,SAAS,SAAS,KACjB,IA+CF,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { containerSizeForZone, expandDropZoneToFit, getAutoLayoutSpec, getContainerSpec, getDropZoneWorld, getElement, getElementWorldBounds, isContainer, measureWrap, orderForTop, updateElement, } from "@oh-just-another/scene";
|
|
1
|
+
import { containerSizeForZone, expandDropZoneToFit, getAutoLayoutSpec, getContainerSpec, getDropZoneWorld, getElement, getElementWorldBounds, isContainer, isGroup, measureWrap, orderForTop, updateElement, } from "@oh-just-another/scene";
|
|
2
2
|
import { bounds as B } from "@oh-just-another/math";
|
|
3
3
|
import { CONTAINER_KEEP_THRESHOLD } from "../constants.js";
|
|
4
4
|
import { hasWidthHeight } from "./shape-traits.js";
|
|
@@ -189,7 +189,7 @@ export const applyContainerDrop = (ref, _worldPoint) => {
|
|
|
189
189
|
// not spatial containers. The drag-out / coverage logic is for
|
|
190
190
|
// proper containers (swimlane, frame, template); a group child
|
|
191
191
|
// must stay parented to its group regardless of its world bounds.
|
|
192
|
-
if (parent
|
|
192
|
+
if (parent !== undefined && isGroup(parent))
|
|
193
193
|
return;
|
|
194
194
|
// hover = null: cursor left the parent's zone, but the child
|
|
195
195
|
// itself may still be mostly inside. Coverage check decides:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container-ops.js","sourceRoot":"","sources":["../../src/editor/container-ops.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"container-ops.js","sourceRoot":"","sources":["../../src/editor/container-ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Bounds, ElementId } from "@oh-just-another/types";
|
|
2
|
+
import { type Scene } from "@oh-just-another/scene";
|
|
3
|
+
/** Per-element before/after render bounds for the tile-cache invalidation pass. */
|
|
4
|
+
export interface TileDirtyEntry {
|
|
5
|
+
readonly before: Bounds | null;
|
|
6
|
+
readonly after: Bounds | null;
|
|
7
|
+
}
|
|
8
|
+
/** Result of {@link computeSceneDirtyRect}. */
|
|
9
|
+
export interface SceneDirtyRect {
|
|
10
|
+
/** World dirty rect, or the empty off-screen sentinel when nothing changed. */
|
|
11
|
+
readonly world: Bounds;
|
|
12
|
+
/** Changed-element render bounds (before/after) for the tile-cache path. */
|
|
13
|
+
readonly tileDirty: ReadonlyMap<ElementId, TileDirtyEntry>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Diff two scenes into the world rect that needs repainting, plus per-element
|
|
17
|
+
* before/after render bounds for tile-cache invalidation. Pure in the two
|
|
18
|
+
* scenes — the caller applies the gesture / viewport / layer guards before
|
|
19
|
+
* calling this and decides whether to use `tileDirty`. Returns the empty
|
|
20
|
+
* off-screen rect when nothing changed.
|
|
21
|
+
*/
|
|
22
|
+
export declare const computeSceneDirtyRect: (prev: Scene, next: Scene) => SceneDirtyRect;
|
|
23
|
+
//# sourceMappingURL=dirty-rect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dirty-rect.d.ts","sourceRoot":"","sources":["../../src/editor/dirty-rect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAIL,KAAK,KAAK,EACX,MAAM,wBAAwB,CAAC;AAGhC,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,+CAA+C;AAC/C,MAAM,WAAW,cAAc;IAC7B,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;CAC5D;AAWD;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAAI,MAAM,KAAK,EAAE,MAAM,KAAK,KAAG,cA4FhE,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { bounds as B } from "@oh-just-another/math";
|
|
2
|
+
import { getElementRenderBounds, getElementWorldBounds, } from "@oh-just-another/scene";
|
|
3
|
+
import { computeLinkWorldBounds } from "@oh-just-another/renderer-core";
|
|
4
|
+
/**
|
|
5
|
+
* Empty off-screen rect: renderScene's dirty filter culls every shape against
|
|
6
|
+
* it, making the main pass a no-op.
|
|
7
|
+
*/
|
|
8
|
+
const EMPTY_DIRTY = { x: -1e9, y: -1e9, width: 0, height: 0 };
|
|
9
|
+
/** World-space inflation to cover anti-aliased stroke fuzz around edges. */
|
|
10
|
+
const DIRTY_INFLATE_PX = 4;
|
|
11
|
+
/**
|
|
12
|
+
* Diff two scenes into the world rect that needs repainting, plus per-element
|
|
13
|
+
* before/after render bounds for tile-cache invalidation. Pure in the two
|
|
14
|
+
* scenes — the caller applies the gesture / viewport / layer guards before
|
|
15
|
+
* calling this and decides whether to use `tileDirty`. Returns the empty
|
|
16
|
+
* off-screen rect when nothing changed.
|
|
17
|
+
*/
|
|
18
|
+
export const computeSceneDirtyRect = (prev, next) => {
|
|
19
|
+
const tileDirty = new Map();
|
|
20
|
+
if (prev === next)
|
|
21
|
+
return { world: EMPTY_DIRTY, tileDirty };
|
|
22
|
+
let acc = null;
|
|
23
|
+
const add = (b) => {
|
|
24
|
+
acc = acc ? B.union(acc, b) : b;
|
|
25
|
+
};
|
|
26
|
+
// Track shapes that changed (added / removed / mutated). Links attached to
|
|
27
|
+
// any of these have stale rendered paths even when the edge object itself is
|
|
28
|
+
// reference-equal — the path resolves through the shape's new position, but
|
|
29
|
+
// the old path stays on screen as a "ghost" trail unless invalidated.
|
|
30
|
+
const changedElementIds = new Set();
|
|
31
|
+
for (const [id, shape] of next.elements) {
|
|
32
|
+
const old = prev.elements.get(id);
|
|
33
|
+
if (old === shape)
|
|
34
|
+
continue;
|
|
35
|
+
changedElementIds.add(id);
|
|
36
|
+
// Render bounds (not geometric) so overpaint — a frame's header strip,
|
|
37
|
+
// confetti particles — is cleared too, no ghost trail.
|
|
38
|
+
const afterBounds = getElementRenderBounds(shape);
|
|
39
|
+
const beforeBounds = old ? getElementRenderBounds(old) : null;
|
|
40
|
+
add(afterBounds);
|
|
41
|
+
if (beforeBounds)
|
|
42
|
+
add(beforeBounds);
|
|
43
|
+
// before/after pair covers add + move; pure mutation re-uses afterBounds.
|
|
44
|
+
tileDirty.set(id, { before: beforeBounds, after: afterBounds });
|
|
45
|
+
}
|
|
46
|
+
for (const [id, shape] of prev.elements) {
|
|
47
|
+
if (!next.elements.has(id)) {
|
|
48
|
+
changedElementIds.add(id);
|
|
49
|
+
// Render bounds so a removed frame / confetti clears its overpaint.
|
|
50
|
+
const beforeBounds = getElementRenderBounds(shape);
|
|
51
|
+
add(beforeBounds);
|
|
52
|
+
tileDirty.set(id, { before: beforeBounds, after: null });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const linkTouchesChangedElement = (edge) => {
|
|
56
|
+
for (const ep of [edge.from, edge.to]) {
|
|
57
|
+
if (ep.kind !== "point" && changedElementIds.has(ep.elementId))
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
};
|
|
62
|
+
for (const [id, edge] of next.links) {
|
|
63
|
+
const old = prev.links.get(id);
|
|
64
|
+
// Refresh edge dirty-rect when the edge object changed, OR an endpoint
|
|
65
|
+
// references a shape that moved this frame (path re-resolves every render
|
|
66
|
+
// but the old screen pixels persist).
|
|
67
|
+
if (old === edge && !linkTouchesChangedElement(edge))
|
|
68
|
+
continue;
|
|
69
|
+
const b = computeLinkWorldBounds(next, edge);
|
|
70
|
+
if (b)
|
|
71
|
+
add(b);
|
|
72
|
+
const oldLink = old ?? edge; // prev scene resolves with prev shapes for ghost-clear
|
|
73
|
+
const ob = computeLinkWorldBounds(prev, oldLink);
|
|
74
|
+
if (ob)
|
|
75
|
+
add(ob);
|
|
76
|
+
}
|
|
77
|
+
for (const [id, edge] of prev.links) {
|
|
78
|
+
if (!next.links.has(id)) {
|
|
79
|
+
const b = computeLinkWorldBounds(prev, edge);
|
|
80
|
+
if (b)
|
|
81
|
+
add(b);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- `acc` is mutated via the `add` closure; TS flow analysis can't see it and narrows to null
|
|
85
|
+
if (acc === null)
|
|
86
|
+
return { world: EMPTY_DIRTY, tileDirty };
|
|
87
|
+
// Transitive expansion: any shape whose bounds intersect the dirty rect must
|
|
88
|
+
// be repainted, AND its bounds added so a shape ABOVE it that overlaps gets
|
|
89
|
+
// included too. Repeat until the set stabilises — otherwise dragging A
|
|
90
|
+
// through a B/C stack lets C (above B, partially overlapping) re-emerge.
|
|
91
|
+
const visited = new Set();
|
|
92
|
+
let expanded = acc;
|
|
93
|
+
let grew = true;
|
|
94
|
+
while (grew) {
|
|
95
|
+
grew = false;
|
|
96
|
+
for (const shape of next.elements.values()) {
|
|
97
|
+
if (visited.has(shape.id))
|
|
98
|
+
continue;
|
|
99
|
+
const bb = getElementWorldBounds(shape);
|
|
100
|
+
if (!B.intersects(bb, expanded))
|
|
101
|
+
continue;
|
|
102
|
+
visited.add(shape.id);
|
|
103
|
+
const merged = B.union(expanded, bb);
|
|
104
|
+
if (merged.x !== expanded.x ||
|
|
105
|
+
merged.y !== expanded.y ||
|
|
106
|
+
merged.width !== expanded.width ||
|
|
107
|
+
merged.height !== expanded.height) {
|
|
108
|
+
expanded = merged;
|
|
109
|
+
grew = true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return { world: B.expand(expanded, DIRTY_INFLATE_PX), tileDirty };
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=dirty-rect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dirty-rect.js","sourceRoot":"","sources":["../../src/editor/dirty-rect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ElementId } from "@oh-just-another/types";
|
|
2
|
+
/**
|
|
3
|
+
* Owns per-shape GIF playback state (auto-stop + reduced-motion). Extracted
|
|
4
|
+
* from the Editor god-class: the controller is the state machine, while the
|
|
5
|
+
* Editor keeps the orchestration (scene iteration, animation tick, render
|
|
6
|
+
* scheduling) and delegates every state read/write here.
|
|
7
|
+
*/
|
|
8
|
+
export declare class GifPlaybackController {
|
|
9
|
+
private readonly state;
|
|
10
|
+
/** Element id currently hovered — a hovered heavy GIF keeps playing
|
|
11
|
+
* (its auto-stop timer is held off). Set by the pointer hover path. */
|
|
12
|
+
private hoveredId;
|
|
13
|
+
/**
|
|
14
|
+
* Seed playback for a freshly-animated shape. Start paused (frozen on
|
|
15
|
+
* frame 0) when the user prefers reduced motion; playing otherwise.
|
|
16
|
+
*/
|
|
17
|
+
ensure(id: ElementId): void;
|
|
18
|
+
/** Playback timestamp fed to the renderer's animation clock for a shape:
|
|
19
|
+
* wall-clock when unmanaged, play offset when playing, the frozen frame
|
|
20
|
+
* when paused. */
|
|
21
|
+
clock(id: ElementId): number;
|
|
22
|
+
/**
|
|
23
|
+
* Toggle GIF playback for a shape — wired to a click on an animated image
|
|
24
|
+
* (resume after auto-stop, play after reduced-motion). Resuming continues
|
|
25
|
+
* from the frozen frame.
|
|
26
|
+
*/
|
|
27
|
+
toggle(id: ElementId): void;
|
|
28
|
+
/**
|
|
29
|
+
* Hover entered an animated shape: resume it if paused and hold off its
|
|
30
|
+
* auto-stop timer while the pointer stays over it. Pass `null` when the
|
|
31
|
+
* pointer leaves all shapes. Returns true when a paused shape was resumed,
|
|
32
|
+
* so the caller can re-arm the animation tick and schedule a render.
|
|
33
|
+
*/
|
|
34
|
+
hoverEnter(id: ElementId | null): boolean;
|
|
35
|
+
/** True when the shape's GIF is paused (drives the overlay badge). */
|
|
36
|
+
isPaused(id: ElementId): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Freeze heavy GIFs after `GIF_AUTOSTOP_MS` of continuous play. The caller
|
|
39
|
+
* passes the ids of animated image shapes classified as "heavy"; light GIFs
|
|
40
|
+
* loop forever and are never passed in. A hovered heavy GIF keeps playing —
|
|
41
|
+
* its timer is pushed forward so it never auto-stops under the pointer.
|
|
42
|
+
*/
|
|
43
|
+
autoStopHeavy(heavyIds: Iterable<ElementId>): void;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=gif-playback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gif-playback.d.ts","sourceRoot":"","sources":["../../src/editor/gif-playback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AA+BxD;;;;;GAKG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;IAE7D;4EACwE;IACxE,OAAO,CAAC,SAAS,CAA0B;IAE3C;;;OAGG;IACH,MAAM,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI;IAW3B;;uBAEmB;IACnB,KAAK,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM;IAO5B;;;;OAIG;IACH,MAAM,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI;IAmB3B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO;IAezC,sEAAsE;IACtE,QAAQ,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO;IAIhC;;;;;OAKG;IACH,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI;CAenD"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { GIF_AUTOSTOP_MS } from "../constants.js";
|
|
2
|
+
function nowMs() {
|
|
3
|
+
return typeof performance !== "undefined" ? performance.now() : Date.now();
|
|
4
|
+
}
|
|
5
|
+
function prefersReducedMotion() {
|
|
6
|
+
if (typeof matchMedia !== "function")
|
|
7
|
+
return false;
|
|
8
|
+
try {
|
|
9
|
+
return matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Owns per-shape GIF playback state (auto-stop + reduced-motion). Extracted
|
|
17
|
+
* from the Editor god-class: the controller is the state machine, while the
|
|
18
|
+
* Editor keeps the orchestration (scene iteration, animation tick, render
|
|
19
|
+
* scheduling) and delegates every state read/write here.
|
|
20
|
+
*/
|
|
21
|
+
export class GifPlaybackController {
|
|
22
|
+
state = new Map();
|
|
23
|
+
/** Element id currently hovered — a hovered heavy GIF keeps playing
|
|
24
|
+
* (its auto-stop timer is held off). Set by the pointer hover path. */
|
|
25
|
+
hoveredId = null;
|
|
26
|
+
/**
|
|
27
|
+
* Seed playback for a freshly-animated shape. Start paused (frozen on
|
|
28
|
+
* frame 0) when the user prefers reduced motion; playing otherwise.
|
|
29
|
+
*/
|
|
30
|
+
ensure(id) {
|
|
31
|
+
if (this.state.has(id))
|
|
32
|
+
return;
|
|
33
|
+
const now = nowMs();
|
|
34
|
+
this.state.set(id, {
|
|
35
|
+
playing: !prefersReducedMotion(),
|
|
36
|
+
originMs: now,
|
|
37
|
+
playStartMs: now,
|
|
38
|
+
frozenMs: 0,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Playback timestamp fed to the renderer's animation clock for a shape:
|
|
42
|
+
* wall-clock when unmanaged, play offset when playing, the frozen frame
|
|
43
|
+
* when paused. */
|
|
44
|
+
clock(id) {
|
|
45
|
+
const st = this.state.get(id);
|
|
46
|
+
const now = nowMs();
|
|
47
|
+
if (!st)
|
|
48
|
+
return now;
|
|
49
|
+
return st.playing ? now - st.originMs : st.frozenMs;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Toggle GIF playback for a shape — wired to a click on an animated image
|
|
53
|
+
* (resume after auto-stop, play after reduced-motion). Resuming continues
|
|
54
|
+
* from the frozen frame.
|
|
55
|
+
*/
|
|
56
|
+
toggle(id) {
|
|
57
|
+
const now = nowMs();
|
|
58
|
+
const st = this.state.get(id);
|
|
59
|
+
if (!st) {
|
|
60
|
+
this.state.set(id, { playing: true, originMs: now, playStartMs: now, frozenMs: 0 });
|
|
61
|
+
}
|
|
62
|
+
else if (st.playing) {
|
|
63
|
+
st.frozenMs = now - st.originMs;
|
|
64
|
+
st.playing = false;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Resume from the frozen frame AND restart the auto-stop timer,
|
|
68
|
+
// otherwise a heavy GIF (frozen past GIF_AUTOSTOP_MS) would re-trip
|
|
69
|
+
// auto-stop on the very next tick — playing one frame then freezing
|
|
70
|
+
// again.
|
|
71
|
+
st.originMs = now - st.frozenMs;
|
|
72
|
+
st.playStartMs = now;
|
|
73
|
+
st.playing = true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Hover entered an animated shape: resume it if paused and hold off its
|
|
78
|
+
* auto-stop timer while the pointer stays over it. Pass `null` when the
|
|
79
|
+
* pointer leaves all shapes. Returns true when a paused shape was resumed,
|
|
80
|
+
* so the caller can re-arm the animation tick and schedule a render.
|
|
81
|
+
*/
|
|
82
|
+
hoverEnter(id) {
|
|
83
|
+
if (this.hoveredId === id)
|
|
84
|
+
return false;
|
|
85
|
+
this.hoveredId = id;
|
|
86
|
+
if (id === null)
|
|
87
|
+
return false;
|
|
88
|
+
const st = this.state.get(id);
|
|
89
|
+
if (st && !st.playing) {
|
|
90
|
+
const now = nowMs();
|
|
91
|
+
st.originMs = now - st.frozenMs;
|
|
92
|
+
st.playStartMs = now;
|
|
93
|
+
st.playing = true;
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
/** True when the shape's GIF is paused (drives the overlay badge). */
|
|
99
|
+
isPaused(id) {
|
|
100
|
+
return this.state.get(id)?.playing === false;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Freeze heavy GIFs after `GIF_AUTOSTOP_MS` of continuous play. The caller
|
|
104
|
+
* passes the ids of animated image shapes classified as "heavy"; light GIFs
|
|
105
|
+
* loop forever and are never passed in. A hovered heavy GIF keeps playing —
|
|
106
|
+
* its timer is pushed forward so it never auto-stops under the pointer.
|
|
107
|
+
*/
|
|
108
|
+
autoStopHeavy(heavyIds) {
|
|
109
|
+
const now = nowMs();
|
|
110
|
+
for (const id of heavyIds) {
|
|
111
|
+
const st = this.state.get(id);
|
|
112
|
+
if (!st?.playing)
|
|
113
|
+
continue;
|
|
114
|
+
if (id === this.hoveredId) {
|
|
115
|
+
st.playStartMs = now;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (now - st.playStartMs > GIF_AUTOSTOP_MS) {
|
|
119
|
+
st.frozenMs = now - st.originMs;
|
|
120
|
+
st.playing = false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=gif-playback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gif-playback.js","sourceRoot":"","sources":["../../src/editor/gif-playback.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,9 +46,9 @@ export declare const pickPressTarget: (worldPoint: Vec2, ctx: HitTestContext) =>
|
|
|
46
46
|
/**
|
|
47
47
|
* Minimal slice of the selected link's handle geometry the debug viz
|
|
48
48
|
* needs — endpoints plus the bend / segment handle world positions the
|
|
49
|
-
* orchestrator already computed for the real overlay.
|
|
50
|
-
*
|
|
51
|
-
*
|
|
49
|
+
* orchestrator already computed for the real overlay. Redeclared rather
|
|
50
|
+
* than imported from the overlay so this module stays free of a runtime
|
|
51
|
+
* cycle with it.
|
|
52
52
|
*/
|
|
53
53
|
export interface HitZoneEdge {
|
|
54
54
|
readonly from: Vec2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hit-test.d.ts","sourceRoot":"","sources":["../../src/editor/hit-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,KAAK,EACV,KAAK,OAAO,EACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EACV,YAAY,EACZ,MAAM,EACN,OAAO,EACP,MAAM,EACN,SAAS,EACT,SAAS,EACT,IAAI,EACL,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"hit-test.d.ts","sourceRoot":"","sources":["../../src/editor/hit-test.ts"],"names":[],"mappings":"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"}
|
package/dist/editor/hit-test.js
CHANGED
|
@@ -1,18 +1,11 @@
|
|
|
1
1
|
import { findLinkAt, getAnnotationWorldPosition, getLink, getLinkPath, getElementWorldBounds, } from "@oh-just-another/scene";
|
|
2
|
-
import { matrix } from "@oh-just-another/math";
|
|
3
|
-
import { ALL_HANDLES, CORNER_HANDLES, HANDLE_HIT_SLOP, handlePosition, hitHandle, } from "../handle.js";
|
|
2
|
+
import { matrix, vec2 } from "@oh-just-another/math";
|
|
3
|
+
import { ALL_HANDLES, CORNER_HANDLES, HANDLE_HIT_SLOP, frameCenter, handlePosition, hitHandle, hitHandleOnFrame, hitRotateGrip, rotateGripForBounds, rotateGripWorld, shapeSelectionFrame, } from "../handle.js";
|
|
4
4
|
import { isResizable, resizeHandlesFor } from "./shape-traits.js";
|
|
5
5
|
import { anchorOverlayPoints } from "./anchor-points.js";
|
|
6
6
|
import { ANCHOR_DOT_ACTIVE_RADIUS, ANCHOR_DOT_CLICK_RADIUS, ANCHOR_START_HIT_SLOP, ANNOTATION_PIN_HIT_SLOP, DEBUG_HIT_ZONE_FILL_OPACITY, DEBUG_HIT_ZONE_STROKE_OPACITY, DEBUG_ZONE_ANCHOR_START, DEBUG_ZONE_ANNOTATION, DEBUG_ZONE_ATTACH_BODY, DEBUG_ZONE_ATTACH_EDGE, DEBUG_ZONE_ATTACH_POINT, DEBUG_ZONE_CONTAINER, DEBUG_ZONE_FRAME, DEBUG_ZONE_LINK_BODY, DEBUG_ZONE_LINK_HANDLE, DEBUG_ZONE_RESIZE, LINK_ENDPOINT_HANDLE_RADIUS, LINK_HIT_THRESHOLD, LINK_START_ANCHOR_OUTSET, } from "../constants.js";
|
|
7
7
|
import { getElement } from "@oh-just-another/scene";
|
|
8
|
-
|
|
9
|
-
const distanceTo = (a, b) => Math.hypot(a.x - b.x, a.y - b.y);
|
|
10
|
-
/** Index-access helper: throws on out-of-range instead of returning `undefined`. */
|
|
11
|
-
const req = (v) => {
|
|
12
|
-
if (v === undefined)
|
|
13
|
-
throw new Error("packages/state: index out of range");
|
|
14
|
-
return v;
|
|
15
|
-
};
|
|
8
|
+
import { req } from "../util.js";
|
|
16
9
|
/**
|
|
17
10
|
* Resolve the press target under the cursor — annotation pin →
|
|
18
11
|
* group resize handles → single-shape resize handles → edge
|
|
@@ -72,10 +65,42 @@ export const pickPressTarget = (worldPoint, ctx) => {
|
|
|
72
65
|
continue;
|
|
73
66
|
if (shape.locked === true)
|
|
74
67
|
continue; // locked: no resize handles
|
|
75
|
-
|
|
76
|
-
|
|
68
|
+
// Oriented frame so the handles turn with a rotated shape; for an
|
|
69
|
+
// unrotated shape the frame's bounds equal its world AABB exactly.
|
|
70
|
+
const frame = shapeSelectionFrame(shape);
|
|
71
|
+
const handle = hitHandleOnFrame(worldPoint, frame, zoom, ctx.handleHitSlop, resizeHandlesFor(shape));
|
|
77
72
|
if (handle) {
|
|
78
|
-
return { kind: "handle", elementId: id, handle, bounds };
|
|
73
|
+
return { kind: "handle", elementId: id, handle, bounds: frame.bounds };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// 1c. Rotate grip — floats above the selection (group bbox, or a single
|
|
78
|
+
// resizable shape's AABB). It sits further out than the resize handles,
|
|
79
|
+
// and is checked before the element pick so grabbing it always rotates
|
|
80
|
+
// rather than selecting a shape behind it.
|
|
81
|
+
const groupRotateBounds = useGroupHandles ? ctx.combinedSelectionBounds() : null;
|
|
82
|
+
if (groupRotateBounds) {
|
|
83
|
+
const grip = rotateGripForBounds(groupRotateBounds, zoom);
|
|
84
|
+
if (hitRotateGrip(worldPoint, grip, zoom, ctx.handleHitSlop)) {
|
|
85
|
+
return {
|
|
86
|
+
kind: "rotate-handle",
|
|
87
|
+
pivot: {
|
|
88
|
+
x: groupRotateBounds.x + groupRotateBounds.width / 2,
|
|
89
|
+
y: groupRotateBounds.y + groupRotateBounds.height / 2,
|
|
90
|
+
},
|
|
91
|
+
bounds: groupRotateBounds,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else if (ctx.selection.size === 1) {
|
|
96
|
+
for (const id of ctx.selection) {
|
|
97
|
+
const shape = getElement(ctx.scene, id);
|
|
98
|
+
if (!shape || !isResizable(shape) || shape.locked === true)
|
|
99
|
+
continue;
|
|
100
|
+
const grip = rotateGripWorld(shape, zoom);
|
|
101
|
+
if (hitRotateGrip(worldPoint, grip, zoom, ctx.handleHitSlop)) {
|
|
102
|
+
const frame = shapeSelectionFrame(shape);
|
|
103
|
+
return { kind: "rotate-handle", pivot: frameCenter(frame), bounds: frame.bounds };
|
|
79
104
|
}
|
|
80
105
|
}
|
|
81
106
|
}
|
|
@@ -89,10 +114,10 @@ export const pickPressTarget = (worldPoint, ctx) => {
|
|
|
89
114
|
const handleR = ctx.edgeHandleHitSlop / zoom;
|
|
90
115
|
const fromPoint = req(path[0]);
|
|
91
116
|
const toPoint = req(path[path.length - 1]);
|
|
92
|
-
if (
|
|
117
|
+
if (vec2.distance(worldPoint, fromPoint) <= handleR) {
|
|
93
118
|
return { kind: "edge-endpoint", linkId: edge.id, side: "from" };
|
|
94
119
|
}
|
|
95
|
-
if (
|
|
120
|
+
if (vec2.distance(worldPoint, toPoint) <= handleR) {
|
|
96
121
|
return { kind: "edge-endpoint", linkId: edge.id, side: "to" };
|
|
97
122
|
}
|
|
98
123
|
}
|