@meltemi/diagrams-layout 0.0.0-stage → 1.9.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 (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +52 -2
  3. package/dist/audit.d.ts +58 -0
  4. package/dist/audit.d.ts.map +1 -0
  5. package/dist/audit.js +239 -0
  6. package/dist/audit.js.map +1 -0
  7. package/dist/checks.d.ts +38 -0
  8. package/dist/checks.d.ts.map +1 -0
  9. package/dist/checks.js +331 -0
  10. package/dist/checks.js.map +1 -0
  11. package/dist/constraints.d.ts +20 -0
  12. package/dist/constraints.d.ts.map +1 -0
  13. package/dist/constraints.js +149 -0
  14. package/dist/constraints.js.map +1 -0
  15. package/dist/engine.d.ts +96 -0
  16. package/dist/engine.d.ts.map +1 -0
  17. package/dist/engine.js +3 -0
  18. package/dist/engine.js.map +1 -0
  19. package/dist/frame.d.ts +17 -0
  20. package/dist/frame.d.ts.map +1 -0
  21. package/dist/frame.js +51 -0
  22. package/dist/frame.js.map +1 -0
  23. package/dist/free.d.ts +75 -0
  24. package/dist/free.d.ts.map +1 -0
  25. package/dist/free.js +122 -0
  26. package/dist/free.js.map +1 -0
  27. package/dist/geometry.d.ts +58 -0
  28. package/dist/geometry.d.ts.map +1 -0
  29. package/dist/geometry.js +223 -0
  30. package/dist/geometry.js.map +1 -0
  31. package/dist/icons.d.ts +16 -0
  32. package/dist/icons.d.ts.map +1 -0
  33. package/dist/icons.js +94 -0
  34. package/dist/icons.js.map +1 -0
  35. package/dist/index.d.ts +20 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +19 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/layout.d.ts +206 -0
  40. package/dist/layout.d.ts.map +1 -0
  41. package/dist/layout.js +3527 -0
  42. package/dist/layout.js.map +1 -0
  43. package/dist/mark.d.ts +24 -0
  44. package/dist/mark.d.ts.map +1 -0
  45. package/dist/mark.js +60 -0
  46. package/dist/mark.js.map +1 -0
  47. package/dist/markers.d.ts +62 -0
  48. package/dist/markers.d.ts.map +1 -0
  49. package/dist/markers.js +255 -0
  50. package/dist/markers.js.map +1 -0
  51. package/dist/measure.d.ts +38 -0
  52. package/dist/measure.d.ts.map +1 -0
  53. package/dist/measure.js +44 -0
  54. package/dist/measure.js.map +1 -0
  55. package/dist/messages/en.d.ts +160 -0
  56. package/dist/messages/en.d.ts.map +1 -0
  57. package/dist/messages/en.js +163 -0
  58. package/dist/messages/en.js.map +1 -0
  59. package/dist/messages/es.d.ts +4 -0
  60. package/dist/messages/es.d.ts.map +1 -0
  61. package/dist/messages/es.js +104 -0
  62. package/dist/messages/es.js.map +1 -0
  63. package/dist/messages/index.d.ts +86 -0
  64. package/dist/messages/index.d.ts.map +1 -0
  65. package/dist/messages/index.js +17 -0
  66. package/dist/messages/index.js.map +1 -0
  67. package/dist/routing.d.ts +94 -0
  68. package/dist/routing.d.ts.map +1 -0
  69. package/dist/routing.js +549 -0
  70. package/dist/routing.js.map +1 -0
  71. package/dist/scene.d.ts +220 -0
  72. package/dist/scene.d.ts.map +1 -0
  73. package/dist/scene.js +5 -0
  74. package/dist/scene.js.map +1 -0
  75. package/dist/sequence.d.ts +17 -0
  76. package/dist/sequence.d.ts.map +1 -0
  77. package/dist/sequence.js +875 -0
  78. package/dist/sequence.js.map +1 -0
  79. package/dist/shapes.d.ts +140 -0
  80. package/dist/shapes.d.ts.map +1 -0
  81. package/dist/shapes.js +1030 -0
  82. package/dist/shapes.js.map +1 -0
  83. package/dist/styles.d.ts +58 -0
  84. package/dist/styles.d.ts.map +1 -0
  85. package/dist/styles.js +106 -0
  86. package/dist/styles.js.map +1 -0
  87. package/dist/text.d.ts +8 -0
  88. package/dist/text.d.ts.map +1 -0
  89. package/dist/text.js +28 -0
  90. package/dist/text.js.map +1 -0
  91. package/dist/theme.d.ts +100 -0
  92. package/dist/theme.d.ts.map +1 -0
  93. package/dist/theme.js +246 -0
  94. package/dist/theme.js.map +1 -0
  95. package/dist/viewport.d.ts +98 -0
  96. package/dist/viewport.d.ts.map +1 -0
  97. package/dist/viewport.js +177 -0
  98. package/dist/viewport.js.map +1 -0
  99. package/package.json +49 -3
package/dist/engine.js ADDED
@@ -0,0 +1,3 @@
1
+ /** Spacing passed to engines: between boxes in a layer, between layers, and between edges. */
2
+ export const ENGINE_SPACING = { node: 40, layer: 70, edge: 16 };
3
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAuFA,8FAA8F;AAC9F,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAW,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { TextMetrics } from "./measure.js";
2
+ import type { GroupItem, TextItem } from "./scene.js";
3
+ import type { Theme } from "./theme.js";
4
+ /** Rounds to two decimals, as every scene coordinate is. */
5
+ export declare function round2(value: number): number;
6
+ /** A text item centred vertically on `y`, with its baseline from the measured font. */
7
+ export declare function textItem(metrics: TextMetrics, x: number, y: number, text: string, size: number, weight: number, fill: string, anchor?: TextItem["anchor"], font?: TextItem["font"]): TextItem;
8
+ /** The measures of the brand frame that a layout needs. */
9
+ export interface FrameScale {
10
+ readonly frameHeight: number;
11
+ readonly frameMark: number;
12
+ readonly frameBrand: number;
13
+ readonly frameTitle: number;
14
+ }
15
+ /** The brand strip: hairline, mark, wordmark and diagram title, spanning the canvas. */
16
+ export declare function brandFrame(theme: Theme, scale: FrameScale, metrics: TextMetrics, width: number, stripTop: number, title: string | null): GroupItem;
17
+ //# sourceMappingURL=frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../src/frame.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAa,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,4DAA4D;AAC5D,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,uFAAuF;AACvF,wBAAgB,QAAQ,CACtB,OAAO,EAAE,WAAW,EACpB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,QAAQ,CAAC,QAAQ,CAAY,EACrC,IAAI,GAAE,QAAQ,CAAC,MAAM,CAAU,GAC9B,QAAQ,CAaV;AAED,2DAA2D;AAC3D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wFAAwF;AACxF,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,SAAS,CAgCX"}
package/dist/frame.js ADDED
@@ -0,0 +1,51 @@
1
+ import { markGroup } from "./mark.js";
2
+ /** Rounds to two decimals, as every scene coordinate is. */
3
+ export function round2(value) {
4
+ return Math.round(value * 100) / 100;
5
+ }
6
+ /** A text item centred vertically on `y`, with its baseline from the measured font. */
7
+ export function textItem(metrics, x, y, text, size, weight, fill, anchor = "middle", font = "body") {
8
+ return {
9
+ kind: "text",
10
+ x: round2(x),
11
+ y: round2(y),
12
+ baseline: round2(metrics.baseline(y, font, weight, size)),
13
+ text,
14
+ size,
15
+ weight,
16
+ font,
17
+ anchor,
18
+ fill,
19
+ };
20
+ }
21
+ /** The brand strip: hairline, mark, wordmark and diagram title, spanning the canvas. */
22
+ export function brandFrame(theme, scale, metrics, width, stripTop, title) {
23
+ const margin = theme.margin;
24
+ const lineY = theme.frame === "header" ? scale.frameHeight - 0.5 : stripTop + 0.5;
25
+ const centerY = stripTop + scale.frameHeight / 2;
26
+ const items = [
27
+ {
28
+ kind: "polyline",
29
+ points: [
30
+ { x: margin, y: lineY },
31
+ { x: width - margin, y: lineY },
32
+ ],
33
+ stroke: theme.line,
34
+ strokeWidth: 1,
35
+ dashed: false,
36
+ },
37
+ ];
38
+ let textX = margin;
39
+ if (theme.mark === "meltemi") {
40
+ items.push(markGroup(margin, centerY - scale.frameMark / 2, scale.frameMark));
41
+ textX += scale.frameMark + 8;
42
+ }
43
+ if (theme.brand.trim() !== "") {
44
+ items.push(textItem(metrics, textX, centerY, theme.brand, scale.frameBrand, 600, theme.ink, "start"));
45
+ }
46
+ if (title) {
47
+ items.push(textItem(metrics, width - margin, centerY, title, scale.frameTitle, 400, theme.muted, "end"));
48
+ }
49
+ return { kind: "group", id: "frame", role: "frame", items };
50
+ }
51
+ //# sourceMappingURL=frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.js","sourceRoot":"","sources":["../src/frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAKtC,4DAA4D;AAC5D,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACvC,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,QAAQ,CACtB,OAAoB,EACpB,CAAS,EACT,CAAS,EACT,IAAY,EACZ,IAAY,EACZ,MAAc,EACd,IAAY,EACZ,SAA6B,QAAQ,EACrC,OAAyB,MAAM;IAE/B,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACZ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACzD,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,IAAI;QACJ,MAAM;QACN,IAAI;KACL,CAAC;AACJ,CAAC;AAUD,wFAAwF;AACxF,MAAM,UAAU,UAAU,CACxB,KAAY,EACZ,KAAiB,EACjB,OAAoB,EACpB,KAAa,EACb,QAAgB,EAChB,KAAoB;IAEpB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC;IAClF,MAAM,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;IACjD,MAAM,KAAK,GAAgB;QACzB;YACE,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE;gBACN,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE;gBACvB,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE;aAChC;YACD,MAAM,EAAE,KAAK,CAAC,IAAI;YAClB,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,KAAK;SACd;KACF,CAAC;IACF,IAAI,KAAK,GAAG,MAAM,CAAC;IACnB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9E,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CACR,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAC1F,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CACR,QAAQ,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAC7F,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC9D,CAAC"}
package/dist/free.d.ts ADDED
@@ -0,0 +1,75 @@
1
+ import type { Element, FlowDiagram, Point, Relation } from "@meltemi/diagrams-model";
2
+ import type { ResolvedStyle } from "./styles.js";
3
+ interface Size {
4
+ readonly width: number;
5
+ readonly height: number;
6
+ }
7
+ /** The group padding and title band that set the interior origin of a group. */
8
+ export interface FrameTheme {
9
+ readonly groupPadding: number;
10
+ readonly groupHeader: number;
11
+ }
12
+ /** The innermost group declaring an element, or null. */
13
+ export declare function parentOf(element: Element): string | null;
14
+ /**
15
+ * Whether a group is untitled: its label is `""`, it has no `description` and its resolved style
16
+ * has no `icon`. An untitled group is a plain container: it draws no title band.
17
+ */
18
+ export declare function isUntitledGroup(group: Pick<Element, "label" | "description">, style: Pick<ResolvedStyle, "icon">): boolean;
19
+ /**
20
+ * The header of a group, the room above its interior: the theme's `groupHeader` for a titled
21
+ * group, `groupPadding` for an untitled one. Hosts that compute interior origins use the same rule.
22
+ */
23
+ export declare function groupHeaderOf(group: Pick<Element, "label" | "description">, style: Pick<ResolvedStyle, "icon">, theme: FrameTheme): number;
24
+ /** A rectangle relative to an element's centre. */
25
+ interface Extent {
26
+ readonly x: number;
27
+ readonly y: number;
28
+ readonly width: number;
29
+ readonly height: number;
30
+ }
31
+ /**
32
+ * The size of a free group without a `size` statement: its padding, the farthest right and bottom
33
+ * edges of its placed children measured from the interior origin, and its padding again, below its
34
+ * header. The group is never narrower than its title. A child's `extent`, relative to its centre,
35
+ * is what it draws beyond its box too (the label of an icon shape); its box by default.
36
+ */
37
+ export declare function derivedGroupSize(children: readonly {
38
+ place: Point;
39
+ size: Size;
40
+ extent?: Extent;
41
+ }[], padding: number, header: number, titleWidth: number): Size;
42
+ /** The interior origin of a group: its top-left corner inside the padding and the header. */
43
+ export declare function interiorOrigin(center: Point, size: Size, padding: number, header: number): Point;
44
+ export interface FreeFrames {
45
+ /** Centres in diagram coordinates of every element whose place and enclosing groups are known. */
46
+ readonly centers: Map<string, Point>;
47
+ /** The written or derived size of every placed group. */
48
+ readonly groupSizes: Map<string, Size>;
49
+ }
50
+ /**
51
+ * Frames of a free diagram (decision 0018): `place` statements of group children are relative to
52
+ * the interior origin of their group. Group sizes are computed from the innermost group outwards,
53
+ * then centres from the outermost group inwards. Children of a group without a place are skipped.
54
+ * `headerOf` gives each group's header (see `groupHeaderOf`), `titleWidth` its minimum width, and
55
+ * `extentOf` what a leaf of a size draws about its centre when it is more than its box.
56
+ */
57
+ export declare function freeFrames(diagram: FlowDiagram, local: ReadonlyMap<string, Point>, written: ReadonlyMap<string, Size>, leafSizes: ReadonlyMap<string, Size>, theme: Pick<FrameTheme, "groupPadding">, titleWidth: (group: Element) => number, headerOf: (group: Element) => number, extentOf?: (id: string, size: Size) => Extent | undefined): FreeFrames;
58
+ /** One drawable of a free diagram in paint order. */
59
+ export type Paintable = {
60
+ readonly kind: "group";
61
+ readonly element: Element;
62
+ } | {
63
+ readonly kind: "element";
64
+ readonly element: Element;
65
+ } | {
66
+ readonly kind: "relation";
67
+ readonly relation: Relation;
68
+ };
69
+ /**
70
+ * Paint order of a free diagram: layer by layer from back to front; within a layer, groups (outer
71
+ * before inner), then the other objects in source order, then relations.
72
+ */
73
+ export declare function paintOrder(diagram: FlowDiagram): Paintable[];
74
+ export {};
75
+ //# sourceMappingURL=free.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"free.d.ts","sourceRoot":"","sources":["../src/free.ts"],"names":[],"mappings":"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"}
package/dist/free.js ADDED
@@ -0,0 +1,122 @@
1
+ /** The innermost group declaring an element, or null. */
2
+ export function parentOf(element) {
3
+ return element.groupPath[element.groupPath.length - 1] ?? null;
4
+ }
5
+ /**
6
+ * Whether a group is untitled: its label is `""`, it has no `description` and its resolved style
7
+ * has no `icon`. An untitled group is a plain container: it draws no title band.
8
+ */
9
+ export function isUntitledGroup(group, style) {
10
+ return group.label === "" && !group.description && !style.icon;
11
+ }
12
+ /**
13
+ * The header of a group, the room above its interior: the theme's `groupHeader` for a titled
14
+ * group, `groupPadding` for an untitled one. Hosts that compute interior origins use the same rule.
15
+ */
16
+ export function groupHeaderOf(group, style, theme) {
17
+ return isUntitledGroup(group, style) ? theme.groupPadding : theme.groupHeader;
18
+ }
19
+ /**
20
+ * The size of a free group without a `size` statement: its padding, the farthest right and bottom
21
+ * edges of its placed children measured from the interior origin, and its padding again, below its
22
+ * header. The group is never narrower than its title. A child's `extent`, relative to its centre,
23
+ * is what it draws beyond its box too (the label of an icon shape); its box by default.
24
+ */
25
+ export function derivedGroupSize(children, padding, header, titleWidth) {
26
+ let right = 0;
27
+ let bottom = 0;
28
+ for (const { place, size, extent } of children) {
29
+ right = Math.max(right, place.x + (extent ? extent.x + extent.width : size.width / 2));
30
+ bottom = Math.max(bottom, place.y + (extent ? extent.y + extent.height : size.height / 2));
31
+ }
32
+ return {
33
+ width: Math.max(padding + right + padding, titleWidth),
34
+ height: header + bottom + padding,
35
+ };
36
+ }
37
+ /** The interior origin of a group: its top-left corner inside the padding and the header. */
38
+ export function interiorOrigin(center, size, padding, header) {
39
+ return {
40
+ x: center.x - size.width / 2 + padding,
41
+ y: center.y - size.height / 2 + header,
42
+ };
43
+ }
44
+ /**
45
+ * Frames of a free diagram (decision 0018): `place` statements of group children are relative to
46
+ * the interior origin of their group. Group sizes are computed from the innermost group outwards,
47
+ * then centres from the outermost group inwards. Children of a group without a place are skipped.
48
+ * `headerOf` gives each group's header (see `groupHeaderOf`), `titleWidth` its minimum width, and
49
+ * `extentOf` what a leaf of a size draws about its centre when it is more than its box.
50
+ */
51
+ export function freeFrames(diagram, local, written, leafSizes, theme, titleWidth, headerOf, extentOf) {
52
+ const sizeOf = new Map(leafSizes);
53
+ const groupSizes = new Map();
54
+ const groups = diagram.elements.filter((e) => e.kind === "group");
55
+ for (const group of [...groups].sort((a, b) => b.groupPath.length - a.groupPath.length)) {
56
+ const explicit = written.get(group.id);
57
+ const size = explicit ??
58
+ derivedGroupSize(diagram.elements.flatMap((child) => {
59
+ if (parentOf(child) !== group.id)
60
+ return [];
61
+ const place = local.get(child.id);
62
+ const childSize = sizeOf.get(child.id);
63
+ if (!place || !childSize)
64
+ return [];
65
+ // Groups are their box; leaves may draw beyond it.
66
+ const extent = child.kind !== "group" && extentOf ? extentOf(child.id, childSize) : undefined;
67
+ return [{ place, size: childSize, ...(extent ? { extent } : {}) }];
68
+ }), theme.groupPadding, headerOf(group), titleWidth(group));
69
+ sizeOf.set(group.id, size);
70
+ if (local.has(group.id))
71
+ groupSizes.set(group.id, size);
72
+ }
73
+ const centers = new Map();
74
+ const origins = new Map();
75
+ const outerFirst = [...diagram.elements].sort((a, b) => a.groupPath.length - b.groupPath.length);
76
+ for (const element of outerFirst) {
77
+ const place = local.get(element.id);
78
+ if (!place)
79
+ continue;
80
+ const parent = parentOf(element);
81
+ const origin = parent === null ? { x: 0, y: 0 } : origins.get(parent);
82
+ if (!origin)
83
+ continue;
84
+ const center = { x: origin.x + place.x, y: origin.y + place.y };
85
+ centers.set(element.id, center);
86
+ if (element.kind === "group") {
87
+ origins.set(element.id, interiorOrigin(center, sizeOf.get(element.id), theme.groupPadding, headerOf(element)));
88
+ }
89
+ }
90
+ return { centers, groupSizes };
91
+ }
92
+ /**
93
+ * Paint order of a free diagram: layer by layer from back to front; within a layer, groups (outer
94
+ * before inner), then the other objects in source order, then relations.
95
+ */
96
+ export function paintOrder(diagram) {
97
+ const layers = diagram.properties.layers;
98
+ const main = layers.indexOf("main");
99
+ const index = (layer) => {
100
+ const i = layer === null ? main : layers.indexOf(layer);
101
+ return i < 0 ? main : i;
102
+ };
103
+ const order = [];
104
+ for (let layer = 0; layer < layers.length; layer++) {
105
+ const elements = diagram.elements.filter((e) => index(e.layer) === layer);
106
+ const groups = elements
107
+ .filter((e) => e.kind === "group")
108
+ .sort((a, b) => a.groupPath.length - b.groupPath.length);
109
+ for (const element of groups)
110
+ order.push({ kind: "group", element });
111
+ for (const element of elements) {
112
+ if (element.kind !== "group")
113
+ order.push({ kind: "element", element });
114
+ }
115
+ for (const relation of diagram.relations) {
116
+ if (index(relation.layer) === layer)
117
+ order.push({ kind: "relation", relation });
118
+ }
119
+ }
120
+ return order;
121
+ }
122
+ //# sourceMappingURL=free.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"free.js","sourceRoot":"","sources":["../src/free.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { Point, Port } from "@meltemi/diagrams-model";
2
+ export interface Box {
3
+ readonly x: number;
4
+ readonly y: number;
5
+ readonly width: number;
6
+ readonly height: number;
7
+ }
8
+ export type Side = Exclude<Port, "auto">;
9
+ export declare const ARROW_LENGTH = 8;
10
+ export declare const ARROW_WIDTH = 7;
11
+ export declare function boxCenter(box: Box): Point;
12
+ export declare function boxFromCenter(center: Point, width: number, height: number): Box;
13
+ export declare function boxRight(box: Box): number;
14
+ export declare function boxBottom(box: Box): number;
15
+ export declare function unionBoxes(boxes: readonly Box[]): Box | undefined;
16
+ export declare function expandBox(box: Box, left: number, top: number, right: number, bottom: number): Box;
17
+ /** The side of `box` that faces `point`, judged relative to the box proportions. */
18
+ export declare function sideFacing(box: Box, point: Point): Side;
19
+ /** The point of `side` closest to `neighbour`: its projection onto the side, clamped to the side. */
20
+ export declare function anchorOnSide(box: Box, side: Side, neighbour: Point): Point;
21
+ /**
22
+ * Connector points from the source box to the target box (decision D3 of the SVG export change):
23
+ * - with waypoints, each side anchors at the projection of its neighbouring waypoint;
24
+ * - facing parallel sides without waypoints meet at the centre of their overlap, or at their own
25
+ * centres when the extents do not overlap;
26
+ * - perpendicular sides without waypoints get one elbow;
27
+ * - `auto` ports choose the side that faces the neighbouring point.
28
+ */
29
+ export declare function routePoints(from: Box, fromPort: Port, to: Box, toPort: Port, via: readonly Point[]): Point[];
30
+ export declare function sideCenter(box: Box, side: Side): Point;
31
+ export declare function polylineLength(points: readonly Point[]): number;
32
+ /** The point at `fraction` (0 to 1) of the polyline length. */
33
+ export declare function pointAlong(points: readonly Point[], fraction: number): Point;
34
+ export type ArrowheadShape = "triangle" | "open" | "none";
35
+ export interface Arrowhead {
36
+ /**
37
+ * The connector. A `triangle` pulls its last point back to the base of the head; `open` and
38
+ * `none` keep the full line.
39
+ */
40
+ readonly line: Point[];
41
+ /**
42
+ * `triangle`: tip first, then the two base corners. `open`: one base corner, the tip, the other
43
+ * corner, drawn as an unfilled polyline. `none`: empty.
44
+ */
45
+ readonly head: Point[];
46
+ }
47
+ export declare function arrowhead(points: readonly Point[], length?: number, width?: number, shape?: ArrowheadShape): Arrowhead;
48
+ /** Cylinder as two paths: the body (drawn first) and the top ellipse. */
49
+ export declare function cylinderPaths(box: Box): {
50
+ body: string;
51
+ top: string;
52
+ ry: number;
53
+ };
54
+ /** An ellipse inscribed in the box, as two arcs. */
55
+ export declare function ellipsePath(box: Box): string;
56
+ export declare function diamondPath(box: Box): string;
57
+ export declare function polygonPath(points: readonly Point[]): string;
58
+ //# sourceMappingURL=geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../src/geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,223 @@
1
+ export const ARROW_LENGTH = 8;
2
+ export const ARROW_WIDTH = 7;
3
+ export function boxCenter(box) {
4
+ return { x: box.x + box.width / 2, y: box.y + box.height / 2 };
5
+ }
6
+ export function boxFromCenter(center, width, height) {
7
+ return { x: center.x - width / 2, y: center.y - height / 2, width, height };
8
+ }
9
+ export function boxRight(box) {
10
+ return box.x + box.width;
11
+ }
12
+ export function boxBottom(box) {
13
+ return box.y + box.height;
14
+ }
15
+ export function unionBoxes(boxes) {
16
+ if (boxes.length === 0)
17
+ return undefined;
18
+ let minX = Infinity;
19
+ let minY = Infinity;
20
+ let maxX = -Infinity;
21
+ let maxY = -Infinity;
22
+ for (const b of boxes) {
23
+ minX = Math.min(minX, b.x);
24
+ minY = Math.min(minY, b.y);
25
+ maxX = Math.max(maxX, boxRight(b));
26
+ maxY = Math.max(maxY, boxBottom(b));
27
+ }
28
+ return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
29
+ }
30
+ export function expandBox(box, left, top, right, bottom) {
31
+ return {
32
+ x: box.x - left,
33
+ y: box.y - top,
34
+ width: box.width + left + right,
35
+ height: box.height + top + bottom,
36
+ };
37
+ }
38
+ /** The side of `box` that faces `point`, judged relative to the box proportions. */
39
+ export function sideFacing(box, point) {
40
+ const c = boxCenter(box);
41
+ const dx = point.x - c.x;
42
+ const dy = point.y - c.y;
43
+ const nx = Math.abs(dx) / Math.max(1, box.width / 2);
44
+ const ny = Math.abs(dy) / Math.max(1, box.height / 2);
45
+ if (ny >= nx)
46
+ return dy >= 0 ? "south" : "north";
47
+ return dx >= 0 ? "east" : "west";
48
+ }
49
+ /** The point of `side` closest to `neighbour`: its projection onto the side, clamped to the side. */
50
+ export function anchorOnSide(box, side, neighbour) {
51
+ const x = Math.min(boxRight(box), Math.max(box.x, neighbour.x));
52
+ const y = Math.min(boxBottom(box), Math.max(box.y, neighbour.y));
53
+ switch (side) {
54
+ case "north":
55
+ return { x, y: box.y };
56
+ case "south":
57
+ return { x, y: boxBottom(box) };
58
+ case "west":
59
+ return { x: box.x, y };
60
+ case "east":
61
+ return { x: boxRight(box), y };
62
+ }
63
+ }
64
+ function isVertical(side) {
65
+ return side === "north" || side === "south";
66
+ }
67
+ function facing(a, b) {
68
+ return ((a === "south" && b === "north") ||
69
+ (a === "north" && b === "south") ||
70
+ (a === "east" && b === "west") ||
71
+ (a === "west" && b === "east"));
72
+ }
73
+ function sideCoordinate(box, side) {
74
+ switch (side) {
75
+ case "north":
76
+ return box.y;
77
+ case "south":
78
+ return boxBottom(box);
79
+ case "west":
80
+ return box.x;
81
+ case "east":
82
+ return boxRight(box);
83
+ }
84
+ }
85
+ const samePoint = (a, b) => Math.abs(a.x - b.x) < 0.01 && Math.abs(a.y - b.y) < 0.01;
86
+ /**
87
+ * Connector points from the source box to the target box (decision D3 of the SVG export change):
88
+ * - with waypoints, each side anchors at the projection of its neighbouring waypoint;
89
+ * - facing parallel sides without waypoints meet at the centre of their overlap, or at their own
90
+ * centres when the extents do not overlap;
91
+ * - perpendicular sides without waypoints get one elbow;
92
+ * - `auto` ports choose the side that faces the neighbouring point.
93
+ */
94
+ export function routePoints(from, fromPort, to, toPort, via) {
95
+ const fromNeighbour = via[0] ?? boxCenter(to);
96
+ const toNeighbour = via[via.length - 1] ?? boxCenter(from);
97
+ const fromSide = fromPort === "auto" ? sideFacing(from, fromNeighbour) : fromPort;
98
+ const toSide = toPort === "auto" ? sideFacing(to, toNeighbour) : toPort;
99
+ if (via.length > 0) {
100
+ return [
101
+ anchorOnSide(from, fromSide, via[0]),
102
+ ...via,
103
+ anchorOnSide(to, toSide, via[via.length - 1]),
104
+ ];
105
+ }
106
+ if (facing(fromSide, toSide)) {
107
+ if (isVertical(fromSide)) {
108
+ const lo = Math.max(from.x, to.x);
109
+ const hi = Math.min(boxRight(from), boxRight(to));
110
+ const x = lo <= hi ? (lo + hi) / 2 : undefined;
111
+ return [
112
+ { x: x ?? boxCenter(from).x, y: sideCoordinate(from, fromSide) },
113
+ { x: x ?? boxCenter(to).x, y: sideCoordinate(to, toSide) },
114
+ ];
115
+ }
116
+ const lo = Math.max(from.y, to.y);
117
+ const hi = Math.min(boxBottom(from), boxBottom(to));
118
+ const y = lo <= hi ? (lo + hi) / 2 : undefined;
119
+ return [
120
+ { x: sideCoordinate(from, fromSide), y: y ?? boxCenter(from).y },
121
+ { x: sideCoordinate(to, toSide), y: y ?? boxCenter(to).y },
122
+ ];
123
+ }
124
+ // Sides that do not face each other leave from their centres; perpendicular ones get an elbow.
125
+ const a = sideCenter(from, fromSide);
126
+ const b = sideCenter(to, toSide);
127
+ if (isVertical(fromSide) !== isVertical(toSide)) {
128
+ const elbow = isVertical(fromSide) ? { x: a.x, y: b.y } : { x: b.x, y: a.y };
129
+ if (!samePoint(elbow, a) && !samePoint(elbow, b))
130
+ return [a, elbow, b];
131
+ }
132
+ return [a, b];
133
+ }
134
+ export function sideCenter(box, side) {
135
+ const c = boxCenter(box);
136
+ switch (side) {
137
+ case "north":
138
+ return { x: c.x, y: box.y };
139
+ case "south":
140
+ return { x: c.x, y: boxBottom(box) };
141
+ case "west":
142
+ return { x: box.x, y: c.y };
143
+ case "east":
144
+ return { x: boxRight(box), y: c.y };
145
+ }
146
+ }
147
+ export function polylineLength(points) {
148
+ let length = 0;
149
+ for (let i = 1; i < points.length; i++)
150
+ length += Math.hypot(points[i].x - points[i - 1].x, points[i].y - points[i - 1].y);
151
+ return length;
152
+ }
153
+ /** The point at `fraction` (0 to 1) of the polyline length. */
154
+ export function pointAlong(points, fraction) {
155
+ const total = polylineLength(points);
156
+ if (points.length === 0)
157
+ return { x: 0, y: 0 };
158
+ if (points.length === 1 || total === 0)
159
+ return points[0];
160
+ let remaining = Math.max(0, Math.min(1, fraction)) * total;
161
+ for (let i = 1; i < points.length; i++) {
162
+ const a = points[i - 1];
163
+ const b = points[i];
164
+ const segment = Math.hypot(b.x - a.x, b.y - a.y);
165
+ if (remaining <= segment || i === points.length - 1) {
166
+ const t = segment === 0 ? 0 : Math.min(1, remaining / segment);
167
+ return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t };
168
+ }
169
+ remaining -= segment;
170
+ }
171
+ return points[points.length - 1];
172
+ }
173
+ export function arrowhead(points, length = ARROW_LENGTH, width = ARROW_WIDTH, shape = "triangle") {
174
+ if (shape === "none")
175
+ return { line: [...points], head: [] };
176
+ const tip = points[points.length - 1];
177
+ let from = points[points.length - 2] ?? { x: tip.x, y: tip.y - 1 };
178
+ if (samePoint(from, tip))
179
+ from = { x: tip.x, y: tip.y - 1 };
180
+ const dx = tip.x - from.x;
181
+ const dy = tip.y - from.y;
182
+ const distance = Math.hypot(dx, dy);
183
+ const ux = dx / distance;
184
+ const uy = dy / distance;
185
+ const base = { x: tip.x - ux * length, y: tip.y - uy * length };
186
+ const px = -uy * (width / 2);
187
+ const py = ux * (width / 2);
188
+ const left = { x: base.x + px, y: base.y + py };
189
+ const right = { x: base.x - px, y: base.y - py };
190
+ if (shape === "open")
191
+ return { line: [...points], head: [left, tip, right] };
192
+ const line = points.slice(0, -1);
193
+ line.push(distance > length ? base : from);
194
+ return { line, head: [tip, left, right] };
195
+ }
196
+ const n = (value) => String(Math.round(value * 100) / 100);
197
+ /** Cylinder as two paths: the body (drawn first) and the top ellipse. */
198
+ export function cylinderPaths(box) {
199
+ const rx = box.width / 2;
200
+ const ry = Math.min(8, box.height * 0.15);
201
+ const x = box.x;
202
+ const w = box.width;
203
+ const yt = box.y + ry;
204
+ const yb = boxBottom(box) - ry;
205
+ const body = `M${n(x)} ${n(yt)} L${n(x)} ${n(yb)} A${n(rx)} ${n(ry)} 0 0 0 ${n(x + w)} ${n(yb)} L${n(x + w)} ${n(yt)} A${n(rx)} ${n(ry)} 0 0 1 ${n(x)} ${n(yt)} Z`;
206
+ const top = `M${n(x)} ${n(yt)} A${n(rx)} ${n(ry)} 0 0 1 ${n(x + w)} ${n(yt)} A${n(rx)} ${n(ry)} 0 0 1 ${n(x)} ${n(yt)} Z`;
207
+ return { body, top, ry };
208
+ }
209
+ /** An ellipse inscribed in the box, as two arcs. */
210
+ export function ellipsePath(box) {
211
+ const c = boxCenter(box);
212
+ const rx = box.width / 2;
213
+ const ry = box.height / 2;
214
+ return `M${n(box.x)} ${n(c.y)} A${n(rx)} ${n(ry)} 0 1 0 ${n(boxRight(box))} ${n(c.y)} A${n(rx)} ${n(ry)} 0 1 0 ${n(box.x)} ${n(c.y)} Z`;
215
+ }
216
+ export function diamondPath(box) {
217
+ const c = boxCenter(box);
218
+ return `M${n(c.x)} ${n(box.y)} L${n(boxRight(box))} ${n(c.y)} L${n(c.x)} ${n(boxBottom(box))} L${n(box.x)} ${n(c.y)} Z`;
219
+ }
220
+ export function polygonPath(points) {
221
+ return `${points.map((p, i) => `${i === 0 ? "M" : "L"}${n(p.x)} ${n(p.y)}`).join(" ")} Z`;
222
+ }
223
+ //# sourceMappingURL=geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.js","sourceRoot":"","sources":["../src/geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ResolvedIcon } from "@meltemi/diagrams-assets";
2
+ import type { GroupItem, SceneGradient } from "./scene.js";
3
+ /**
4
+ * Turns resolved icons into scene groups. Each icon instance gets its own gradient ids, so two
5
+ * icons with gradients of the same name never clash in one SVG.
6
+ */
7
+ export declare class IconPainter {
8
+ readonly gradients: SceneGradient[];
9
+ private count;
10
+ /**
11
+ * The icon drawn in a square of `size` whose top-left corner is (x, y): its view box scaled by
12
+ * the pack's optical scale and centred in the square. Monochrome paints take `color`.
13
+ */
14
+ draw(icon: ResolvedIcon, x: number, y: number, size: number, color: string): GroupItem;
15
+ }
16
+ //# sourceMappingURL=icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../src/icons.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAY,aAAa,EAAE,MAAM,YAAY,CAAC;AAIrE;;;GAGG;AACH,qBAAa,WAAW;IACtB,QAAQ,CAAC,SAAS,EAAE,aAAa,EAAE,CAAM;IACzC,OAAO,CAAC,KAAK,CAAK;IAElB;;;OAGG;IACH,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS;CA+CvF"}