excalidraw-gen 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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +320 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +107 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/exporter/index.d.ts +4 -0
  7. package/dist/exporter/index.js +33 -0
  8. package/dist/exporter/index.js.map +1 -0
  9. package/dist/layout/arrow-router.d.ts +14 -0
  10. package/dist/layout/arrow-router.js +171 -0
  11. package/dist/layout/arrow-router.js.map +1 -0
  12. package/dist/layout/dag.d.ts +13 -0
  13. package/dist/layout/dag.js +158 -0
  14. package/dist/layout/dag.js.map +1 -0
  15. package/dist/layout/grid.d.ts +3 -0
  16. package/dist/layout/grid.js +52 -0
  17. package/dist/layout/grid.js.map +1 -0
  18. package/dist/layout/index.d.ts +5 -0
  19. package/dist/layout/index.js +21 -0
  20. package/dist/layout/index.js.map +1 -0
  21. package/dist/normalizer/index.d.ts +5 -0
  22. package/dist/normalizer/index.js +37 -0
  23. package/dist/normalizer/index.js.map +1 -0
  24. package/dist/parser/index.d.ts +5 -0
  25. package/dist/parser/index.js +154 -0
  26. package/dist/parser/index.js.map +1 -0
  27. package/dist/renderer/elements.d.ts +4 -0
  28. package/dist/renderer/elements.js +210 -0
  29. package/dist/renderer/elements.js.map +1 -0
  30. package/dist/renderer/index.d.ts +2 -0
  31. package/dist/renderer/index.js +76 -0
  32. package/dist/renderer/index.js.map +1 -0
  33. package/dist/renderer/seed.d.ts +5 -0
  34. package/dist/renderer/seed.js +18 -0
  35. package/dist/renderer/seed.js.map +1 -0
  36. package/dist/templates/index.d.ts +4 -0
  37. package/dist/templates/index.js +93 -0
  38. package/dist/templates/index.js.map +1 -0
  39. package/dist/templates/themes.d.ts +3 -0
  40. package/dist/templates/themes.js +90 -0
  41. package/dist/templates/themes.js.map +1 -0
  42. package/dist/types/index.d.ts +222 -0
  43. package/dist/types/index.js +6 -0
  44. package/dist/types/index.js.map +1 -0
  45. package/dist/validator/index.d.ts +4 -0
  46. package/dist/validator/index.js +132 -0
  47. package/dist/validator/index.js.map +1 -0
  48. package/dist/validator/preflight.d.ts +10 -0
  49. package/dist/validator/preflight.js +138 -0
  50. package/dist/validator/preflight.js.map +1 -0
  51. package/package.json +47 -0
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ParseError = void 0;
4
+ exports.parse = parse;
5
+ const js_yaml_1 = require("js-yaml");
6
+ class ParseError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "ParseError";
10
+ }
11
+ }
12
+ exports.ParseError = ParseError;
13
+ const VALID_DIAGRAM_TYPES = ["flowchart", "architecture"];
14
+ function looksLikeYaml(input) {
15
+ const t = input.trimStart();
16
+ return t.startsWith("---") || t.startsWith("type:") || t.startsWith("nodes:");
17
+ }
18
+ function assertString(value, path) {
19
+ if (typeof value !== "string") {
20
+ throw new ParseError(`Expected string at "${path}", got ${typeof value}`);
21
+ }
22
+ return value;
23
+ }
24
+ /** Parse an optional style override object — accepts any subset of NodeStyle fields */
25
+ function parseNodeStyle(raw, path) {
26
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
27
+ throw new ParseError(`${path} must be an object`);
28
+ }
29
+ const obj = raw;
30
+ const style = {};
31
+ const strFields = ["backgroundColor", "strokeColor", "strokeStyle", "fillStyle", "shape"];
32
+ for (const f of strFields) {
33
+ if (obj[f] !== undefined)
34
+ style[f] = assertString(obj[f], `${path}.${f}`);
35
+ }
36
+ if (obj["strokeWidth"] !== undefined)
37
+ style.strokeWidth = Number(obj["strokeWidth"]);
38
+ if (obj["width"] !== undefined)
39
+ style.width = Number(obj["width"]);
40
+ if (obj["height"] !== undefined)
41
+ style.height = Number(obj["height"]);
42
+ if (obj["opacity"] !== undefined)
43
+ style.opacity = Number(obj["opacity"]);
44
+ return style;
45
+ }
46
+ /** Parse an optional style override object — accepts any subset of EdgeStyle fields */
47
+ function parseEdgeStyle(raw, path) {
48
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
49
+ throw new ParseError(`${path} must be an object`);
50
+ }
51
+ const obj = raw;
52
+ const style = {};
53
+ if (obj["strokeColor"] !== undefined)
54
+ style.strokeColor = assertString(obj["strokeColor"], `${path}.strokeColor`);
55
+ if (obj["strokeStyle"] !== undefined)
56
+ style.strokeStyle = assertString(obj["strokeStyle"], `${path}.strokeStyle`);
57
+ if (obj["strokeWidth"] !== undefined)
58
+ style.strokeWidth = Number(obj["strokeWidth"]);
59
+ if (obj["opacity"] !== undefined)
60
+ style.opacity = Number(obj["opacity"]);
61
+ return style;
62
+ }
63
+ function parseNode(raw, index) {
64
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
65
+ throw new ParseError(`nodes[${index}] must be an object`);
66
+ }
67
+ const obj = raw;
68
+ const id = assertString(obj["id"], `nodes[${index}].id`).trim();
69
+ if (!id)
70
+ throw new ParseError(`nodes[${index}].id must not be empty`);
71
+ const label = assertString(obj["label"], `nodes[${index}].label`).trim();
72
+ const node = { id, label };
73
+ if (obj["type"] !== undefined) {
74
+ node.type = assertString(obj["type"], `nodes[${index}].type`);
75
+ }
76
+ if (obj["metadata"] !== undefined) {
77
+ if (typeof obj["metadata"] !== "object" || Array.isArray(obj["metadata"])) {
78
+ throw new ParseError(`nodes[${index}].metadata must be an object`);
79
+ }
80
+ node.metadata = obj["metadata"];
81
+ }
82
+ if (obj["style"] !== undefined) {
83
+ node.style = parseNodeStyle(obj["style"], `nodes[${index}].style`);
84
+ }
85
+ return node;
86
+ }
87
+ function parseEdge(raw, index) {
88
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
89
+ throw new ParseError(`edges[${index}] must be an object`);
90
+ }
91
+ const obj = raw;
92
+ const from = assertString(obj["from"], `edges[${index}].from`).trim();
93
+ if (!from)
94
+ throw new ParseError(`edges[${index}].from must not be empty`);
95
+ const to = assertString(obj["to"], `edges[${index}].to`).trim();
96
+ if (!to)
97
+ throw new ParseError(`edges[${index}].to must not be empty`);
98
+ const edge = { from, to };
99
+ if (obj["label"] !== undefined) {
100
+ edge.label = assertString(obj["label"], `edges[${index}].label`);
101
+ }
102
+ if (obj["bidirectional"] !== undefined) {
103
+ edge.bidirectional = Boolean(obj["bidirectional"]);
104
+ }
105
+ if (obj["style"] !== undefined) {
106
+ edge.style = parseEdgeStyle(obj["style"], `edges[${index}].style`);
107
+ }
108
+ return edge;
109
+ }
110
+ function parseRaw(raw) {
111
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
112
+ throw new ParseError("Input must be an object at the top level");
113
+ }
114
+ const obj = raw;
115
+ const diagramType = assertString(obj["type"], "type");
116
+ if (!VALID_DIAGRAM_TYPES.includes(diagramType)) {
117
+ throw new ParseError(`Invalid diagram type "${diagramType}". Must be one of: ${VALID_DIAGRAM_TYPES.join(", ")}`);
118
+ }
119
+ if (!Array.isArray(obj["nodes"])) {
120
+ throw new ParseError('"nodes" must be an array');
121
+ }
122
+ if (!Array.isArray(obj["edges"])) {
123
+ throw new ParseError('"edges" must be an array');
124
+ }
125
+ const nodes = obj["nodes"].map(parseNode);
126
+ const edges = obj["edges"].map(parseEdge);
127
+ const diagram = { type: diagramType, nodes, edges };
128
+ if (obj["title"] !== undefined) {
129
+ diagram.title = assertString(obj["title"], "title");
130
+ }
131
+ return diagram;
132
+ }
133
+ function parse(input) {
134
+ const trimmed = input.trim();
135
+ if (looksLikeYaml(trimmed)) {
136
+ let raw;
137
+ try {
138
+ raw = (0, js_yaml_1.load)(trimmed);
139
+ }
140
+ catch (err) {
141
+ throw new ParseError(`Invalid YAML: ${err instanceof Error ? err.message : String(err)}`);
142
+ }
143
+ return parseRaw(raw);
144
+ }
145
+ let raw;
146
+ try {
147
+ raw = JSON.parse(trimmed);
148
+ }
149
+ catch (err) {
150
+ throw new ParseError(`Invalid JSON: ${err instanceof Error ? err.message : String(err)}`);
151
+ }
152
+ return parseRaw(raw);
153
+ }
154
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { LayoutNode, LayoutEdge, TemplateNodeDef, ArrowRoute, ExcalidrawElement, ExcalidrawText, ExcalidrawArrow } from "../types/index.js";
2
+ export declare function createShapeElements(node: LayoutNode, nodeDef: TemplateNodeDef): [ExcalidrawElement, ExcalidrawText];
3
+ export declare function createArrowElement(edge: LayoutEdge, route: ArrowRoute, defaultStrokeColor: string): ExcalidrawArrow;
4
+ export declare function createArrowLabel(edge: LayoutEdge, route: ArrowRoute): ExcalidrawText;
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createShapeElements = createShapeElements;
4
+ exports.createArrowElement = createArrowElement;
5
+ exports.createArrowLabel = createArrowLabel;
6
+ const seed_js_1 = require("./seed.js");
7
+ const FONT_SIZE = 16;
8
+ const LINE_HEIGHT = 1.25;
9
+ const TEXT_PADDING_X = 16; // total horizontal padding (8px per side)
10
+ const TEXT_Y_PADDING = 5;
11
+ const CHAR_WIDTH_EST = 9;
12
+ /**
13
+ * Estimate line count accounting for word wrap inside a given width.
14
+ * Matches the estimation used by the layout engine so sizes stay consistent.
15
+ */
16
+ function estimateLines(text, nodeWidth) {
17
+ const charsPerLine = Math.max(1, Math.floor((nodeWidth - TEXT_PADDING_X) / CHAR_WIDTH_EST));
18
+ let lines = 0;
19
+ for (const para of text.split("\n")) {
20
+ lines += Math.max(1, Math.ceil(para.length / charsPerLine));
21
+ }
22
+ return lines;
23
+ }
24
+ function estimateTextHeight(text, nodeWidth) {
25
+ return Math.ceil(estimateLines(text, nodeWidth) * FONT_SIZE * LINE_HEIGHT);
26
+ }
27
+ /** Build the common base fields every Excalidraw element needs */
28
+ function baseFields(id, x, y, width, height) {
29
+ return {
30
+ id,
31
+ x,
32
+ y,
33
+ width,
34
+ height,
35
+ angle: 0,
36
+ fillStyle: "solid",
37
+ opacity: 100,
38
+ groupIds: [],
39
+ frameId: null,
40
+ seed: (0, seed_js_1.hashId)(id),
41
+ version: 1,
42
+ versionNonce: (0, seed_js_1.hashId)(id + "_v"),
43
+ isDeleted: false,
44
+ updated: 1,
45
+ link: null,
46
+ locked: false,
47
+ };
48
+ }
49
+ // ── Shape element (rectangle or ellipse) ────────────────────────────────────
50
+ function createShapeElements(node, nodeDef) {
51
+ const { id, label, x, y, width, height, style } = node;
52
+ // Merge template defaults with per-node style overrides
53
+ const effectiveStyle = {
54
+ strokeColor: style?.strokeColor ?? nodeDef.style.strokeColor,
55
+ backgroundColor: style?.backgroundColor ?? nodeDef.style.backgroundColor,
56
+ strokeWidth: style?.strokeWidth ?? nodeDef.style.strokeWidth,
57
+ strokeStyle: style?.strokeStyle ?? nodeDef.style.strokeStyle,
58
+ roundness: nodeDef.style.roundness,
59
+ fillStyle: (style?.fillStyle ?? "solid"),
60
+ opacity: style?.opacity ?? 100,
61
+ };
62
+ // Shape can be overridden per-node
63
+ const shapeType = (style?.shape ?? nodeDef.shape);
64
+ const textId = `${id}-text`;
65
+ const boundElements = [{ type: "text", id: textId }];
66
+ const shapeEl = {
67
+ ...baseFields(id, x, y, width, height),
68
+ type: shapeType,
69
+ strokeColor: effectiveStyle.strokeColor,
70
+ backgroundColor: effectiveStyle.backgroundColor,
71
+ strokeWidth: effectiveStyle.strokeWidth,
72
+ strokeStyle: effectiveStyle.strokeStyle,
73
+ roughness: 1,
74
+ roundness: effectiveStyle.roundness,
75
+ fillStyle: effectiveStyle.fillStyle,
76
+ opacity: effectiveStyle.opacity,
77
+ boundElements,
78
+ };
79
+ const textHeight = estimateTextHeight(label, width);
80
+ const textX = x + TEXT_PADDING_X / 2;
81
+ const textY = y + Math.max(TEXT_Y_PADDING, (height - textHeight) / 2);
82
+ const textWidth = width - TEXT_PADDING_X;
83
+ const textEl = {
84
+ ...baseFields(textId, textX, textY, textWidth, textHeight),
85
+ type: "text",
86
+ strokeColor: "#1e1e1e",
87
+ backgroundColor: "transparent",
88
+ strokeWidth: 1,
89
+ strokeStyle: "solid",
90
+ roughness: 0,
91
+ roundness: null,
92
+ boundElements: null,
93
+ text: label,
94
+ originalText: label,
95
+ fontSize: FONT_SIZE,
96
+ fontFamily: 1,
97
+ textAlign: "center",
98
+ verticalAlign: "middle",
99
+ baseline: Math.ceil(FONT_SIZE * 0.8),
100
+ containerId: id,
101
+ lineHeight: LINE_HEIGHT,
102
+ };
103
+ return [shapeEl, textEl];
104
+ }
105
+ // ── Arrow element ────────────────────────────────────────────────────────────
106
+ function createArrowElement(edge, route, defaultStrokeColor) {
107
+ const arrowId = `arrow-${edge.from}-${edge.to}`;
108
+ const { sourceAnchor, targetAnchor, points, width, height } = route;
109
+ // Apply per-edge style overrides on top of the template-derived color
110
+ const strokeColor = edge.style?.strokeColor ?? defaultStrokeColor;
111
+ const strokeStyle = edge.style?.strokeStyle ?? "solid";
112
+ const strokeWidth = edge.style?.strokeWidth ?? 2;
113
+ const opacity = edge.style?.opacity ?? 100;
114
+ const arrow = {
115
+ ...baseFields(arrowId, sourceAnchor.x, sourceAnchor.y, width, height),
116
+ type: "arrow",
117
+ strokeColor,
118
+ backgroundColor: "transparent",
119
+ strokeWidth,
120
+ strokeStyle,
121
+ opacity,
122
+ roughness: 0,
123
+ roundness: null,
124
+ boundElements: null,
125
+ points,
126
+ lastCommittedPoint: null,
127
+ startArrowhead: edge.bidirectional ? "arrow" : null,
128
+ endArrowhead: "arrow",
129
+ elbowed: true,
130
+ startBinding: {
131
+ elementId: edge.from,
132
+ focus: 0,
133
+ gap: 1,
134
+ fixedPoint: sourceAnchor.fixedPoint,
135
+ },
136
+ endBinding: {
137
+ elementId: edge.to,
138
+ focus: 0,
139
+ gap: 1,
140
+ fixedPoint: targetAnchor.fixedPoint,
141
+ },
142
+ };
143
+ return arrow;
144
+ }
145
+ // ── Arrow label element ──────────────────────────────────────────────────────
146
+ /**
147
+ * Find the geometric midpoint along the actual elbow path (not just anchor midpoint).
148
+ * This ensures labels appear ON the arrow line, not floating in empty space.
149
+ */
150
+ function pathMidpoint(route) {
151
+ const { sourceAnchor, points } = route;
152
+ // Convert relative points to absolute coords
153
+ const abs = points.map(([dx, dy]) => [
154
+ sourceAnchor.x + dx,
155
+ sourceAnchor.y + dy,
156
+ ]);
157
+ // Compute segment lengths
158
+ const segLengths = [];
159
+ let totalLen = 0;
160
+ for (let i = 1; i < abs.length; i++) {
161
+ const len = Math.hypot(abs[i][0] - abs[i - 1][0], abs[i][1] - abs[i - 1][1]);
162
+ segLengths.push(len);
163
+ totalLen += len;
164
+ }
165
+ // Walk to the 50% mark
166
+ const half = totalLen / 2;
167
+ let accum = 0;
168
+ for (let i = 0; i < segLengths.length; i++) {
169
+ const next = accum + segLengths[i];
170
+ if (next >= half) {
171
+ const t = segLengths[i] > 0 ? (half - accum) / segLengths[i] : 0;
172
+ return {
173
+ x: abs[i][0] + t * (abs[i + 1][0] - abs[i][0]),
174
+ y: abs[i][1] + t * (abs[i + 1][1] - abs[i][1]),
175
+ };
176
+ }
177
+ accum = next;
178
+ }
179
+ // Fallback: last point
180
+ const last = abs[abs.length - 1];
181
+ return { x: last[0], y: last[1] };
182
+ }
183
+ function createArrowLabel(edge, route) {
184
+ const { x: mx, y: my } = pathMidpoint(route);
185
+ const labelId = `arrow-${edge.from}-${edge.to}-label`;
186
+ const text = edge.label;
187
+ const labelWidth = Math.max(60, text.length * 8); // rough proportional width
188
+ const textHeight = estimateTextHeight(text, labelWidth);
189
+ return {
190
+ ...baseFields(labelId, mx - labelWidth / 2, my - textHeight / 2 - 10, labelWidth, textHeight),
191
+ type: "text",
192
+ strokeColor: "#495057",
193
+ backgroundColor: "#ffffff",
194
+ strokeWidth: 1,
195
+ strokeStyle: "solid",
196
+ roughness: 0,
197
+ roundness: null,
198
+ boundElements: null,
199
+ text,
200
+ originalText: text,
201
+ fontSize: 13,
202
+ fontFamily: 1,
203
+ textAlign: "center",
204
+ verticalAlign: "middle",
205
+ baseline: Math.ceil(13 * 0.8),
206
+ containerId: null,
207
+ lineHeight: LINE_HEIGHT,
208
+ };
209
+ }
210
+ //# sourceMappingURL=elements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elements.js","sourceRoot":"","sources":["../../src/renderer/elements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Diagram, LayoutNode, TemplateDefinition, ExcalidrawElement } from "../types/index.js";
2
+ export declare function render(diagram: Diagram, layoutNodes: LayoutNode[], template: TemplateDefinition): ExcalidrawElement[];
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.render = render;
4
+ const index_js_1 = require("../templates/index.js");
5
+ const arrow_router_js_1 = require("../layout/arrow-router.js");
6
+ const elements_js_1 = require("./elements.js");
7
+ function render(diagram, layoutNodes, template) {
8
+ const elements = [];
9
+ // Build nodeMap for O(1) lookup
10
+ const nodeMap = new Map(layoutNodes.map((n) => [n.id, n]));
11
+ // Build shape elements (shape + text pairs)
12
+ for (const layoutNode of layoutNodes) {
13
+ const nodeDef = (0, index_js_1.getNodeDef)(template, layoutNode.type);
14
+ const [shapeEl, textEl] = (0, elements_js_1.createShapeElements)(layoutNode, nodeDef);
15
+ elements.push(shapeEl, textEl);
16
+ }
17
+ // Build edge list with stagger counting
18
+ const layoutEdges = diagram.edges.map((e) => ({
19
+ from: e.from,
20
+ to: e.to,
21
+ label: e.label,
22
+ bidirectional: e.bidirectional,
23
+ style: e.style,
24
+ }));
25
+ const edgeGroups = new Map();
26
+ for (const edge of layoutEdges) {
27
+ const key = edge.from;
28
+ if (!edgeGroups.has(key))
29
+ edgeGroups.set(key, []);
30
+ edgeGroups.get(key).push(edge);
31
+ }
32
+ // Count per-side groupings
33
+ const sideGroups = new Map();
34
+ for (const [fromId, edges] of edgeGroups) {
35
+ const source = nodeMap.get(fromId);
36
+ if (!source)
37
+ continue;
38
+ for (const edge of edges) {
39
+ const target = nodeMap.get(edge.to);
40
+ if (!target)
41
+ continue;
42
+ // Determine side using the same threshold as the arrow router
43
+ const dx = (target.x + target.width / 2) - (source.x + source.width / 2);
44
+ const dy = (target.y + target.height / 2) - (source.y + source.height / 2);
45
+ const side = Math.abs(dy) > arrow_router_js_1.VERTICAL_THRESHOLD
46
+ ? dy > 0 ? "bottom" : "top"
47
+ : dx >= 0 ? "right" : "left";
48
+ const sideKey = `${fromId}:${side}`;
49
+ if (!sideGroups.has(sideKey))
50
+ sideGroups.set(sideKey, []);
51
+ sideGroups.get(sideKey).push(edge);
52
+ }
53
+ }
54
+ // Render arrows
55
+ for (const [sideKey, sideEdges] of sideGroups) {
56
+ const fromId = sideKey.split(":")[0];
57
+ const source = nodeMap.get(fromId);
58
+ if (!source)
59
+ continue;
60
+ sideEdges.forEach((edge, i) => {
61
+ const target = nodeMap.get(edge.to);
62
+ if (!target)
63
+ return;
64
+ const route = (0, arrow_router_js_1.routeArrow)(source, target, i, sideEdges.length);
65
+ // Arrow stroke = target node's stroke color
66
+ const targetTemplate = (0, index_js_1.getNodeDef)(template, target.type);
67
+ const strokeColor = targetTemplate.style.strokeColor;
68
+ elements.push((0, elements_js_1.createArrowElement)(edge, route, strokeColor));
69
+ if (edge.label) {
70
+ elements.push((0, elements_js_1.createArrowLabel)(edge, route));
71
+ }
72
+ });
73
+ }
74
+ return elements;
75
+ }
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * FNV-1a 32-bit hash — deterministic, fast, good distribution for short strings.
3
+ * Returns a positive integer usable as Excalidraw element seed.
4
+ */
5
+ export declare function hashId(input: string): number;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hashId = hashId;
4
+ /**
5
+ * FNV-1a 32-bit hash — deterministic, fast, good distribution for short strings.
6
+ * Returns a positive integer usable as Excalidraw element seed.
7
+ */
8
+ function hashId(input) {
9
+ let hash = 2166136261; // FNV offset basis
10
+ for (let i = 0; i < input.length; i++) {
11
+ hash ^= input.charCodeAt(i);
12
+ // 32-bit FNV prime multiply, keeping within 32-bit unsigned range
13
+ hash = Math.imul(hash, 16777619) >>> 0;
14
+ }
15
+ // Ensure positive non-zero
16
+ return (hash >>> 0) || 1;
17
+ }
18
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/renderer/seed.ts"],"names":[],"mappings":";;AAIA,wBASC;AAbD;;;GAGG;AACH,SAAgB,MAAM,CAAC,KAAa;IAClC,IAAI,IAAI,GAAG,UAAU,CAAC,CAAC,mBAAmB;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5B,kEAAkE;QAClE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IACD,2BAA2B;IAC3B,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { TemplateDefinition, TemplateNodeDef } from "../types/index.js";
2
+ export declare function getTemplate(name: string): TemplateDefinition;
3
+ export declare function registerTemplate(name: string, template: TemplateDefinition): void;
4
+ export declare function getNodeDef(template: TemplateDefinition, nodeType: string): TemplateNodeDef;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTemplate = getTemplate;
4
+ exports.registerTemplate = registerTemplate;
5
+ exports.getNodeDef = getNodeDef;
6
+ // ── Shared style builders ────────────────────────────────────────────────────
7
+ function rectStyle(bg, stroke, strokeWidth = 2, strokeStyle = "solid") {
8
+ return {
9
+ backgroundColor: bg,
10
+ strokeColor: stroke,
11
+ strokeWidth,
12
+ strokeStyle,
13
+ roundness: { type: 3 },
14
+ };
15
+ }
16
+ function ellipseStyle(bg, stroke) {
17
+ return {
18
+ backgroundColor: bg,
19
+ strokeColor: stroke,
20
+ strokeWidth: 2,
21
+ strokeStyle: "solid",
22
+ roundness: { type: 2 },
23
+ };
24
+ }
25
+ function rectNode(bg, stroke, sw, ss) {
26
+ return { shape: "rectangle", style: rectStyle(bg, stroke, sw, ss) };
27
+ }
28
+ function ellipseNode(bg, stroke) {
29
+ return { shape: "ellipse", style: ellipseStyle(bg, stroke) };
30
+ }
31
+ // ── Default fallback node ────────────────────────────────────────────────────
32
+ const DEFAULT_NODE = rectNode("#f8f9fa", "#495057");
33
+ // ── Flowchart template ───────────────────────────────────────────────────────
34
+ //
35
+ // IMPORTANT: Decision nodes use orange+dashed rectangle — NOT diamond.
36
+ // diamond type has broken arrow connections in raw Excalidraw JSON.
37
+ const FLOWCHART_TEMPLATE = {
38
+ name: "flowchart",
39
+ nodes: {
40
+ start: ellipseNode("#e7f5ff", "#1971c2"),
41
+ end: ellipseNode("#fff0f6", "#c2255c"),
42
+ process: rectNode("#d0bfff", "#7048e8"),
43
+ // decision → orange dashed rect (NOT diamond — known Excalidraw JSON bug)
44
+ decision: rectNode("#ffd8a8", "#e8590c", 2, "dashed"),
45
+ io: rectNode("#e3fafc", "#0c8599"),
46
+ subprocess: rectNode("#d3f9d8", "#40c057"),
47
+ default: rectNode("#d0bfff", "#7048e8"),
48
+ },
49
+ defaultNode: DEFAULT_NODE,
50
+ };
51
+ // ── Architecture template ────────────────────────────────────────────────────
52
+ const ARCHITECTURE_TEMPLATE = {
53
+ name: "architecture",
54
+ nodes: {
55
+ service: rectNode("#d0bfff", "#7048e8"),
56
+ api: rectNode("#d0bfff", "#7048e8"),
57
+ db: rectNode("#b2f2bb", "#2f9e44"),
58
+ database: rectNode("#b2f2bb", "#2f9e44"),
59
+ queue: rectNode("#fff3bf", "#fab005"),
60
+ cache: rectNode("#ffe8cc", "#fd7e14"),
61
+ storage: rectNode("#ffec99", "#f08c00"),
62
+ frontend: rectNode("#a5d8ff", "#1971c2"),
63
+ gateway: rectNode("#ffa8a8", "#c92a2a", 3),
64
+ orchestrator: rectNode("#ffa8a8", "#c92a2a", 3),
65
+ user: ellipseNode("#e7f5ff", "#1971c2"),
66
+ actor: ellipseNode("#e7f5ff", "#1971c2"),
67
+ external: rectNode("#ffc9c9", "#e03131"),
68
+ monitor: rectNode("#d3f9d8", "#40c057"),
69
+ ml: rectNode("#e599f7", "#9c36b5"),
70
+ ai: rectNode("#e599f7", "#9c36b5"),
71
+ default: rectNode("#d0bfff", "#7048e8"),
72
+ },
73
+ defaultNode: DEFAULT_NODE,
74
+ };
75
+ // ── Registry ─────────────────────────────────────────────────────────────────
76
+ const registry = new Map([
77
+ ["flowchart", FLOWCHART_TEMPLATE],
78
+ ["architecture", ARCHITECTURE_TEMPLATE],
79
+ ]);
80
+ function getTemplate(name) {
81
+ const tmpl = registry.get(name);
82
+ if (!tmpl) {
83
+ throw new Error(`Unknown template: "${name}". Available: ${[...registry.keys()].join(", ")}`);
84
+ }
85
+ return tmpl;
86
+ }
87
+ function registerTemplate(name, template) {
88
+ registry.set(name, template);
89
+ }
90
+ function getNodeDef(template, nodeType) {
91
+ return template.nodes[nodeType] ?? template.defaultNode;
92
+ }
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Theme, TemplateDefinition } from "../types/index.js";
2
+ export declare function applyThemeToTemplate(template: TemplateDefinition, theme: Theme): TemplateDefinition;
3
+ export declare function getViewBackground(theme: Theme): string;