@oh-just-another/state 0.57.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 +90 -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 +36 -4
- package/dist/actions/actionClipboard.js.map +1 -1
- package/dist/actions/actionGrouping.d.ts.map +1 -1
- package/dist/actions/actionGrouping.js +3 -1
- package/dist/actions/actionGrouping.js.map +1 -1
- package/dist/actions/actionKeyboard.d.ts.map +1 -1
- package/dist/actions/actionKeyboard.js +6 -2
- package/dist/actions/actionKeyboard.js.map +1 -1
- package/dist/actions/actionLayout.d.ts.map +1 -1
- package/dist/actions/actionLayout.js +12 -4
- package/dist/actions/actionLayout.js.map +1 -1
- package/dist/actions/actionMode.d.ts.map +1 -1
- package/dist/actions/actionMode.js +30 -10
- package/dist/actions/actionMode.js.map +1 -1
- package/dist/actions/actionSelection.d.ts.map +1 -1
- package/dist/actions/actionSelection.js +18 -6
- package/dist/actions/actionSelection.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.d.ts.map +1 -1
- package/dist/actions/actionView.js +4 -2
- package/dist/actions/actionView.js.map +1 -1
- package/dist/actions/actionZOrder.d.ts.map +1 -1
- package/dist/actions/actionZOrder.js +12 -4
- package/dist/actions/actionZOrder.js.map +1 -1
- package/dist/actions/actionZoom.d.ts.map +1 -1
- package/dist/actions/actionZoom.js +17 -17
- package/dist/actions/actionZoom.js.map +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 +5 -3
- 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 +30 -7
- package/dist/built-in-handlers.js.map +1 -1
- package/dist/clipboard.d.ts.map +1 -1
- package/dist/clipboard.js +6 -7
- package/dist/clipboard.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/create.d.ts.map +1 -1
- package/dist/editor/applies/create.js +1 -1
- package/dist/editor/applies/create.js.map +1 -1
- 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/link-move.d.ts.map +1 -1
- package/dist/editor/applies/link-move.js +5 -2
- package/dist/editor/applies/link-move.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 +92 -14
- package/dist/editor/applies/resize.js.map +1 -1
- package/dist/editor/applies/snap-grid.d.ts.map +1 -1
- package/dist/editor/applies/snap-grid.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 -7
- 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/annotations.d.ts.map +1 -1
- package/dist/editor/public/annotations.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/brush.d.ts.map +1 -1
- package/dist/editor/public/brush.js +1 -3
- package/dist/editor/public/brush.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 +71 -5
- 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 +81 -8
- 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 +5 -5
- 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 +5 -11
- 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 -130
- package/dist/editor.d.ts.map +1 -1
- package/dist/editor.js +352 -985
- package/dist/editor.js.map +1 -1
- package/dist/file-drop.d.ts.map +1 -1
- package/dist/file-drop.js +7 -4
- 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 +142 -38
- 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 +9 -9
package/dist/file-drop.js
CHANGED
|
@@ -6,8 +6,7 @@
|
|
|
6
6
|
export class FileDropRegistry {
|
|
7
7
|
entries = [];
|
|
8
8
|
register(handler) {
|
|
9
|
-
// Replace existing entry with the same id so re-registration is idempotent
|
|
10
|
-
// (mirrors ActionRegistry.replace semantics).
|
|
9
|
+
// Replace existing entry with the same id so re-registration is idempotent.
|
|
11
10
|
const idx = this.entries.findIndex((h) => h.id === handler.id);
|
|
12
11
|
if (idx !== -1) {
|
|
13
12
|
this.entries[idx] = handler;
|
|
@@ -106,7 +105,9 @@ export const readFileAsDataURL = (file) => new Promise((resolve, reject) => {
|
|
|
106
105
|
else
|
|
107
106
|
reject(new Error(`Unexpected FileReader result type for ${file.name}`));
|
|
108
107
|
};
|
|
109
|
-
reader.onerror = () => {
|
|
108
|
+
reader.onerror = () => {
|
|
109
|
+
reject(reader.error ?? new Error(`Failed to read ${file.name}`));
|
|
110
|
+
};
|
|
110
111
|
reader.readAsDataURL(file);
|
|
111
112
|
});
|
|
112
113
|
/** Read a file as plain text. */
|
|
@@ -119,7 +120,9 @@ export const readFileAsText = (file) => new Promise((resolve, reject) => {
|
|
|
119
120
|
else
|
|
120
121
|
reject(new Error(`Unexpected FileReader result type for ${file.name}`));
|
|
121
122
|
};
|
|
122
|
-
reader.onerror = () => {
|
|
123
|
+
reader.onerror = () => {
|
|
124
|
+
reject(reader.error ?? new Error(`Failed to read ${file.name}`));
|
|
125
|
+
};
|
|
123
126
|
reader.readAsText(file);
|
|
124
127
|
});
|
|
125
128
|
const DEFAULT_SKIP = (name) => name === ".git" ||
|
package/dist/file-drop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-drop.js","sourceRoot":"","sources":["../src/file-drop.ts"],"names":[],"mappings":"AAoCA;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IACV,OAAO,GAAsB,EAAE,CAAC;IAEjD,QAAQ,CAAC,OAAwB;QAC/B,
|
|
1
|
+
{"version":3,"file":"file-drop.js","sourceRoot":"","sources":["../src/file-drop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-helpers.d.ts","sourceRoot":"","sources":["../src/frame-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"frame-helpers.d.ts","sourceRoot":"","sources":["../src/frame-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAiD,KAAK,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACnG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAWhE;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,KAAG,MAQ5C,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,KAAK,EACZ,SAAS,eAAe,EACxB,SAAS,SAAS,EAClB,aAAa,MAAM,KAClB,KAmBF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,GAAI,OAAO,KAAK,EAAE,SAAS,eAAe,KAAG,KAkCjF,CAAC"}
|
package/dist/frame-helpers.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getElementWorldBounds,
|
|
1
|
+
import { getElementWorldBounds, isFrame, updateElement } from "@oh-just-another/scene";
|
|
2
2
|
/**
|
|
3
3
|
* Frame helpers. Two distinct concerns: choosing a free auto-name
|
|
4
4
|
* (`Frame N+1`) and assigning ownership when a frame is freshly drawn over
|
|
@@ -14,7 +14,7 @@ const FRAME_NAME_PATTERN = /^Frame (\d+)$/;
|
|
|
14
14
|
export const nextFrameName = (scene) => {
|
|
15
15
|
let max = 0;
|
|
16
16
|
for (const s of scene.elements.values()) {
|
|
17
|
-
if (s
|
|
17
|
+
if (!isFrame(s))
|
|
18
18
|
continue;
|
|
19
19
|
const m = FRAME_NAME_PATTERN.exec(s.name ?? "");
|
|
20
20
|
if (m)
|
|
@@ -40,7 +40,7 @@ export const assignFrameMembers = (scene, history, frameId, frameBounds) => {
|
|
|
40
40
|
for (const shape of scene.elements.values()) {
|
|
41
41
|
if (shape.id === frameId)
|
|
42
42
|
continue;
|
|
43
|
-
if (shape
|
|
43
|
+
if (isFrame(shape))
|
|
44
44
|
continue;
|
|
45
45
|
if (shape.frameId !== undefined)
|
|
46
46
|
continue;
|
|
@@ -68,12 +68,12 @@ export const reconcileFrameMembership = (scene, history) => {
|
|
|
68
68
|
// Frames top-most first — highest z-order (fractional-index string) wins
|
|
69
69
|
// when frames overlap.
|
|
70
70
|
const frames = [...scene.elements.values()]
|
|
71
|
-
.filter(
|
|
71
|
+
.filter(isFrame)
|
|
72
72
|
.sort((a, b) => (a.order < b.order ? 1 : a.order > b.order ? -1 : 0))
|
|
73
73
|
.map((f) => ({ id: f.id, b: getElementWorldBounds(f) }));
|
|
74
74
|
let next = scene;
|
|
75
75
|
for (const shape of scene.elements.values()) {
|
|
76
|
-
if (shape
|
|
76
|
+
if (isFrame(shape))
|
|
77
77
|
continue;
|
|
78
78
|
const b = getElementWorldBounds(shape);
|
|
79
79
|
const cx = b.x + b.width / 2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-helpers.js","sourceRoot":"","sources":["../src/frame-helpers.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"frame-helpers.js","sourceRoot":"","sources":["../src/frame-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-helpers.d.ts","sourceRoot":"","sources":["../src/group-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,
|
|
1
|
+
{"version":3,"file":"group-helpers.d.ts","sourceRoot":"","sources":["../src/group-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAuB,KAAK,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAUvF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,EAAE,OAAO,OAAO,KAAG,OAAO,GAAG,IAYzE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,KAAK,EACZ,WAAW,SAAS,EACpB,SAAS,SAAS,KACjB,OAUF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,KAAK,EACZ,OAAO,OAAO,EACd,cAAc,SAAS,GAAG,IAAI,KAC7B,OAYF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,KAAK,EACZ,WAAW,QAAQ,CAAC,SAAS,CAAC,EAC9B,gBAAgB,SAAS,KACxB,WAAW,CAAC,SAAS,CAUvB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,KAAK,EACZ,KAAK,OAAO,EACZ,KAAK,OAAO,GAAG,IAAI,EACnB,cAAc,SAAS,GAAG,IAAI,KAC7B,OAAO,GAAG,IAeZ,CAAC"}
|
package/dist/group-helpers.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getElement } from "@oh-just-another/scene";
|
|
1
|
+
import { getElement, isGroup } from "@oh-just-another/scene";
|
|
2
2
|
/**
|
|
3
3
|
* Group / isolation helpers — pure functions over Scene + ElementId with no
|
|
4
4
|
* Editor back-reference, so the test suite can drive them directly. Editor
|
|
@@ -18,7 +18,7 @@ export const topGroupAncestor = (scene, shape) => {
|
|
|
18
18
|
const parent = getElement(scene, cursor.parentId);
|
|
19
19
|
if (!parent)
|
|
20
20
|
break;
|
|
21
|
-
if (parent
|
|
21
|
+
if (isGroup(parent))
|
|
22
22
|
topGroup = parent;
|
|
23
23
|
cursor = parent;
|
|
24
24
|
depth++;
|
|
@@ -60,7 +60,7 @@ export const promoteToGroupRoot = (scene, shape, enteredGroup) => {
|
|
|
60
60
|
const parent = getElement(scene, current.parentId);
|
|
61
61
|
if (!parent)
|
|
62
62
|
break;
|
|
63
|
-
if (parent
|
|
63
|
+
if (!isGroup(parent))
|
|
64
64
|
break;
|
|
65
65
|
current = parent;
|
|
66
66
|
depth++;
|
|
@@ -106,7 +106,7 @@ export const pickDrillTarget = (scene, raw, top, enteredGroup) => {
|
|
|
106
106
|
break;
|
|
107
107
|
if (parent.id === top.id)
|
|
108
108
|
break;
|
|
109
|
-
if (parent
|
|
109
|
+
if (isGroup(parent))
|
|
110
110
|
next = parent;
|
|
111
111
|
cursor = parent;
|
|
112
112
|
depth++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-helpers.js","sourceRoot":"","sources":["../src/group-helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAA4B,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"group-helpers.js","sourceRoot":"","sources":["../src/group-helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/handle.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Bounds, Vec2 } from "@oh-just-another/types";
|
|
2
|
+
import { type AnchorRef, type ElementBase } from "@oh-just-another/scene";
|
|
2
3
|
import { HANDLE_HIT_SLOP, HANDLE_OUTSET, HANDLE_SIZE } from "./constants.js";
|
|
3
4
|
/**
|
|
4
5
|
* Eight resize-handle positions arranged around the shape's AABB. `nw` is
|
|
@@ -22,10 +23,9 @@ export declare const CORNER_HANDLES: readonly HandleId[];
|
|
|
22
23
|
*/
|
|
23
24
|
export declare const cursorForHandle: (handle: HandleId) => string;
|
|
24
25
|
/**
|
|
25
|
-
*
|
|
26
|
-
* `
|
|
27
|
-
*
|
|
28
|
-
* (`overlay`, `editor`, `index`, tests) keep importing from `./handle.js`.
|
|
26
|
+
* Handle geometry / hit-target constants. `HANDLE_HIT_SLOP` is decoupled from
|
|
27
|
+
* `HANDLE_SIZE`/`HANDLE_OUTSET` — the grab area grows independently of the
|
|
28
|
+
* drawn square.
|
|
29
29
|
*/
|
|
30
30
|
export { HANDLE_HIT_SLOP, HANDLE_OUTSET, HANDLE_SIZE };
|
|
31
31
|
/**
|
|
@@ -63,11 +63,66 @@ export declare const handlePosition: (handle: HandleId, b: Bounds, zoom?: number
|
|
|
63
63
|
* `TOUCH_HANDLE_HIT_SLOP` so a finger can grab without precision-pointing.
|
|
64
64
|
*/
|
|
65
65
|
export declare const hitHandle: (point: Vec2, b: Bounds, zoom: number, screenHalfSize?: number, handleSet?: readonly HandleId[]) => HandleId | null;
|
|
66
|
+
/**
|
|
67
|
+
* An oriented selection frame: an axis-aligned `bounds` rectangle expressed in
|
|
68
|
+
* a frame rotated `rotation` radians (CCW) about `pivot` (world). For a single
|
|
69
|
+
* rotated shape the frame hugs the shape — so the selection box, resize handles
|
|
70
|
+
* and rotate grip turn with it. For groups / multi-selection it degenerates to
|
|
71
|
+
* the world AABB (`rotation: 0`), where every helper below is the identity in
|
|
72
|
+
* the rotated axis and behaves exactly like the old AABB chrome.
|
|
73
|
+
*/
|
|
74
|
+
export interface SelectionFrame {
|
|
75
|
+
/** Axis-aligned box in the (un-rotated) frame coordinates. */
|
|
76
|
+
readonly bounds: Bounds;
|
|
77
|
+
/** Frame rotation in radians, CCW. */
|
|
78
|
+
readonly rotation: number;
|
|
79
|
+
/** World point the frame rotates about (the renderer's pivot). */
|
|
80
|
+
readonly pivot: Vec2;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Selection frame hugging a single shape: the shape's scaled local footprint,
|
|
84
|
+
* rotated about its `position` (the renderer's pivot). Reuses the shape's own
|
|
85
|
+
* transform so the box / handles align pixel-exact with the rendered body, and
|
|
86
|
+
* non-uniform / negative `scale` (flip) is folded into the axis-aligned bounds.
|
|
87
|
+
*/
|
|
88
|
+
export declare const shapeSelectionFrame: (shape: ElementBase) => SelectionFrame;
|
|
89
|
+
/** Axis-aligned selection frame (rotation 0) — groups / multi-selection. */
|
|
90
|
+
export declare const aabbSelectionFrame: (bounds: Bounds) => SelectionFrame;
|
|
91
|
+
/** The four world corners of the frame, in `nw → ne → se → sw` order. */
|
|
92
|
+
export declare const frameCorners: (frame: SelectionFrame) => readonly [Vec2, Vec2, Vec2, Vec2];
|
|
93
|
+
/** World centre of the frame — the natural pivot for the rotate gesture. */
|
|
94
|
+
export declare const frameCenter: (frame: SelectionFrame) => Vec2;
|
|
95
|
+
/** World position of a resize handle on the frame (rotates with the frame). */
|
|
96
|
+
export declare const handleWorldOnFrame: (handle: HandleId, frame: SelectionFrame, zoom?: number) => Vec2;
|
|
97
|
+
/**
|
|
98
|
+
* Find which resize handle the world `point` is over on the frame. Inverse-
|
|
99
|
+
* rotates the point into frame coordinates, then runs the flat {@link hitHandle}
|
|
100
|
+
* — so corner dots / edge bands are matched in the frame's own axes.
|
|
101
|
+
*/
|
|
102
|
+
export declare const hitHandleOnFrame: (point: Vec2, frame: SelectionFrame, zoom: number, screenHalfSize?: number, handleSet?: readonly HandleId[]) => HandleId | null;
|
|
103
|
+
/** Override the rotate-grip anchor for a shape type (element template hook). */
|
|
104
|
+
export declare const registerRotateAnchor: (type: string, anchor: AnchorRef) => void;
|
|
105
|
+
/** The rotate-grip anchor for a shape type (falls back to bottom-left). */
|
|
106
|
+
export declare const getRotateAnchor: (type: string) => AnchorRef;
|
|
107
|
+
/**
|
|
108
|
+
* World position of the rotate grip for a single shape: the template anchor
|
|
109
|
+
* pushed `ROTATE_HANDLE_OFFSET` screen pixels along its outward normal. Both
|
|
110
|
+
* anchor and normal come from the shape transform, so the grip turns and scales
|
|
111
|
+
* with the element automatically.
|
|
112
|
+
*/
|
|
113
|
+
export declare const rotateGripWorld: (shape: ElementBase, zoom?: number) => Vec2;
|
|
114
|
+
/**
|
|
115
|
+
* World position of the rotate grip for an axis-aligned group / multi-selection
|
|
116
|
+
* frame: the bottom-left corner of `b`, pushed out along the down-left diagonal.
|
|
117
|
+
*/
|
|
118
|
+
export declare const rotateGripForBounds: (b: Bounds, zoom?: number) => Vec2;
|
|
119
|
+
/** True when world `point` is within grab slop of a grip at `grip`. */
|
|
120
|
+
export declare const hitRotateGrip: (point: Vec2, grip: Vec2, zoom: number, screenHalfSize?: number) => boolean;
|
|
66
121
|
/**
|
|
67
122
|
* Apply a delta in world coordinates to bounds, using the given handle as the
|
|
68
123
|
* grab point. Anchor (opposite corner) stays fixed. The result may have
|
|
69
|
-
* negative width/height while dragging —
|
|
70
|
-
*
|
|
124
|
+
* negative width/height while dragging — bounds normalization flips it on
|
|
125
|
+
* commit.
|
|
71
126
|
*/
|
|
72
127
|
export declare const resizeBounds: (b: Bounds, handle: HandleId, delta: Vec2) => Bounds;
|
|
73
128
|
//# sourceMappingURL=handle.d.ts.map
|
package/dist/handle.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":"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"}
|
package/dist/handle.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { vec2 } from "@oh-just-another/math";
|
|
2
|
+
import { getAnchorOutwardNormal, getAnchorWorld, getElementLocalBounds, } from "@oh-just-another/scene";
|
|
3
|
+
import { HANDLE_HIT_SLOP, HANDLE_OUTSET, HANDLE_SIZE, ROTATE_HANDLE_OFFSET } from "./constants.js";
|
|
2
4
|
export const ALL_HANDLES = ["nw", "n", "ne", "e", "se", "s", "sw", "w"];
|
|
3
5
|
/**
|
|
4
6
|
* Subset of `ALL_HANDLES` containing only the four corner positions. Used for
|
|
@@ -31,10 +33,9 @@ export const cursorForHandle = (handle) => {
|
|
|
31
33
|
}
|
|
32
34
|
};
|
|
33
35
|
/**
|
|
34
|
-
*
|
|
35
|
-
* `
|
|
36
|
-
*
|
|
37
|
-
* (`overlay`, `editor`, `index`, tests) keep importing from `./handle.js`.
|
|
36
|
+
* Handle geometry / hit-target constants. `HANDLE_HIT_SLOP` is decoupled from
|
|
37
|
+
* `HANDLE_SIZE`/`HANDLE_OUTSET` — the grab area grows independently of the
|
|
38
|
+
* drawn square.
|
|
38
39
|
*/
|
|
39
40
|
export { HANDLE_HIT_SLOP, HANDLE_OUTSET, HANDLE_SIZE };
|
|
40
41
|
/**
|
|
@@ -135,11 +136,108 @@ export const hitHandle = (point, b, zoom, screenHalfSize = HANDLE_HIT_SLOP, hand
|
|
|
135
136
|
}
|
|
136
137
|
return null;
|
|
137
138
|
};
|
|
139
|
+
/** Map a point from frame coordinates to world (rotate about the pivot). */
|
|
140
|
+
const frameToWorld = (frame, p) => frame.rotation === 0 ? p : vec2.rotateAround(p, frame.pivot, frame.rotation);
|
|
141
|
+
/** Map a world point into the frame's (un-rotated) coordinates. */
|
|
142
|
+
const worldToFrame = (frame, w) => frame.rotation === 0 ? w : vec2.rotateAround(w, frame.pivot, -frame.rotation);
|
|
143
|
+
/**
|
|
144
|
+
* Selection frame hugging a single shape: the shape's scaled local footprint,
|
|
145
|
+
* rotated about its `position` (the renderer's pivot). Reuses the shape's own
|
|
146
|
+
* transform so the box / handles align pixel-exact with the rendered body, and
|
|
147
|
+
* non-uniform / negative `scale` (flip) is folded into the axis-aligned bounds.
|
|
148
|
+
*/
|
|
149
|
+
export const shapeSelectionFrame = (shape) => {
|
|
150
|
+
const lb = getElementLocalBounds(shape);
|
|
151
|
+
const x0 = lb.x * shape.scale.x;
|
|
152
|
+
const x1 = (lb.x + lb.width) * shape.scale.x;
|
|
153
|
+
const y0 = lb.y * shape.scale.y;
|
|
154
|
+
const y1 = (lb.y + lb.height) * shape.scale.y;
|
|
155
|
+
return {
|
|
156
|
+
bounds: {
|
|
157
|
+
x: shape.position.x + Math.min(x0, x1),
|
|
158
|
+
y: shape.position.y + Math.min(y0, y1),
|
|
159
|
+
width: Math.abs(x1 - x0),
|
|
160
|
+
height: Math.abs(y1 - y0),
|
|
161
|
+
},
|
|
162
|
+
rotation: shape.rotation,
|
|
163
|
+
pivot: shape.position,
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
/** Axis-aligned selection frame (rotation 0) — groups / multi-selection. */
|
|
167
|
+
export const aabbSelectionFrame = (bounds) => ({
|
|
168
|
+
bounds,
|
|
169
|
+
rotation: 0,
|
|
170
|
+
pivot: { x: bounds.x, y: bounds.y },
|
|
171
|
+
});
|
|
172
|
+
/** The four world corners of the frame, in `nw → ne → se → sw` order. */
|
|
173
|
+
export const frameCorners = (frame) => {
|
|
174
|
+
const b = frame.bounds;
|
|
175
|
+
return [
|
|
176
|
+
frameToWorld(frame, { x: b.x, y: b.y }),
|
|
177
|
+
frameToWorld(frame, { x: b.x + b.width, y: b.y }),
|
|
178
|
+
frameToWorld(frame, { x: b.x + b.width, y: b.y + b.height }),
|
|
179
|
+
frameToWorld(frame, { x: b.x, y: b.y + b.height }),
|
|
180
|
+
];
|
|
181
|
+
};
|
|
182
|
+
/** World centre of the frame — the natural pivot for the rotate gesture. */
|
|
183
|
+
export const frameCenter = (frame) => frameToWorld(frame, {
|
|
184
|
+
x: frame.bounds.x + frame.bounds.width / 2,
|
|
185
|
+
y: frame.bounds.y + frame.bounds.height / 2,
|
|
186
|
+
});
|
|
187
|
+
/** World position of a resize handle on the frame (rotates with the frame). */
|
|
188
|
+
export const handleWorldOnFrame = (handle, frame, zoom = 1) => frameToWorld(frame, handlePosition(handle, frame.bounds, zoom));
|
|
189
|
+
/**
|
|
190
|
+
* Find which resize handle the world `point` is over on the frame. Inverse-
|
|
191
|
+
* rotates the point into frame coordinates, then runs the flat {@link hitHandle}
|
|
192
|
+
* — so corner dots / edge bands are matched in the frame's own axes.
|
|
193
|
+
*/
|
|
194
|
+
export const hitHandleOnFrame = (point, frame, zoom, screenHalfSize = HANDLE_HIT_SLOP, handleSet = ALL_HANDLES) => hitHandle(worldToFrame(frame, point), frame.bounds, zoom, screenHalfSize, handleSet);
|
|
195
|
+
/**
|
|
196
|
+
* Per-shape-type template for where the rotate grip sits, as an {@link AnchorRef}
|
|
197
|
+
* — the same vocabulary that positions a shape's custom connection points. The
|
|
198
|
+
* grip is placed at this anchor and pushed `ROTATE_HANDLE_OFFSET` screen pixels
|
|
199
|
+
* along the anchor's outward normal, so it rotates / scales with the shape for
|
|
200
|
+
* free. Default: the bottom-left corner (`ratio { 0, 1 }`), pushed out below-left.
|
|
201
|
+
*/
|
|
202
|
+
const DEFAULT_ROTATE_ANCHOR = { kind: "ratio", position: { x: 0, y: 1 } };
|
|
203
|
+
const rotateAnchors = new Map();
|
|
204
|
+
/** Override the rotate-grip anchor for a shape type (element template hook). */
|
|
205
|
+
export const registerRotateAnchor = (type, anchor) => {
|
|
206
|
+
rotateAnchors.set(type, anchor);
|
|
207
|
+
};
|
|
208
|
+
/** The rotate-grip anchor for a shape type (falls back to bottom-left). */
|
|
209
|
+
export const getRotateAnchor = (type) => rotateAnchors.get(type) ?? DEFAULT_ROTATE_ANCHOR;
|
|
210
|
+
/**
|
|
211
|
+
* World position of the rotate grip for a single shape: the template anchor
|
|
212
|
+
* pushed `ROTATE_HANDLE_OFFSET` screen pixels along its outward normal. Both
|
|
213
|
+
* anchor and normal come from the shape transform, so the grip turns and scales
|
|
214
|
+
* with the element automatically.
|
|
215
|
+
*/
|
|
216
|
+
export const rotateGripWorld = (shape, zoom = 1) => {
|
|
217
|
+
const anchor = getRotateAnchor(shape.type);
|
|
218
|
+
const at = getAnchorWorld(shape, anchor);
|
|
219
|
+
const n = getAnchorOutwardNormal(shape, anchor);
|
|
220
|
+
const o = ROTATE_HANDLE_OFFSET / zoom;
|
|
221
|
+
return { x: at.x + n.x * o, y: at.y + n.y * o };
|
|
222
|
+
};
|
|
223
|
+
/**
|
|
224
|
+
* World position of the rotate grip for an axis-aligned group / multi-selection
|
|
225
|
+
* frame: the bottom-left corner of `b`, pushed out along the down-left diagonal.
|
|
226
|
+
*/
|
|
227
|
+
export const rotateGripForBounds = (b, zoom = 1) => {
|
|
228
|
+
const o = (ROTATE_HANDLE_OFFSET / zoom) * Math.SQRT1_2;
|
|
229
|
+
return { x: b.x - o, y: b.y + b.height + o };
|
|
230
|
+
};
|
|
231
|
+
/** True when world `point` is within grab slop of a grip at `grip`. */
|
|
232
|
+
export const hitRotateGrip = (point, grip, zoom, screenHalfSize = HANDLE_HIT_SLOP) => {
|
|
233
|
+
const slop = screenHalfSize / zoom;
|
|
234
|
+
return Math.abs(point.x - grip.x) <= slop && Math.abs(point.y - grip.y) <= slop;
|
|
235
|
+
};
|
|
138
236
|
/**
|
|
139
237
|
* Apply a delta in world coordinates to bounds, using the given handle as the
|
|
140
238
|
* grab point. Anchor (opposite corner) stays fixed. The result may have
|
|
141
|
-
* negative width/height while dragging —
|
|
142
|
-
*
|
|
239
|
+
* negative width/height while dragging — bounds normalization flips it on
|
|
240
|
+
* commit.
|
|
143
241
|
*/
|
|
144
242
|
export const resizeBounds = (b, handle, delta) => {
|
|
145
243
|
let { x, y, width, height } = b;
|
package/dist/handle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle.js","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"handle.js","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type ActionRegistry } from "./actions/registry.js";
|
|
2
|
+
import type { Editor } from "./editor.js";
|
|
3
|
+
export interface HotkeyBindingOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Where to listen for keystrokes. Defaults to `window` (global shortcuts).
|
|
6
|
+
* Pass the editor's host element to scope shortcuts to it — the right
|
|
7
|
+
* choice when several editors share a page, or when the editor lives in a
|
|
8
|
+
* shadow root and you want shortcuts only while it has focus.
|
|
9
|
+
*/
|
|
10
|
+
readonly target?: Window | Document | HTMLElement;
|
|
11
|
+
/** Action registry to match against. Defaults to {@link defaultActionRegistry}. */
|
|
12
|
+
readonly registry?: ActionRegistry;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Drive the editor's keyboard shortcuts from a `keydown` listener: each event
|
|
16
|
+
* is matched against the registry's actions and the first match is dispatched.
|
|
17
|
+
* Returns an unbind function.
|
|
18
|
+
*
|
|
19
|
+
* Typing in an `<input>` / `<textarea>` / `contenteditable` is left alone
|
|
20
|
+
* (only `Escape` still passes through, blurring the field first). The
|
|
21
|
+
* editable-target check reads `composedPath()[0]`, so it sees the real
|
|
22
|
+
* focused node even across a shadow-root boundary where `event.target` is
|
|
23
|
+
* retargeted to the host.
|
|
24
|
+
*/
|
|
25
|
+
export declare const bindEditorHotkeys: (editor: Editor, options?: HotkeyBindingOptions) => (() => void);
|
|
26
|
+
//# sourceMappingURL=hotkeys-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hotkeys-binding.d.ts","sourceRoot":"","sources":["../src/hotkeys-binding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEnF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;IAClD,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;CACpC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,MAAM,EACd,UAAS,oBAAyB,KACjC,CAAC,MAAM,IAAI,CAkBb,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { defaultActionRegistry } from "./actions/registry.js";
|
|
2
|
+
import { isEditableTarget } from "./dom-events.js";
|
|
3
|
+
/**
|
|
4
|
+
* Drive the editor's keyboard shortcuts from a `keydown` listener: each event
|
|
5
|
+
* is matched against the registry's actions and the first match is dispatched.
|
|
6
|
+
* Returns an unbind function.
|
|
7
|
+
*
|
|
8
|
+
* Typing in an `<input>` / `<textarea>` / `contenteditable` is left alone
|
|
9
|
+
* (only `Escape` still passes through, blurring the field first). The
|
|
10
|
+
* editable-target check reads `composedPath()[0]`, so it sees the real
|
|
11
|
+
* focused node even across a shadow-root boundary where `event.target` is
|
|
12
|
+
* retargeted to the host.
|
|
13
|
+
*/
|
|
14
|
+
export const bindEditorHotkeys = (editor, options = {}) => {
|
|
15
|
+
const target = options.target ?? window;
|
|
16
|
+
const registry = options.registry ?? defaultActionRegistry;
|
|
17
|
+
const onKeyDown = (event) => {
|
|
18
|
+
if (!(event instanceof KeyboardEvent))
|
|
19
|
+
return;
|
|
20
|
+
const focused = event.composedPath()[0] ?? event.target;
|
|
21
|
+
if (isEditableTarget(focused)) {
|
|
22
|
+
if (event.key !== "Escape")
|
|
23
|
+
return;
|
|
24
|
+
if (focused instanceof HTMLElement)
|
|
25
|
+
focused.blur();
|
|
26
|
+
}
|
|
27
|
+
if (registry.dispatchHotkey(event, { editor }))
|
|
28
|
+
event.preventDefault();
|
|
29
|
+
};
|
|
30
|
+
target.addEventListener("keydown", onKeyDown);
|
|
31
|
+
return () => {
|
|
32
|
+
target.removeEventListener("keydown", onKeyDown);
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=hotkeys-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hotkeys-binding.js","sourceRoot":"","sources":["../src/hotkeys-binding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAuB,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAenD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,MAAc,EACd,UAAgC,EAAE,EACpB,EAAE;IAChB,MAAM,MAAM,GAAoC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;IACzE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,qBAAqB,CAAC;IAE3D,MAAM,SAAS,GAAG,CAAC,KAAY,EAAQ,EAAE;QACvC,IAAI,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC;YAAE,OAAO;QAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC;QACxD,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO;YACnC,IAAI,OAAO,YAAY,WAAW;gBAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC;QACD,IAAI,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC;YAAE,KAAK,CAAC,cAAc,EAAE,CAAC;IACzE,CAAC,CAAC;IAEF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9C,OAAO,GAAG,EAAE;QACV,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,13 +3,14 @@ export { DEFAULT_MODE } from "./modes.js";
|
|
|
3
3
|
export type { Selection } from "./selection.js";
|
|
4
4
|
export * as selection from "./selection.js";
|
|
5
5
|
export type { HandleId } from "./handle.js";
|
|
6
|
-
export { ALL_HANDLES, HANDLE_SIZE, handlePosition, hitHandle, resizeBounds } from "./handle.js";
|
|
6
|
+
export { ALL_HANDLES, HANDLE_SIZE, handlePosition, hitHandle, resizeBounds, registerRotateAnchor, getRotateAnchor, } from "./handle.js";
|
|
7
7
|
export type { InteractionContext, InteractionEvent, InteractionEmit, PressTarget, PointerDownEvent, PointerMoveEvent, PointerUpEvent, PointerCancelEvent, SetModeEvent, } from "./machine.js";
|
|
8
8
|
export { interactionMachine, interpretPressEnd, DRAG_THRESHOLD, boundsFromPoints, } from "./machine.js";
|
|
9
9
|
export type { OverlayStyle, PeerCursor, PeerSelection } from "./overlay.js";
|
|
10
10
|
export { renderOverlay, DEFAULT_OVERLAY_STYLE } from "./overlay.js";
|
|
11
11
|
export { PEER_CURSOR_BROADCAST_INTERVAL_MS } from "./constants.js";
|
|
12
|
-
export { fromPointerEvent, fromKeyboardEvent, fromWheelEvent } from "./dom-events.js";
|
|
12
|
+
export { fromPointerEvent, fromKeyboardEvent, fromWheelEvent, isEditableTarget, } from "./dom-events.js";
|
|
13
|
+
export { bindEditorHotkeys, type HotkeyBindingOptions } from "./hotkeys-binding.js";
|
|
13
14
|
export type { InteractiveHitTester } from "./interactive.js";
|
|
14
15
|
export { registerInteractiveHitTester, getInteractiveHitTester } from "./interactive.js";
|
|
15
16
|
export type { EditorOptions, LoadSceneOptions, CursorRole, CursorSpec } from "./editor.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAE5C,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
export { DEFAULT_MODE } from "./modes.js";
|
|
2
2
|
export * as selection from "./selection.js";
|
|
3
|
-
export { ALL_HANDLES, HANDLE_SIZE, handlePosition, hitHandle, resizeBounds } from "./handle.js";
|
|
3
|
+
export { ALL_HANDLES, HANDLE_SIZE, handlePosition, hitHandle, resizeBounds, registerRotateAnchor, getRotateAnchor, } from "./handle.js";
|
|
4
4
|
export { interactionMachine, interpretPressEnd, DRAG_THRESHOLD, boundsFromPoints, } from "./machine.js";
|
|
5
5
|
export { renderOverlay, DEFAULT_OVERLAY_STYLE } from "./overlay.js";
|
|
6
6
|
export { PEER_CURSOR_BROADCAST_INTERVAL_MS } from "./constants.js";
|
|
7
|
-
export { fromPointerEvent, fromKeyboardEvent, fromWheelEvent } from "./dom-events.js";
|
|
7
|
+
export { fromPointerEvent, fromKeyboardEvent, fromWheelEvent, isEditableTarget, } from "./dom-events.js";
|
|
8
|
+
export { bindEditorHotkeys } from "./hotkeys-binding.js";
|
|
8
9
|
export { registerInteractiveHitTester, getInteractiveHitTester } from "./interactive.js";
|
|
9
10
|
export { Editor } from "./editor.js";
|
|
10
11
|
export { normalizeHref, safeHref } from "./editor/public/link.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAG5C,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAG5C,OAAO,EACL,WAAW,EACX,WAAW,EACX,cAAc,EACd,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,eAAe,GAChB,MAAM,aAAa,CAAC;AAarB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,EAAE,iCAAiC,EAAE,MAAM,gBAAgB,CAAC;AAEnE,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,iBAAiB,EAA6B,MAAM,sBAAsB,CAAC;AAGpF,OAAO,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAGzF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAIlE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,EACZ,kBAAkB;AAClB,iEAAiE;AACjE,UAAU,EACV,UAAU,EACV,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,wBAAwB,EACxB,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EACf,YAAY,EACZ,aAAa,EACb,eAAe,EACf,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,EACL,OAAO,EACP,SAAS,EACT,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,GAClB,MAAM,eAAe,CAAC"}
|
package/dist/link-selection.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { LinkId } from "@oh-just-another/types";
|
|
2
2
|
/**
|
|
3
3
|
* Set of currently selected link (connector) ids. A parallel set to the
|
|
4
|
-
* element selection, kept separate so
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* element selection, kept separate so links are first-class members of the
|
|
5
|
+
* overall selection (Cmd+A, marquee, multi-select, delete) without coupling to
|
|
6
|
+
* the element-selection set.
|
|
7
7
|
*
|
|
8
8
|
* Immutable — operations return new sets. Sets (not arrays) give O(1)
|
|
9
9
|
* membership checks during overlay rendering and hit-testing.
|
|
@@ -11,9 +11,7 @@ import type { LinkId } from "@oh-just-another/types";
|
|
|
11
11
|
export type LinkSelection = ReadonlySet<LinkId>;
|
|
12
12
|
export declare const EMPTY: LinkSelection;
|
|
13
13
|
export declare const single: (id: LinkId) => LinkSelection;
|
|
14
|
-
export declare const has: (sel: LinkSelection, id: LinkId) => boolean;
|
|
15
14
|
export declare const add: (sel: LinkSelection, id: LinkId) => LinkSelection;
|
|
16
|
-
export declare const remove: (sel: LinkSelection, id: LinkId) => LinkSelection;
|
|
17
15
|
export declare const toggle: (sel: LinkSelection, id: LinkId) => LinkSelection;
|
|
18
16
|
export declare const equals: (a: LinkSelection, b: LinkSelection) => boolean;
|
|
19
17
|
/** The sole selected link, or null unless exactly one is selected. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-selection.d.ts","sourceRoot":"","sources":["../src/link-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"link-selection.d.ts","sourceRoot":"","sources":["../src/link-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGrD;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAEhD,eAAO,MAAM,KAAK,EAAE,aAAgD,CAAC;AAErE,eAAO,MAAM,MAAM,GAAI,IAAI,MAAM,KAAG,aAA8B,CAAC;AAEnE,eAAO,MAAM,GAAG,GAAI,KAAK,aAAa,EAAE,IAAI,MAAM,KAAG,aAKpD,CAAC;AASF,eAAO,MAAM,MAAM,GAAI,KAAK,aAAa,EAAE,IAAI,MAAM,KAAG,aACV,CAAC;AAE/C,eAAO,MAAM,MAAM,GAAI,GAAG,aAAa,EAAE,GAAG,aAAa,KAAG,OAA0B,CAAC;AAEvF,sEAAsE;AACtE,eAAO,MAAM,IAAI,GAAI,KAAK,aAAa,KAAG,MAAM,GAAG,IAIlD,CAAC"}
|