@tscircuit/schematic-trace-solver 0.0.87 → 0.0.88

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 (113) hide show
  1. package/.agents/skills/schematic-trace-visualization/SKILL.md +115 -0
  2. package/.github/scripts/import-json-bug-report.ts +15 -1
  3. package/.github/workflows/json-bug-report.yml +3 -2
  4. package/AGENTS.md +22 -0
  5. package/lib/testing/PipelineStageDebugRunner.ts +344 -0
  6. package/package.json +3 -2
  7. package/scripts/debug-pipeline-stages.ts +146 -0
  8. package/site/bug-reports/bug-report-20260706T220324Z.page.tsx +4 -0
  9. package/site/bug-reports/bug-report-20260707T020342Z.page.tsx +4 -0
  10. package/site/bug-reports/bug-report-20260707T092615Z.page.tsx +4 -0
  11. package/site/bug-reports/bug-report-20260707T134549Z.page.tsx +4 -0
  12. package/site/bug-reports/bug-report-20260707T134722Z.page.tsx +4 -0
  13. package/site/bug-reports/bug-report-20260707T140410Z.page.tsx +4 -0
  14. package/site/bug-reports/bug-report-20260707T141025Z.page.tsx +4 -0
  15. package/site/bug-reports/bug-report-20260707T141421Z.page.tsx +4 -0
  16. package/tests/bug-reports/bug-report-20260706T220324Z/__snapshots__/bug-report-20260706T220324Z.snap.svg +357 -3448
  17. package/tests/bug-reports/bug-report-20260707T020342Z/__snapshots__/bug-report-20260707T020342Z.snap.svg +64 -0
  18. package/tests/bug-reports/bug-report-20260707T020342Z/bug-report-20260707T020342Z.json +233 -0
  19. package/tests/bug-reports/bug-report-20260707T020342Z/bug-report-20260707T020342Z.test.ts +12 -0
  20. package/tests/bug-reports/bug-report-20260707T092615Z/__snapshots__/bug-report-20260707T092615Z.snap.svg +2098 -0
  21. package/tests/bug-reports/bug-report-20260707T092615Z/bug-report-20260707T092615Z.json +1392 -0
  22. package/tests/bug-reports/bug-report-20260707T092615Z/bug-report-20260707T092615Z.test.ts +12 -0
  23. package/tests/bug-reports/bug-report-20260707T134549Z/__snapshots__/bug-report-20260707T134549Z.snap.svg +857 -0
  24. package/tests/bug-reports/bug-report-20260707T134549Z/bug-report-20260707T134549Z.json +652 -0
  25. package/tests/bug-reports/bug-report-20260707T134549Z/bug-report-20260707T134549Z.test.ts +12 -0
  26. package/tests/bug-reports/bug-report-20260707T134722Z/__snapshots__/bug-report-20260707T134722Z.snap.svg +275 -0
  27. package/tests/bug-reports/bug-report-20260707T134722Z/bug-report-20260707T134722Z.json +265 -0
  28. package/tests/bug-reports/bug-report-20260707T134722Z/bug-report-20260707T134722Z.test.ts +12 -0
  29. package/tests/bug-reports/bug-report-20260707T140410Z/__snapshots__/bug-report-20260707T140410Z.snap.svg +950 -0
  30. package/tests/bug-reports/bug-report-20260707T140410Z/bug-report-20260707T140410Z.json +610 -0
  31. package/tests/bug-reports/bug-report-20260707T140410Z/bug-report-20260707T140410Z.test.ts +12 -0
  32. package/tests/bug-reports/bug-report-20260707T141025Z/__snapshots__/bug-report-20260707T141025Z.snap.svg +218 -0
  33. package/tests/bug-reports/bug-report-20260707T141025Z/bug-report-20260707T141025Z.json +185 -0
  34. package/tests/bug-reports/bug-report-20260707T141025Z/bug-report-20260707T141025Z.test.ts +12 -0
  35. package/tests/bug-reports/bug-report-20260707T141421Z/__snapshots__/bug-report-20260707T141421Z.snap.svg +613 -0
  36. package/tests/bug-reports/bug-report-20260707T141421Z/bug-report-20260707T141421Z.json +499 -0
  37. package/tests/bug-reports/bug-report-20260707T141421Z/bug-report-20260707T141421Z.test.ts +12 -0
  38. package/tests/examples/__snapshots__/example01.snap.svg +59 -162
  39. package/tests/examples/__snapshots__/example02.snap.svg +64 -273
  40. package/tests/examples/__snapshots__/example03.snap.svg +85 -290
  41. package/tests/examples/__snapshots__/example04.snap.svg +50 -94
  42. package/tests/examples/__snapshots__/example05.snap.svg +73 -191
  43. package/tests/examples/__snapshots__/example06.snap.svg +49 -95
  44. package/tests/examples/__snapshots__/example07.snap.svg +65 -218
  45. package/tests/examples/__snapshots__/example08.snap.svg +61 -143
  46. package/tests/examples/__snapshots__/example09.snap.svg +123 -493
  47. package/tests/examples/__snapshots__/example10.snap.svg +57 -136
  48. package/tests/examples/__snapshots__/example11.snap.svg +64 -173
  49. package/tests/examples/__snapshots__/example12.snap.svg +58 -159
  50. package/tests/examples/__snapshots__/example13.snap.svg +78 -348
  51. package/tests/examples/__snapshots__/example14.snap.svg +77 -293
  52. package/tests/examples/__snapshots__/example15.snap.svg +140 -984
  53. package/tests/examples/__snapshots__/example16.snap.svg +62 -162
  54. package/tests/examples/__snapshots__/example17.snap.svg +67 -198
  55. package/tests/examples/__snapshots__/example18.snap.svg +69 -249
  56. package/tests/examples/__snapshots__/example19.snap.svg +63 -202
  57. package/tests/examples/__snapshots__/example20.snap.svg +60 -148
  58. package/tests/examples/__snapshots__/example21.snap.svg +73 -298
  59. package/tests/examples/__snapshots__/example22.snap.svg +62 -156
  60. package/tests/examples/__snapshots__/example23.snap.svg +66 -172
  61. package/tests/examples/__snapshots__/example24.snap.svg +64 -164
  62. package/tests/examples/__snapshots__/example25.snap.svg +76 -299
  63. package/tests/examples/__snapshots__/example26.snap.svg +64 -164
  64. package/tests/examples/__snapshots__/example27.snap.svg +83 -300
  65. package/tests/examples/__snapshots__/example28.snap.svg +54 -115
  66. package/tests/examples/__snapshots__/example29.snap.svg +257 -1299
  67. package/tests/examples/__snapshots__/example30.snap.svg +91 -293
  68. package/tests/examples/__snapshots__/example31.snap.svg +47 -88
  69. package/tests/examples/__snapshots__/example32.snap.svg +107 -405
  70. package/tests/examples/__snapshots__/example33.snap.svg +71 -180
  71. package/tests/examples/__snapshots__/example34.snap.svg +55 -116
  72. package/tests/examples/__snapshots__/example35.snap.svg +69 -176
  73. package/tests/examples/__snapshots__/example36.snap.svg +65 -159
  74. package/tests/examples/__snapshots__/example37.snap.svg +75 -223
  75. package/tests/examples/__snapshots__/example38.snap.svg +46 -76
  76. package/tests/examples/__snapshots__/example39.snap.svg +51 -106
  77. package/tests/examples/__snapshots__/example40.snap.svg +83 -270
  78. package/tests/examples/__snapshots__/example41.snap.svg +54 -118
  79. package/tests/examples/__snapshots__/example42.snap.svg +67 -194
  80. package/tests/examples/__snapshots__/example43.snap.svg +62 -168
  81. package/tests/examples/__snapshots__/example44.snap.svg +86 -369
  82. package/tests/examples/__snapshots__/example45.snap.svg +60 -169
  83. package/tests/examples/__snapshots__/example46.snap.svg +80 -342
  84. package/tests/examples/__snapshots__/example47.snap.svg +82 -323
  85. package/tests/examples/__snapshots__/example48.snap.svg +64 -167
  86. package/tests/examples/__snapshots__/example49.snap.svg +120 -565
  87. package/tests/examples/__snapshots__/example50.snap.svg +71 -189
  88. package/tests/fixtures/getLastStepGraphicsObject.ts +38 -0
  89. package/tests/fixtures/getLastStepSvg.ts +9 -0
  90. package/tests/repros/__snapshots__/bugreport-001-gnd-overlap.snap.svg +67 -218
  91. package/tests/repros/__snapshots__/manufacturePartNumber-text-box.snap.svg +47 -87
  92. package/tests/repros/__snapshots__/netlabel-connector-through-rail-label.snap.svg +73 -272
  93. package/tests/repros/__snapshots__/repro-atmega328p-fault-pullup.snap.svg +284 -0
  94. package/tests/repros/__snapshots__/repro-atmega328p-missing-gnd-netlabel.snap.svg +470 -0
  95. package/tests/repros/__snapshots__/repro-bq24074-battery-charger.snap.svg +94 -395
  96. package/tests/repros/__snapshots__/repro-cc2340r5.snap.svg +88 -467
  97. package/tests/repros/__snapshots__/repro-ina237-current-monitor.snap.svg +109 -569
  98. package/tests/repros/__snapshots__/repro130-bq27441-fuel-gauge-trace-through-c1.snap.svg +95 -459
  99. package/tests/repros/__snapshots__/repro51-overlap-junction-crossing.snap.svg +64 -176
  100. package/tests/repros/__snapshots__/trace-overlap-box-resistor.snap.svg +51 -112
  101. package/tests/repros/assets/repro-atmega328p-fault-pullup.input.json +239 -0
  102. package/tests/repros/assets/repro-atmega328p-missing-gnd-netlabel.input.json +432 -0
  103. package/tests/repros/repro-atmega328p-fault-pullup.test.ts +11 -0
  104. package/tests/repros/repro-atmega328p-missing-gnd-netlabel.test.ts +16 -0
  105. package/tests/solvers/SchematicTraceSingleLineSolver2/__snapshots__/SchematicTraceSingleLineSolver2_01-example17-d1_1-u1_1.snap.svg +59 -159
  106. package/tests/solvers/TraceCleanupSolver/__snapshots__/TraceCleanupSolver.snap.svg +54 -118
  107. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/__snapshots__/TraceLabelOverlapAvoidanceSolver.snap.svg +58 -245
  108. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/__snapshots__/renderComparisonView01.snap.svg +73 -222
  109. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/__snapshots__/renderComparisonView02.snap.svg +65 -204
  110. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/renderComparisonView/__snapshots__/renderComparisonView03.snap.svg +65 -183
  111. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/MergedNetLabelObstacles.snap.svg +54 -139
  112. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/OverlapAvoidanceStepSolver.snap.svg +61 -215
  113. package/tests/solvers/TraceLabelOverlapAvoidanceSolver/sub-solver/__snapshots__/SingleOverlapSolver.snap.svg +54 -124
@@ -1,177 +1,70 @@
1
- <svg width="640" height="640" viewBox="0 0 640 640" xmlns="http://www.w3.org/2000/svg">
2
- <rect width="100%" height="100%" fill="white" />
3
- <g>
4
- <circle data-type="point" data-label="U1.1
5
- x-" data-x="-1.05" data-y="0.30000000000000004" cx="40" cy="406.1349154032081" r="3" fill="hsl(319, 100%, 50%, 0.8)" />
6
- </g>
7
- <g>
8
- <circle data-type="point" data-label="U1.2
9
- x-" data-x="-1.05" data-y="0.10000000000000003" cx="40" cy="430.74489123269615" r="3" fill="hsl(320, 100%, 50%, 0.8)" />
10
- </g>
11
- <g>
12
- <circle data-type="point" data-label="U1.3
13
- x-" data-x="-1.05" data-y="-0.09999999999999998" cx="40" cy="455.35486706218416" r="3" fill="hsl(321, 100%, 50%, 0.8)" />
14
- </g>
15
- <g>
16
- <circle data-type="point" data-label="U1.4
17
- x-" data-x="-1.05" data-y="-0.30000000000000004" cx="40" cy="479.9648428916722" r="3" fill="hsl(322, 100%, 50%, 0.8)" />
18
- </g>
19
- <g>
20
- <circle data-type="point" data-label="U1.5
21
- x+" data-x="1.05" data-y="-0.30000000000000004" cx="298.40474620962425" cy="479.9648428916722" r="3" fill="hsl(323, 100%, 50%, 0.8)" />
22
- </g>
23
- <g>
24
- <circle data-type="point" data-label="U1.6
25
- x+" data-x="1.05" data-y="-0.10000000000000003" cx="298.40474620962425" cy="455.35486706218416" r="3" fill="hsl(324, 100%, 50%, 0.8)" />
26
- </g>
27
- <g>
28
- <circle data-type="point" data-label="U1.7
29
- x+" data-x="1.05" data-y="0.09999999999999998" cx="298.40474620962425" cy="430.74489123269615" r="3" fill="hsl(325, 100%, 50%, 0.8)" />
30
- </g>
31
- <g>
32
- <circle data-type="point" data-label="U1.8
33
- x+" data-x="1.05" data-y="0.30000000000000004" cx="298.40474620962425" cy="406.1349154032081" r="3" fill="hsl(326, 100%, 50%, 0.8)" />
34
- </g>
35
- <g>
36
- <circle data-type="point" data-label="U2.1
37
- x-" data-x="0.95" data-y="2.3" cx="286.09975829488025" cy="160.0351571083279" r="3" fill="hsl(200, 100%, 50%, 0.8)" />
38
- </g>
39
- <g>
40
- <circle data-type="point" data-label="U2.2
41
- x-" data-x="0.95" data-y="2.1" cx="286.09975829488025" cy="184.6451329378159" r="3" fill="hsl(201, 100%, 50%, 0.8)" />
42
- </g>
43
- <g>
44
- <circle data-type="point" data-label="U2.3
45
- x-" data-x="0.95" data-y="1.9" cx="286.09975829488025" cy="209.25510876730394" r="3" fill="hsl(202, 100%, 50%, 0.8)" />
46
- </g>
47
- <g>
48
- <circle data-type="point" data-label="U2.4
49
- x-" data-x="0.95" data-y="1.7" cx="286.09975829488025" cy="233.86508459679195" r="3" fill="hsl(203, 100%, 50%, 0.8)" />
50
- </g>
51
- <g>
52
- <circle data-type="point" data-label="U2.5
53
- x+" data-x="3.05" data-y="1.7" cx="544.5045045045044" cy="233.86508459679195" r="3" fill="hsl(204, 100%, 50%, 0.8)" />
54
- </g>
55
- <g>
56
- <circle data-type="point" data-label="U2.6
57
- x+" data-x="3.05" data-y="1.9" cx="544.5045045045044" cy="209.25510876730394" r="3" fill="hsl(205, 100%, 50%, 0.8)" />
58
- </g>
59
- <g>
60
- <circle data-type="point" data-label="U2.7
61
- x+" data-x="3.05" data-y="2.1" cx="544.5045045045044" cy="184.6451329378159" r="3" fill="hsl(206, 100%, 50%, 0.8)" />
62
- </g>
63
- <g>
64
- <circle data-type="point" data-label="U2.8
65
- x+" data-x="3.05" data-y="2.3" cx="544.5045045045044" cy="160.0351571083279" r="3" fill="hsl(207, 100%, 50%, 0.8)" />
66
- </g>
67
- <g>
68
- <circle data-type="point" data-label="" data-x="1.6010000000000002" data-y="0.3" cx="366.20522961986376" cy="406.13491540320814" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
69
- </g>
70
- <g>
71
- <circle data-type="point" data-label="" data-x="1.05" data-y="-0.10000000000000003" cx="298.40474620962425" cy="455.35486706218416" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
72
- </g>
73
- <g>
74
- <circle data-type="point" data-label="" data-x="3.05" data-y="2.3" cx="544.5045045045044" cy="160.0351571083279" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
75
- </g>
76
- <g>
77
- <circle data-type="point" data-label="" data-x="1.05" data-y="0.09999999999999998" cx="298.40474620962425" cy="430.74489123269615" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
78
- </g>
79
- <g>
80
- <circle data-type="point" data-label="" data-x="3.05" data-y="2.1" cx="544.5045045045044" cy="184.6451329378159" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
81
- </g>
82
- <g>
83
- <polyline data-points="1.05,0.09999999999999998 3.05,2.1" data-type="line" data-label="" points="298.40474620962425,430.74489123269615 544.5045045045044,184.6451329378159" fill="none" stroke="hsl(312, 100%, 50%, 0.8)" stroke-width="1" />
84
- </g>
85
- <g>
86
- <polyline data-points="1.05,-0.10000000000000003 3.05,2.3" data-type="line" data-label="" points="298.40474620962425,455.35486706218416 544.5045045045044,160.0351571083279" fill="none" stroke="hsl(88, 100%, 50%, 0.8)" stroke-width="1" />
87
- </g>
88
- <g>
89
- <polyline data-points="1.05,-0.30000000000000004 1.05,0.30000000000000004" data-type="line" data-label="" points="298.40474620962425,479.9648428916722 298.40474620962425,406.1349154032081" fill="none" stroke="hsl(190, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
90
- </g>
91
- <g>
92
- <polyline data-points="1.05,-0.30000000000000004 1.6010000000000002,-0.30000000000000004 1.6010000000000002,0.3 1.05,0.30000000000000004" data-type="line" data-label="" points="298.40474620962425,479.9648428916722 366.20522961986376,479.9648428916722 366.20522961986376,406.13491540320814 298.40474620962425,406.1349154032081" fill="none" stroke="purple" stroke-width="1" />
93
- </g>
94
- <g>
95
- <rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="40" y="381.5249395737201" width="258.40474620962425" height="123.04987914744015" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.008126785714285715" />
96
- </g>
97
- <g>
98
- <rect data-type="rect" data-label="schematic_component_1" data-x="2" data-y="2" x="286.09975829488025" y="135.42518127883983" width="258.4047462096242" height="123.04987914744015" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.008126785714285715" />
99
- </g>
100
- <g>
101
- <rect data-type="rect" data-label="netId: VCC
102
- globalConnNetId: connectivity_net2" data-x="1.6010000000000002" data-y="0.54" x="353.90024170511975" y="347.07097341243684" width="24.609975829488064" height="59.06394199077124" fill="#ef444466" stroke="#ef4444" stroke-width="0.008126785714285715" />
103
- </g>
104
- <g>
105
- <rect data-type="rect" data-label="netId: U1.CLK to U2.VCC
106
- globalConnNetId: connectivity_net1" data-x="1.276" data-y="-0.10000000000000003" x="298.52779608877165" y="443.04987914744015" width="55.3724456163481" height="24.609975829488008" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008126785714285715" />
107
- </g>
108
- <g>
109
- <rect data-type="rect" data-label="netId: U1.CLK to U2.VCC
110
- globalConnNetId: connectivity_net1" data-x="3.276" data-y="2.3" x="544.6275543836518" y="147.7301691935839" width="55.37244561634816" height="24.609975829488008" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008126785714285715" />
111
- </g>
112
- <g>
113
- <rect data-type="rect" data-label="netId: U1.IO3 to U2.IO3
114
- globalConnNetId: connectivity_net0" data-x="1.276" data-y="0.09999999999999998" x="298.52779608877165" y="418.43990331795214" width="55.3724456163481" height="24.609975829488008" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008126785714285715" />
115
- </g>
116
- <g>
117
- <rect data-type="rect" data-label="netId: U1.IO3 to U2.IO3
118
- globalConnNetId: connectivity_net0" data-x="3.276" data-y="2.1" x="544.6275543836518" y="172.34014502307184" width="55.37244561634816" height="24.609975829488064" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008126785714285715" />
119
- </g>
120
- <g id="crosshair" style="display: none">
121
- <line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5" />
122
- <line id="crosshair-v" x1="0" x2="640" stroke="#666" stroke-width="0.5" /><text id="coordinates" font-family="monospace" font-size="12" fill="#666"></text>
123
- </g>
124
- <script>
125
- <![CDATA[
126
- document.currentScript.parentElement.addEventListener('mousemove', (e) => {
127
- const svg = e.currentTarget;
128
- const rect = svg.getBoundingClientRect();
129
- const x = e.clientX - rect.left;
130
- const y = e.clientY - rect.top;
131
- const crosshair = svg.getElementById('crosshair');
132
- const h = svg.getElementById('crosshair-h');
133
- const v = svg.getElementById('crosshair-v');
134
- const coords = svg.getElementById('coordinates');
1
+ <svg width="640" height="640" viewBox="0 0 640 640" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="white"/><g><polyline data-points="1.05,0.09999999999999998 3.05,2.1" data-type="line" data-label="" points="298.40474620962425,430.74489123269615 544.5045045045044,184.6451329378159" fill="none" stroke="hsl(312, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="1.05,-0.10000000000000003 3.05,2.3" data-type="line" data-label="" points="298.40474620962425,455.35486706218416 544.5045045045044,160.0351571083279" fill="none" stroke="hsl(88, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="1.05,-0.30000000000000004 1.05,0.30000000000000004" data-type="line" data-label="" points="298.40474620962425,479.9648428916722 298.40474620962425,406.1349154032081" fill="none" stroke="hsl(190, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="1.05,-0.30000000000000004 1.6010000000000002,-0.30000000000000004 1.6010000000000002,0.3 1.05,0.30000000000000004" data-type="line" data-label="" points="298.40474620962425,479.9648428916722 366.20522961986376,479.9648428916722 366.20522961986376,406.13491540320814 298.40474620962425,406.1349154032081" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="40" y="381.5249395737201" width="258.40474620962425" height="123.04987914744015" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.008126785714285715"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="2" data-y="2" x="286.0997582948803" y="135.42518127883983" width="258.4047462096242" height="123.04987914744015" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.008126785714285715"/></g><g><rect data-type="rect" data-label="netId: VCC
2
+ globalConnNetId: connectivity_net2" data-x="1.6010000000000002" data-y="0.54" x="353.9002417051197" y="347.07097341243684" width="24.609975829488064" height="59.06394199077124" fill="#ef444466" stroke="#ef4444" stroke-width="0.008126785714285715"/></g><g><rect data-type="rect" data-label="netId: U1.CLK to U2.VCC
3
+ globalConnNetId: connectivity_net1" data-x="1.276" data-y="-0.10000000000000003" x="298.52779608877165" y="443.04987914744015" width="55.3724456163481" height="24.609975829488008" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008126785714285715"/></g><g><rect data-type="rect" data-label="netId: U1.CLK to U2.VCC
4
+ globalConnNetId: connectivity_net1" data-x="3.276" data-y="2.3" x="544.6275543836518" y="147.7301691935839" width="55.37244561634816" height="24.609975829488008" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008126785714285715"/></g><g><rect data-type="rect" data-label="netId: U1.IO3 to U2.IO3
5
+ globalConnNetId: connectivity_net0" data-x="1.276" data-y="0.09999999999999998" x="298.52779608877165" y="418.43990331795214" width="55.3724456163481" height="24.609975829488008" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008126785714285715"/></g><g><rect data-type="rect" data-label="netId: U1.IO3 to U2.IO3
6
+ globalConnNetId: connectivity_net0" data-x="3.276" data-y="2.1" x="544.6275543836518" y="172.34014502307187" width="55.37244561634816" height="24.609975829488064" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008126785714285715"/></g><g><circle data-type="point" data-label="U1.1
7
+ x-" data-x="-1.05" data-y="0.30000000000000004" cx="40" cy="406.1349154032081" r="3" fill="hsl(319, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.2
8
+ x-" data-x="-1.05" data-y="0.10000000000000003" cx="40" cy="430.74489123269615" r="3" fill="hsl(320, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.3
9
+ x-" data-x="-1.05" data-y="-0.09999999999999998" cx="40" cy="455.35486706218416" r="3" fill="hsl(321, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.4
10
+ x-" data-x="-1.05" data-y="-0.30000000000000004" cx="40" cy="479.9648428916722" r="3" fill="hsl(322, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.5
11
+ x+" data-x="1.05" data-y="-0.30000000000000004" cx="298.40474620962425" cy="479.9648428916722" r="3" fill="hsl(323, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.6
12
+ x+" data-x="1.05" data-y="-0.10000000000000003" cx="298.40474620962425" cy="455.35486706218416" r="3" fill="hsl(324, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.7
13
+ x+" data-x="1.05" data-y="0.09999999999999998" cx="298.40474620962425" cy="430.74489123269615" r="3" fill="hsl(325, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.8
14
+ x+" data-x="1.05" data-y="0.30000000000000004" cx="298.40474620962425" cy="406.1349154032081" r="3" fill="hsl(326, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.1
15
+ x-" data-x="0.95" data-y="2.3" cx="286.09975829488025" cy="160.0351571083279" r="3" fill="hsl(200, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.2
16
+ x-" data-x="0.95" data-y="2.1" cx="286.09975829488025" cy="184.6451329378159" r="3" fill="hsl(201, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.3
17
+ x-" data-x="0.95" data-y="1.9" cx="286.09975829488025" cy="209.25510876730394" r="3" fill="hsl(202, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.4
18
+ x-" data-x="0.95" data-y="1.7" cx="286.09975829488025" cy="233.86508459679195" r="3" fill="hsl(203, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.5
19
+ x+" data-x="3.05" data-y="1.7" cx="544.5045045045044" cy="233.86508459679195" r="3" fill="hsl(204, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.6
20
+ x+" data-x="3.05" data-y="1.9" cx="544.5045045045044" cy="209.25510876730394" r="3" fill="hsl(205, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.7
21
+ x+" data-x="3.05" data-y="2.1" cx="544.5045045045044" cy="184.6451329378159" r="3" fill="hsl(206, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.8
22
+ x+" data-x="3.05" data-y="2.3" cx="544.5045045045044" cy="160.0351571083279" r="3" fill="hsl(207, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anchorPoint
23
+ orientation: y+" data-x="1.6010000000000002" data-y="0.3" cx="366.20522961986376" cy="406.13491540320814" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
24
+ orientation: x+" data-x="1.05" data-y="-0.10000000000000003" cx="298.40474620962425" cy="455.35486706218416" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
25
+ orientation: x+" data-x="3.05" data-y="2.3" cx="544.5045045045044" cy="160.0351571083279" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
26
+ orientation: x+" data-x="1.05" data-y="0.09999999999999998" cx="298.40474620962425" cy="430.74489123269615" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
27
+ orientation: x+" data-x="3.05" data-y="2.1" cx="544.5045045045044" cy="184.6451329378159" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g id="crosshair" style="display: none"><line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5"/><line id="crosshair-v" x1="0" x2="640" stroke="#666" stroke-width="0.5"/><text id="coordinates" font-family="monospace" font-size="12" fill="#666"></text></g><script><![CDATA[
28
+ document.currentScript.parentElement.addEventListener('mousemove', (e) => {
29
+ const svg = e.currentTarget;
30
+ const rect = svg.getBoundingClientRect();
31
+ const x = e.clientX - rect.left;
32
+ const y = e.clientY - rect.top;
33
+ const crosshair = svg.getElementById('crosshair');
34
+ const h = svg.getElementById('crosshair-h');
35
+ const v = svg.getElementById('crosshair-v');
36
+ const coords = svg.getElementById('coordinates');
37
+
38
+ crosshair.style.display = 'block';
39
+ h.setAttribute('x1', '0');
40
+ h.setAttribute('x2', '640');
41
+ h.setAttribute('y1', y);
42
+ h.setAttribute('y2', y);
43
+ v.setAttribute('x1', x);
44
+ v.setAttribute('x2', x);
45
+ v.setAttribute('y1', '0');
46
+ v.setAttribute('y2', '640');
135
47
 
136
- crosshair.style.display = 'block';
137
- h.setAttribute('x1', '0');
138
- h.setAttribute('x2', '640');
139
- h.setAttribute('y1', y);
140
- h.setAttribute('y2', y);
141
- v.setAttribute('x1', x);
142
- v.setAttribute('x2', x);
143
- v.setAttribute('y1', '0');
144
- v.setAttribute('y2', '640');
145
-
146
- // Calculate real coordinates using inverse transformation
147
- const matrix = {
148
- "a": 123.04987914744012,
149
- "c": 0,
150
- "e": 169.20237310481212,
151
- "b": 0,
152
- "d": -123.04987914744012,
153
- "f": 443.04987914744015
154
- };
155
- // Manually invert and apply the affine transform
156
- // Since we only use translate and scale, we can directly compute:
157
- // x' = (x - tx) / sx
158
- // y' = (y - ty) / sy
159
- const sx = matrix.a;
160
- const sy = matrix.d;
161
- const tx = matrix.e;
162
- const ty = matrix.f;
163
- const realPoint = {
164
- x: (x - tx) / sx,
165
- y: (y - ty) / sy // Flip y back since we used negative scale
166
- }
167
-
168
- coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
169
- coords.setAttribute('x', (x + 5).toString());
170
- coords.setAttribute('y', (y - 5).toString());
171
- });
172
- document.currentScript.parentElement.addEventListener('mouseleave', () => {
173
- document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
174
- });
175
- ]]>
176
- </script>
177
- </svg>
48
+ // Calculate real coordinates using inverse transformation
49
+ const matrix = {"a":123.04987914744012,"c":0,"e":169.20237310481212,"b":0,"d":-123.04987914744012,"f":443.04987914744015};
50
+ // Manually invert and apply the affine transform
51
+ // Since we only use translate and scale, we can directly compute:
52
+ // x' = (x - tx) / sx
53
+ // y' = (y - ty) / sy
54
+ const sx = matrix.a;
55
+ const sy = matrix.d;
56
+ const tx = matrix.e;
57
+ const ty = matrix.f;
58
+ const realPoint = {
59
+ x: (x - tx) / sx,
60
+ y: (y - ty) / sy // Flip y back since we used negative scale
61
+ }
62
+
63
+ coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
64
+ coords.setAttribute('x', (x + 5).toString());
65
+ coords.setAttribute('y', (y - 5).toString());
66
+ });
67
+ document.currentScript.parentElement.addEventListener('mouseleave', () => {
68
+ document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
69
+ });
70
+ ]]></script></svg>
@@ -1,160 +1,66 @@
1
- <svg width="640" height="640" viewBox="0 0 640 640" xmlns="http://www.w3.org/2000/svg">
2
- <rect width="100%" height="100%" fill="white" />
3
- <g>
4
- <circle data-type="point" data-label="U1.1
5
- x-" data-x="-1.05" data-y="0.30000000000000004" cx="39.999999999999986" cy="396.8476769260929" r="3" fill="hsl(319, 100%, 50%, 0.8)" />
6
- </g>
7
- <g>
8
- <circle data-type="point" data-label="U1.2
9
- x-" data-x="-1.05" data-y="0.10000000000000003" cx="39.999999999999986" cy="418.80415604783377" r="3" fill="hsl(320, 100%, 50%, 0.8)" />
10
- </g>
11
- <g>
12
- <circle data-type="point" data-label="U1.3
13
- x-" data-x="-1.05" data-y="-0.09999999999999998" cx="39.999999999999986" cy="440.7606351695746" r="3" fill="hsl(321, 100%, 50%, 0.8)" />
14
- </g>
15
- <g>
16
- <circle data-type="point" data-label="U1.4
17
- x-" data-x="-1.05" data-y="-0.30000000000000004" cx="39.999999999999986" cy="462.71711429131545" r="3" fill="hsl(322, 100%, 50%, 0.8)" />
18
- </g>
19
- <g>
20
- <circle data-type="point" data-label="U1.5
21
- x+" data-x="1.05" data-y="-0.30000000000000004" cx="270.54303077827876" cy="462.71711429131545" r="3" fill="hsl(323, 100%, 50%, 0.8)" />
22
- </g>
23
- <g>
24
- <circle data-type="point" data-label="U1.6
25
- x+" data-x="1.05" data-y="-0.10000000000000003" cx="270.54303077827876" cy="440.7606351695746" r="3" fill="hsl(324, 100%, 50%, 0.8)" />
26
- </g>
27
- <g>
28
- <circle data-type="point" data-label="U1.7
29
- x+" data-x="1.05" data-y="0.09999999999999998" cx="270.54303077827876" cy="418.80415604783377" r="3" fill="hsl(325, 100%, 50%, 0.8)" />
30
- </g>
31
- <g>
32
- <circle data-type="point" data-label="U1.8
33
- x+" data-x="1.05" data-y="0.30000000000000004" cx="270.54303077827876" cy="396.8476769260929" r="3" fill="hsl(326, 100%, 50%, 0.8)" />
34
- </g>
35
- <g>
36
- <circle data-type="point" data-label="U2.1
37
- x-" data-x="0.95" data-y="2.3" cx="259.56479121740836" cy="177.28288570868457" r="3" fill="hsl(200, 100%, 50%, 0.8)" />
38
- </g>
39
- <g>
40
- <circle data-type="point" data-label="U2.2
41
- x-" data-x="0.95" data-y="2.1" cx="259.56479121740836" cy="199.2393648304254" r="3" fill="hsl(201, 100%, 50%, 0.8)" />
42
- </g>
43
- <g>
44
- <circle data-type="point" data-label="U2.3
45
- x-" data-x="0.95" data-y="1.9" cx="259.56479121740836" cy="221.19584395216626" r="3" fill="hsl(202, 100%, 50%, 0.8)" />
46
- </g>
47
- <g>
48
- <circle data-type="point" data-label="U2.4
49
- x-" data-x="0.95" data-y="1.7" cx="259.56479121740836" cy="243.15232307390707" r="3" fill="hsl(203, 100%, 50%, 0.8)" />
50
- </g>
51
- <g>
52
- <circle data-type="point" data-label="U2.5
53
- x+" data-x="3.05" data-y="1.7" cx="490.1078219956871" cy="243.15232307390707" r="3" fill="hsl(204, 100%, 50%, 0.8)" />
54
- </g>
55
- <g>
56
- <circle data-type="point" data-label="U2.6
57
- x+" data-x="3.05" data-y="1.9" cx="490.1078219956871" cy="221.19584395216626" r="3" fill="hsl(205, 100%, 50%, 0.8)" />
58
- </g>
59
- <g>
60
- <circle data-type="point" data-label="U2.7
61
- x+" data-x="3.05" data-y="2.1" cx="490.1078219956871" cy="199.2393648304254" r="3" fill="hsl(206, 100%, 50%, 0.8)" />
62
- </g>
63
- <g>
64
- <circle data-type="point" data-label="U2.8
65
- x+" data-x="3.05" data-y="2.3" cx="490.1078219956871" cy="177.28288570868457" r="3" fill="hsl(207, 100%, 50%, 0.8)" />
66
- </g>
67
- <g>
68
- <circle data-type="point" data-label="" data-x="2.1510000000000002" data-y="0.30000000000000004" cx="391.4134483434621" cy="396.8476769260929" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
69
- </g>
70
- <g>
71
- <circle data-type="point" data-label="" data-x="1.05" data-y="-0.10000000000000003" cx="270.54303077827876" cy="440.7606351695746" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
72
- </g>
73
- <g>
74
- <circle data-type="point" data-label="" data-x="3.05" data-y="2.3" cx="490.1078219956871" cy="177.28288570868457" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
75
- </g>
76
- <g>
77
- <polyline data-points="1.05,-0.10000000000000003 3.05,2.3" data-type="line" data-label="" points="270.54303077827876,440.7606351695746 490.1078219956871,177.28288570868457" fill="none" stroke="hsl(88, 100%, 50%, 0.8)" stroke-width="1" />
78
- </g>
79
- <g>
80
- <polyline data-points="1.05,-0.30000000000000004 1.05,0.30000000000000004" data-type="line" data-label="" points="270.54303077827876,462.71711429131545 270.54303077827876,396.8476769260929" fill="none" stroke="hsl(190, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
81
- </g>
82
- <g>
83
- <polyline data-points="1.05,-0.30000000000000004 2.1510000000000002,-0.30000000000000004 2.1510000000000002,0.30000000000000004 1.05,0.30000000000000004" data-type="line" data-label="" points="270.54303077827876,462.71711429131545 391.4134483434621,462.71711429131545 391.4134483434621,396.8476769260929 270.54303077827876,396.8476769260929" fill="none" stroke="purple" stroke-width="1" />
84
- </g>
85
- <g>
86
- <rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="39.999999999999986" y="374.8911978043521" width="230.54303077827876" height="109.78239560870418" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.009108928571428572" />
87
- </g>
88
- <g>
89
- <rect data-type="rect" data-label="schematic_component_1" data-x="2" data-y="2" x="259.56479121740836" y="155.32640658694373" width="230.54303077827876" height="109.78239560870418" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.009108928571428572" />
90
- </g>
91
- <g>
92
- <rect data-type="rect" data-label="netId: VCC
93
- globalConnNetId: connectivity_net1" data-x="2.1510000000000002" data-y="0.54" x="380.43520878259164" y="344.1521270339149" width="21.95647912174087" height="52.69554989217801" fill="#ef444466" stroke="#ef4444" stroke-width="0.009108928571428572" />
94
- </g>
95
- <g>
96
- <rect data-type="rect" data-label="netId: U1.CLK to U2.VCC
97
- globalConnNetId: connectivity_net0" data-x="1.551" data-y="-0.10000000000000003" x="270.65281317388747" y="429.7823956087042" width="109.78239560870418" height="21.956479121740813" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.009108928571428572" />
98
- </g>
99
- <g>
100
- <rect data-type="rect" data-label="netId: U1.CLK to U2.VCC
101
- globalConnNetId: connectivity_net0" data-x="3.5509999999999997" data-y="2.3" x="490.2176043912958" y="166.30464614781414" width="109.78239560870418" height="21.95647912174087" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.009108928571428572" />
102
- </g>
103
- <g id="crosshair" style="display: none">
104
- <line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5" />
105
- <line id="crosshair-v" x1="0" x2="640" stroke="#666" stroke-width="0.5" /><text id="coordinates" font-family="monospace" font-size="12" fill="#666"></text>
106
- </g>
107
- <script>
108
- <![CDATA[
109
- document.currentScript.parentElement.addEventListener('mousemove', (e) => {
110
- const svg = e.currentTarget;
111
- const rect = svg.getBoundingClientRect();
112
- const x = e.clientX - rect.left;
113
- const y = e.clientY - rect.top;
114
- const crosshair = svg.getElementById('crosshair');
115
- const h = svg.getElementById('crosshair-h');
116
- const v = svg.getElementById('crosshair-v');
117
- const coords = svg.getElementById('coordinates');
1
+ <svg width="640" height="640" viewBox="0 0 640 640" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="white"/><g><polyline data-points="1.05,-0.10000000000000003 3.05,2.3" data-type="line" data-label="" points="270.54303077827876,440.7606351695746 490.1078219956871,177.28288570868457" fill="none" stroke="hsl(88, 100%, 50%, 0.8)" stroke-width="1px"/></g><g><polyline data-points="1.05,-0.30000000000000004 1.05,0.30000000000000004" data-type="line" data-label="" points="270.54303077827876,462.71711429131545 270.54303077827876,396.8476769260929" fill="none" stroke="hsl(190, 100%, 50%, 0.8)" stroke-width="1px" stroke-dasharray="4 2"/></g><g><polyline data-points="1.05,-0.30000000000000004 2.1510000000000002,-0.30000000000000004 2.1510000000000002,0.30000000000000004 1.05,0.30000000000000004" data-type="line" data-label="" points="270.54303077827876,462.71711429131545 391.4134483434621,462.71711429131545 391.4134483434621,396.8476769260929 270.54303077827876,396.8476769260929" fill="none" stroke="purple" stroke-width="1px"/></g><g><rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="40" y="374.8911978043521" width="230.54303077827876" height="109.78239560870418" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.009108928571428572"/></g><g><rect data-type="rect" data-label="schematic_component_1" data-x="2" data-y="2" x="259.56479121740836" y="155.32640658694373" width="230.54303077827876" height="109.78239560870418" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.009108928571428572"/></g><g><rect data-type="rect" data-label="netId: VCC
2
+ globalConnNetId: connectivity_net1" data-x="2.1510000000000002" data-y="0.54" x="380.43520878259164" y="344.1521270339149" width="21.95647912174087" height="52.69554989217801" fill="#ef444466" stroke="#ef4444" stroke-width="0.009108928571428572"/></g><g><rect data-type="rect" data-label="netId: U1.CLK to U2.VCC
3
+ globalConnNetId: connectivity_net0" data-x="1.551" data-y="-0.10000000000000003" x="270.65281317388747" y="429.7823956087042" width="109.78239560870418" height="21.956479121740813" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.009108928571428572"/></g><g><rect data-type="rect" data-label="netId: U1.CLK to U2.VCC
4
+ globalConnNetId: connectivity_net0" data-x="3.5509999999999997" data-y="2.3" x="490.2176043912959" y="166.30464614781414" width="109.78239560870418" height="21.95647912174087" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.009108928571428572"/></g><g><circle data-type="point" data-label="U1.1
5
+ x-" data-x="-1.05" data-y="0.30000000000000004" cx="39.999999999999986" cy="396.8476769260929" r="3" fill="hsl(319, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.2
6
+ x-" data-x="-1.05" data-y="0.10000000000000003" cx="39.999999999999986" cy="418.80415604783377" r="3" fill="hsl(320, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.3
7
+ x-" data-x="-1.05" data-y="-0.09999999999999998" cx="39.999999999999986" cy="440.7606351695746" r="3" fill="hsl(321, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.4
8
+ x-" data-x="-1.05" data-y="-0.30000000000000004" cx="39.999999999999986" cy="462.71711429131545" r="3" fill="hsl(322, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.5
9
+ x+" data-x="1.05" data-y="-0.30000000000000004" cx="270.54303077827876" cy="462.71711429131545" r="3" fill="hsl(323, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.6
10
+ x+" data-x="1.05" data-y="-0.10000000000000003" cx="270.54303077827876" cy="440.7606351695746" r="3" fill="hsl(324, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.7
11
+ x+" data-x="1.05" data-y="0.09999999999999998" cx="270.54303077827876" cy="418.80415604783377" r="3" fill="hsl(325, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U1.8
12
+ x+" data-x="1.05" data-y="0.30000000000000004" cx="270.54303077827876" cy="396.8476769260929" r="3" fill="hsl(326, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.1
13
+ x-" data-x="0.95" data-y="2.3" cx="259.56479121740836" cy="177.28288570868457" r="3" fill="hsl(200, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.2
14
+ x-" data-x="0.95" data-y="2.1" cx="259.56479121740836" cy="199.2393648304254" r="3" fill="hsl(201, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.3
15
+ x-" data-x="0.95" data-y="1.9" cx="259.56479121740836" cy="221.19584395216626" r="3" fill="hsl(202, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.4
16
+ x-" data-x="0.95" data-y="1.7" cx="259.56479121740836" cy="243.15232307390707" r="3" fill="hsl(203, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.5
17
+ x+" data-x="3.05" data-y="1.7" cx="490.1078219956871" cy="243.15232307390707" r="3" fill="hsl(204, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.6
18
+ x+" data-x="3.05" data-y="1.9" cx="490.1078219956871" cy="221.19584395216626" r="3" fill="hsl(205, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.7
19
+ x+" data-x="3.05" data-y="2.1" cx="490.1078219956871" cy="199.2393648304254" r="3" fill="hsl(206, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="U2.8
20
+ x+" data-x="3.05" data-y="2.3" cx="490.1078219956871" cy="177.28288570868457" r="3" fill="hsl(207, 100%, 50%, 0.8)"/></g><g><circle data-type="point" data-label="anchorPoint
21
+ orientation: y+" data-x="2.1510000000000002" data-y="0.30000000000000004" cx="391.4134483434621" cy="396.8476769260929" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
22
+ orientation: x+" data-x="1.05" data-y="-0.10000000000000003" cx="270.54303077827876" cy="440.7606351695746" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g><circle data-type="point" data-label="anchorPoint
23
+ orientation: x+" data-x="3.05" data-y="2.3" cx="490.1078219956871" cy="177.28288570868457" r="3" fill="hsl(40, 100%, 50%, 0.9)"/></g><g id="crosshair" style="display: none"><line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5"/><line id="crosshair-v" x1="0" x2="640" stroke="#666" stroke-width="0.5"/><text id="coordinates" font-family="monospace" font-size="12" fill="#666"></text></g><script><![CDATA[
24
+ document.currentScript.parentElement.addEventListener('mousemove', (e) => {
25
+ const svg = e.currentTarget;
26
+ const rect = svg.getBoundingClientRect();
27
+ const x = e.clientX - rect.left;
28
+ const y = e.clientY - rect.top;
29
+ const crosshair = svg.getElementById('crosshair');
30
+ const h = svg.getElementById('crosshair-h');
31
+ const v = svg.getElementById('crosshair-v');
32
+ const coords = svg.getElementById('coordinates');
33
+
34
+ crosshair.style.display = 'block';
35
+ h.setAttribute('x1', '0');
36
+ h.setAttribute('x2', '640');
37
+ h.setAttribute('y1', y);
38
+ h.setAttribute('y2', y);
39
+ v.setAttribute('x1', x);
40
+ v.setAttribute('x2', x);
41
+ v.setAttribute('y1', '0');
42
+ v.setAttribute('y2', '640');
118
43
 
119
- crosshair.style.display = 'block';
120
- h.setAttribute('x1', '0');
121
- h.setAttribute('x2', '640');
122
- h.setAttribute('y1', y);
123
- h.setAttribute('y2', y);
124
- v.setAttribute('x1', x);
125
- v.setAttribute('x2', x);
126
- v.setAttribute('y1', '0');
127
- v.setAttribute('y2', '640');
128
-
129
- // Calculate real coordinates using inverse transformation
130
- const matrix = {
131
- "a": 109.78239560870418,
132
- "c": 0,
133
- "e": 155.27151538913938,
134
- "b": 0,
135
- "d": -109.78239560870418,
136
- "f": 429.7823956087042
137
- };
138
- // Manually invert and apply the affine transform
139
- // Since we only use translate and scale, we can directly compute:
140
- // x' = (x - tx) / sx
141
- // y' = (y - ty) / sy
142
- const sx = matrix.a;
143
- const sy = matrix.d;
144
- const tx = matrix.e;
145
- const ty = matrix.f;
146
- const realPoint = {
147
- x: (x - tx) / sx,
148
- y: (y - ty) / sy // Flip y back since we used negative scale
149
- }
150
-
151
- coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
152
- coords.setAttribute('x', (x + 5).toString());
153
- coords.setAttribute('y', (y - 5).toString());
154
- });
155
- document.currentScript.parentElement.addEventListener('mouseleave', () => {
156
- document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
157
- });
158
- ]]>
159
- </script>
160
- </svg>
44
+ // Calculate real coordinates using inverse transformation
45
+ const matrix = {"a":109.78239560870418,"c":0,"e":155.27151538913938,"b":0,"d":-109.78239560870418,"f":429.7823956087042};
46
+ // Manually invert and apply the affine transform
47
+ // Since we only use translate and scale, we can directly compute:
48
+ // x' = (x - tx) / sx
49
+ // y' = (y - ty) / sy
50
+ const sx = matrix.a;
51
+ const sy = matrix.d;
52
+ const tx = matrix.e;
53
+ const ty = matrix.f;
54
+ const realPoint = {
55
+ x: (x - tx) / sx,
56
+ y: (y - ty) / sy // Flip y back since we used negative scale
57
+ }
58
+
59
+ coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
60
+ coords.setAttribute('x', (x + 5).toString());
61
+ coords.setAttribute('y', (y - 5).toString());
62
+ });
63
+ document.currentScript.parentElement.addEventListener('mouseleave', () => {
64
+ document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
65
+ });
66
+ ]]></script></svg>