graphics-debug 0.0.64 → 0.0.66

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 (39) hide show
  1. package/README.md +14 -0
  2. package/dist/chunk-62J5EOWN.js +108 -0
  3. package/dist/chunk-62J5EOWN.js.map +1 -0
  4. package/dist/{chunk-TJJMMKHI.js → chunk-B2WYIXWQ.js} +2 -1
  5. package/dist/chunk-B2WYIXWQ.js.map +1 -0
  6. package/dist/{chunk-K5GFS6QZ.js → chunk-TVUC4YPH.js} +6 -6
  7. package/dist/{chunk-4LFM7XSX.js → chunk-UD7LT2L3.js} +64 -1
  8. package/dist/chunk-UD7LT2L3.js.map +1 -0
  9. package/dist/{chunk-K2IJQPPY.js → chunk-WFPC5ZH3.js} +6 -1
  10. package/dist/chunk-WFPC5ZH3.js.map +1 -0
  11. package/dist/{chunk-YWTEDOCO.js → chunk-XGME63R3.js} +2 -2
  12. package/dist/chunk-XGME63R3.js.map +1 -0
  13. package/dist/{chunk-ARYXS3GC.js → chunk-ZV4UNKKF.js} +41 -1
  14. package/dist/chunk-ZV4UNKKF.js.map +1 -0
  15. package/dist/cli/cli.js +7 -6
  16. package/dist/cli/cli.js.map +1 -1
  17. package/dist/lib/arrowHelpers.d.ts +45 -0
  18. package/dist/lib/arrowHelpers.js +9 -0
  19. package/dist/lib/arrowHelpers.js.map +1 -0
  20. package/dist/lib/drawGraphicsToCanvas.js +2 -1
  21. package/dist/lib/getSvgFromGraphicsObject.js +2 -1
  22. package/dist/lib/index.d.ts +1 -1
  23. package/dist/lib/index.js +9 -8
  24. package/dist/lib/matcher.js +2 -1
  25. package/dist/lib/matcher.js.map +1 -1
  26. package/dist/lib/mergeGraphics.js +1 -1
  27. package/dist/lib/react.d.ts +1 -1
  28. package/dist/lib/react.js +298 -143
  29. package/dist/lib/react.js.map +1 -1
  30. package/dist/lib/stackGraphics.js +5 -4
  31. package/dist/lib/translateGraphics.js +1 -1
  32. package/dist/lib/types.d.ts +14 -1
  33. package/package.json +1 -1
  34. package/dist/chunk-4LFM7XSX.js.map +0 -1
  35. package/dist/chunk-ARYXS3GC.js.map +0 -1
  36. package/dist/chunk-K2IJQPPY.js.map +0 -1
  37. package/dist/chunk-TJJMMKHI.js.map +0 -1
  38. package/dist/chunk-YWTEDOCO.js.map +0 -1
  39. /package/dist/{chunk-K5GFS6QZ.js.map → chunk-TVUC4YPH.js.map} +0 -0
package/README.md CHANGED
@@ -76,16 +76,30 @@ interface Circle {
76
76
  label?: string
77
77
  }
78
78
 
79
+ interface Arrow {
80
+ start: { x: number; y: number }
81
+ end: { x: number; y: number }
82
+ doubleSided?: boolean
83
+ color?: string
84
+ }
85
+
79
86
  interface GraphicsObject {
80
87
  points?: Point[]
81
88
  lines?: Line[]
82
89
  rects?: Rect[]
83
90
  circles?: Circle[]
91
+ arrows?: Arrow[]
84
92
  coordinateSystem?: "cartesian" | "screen"
85
93
  title?: string
86
94
  }
87
95
  ```
88
96
 
97
+ > **Note**
98
+ > The `coordinateSystem` field is optional. If you omit it (as in the simple
99
+ > arrow examples below), the renderer uses a standard Cartesian orientation,
100
+ > so you only need to provide `x` and `y` coordinates for your start and end
101
+ > points.
102
+
89
103
  ## Library Usage
90
104
 
91
105
  ### Writing `graphics-debug` compatible logs
@@ -0,0 +1,108 @@
1
+ // lib/arrowHelpers.ts
2
+ var DEFAULT_ARROW_SHAFT_WIDTH = 2;
3
+ var DEFAULT_ARROW_HEAD_WIDTH = 12;
4
+ var DEFAULT_ARROW_HEAD_LENGTH = 12;
5
+ var createDegenerateHead = (point) => ({
6
+ tip: { ...point },
7
+ base: { ...point },
8
+ leftWing: { ...point },
9
+ rightWing: { ...point }
10
+ });
11
+ var createHead = (tip, base, headWidth) => {
12
+ const dirX = tip.x - base.x;
13
+ const dirY = tip.y - base.y;
14
+ const length = Math.hypot(dirX, dirY);
15
+ if (length === 0) {
16
+ return createDegenerateHead(tip);
17
+ }
18
+ const dirUnitX = dirX / length;
19
+ const dirUnitY = dirY / length;
20
+ const perpX = -dirUnitY * (headWidth / 2);
21
+ const perpY = dirUnitX * (headWidth / 2);
22
+ return {
23
+ tip: { ...tip },
24
+ base: { ...base },
25
+ leftWing: { x: base.x + perpX, y: base.y + perpY },
26
+ rightWing: { x: base.x - perpX, y: base.y - perpY }
27
+ };
28
+ };
29
+ function getArrowGeometry(arrow) {
30
+ const { start, end } = arrow;
31
+ const vx = end.x - start.x;
32
+ const vy = end.y - start.y;
33
+ const length = Math.hypot(vx, vy);
34
+ const shaftWidth = DEFAULT_ARROW_SHAFT_WIDTH;
35
+ const headWidth = DEFAULT_ARROW_HEAD_WIDTH;
36
+ if (length === 0) {
37
+ const heads2 = arrow.doubleSided ? [createDegenerateHead(start), createDegenerateHead(start)] : [createDegenerateHead(start)];
38
+ return {
39
+ shaftStart: { ...start },
40
+ shaftEnd: { ...start },
41
+ heads: heads2,
42
+ shaftWidth,
43
+ headLength: 0,
44
+ headWidth,
45
+ length
46
+ };
47
+ }
48
+ const ux = vx / length;
49
+ const uy = vy / length;
50
+ const baseHeadLength = Math.min(DEFAULT_ARROW_HEAD_LENGTH, length * 0.5);
51
+ const desiredHeadLength = Math.max(baseHeadLength, shaftWidth * 2);
52
+ const maxHeadLength = arrow.doubleSided ? length / 2 : length;
53
+ const headLength = Math.min(desiredHeadLength, maxHeadLength);
54
+ const endHeadBase = {
55
+ x: end.x - ux * headLength,
56
+ y: end.y - uy * headLength
57
+ };
58
+ const heads = [
59
+ createHead(end, endHeadBase, headWidth)
60
+ ];
61
+ let shaftStart = { ...start };
62
+ const shaftEnd = { ...endHeadBase };
63
+ if (arrow.doubleSided) {
64
+ const startHeadBase = {
65
+ x: start.x + ux * headLength,
66
+ y: start.y + uy * headLength
67
+ };
68
+ heads.unshift(createHead(start, startHeadBase, headWidth));
69
+ shaftStart = startHeadBase;
70
+ }
71
+ return {
72
+ shaftStart,
73
+ shaftEnd,
74
+ heads,
75
+ shaftWidth,
76
+ headLength,
77
+ headWidth,
78
+ length
79
+ };
80
+ }
81
+ function getArrowBoundingBox(arrow) {
82
+ const geometry = getArrowGeometry(arrow);
83
+ const points = [
84
+ geometry.shaftStart,
85
+ geometry.shaftEnd,
86
+ ...geometry.heads.flatMap((head) => [
87
+ head.tip,
88
+ head.base,
89
+ head.leftWing,
90
+ head.rightWing
91
+ ])
92
+ ];
93
+ return points.reduce(
94
+ (acc, point) => ({
95
+ minX: Math.min(acc.minX, point.x),
96
+ maxX: Math.max(acc.maxX, point.x),
97
+ minY: Math.min(acc.minY, point.y),
98
+ maxY: Math.max(acc.maxY, point.y)
99
+ }),
100
+ { minX: Infinity, maxX: -Infinity, minY: Infinity, maxY: -Infinity }
101
+ );
102
+ }
103
+
104
+ export {
105
+ getArrowGeometry,
106
+ getArrowBoundingBox
107
+ };
108
+ //# sourceMappingURL=chunk-62J5EOWN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../lib/arrowHelpers.ts"],"sourcesContent":["import type { Arrow } from \"./types\"\n\nconst DEFAULT_ARROW_SHAFT_WIDTH = 2\nconst DEFAULT_ARROW_HEAD_WIDTH = 12\nconst DEFAULT_ARROW_HEAD_LENGTH = 12\n\nexport type ArrowHeadGeometry = {\n tip: { x: number; y: number }\n base: { x: number; y: number }\n leftWing: { x: number; y: number }\n rightWing: { x: number; y: number }\n}\n\nexport type ArrowGeometry = {\n shaftStart: { x: number; y: number }\n shaftEnd: { x: number; y: number }\n heads: ArrowHeadGeometry[]\n shaftWidth: number\n headLength: number\n headWidth: number\n length: number\n}\n\nconst createDegenerateHead = (point: { x: number; y: number }): ArrowHeadGeometry => ({\n tip: { ...point },\n base: { ...point },\n leftWing: { ...point },\n rightWing: { ...point },\n})\n\nconst createHead = (\n tip: { x: number; y: number },\n base: { x: number; y: number },\n headWidth: number,\n): ArrowHeadGeometry => {\n const dirX = tip.x - base.x\n const dirY = tip.y - base.y\n const length = Math.hypot(dirX, dirY)\n\n if (length === 0) {\n return createDegenerateHead(tip)\n }\n\n const dirUnitX = dirX / length\n const dirUnitY = dirY / length\n const perpX = -dirUnitY * (headWidth / 2)\n const perpY = dirUnitX * (headWidth / 2)\n\n return {\n tip: { ...tip },\n base: { ...base },\n leftWing: { x: base.x + perpX, y: base.y + perpY },\n rightWing: { x: base.x - perpX, y: base.y - perpY },\n }\n}\n\nexport function getArrowGeometry(arrow: Arrow): ArrowGeometry {\n const { start, end } = arrow\n\n const vx = end.x - start.x\n const vy = end.y - start.y\n const length = Math.hypot(vx, vy)\n\n const shaftWidth = DEFAULT_ARROW_SHAFT_WIDTH\n const headWidth = DEFAULT_ARROW_HEAD_WIDTH\n\n if (length === 0) {\n const heads = arrow.doubleSided\n ? [createDegenerateHead(start), createDegenerateHead(start)]\n : [createDegenerateHead(start)]\n return {\n shaftStart: { ...start },\n shaftEnd: { ...start },\n heads,\n shaftWidth,\n headLength: 0,\n headWidth,\n length,\n }\n }\n\n const ux = vx / length\n const uy = vy / length\n\n const baseHeadLength = Math.min(DEFAULT_ARROW_HEAD_LENGTH, length * 0.5)\n const desiredHeadLength = Math.max(baseHeadLength, shaftWidth * 2)\n const maxHeadLength = arrow.doubleSided ? length / 2 : length\n const headLength = Math.min(desiredHeadLength, maxHeadLength)\n\n const endHeadBase = {\n x: end.x - ux * headLength,\n y: end.y - uy * headLength,\n }\n\n const heads: ArrowHeadGeometry[] = [\n createHead(end, endHeadBase, headWidth),\n ]\n\n let shaftStart = { ...start }\n const shaftEnd = { ...endHeadBase }\n\n if (arrow.doubleSided) {\n const startHeadBase = {\n x: start.x + ux * headLength,\n y: start.y + uy * headLength,\n }\n\n heads.unshift(createHead(start, startHeadBase, headWidth))\n shaftStart = startHeadBase\n }\n\n return {\n shaftStart,\n shaftEnd,\n heads,\n shaftWidth,\n headLength,\n headWidth,\n length,\n }\n}\n\nexport function getArrowBoundingBox(arrow: Arrow) {\n const geometry = getArrowGeometry(arrow)\n const points = [\n geometry.shaftStart,\n geometry.shaftEnd,\n ...geometry.heads.flatMap((head) => [\n head.tip,\n head.base,\n head.leftWing,\n head.rightWing,\n ]),\n ]\n\n return points.reduce(\n (acc, point) => ({\n minX: Math.min(acc.minX, point.x),\n maxX: Math.max(acc.maxX, point.x),\n minY: Math.min(acc.minY, point.y),\n maxY: Math.max(acc.maxY, point.y),\n }),\n { minX: Infinity, maxX: -Infinity, minY: Infinity, maxY: -Infinity },\n )\n}\n"],"mappings":";AAEA,IAAM,4BAA4B;AAClC,IAAM,2BAA2B;AACjC,IAAM,4BAA4B;AAmBlC,IAAM,uBAAuB,CAAC,WAAwD;AAAA,EACpF,KAAK,EAAE,GAAG,MAAM;AAAA,EAChB,MAAM,EAAE,GAAG,MAAM;AAAA,EACjB,UAAU,EAAE,GAAG,MAAM;AAAA,EACrB,WAAW,EAAE,GAAG,MAAM;AACxB;AAEA,IAAM,aAAa,CACjB,KACA,MACA,cACsB;AACtB,QAAM,OAAO,IAAI,IAAI,KAAK;AAC1B,QAAM,OAAO,IAAI,IAAI,KAAK;AAC1B,QAAM,SAAS,KAAK,MAAM,MAAM,IAAI;AAEpC,MAAI,WAAW,GAAG;AAChB,WAAO,qBAAqB,GAAG;AAAA,EACjC;AAEA,QAAM,WAAW,OAAO;AACxB,QAAM,WAAW,OAAO;AACxB,QAAM,QAAQ,CAAC,YAAY,YAAY;AACvC,QAAM,QAAQ,YAAY,YAAY;AAEtC,SAAO;AAAA,IACL,KAAK,EAAE,GAAG,IAAI;AAAA,IACd,MAAM,EAAE,GAAG,KAAK;AAAA,IAChB,UAAU,EAAE,GAAG,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI,MAAM;AAAA,IACjD,WAAW,EAAE,GAAG,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI,MAAM;AAAA,EACpD;AACF;AAEO,SAAS,iBAAiB,OAA6B;AAC5D,QAAM,EAAE,OAAO,IAAI,IAAI;AAEvB,QAAM,KAAK,IAAI,IAAI,MAAM;AACzB,QAAM,KAAK,IAAI,IAAI,MAAM;AACzB,QAAM,SAAS,KAAK,MAAM,IAAI,EAAE;AAEhC,QAAM,aAAa;AACnB,QAAM,YAAY;AAElB,MAAI,WAAW,GAAG;AAChB,UAAMA,SAAQ,MAAM,cAChB,CAAC,qBAAqB,KAAK,GAAG,qBAAqB,KAAK,CAAC,IACzD,CAAC,qBAAqB,KAAK,CAAC;AAChC,WAAO;AAAA,MACL,YAAY,EAAE,GAAG,MAAM;AAAA,MACvB,UAAU,EAAE,GAAG,MAAM;AAAA,MACrB,OAAAA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK;AAEhB,QAAM,iBAAiB,KAAK,IAAI,2BAA2B,SAAS,GAAG;AACvE,QAAM,oBAAoB,KAAK,IAAI,gBAAgB,aAAa,CAAC;AACjE,QAAM,gBAAgB,MAAM,cAAc,SAAS,IAAI;AACvD,QAAM,aAAa,KAAK,IAAI,mBAAmB,aAAa;AAE5D,QAAM,cAAc;AAAA,IAClB,GAAG,IAAI,IAAI,KAAK;AAAA,IAChB,GAAG,IAAI,IAAI,KAAK;AAAA,EAClB;AAEA,QAAM,QAA6B;AAAA,IACjC,WAAW,KAAK,aAAa,SAAS;AAAA,EACxC;AAEA,MAAI,aAAa,EAAE,GAAG,MAAM;AAC5B,QAAM,WAAW,EAAE,GAAG,YAAY;AAElC,MAAI,MAAM,aAAa;AACrB,UAAM,gBAAgB;AAAA,MACpB,GAAG,MAAM,IAAI,KAAK;AAAA,MAClB,GAAG,MAAM,IAAI,KAAK;AAAA,IACpB;AAEA,UAAM,QAAQ,WAAW,OAAO,eAAe,SAAS,CAAC;AACzD,iBAAa;AAAA,EACf;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,OAAc;AAChD,QAAM,WAAW,iBAAiB,KAAK;AACvC,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,IACT,SAAS;AAAA,IACT,GAAG,SAAS,MAAM,QAAQ,CAAC,SAAS;AAAA,MAClC,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AAEA,SAAO,OAAO;AAAA,IACZ,CAAC,KAAK,WAAW;AAAA,MACf,MAAM,KAAK,IAAI,IAAI,MAAM,MAAM,CAAC;AAAA,MAChC,MAAM,KAAK,IAAI,IAAI,MAAM,MAAM,CAAC;AAAA,MAChC,MAAM,KAAK,IAAI,IAAI,MAAM,MAAM,CAAC;AAAA,MAChC,MAAM,KAAK,IAAI,IAAI,MAAM,MAAM,CAAC;AAAA,IAClC;AAAA,IACA,EAAE,MAAM,UAAU,MAAM,WAAW,MAAM,UAAU,MAAM,UAAU;AAAA,EACrE;AACF;","names":["heads"]}
@@ -6,6 +6,7 @@ var mergeGraphics = (graphics1, graphics2) => {
6
6
  points: [...graphics1.points ?? [], ...graphics2.points ?? []],
7
7
  lines: [...graphics1.lines ?? [], ...graphics2.lines ?? []],
8
8
  circles: [...graphics1.circles ?? [], ...graphics2.circles ?? []],
9
+ arrows: [...graphics1.arrows ?? [], ...graphics2.arrows ?? []],
9
10
  texts: [...graphics1.texts ?? [], ...graphics2.texts ?? []]
10
11
  };
11
12
  };
@@ -13,4 +14,4 @@ var mergeGraphics = (graphics1, graphics2) => {
13
14
  export {
14
15
  mergeGraphics
15
16
  };
16
- //# sourceMappingURL=chunk-TJJMMKHI.js.map
17
+ //# sourceMappingURL=chunk-B2WYIXWQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../lib/mergeGraphics.ts"],"sourcesContent":["import type { GraphicsObject } from \"./types\"\n\nexport const mergeGraphics = (\n graphics1: GraphicsObject,\n graphics2: GraphicsObject,\n): GraphicsObject => {\n return {\n ...graphics1,\n rects: [...(graphics1.rects ?? []), ...(graphics2.rects ?? [])],\n points: [...(graphics1.points ?? []), ...(graphics2.points ?? [])],\n lines: [...(graphics1.lines ?? []), ...(graphics2.lines ?? [])],\n circles: [...(graphics1.circles ?? []), ...(graphics2.circles ?? [])],\n arrows: [...(graphics1.arrows ?? []), ...(graphics2.arrows ?? [])],\n texts: [...(graphics1.texts ?? []), ...(graphics2.texts ?? [])],\n }\n}\n"],"mappings":";AAEO,IAAM,gBAAgB,CAC3B,WACA,cACmB;AACnB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,CAAC,GAAI,UAAU,SAAS,CAAC,GAAI,GAAI,UAAU,SAAS,CAAC,CAAE;AAAA,IAC9D,QAAQ,CAAC,GAAI,UAAU,UAAU,CAAC,GAAI,GAAI,UAAU,UAAU,CAAC,CAAE;AAAA,IACjE,OAAO,CAAC,GAAI,UAAU,SAAS,CAAC,GAAI,GAAI,UAAU,SAAS,CAAC,CAAE;AAAA,IAC9D,SAAS,CAAC,GAAI,UAAU,WAAW,CAAC,GAAI,GAAI,UAAU,WAAW,CAAC,CAAE;AAAA,IACpE,QAAQ,CAAC,GAAI,UAAU,UAAU,CAAC,GAAI,GAAI,UAAU,UAAU,CAAC,CAAE;AAAA,IACjE,OAAO,CAAC,GAAI,UAAU,SAAS,CAAC,GAAI,GAAI,UAAU,SAAS,CAAC,CAAE;AAAA,EAChE;AACF;","names":[]}
@@ -1,12 +1,12 @@
1
+ import {
2
+ mergeGraphics
3
+ } from "./chunk-B2WYIXWQ.js";
1
4
  import {
2
5
  translateGraphics
3
- } from "./chunk-K2IJQPPY.js";
6
+ } from "./chunk-WFPC5ZH3.js";
4
7
  import {
5
8
  getBounds
6
- } from "./chunk-ARYXS3GC.js";
7
- import {
8
- mergeGraphics
9
- } from "./chunk-TJJMMKHI.js";
9
+ } from "./chunk-ZV4UNKKF.js";
10
10
 
11
11
  // lib/stackGraphics.ts
12
12
  function stackGraphicsHorizontally(graphicsList, opts = {}) {
@@ -118,4 +118,4 @@ export {
118
118
  stackGraphicsVertically,
119
119
  createGraphicsGrid
120
120
  };
121
- //# sourceMappingURL=chunk-K5GFS6QZ.js.map
121
+ //# sourceMappingURL=chunk-TVUC4YPH.js.map
@@ -1,3 +1,7 @@
1
+ import {
2
+ getArrowBoundingBox,
3
+ getArrowGeometry
4
+ } from "./chunk-62J5EOWN.js";
1
5
  import {
2
6
  FONT_SIZE_HEIGHT_RATIO,
3
7
  FONT_SIZE_WIDTH_RATIO
@@ -37,6 +41,13 @@ function getBounds(graphics) {
37
41
  { x: circle.center.x, y: circle.center.y + circle.radius }
38
42
  // bottom
39
43
  ]),
44
+ ...(graphics.arrows || []).flatMap((arrow) => {
45
+ const bounds = getArrowBoundingBox(arrow);
46
+ return [
47
+ { x: bounds.minX, y: bounds.minY },
48
+ { x: bounds.maxX, y: bounds.maxY }
49
+ ];
50
+ }),
40
51
  ...(graphics.texts || []).flatMap((t) => {
41
52
  const fontSize = t.fontSize ?? 12;
42
53
  const width = t.text.length * fontSize * FONT_SIZE_WIDTH_RATIO;
@@ -295,6 +306,58 @@ function getSvgFromGraphicsObject(graphics, {
295
306
  }
296
307
  };
297
308
  }),
309
+ ...(graphics.arrows || []).map((arrow) => {
310
+ const geometry = getArrowGeometry(arrow);
311
+ const projectedShaftStart = projectPoint(geometry.shaftStart, matrix);
312
+ const projectedShaftEnd = projectPoint(geometry.shaftEnd, matrix);
313
+ const color = arrow.color || "black";
314
+ const headChildren = geometry.heads.map((head) => {
315
+ const projectedTip = projectPoint(head.tip, matrix);
316
+ const projectedLeftWing = projectPoint(head.leftWing, matrix);
317
+ const projectedRightWing = projectPoint(head.rightWing, matrix);
318
+ return {
319
+ name: "polygon",
320
+ type: "element",
321
+ attributes: {
322
+ "data-type": "arrow-head",
323
+ points: [
324
+ `${projectedTip.x},${projectedTip.y}`,
325
+ `${projectedLeftWing.x},${projectedLeftWing.y}`,
326
+ `${projectedRightWing.x},${projectedRightWing.y}`
327
+ ].join(" "),
328
+ fill: color
329
+ }
330
+ };
331
+ });
332
+ const children = [
333
+ {
334
+ name: "line",
335
+ type: "element",
336
+ attributes: {
337
+ "data-type": "arrow-shaft",
338
+ x1: projectedShaftStart.x.toString(),
339
+ y1: projectedShaftStart.y.toString(),
340
+ x2: projectedShaftEnd.x.toString(),
341
+ y2: projectedShaftEnd.y.toString(),
342
+ stroke: color,
343
+ "stroke-width": geometry.shaftWidth.toString(),
344
+ "stroke-linecap": "round"
345
+ }
346
+ },
347
+ ...headChildren
348
+ ];
349
+ return {
350
+ name: "g",
351
+ type: "element",
352
+ attributes: {
353
+ "data-type": "arrow",
354
+ "data-start": `${arrow.start.x},${arrow.start.y}`,
355
+ "data-end": `${arrow.end.x},${arrow.end.y}`,
356
+ "data-double-sided": arrow.doubleSided ? "true" : "false"
357
+ },
358
+ children
359
+ };
360
+ }),
298
361
  // Texts
299
362
  ...(graphics.texts || []).map((txt) => {
300
363
  const projected = projectPoint({ x: txt.x, y: txt.y }, matrix);
@@ -446,4 +509,4 @@ function getSvgFromGraphicsObject(graphics, {
446
509
  export {
447
510
  getSvgFromGraphicsObject
448
511
  };
449
- //# sourceMappingURL=chunk-4LFM7XSX.js.map
512
+ //# sourceMappingURL=chunk-UD7LT2L3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../lib/getSvgFromGraphicsObject.ts"],"sourcesContent":["import {\n transform,\n compose,\n translate,\n scale,\n applyToPoint,\n identity,\n type Matrix,\n} from \"transformation-matrix\"\nimport type { GraphicsObject, Point } from \"./types\"\nimport { stringify } from \"svgson\"\nimport { FONT_SIZE_WIDTH_RATIO, FONT_SIZE_HEIGHT_RATIO } from \"./constants\"\nimport { getArrowBoundingBox, getArrowGeometry } from \"./arrowHelpers\"\n\nconst DEFAULT_SVG_SIZE = 640\nconst PADDING = 40\n\ninterface Bounds {\n minX: number\n maxX: number\n minY: number\n maxY: number\n}\n\nfunction getBounds(graphics: GraphicsObject): Bounds {\n const points: Point[] = [\n ...(graphics.points || []),\n ...(graphics.lines || []).flatMap((line) => line.points),\n ...(graphics.rects || []).flatMap((rect) => {\n const halfWidth = rect.width / 2\n const halfHeight = rect.height / 2\n return [\n { x: rect.center.x - halfWidth, y: rect.center.y - halfHeight },\n { x: rect.center.x + halfWidth, y: rect.center.y - halfHeight },\n { x: rect.center.x - halfWidth, y: rect.center.y + halfHeight },\n { x: rect.center.x + halfWidth, y: rect.center.y + halfHeight },\n ]\n }),\n ...(graphics.circles || []).flatMap((circle) => [\n { x: circle.center.x - circle.radius, y: circle.center.y }, // left\n { x: circle.center.x + circle.radius, y: circle.center.y }, // right\n { x: circle.center.x, y: circle.center.y - circle.radius }, // top\n { x: circle.center.x, y: circle.center.y + circle.radius }, // bottom\n ]),\n ...(graphics.arrows || []).flatMap((arrow) => {\n const bounds = getArrowBoundingBox(arrow)\n return [\n { x: bounds.minX, y: bounds.minY },\n { x: bounds.maxX, y: bounds.maxY },\n ]\n }),\n ...(graphics.texts || []).flatMap((t) => {\n const fontSize = t.fontSize ?? 12\n const width = t.text.length * fontSize * FONT_SIZE_WIDTH_RATIO\n const height = fontSize * FONT_SIZE_HEIGHT_RATIO\n const anchor = t.anchorSide ?? \"center\"\n const offsetMap: Record<string, { dx: number; dy: number }> = {\n top_left: { dx: 0, dy: 0 },\n top_center: { dx: -width / 2, dy: 0 },\n top_right: { dx: -width, dy: 0 },\n center_left: { dx: 0, dy: -height / 2 },\n center: { dx: -width / 2, dy: -height / 2 },\n center_right: { dx: -width, dy: -height / 2 },\n bottom_left: { dx: 0, dy: -height },\n bottom_center: { dx: -width / 2, dy: -height },\n bottom_right: { dx: -width, dy: -height },\n }\n const { dx, dy } = offsetMap[anchor]\n const x0 = t.x + dx\n const y0 = t.y + dy\n return [\n { x: x0, y: y0 },\n { x: x0 + width, y: y0 + height },\n ]\n }),\n ]\n\n if (points.length === 0) {\n return { minX: -1, maxX: 1, minY: -1, maxY: 1 }\n }\n\n return points.reduce(\n (bounds, point) => ({\n minX: Math.min(bounds.minX, point.x),\n maxX: Math.max(bounds.maxX, point.x),\n minY: Math.min(bounds.minY, point.y),\n maxY: Math.max(bounds.maxY, point.y),\n }),\n { minX: Infinity, maxX: -Infinity, minY: Infinity, maxY: -Infinity },\n )\n}\n\nfunction getProjectionMatrix(\n bounds: Bounds,\n coordinateSystem: GraphicsObject[\"coordinateSystem\"],\n svgWidth: number,\n svgHeight: number,\n) {\n const width = bounds.maxX - bounds.minX || 1\n const height = bounds.maxY - bounds.minY || 1\n\n const scale_factor = Math.min(\n (svgWidth - 2 * PADDING) / width,\n (svgHeight - 2 * PADDING) / height,\n )\n\n const yFlip = coordinateSystem === \"screen\" ? 1 : -1\n\n return compose(\n translate(svgWidth / 2, svgHeight / 2),\n scale(scale_factor, yFlip * scale_factor),\n translate(-(bounds.minX + width / 2), -(bounds.minY + height / 2)),\n )\n}\n\nfunction projectPoint(point: Point, matrix: Matrix) {\n const projected = applyToPoint(matrix, { x: point.x, y: point.y })\n return { ...point, ...projected }\n}\n\nexport function getSvgFromGraphicsObject(\n graphics: GraphicsObject,\n {\n includeTextLabels = false,\n backgroundColor,\n svgWidth = DEFAULT_SVG_SIZE,\n svgHeight = DEFAULT_SVG_SIZE,\n }: {\n includeTextLabels?: boolean | Array<\"points\" | \"lines\" | \"rects\">\n backgroundColor?: string\n svgWidth?: number\n svgHeight?: number\n } = {},\n): string {\n const bounds = getBounds(graphics)\n const matrix = getProjectionMatrix(\n bounds,\n graphics.coordinateSystem,\n svgWidth,\n svgHeight,\n )\n\n const shouldRenderLabel = (\n type: \"points\" | \"lines\" | \"rects\",\n ): boolean => {\n if (typeof includeTextLabels === \"boolean\") {\n return includeTextLabels\n }\n if (Array.isArray(includeTextLabels)) {\n return includeTextLabels.includes(type)\n }\n return false\n }\n\n const svgObject = {\n name: \"svg\",\n type: \"element\",\n attributes: {\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n viewBox: `0 0 ${svgWidth} ${svgHeight}`,\n xmlns: \"http://www.w3.org/2000/svg\",\n },\n children: [\n // Background rectangle (optional)\n ...(backgroundColor\n ? [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n width: \"100%\",\n height: \"100%\",\n fill: backgroundColor,\n },\n },\n ]\n : []),\n // Points\n ...(graphics.points || []).map((point) => {\n const projected = projectPoint(point, matrix)\n return {\n name: \"g\",\n type: \"element\",\n attributes: {},\n children: [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n \"data-type\": \"point\",\n \"data-label\": point.label || \"\",\n \"data-x\": point.x.toString(),\n \"data-y\": point.y.toString(),\n cx: projected.x.toString(),\n cy: projected.y.toString(),\n r: \"3\",\n fill: point.color || \"black\",\n },\n },\n ...(shouldRenderLabel(\"points\") && point.label\n ? [\n {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: (projected.x + 5).toString(),\n y: (projected.y - 5).toString(),\n \"font-family\": \"sans-serif\",\n \"font-size\": \"12\",\n },\n children: [{ type: \"text\", value: point.label }],\n },\n ]\n : []),\n ],\n }\n }),\n // Lines\n ...(graphics.lines || []).map((line) => {\n const projectedPoints = line.points.map((p) => projectPoint(p, matrix))\n return {\n name: \"g\",\n type: \"element\",\n attributes: {},\n children: [\n {\n name: \"polyline\",\n type: \"element\",\n attributes: {\n \"data-points\": line.points\n .map((p) => `${p.x},${p.y}`)\n .join(\" \"),\n \"data-type\": \"line\",\n \"data-label\": line.label || \"\",\n points: projectedPoints.map((p) => `${p.x},${p.y}`).join(\" \"),\n fill: \"none\",\n stroke: line.strokeColor || \"black\",\n \"stroke-width\": (line.strokeWidth ?? 1).toString(),\n ...(line.strokeDash && {\n \"stroke-dasharray\": Array.isArray(line.strokeDash)\n ? line.strokeDash.join(\" \")\n : line.strokeDash,\n }),\n },\n },\n ...(shouldRenderLabel(\"lines\") &&\n line.label &&\n projectedPoints.length > 0\n ? [\n {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: (projectedPoints[0].x + 5).toString(),\n y: (projectedPoints[0].y - 5).toString(),\n \"font-family\": \"sans-serif\",\n \"font-size\": \"12\",\n fill: line.strokeColor || \"black\",\n },\n children: [{ type: \"text\", value: line.label }],\n },\n ]\n : []),\n ],\n }\n }),\n // Rectangles\n ...(graphics.rects || []).map((rect) => {\n const corner1 = {\n x: rect.center.x - rect.width / 2,\n y: rect.center.y - rect.height / 2,\n }\n const projectedCorner1 = projectPoint(corner1, matrix)\n const corner2 = {\n x: rect.center.x + rect.width / 2,\n y: rect.center.y + rect.height / 2,\n }\n const projectedCorner2 = projectPoint(corner2, matrix)\n const scaledWidth = Math.abs(projectedCorner2.x - projectedCorner1.x)\n const scaledHeight = Math.abs(projectedCorner2.y - projectedCorner1.y)\n const rectX = Math.min(projectedCorner1.x, projectedCorner2.x)\n const rectY = Math.min(projectedCorner1.y, projectedCorner2.y)\n\n return {\n name: \"g\",\n type: \"element\",\n attributes: {},\n children: [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n \"data-type\": \"rect\",\n \"data-label\": rect.label || \"\",\n \"data-x\": rect.center.x.toString(),\n \"data-y\": rect.center.y.toString(),\n x: rectX.toString(),\n y: rectY.toString(),\n width: scaledWidth.toString(),\n height: scaledHeight.toString(),\n fill: rect.fill || \"none\",\n stroke: rect.stroke || \"black\",\n \"stroke-width\": Math.abs(1 / matrix.a).toString(), // Consider scaling stroke width like lines if needed\n },\n },\n ...(shouldRenderLabel(\"rects\") && rect.label\n ? [\n {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: (rectX + 5).toString(),\n y: rectY.toString(),\n \"font-family\": \"sans-serif\",\n \"dominant-baseline\": \"text-before-edge\",\n \"font-size\": (\n ((scaledWidth + scaledHeight) / 2) *\n 0.06\n ).toString(),\n fill: rect.stroke || \"black\", // Default to stroke color for label\n },\n children: [{ type: \"text\", value: rect.label }],\n },\n ]\n : []),\n ],\n }\n }),\n // Circles\n ...(graphics.circles || []).map((circle) => {\n const projected = projectPoint(circle.center, matrix)\n const scaledRadius = circle.radius * Math.abs(matrix.a)\n return {\n name: \"circle\",\n type: \"element\",\n attributes: {\n \"data-type\": \"circle\",\n \"data-label\": \"\",\n \"data-x\": circle.center.x.toString(),\n \"data-y\": circle.center.y.toString(),\n cx: projected.x.toString(),\n cy: projected.y.toString(),\n r: scaledRadius.toString(),\n fill: circle.fill || \"none\",\n stroke: circle.stroke || \"black\",\n \"stroke-width\": Math.abs(1 / matrix.a).toString(),\n },\n }\n }),\n ...(graphics.arrows || []).map((arrow) => {\n const geometry = getArrowGeometry(arrow)\n const projectedShaftStart = projectPoint(geometry.shaftStart, matrix)\n const projectedShaftEnd = projectPoint(geometry.shaftEnd, matrix)\n\n const color = arrow.color || \"black\"\n\n const headChildren = geometry.heads.map((head) => {\n const projectedTip = projectPoint(head.tip, matrix)\n const projectedLeftWing = projectPoint(head.leftWing, matrix)\n const projectedRightWing = projectPoint(head.rightWing, matrix)\n\n return {\n name: \"polygon\",\n type: \"element\",\n attributes: {\n \"data-type\": \"arrow-head\",\n points: [\n `${projectedTip.x},${projectedTip.y}`,\n `${projectedLeftWing.x},${projectedLeftWing.y}`,\n `${projectedRightWing.x},${projectedRightWing.y}`,\n ].join(\" \"),\n fill: color,\n },\n }\n })\n\n const children = [\n {\n name: \"line\",\n type: \"element\",\n attributes: {\n \"data-type\": \"arrow-shaft\",\n x1: projectedShaftStart.x.toString(),\n y1: projectedShaftStart.y.toString(),\n x2: projectedShaftEnd.x.toString(),\n y2: projectedShaftEnd.y.toString(),\n stroke: color,\n \"stroke-width\": geometry.shaftWidth.toString(),\n \"stroke-linecap\": \"round\",\n },\n },\n ...headChildren,\n ]\n\n return {\n name: \"g\",\n type: \"element\",\n attributes: {\n \"data-type\": \"arrow\",\n \"data-start\": `${arrow.start.x},${arrow.start.y}`,\n \"data-end\": `${arrow.end.x},${arrow.end.y}`,\n \"data-double-sided\": arrow.doubleSided ? \"true\" : \"false\",\n },\n children,\n }\n }),\n // Texts\n ...(graphics.texts || []).map((txt) => {\n const projected = projectPoint({ x: txt.x, y: txt.y }, matrix)\n const anchor = txt.anchorSide ?? \"center\"\n const alignMap: Record<string, string> = {\n top_left: \"start\",\n center_left: \"start\",\n bottom_left: \"start\",\n top_center: \"middle\",\n center: \"middle\",\n bottom_center: \"middle\",\n top_right: \"end\",\n center_right: \"end\",\n bottom_right: \"end\",\n }\n const baselineMap: Record<string, string> = {\n top_left: \"text-before-edge\",\n top_center: \"text-before-edge\",\n top_right: \"text-before-edge\",\n center_left: \"central\",\n center: \"central\",\n center_right: \"central\",\n bottom_left: \"text-after-edge\",\n bottom_center: \"text-after-edge\",\n bottom_right: \"text-after-edge\",\n }\n return {\n name: \"text\",\n type: \"element\",\n attributes: {\n \"data-type\": \"text\",\n \"data-label\": txt.text,\n \"data-x\": txt.x.toString(),\n \"data-y\": txt.y.toString(),\n x: projected.x.toString(),\n y: projected.y.toString(),\n fill: txt.color || \"black\",\n \"font-size\": ((txt.fontSize ?? 12) * Math.abs(matrix.a)).toString(),\n \"font-family\": \"sans-serif\",\n \"text-anchor\": alignMap[anchor],\n \"dominant-baseline\": baselineMap[anchor],\n },\n children: [{ type: \"text\", value: txt.text }],\n }\n }),\n // Crosshair lines and coordinates (initially hidden)\n {\n name: \"g\",\n type: \"element\",\n attributes: {\n id: \"crosshair\",\n style: \"display: none\",\n },\n children: [\n {\n name: \"line\",\n type: \"element\",\n attributes: {\n id: \"crosshair-h\",\n y1: \"0\",\n y2: svgHeight.toString(),\n stroke: \"#666\",\n \"stroke-width\": \"0.5\",\n },\n },\n {\n name: \"line\",\n type: \"element\",\n attributes: {\n id: \"crosshair-v\",\n x1: \"0\",\n x2: svgWidth.toString(),\n stroke: \"#666\",\n \"stroke-width\": \"0.5\",\n },\n },\n {\n name: \"text\",\n type: \"element\",\n attributes: {\n id: \"coordinates\",\n \"font-family\": \"monospace\",\n \"font-size\": \"12\",\n fill: \"#666\",\n },\n children: [{ type: \"text\", value: \"\" }],\n },\n ],\n },\n // Mouse tracking script\n {\n name: \"script\",\n type: \"element\",\n children: [\n {\n type: \"text\",\n value: `\n document.currentScript.parentElement.addEventListener('mousemove', (e) => {\n const svg = e.currentTarget;\n const rect = svg.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n const crosshair = svg.getElementById('crosshair');\n const h = svg.getElementById('crosshair-h');\n const v = svg.getElementById('crosshair-v');\n const coords = svg.getElementById('coordinates');\n \n crosshair.style.display = 'block';\n h.setAttribute('x1', '0');\n h.setAttribute('x2', '${svgWidth}');\n h.setAttribute('y1', y);\n h.setAttribute('y2', y);\n v.setAttribute('x1', x);\n v.setAttribute('x2', x);\n v.setAttribute('y1', '0');\n v.setAttribute('y2', '${svgHeight}');\n\n // Calculate real coordinates using inverse transformation\n const matrix = ${JSON.stringify(matrix)};\n // Manually invert and apply the affine transform\n // Since we only use translate and scale, we can directly compute:\n // x' = (x - tx) / sx\n // y' = (y - ty) / sy\n const sx = matrix.a;\n const sy = matrix.d;\n const tx = matrix.e; \n const ty = matrix.f;\n const realPoint = {\n x: (x - tx) / sx,\n y: (y - ty) / sy // Flip y back since we used negative scale\n }\n \n coords.textContent = \\`(\\${realPoint.x.toFixed(2)}, \\${realPoint.y.toFixed(2)})\\`;\n coords.setAttribute('x', (x + 5).toString());\n coords.setAttribute('y', (y - 5).toString());\n });\n document.currentScript.parentElement.addEventListener('mouseleave', () => {\n document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';\n });\n `,\n },\n ],\n },\n ],\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n return stringify(svgObject as any)\n}\n"],"mappings":"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","names":[]}
@@ -19,6 +19,11 @@ function translateGraphics(graphics, dx, dy) {
19
19
  ...circle,
20
20
  center: { x: circle.center.x + dx, y: circle.center.y + dy }
21
21
  })),
22
+ arrows: graphics.arrows?.map((arrow) => ({
23
+ ...arrow,
24
+ start: { x: arrow.start.x + dx, y: arrow.start.y + dy },
25
+ end: { x: arrow.end.x + dx, y: arrow.end.y + dy }
26
+ })),
22
27
  texts: graphics.texts?.map((text) => ({
23
28
  ...text,
24
29
  x: text.x + dx,
@@ -30,4 +35,4 @@ function translateGraphics(graphics, dx, dy) {
30
35
  export {
31
36
  translateGraphics
32
37
  };
33
- //# sourceMappingURL=chunk-K2IJQPPY.js.map
38
+ //# sourceMappingURL=chunk-WFPC5ZH3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../lib/translateGraphics.ts"],"sourcesContent":["import type { GraphicsObject } from \"./types\"\n\nexport function translateGraphics(\n graphics: GraphicsObject,\n dx: number,\n dy: number,\n): GraphicsObject {\n return {\n ...graphics,\n points: graphics.points?.map((p) => ({\n ...p,\n x: p.x + dx,\n y: p.y + dy,\n })),\n lines: graphics.lines?.map((line) => ({\n ...line,\n points: line.points.map((pt) => ({ x: pt.x + dx, y: pt.y + dy })),\n })),\n rects: graphics.rects?.map((rect) => ({\n ...rect,\n center: { x: rect.center.x + dx, y: rect.center.y + dy },\n })),\n circles: graphics.circles?.map((circle) => ({\n ...circle,\n center: { x: circle.center.x + dx, y: circle.center.y + dy },\n })),\n arrows: graphics.arrows?.map((arrow) => ({\n ...arrow,\n start: { x: arrow.start.x + dx, y: arrow.start.y + dy },\n end: { x: arrow.end.x + dx, y: arrow.end.y + dy },\n })),\n texts: graphics.texts?.map((text) => ({\n ...text,\n x: text.x + dx,\n y: text.y + dy,\n })),\n }\n}\n"],"mappings":";AAEO,SAAS,kBACd,UACA,IACA,IACgB;AAChB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,SAAS,QAAQ,IAAI,CAAC,OAAO;AAAA,MACnC,GAAG;AAAA,MACH,GAAG,EAAE,IAAI;AAAA,MACT,GAAG,EAAE,IAAI;AAAA,IACX,EAAE;AAAA,IACF,OAAO,SAAS,OAAO,IAAI,CAAC,UAAU;AAAA,MACpC,GAAG;AAAA,MACH,QAAQ,KAAK,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE;AAAA,IAClE,EAAE;AAAA,IACF,OAAO,SAAS,OAAO,IAAI,CAAC,UAAU;AAAA,MACpC,GAAG;AAAA,MACH,QAAQ,EAAE,GAAG,KAAK,OAAO,IAAI,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG;AAAA,IACzD,EAAE;AAAA,IACF,SAAS,SAAS,SAAS,IAAI,CAAC,YAAY;AAAA,MAC1C,GAAG;AAAA,MACH,QAAQ,EAAE,GAAG,OAAO,OAAO,IAAI,IAAI,GAAG,OAAO,OAAO,IAAI,GAAG;AAAA,IAC7D,EAAE;AAAA,IACF,QAAQ,SAAS,QAAQ,IAAI,CAAC,WAAW;AAAA,MACvC,GAAG;AAAA,MACH,OAAO,EAAE,GAAG,MAAM,MAAM,IAAI,IAAI,GAAG,MAAM,MAAM,IAAI,GAAG;AAAA,MACtD,KAAK,EAAE,GAAG,MAAM,IAAI,IAAI,IAAI,GAAG,MAAM,IAAI,IAAI,GAAG;AAAA,IAClD,EAAE;AAAA,IACF,OAAO,SAAS,OAAO,IAAI,CAAC,UAAU;AAAA,MACpC,GAAG;AAAA,MACH,GAAG,KAAK,IAAI;AAAA,MACZ,GAAG,KAAK,IAAI;AAAA,IACd,EAAE;AAAA,EACJ;AACF;","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-NG6H63SM.js";
4
4
  import {
5
5
  getSvgFromGraphicsObject
6
- } from "./chunk-4LFM7XSX.js";
6
+ } from "./chunk-UD7LT2L3.js";
7
7
 
8
8
  // lib/index.ts
9
9
  function getSvgFromLogString(logString) {
@@ -53,4 +53,4 @@ export {
53
53
  getHtmlFromLogString,
54
54
  getSvgsFromLogString
55
55
  };
56
- //# sourceMappingURL=chunk-YWTEDOCO.js.map
56
+ //# sourceMappingURL=chunk-XGME63R3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../lib/index.ts"],"sourcesContent":["import { getGraphicsObjectsFromLogString } from \"./getGraphicsObjectsFromLogString\"\nimport { getSvgFromGraphicsObject } from \"./getSvgFromGraphicsObject\"\nimport {\n drawGraphicsToCanvas,\n computeTransformFromViewbox,\n getBounds,\n} from \"./drawGraphicsToCanvas\"\nimport { translateGraphics } from \"./translateGraphics\"\nimport { mergeGraphics } from \"./mergeGraphics\"\nimport {\n stackGraphicsHorizontally,\n stackGraphicsVertically,\n createGraphicsGrid,\n} from \"./stackGraphics\"\n\nexport type {\n Point,\n Line,\n Rect,\n Circle,\n Arrow,\n Text,\n NinePointAnchor,\n GraphicsObject,\n Viewbox,\n CenterViewbox,\n TransformOptions,\n} from \"./types\"\nexport { getGraphicsObjectsFromLogString } from \"./getGraphicsObjectsFromLogString\"\nexport { getSvgFromGraphicsObject } from \"./getSvgFromGraphicsObject\"\nexport {\n drawGraphicsToCanvas,\n computeTransformFromViewbox,\n getBounds,\n} from \"./drawGraphicsToCanvas\"\nexport { translateGraphics } from \"./translateGraphics\"\nexport { mergeGraphics } from \"./mergeGraphics\"\nexport {\n stackGraphicsHorizontally,\n stackGraphicsVertically,\n createGraphicsGrid,\n} from \"./stackGraphics\"\nexport { FONT_SIZE_WIDTH_RATIO, FONT_SIZE_HEIGHT_RATIO } from \"./constants\"\n\nexport function getSvgFromLogString(logString: string): string {\n const objects = getGraphicsObjectsFromLogString(logString)\n if (objects.length === 0) return \"\"\n return getSvgFromGraphicsObject(objects[0])\n}\n\nexport function getHtmlFromLogString(logString: string): string {\n const svgs = getSvgsFromLogString(logString)\n if (svgs.length === 0) return \"\"\n\n const sections = svgs\n .map(\n ({ title, svg }) => `\n <section>\n <h2>${title}</h2>\n ${svg}\n </section>\n `,\n )\n .join(\"\\n\")\n\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Graphics Debug Output</title>\n <style>\n body { font-family: system-ui; max-width: 1200px; margin: 0 auto; padding: 20px; }\n h1 { color: #333; }\n section { margin: 40px 0; }\n svg { max-width: 100%; height: auto; border: 1px solid #eee; }\n </style>\n</head>\n<body>\n <h1>Graphics Debug Output</h1>\n ${sections}\n</body>\n</html>`\n}\n\nexport function getSvgsFromLogString(\n logString: string,\n): Array<{ title: string; svg: string }> {\n const objects = getGraphicsObjectsFromLogString(logString)\n return objects.map((obj) => ({\n title: obj.title || \"Untitled Graphic\",\n svg: getSvgFromGraphicsObject(obj),\n }))\n}\n"],"mappings":";;;;;;;;AA4CO,SAAS,oBAAoB,WAA2B;AAC7D,QAAM,UAAU,gCAAgC,SAAS;AACzD,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SAAO,yBAAyB,QAAQ,CAAC,CAAC;AAC5C;AAEO,SAAS,qBAAqB,WAA2B;AAC9D,QAAM,OAAO,qBAAqB,SAAS;AAC3C,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QAAM,WAAW,KACd;AAAA,IACC,CAAC,EAAE,OAAO,IAAI,MAAM;AAAA;AAAA,YAEd,KAAK;AAAA,QACT,GAAG;AAAA;AAAA;AAAA,EAGP,EACC,KAAK,IAAI;AAEZ,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAcL,QAAQ;AAAA;AAAA;AAGZ;AAEO,SAAS,qBACd,WACuC;AACvC,QAAM,UAAU,gCAAgC,SAAS;AACzD,SAAO,QAAQ,IAAI,CAAC,SAAS;AAAA,IAC3B,OAAO,IAAI,SAAS;AAAA,IACpB,KAAK,yBAAyB,GAAG;AAAA,EACnC,EAAE;AACJ;","names":[]}
@@ -1,3 +1,7 @@
1
+ import {
2
+ getArrowBoundingBox,
3
+ getArrowGeometry
4
+ } from "./chunk-62J5EOWN.js";
1
5
  import {
2
6
  FONT_SIZE_HEIGHT_RATIO,
3
7
  FONT_SIZE_WIDTH_RATIO
@@ -104,6 +108,13 @@ function getBounds(graphics) {
104
108
  { x: circle.center.x, y: circle.center.y + circle.radius }
105
109
  // bottom
106
110
  ]),
111
+ ...(graphics.arrows || []).flatMap((arrow) => {
112
+ const bounds = getArrowBoundingBox(arrow);
113
+ return [
114
+ { x: bounds.minX, y: bounds.minY },
115
+ { x: bounds.maxX, y: bounds.maxY }
116
+ ];
117
+ }),
107
118
  ...(graphics.texts || []).flatMap((text) => {
108
119
  const fontSize = text.fontSize ?? 12;
109
120
  const width = text.text.length * fontSize * FONT_SIZE_WIDTH_RATIO;
@@ -219,6 +230,35 @@ function drawGraphicsToCanvas(graphics, target, options = {}) {
219
230
  }
220
231
  });
221
232
  }
233
+ if (graphics.arrows && graphics.arrows.length > 0) {
234
+ graphics.arrows.forEach((arrow, arrowIndex) => {
235
+ const geometry = getArrowGeometry(arrow);
236
+ const shaftStart = applyToPoint(matrix, geometry.shaftStart);
237
+ const shaftEnd = applyToPoint(matrix, geometry.shaftEnd);
238
+ const color = arrow.color || defaultColors[arrowIndex % defaultColors.length];
239
+ const scaleFactor = Math.hypot(matrix.a, matrix.b);
240
+ ctx.strokeStyle = color;
241
+ ctx.fillStyle = color;
242
+ ctx.lineWidth = geometry.shaftWidth * (scaleFactor || 1);
243
+ ctx.lineCap = "round";
244
+ ctx.setLineDash([]);
245
+ ctx.beginPath();
246
+ ctx.moveTo(shaftStart.x, shaftStart.y);
247
+ ctx.lineTo(shaftEnd.x, shaftEnd.y);
248
+ ctx.stroke();
249
+ geometry.heads.forEach((head) => {
250
+ const tip = applyToPoint(matrix, head.tip);
251
+ const leftWing = applyToPoint(matrix, head.leftWing);
252
+ const rightWing = applyToPoint(matrix, head.rightWing);
253
+ ctx.beginPath();
254
+ ctx.moveTo(tip.x, tip.y);
255
+ ctx.lineTo(leftWing.x, leftWing.y);
256
+ ctx.lineTo(rightWing.x, rightWing.y);
257
+ ctx.closePath();
258
+ ctx.fill();
259
+ });
260
+ });
261
+ }
222
262
  if (graphics.lines && graphics.lines.length > 0) {
223
263
  graphics.lines.forEach((line, lineIndex) => {
224
264
  if (line.points.length === 0) return;
@@ -311,4 +351,4 @@ export {
311
351
  getBounds,
312
352
  drawGraphicsToCanvas
313
353
  };
314
- //# sourceMappingURL=chunk-ARYXS3GC.js.map
354
+ //# sourceMappingURL=chunk-ZV4UNKKF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../lib/drawGraphicsToCanvas.ts","../site/components/InteractiveGraphics/defaultColors.ts"],"sourcesContent":["import {\n compose,\n scale,\n translate,\n applyToPoint,\n type Matrix,\n} from \"transformation-matrix\"\nimport type {\n GraphicsObject,\n Viewbox,\n CenterViewbox,\n TransformOptions,\n} from \"./types\"\nimport { defaultColors } from \"site/components/InteractiveGraphics/defaultColors\"\nimport { FONT_SIZE_WIDTH_RATIO, FONT_SIZE_HEIGHT_RATIO } from \"./constants\"\nimport { getArrowBoundingBox, getArrowGeometry } from \"./arrowHelpers\"\n\n/**\n * Computes a transformation matrix based on a provided viewbox\n * Handles both min/max style viewboxes and center/width/height style viewboxes\n */\nexport function computeTransformFromViewbox(\n viewbox: Viewbox | CenterViewbox,\n canvasWidth: number,\n canvasHeight: number,\n options: { padding?: number; yFlip?: boolean } = {},\n): Matrix {\n const padding = options.padding ?? 40\n const yFlip = options.yFlip ?? false\n\n // Convert CenterViewbox to Viewbox if needed\n let bounds: Viewbox\n if (\"center\" in viewbox) {\n const halfWidth = viewbox.width / 2\n const halfHeight = viewbox.height / 2\n bounds = {\n minX: viewbox.center.x - halfWidth,\n maxX: viewbox.center.x + halfWidth,\n minY: viewbox.center.y - halfHeight,\n maxY: viewbox.center.y + halfHeight,\n }\n } else {\n bounds = viewbox\n }\n\n const width = bounds.maxX - bounds.minX || 1\n const height = bounds.maxY - bounds.minY || 1\n\n const scale_factor = Math.min(\n (canvasWidth - 2 * padding) / width,\n (canvasHeight - 2 * padding) / height,\n )\n\n return compose(\n translate(canvasWidth / 2, canvasHeight / 2),\n scale(scale_factor, yFlip ? -scale_factor : scale_factor),\n translate(-(bounds.minX + width / 2), -(bounds.minY + height / 2)),\n )\n}\n\n/**\n * Computes bounds for a graphics object\n */\nexport function getBounds(graphics: GraphicsObject): Viewbox {\n const points = [\n ...(graphics.points || []),\n ...(graphics.lines || []).flatMap((line) => line.points),\n ...(graphics.rects || []).flatMap((rect) => {\n const halfWidth = rect.width / 2\n const halfHeight = rect.height / 2\n return [\n { x: rect.center.x - halfWidth, y: rect.center.y - halfHeight },\n { x: rect.center.x + halfWidth, y: rect.center.y - halfHeight },\n { x: rect.center.x - halfWidth, y: rect.center.y + halfHeight },\n { x: rect.center.x + halfWidth, y: rect.center.y + halfHeight },\n ]\n }),\n ...(graphics.circles || []).flatMap((circle) => [\n { x: circle.center.x - circle.radius, y: circle.center.y }, // left\n { x: circle.center.x + circle.radius, y: circle.center.y }, // right\n { x: circle.center.x, y: circle.center.y - circle.radius }, // top\n { x: circle.center.x, y: circle.center.y + circle.radius }, // bottom\n ]),\n ...(graphics.arrows || []).flatMap((arrow) => {\n const bounds = getArrowBoundingBox(arrow)\n return [\n { x: bounds.minX, y: bounds.minY },\n { x: bounds.maxX, y: bounds.maxY },\n ]\n }),\n ...(graphics.texts || []).flatMap((text) => {\n const fontSize = text.fontSize ?? 12\n const width = text.text.length * fontSize * FONT_SIZE_WIDTH_RATIO\n const height = fontSize * FONT_SIZE_HEIGHT_RATIO\n const anchor = text.anchorSide ?? \"center\"\n const offsetMap: Record<string, { dx: number; dy: number }> = {\n top_left: { dx: 0, dy: 0 },\n top_center: { dx: -width / 2, dy: 0 },\n top_right: { dx: -width, dy: 0 },\n center_left: { dx: 0, dy: -height / 2 },\n center: { dx: -width / 2, dy: -height / 2 },\n center_right: { dx: -width, dy: -height / 2 },\n bottom_left: { dx: 0, dy: -height },\n bottom_center: { dx: -width / 2, dy: -height },\n bottom_right: { dx: -width, dy: -height },\n }\n const { dx, dy } = offsetMap[anchor]\n const x0 = text.x + dx\n const y0 = text.y + dy\n return [\n { x: x0, y: y0 },\n { x: x0 + width, y: y0 + height },\n ]\n }),\n ]\n\n if (points.length === 0) {\n return { minX: -1, maxX: 1, minY: -1, maxY: 1 }\n }\n\n return points.reduce(\n (bounds, point) => ({\n minX: Math.min(bounds.minX, point.x),\n maxX: Math.max(bounds.maxX, point.x),\n minY: Math.min(bounds.minY, point.y),\n maxY: Math.max(bounds.maxY, point.y),\n }),\n { minX: Infinity, maxX: -Infinity, minY: Infinity, maxY: -Infinity },\n )\n}\n\n/**\n * Draws a graphics object onto a canvas or context\n * @param graphics - The graphics object to draw\n * @param target - The canvas element or 2D context to draw on\n * @param options - Options for controlling the transform and rendering\n */\nexport function drawGraphicsToCanvas(\n graphics: GraphicsObject,\n target: HTMLCanvasElement | CanvasRenderingContext2D,\n options: TransformOptions = {},\n): void {\n // Get the context\n const ctx =\n target instanceof HTMLCanvasElement ? target.getContext(\"2d\") : target\n\n if (!ctx) {\n throw new Error(\"Could not get 2D context from canvas\")\n }\n\n // Get canvas dimensions\n const canvasWidth =\n target instanceof HTMLCanvasElement ? target.width : target.canvas.width\n\n const canvasHeight =\n target instanceof HTMLCanvasElement ? target.height : target.canvas.height\n\n // Get or compute the transform matrix\n let matrix: Matrix\n\n if (options.transform) {\n matrix = options.transform\n } else if (options.viewbox) {\n matrix = computeTransformFromViewbox(\n options.viewbox,\n canvasWidth,\n canvasHeight,\n {\n padding: options.padding,\n yFlip: options.yFlip,\n },\n )\n } else {\n // Auto-compute bounds and transform if not provided\n const bounds = getBounds(graphics)\n const yFlip = graphics.coordinateSystem === \"cartesian\"\n matrix = computeTransformFromViewbox(bounds, canvasWidth, canvasHeight, {\n padding: options.padding ?? 40,\n yFlip,\n })\n }\n\n // Clear the canvas\n ctx.clearRect(0, 0, canvasWidth, canvasHeight)\n\n // Save the current transform state\n ctx.save()\n\n // Draw the graphics elements\n // Draw rectangles\n if (graphics.rects && graphics.rects.length > 0) {\n graphics.rects.forEach((rect) => {\n const halfWidth = rect.width / 2\n const halfHeight = rect.height / 2\n\n const topLeft = applyToPoint(matrix, {\n x: rect.center.x - halfWidth,\n y: rect.center.y - halfHeight,\n })\n\n const bottomRight = applyToPoint(matrix, {\n x: rect.center.x + halfWidth,\n y: rect.center.y + halfHeight,\n })\n\n const width = Math.abs(bottomRight.x - topLeft.x)\n const height = Math.abs(bottomRight.y - topLeft.y)\n\n ctx.beginPath()\n ctx.rect(\n Math.min(topLeft.x, bottomRight.x),\n Math.min(topLeft.y, bottomRight.y),\n width,\n height,\n )\n\n if (rect.fill) {\n ctx.fillStyle = rect.fill\n ctx.fill()\n }\n\n if (rect.stroke) {\n ctx.strokeStyle = rect.stroke\n ctx.stroke()\n }\n })\n }\n\n // Draw circles\n if (graphics.circles && graphics.circles.length > 0) {\n graphics.circles.forEach((circle) => {\n const projected = applyToPoint(matrix, circle.center)\n const scaledRadius = circle.radius * Math.abs(matrix.a) // Use matrix scale factor\n\n ctx.beginPath()\n ctx.arc(projected.x, projected.y, scaledRadius, 0, 2 * Math.PI)\n\n if (circle.fill) {\n ctx.fillStyle = circle.fill\n ctx.fill()\n }\n\n if (circle.stroke) {\n ctx.strokeStyle = circle.stroke ?? \"transparent\"\n ctx.stroke()\n }\n })\n }\n\n if (graphics.arrows && graphics.arrows.length > 0) {\n graphics.arrows.forEach((arrow, arrowIndex) => {\n const geometry = getArrowGeometry(arrow)\n const shaftStart = applyToPoint(matrix, geometry.shaftStart)\n const shaftEnd = applyToPoint(matrix, geometry.shaftEnd)\n\n const color = arrow.color || defaultColors[arrowIndex % defaultColors.length]\n const scaleFactor = Math.hypot(matrix.a, matrix.b)\n\n ctx.strokeStyle = color\n ctx.fillStyle = color\n ctx.lineWidth = geometry.shaftWidth * (scaleFactor || 1)\n ctx.lineCap = \"round\"\n ctx.setLineDash([])\n\n ctx.beginPath()\n ctx.moveTo(shaftStart.x, shaftStart.y)\n ctx.lineTo(shaftEnd.x, shaftEnd.y)\n ctx.stroke()\n\n geometry.heads.forEach((head) => {\n const tip = applyToPoint(matrix, head.tip)\n const leftWing = applyToPoint(matrix, head.leftWing)\n const rightWing = applyToPoint(matrix, head.rightWing)\n\n ctx.beginPath()\n ctx.moveTo(tip.x, tip.y)\n ctx.lineTo(leftWing.x, leftWing.y)\n ctx.lineTo(rightWing.x, rightWing.y)\n ctx.closePath()\n ctx.fill()\n })\n })\n }\n\n // Draw lines\n if (graphics.lines && graphics.lines.length > 0) {\n graphics.lines.forEach((line, lineIndex) => {\n if (line.points.length === 0) return\n\n ctx.beginPath()\n\n const firstPoint = applyToPoint(matrix, line.points[0])\n ctx.moveTo(firstPoint.x, firstPoint.y)\n\n for (let i = 1; i < line.points.length; i++) {\n const projected = applyToPoint(matrix, line.points[i])\n ctx.lineTo(projected.x, projected.y)\n }\n\n ctx.strokeStyle =\n line.strokeColor || defaultColors[lineIndex % defaultColors.length]\n if (line.strokeWidth) {\n ctx.lineWidth = line.strokeWidth * matrix.a\n } else {\n ctx.lineWidth = 2\n }\n ctx.lineCap = \"round\"\n\n if (line.strokeDash) {\n if (typeof line.strokeDash === \"string\") {\n // Convert string to array of numbers, handling single values properly\n let dashArray: number[]\n\n // If the string contains commas, split and convert to numbers\n if (line.strokeDash.includes(\",\")) {\n dashArray = line.strokeDash\n .split(\",\")\n .map((s) => parseFloat(s.trim()))\n .filter((n) => !Number.isNaN(n))\n } else {\n // Handle single value case\n const value = parseFloat(line.strokeDash.trim())\n dashArray = !Number.isNaN(value) ? [value] : []\n }\n\n // Scale dash values based on transform matrix\n ctx.setLineDash(dashArray)\n } else {\n // Handle array format\n ctx.setLineDash(line.strokeDash.map((n) => n * Math.abs(matrix.a)))\n }\n } else {\n ctx.setLineDash([])\n }\n\n ctx.stroke()\n })\n }\n\n // Draw points\n if (graphics.points && graphics.points.length > 0) {\n graphics.points.forEach((point, pointIndex) => {\n const projected = applyToPoint(matrix, point)\n\n // Draw point as a small circle\n ctx.beginPath()\n ctx.arc(projected.x, projected.y, 3, 0, 2 * Math.PI)\n ctx.fillStyle =\n point.color || defaultColors[pointIndex % defaultColors.length]\n ctx.fill()\n\n // Draw label if present and labels aren't disabled\n if (point.label && !options.disableLabels) {\n ctx.fillStyle = point.color || \"black\"\n ctx.font = \"12px sans-serif\"\n ctx.fillText(point.label, projected.x + 5, projected.y - 5)\n }\n })\n }\n\n // Draw texts\n if (graphics.texts && graphics.texts.length > 0) {\n graphics.texts.forEach((text) => {\n const projected = applyToPoint(matrix, { x: text.x, y: text.y })\n ctx.fillStyle = text.color || \"black\"\n ctx.font = `${(text.fontSize ?? 12) * Math.abs(matrix.a)}px sans-serif`\n\n const anchor = text.anchorSide ?? \"center\"\n const alignMap: Record<string, CanvasTextAlign> = {\n top_left: \"left\",\n center_left: \"left\",\n bottom_left: \"left\",\n top_center: \"center\",\n center: \"center\",\n bottom_center: \"center\",\n top_right: \"right\",\n center_right: \"right\",\n bottom_right: \"right\",\n }\n const baselineMap: Record<string, CanvasTextBaseline> = {\n top_left: \"top\",\n top_center: \"top\",\n top_right: \"top\",\n center_left: \"middle\",\n center: \"middle\",\n center_right: \"middle\",\n bottom_left: \"bottom\",\n bottom_center: \"bottom\",\n bottom_right: \"bottom\",\n }\n ctx.textAlign = alignMap[anchor]\n ctx.textBaseline = baselineMap[anchor]\n\n ctx.fillText(text.text, projected.x, projected.y)\n })\n }\n\n // Restore the original transform\n ctx.restore()\n}\n","// These are default colors if no color is provided\n// colors are made based on the index of the item in the array\n\nexport const defaultColors = [\n \"rgba(239, 68, 68, 0.8)\", // red-300\n \"rgba(249, 115, 22, 0.8)\", // orange-300\n \"rgba(245, 158, 11, 0.8)\", // amber-300\n \"rgba(234, 179, 8, 0.8)\", // yellow-300\n \"rgba(132, 204, 22, 0.8)\", // lime-300\n \"rgba(34, 197, 94, 0.8)\", // green-300\n \"rgba(16, 185, 129, 0.8)\", // emerald-300\n \"rgba(20, 184, 166, 0.8)\", // teal-300\n \"rgba(6, 182, 212, 0.8)\", // cyan-300\n \"rgba(14, 165, 233, 0.8)\", // sky-300\n \"rgba(59, 130, 246, 0.8)\", // blue-300\n \"rgba(99, 102, 241, 0.8)\", // indigo-300\n \"rgba(139, 92, 246, 0.8)\", // violet-300\n \"rgba(168, 85, 247, 0.8)\", // purple-300\n \"rgba(217, 70, 239, 0.8)\", // fuchsia-300\n \"rgba(236, 72, 153, 0.8)\", // pink-300\n \"rgba(249, 168, 212, 0.8)\", // rose-300\n \"rgba(161, 161, 170, 0.8)\", // zinc-300\n]\n"],"mappings":"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","names":[]}
package/dist/cli/cli.js CHANGED
@@ -2,16 +2,17 @@
2
2
  import {
3
3
  getHtmlFromLogString,
4
4
  getSvgsFromLogString
5
- } from "../chunk-YWTEDOCO.js";
6
- import "../chunk-K5GFS6QZ.js";
7
- import "../chunk-K2IJQPPY.js";
8
- import "../chunk-ARYXS3GC.js";
5
+ } from "../chunk-XGME63R3.js";
6
+ import "../chunk-TVUC4YPH.js";
7
+ import "../chunk-B2WYIXWQ.js";
8
+ import "../chunk-WFPC5ZH3.js";
9
+ import "../chunk-ZV4UNKKF.js";
9
10
  import {
10
11
  getGraphicsObjectsFromLogString
11
12
  } from "../chunk-NG6H63SM.js";
12
- import "../chunk-4LFM7XSX.js";
13
+ import "../chunk-UD7LT2L3.js";
14
+ import "../chunk-62J5EOWN.js";
13
15
  import "../chunk-ZGI74PYD.js";
14
- import "../chunk-TJJMMKHI.js";
15
16
 
16
17
  // cli/cli.ts
17
18
  import { parseArgs } from "util";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../cli/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { parseArgs } from \"node:util\"\nimport { readFileSync } from \"node:fs\"\nimport { writeFileSync } from \"node:fs\"\nimport {\n getSvgsFromLogString,\n getHtmlFromLogString,\n getGraphicsObjectsFromLogString,\n} from \"../lib\"\n\nasync function getInput(): Promise<string> {\n // Check if there's data being piped in\n if (process.stdin.isTTY && process.stderr.isTTY) {\n console.error(\n \"Error: No input provided. Pipe in content with graphics objects.\",\n )\n process.exit(1)\n }\n\n const chunks = []\n\n // Read from stdin if available\n if (!process.stdin.isTTY) {\n for await (const chunk of process.stdin) {\n chunks.push(chunk)\n }\n }\n\n return chunks.join(\"\")\n}\n\nasync function main() {\n const { values } = parseArgs({\n options: {\n html: { type: \"boolean\" },\n url: { type: \"boolean\" },\n help: { type: \"boolean\" },\n },\n })\n\n if (values.help) {\n console.log(`\nUsage: graphics-debug [options]\n\nOptions:\n --html Output a single HTML file with all graphics\n --url Print a url to view the graphics in a browser\n --help Show this help message\n\nExamples:\n cat debug.log | graphics-debug\n echo '{ graphics: { points: [{x: 0, y: 0}] } }' | graphics-debug --html\n `)\n process.exit(0)\n }\n\n const input = await getInput()\n\n if (values.html) {\n const html = getHtmlFromLogString(input)\n writeFileSync(\"graphicsdebug.debug.html\", html)\n console.log('Wrote to \"graphicsdebug.debug.html\"')\n } else if (values.url) {\n const graphicsObjects = getGraphicsObjectsFromLogString(input)\n if (graphicsObjects.length === 0) {\n console.error(\"No graphics objects found in input\")\n process.exit(0)\n }\n\n const { url } = await fetch(\"https://gdstore.seve.workers.dev/store\", {\n method: \"POST\",\n body: JSON.stringify({\n graphicsObjects: getGraphicsObjectsFromLogString(input),\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }).then((res) => res.json())\n\n const token = url.split(\"/get/\").pop()\n\n console.log(`https://graphicsdebug.com/t/${token}`)\n } else {\n const svgs = getSvgsFromLogString(input)\n svgs.forEach((svg, i) => {\n const filename = `${svg.title.toLowerCase().replace(/\\s+/g, \"-\")}-${i + 1}.debug.svg`\n writeFileSync(filename, svg.svg)\n console.log(`Wrote to \"${filename}\"`)\n })\n }\n}\n\nmain().catch((err) => {\n console.error(\"Error:\", err)\n process.exit(1)\n})\n"],"mappings":";;;;;;;;;;;;;;;;AACA,SAAS,iBAAiB;AAE1B,SAAS,qBAAqB;AAO9B,eAAe,WAA4B;AAEzC,MAAI,QAAQ,MAAM,SAAS,QAAQ,OAAO,OAAO;AAC/C,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,CAAC;AAGhB,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,qBAAiB,SAAS,QAAQ,OAAO;AACvC,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,OAAO,KAAK,EAAE;AACvB;AAEA,eAAe,OAAO;AACpB,QAAM,EAAE,OAAO,IAAI,UAAU;AAAA,IAC3B,SAAS;AAAA,MACP,MAAM,EAAE,MAAM,UAAU;AAAA,MACxB,KAAK,EAAE,MAAM,UAAU;AAAA,MACvB,MAAM,EAAE,MAAM,UAAU;AAAA,IAC1B;AAAA,EACF,CAAC;AAED,MAAI,OAAO,MAAM;AACf,YAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWX;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,QAAQ,MAAM,SAAS;AAE7B,MAAI,OAAO,MAAM;AACf,UAAM,OAAO,qBAAqB,KAAK;AACvC,kBAAc,4BAA4B,IAAI;AAC9C,YAAQ,IAAI,qCAAqC;AAAA,EACnD,WAAW,OAAO,KAAK;AACrB,UAAM,kBAAkB,gCAAgC,KAAK;AAC7D,QAAI,gBAAgB,WAAW,GAAG;AAChC,cAAQ,MAAM,oCAAoC;AAClD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,EAAE,IAAI,IAAI,MAAM,MAAM,0CAA0C;AAAA,MACpE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB,iBAAiB,gCAAgC,KAAK;AAAA,MACxD,CAAC;AAAA,MACD,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,IACF,CAAC,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC;AAE3B,UAAM,QAAQ,IAAI,MAAM,OAAO,EAAE,IAAI;AAErC,YAAQ,IAAI,+BAA+B,KAAK,EAAE;AAAA,EACpD,OAAO;AACL,UAAM,OAAO,qBAAqB,KAAK;AACvC,SAAK,QAAQ,CAAC,KAAK,MAAM;AACvB,YAAM,WAAW,GAAG,IAAI,MAAM,YAAY,EAAE,QAAQ,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC;AACzE,oBAAc,UAAU,IAAI,GAAG;AAC/B,cAAQ,IAAI,aAAa,QAAQ,GAAG;AAAA,IACtC,CAAC;AAAA,EACH;AACF;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,UAAU,GAAG;AAC3B,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../cli/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { parseArgs } from \"node:util\"\nimport { readFileSync } from \"node:fs\"\nimport { writeFileSync } from \"node:fs\"\nimport {\n getSvgsFromLogString,\n getHtmlFromLogString,\n getGraphicsObjectsFromLogString,\n} from \"../lib\"\n\nasync function getInput(): Promise<string> {\n // Check if there's data being piped in\n if (process.stdin.isTTY && process.stderr.isTTY) {\n console.error(\n \"Error: No input provided. Pipe in content with graphics objects.\",\n )\n process.exit(1)\n }\n\n const chunks = []\n\n // Read from stdin if available\n if (!process.stdin.isTTY) {\n for await (const chunk of process.stdin) {\n chunks.push(chunk)\n }\n }\n\n return chunks.join(\"\")\n}\n\nasync function main() {\n const { values } = parseArgs({\n options: {\n html: { type: \"boolean\" },\n url: { type: \"boolean\" },\n help: { type: \"boolean\" },\n },\n })\n\n if (values.help) {\n console.log(`\nUsage: graphics-debug [options]\n\nOptions:\n --html Output a single HTML file with all graphics\n --url Print a url to view the graphics in a browser\n --help Show this help message\n\nExamples:\n cat debug.log | graphics-debug\n echo '{ graphics: { points: [{x: 0, y: 0}] } }' | graphics-debug --html\n `)\n process.exit(0)\n }\n\n const input = await getInput()\n\n if (values.html) {\n const html = getHtmlFromLogString(input)\n writeFileSync(\"graphicsdebug.debug.html\", html)\n console.log('Wrote to \"graphicsdebug.debug.html\"')\n } else if (values.url) {\n const graphicsObjects = getGraphicsObjectsFromLogString(input)\n if (graphicsObjects.length === 0) {\n console.error(\"No graphics objects found in input\")\n process.exit(0)\n }\n\n const { url } = await fetch(\"https://gdstore.seve.workers.dev/store\", {\n method: \"POST\",\n body: JSON.stringify({\n graphicsObjects: getGraphicsObjectsFromLogString(input),\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }).then((res) => res.json())\n\n const token = url.split(\"/get/\").pop()\n\n console.log(`https://graphicsdebug.com/t/${token}`)\n } else {\n const svgs = getSvgsFromLogString(input)\n svgs.forEach((svg, i) => {\n const filename = `${svg.title.toLowerCase().replace(/\\s+/g, \"-\")}-${i + 1}.debug.svg`\n writeFileSync(filename, svg.svg)\n console.log(`Wrote to \"${filename}\"`)\n })\n }\n}\n\nmain().catch((err) => {\n console.error(\"Error:\", err)\n process.exit(1)\n})\n"],"mappings":";;;;;;;;;;;;;;;;;AACA,SAAS,iBAAiB;AAE1B,SAAS,qBAAqB;AAO9B,eAAe,WAA4B;AAEzC,MAAI,QAAQ,MAAM,SAAS,QAAQ,OAAO,OAAO;AAC/C,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,CAAC;AAGhB,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,qBAAiB,SAAS,QAAQ,OAAO;AACvC,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,OAAO,KAAK,EAAE;AACvB;AAEA,eAAe,OAAO;AACpB,QAAM,EAAE,OAAO,IAAI,UAAU;AAAA,IAC3B,SAAS;AAAA,MACP,MAAM,EAAE,MAAM,UAAU;AAAA,MACxB,KAAK,EAAE,MAAM,UAAU;AAAA,MACvB,MAAM,EAAE,MAAM,UAAU;AAAA,IAC1B;AAAA,EACF,CAAC;AAED,MAAI,OAAO,MAAM;AACf,YAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWX;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,QAAQ,MAAM,SAAS;AAE7B,MAAI,OAAO,MAAM;AACf,UAAM,OAAO,qBAAqB,KAAK;AACvC,kBAAc,4BAA4B,IAAI;AAC9C,YAAQ,IAAI,qCAAqC;AAAA,EACnD,WAAW,OAAO,KAAK;AACrB,UAAM,kBAAkB,gCAAgC,KAAK;AAC7D,QAAI,gBAAgB,WAAW,GAAG;AAChC,cAAQ,MAAM,oCAAoC;AAClD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,EAAE,IAAI,IAAI,MAAM,MAAM,0CAA0C;AAAA,MACpE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB,iBAAiB,gCAAgC,KAAK;AAAA,MACxD,CAAC;AAAA,MACD,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,IACF,CAAC,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC;AAE3B,UAAM,QAAQ,IAAI,MAAM,OAAO,EAAE,IAAI;AAErC,YAAQ,IAAI,+BAA+B,KAAK,EAAE;AAAA,EACpD,OAAO;AACL,UAAM,OAAO,qBAAqB,KAAK;AACvC,SAAK,QAAQ,CAAC,KAAK,MAAM;AACvB,YAAM,WAAW,GAAG,IAAI,MAAM,YAAY,EAAE,QAAQ,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC;AACzE,oBAAc,UAAU,IAAI,GAAG;AAC/B,cAAQ,IAAI,aAAa,QAAQ,GAAG;AAAA,IACtC,CAAC;AAAA,EACH;AACF;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,UAAU,GAAG;AAC3B,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
@@ -0,0 +1,45 @@
1
+ import { Arrow } from './types.js';
2
+ import 'transformation-matrix';
3
+
4
+ type ArrowHeadGeometry = {
5
+ tip: {
6
+ x: number;
7
+ y: number;
8
+ };
9
+ base: {
10
+ x: number;
11
+ y: number;
12
+ };
13
+ leftWing: {
14
+ x: number;
15
+ y: number;
16
+ };
17
+ rightWing: {
18
+ x: number;
19
+ y: number;
20
+ };
21
+ };
22
+ type ArrowGeometry = {
23
+ shaftStart: {
24
+ x: number;
25
+ y: number;
26
+ };
27
+ shaftEnd: {
28
+ x: number;
29
+ y: number;
30
+ };
31
+ heads: ArrowHeadGeometry[];
32
+ shaftWidth: number;
33
+ headLength: number;
34
+ headWidth: number;
35
+ length: number;
36
+ };
37
+ declare function getArrowGeometry(arrow: Arrow): ArrowGeometry;
38
+ declare function getArrowBoundingBox(arrow: Arrow): {
39
+ minX: number;
40
+ maxX: number;
41
+ minY: number;
42
+ maxY: number;
43
+ };
44
+
45
+ export { type ArrowGeometry, type ArrowHeadGeometry, getArrowBoundingBox, getArrowGeometry };
@@ -0,0 +1,9 @@
1
+ import {
2
+ getArrowBoundingBox,
3
+ getArrowGeometry
4
+ } from "../chunk-62J5EOWN.js";
5
+ export {
6
+ getArrowBoundingBox,
7
+ getArrowGeometry
8
+ };
9
+ //# sourceMappingURL=arrowHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}