@rasamjs/connectors 0.0.0-stage → 0.1.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 (46) hide show
  1. package/API.md +114 -0
  2. package/CHANGELOG.md +13 -0
  3. package/LICENSE +21 -0
  4. package/README.md +44 -2
  5. package/RELEASING.md +25 -0
  6. package/dist/connectors.d.ts +26 -0
  7. package/dist/connectors.d.ts.map +1 -0
  8. package/dist/connectors.js +231 -0
  9. package/dist/connectors.js.map +1 -0
  10. package/dist/editor.d.ts +42 -0
  11. package/dist/editor.d.ts.map +1 -0
  12. package/dist/editor.js +55 -0
  13. package/dist/editor.js.map +1 -0
  14. package/dist/index.d.ts +5 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +4 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/metadata.d.ts +8 -0
  19. package/dist/metadata.d.ts.map +1 -0
  20. package/dist/metadata.js +47 -0
  21. package/dist/metadata.js.map +1 -0
  22. package/dist/routing.d.ts +11 -0
  23. package/dist/routing.d.ts.map +1 -0
  24. package/dist/routing.js +110 -0
  25. package/dist/routing.js.map +1 -0
  26. package/dist/tool-surface.d.ts +21 -0
  27. package/dist/tool-surface.d.ts.map +1 -0
  28. package/dist/tool-surface.js +98 -0
  29. package/dist/tool-surface.js.map +1 -0
  30. package/dist/tool.d.ts +44 -0
  31. package/dist/tool.d.ts.map +1 -0
  32. package/dist/tool.js +305 -0
  33. package/dist/tool.js.map +1 -0
  34. package/dist/types.d.ts +36 -0
  35. package/dist/types.d.ts.map +1 -0
  36. package/dist/types.js +2 -0
  37. package/dist/types.js.map +1 -0
  38. package/package.json +61 -4
  39. package/src/connectors.ts +248 -0
  40. package/src/editor.ts +82 -0
  41. package/src/index.ts +14 -0
  42. package/src/metadata.ts +63 -0
  43. package/src/routing.ts +127 -0
  44. package/src/tool-surface.ts +96 -0
  45. package/src/tool.ts +344 -0
  46. package/src/types.ts +33 -0
@@ -0,0 +1,47 @@
1
+ import { Path } from '@rasamjs/core';
2
+ import { data } from '@rasamjs/core/data';
3
+ import { validateAnchor, validatePoint } from './routing.js';
4
+ export const endpointAttribute = (end) => `data-rasam-connector-${end}`;
5
+ const metadataKey = 'rasam-connector';
6
+ export function isConnector(node) {
7
+ return node instanceof Path && node.getAttributeValue('data-rasam-connector') !== undefined;
8
+ }
9
+ export function readConnector(path) {
10
+ const saved = data(path, metadataKey);
11
+ if (!saved || saved.version !== 1 || !['straight', 'elbow'].includes(saved.routing))
12
+ throw new TypeError('Invalid connector metadata');
13
+ const endpoint = (end) => {
14
+ const value = saved[end];
15
+ if (!value || typeof value !== 'object')
16
+ throw new TypeError('Invalid connector endpoint metadata');
17
+ if (value.point) {
18
+ validatePoint(value.point);
19
+ return { point: { ...value.point } };
20
+ }
21
+ const target = path.references.get(endpointAttribute(end));
22
+ if (!target || !('toRoot' in target))
23
+ throw new TypeError('Connector endpoint has no bound target');
24
+ validateAnchor(value.anchor ?? 'auto');
25
+ return {
26
+ target: target,
27
+ anchor: typeof value.anchor === 'object' ? { ...value.anchor } : (value.anchor ?? 'auto'),
28
+ };
29
+ };
30
+ return { path, start: endpoint('start'), end: endpoint('end'), routing: saved.routing };
31
+ }
32
+ export function writeConnector(path, state) {
33
+ const save = (end) => {
34
+ const endpoint = state[end];
35
+ path.reference(endpointAttribute(end), 'target' in endpoint ? endpoint.target : null, 'href');
36
+ return 'point' in endpoint
37
+ ? { point: { ...endpoint.point } }
38
+ : { anchor: endpoint.anchor ?? 'auto' };
39
+ };
40
+ data(path, metadataKey, {
41
+ version: 1,
42
+ routing: state.routing,
43
+ start: save('start'),
44
+ end: save('end'),
45
+ });
46
+ }
47
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Point } from '@rasamjs/core';
2
+ import type { ConnectorAnchor, ConnectorEndpoint, ConnectorPort, ConnectorRoute } from './types.js';
3
+ export declare function validatePoint(point: Point, normalized?: boolean): void;
4
+ export declare function validateAnchor(anchor: ConnectorAnchor): void;
5
+ export declare function endpointCenter(endpoint: ConnectorEndpoint): Point | null;
6
+ /** Resolve on the local box, then map into drawing units, retaining rotated anchors. */
7
+ export declare function connectorPort(endpoint: ConnectorEndpoint, toward: Point): ConnectorPort | null;
8
+ /** Manhattan routing with short outward leads. It does not avoid other shapes. */
9
+ export declare function routeConnector({ start, end, routing }: ConnectorRoute): readonly Point[];
10
+ export declare function pathData(points: readonly Point[]): string;
11
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../src/routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,cAAc,EAEf,MAAM,YAAY,CAAC;AAEpB,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,UAAQ,GAAG,IAAI,CAUpE;AACD,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAK5D;AACD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,GAAG,KAAK,GAAG,IAAI,CAMxE;AACD,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,KAAK,GAAG,aAAa,GAAG,IAAI,CAsD9F;AACD,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,GAAG,SAAS,KAAK,EAAE,CA4BxF;AACD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,MAAM,CAOzD"}
@@ -0,0 +1,110 @@
1
+ export function validatePoint(point, normalized = false) {
2
+ if (!point ||
3
+ !Number.isFinite(point.x) ||
4
+ !Number.isFinite(point.y) ||
5
+ (normalized && (point.x < 0 || point.x > 1 || point.y < 0 || point.y > 1)))
6
+ throw new TypeError(normalized ? 'Anchor point must lie between 0 and 1' : 'Connector point must be finite');
7
+ }
8
+ export function validateAnchor(anchor) {
9
+ if (typeof anchor === 'string') {
10
+ if (!['auto', 'top', 'right', 'bottom', 'left'].includes(anchor))
11
+ throw new TypeError('Unknown connector anchor');
12
+ }
13
+ else
14
+ validatePoint(anchor, true);
15
+ }
16
+ export function endpointCenter(endpoint) {
17
+ if ('point' in endpoint)
18
+ return endpoint.point;
19
+ const bounds = endpoint.target.bounds();
20
+ if (!('box' in bounds))
21
+ return null;
22
+ const { x, y, width, height } = bounds.box;
23
+ return endpoint.target.toRoot({ x: x + width / 2, y: y + height / 2 });
24
+ }
25
+ /** Resolve on the local box, then map into drawing units, retaining rotated anchors. */
26
+ export function connectorPort(endpoint, toward) {
27
+ if ('point' in endpoint)
28
+ return { point: endpoint.point, direction: { x: 0, y: 0 } };
29
+ const { target, anchor = 'auto' } = endpoint;
30
+ const bounds = target.bounds();
31
+ if (!('box' in bounds))
32
+ return null;
33
+ const { x, y, width, height } = bounds.box;
34
+ const center = { x: x + width / 2, y: y + height / 2 };
35
+ let side = 'right';
36
+ let point;
37
+ if (typeof anchor === 'object')
38
+ point = { x: x + anchor.x * width, y: y + anchor.y * height };
39
+ else if (anchor !== 'auto') {
40
+ side = anchor;
41
+ point = {
42
+ x: side === 'left' ? x : side === 'right' ? x + width : center.x,
43
+ y: side === 'top' ? y : side === 'bottom' ? y + height : center.y,
44
+ };
45
+ }
46
+ else {
47
+ const local = target.fromRoot(toward);
48
+ if (!local)
49
+ return null;
50
+ const dx = local.x - center.x, dy = local.y - center.y;
51
+ const ratio = Math.max(width ? Math.abs(dx) / (width / 2) : Infinity, height ? Math.abs(dy) / (height / 2) : Infinity);
52
+ point =
53
+ ratio > 0 && Number.isFinite(ratio)
54
+ ? { x: center.x + dx / ratio, y: center.y + dy / ratio }
55
+ : { x: x + width, y: center.y };
56
+ side =
57
+ Math.abs(point.x - center.x) / (width || 1) >= Math.abs(point.y - center.y) / (height || 1)
58
+ ? dx < 0
59
+ ? 'left'
60
+ : 'right'
61
+ : dy < 0
62
+ ? 'top'
63
+ : 'bottom';
64
+ }
65
+ const root = target.toRoot(point);
66
+ const localDirection = typeof anchor === 'object'
67
+ ? { x: point.x - center.x, y: point.y - center.y }
68
+ : {
69
+ x: side === 'left' ? -1 : side === 'right' ? 1 : 0,
70
+ y: side === 'top' ? -1 : side === 'bottom' ? 1 : 0,
71
+ };
72
+ const offset = target.toRoot({ x: point.x + localDirection.x, y: point.y + localDirection.y });
73
+ const dx = offset.x - root.x, dy = offset.y - root.y;
74
+ return {
75
+ point: root,
76
+ direction: Math.abs(dx) >= Math.abs(dy) ? { x: Math.sign(dx), y: 0 } : { x: 0, y: Math.sign(dy) },
77
+ };
78
+ }
79
+ /** Manhattan routing with short outward leads. It does not avoid other shapes. */
80
+ export function routeConnector({ start, end, routing }) {
81
+ if (routing === 'straight')
82
+ return [start.point, end.point];
83
+ if (routing !== 'elbow')
84
+ throw new TypeError('Unknown connector routing');
85
+ const lead = (port) => ({
86
+ x: port.point.x + port.direction.x * 16,
87
+ y: port.point.y + port.direction.y * 16,
88
+ });
89
+ const a = lead(start), b = lead(end);
90
+ const horizontal = start.direction.x !== 0 || (!start.direction.y && Math.abs(b.x - a.x) >= Math.abs(b.y - a.y));
91
+ const endHorizontal = end.direction.x !== 0 || (!end.direction.y && horizontal);
92
+ const bends = horizontal !== endHorizontal
93
+ ? [horizontal ? { x: b.x, y: a.y } : { x: a.x, y: b.y }]
94
+ : horizontal
95
+ ? [
96
+ { x: (a.x + b.x) / 2, y: a.y },
97
+ { x: (a.x + b.x) / 2, y: b.y },
98
+ ]
99
+ : [
100
+ { x: a.x, y: (a.y + b.y) / 2 },
101
+ { x: b.x, y: (a.y + b.y) / 2 },
102
+ ];
103
+ return [start.point, a, ...bends, b, end.point].filter((point, index, points) => index === 0 || point.x !== points[index - 1].x || point.y !== points[index - 1].y);
104
+ }
105
+ export function pathData(points) {
106
+ return points
107
+ .map((point, index) => `${index ? 'L' : 'M'}${Number(point.x.toFixed(6))} ${Number(point.y.toFixed(6))}`)
108
+ .join(' ');
109
+ }
110
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../src/routing.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,aAAa,CAAC,KAAY,EAAE,UAAU,GAAG,KAAK;IAC5D,IACE,CAAC,KAAK;QACN,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACzB,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACzB,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE1E,MAAM,IAAI,SAAS,CACjB,UAAU,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,gCAAgC,CACxF,CAAC;AACN,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,MAAuB;IACpD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC9D,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAC;IACpD,CAAC;;QAAM,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,QAA2B;IACxD,IAAI,OAAO,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAC;IAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IACxC,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;IAC3C,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;AACzE,CAAC;AACD,wFAAwF;AACxF,MAAM,UAAU,aAAa,CAAC,QAA2B,EAAE,MAAa;IACtE,IAAI,OAAO,IAAI,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;IACrF,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,QAAQ,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IAC/B,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;IAC3C,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;IACvD,IAAI,IAAI,GAAkB,OAAO,CAAC;IAClC,IAAI,KAAY,CAAC;IACjB,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC;SACzF,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC3B,IAAI,GAAG,MAAM,CAAC;QACd,KAAK,GAAG;YACN,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAChE,CAAC,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;SAClE,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAC3B,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAC7C,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAChD,CAAC;QACF,KAAK;YACH,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACjC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE;gBACxD,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QACpC,IAAI;YACF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;gBACzF,CAAC,CAAC,EAAE,GAAG,CAAC;oBACN,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,OAAO;gBACX,CAAC,CAAC,EAAE,GAAG,CAAC;oBACN,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,QAAQ,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,cAAc,GAClB,OAAO,MAAM,KAAK,QAAQ;QACxB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE;QAClD,CAAC,CAAC;YACE,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,CAAC,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACnD,CAAC;IACR,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/F,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAC1B,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACzB,OAAO;QACL,KAAK,EAAE,IAAI;QACX,SAAS,EACP,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;KACzF,CAAC;AACJ,CAAC;AACD,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAkB;IACpE,IAAI,OAAO,KAAK,UAAU;QAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,OAAO,KAAK,OAAO;QAAE,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,CAAC,IAAmB,EAAE,EAAE,CAAC,CAAC;QACrC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE;QACvC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE;KACxC,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EACnB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,MAAM,UAAU,GACd,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,aAAa,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC;IAChF,MAAM,KAAK,GACT,UAAU,KAAK,aAAa;QAC1B,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,CAAC,CAAC,UAAU;YACV,CAAC,CAAC;gBACE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;gBAC9B,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;aAC/B;YACH,CAAC,CAAC;gBACE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;gBAC9B,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;aAC/B,CAAC;IACV,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CACpD,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CACvB,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CACpF,CAAC;AACJ,CAAC;AACD,MAAM,UAAU,QAAQ,CAAC,MAAwB;IAC/C,OAAO,MAAM;SACV,GAAG,CACF,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CACf,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CACpF;SACA,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Point, Svg } from '@rasamjs/core';
2
+ export declare function svg<Tag extends keyof SVGElementTagNameMap>(document: Document, tag: Tag, attributes?: Record<string, string | number>): SVGElementTagNameMap[Tag];
3
+ /** Connector UI lives outside the managed SVG; none of it can enter export/history. */
4
+ export declare class ToolSurface {
5
+ readonly drawing: Svg;
6
+ private readonly render;
7
+ readonly element: SVGSVGElement;
8
+ readonly view: Window & typeof globalThis;
9
+ private readonly cleanups;
10
+ private pending;
11
+ private disposed;
12
+ constructor(drawing: Svg, render: () => void);
13
+ get isDestroyed(): boolean;
14
+ cleanup(stop: () => void): void;
15
+ listen(target: EventTarget, type: string, listener: EventListener, capture?: boolean): void;
16
+ fromRoot(point: Point): Point | null;
17
+ readonly schedule: () => void;
18
+ update(): void;
19
+ destroy(): void;
20
+ }
21
+ //# sourceMappingURL=tool-surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-surface.d.ts","sourceRoot":"","sources":["../src/tool-surface.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEhD,wBAAgB,GAAG,CAAC,GAAG,SAAS,MAAM,oBAAoB,EACxD,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,GAAG,EACR,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAM,GAC/C,oBAAoB,CAAC,GAAG,CAAC,CAI3B;AACD,uFAAuF;AACvF,qBAAa,WAAW;IAOpB,QAAQ,CAAC,OAAO,EAAE,GAAG;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPzB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,UAAU,CAAC;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAS;IACzB,YACW,OAAO,EAAE,GAAG,EACJ,MAAM,EAAE,MAAM,IAAI,EA+BpC;IACD,IAAI,WAAW,IAAI,OAAO,CAEzB;IACD,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,IAAI,CAE9B;IACD,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,UAAQ,GAAG,IAAI,CAGxF;IACD,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,CAMnC;IACD,QAAQ,CAAC,QAAQ,QAAO,IAAI,CAM1B;IACF,MAAM,IAAI,IAAI,CAEb;IACD,OAAO,IAAI,IAAI,CAcd;CACF"}
@@ -0,0 +1,98 @@
1
+ import { Matrix } from '@rasamjs/core';
2
+ const namespace = 'http://www.w3.org/2000/svg';
3
+ export function svg(document, tag, attributes = {}) {
4
+ const element = document.createElementNS(namespace, tag);
5
+ for (const [name, value] of Object.entries(attributes))
6
+ element.setAttribute(name, String(value));
7
+ return element;
8
+ }
9
+ /** Connector UI lives outside the managed SVG; none of it can enter export/history. */
10
+ export class ToolSurface {
11
+ drawing;
12
+ render;
13
+ element;
14
+ view;
15
+ cleanups = [];
16
+ pending = null;
17
+ disposed = false;
18
+ constructor(drawing, render) {
19
+ this.drawing = drawing;
20
+ this.render = render;
21
+ if (drawing.isDestroyed || !drawing.el.isConnected || !drawing.el.parentElement)
22
+ throw new TypeError('Connector tool needs a mounted drawing');
23
+ this.view = drawing.el.ownerDocument.defaultView;
24
+ this.element = svg(drawing.el.ownerDocument, 'svg', {
25
+ class: 'rasam-connector-tool',
26
+ width: '100%',
27
+ height: '100%',
28
+ 'aria-label': 'Connector tool',
29
+ });
30
+ Object.assign(this.element.style, {
31
+ position: 'absolute',
32
+ inset: '0',
33
+ overflow: 'visible',
34
+ pointerEvents: 'none',
35
+ touchAction: 'none',
36
+ zIndex: '25',
37
+ });
38
+ drawing.el.parentElement.append(this.element);
39
+ this.listen(this.view, 'resize', this.schedule);
40
+ this.listen(this.view, 'scroll', this.schedule, true);
41
+ const mutation = new this.view.MutationObserver(this.schedule);
42
+ mutation.observe(drawing.el, { attributes: true });
43
+ const resize = new this.view.ResizeObserver(this.schedule);
44
+ resize.observe(drawing.el);
45
+ this.cleanup(() => {
46
+ mutation.disconnect();
47
+ resize.disconnect();
48
+ });
49
+ this.cleanup(drawing.onDispose(() => this.destroy()));
50
+ }
51
+ get isDestroyed() {
52
+ return this.disposed;
53
+ }
54
+ cleanup(stop) {
55
+ this.cleanups.push(stop);
56
+ }
57
+ listen(target, type, listener, capture = false) {
58
+ target.addEventListener(type, listener, capture);
59
+ this.cleanup(() => target.removeEventListener(type, listener, capture));
60
+ }
61
+ fromRoot(point) {
62
+ const client = this.drawing.toClient(point), m = this.element.getScreenCTM?.();
63
+ return client && m
64
+ ? (new Matrix(m.a, m.b, m.c, m.d, m.e, m.f).inverse()?.apply(client) ?? null)
65
+ : null;
66
+ }
67
+ schedule = () => {
68
+ if (!this.disposed && this.pending === null)
69
+ this.pending = this.view.requestAnimationFrame(() => {
70
+ this.pending = null;
71
+ this.render();
72
+ });
73
+ };
74
+ update() {
75
+ if (!this.disposed)
76
+ this.render();
77
+ }
78
+ destroy() {
79
+ if (this.disposed)
80
+ return;
81
+ this.disposed = true;
82
+ if (this.pending !== null)
83
+ this.view.cancelAnimationFrame(this.pending);
84
+ const failures = [];
85
+ for (const stop of this.cleanups.splice(0).reverse()) {
86
+ try {
87
+ stop();
88
+ }
89
+ catch (error) {
90
+ failures.push(error);
91
+ }
92
+ }
93
+ this.element.remove();
94
+ if (failures.length)
95
+ throw new AggregateError(failures, 'Connector tool cleanup failed');
96
+ }
97
+ }
98
+ //# sourceMappingURL=tool-surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-surface.js","sourceRoot":"","sources":["../src/tool-surface.ts"],"names":[],"mappings":"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"}
package/dist/tool.d.ts ADDED
@@ -0,0 +1,44 @@
1
+ import type { Path } from '@rasamjs/core';
2
+ import type { Connectors } from './connectors.js';
3
+ import type { ConnectorOptions, ConnectorTarget } from './types.js';
4
+ export interface ConnectorToolOptions extends Pick<ConnectorOptions, 'routing' | 'arrows' | 'stroke' | 'strokeWidth'> {
5
+ readonly selectable?: (node: ConnectorTarget) => boolean;
6
+ readonly onCreate?: (path: Path) => void;
7
+ readonly onGesture?: (active: boolean) => void;
8
+ readonly onError?: (error: unknown) => void;
9
+ readonly onExit?: () => void;
10
+ }
11
+ /** Drag from a hinted anchor or free point. The document is written only on release. */
12
+ export declare class ConnectorTool {
13
+ readonly connectors: Connectors;
14
+ private readonly surface;
15
+ private active;
16
+ private press;
17
+ private hover;
18
+ private options;
19
+ constructor(connectors: Connectors, options?: ConnectorToolOptions);
20
+ get isDestroyed(): boolean;
21
+ get enabled(): boolean;
22
+ get paint(): {
23
+ readonly stroke: string;
24
+ readonly strokeWidth: number;
25
+ };
26
+ set paint(paint: {
27
+ readonly stroke: string;
28
+ readonly strokeWidth: number;
29
+ });
30
+ set enabled(value: boolean);
31
+ update(): this;
32
+ destroy(): void;
33
+ cancel(): void;
34
+ private acceptsKeyboard;
35
+ private attempt;
36
+ private pick;
37
+ private readonly over;
38
+ private readonly down;
39
+ private readonly move;
40
+ private readonly up;
41
+ private readonly lost;
42
+ private render;
43
+ }
44
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAS,MAAM,eAAe,CAAC;AAGjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIlD,OAAO,KAAK,EAEV,gBAAgB,EAEhB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAChD,gBAAgB,EAChB,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAChD;IACC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,OAAO,CAAC;IACzD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CAC9B;AAYD,wFAAwF;AACxF,qBAAa,aAAa;IAOtB,QAAQ,CAAC,UAAU,EAAE,UAAU;IANjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,OAAO,CAAuB;IACtC,YACW,UAAU,EAAE,UAAU,EAC/B,OAAO,GAAE,oBAAyB,EAuEnC;IACD,IAAI,WAAW,IAAI,OAAO,CAEzB;IACD,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,KAAK,IAAI;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAKrE;IACD,IAAI,KAAK,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAYzE;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAWzB;IACD,MAAM,IAAI,IAAI,CAGb;IACD,OAAO,IAAI,IAAI,CAEd;IACD,MAAM,IAAI,IAAI,CASb;IACD,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,IAAI;IAiDZ,OAAO,CAAC,QAAQ,CAAC,IAAI,CAMnB;IACF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAmBnB;IACF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAOnB;IACF,OAAO,CAAC,QAAQ,CAAC,EAAE,CAYjB;IACF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAEnB;IACF,OAAO,CAAC,MAAM;CAgDf"}