@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.
Files changed (233) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/README.md +76 -27
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/actions/actionArrange.d.ts +13 -0
  5. package/dist/actions/actionArrange.d.ts.map +1 -0
  6. package/dist/actions/actionArrange.js +130 -0
  7. package/dist/actions/actionArrange.js.map +1 -0
  8. package/dist/actions/actionClipboard.d.ts +2 -0
  9. package/dist/actions/actionClipboard.d.ts.map +1 -1
  10. package/dist/actions/actionClipboard.js +36 -4
  11. package/dist/actions/actionClipboard.js.map +1 -1
  12. package/dist/actions/actionGrouping.d.ts.map +1 -1
  13. package/dist/actions/actionGrouping.js +3 -1
  14. package/dist/actions/actionGrouping.js.map +1 -1
  15. package/dist/actions/actionKeyboard.d.ts.map +1 -1
  16. package/dist/actions/actionKeyboard.js +6 -2
  17. package/dist/actions/actionKeyboard.js.map +1 -1
  18. package/dist/actions/actionLayout.d.ts.map +1 -1
  19. package/dist/actions/actionLayout.js +12 -4
  20. package/dist/actions/actionLayout.js.map +1 -1
  21. package/dist/actions/actionMode.d.ts.map +1 -1
  22. package/dist/actions/actionMode.js +30 -10
  23. package/dist/actions/actionMode.js.map +1 -1
  24. package/dist/actions/actionSelection.d.ts.map +1 -1
  25. package/dist/actions/actionSelection.js +18 -6
  26. package/dist/actions/actionSelection.js.map +1 -1
  27. package/dist/actions/actionText.d.ts +5 -0
  28. package/dist/actions/actionText.d.ts.map +1 -0
  29. package/dist/actions/actionText.js +37 -0
  30. package/dist/actions/actionText.js.map +1 -0
  31. package/dist/actions/actionView.d.ts.map +1 -1
  32. package/dist/actions/actionView.js +4 -2
  33. package/dist/actions/actionView.js.map +1 -1
  34. package/dist/actions/actionZOrder.d.ts.map +1 -1
  35. package/dist/actions/actionZOrder.js +12 -4
  36. package/dist/actions/actionZOrder.js.map +1 -1
  37. package/dist/actions/actionZoom.d.ts.map +1 -1
  38. package/dist/actions/actionZoom.js +17 -17
  39. package/dist/actions/actionZoom.js.map +1 -1
  40. package/dist/actions/index.d.ts +3 -1
  41. package/dist/actions/index.d.ts.map +1 -1
  42. package/dist/actions/index.js +3 -1
  43. package/dist/actions/index.js.map +1 -1
  44. package/dist/actions/registry.d.ts.map +1 -1
  45. package/dist/actions/registry.js +5 -3
  46. package/dist/actions/registry.js.map +1 -1
  47. package/dist/actions/types.d.ts +1 -1
  48. package/dist/actions/types.d.ts.map +1 -1
  49. package/dist/actions/types.js.map +1 -1
  50. package/dist/auto-layout-scheduler.d.ts +1 -3
  51. package/dist/auto-layout-scheduler.d.ts.map +1 -1
  52. package/dist/auto-layout-scheduler.js +1 -2
  53. package/dist/auto-layout-scheduler.js.map +1 -1
  54. package/dist/built-in-handlers.d.ts.map +1 -1
  55. package/dist/built-in-handlers.js +30 -7
  56. package/dist/built-in-handlers.js.map +1 -1
  57. package/dist/clipboard.d.ts.map +1 -1
  58. package/dist/clipboard.js +6 -7
  59. package/dist/clipboard.js.map +1 -1
  60. package/dist/constants.d.ts +48 -23
  61. package/dist/constants.d.ts.map +1 -1
  62. package/dist/constants.js +48 -23
  63. package/dist/constants.js.map +1 -1
  64. package/dist/dom-events.d.ts +7 -0
  65. package/dist/dom-events.d.ts.map +1 -1
  66. package/dist/dom-events.js +12 -0
  67. package/dist/dom-events.js.map +1 -1
  68. package/dist/editor/animation-scene.d.ts +21 -0
  69. package/dist/editor/animation-scene.d.ts.map +1 -0
  70. package/dist/editor/animation-scene.js +71 -0
  71. package/dist/editor/animation-scene.js.map +1 -0
  72. package/dist/editor/animation.d.ts +43 -0
  73. package/dist/editor/animation.d.ts.map +1 -0
  74. package/dist/editor/animation.js +80 -0
  75. package/dist/editor/animation.js.map +1 -0
  76. package/dist/editor/applies/arrange.d.ts +46 -0
  77. package/dist/editor/applies/arrange.d.ts.map +1 -0
  78. package/dist/editor/applies/arrange.js +162 -0
  79. package/dist/editor/applies/arrange.js.map +1 -0
  80. package/dist/editor/applies/create.d.ts.map +1 -1
  81. package/dist/editor/applies/create.js +1 -1
  82. package/dist/editor/applies/create.js.map +1 -1
  83. package/dist/editor/applies/edge.d.ts +8 -1
  84. package/dist/editor/applies/edge.d.ts.map +1 -1
  85. package/dist/editor/applies/edge.js +31 -1
  86. package/dist/editor/applies/edge.js.map +1 -1
  87. package/dist/editor/applies/link-move.d.ts.map +1 -1
  88. package/dist/editor/applies/link-move.js +5 -2
  89. package/dist/editor/applies/link-move.js.map +1 -1
  90. package/dist/editor/applies/move.d.ts +6 -0
  91. package/dist/editor/applies/move.d.ts.map +1 -1
  92. package/dist/editor/applies/move.js +6 -0
  93. package/dist/editor/applies/move.js.map +1 -1
  94. package/dist/editor/applies/resize.d.ts +26 -5
  95. package/dist/editor/applies/resize.d.ts.map +1 -1
  96. package/dist/editor/applies/resize.js +92 -14
  97. package/dist/editor/applies/resize.js.map +1 -1
  98. package/dist/editor/applies/snap-grid.d.ts.map +1 -1
  99. package/dist/editor/applies/snap-grid.js.map +1 -1
  100. package/dist/editor/caret-blink.d.ts +18 -0
  101. package/dist/editor/caret-blink.d.ts.map +1 -0
  102. package/dist/editor/caret-blink.js +42 -0
  103. package/dist/editor/caret-blink.js.map +1 -0
  104. package/dist/editor/container-ops.d.ts.map +1 -1
  105. package/dist/editor/container-ops.js +2 -2
  106. package/dist/editor/container-ops.js.map +1 -1
  107. package/dist/editor/dirty-rect.d.ts +23 -0
  108. package/dist/editor/dirty-rect.d.ts.map +1 -0
  109. package/dist/editor/dirty-rect.js +115 -0
  110. package/dist/editor/dirty-rect.js.map +1 -0
  111. package/dist/editor/gif-playback.d.ts +45 -0
  112. package/dist/editor/gif-playback.d.ts.map +1 -0
  113. package/dist/editor/gif-playback.js +125 -0
  114. package/dist/editor/gif-playback.js.map +1 -0
  115. package/dist/editor/hit-test.d.ts +3 -3
  116. package/dist/editor/hit-test.d.ts.map +1 -1
  117. package/dist/editor/hit-test.js +40 -15
  118. package/dist/editor/hit-test.js.map +1 -1
  119. package/dist/editor/long-press.d.ts.map +1 -1
  120. package/dist/editor/long-press.js +2 -2
  121. package/dist/editor/long-press.js.map +1 -1
  122. package/dist/editor/pinch.d.ts.map +1 -1
  123. package/dist/editor/pinch.js +6 -7
  124. package/dist/editor/pinch.js.map +1 -1
  125. package/dist/editor/pointer-binding.d.ts.map +1 -1
  126. package/dist/editor/pointer-binding.js +42 -25
  127. package/dist/editor/pointer-binding.js.map +1 -1
  128. package/dist/editor/public/annotations.d.ts.map +1 -1
  129. package/dist/editor/public/annotations.js.map +1 -1
  130. package/dist/editor/public/arrange-group.d.ts +3 -9
  131. package/dist/editor/public/arrange-group.d.ts.map +1 -1
  132. package/dist/editor/public/arrange-group.js +4 -6
  133. package/dist/editor/public/arrange-group.js.map +1 -1
  134. package/dist/editor/public/brush.d.ts.map +1 -1
  135. package/dist/editor/public/brush.js +1 -3
  136. package/dist/editor/public/brush.js.map +1 -1
  137. package/dist/editor/public/clipboard.d.ts +2 -4
  138. package/dist/editor/public/clipboard.d.ts.map +1 -1
  139. package/dist/editor/public/clipboard.js +2 -4
  140. package/dist/editor/public/clipboard.js.map +1 -1
  141. package/dist/editor/public/cursor.d.ts +43 -0
  142. package/dist/editor/public/cursor.d.ts.map +1 -0
  143. package/dist/editor/public/cursor.js +135 -0
  144. package/dist/editor/public/cursor.js.map +1 -0
  145. package/dist/editor/public/frame-name.d.ts +20 -0
  146. package/dist/editor/public/frame-name.d.ts.map +1 -0
  147. package/dist/editor/public/frame-name.js +54 -0
  148. package/dist/editor/public/frame-name.js.map +1 -0
  149. package/dist/editor/public/image-insert.d.ts +1 -1
  150. package/dist/editor/public/image-insert.d.ts.map +1 -1
  151. package/dist/editor/public/layers.d.ts.map +1 -1
  152. package/dist/editor/public/layers.js +2 -2
  153. package/dist/editor/public/layers.js.map +1 -1
  154. package/dist/editor/public/link.d.ts +11 -2
  155. package/dist/editor/public/link.d.ts.map +1 -1
  156. package/dist/editor/public/link.js +71 -5
  157. package/dist/editor/public/link.js.map +1 -1
  158. package/dist/editor/public/placement.d.ts +60 -2
  159. package/dist/editor/public/placement.d.ts.map +1 -1
  160. package/dist/editor/public/placement.js +185 -2
  161. package/dist/editor/public/placement.js.map +1 -1
  162. package/dist/editor/public/selection-ops.d.ts +23 -1
  163. package/dist/editor/public/selection-ops.d.ts.map +1 -1
  164. package/dist/editor/public/selection-ops.js +81 -8
  165. package/dist/editor/public/selection-ops.js.map +1 -1
  166. package/dist/editor/public/text-edit.d.ts +1 -10
  167. package/dist/editor/public/text-edit.d.ts.map +1 -1
  168. package/dist/editor/public/text-edit.js +2 -16
  169. package/dist/editor/public/text-edit.js.map +1 -1
  170. package/dist/editor/public/z-order.d.ts.map +1 -1
  171. package/dist/editor/public/z-order.js +5 -5
  172. package/dist/editor/public/z-order.js.map +1 -1
  173. package/dist/editor/public/zoom-pan.d.ts +6 -4
  174. package/dist/editor/public/zoom-pan.d.ts.map +1 -1
  175. package/dist/editor/public/zoom-pan.js +8 -7
  176. package/dist/editor/public/zoom-pan.js.map +1 -1
  177. package/dist/editor/render-orchestrator.d.ts.map +1 -1
  178. package/dist/editor/render-orchestrator.js +5 -11
  179. package/dist/editor/render-orchestrator.js.map +1 -1
  180. package/dist/editor/resize-helpers.d.ts +21 -5
  181. package/dist/editor/resize-helpers.d.ts.map +1 -1
  182. package/dist/editor/resize-helpers.js +59 -19
  183. package/dist/editor/resize-helpers.js.map +1 -1
  184. package/dist/editor/viewport-helpers.d.ts.map +1 -1
  185. package/dist/editor/viewport-helpers.js +3 -3
  186. package/dist/editor/viewport-helpers.js.map +1 -1
  187. package/dist/editor-events.d.ts +1 -1
  188. package/dist/editor-events.d.ts.map +1 -1
  189. package/dist/editor.d.ts +125 -130
  190. package/dist/editor.d.ts.map +1 -1
  191. package/dist/editor.js +352 -985
  192. package/dist/editor.js.map +1 -1
  193. package/dist/file-drop.d.ts.map +1 -1
  194. package/dist/file-drop.js +7 -4
  195. package/dist/file-drop.js.map +1 -1
  196. package/dist/frame-helpers.d.ts.map +1 -1
  197. package/dist/frame-helpers.js +5 -5
  198. package/dist/frame-helpers.js.map +1 -1
  199. package/dist/group-helpers.d.ts.map +1 -1
  200. package/dist/group-helpers.js +4 -4
  201. package/dist/group-helpers.js.map +1 -1
  202. package/dist/handle.d.ts +61 -6
  203. package/dist/handle.d.ts.map +1 -1
  204. package/dist/handle.js +105 -7
  205. package/dist/handle.js.map +1 -1
  206. package/dist/hotkeys-binding.d.ts +26 -0
  207. package/dist/hotkeys-binding.d.ts.map +1 -0
  208. package/dist/hotkeys-binding.js +35 -0
  209. package/dist/hotkeys-binding.js.map +1 -0
  210. package/dist/index.d.ts +3 -2
  211. package/dist/index.d.ts.map +1 -1
  212. package/dist/index.js +3 -2
  213. package/dist/index.js.map +1 -1
  214. package/dist/link-selection.d.ts +3 -5
  215. package/dist/link-selection.d.ts.map +1 -1
  216. package/dist/link-selection.js +3 -12
  217. package/dist/link-selection.js.map +1 -1
  218. package/dist/machine.d.ts +27 -1
  219. package/dist/machine.d.ts.map +1 -1
  220. package/dist/machine.js +38 -0
  221. package/dist/machine.js.map +1 -1
  222. package/dist/overlay.d.ts +1 -4
  223. package/dist/overlay.d.ts.map +1 -1
  224. package/dist/overlay.js +142 -38
  225. package/dist/overlay.js.map +1 -1
  226. package/dist/selection.d.ts.map +1 -1
  227. package/dist/selection.js +2 -10
  228. package/dist/selection.js.map +1 -1
  229. package/dist/util.d.ts +8 -0
  230. package/dist/util.d.ts.map +1 -0
  231. package/dist/util.js +17 -0
  232. package/dist/util.js.map +1 -0
  233. 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 = () => { reject(reader.error ?? new Error(`Failed to read ${file.name}`)); };
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 = () => { reject(reader.error ?? new Error(`Failed to read ${file.name}`)); };
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" ||
@@ -1 +1 @@
1
- {"version":3,"file":"file-drop.js","sourceRoot":"","sources":["../src/file-drop.ts"],"names":[],"mappings":"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"}
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,EAGL,KAAK,KAAK,EACX,MAAM,wBAAwB,CAAC;AAChC,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"}
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"}
@@ -1,4 +1,4 @@
1
- import { getElementWorldBounds, updateElement, } from "@oh-just-another/scene";
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.type !== "frame")
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.type === "frame")
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((s) => s.type === "frame")
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.type === "frame")
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":"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"}
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,EAAc,KAAK,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAU9E;;;;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"}
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"}
@@ -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.type === "group")
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.type !== "group")
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.type === "group")
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":"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"}
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
- * Re-exports handle geometry/hit-target constants from `constants.ts`.
26
- * `HANDLE_HIT_SLOP` is decoupled from `HANDLE_SIZE`/`HANDLE_OUTSET` — the grab
27
- * area grows independently of the drawn square. Re-exported so consumers
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 — `bounds.normalize` in `@math` flips
70
- * it on commit.
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
@@ -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;AAC3D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7E;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAEzE,eAAO,MAAM,WAAW,EAAE,SAAS,QAAQ,EAAiD,CAAC;AAE7F;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,QAAQ,EAA6B,CAAC;AAE5E;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAI,QAAQ,QAAQ,KAAG,MAelD,CAAC;AAEF;;;;;GAKG;AACH,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,QAAQ,EAAE,GAAG,MAAM,EAAE,aAAQ,KAAG,IAwBtE,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,SAAS,GACpB,OAAO,IAAI,EACX,GAAG,MAAM,EACT,MAAM,MAAM,EACZ,iBAAgB,MAAwB,EACxC,YAAW,SAAS,QAAQ,EAAgB,KAC3C,QAAQ,GAAG,IAkCb,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,EAAE,QAAQ,QAAQ,EAAE,OAAO,IAAI,KAAG,MAuCvE,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 { HANDLE_HIT_SLOP, HANDLE_OUTSET, HANDLE_SIZE } from "./constants.js";
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
- * Re-exports handle geometry/hit-target constants from `constants.ts`.
35
- * `HANDLE_HIT_SLOP` is decoupled from `HANDLE_SIZE`/`HANDLE_OUTSET` — the grab
36
- * area grows independently of the drawn square. Re-exported so consumers
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 — `bounds.normalize` in `@math` flips
142
- * it on commit.
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;
@@ -1 +1 @@
1
- {"version":3,"file":"handle.js","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":"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"}
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";
@@ -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,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhG,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,EAAE,iCAAiC,EAAE,MAAM,gBAAgB,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtF,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAEzF,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGlE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAElB,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;AAG5B,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,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;AAIvB,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC"}
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,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAahG,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,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtF,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"}
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"}
@@ -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 the element-selection code is untouched
5
- * while links become first-class members of the overall selection (Cmd+A,
6
- * marquee, multi-select, delete).
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;AAErD;;;;;;;;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,OAAsB,CAAC;AAE5E,eAAO,MAAM,GAAG,GAAI,KAAK,aAAa,EAAE,IAAI,MAAM,KAAG,aAKpD,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,KAAK,aAAa,EAAE,IAAI,MAAM,KAAG,aAKvD,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,KAAK,aAAa,EAAE,IAAI,MAAM,KAAG,aACV,CAAC;AAE/C,eAAO,MAAM,MAAM,GAAI,GAAG,aAAa,EAAE,GAAG,aAAa,KAAG,OAK3D,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,IAAI,GAAI,KAAK,aAAa,KAAG,MAAM,GAAG,IAIlD,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"}