@tscircuit/pcb-viewer 1.3.14 → 1.4.1

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 tscircuit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  Render PCBs w/ React
8
8
 
9
+ ![image](https://github.com/tscircuit/pcb-viewer/assets/1910070/e010f44e-b8c0-4e1d-9d59-1ea66716427f)
10
+
9
11
  ## Usage
10
12
 
11
13
  ```
package/dist/index.js CHANGED
@@ -976,6 +976,18 @@ var drawCircle = function(drawer, circle) {
976
976
  });
977
977
  drawer.circle(circle.x, circle.y, circle.r);
978
978
  };
979
+ var drawOval = function(drawer, oval) {
980
+ drawer.equip({
981
+ color: oval.layer
982
+ });
983
+ drawer.oval(oval.x, oval.y, oval.rX, oval.rY);
984
+ };
985
+ var drawPill = function(drawer, pill) {
986
+ drawer.equip({
987
+ color: pill.layer
988
+ });
989
+ drawer.pill(pill.x, pill.y, pill.w, pill.h);
990
+ };
979
991
  var drawPrimitive = function(drawer, primitive) {
980
992
  switch(primitive.pcb_drawing_type){
981
993
  case "line":
@@ -986,8 +998,11 @@ var drawPrimitive = function(drawer, primitive) {
986
998
  return drawRect(drawer, primitive);
987
999
  case "circle":
988
1000
  return drawCircle(drawer, primitive);
1001
+ case "oval":
1002
+ return drawOval(drawer, primitive);
1003
+ case "pill":
1004
+ return drawPill(drawer, primitive);
989
1005
  }
990
- throw new Error("Unknown primitive type: ".concat(primitive.pcb_drawing_type));
991
1006
  };
992
1007
  var drawPrimitives = function(drawer, primitives) {
993
1008
  primitives.sort(function(a, b) {
@@ -1372,6 +1387,44 @@ var Drawer = /*#__PURE__*/ function() {
1372
1387
  ctx.closePath();
1373
1388
  }
1374
1389
  },
1390
+ {
1391
+ key: "oval",
1392
+ value: function oval(x, y, rx, ry) {
1393
+ var rx$ = scaleOnly(this.transform, rx);
1394
+ var ry$ = scaleOnly(this.transform, ry);
1395
+ var _ref = _sliced_to_array((0, import_transformation_matrix.applyToPoint)(this.transform, [
1396
+ x,
1397
+ y
1398
+ ]), 2), x$ = _ref[0], y$ = _ref[1];
1399
+ this.applyAperture();
1400
+ var ctx = this.getLayerCtx();
1401
+ ctx.beginPath();
1402
+ ctx.ellipse(x$, y$, rx$, ry$, 0, 0, 2 * Math.PI);
1403
+ ctx.fill();
1404
+ ctx.closePath();
1405
+ }
1406
+ },
1407
+ {
1408
+ key: "pill",
1409
+ value: function pill(x, y, w, h) {
1410
+ var _ref = _sliced_to_array((0, import_transformation_matrix.applyToPoint)(this.transform, [
1411
+ x - w / 2,
1412
+ y + h / 2
1413
+ ]), 2), x$ = _ref[0], y$ = _ref[1];
1414
+ var width$ = scaleOnly(this.transform, w);
1415
+ var height$ = scaleOnly(this.transform, h);
1416
+ var radius = Math.min(width$, height$) / 2;
1417
+ this.applyAperture();
1418
+ var ctx = this.getLayerCtx();
1419
+ ctx.beginPath();
1420
+ ctx.arc(x$ + radius, y$ + radius, radius, Math.PI, Math.PI * 1.5);
1421
+ ctx.arc(x$ + width$ - radius, y$ + radius, radius, Math.PI * 1.5, 0);
1422
+ ctx.arc(x$ + width$ - radius, y$ + height$ - radius, radius, 0, Math.PI * 0.5);
1423
+ ctx.arc(x$ + radius, y$ + height$ - radius, radius, Math.PI * 0.5, Math.PI);
1424
+ ctx.fill();
1425
+ ctx.closePath();
1426
+ }
1427
+ },
1375
1428
  {
1376
1429
  /* NOTE: This is not gerber compatible */ key: "debugText",
1377
1430
  value: function debugText(text, x, y) {
@@ -1748,29 +1801,83 @@ var convertElementToPrimitives = function(element, allElements) {
1748
1801
  }
1749
1802
  case "pcb_plated_hole":
1750
1803
  {
1751
- var x3 = element.x, y3 = element.y, hole_diameter1 = element.hole_diameter, outer_diameter = element.outer_diameter;
1752
- return [
1753
- {
1754
- pcb_drawing_type: "circle",
1755
- x: x3,
1756
- y: y3,
1757
- r: outer_diameter / 2,
1758
- // TODO support layer on pcb_plated_hole
1759
- layer: "top",
1760
- _element: element,
1761
- _parent_pcb_component: _parent_pcb_component,
1762
- _parent_source_component: _parent_source_component,
1763
- _source_port: _source_port
1764
- },
1765
- {
1766
- pcb_drawing_type: "circle",
1767
- x: x3,
1768
- y: y3,
1769
- r: hole_diameter1 / 2,
1770
- // TODO support layer on pcb_plated_hole
1771
- layer: "drill"
1772
- }
1773
- ];
1804
+ if (element.shape === "circle") {
1805
+ var x3 = element.x, y3 = element.y, hole_diameter1 = element.hole_diameter, outer_diameter = element.outer_diameter;
1806
+ return [
1807
+ {
1808
+ pcb_drawing_type: "circle",
1809
+ x: x3,
1810
+ y: y3,
1811
+ r: outer_diameter / 2,
1812
+ // TODO support layer on pcb_plated_hole
1813
+ layer: "top",
1814
+ _element: element,
1815
+ _parent_pcb_component: _parent_pcb_component,
1816
+ _parent_source_component: _parent_source_component,
1817
+ _source_port: _source_port
1818
+ },
1819
+ {
1820
+ pcb_drawing_type: "circle",
1821
+ x: x3,
1822
+ y: y3,
1823
+ r: hole_diameter1 / 2,
1824
+ // TODO support layer on pcb_plated_hole
1825
+ layer: "drill"
1826
+ }
1827
+ ];
1828
+ } else if (element.shape === "oval") {
1829
+ var x4 = element.x, y4 = element.y, outer_height = element.outer_height, outer_width = element.outer_width, hole_height = element.hole_height, hole_width = element.hole_width;
1830
+ return [
1831
+ {
1832
+ pcb_drawing_type: "oval",
1833
+ x: x4,
1834
+ y: y4,
1835
+ rX: outer_width / 2,
1836
+ rY: outer_height / 2,
1837
+ layer: "top",
1838
+ // TODO: Confirm layer handling for oval plated holes
1839
+ _element: element,
1840
+ _parent_pcb_component: _parent_pcb_component,
1841
+ _parent_source_component: _parent_source_component,
1842
+ _source_port: _source_port
1843
+ },
1844
+ {
1845
+ pcb_drawing_type: "oval",
1846
+ x: x4,
1847
+ y: y4,
1848
+ rX: hole_width / 2,
1849
+ rY: hole_height / 2,
1850
+ layer: "drill"
1851
+ }
1852
+ ];
1853
+ } else if (element.shape === "pill") {
1854
+ var x5 = element.x, y5 = element.y, outer_height1 = element.outer_height, outer_width1 = element.outer_width, hole_height1 = element.hole_height, hole_width1 = element.hole_width;
1855
+ return [
1856
+ {
1857
+ pcb_drawing_type: "pill",
1858
+ x: x5,
1859
+ y: y5,
1860
+ w: outer_width1,
1861
+ h: outer_height1,
1862
+ layer: "top",
1863
+ // TODO: Confirm layer handling for oval plated holes
1864
+ _element: element,
1865
+ _parent_pcb_component: _parent_pcb_component,
1866
+ _parent_source_component: _parent_source_component,
1867
+ _source_port: _source_port
1868
+ },
1869
+ {
1870
+ pcb_drawing_type: "pill",
1871
+ x: x5,
1872
+ y: y5,
1873
+ w: hole_width1,
1874
+ h: hole_height1,
1875
+ layer: "drill"
1876
+ }
1877
+ ];
1878
+ } else {
1879
+ return [];
1880
+ }
1774
1881
  }
1775
1882
  case "pcb_trace":
1776
1883
  {
@@ -1816,12 +1923,12 @@ var convertElementToPrimitives = function(element, allElements) {
1816
1923
  }
1817
1924
  case "pcb_via":
1818
1925
  {
1819
- var x4 = element.x, y4 = element.y, outer_diameter1 = element.outer_diameter, hole_diameter2 = element.hole_diameter, from_layer = element.from_layer, to_layer = element.to_layer;
1926
+ var x6 = element.x, y6 = element.y, outer_diameter1 = element.outer_diameter, hole_diameter2 = element.hole_diameter, from_layer = element.from_layer, to_layer = element.to_layer;
1820
1927
  return [
1821
1928
  {
1822
1929
  pcb_drawing_type: "circle",
1823
- x: x4,
1824
- y: y4,
1930
+ x: x6,
1931
+ y: y6,
1825
1932
  r: outer_diameter1 / 2,
1826
1933
  layer: from_layer,
1827
1934
  _element: element,
@@ -1830,8 +1937,8 @@ var convertElementToPrimitives = function(element, allElements) {
1830
1937
  },
1831
1938
  {
1832
1939
  pcb_drawing_type: "circle",
1833
- x: x4,
1834
- y: y4,
1940
+ x: x6,
1941
+ y: y6,
1835
1942
  r: hole_diameter2 / 2,
1836
1943
  layer: "drill",
1837
1944
  _element: element,
@@ -1840,8 +1947,8 @@ var convertElementToPrimitives = function(element, allElements) {
1840
1947
  },
1841
1948
  {
1842
1949
  pcb_drawing_type: "circle",
1843
- x: x4,
1844
- y: y4,
1950
+ x: x6,
1951
+ y: y6,
1845
1952
  r: outer_diameter1 / 2,
1846
1953
  layer: to_layer,
1847
1954
  _element: element,
@@ -1875,6 +1982,32 @@ var convertElementToPrimitives = function(element, allElements) {
1875
1982
  }
1876
1983
  ];
1877
1984
  }
1985
+ case "pcb_silkscreen_oval":
1986
+ {
1987
+ return [
1988
+ {
1989
+ pcb_drawing_type: "oval",
1990
+ x: element.center.x,
1991
+ y: element.center.y,
1992
+ rX: element.radius_x / 2,
1993
+ rY: element.radius_y / 2,
1994
+ layer: element.layer === "bottom" ? "bottom_silkscreen" : "top_silkscreen"
1995
+ }
1996
+ ];
1997
+ }
1998
+ case "pcb_silkscreen_pill":
1999
+ {
2000
+ return [
2001
+ {
2002
+ pcb_drawing_type: "pill",
2003
+ x: element.center.x,
2004
+ y: element.center.y,
2005
+ w: element.width,
2006
+ h: element.height,
2007
+ layer: element.layer === "bottom" ? "bottom_silkscreen" : "top_silkscreen"
2008
+ }
2009
+ ];
2010
+ }
1878
2011
  case "pcb_silkscreen_line":
1879
2012
  {
1880
2013
  return [
@@ -2444,7 +2577,7 @@ var import_builder2 = require("@tscircuit/builder");
2444
2577
  // package.json
2445
2578
  var package_default = {
2446
2579
  name: "@tscircuit/pcb-viewer",
2447
- version: "1.3.13",
2580
+ version: "1.4.0",
2448
2581
  main: "dist/index.js",
2449
2582
  repository: "tscircuit/pcb-viewer",
2450
2583
  license: "MIT",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/@tscircuit/soup-util/index.ts","../node_modules/use-mouse-matrix-transform/src/index.ts","../src/index.tsx","../src/PCBViewer.tsx","../src/components/CanvasPrimitiveRenderer.tsx","../src/assets/alphabet.ts","../src/lib/convert-text-to-lines.ts","../src/lib/draw-primitives.ts","../src/lib/util/scale-only.ts","../src/lib/Drawer.ts","../src/lib/colors.ts","../src/global-store.ts","../src/components/ContextProviders.tsx","../src/components/CanvasElementsRenderer.tsx","../src/lib/convert-element-to-primitive.ts","../src/components/MouseElementTracker.tsx","../src/components/ElementOverlayBox.tsx","../src/components/DimensionOverlay.tsx","../src/components/ToolbarOverlay.tsx","../package.json","../src/components/ErrorOverlay.tsx","../src/components/EditPlacementOverlay.tsx","../src/components/EditTraceHintOverlay.tsx","../src/components/HotkeyActionMenu.tsx","../node_modules/react-use/esm/misc/util.js","../node_modules/react-use/esm/useIsomorphicLayoutEffect.js","../node_modules/react-use/esm/useMeasure.js","../src/lib/apply-edit-events.ts","../src/lib/apply-edit-events/apply-edit-trace-hint-event.ts"],"names":["__export","su","module","__toCommonJS","src_exports","useMouseMatrixTransform","import_transformation_matrix","import_react","import_builder","createZustandStore","useZustandStore","import_jsx_runtime","highlightedPrimitives","mousedPrimitives","container","import_css","el","e","isInsideOf","primitives","_a","import_soup_util","height","elements"],"mappings":"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","sourcesContent":["import type {\n AnySoupElement,\n AnySoupElementInput,\n SourceComponentBase,\n SourcePort,\n} from \"@tscircuit/soup\"\n\ntype SoupOps<\n K extends AnySoupElement[\"type\"],\n T extends AnySoupElement | AnySoupElementInput\n> = {\n get: (id: string) => Extract<T, { type: K }> | null\n select: (selector: string) => Extract<T, { type: K }> | null\n getWhere: (where: any) => Extract<T, { type: K }> | null\n getUsing: (using: {\n [key: `${string}_id`]: string\n }) => Extract<T, { type: K }> | null\n list: (where?: any) => Extract<T, { type: K }>[]\n}\n\nexport type SoupUtilObject = {\n [K in AnySoupElement[\"type\"]]: SoupOps<K, AnySoupElement>\n}\nexport type SoupInputUtilObject = {\n [K in AnySoupElementInput[\"type\"]]: SoupOps<K, AnySoupElementInput>\n}\n\nexport type GetSoupUtilObject = ((soup: AnySoupElement[]) => SoupUtilObject) & {\n unparsed: (soup: AnySoupElementInput[]) => SoupInputUtilObject\n}\n\nexport const su: GetSoupUtilObject = ((soup: AnySoupElement[]) => {\n const su = new Proxy(\n {},\n {\n get: (proxy_target: any, component_type: string) => {\n return {\n get: (id: string) =>\n soup.find(\n (e: any) =>\n e.type === component_type && e[`${component_type}_id`] === id\n ),\n getUsing: (using: any) => {\n const keys = Object.keys(using)\n if (keys.length !== 1) {\n throw new Error(\n \"getUsing requires exactly one key, e.g. { pcb_component_id }\"\n )\n }\n const join_key = keys[0] as string\n const join_type = join_key.replace(\"_id\", \"\")\n const joiner: any = soup.find(\n (e: any) =>\n e.type === join_type && e[join_key] === using[join_key]\n )\n if (!joiner) return null\n return soup.find(\n (e: any) =>\n e.type === component_type &&\n e[`${component_type}_id`] === joiner[`${component_type}_id`]\n )\n },\n getWhere: (where: any) => {\n const keys = Object.keys(where)\n return soup.find(\n (e: any) =>\n e.type === component_type &&\n keys.every((key) => e[key] === where[key])\n )\n },\n list: (where?: any) => {\n const keys = !where ? [] : Object.keys(where)\n return soup.filter(\n (e: any) =>\n e.type === component_type &&\n keys.every((key) => e[key] === where[key])\n )\n },\n select: (selector: string) => {\n // TODO when applySelector is isolated we can use it, until then we\n // do a poor man's selector implementation for two common cases\n if (component_type === \"source_component\") {\n return soup.find(\n (e) =>\n e.type === \"source_component\" &&\n e.name === selector.replace(/\\./g, \"\")\n )\n } else if (\n component_type === \"pcb_port\" ||\n component_type === \"source_port\" ||\n component_type === \"schematic_port\"\n ) {\n const [component_name, port_selector] = selector\n .replace(/\\./g, \"\")\n .split(/[\\s\\>]+/)\n const source_component = soup.find(\n (e) =>\n e.type === \"source_component\" && e.name === component_name\n ) as SourceComponentBase\n if (!source_component) return null\n const source_port = soup.find(\n (e) =>\n e.type === \"source_port\" &&\n e.source_component_id ===\n source_component.source_component_id &&\n (e.name === port_selector ||\n (e.port_hints ?? []).includes(port_selector!))\n ) as SourcePort\n if (!source_port) return null\n if (component_type === \"source_port\") return source_port\n\n if (component_type === \"pcb_port\") {\n return soup.find(\n (e) =>\n e.type === \"pcb_port\" &&\n e.source_port_id === source_port.source_port_id\n )\n } else if (component_type === \"schematic_port\") {\n return soup.find(\n (e) =>\n e.type === \"schematic_port\" &&\n e.source_port_id === source_port.source_port_id\n )\n }\n }\n },\n }\n },\n }\n )\n\n return su\n}) as any\nsu.unparsed = su as any\n\nexport default su\n","import {\n Matrix,\n identity,\n scale,\n translate,\n compose,\n applyToPoint,\n} from \"transformation-matrix\"\nimport { useCallback, useEffect, useReducer, useRef, useState } from \"react\"\n\ntype Point = { x: number; y: number }\n\ninterface Props {\n canvasElm?: HTMLElement\n transform?: Matrix\n initialTransform?: Matrix\n onSetTransform?: (transform: Matrix) => any\n}\n\nexport const useMouseMatrixTransform = (props: Props = {}) => {\n const extRef = useRef<any>(null)\n const [lastDragCancelTime, setLastDragCancelTime] = useState(0)\n const outerCanvasElm = props.canvasElm ?? extRef.current\n const [internalTransform, setInternalTransform] = useState<Matrix>(\n props.initialTransform ?? identity()\n )\n const [waitCounter, setWaitCounter] = useState(0)\n const [extChangeCounter, incExtChangeCounter] = useReducer((s) => s + 1, 0)\n\n const setTransform = useCallback(\n (newTransform: Matrix) => {\n if (props.onSetTransform) {\n props.onSetTransform(newTransform)\n }\n if (!props.transform) {\n setInternalTransform(newTransform)\n }\n },\n [props.onSetTransform, setInternalTransform]\n )\n\n const setTransformExt = useCallback(\n (newTransform: Matrix) => {\n setTransform(newTransform)\n incExtChangeCounter()\n },\n [setTransform]\n )\n\n const transform = props.transform ?? internalTransform\n\n const cancelDrag = useCallback(() => {\n setLastDragCancelTime(Date.now())\n }, [])\n\n useEffect(() => {\n const canvasElm: HTMLCanvasElement | null =\n props.canvasElm ?? extRef.current\n if (canvasElm && !outerCanvasElm) {\n // Always re-render when the canvas element is known\n setWaitCounter(waitCounter + 1)\n return\n }\n if (!canvasElm) {\n const timeout = setTimeout(() => {\n setWaitCounter(waitCounter + 1)\n }, 100)\n return () => clearTimeout(timeout)\n }\n let init_tf = props.transform ?? internalTransform\n\n let m0: Point = { x: 0, y: 0 },\n m1: Point = { x: 0, y: 0 },\n md = false,\n mlastrel: Point = { x: 0, y: 0 }\n\n const getMousePos = (e: MouseEvent) => {\n return {\n x: e.pageX - canvasElm.getBoundingClientRect().left - window.scrollX,\n y: e.pageY - canvasElm.getBoundingClientRect().top - window.scrollY,\n }\n }\n\n function handleMouseDown(e: MouseEvent) {\n m0 = getMousePos(e)\n if (Date.now() - lastDragCancelTime < 100) return\n md = true\n e.preventDefault()\n }\n function handleMouseUp(e: MouseEvent) {\n if (!md) return\n m1 = getMousePos(e)\n\n const new_tf = compose(translate(m1.x - m0.x, m1.y - m0.y), init_tf)\n setTransform(new_tf)\n init_tf = new_tf\n\n md = false\n }\n function handleMouseMove(e: MouseEvent) {\n mlastrel = getMousePos(e)\n if (!md) return\n m1 = getMousePos(e)\n\n setTransform(compose(translate(m1.x - m0.x, m1.y - m0.y), init_tf))\n }\n function handleMouseWheel(e: WheelEvent) {\n const center = getMousePos(e)\n const new_tf = compose(\n translate(center.x, center.y),\n scale(1 - e.deltaY / 1000, 1 - e.deltaY / 1000),\n translate(-center.x, -center.y),\n init_tf\n )\n setTransform(new_tf)\n init_tf = new_tf\n e.preventDefault()\n }\n function handleMouseOut(e: MouseEvent) {\n if (!md) return\n\n // If the mouseout occurs in the bounding box of the canvasElm, it's\n // defocusing on internal elements, so we should ignore it\n if (canvasElm) {\n const boundingBox = canvasElm.getBoundingClientRect()\n if (\n e.clientX >= boundingBox.left + 10 &&\n e.clientX <= boundingBox.right - 10 &&\n e.clientY >= boundingBox.top + 10 &&\n e.clientY <= boundingBox.bottom - 10\n ) {\n return\n }\n }\n\n md = false\n m1 = getMousePos(e)\n\n const new_tf = compose(translate(m1.x - m0.x, m1.y - m0.y), init_tf)\n setTransform(new_tf)\n init_tf = new_tf\n }\n\n canvasElm.addEventListener(\"mousedown\", handleMouseDown)\n canvasElm.addEventListener(\"mouseup\", handleMouseUp)\n window.addEventListener(\"mousemove\", handleMouseMove)\n canvasElm.addEventListener(\"mouseout\", handleMouseOut)\n canvasElm.addEventListener(\"wheel\", handleMouseWheel)\n\n return () => {\n canvasElm.removeEventListener(\"mousedown\", handleMouseDown)\n canvasElm.removeEventListener(\"mouseup\", handleMouseUp)\n window.removeEventListener(\"mousemove\", handleMouseMove)\n canvasElm.removeEventListener(\"mouseout\", handleMouseOut)\n canvasElm.removeEventListener(\"wheel\", handleMouseWheel)\n }\n }, [outerCanvasElm, waitCounter, extChangeCounter, lastDragCancelTime])\n\n const applyTransformToPoint = useCallback(\n (obj: Point | [number, number]) => applyToPoint(transform, obj),\n [transform]\n )\n\n return {\n ref: extRef,\n transform,\n applyTransformToPoint,\n setTransform: setTransformExt,\n cancelDrag\n }\n}\n\nexport default useMouseMatrixTransform\n","export * from \"./PCBViewer\"\nexport type { EditEvent } from \"lib/edit-events\"\nexport { applyEditEvents } from \"lib/apply-edit-events\"\nexport { CanvasElementsRenderer } from \"./components/CanvasElementsRenderer\"\n","import React, { useEffect, useMemo, useState } from \"react\"\nimport { createRoot } from \"@tscircuit/react-fiber\"\nimport { createProjectBuilder } from \"@tscircuit/builder\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport { CanvasElementsRenderer } from \"./components/CanvasElementsRenderer\"\nimport useMouseMatrixTransform from \"use-mouse-matrix-transform\"\nimport { useMeasure } from \"react-use\"\nimport { compose, scale, translate } from \"transformation-matrix\"\nimport { findBoundsAndCenter } from \"@tscircuit/builder\"\nimport { ContextProviders } from \"components/ContextProviders\"\nimport type { EditEvent } from \"lib/edit-events\"\nimport { applyEditEvents } from \"lib/apply-edit-events\"\n\nconst defaultTransform = compose(translate(400, 300), scale(40, -40))\n\ntype Props = {\n children?: any\n soup?: any\n height?: number\n allowEditing?: boolean\n editEvents?: EditEvent[]\n onEditEventsChanged?: (editEvents: EditEvent[]) => void\n}\n\nexport const PCBViewer = ({\n children,\n soup,\n height = 600,\n allowEditing = true,\n editEvents: editEventsProp,\n onEditEventsChanged,\n}: Props) => {\n const [stateElements, setStateElements] = useState<Array<AnySoupElement>>([])\n const [ref, refDimensions] = useMeasure()\n const [transform, setTransformInternal] = useState(defaultTransform)\n const {\n ref: transformRef,\n setTransform,\n cancelDrag: cancelPanDrag,\n } = useMouseMatrixTransform({\n transform,\n onSetTransform: setTransformInternal,\n })\n let [editEvents, setEditEvents] = useState<EditEvent[]>([])\n editEvents = editEventsProp ?? editEvents\n\n const [error, setError] = useState(null)\n\n const resetTransform = () => {\n const elmBounds =\n refDimensions?.width > 0 ? refDimensions : { width: 500, height: 500 }\n const { center, width, height } = elements.some((e) =>\n e.type.startsWith(\"pcb_\"),\n )\n ? findBoundsAndCenter(\n elements.filter((e) => e.type.startsWith(\"pcb_\")) as any,\n )\n : { center: { x: 0, y: 0 }, width: 0.001, height: 0.001 }\n const scaleFactor =\n Math.min(\n (elmBounds.width ?? 0) / width,\n (elmBounds.height ?? 0) / height,\n 100,\n ) * 0.75\n setTransform(\n compose(\n translate((elmBounds.width ?? 0) / 2, (elmBounds.height ?? 0) / 2),\n // translate(100, 0),\n scale(scaleFactor, -scaleFactor, 0, 0),\n translate(-center.x, -center.y),\n ),\n )\n }\n\n useEffect(() => {\n if (!children || children?.length === 0) return\n async function doRender() {\n // TODO re-use project builder\n const projectBuilder = createProjectBuilder()\n await createRoot()\n .render(children, projectBuilder as any)\n .then((elements) => {\n setStateElements(elements as any)\n setError(null)\n })\n }\n doRender().catch((e) => {\n setError(e.toString())\n console.log(e.toString())\n })\n }, [children])\n\n useEffect(() => {\n if (refDimensions && refDimensions.width !== 0 && (children || soup)) {\n resetTransform()\n }\n }, [children, refDimensions])\n\n if (error) return <div style={{ color: \"red\" }}> {error} </div>\n\n const pcbElmsPreEdit: AnySoupElement[] = (soup ?? stateElements).filter(\n (e: any) => e.type.startsWith(\"pcb_\") || e.type.startsWith(\"source_\"),\n )\n\n const elements = useMemo(() => {\n return applyEditEvents(pcbElmsPreEdit, editEvents)\n }, [pcbElmsPreEdit, editEvents])\n\n const onCreateEditEvent = (event: EditEvent) => {\n setEditEvents([...editEvents, event])\n onEditEventsChanged?.([...editEvents, event])\n }\n const onModifyEditEvent = (modifiedEvent: Partial<EditEvent>) => {\n const newEditEvents: EditEvent[] = editEvents.map((e) =>\n e.edit_event_id === modifiedEvent.edit_event_id\n ? ({ ...e, ...modifiedEvent } as EditEvent)\n : e,\n )\n setEditEvents(newEditEvents)\n onEditEventsChanged?.(newEditEvents)\n }\n\n return (\n <div ref={transformRef as any}>\n <div ref={ref as any}>\n <ContextProviders>\n <CanvasElementsRenderer\n key={refDimensions.width}\n transform={transform}\n height={height}\n width={refDimensions.width}\n allowEditing={allowEditing}\n cancelPanDrag={cancelPanDrag}\n onCreateEditEvent={onCreateEditEvent}\n onModifyEditEvent={onModifyEditEvent}\n grid={{\n spacing: 1,\n view_window: {\n left: 0,\n right: refDimensions.width || 500,\n top: height,\n bottom: 0,\n },\n }}\n elements={elements}\n />\n </ContextProviders>\n </div>\n </div>\n )\n}\n","import { drawGrid } from \"lib/draw-grid\"\nimport { SuperGrid, toMMSI } from \"react-supergrid\"\nimport React, { useEffect, useRef } from \"react\"\nimport { Matrix } from \"transformation-matrix\"\nimport { drawPrimitives } from \"../lib/draw-primitives\"\nimport { Drawer } from \"../lib/Drawer\"\nimport { GridConfig, Primitive } from \"../lib/types\"\nimport { useGlobalStore } from \"global-store\"\nimport { all_layers } from \"@tscircuit/builder\"\n\ninterface Props {\n primitives: Primitive[]\n defaultUnit?: string\n transform?: Matrix\n grid?: GridConfig\n width?: number\n height?: number\n}\n\nexport const CanvasPrimitiveRenderer = ({\n primitives,\n transform,\n grid,\n width = 500,\n height = 500,\n}: Props) => {\n const canvasRefs = useRef<Record<string, HTMLCanvasElement>>()\n const selectedLayer = useGlobalStore((s) => s.selected_layer)\n\n useEffect(() => {\n if (!canvasRefs.current) return\n if (Object.keys(canvasRefs.current).length === 0) return\n const drawer = new Drawer(canvasRefs.current)\n if (transform) drawer.transform = transform\n drawer.clear()\n drawer.foregroundLayer = selectedLayer\n drawPrimitives(drawer, primitives)\n drawer.orderAndFadeLayers()\n }, [primitives, transform, selectedLayer])\n\n return (\n <div\n style={{\n backgroundColor: \"black\",\n width,\n height,\n position: \"relative\",\n }}\n >\n <SuperGrid\n textColor=\"rgba(0,255,0,0.8)\"\n majorColor=\"rgba(0,255,0,0.4)\"\n minorColor=\"rgba(0,255,0,0.2)\"\n screenSpaceCellSize={200}\n width={width}\n height={height}\n transform={transform!}\n stringifyCoord={(x, y, z) => `${toMMSI(x, z)}, ${toMMSI(y, z)}`}\n />\n {all_layers\n .map((l) => l.replace(/-/g, \"\"))\n .concat([\"drill\", \"other\"])\n .map((layer, i) => (\n <canvas\n key={layer}\n ref={(el) => {\n canvasRefs.current ??= {}\n canvasRefs.current[layer] = el!\n }}\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n pointerEvents: \"none\",\n }}\n width={width}\n height={height}\n ></canvas>\n ))}\n </div>\n )\n}\n","/*\n * Maps letters/numbers to an SVG path\n * You must normalize the path prior to putting it here! That means it needs to\n * be entirely in the bounds [0,1] for both x and y.\n * You can use this svg editor tool to add characters: https://yqnn.github.io/svg-path-editor/\n */\nexport const svgAlphabet = {\n \"0\": \"M0.4544564813877358 0L0.2723441540828736 0.03592830447352719L0.1086847233315459 0.14528754990019965L0.020630545837255005 0.3040632652221331L0 0.5395277421960205L0.049259221760993496 0.7369487828466779L0.18080513776237842 0.9005494166306564L0.37036887043974215 0.9872116270037247L0.5864663759301132 1L0.8148695622827444 0.9332890276148733L0.9326583645506394 0.8113052246023419L1 0.4031281830668562L0.833288960385582 0.09886798567812842L0.6801767918233781 0.02483708485091681L0.4544564813877358 0\",\n \"1\": \"M 0.198 0.272 L 0.537 0 L 0.54 1\",\n \"2\": \"M0.069593147751606 0.19461498231706575L0.1039380353319058 0.1224291500164194L0.20543361884368308 0.05510832064153169L0.3717712794432549 0.009452970962689482L0.4785344452623127 0L0.663238590738758 0.008714098643339864L0.8017933618843684 0.04769189395915288L0.8775637379550322 0.10746757678258442L0.9047778372591005 0.17693069668193287L0.9029710920770878 0.2231347105796246L0.8704496788008566 0.30047744598157516L0.7292906538577354 0.4508486051631194L0.3737955032119913 0.7369006417749693L0 1L1 1\",\n \"3\": \"M0.03917438899874637 0.19855364635107545L0.15510940508963084 0.06745632622133718L0.37598645522339846 0L0.8486391893813088 0.0652271323161611L0.9782182415054349 0.21747394183735683L0.9213133780517754 0.3547560290117714L0.6504271515903481 0.4543436297681271L0.22975249764129613 0.48476611625264143L0.7659038682744629 0.5411919558122493L0.9258712987734741 0.6203185665660985L1 0.7458360609169667L0.8938813281118737 0.9059190913045964L0.6166890258875837 1L0.261528440153542 0.9874861530507921L0 0.8837289530851273\",\n \"4\": \"M0.7328897338403042 0L0 0.6684672518568535L1 0.6684672518568535M0.7243346007604563 0.4530722484807562L0.7243346007604563 1\",\n \"5\": \"M 0 0 L 0 0.4973 L 0.4262 0.4319 L 0.7305 0.4565 L 0.8516 0.5009 L 0.9357 0.5639 L 1 0.7356 L 0.9696 0.8248 L 0.8898 0.895 L 0.733 0.9602 L 0.5518 0.9945 L 0.3814 1 L 0.2379 0.9821 L 0.1219 0.947 L 0 0.8748 M 0 0 L 1 0\",\n \"6\": \"M0.6964601700926856 0L0.3639239026215478 0.0743562375769351L0.1415931962925719 0.21735490179786915L0.009977939399608712 0.46336322325406004L0.00029622007592593224 0.7083131475173043L0.09408885043224748 0.8746809149767036L0.3379247445101846 0.9876686500961888L0.7109203869569624 1L0.9260852957913362 0.9103558029693921L1 0.7716571969091733L0.9824294723385016 0.6390635485705886L0.7446504992867332 0.4733643097729175L0.31028858071607296 0.47578021640899115L0.1208702146816024 0.5481452483973847L0 0.6616669755788906\",\n \"7\": \"M0 0L1 0L0.9246479649697582 0.030539772727272752L0.8850302419354837 0.05075757575757579L0.7922946068548385 0.11079545454545457L0.7419268208165322 0.15213068181818185L0.6907258064516127 0.20202020202020204L0.6400666267641127 0.26122159090909086L0.5913243447580644 0.33049242424242414L0.5458740234374998 0.4105902777777778L0.5050907258064514 0.5022727272727272L0.4703495148689514 0.6062973484848484L0.43257456133442534 0.787133049242424L0.41612903225806447 1\",\n \"8\": \"M0.5143001078924863 0L0.16007477667923162 0.10731570786949331L0.14924628550868277 0.3146018498698755L0.2939585848842112 0.41617921794558677L0.8648302624811545 0.5385163833653317L1 0.7775820770511038L0.8180842915260376 0.9505845566922285L0.41968938540525413 1L0.08062381919779889 0.882831681184498L0 0.6936376947135333L0.17150171673893433 0.5188652309607817L0.6529263782780712 0.4242818653203618L0.8650205888491803 0.29644027376796367L0.8702067371119496 0.09910067291661573L0.5143001078924863 0\",\n \"9\": \"M1 0.25379591792994305L0.9514789771111742 0.11679361536614272L0.8702482473521467 0.05711741614054847L0.7327445265851579 0.015213872471965633L0.525248180711544 0L0.3292056884418538 0.012928195113745608L0.15997632037247655 0.058762870026191856L0.05266940041228321 0.12882439350476L0 0.2562067822770946L0.11316462894512366 0.4121335905917837L0.2403060136479954 0.4603365890068938L0.4097241967586011 0.4745978388276783L0.8642414300184816 0.420815170259988L0.9732054796346318 0.34537434075898393L1 0.25379591792994305M0.9647426784191072 0.35488595400360495L0.4756895081034974 1\",\n A: \"M0 1L0.4808333333333333 0L1 1M0.24250000000000002 0.6099439775910365L0.7341666666666666 0.6099439775910365\",\n B: \"M0 1L0 0.0117369978777208L0.30665717153513444 0L0.5874522807082946 0.03451403469442413L0.7766202217193218 0.15033936404895643L0.7471969743588041 0.31967962568332936L0.5246013359741988 0.4102978954282461L0.04378745314885416 0.44918617613783574L0.5112949594180156 0.469692928091109L0.8540266515643348 0.5552749498651879L1 0.6868463175009967L0.9880091196159324 0.8570018204672155L0.922301719975498 0.9321708046604659L0.7584266951758925 0.9932594737131338L0 1\",\n C: \"M1 0.23038928858890784L0.9328355511865092 0.12426412616785204L0.8096380839483327 0.04912601676267708L0.5763225801788256 0L0.4039037709527492 0.015028068281399815L0.2519579390951737 0.06533979308999706L0.10359458463139784 0.18146243506591617L0 0.4862728453971315L0.08129580872733055 0.792689266886982L0.20257034847159672 0.9160822255736587L0.3286572892798542 0.9738230826074175L0.5742878414421707 1L0.7883510303801312 0.9665431511195721L0.946851033994232 0.8689071500976585L1 0.7311049027121912\",\n D: \"M0 1L0.015604366822624637 0.020770988281483303L0.22564758265176144 0L0.3865476147957666 0.0024153386496795644L0.6479126635475078 0.051745644338731314L0.841191887805517 0.15827717679529366L0.9517008345536152 0.30172260586872185L0.9957536578687336 0.4504541551987709L1 0.5624359222498485L0.9798483279164735 0.6584121775234548L0.9386273319285215 0.7395945263504481L0.806292129480815 0.8624239259880274L0.6296239151398265 0.9406169638094516L0.3397492767598845 0.9954164354263132L0 1\",\n E: \"M0 0L0 1M0 0L1 0M0 0.5L0.7 0.5M0 1L1 1\",\n F: \"M0 0L0 1M0.011363636363636364 0.006802721088435374L1 0.006802721088435374M0.011363636363636364 0.4965986394557823L0.8409090909090909 0.4965986394557823\",\n G: \"M0.902666857540557 0.03860785012651126L0.6504261864675637 0L0.3838947267237336 0.015442305268228053L0.21293332876776194 0.07706794377239819L0.07799659974941617 0.1994951236187481L0 0.46380381528937314L0.04159964421546915 0.7502491408002389L0.13176692977834842 0.8535497868383203L0.2709176262273927 0.936767572377719L0.4386472596876406 0.9891638569283179L0.6145513562841309 1L0.7782254421419019 0.9585373611026471L0.9092650433859927 0.8540372997461425L1 0.5556012645283437L0.5583959277303046 0.55491741080559\",\n H: \"M0 0L0 1M0 0.4788732394366197L0.989010989010989 0.4788732394366197M1 0L1 1\",\n I: \"M0.5 0L0.5 1\",\n J: \"M0.9976457238788704 0L1 0.7396412315872798L0.9773931362096968 0.8322033314977973L0.9345115952458736 0.882296255506608L0.8743862896259549 0.9221331222466961L0.8024024079884948 0.9526431718061675L0.6443996712151668 0.9893997797356828L0.5035848940343224 1L0.3127211130319937 0.9877004749449337L0.17201910858386513 0.9539509911894274L0.10357419806379677 0.9212555066079295L0.053656568662899015 0.8816079295154184L0.020759483663648916 0.8360407488986785L0.003376206348523566 0.7855864537444934L0 0.7312775330396476\",\n K: \"M0 0L0 1M0.8787878787878788 0.06666666666666667L0 0.6148148148148148M0.3333333333333333 0.45925925925925926L1 0.9777777777777777\",\n L: \"M0 0L0 1L1 1\",\n M: \"M0 1L0 0L0.5 0.6512L1 0L1 1\",\n N: \"M0 1L0 0L1 1L0.9803729146221786 0\",\n O: \"M0.4718499217948183 1L0.2896765846490613 0.9606979309189402L0.12315162147934663 0.8411184486080473L0 0.4352399966492615L0.11730398524516283 0.13145645436014852L0.2612197451988078 0.04493357858878059L0.5104071592772554 0L0.7450113425917159 0.05393013710105273L0.882367950645524 0.15242300282020502L1 0.5224527406249126L0.9414597290654386 0.7560662329321755L0.8371289514446183 0.8910800547287298L0.6518259868433511 0.9830452628933628L0.4718499217948183 1\",\n P: \"M0 1L0 0.018871774228013626L0.29609603495819875 0L0.5609840637427541 0.011794858892508529L0.7332142696692472 0.04353904702296349L0.8102258645858864 0.0691965055027166L0.9330504315465442 0.14445061754775845L0.9876391714147118 0.22527816445836535L1 0.3434414070631638L0.9510549958116356 0.41772808046663146L0.8746646891596713 0.45879131862541683L0.7528523813396283 0.49171525113425024L0.5766919939969619 0.5153253033973054L0.33725744877712827 0.5284469008187558L0.025622667325582785 0.529905468802775\",\n Q: \"M0.4618887943546369 0.9755918167206952L0.28356128136544534 0.9372490397450218L0.12055179272160406 0.8205882753548176L0 0.4246165790405623L0.1148276047430244 0.12824784112887844L0.25570518844754375 0.043836831567190586L0.49963205786237674 0L0.7292835601228574 0.0526138004304122L0.8637404608452104 0.14870263423138746L0.9788892040030622 0.5097006183769648L0.9215847647858059 0.7376120297474734L0.8194564929275405 0.869330409436378L0.6380654214095985 0.9590509139448092L0.4618887943546369 0.9755918167206952M0.5824181120212351 0.6861805006946525L1 1\",\n R: \"M0 0.9928375167236815L0 0.02590227442068435L0.3611517274211098 0L0.6146286724700761 0.008660554424468435L0.7675462459194776 0.035269459580494614L0.831839975516866 0.056961676692569484L0.8847592491838954 0.08519560521497332L0.9238557535364527 0.120683646438422L0.9583303225312839 0.21691797435320384L0.955092470586235 0.3022616904894429L0.9198097669001631 0.3640573439322699L0.8564862239866702 0.40639258627024005L0.7691258543593579 0.43335506909190874L0.601775027203482 0.4539166070813109L0.023939064200217658 0.46997623755243123M0.5038084874863982 0.5108023922274467L1 1\",\n S: \"M0.8886929689221953 0.15146982162688968L0.7276173683050475 0.013780286031594946L0.34582323121005076 0L0.1318235250900008 0.09920162734298861L0.0444543935052531 0.2811287071349243L0.08064065829108809 0.3709571405906485L0.21603115127470426 0.4485505768228281L0.7525409135992945 0.5111160926769565L0.9330263665417677 0.5850732219351329L1 0.7129938124702524L0.9117772389978691 0.9130572743138187L0.6423187128058188 1L0.29586019579751677 0.9935291584506244L0.10638454191462794 0.9229845198431584L0 0.7570771288048773\",\n T: \"M0 0L1 0M0.5148514851485149 0L0.5148514851485149 1\",\n U: \"M0 0L0.0023103778751369115 0.5467447428390111L0.01823032542100219 0.6954785891481812L0.05895528135268338 0.8056480226151669L0.13703402031421133 0.8894445726483398L0.23918400876232196 0.9448524533417946L0.3917887458926616 0.9848674531975652L0.584341627875137 1L0.7194816196604602 0.9848501456716763L0.8303268115073934 0.9449411544119768L0.8966613970084885 0.898186315516197L0.9251437568455642 0.867453197565408L0.9687114937020809 0.7890904895145239L0.9890470974808324 0.6852857184065537L1 0.0014769088758762145\",\n V: \"M0 0L0.5348837209302325 1L1 0\",\n W: \"M0 0L0.23300090661831369 0.9873417721518988L0.49954669084315495 0.30081906180193585L0.7851314596554849 1L1 0.0215934475055845\",\n X: \"M0 0L0.9893617021276596 1M1 0L0.010638297872340425 1\",\n Y: \"M0 0L0.4860515021459227 0.44712562100780695M1 0.0014194464158977947L0.48927038626609437 0.44996451383960256L0.5075107296137339 1\",\n Z: \"M0 0L1 0L0 1L1 1\",\n \".\": \"M 0.49 1 L 0.41 1\",\n \"*\": \"M 0.5 0.25 L 0.8 0.25 M 0.5 0.25 L 0.5927 0.4402 M 0.5 0.25 L 0.2573 0.3676 M 0.5 0.25 L 0.2573 0.1324 M 0.5 0.25 L 0.599 0.055\",\n \"(\": \"M0.75 0L0.25 0.5L0.25 0.5L0.75 1\",\n \")\": \"M0.25 0L0.75 0.5L0.75 0.5L0.25 1\",\n \"-\": \"M0 0.5L1 0.5\",\n \"+\": \"M 0 0.5 L 1 0.5 M 0.5 0.125 L 0.5 0.875\",\n \"=\": \"M0 0.25L1 0.25M0 0.75L1 0.75\",\n _: \"M0 1 L1 1\",\n \"[\": \"M0.75 0L0.25 0L0.25 1L0.75 1\",\n \"]\": \"M0.25 0L0.75 0L0.75 1L0.25 1\",\n \"<\": \"M0.75 0L0.25 0.5L0.25 0.5L0.75 1\",\n \">\": \"M0.25 0L0.75 0.5L0.75 0.5L0.25 1\",\n \"'\": \"M 0.5 0 L 0.5 0.5\",\n '\"': \"M 0.25 0 L 0.25 0.5 M 0.75 0 L 0.75 0.5\",\n}\n\nexport const lineAlphabet: Record<\n string,\n Array<{ x1: number; y1: number; x2: number; y2: number }>\n> = {}\nfor (const letter in svgAlphabet) {\n lineAlphabet[letter] = []\n const segs = (svgAlphabet as any)[letter]\n .split(\"M\")\n .slice(1)\n .map((seg: any) =>\n seg.split(\"L\").map((pr: any) => pr.trim().split(\" \").map(parseFloat)),\n )\n for (const seg of segs) {\n for (let i = 0; i < seg.length - 1; i++) {\n // We also flip the y axis to make it cartesian here\n lineAlphabet[letter].push({\n x1: seg[i][0],\n y1: 1 - seg[i][1],\n x2: seg[i + 1][0],\n y2: 1 - seg[i + 1][1],\n })\n }\n }\n}\n","import { lineAlphabet } from \"../assets/alphabet\"\nimport { Line, Text } from \"./types\"\n\nexport const LETTER_HEIGHT_TO_WIDTH_RATIO = 0.6\nexport const LETTER_HEIGHT_TO_SPACE_RATIO = 0.2\n\nexport const getTextWidth = (text: Text): number => {\n return (\n text.text.length * text.size * LETTER_HEIGHT_TO_WIDTH_RATIO +\n (text.text.length - 1) * text.size * LETTER_HEIGHT_TO_SPACE_RATIO\n )\n}\n\nexport const convertTextToLines = (text: Text): Line[] => {\n const strokeWidth = text.size / 8\n const letterWidth = text.size * LETTER_HEIGHT_TO_WIDTH_RATIO\n const letterSpace = text.size * LETTER_HEIGHT_TO_SPACE_RATIO\n\n const lines: Line[] = []\n for (let letterIndex = 0; letterIndex < text.text.length; letterIndex++) {\n const letter = text.text[letterIndex]\n const letterLines = lineAlphabet[letter.toUpperCase()]\n if (!letterLines) continue\n for (const { x1, y1, x2, y2 } of letterLines) {\n lines.push({\n pcb_drawing_type: \"line\",\n x1:\n text.x + (letterWidth + letterSpace) * letterIndex + letterWidth * x1,\n y1: text.y + text.size * y1,\n x2:\n text.x + (letterWidth + letterSpace) * letterIndex + letterWidth * x2,\n y2: text.y + text.size * y2,\n width: strokeWidth,\n layer: text.layer,\n unit: text.unit,\n })\n }\n }\n\n return lines\n}\n","import { Primitive, Line, Text, Circle, Rect } from \"./types\"\nimport { Drawer } from \"./Drawer\"\nimport { convertTextToLines, getTextWidth } from \"./convert-text-to-lines\"\n\nexport const drawLine = (drawer: Drawer, line: Line) => {\n drawer.equip({\n size: line.zoomIndependent ? line.width / drawer.transform.a : line.width,\n shape: line.squareCap ? \"square\" : \"circle\",\n color: line.layer,\n })\n drawer.moveTo(line.x1, line.y1)\n drawer.lineTo(line.x2, line.y2)\n}\n\nexport const drawText = (drawer: Drawer, text: Text) => {\n drawer.equip({\n fontSize: text.size,\n color: text.layer,\n })\n\n let alignOffset = { x: 0, y: 0 }\n const textWidth = getTextWidth(text)\n const textHeight = text.size\n if (text.align === \"top_left\") {\n alignOffset.y = -textHeight\n } else if (text.align === \"bottom_right\") {\n alignOffset.x = -textWidth\n } else if (text.align === \"top_right\") {\n alignOffset.x = -textWidth\n alignOffset.y = -textHeight\n } else if (text.align === \"center\") {\n alignOffset.x = -textWidth / 2\n alignOffset.y = -textHeight / 2\n }\n\n // Non-gerber compatible\n // drawer.text(text.text, text.x, text.y)\n\n text.x ??= 0\n text.y ??= 0\n const text_lines = convertTextToLines({\n ...text,\n x: text.x + alignOffset.x,\n y: text.y + alignOffset.y,\n })\n for (const line of text_lines) {\n drawLine(drawer, line)\n }\n}\n\nexport const drawRect = (drawer: Drawer, rect: Rect) => {\n drawer.equip({\n color: rect.layer,\n })\n if (rect.align && rect.align !== \"center\") {\n console.warn(\"Unhandled rect align\", rect.align)\n }\n drawer.rect(rect.x, rect.y, rect.w, rect.h)\n}\n\nexport const drawCircle = (drawer: Drawer, circle: Circle) => {\n drawer.equip({\n color: circle.layer,\n })\n drawer.circle(circle.x, circle.y, circle.r)\n}\n\nexport const drawPrimitive = (drawer: Drawer, primitive: Primitive) => {\n switch (primitive.pcb_drawing_type) {\n case \"line\":\n return drawLine(drawer, primitive)\n case \"text\":\n return drawText(drawer, primitive)\n case \"rect\":\n return drawRect(drawer, primitive)\n case \"circle\":\n return drawCircle(drawer, primitive)\n }\n throw new Error(\n `Unknown primitive type: ${(primitive as any).pcb_drawing_type}`,\n )\n}\n\nexport const drawPrimitives = (drawer: Drawer, primitives: Primitive[]) => {\n // sort primitives by draw order\n primitives.sort((a, b) => {\n const layerOrder = [\"bottom\", \"top\", \"drill\"]\n return layerOrder.indexOf(a.layer) - layerOrder.indexOf(b.layer)\n })\n primitives.forEach((primitive) => drawPrimitive(drawer, primitive))\n}\n","import { Matrix } from \"transformation-matrix\"\n\nexport const scaleOnly = (mat: Matrix, value: number = 1) => {\n if (Math.abs(mat.a) !== Math.abs(mat.d))\n throw new Error(\"Cannot scale non-uniformly\")\n return value * Math.abs(mat.a)\n}\n","import { scaleOnly } from \"./util/scale-only\"\nimport {\n identity,\n Matrix,\n applyToPoint,\n translate,\n compose,\n inverse,\n} from \"transformation-matrix\"\nimport colors from \"./colors\"\nimport { convertTextToLines } from \"./convert-text-to-lines\"\n\nexport interface Aperture {\n shape: \"circle\" | \"square\"\n size: number\n opacity: number\n mode: \"add\" | \"subtract\"\n fontSize: number\n color: string\n layer: string\n}\n\nexport const LAYER_NAME_TO_COLOR = {\n // Standard colors, you shouldn't use these except for testing\n red: \"red\",\n black: \"black\",\n green: \"green\",\n board: \"white\",\n other: \"#eee\",\n // TODO more builtin html colors\n\n // Common eagle names\n top: colors.board.copper.f,\n inner1: colors.board.copper.in1,\n inner2: colors.board.copper.in2,\n inner3: colors.board.copper.in3,\n inner4: colors.board.copper.in4,\n inner5: colors.board.copper.in5,\n inner6: colors.board.copper.in6,\n inner7: colors.board.copper.in7,\n inner8: colors.board.copper.in8,\n\n bottom: colors.board.copper.b,\n drill: colors.board.anchor,\n keepout: colors.board.background,\n tkeepout: colors.board.b_crtyd,\n tplace: colors.board.b_silks,\n\n top_silkscreen: colors.board.f_silks,\n bottom_silkscreen: colors.board.b_silks,\n\n ...colors.board,\n}\n\nexport type LayerNameForColor = keyof typeof LAYER_NAME_TO_COLOR\n\nexport const DEFAULT_DRAW_ORDER = [\n \"top\",\n \"inner1\",\n \"inner2\",\n \"inner3\",\n \"inner4\",\n \"inner5\",\n \"inner6\",\n \"bottom\",\n] as const\n\nexport const FILL_TYPES = {\n 0: \"Empty\",\n 1: \"Solid\",\n 2: \"Line\",\n 3: \"LtSlash\",\n 4: \"Slash\",\n 5: \"BkSlash\",\n 6: \"LtBkSlash\",\n 7: \"Hatch\",\n 8: \"XHatch\",\n 9: \"Interleave\",\n 10: \"WideDot\",\n 11: \"CloseDot\",\n 12: \"Stipple1\",\n 13: \"Stipple2\",\n 14: \"Stipple3\",\n 15: \"Stipple4\",\n}\n\nexport class Drawer {\n canvasLayerMap: Record<string, HTMLCanvasElement>\n ctxLayerMap: Record<string, CanvasRenderingContext2D>\n // @ts-ignore this.equip({}) handles constructor assignment\n aperture: Aperture\n transform: Matrix\n foregroundLayer: string = \"top\"\n lastPoint: { x: number; y: number }\n\n constructor(canvasLayerMap: Record<string, HTMLCanvasElement>) {\n this.canvasLayerMap = canvasLayerMap\n this.ctxLayerMap = Object.fromEntries(\n Object.entries(canvasLayerMap).map(([name, canvas]) => [\n name,\n canvas.getContext(\"2d\")!,\n ]),\n )\n this.transform = identity()\n // positive is up (cartesian)\n this.transform.d *= -1\n this.transform = compose(this.transform, translate(0, -500))\n this.lastPoint = { x: 0, y: 0 }\n this.equip({})\n }\n\n clear() {\n for (const ctx of Object.values(this.ctxLayerMap)) {\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height)\n }\n }\n\n equip(aperture: Partial<Aperture>) {\n this.aperture = {\n fontSize: 0,\n shape: \"circle\",\n mode: \"add\",\n size: 0,\n color: \"red\",\n layer: \"top\",\n opacity: this.foregroundLayer === aperture.color ? 1 : 0.5,\n ...aperture,\n }\n }\n\n rect(x: number, y: number, w: number, h: number) {\n const [x1$, y1$] = applyToPoint(this.transform, [x - w / 2, y - h / 2])\n const [x2$, y2$] = applyToPoint(this.transform, [x + w / 2, y + h / 2])\n this.applyAperture()\n const ctx = this.getLayerCtx()\n ctx.fillRect(x1$, y1$, x2$ - x1$, y2$ - y1$)\n }\n\n circle(x: number, y: number, r: number) {\n const r$ = scaleOnly(this.transform, r)\n const [x$, y$] = applyToPoint(this.transform, [x, y])\n this.applyAperture()\n const ctx = this.getLayerCtx()\n ctx.beginPath()\n ctx.arc(x$, y$, r$, 0, 2 * Math.PI)\n ctx.fill()\n ctx.closePath()\n }\n\n /* NOTE: This is not gerber compatible */\n debugText(text: string, x: number, y: number) {\n const [x$, y$] = applyToPoint(this.transform, [x, y])\n this.applyAperture()\n const ctx = this.getLayerCtx()\n\n ctx.font = `10px sans-serif`\n ctx.fillText(text, x$, y$)\n }\n\n getLayerCtx() {\n const ctx = this.ctxLayerMap[this.aperture.layer]\n if (!ctx) {\n throw new Error(`No context for layer \"${this.aperture.layer}\"`)\n }\n return ctx\n }\n\n /**\n * Iterate over each canvas and set the z index based on the layer order, but\n * always render the foreground layer on top.\n *\n * Also: Set the opacity of every non-foreground layer to 0.5\n */\n orderAndFadeLayers() {\n const { canvasLayerMap, foregroundLayer } = this\n const opaqueLayers = new Set([foregroundLayer, \"drill\", \"other\", \"board\"])\n const order = [\n \"drill\",\n \"board\",\n foregroundLayer,\n ...DEFAULT_DRAW_ORDER.filter((l) => l !== foregroundLayer),\n ]\n order.forEach((layer, i) => {\n const canvas = canvasLayerMap[layer]\n if (!canvas) return\n canvas.style.zIndex = `${100 - i}`\n canvas.style.opacity = opaqueLayers.has(layer) ? \"1\" : \"0.5\"\n })\n }\n\n applyAperture() {\n const { transform, aperture } = this\n let { size, mode, color, fontSize } = aperture\n if (color in this.ctxLayerMap) {\n this.aperture.layer = color\n } else {\n this.aperture.layer = \"other\"\n }\n const ctx = this.getLayerCtx()\n if (!ctx) {\n throw new Error(`No context for layer \"${this.foregroundLayer}\"`)\n }\n if (!color) color = \"undefined\"\n ctx.lineWidth = scaleOnly(transform, size)\n ctx.lineCap = \"round\"\n if (mode === \"add\") {\n let colorString =\n color?.[0] === \"#\" || color?.startsWith(\"rgb\")\n ? color\n : (LAYER_NAME_TO_COLOR as any)[color?.toLowerCase()]\n ? (LAYER_NAME_TO_COLOR as any)[color?.toLowerCase()]\n : null\n if (colorString === null) {\n console.warn(`Color mapping for \"${color}\" not found`)\n colorString = \"white\"\n }\n ctx.fillStyle = colorString\n ctx.strokeStyle = colorString\n } else {\n ctx.globalCompositeOperation = \"destination-out\"\n ctx.fillStyle = \"rgba(0,0,0,1)\"\n ctx.strokeStyle = \"rgba(0,0,0,1)\"\n }\n ctx.font = `${scaleOnly(inverse(transform), fontSize)}px sans-serif`\n }\n\n moveTo(x: number, y: number) {\n this.lastPoint = { x, y }\n }\n lineTo(x: number, y: number) {\n const [x$, y$] = applyToPoint(this.transform, [x, y])\n const { size, shape, mode } = this.aperture\n const size$ = scaleOnly(this.transform, size)\n let { lastPoint } = this\n const lastPoint$ = applyToPoint(this.transform, lastPoint)\n\n this.applyAperture()\n const ctx = this.getLayerCtx()\n\n if (shape === \"square\")\n ctx.fillRect(\n lastPoint$.x - size$ / 2,\n lastPoint$.y - size$ / 2,\n size$,\n size$,\n )\n ctx.beginPath()\n ctx.moveTo(lastPoint$.x, lastPoint$.y)\n ctx.lineTo(x$, y$)\n\n ctx.stroke()\n ctx.closePath()\n\n if (shape === \"square\")\n ctx.fillRect(x$ - size$ / 2, y$ - size$ / 2, size$, size$)\n\n this.lastPoint = { x, y }\n }\n}\n","// Mix of Eagle Dark for schematics and KiCAD 2020 for PCBs\n// https://github.com/pointhi/kicad-color-schemes/blob/master/eagle-dark/eagle-dark.jsonO\n// https://github.com/pointhi/kicad-color-schemes/blob/master/kicad-2020/kicad_2020.json\nexport default {\n \"3d_viewer\": {\n background_bottom: \"rgb(102, 102, 128)\",\n background_top: \"rgb(204, 204, 230)\",\n board: \"rgb(51, 43, 23)\",\n copper: \"rgb(179, 156, 0)\",\n silkscreen_bottom: \"rgb(230, 230, 230)\",\n silkscreen_top: \"rgb(230, 230, 230)\",\n soldermask: \"rgb(20, 51, 36)\",\n solderpaste: \"rgb(128, 128, 128)\",\n },\n board: {\n anchor: \"rgb(255, 38, 226)\",\n aux_items: \"rgb(255, 255, 255)\",\n b_adhes: \"rgb(0, 0, 132)\",\n b_crtyd: \"rgb(255, 38, 226)\",\n b_fab: \"rgb(88, 93, 132)\",\n b_mask: \"rgba(2, 255, 238, 0.400)\",\n b_paste: \"rgb(0, 194, 194)\",\n b_silks: \"rgb(232, 178, 167)\",\n background: \"rgb(0, 16, 35)\",\n cmts_user: \"rgb(89, 148, 220)\",\n copper: {\n b: \"rgb(77, 127, 196)\",\n f: \"rgb(200, 52, 52)\",\n in1: \"rgb(127, 200, 127)\",\n in10: \"rgb(237, 124, 51)\",\n in11: \"rgb(91, 195, 235)\",\n in12: \"rgb(247, 111, 142)\",\n in13: \"rgb(167, 165, 198)\",\n in14: \"rgb(40, 204, 217)\",\n in15: \"rgb(232, 178, 167)\",\n in16: \"rgb(242, 237, 161)\",\n in17: \"rgb(237, 124, 51)\",\n in18: \"rgb(91, 195, 235)\",\n in19: \"rgb(247, 111, 142)\",\n in2: \"rgb(206, 125, 44)\",\n in20: \"rgb(167, 165, 198)\",\n in21: \"rgb(40, 204, 217)\",\n in22: \"rgb(232, 178, 167)\",\n in23: \"rgb(242, 237, 161)\",\n in24: \"rgb(237, 124, 51)\",\n in25: \"rgb(91, 195, 235)\",\n in26: \"rgb(247, 111, 142)\",\n in27: \"rgb(167, 165, 198)\",\n in28: \"rgb(40, 204, 217)\",\n in29: \"rgb(232, 178, 167)\",\n in3: \"rgb(79, 203, 203)\",\n in30: \"rgb(242, 237, 161)\",\n in4: \"rgb(219, 98, 139)\",\n in5: \"rgb(167, 165, 198)\",\n in6: \"rgb(40, 204, 217)\",\n in7: \"rgb(232, 178, 167)\",\n in8: \"rgb(242, 237, 161)\",\n in9: \"rgb(141, 203, 129)\",\n },\n cursor: \"rgb(255, 255, 255)\",\n drc: \"rgb(194, 194, 194)\",\n drc_error: \"rgba(215, 91, 107, 0.800)\",\n drc_exclusion: \"rgb(255, 255, 255)\",\n drc_warning: \"rgba(255, 208, 66, 0.902)\",\n dwgs_user: \"rgb(194, 194, 194)\",\n eco1_user: \"rgb(180, 219, 210)\",\n eco2_user: \"rgb(216, 200, 82)\",\n edge_cuts: \"rgb(208, 210, 205)\",\n f_adhes: \"rgb(132, 0, 132)\",\n f_crtyd: \"rgb(255, 0, 245)\",\n f_fab: \"rgb(175, 175, 175)\",\n f_mask: \"rgba(216, 100, 255, 0.400)\",\n f_paste: \"rgba(180, 160, 154, 0.902)\",\n f_silks: \"rgb(242, 237, 161)\",\n footprint_text_back: \"rgb(0, 0, 132)\",\n footprint_text_front: \"rgb(194, 194, 194)\",\n footprint_text_invisible: \"rgb(132, 132, 132)\",\n grid: \"rgb(132, 132, 132)\",\n grid_axes: \"rgb(194, 194, 194)\",\n margin: \"rgb(255, 38, 226)\",\n microvia: \"rgb(0, 132, 132)\",\n no_connect: \"rgb(0, 0, 132)\",\n pad_back: \"rgb(77, 127, 196)\",\n pad_front: \"rgb(200, 52, 52)\",\n pad_plated_hole: \"rgb(194, 194, 0)\",\n pad_through_hole: \"rgb(227, 183, 46)\",\n plated_hole: \"rgb(26, 196, 210)\",\n ratsnest: \"rgba(245, 255, 213, 0.702)\",\n select_overlay: \"rgb(4, 255, 67)\",\n through_via: \"rgb(236, 236, 236)\",\n user_1: \"rgb(194, 194, 194)\",\n user_2: \"rgb(89, 148, 220)\",\n user_3: \"rgb(180, 219, 210)\",\n user_4: \"rgb(216, 200, 82)\",\n user_5: \"rgb(194, 194, 194)\",\n user_6: \"rgb(89, 148, 220)\",\n user_7: \"rgb(180, 219, 210)\",\n user_8: \"rgb(216, 200, 82)\",\n user_9: \"rgb(232, 178, 167)\",\n via_blind_buried: \"rgb(187, 151, 38)\",\n via_hole: \"rgb(227, 183, 46)\",\n via_micro: \"rgb(0, 132, 132)\",\n via_through: \"rgb(236, 236, 236)\",\n worksheet: \"rgb(200, 114, 171)\",\n },\n gerbview: {\n axes: \"rgb(0, 0, 132)\",\n background: \"rgb(0, 0, 0)\",\n dcodes: \"rgb(255, 255, 255)\",\n grid: \"rgb(132, 132, 132)\",\n layers: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n ],\n negative_objects: \"rgb(132, 132, 132)\",\n worksheet: \"rgb(0, 0, 132)\",\n },\n palette: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n ],\n schematic: {\n anchor: \"rgb(0, 0, 255)\",\n aux_items: \"rgb(0, 0, 0)\",\n background: \"rgb(33, 33, 33)\",\n brightened: \"rgb(204, 204, 204)\",\n bus: \"rgb(0, 96, 192)\",\n bus_junction: \"rgb(0, 96, 192)\",\n component_body: \"rgb(44, 44, 44)\",\n component_outline: \"rgb(192, 0, 0)\",\n cursor: \"rgb(224, 224, 224)\",\n erc_error: \"rgba(192, 48, 48, 0.800)\",\n erc_warning: \"rgba(192, 140, 0, 0.800)\",\n fields: \"rgb(128, 0, 160)\",\n grid: \"rgb(60, 60, 60)\",\n grid_axes: \"rgb(60, 60, 60)\",\n hidden: \"rgb(194, 194, 194)\",\n junction: \"rgb(0, 160, 0)\",\n label_global: \"rgb(0, 160, 224)\",\n label_hier: \"rgb(160, 160, 0)\",\n label_local: \"rgb(192, 192, 192)\",\n net_name: \"rgb(224, 224, 224)\",\n no_connect: \"rgb(97, 43, 224)\",\n note: \"rgb(192, 192, 0)\",\n override_item_colors: false,\n pin: \"rgb(192, 0, 0)\",\n pin_name: \"rgb(192, 192, 192)\",\n pin_number: \"rgb(192, 0, 0)\",\n reference: \"rgb(192, 192, 192)\",\n shadow: \"rgba(102, 179, 255, 0.800)\",\n sheet: \"rgb(128, 0, 160)\",\n sheet_background: \"rgba(255, 255, 255, 0.000)\",\n sheet_fields: \"rgb(160, 160, 0)\",\n sheet_filename: \"rgb(160, 160, 0)\",\n sheet_label: \"rgb(160, 160, 0)\",\n sheet_name: \"rgb(0, 160, 204)\",\n value: \"rgb(192, 192, 192)\",\n wire: \"rgb(0, 160, 0)\",\n worksheet: \"rgb(192, 0, 0)\",\n },\n}\n","import {\n createStore as createZustandStore,\n useStore as useZustandStore,\n UseBoundStore,\n} from \"zustand\"\nimport { StoreContext } from \"./components/ContextProviders\"\nimport type { LayerRef } from \"@tscircuit/builder\"\nimport { useContext } from \"react\"\n\nexport interface State {\n selected_layer: LayerRef\n\n in_edit_mode: boolean\n in_move_footprint_mode: boolean\n in_draw_trace_mode: boolean\n\n is_moving_component: boolean\n is_drawing_trace: boolean\n\n selectLayer: (layer: LayerRef) => void\n setEditMode: (mode: \"off\" | \"move_footprint\" | \"draw_trace\") => void\n setIsMovingComponent: (is_moving: boolean) => void\n setIsDrawingTrace: (is_drawing: boolean) => void\n}\n\nexport const createStore = () =>\n createZustandStore<State>(\n (set) =>\n ({\n selected_layer: \"top\",\n\n in_edit_mode: false,\n in_move_footprint_mode: false,\n in_draw_trace_mode: false,\n\n is_moving_component: false,\n is_drawing_trace: false,\n\n selectLayer: (layer) => set({ selected_layer: layer }),\n setEditMode: (mode) =>\n set({\n in_edit_mode: mode !== \"off\",\n in_move_footprint_mode: mode === \"move_footprint\",\n in_draw_trace_mode: mode === \"draw_trace\",\n is_moving_component: false,\n is_drawing_trace: false,\n }),\n setIsMovingComponent: (is_moving) =>\n set({ is_moving_component: is_moving }),\n setIsDrawingTrace: (is_drawing) =>\n set({ is_drawing_trace: is_drawing }),\n }) as const\n )\n\nexport const useGlobalStore = <T = State>(s?: (state: State) => T): T => {\n const store = useContext(StoreContext)\n\n return useZustandStore(store as any, s as any)\n}\n","import { useMemo } from \"react\"\nimport { createContext, useContext } from \"react\"\nimport { createStore } from \"../global-store\"\n\nexport const StoreContext = createContext(null)\n\nexport const ContextProviders = ({ children }: { children?: any }) => {\n const store = useMemo(() => createStore(), [])\n\n return (\n <StoreContext.Provider value={store as any}>\n {children}\n </StoreContext.Provider>\n )\n}\n","import React, { useCallback } from \"react\"\nimport { CanvasPrimitiveRenderer } from \"./CanvasPrimitiveRenderer\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport { useMemo } from \"react\"\nimport { convertElementToPrimitives } from \"../lib/convert-element-to-primitive\"\nimport { Matrix } from \"transformation-matrix\"\nimport { GridConfig } from \"lib/types\"\nimport { MouseElementTracker } from \"./MouseElementTracker\"\nimport { DimensionOverlay } from \"./DimensionOverlay\"\nimport { ToolbarOverlay } from \"./ToolbarOverlay\"\nimport { ErrorOverlay } from \"./ErrorOverlay\"\nimport { EditPlacementOverlay } from \"./EditPlacementOverlay\"\nimport { EditEvent } from \"lib/edit-events\"\nimport { EditTraceHintOverlay } from \"./EditTraceHintOverlay\"\n\nexport interface CanvasElementsRendererProps {\n elements: AnySoupElement[]\n transform?: Matrix\n width?: number\n height?: number\n grid?: GridConfig\n allowEditing: boolean\n cancelPanDrag: Function\n onCreateEditEvent: (event: EditEvent) => void\n onModifyEditEvent: (event: Partial<EditEvent>) => void\n}\n\nexport const CanvasElementsRenderer = (props: CanvasElementsRendererProps) => {\n const primitives = useMemo(() => {\n const primitives = props.elements.flatMap((elm) =>\n convertElementToPrimitives(elm, props.elements),\n )\n return primitives\n }, [props.elements])\n return (\n <MouseElementTracker transform={props.transform} primitives={primitives}>\n <EditPlacementOverlay\n disabled={!props.allowEditing}\n transform={props.transform}\n soup={props.elements}\n cancelPanDrag={props.cancelPanDrag}\n onCreateEditEvent={props.onCreateEditEvent}\n onModifyEditEvent={props.onModifyEditEvent}\n >\n <EditTraceHintOverlay\n disabled={!props.allowEditing}\n transform={props.transform}\n soup={props.elements}\n cancelPanDrag={props.cancelPanDrag}\n onCreateEditEvent={props.onCreateEditEvent as any}\n onModifyEditEvent={props.onModifyEditEvent as any}\n >\n <DimensionOverlay transform={props.transform!}>\n <ToolbarOverlay elements={props.elements}>\n <ErrorOverlay\n transform={props.transform}\n elements={props.elements}\n >\n <CanvasPrimitiveRenderer\n transform={props.transform}\n primitives={primitives}\n width={props.width}\n height={props.height}\n grid={props.grid}\n />\n </ErrorOverlay>\n </ToolbarOverlay>\n </DimensionOverlay>\n </EditTraceHintOverlay>\n </EditPlacementOverlay>\n </MouseElementTracker>\n )\n}\n","import type { Primitive } from \"./types\"\nimport type { AnySoupElement, PCBHole } from \"@tscircuit/soup\"\n\ntype MetaData = {\n _parent_pcb_component?: any\n _parent_source_component?: any\n _source_port?: any\n}\n\nexport const convertElementToPrimitives = (\n element: AnySoupElement,\n allElements: AnySoupElement[],\n): (Primitive & MetaData)[] => {\n const _parent_pcb_component =\n \"pcb_component_id\" in element\n ? allElements.find(\n (elm) =>\n elm.type === \"pcb_component\" &&\n elm.pcb_component_id === element.pcb_component_id,\n )\n : undefined\n const _parent_source_component =\n _parent_pcb_component && \"source_component_id\" in _parent_pcb_component\n ? allElements.find(\n (elm) =>\n elm.type === \"source_component\" &&\n elm.source_component_id ===\n _parent_pcb_component.source_component_id,\n )\n : undefined\n const _source_port =\n \"source_port_id\" in element\n ? allElements.find(\n (e) =>\n e.type === \"source_port\" &&\n e.source_port_id === element.source_port_id,\n )\n : undefined\n\n switch (element.type) {\n case \"pcb_board\": {\n const { width, height, center } = element\n return [\n {\n pcb_drawing_type: \"line\",\n x1: center.x - width / 2,\n y1: center.y - height / 2,\n x2: center.x + width / 2,\n y2: center.y - height / 2,\n width: 1, // Add the required width property\n zoomIndependent: true,\n layer: \"board\",\n _element: element,\n },\n {\n pcb_drawing_type: \"line\",\n x1: center.x - width / 2,\n y1: center.y + height / 2,\n x2: center.x + width / 2,\n y2: center.y + height / 2,\n width: 1, // Add the required width property\n zoomIndependent: true,\n layer: \"board\",\n _element: element,\n },\n {\n pcb_drawing_type: \"line\",\n x1: center.x - width / 2,\n y1: center.y - height / 2,\n x2: center.x - width / 2,\n y2: center.y + height / 2,\n width: 1, // Add the required width property\n zoomIndependent: true,\n layer: \"board\",\n _element: element,\n },\n {\n pcb_drawing_type: \"line\",\n x1: center.x + width / 2,\n y1: center.y - height / 2,\n x2: center.x + width / 2,\n y2: center.y + height / 2,\n width: 1, // Add the required width property\n zoomIndependent: true,\n layer: \"board\",\n _element: element,\n },\n ]\n }\n case \"pcb_smtpad\": {\n if (element.shape === \"rect\") {\n const { shape, x, y, width, height, layer } = element\n\n return [\n {\n pcb_drawing_type: \"rect\",\n x,\n y,\n w: width,\n h: height,\n layer: layer || \"top\",\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n _source_port,\n },\n ]\n } else if (element.shape === \"circle\") {\n const { x, y, radius, layer } = element\n return [\n {\n pcb_drawing_type: \"circle\",\n x,\n y,\n r: radius,\n layer: layer || \"top\",\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n _source_port,\n },\n ]\n }\n return []\n }\n case \"pcb_hole\": {\n if (element.hole_shape === \"round\" || !element.hole_shape) {\n const { x, y, hole_diameter } = element\n\n return [\n {\n pcb_drawing_type: \"circle\",\n x,\n y,\n r: hole_diameter / 2,\n layer: \"drill\",\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n },\n ]\n }\n // TODO square hole\n // TODO oval hole\n return []\n }\n case \"pcb_plated_hole\": {\n const { x, y, hole_diameter, outer_diameter } = element\n\n return [\n {\n pcb_drawing_type: \"circle\",\n x,\n y,\n r: outer_diameter / 2,\n // TODO support layer on pcb_plated_hole\n layer: \"top\",\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n _source_port,\n },\n {\n pcb_drawing_type: \"circle\",\n x,\n y,\n r: hole_diameter / 2,\n // TODO support layer on pcb_plated_hole\n layer: \"drill\",\n\n // double highlights are annoying\n // _element: element,\n },\n ]\n }\n case \"pcb_trace\": {\n const primitives: Primitive[] = []\n let prevX: number | null = null\n let prevY: number | null = null\n\n for (const route of element.route) {\n if (route.route_type === \"wire\") {\n if (prevX !== null && prevY !== null) {\n primitives.push({\n pcb_drawing_type: \"line\",\n x1: prevX,\n y1: prevY,\n x2: route.x,\n y2: route.y,\n width: route.width,\n squareCap: false,\n layer: route.layer,\n })\n }\n\n prevX = route.x\n prevY = route.y\n }\n // Ignore \"via\" routes for now\n }\n\n return primitives\n }\n // The builder currently outputs these as smtpads and holes, so pcb_via isn't\n // used, but that maybe should be changed\n case \"pcb_via\": {\n const { x, y, outer_diameter, hole_diameter, from_layer, to_layer } =\n element\n\n return [\n {\n pcb_drawing_type: \"circle\",\n x,\n y,\n r: outer_diameter / 2,\n layer: from_layer!,\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n },\n {\n pcb_drawing_type: \"circle\",\n x,\n y,\n r: hole_diameter / 2,\n layer: \"drill\",\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n },\n {\n pcb_drawing_type: \"circle\",\n x,\n y,\n r: outer_diameter / 2,\n layer: to_layer!,\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n },\n ]\n }\n\n case \"pcb_silkscreen_rect\": {\n return [\n {\n pcb_drawing_type: \"rect\",\n x: element.center.x,\n y: element.center.y,\n w: element.width,\n h: element.height,\n layer:\n element.layer === \"bottom\" ? \"bottom_silkscreen\" : \"top_silkscreen\",\n },\n ]\n }\n\n case \"pcb_silkscreen_circle\": {\n return [\n {\n pcb_drawing_type: \"circle\",\n x: element.center.x,\n y: element.center.y,\n r: element.radius,\n layer:\n element.layer === \"bottom\" ? \"bottom_silkscreen\" : \"top_silkscreen\",\n },\n ]\n }\n\n case \"pcb_silkscreen_line\": {\n return [\n {\n pcb_drawing_type: \"line\",\n x1: element.x1,\n y1: element.y1,\n x2: element.x2,\n y2: element.y2,\n width: 0.1, // TODO add strokewidth\n squareCap: false,\n layer:\n element.layer === \"bottom\" ? \"bottom_silkscreen\" : \"top_silkscreen\",\n },\n ]\n }\n\n case \"pcb_fabrication_note_path\":\n case \"pcb_silkscreen_path\": {\n const {\n pcb_component_id,\n route, // Array<{ x: number, y: number }>\n type,\n } = element\n\n let layer:\n | \"bottom_silkscreen\"\n | \"top_silkscreen\"\n | \"bottom_fabrication\"\n | \"top_fabrication\"\n | null\n\n if (type === \"pcb_silkscreen_path\") {\n layer =\n element.layer === \"bottom\" ? \"bottom_silkscreen\" : \"top_silkscreen\"\n } else if (type === \"pcb_fabrication_note_path\") {\n layer = \"top_fabrication\"\n }\n\n return route\n .slice(0, -1)\n .map((point, index) => {\n const nextPoint = route[index + 1]\n return {\n pcb_drawing_type: \"line\",\n x1: point.x,\n y1: point.y,\n x2: nextPoint.x,\n y2: nextPoint.y,\n width: 0.1, // TODO add strokewidth\n squareCap: false,\n layer: layer!,\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n _source_port,\n } as Primitive & MetaData\n })\n .filter(Boolean)\n }\n\n case \"pcb_silkscreen_text\": {\n return [\n {\n pcb_drawing_type: \"text\",\n x: element.anchor_position.x,\n y: element.anchor_position.y,\n layer:\n element.layer === \"bottom\" ? \"bottom_silkscreen\" : \"top_silkscreen\",\n align: element.anchor_alignment ?? \"center\",\n text: element.text,\n size: element.font_size, // Add the required 'size' property\n },\n ]\n }\n\n case \"pcb_fabrication_note_text\": {\n return [\n {\n pcb_drawing_type: \"text\",\n x: element.anchor_position.x,\n y: element.anchor_position.y,\n layer:\n element.layer === \"bottom\"\n ? \"bottom_fabrication\"\n : \"top_fabrication\",\n size: element.font_size,\n align: element.anchor_alignment ?? \"center\",\n text: element.text,\n },\n ]\n }\n }\n\n // console.warn(`Unsupported element type: ${element.type}`)\n return []\n}\n","import React, { useState } from \"react\"\nimport { useMemo } from \"react\"\nimport { Matrix, applyToPoint, inverse } from \"transformation-matrix\"\nimport { Primitive } from \"lib/types\"\nimport { ElementOverlayBox } from \"./ElementOverlayBox\"\nimport { AnyElement } from \"@tscircuit/builder\"\n\nexport const MouseElementTracker = ({\n children,\n transform,\n primitives,\n}: {\n children: any\n transform?: Matrix\n primitives: Primitive[]\n}) => {\n const [mousedPrimitives, setMousedPrimitives] = useState<Primitive[]>([])\n\n const highlightedPrimitives = useMemo(() => {\n const highlightedPrimitives: HighlightedPrimitive[] = []\n for (const primitive of mousedPrimitives) {\n if (primitive._element?.type === \"pcb_via\") continue\n if (primitive._element?.type === \"pcb_component\") continue\n const screenPos = applyToPoint(\n transform!,\n primitive as { x: number; y: number }\n )\n const w =\n \"w\" in primitive ? primitive.w : \"r\" in primitive ? primitive.r * 2 : 0\n const h =\n \"h\" in primitive ? primitive.h : \"r\" in primitive ? primitive.r * 2 : 0\n const screenSize = {\n w: w * transform!.a,\n h: h * transform!.a,\n }\n\n // FANCY: If 2+ highlighted primitives inhabit the same space, give\n // them an incrementing same_space_index\n let same_space_index = highlightedPrimitives.filter(\n (hp) =>\n screenPos.x === hp.screen_x &&\n screenPos.y === hp.screen_y &&\n screenSize.w === hp.screen_w &&\n screenSize.h === hp.screen_h\n ).length\n\n highlightedPrimitives.push({\n ...(primitive as any),\n screen_x: screenPos.x,\n screen_y: screenPos.y,\n screen_w: screenSize.w,\n screen_h: screenSize.h,\n same_space_index,\n })\n }\n\n return highlightedPrimitives\n }, [mousedPrimitives, transform])\n return (\n <div\n style={{ position: \"relative\" }}\n onMouseMove={(e) => {\n if (transform) {\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const rwPoint = applyToPoint(inverse(transform), { x, y })\n\n const mousedPrimitives: Primitive[] = []\n for (const primitive of primitives) {\n if (\n !(\n \"x\" in primitive &&\n \"y\" in primitive &&\n ((\"w\" in primitive && \"h\" in primitive) || \"r\" in primitive)\n )\n )\n continue\n if (!primitive._element) continue\n\n const w = \"w\" in primitive ? primitive.w : primitive.r * 2\n const h = \"h\" in primitive ? primitive.h : primitive.r * 2\n\n if (\n Math.abs(primitive.x - rwPoint.x) < w / 2 &&\n Math.abs(primitive.y - rwPoint.y) < h / 2\n ) {\n mousedPrimitives.push(primitive)\n }\n }\n setMousedPrimitives(mousedPrimitives)\n }\n }}\n >\n {children}\n <ElementOverlayBox highlightedPrimitives={highlightedPrimitives} />\n </div>\n )\n}\n\nexport type HighlightedPrimitive = {\n x: number\n y: number\n w: number\n h: number\n same_space_index?: number\n _element: AnyElement\n _parent_pcb_component?: AnyElement\n _parent_source_component?: AnyElement\n _source_port?: AnyElement\n screen_x: number\n screen_y: number\n screen_w: number\n screen_h: number\n}\n","import React, { useEffect, useState } from \"react\"\nimport { HighlightedPrimitive } from \"./MouseElementTracker\"\nimport colors from \"lib/colors\"\nimport { useGlobalStore } from \"global-store\"\n\nconst containerStyle = {\n position: \"absolute\",\n left: 0,\n top: 0,\n pointerEvents: \"none\",\n color: \"red\",\n fontFamily: \"sans-serif\",\n fontSize: 12,\n textShadow: \"0 0 2px black\",\n} as const\n\nexport const getTextForHighlightedPrimitive = (\n prim: HighlightedPrimitive\n): string => {\n const {\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n } = prim\n switch (element.type) {\n case \"pcb_smtpad\":\n case \"pcb_plated_hole\": {\n let s = \"\"\n\n if (\n _parent_source_component &&\n \"name\" in _parent_source_component &&\n _parent_source_component.name\n ) {\n s += `.${_parent_source_component.name} > `\n }\n s += (element.port_hints ?? (element as any)._source_port?.port_hints)\n .map((ph: string) => `port.${ph}`)\n .join(\", \")\n return s\n }\n default: {\n return \"\"\n }\n }\n}\n\nconst layerColorHightlightMap = {\n top: \"red\",\n bottom: \"aqua\",\n}\n\nexport const HighlightedPrimitiveBoxWithText = ({\n primitive,\n}: {\n primitive: HighlightedPrimitive\n}) => {\n const [finalState, setFinalState] = useState(false)\n\n useEffect(() => {\n setTimeout(() => {\n setFinalState(true)\n }, 100)\n }, [])\n\n let [x, y, w, h] = [\n primitive.screen_x,\n primitive.screen_y,\n primitive.screen_w,\n primitive.screen_h,\n ]\n\n const si = primitive.same_space_index ?? 0\n const sip = 26\n\n const color: string =\n layerColorHightlightMap[\n (primitive as any)?._element\n ?.layer as keyof typeof layerColorHightlightMap\n ] ?? \"red\"\n\n return (\n <div\n style={{\n position: \"absolute\",\n left: x - w / 2 - 8,\n top: y - h / 2 - 8,\n width: w + 16,\n height: h + 16,\n color,\n }}\n >\n <div\n style={{\n // width: finalState ? `${100 + 20 * si}%` : \"100%\",\n // height: finalState ? `${100 + 20 * si}%` : \"100%\",\n // marginLeft: finalState ? `${-10 * si}%` : 0,\n // marginTop: finalState ? `${-10 * si}%` : 0,\n width: finalState ? `calc(100% + ${sip * 2 * si}px)` : \"100%\",\n height: finalState ? `calc(100% + ${sip * 2 * si}px)` : \"100%\",\n marginLeft: finalState ? `${-sip * si}px` : 0,\n marginTop: finalState ? `${-sip * si}px` : 0,\n border: `1px solid ${color}`,\n opacity: finalState ? 1 : si === 0 ? 1 : 0,\n transition:\n \"width 0.2s, height 0.2s, margin-left 0.2s, margin-top 0.2s, opacity 0.2s\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n left: 0,\n bottom: h + 20 + sip * si,\n marginLeft: finalState ? `${-sip * si}px` : 0,\n marginBottom: finalState ? 0 : -sip * si,\n transition: \"margin-left 0.2s, margin-bottom 0.2s\",\n lineHeight: \"0.8em\",\n }}\n >\n {getTextForHighlightedPrimitive(primitive)}\n </div>\n </div>\n </div>\n )\n}\n\nexport const ElementOverlayBox = ({\n highlightedPrimitives,\n}: {\n highlightedPrimitives: HighlightedPrimitive[]\n}) => {\n const is_moving_component = useGlobalStore((s) => s.is_moving_component)\n\n return (\n <div style={containerStyle}>\n {!is_moving_component &&\n highlightedPrimitives.map((primitive, i) => (\n <HighlightedPrimitiveBoxWithText key={i} primitive={primitive} />\n ))}\n </div>\n )\n}\n","import { useEffect, useRef, useState } from \"react\"\nimport { Matrix, applyToPoint, identity, inverse } from \"transformation-matrix\"\n\ninterface Props {\n transform?: Matrix\n children: any\n}\n\nexport const DimensionOverlay = ({ children, transform }: Props) => {\n if (!transform) transform = identity()\n const [dimensionToolVisible, setDimensionToolVisible] = useState(false)\n const [dimensionToolStretching, setDimensionToolStretching] = useState(false)\n // Start of dimension tool line in real-world coordinates (not screen)\n const [dStart, setDStart] = useState({ x: 0, y: 0 })\n // End of dimension tool line in real-world coordinates (not screen)\n const [dEnd, setDEnd] = useState({ x: 0, y: 0 })\n const mousePosRef = useRef({ x: 0, y: 0 })\n const containerRef = useRef<HTMLDivElement | null>(null)\n const container = containerRef.current!\n const containerBounds = container?.getBoundingClientRect()\n useEffect(() => {\n const container = containerRef.current\n\n const down = (e: KeyboardEvent) => {\n if (e.key === \"d\") {\n setDStart({ x: mousePosRef.current.x, y: mousePosRef.current.y })\n setDEnd({ x: mousePosRef.current.x, y: mousePosRef.current.y })\n setDimensionToolVisible((visible: boolean) => !visible)\n setDimensionToolStretching(true)\n e.preventDefault()\n }\n if (e.key === \"Escape\") {\n setDimensionToolVisible(false)\n setDimensionToolStretching(false)\n }\n }\n\n const addKeyListener = () => {\n if (container) {\n container.addEventListener(\"keydown\", down)\n }\n }\n\n const removeKeyListener = () => {\n if (container) {\n container.removeEventListener(\"keydown\", down)\n }\n }\n\n if (container) {\n container.addEventListener(\"focus\", addKeyListener)\n container.addEventListener(\"blur\", removeKeyListener)\n container.addEventListener(\"mouseenter\", addKeyListener)\n container.addEventListener(\"mouseleave\", removeKeyListener)\n }\n return () => {\n if (container) {\n container.removeEventListener(\"focus\", addKeyListener)\n container.removeEventListener(\"blur\", removeKeyListener)\n container.removeEventListener(\"mouseenter\", addKeyListener)\n container.removeEventListener(\"mouseleave\", removeKeyListener)\n }\n }\n }, [containerRef])\n\n const screenDStart = applyToPoint(transform, dStart)\n const screenDEnd = applyToPoint(transform, dEnd)\n\n const arrowScreenBounds = {\n left: Math.min(screenDStart.x, screenDEnd.x),\n right: Math.max(screenDStart.x, screenDEnd.x),\n top: Math.min(screenDStart.y, screenDEnd.y),\n bottom: Math.max(screenDStart.y, screenDEnd.y),\n flipX: screenDStart.x > screenDEnd.x,\n flipY: screenDStart.y > screenDEnd.y,\n width: 0,\n height: 0,\n }\n arrowScreenBounds.width = arrowScreenBounds.right - arrowScreenBounds.left\n arrowScreenBounds.height = arrowScreenBounds.bottom - arrowScreenBounds.top\n\n return (\n <div\n ref={containerRef}\n tabIndex={0}\n style={{ position: \"relative\" }}\n onMouseEnter={() => {\n if (containerRef.current) {\n containerRef.current.focus()\n }\n }}\n onMouseLeave={() => {\n if (containerRef.current) {\n containerRef.current.blur()\n }\n }}\n onMouseMove={(e: React.MouseEvent<HTMLDivElement>) => {\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const rwPoint = applyToPoint(inverse(transform!), { x, y })\n mousePosRef.current.x = rwPoint.x\n mousePosRef.current.y = rwPoint.y\n\n if (dimensionToolStretching) {\n setDEnd({ x: rwPoint.x, y: rwPoint.y })\n }\n }}\n onMouseDown={() => {\n if (dimensionToolStretching) {\n setDimensionToolStretching(false)\n } else if (dimensionToolVisible) {\n setDimensionToolVisible(false)\n }\n }}\n >\n {children}\n {dimensionToolVisible && (\n <>\n <div\n style={{\n position: \"absolute\",\n left: arrowScreenBounds.left,\n width: arrowScreenBounds.width,\n textAlign: \"center\",\n top: screenDStart.y + 2,\n color: \"red\",\n mixBlendMode: \"difference\",\n pointerEvents: \"none\",\n marginTop: arrowScreenBounds.flipY ? 0 : -20,\n fontSize: 12,\n fontFamily: \"sans-serif\",\n zIndex: 1000,\n }}\n >\n {Math.abs(dStart.x - dEnd.x).toFixed(2)}\n </div>\n <div\n style={{\n position: \"absolute\",\n left: screenDEnd.x,\n height: arrowScreenBounds.height,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n top: arrowScreenBounds.top,\n color: \"red\",\n pointerEvents: \"none\",\n mixBlendMode: \"difference\",\n fontSize: 12,\n fontFamily: \"sans-serif\",\n zIndex: 1000,\n }}\n >\n <div\n style={{\n marginLeft: arrowScreenBounds.flipX ? \"-100%\" : 4,\n paddingRight: 4,\n }}\n >\n {Math.abs(dStart.y - dEnd.y).toFixed(2)}\n </div>\n </div>\n <svg\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n pointerEvents: \"none\",\n mixBlendMode: \"difference\",\n zIndex: 1000,\n }}\n width={containerBounds.width}\n height={containerBounds.height}\n >\n <defs>\n <marker\n id=\"head\"\n orient=\"auto\"\n markerWidth=\"3\"\n markerHeight=\"4\"\n refX=\"2\"\n refY=\"2\"\n >\n <path d=\"M0,0 V4 L2,2 Z\" fill=\"red\" />\n </marker>\n </defs>\n <line\n x1={screenDStart.x}\n y1={screenDStart.y}\n x2={screenDEnd.x}\n y2={screenDEnd.y}\n markerEnd=\"url(#head)\"\n strokeWidth={1.5}\n fill=\"none\"\n stroke=\"red\"\n />\n <line\n x1={screenDStart.x}\n y1={screenDStart.y}\n x2={screenDEnd.x}\n y2={screenDStart.y}\n strokeWidth={1.5}\n fill=\"none\"\n strokeDasharray={\"2,2\"}\n stroke=\"red\"\n />\n <line\n x1={screenDEnd.x}\n y1={screenDStart.y}\n x2={screenDEnd.x}\n y2={screenDEnd.y}\n strokeWidth={1.5}\n fill=\"none\"\n strokeDasharray={\"2,2\"}\n stroke=\"red\"\n />\n </svg>\n <div\n style={{\n right: 0,\n bottom: 0,\n position: \"absolute\",\n color: \"red\",\n fontFamily: \"sans-serif\",\n fontSize: 12,\n margin: 4,\n }}\n >\n ({dStart.x.toFixed(2)},{dStart.y.toFixed(2)})<br />(\n {dEnd.x.toFixed(2)},{dEnd.y.toFixed(2)})<br />\n dist:{\" \"}\n {Math.sqrt(\n Math.pow(dEnd.x - dStart.x, 2) + Math.pow(dEnd.y - dStart.y, 2),\n ).toFixed(2)}\n </div>\n </>\n )}\n </div>\n )\n}\n","import { Fragment, useState } from \"react\"\nimport { css } from \"@emotion/css\"\nimport {\n LayerRef,\n PCBTraceError,\n SourceError,\n all_layers,\n} from \"@tscircuit/builder\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport { LAYER_NAME_TO_COLOR } from \"lib/Drawer\"\nimport { useGlobalStore } from \"global-store\"\nimport packageJson from \"../../package.json\"\n\ninterface Props {\n children?: any\n elements?: AnySoupElement[]\n}\n\nexport const LayerButton = ({\n name,\n selected,\n onClick,\n}: {\n name: string\n selected?: boolean\n onClick: (e: any) => any\n}) => {\n return (\n <div\n className={css`\n margin-top: 2px;\n padding: 4px;\n padding-left: 8px;\n padding-right: 18px;\n cursor: pointer;\n\n &:hover {\n background-color: rgba(255, 255, 255, 0.1);\n }\n `}\n onClick={onClick}\n >\n <span style={{ marginRight: 2, opacity: selected ? 1 : 0 }}>•</span>\n <span\n style={{\n marginLeft: 2,\n fontWeight: 500,\n color: (LAYER_NAME_TO_COLOR as any)[name.replace(/-/, \"\")],\n }}\n >\n {name}\n </span>\n </div>\n )\n}\n\nexport const ToolbarButton = ({ children, ...props }: any) => (\n <div\n {...props}\n style={{\n backgroundColor: \"#1F1F1F\",\n border: \"1px solid #666\",\n margin: 4,\n padding: 4,\n paddingLeft: 6,\n paddingRight: 6,\n borderRadius: 2,\n alignSelf: \"start\",\n color: \"#eee\",\n cursor: \"pointer\",\n ...props.style,\n }}\n >\n {children}\n </div>\n)\n\nexport const ToolbarOverlay = ({ children, elements }: Props) => {\n const [isMouseOverContainer, setIsMouseOverContainer] = useState(false)\n const [isLayerMenuOpen, setLayerMenuOpen] = useState(false)\n const [isErrorsOpen, setErrorsOpen] = useState(false)\n const [selectedLayer, selectLayer] = useGlobalStore(\n (s) => [s.selected_layer, s.selectLayer] as const,\n )\n const [in_move_footprint_mode, in_draw_trace_mode] = useGlobalStore((s) => [\n s.in_move_footprint_mode,\n s.in_draw_trace_mode,\n ])\n const setEditMode = useGlobalStore((s) => s.setEditMode)\n\n const errorCount =\n elements?.filter((e) => e.type.includes(\"error\")).length ?? 0\n\n return (\n <div\n style={{ position: \"relative\" }}\n onMouseEnter={() => {\n setIsMouseOverContainer(true)\n }}\n onMouseLeave={(e) => {\n setIsMouseOverContainer(false)\n setLayerMenuOpen(false)\n }}\n >\n {children}\n <div\n style={{\n position: \"absolute\",\n bottom: 4,\n right: 8,\n pointerEvents: \"none\",\n color: \"white\",\n fontSize: 11,\n opacity: isMouseOverContainer ? 0.5 : 0,\n transition: \"opacity 1s\",\n transitionDelay: \"2s\",\n fontFamily: \"sans-serif\",\n }}\n >\n @tscircuit/pcb-viewer@{packageJson.version}\n </div>\n <div\n style={{\n position: \"absolute\",\n opacity: isMouseOverContainer ? 1 : 0,\n top: 16,\n left: 16,\n transition: isMouseOverContainer\n ? \"opacity 100ms linear\"\n : \"opacity 1s linear\",\n zIndex: 100,\n color: \"red\",\n display: \"flex\",\n fontSize: 12,\n height: 100,\n fontFamily: \"sans-serif\",\n }}\n >\n <ToolbarButton\n onClick={() => {\n setLayerMenuOpen(!isLayerMenuOpen)\n }}\n onMouseLeave={() => {\n if (isLayerMenuOpen) {\n setLayerMenuOpen(false)\n }\n }}\n >\n <div>\n layer:{\" \"}\n <span\n style={{\n marginLeft: 2,\n fontWeight: 500,\n color: (LAYER_NAME_TO_COLOR as any)[selectedLayer as string],\n }}\n >\n {selectedLayer as string}\n </span>\n </div>\n {isLayerMenuOpen && (\n <div style={{ marginTop: 4, minWidth: 120 }}>\n {all_layers\n .map((l) => l.replace(/-/g, \"\")) // TODO remove when inner-1 becomes inner1\n .map((layer) => (\n <LayerButton\n key={layer}\n name={layer}\n selected={layer === selectedLayer}\n onClick={() => {\n selectLayer(layer.replace(/-/, \"\") as LayerRef)\n }}\n />\n ))}\n </div>\n )}\n </ToolbarButton>\n <ToolbarButton\n style={errorCount > 0 ? { color: \"red\" } : {}}\n onClick={() => setErrorsOpen(!isErrorsOpen)}\n onMouseLeave={() => setErrorsOpen(false)}\n >\n <div>{errorCount} errors</div>\n {isErrorsOpen && (\n <div\n style={{ display: \"grid\", gridTemplateColumns: \"100px 300px\" }}\n >\n {elements\n ?.filter((e): e is PCBTraceError => e.type.includes(\"error\"))\n .map((e, i) => (\n <Fragment key={i}>\n <div>{e.error_type}</div>\n <div>{e.message}</div>\n </Fragment>\n ))}\n </div>\n )}\n </ToolbarButton>\n <ToolbarButton\n style={{}}\n onClick={() => {\n setEditMode(in_draw_trace_mode ? \"off\" : \"draw_trace\")\n }}\n >\n <div>\n {in_draw_trace_mode ? \"✖ \" : \"\"}\n Edit Traces\n </div>\n </ToolbarButton>\n <ToolbarButton\n style={{}}\n onClick={() => {\n setEditMode(in_move_footprint_mode ? \"off\" : \"move_footprint\")\n }}\n >\n <div>\n {in_move_footprint_mode ? \"✖ \" : \"\"}\n Move Components\n </div>\n </ToolbarButton>\n </div>\n </div>\n )\n}\n","{\n \"name\": \"@tscircuit/pcb-viewer\",\n \"version\": \"1.3.13\",\n \"main\": \"dist/index.js\",\n \"repository\": \"tscircuit/pcb-viewer\",\n \"license\": \"MIT\",\n \"scripts\": {\n \"start\": \"storybook dev -p 6006\",\n \"build\": \"tsup ./src/index.tsx --dts --sourcemap --outDir dist\",\n \"yalc\": \"npm run build && yalc push\",\n \"storybook\": \"storybook dev -p 6006\",\n \"build-storybook\": \"storybook build\"\n },\n \"files\": [\n \"dist\"\n ],\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.7.3\",\n \"@semantic-release/commit-analyzer\": \"^9.0.2\",\n \"@semantic-release/git\": \"^10.0.1\",\n \"@semantic-release/npm\": \"^9.0.1\",\n \"@semantic-release/release-notes-generator\": \"^10.0.3\",\n \"@storybook/nextjs\": \"^8.0.6\",\n \"@storybook/react\": \"^8.0.6\",\n \"@swc/core\": \"^1.4.12\",\n \"@tscircuit/builder\": \"^1.5.117\",\n \"@tscircuit/eagle-xml-converter\": \"^0.0.6\",\n \"@tscircuit/props\": \"^0.0.7\",\n \"@tscircuit/react-fiber\": \"^1.1.25\",\n \"@tscircuit/soup\": \"^0.0.33\",\n \"@types/node\": \"18.7.23\",\n \"@types/react\": \"^18.3.3\",\n \"next\": \"^14.1.4\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"react-use\": \"^17.4.0\",\n \"storybook\": \"^8.0.6\",\n \"tsup\": \"^8.0.2\",\n \"type-fest\": \"^3.0.0\",\n \"typescript\": \"^5.4.4\",\n \"use-mouse-matrix-transform\": \"^1.1.13\",\n \"zod\": \"^3.23.5\"\n },\n \"peerDependencies\": {\n \"@tscircuit/builder\": \"*\",\n \"@tscircuit/react-fiber\": \"*\",\n \"react\": \"*\"\n },\n \"dependencies\": {\n \"@emotion/css\": \"^11.11.2\",\n \"color\": \"^4.2.3\",\n \"react-supergrid\": \"^1.0.10\",\n \"transformation-matrix\": \"^2.13.0\",\n \"zustand\": \"^4.5.2\"\n }\n}\n","import { css } from \"@emotion/css\"\nimport { PCBPort, PCBTraceError } from \"@tscircuit/builder\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport { useEffect, useRef, useState } from \"react\"\nimport { Matrix, applyToPoint, identity, inverse } from \"transformation-matrix\"\n\ninterface Props {\n transform?: Matrix\n elements?: AnySoupElement[]\n children: any\n}\n\nexport const ErrorOverlay = ({ children, transform, elements }: Props) => {\n if (!transform) transform = identity()\n const containerRef = useRef<HTMLDivElement | null>(null)\n const containerBounds = containerRef?.current?.getBoundingClientRect()\n\n return (\n <div style={{ position: \"relative\" }} ref={containerRef}>\n {children}\n {elements\n ?.filter((el): el is PCBTraceError => el.type === \"pcb_error\")\n .map((el: PCBTraceError) => {\n const { pcb_port_ids } = el\n\n const port1 = elements.find(\n (el): el is PCBPort =>\n el.type === \"pcb_port\" && el.pcb_port_id === pcb_port_ids?.[0],\n )\n const port2 = elements.find(\n (el): el is PCBPort =>\n el.type === \"pcb_port\" && el.pcb_port_id === pcb_port_ids?.[1],\n )\n\n if (!port1 || !port2) return null\n\n const screenPort1 = applyToPoint(transform, {\n x: port1.x,\n y: port1.y,\n })\n const screenPort2 = applyToPoint(transform, {\n x: port2.x,\n y: port2.y,\n })\n\n const canLineBeDrawn = !(\n isNaN(screenPort1.x) ||\n isNaN(screenPort1.y) ||\n isNaN(screenPort2.x) ||\n isNaN(screenPort2.y)\n )\n\n const midPoint = {\n x: (screenPort1.x + screenPort2.x) / 2,\n y: (screenPort1.y + screenPort2.y) / 2,\n }\n\n if (isNaN(midPoint.x) || isNaN(midPoint.y)) {\n midPoint.x = isNaN(screenPort1.x) ? screenPort2.x : screenPort1.x\n midPoint.y = isNaN(screenPort1.y) ? screenPort2.y : screenPort1.y\n }\n if (isNaN(midPoint.x) || isNaN(midPoint.y)) {\n return null\n }\n\n return (\n <>\n <svg\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n pointerEvents: \"none\",\n mixBlendMode: \"difference\",\n zIndex: 1000,\n }}\n width={containerBounds?.width}\n height={containerBounds?.height}\n >\n {canLineBeDrawn && (\n <line\n x1={screenPort1.x}\n y1={screenPort1.y}\n x2={screenPort2.x}\n y2={screenPort2.y}\n markerEnd=\"url(#head)\"\n strokeWidth={1.5}\n strokeDasharray={\"2,2\"}\n fill=\"none\"\n stroke=\"red\"\n />\n )}\n </svg>\n <div\n className={css`\n position: absolute;\n z-index: 1000;\n left: ${midPoint.x}px;\n top: ${midPoint.y}px;\n color: red;\n text-align: center;\n font-family: sans-serif;\n font-size: 12px;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n transform: translate(-50%, -100%);\n\n & .error-message {\n opacity: 0;\n pointer-events: none;\n\n width: 200px;\n transition: opacity 0.2s;\n margin-bottom: 10px;\n }\n\n &:hover .error-message {\n opacity: 1;\n display: flex;\n }\n `}\n >\n <div className=\"error-message\">{el.message}</div>\n <div\n className={css`\n width: 10px;\n height: 10px;\n transform: translate(0, 5px) rotate(45deg);\n background-color: red;\n `}\n />\n </div>\n </>\n )\n })}\n </div>\n )\n}\n","import type { PCBComponent } from \"@tscircuit/builder\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport { useGlobalStore } from \"global-store\"\nimport { EditEvent } from \"lib/edit-events\"\nimport { useEffect, useRef, useState } from \"react\"\nimport { Matrix, applyToPoint, identity, inverse } from \"transformation-matrix\"\n\ninterface Props {\n transform?: Matrix\n children: any\n soup: AnySoupElement[]\n disabled?: boolean\n cancelPanDrag: Function\n onCreateEditEvent: (event: EditEvent) => void\n onModifyEditEvent: (event: Partial<EditEvent>) => void\n}\n\nconst isInsideOf = (\n pcb_component: PCBComponent,\n point: { x: number; y: number },\n padding: number = 0,\n) => {\n const halfWidth = pcb_component.width / 2\n const halfHeight = pcb_component.height / 2\n\n const left = pcb_component.center.x - halfWidth - padding\n const right = pcb_component.center.x + halfWidth + padding\n const top = pcb_component.center.y - halfHeight - padding\n const bottom = pcb_component.center.y + halfHeight + padding\n\n return point.x > left && point.x < right && point.y > top && point.y < bottom\n}\n\nexport const EditPlacementOverlay = ({\n children,\n disabled: disabledProp,\n transform,\n soup,\n cancelPanDrag,\n onCreateEditEvent,\n onModifyEditEvent,\n}: Props) => {\n if (!transform) transform = identity()\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [activePcbComponentId, setActivePcbComponent] = useState<null | string>(\n null,\n )\n const [dragState, setDragState] = useState<{\n dragStart: { x: number; y: number }\n originalCenter: { x: number; y: number }\n dragEnd: { x: number; y: number }\n edit_event_id: string\n } | null>(null)\n const isPcbComponentActive = activePcbComponentId !== null\n const in_edit_mode = useGlobalStore((s) => s.in_edit_mode)\n const in_move_footprint_mode = useGlobalStore((s) => s.in_move_footprint_mode)\n const setIsMovingComponent = useGlobalStore((s) => s.setIsMovingComponent)\n\n const disabled = disabledProp || !in_move_footprint_mode\n\n return (\n <div\n ref={containerRef}\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n }}\n onMouseDown={(e) => {\n if (disabled) return\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n if (isNaN(x) || isNaN(y)) return\n const rwMousePoint = applyToPoint(inverse(transform!), { x, y })\n\n let foundActiveComponent = false\n for (const e of soup) {\n if (\n e.type === \"pcb_component\" &&\n isInsideOf(e, rwMousePoint, 10 / transform.a)\n ) {\n cancelPanDrag()\n setActivePcbComponent(e.pcb_component_id)\n foundActiveComponent = true\n const edit_event_id = Math.random().toString()\n setDragState({\n dragStart: rwMousePoint,\n originalCenter: e.center,\n dragEnd: rwMousePoint,\n edit_event_id,\n })\n\n onCreateEditEvent({\n edit_event_id,\n pcb_edit_event_type: \"edit_component_location\",\n pcb_component_id: e.pcb_component_id,\n original_center: e.center,\n new_center: e.center,\n in_progress: true,\n created_at: Date.now(),\n })\n\n setIsMovingComponent(true)\n break\n }\n }\n if (!foundActiveComponent) {\n setActivePcbComponent(null)\n }\n\n if (foundActiveComponent) {\n e.preventDefault()\n return false\n }\n }}\n onMouseMove={(e) => {\n if (!activePcbComponentId || !dragState) return\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n if (isNaN(x) || isNaN(y)) return\n const rwMousePoint = applyToPoint(inverse(transform!), { x, y })\n setDragState({\n ...dragState,\n dragEnd: rwMousePoint,\n })\n onModifyEditEvent({\n edit_event_id: dragState.edit_event_id,\n new_center: {\n x:\n dragState.originalCenter.x +\n rwMousePoint.x -\n dragState.dragStart.x,\n y:\n dragState.originalCenter.y +\n rwMousePoint.y -\n dragState.dragStart.y,\n },\n })\n }}\n onMouseUp={(e) => {\n if (!activePcbComponentId) return\n setActivePcbComponent(null)\n setIsMovingComponent(false)\n if (dragState) {\n onModifyEditEvent({\n edit_event_id: dragState.edit_event_id,\n in_progress: false,\n })\n setDragState(null)\n }\n }}\n >\n {children}\n {!disabled &&\n soup\n .filter((e): e is PCBComponent => e.type === \"pcb_component\")\n .map((e) => {\n if (!e?.center) return null\n const projectedCenter = applyToPoint(transform, e.center)\n\n return (\n <div\n key={e.pcb_component_id}\n style={{\n position: \"absolute\",\n pointerEvents: \"none\",\n // b/c of transform, this is actually center not left/top\n left: projectedCenter.x,\n top: projectedCenter.y,\n width: e.width * transform.a + 20,\n height: e.height * transform.a + 20,\n transform: \"translate(-50%, -50%)\",\n background:\n isPcbComponentActive &&\n activePcbComponentId === e.pcb_component_id\n ? \"rgba(255, 0, 0, 0.2)\"\n : \"\",\n }}\n />\n )\n })}\n </div>\n )\n}\n","import type { PCBComponent, PCBSMTPad } from \"@tscircuit/builder\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport { su } from \"@tscircuit/soup-util\"\nimport { useGlobalStore } from \"global-store\"\nimport { EditEvent, EditTraceHintEvent } from \"lib/edit-events\"\nimport { Fragment, useEffect, useRef, useState } from \"react\"\nimport { Matrix, applyToPoint, identity, inverse } from \"transformation-matrix\"\nimport type { PcbRouteHint, PcbTraceHint } from \"@tscircuit/soup\"\nimport { HotkeyActionMenu } from \"./HotkeyActionMenu\"\n\ninterface Props {\n transform?: Matrix\n children: any\n soup: AnySoupElement[]\n disabled?: boolean\n cancelPanDrag: Function\n onCreateEditEvent: (event: EditTraceHintEvent) => void\n onModifyEditEvent: (event: Partial<EditTraceHintEvent>) => void\n}\n\nconst isInsideOf = (\n elm: PCBSMTPad,\n point: { x: number; y: number },\n padding: number = 0,\n) => {\n if (elm.shape === \"circle\") {\n // Not implemented\n return false\n }\n const halfWidth = elm.width / 2\n const halfHeight = elm.height / 2\n\n const left = elm.x - halfWidth - padding\n const right = elm.x + halfWidth + padding\n const top = elm.y - halfHeight - padding\n const bottom = elm.y + halfHeight + padding\n\n return point.x > left && point.x < right && point.y > top && point.y < bottom\n}\n\n/**\n * The trace hit overlay allows you to click a pad, after\n * clicking a pad you'll start dragging out a trace.\n *\n * Each time you click, you'll add to the trace hint path.\n *\n * If you click inside any existing hint, you'll stop adding\n * to the trace hint path.\n *\n * If you select an existing hint, you'll start dragging the\n * route hint. Mouse up stops dragging.\n *\n * If you right click on a hint, you'll delete it.\n *\n * If you right click when creating a trace hint, it will\n * place a hint you'll exit adding the trace hint.\n *\n */\nexport const EditTraceHintOverlay = ({\n children,\n disabled: disabledProp,\n transform,\n soup,\n cancelPanDrag,\n onCreateEditEvent,\n onModifyEditEvent,\n}: Props) => {\n if (!transform) transform = identity()\n const containerRef = useRef<HTMLDivElement | null>(null)\n const containerBounds = containerRef.current?.getBoundingClientRect()\n const [selectedElement, setSelectedElement] = useState<null | PCBSMTPad>(null)\n const [dragState, setDragState] = useState<{\n dragStart: { x: number; y: number }\n originalCenter: { x: number; y: number }\n dragEnd: { x: number; y: number }\n editEvent: EditTraceHintEvent\n shouldDrawRouteHint?: boolean\n } | null>(null)\n const [shouldCreateAsVia, setShouldCreateAsVia] = useState(false)\n const isElementSelected = selectedElement !== null\n const in_edit_trace_mode = useGlobalStore((s) => s.in_draw_trace_mode)\n\n const disabled = disabledProp || !in_edit_trace_mode\n\n let ogCenterScreen, dragEndScreen\n if (dragState?.originalCenter && dragState?.dragEnd) {\n ogCenterScreen = applyToPoint(transform, dragState?.originalCenter!)\n dragEndScreen = applyToPoint(transform, dragState?.dragEnd!)\n }\n\n useEffect(() => {\n if (!isElementSelected) return\n\n function keyDown(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n setSelectedElement(null)\n setDragState(null)\n }\n }\n\n window.addEventListener(\"keydown\", keyDown)\n return () => window.removeEventListener(\"keydown\", keyDown)\n }, [isElementSelected])\n\n return (\n <div\n ref={containerRef}\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n }}\n onMouseDown={(e) => {\n if (disabled) return\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n if (isNaN(x) || isNaN(y)) return\n const rwMousePoint = applyToPoint(inverse(transform!), { x, y })\n\n if (!isElementSelected) {\n for (const e of soup) {\n if (\n e.type === \"pcb_smtpad\" &&\n isInsideOf(e, rwMousePoint, 10 / transform.a)\n ) {\n setSelectedElement(e)\n setShouldCreateAsVia(false)\n setDragState({\n dragStart: rwMousePoint,\n originalCenter: { x: e.x, y: e.y },\n dragEnd: rwMousePoint,\n editEvent: {\n pcb_edit_event_type: \"edit_trace_hint\",\n pcb_port_id: e.pcb_port_id!,\n pcb_trace_hint_id: Math.random().toString(),\n route: [],\n created_at: Date.now(),\n edit_event_id: Math.random().toString(),\n in_progress: true,\n },\n shouldDrawRouteHint: false,\n })\n\n cancelPanDrag()\n break\n }\n }\n } else {\n setDragState({\n ...(dragState as any),\n dragStart: rwMousePoint,\n shouldDrawRouteHint: true,\n })\n }\n }}\n onMouseMove={(e) => {\n if (!isElementSelected || !dragState) return\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n if (isNaN(x) || isNaN(y)) return\n const rwMousePoint = applyToPoint(inverse(transform!), { x, y })\n setDragState({\n ...dragState,\n dragEnd: rwMousePoint,\n })\n }}\n onMouseUp={(e) => {\n if (!isElementSelected) return\n if (!dragState?.shouldDrawRouteHint) return\n\n // Compute distance that has been dragged\n const { dragStart, dragEnd } = dragState\n const rwDist = Math.sqrt(\n (dragEnd.x - dragStart.x) ** 2 + (dragEnd.y - dragStart.y) ** 2,\n )\n const screenDist = rwDist * transform.a\n\n // If the user dragged, don't create a point\n if (screenDist > 20) return\n\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n if (isNaN(x) || isNaN(y)) return\n const rwMousePoint = applyToPoint(inverse(transform!), { x, y })\n\n if (dragState) {\n cancelPanDrag()\n const lastPointScreen = applyToPoint(\n transform,\n dragState.editEvent.route.slice(-1)[0] ?? dragState.originalCenter,\n )\n const distanceFromLastPoint = Math.sqrt(\n (x - lastPointScreen.x) ** 2 + (y - lastPointScreen.y) ** 2,\n )\n if (distanceFromLastPoint < 20) {\n // Close the trace hint\n onCreateEditEvent({\n ...dragState.editEvent,\n in_progress: false,\n })\n setDragState(null)\n setSelectedElement(null)\n return\n }\n // Edit existing edit event by adding a new point at the rwMousePoint\n setDragState({\n ...dragState,\n editEvent: {\n ...dragState.editEvent,\n route: [\n ...dragState.editEvent.route,\n { ...rwMousePoint, via: shouldCreateAsVia },\n ],\n },\n })\n }\n }}\n >\n {children}\n {in_edit_trace_mode &&\n dragState?.editEvent &&\n ogCenterScreen &&\n dragEndScreen && (\n <svg\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n pointerEvents: \"none\",\n mixBlendMode: \"difference\",\n zIndex: 1000,\n }}\n width={containerBounds?.width}\n height={containerBounds?.height}\n >\n <path\n stroke=\"red\"\n d={`M ${ogCenterScreen.x} ${ogCenterScreen.y} ${dragState?.editEvent.route\n .map((p) => applyToPoint(transform!, p))\n .map((p) => `L ${p.x} ${p.y}`)\n .join(\" \")} L ${dragEndScreen.x} ${dragEndScreen.y}`}\n />\n {dragState?.editEvent.route.map((r, i) => {\n const rScreen = applyToPoint(transform!, r)\n return (\n <Fragment key={`r-${i}`}>\n {r.via && (\n <circle cx={rScreen.x} cy={rScreen.y} r={16} stroke=\"red\" />\n )}\n <circle cx={rScreen.x} cy={rScreen.y} r={8} stroke=\"red\" />\n </Fragment>\n )\n })}\n {shouldCreateAsVia && (\n <circle\n key=\"via-outer-circle\"\n cx={dragEndScreen.x}\n cy={dragEndScreen.y}\n r={16}\n stroke=\"red\"\n />\n )}\n <circle\n cx={dragEndScreen.x}\n cy={dragEndScreen.y}\n r={8}\n stroke=\"red\"\n />\n </svg>\n )}\n {!disabled && (\n <svg\n key={\"pcb-trace-hints\"}\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n pointerEvents: \"none\",\n mixBlendMode: \"difference\",\n zIndex: 1000,\n }}\n width={containerBounds?.width}\n height={containerBounds?.height}\n >\n {soup\n .filter((e): e is PcbTraceHint => e.type === \"pcb_trace_hint\")\n .map((e) => {\n const { route } = e\n const pcb_port = su(soup).pcb_port.get(e.pcb_port_id)!\n const pcb_port_screen = applyToPoint(transform!, pcb_port)\n return (\n <Fragment key={e.pcb_trace_hint_id}>\n <rect\n key={`rect-${e.pcb_port_id}`}\n x={pcb_port_screen.x - 10}\n y={pcb_port_screen.y - 10}\n width={20}\n height={20}\n stroke=\"red\"\n />\n <path\n key={`path-${e.pcb_port_id}`}\n stroke=\"red\"\n d={`M ${pcb_port_screen.x} ${pcb_port_screen.y} ${route\n .map((r) => applyToPoint(transform!, r))\n .map((r) => `L ${r.x} ${r.y}`)\n .join(\" \")}`}\n />\n {route\n .map((r) => ({ ...r, ...applyToPoint(transform, r) }))\n .map((r, i) => (\n <Fragment key={i}>\n <circle cx={r.x} cy={r.y} r={8} stroke=\"red\" />\n {r.via && (\n <circle\n cx={r.x}\n cy={r.y}\n r={16}\n stroke=\"red\"\n fill=\"transparent\"\n />\n )}\n </Fragment>\n ))}\n </Fragment>\n )\n })}\n </svg>\n )}\n <div\n style={{\n position: \"absolute\",\n right: 0,\n bottom: 0,\n }}\n >\n {isElementSelected && (\n <HotkeyActionMenu\n hotkeys={[\n {\n key: \"v\",\n name: \"Toggle Via\",\n onUse: () => {\n setShouldCreateAsVia(!shouldCreateAsVia)\n },\n },\n // {\n // key: \"del\",\n // name: \"Delete Node\",\n // onUse: () => {},\n // },\n // {\n // key: \"r\",\n // name: \"Delete Route\",\n // onUse: () => {},\n // },\n ]}\n />\n )}\n </div>\n </div>\n )\n}\n","import { css } from \"@emotion/css\"\nimport { useEffect } from \"react\"\n\nexport const HotkeyActionMenu = ({\n hotkeys,\n}: {\n hotkeys: Array<{\n key: string\n name: string\n onUse: Function\n }>\n}) => {\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n hotkeys.forEach((hotkey) => {\n if (event.key === hotkey.key) {\n hotkey.onUse()\n }\n })\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown)\n }\n }, [hotkeys])\n\n return (\n <div\n className={css`\n display: flex;\n flex-direction: column;\n font-family: sans-serif;\n font-size: 12px;\n margin: 8px;\n `}\n >\n {hotkeys.map((hotkey) => {\n return (\n <div\n key={hotkey.name}\n className={css`\n display: flex;\n align-items: center;\n margin: 2px;\n\n & .key {\n padding: 1px;\n margin: 2px;\n color: rgba(255, 255, 255, 0.8);\n font-size: 9px;\n border-radius: 3px;\n text-align: center;\n width: 20px;\n background-color: #444;\n }\n\n & .name {\n margin-left: 4px;\n color: rgba(255, 255, 255, 0.8);\n }\n `}\n >\n <div className=\"key\">{hotkey.key}</div>{\" \"}\n <div className=\"name\">{hotkey.name}</div>\n </div>\n )\n })}\n </div>\n )\n}\n","export var noop = function () { };\nexport function on(obj) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (obj && obj.addEventListener) {\n obj.addEventListener.apply(obj, args);\n }\n}\nexport function off(obj) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (obj && obj.removeEventListener) {\n obj.removeEventListener.apply(obj, args);\n }\n}\nexport var isBrowser = typeof window !== 'undefined';\nexport var isNavigator = typeof navigator !== 'undefined';\n","import { useEffect, useLayoutEffect } from 'react';\nimport { isBrowser } from './misc/util';\nvar useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : useEffect;\nexport default useIsomorphicLayoutEffect;\n","import { useMemo, useState } from 'react';\nimport useIsomorphicLayoutEffect from './useIsomorphicLayoutEffect';\nimport { isBrowser, noop } from './misc/util';\nvar defaultState = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n};\nfunction useMeasure() {\n var _a = useState(null), element = _a[0], ref = _a[1];\n var _b = useState(defaultState), rect = _b[0], setRect = _b[1];\n var observer = useMemo(function () {\n return new window.ResizeObserver(function (entries) {\n if (entries[0]) {\n var _a = entries[0].contentRect, x = _a.x, y = _a.y, width = _a.width, height = _a.height, top_1 = _a.top, left = _a.left, bottom = _a.bottom, right = _a.right;\n setRect({ x: x, y: y, width: width, height: height, top: top_1, left: left, bottom: bottom, right: right });\n }\n });\n }, []);\n useIsomorphicLayoutEffect(function () {\n if (!element)\n return;\n observer.observe(element);\n return function () {\n observer.disconnect();\n };\n }, [element]);\n return [ref, rect];\n}\nexport default isBrowser && typeof window.ResizeObserver !== 'undefined'\n ? useMeasure\n : (function () { return [noop, defaultState]; });\n","import { transformPCBElement, transformPCBElements } from \"@tscircuit/builder\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport type { EditEvent } from \"./edit-events\"\nimport { translate } from \"transformation-matrix\"\nimport { applyTraceHintEditEvent } from \"./apply-edit-events/apply-edit-trace-hint-event\"\n\nexport const applyEditEvents = (\n soup: AnySoupElement[],\n edit_events: EditEvent[],\n): AnySoupElement[] => {\n soup = JSON.parse(JSON.stringify(soup))\n\n for (const edit_event of edit_events) {\n if (edit_event.pcb_edit_event_type === \"edit_component_location\") {\n const mat = translate(\n edit_event.new_center.x - edit_event.original_center.x,\n edit_event.new_center.y - edit_event.original_center.y,\n )\n // TODO Future work: recurse here in case there's a nested component\n soup = soup.map((e: any) =>\n e.pcb_component_id !== edit_event.pcb_component_id\n ? e\n : transformPCBElement(e, mat),\n )\n } else if (edit_event.pcb_edit_event_type === \"edit_trace_hint\") {\n soup = applyTraceHintEditEvent(soup, edit_event)\n }\n }\n\n return soup\n}\n","import { AnySoupElement } from \"@tscircuit/soup\"\nimport { EditTraceHintEvent } from \"lib/edit-events\"\nimport { su } from \"@tscircuit/soup-util\"\n\nexport const applyTraceHintEditEvent = (\n soup: AnySoupElement[],\n edit_event: EditTraceHintEvent,\n): AnySoupElement[] => {\n const existing_trace_hint = soup.find(\n (th) =>\n th.type === \"pcb_trace_hint\" &&\n th.pcb_trace_hint_id === edit_event.pcb_trace_hint_id,\n )\n\n if (existing_trace_hint) {\n soup = soup.map((e: any) =>\n e.pcb_trace_hint_id === edit_event.pcb_trace_hint_id\n ? {\n ...e,\n route: edit_event.route,\n }\n : e,\n )\n } else {\n // create the trace hint\n const pcb_port = su(soup).pcb_port.get(edit_event.pcb_port_id!)\n\n // console.log(\"edit_event\", edit_event, pcb_port)\n\n soup = soup\n // TODO until builder supports multiple trace hints, replace any\n // old trace hints on this same port\n .filter(\n (e) =>\n !(\n e.type === \"pcb_trace_hint\" &&\n e.pcb_port_id === edit_event.pcb_port_id\n ),\n )\n .concat([\n {\n type: \"pcb_trace_hint\",\n pcb_trace_hint_id: edit_event.pcb_trace_hint_id!,\n route: edit_event.route,\n pcb_port_id: edit_event.pcb_port_id!,\n pcb_component_id: pcb_port?.pcb_component_id!,\n },\n ])\n }\n\n return soup\n}\n"]}
1
+ {"version":3,"sources":["../node_modules/@tscircuit/soup-util/index.ts","../node_modules/use-mouse-matrix-transform/src/index.ts","../src/index.tsx","../src/PCBViewer.tsx","../src/components/CanvasPrimitiveRenderer.tsx","../src/assets/alphabet.ts","../src/lib/convert-text-to-lines.ts","../src/lib/draw-primitives.ts","../src/lib/util/scale-only.ts","../src/lib/Drawer.ts","../src/lib/colors.ts","../src/global-store.ts","../src/components/ContextProviders.tsx","../src/components/CanvasElementsRenderer.tsx","../src/lib/convert-element-to-primitive.ts","../src/components/MouseElementTracker.tsx","../src/components/ElementOverlayBox.tsx","../src/components/DimensionOverlay.tsx","../src/components/ToolbarOverlay.tsx","../package.json","../src/components/ErrorOverlay.tsx","../src/components/EditPlacementOverlay.tsx","../src/components/EditTraceHintOverlay.tsx","../src/components/HotkeyActionMenu.tsx","../node_modules/react-use/esm/misc/util.js","../node_modules/react-use/esm/useIsomorphicLayoutEffect.js","../node_modules/react-use/esm/useMeasure.js","../src/lib/apply-edit-events.ts","../src/lib/apply-edit-events/apply-edit-trace-hint-event.ts"],"names":["__export","su","module","__toCommonJS","src_exports","useMouseMatrixTransform","import_transformation_matrix","import_react","import_builder","createZustandStore","useZustandStore","import_jsx_runtime","highlightedPrimitives","mousedPrimitives","container","import_css","el","e","isInsideOf","primitives","_a","import_soup_util","height","elements"],"mappings":"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","sourcesContent":["import type {\n AnySoupElement,\n AnySoupElementInput,\n SourceComponentBase,\n SourcePort,\n} from \"@tscircuit/soup\"\n\ntype SoupOps<\n K extends AnySoupElement[\"type\"],\n T extends AnySoupElement | AnySoupElementInput\n> = {\n get: (id: string) => Extract<T, { type: K }> | null\n select: (selector: string) => Extract<T, { type: K }> | null\n getWhere: (where: any) => Extract<T, { type: K }> | null\n getUsing: (using: {\n [key: `${string}_id`]: string\n }) => Extract<T, { type: K }> | null\n list: (where?: any) => Extract<T, { type: K }>[]\n}\n\nexport type SoupUtilObject = {\n [K in AnySoupElement[\"type\"]]: SoupOps<K, AnySoupElement>\n}\nexport type SoupInputUtilObject = {\n [K in AnySoupElementInput[\"type\"]]: SoupOps<K, AnySoupElementInput>\n}\n\nexport type GetSoupUtilObject = ((soup: AnySoupElement[]) => SoupUtilObject) & {\n unparsed: (soup: AnySoupElementInput[]) => SoupInputUtilObject\n}\n\nexport const su: GetSoupUtilObject = ((soup: AnySoupElement[]) => {\n const su = new Proxy(\n {},\n {\n get: (proxy_target: any, component_type: string) => {\n return {\n get: (id: string) =>\n soup.find(\n (e: any) =>\n e.type === component_type && e[`${component_type}_id`] === id\n ),\n getUsing: (using: any) => {\n const keys = Object.keys(using)\n if (keys.length !== 1) {\n throw new Error(\n \"getUsing requires exactly one key, e.g. { pcb_component_id }\"\n )\n }\n const join_key = keys[0] as string\n const join_type = join_key.replace(\"_id\", \"\")\n const joiner: any = soup.find(\n (e: any) =>\n e.type === join_type && e[join_key] === using[join_key]\n )\n if (!joiner) return null\n return soup.find(\n (e: any) =>\n e.type === component_type &&\n e[`${component_type}_id`] === joiner[`${component_type}_id`]\n )\n },\n getWhere: (where: any) => {\n const keys = Object.keys(where)\n return soup.find(\n (e: any) =>\n e.type === component_type &&\n keys.every((key) => e[key] === where[key])\n )\n },\n list: (where?: any) => {\n const keys = !where ? [] : Object.keys(where)\n return soup.filter(\n (e: any) =>\n e.type === component_type &&\n keys.every((key) => e[key] === where[key])\n )\n },\n select: (selector: string) => {\n // TODO when applySelector is isolated we can use it, until then we\n // do a poor man's selector implementation for two common cases\n if (component_type === \"source_component\") {\n return soup.find(\n (e) =>\n e.type === \"source_component\" &&\n e.name === selector.replace(/\\./g, \"\")\n )\n } else if (\n component_type === \"pcb_port\" ||\n component_type === \"source_port\" ||\n component_type === \"schematic_port\"\n ) {\n const [component_name, port_selector] = selector\n .replace(/\\./g, \"\")\n .split(/[\\s\\>]+/)\n const source_component = soup.find(\n (e) =>\n e.type === \"source_component\" && e.name === component_name\n ) as SourceComponentBase\n if (!source_component) return null\n const source_port = soup.find(\n (e) =>\n e.type === \"source_port\" &&\n e.source_component_id ===\n source_component.source_component_id &&\n (e.name === port_selector ||\n (e.port_hints ?? []).includes(port_selector!))\n ) as SourcePort\n if (!source_port) return null\n if (component_type === \"source_port\") return source_port\n\n if (component_type === \"pcb_port\") {\n return soup.find(\n (e) =>\n e.type === \"pcb_port\" &&\n e.source_port_id === source_port.source_port_id\n )\n } else if (component_type === \"schematic_port\") {\n return soup.find(\n (e) =>\n e.type === \"schematic_port\" &&\n e.source_port_id === source_port.source_port_id\n )\n }\n }\n },\n }\n },\n }\n )\n\n return su\n}) as any\nsu.unparsed = su as any\n\nexport default su\n","import {\n Matrix,\n identity,\n scale,\n translate,\n compose,\n applyToPoint,\n} from \"transformation-matrix\"\nimport { useCallback, useEffect, useReducer, useRef, useState } from \"react\"\n\ntype Point = { x: number; y: number }\n\ninterface Props {\n canvasElm?: HTMLElement\n transform?: Matrix\n initialTransform?: Matrix\n onSetTransform?: (transform: Matrix) => any\n}\n\nexport const useMouseMatrixTransform = (props: Props = {}) => {\n const extRef = useRef<any>(null)\n const [lastDragCancelTime, setLastDragCancelTime] = useState(0)\n const outerCanvasElm = props.canvasElm ?? extRef.current\n const [internalTransform, setInternalTransform] = useState<Matrix>(\n props.initialTransform ?? identity()\n )\n const [waitCounter, setWaitCounter] = useState(0)\n const [extChangeCounter, incExtChangeCounter] = useReducer((s) => s + 1, 0)\n\n const setTransform = useCallback(\n (newTransform: Matrix) => {\n if (props.onSetTransform) {\n props.onSetTransform(newTransform)\n }\n if (!props.transform) {\n setInternalTransform(newTransform)\n }\n },\n [props.onSetTransform, setInternalTransform]\n )\n\n const setTransformExt = useCallback(\n (newTransform: Matrix) => {\n setTransform(newTransform)\n incExtChangeCounter()\n },\n [setTransform]\n )\n\n const transform = props.transform ?? internalTransform\n\n const cancelDrag = useCallback(() => {\n setLastDragCancelTime(Date.now())\n }, [])\n\n useEffect(() => {\n const canvasElm: HTMLCanvasElement | null =\n props.canvasElm ?? extRef.current\n if (canvasElm && !outerCanvasElm) {\n // Always re-render when the canvas element is known\n setWaitCounter(waitCounter + 1)\n return\n }\n if (!canvasElm) {\n const timeout = setTimeout(() => {\n setWaitCounter(waitCounter + 1)\n }, 100)\n return () => clearTimeout(timeout)\n }\n let init_tf = props.transform ?? internalTransform\n\n let m0: Point = { x: 0, y: 0 },\n m1: Point = { x: 0, y: 0 },\n md = false,\n mlastrel: Point = { x: 0, y: 0 }\n\n const getMousePos = (e: MouseEvent) => {\n return {\n x: e.pageX - canvasElm.getBoundingClientRect().left - window.scrollX,\n y: e.pageY - canvasElm.getBoundingClientRect().top - window.scrollY,\n }\n }\n\n function handleMouseDown(e: MouseEvent) {\n m0 = getMousePos(e)\n if (Date.now() - lastDragCancelTime < 100) return\n md = true\n e.preventDefault()\n }\n function handleMouseUp(e: MouseEvent) {\n if (!md) return\n m1 = getMousePos(e)\n\n const new_tf = compose(translate(m1.x - m0.x, m1.y - m0.y), init_tf)\n setTransform(new_tf)\n init_tf = new_tf\n\n md = false\n }\n function handleMouseMove(e: MouseEvent) {\n mlastrel = getMousePos(e)\n if (!md) return\n m1 = getMousePos(e)\n\n setTransform(compose(translate(m1.x - m0.x, m1.y - m0.y), init_tf))\n }\n function handleMouseWheel(e: WheelEvent) {\n const center = getMousePos(e)\n const new_tf = compose(\n translate(center.x, center.y),\n scale(1 - e.deltaY / 1000, 1 - e.deltaY / 1000),\n translate(-center.x, -center.y),\n init_tf\n )\n setTransform(new_tf)\n init_tf = new_tf\n e.preventDefault()\n }\n function handleMouseOut(e: MouseEvent) {\n if (!md) return\n\n // If the mouseout occurs in the bounding box of the canvasElm, it's\n // defocusing on internal elements, so we should ignore it\n if (canvasElm) {\n const boundingBox = canvasElm.getBoundingClientRect()\n if (\n e.clientX >= boundingBox.left + 10 &&\n e.clientX <= boundingBox.right - 10 &&\n e.clientY >= boundingBox.top + 10 &&\n e.clientY <= boundingBox.bottom - 10\n ) {\n return\n }\n }\n\n md = false\n m1 = getMousePos(e)\n\n const new_tf = compose(translate(m1.x - m0.x, m1.y - m0.y), init_tf)\n setTransform(new_tf)\n init_tf = new_tf\n }\n\n canvasElm.addEventListener(\"mousedown\", handleMouseDown)\n canvasElm.addEventListener(\"mouseup\", handleMouseUp)\n window.addEventListener(\"mousemove\", handleMouseMove)\n canvasElm.addEventListener(\"mouseout\", handleMouseOut)\n canvasElm.addEventListener(\"wheel\", handleMouseWheel)\n\n return () => {\n canvasElm.removeEventListener(\"mousedown\", handleMouseDown)\n canvasElm.removeEventListener(\"mouseup\", handleMouseUp)\n window.removeEventListener(\"mousemove\", handleMouseMove)\n canvasElm.removeEventListener(\"mouseout\", handleMouseOut)\n canvasElm.removeEventListener(\"wheel\", handleMouseWheel)\n }\n }, [outerCanvasElm, waitCounter, extChangeCounter, lastDragCancelTime])\n\n const applyTransformToPoint = useCallback(\n (obj: Point | [number, number]) => applyToPoint(transform, obj),\n [transform]\n )\n\n return {\n ref: extRef,\n transform,\n applyTransformToPoint,\n setTransform: setTransformExt,\n cancelDrag\n }\n}\n\nexport default useMouseMatrixTransform\n","export * from \"./PCBViewer\"\nexport type { EditEvent } from \"lib/edit-events\"\nexport { applyEditEvents } from \"lib/apply-edit-events\"\nexport { CanvasElementsRenderer } from \"./components/CanvasElementsRenderer\"\n","import React, { useEffect, useMemo, useState } from \"react\"\nimport { createRoot } from \"@tscircuit/react-fiber\"\nimport { createProjectBuilder } from \"@tscircuit/builder\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport { CanvasElementsRenderer } from \"./components/CanvasElementsRenderer\"\nimport useMouseMatrixTransform from \"use-mouse-matrix-transform\"\nimport { useMeasure } from \"react-use\"\nimport { compose, scale, translate } from \"transformation-matrix\"\nimport { findBoundsAndCenter } from \"@tscircuit/builder\"\nimport { ContextProviders } from \"components/ContextProviders\"\nimport type { EditEvent } from \"lib/edit-events\"\nimport { applyEditEvents } from \"lib/apply-edit-events\"\n\nconst defaultTransform = compose(translate(400, 300), scale(40, -40))\n\ntype Props = {\n children?: any\n soup?: any\n height?: number\n allowEditing?: boolean\n editEvents?: EditEvent[]\n onEditEventsChanged?: (editEvents: EditEvent[]) => void\n}\n\nexport const PCBViewer = ({\n children,\n soup,\n height = 600,\n allowEditing = true,\n editEvents: editEventsProp,\n onEditEventsChanged,\n}: Props) => {\n const [stateElements, setStateElements] = useState<Array<AnySoupElement>>([])\n const [ref, refDimensions] = useMeasure()\n const [transform, setTransformInternal] = useState(defaultTransform)\n const {\n ref: transformRef,\n setTransform,\n cancelDrag: cancelPanDrag,\n } = useMouseMatrixTransform({\n transform,\n onSetTransform: setTransformInternal,\n })\n let [editEvents, setEditEvents] = useState<EditEvent[]>([])\n editEvents = editEventsProp ?? editEvents\n\n const [error, setError] = useState(null)\n\n const resetTransform = () => {\n const elmBounds =\n refDimensions?.width > 0 ? refDimensions : { width: 500, height: 500 }\n const { center, width, height } = elements.some((e) =>\n e.type.startsWith(\"pcb_\"),\n )\n ? findBoundsAndCenter(\n elements.filter((e) => e.type.startsWith(\"pcb_\")) as any,\n )\n : { center: { x: 0, y: 0 }, width: 0.001, height: 0.001 }\n const scaleFactor =\n Math.min(\n (elmBounds.width ?? 0) / width,\n (elmBounds.height ?? 0) / height,\n 100,\n ) * 0.75\n setTransform(\n compose(\n translate((elmBounds.width ?? 0) / 2, (elmBounds.height ?? 0) / 2),\n // translate(100, 0),\n scale(scaleFactor, -scaleFactor, 0, 0),\n translate(-center.x, -center.y),\n ),\n )\n }\n\n useEffect(() => {\n if (!children || children?.length === 0) return\n async function doRender() {\n // TODO re-use project builder\n const projectBuilder = createProjectBuilder()\n await createRoot()\n .render(children, projectBuilder as any)\n .then((elements) => {\n setStateElements(elements as any)\n setError(null)\n })\n }\n doRender().catch((e) => {\n setError(e.toString())\n console.log(e.toString())\n })\n }, [children])\n\n useEffect(() => {\n if (refDimensions && refDimensions.width !== 0 && (children || soup)) {\n resetTransform()\n }\n }, [children, refDimensions])\n\n if (error) return <div style={{ color: \"red\" }}> {error} </div>\n\n const pcbElmsPreEdit: AnySoupElement[] = (soup ?? stateElements).filter(\n (e: any) => e.type.startsWith(\"pcb_\") || e.type.startsWith(\"source_\"),\n )\n\n const elements = useMemo(() => {\n return applyEditEvents(pcbElmsPreEdit, editEvents)\n }, [pcbElmsPreEdit, editEvents])\n\n const onCreateEditEvent = (event: EditEvent) => {\n setEditEvents([...editEvents, event])\n onEditEventsChanged?.([...editEvents, event])\n }\n const onModifyEditEvent = (modifiedEvent: Partial<EditEvent>) => {\n const newEditEvents: EditEvent[] = editEvents.map((e) =>\n e.edit_event_id === modifiedEvent.edit_event_id\n ? ({ ...e, ...modifiedEvent } as EditEvent)\n : e,\n )\n setEditEvents(newEditEvents)\n onEditEventsChanged?.(newEditEvents)\n }\n\n return (\n <div ref={transformRef as any}>\n <div ref={ref as any}>\n <ContextProviders>\n <CanvasElementsRenderer\n key={refDimensions.width}\n transform={transform}\n height={height}\n width={refDimensions.width}\n allowEditing={allowEditing}\n cancelPanDrag={cancelPanDrag}\n onCreateEditEvent={onCreateEditEvent}\n onModifyEditEvent={onModifyEditEvent}\n grid={{\n spacing: 1,\n view_window: {\n left: 0,\n right: refDimensions.width || 500,\n top: height,\n bottom: 0,\n },\n }}\n elements={elements}\n />\n </ContextProviders>\n </div>\n </div>\n )\n}\n","import { drawGrid } from \"lib/draw-grid\"\nimport { SuperGrid, toMMSI } from \"react-supergrid\"\nimport React, { useEffect, useRef } from \"react\"\nimport { Matrix } from \"transformation-matrix\"\nimport { drawPrimitives } from \"../lib/draw-primitives\"\nimport { Drawer } from \"../lib/Drawer\"\nimport { GridConfig, Primitive } from \"../lib/types\"\nimport { useGlobalStore } from \"global-store\"\nimport { all_layers } from \"@tscircuit/builder\"\n\ninterface Props {\n primitives: Primitive[]\n defaultUnit?: string\n transform?: Matrix\n grid?: GridConfig\n width?: number\n height?: number\n}\n\nexport const CanvasPrimitiveRenderer = ({\n primitives,\n transform,\n grid,\n width = 500,\n height = 500,\n}: Props) => {\n const canvasRefs = useRef<Record<string, HTMLCanvasElement>>()\n const selectedLayer = useGlobalStore((s) => s.selected_layer)\n\n useEffect(() => {\n if (!canvasRefs.current) return\n if (Object.keys(canvasRefs.current).length === 0) return\n const drawer = new Drawer(canvasRefs.current)\n if (transform) drawer.transform = transform\n drawer.clear()\n drawer.foregroundLayer = selectedLayer\n drawPrimitives(drawer, primitives)\n drawer.orderAndFadeLayers()\n }, [primitives, transform, selectedLayer])\n\n return (\n <div\n style={{\n backgroundColor: \"black\",\n width,\n height,\n position: \"relative\",\n }}\n >\n <SuperGrid\n textColor=\"rgba(0,255,0,0.8)\"\n majorColor=\"rgba(0,255,0,0.4)\"\n minorColor=\"rgba(0,255,0,0.2)\"\n screenSpaceCellSize={200}\n width={width}\n height={height}\n transform={transform!}\n stringifyCoord={(x, y, z) => `${toMMSI(x, z)}, ${toMMSI(y, z)}`}\n />\n {all_layers\n .map((l) => l.replace(/-/g, \"\"))\n .concat([\"drill\", \"other\"])\n .map((layer, i) => (\n <canvas\n key={layer}\n ref={(el) => {\n canvasRefs.current ??= {}\n canvasRefs.current[layer] = el!\n }}\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n pointerEvents: \"none\",\n }}\n width={width}\n height={height}\n ></canvas>\n ))}\n </div>\n )\n}\n","/*\n * Maps letters/numbers to an SVG path\n * You must normalize the path prior to putting it here! That means it needs to\n * be entirely in the bounds [0,1] for both x and y.\n * You can use this svg editor tool to add characters: https://yqnn.github.io/svg-path-editor/\n */\nexport const svgAlphabet = {\n \"0\": \"M0.4544564813877358 0L0.2723441540828736 0.03592830447352719L0.1086847233315459 0.14528754990019965L0.020630545837255005 0.3040632652221331L0 0.5395277421960205L0.049259221760993496 0.7369487828466779L0.18080513776237842 0.9005494166306564L0.37036887043974215 0.9872116270037247L0.5864663759301132 1L0.8148695622827444 0.9332890276148733L0.9326583645506394 0.8113052246023419L1 0.4031281830668562L0.833288960385582 0.09886798567812842L0.6801767918233781 0.02483708485091681L0.4544564813877358 0\",\n \"1\": \"M 0.198 0.272 L 0.537 0 L 0.54 1\",\n \"2\": \"M0.069593147751606 0.19461498231706575L0.1039380353319058 0.1224291500164194L0.20543361884368308 0.05510832064153169L0.3717712794432549 0.009452970962689482L0.4785344452623127 0L0.663238590738758 0.008714098643339864L0.8017933618843684 0.04769189395915288L0.8775637379550322 0.10746757678258442L0.9047778372591005 0.17693069668193287L0.9029710920770878 0.2231347105796246L0.8704496788008566 0.30047744598157516L0.7292906538577354 0.4508486051631194L0.3737955032119913 0.7369006417749693L0 1L1 1\",\n \"3\": \"M0.03917438899874637 0.19855364635107545L0.15510940508963084 0.06745632622133718L0.37598645522339846 0L0.8486391893813088 0.0652271323161611L0.9782182415054349 0.21747394183735683L0.9213133780517754 0.3547560290117714L0.6504271515903481 0.4543436297681271L0.22975249764129613 0.48476611625264143L0.7659038682744629 0.5411919558122493L0.9258712987734741 0.6203185665660985L1 0.7458360609169667L0.8938813281118737 0.9059190913045964L0.6166890258875837 1L0.261528440153542 0.9874861530507921L0 0.8837289530851273\",\n \"4\": \"M0.7328897338403042 0L0 0.6684672518568535L1 0.6684672518568535M0.7243346007604563 0.4530722484807562L0.7243346007604563 1\",\n \"5\": \"M 0 0 L 0 0.4973 L 0.4262 0.4319 L 0.7305 0.4565 L 0.8516 0.5009 L 0.9357 0.5639 L 1 0.7356 L 0.9696 0.8248 L 0.8898 0.895 L 0.733 0.9602 L 0.5518 0.9945 L 0.3814 1 L 0.2379 0.9821 L 0.1219 0.947 L 0 0.8748 M 0 0 L 1 0\",\n \"6\": \"M0.6964601700926856 0L0.3639239026215478 0.0743562375769351L0.1415931962925719 0.21735490179786915L0.009977939399608712 0.46336322325406004L0.00029622007592593224 0.7083131475173043L0.09408885043224748 0.8746809149767036L0.3379247445101846 0.9876686500961888L0.7109203869569624 1L0.9260852957913362 0.9103558029693921L1 0.7716571969091733L0.9824294723385016 0.6390635485705886L0.7446504992867332 0.4733643097729175L0.31028858071607296 0.47578021640899115L0.1208702146816024 0.5481452483973847L0 0.6616669755788906\",\n \"7\": \"M0 0L1 0L0.9246479649697582 0.030539772727272752L0.8850302419354837 0.05075757575757579L0.7922946068548385 0.11079545454545457L0.7419268208165322 0.15213068181818185L0.6907258064516127 0.20202020202020204L0.6400666267641127 0.26122159090909086L0.5913243447580644 0.33049242424242414L0.5458740234374998 0.4105902777777778L0.5050907258064514 0.5022727272727272L0.4703495148689514 0.6062973484848484L0.43257456133442534 0.787133049242424L0.41612903225806447 1\",\n \"8\": \"M0.5143001078924863 0L0.16007477667923162 0.10731570786949331L0.14924628550868277 0.3146018498698755L0.2939585848842112 0.41617921794558677L0.8648302624811545 0.5385163833653317L1 0.7775820770511038L0.8180842915260376 0.9505845566922285L0.41968938540525413 1L0.08062381919779889 0.882831681184498L0 0.6936376947135333L0.17150171673893433 0.5188652309607817L0.6529263782780712 0.4242818653203618L0.8650205888491803 0.29644027376796367L0.8702067371119496 0.09910067291661573L0.5143001078924863 0\",\n \"9\": \"M1 0.25379591792994305L0.9514789771111742 0.11679361536614272L0.8702482473521467 0.05711741614054847L0.7327445265851579 0.015213872471965633L0.525248180711544 0L0.3292056884418538 0.012928195113745608L0.15997632037247655 0.058762870026191856L0.05266940041228321 0.12882439350476L0 0.2562067822770946L0.11316462894512366 0.4121335905917837L0.2403060136479954 0.4603365890068938L0.4097241967586011 0.4745978388276783L0.8642414300184816 0.420815170259988L0.9732054796346318 0.34537434075898393L1 0.25379591792994305M0.9647426784191072 0.35488595400360495L0.4756895081034974 1\",\n A: \"M0 1L0.4808333333333333 0L1 1M0.24250000000000002 0.6099439775910365L0.7341666666666666 0.6099439775910365\",\n B: \"M0 1L0 0.0117369978777208L0.30665717153513444 0L0.5874522807082946 0.03451403469442413L0.7766202217193218 0.15033936404895643L0.7471969743588041 0.31967962568332936L0.5246013359741988 0.4102978954282461L0.04378745314885416 0.44918617613783574L0.5112949594180156 0.469692928091109L0.8540266515643348 0.5552749498651879L1 0.6868463175009967L0.9880091196159324 0.8570018204672155L0.922301719975498 0.9321708046604659L0.7584266951758925 0.9932594737131338L0 1\",\n C: \"M1 0.23038928858890784L0.9328355511865092 0.12426412616785204L0.8096380839483327 0.04912601676267708L0.5763225801788256 0L0.4039037709527492 0.015028068281399815L0.2519579390951737 0.06533979308999706L0.10359458463139784 0.18146243506591617L0 0.4862728453971315L0.08129580872733055 0.792689266886982L0.20257034847159672 0.9160822255736587L0.3286572892798542 0.9738230826074175L0.5742878414421707 1L0.7883510303801312 0.9665431511195721L0.946851033994232 0.8689071500976585L1 0.7311049027121912\",\n D: \"M0 1L0.015604366822624637 0.020770988281483303L0.22564758265176144 0L0.3865476147957666 0.0024153386496795644L0.6479126635475078 0.051745644338731314L0.841191887805517 0.15827717679529366L0.9517008345536152 0.30172260586872185L0.9957536578687336 0.4504541551987709L1 0.5624359222498485L0.9798483279164735 0.6584121775234548L0.9386273319285215 0.7395945263504481L0.806292129480815 0.8624239259880274L0.6296239151398265 0.9406169638094516L0.3397492767598845 0.9954164354263132L0 1\",\n E: \"M0 0L0 1M0 0L1 0M0 0.5L0.7 0.5M0 1L1 1\",\n F: \"M0 0L0 1M0.011363636363636364 0.006802721088435374L1 0.006802721088435374M0.011363636363636364 0.4965986394557823L0.8409090909090909 0.4965986394557823\",\n G: \"M0.902666857540557 0.03860785012651126L0.6504261864675637 0L0.3838947267237336 0.015442305268228053L0.21293332876776194 0.07706794377239819L0.07799659974941617 0.1994951236187481L0 0.46380381528937314L0.04159964421546915 0.7502491408002389L0.13176692977834842 0.8535497868383203L0.2709176262273927 0.936767572377719L0.4386472596876406 0.9891638569283179L0.6145513562841309 1L0.7782254421419019 0.9585373611026471L0.9092650433859927 0.8540372997461425L1 0.5556012645283437L0.5583959277303046 0.55491741080559\",\n H: \"M0 0L0 1M0 0.4788732394366197L0.989010989010989 0.4788732394366197M1 0L1 1\",\n I: \"M0.5 0L0.5 1\",\n J: \"M0.9976457238788704 0L1 0.7396412315872798L0.9773931362096968 0.8322033314977973L0.9345115952458736 0.882296255506608L0.8743862896259549 0.9221331222466961L0.8024024079884948 0.9526431718061675L0.6443996712151668 0.9893997797356828L0.5035848940343224 1L0.3127211130319937 0.9877004749449337L0.17201910858386513 0.9539509911894274L0.10357419806379677 0.9212555066079295L0.053656568662899015 0.8816079295154184L0.020759483663648916 0.8360407488986785L0.003376206348523566 0.7855864537444934L0 0.7312775330396476\",\n K: \"M0 0L0 1M0.8787878787878788 0.06666666666666667L0 0.6148148148148148M0.3333333333333333 0.45925925925925926L1 0.9777777777777777\",\n L: \"M0 0L0 1L1 1\",\n M: \"M0 1L0 0L0.5 0.6512L1 0L1 1\",\n N: \"M0 1L0 0L1 1L0.9803729146221786 0\",\n O: \"M0.4718499217948183 1L0.2896765846490613 0.9606979309189402L0.12315162147934663 0.8411184486080473L0 0.4352399966492615L0.11730398524516283 0.13145645436014852L0.2612197451988078 0.04493357858878059L0.5104071592772554 0L0.7450113425917159 0.05393013710105273L0.882367950645524 0.15242300282020502L1 0.5224527406249126L0.9414597290654386 0.7560662329321755L0.8371289514446183 0.8910800547287298L0.6518259868433511 0.9830452628933628L0.4718499217948183 1\",\n P: \"M0 1L0 0.018871774228013626L0.29609603495819875 0L0.5609840637427541 0.011794858892508529L0.7332142696692472 0.04353904702296349L0.8102258645858864 0.0691965055027166L0.9330504315465442 0.14445061754775845L0.9876391714147118 0.22527816445836535L1 0.3434414070631638L0.9510549958116356 0.41772808046663146L0.8746646891596713 0.45879131862541683L0.7528523813396283 0.49171525113425024L0.5766919939969619 0.5153253033973054L0.33725744877712827 0.5284469008187558L0.025622667325582785 0.529905468802775\",\n Q: \"M0.4618887943546369 0.9755918167206952L0.28356128136544534 0.9372490397450218L0.12055179272160406 0.8205882753548176L0 0.4246165790405623L0.1148276047430244 0.12824784112887844L0.25570518844754375 0.043836831567190586L0.49963205786237674 0L0.7292835601228574 0.0526138004304122L0.8637404608452104 0.14870263423138746L0.9788892040030622 0.5097006183769648L0.9215847647858059 0.7376120297474734L0.8194564929275405 0.869330409436378L0.6380654214095985 0.9590509139448092L0.4618887943546369 0.9755918167206952M0.5824181120212351 0.6861805006946525L1 1\",\n R: \"M0 0.9928375167236815L0 0.02590227442068435L0.3611517274211098 0L0.6146286724700761 0.008660554424468435L0.7675462459194776 0.035269459580494614L0.831839975516866 0.056961676692569484L0.8847592491838954 0.08519560521497332L0.9238557535364527 0.120683646438422L0.9583303225312839 0.21691797435320384L0.955092470586235 0.3022616904894429L0.9198097669001631 0.3640573439322699L0.8564862239866702 0.40639258627024005L0.7691258543593579 0.43335506909190874L0.601775027203482 0.4539166070813109L0.023939064200217658 0.46997623755243123M0.5038084874863982 0.5108023922274467L1 1\",\n S: \"M0.8886929689221953 0.15146982162688968L0.7276173683050475 0.013780286031594946L0.34582323121005076 0L0.1318235250900008 0.09920162734298861L0.0444543935052531 0.2811287071349243L0.08064065829108809 0.3709571405906485L0.21603115127470426 0.4485505768228281L0.7525409135992945 0.5111160926769565L0.9330263665417677 0.5850732219351329L1 0.7129938124702524L0.9117772389978691 0.9130572743138187L0.6423187128058188 1L0.29586019579751677 0.9935291584506244L0.10638454191462794 0.9229845198431584L0 0.7570771288048773\",\n T: \"M0 0L1 0M0.5148514851485149 0L0.5148514851485149 1\",\n U: \"M0 0L0.0023103778751369115 0.5467447428390111L0.01823032542100219 0.6954785891481812L0.05895528135268338 0.8056480226151669L0.13703402031421133 0.8894445726483398L0.23918400876232196 0.9448524533417946L0.3917887458926616 0.9848674531975652L0.584341627875137 1L0.7194816196604602 0.9848501456716763L0.8303268115073934 0.9449411544119768L0.8966613970084885 0.898186315516197L0.9251437568455642 0.867453197565408L0.9687114937020809 0.7890904895145239L0.9890470974808324 0.6852857184065537L1 0.0014769088758762145\",\n V: \"M0 0L0.5348837209302325 1L1 0\",\n W: \"M0 0L0.23300090661831369 0.9873417721518988L0.49954669084315495 0.30081906180193585L0.7851314596554849 1L1 0.0215934475055845\",\n X: \"M0 0L0.9893617021276596 1M1 0L0.010638297872340425 1\",\n Y: \"M0 0L0.4860515021459227 0.44712562100780695M1 0.0014194464158977947L0.48927038626609437 0.44996451383960256L0.5075107296137339 1\",\n Z: \"M0 0L1 0L0 1L1 1\",\n \".\": \"M 0.49 1 L 0.41 1\",\n \"*\": \"M 0.5 0.25 L 0.8 0.25 M 0.5 0.25 L 0.5927 0.4402 M 0.5 0.25 L 0.2573 0.3676 M 0.5 0.25 L 0.2573 0.1324 M 0.5 0.25 L 0.599 0.055\",\n \"(\": \"M0.75 0L0.25 0.5L0.25 0.5L0.75 1\",\n \")\": \"M0.25 0L0.75 0.5L0.75 0.5L0.25 1\",\n \"-\": \"M0 0.5L1 0.5\",\n \"+\": \"M 0 0.5 L 1 0.5 M 0.5 0.125 L 0.5 0.875\",\n \"=\": \"M0 0.25L1 0.25M0 0.75L1 0.75\",\n _: \"M0 1 L1 1\",\n \"[\": \"M0.75 0L0.25 0L0.25 1L0.75 1\",\n \"]\": \"M0.25 0L0.75 0L0.75 1L0.25 1\",\n \"<\": \"M0.75 0L0.25 0.5L0.25 0.5L0.75 1\",\n \">\": \"M0.25 0L0.75 0.5L0.75 0.5L0.25 1\",\n \"'\": \"M 0.5 0 L 0.5 0.5\",\n '\"': \"M 0.25 0 L 0.25 0.5 M 0.75 0 L 0.75 0.5\",\n}\n\nexport const lineAlphabet: Record<\n string,\n Array<{ x1: number; y1: number; x2: number; y2: number }>\n> = {}\nfor (const letter in svgAlphabet) {\n lineAlphabet[letter] = []\n const segs = (svgAlphabet as any)[letter]\n .split(\"M\")\n .slice(1)\n .map((seg: any) =>\n seg.split(\"L\").map((pr: any) => pr.trim().split(\" \").map(parseFloat)),\n )\n for (const seg of segs) {\n for (let i = 0; i < seg.length - 1; i++) {\n // We also flip the y axis to make it cartesian here\n lineAlphabet[letter].push({\n x1: seg[i][0],\n y1: 1 - seg[i][1],\n x2: seg[i + 1][0],\n y2: 1 - seg[i + 1][1],\n })\n }\n }\n}\n","import { lineAlphabet } from \"../assets/alphabet\"\nimport { Line, Text } from \"./types\"\n\nexport const LETTER_HEIGHT_TO_WIDTH_RATIO = 0.6\nexport const LETTER_HEIGHT_TO_SPACE_RATIO = 0.2\n\nexport const getTextWidth = (text: Text): number => {\n return (\n text.text.length * text.size * LETTER_HEIGHT_TO_WIDTH_RATIO +\n (text.text.length - 1) * text.size * LETTER_HEIGHT_TO_SPACE_RATIO\n )\n}\n\nexport const convertTextToLines = (text: Text): Line[] => {\n const strokeWidth = text.size / 8\n const letterWidth = text.size * LETTER_HEIGHT_TO_WIDTH_RATIO\n const letterSpace = text.size * LETTER_HEIGHT_TO_SPACE_RATIO\n\n const lines: Line[] = []\n for (let letterIndex = 0; letterIndex < text.text.length; letterIndex++) {\n const letter = text.text[letterIndex]\n const letterLines = lineAlphabet[letter.toUpperCase()]\n if (!letterLines) continue\n for (const { x1, y1, x2, y2 } of letterLines) {\n lines.push({\n pcb_drawing_type: \"line\",\n x1:\n text.x + (letterWidth + letterSpace) * letterIndex + letterWidth * x1,\n y1: text.y + text.size * y1,\n x2:\n text.x + (letterWidth + letterSpace) * letterIndex + letterWidth * x2,\n y2: text.y + text.size * y2,\n width: strokeWidth,\n layer: text.layer,\n unit: text.unit,\n })\n }\n }\n\n return lines\n}\n","import { Drawer } from \"./Drawer\"\nimport { convertTextToLines, getTextWidth } from \"./convert-text-to-lines\"\nimport { Circle, Line, Oval, Pill, Primitive, Rect, Text } from \"./types\"\n\nexport const drawLine = (drawer: Drawer, line: Line) => {\n drawer.equip({\n size: line.zoomIndependent ? line.width / drawer.transform.a : line.width,\n shape: line.squareCap ? \"square\" : \"circle\",\n color: line.layer,\n })\n drawer.moveTo(line.x1, line.y1)\n drawer.lineTo(line.x2, line.y2)\n}\n\nexport const drawText = (drawer: Drawer, text: Text) => {\n drawer.equip({\n fontSize: text.size,\n color: text.layer,\n })\n\n let alignOffset = { x: 0, y: 0 }\n const textWidth = getTextWidth(text)\n const textHeight = text.size\n if (text.align === \"top_left\") {\n alignOffset.y = -textHeight\n } else if (text.align === \"bottom_right\") {\n alignOffset.x = -textWidth\n } else if (text.align === \"top_right\") {\n alignOffset.x = -textWidth\n alignOffset.y = -textHeight\n } else if (text.align === \"center\") {\n alignOffset.x = -textWidth / 2\n alignOffset.y = -textHeight / 2\n }\n\n // Non-gerber compatible\n // drawer.text(text.text, text.x, text.y)\n\n text.x ??= 0\n text.y ??= 0\n const text_lines = convertTextToLines({\n ...text,\n x: text.x + alignOffset.x,\n y: text.y + alignOffset.y,\n })\n for (const line of text_lines) {\n drawLine(drawer, line)\n }\n}\n\nexport const drawRect = (drawer: Drawer, rect: Rect) => {\n drawer.equip({\n color: rect.layer,\n })\n if (rect.align && rect.align !== \"center\") {\n console.warn(\"Unhandled rect align\", rect.align)\n }\n drawer.rect(rect.x, rect.y, rect.w, rect.h)\n}\n\nexport const drawCircle = (drawer: Drawer, circle: Circle) => {\n drawer.equip({\n color: circle.layer,\n })\n drawer.circle(circle.x, circle.y, circle.r)\n}\n\nexport const drawOval = (drawer: Drawer, oval: Oval) => {\n drawer.equip({\n color: oval.layer,\n })\n drawer.oval(oval.x, oval.y, oval.rX, oval.rY)\n}\n\nexport const drawPill = (drawer: Drawer, pill: Pill) => {\n drawer.equip({\n color: pill.layer,\n })\n drawer.pill(pill.x, pill.y, pill.w, pill.h)\n}\n\nexport const drawPrimitive = (drawer: Drawer, primitive: Primitive) => {\n switch (primitive.pcb_drawing_type) {\n case \"line\":\n return drawLine(drawer, primitive)\n case \"text\":\n return drawText(drawer, primitive)\n case \"rect\":\n return drawRect(drawer, primitive)\n case \"circle\":\n return drawCircle(drawer, primitive)\n case \"oval\":\n return drawOval(drawer, primitive)\n case \"pill\":\n return drawPill(drawer, primitive)\n }\n}\n\nexport const drawPrimitives = (drawer: Drawer, primitives: Primitive[]) => {\n // sort primitives by draw order\n primitives.sort((a, b) => {\n const layerOrder = [\"bottom\", \"top\", \"drill\"]\n return layerOrder.indexOf(a.layer) - layerOrder.indexOf(b.layer)\n })\n primitives.forEach((primitive) => drawPrimitive(drawer, primitive))\n}\n","import { Matrix } from \"transformation-matrix\"\n\nexport const scaleOnly = (mat: Matrix, value: number = 1) => {\n if (Math.abs(mat.a) !== Math.abs(mat.d))\n throw new Error(\"Cannot scale non-uniformly\")\n return value * Math.abs(mat.a)\n}\n","import { scaleOnly } from \"./util/scale-only\"\nimport {\n identity,\n Matrix,\n applyToPoint,\n translate,\n compose,\n inverse,\n} from \"transformation-matrix\"\nimport colors from \"./colors\"\nimport { convertTextToLines } from \"./convert-text-to-lines\"\n\nexport interface Aperture {\n shape: \"circle\" | \"square\"\n size: number\n opacity: number\n mode: \"add\" | \"subtract\"\n fontSize: number\n color: string\n layer: string\n}\n\nexport const LAYER_NAME_TO_COLOR = {\n // Standard colors, you shouldn't use these except for testing\n red: \"red\",\n black: \"black\",\n green: \"green\",\n board: \"white\",\n other: \"#eee\",\n // TODO more builtin html colors\n\n // Common eagle names\n top: colors.board.copper.f,\n inner1: colors.board.copper.in1,\n inner2: colors.board.copper.in2,\n inner3: colors.board.copper.in3,\n inner4: colors.board.copper.in4,\n inner5: colors.board.copper.in5,\n inner6: colors.board.copper.in6,\n inner7: colors.board.copper.in7,\n inner8: colors.board.copper.in8,\n\n bottom: colors.board.copper.b,\n drill: colors.board.anchor,\n keepout: colors.board.background,\n tkeepout: colors.board.b_crtyd,\n tplace: colors.board.b_silks,\n\n top_silkscreen: colors.board.f_silks,\n bottom_silkscreen: colors.board.b_silks,\n\n ...colors.board,\n}\n\nexport type LayerNameForColor = keyof typeof LAYER_NAME_TO_COLOR\n\nexport const DEFAULT_DRAW_ORDER = [\n \"top\",\n \"inner1\",\n \"inner2\",\n \"inner3\",\n \"inner4\",\n \"inner5\",\n \"inner6\",\n \"bottom\",\n] as const\n\nexport const FILL_TYPES = {\n 0: \"Empty\",\n 1: \"Solid\",\n 2: \"Line\",\n 3: \"LtSlash\",\n 4: \"Slash\",\n 5: \"BkSlash\",\n 6: \"LtBkSlash\",\n 7: \"Hatch\",\n 8: \"XHatch\",\n 9: \"Interleave\",\n 10: \"WideDot\",\n 11: \"CloseDot\",\n 12: \"Stipple1\",\n 13: \"Stipple2\",\n 14: \"Stipple3\",\n 15: \"Stipple4\",\n}\n\nexport class Drawer {\n canvasLayerMap: Record<string, HTMLCanvasElement>\n ctxLayerMap: Record<string, CanvasRenderingContext2D>\n // @ts-ignore this.equip({}) handles constructor assignment\n aperture: Aperture\n transform: Matrix\n foregroundLayer: string = \"top\"\n lastPoint: { x: number; y: number }\n\n constructor(canvasLayerMap: Record<string, HTMLCanvasElement>) {\n this.canvasLayerMap = canvasLayerMap\n this.ctxLayerMap = Object.fromEntries(\n Object.entries(canvasLayerMap).map(([name, canvas]) => [\n name,\n canvas.getContext(\"2d\")!,\n ]),\n )\n this.transform = identity()\n // positive is up (cartesian)\n this.transform.d *= -1\n this.transform = compose(this.transform, translate(0, -500))\n this.lastPoint = { x: 0, y: 0 }\n this.equip({})\n }\n\n clear() {\n for (const ctx of Object.values(this.ctxLayerMap)) {\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height)\n }\n }\n\n equip(aperture: Partial<Aperture>) {\n this.aperture = {\n fontSize: 0,\n shape: \"circle\",\n mode: \"add\",\n size: 0,\n color: \"red\",\n layer: \"top\",\n opacity: this.foregroundLayer === aperture.color ? 1 : 0.5,\n ...aperture,\n }\n }\n\n rect(x: number, y: number, w: number, h: number) {\n const [x1$, y1$] = applyToPoint(this.transform, [x - w / 2, y - h / 2])\n const [x2$, y2$] = applyToPoint(this.transform, [x + w / 2, y + h / 2])\n this.applyAperture()\n const ctx = this.getLayerCtx()\n ctx.fillRect(x1$, y1$, x2$ - x1$, y2$ - y1$)\n }\n\n circle(x: number, y: number, r: number) {\n const r$ = scaleOnly(this.transform, r)\n const [x$, y$] = applyToPoint(this.transform, [x, y])\n this.applyAperture()\n const ctx = this.getLayerCtx()\n ctx.beginPath()\n ctx.arc(x$, y$, r$, 0, 2 * Math.PI)\n ctx.fill()\n ctx.closePath()\n }\n\n oval(x: number, y: number, rx: number, ry: number) {\n const rx$ = scaleOnly(this.transform, rx)\n const ry$ = scaleOnly(this.transform, ry)\n const [x$, y$] = applyToPoint(this.transform, [x, y])\n this.applyAperture()\n const ctx = this.getLayerCtx()\n ctx.beginPath()\n ctx.ellipse(x$, y$, rx$, ry$, 0, 0, 2 * Math.PI)\n ctx.fill()\n ctx.closePath()\n }\n\n pill(x: number, y: number, w: number, h: number) {\n const [x$, y$] = applyToPoint(this.transform, [x - w / 2, y + h / 2]);\n const width$ = scaleOnly(this.transform, w)\n const height$ = scaleOnly(this.transform, h)\n const radius = Math.min(width$, height$) / 2\n this.applyAperture()\n const ctx = this.getLayerCtx()\n ctx.beginPath()\n ctx.arc(x$ + radius, y$ + radius, radius, Math.PI, Math.PI * 1.5);\n ctx.arc(x$ + width$ - radius, y$ + radius, radius, Math.PI * 1.5, 0);\n ctx.arc(x$ + width$ - radius, y$ + height$ - radius, radius, 0, Math.PI * 0.5);\n ctx.arc(x$ + radius, y$ + height$ - radius, radius, Math.PI * 0.5, Math.PI);\n ctx.fill();\n ctx.closePath();\n }\n\n /* NOTE: This is not gerber compatible */\n debugText(text: string, x: number, y: number) {\n const [x$, y$] = applyToPoint(this.transform, [x, y])\n this.applyAperture()\n const ctx = this.getLayerCtx()\n\n ctx.font = `10px sans-serif`\n ctx.fillText(text, x$, y$)\n }\n\n getLayerCtx() {\n const ctx = this.ctxLayerMap[this.aperture.layer]\n if (!ctx) {\n throw new Error(`No context for layer \"${this.aperture.layer}\"`)\n }\n return ctx\n }\n\n /**\n * Iterate over each canvas and set the z index based on the layer order, but\n * always render the foreground layer on top.\n *\n * Also: Set the opacity of every non-foreground layer to 0.5\n */\n orderAndFadeLayers() {\n const { canvasLayerMap, foregroundLayer } = this\n const opaqueLayers = new Set([foregroundLayer, \"drill\", \"other\", \"board\"])\n const order = [\n \"drill\",\n \"board\",\n foregroundLayer,\n ...DEFAULT_DRAW_ORDER.filter((l) => l !== foregroundLayer),\n ]\n order.forEach((layer, i) => {\n const canvas = canvasLayerMap[layer]\n if (!canvas) return\n canvas.style.zIndex = `${100 - i}`\n canvas.style.opacity = opaqueLayers.has(layer) ? \"1\" : \"0.5\"\n })\n }\n\n applyAperture() {\n const { transform, aperture } = this\n let { size, mode, color, fontSize } = aperture\n if (color in this.ctxLayerMap) {\n this.aperture.layer = color\n } else {\n this.aperture.layer = \"other\"\n }\n const ctx = this.getLayerCtx()\n if (!ctx) {\n throw new Error(`No context for layer \"${this.foregroundLayer}\"`)\n }\n if (!color) color = \"undefined\"\n ctx.lineWidth = scaleOnly(transform, size)\n ctx.lineCap = \"round\"\n if (mode === \"add\") {\n let colorString =\n color?.[0] === \"#\" || color?.startsWith(\"rgb\")\n ? color\n : (LAYER_NAME_TO_COLOR as any)[color?.toLowerCase()]\n ? (LAYER_NAME_TO_COLOR as any)[color?.toLowerCase()]\n : null\n if (colorString === null) {\n console.warn(`Color mapping for \"${color}\" not found`)\n colorString = \"white\"\n }\n ctx.fillStyle = colorString\n ctx.strokeStyle = colorString\n } else {\n ctx.globalCompositeOperation = \"destination-out\"\n ctx.fillStyle = \"rgba(0,0,0,1)\"\n ctx.strokeStyle = \"rgba(0,0,0,1)\"\n }\n ctx.font = `${scaleOnly(inverse(transform), fontSize)}px sans-serif`\n }\n\n moveTo(x: number, y: number) {\n this.lastPoint = { x, y }\n }\n lineTo(x: number, y: number) {\n const [x$, y$] = applyToPoint(this.transform, [x, y])\n const { size, shape, mode } = this.aperture\n const size$ = scaleOnly(this.transform, size)\n let { lastPoint } = this\n const lastPoint$ = applyToPoint(this.transform, lastPoint)\n\n this.applyAperture()\n const ctx = this.getLayerCtx()\n\n if (shape === \"square\")\n ctx.fillRect(\n lastPoint$.x - size$ / 2,\n lastPoint$.y - size$ / 2,\n size$,\n size$,\n )\n ctx.beginPath()\n ctx.moveTo(lastPoint$.x, lastPoint$.y)\n ctx.lineTo(x$, y$)\n\n ctx.stroke()\n ctx.closePath()\n\n if (shape === \"square\")\n ctx.fillRect(x$ - size$ / 2, y$ - size$ / 2, size$, size$)\n\n this.lastPoint = { x, y }\n }\n}\n","// Mix of Eagle Dark for schematics and KiCAD 2020 for PCBs\n// https://github.com/pointhi/kicad-color-schemes/blob/master/eagle-dark/eagle-dark.jsonO\n// https://github.com/pointhi/kicad-color-schemes/blob/master/kicad-2020/kicad_2020.json\nexport default {\n \"3d_viewer\": {\n background_bottom: \"rgb(102, 102, 128)\",\n background_top: \"rgb(204, 204, 230)\",\n board: \"rgb(51, 43, 23)\",\n copper: \"rgb(179, 156, 0)\",\n silkscreen_bottom: \"rgb(230, 230, 230)\",\n silkscreen_top: \"rgb(230, 230, 230)\",\n soldermask: \"rgb(20, 51, 36)\",\n solderpaste: \"rgb(128, 128, 128)\",\n },\n board: {\n anchor: \"rgb(255, 38, 226)\",\n aux_items: \"rgb(255, 255, 255)\",\n b_adhes: \"rgb(0, 0, 132)\",\n b_crtyd: \"rgb(255, 38, 226)\",\n b_fab: \"rgb(88, 93, 132)\",\n b_mask: \"rgba(2, 255, 238, 0.400)\",\n b_paste: \"rgb(0, 194, 194)\",\n b_silks: \"rgb(232, 178, 167)\",\n background: \"rgb(0, 16, 35)\",\n cmts_user: \"rgb(89, 148, 220)\",\n copper: {\n b: \"rgb(77, 127, 196)\",\n f: \"rgb(200, 52, 52)\",\n in1: \"rgb(127, 200, 127)\",\n in10: \"rgb(237, 124, 51)\",\n in11: \"rgb(91, 195, 235)\",\n in12: \"rgb(247, 111, 142)\",\n in13: \"rgb(167, 165, 198)\",\n in14: \"rgb(40, 204, 217)\",\n in15: \"rgb(232, 178, 167)\",\n in16: \"rgb(242, 237, 161)\",\n in17: \"rgb(237, 124, 51)\",\n in18: \"rgb(91, 195, 235)\",\n in19: \"rgb(247, 111, 142)\",\n in2: \"rgb(206, 125, 44)\",\n in20: \"rgb(167, 165, 198)\",\n in21: \"rgb(40, 204, 217)\",\n in22: \"rgb(232, 178, 167)\",\n in23: \"rgb(242, 237, 161)\",\n in24: \"rgb(237, 124, 51)\",\n in25: \"rgb(91, 195, 235)\",\n in26: \"rgb(247, 111, 142)\",\n in27: \"rgb(167, 165, 198)\",\n in28: \"rgb(40, 204, 217)\",\n in29: \"rgb(232, 178, 167)\",\n in3: \"rgb(79, 203, 203)\",\n in30: \"rgb(242, 237, 161)\",\n in4: \"rgb(219, 98, 139)\",\n in5: \"rgb(167, 165, 198)\",\n in6: \"rgb(40, 204, 217)\",\n in7: \"rgb(232, 178, 167)\",\n in8: \"rgb(242, 237, 161)\",\n in9: \"rgb(141, 203, 129)\",\n },\n cursor: \"rgb(255, 255, 255)\",\n drc: \"rgb(194, 194, 194)\",\n drc_error: \"rgba(215, 91, 107, 0.800)\",\n drc_exclusion: \"rgb(255, 255, 255)\",\n drc_warning: \"rgba(255, 208, 66, 0.902)\",\n dwgs_user: \"rgb(194, 194, 194)\",\n eco1_user: \"rgb(180, 219, 210)\",\n eco2_user: \"rgb(216, 200, 82)\",\n edge_cuts: \"rgb(208, 210, 205)\",\n f_adhes: \"rgb(132, 0, 132)\",\n f_crtyd: \"rgb(255, 0, 245)\",\n f_fab: \"rgb(175, 175, 175)\",\n f_mask: \"rgba(216, 100, 255, 0.400)\",\n f_paste: \"rgba(180, 160, 154, 0.902)\",\n f_silks: \"rgb(242, 237, 161)\",\n footprint_text_back: \"rgb(0, 0, 132)\",\n footprint_text_front: \"rgb(194, 194, 194)\",\n footprint_text_invisible: \"rgb(132, 132, 132)\",\n grid: \"rgb(132, 132, 132)\",\n grid_axes: \"rgb(194, 194, 194)\",\n margin: \"rgb(255, 38, 226)\",\n microvia: \"rgb(0, 132, 132)\",\n no_connect: \"rgb(0, 0, 132)\",\n pad_back: \"rgb(77, 127, 196)\",\n pad_front: \"rgb(200, 52, 52)\",\n pad_plated_hole: \"rgb(194, 194, 0)\",\n pad_through_hole: \"rgb(227, 183, 46)\",\n plated_hole: \"rgb(26, 196, 210)\",\n ratsnest: \"rgba(245, 255, 213, 0.702)\",\n select_overlay: \"rgb(4, 255, 67)\",\n through_via: \"rgb(236, 236, 236)\",\n user_1: \"rgb(194, 194, 194)\",\n user_2: \"rgb(89, 148, 220)\",\n user_3: \"rgb(180, 219, 210)\",\n user_4: \"rgb(216, 200, 82)\",\n user_5: \"rgb(194, 194, 194)\",\n user_6: \"rgb(89, 148, 220)\",\n user_7: \"rgb(180, 219, 210)\",\n user_8: \"rgb(216, 200, 82)\",\n user_9: \"rgb(232, 178, 167)\",\n via_blind_buried: \"rgb(187, 151, 38)\",\n via_hole: \"rgb(227, 183, 46)\",\n via_micro: \"rgb(0, 132, 132)\",\n via_through: \"rgb(236, 236, 236)\",\n worksheet: \"rgb(200, 114, 171)\",\n },\n gerbview: {\n axes: \"rgb(0, 0, 132)\",\n background: \"rgb(0, 0, 0)\",\n dcodes: \"rgb(255, 255, 255)\",\n grid: \"rgb(132, 132, 132)\",\n layers: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n ],\n negative_objects: \"rgb(132, 132, 132)\",\n worksheet: \"rgb(0, 0, 132)\",\n },\n palette: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n ],\n schematic: {\n anchor: \"rgb(0, 0, 255)\",\n aux_items: \"rgb(0, 0, 0)\",\n background: \"rgb(33, 33, 33)\",\n brightened: \"rgb(204, 204, 204)\",\n bus: \"rgb(0, 96, 192)\",\n bus_junction: \"rgb(0, 96, 192)\",\n component_body: \"rgb(44, 44, 44)\",\n component_outline: \"rgb(192, 0, 0)\",\n cursor: \"rgb(224, 224, 224)\",\n erc_error: \"rgba(192, 48, 48, 0.800)\",\n erc_warning: \"rgba(192, 140, 0, 0.800)\",\n fields: \"rgb(128, 0, 160)\",\n grid: \"rgb(60, 60, 60)\",\n grid_axes: \"rgb(60, 60, 60)\",\n hidden: \"rgb(194, 194, 194)\",\n junction: \"rgb(0, 160, 0)\",\n label_global: \"rgb(0, 160, 224)\",\n label_hier: \"rgb(160, 160, 0)\",\n label_local: \"rgb(192, 192, 192)\",\n net_name: \"rgb(224, 224, 224)\",\n no_connect: \"rgb(97, 43, 224)\",\n note: \"rgb(192, 192, 0)\",\n override_item_colors: false,\n pin: \"rgb(192, 0, 0)\",\n pin_name: \"rgb(192, 192, 192)\",\n pin_number: \"rgb(192, 0, 0)\",\n reference: \"rgb(192, 192, 192)\",\n shadow: \"rgba(102, 179, 255, 0.800)\",\n sheet: \"rgb(128, 0, 160)\",\n sheet_background: \"rgba(255, 255, 255, 0.000)\",\n sheet_fields: \"rgb(160, 160, 0)\",\n sheet_filename: \"rgb(160, 160, 0)\",\n sheet_label: \"rgb(160, 160, 0)\",\n sheet_name: \"rgb(0, 160, 204)\",\n value: \"rgb(192, 192, 192)\",\n wire: \"rgb(0, 160, 0)\",\n worksheet: \"rgb(192, 0, 0)\",\n },\n}\n","import {\n createStore as createZustandStore,\n useStore as useZustandStore,\n UseBoundStore,\n} from \"zustand\"\nimport { StoreContext } from \"./components/ContextProviders\"\nimport type { LayerRef } from \"@tscircuit/builder\"\nimport { useContext } from \"react\"\n\nexport interface State {\n selected_layer: LayerRef\n\n in_edit_mode: boolean\n in_move_footprint_mode: boolean\n in_draw_trace_mode: boolean\n\n is_moving_component: boolean\n is_drawing_trace: boolean\n\n selectLayer: (layer: LayerRef) => void\n setEditMode: (mode: \"off\" | \"move_footprint\" | \"draw_trace\") => void\n setIsMovingComponent: (is_moving: boolean) => void\n setIsDrawingTrace: (is_drawing: boolean) => void\n}\n\nexport const createStore = () =>\n createZustandStore<State>(\n (set) =>\n ({\n selected_layer: \"top\",\n\n in_edit_mode: false,\n in_move_footprint_mode: false,\n in_draw_trace_mode: false,\n\n is_moving_component: false,\n is_drawing_trace: false,\n\n selectLayer: (layer) => set({ selected_layer: layer }),\n setEditMode: (mode) =>\n set({\n in_edit_mode: mode !== \"off\",\n in_move_footprint_mode: mode === \"move_footprint\",\n in_draw_trace_mode: mode === \"draw_trace\",\n is_moving_component: false,\n is_drawing_trace: false,\n }),\n setIsMovingComponent: (is_moving) =>\n set({ is_moving_component: is_moving }),\n setIsDrawingTrace: (is_drawing) =>\n set({ is_drawing_trace: is_drawing }),\n }) as const\n )\n\nexport const useGlobalStore = <T = State>(s?: (state: State) => T): T => {\n const store = useContext(StoreContext)\n\n return useZustandStore(store as any, s as any)\n}\n","import { useMemo } from \"react\"\nimport { createContext, useContext } from \"react\"\nimport { createStore } from \"../global-store\"\n\nexport const StoreContext = createContext(null)\n\nexport const ContextProviders = ({ children }: { children?: any }) => {\n const store = useMemo(() => createStore(), [])\n\n return (\n <StoreContext.Provider value={store as any}>\n {children}\n </StoreContext.Provider>\n )\n}\n","import React, { useCallback } from \"react\"\nimport { CanvasPrimitiveRenderer } from \"./CanvasPrimitiveRenderer\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport { useMemo } from \"react\"\nimport { convertElementToPrimitives } from \"../lib/convert-element-to-primitive\"\nimport { Matrix } from \"transformation-matrix\"\nimport { GridConfig } from \"lib/types\"\nimport { MouseElementTracker } from \"./MouseElementTracker\"\nimport { DimensionOverlay } from \"./DimensionOverlay\"\nimport { ToolbarOverlay } from \"./ToolbarOverlay\"\nimport { ErrorOverlay } from \"./ErrorOverlay\"\nimport { EditPlacementOverlay } from \"./EditPlacementOverlay\"\nimport { EditEvent } from \"lib/edit-events\"\nimport { EditTraceHintOverlay } from \"./EditTraceHintOverlay\"\n\nexport interface CanvasElementsRendererProps {\n elements: AnySoupElement[]\n transform?: Matrix\n width?: number\n height?: number\n grid?: GridConfig\n allowEditing: boolean\n cancelPanDrag: Function\n onCreateEditEvent: (event: EditEvent) => void\n onModifyEditEvent: (event: Partial<EditEvent>) => void\n}\n\nexport const CanvasElementsRenderer = (props: CanvasElementsRendererProps) => {\n const primitives = useMemo(() => {\n const primitives = props.elements.flatMap((elm) =>\n convertElementToPrimitives(elm, props.elements),\n )\n return primitives\n }, [props.elements])\n return (\n <MouseElementTracker transform={props.transform} primitives={primitives}>\n <EditPlacementOverlay\n disabled={!props.allowEditing}\n transform={props.transform}\n soup={props.elements}\n cancelPanDrag={props.cancelPanDrag}\n onCreateEditEvent={props.onCreateEditEvent}\n onModifyEditEvent={props.onModifyEditEvent}\n >\n <EditTraceHintOverlay\n disabled={!props.allowEditing}\n transform={props.transform}\n soup={props.elements}\n cancelPanDrag={props.cancelPanDrag}\n onCreateEditEvent={props.onCreateEditEvent as any}\n onModifyEditEvent={props.onModifyEditEvent as any}\n >\n <DimensionOverlay transform={props.transform!}>\n <ToolbarOverlay elements={props.elements}>\n <ErrorOverlay\n transform={props.transform}\n elements={props.elements}\n >\n <CanvasPrimitiveRenderer\n transform={props.transform}\n primitives={primitives}\n width={props.width}\n height={props.height}\n grid={props.grid}\n />\n </ErrorOverlay>\n </ToolbarOverlay>\n </DimensionOverlay>\n </EditTraceHintOverlay>\n </EditPlacementOverlay>\n </MouseElementTracker>\n )\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport type { Primitive } from \"./types\"\n\ntype MetaData = {\n _parent_pcb_component?: any\n _parent_source_component?: any\n _source_port?: any\n}\n\nexport const convertElementToPrimitives = (\n element: AnySoupElement,\n allElements: AnySoupElement[],\n): (Primitive & MetaData)[] => {\n const _parent_pcb_component =\n \"pcb_component_id\" in element\n ? allElements.find(\n (elm) =>\n elm.type === \"pcb_component\" &&\n elm.pcb_component_id === element.pcb_component_id,\n )\n : undefined\n const _parent_source_component =\n _parent_pcb_component && \"source_component_id\" in _parent_pcb_component\n ? allElements.find(\n (elm) =>\n elm.type === \"source_component\" &&\n elm.source_component_id ===\n _parent_pcb_component.source_component_id,\n )\n : undefined\n const _source_port =\n \"source_port_id\" in element\n ? allElements.find(\n (e) =>\n e.type === \"source_port\" &&\n e.source_port_id === element.source_port_id,\n )\n : undefined\n\n switch (element.type) {\n case \"pcb_board\": {\n const { width, height, center } = element\n return [\n {\n pcb_drawing_type: \"line\",\n x1: center.x - width / 2,\n y1: center.y - height / 2,\n x2: center.x + width / 2,\n y2: center.y - height / 2,\n width: 1, // Add the required width property\n zoomIndependent: true,\n layer: \"board\",\n _element: element,\n },\n {\n pcb_drawing_type: \"line\",\n x1: center.x - width / 2,\n y1: center.y + height / 2,\n x2: center.x + width / 2,\n y2: center.y + height / 2,\n width: 1, // Add the required width property\n zoomIndependent: true,\n layer: \"board\",\n _element: element,\n },\n {\n pcb_drawing_type: \"line\",\n x1: center.x - width / 2,\n y1: center.y - height / 2,\n x2: center.x - width / 2,\n y2: center.y + height / 2,\n width: 1, // Add the required width property\n zoomIndependent: true,\n layer: \"board\",\n _element: element,\n },\n {\n pcb_drawing_type: \"line\",\n x1: center.x + width / 2,\n y1: center.y - height / 2,\n x2: center.x + width / 2,\n y2: center.y + height / 2,\n width: 1, // Add the required width property\n zoomIndependent: true,\n layer: \"board\",\n _element: element,\n },\n ]\n }\n case \"pcb_smtpad\": {\n if (element.shape === \"rect\") {\n const { shape, x, y, width, height, layer } = element\n\n return [\n {\n pcb_drawing_type: \"rect\",\n x,\n y,\n w: width,\n h: height,\n layer: layer || \"top\",\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n _source_port,\n },\n ]\n } else if (element.shape === \"circle\") {\n const { x, y, radius, layer } = element\n return [\n {\n pcb_drawing_type: \"circle\",\n x,\n y,\n r: radius,\n layer: layer || \"top\",\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n _source_port,\n },\n ]\n }\n return []\n }\n case \"pcb_hole\": {\n if (element.hole_shape === \"round\" || !element.hole_shape) {\n const { x, y, hole_diameter } = element\n\n return [\n {\n pcb_drawing_type: \"circle\",\n x,\n y,\n r: hole_diameter / 2,\n layer: \"drill\",\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n },\n ]\n }\n // TODO square hole\n // TODO oval hole\n return []\n }\n case \"pcb_plated_hole\": {\n if(element.shape === \"circle\") {\n const { x, y, hole_diameter, outer_diameter } = element\n\n return [\n {\n pcb_drawing_type: \"circle\",\n x,\n y,\n r: outer_diameter / 2,\n // TODO support layer on pcb_plated_hole\n layer: \"top\",\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n _source_port,\n },\n {\n pcb_drawing_type: \"circle\",\n x,\n y,\n r: hole_diameter / 2,\n // TODO support layer on pcb_plated_hole\n layer: \"drill\",\n\n // double highlights are annoying\n // _element: element,\n },\n ]\n } else if(element.shape === \"oval\") {\n const { x, y, outer_height, outer_width, hole_height, hole_width } = element\n \n return [\n {\n pcb_drawing_type: \"oval\",\n x,\n y,\n rX: outer_width / 2,\n rY: outer_height / 2,\n layer: \"top\", // TODO: Confirm layer handling for oval plated holes\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n _source_port,\n },\n {\n pcb_drawing_type: \"oval\",\n x,\n y,\n rX: hole_width / 2,\n rY: hole_height / 2,\n layer: \"drill\",\n },\n ]\n } else if (element.shape === \"pill\") {\n const { x, y, outer_height, outer_width, hole_height, hole_width } = element\n \n return [\n {\n pcb_drawing_type: \"pill\",\n x,\n y,\n w: outer_width,\n h: outer_height,\n layer: \"top\", // TODO: Confirm layer handling for oval plated holes\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n _source_port,\n },\n {\n pcb_drawing_type: \"pill\",\n x,\n y,\n w: hole_width,\n h: hole_height,\n layer: \"drill\",\n },\n ]\n }\n else {\n return []\n }\n }\n case \"pcb_trace\": {\n const primitives: Primitive[] = []\n let prevX: number | null = null\n let prevY: number | null = null\n\n for (const route of element.route) {\n if (route.route_type === \"wire\") {\n if (prevX !== null && prevY !== null) {\n primitives.push({\n pcb_drawing_type: \"line\",\n x1: prevX,\n y1: prevY,\n x2: route.x,\n y2: route.y,\n width: route.width,\n squareCap: false,\n layer: route.layer,\n })\n }\n\n prevX = route.x\n prevY = route.y\n }\n // Ignore \"via\" routes for now\n }\n\n return primitives\n }\n // The builder currently outputs these as smtpads and holes, so pcb_via isn't\n // used, but that maybe should be changed\n case \"pcb_via\": {\n const { x, y, outer_diameter, hole_diameter, from_layer, to_layer } =\n element\n\n return [\n {\n pcb_drawing_type: \"circle\",\n x,\n y,\n r: outer_diameter / 2,\n layer: from_layer!,\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n },\n {\n pcb_drawing_type: \"circle\",\n x,\n y,\n r: hole_diameter / 2,\n layer: \"drill\",\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n },\n {\n pcb_drawing_type: \"circle\",\n x,\n y,\n r: outer_diameter / 2,\n layer: to_layer!,\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n },\n ]\n }\n\n case \"pcb_silkscreen_rect\": {\n return [\n {\n pcb_drawing_type: \"rect\",\n x: element.center.x,\n y: element.center.y,\n w: element.width,\n h: element.height,\n layer:\n element.layer === \"bottom\" ? \"bottom_silkscreen\" : \"top_silkscreen\",\n },\n ]\n }\n\n case \"pcb_silkscreen_circle\": {\n return [\n {\n pcb_drawing_type: \"circle\",\n x: element.center.x,\n y: element.center.y,\n r: element.radius,\n layer:\n element.layer === \"bottom\" ? \"bottom_silkscreen\" : \"top_silkscreen\",\n },\n ]\n }\n\n case \"pcb_silkscreen_oval\": {\n return [\n {\n pcb_drawing_type: \"oval\",\n x: element.center.x,\n y: element.center.y,\n rX: element.radius_x / 2,\n rY: element.radius_y / 2,\n layer: element.layer === \"bottom\" ? \"bottom_silkscreen\" : \"top_silkscreen\",\n }\n ]\n }\n\n case \"pcb_silkscreen_pill\": {\n return [\n {\n pcb_drawing_type: \"pill\",\n x: element.center.x,\n y: element.center.y,\n w: element.width,\n h: element.height,\n layer: element.layer === \"bottom\" ? \"bottom_silkscreen\" : \"top_silkscreen\",\n },\n ]\n }\n\n case \"pcb_silkscreen_line\": {\n return [\n {\n pcb_drawing_type: \"line\",\n x1: element.x1,\n y1: element.y1,\n x2: element.x2,\n y2: element.y2,\n width: 0.1, // TODO add strokewidth\n squareCap: false,\n layer:\n element.layer === \"bottom\" ? \"bottom_silkscreen\" : \"top_silkscreen\",\n },\n ]\n }\n\n case \"pcb_fabrication_note_path\":\n case \"pcb_silkscreen_path\": {\n const {\n pcb_component_id,\n route, // Array<{ x: number, y: number }>\n type,\n } = element\n\n let layer:\n | \"bottom_silkscreen\"\n | \"top_silkscreen\"\n | \"bottom_fabrication\"\n | \"top_fabrication\"\n | null\n\n if (type === \"pcb_silkscreen_path\") {\n layer =\n element.layer === \"bottom\" ? \"bottom_silkscreen\" : \"top_silkscreen\"\n } else if (type === \"pcb_fabrication_note_path\") {\n layer = \"top_fabrication\"\n }\n\n return route\n .slice(0, -1)\n .map((point, index) => {\n const nextPoint = route[index + 1]\n return {\n pcb_drawing_type: \"line\",\n x1: point.x,\n y1: point.y,\n x2: nextPoint.x,\n y2: nextPoint.y,\n width: 0.1, // TODO add strokewidth\n squareCap: false,\n layer: layer!,\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n _source_port,\n } as Primitive & MetaData\n })\n .filter(Boolean)\n }\n\n case \"pcb_silkscreen_text\": {\n return [\n {\n pcb_drawing_type: \"text\",\n x: element.anchor_position.x,\n y: element.anchor_position.y,\n layer:\n element.layer === \"bottom\" ? \"bottom_silkscreen\" : \"top_silkscreen\",\n align: element.anchor_alignment ?? \"center\",\n text: element.text,\n size: element.font_size, // Add the required 'size' property\n },\n ]\n }\n\n case \"pcb_fabrication_note_text\": {\n return [\n {\n pcb_drawing_type: \"text\",\n x: element.anchor_position.x,\n y: element.anchor_position.y,\n layer:\n element.layer === \"bottom\"\n ? \"bottom_fabrication\"\n : \"top_fabrication\",\n size: element.font_size,\n align: element.anchor_alignment ?? \"center\",\n text: element.text,\n },\n ]\n }\n }\n\n // console.warn(`Unsupported element type: ${element.type}`)\n return []\n}\n","import React, { useState } from \"react\"\nimport { useMemo } from \"react\"\nimport { Matrix, applyToPoint, inverse } from \"transformation-matrix\"\nimport { Primitive } from \"lib/types\"\nimport { ElementOverlayBox } from \"./ElementOverlayBox\"\nimport { AnyElement } from \"@tscircuit/builder\"\n\nexport const MouseElementTracker = ({\n children,\n transform,\n primitives,\n}: {\n children: any\n transform?: Matrix\n primitives: Primitive[]\n}) => {\n const [mousedPrimitives, setMousedPrimitives] = useState<Primitive[]>([])\n\n const highlightedPrimitives = useMemo(() => {\n const highlightedPrimitives: HighlightedPrimitive[] = []\n for (const primitive of mousedPrimitives) {\n if (primitive._element?.type === \"pcb_via\") continue\n if (primitive._element?.type === \"pcb_component\") continue\n const screenPos = applyToPoint(\n transform!,\n primitive as { x: number; y: number }\n )\n const w =\n \"w\" in primitive ? primitive.w : \"r\" in primitive ? primitive.r * 2 : 0\n const h =\n \"h\" in primitive ? primitive.h : \"r\" in primitive ? primitive.r * 2 : 0\n const screenSize = {\n w: w * transform!.a,\n h: h * transform!.a,\n }\n\n // FANCY: If 2+ highlighted primitives inhabit the same space, give\n // them an incrementing same_space_index\n let same_space_index = highlightedPrimitives.filter(\n (hp) =>\n screenPos.x === hp.screen_x &&\n screenPos.y === hp.screen_y &&\n screenSize.w === hp.screen_w &&\n screenSize.h === hp.screen_h\n ).length\n\n highlightedPrimitives.push({\n ...(primitive as any),\n screen_x: screenPos.x,\n screen_y: screenPos.y,\n screen_w: screenSize.w,\n screen_h: screenSize.h,\n same_space_index,\n })\n }\n\n return highlightedPrimitives\n }, [mousedPrimitives, transform])\n return (\n <div\n style={{ position: \"relative\" }}\n onMouseMove={(e) => {\n if (transform) {\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const rwPoint = applyToPoint(inverse(transform), { x, y })\n\n const mousedPrimitives: Primitive[] = []\n for (const primitive of primitives) {\n if (\n !(\n \"x\" in primitive &&\n \"y\" in primitive &&\n ((\"w\" in primitive && \"h\" in primitive) || \"r\" in primitive)\n )\n )\n continue\n if (!primitive._element) continue\n\n const w = \"w\" in primitive ? primitive.w : primitive.r * 2\n const h = \"h\" in primitive ? primitive.h : primitive.r * 2\n\n if (\n Math.abs(primitive.x - rwPoint.x) < w / 2 &&\n Math.abs(primitive.y - rwPoint.y) < h / 2\n ) {\n mousedPrimitives.push(primitive)\n }\n }\n setMousedPrimitives(mousedPrimitives)\n }\n }}\n >\n {children}\n <ElementOverlayBox highlightedPrimitives={highlightedPrimitives} />\n </div>\n )\n}\n\nexport type HighlightedPrimitive = {\n x: number\n y: number\n w: number\n h: number\n same_space_index?: number\n _element: AnyElement\n _parent_pcb_component?: AnyElement\n _parent_source_component?: AnyElement\n _source_port?: AnyElement\n screen_x: number\n screen_y: number\n screen_w: number\n screen_h: number\n}\n","import React, { useEffect, useState } from \"react\"\nimport { HighlightedPrimitive } from \"./MouseElementTracker\"\nimport colors from \"lib/colors\"\nimport { useGlobalStore } from \"global-store\"\n\nconst containerStyle = {\n position: \"absolute\",\n left: 0,\n top: 0,\n pointerEvents: \"none\",\n color: \"red\",\n fontFamily: \"sans-serif\",\n fontSize: 12,\n textShadow: \"0 0 2px black\",\n} as const\n\nexport const getTextForHighlightedPrimitive = (\n prim: HighlightedPrimitive\n): string => {\n const {\n _element: element,\n _parent_pcb_component,\n _parent_source_component,\n } = prim\n switch (element.type) {\n case \"pcb_smtpad\":\n case \"pcb_plated_hole\": {\n let s = \"\"\n\n if (\n _parent_source_component &&\n \"name\" in _parent_source_component &&\n _parent_source_component.name\n ) {\n s += `.${_parent_source_component.name} > `\n }\n s += (element.port_hints ?? (element as any)._source_port?.port_hints)\n .map((ph: string) => `port.${ph}`)\n .join(\", \")\n return s\n }\n default: {\n return \"\"\n }\n }\n}\n\nconst layerColorHightlightMap = {\n top: \"red\",\n bottom: \"aqua\",\n}\n\nexport const HighlightedPrimitiveBoxWithText = ({\n primitive,\n}: {\n primitive: HighlightedPrimitive\n}) => {\n const [finalState, setFinalState] = useState(false)\n\n useEffect(() => {\n setTimeout(() => {\n setFinalState(true)\n }, 100)\n }, [])\n\n let [x, y, w, h] = [\n primitive.screen_x,\n primitive.screen_y,\n primitive.screen_w,\n primitive.screen_h,\n ]\n\n const si = primitive.same_space_index ?? 0\n const sip = 26\n\n const color: string =\n layerColorHightlightMap[\n (primitive as any)?._element\n ?.layer as keyof typeof layerColorHightlightMap\n ] ?? \"red\"\n\n return (\n <div\n style={{\n position: \"absolute\",\n left: x - w / 2 - 8,\n top: y - h / 2 - 8,\n width: w + 16,\n height: h + 16,\n color,\n }}\n >\n <div\n style={{\n // width: finalState ? `${100 + 20 * si}%` : \"100%\",\n // height: finalState ? `${100 + 20 * si}%` : \"100%\",\n // marginLeft: finalState ? `${-10 * si}%` : 0,\n // marginTop: finalState ? `${-10 * si}%` : 0,\n width: finalState ? `calc(100% + ${sip * 2 * si}px)` : \"100%\",\n height: finalState ? `calc(100% + ${sip * 2 * si}px)` : \"100%\",\n marginLeft: finalState ? `${-sip * si}px` : 0,\n marginTop: finalState ? `${-sip * si}px` : 0,\n border: `1px solid ${color}`,\n opacity: finalState ? 1 : si === 0 ? 1 : 0,\n transition:\n \"width 0.2s, height 0.2s, margin-left 0.2s, margin-top 0.2s, opacity 0.2s\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n left: 0,\n bottom: h + 20 + sip * si,\n marginLeft: finalState ? `${-sip * si}px` : 0,\n marginBottom: finalState ? 0 : -sip * si,\n transition: \"margin-left 0.2s, margin-bottom 0.2s\",\n lineHeight: \"0.8em\",\n }}\n >\n {getTextForHighlightedPrimitive(primitive)}\n </div>\n </div>\n </div>\n )\n}\n\nexport const ElementOverlayBox = ({\n highlightedPrimitives,\n}: {\n highlightedPrimitives: HighlightedPrimitive[]\n}) => {\n const is_moving_component = useGlobalStore((s) => s.is_moving_component)\n\n return (\n <div style={containerStyle}>\n {!is_moving_component &&\n highlightedPrimitives.map((primitive, i) => (\n <HighlightedPrimitiveBoxWithText key={i} primitive={primitive} />\n ))}\n </div>\n )\n}\n","import { useEffect, useRef, useState } from \"react\"\nimport { Matrix, applyToPoint, identity, inverse } from \"transformation-matrix\"\n\ninterface Props {\n transform?: Matrix\n children: any\n}\n\nexport const DimensionOverlay = ({ children, transform }: Props) => {\n if (!transform) transform = identity()\n const [dimensionToolVisible, setDimensionToolVisible] = useState(false)\n const [dimensionToolStretching, setDimensionToolStretching] = useState(false)\n // Start of dimension tool line in real-world coordinates (not screen)\n const [dStart, setDStart] = useState({ x: 0, y: 0 })\n // End of dimension tool line in real-world coordinates (not screen)\n const [dEnd, setDEnd] = useState({ x: 0, y: 0 })\n const mousePosRef = useRef({ x: 0, y: 0 })\n const containerRef = useRef<HTMLDivElement | null>(null)\n const container = containerRef.current!\n const containerBounds = container?.getBoundingClientRect()\n useEffect(() => {\n const container = containerRef.current\n\n const down = (e: KeyboardEvent) => {\n if (e.key === \"d\") {\n setDStart({ x: mousePosRef.current.x, y: mousePosRef.current.y })\n setDEnd({ x: mousePosRef.current.x, y: mousePosRef.current.y })\n setDimensionToolVisible((visible: boolean) => !visible)\n setDimensionToolStretching(true)\n e.preventDefault()\n }\n if (e.key === \"Escape\") {\n setDimensionToolVisible(false)\n setDimensionToolStretching(false)\n }\n }\n\n const addKeyListener = () => {\n if (container) {\n container.addEventListener(\"keydown\", down)\n }\n }\n\n const removeKeyListener = () => {\n if (container) {\n container.removeEventListener(\"keydown\", down)\n }\n }\n\n if (container) {\n container.addEventListener(\"focus\", addKeyListener)\n container.addEventListener(\"blur\", removeKeyListener)\n container.addEventListener(\"mouseenter\", addKeyListener)\n container.addEventListener(\"mouseleave\", removeKeyListener)\n }\n return () => {\n if (container) {\n container.removeEventListener(\"focus\", addKeyListener)\n container.removeEventListener(\"blur\", removeKeyListener)\n container.removeEventListener(\"mouseenter\", addKeyListener)\n container.removeEventListener(\"mouseleave\", removeKeyListener)\n }\n }\n }, [containerRef])\n\n const screenDStart = applyToPoint(transform, dStart)\n const screenDEnd = applyToPoint(transform, dEnd)\n\n const arrowScreenBounds = {\n left: Math.min(screenDStart.x, screenDEnd.x),\n right: Math.max(screenDStart.x, screenDEnd.x),\n top: Math.min(screenDStart.y, screenDEnd.y),\n bottom: Math.max(screenDStart.y, screenDEnd.y),\n flipX: screenDStart.x > screenDEnd.x,\n flipY: screenDStart.y > screenDEnd.y,\n width: 0,\n height: 0,\n }\n arrowScreenBounds.width = arrowScreenBounds.right - arrowScreenBounds.left\n arrowScreenBounds.height = arrowScreenBounds.bottom - arrowScreenBounds.top\n\n return (\n <div\n ref={containerRef}\n tabIndex={0}\n style={{ position: \"relative\" }}\n onMouseEnter={() => {\n if (containerRef.current) {\n containerRef.current.focus()\n }\n }}\n onMouseLeave={() => {\n if (containerRef.current) {\n containerRef.current.blur()\n }\n }}\n onMouseMove={(e: React.MouseEvent<HTMLDivElement>) => {\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const rwPoint = applyToPoint(inverse(transform!), { x, y })\n mousePosRef.current.x = rwPoint.x\n mousePosRef.current.y = rwPoint.y\n\n if (dimensionToolStretching) {\n setDEnd({ x: rwPoint.x, y: rwPoint.y })\n }\n }}\n onMouseDown={() => {\n if (dimensionToolStretching) {\n setDimensionToolStretching(false)\n } else if (dimensionToolVisible) {\n setDimensionToolVisible(false)\n }\n }}\n >\n {children}\n {dimensionToolVisible && (\n <>\n <div\n style={{\n position: \"absolute\",\n left: arrowScreenBounds.left,\n width: arrowScreenBounds.width,\n textAlign: \"center\",\n top: screenDStart.y + 2,\n color: \"red\",\n mixBlendMode: \"difference\",\n pointerEvents: \"none\",\n marginTop: arrowScreenBounds.flipY ? 0 : -20,\n fontSize: 12,\n fontFamily: \"sans-serif\",\n zIndex: 1000,\n }}\n >\n {Math.abs(dStart.x - dEnd.x).toFixed(2)}\n </div>\n <div\n style={{\n position: \"absolute\",\n left: screenDEnd.x,\n height: arrowScreenBounds.height,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n top: arrowScreenBounds.top,\n color: \"red\",\n pointerEvents: \"none\",\n mixBlendMode: \"difference\",\n fontSize: 12,\n fontFamily: \"sans-serif\",\n zIndex: 1000,\n }}\n >\n <div\n style={{\n marginLeft: arrowScreenBounds.flipX ? \"-100%\" : 4,\n paddingRight: 4,\n }}\n >\n {Math.abs(dStart.y - dEnd.y).toFixed(2)}\n </div>\n </div>\n <svg\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n pointerEvents: \"none\",\n mixBlendMode: \"difference\",\n zIndex: 1000,\n }}\n width={containerBounds.width}\n height={containerBounds.height}\n >\n <defs>\n <marker\n id=\"head\"\n orient=\"auto\"\n markerWidth=\"3\"\n markerHeight=\"4\"\n refX=\"2\"\n refY=\"2\"\n >\n <path d=\"M0,0 V4 L2,2 Z\" fill=\"red\" />\n </marker>\n </defs>\n <line\n x1={screenDStart.x}\n y1={screenDStart.y}\n x2={screenDEnd.x}\n y2={screenDEnd.y}\n markerEnd=\"url(#head)\"\n strokeWidth={1.5}\n fill=\"none\"\n stroke=\"red\"\n />\n <line\n x1={screenDStart.x}\n y1={screenDStart.y}\n x2={screenDEnd.x}\n y2={screenDStart.y}\n strokeWidth={1.5}\n fill=\"none\"\n strokeDasharray={\"2,2\"}\n stroke=\"red\"\n />\n <line\n x1={screenDEnd.x}\n y1={screenDStart.y}\n x2={screenDEnd.x}\n y2={screenDEnd.y}\n strokeWidth={1.5}\n fill=\"none\"\n strokeDasharray={\"2,2\"}\n stroke=\"red\"\n />\n </svg>\n <div\n style={{\n right: 0,\n bottom: 0,\n position: \"absolute\",\n color: \"red\",\n fontFamily: \"sans-serif\",\n fontSize: 12,\n margin: 4,\n }}\n >\n ({dStart.x.toFixed(2)},{dStart.y.toFixed(2)})<br />(\n {dEnd.x.toFixed(2)},{dEnd.y.toFixed(2)})<br />\n dist:{\" \"}\n {Math.sqrt(\n Math.pow(dEnd.x - dStart.x, 2) + Math.pow(dEnd.y - dStart.y, 2),\n ).toFixed(2)}\n </div>\n </>\n )}\n </div>\n )\n}\n","import { Fragment, useState } from \"react\"\nimport { css } from \"@emotion/css\"\nimport {\n LayerRef,\n PCBTraceError,\n SourceError,\n all_layers,\n} from \"@tscircuit/builder\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport { LAYER_NAME_TO_COLOR } from \"lib/Drawer\"\nimport { useGlobalStore } from \"global-store\"\nimport packageJson from \"../../package.json\"\n\ninterface Props {\n children?: any\n elements?: AnySoupElement[]\n}\n\nexport const LayerButton = ({\n name,\n selected,\n onClick,\n}: {\n name: string\n selected?: boolean\n onClick: (e: any) => any\n}) => {\n return (\n <div\n className={css`\n margin-top: 2px;\n padding: 4px;\n padding-left: 8px;\n padding-right: 18px;\n cursor: pointer;\n\n &:hover {\n background-color: rgba(255, 255, 255, 0.1);\n }\n `}\n onClick={onClick}\n >\n <span style={{ marginRight: 2, opacity: selected ? 1 : 0 }}>•</span>\n <span\n style={{\n marginLeft: 2,\n fontWeight: 500,\n color: (LAYER_NAME_TO_COLOR as any)[name.replace(/-/, \"\")],\n }}\n >\n {name}\n </span>\n </div>\n )\n}\n\nexport const ToolbarButton = ({ children, ...props }: any) => (\n <div\n {...props}\n style={{\n backgroundColor: \"#1F1F1F\",\n border: \"1px solid #666\",\n margin: 4,\n padding: 4,\n paddingLeft: 6,\n paddingRight: 6,\n borderRadius: 2,\n alignSelf: \"start\",\n color: \"#eee\",\n cursor: \"pointer\",\n ...props.style,\n }}\n >\n {children}\n </div>\n)\n\nexport const ToolbarOverlay = ({ children, elements }: Props) => {\n const [isMouseOverContainer, setIsMouseOverContainer] = useState(false)\n const [isLayerMenuOpen, setLayerMenuOpen] = useState(false)\n const [isErrorsOpen, setErrorsOpen] = useState(false)\n const [selectedLayer, selectLayer] = useGlobalStore(\n (s) => [s.selected_layer, s.selectLayer] as const,\n )\n const [in_move_footprint_mode, in_draw_trace_mode] = useGlobalStore((s) => [\n s.in_move_footprint_mode,\n s.in_draw_trace_mode,\n ])\n const setEditMode = useGlobalStore((s) => s.setEditMode)\n\n const errorCount =\n elements?.filter((e) => e.type.includes(\"error\")).length ?? 0\n\n return (\n <div\n style={{ position: \"relative\" }}\n onMouseEnter={() => {\n setIsMouseOverContainer(true)\n }}\n onMouseLeave={(e) => {\n setIsMouseOverContainer(false)\n setLayerMenuOpen(false)\n }}\n >\n {children}\n <div\n style={{\n position: \"absolute\",\n bottom: 4,\n right: 8,\n pointerEvents: \"none\",\n color: \"white\",\n fontSize: 11,\n opacity: isMouseOverContainer ? 0.5 : 0,\n transition: \"opacity 1s\",\n transitionDelay: \"2s\",\n fontFamily: \"sans-serif\",\n }}\n >\n @tscircuit/pcb-viewer@{packageJson.version}\n </div>\n <div\n style={{\n position: \"absolute\",\n opacity: isMouseOverContainer ? 1 : 0,\n top: 16,\n left: 16,\n transition: isMouseOverContainer\n ? \"opacity 100ms linear\"\n : \"opacity 1s linear\",\n zIndex: 100,\n color: \"red\",\n display: \"flex\",\n fontSize: 12,\n height: 100,\n fontFamily: \"sans-serif\",\n }}\n >\n <ToolbarButton\n onClick={() => {\n setLayerMenuOpen(!isLayerMenuOpen)\n }}\n onMouseLeave={() => {\n if (isLayerMenuOpen) {\n setLayerMenuOpen(false)\n }\n }}\n >\n <div>\n layer:{\" \"}\n <span\n style={{\n marginLeft: 2,\n fontWeight: 500,\n color: (LAYER_NAME_TO_COLOR as any)[selectedLayer as string],\n }}\n >\n {selectedLayer as string}\n </span>\n </div>\n {isLayerMenuOpen && (\n <div style={{ marginTop: 4, minWidth: 120 }}>\n {all_layers\n .map((l) => l.replace(/-/g, \"\")) // TODO remove when inner-1 becomes inner1\n .map((layer) => (\n <LayerButton\n key={layer}\n name={layer}\n selected={layer === selectedLayer}\n onClick={() => {\n selectLayer(layer.replace(/-/, \"\") as LayerRef)\n }}\n />\n ))}\n </div>\n )}\n </ToolbarButton>\n <ToolbarButton\n style={errorCount > 0 ? { color: \"red\" } : {}}\n onClick={() => setErrorsOpen(!isErrorsOpen)}\n onMouseLeave={() => setErrorsOpen(false)}\n >\n <div>{errorCount} errors</div>\n {isErrorsOpen && (\n <div\n style={{ display: \"grid\", gridTemplateColumns: \"100px 300px\" }}\n >\n {elements\n ?.filter((e): e is PCBTraceError => e.type.includes(\"error\"))\n .map((e, i) => (\n <Fragment key={i}>\n <div>{e.error_type}</div>\n <div>{e.message}</div>\n </Fragment>\n ))}\n </div>\n )}\n </ToolbarButton>\n <ToolbarButton\n style={{}}\n onClick={() => {\n setEditMode(in_draw_trace_mode ? \"off\" : \"draw_trace\")\n }}\n >\n <div>\n {in_draw_trace_mode ? \"✖ \" : \"\"}\n Edit Traces\n </div>\n </ToolbarButton>\n <ToolbarButton\n style={{}}\n onClick={() => {\n setEditMode(in_move_footprint_mode ? \"off\" : \"move_footprint\")\n }}\n >\n <div>\n {in_move_footprint_mode ? \"✖ \" : \"\"}\n Move Components\n </div>\n </ToolbarButton>\n </div>\n </div>\n )\n}\n","{\n \"name\": \"@tscircuit/pcb-viewer\",\n \"version\": \"1.4.0\",\n \"main\": \"dist/index.js\",\n \"repository\": \"tscircuit/pcb-viewer\",\n \"license\": \"MIT\",\n \"scripts\": {\n \"start\": \"storybook dev -p 6006\",\n \"build\": \"tsup ./src/index.tsx --dts --sourcemap --outDir dist\",\n \"yalc\": \"npm run build && yalc push\",\n \"storybook\": \"storybook dev -p 6006\",\n \"build-storybook\": \"storybook build\"\n },\n \"files\": [\n \"dist\"\n ],\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.7.3\",\n \"@semantic-release/commit-analyzer\": \"^9.0.2\",\n \"@semantic-release/git\": \"^10.0.1\",\n \"@semantic-release/npm\": \"^9.0.1\",\n \"@semantic-release/release-notes-generator\": \"^10.0.3\",\n \"@storybook/nextjs\": \"^8.0.6\",\n \"@storybook/react\": \"^8.0.6\",\n \"@swc/core\": \"^1.4.12\",\n \"@tscircuit/builder\": \"^1.5.117\",\n \"@tscircuit/eagle-xml-converter\": \"^0.0.6\",\n \"@tscircuit/props\": \"^0.0.7\",\n \"@tscircuit/react-fiber\": \"^1.1.25\",\n \"@tscircuit/soup\": \"^0.0.33\",\n \"@types/node\": \"18.7.23\",\n \"@types/react\": \"^18.3.3\",\n \"next\": \"^14.1.4\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"react-use\": \"^17.4.0\",\n \"storybook\": \"^8.0.6\",\n \"tsup\": \"^8.0.2\",\n \"type-fest\": \"^3.0.0\",\n \"typescript\": \"^5.4.4\",\n \"use-mouse-matrix-transform\": \"^1.1.13\",\n \"zod\": \"^3.23.5\"\n },\n \"peerDependencies\": {\n \"@tscircuit/builder\": \"*\",\n \"@tscircuit/react-fiber\": \"*\",\n \"react\": \"*\"\n },\n \"dependencies\": {\n \"@emotion/css\": \"^11.11.2\",\n \"color\": \"^4.2.3\",\n \"react-supergrid\": \"^1.0.10\",\n \"transformation-matrix\": \"^2.13.0\",\n \"zustand\": \"^4.5.2\"\n }\n}\n","import { css } from \"@emotion/css\"\nimport { PCBPort, PCBTraceError } from \"@tscircuit/builder\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport { useEffect, useRef, useState } from \"react\"\nimport { Matrix, applyToPoint, identity, inverse } from \"transformation-matrix\"\n\ninterface Props {\n transform?: Matrix\n elements?: AnySoupElement[]\n children: any\n}\n\nexport const ErrorOverlay = ({ children, transform, elements }: Props) => {\n if (!transform) transform = identity()\n const containerRef = useRef<HTMLDivElement | null>(null)\n const containerBounds = containerRef?.current?.getBoundingClientRect()\n\n return (\n <div style={{ position: \"relative\" }} ref={containerRef}>\n {children}\n {elements\n ?.filter((el): el is PCBTraceError => el.type === \"pcb_error\")\n .map((el: PCBTraceError) => {\n const { pcb_port_ids } = el\n\n const port1 = elements.find(\n (el): el is PCBPort =>\n el.type === \"pcb_port\" && el.pcb_port_id === pcb_port_ids?.[0],\n )\n const port2 = elements.find(\n (el): el is PCBPort =>\n el.type === \"pcb_port\" && el.pcb_port_id === pcb_port_ids?.[1],\n )\n\n if (!port1 || !port2) return null\n\n const screenPort1 = applyToPoint(transform, {\n x: port1.x,\n y: port1.y,\n })\n const screenPort2 = applyToPoint(transform, {\n x: port2.x,\n y: port2.y,\n })\n\n const canLineBeDrawn = !(\n isNaN(screenPort1.x) ||\n isNaN(screenPort1.y) ||\n isNaN(screenPort2.x) ||\n isNaN(screenPort2.y)\n )\n\n const midPoint = {\n x: (screenPort1.x + screenPort2.x) / 2,\n y: (screenPort1.y + screenPort2.y) / 2,\n }\n\n if (isNaN(midPoint.x) || isNaN(midPoint.y)) {\n midPoint.x = isNaN(screenPort1.x) ? screenPort2.x : screenPort1.x\n midPoint.y = isNaN(screenPort1.y) ? screenPort2.y : screenPort1.y\n }\n if (isNaN(midPoint.x) || isNaN(midPoint.y)) {\n return null\n }\n\n return (\n <>\n <svg\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n pointerEvents: \"none\",\n mixBlendMode: \"difference\",\n zIndex: 1000,\n }}\n width={containerBounds?.width}\n height={containerBounds?.height}\n >\n {canLineBeDrawn && (\n <line\n x1={screenPort1.x}\n y1={screenPort1.y}\n x2={screenPort2.x}\n y2={screenPort2.y}\n markerEnd=\"url(#head)\"\n strokeWidth={1.5}\n strokeDasharray={\"2,2\"}\n fill=\"none\"\n stroke=\"red\"\n />\n )}\n </svg>\n <div\n className={css`\n position: absolute;\n z-index: 1000;\n left: ${midPoint.x}px;\n top: ${midPoint.y}px;\n color: red;\n text-align: center;\n font-family: sans-serif;\n font-size: 12px;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n transform: translate(-50%, -100%);\n\n & .error-message {\n opacity: 0;\n pointer-events: none;\n\n width: 200px;\n transition: opacity 0.2s;\n margin-bottom: 10px;\n }\n\n &:hover .error-message {\n opacity: 1;\n display: flex;\n }\n `}\n >\n <div className=\"error-message\">{el.message}</div>\n <div\n className={css`\n width: 10px;\n height: 10px;\n transform: translate(0, 5px) rotate(45deg);\n background-color: red;\n `}\n />\n </div>\n </>\n )\n })}\n </div>\n )\n}\n","import type { PCBComponent } from \"@tscircuit/builder\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport { useGlobalStore } from \"global-store\"\nimport { EditEvent } from \"lib/edit-events\"\nimport { useEffect, useRef, useState } from \"react\"\nimport { Matrix, applyToPoint, identity, inverse } from \"transformation-matrix\"\n\ninterface Props {\n transform?: Matrix\n children: any\n soup: AnySoupElement[]\n disabled?: boolean\n cancelPanDrag: Function\n onCreateEditEvent: (event: EditEvent) => void\n onModifyEditEvent: (event: Partial<EditEvent>) => void\n}\n\nconst isInsideOf = (\n pcb_component: PCBComponent,\n point: { x: number; y: number },\n padding: number = 0,\n) => {\n const halfWidth = pcb_component.width / 2\n const halfHeight = pcb_component.height / 2\n\n const left = pcb_component.center.x - halfWidth - padding\n const right = pcb_component.center.x + halfWidth + padding\n const top = pcb_component.center.y - halfHeight - padding\n const bottom = pcb_component.center.y + halfHeight + padding\n\n return point.x > left && point.x < right && point.y > top && point.y < bottom\n}\n\nexport const EditPlacementOverlay = ({\n children,\n disabled: disabledProp,\n transform,\n soup,\n cancelPanDrag,\n onCreateEditEvent,\n onModifyEditEvent,\n}: Props) => {\n if (!transform) transform = identity()\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [activePcbComponentId, setActivePcbComponent] = useState<null | string>(\n null,\n )\n const [dragState, setDragState] = useState<{\n dragStart: { x: number; y: number }\n originalCenter: { x: number; y: number }\n dragEnd: { x: number; y: number }\n edit_event_id: string\n } | null>(null)\n const isPcbComponentActive = activePcbComponentId !== null\n const in_edit_mode = useGlobalStore((s) => s.in_edit_mode)\n const in_move_footprint_mode = useGlobalStore((s) => s.in_move_footprint_mode)\n const setIsMovingComponent = useGlobalStore((s) => s.setIsMovingComponent)\n\n const disabled = disabledProp || !in_move_footprint_mode\n\n return (\n <div\n ref={containerRef}\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n }}\n onMouseDown={(e) => {\n if (disabled) return\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n if (isNaN(x) || isNaN(y)) return\n const rwMousePoint = applyToPoint(inverse(transform!), { x, y })\n\n let foundActiveComponent = false\n for (const e of soup) {\n if (\n e.type === \"pcb_component\" &&\n isInsideOf(e, rwMousePoint, 10 / transform.a)\n ) {\n cancelPanDrag()\n setActivePcbComponent(e.pcb_component_id)\n foundActiveComponent = true\n const edit_event_id = Math.random().toString()\n setDragState({\n dragStart: rwMousePoint,\n originalCenter: e.center,\n dragEnd: rwMousePoint,\n edit_event_id,\n })\n\n onCreateEditEvent({\n edit_event_id,\n pcb_edit_event_type: \"edit_component_location\",\n pcb_component_id: e.pcb_component_id,\n original_center: e.center,\n new_center: e.center,\n in_progress: true,\n created_at: Date.now(),\n })\n\n setIsMovingComponent(true)\n break\n }\n }\n if (!foundActiveComponent) {\n setActivePcbComponent(null)\n }\n\n if (foundActiveComponent) {\n e.preventDefault()\n return false\n }\n }}\n onMouseMove={(e) => {\n if (!activePcbComponentId || !dragState) return\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n if (isNaN(x) || isNaN(y)) return\n const rwMousePoint = applyToPoint(inverse(transform!), { x, y })\n setDragState({\n ...dragState,\n dragEnd: rwMousePoint,\n })\n onModifyEditEvent({\n edit_event_id: dragState.edit_event_id,\n new_center: {\n x:\n dragState.originalCenter.x +\n rwMousePoint.x -\n dragState.dragStart.x,\n y:\n dragState.originalCenter.y +\n rwMousePoint.y -\n dragState.dragStart.y,\n },\n })\n }}\n onMouseUp={(e) => {\n if (!activePcbComponentId) return\n setActivePcbComponent(null)\n setIsMovingComponent(false)\n if (dragState) {\n onModifyEditEvent({\n edit_event_id: dragState.edit_event_id,\n in_progress: false,\n })\n setDragState(null)\n }\n }}\n >\n {children}\n {!disabled &&\n soup\n .filter((e): e is PCBComponent => e.type === \"pcb_component\")\n .map((e) => {\n if (!e?.center) return null\n const projectedCenter = applyToPoint(transform, e.center)\n\n return (\n <div\n key={e.pcb_component_id}\n style={{\n position: \"absolute\",\n pointerEvents: \"none\",\n // b/c of transform, this is actually center not left/top\n left: projectedCenter.x,\n top: projectedCenter.y,\n width: e.width * transform.a + 20,\n height: e.height * transform.a + 20,\n transform: \"translate(-50%, -50%)\",\n background:\n isPcbComponentActive &&\n activePcbComponentId === e.pcb_component_id\n ? \"rgba(255, 0, 0, 0.2)\"\n : \"\",\n }}\n />\n )\n })}\n </div>\n )\n}\n","import type { PCBComponent, PCBSMTPad } from \"@tscircuit/builder\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport { su } from \"@tscircuit/soup-util\"\nimport { useGlobalStore } from \"global-store\"\nimport { EditEvent, EditTraceHintEvent } from \"lib/edit-events\"\nimport { Fragment, useEffect, useRef, useState } from \"react\"\nimport { Matrix, applyToPoint, identity, inverse } from \"transformation-matrix\"\nimport type { PcbRouteHint, PcbTraceHint } from \"@tscircuit/soup\"\nimport { HotkeyActionMenu } from \"./HotkeyActionMenu\"\n\ninterface Props {\n transform?: Matrix\n children: any\n soup: AnySoupElement[]\n disabled?: boolean\n cancelPanDrag: Function\n onCreateEditEvent: (event: EditTraceHintEvent) => void\n onModifyEditEvent: (event: Partial<EditTraceHintEvent>) => void\n}\n\nconst isInsideOf = (\n elm: PCBSMTPad,\n point: { x: number; y: number },\n padding: number = 0,\n) => {\n if (elm.shape === \"circle\") {\n // Not implemented\n return false\n }\n const halfWidth = elm.width / 2\n const halfHeight = elm.height / 2\n\n const left = elm.x - halfWidth - padding\n const right = elm.x + halfWidth + padding\n const top = elm.y - halfHeight - padding\n const bottom = elm.y + halfHeight + padding\n\n return point.x > left && point.x < right && point.y > top && point.y < bottom\n}\n\n/**\n * The trace hit overlay allows you to click a pad, after\n * clicking a pad you'll start dragging out a trace.\n *\n * Each time you click, you'll add to the trace hint path.\n *\n * If you click inside any existing hint, you'll stop adding\n * to the trace hint path.\n *\n * If you select an existing hint, you'll start dragging the\n * route hint. Mouse up stops dragging.\n *\n * If you right click on a hint, you'll delete it.\n *\n * If you right click when creating a trace hint, it will\n * place a hint you'll exit adding the trace hint.\n *\n */\nexport const EditTraceHintOverlay = ({\n children,\n disabled: disabledProp,\n transform,\n soup,\n cancelPanDrag,\n onCreateEditEvent,\n onModifyEditEvent,\n}: Props) => {\n if (!transform) transform = identity()\n const containerRef = useRef<HTMLDivElement | null>(null)\n const containerBounds = containerRef.current?.getBoundingClientRect()\n const [selectedElement, setSelectedElement] = useState<null | PCBSMTPad>(null)\n const [dragState, setDragState] = useState<{\n dragStart: { x: number; y: number }\n originalCenter: { x: number; y: number }\n dragEnd: { x: number; y: number }\n editEvent: EditTraceHintEvent\n shouldDrawRouteHint?: boolean\n } | null>(null)\n const [shouldCreateAsVia, setShouldCreateAsVia] = useState(false)\n const isElementSelected = selectedElement !== null\n const in_edit_trace_mode = useGlobalStore((s) => s.in_draw_trace_mode)\n\n const disabled = disabledProp || !in_edit_trace_mode\n\n let ogCenterScreen, dragEndScreen\n if (dragState?.originalCenter && dragState?.dragEnd) {\n ogCenterScreen = applyToPoint(transform, dragState?.originalCenter!)\n dragEndScreen = applyToPoint(transform, dragState?.dragEnd!)\n }\n\n useEffect(() => {\n if (!isElementSelected) return\n\n function keyDown(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n setSelectedElement(null)\n setDragState(null)\n }\n }\n\n window.addEventListener(\"keydown\", keyDown)\n return () => window.removeEventListener(\"keydown\", keyDown)\n }, [isElementSelected])\n\n return (\n <div\n ref={containerRef}\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n }}\n onMouseDown={(e) => {\n if (disabled) return\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n if (isNaN(x) || isNaN(y)) return\n const rwMousePoint = applyToPoint(inverse(transform!), { x, y })\n\n if (!isElementSelected) {\n for (const e of soup) {\n if (\n e.type === \"pcb_smtpad\" &&\n isInsideOf(e, rwMousePoint, 10 / transform.a)\n ) {\n setSelectedElement(e)\n setShouldCreateAsVia(false)\n setDragState({\n dragStart: rwMousePoint,\n originalCenter: { x: e.x, y: e.y },\n dragEnd: rwMousePoint,\n editEvent: {\n pcb_edit_event_type: \"edit_trace_hint\",\n pcb_port_id: e.pcb_port_id!,\n pcb_trace_hint_id: Math.random().toString(),\n route: [],\n created_at: Date.now(),\n edit_event_id: Math.random().toString(),\n in_progress: true,\n },\n shouldDrawRouteHint: false,\n })\n\n cancelPanDrag()\n break\n }\n }\n } else {\n setDragState({\n ...(dragState as any),\n dragStart: rwMousePoint,\n shouldDrawRouteHint: true,\n })\n }\n }}\n onMouseMove={(e) => {\n if (!isElementSelected || !dragState) return\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n if (isNaN(x) || isNaN(y)) return\n const rwMousePoint = applyToPoint(inverse(transform!), { x, y })\n setDragState({\n ...dragState,\n dragEnd: rwMousePoint,\n })\n }}\n onMouseUp={(e) => {\n if (!isElementSelected) return\n if (!dragState?.shouldDrawRouteHint) return\n\n // Compute distance that has been dragged\n const { dragStart, dragEnd } = dragState\n const rwDist = Math.sqrt(\n (dragEnd.x - dragStart.x) ** 2 + (dragEnd.y - dragStart.y) ** 2,\n )\n const screenDist = rwDist * transform.a\n\n // If the user dragged, don't create a point\n if (screenDist > 20) return\n\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n if (isNaN(x) || isNaN(y)) return\n const rwMousePoint = applyToPoint(inverse(transform!), { x, y })\n\n if (dragState) {\n cancelPanDrag()\n const lastPointScreen = applyToPoint(\n transform,\n dragState.editEvent.route.slice(-1)[0] ?? dragState.originalCenter,\n )\n const distanceFromLastPoint = Math.sqrt(\n (x - lastPointScreen.x) ** 2 + (y - lastPointScreen.y) ** 2,\n )\n if (distanceFromLastPoint < 20) {\n // Close the trace hint\n onCreateEditEvent({\n ...dragState.editEvent,\n in_progress: false,\n })\n setDragState(null)\n setSelectedElement(null)\n return\n }\n // Edit existing edit event by adding a new point at the rwMousePoint\n setDragState({\n ...dragState,\n editEvent: {\n ...dragState.editEvent,\n route: [\n ...dragState.editEvent.route,\n { ...rwMousePoint, via: shouldCreateAsVia },\n ],\n },\n })\n }\n }}\n >\n {children}\n {in_edit_trace_mode &&\n dragState?.editEvent &&\n ogCenterScreen &&\n dragEndScreen && (\n <svg\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n pointerEvents: \"none\",\n mixBlendMode: \"difference\",\n zIndex: 1000,\n }}\n width={containerBounds?.width}\n height={containerBounds?.height}\n >\n <path\n stroke=\"red\"\n d={`M ${ogCenterScreen.x} ${ogCenterScreen.y} ${dragState?.editEvent.route\n .map((p) => applyToPoint(transform!, p))\n .map((p) => `L ${p.x} ${p.y}`)\n .join(\" \")} L ${dragEndScreen.x} ${dragEndScreen.y}`}\n />\n {dragState?.editEvent.route.map((r, i) => {\n const rScreen = applyToPoint(transform!, r)\n return (\n <Fragment key={`r-${i}`}>\n {r.via && (\n <circle cx={rScreen.x} cy={rScreen.y} r={16} stroke=\"red\" />\n )}\n <circle cx={rScreen.x} cy={rScreen.y} r={8} stroke=\"red\" />\n </Fragment>\n )\n })}\n {shouldCreateAsVia && (\n <circle\n key=\"via-outer-circle\"\n cx={dragEndScreen.x}\n cy={dragEndScreen.y}\n r={16}\n stroke=\"red\"\n />\n )}\n <circle\n cx={dragEndScreen.x}\n cy={dragEndScreen.y}\n r={8}\n stroke=\"red\"\n />\n </svg>\n )}\n {!disabled && (\n <svg\n key={\"pcb-trace-hints\"}\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n pointerEvents: \"none\",\n mixBlendMode: \"difference\",\n zIndex: 1000,\n }}\n width={containerBounds?.width}\n height={containerBounds?.height}\n >\n {soup\n .filter((e): e is PcbTraceHint => e.type === \"pcb_trace_hint\")\n .map((e) => {\n const { route } = e\n const pcb_port = su(soup).pcb_port.get(e.pcb_port_id)!\n const pcb_port_screen = applyToPoint(transform!, pcb_port)\n return (\n <Fragment key={e.pcb_trace_hint_id}>\n <rect\n key={`rect-${e.pcb_port_id}`}\n x={pcb_port_screen.x - 10}\n y={pcb_port_screen.y - 10}\n width={20}\n height={20}\n stroke=\"red\"\n />\n <path\n key={`path-${e.pcb_port_id}`}\n stroke=\"red\"\n d={`M ${pcb_port_screen.x} ${pcb_port_screen.y} ${route\n .map((r) => applyToPoint(transform!, r))\n .map((r) => `L ${r.x} ${r.y}`)\n .join(\" \")}`}\n />\n {route\n .map((r) => ({ ...r, ...applyToPoint(transform, r) }))\n .map((r, i) => (\n <Fragment key={i}>\n <circle cx={r.x} cy={r.y} r={8} stroke=\"red\" />\n {r.via && (\n <circle\n cx={r.x}\n cy={r.y}\n r={16}\n stroke=\"red\"\n fill=\"transparent\"\n />\n )}\n </Fragment>\n ))}\n </Fragment>\n )\n })}\n </svg>\n )}\n <div\n style={{\n position: \"absolute\",\n right: 0,\n bottom: 0,\n }}\n >\n {isElementSelected && (\n <HotkeyActionMenu\n hotkeys={[\n {\n key: \"v\",\n name: \"Toggle Via\",\n onUse: () => {\n setShouldCreateAsVia(!shouldCreateAsVia)\n },\n },\n // {\n // key: \"del\",\n // name: \"Delete Node\",\n // onUse: () => {},\n // },\n // {\n // key: \"r\",\n // name: \"Delete Route\",\n // onUse: () => {},\n // },\n ]}\n />\n )}\n </div>\n </div>\n )\n}\n","import { css } from \"@emotion/css\"\nimport { useEffect } from \"react\"\n\nexport const HotkeyActionMenu = ({\n hotkeys,\n}: {\n hotkeys: Array<{\n key: string\n name: string\n onUse: Function\n }>\n}) => {\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n hotkeys.forEach((hotkey) => {\n if (event.key === hotkey.key) {\n hotkey.onUse()\n }\n })\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown)\n }\n }, [hotkeys])\n\n return (\n <div\n className={css`\n display: flex;\n flex-direction: column;\n font-family: sans-serif;\n font-size: 12px;\n margin: 8px;\n `}\n >\n {hotkeys.map((hotkey) => {\n return (\n <div\n key={hotkey.name}\n className={css`\n display: flex;\n align-items: center;\n margin: 2px;\n\n & .key {\n padding: 1px;\n margin: 2px;\n color: rgba(255, 255, 255, 0.8);\n font-size: 9px;\n border-radius: 3px;\n text-align: center;\n width: 20px;\n background-color: #444;\n }\n\n & .name {\n margin-left: 4px;\n color: rgba(255, 255, 255, 0.8);\n }\n `}\n >\n <div className=\"key\">{hotkey.key}</div>{\" \"}\n <div className=\"name\">{hotkey.name}</div>\n </div>\n )\n })}\n </div>\n )\n}\n","export var noop = function () { };\nexport function on(obj) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (obj && obj.addEventListener) {\n obj.addEventListener.apply(obj, args);\n }\n}\nexport function off(obj) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (obj && obj.removeEventListener) {\n obj.removeEventListener.apply(obj, args);\n }\n}\nexport var isBrowser = typeof window !== 'undefined';\nexport var isNavigator = typeof navigator !== 'undefined';\n","import { useEffect, useLayoutEffect } from 'react';\nimport { isBrowser } from './misc/util';\nvar useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : useEffect;\nexport default useIsomorphicLayoutEffect;\n","import { useMemo, useState } from 'react';\nimport useIsomorphicLayoutEffect from './useIsomorphicLayoutEffect';\nimport { isBrowser, noop } from './misc/util';\nvar defaultState = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n};\nfunction useMeasure() {\n var _a = useState(null), element = _a[0], ref = _a[1];\n var _b = useState(defaultState), rect = _b[0], setRect = _b[1];\n var observer = useMemo(function () {\n return new window.ResizeObserver(function (entries) {\n if (entries[0]) {\n var _a = entries[0].contentRect, x = _a.x, y = _a.y, width = _a.width, height = _a.height, top_1 = _a.top, left = _a.left, bottom = _a.bottom, right = _a.right;\n setRect({ x: x, y: y, width: width, height: height, top: top_1, left: left, bottom: bottom, right: right });\n }\n });\n }, []);\n useIsomorphicLayoutEffect(function () {\n if (!element)\n return;\n observer.observe(element);\n return function () {\n observer.disconnect();\n };\n }, [element]);\n return [ref, rect];\n}\nexport default isBrowser && typeof window.ResizeObserver !== 'undefined'\n ? useMeasure\n : (function () { return [noop, defaultState]; });\n","import { transformPCBElement, transformPCBElements } from \"@tscircuit/builder\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport type { EditEvent } from \"./edit-events\"\nimport { translate } from \"transformation-matrix\"\nimport { applyTraceHintEditEvent } from \"./apply-edit-events/apply-edit-trace-hint-event\"\n\nexport const applyEditEvents = (\n soup: AnySoupElement[],\n edit_events: EditEvent[],\n): AnySoupElement[] => {\n soup = JSON.parse(JSON.stringify(soup))\n\n for (const edit_event of edit_events) {\n if (edit_event.pcb_edit_event_type === \"edit_component_location\") {\n const mat = translate(\n edit_event.new_center.x - edit_event.original_center.x,\n edit_event.new_center.y - edit_event.original_center.y,\n )\n // TODO Future work: recurse here in case there's a nested component\n soup = soup.map((e: any) =>\n e.pcb_component_id !== edit_event.pcb_component_id\n ? e\n : transformPCBElement(e, mat),\n )\n } else if (edit_event.pcb_edit_event_type === \"edit_trace_hint\") {\n soup = applyTraceHintEditEvent(soup, edit_event)\n }\n }\n\n return soup\n}\n","import { AnySoupElement } from \"@tscircuit/soup\"\nimport { EditTraceHintEvent } from \"lib/edit-events\"\nimport { su } from \"@tscircuit/soup-util\"\n\nexport const applyTraceHintEditEvent = (\n soup: AnySoupElement[],\n edit_event: EditTraceHintEvent,\n): AnySoupElement[] => {\n const existing_trace_hint = soup.find(\n (th) =>\n th.type === \"pcb_trace_hint\" &&\n th.pcb_trace_hint_id === edit_event.pcb_trace_hint_id,\n )\n\n if (existing_trace_hint) {\n soup = soup.map((e: any) =>\n e.pcb_trace_hint_id === edit_event.pcb_trace_hint_id\n ? {\n ...e,\n route: edit_event.route,\n }\n : e,\n )\n } else {\n // create the trace hint\n const pcb_port = su(soup).pcb_port.get(edit_event.pcb_port_id!)\n\n // console.log(\"edit_event\", edit_event, pcb_port)\n\n soup = soup\n // TODO until builder supports multiple trace hints, replace any\n // old trace hints on this same port\n .filter(\n (e) =>\n !(\n e.type === \"pcb_trace_hint\" &&\n e.pcb_port_id === edit_event.pcb_port_id\n ),\n )\n .concat([\n {\n type: \"pcb_trace_hint\",\n pcb_trace_hint_id: edit_event.pcb_trace_hint_id!,\n route: edit_event.route,\n pcb_port_id: edit_event.pcb_port_id!,\n pcb_component_id: pcb_port?.pcb_component_id!,\n },\n ])\n }\n\n return soup\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tscircuit/pcb-viewer",
3
- "version": "1.3.14",
3
+ "version": "1.4.1",
4
4
  "main": "dist/index.js",
5
5
  "repository": "tscircuit/pcb-viewer",
6
6
  "license": "MIT",