@tscircuit/schematic-viewer 1.2.13 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/.github/workflows/chromatic.yml +30 -0
  2. package/.github/workflows/npm-build.yml +26 -0
  3. package/.github/workflows/npm-typecheck.yml +26 -0
  4. package/dist/index.d.ts +3 -3
  5. package/dist/index.js +140 -89
  6. package/dist/index.js.map +1 -1
  7. package/package.json +20 -10
  8. package/renovate.json +17 -0
  9. package/src/Schematic.tsx +16 -19
  10. package/src/lib/types/source-component.ts +1 -0
  11. package/src/lib/utils/collect-element-refs.ts +3 -3
  12. package/src/lib/utils/get-rotation-from-anchor-side.ts +11 -0
  13. package/src/lib/utils/get-vec-from-anchor-side.ts +11 -0
  14. package/src/schematic-components/DebugPoint.tsx +25 -0
  15. package/src/schematic-components/SchematicBug.tsx +27 -10
  16. package/src/schematic-components/SchematicElement.tsx +7 -13
  17. package/src/schematic-components/SchematicNetLabel.tsx +21 -8
  18. package/src/stories/basics/schematic-net-label.stories.tsx +112 -166
  19. package/src/stories/basics/schematic-net-labels-2.stories.tsx +33 -0
  20. package/src/stories/bug-connections.stories.tsx +6 -6
  21. package/src/stories/bug-high-port-numbers.stories.tsx +20 -17
  22. package/src/stories/bug-pin-spacing.stories.tsx +1 -0
  23. package/src/stories/bugs/bug1-y-flip.stories.tsx +3 -2
  24. package/src/stories/bugs/bug8-autolayout.stories.tsx +2 -2
  25. package/src/stories/component-drawing-example.stories.tsx +2 -2
  26. package/src/stories/led-circuit-builder.stories.tsx +1 -1
  27. package/src/stories/led-circuit-react.stories.tsx +14 -11
  28. package/src/stories/net-alias.stories.tsx +1 -1
  29. package/src/stories/off-center-render.stories.tsx +6 -6
  30. package/src/stories/rotated-resistor.stories.tsx +1 -1
  31. package/src/stories/schematic-path.stories.tsx +1 -1
  32. package/src/stories/three-sided-bug.stories.tsx +8 -8
@@ -0,0 +1,30 @@
1
+ name: "Chromatic"
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+ branches:
9
+ - main
10
+
11
+ jobs:
12
+ chromatic:
13
+ name: Run Chromatic
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Checkout code
17
+ uses: actions/checkout@v4
18
+ with:
19
+ fetch-depth: 0
20
+ - uses: actions/setup-node@v4
21
+ with:
22
+ node-version: 20
23
+ - name: Install dependencies
24
+ # ⚠️ See your package manager's documentation for the correct command to install dependencies in a CI environment.
25
+ run: npm ci
26
+ - name: Run Chromatic
27
+ uses: chromaui/action@latest
28
+ with:
29
+ # ⚠️ Make sure to configure a `CHROMATIC_PROJECT_TOKEN` repository secret
30
+ projectToken: chpt_d88a6beb0734bbe
@@ -0,0 +1,26 @@
1
+ # Created using @tscircuit/plop (npm install -g @tscircuit/plop)
2
+ name: Build
3
+
4
+ on:
5
+ push:
6
+ branches: [main]
7
+ pull_request:
8
+ branches: [main]
9
+
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - uses: actions/checkout@v3
16
+
17
+ - name: Use Node.js
18
+ uses: actions/setup-node@v3
19
+ with:
20
+ node-version: "20"
21
+
22
+ - name: Install dependencies
23
+ run: npm ci
24
+
25
+ - name: Run build
26
+ run: npm run build
@@ -0,0 +1,26 @@
1
+ # Created using @tscircuit/plop (npm install -g @tscircuit/plop)
2
+ name: Type Check
3
+
4
+ on:
5
+ push:
6
+ branches: [main]
7
+ pull_request:
8
+ branches: [main]
9
+
10
+ jobs:
11
+ type-check:
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - uses: actions/checkout@v3
16
+
17
+ - name: Use Node.js
18
+ uses: actions/setup-node@v3
19
+ with:
20
+ node-version: "20"
21
+
22
+ - name: Install dependencies
23
+ run: npm ci
24
+
25
+ - name: Run typecheck
26
+ run: npx tsc --noEmit
package/dist/index.d.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { AnySoupElement } from '@tscircuit/soup';
2
+ import { AnyCircuitElement } from 'circuit-json';
3
3
 
4
4
  interface SchematicProps {
5
5
  children?: any;
6
6
  /** @deprecated use soup */
7
7
  elements?: any;
8
- soup?: AnySoupElement[];
8
+ soup?: AnyCircuitElement[];
9
9
  style?: any;
10
10
  showTable?: boolean;
11
- _soupPostProcessor?: (soup: AnySoupElement[]) => AnySoupElement[];
11
+ _soupPostProcessor?: (soup: AnyCircuitElement[]) => AnyCircuitElement[];
12
12
  }
13
13
  declare const Schematic: (props: SchematicProps) => react_jsx_runtime.JSX.Element;
14
14
  declare const SchematicWithoutContext: ({ children, elements: initialElements, soup: initialSoup, style, showTable, _soupPostProcessor, }: SchematicProps) => react_jsx_runtime.JSX.Element;
package/dist/index.js CHANGED
@@ -939,7 +939,8 @@ __export(src_exports, {
939
939
  module.exports = __toCommonJS(src_exports);
940
940
 
941
941
  // src/Schematic.tsx
942
- var import_react9 = require("react");
942
+ var import_builder3 = require("@tscircuit/builder");
943
+ var import_react_fiber = __toESM(require("@tscircuit/react-fiber"));
943
944
 
944
945
  // node_modules/zustand/esm/vanilla.mjs
945
946
  var import_meta = {};
@@ -1221,15 +1222,7 @@ peg$SyntaxError.buildMessage = function(expected, found) {
1221
1222
  };
1222
1223
 
1223
1224
  // src/lib/render-context/index.ts
1224
- var import_react2 = require("react");
1225
- var createRenderContextStore = () => createStore((set) => ({
1226
- camera_transform: compose(scale(100, 100, 0, 0)),
1227
- setCameraTransform: (transform2) => set({ camera_transform: transform2 })
1228
- }));
1229
- var useGlobalStore = (s) => {
1230
- const store = (0, import_react2.useContext)(StoreContext);
1231
- return useStore(store, s);
1232
- };
1225
+ var import_react7 = require("react");
1233
1226
 
1234
1227
  // src/lib/utils/get-svg-path-bounds.ts
1235
1228
  var import_svg_path_bounds = __toESM(require_svg_path_bounds());
@@ -1249,7 +1242,7 @@ function getSVGPathBounds(ds) {
1249
1242
  var get_svg_path_bounds_default = getSVGPathBounds;
1250
1243
 
1251
1244
  // src/schematic-components/SVGPathComponent.tsx
1252
- var import_react3 = require("react");
1245
+ var import_react2 = require("react");
1253
1246
  var import_jsx_runtime = require("react/jsx-runtime");
1254
1247
  var SVGPathComponent = ({
1255
1248
  size,
@@ -1279,7 +1272,7 @@ var SVGPathComponent = ({
1279
1272
  width: innerSize.width + padding.x * 2,
1280
1273
  height: innerSize.height + padding.y * 2
1281
1274
  };
1282
- const [hovering, setHovering] = (0, import_react3.useState)(false);
1275
+ const [hovering, setHovering] = (0, import_react2.useState)(false);
1283
1276
  const svgLeft = absoluteCenter.x - fullSize.width / 2;
1284
1277
  const svgTop = absoluteCenter.y - fullSize.height / 2;
1285
1278
  const preferredRatio = pathBounds.width === 0 ? innerSize.height / pathBounds.height : innerSize.width / pathBounds.width;
@@ -1413,7 +1406,7 @@ var SimpleCapacitor = ({
1413
1406
  };
1414
1407
 
1415
1408
  // src/lib/hooks/use-maybe-promise.ts
1416
- var import_react4 = require("react");
1409
+ var import_react3 = require("react");
1417
1410
 
1418
1411
  // src/schematic-components/ProjectComponent.tsx
1419
1412
  var import_builder = require("@tscircuit/builder");
@@ -1511,7 +1504,7 @@ var SchematicPort = ({
1511
1504
  var SchematicPort_default = SchematicPort;
1512
1505
 
1513
1506
  // node_modules/react-use-measure/dist/web.js
1514
- var import_react5 = require("react");
1507
+ var import_react4 = require("react");
1515
1508
  var import_debounce = __toESM(require_debounce());
1516
1509
  function useMeasure(_temp) {
1517
1510
  let {
@@ -1529,7 +1522,7 @@ function useMeasure(_temp) {
1529
1522
  if (!ResizeObserver) {
1530
1523
  throw new Error("This browser does not support ResizeObserver out of the box. See: https://github.com/react-spring/react-use-measure/#resize-observer-polyfills");
1531
1524
  }
1532
- const [bounds, set] = (0, import_react5.useState)({
1525
+ const [bounds, set] = (0, import_react4.useState)({
1533
1526
  left: 0,
1534
1527
  top: 0,
1535
1528
  width: 0,
@@ -1539,7 +1532,7 @@ function useMeasure(_temp) {
1539
1532
  x: 0,
1540
1533
  y: 0
1541
1534
  });
1542
- const state = (0, import_react5.useRef)({
1535
+ const state = (0, import_react4.useRef)({
1543
1536
  element: null,
1544
1537
  scrollContainers: null,
1545
1538
  resizeObserver: null,
@@ -1547,12 +1540,12 @@ function useMeasure(_temp) {
1547
1540
  });
1548
1541
  const scrollDebounce = debounce ? typeof debounce === "number" ? debounce : debounce.scroll : null;
1549
1542
  const resizeDebounce = debounce ? typeof debounce === "number" ? debounce : debounce.resize : null;
1550
- const mounted = (0, import_react5.useRef)(false);
1551
- (0, import_react5.useEffect)(() => {
1543
+ const mounted = (0, import_react4.useRef)(false);
1544
+ (0, import_react4.useEffect)(() => {
1552
1545
  mounted.current = true;
1553
1546
  return () => void (mounted.current = false);
1554
1547
  });
1555
- const [forceRefresh, resizeChange, scrollChange] = (0, import_react5.useMemo)(() => {
1548
+ const [forceRefresh, resizeChange, scrollChange] = (0, import_react4.useMemo)(() => {
1556
1549
  const callback = () => {
1557
1550
  if (!state.current.element)
1558
1551
  return;
@@ -1618,22 +1611,22 @@ function useMeasure(_temp) {
1618
1611
  };
1619
1612
  useOnWindowScroll(scrollChange, Boolean(scroll));
1620
1613
  useOnWindowResize(resizeChange);
1621
- (0, import_react5.useEffect)(() => {
1614
+ (0, import_react4.useEffect)(() => {
1622
1615
  removeListeners();
1623
1616
  addListeners();
1624
1617
  }, [scroll, scrollChange, resizeChange]);
1625
- (0, import_react5.useEffect)(() => removeListeners, []);
1618
+ (0, import_react4.useEffect)(() => removeListeners, []);
1626
1619
  return [ref, bounds, forceRefresh];
1627
1620
  }
1628
1621
  function useOnWindowResize(onWindowResize) {
1629
- (0, import_react5.useEffect)(() => {
1622
+ (0, import_react4.useEffect)(() => {
1630
1623
  const cb = onWindowResize;
1631
1624
  window.addEventListener("resize", cb);
1632
1625
  return () => void window.removeEventListener("resize", cb);
1633
1626
  }, [onWindowResize]);
1634
1627
  }
1635
1628
  function useOnWindowScroll(onScroll, enabled) {
1636
- (0, import_react5.useEffect)(() => {
1629
+ (0, import_react4.useEffect)(() => {
1637
1630
  if (enabled) {
1638
1631
  const cb = onScroll;
1639
1632
  window.addEventListener("scroll", cb, {
@@ -1809,11 +1802,13 @@ var SchematicTrace_default = SchematicTrace;
1809
1802
  var import_builder2 = require("@tscircuit/builder");
1810
1803
  var import_jsx_runtime11 = require("react/jsx-runtime");
1811
1804
  var SchematicBug = ({ component: { source, schematic } }) => {
1805
+ const location = schematic.center;
1812
1806
  const port_arrangement = {
1813
1807
  top_size: 0,
1814
1808
  bottom_size: 0,
1815
1809
  ...schematic.port_arrangement
1816
1810
  };
1811
+ const manufacturerPartNumber = source.manufacturerPartNumber;
1817
1812
  let bugw = schematic.size.width;
1818
1813
  let bugh = schematic.size.height;
1819
1814
  const { total_ports, width, height } = (0, import_builder2.getPortArrangementSize)(port_arrangement);
@@ -1847,15 +1842,33 @@ var SchematicBug = ({ component: { source, schematic } }) => {
1847
1842
  x: schematic.center.x + (actualSize.minX + actualSize.maxX) / 2,
1848
1843
  y: schematic.center.y + (actualSize.minY + actualSize.maxY) / 2
1849
1844
  };
1850
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1851
- SVGPathComponent_default,
1852
- {
1853
- rotation: schematic.rotation,
1854
- center: actualCenter,
1855
- size: actualSize,
1856
- paths
1857
- }
1858
- );
1845
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
1846
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1847
+ SVGPathComponent_default,
1848
+ {
1849
+ rotation: schematic.rotation,
1850
+ center: actualCenter,
1851
+ size: actualSize,
1852
+ paths
1853
+ }
1854
+ ),
1855
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1856
+ SchematicText_default,
1857
+ {
1858
+ schematic_text: {
1859
+ anchor: "bottom",
1860
+ position: {
1861
+ x: location.x + actualSize.minX / 1.5,
1862
+ y: location.y + actualSize.minY
1863
+ },
1864
+ schematic_component_id: "SYNTHETIC",
1865
+ schematic_text_id: "SYNTHETIC",
1866
+ text: manufacturerPartNumber,
1867
+ type: "schematic_text"
1868
+ }
1869
+ }
1870
+ )
1871
+ ] });
1859
1872
  };
1860
1873
 
1861
1874
  // src/schematic-components/SimplePowerSource.tsx
@@ -1970,19 +1983,29 @@ var SimpleDiode = ({ component: { source, schematic } }) => {
1970
1983
  };
1971
1984
 
1972
1985
  // src/schematic-components/ContextProviders.tsx
1986
+ var import_react5 = require("react");
1973
1987
  var import_react6 = require("react");
1974
- var import_react7 = require("react");
1975
1988
  var import_jsx_runtime16 = require("react/jsx-runtime");
1976
- var StoreContext = (0, import_react7.createContext)(null);
1989
+ var StoreContext = (0, import_react6.createContext)(null);
1977
1990
  var ContextProviders = ({ children }) => {
1978
- const store = (0, import_react6.useMemo)(() => createRenderContextStore(), []);
1991
+ const store = (0, import_react5.useMemo)(() => createRenderContextStore(), []);
1979
1992
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(StoreContext.Provider, { value: store, children });
1980
1993
  };
1981
1994
 
1995
+ // src/lib/render-context/index.ts
1996
+ var createRenderContextStore = () => createStore((set) => ({
1997
+ camera_transform: compose(scale(100, 100, 0, 0)),
1998
+ setCameraTransform: (transform2) => set({ camera_transform: transform2 })
1999
+ }));
2000
+ var useGlobalStore = (s) => {
2001
+ const store = (0, import_react7.useContext)(StoreContext);
2002
+ return useStore(store, s);
2003
+ };
2004
+
1982
2005
  // src/Schematic.tsx
2006
+ var import_react9 = require("react");
2007
+ var import_react_error_boundary = require("react-error-boundary");
1983
2008
  var import_react_supergrid = require("react-supergrid");
1984
- var import_builder3 = require("@tscircuit/builder");
1985
- var import_react_fiber = __toESM(require("@tscircuit/react-fiber"));
1986
2009
 
1987
2010
  // src/lib/utils/collect-element-refs.ts
1988
2011
  var collectElementRefs = (elm, allElms) => {
@@ -2071,9 +2094,87 @@ var SchematicLine = ({ line: { schematic } }) => {
2071
2094
  };
2072
2095
  var SchematicLine_default = SchematicLine;
2073
2096
 
2097
+ // src/lib/utils/get-rotation-from-anchor-side.ts
2098
+ var getRotationFromAnchorSide = (anchor_side) => {
2099
+ if (anchor_side === "left")
2100
+ return 0;
2101
+ if (anchor_side === "top")
2102
+ return Math.PI * 3 / 2;
2103
+ if (anchor_side === "right")
2104
+ return Math.PI;
2105
+ if (anchor_side === "bottom")
2106
+ return Math.PI / 2;
2107
+ return 0;
2108
+ };
2109
+
2110
+ // src/lib/utils/get-vec-from-anchor-side.ts
2111
+ var getVecFromAnchorSide = (anchor_side) => {
2112
+ if (anchor_side === "left")
2113
+ return { x: -1, y: 0 };
2114
+ if (anchor_side === "top")
2115
+ return { x: 0, y: -1 };
2116
+ if (anchor_side === "right")
2117
+ return { x: 1, y: 0 };
2118
+ if (anchor_side === "bottom")
2119
+ return { x: 0, y: 1 };
2120
+ throw new Error(`invalid anchor side "${anchor_side}"`);
2121
+ };
2122
+
2123
+ // src/schematic-components/SchematicNetLabel.tsx
2124
+ var import_jsx_runtime19 = require("react/jsx-runtime");
2125
+ var SchematicNetLabel = ({
2126
+ net_label
2127
+ }) => {
2128
+ const anchor_side = net_label.anchor_side;
2129
+ const is_vertical = anchor_side === "top" || anchor_side === "bottom";
2130
+ const text_width = is_vertical ? 0.3 : net_label.text.length * 0.15;
2131
+ const path_width = 31 + net_label.text.length * 5;
2132
+ const anchor_vec = getVecFromAnchorSide(anchor_side);
2133
+ const anchor_dist = is_vertical ? 0.04 : text_width / 4;
2134
+ anchor_vec.x *= anchor_dist;
2135
+ anchor_vec.y *= anchor_dist;
2136
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [
2137
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2138
+ SVGPathComponent_default,
2139
+ {
2140
+ rotation: getRotationFromAnchorSide(anchor_side),
2141
+ center: net_label.center,
2142
+ size: {
2143
+ width: 0.05 + text_width,
2144
+ height: 0.2 + (is_vertical ? 0.1 * Math.max(1, net_label.text.length - 2) : 0)
2145
+ },
2146
+ paths: [
2147
+ {
2148
+ stroke: "gray",
2149
+ strokeWidth: 0.75,
2150
+ // d: `M 0 15 L 5 15 L 11 9 L ${path_width} 9 L ${path_width} 21 L 11 21 L 5 15`,
2151
+ d: `M 0 15 L 5 15 L 11 5 L ${path_width} 5 L ${path_width} 26 L 11 26 L 5 15`
2152
+ }
2153
+ ]
2154
+ }
2155
+ ),
2156
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2157
+ SchematicText_default,
2158
+ {
2159
+ schematic_text: {
2160
+ anchor: is_vertical ? "center" : anchor_side,
2161
+ position: {
2162
+ x: net_label.center.x + anchor_vec.x,
2163
+ y: net_label.center.y + anchor_vec.y
2164
+ },
2165
+ schematic_component_id: "SYNTHETIC",
2166
+ schematic_text_id: "SYNTHETIC",
2167
+ text: net_label.text,
2168
+ type: "schematic_text"
2169
+ }
2170
+ }
2171
+ )
2172
+ ] });
2173
+ };
2174
+
2074
2175
  // src/schematic-components/SchematicPath.tsx
2075
2176
  var import_svg_path_generator3 = __toESM(require_svg_path_generator2());
2076
- var import_jsx_runtime19 = require("react/jsx-runtime");
2177
+ var import_jsx_runtime20 = require("react/jsx-runtime");
2077
2178
  var SchematicPath = (props) => {
2078
2179
  const { points, is_filled, is_closed, fill_color } = props.path.schematic;
2079
2180
  if (points.length === 0)
@@ -2094,7 +2195,7 @@ var SchematicPath = (props) => {
2094
2195
  x: pathBounds.minX + pathBounds.width / 2,
2095
2196
  y: pathBounds.minY + pathBounds.height / 2
2096
2197
  };
2097
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2198
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2098
2199
  SVGPathComponent,
2099
2200
  {
2100
2201
  rotation: 0,
@@ -2113,52 +2214,6 @@ var SchematicPath = (props) => {
2113
2214
  };
2114
2215
  var SchematicPath_default = SchematicPath;
2115
2216
 
2116
- // src/schematic-components/SchematicNetLabel.tsx
2117
- var import_jsx_runtime20 = require("react/jsx-runtime");
2118
- var SchematicNetLabel = ({
2119
- net_label
2120
- }) => {
2121
- console.log({ net_label });
2122
- const text_width = net_label.text.length * 0.15;
2123
- const path_width = 31 + net_label.text.length * 5;
2124
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
2125
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2126
- SVGPathComponent_default,
2127
- {
2128
- rotation: 0,
2129
- center: net_label.center,
2130
- size: {
2131
- width: 0.05 + text_width,
2132
- height: 0.175
2133
- },
2134
- paths: [
2135
- {
2136
- stroke: "gray",
2137
- strokeWidth: 0.75,
2138
- d: `M 0 15 L 5 15 L 11 9 L ${path_width} 9 L ${path_width} 21 L 11 21 L 5 15`
2139
- }
2140
- ]
2141
- }
2142
- ),
2143
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2144
- SchematicText_default,
2145
- {
2146
- schematic_text: {
2147
- anchor: "left",
2148
- position: {
2149
- x: net_label.center.x - text_width / 4 + 0.025,
2150
- y: net_label.center.y
2151
- },
2152
- schematic_component_id: "SYNTHETIC",
2153
- schematic_text_id: "SYNTHETIC",
2154
- text: net_label.text,
2155
- type: "schematic_text"
2156
- }
2157
- }
2158
- )
2159
- ] });
2160
- };
2161
-
2162
2217
  // src/schematic-components/SchematicElement.tsx
2163
2218
  var import_jsx_runtime21 = require("react/jsx-runtime");
2164
2219
  var SchematicElement = ({
@@ -2194,15 +2249,11 @@ var SchematicElement = ({
2194
2249
  if (element.type === "schematic_net_label") {
2195
2250
  return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SchematicNetLabel, { net_label: element });
2196
2251
  }
2197
- if (element.type === "source_error") {
2198
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(RenderError_default, { text: element.message });
2199
- }
2200
2252
  return null;
2201
2253
  };
2202
2254
 
2203
2255
  // src/Schematic.tsx
2204
2256
  var import_use_mouse_matrix_transform = require("use-mouse-matrix-transform");
2205
- var import_react_error_boundary = require("react-error-boundary");
2206
2257
 
2207
2258
  // src/schematic-components/TableViewer.tsx
2208
2259
  var import_react8 = require("react");