kymostudio 0.1.1 → 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.
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Data model for the container diagram — JS mirror of
3
+ * `packages/python/src/kymo/model.py`.
4
+ *
5
+ * Components, regions and edges are plain object literals (no classes).
6
+ * `anchor(node, side)` and `resolveAnchors(edge, src, dst)` mimic the
7
+ * Python implementations 1:1.
8
+ */
9
+ export type Point = [number, number];
10
+ export type Shape = "circle" | "cube" | "cube-big" | "box" | "cylinder" | "hex" | "annotation" | "aws-tile" | "aws-tile-hero" | "badge" | "image" | "bpmn-start" | "bpmn-end" | "bpmn-intermediate" | "bpmn-boundary" | "bpmn-task" | "bpmn-subprocess" | "bpmn-gateway" | "bpmn-data-object" | "bpmn-data-store" | "bpmn-annotation";
11
+ export type Side = "top" | "right" | "bottom" | "left" | "center";
12
+ export declare const SHAPE_HALF: Record<Shape, Point>;
13
+ export declare const LABEL_HEIGHT: Record<Shape, number>;
14
+ export interface Component {
15
+ id: string;
16
+ name: string;
17
+ subtitle: string;
18
+ icon: string;
19
+ shape: Shape;
20
+ accent: string;
21
+ pos: Point;
22
+ /** Explicit (width, height) box overriding SHAPE_HALF — set by the BPMN
23
+ * importer from each element's Diagram-Interchange bounds. */
24
+ size: Point | null;
25
+ parent: string | null;
26
+ align: string | null;
27
+ alignGap: number;
28
+ alignOffset: Point;
29
+ }
30
+ export type RegionStyle = "outer" | "inner" | "pool" | "lane" | string;
31
+ export interface Region {
32
+ id: string;
33
+ label: string;
34
+ bounds: [number, number, number, number];
35
+ contains: string[];
36
+ padding: [number, number];
37
+ paddingBottom: number | null;
38
+ style: RegionStyle;
39
+ icon: string | null;
40
+ layout: unknown;
41
+ pos: Point | null;
42
+ gap: number;
43
+ align: string;
44
+ visible: boolean;
45
+ borderDash: string | null;
46
+ borderStroke: string | null;
47
+ labelAnchor: string;
48
+ labelPosition: string | null;
49
+ }
50
+ export interface Edge {
51
+ src: string;
52
+ dst: string;
53
+ label: string;
54
+ style: string;
55
+ srcAnchor: Side | null;
56
+ dstAnchor: Side | null;
57
+ route: string;
58
+ via: Point[];
59
+ srcOffset: Point;
60
+ dstOffset: Point;
61
+ labelOffset: Point;
62
+ labelAnchor: string;
63
+ labelSmall: boolean;
64
+ labelPos: Point | null;
65
+ dashed: boolean;
66
+ noArrow: boolean;
67
+ trunkOffset: number;
68
+ sharedPort: boolean;
69
+ /** BPMN flow: explicit polyline (the file's DI waypoints) drawn as-is,
70
+ * bypassing anchor resolution. `bpmnFlow` selects the marker/dash
71
+ * convention: sequence | default | conditional | message | association. */
72
+ points: Point[] | null;
73
+ bpmnFlow: string | null;
74
+ }
75
+ export interface Diagram {
76
+ width: number;
77
+ height: number;
78
+ title: string;
79
+ subtitle: string;
80
+ components: Component[];
81
+ regions: Region[];
82
+ edges: Edge[];
83
+ layoutTrees: unknown[];
84
+ }
85
+ export declare function makeComponent({ id, name, subtitle, icon, shape, accent, pos, size, parent, align, alignGap, alignOffset, }: {
86
+ id: string;
87
+ name?: string;
88
+ subtitle?: string;
89
+ icon?: string;
90
+ shape?: Shape;
91
+ accent?: string;
92
+ pos?: Point;
93
+ size?: Point | null;
94
+ parent?: string | null;
95
+ align?: string | null;
96
+ alignGap?: number;
97
+ alignOffset?: Point;
98
+ }): Component;
99
+ export declare function makeRegion({ id, label, bounds, contains, padding, paddingBottom, style, icon, layout, pos, gap, align, visible, borderDash, borderStroke, labelAnchor, labelPosition, }: {
100
+ id: string;
101
+ label?: string;
102
+ bounds?: [number, number, number, number];
103
+ contains?: string[];
104
+ padding?: [number, number];
105
+ paddingBottom?: number | null;
106
+ style?: RegionStyle;
107
+ icon?: string | null;
108
+ layout?: unknown;
109
+ pos?: Point | null;
110
+ gap?: number;
111
+ align?: string;
112
+ visible?: boolean;
113
+ borderDash?: string | null;
114
+ borderStroke?: string | null;
115
+ labelAnchor?: string;
116
+ labelPosition?: string | null;
117
+ }): Region;
118
+ export declare function makeEdge({ src, dst, label, style, srcAnchor, dstAnchor, route, via, srcOffset, dstOffset, labelOffset, labelAnchor, labelSmall, labelPos, dashed, noArrow, trunkOffset, sharedPort, points, bpmnFlow, }: {
119
+ src: string;
120
+ dst: string;
121
+ label?: string;
122
+ style?: string;
123
+ srcAnchor?: Side | null;
124
+ dstAnchor?: Side | null;
125
+ route?: string;
126
+ via?: Point[];
127
+ srcOffset?: Point;
128
+ dstOffset?: Point;
129
+ labelOffset?: Point;
130
+ labelAnchor?: string;
131
+ labelSmall?: boolean;
132
+ labelPos?: Point | null;
133
+ dashed?: boolean;
134
+ noArrow?: boolean;
135
+ trunkOffset?: number;
136
+ sharedPort?: boolean;
137
+ points?: Point[] | null;
138
+ bpmnFlow?: string | null;
139
+ }): Edge;
140
+ export declare function makeDiagram({ width, height, title, subtitle, components, regions, edges, layoutTrees, }?: {
141
+ width?: number;
142
+ height?: number;
143
+ title?: string;
144
+ subtitle?: string;
145
+ components?: Component[];
146
+ regions?: Region[];
147
+ edges?: Edge[];
148
+ layoutTrees?: unknown[];
149
+ }): Diagram;
150
+ export declare function componentHalf(c: Component): Point;
151
+ export declare function regionHalf(r: Region): Point;
152
+ /**
153
+ * Edge attach point on `node` for a given side.
154
+ * For a Component, `bottom` pushes past `LABEL_HEIGHT` when the
155
+ * component actually has a name or subtitle.
156
+ */
157
+ export declare function anchor(node: Component | Region, side: Side): Point;
158
+ /**
159
+ * Pick effective (srcAnchor, dstAnchor) for an edge. `null` slots are
160
+ * filled from geometry: horizontal-biased — vertical wins only when
161
+ * `|dy| > 2·|dx|`.
162
+ */
163
+ export declare function resolveAnchors(e: Edge, src: Component | Region, dst: Component | Region): [Side, Side];
164
+ export declare function getComponent(d: Diagram, id: string): Component;
165
+ export declare function getNode(d: Diagram, id: string): Component | Region;
166
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
package/dist/model.js ADDED
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Data model for the container diagram — JS mirror of
3
+ * `packages/python/src/kymo/model.py`.
4
+ *
5
+ * Components, regions and edges are plain object literals (no classes).
6
+ * `anchor(node, side)` and `resolveAnchors(edge, src, dst)` mimic the
7
+ * Python implementations 1:1.
8
+ */
9
+ export const SHAPE_HALF = {
10
+ "circle": [38, 38],
11
+ "cube": [40, 40],
12
+ "cube-big": [50, 50],
13
+ "box": [35, 35],
14
+ "cylinder": [35, 35],
15
+ "hex": [35, 32], // flat-top hexagon — wider than tall
16
+ "annotation": [0, 0],
17
+ "aws-tile": [32, 32],
18
+ "aws-tile-hero": [40, 40],
19
+ "badge": [14, 14],
20
+ "image": [32, 32],
21
+ // BPMN — fallbacks only; real sizes arrive via Component.size from DI.
22
+ "bpmn-start": [18, 18],
23
+ "bpmn-end": [18, 18],
24
+ "bpmn-intermediate": [18, 18],
25
+ "bpmn-boundary": [18, 18],
26
+ "bpmn-task": [50, 40],
27
+ "bpmn-subprocess": [50, 40],
28
+ "bpmn-gateway": [25, 25],
29
+ "bpmn-data-object": [18, 25],
30
+ "bpmn-data-store": [25, 25],
31
+ "bpmn-annotation": [0, 0],
32
+ };
33
+ export const LABEL_HEIGHT = {
34
+ "circle": 38,
35
+ "cube": 42,
36
+ "cube-big": 48,
37
+ "box": 38,
38
+ "cylinder": 38,
39
+ "hex": 40,
40
+ "annotation": 0,
41
+ "aws-tile": 48,
42
+ "aws-tile-hero": 48,
43
+ "badge": 0,
44
+ "image": 26,
45
+ // BPMN edges carry explicit waypoints, so no label clearance needed.
46
+ "bpmn-start": 0,
47
+ "bpmn-end": 0,
48
+ "bpmn-intermediate": 0,
49
+ "bpmn-boundary": 0,
50
+ "bpmn-task": 0,
51
+ "bpmn-subprocess": 0,
52
+ "bpmn-gateway": 0,
53
+ "bpmn-data-object": 0,
54
+ "bpmn-data-store": 0,
55
+ "bpmn-annotation": 0,
56
+ };
57
+ // ── Factories (mirror Python @dataclass with defaults) ────────────────
58
+ export function makeComponent({ id, name = "", subtitle = "", icon = "", shape = "box", accent = "green", pos = [0, 0], size = null, parent = null, align = null, alignGap = 24, alignOffset = [0, 0], }) {
59
+ return {
60
+ id, name, subtitle, icon, shape, accent, pos, size,
61
+ parent, align, alignGap, alignOffset,
62
+ };
63
+ }
64
+ export function makeRegion({ id, label = "", bounds = [0, 0, 0, 0], contains = [], padding = [24, 24], paddingBottom = null, style = "outer", icon = null, layout = null, pos = null, gap = 24, align = "center", visible = true, borderDash = null, borderStroke = null, labelAnchor = "middle", labelPosition = null, }) {
65
+ return {
66
+ id, label, bounds, contains, padding, paddingBottom, style, icon,
67
+ layout, pos, gap, align, visible, borderDash, borderStroke,
68
+ labelAnchor, labelPosition,
69
+ };
70
+ }
71
+ export function makeEdge({ src, dst, label = "", style = "gray", srcAnchor = null, dstAnchor = null, route = "auto", via = [], srcOffset = [0, 0], dstOffset = [0, 0], labelOffset = [0, 0], labelAnchor = "mid", labelSmall = false, labelPos = null, dashed = false, noArrow = false, trunkOffset = 0, sharedPort = false, points = null, bpmnFlow = null, }) {
72
+ return {
73
+ src, dst, label, style, srcAnchor, dstAnchor, route, via,
74
+ srcOffset, dstOffset, labelOffset, labelAnchor, labelSmall, labelPos,
75
+ dashed, noArrow, trunkOffset, sharedPort, points, bpmnFlow,
76
+ };
77
+ }
78
+ export function makeDiagram({ width = 0, height = 0, title = "", subtitle = "", components = [], regions = [], edges = [], layoutTrees = [], } = {}) {
79
+ return { width, height, title, subtitle, components, regions, edges, layoutTrees };
80
+ }
81
+ // ── Lookups & geometry helpers ────────────────────────────────────────
82
+ export function componentHalf(c) {
83
+ if (c.size)
84
+ return [(c.size[0] / 2) | 0, (c.size[1] / 2) | 0];
85
+ return SHAPE_HALF[c.shape];
86
+ }
87
+ export function regionHalf(r) {
88
+ const [, , w, h] = r.bounds;
89
+ return [(w / 2) | 0, (h / 2) | 0];
90
+ }
91
+ /**
92
+ * Edge attach point on `node` for a given side.
93
+ * For a Component, `bottom` pushes past `LABEL_HEIGHT` when the
94
+ * component actually has a name or subtitle.
95
+ */
96
+ export function anchor(node, side) {
97
+ // Region path — has `bounds`, no `pos`-as-Point.
98
+ if ("bounds" in node) {
99
+ return regionAnchor(node, side);
100
+ }
101
+ return componentAnchor(node, side);
102
+ }
103
+ function componentAnchor(c, side) {
104
+ const [cx, cy] = c.pos;
105
+ const [hw, hh] = componentHalf(c);
106
+ const labelled = (c.name && c.name.length > 0) || (c.subtitle && c.subtitle.length > 0);
107
+ const lh = labelled ? (LABEL_HEIGHT[c.shape] || 0) : 0;
108
+ switch (side) {
109
+ case "top": return [cx, cy - hh];
110
+ case "right": return [cx + hw, cy];
111
+ case "bottom": return [cx, cy + hh + lh];
112
+ case "left": return [cx - hw, cy];
113
+ case "center": return [cx, cy];
114
+ }
115
+ throw new Error(`anchor: bad side ${side}`);
116
+ }
117
+ function regionAnchor(r, side) {
118
+ const [x, y, w, h] = r.bounds;
119
+ switch (side) {
120
+ case "top": return [x + ((w / 2) | 0), y];
121
+ case "right": return [x + w, y + ((h / 2) | 0)];
122
+ case "bottom": return [x + ((w / 2) | 0), y + h];
123
+ case "left": return [x, y + ((h / 2) | 0)];
124
+ case "center": return [x + ((w / 2) | 0), y + ((h / 2) | 0)];
125
+ }
126
+ throw new Error(`anchor: bad side ${side}`);
127
+ }
128
+ /**
129
+ * Pick effective (srcAnchor, dstAnchor) for an edge. `null` slots are
130
+ * filled from geometry: horizontal-biased — vertical wins only when
131
+ * `|dy| > 2·|dx|`.
132
+ */
133
+ export function resolveAnchors(e, src, dst) {
134
+ const { srcAnchor: sa, dstAnchor: da } = e;
135
+ if (sa !== null && da !== null)
136
+ return [sa, da];
137
+ const [scx, scy] = anchor(src, "center");
138
+ const [dcx, dcy] = anchor(dst, "center");
139
+ const dx = dcx - scx, dy = dcy - scy;
140
+ let autoSa, autoDa;
141
+ if (Math.abs(dy) > 2 * Math.abs(dx)) {
142
+ [autoSa, autoDa] = dy >= 0 ? ["bottom", "top"] : ["top", "bottom"];
143
+ }
144
+ else {
145
+ [autoSa, autoDa] = dx >= 0 ? ["right", "left"] : ["left", "right"];
146
+ }
147
+ return [sa ?? autoSa, da ?? autoDa];
148
+ }
149
+ // ── Diagram node lookups ──────────────────────────────────────────────
150
+ export function getComponent(d, id) {
151
+ const c = d.components.find((c) => c.id === id);
152
+ if (!c)
153
+ throw new Error(`component ${JSON.stringify(id)} not in diagram`);
154
+ return c;
155
+ }
156
+ export function getNode(d, id) {
157
+ const c = d.components.find((c) => c.id === id);
158
+ if (c)
159
+ return c;
160
+ const r = d.regions.find((r) => r.id === id);
161
+ if (r)
162
+ return r;
163
+ throw new Error(`node ${JSON.stringify(id)} not in diagram (checked components + regions)`);
164
+ }
165
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * SVG image generator — an original TypeScript renderer.
3
+ *
4
+ * This is NOT a port of the Python `to_svg.py`; it is a small, independent
5
+ * renderer that turns a {@link Diagram} (whose components already carry
6
+ * positions) into a standalone SVG document. It draws:
7
+ * - a rounded background with a faint dot grid,
8
+ * - edges as horizontally-biased cubic Béziers with arrowheads,
9
+ * - each component's icon (via {@link getIcon}) plus its label,
10
+ * and auto-computes the canvas bounds from the component geometry.
11
+ *
12
+ * Only built-in (vector) icons render fully offline. File-backed icons
13
+ * require `setIconBaseURL(...)` to point at a host serving the manifest.
14
+ */
15
+ import { type Diagram } from "./model.js";
16
+ export interface RenderOptions {
17
+ /** Outer margin around the content, in px. Default 52. */
18
+ padding?: number;
19
+ /** Background fill. Pass `null` for a transparent canvas. Default `#f8fafc`. */
20
+ background?: string | null;
21
+ }
22
+ /**
23
+ * Render `d` to a complete SVG document string. Async because icon glyphs
24
+ * are resolved through {@link getIcon}.
25
+ */
26
+ export declare function renderSVG(d: Diagram, opts?: RenderOptions): Promise<string>;
27
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAEW,KAAK,OAAO,EAC7B,MAAM,YAAY,CAAC;AAOpB,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAmDD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2FrF"}
package/dist/render.js ADDED
@@ -0,0 +1,161 @@
1
+ /**
2
+ * SVG image generator — an original TypeScript renderer.
3
+ *
4
+ * This is NOT a port of the Python `to_svg.py`; it is a small, independent
5
+ * renderer that turns a {@link Diagram} (whose components already carry
6
+ * positions) into a standalone SVG document. It draws:
7
+ * - a rounded background with a faint dot grid,
8
+ * - edges as horizontally-biased cubic Béziers with arrowheads,
9
+ * - each component's icon (via {@link getIcon}) plus its label,
10
+ * and auto-computes the canvas bounds from the component geometry.
11
+ *
12
+ * Only built-in (vector) icons render fully offline. File-backed icons
13
+ * require `setIconBaseURL(...)` to point at a host serving the manifest.
14
+ */
15
+ import { anchor, resolveAnchors, componentHalf, LABEL_HEIGHT, } from "./model.js";
16
+ import { getIcon } from "./icons-loader.js";
17
+ import { BPMN_DEFS, BPMN_STYLE, renderBpmnComponent, renderBpmnEdge, bpmnRegionRect, bpmnRegionLabel, } from "./bpmn-shapes.js";
18
+ function escapeXml(s) {
19
+ return s.replace(/[&<>"]/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" }[c]));
20
+ }
21
+ function half(c) {
22
+ return componentHalf(c) ?? [35, 35];
23
+ }
24
+ const r1 = (n) => Math.round(n * 10) / 10;
25
+ // Renderer-owned defs: a filled-triangle arrowhead, a soft drop shadow, and
26
+ // a faint dot grid. (Original to this renderer — not copied from Python.)
27
+ const DEFS = `
28
+ <marker id="arrow" viewBox="0 0 10 10" refX="8" refY="5"
29
+ markerWidth="7" markerHeight="7" orient="auto-start-reverse">
30
+ <path d="M0,0 L10,5 L0,10 z" fill="#94a3b8"/>
31
+ </marker>
32
+ <filter id="soft" x="-40%" y="-40%" width="180%" height="180%">
33
+ <feDropShadow dx="0" dy="2" stdDeviation="3" flood-color="#0f172a" flood-opacity="0.18"/>
34
+ </filter>
35
+ <pattern id="grid" width="28" height="28" patternUnits="userSpaceOnUse">
36
+ <circle cx="2" cy="2" r="1" fill="#0f172a" fill-opacity="0.05"/>
37
+ </pattern>`;
38
+ const CSS = `
39
+ text { font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
40
+ .title { fill: #0f172a; font-size: 17px; font-weight: 700; }
41
+ .label { fill: #1e293b; font-size: 13px; font-weight: 600; text-anchor: middle; }
42
+ .elabel { fill: #64748b; font-size: 10.5px; text-anchor: middle; }`;
43
+ /** Horizontally-biased cubic Bézier between two resolved anchor points. */
44
+ function edgePath(x1, y1, sa, x2, y2, da) {
45
+ const k = Math.max(40, Math.abs(x2 - x1) * 0.5);
46
+ const off = (s, x, y) => {
47
+ switch (s) {
48
+ case "left": return [x - k, y];
49
+ case "right": return [x + k, y];
50
+ case "top": return [x, y - k];
51
+ case "bottom": return [x, y + k];
52
+ default: return [x, y];
53
+ }
54
+ };
55
+ const [c1x, c1y] = off(sa, x1, y1);
56
+ const [c2x, c2y] = off(da, x2, y2);
57
+ return `M${r1(x1)},${r1(y1)} C${r1(c1x)},${r1(c1y)} ${r1(c2x)},${r1(c2y)} ${r1(x2)},${r1(y2)}`;
58
+ }
59
+ /**
60
+ * Render `d` to a complete SVG document string. Async because icon glyphs
61
+ * are resolved through {@link getIcon}.
62
+ */
63
+ export async function renderSVG(d, opts = {}) {
64
+ const pad = opts.padding ?? 52;
65
+ const background = opts.background === undefined ? "#f8fafc" : opts.background;
66
+ // A BPMN diagram uses pool/lane regions, bpmn-* glyphs, and flows with
67
+ // explicit waypoints — inject the BPMN defs/CSS only when present so
68
+ // ordinary diagrams stay unchanged.
69
+ const hasBpmn = d.components.some((c) => c.shape.startsWith("bpmn-"))
70
+ || d.edges.some((e) => e.points != null && e.points.length > 0)
71
+ || d.regions.some((r) => r.style === "pool" || r.style === "lane");
72
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
73
+ const grow = (x, y) => {
74
+ minX = Math.min(minX, x);
75
+ maxX = Math.max(maxX, x);
76
+ minY = Math.min(minY, y);
77
+ maxY = Math.max(maxY, y);
78
+ };
79
+ for (const c of d.components) {
80
+ const [hw, hh] = half(c);
81
+ const lh = c.size ? (c.name ? 30 : 0) : (LABEL_HEIGHT[c.shape] ?? 0);
82
+ grow(c.pos[0] - hw, c.pos[1] - hh);
83
+ grow(c.pos[0] + hw, c.pos[1] + hh + lh);
84
+ }
85
+ for (const r of d.regions) {
86
+ const [x, y, w, h] = r.bounds;
87
+ grow(x, y);
88
+ grow(x + w, y + h);
89
+ }
90
+ for (const e of d.edges)
91
+ for (const [x, y] of e.points ?? [])
92
+ grow(x, y);
93
+ if (!Number.isFinite(minX)) {
94
+ minX = 0;
95
+ minY = 0;
96
+ maxX = 0;
97
+ maxY = 0;
98
+ }
99
+ const x0 = minX - pad;
100
+ const y0 = minY - pad - 22; // headroom for the title
101
+ const w = maxX + pad - x0;
102
+ const h = maxY + pad - y0;
103
+ const byId = new Map(d.components.map((c) => [c.id, c]));
104
+ const edges = [];
105
+ for (const e of d.edges) {
106
+ if (e.points && e.points.length >= 2) { // BPMN flow — draw through DI waypoints
107
+ edges.push(renderBpmnEdge(e));
108
+ continue;
109
+ }
110
+ const s = byId.get(e.src);
111
+ const t = byId.get(e.dst);
112
+ if (!s || !t)
113
+ continue;
114
+ const [sa, da] = resolveAnchors(e, s, t);
115
+ const [x1, y1] = anchor(s, sa);
116
+ const [x2, y2] = anchor(t, da);
117
+ edges.push(`<path d="${edgePath(x1, y1, sa, x2, y2, da)}" fill="none" stroke="#94a3b8" stroke-width="2" marker-end="url(#arrow)"/>`);
118
+ if (e.label) {
119
+ edges.push(`<text class="elabel" x="${r1((x1 + x2) / 2)}" y="${r1((y1 + y2) / 2 - 6)}">${escapeXml(e.label)}</text>`);
120
+ }
121
+ }
122
+ const nodes = [];
123
+ for (const c of d.components) {
124
+ if (c.shape.startsWith("bpmn-")) { // BPMN glyph draws its own geometry (no icon)
125
+ nodes.push(renderBpmnComponent(c));
126
+ continue;
127
+ }
128
+ const glyph = await getIcon(c.icon);
129
+ const [, hh] = half(c);
130
+ const parts = [`<g transform="translate(${c.pos[0]},${c.pos[1]})" filter="url(#soft)">${glyph}</g>`];
131
+ if (c.name)
132
+ parts.push(`<text class="label" x="${c.pos[0]}" y="${c.pos[1] + hh + 18}">${escapeXml(c.name)}</text>`);
133
+ nodes.push(parts.join(""));
134
+ }
135
+ const regionRects = d.regions.length
136
+ ? `\n <g class="regions">\n ${d.regions.map(bpmnRegionRect).join("\n ")}\n </g>` : "";
137
+ const regionLabels = d.regions.length
138
+ ? `\n <g class="region-labels">\n ${d.regions.map(bpmnRegionLabel).join("\n ")}\n </g>` : "";
139
+ const bg = background === null
140
+ ? ""
141
+ : `<rect x="${x0}" y="${y0}" width="${w}" height="${h}" rx="14" fill="${background}"/>
142
+ <rect x="${x0}" y="${y0}" width="${w}" height="${h}" rx="14" fill="url(#grid)"/>`;
143
+ const title = d.title ? `<text class="title" x="${x0 + pad}" y="${y0 + 30}">${escapeXml(d.title)}</text>` : "";
144
+ return `<?xml version="1.0" encoding="UTF-8"?>
145
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="${x0} ${y0} ${w} ${h}" width="${w}" height="${h}">
146
+ <defs>${DEFS}${hasBpmn ? BPMN_DEFS : ""}
147
+ </defs>
148
+ <style>${CSS}${hasBpmn ? BPMN_STYLE : ""}
149
+ </style>
150
+ ${bg}
151
+ ${title}${regionRects}
152
+ <g class="edges">
153
+ ${edges.join("\n ")}
154
+ </g>
155
+ <g class="nodes">
156
+ ${nodes.join("\n ")}
157
+ </g>${regionLabels}
158
+ </svg>
159
+ `;
160
+ }
161
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
package/dist/xml.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Minimal, dependency-free XML reader — just enough to walk a BPMN 2.0
3
+ * document. Produces a tree of {@link XmlEl} nodes with namespace prefixes
4
+ * stripped (so `bpmn:task` and `bpmn2:task` both read as `task`). Handles
5
+ * comments, CDATA, processing instructions / the XML declaration, doctype,
6
+ * self-closing tags, single/double-quoted attributes, and the standard +
7
+ * numeric entity references. It is a reader, not a validator.
8
+ */
9
+ export interface XmlEl {
10
+ /** local tag name (namespace prefix stripped) */
11
+ tag: string;
12
+ /** attributes keyed by local name */
13
+ attrs: Record<string, string>;
14
+ children: XmlEl[];
15
+ /** concatenated direct text content (entity-decoded) */
16
+ text: string;
17
+ }
18
+ /** Parse `src` and return its root element. */
19
+ export declare function parseXml(src: string): XmlEl;
20
+ /** Depth-first (document order) iterator over `el` and all descendants. */
21
+ export declare function iterAll(el: XmlEl): Generator<XmlEl>;
22
+ //# sourceMappingURL=xml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../src/xml.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,KAAK;IACpB,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;CACd;AA8CD,+CAA+C;AAC/C,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAsC3C;AAED,2EAA2E;AAC3E,wBAAiB,OAAO,CAAC,EAAE,EAAE,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAGpD"}