@open-draw/canvas 0.0.0-stage → 0.2.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/LICENSE +21 -0
- package/README.md +77 -2
- package/dist/a11y.d.ts +13 -0
- package/dist/a11y.d.ts.map +1 -0
- package/dist/a11y.js +41 -0
- package/dist/a11y.js.map +1 -0
- package/dist/camera.d.ts +96 -0
- package/dist/camera.d.ts.map +1 -0
- package/dist/camera.js +208 -0
- package/dist/camera.js.map +1 -0
- package/dist/capabilities/clipping/defs.d.ts +7 -0
- package/dist/capabilities/clipping/defs.d.ts.map +1 -0
- package/dist/capabilities/clipping/defs.js +2 -0
- package/dist/capabilities/clipping/defs.js.map +1 -0
- package/dist/capabilities/clipping/index.d.ts +3 -0
- package/dist/capabilities/clipping/index.d.ts.map +1 -0
- package/dist/capabilities/clipping/index.js +3 -0
- package/dist/capabilities/clipping/index.js.map +1 -0
- package/dist/capabilities/clipping/manager.d.ts +14 -0
- package/dist/capabilities/clipping/manager.d.ts.map +1 -0
- package/dist/capabilities/clipping/manager.js +75 -0
- package/dist/capabilities/clipping/manager.js.map +1 -0
- package/dist/capabilities/connector/defs.d.ts +9 -0
- package/dist/capabilities/connector/defs.d.ts.map +1 -0
- package/dist/capabilities/connector/defs.js +2 -0
- package/dist/capabilities/connector/defs.js.map +1 -0
- package/dist/capabilities/connector/index.d.ts +3 -0
- package/dist/capabilities/connector/index.d.ts.map +1 -0
- package/dist/capabilities/connector/index.js +3 -0
- package/dist/capabilities/connector/index.js.map +1 -0
- package/dist/capabilities/connector/manager.d.ts +19 -0
- package/dist/capabilities/connector/manager.d.ts.map +1 -0
- package/dist/capabilities/connector/manager.js +108 -0
- package/dist/capabilities/connector/manager.js.map +1 -0
- package/dist/capabilities/text-editing/defs.d.ts +2 -0
- package/dist/capabilities/text-editing/defs.d.ts.map +1 -0
- package/dist/capabilities/text-editing/defs.js +2 -0
- package/dist/capabilities/text-editing/defs.js.map +1 -0
- package/dist/capabilities/text-editing/index.d.ts +3 -0
- package/dist/capabilities/text-editing/index.d.ts.map +1 -0
- package/dist/capabilities/text-editing/index.js +3 -0
- package/dist/capabilities/text-editing/index.js.map +1 -0
- package/dist/capabilities/text-editing/manager.d.ts +20 -0
- package/dist/capabilities/text-editing/manager.d.ts.map +1 -0
- package/dist/capabilities/text-editing/manager.js +153 -0
- package/dist/capabilities/text-editing/manager.js.map +1 -0
- package/dist/editor.d.ts +94 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +241 -0
- package/dist/editor.js.map +1 -0
- package/dist/eraser/eraser.d.ts +21 -0
- package/dist/eraser/eraser.d.ts.map +1 -0
- package/dist/eraser/eraser.js +147 -0
- package/dist/eraser/eraser.js.map +1 -0
- package/dist/eraser/index.d.ts +2 -0
- package/dist/eraser/index.d.ts.map +1 -0
- package/dist/eraser/index.js +2 -0
- package/dist/eraser/index.js.map +1 -0
- package/dist/export/index.d.ts +2 -0
- package/dist/export/index.d.ts.map +1 -0
- package/dist/export/index.js +2 -0
- package/dist/export/index.js.map +1 -0
- package/dist/export/png.d.ts +17 -0
- package/dist/export/png.d.ts.map +1 -0
- package/dist/export/png.js +130 -0
- package/dist/export/png.js.map +1 -0
- package/dist/gesture/gesture.d.ts +36 -0
- package/dist/gesture/gesture.d.ts.map +1 -0
- package/dist/gesture/gesture.js +268 -0
- package/dist/gesture/gesture.js.map +1 -0
- package/dist/gesture/index.d.ts +2 -0
- package/dist/gesture/index.d.ts.map +1 -0
- package/dist/gesture/index.js +2 -0
- package/dist/gesture/index.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/input/commands.d.ts +12 -0
- package/dist/input/commands.d.ts.map +1 -0
- package/dist/input/commands.js +195 -0
- package/dist/input/commands.js.map +1 -0
- package/dist/input/index.d.ts +5 -0
- package/dist/input/index.d.ts.map +1 -0
- package/dist/input/index.js +5 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input/keyboard.d.ts +13 -0
- package/dist/input/keyboard.d.ts.map +1 -0
- package/dist/input/keyboard.js +83 -0
- package/dist/input/keyboard.js.map +1 -0
- package/dist/input/keymap.d.ts +10 -0
- package/dist/input/keymap.d.ts.map +1 -0
- package/dist/input/keymap.js +75 -0
- package/dist/input/keymap.js.map +1 -0
- package/dist/input/utils.d.ts +5 -0
- package/dist/input/utils.d.ts.map +1 -0
- package/dist/input/utils.js +4 -0
- package/dist/input/utils.js.map +1 -0
- package/dist/interaction.d.ts +29 -0
- package/dist/interaction.d.ts.map +1 -0
- package/dist/interaction.js +248 -0
- package/dist/interaction.js.map +1 -0
- package/dist/perf/index.d.ts +2 -0
- package/dist/perf/index.d.ts.map +1 -0
- package/dist/perf/index.js +2 -0
- package/dist/perf/index.js.map +1 -0
- package/dist/perf/telemetry.d.ts +33 -0
- package/dist/perf/telemetry.d.ts.map +1 -0
- package/dist/perf/telemetry.js +145 -0
- package/dist/perf/telemetry.js.map +1 -0
- package/dist/registry.d.ts +68 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +34 -0
- package/dist/registry.js.map +1 -0
- package/dist/renderer.d.ts +29 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +257 -0
- package/dist/renderer.js.map +1 -0
- package/dist/selection/defs.d.ts +6 -0
- package/dist/selection/defs.d.ts.map +1 -0
- package/dist/selection/defs.js +2 -0
- package/dist/selection/defs.js.map +1 -0
- package/dist/selection/group.d.ts +7 -0
- package/dist/selection/group.d.ts.map +1 -0
- package/dist/selection/group.js +25 -0
- package/dist/selection/group.js.map +1 -0
- package/dist/selection/handles.d.ts +9 -0
- package/dist/selection/handles.d.ts.map +1 -0
- package/dist/selection/handles.js +19 -0
- package/dist/selection/handles.js.map +1 -0
- package/dist/selection/handlesView.d.ts +4 -0
- package/dist/selection/handlesView.d.ts.map +1 -0
- package/dist/selection/handlesView.js +98 -0
- package/dist/selection/handlesView.js.map +1 -0
- package/dist/selection/index.d.ts +10 -0
- package/dist/selection/index.d.ts.map +1 -0
- package/dist/selection/index.js +10 -0
- package/dist/selection/index.js.map +1 -0
- package/dist/selection/manager.d.ts +29 -0
- package/dist/selection/manager.d.ts.map +1 -0
- package/dist/selection/manager.js +195 -0
- package/dist/selection/manager.js.map +1 -0
- package/dist/selection/marquee.d.ts +11 -0
- package/dist/selection/marquee.d.ts.map +1 -0
- package/dist/selection/marquee.js +52 -0
- package/dist/selection/marquee.js.map +1 -0
- package/dist/selection/reparent.d.ts +12 -0
- package/dist/selection/reparent.d.ts.map +1 -0
- package/dist/selection/reparent.js +57 -0
- package/dist/selection/reparent.js.map +1 -0
- package/dist/selection/resize.d.ts +10 -0
- package/dist/selection/resize.d.ts.map +1 -0
- package/dist/selection/resize.js +66 -0
- package/dist/selection/resize.js.map +1 -0
- package/dist/selection/rotate.d.ts +18 -0
- package/dist/selection/rotate.d.ts.map +1 -0
- package/dist/selection/rotate.js +39 -0
- package/dist/selection/rotate.js.map +1 -0
- package/dist/shapes/arrow/defs.d.ts +17 -0
- package/dist/shapes/arrow/defs.d.ts.map +1 -0
- package/dist/shapes/arrow/defs.js +7 -0
- package/dist/shapes/arrow/defs.js.map +1 -0
- package/dist/shapes/arrow/geometry.d.ts +11 -0
- package/dist/shapes/arrow/geometry.d.ts.map +1 -0
- package/dist/shapes/arrow/geometry.js +77 -0
- package/dist/shapes/arrow/geometry.js.map +1 -0
- package/dist/shapes/arrow/index.d.ts +7 -0
- package/dist/shapes/arrow/index.d.ts.map +1 -0
- package/dist/shapes/arrow/index.js +23 -0
- package/dist/shapes/arrow/index.js.map +1 -0
- package/dist/shapes/arrow/render.d.ts +6 -0
- package/dist/shapes/arrow/render.d.ts.map +1 -0
- package/dist/shapes/arrow/render.js +84 -0
- package/dist/shapes/arrow/render.js.map +1 -0
- package/dist/shapes/ellipse/defs.d.ts +8 -0
- package/dist/shapes/ellipse/defs.d.ts.map +1 -0
- package/dist/shapes/ellipse/defs.js +2 -0
- package/dist/shapes/ellipse/defs.js.map +1 -0
- package/dist/shapes/ellipse/geometry.d.ts +9 -0
- package/dist/shapes/ellipse/geometry.d.ts.map +1 -0
- package/dist/shapes/ellipse/geometry.js +74 -0
- package/dist/shapes/ellipse/geometry.js.map +1 -0
- package/dist/shapes/ellipse/index.d.ts +7 -0
- package/dist/shapes/ellipse/index.d.ts.map +1 -0
- package/dist/shapes/ellipse/index.js +21 -0
- package/dist/shapes/ellipse/index.js.map +1 -0
- package/dist/shapes/ellipse/render.d.ts +6 -0
- package/dist/shapes/ellipse/render.d.ts.map +1 -0
- package/dist/shapes/ellipse/render.js +39 -0
- package/dist/shapes/ellipse/render.js.map +1 -0
- package/dist/shapes/frame/defs.d.ts +9 -0
- package/dist/shapes/frame/defs.d.ts.map +1 -0
- package/dist/shapes/frame/defs.js +8 -0
- package/dist/shapes/frame/defs.js.map +1 -0
- package/dist/shapes/frame/geometry.d.ts +4 -0
- package/dist/shapes/frame/geometry.d.ts.map +1 -0
- package/dist/shapes/frame/geometry.js +66 -0
- package/dist/shapes/frame/geometry.js.map +1 -0
- package/dist/shapes/frame/index.d.ts +7 -0
- package/dist/shapes/frame/index.d.ts.map +1 -0
- package/dist/shapes/frame/index.js +20 -0
- package/dist/shapes/frame/index.js.map +1 -0
- package/dist/shapes/frame/render.d.ts +6 -0
- package/dist/shapes/frame/render.d.ts.map +1 -0
- package/dist/shapes/frame/render.js +73 -0
- package/dist/shapes/frame/render.js.map +1 -0
- package/dist/shapes/group/defs.d.ts +6 -0
- package/dist/shapes/group/defs.d.ts.map +1 -0
- package/dist/shapes/group/defs.js +2 -0
- package/dist/shapes/group/defs.js.map +1 -0
- package/dist/shapes/group/geometry.d.ts +8 -0
- package/dist/shapes/group/geometry.d.ts.map +1 -0
- package/dist/shapes/group/geometry.js +19 -0
- package/dist/shapes/group/geometry.js.map +1 -0
- package/dist/shapes/group/index.d.ts +7 -0
- package/dist/shapes/group/index.d.ts.map +1 -0
- package/dist/shapes/group/index.js +23 -0
- package/dist/shapes/group/index.js.map +1 -0
- package/dist/shapes/group/render.d.ts +6 -0
- package/dist/shapes/group/render.d.ts.map +1 -0
- package/dist/shapes/group/render.js +9 -0
- package/dist/shapes/group/render.js.map +1 -0
- package/dist/shapes/image/defs.d.ts +10 -0
- package/dist/shapes/image/defs.d.ts.map +1 -0
- package/dist/shapes/image/defs.js +2 -0
- package/dist/shapes/image/defs.js.map +1 -0
- package/dist/shapes/image/geometry.d.ts +21 -0
- package/dist/shapes/image/geometry.d.ts.map +1 -0
- package/dist/shapes/image/geometry.js +79 -0
- package/dist/shapes/image/geometry.js.map +1 -0
- package/dist/shapes/image/handlers.d.ts +10 -0
- package/dist/shapes/image/handlers.d.ts.map +1 -0
- package/dist/shapes/image/handlers.js +85 -0
- package/dist/shapes/image/handlers.js.map +1 -0
- package/dist/shapes/image/index.d.ts +8 -0
- package/dist/shapes/image/index.d.ts.map +1 -0
- package/dist/shapes/image/index.js +21 -0
- package/dist/shapes/image/index.js.map +1 -0
- package/dist/shapes/image/render.d.ts +6 -0
- package/dist/shapes/image/render.d.ts.map +1 -0
- package/dist/shapes/image/render.js +28 -0
- package/dist/shapes/image/render.js.map +1 -0
- package/dist/shapes/ink/defs.d.ts +10 -0
- package/dist/shapes/ink/defs.d.ts.map +1 -0
- package/dist/shapes/ink/defs.js +13 -0
- package/dist/shapes/ink/defs.js.map +1 -0
- package/dist/shapes/ink/geometry.d.ts +4 -0
- package/dist/shapes/ink/geometry.d.ts.map +1 -0
- package/dist/shapes/ink/geometry.js +67 -0
- package/dist/shapes/ink/geometry.js.map +1 -0
- package/dist/shapes/ink/index.d.ts +9 -0
- package/dist/shapes/ink/index.d.ts.map +1 -0
- package/dist/shapes/ink/index.js +22 -0
- package/dist/shapes/ink/index.js.map +1 -0
- package/dist/shapes/ink/rdp.d.ts +2 -0
- package/dist/shapes/ink/rdp.d.ts.map +1 -0
- package/dist/shapes/ink/rdp.js +37 -0
- package/dist/shapes/ink/rdp.js.map +1 -0
- package/dist/shapes/ink/render.d.ts +7 -0
- package/dist/shapes/ink/render.d.ts.map +1 -0
- package/dist/shapes/ink/render.js +81 -0
- package/dist/shapes/ink/render.js.map +1 -0
- package/dist/shapes/note/defs.d.ts +7 -0
- package/dist/shapes/note/defs.d.ts.map +1 -0
- package/dist/shapes/note/defs.js +2 -0
- package/dist/shapes/note/defs.js.map +1 -0
- package/dist/shapes/note/geometry.d.ts +11 -0
- package/dist/shapes/note/geometry.d.ts.map +1 -0
- package/dist/shapes/note/geometry.js +70 -0
- package/dist/shapes/note/geometry.js.map +1 -0
- package/dist/shapes/note/index.d.ts +7 -0
- package/dist/shapes/note/index.d.ts.map +1 -0
- package/dist/shapes/note/index.js +41 -0
- package/dist/shapes/note/index.js.map +1 -0
- package/dist/shapes/note/render.d.ts +6 -0
- package/dist/shapes/note/render.d.ts.map +1 -0
- package/dist/shapes/note/render.js +38 -0
- package/dist/shapes/note/render.js.map +1 -0
- package/dist/shapes/rect/defs.d.ts +9 -0
- package/dist/shapes/rect/defs.d.ts.map +1 -0
- package/dist/shapes/rect/defs.js +2 -0
- package/dist/shapes/rect/defs.js.map +1 -0
- package/dist/shapes/rect/geometry.d.ts +9 -0
- package/dist/shapes/rect/geometry.d.ts.map +1 -0
- package/dist/shapes/rect/geometry.js +68 -0
- package/dist/shapes/rect/geometry.js.map +1 -0
- package/dist/shapes/rect/index.d.ts +7 -0
- package/dist/shapes/rect/index.d.ts.map +1 -0
- package/dist/shapes/rect/index.js +22 -0
- package/dist/shapes/rect/index.js.map +1 -0
- package/dist/shapes/rect/render.d.ts +6 -0
- package/dist/shapes/rect/render.d.ts.map +1 -0
- package/dist/shapes/rect/render.js +42 -0
- package/dist/shapes/rect/render.js.map +1 -0
- package/dist/shapes/text/defs.d.ts +9 -0
- package/dist/shapes/text/defs.d.ts.map +1 -0
- package/dist/shapes/text/defs.js +2 -0
- package/dist/shapes/text/defs.js.map +1 -0
- package/dist/shapes/text/geometry.d.ts +9 -0
- package/dist/shapes/text/geometry.d.ts.map +1 -0
- package/dist/shapes/text/geometry.js +68 -0
- package/dist/shapes/text/geometry.js.map +1 -0
- package/dist/shapes/text/index.d.ts +7 -0
- package/dist/shapes/text/index.d.ts.map +1 -0
- package/dist/shapes/text/index.js +43 -0
- package/dist/shapes/text/index.js.map +1 -0
- package/dist/shapes/text/render.d.ts +6 -0
- package/dist/shapes/text/render.d.ts.map +1 -0
- package/dist/shapes/text/render.js +23 -0
- package/dist/shapes/text/render.js.map +1 -0
- package/dist/store/index.d.ts +5 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +5 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/snapshot.d.ts +5 -0
- package/dist/store/snapshot.d.ts.map +1 -0
- package/dist/store/snapshot.js +76 -0
- package/dist/store/snapshot.js.map +1 -0
- package/dist/store/store.d.ts +52 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +252 -0
- package/dist/store/store.js.map +1 -0
- package/dist/store/types.d.ts +13 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +2 -0
- package/dist/store/types.js.map +1 -0
- package/dist/store/zorder.d.ts +4 -0
- package/dist/store/zorder.d.ts.map +1 -0
- package/dist/store/zorder.js +53 -0
- package/dist/store/zorder.js.map +1 -0
- package/package.json +29 -4
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Bounds, Point } from '@open-draw/schema';
|
|
2
|
+
export type HandleType = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'rotate';
|
|
3
|
+
export interface HandleDescriptor {
|
|
4
|
+
readonly type: HandleType;
|
|
5
|
+
readonly point: Point;
|
|
6
|
+
readonly cursor: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function getHandleDescriptors(bounds: Bounds, rotateOffset?: number): readonly HandleDescriptor[];
|
|
9
|
+
//# sourceMappingURL=handles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handles.d.ts","sourceRoot":"","sources":["../../src/selection/handles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,UAAU,GAClB,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,QAAQ,CAAC;AAEb,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,SAAK,GAAG,SAAS,gBAAgB,EAAE,CAkBnG"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function getHandleDescriptors(bounds, rotateOffset = 24) {
|
|
2
|
+
const { x, y, width, height } = bounds;
|
|
3
|
+
const midX = x + width / 2;
|
|
4
|
+
const midY = y + height / 2;
|
|
5
|
+
const right = x + width;
|
|
6
|
+
const bottom = y + height;
|
|
7
|
+
return [
|
|
8
|
+
{ type: 'nw', point: { x, y }, cursor: 'nwse-resize' },
|
|
9
|
+
{ type: 'n', point: { x: midX, y }, cursor: 'ns-resize' },
|
|
10
|
+
{ type: 'ne', point: { x: right, y }, cursor: 'nesw-resize' },
|
|
11
|
+
{ type: 'e', point: { x: right, y: midY }, cursor: 'ew-resize' },
|
|
12
|
+
{ type: 'se', point: { x: right, y: bottom }, cursor: 'nwse-resize' },
|
|
13
|
+
{ type: 's', point: { x: midX, y: bottom }, cursor: 'ns-resize' },
|
|
14
|
+
{ type: 'sw', point: { x, y: bottom }, cursor: 'nesw-resize' },
|
|
15
|
+
{ type: 'w', point: { x, y: midY }, cursor: 'ew-resize' },
|
|
16
|
+
{ type: 'rotate', point: { x: midX, y: y - rotateOffset }, cursor: 'grab' },
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=handles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handles.js","sourceRoot":"","sources":["../../src/selection/handles.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,YAAY,GAAG,EAAE;IACpE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACvC,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC;IACxB,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;IAE1B,OAAO;QACL,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;QACtD,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;QACzD,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;QAC7D,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;QAChE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;QACrE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;QACjE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;QAC9D,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;QACzD,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;KAC5E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Bounds, Camera } from '@open-draw/schema';
|
|
2
|
+
export declare function renderHandles(slot: SVGGElement, localBounds: Bounds, camera?: Camera): SVGGElement;
|
|
3
|
+
export declare function removeHandles(slot: SVGGElement): void;
|
|
4
|
+
//# sourceMappingURL=handlesView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlesView.d.ts","sourceRoot":"","sources":["../../src/selection/handlesView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAOxD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,MAAgC,GACvC,WAAW,CAuDb;AA0CD,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAGrD"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { getHandleDescriptors } from './handles.js';
|
|
2
|
+
const SVG_NS = 'http://www.w3.org/2000/svg';
|
|
3
|
+
const BASE_HANDLE_SIZE = 8;
|
|
4
|
+
const BASE_ROTATE_OFFSET = 24;
|
|
5
|
+
export function renderHandles(slot, localBounds, camera = { x: 0, y: 0, zoom: 1 }) {
|
|
6
|
+
const handleScale = 1 / camera.zoom; // EXEMPTION: counter-scaling handles for constant screen size per §3.2
|
|
7
|
+
const size = BASE_HANDLE_SIZE * handleScale;
|
|
8
|
+
const half = size / 2;
|
|
9
|
+
const rotOffset = BASE_ROTATE_OFFSET * handleScale;
|
|
10
|
+
let frame = slot.querySelector(':scope > .od-selection-frame');
|
|
11
|
+
if (!frame) {
|
|
12
|
+
frame = document.createElementNS(SVG_NS, 'g');
|
|
13
|
+
frame.setAttribute('class', 'od-selection-frame');
|
|
14
|
+
slot.appendChild(frame);
|
|
15
|
+
}
|
|
16
|
+
// 1. Selection outline
|
|
17
|
+
let outline = frame.querySelector(':scope > .od-selection-outline');
|
|
18
|
+
if (!outline) {
|
|
19
|
+
outline = document.createElementNS(SVG_NS, 'rect');
|
|
20
|
+
outline.setAttribute('class', 'od-selection-outline');
|
|
21
|
+
outline.setAttribute('fill', 'none');
|
|
22
|
+
outline.setAttribute('stroke', '#3b82f6');
|
|
23
|
+
outline.setAttribute('stroke-width', '1.5');
|
|
24
|
+
outline.setAttribute('pointer-events', 'none');
|
|
25
|
+
outline.setAttribute('vector-effect', 'non-scaling-stroke');
|
|
26
|
+
frame.appendChild(outline);
|
|
27
|
+
}
|
|
28
|
+
outline.setAttribute('x', String(localBounds.x));
|
|
29
|
+
outline.setAttribute('y', String(localBounds.y));
|
|
30
|
+
outline.setAttribute('width', String(Math.max(1, localBounds.width)));
|
|
31
|
+
outline.setAttribute('height', String(Math.max(1, localBounds.height)));
|
|
32
|
+
// 2. Connector line to rotate handle
|
|
33
|
+
const midX = localBounds.x + localBounds.width / 2;
|
|
34
|
+
const rotY = localBounds.y - rotOffset;
|
|
35
|
+
let connector = frame.querySelector(':scope > .od-handle-connector');
|
|
36
|
+
if (!connector) {
|
|
37
|
+
connector = document.createElementNS(SVG_NS, 'line');
|
|
38
|
+
connector.setAttribute('class', 'od-handle-connector');
|
|
39
|
+
connector.setAttribute('stroke', '#3b82f6');
|
|
40
|
+
connector.setAttribute('stroke-width', '1');
|
|
41
|
+
connector.setAttribute('vector-effect', 'non-scaling-stroke');
|
|
42
|
+
connector.setAttribute('pointer-events', 'none');
|
|
43
|
+
frame.appendChild(connector);
|
|
44
|
+
}
|
|
45
|
+
connector.setAttribute('x1', String(midX));
|
|
46
|
+
connector.setAttribute('y1', String(localBounds.y));
|
|
47
|
+
connector.setAttribute('x2', String(midX));
|
|
48
|
+
connector.setAttribute('y2', String(rotY));
|
|
49
|
+
// 3. Handles
|
|
50
|
+
const descriptors = getHandleDescriptors(localBounds, rotOffset);
|
|
51
|
+
for (const d of descriptors) {
|
|
52
|
+
_renderHandle(frame, d, size, half);
|
|
53
|
+
}
|
|
54
|
+
return frame;
|
|
55
|
+
}
|
|
56
|
+
function _renderHandle(frame, d, size, half) {
|
|
57
|
+
if (d.type === 'rotate') {
|
|
58
|
+
let circle = frame.querySelector(':scope > .od-handle-rotate');
|
|
59
|
+
if (!circle) {
|
|
60
|
+
circle = document.createElementNS(SVG_NS, 'circle');
|
|
61
|
+
circle.setAttribute('class', 'od-handle od-handle-rotate');
|
|
62
|
+
circle.setAttribute('data-handle', 'rotate');
|
|
63
|
+
circle.setAttribute('fill', '#ffffff');
|
|
64
|
+
circle.setAttribute('stroke', '#3b82f6');
|
|
65
|
+
circle.setAttribute('stroke-width', '1.5');
|
|
66
|
+
circle.setAttribute('vector-effect', 'non-scaling-stroke');
|
|
67
|
+
circle.style.pointerEvents = 'auto';
|
|
68
|
+
circle.style.cursor = d.cursor;
|
|
69
|
+
frame.appendChild(circle);
|
|
70
|
+
}
|
|
71
|
+
circle.setAttribute('cx', String(d.point.x));
|
|
72
|
+
circle.setAttribute('cy', String(d.point.y));
|
|
73
|
+
circle.setAttribute('r', String(half));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
let rect = frame.querySelector(`:scope > .od-handle-${d.type}`);
|
|
77
|
+
if (!rect) {
|
|
78
|
+
rect = document.createElementNS(SVG_NS, 'rect');
|
|
79
|
+
rect.setAttribute('class', `od-handle od-handle-${d.type}`);
|
|
80
|
+
rect.setAttribute('data-handle', d.type);
|
|
81
|
+
rect.setAttribute('fill', '#ffffff');
|
|
82
|
+
rect.setAttribute('stroke', '#3b82f6');
|
|
83
|
+
rect.setAttribute('stroke-width', '1.5');
|
|
84
|
+
rect.setAttribute('vector-effect', 'non-scaling-stroke');
|
|
85
|
+
rect.style.pointerEvents = 'auto';
|
|
86
|
+
rect.style.cursor = d.cursor;
|
|
87
|
+
frame.appendChild(rect);
|
|
88
|
+
}
|
|
89
|
+
rect.setAttribute('x', String(d.point.x - half));
|
|
90
|
+
rect.setAttribute('y', String(d.point.y - half));
|
|
91
|
+
rect.setAttribute('width', String(size));
|
|
92
|
+
rect.setAttribute('height', String(size));
|
|
93
|
+
}
|
|
94
|
+
export function removeHandles(slot) {
|
|
95
|
+
const frame = slot.querySelector(':scope > .od-selection-frame');
|
|
96
|
+
frame?.remove();
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=handlesView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlesView.js","sourceRoot":"","sources":["../../src/selection/handlesView.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './defs.js';
|
|
2
|
+
export * from './manager.js';
|
|
3
|
+
export * from './group.js';
|
|
4
|
+
export * from './marquee.js';
|
|
5
|
+
export * from './handles.js';
|
|
6
|
+
export * from './resize.js';
|
|
7
|
+
export * from './rotate.js';
|
|
8
|
+
export * from './handlesView.js';
|
|
9
|
+
export * from './reparent.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/selection/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './defs.js';
|
|
2
|
+
export * from './manager.js';
|
|
3
|
+
export * from './group.js';
|
|
4
|
+
export * from './marquee.js';
|
|
5
|
+
export * from './handles.js';
|
|
6
|
+
export * from './resize.js';
|
|
7
|
+
export * from './rotate.js';
|
|
8
|
+
export * from './handlesView.js';
|
|
9
|
+
export * from './reparent.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/selection/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Camera, ShapeId, ShapeRecord } from '@open-draw/schema';
|
|
2
|
+
import type { ShapeRegistry } from '../registry.js';
|
|
3
|
+
import type { SVGRenderer } from '../renderer.js';
|
|
4
|
+
import type { CanvasStore } from '../store/index.js';
|
|
5
|
+
import type { SelectionListener } from './defs.js';
|
|
6
|
+
export declare class SelectionManager {
|
|
7
|
+
private selectedIds;
|
|
8
|
+
private listeners;
|
|
9
|
+
private prevRenderedIds;
|
|
10
|
+
get selection(): readonly ShapeId[];
|
|
11
|
+
setSelection(ids: readonly ShapeId[]): void;
|
|
12
|
+
select(id: ShapeId): void;
|
|
13
|
+
toggle(id: ShapeId): void;
|
|
14
|
+
add(ids: readonly ShapeId[]): void;
|
|
15
|
+
remove(ids: readonly ShapeId[]): void;
|
|
16
|
+
clear(): void;
|
|
17
|
+
selectAll(shapes: readonly ShapeRecord[]): void;
|
|
18
|
+
cycleZOrder(shapes: readonly ShapeRecord[], direction?: 'forward' | 'backward'): void;
|
|
19
|
+
isSelected(id: ShapeId): boolean;
|
|
20
|
+
subscribe(listener: SelectionListener): () => void;
|
|
21
|
+
updateVisuals(renderer: SVGRenderer, store: CanvasStore, registry: ShapeRegistry, camera?: Camera): void;
|
|
22
|
+
private _renderSingleSelection;
|
|
23
|
+
private _computeBounds;
|
|
24
|
+
private _renderOutline;
|
|
25
|
+
private _removeOutline;
|
|
26
|
+
private _notify;
|
|
27
|
+
private _arraysEqual;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/selection/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGnD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,eAAe,CAA2B;IAElD,IAAI,SAAS,IAAI,SAAS,OAAO,EAAE,CAElC;IAED,YAAY,CAAC,GAAG,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAK1C;IAED,MAAM,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAExB;IAED,MAAM,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAMxB;IAED,GAAG,CAAC,GAAG,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAEjC;IAED,MAAM,CAAC,GAAG,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAGpC;IAED,KAAK,IAAI,IAAI,CAEZ;IAED,SAAS,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI,CAG9C;IAED,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,SAAS,GAAE,SAAS,GAAG,UAAsB,GAAG,IAAI,CAuB/F;IAED,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAE/B;IAED,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAGjD;IAED,aAAa,CACX,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,aAAa,EACvB,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAgCN;IAED,OAAO,CAAC,sBAAsB;IAsB9B,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,cAAc;IAiCtB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,YAAY;CAOrB"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { renderHandles, removeHandles } from './handlesView.js';
|
|
2
|
+
export class SelectionManager {
|
|
3
|
+
selectedIds = [];
|
|
4
|
+
listeners = new Set();
|
|
5
|
+
prevRenderedIds = new Set();
|
|
6
|
+
get selection() {
|
|
7
|
+
return this.selectedIds;
|
|
8
|
+
}
|
|
9
|
+
setSelection(ids) {
|
|
10
|
+
const next = Array.from(new Set(ids));
|
|
11
|
+
if (this._arraysEqual(this.selectedIds, next))
|
|
12
|
+
return;
|
|
13
|
+
this.selectedIds = next;
|
|
14
|
+
this._notify();
|
|
15
|
+
}
|
|
16
|
+
select(id) {
|
|
17
|
+
this.setSelection([id]);
|
|
18
|
+
}
|
|
19
|
+
toggle(id) {
|
|
20
|
+
if (this.selectedIds.includes(id)) {
|
|
21
|
+
this.setSelection(this.selectedIds.filter((item) => item !== id));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
this.setSelection([...this.selectedIds, id]);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
add(ids) {
|
|
28
|
+
this.setSelection([...this.selectedIds, ...ids]);
|
|
29
|
+
}
|
|
30
|
+
remove(ids) {
|
|
31
|
+
const toRemove = new Set(ids);
|
|
32
|
+
this.setSelection(this.selectedIds.filter((id) => !toRemove.has(id)));
|
|
33
|
+
}
|
|
34
|
+
clear() {
|
|
35
|
+
this.setSelection([]);
|
|
36
|
+
}
|
|
37
|
+
selectAll(shapes) {
|
|
38
|
+
const visibleIds = shapes.filter((s) => !s.hidden).map((s) => s.id);
|
|
39
|
+
this.setSelection(visibleIds);
|
|
40
|
+
}
|
|
41
|
+
cycleZOrder(shapes, direction = 'forward') {
|
|
42
|
+
const visible = shapes.filter((s) => !s.hidden);
|
|
43
|
+
if (visible.length === 0)
|
|
44
|
+
return;
|
|
45
|
+
if (this.selectedIds.length === 0) {
|
|
46
|
+
const target = direction === 'forward' ? visible[0] : visible[visible.length - 1];
|
|
47
|
+
this.select(target.id);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const currentId = this.selectedIds[this.selectedIds.length - 1];
|
|
51
|
+
const currentIndex = visible.findIndex((s) => s.id === currentId);
|
|
52
|
+
let nextIndex;
|
|
53
|
+
if (currentIndex === -1) {
|
|
54
|
+
nextIndex = 0;
|
|
55
|
+
}
|
|
56
|
+
else if (direction === 'forward') {
|
|
57
|
+
nextIndex = (currentIndex + 1) % visible.length;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
nextIndex = (currentIndex - 1 + visible.length) % visible.length;
|
|
61
|
+
}
|
|
62
|
+
this.select(visible[nextIndex].id);
|
|
63
|
+
}
|
|
64
|
+
isSelected(id) {
|
|
65
|
+
return this.selectedIds.includes(id);
|
|
66
|
+
}
|
|
67
|
+
subscribe(listener) {
|
|
68
|
+
this.listeners.add(listener);
|
|
69
|
+
return () => this.listeners.delete(listener);
|
|
70
|
+
}
|
|
71
|
+
updateVisuals(renderer, store, registry, camera) {
|
|
72
|
+
const idsToRender = new Set();
|
|
73
|
+
for (const id of this.selectedIds) {
|
|
74
|
+
idsToRender.add(id);
|
|
75
|
+
const shape = store.getShape(id);
|
|
76
|
+
if (shape) {
|
|
77
|
+
const def = registry.get(shape.type);
|
|
78
|
+
if (def?.capabilities?.group?.isGroup) {
|
|
79
|
+
const members = def.capabilities.group.getMembers ? def.capabilities.group.getMembers(shape) : [];
|
|
80
|
+
for (const m of members)
|
|
81
|
+
idsToRender.add(m);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
for (const prevId of this.prevRenderedIds) {
|
|
86
|
+
if (!idsToRender.has(prevId)) {
|
|
87
|
+
this._removeOutline(renderer, prevId);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const singleSelectedId = this.selectedIds.length === 1 ? this.selectedIds[0] : null;
|
|
91
|
+
for (const id of idsToRender) {
|
|
92
|
+
if (id === singleSelectedId) {
|
|
93
|
+
this._renderSingleSelection(renderer, store, registry, id, camera);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
this._renderOutline(renderer, store, registry, id);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
this.prevRenderedIds = idsToRender;
|
|
100
|
+
}
|
|
101
|
+
_renderSingleSelection(renderer, store, registry, id, camera) {
|
|
102
|
+
const slot = renderer.getOverlaySlot(id);
|
|
103
|
+
const shape = renderer.getShapeRecord(id) ?? store.getShape(id);
|
|
104
|
+
if (!slot || !shape)
|
|
105
|
+
return;
|
|
106
|
+
const legacy = slot.querySelector(':scope > .od-selection-outline');
|
|
107
|
+
legacy?.remove();
|
|
108
|
+
const bounds = this._computeBounds(shape, store, registry, renderer);
|
|
109
|
+
if (!bounds)
|
|
110
|
+
return;
|
|
111
|
+
const lx = bounds.x - shape.x;
|
|
112
|
+
const ly = bounds.y - shape.y;
|
|
113
|
+
renderHandles(slot, { x: lx, y: ly, width: bounds.width, height: bounds.height }, camera);
|
|
114
|
+
}
|
|
115
|
+
_computeBounds(shape, store, registry, renderer) {
|
|
116
|
+
const def = registry.get(shape.type);
|
|
117
|
+
if (!def)
|
|
118
|
+
return null;
|
|
119
|
+
let bounds = def.geometry.bounds(shape);
|
|
120
|
+
if (def.capabilities?.group?.isGroup) {
|
|
121
|
+
const members = def.capabilities.group.getMembers ? def.capabilities.group.getMembers(shape) : [];
|
|
122
|
+
const memberShapes = members
|
|
123
|
+
.map((mid) => (renderer ? renderer.getShapeRecord(mid) : null) ?? store.getShape(mid))
|
|
124
|
+
.filter(Boolean);
|
|
125
|
+
if (memberShapes.length > 0) {
|
|
126
|
+
let minX = Infinity;
|
|
127
|
+
let minY = Infinity;
|
|
128
|
+
let maxX = -Infinity;
|
|
129
|
+
let maxY = -Infinity;
|
|
130
|
+
for (const m of memberShapes) {
|
|
131
|
+
const mDef = registry.get(m.type);
|
|
132
|
+
if (!mDef)
|
|
133
|
+
continue;
|
|
134
|
+
const mb = mDef.geometry.bounds(m);
|
|
135
|
+
minX = Math.min(minX, mb.x);
|
|
136
|
+
minY = Math.min(minY, mb.y);
|
|
137
|
+
maxX = Math.max(maxX, mb.x + mb.width);
|
|
138
|
+
maxY = Math.max(maxY, mb.y + mb.height);
|
|
139
|
+
}
|
|
140
|
+
if (minX !== Infinity) {
|
|
141
|
+
bounds = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return bounds;
|
|
146
|
+
}
|
|
147
|
+
_renderOutline(renderer, store, registry, id) {
|
|
148
|
+
const slot = renderer.getOverlaySlot(id);
|
|
149
|
+
const shape = renderer.getShapeRecord(id) ?? store.getShape(id);
|
|
150
|
+
if (!slot || !shape)
|
|
151
|
+
return;
|
|
152
|
+
const bounds = this._computeBounds(shape, store, registry, renderer);
|
|
153
|
+
if (!bounds)
|
|
154
|
+
return;
|
|
155
|
+
const lx = bounds.x - shape.x;
|
|
156
|
+
const ly = bounds.y - shape.y;
|
|
157
|
+
let outline = slot.querySelector(':scope > .od-selection-outline');
|
|
158
|
+
if (!outline) {
|
|
159
|
+
outline = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
160
|
+
outline.setAttribute('class', 'od-selection-outline');
|
|
161
|
+
outline.setAttribute('fill', 'none');
|
|
162
|
+
outline.setAttribute('stroke', '#3b82f6');
|
|
163
|
+
outline.setAttribute('stroke-width', '1.5');
|
|
164
|
+
outline.setAttribute('pointer-events', 'none');
|
|
165
|
+
slot.appendChild(outline);
|
|
166
|
+
}
|
|
167
|
+
outline.setAttribute('x', String(lx - 2));
|
|
168
|
+
outline.setAttribute('y', String(ly - 2));
|
|
169
|
+
outline.setAttribute('width', String(Math.max(1, bounds.width + 4)));
|
|
170
|
+
outline.setAttribute('height', String(Math.max(1, bounds.height + 4)));
|
|
171
|
+
}
|
|
172
|
+
_removeOutline(renderer, id) {
|
|
173
|
+
const slot = renderer.getOverlaySlot(id);
|
|
174
|
+
if (!slot)
|
|
175
|
+
return;
|
|
176
|
+
const outline = slot.querySelector(':scope > .od-selection-outline');
|
|
177
|
+
outline?.remove();
|
|
178
|
+
removeHandles(slot);
|
|
179
|
+
}
|
|
180
|
+
_notify() {
|
|
181
|
+
for (const listener of this.listeners) {
|
|
182
|
+
listener(this.selectedIds);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
_arraysEqual(a, b) {
|
|
186
|
+
if (a.length !== b.length)
|
|
187
|
+
return false;
|
|
188
|
+
for (let i = 0; i < a.length; i++) {
|
|
189
|
+
if (a[i] !== b[i])
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/selection/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Bounds, Point, ShapeId } from '@open-draw/schema';
|
|
2
|
+
import type { ShapeRegistry } from '../registry.js';
|
|
3
|
+
import type { CanvasStore } from '../store/index.js';
|
|
4
|
+
export declare function computeMarqueeBounds(start: Point, current: Point): Bounds;
|
|
5
|
+
export declare function findIntersectingShapes(box: Bounds, store: CanvasStore, registry: ShapeRegistry): readonly ShapeId[];
|
|
6
|
+
export declare class MarqueeOverlay {
|
|
7
|
+
private el;
|
|
8
|
+
show(container: HTMLElement, bounds: Bounds): void;
|
|
9
|
+
hide(): void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=marquee.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marquee.d.ts","sourceRoot":"","sources":["../../src/selection/marquee.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,GAAG,MAAM,CAMzE;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,aAAa,GACtB,SAAS,OAAO,EAAE,CAYpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAA+B;IAEzC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmBjD;IAED,IAAI,IAAI,IAAI,CAKX;CACF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { boundsIntersect, boundsOf } from '@open-draw/schema';
|
|
2
|
+
export function computeMarqueeBounds(start, current) {
|
|
3
|
+
const x = Math.min(start.x, current.x);
|
|
4
|
+
const y = Math.min(start.y, current.y);
|
|
5
|
+
const width = Math.abs(current.x - start.x);
|
|
6
|
+
const height = Math.abs(current.y - start.y);
|
|
7
|
+
return boundsOf(x, y, width, height);
|
|
8
|
+
}
|
|
9
|
+
export function findIntersectingShapes(box, store, registry) {
|
|
10
|
+
const hitIds = [];
|
|
11
|
+
for (const shape of store.listShapes()) {
|
|
12
|
+
if (shape.hidden)
|
|
13
|
+
continue;
|
|
14
|
+
const def = registry.get(shape.type);
|
|
15
|
+
if (!def)
|
|
16
|
+
continue;
|
|
17
|
+
const shapeBounds = def.geometry.bounds(shape);
|
|
18
|
+
if (boundsIntersect(box, shapeBounds)) {
|
|
19
|
+
hitIds.push(shape.id);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return hitIds;
|
|
23
|
+
}
|
|
24
|
+
export class MarqueeOverlay {
|
|
25
|
+
el = null;
|
|
26
|
+
show(container, bounds) {
|
|
27
|
+
const viewport = container.querySelector('.od-viewport');
|
|
28
|
+
if (!viewport)
|
|
29
|
+
return;
|
|
30
|
+
if (!this.el) {
|
|
31
|
+
this.el = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
|
|
32
|
+
this.el.setAttribute('class', 'od-marquee');
|
|
33
|
+
this.el.setAttribute('fill', 'rgba(59, 130, 246, 0.1)');
|
|
34
|
+
this.el.setAttribute('stroke', '#3b82f6');
|
|
35
|
+
this.el.setAttribute('stroke-width', '1');
|
|
36
|
+
this.el.setAttribute('stroke-dasharray', '3 3');
|
|
37
|
+
this.el.setAttribute('pointer-events', 'none');
|
|
38
|
+
viewport.appendChild(this.el);
|
|
39
|
+
}
|
|
40
|
+
this.el.setAttribute('x', String(bounds.x));
|
|
41
|
+
this.el.setAttribute('y', String(bounds.y));
|
|
42
|
+
this.el.setAttribute('width', String(bounds.width));
|
|
43
|
+
this.el.setAttribute('height', String(bounds.height));
|
|
44
|
+
}
|
|
45
|
+
hide() {
|
|
46
|
+
if (this.el) {
|
|
47
|
+
this.el.remove();
|
|
48
|
+
this.el = null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=marquee.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marquee.js","sourceRoot":"","sources":["../../src/selection/marquee.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ShapeId } from '@open-draw/schema';
|
|
2
|
+
import type { ShapeRegistry } from '../registry.js';
|
|
3
|
+
import type { CanvasStore } from '../store/index.js';
|
|
4
|
+
import type { CameraController } from '../camera.js';
|
|
5
|
+
/**
|
|
6
|
+
* Handles gesture-based re-parenting and detaching when dragging shapes (§5).
|
|
7
|
+
* - Dragging a shape OUT of its frame past bounds + threshold (12px screen) detaches it.
|
|
8
|
+
* - Dropping a shape fully inside another frame parents it (smallest-area wins on overlap).
|
|
9
|
+
* - Dragging between frames (out of A, into B) executes as a single atomic transaction.
|
|
10
|
+
*/
|
|
11
|
+
export declare function handleGestureReparent(shapeId: ShapeId, store: CanvasStore, registry: ShapeRegistry, camera: CameraController): void;
|
|
12
|
+
//# sourceMappingURL=reparent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reparent.d.ts","sourceRoot":"","sources":["../../src/selection/reparent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGrD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAmDN"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { findSuggestedParent } from '../capabilities/clipping/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handles gesture-based re-parenting and detaching when dragging shapes (§5).
|
|
4
|
+
* - Dragging a shape OUT of its frame past bounds + threshold (12px screen) detaches it.
|
|
5
|
+
* - Dropping a shape fully inside another frame parents it (smallest-area wins on overlap).
|
|
6
|
+
* - Dragging between frames (out of A, into B) executes as a single atomic transaction.
|
|
7
|
+
*/
|
|
8
|
+
export function handleGestureReparent(shapeId, store, registry, camera) {
|
|
9
|
+
const shape = store.getShape(shapeId);
|
|
10
|
+
if (!shape)
|
|
11
|
+
return;
|
|
12
|
+
const def = registry.get(shape.type);
|
|
13
|
+
if (!def)
|
|
14
|
+
return;
|
|
15
|
+
const bounds = def.geometry.bounds(shape);
|
|
16
|
+
const currentParentId = (shape.meta['parent'] ?? shape.meta['parentId']);
|
|
17
|
+
// 1. Check if dropped fully inside any frame (smallest area candidate wins)
|
|
18
|
+
const suggested = findSuggestedParent(bounds, store.listShapes(), registry, shape.id);
|
|
19
|
+
if (suggested) {
|
|
20
|
+
if (suggested.id !== currentParentId) {
|
|
21
|
+
store.updateShape(shape.id, {
|
|
22
|
+
meta: { ...shape.meta, parent: suggested.id, parentId: undefined },
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// 2. If it was inside a parent, check if dragged past threshold to detach
|
|
28
|
+
if (currentParentId) {
|
|
29
|
+
const parent = store.getShape(currentParentId);
|
|
30
|
+
if (!parent) {
|
|
31
|
+
_detach(shape, store);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const parentDef = registry.get(parent.type);
|
|
35
|
+
if (!parentDef) {
|
|
36
|
+
_detach(shape, store);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const parentBounds = parentDef.geometry.bounds(parent);
|
|
40
|
+
const p0 = camera.screenToPage({ x: 0, y: 0 });
|
|
41
|
+
const p1 = camera.screenToPage({ x: 12, y: 0 });
|
|
42
|
+
const threshold = Math.abs(p1.x - p0.x);
|
|
43
|
+
const isPastThreshold = bounds.x < parentBounds.x - threshold ||
|
|
44
|
+
bounds.y < parentBounds.y - threshold ||
|
|
45
|
+
bounds.x + bounds.width > parentBounds.x + parentBounds.width + threshold ||
|
|
46
|
+
bounds.y + bounds.height > parentBounds.y + parentBounds.height + threshold;
|
|
47
|
+
if (isPastThreshold) {
|
|
48
|
+
_detach(shape, store);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function _detach(shape, store) {
|
|
53
|
+
store.updateShape(shape.id, {
|
|
54
|
+
meta: { ...shape.meta, parent: undefined, parentId: undefined },
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=reparent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reparent.js","sourceRoot":"","sources":["../../src/selection/reparent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Bounds } from '@open-draw/schema';
|
|
2
|
+
import type { HandleType } from './handles.js';
|
|
3
|
+
export interface ResizeOptions {
|
|
4
|
+
readonly aspect?: boolean;
|
|
5
|
+
readonly fromCenter?: boolean;
|
|
6
|
+
readonly minW?: number;
|
|
7
|
+
readonly minH?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function resizeBounds(initial: Bounds, handle: HandleType, dx: number, dy: number, options?: ResizeOptions): Bounds;
|
|
10
|
+
//# sourceMappingURL=resize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resize.d.ts","sourceRoot":"","sources":["../../src/selection/resize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,EAClB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAqER"}
|