system-canvas 0.2.5 → 0.2.7

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.
@@ -0,0 +1,33 @@
1
+ export interface AlignmentGuide {
2
+ axis: 'x' | 'y';
3
+ position: number;
4
+ span: {
5
+ start: number;
6
+ end: number;
7
+ };
8
+ kind: 'edge' | 'center';
9
+ }
10
+ type NodeRect = {
11
+ id: string;
12
+ x: number;
13
+ y: number;
14
+ width: number;
15
+ height: number;
16
+ };
17
+ export declare function computeAlignmentGuides(dragging: NodeRect[], others: NodeRect[], threshold: number): AlignmentGuide[];
18
+ export declare function alignNodes(nodes: NodeRect[], direction: 'left' | 'right' | 'top' | 'bottom' | 'centerH' | 'centerV'): {
19
+ id: string;
20
+ patch: {
21
+ x?: number;
22
+ y?: number;
23
+ };
24
+ }[];
25
+ export declare function distributeNodes(nodes: NodeRect[], axis: 'horizontal' | 'vertical'): {
26
+ id: string;
27
+ patch: {
28
+ x?: number;
29
+ y?: number;
30
+ };
31
+ }[];
32
+ export {};
33
+ //# sourceMappingURL=alignment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alignment.d.ts","sourceRoot":"","sources":["../src/alignment.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,GAAG,GAAG,GAAG,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;CACxB;AAED,KAAK,QAAQ,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAsBnF,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,EAAE,EACpB,MAAM,EAAE,QAAQ,EAAE,EAClB,SAAS,EAAE,MAAM,GAChB,cAAc,EAAE,CA8BlB;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,QAAQ,EAAE,EACjB,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GACrE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EAAE,CAoCrD;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,QAAQ,EAAE,EACjB,IAAI,EAAE,YAAY,GAAG,UAAU,GAC9B;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EAAE,CA6BrD"}
@@ -0,0 +1,123 @@
1
+ function getAnchors(n) {
2
+ return [
3
+ { axis: 'x', value: n.x, kind: 'edge', perpStart: n.y, perpEnd: n.y + n.height },
4
+ { axis: 'x', value: n.x + n.width / 2, kind: 'center', perpStart: n.y, perpEnd: n.y + n.height },
5
+ { axis: 'x', value: n.x + n.width, kind: 'edge', perpStart: n.y, perpEnd: n.y + n.height },
6
+ { axis: 'y', value: n.y, kind: 'edge', perpStart: n.x, perpEnd: n.x + n.width },
7
+ { axis: 'y', value: n.y + n.height / 2, kind: 'center', perpStart: n.x, perpEnd: n.x + n.width },
8
+ { axis: 'y', value: n.y + n.height, kind: 'edge', perpStart: n.x, perpEnd: n.x + n.width },
9
+ ];
10
+ }
11
+ export function computeAlignmentGuides(dragging, others, threshold) {
12
+ if (dragging.length === 0 || others.length === 0)
13
+ return [];
14
+ // key: `${axis}:${position}` -> widest span guide
15
+ const map = new Map();
16
+ for (const d of dragging) {
17
+ const dAnchors = getAnchors(d);
18
+ for (const o of others) {
19
+ const oAnchors = getAnchors(o);
20
+ for (const da of dAnchors) {
21
+ for (const oa of oAnchors) {
22
+ if (da.axis !== oa.axis || da.kind !== oa.kind)
23
+ continue;
24
+ if (Math.abs(da.value - oa.value) > threshold)
25
+ continue;
26
+ const position = oa.value;
27
+ const spanStart = Math.min(da.perpStart, oa.perpStart);
28
+ const spanEnd = Math.max(da.perpEnd, oa.perpEnd);
29
+ const key = `${da.axis}:${position}`;
30
+ const existing = map.get(key);
31
+ if (!existing || (spanEnd - spanStart) > (existing.span.end - existing.span.start)) {
32
+ map.set(key, { axis: da.axis, position, span: { start: spanStart, end: spanEnd }, kind: da.kind });
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }
38
+ return Array.from(map.values());
39
+ }
40
+ export function alignNodes(nodes, direction) {
41
+ if (nodes.length === 0)
42
+ return [];
43
+ let ref;
44
+ switch (direction) {
45
+ case 'left':
46
+ ref = Math.min(...nodes.map(n => n.x));
47
+ break;
48
+ case 'right':
49
+ ref = Math.max(...nodes.map(n => n.x + n.width));
50
+ break;
51
+ case 'top':
52
+ ref = Math.min(...nodes.map(n => n.y));
53
+ break;
54
+ case 'bottom':
55
+ ref = Math.max(...nodes.map(n => n.y + n.height));
56
+ break;
57
+ case 'centerH':
58
+ ref = nodes.reduce((s, n) => s + (n.x + n.width / 2), 0) / nodes.length;
59
+ break;
60
+ case 'centerV':
61
+ ref = nodes.reduce((s, n) => s + (n.y + n.height / 2), 0) / nodes.length;
62
+ break;
63
+ }
64
+ const result = [];
65
+ for (const n of nodes) {
66
+ let newX;
67
+ let newY;
68
+ switch (direction) {
69
+ case 'left':
70
+ newX = ref;
71
+ break;
72
+ case 'right':
73
+ newX = ref - n.width;
74
+ break;
75
+ case 'top':
76
+ newY = ref;
77
+ break;
78
+ case 'bottom':
79
+ newY = ref - n.height;
80
+ break;
81
+ case 'centerH':
82
+ newX = ref - n.width / 2;
83
+ break;
84
+ case 'centerV':
85
+ newY = ref - n.height / 2;
86
+ break;
87
+ }
88
+ const patch = {};
89
+ if (newX !== undefined && newX !== n.x)
90
+ patch.x = newX;
91
+ if (newY !== undefined && newY !== n.y)
92
+ patch.y = newY;
93
+ if (Object.keys(patch).length > 0)
94
+ result.push({ id: n.id, patch });
95
+ }
96
+ return result;
97
+ }
98
+ export function distributeNodes(nodes, axis) {
99
+ if (nodes.length < 3)
100
+ return [];
101
+ const isH = axis === 'horizontal';
102
+ const sorted = [...nodes].sort((a, b) => (isH ? a.x - b.x : a.y - b.y));
103
+ const first = sorted[0];
104
+ const last = sorted[sorted.length - 1];
105
+ const outerStart = isH ? first.x : first.y;
106
+ const outerEnd = isH ? last.x + last.width : last.y + last.height;
107
+ const sumInnerSizes = sorted.slice(1, -1).reduce((s, n) => s + (isH ? n.width : n.height), 0);
108
+ const totalOuterSize = isH ? first.width + last.width : first.height + last.height;
109
+ const spacing = (outerEnd - outerStart - totalOuterSize - sumInnerSizes) / (sorted.length - 1);
110
+ const result = [];
111
+ let cursor = outerStart + (isH ? first.width : first.height) + spacing;
112
+ for (let i = 1; i < sorted.length - 1; i++) {
113
+ const n = sorted[i];
114
+ const newVal = cursor;
115
+ const oldVal = isH ? n.x : n.y;
116
+ if (newVal !== oldVal) {
117
+ result.push({ id: n.id, patch: isH ? { x: newVal } : { y: newVal } });
118
+ }
119
+ cursor += (isH ? n.width : n.height) + spacing;
120
+ }
121
+ return result;
122
+ }
123
+ //# sourceMappingURL=alignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alignment.js","sourceRoot":"","sources":["../src/alignment.ts"],"names":[],"mappings":"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"}
package/dist/grid.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function snapToGrid(value: number, size: number): number;
2
+ //# sourceMappingURL=grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../src/grid.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9D"}
package/dist/grid.js ADDED
@@ -0,0 +1,6 @@
1
+ export function snapToGrid(value, size) {
2
+ if (size <= 0)
3
+ return value;
4
+ return Math.round(value / size) * size;
5
+ }
6
+ //# sourceMappingURL=grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.js","sourceRoot":"","sources":["../src/grid.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,IAAY;IACpD,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;AACxC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -11,6 +11,9 @@ export type { ReflowReservations } from './slots.js';
11
11
  export { getAtPath, setAtPath } from './paths.js';
12
12
  export { measureTextWidth, truncateToWidth, wrapText, wrapTextWithBreaks, } from './text.js';
13
13
  export { resolveCanvas, buildNodeMap, getNodeLabel, getGroupChildren, validateCanvas, generateNodeId, getNodeMenuOptions, createNodeFromOption, addNode, updateNode, removeNode, generateEdgeId, addEdge, updateEdge, removeEdge, } from './canvas.js';
14
+ export { snapToGrid } from './grid.js';
15
+ export type { AlignmentGuide } from './alignment.js';
16
+ export { computeAlignmentGuides, alignNodes, distributeNodes } from './alignment.js';
14
17
  export declare const themes: {
15
18
  readonly dark: import("./types.js").CanvasTheme;
16
19
  readonly midnight: import("./types.js").CanvasTheme;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,eAAe,EACf,UAAU,EACV,UAAU,EACV,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,UAAU,EACV,eAAe,EACf,UAAU,EACV,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,EAC3B,4BAA4B,EAC5B,UAAU,EACV,UAAU,EACV,cAAc,EACd,UAAU,EACV,eAAe,EAEf,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,kBAAkB,EAClB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,iBAAiB,GAClB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,SAAS,EACT,aAAa,EACb,UAAU,EACV,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAGhD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG3E,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAG1D,OAAO,EACL,0BAA0B,EAC1B,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,EACX,yBAAyB,GAC1B,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAGpD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAKjD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,kBAAkB,GACnB,MAAM,WAAW,CAAA;AAGlB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,OAAO,EACP,UAAU,EACV,UAAU,EACV,cAAc,EACd,OAAO,EACP,UAAU,EACV,UAAU,GACX,MAAM,aAAa,CAAA;AAUpB,eAAO,MAAM,MAAM;;;;;;;CAOT,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,eAAe,EACf,UAAU,EACV,UAAU,EACV,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,UAAU,EACV,eAAe,EACf,UAAU,EACV,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,EAC3B,4BAA4B,EAC5B,UAAU,EACV,UAAU,EACV,cAAc,EACd,UAAU,EACV,eAAe,EAEf,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,kBAAkB,EAClB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,iBAAiB,GAClB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,SAAS,EACT,aAAa,EACb,UAAU,EACV,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAGhD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG3E,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAG1D,OAAO,EACL,0BAA0B,EAC1B,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,EACX,yBAAyB,GAC1B,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAGpD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAKjD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,kBAAkB,GACnB,MAAM,WAAW,CAAA;AAGlB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,OAAO,EACP,UAAU,EACV,UAAU,EACV,cAAc,EACd,OAAO,EACP,UAAU,EACV,UAAU,GACX,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAUpF,eAAO,MAAM,MAAM;;;;;;;CAOT,CAAA"}
package/dist/index.js CHANGED
@@ -20,6 +20,8 @@ export { getAtPath, setAtPath } from './paths.js';
20
20
  export { measureTextWidth, truncateToWidth, wrapText, wrapTextWithBreaks, } from './text.js';
21
21
  // Canvas helpers
22
22
  export { resolveCanvas, buildNodeMap, getNodeLabel, getGroupChildren, validateCanvas, generateNodeId, getNodeMenuOptions, createNodeFromOption, addNode, updateNode, removeNode, generateEdgeId, addEdge, updateEdge, removeEdge, } from './canvas.js';
23
+ export { snapToGrid } from './grid.js';
24
+ export { computeAlignmentGuides, alignNodes, distributeNodes } from './alignment.js';
23
25
  // Convenience theme collection
24
26
  import { darkTheme as _dark } from './themes/dark.js';
25
27
  import { midnightTheme as _midnight } from './themes/midnight.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA+DA,SAAS;AACT,OAAO,EACL,SAAS,EACT,aAAa,EACb,UAAU,EACV,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAE1B,sBAAsB;AACtB,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAA;AAG7B,eAAe;AACf,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE3E,iBAAiB;AACjB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,cAAc,CAAA;AAErB,iCAAiC;AACjC,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,kBAAkB,CAAA;AAEzB,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE1D,wBAAwB;AACxB,OAAO,EACL,0BAA0B,EAC1B,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,EACX,yBAAyB,GAC1B,MAAM,YAAY,CAAA;AAGnB,wEAAwE;AACxE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEjD,0EAA0E;AAC1E,uEAAuE;AACvE,kBAAkB;AAClB,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,kBAAkB,GACnB,MAAM,WAAW,CAAA;AAElB,iBAAiB;AACjB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,OAAO,EACP,UAAU,EACV,UAAU,EACV,cAAc,EACd,OAAO,EACP,UAAU,EACV,UAAU,GACX,MAAM,aAAa,CAAA;AAEpB,+BAA+B;AAC/B,OAAO,EAAE,SAAS,IAAI,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,aAAa,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,EAAE,UAAU,IAAI,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,cAAc,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAE,SAAS,IAAI,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,YAAY,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9D,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,KAAK;IACX,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,MAAM;IACb,SAAS,EAAE,UAAU;IACrB,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,QAAQ;CACT,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA+DA,SAAS;AACT,OAAO,EACL,SAAS,EACT,aAAa,EACb,UAAU,EACV,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAE1B,sBAAsB;AACtB,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAA;AAG7B,eAAe;AACf,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE3E,iBAAiB;AACjB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,cAAc,CAAA;AAErB,iCAAiC;AACjC,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,kBAAkB,CAAA;AAEzB,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE1D,wBAAwB;AACxB,OAAO,EACL,0BAA0B,EAC1B,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,EACX,yBAAyB,GAC1B,MAAM,YAAY,CAAA;AAGnB,wEAAwE;AACxE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEjD,0EAA0E;AAC1E,uEAAuE;AACvE,kBAAkB;AAClB,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,kBAAkB,GACnB,MAAM,WAAW,CAAA;AAElB,iBAAiB;AACjB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,OAAO,EACP,UAAU,EACV,UAAU,EACV,cAAc,EACd,OAAO,EACP,UAAU,EACV,UAAU,GACX,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAEpF,+BAA+B;AAC/B,OAAO,EAAE,SAAS,IAAI,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,aAAa,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,EAAE,UAAU,IAAI,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,cAAc,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAE,SAAS,IAAI,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,YAAY,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9D,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,KAAK;IACX,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,MAAM;IACb,SAAS,EAAE,UAAU;IACrB,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,QAAQ;CACT,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "system-canvas",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "description": "Interactive, zoomable SVG diagrams from JSON Canvas documents. Pure TypeScript core with types, themes, edge routing, and viewport math.",
5
5
  "license": "MIT",
6
6
  "repository": {