@tscircuit/3d-viewer 0.0.610 → 0.0.611

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 (2) hide show
  1. package/dist/index.js +174 -124
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -14608,7 +14608,7 @@ var useHiddenCadComponents = (circuitKey) => {
14608
14608
  };
14609
14609
 
14610
14610
  // src/CadViewer.tsx
14611
- import { useCallback as useCallback24, useContext as useContext10, useEffect as useEffect50, useRef as useRef29, useState as useState41 } from "react";
14611
+ import { useCallback as useCallback24, useContext as useContext10, useEffect as useEffect50, useRef as useRef29, useState as useState42 } from "react";
14612
14612
  import * as THREE54 from "three";
14613
14613
 
14614
14614
  // src/hooks/use-convert-children-to-soup.ts
@@ -14646,7 +14646,7 @@ var getCadPcbContext = (cad, circuitJson) => {
14646
14646
 
14647
14647
  // src/AnyCadComponent.tsx
14648
14648
  import { su as su2 } from "@tscircuit/circuit-json-util";
14649
- import { useCallback as useCallback3, useEffect as useEffect12, useMemo as useMemo10, useState as useState8 } from "react";
14649
+ import { useCallback as useCallback3, useEffect as useEffect12, useMemo as useMemo9, useState as useState9 } from "react";
14650
14650
 
14651
14651
  // src/contexts/LayerVisibilityContext.tsx
14652
14652
  import {
@@ -38199,7 +38199,7 @@ function GltfModel({
38199
38199
  var import_jscad_planner = __toESM(require_dist(), 1);
38200
38200
  var import_modeling = __toESM(require_src(), 1);
38201
38201
  import * as THREE11 from "three";
38202
- import { useMemo as useMemo8, useEffect as useEffect9 } from "react";
38202
+ import { useState as useState6, useEffect as useEffect9 } from "react";
38203
38203
  import { jsx as jsx8 } from "react/jsx-runtime";
38204
38204
  var JscadModel = ({
38205
38205
  jscadPlan,
@@ -38216,31 +38216,39 @@ var JscadModel = ({
38216
38216
  scale: scale2,
38217
38217
  isTranslucent = false
38218
38218
  }) => {
38219
- const { threeGeom, material } = useMemo8(() => {
38219
+ const [mesh, setMesh] = useState6(null);
38220
+ useEffect9(() => {
38220
38221
  const jscadObject = (0, import_jscad_planner.executeJscadOperations)(import_modeling.default, jscadPlan);
38221
38222
  if (!jscadObject || !jscadObject.polygons && !jscadObject.sides) {
38222
- return { threeGeom: null, material: null };
38223
+ setMesh(null);
38224
+ return;
38223
38225
  }
38224
- const threeGeom2 = convertCSGToThreeGeom(jscadObject);
38226
+ const geometry = convertCSGToThreeGeom(jscadObject);
38225
38227
  const material2 = new THREE11.MeshStandardMaterial({
38226
38228
  vertexColors: true,
38227
- side: THREE11.DoubleSide,
38228
- transparent: isTranslucent,
38229
- opacity: isTranslucent ? 0.5 : 1,
38230
- depthWrite: !isTranslucent
38229
+ side: THREE11.DoubleSide
38231
38230
  });
38232
- return { threeGeom: threeGeom2, material: material2 };
38233
- }, [jscadPlan, isTranslucent]);
38234
- const mesh = useMemo8(() => {
38235
- if (!threeGeom) return null;
38236
- const createdMesh = new THREE11.Mesh(threeGeom, material);
38237
- createdMesh.renderOrder = isTranslucent ? 2 : 1;
38238
- configureObjectShadows(createdMesh, {
38231
+ const model = new THREE11.Mesh(geometry, material2);
38232
+ setMesh(model);
38233
+ return () => {
38234
+ geometry.dispose();
38235
+ material2.dispose();
38236
+ };
38237
+ }, [jscadPlan]);
38238
+ useEffect9(() => {
38239
+ if (!mesh) return;
38240
+ const material2 = mesh.material;
38241
+ material2.transparent = isTranslucent;
38242
+ material2.opacity = isTranslucent ? 0.5 : 1;
38243
+ material2.depthWrite = !isTranslucent;
38244
+ material2.needsUpdate = true;
38245
+ mesh.renderOrder = isTranslucent ? 2 : 1;
38246
+ configureObjectShadows(mesh, {
38239
38247
  castShadow: !isTranslucent,
38240
38248
  receiveShadow: true
38241
38249
  });
38242
- return createdMesh;
38243
- }, [threeGeom, material, isTranslucent]);
38250
+ }, [mesh, isTranslucent]);
38251
+ const material = mesh?.material;
38244
38252
  const { boardTransformGroup } = useCadModelTransformGraph({
38245
38253
  model: mesh,
38246
38254
  position: positionOffset,
@@ -38263,7 +38271,7 @@ var JscadModel = ({
38263
38271
  material.emissiveIntensity = 0;
38264
38272
  }
38265
38273
  }, [isHovered, material]);
38266
- if (!threeGeom) return null;
38274
+ if (!mesh) return null;
38267
38275
  return /* @__PURE__ */ jsx8(
38268
38276
  ContainerWithTooltip_default,
38269
38277
  {
@@ -38276,7 +38284,7 @@ var JscadModel = ({
38276
38284
  };
38277
38285
 
38278
38286
  // src/hooks/use-global-obj-loader.ts
38279
- import { useEffect as useEffect10, useState as useState6 } from "react";
38287
+ import { useEffect as useEffect10, useState as useState7 } from "react";
38280
38288
 
38281
38289
  // src/utils/vrml.ts
38282
38290
  import { VRMLLoader } from "three-stdlib";
@@ -38303,7 +38311,7 @@ if (typeof window !== "undefined" && !window.TSCIRCUIT_OBJ_LOADER_CACHE) {
38303
38311
  window.TSCIRCUIT_OBJ_LOADER_CACHE = /* @__PURE__ */ new Map();
38304
38312
  }
38305
38313
  function useGlobalObjLoader(url) {
38306
- const [obj, setObj] = useState6(null);
38314
+ const [obj, setObj] = useState7(null);
38307
38315
  useEffect10(() => {
38308
38316
  if (!url) return;
38309
38317
  const cleanUrl = url.replace(/&cachebust_origin=$/, "");
@@ -38374,7 +38382,7 @@ function useGlobalObjLoader(url) {
38374
38382
  }
38375
38383
 
38376
38384
  // src/three-components/MixedStlModel.tsx
38377
- import { useMemo as useMemo9 } from "react";
38385
+ import { useMemo as useMemo8 } from "react";
38378
38386
  import * as THREE12 from "three";
38379
38387
  import { jsx as jsx9 } from "react/jsx-runtime";
38380
38388
  function MixedStlModel({
@@ -38393,7 +38401,7 @@ function MixedStlModel({
38393
38401
  isTranslucent = false
38394
38402
  }) {
38395
38403
  const obj = useGlobalObjLoader(url);
38396
- const model = useMemo9(() => {
38404
+ const model = useMemo8(() => {
38397
38405
  if (obj && !(obj instanceof Error)) {
38398
38406
  obj.traverse((child) => {
38399
38407
  if (child instanceof THREE12.Mesh && child.material) {
@@ -38457,7 +38465,7 @@ function MixedStlModel({
38457
38465
  }
38458
38466
 
38459
38467
  // src/three-components/StepModel.tsx
38460
- import { useEffect as useEffect11, useState as useState7 } from "react";
38468
+ import { useEffect as useEffect11, useState as useState8 } from "react";
38461
38469
  import { GLTFExporter } from "three-stdlib";
38462
38470
 
38463
38471
  // src/three-components/step-mesh-to-group.ts
@@ -38671,7 +38679,7 @@ var StepModel = ({
38671
38679
  isHovered,
38672
38680
  isTranslucent
38673
38681
  }) => {
38674
- const [stepGltfUrl, setStepGltfUrl] = useState7(null);
38682
+ const [stepGltfUrl, setStepGltfUrl] = useState8(null);
38675
38683
  useEffect11(() => {
38676
38684
  let isActive = true;
38677
38685
  let objectUrl = null;
@@ -39109,9 +39117,9 @@ var AnyCadComponent = ({
39109
39117
  resolveStaticAsset
39110
39118
  }) => {
39111
39119
  const pcbThickness = usePcbThickness(circuitJson);
39112
- const [isHovered, setIsHovered] = useState8(false);
39120
+ const [isHovered, setIsHovered] = useState9(false);
39113
39121
  const { visibility } = useLayerVisibility();
39114
- const [hoverPosition, setHoverPosition] = useState8(null);
39122
+ const [hoverPosition, setHoverPosition] = useState9(null);
39115
39123
  const handleHover = useCallback3((e) => {
39116
39124
  if (e?.mousePosition) {
39117
39125
  setIsHovered(true);
@@ -39125,12 +39133,12 @@ var AnyCadComponent = ({
39125
39133
  setIsHovered(false);
39126
39134
  setHoverPosition(null);
39127
39135
  }, []);
39128
- const componentName = useMemo10(() => {
39136
+ const componentName = useMemo9(() => {
39129
39137
  return su2(circuitJson).source_component.getUsing({
39130
39138
  source_component_id: cad_component.source_component_id
39131
39139
  })?.name;
39132
39140
  }, [circuitJson, cad_component.source_component_id]);
39133
- const { pcbComponent, layer, isThroughHole } = useMemo10(
39141
+ const { pcbComponent, layer, isThroughHole } = useMemo9(
39134
39142
  () => getCadPcbContext(cad_component, circuitJson),
39135
39143
  [cad_component, circuitJson]
39136
39144
  );
@@ -39147,13 +39155,13 @@ var AnyCadComponent = ({
39147
39155
  const stepUrl = resolveModelUrlWithStaticResolver(
39148
39156
  cad_component.model_step_url
39149
39157
  );
39150
- const [fallbackModelIndex, setFallbackModelIndex] = useState8(0);
39151
- const [lastModelError, setLastModelError] = useState8(null);
39158
+ const [fallbackModelIndex, setFallbackModelIndex] = useState9(0);
39159
+ const [lastModelError, setLastModelError] = useState9(null);
39152
39160
  useEffect12(() => {
39153
39161
  setFallbackModelIndex(0);
39154
39162
  setLastModelError(null);
39155
39163
  }, [cad_component.cad_component_id, url, gltfUrl, stepUrl]);
39156
- const isEnclosure = useMemo10(
39164
+ const isEnclosure = useMemo9(
39157
39165
  () => isLegacyFdmEnclosure(cad_component, circuitJson),
39158
39166
  [cad_component, circuitJson]
39159
39167
  );
@@ -39162,7 +39170,7 @@ var AnyCadComponent = ({
39162
39170
  const renderedModelType = getRenderedCadModelType(sourceModelType);
39163
39171
  const gltfModelType = cad_component.model_glb_url ? "glb" : "gltf";
39164
39172
  const meshModelType = cad_component.model_wrl_url ? "wrl" : cad_component.model_stl_url ? "stl" : "obj";
39165
- const modelTransform = useMemo10(
39173
+ const modelTransform = useMemo9(
39166
39174
  () => getCadModelTransform(cad_component, {
39167
39175
  layer,
39168
39176
  pcbThickness,
@@ -39172,7 +39180,7 @@ var AnyCadComponent = ({
39172
39180
  );
39173
39181
  const rotationOffset = tuple(...modelTransform.rotation);
39174
39182
  const adjustedPosition = modelTransform.position;
39175
- const fallbackModelComponents = useMemo10(() => {
39183
+ const fallbackModelComponents = useMemo9(() => {
39176
39184
  const components = [];
39177
39185
  if (gltfUrl) {
39178
39186
  components.push(
@@ -39369,13 +39377,13 @@ var AnyCadComponent = ({
39369
39377
  };
39370
39378
 
39371
39379
  // src/CadViewerContainer.tsx
39372
- import { forwardRef as forwardRef2, useEffect as useEffect21, useMemo as useMemo18, useState as useState12 } from "react";
39380
+ import { forwardRef as forwardRef2, useEffect as useEffect21, useMemo as useMemo17, useState as useState13 } from "react";
39373
39381
  import * as THREE25 from "three";
39374
39382
 
39375
39383
  // package.json
39376
39384
  var package_default = {
39377
39385
  name: "@tscircuit/3d-viewer",
39378
- version: "0.0.609",
39386
+ version: "0.0.610",
39379
39387
  repository: {
39380
39388
  type: "git",
39381
39389
  url: "https://github.com/tscircuit/3d-viewer"
@@ -39473,7 +39481,7 @@ var package_default = {
39473
39481
  };
39474
39482
 
39475
39483
  // src/contexts/appearance-context.tsx
39476
- import { createContext as createContext5, useContext as useContext5, useEffect as useEffect13, useMemo as useMemo11, useState as useState9 } from "react";
39484
+ import { createContext as createContext5, useContext as useContext5, useEffect as useEffect13, useMemo as useMemo10, useState as useState10 } from "react";
39477
39485
  import { jsx as jsx12 } from "react/jsx-runtime";
39478
39486
  var LIGHTING_STORAGE_KEY = "cadViewerLightingEnabled";
39479
39487
  var readStoredLightingEnabled = () => {
@@ -39486,9 +39494,9 @@ var AppearanceContext = createContext5(
39486
39494
  var AppearanceProvider = ({
39487
39495
  children
39488
39496
  }) => {
39489
- const [darkBackgroundEnabled, setDarkBackgroundEnabled] = useState9(false);
39490
- const [gridEnabled, setGridEnabled] = useState9(false);
39491
- const [lightingEnabled, setLightingEnabled] = useState9(
39497
+ const [darkBackgroundEnabled, setDarkBackgroundEnabled] = useState10(false);
39498
+ const [gridEnabled, setGridEnabled] = useState10(false);
39499
+ const [lightingEnabled, setLightingEnabled] = useState10(
39492
39500
  readStoredLightingEnabled
39493
39501
  );
39494
39502
  useEffect13(() => {
@@ -39497,7 +39505,7 @@ var AppearanceProvider = ({
39497
39505
  lightingEnabled ? "true" : "false"
39498
39506
  );
39499
39507
  }, [lightingEnabled]);
39500
- const value = useMemo11(
39508
+ const value = useMemo10(
39501
39509
  () => ({
39502
39510
  darkBackgroundEnabled,
39503
39511
  setDarkBackgroundEnabled,
@@ -39523,9 +39531,9 @@ import {
39523
39531
  createContext as createContext6,
39524
39532
  useCallback as useCallback4,
39525
39533
  useContext as useContext6,
39526
- useMemo as useMemo12,
39534
+ useMemo as useMemo11,
39527
39535
  useRef as useRef3,
39528
- useState as useState10
39536
+ useState as useState11
39529
39537
  } from "react";
39530
39538
  import * as THREE15 from "three";
39531
39539
  import { jsx as jsx13 } from "react/jsx-runtime";
@@ -39570,15 +39578,15 @@ var CameraControllerContext = createContext6(void 0);
39570
39578
  var CameraControllerProvider = ({ children, defaultTarget, initialCameraPosition, initialCameraType }) => {
39571
39579
  const controlsRef = useRef3(null);
39572
39580
  const mainCameraRef = useRef3(null);
39573
- const [controller, setController] = useState10(null);
39574
- const [cameraType, setCameraType] = useState10(
39581
+ const [controller, setController] = useState11(null);
39582
+ const [cameraType, setCameraType] = useState11(
39575
39583
  initialCameraType ?? "perspective"
39576
39584
  );
39577
- const [cameraPosition, setCameraPosition] = useState10(initialCameraPosition ?? null);
39578
- const [cameraRotation, setCameraRotation] = useState10(
39585
+ const [cameraPosition, setCameraPosition] = useState11(initialCameraPosition ?? null);
39586
+ const [cameraRotation, setCameraRotation] = useState11(
39579
39587
  new THREE15.Euler(0, 0, 0)
39580
39588
  );
39581
- const baseDistance = useMemo12(() => {
39589
+ const baseDistance = useMemo11(() => {
39582
39590
  const [x, y, z42] = initialCameraPosition ?? [5, -5, 5];
39583
39591
  const distance6 = Math.hypot(
39584
39592
  x - defaultTarget.x,
@@ -39686,7 +39694,7 @@ var CameraControllerProvider = ({ children, defaultTarget, initialCameraPosition
39686
39694
  },
39687
39695
  []
39688
39696
  );
39689
- const cameraControllerContextValue = useMemo12(
39697
+ const cameraControllerContextValue = useMemo11(
39690
39698
  () => ({
39691
39699
  controlsRef,
39692
39700
  mainCameraRef,
@@ -39917,11 +39925,11 @@ var useCameraSession = () => {
39917
39925
  import {
39918
39926
  useRef as useRef6,
39919
39927
  useEffect as useEffect15,
39920
- useState as useState11,
39928
+ useState as useState12,
39921
39929
  useCallback as useCallback7,
39922
39930
  forwardRef,
39923
39931
  useImperativeHandle,
39924
- useMemo as useMemo13
39932
+ useMemo as useMemo12
39925
39933
  } from "react";
39926
39934
  import * as THREE18 from "three";
39927
39935
 
@@ -39946,7 +39954,7 @@ var Canvas = forwardRef(
39946
39954
  ({ children, scene: sceneProps, camera: cameraProps, style, onCreated }, ref) => {
39947
39955
  const { cameraType } = useCameraController();
39948
39956
  const mountRef = useRef6(null);
39949
- const [contextState, setContextState] = useState11(
39957
+ const [contextState, setContextState] = useState12(
39950
39958
  null
39951
39959
  );
39952
39960
  const frameListeners = useRef6(
@@ -39969,7 +39977,7 @@ var Canvas = forwardRef(
39969
39977
  },
39970
39978
  []
39971
39979
  );
39972
- const scene = useMemo13(() => new THREE18.Scene(), []);
39980
+ const scene = useMemo12(() => new THREE18.Scene(), []);
39973
39981
  if (sceneProps?.up) {
39974
39982
  scene.up.set(sceneProps.up.x, sceneProps.up.y, sceneProps.up.z);
39975
39983
  }
@@ -40083,7 +40091,7 @@ var Canvas = forwardRef(
40083
40091
  );
40084
40092
 
40085
40093
  // src/react-three/Grid.tsx
40086
- import { useEffect as useEffect16, useMemo as useMemo14 } from "react";
40094
+ import { useEffect as useEffect16, useMemo as useMemo13 } from "react";
40087
40095
  import * as THREE19 from "three";
40088
40096
  var vertexShader = `
40089
40097
  varying vec3 worldPosition;
@@ -40129,7 +40137,7 @@ var Grid = ({
40129
40137
  }) => {
40130
40138
  const { scene, camera } = useThree();
40131
40139
  const size4 = 1e3;
40132
- const gridMesh = useMemo14(() => {
40140
+ const gridMesh = useMemo13(() => {
40133
40141
  const geometry = new THREE19.PlaneGeometry(size4, size4);
40134
40142
  geometry.rotateX(-Math.PI / 2);
40135
40143
  const material = new THREE19.ShaderMaterial({
@@ -40175,7 +40183,7 @@ var Grid = ({
40175
40183
  };
40176
40184
 
40177
40185
  // src/react-three/Lights.tsx
40178
- import { useEffect as useEffect17, useMemo as useMemo15 } from "react";
40186
+ import { useEffect as useEffect17, useMemo as useMemo14 } from "react";
40179
40187
  import * as THREE20 from "three";
40180
40188
  var UNDERSIDE_LIGHT_FACTOR = 0.75;
40181
40189
  var Lights = ({
@@ -40185,7 +40193,7 @@ var Lights = ({
40185
40193
  shadowsEnabled = false
40186
40194
  }) => {
40187
40195
  const { scene } = useThree();
40188
- const lightRig = useMemo15(() => {
40196
+ const lightRig = useMemo14(() => {
40189
40197
  const rig = new THREE20.Group();
40190
40198
  rig.name = "cad-viewer-light-rig";
40191
40199
  const centerX = boardCenter?.x ?? 0;
@@ -40300,7 +40308,7 @@ var Lights = ({
40300
40308
  };
40301
40309
 
40302
40310
  // src/react-three/OrbitControls.tsx
40303
- import { useEffect as useEffect18, useMemo as useMemo16 } from "react";
40311
+ import { useEffect as useEffect18, useMemo as useMemo15 } from "react";
40304
40312
  import * as THREE21 from "three";
40305
40313
  import { OrbitControls as ThreeOrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
40306
40314
  var OrbitControls = ({
@@ -40316,7 +40324,7 @@ var OrbitControls = ({
40316
40324
  onControlsChange
40317
40325
  }) => {
40318
40326
  const { camera, renderer } = useThree();
40319
- const controls = useMemo16(() => {
40327
+ const controls = useMemo15(() => {
40320
40328
  if (!camera || !renderer) return null;
40321
40329
  return new ThreeOrbitControls(camera, renderer.domElement);
40322
40330
  }, [camera, renderer]);
@@ -40624,7 +40632,7 @@ var OrientationCubeCanvas = () => {
40624
40632
  };
40625
40633
 
40626
40634
  // src/three-components/reference-object.tsx
40627
- import { useEffect as useEffect20, useMemo as useMemo17 } from "react";
40635
+ import { useEffect as useEffect20, useMemo as useMemo16 } from "react";
40628
40636
 
40629
40637
  // src/reference-objects/create-reference-object.ts
40630
40638
  import * as THREE23 from "three";
@@ -41010,7 +41018,7 @@ var ReferenceObject = ({
41010
41018
  boardCenter
41011
41019
  }) => {
41012
41020
  const { scene } = useThree();
41013
- const object = useMemo17(() => {
41021
+ const object = useMemo16(() => {
41014
41022
  const nextObject = createReferenceObject(type);
41015
41023
  const position = getReferenceObjectPosition(
41016
41024
  type,
@@ -41062,7 +41070,7 @@ var CadViewerContainer = forwardRef2(
41062
41070
  onUserInteraction,
41063
41071
  onCameraControllerReady
41064
41072
  }, ref) => {
41065
- const [isInteractionEnabled, setIsInteractionEnabled] = useState12(
41073
+ const [isInteractionEnabled, setIsInteractionEnabled] = useState13(
41066
41074
  !clickToInteractEnabled
41067
41075
  );
41068
41076
  const { mainCameraRef, handleControlsChange, controller } = useCameraController();
@@ -41076,17 +41084,17 @@ var CadViewerContainer = forwardRef2(
41076
41084
  onCameraControllerReady(controller);
41077
41085
  }
41078
41086
  }, [controller, onCameraControllerReady]);
41079
- const comparisonBounds = useMemo18(() => {
41087
+ const comparisonBounds = useMemo17(() => {
41080
41088
  if (!referenceObject) return void 0;
41081
41089
  return getComparisonBounds(referenceObject, boardDimensions, boardCenter);
41082
41090
  }, [referenceObject, boardDimensions, boardCenter]);
41083
- const gridSectionSize = useMemo18(() => {
41091
+ const gridSectionSize = useMemo17(() => {
41084
41092
  if (!boardDimensions) return 10;
41085
41093
  const width10 = boardDimensions.width ?? 0;
41086
41094
  const height10 = boardDimensions.height ?? 0;
41087
41095
  return Math.max(Math.max(width10, height10) * 1.5, 10);
41088
41096
  }, [boardDimensions]);
41089
- const orbitTarget = useMemo18(() => {
41097
+ const orbitTarget = useMemo17(() => {
41090
41098
  if (comparisonBounds) {
41091
41099
  return [
41092
41100
  (comparisonBounds.minX + comparisonBounds.maxX) / 2,
@@ -41221,11 +41229,11 @@ var CadViewerContainer = forwardRef2(
41221
41229
  );
41222
41230
 
41223
41231
  // src/hooks/use-stls-from-geom.ts
41224
- import { useState as useState13, useEffect as useEffect22 } from "react";
41232
+ import { useState as useState14, useEffect as useEffect22 } from "react";
41225
41233
  import stlSerializer from "@jscad/stl-serializer";
41226
41234
  var useStlsFromGeom = (geom) => {
41227
- const [stls, setStls] = useState13([]);
41228
- const [loading, setLoading] = useState13(true);
41235
+ const [stls, setStls] = useState14([]);
41236
+ const [loading, setLoading] = useState14(true);
41229
41237
  useEffect22(() => {
41230
41238
  if (!geom) return;
41231
41239
  const generateStls = async () => {
@@ -41255,7 +41263,7 @@ var useStlsFromGeom = (geom) => {
41255
41263
  };
41256
41264
 
41257
41265
  // src/hooks/useBoardGeomBuilder.ts
41258
- import { useState as useState14, useEffect as useEffect23, useRef as useRef8 } from "react";
41266
+ import { useState as useState15, useEffect as useEffect23, useRef as useRef8 } from "react";
41259
41267
 
41260
41268
  // src/soup-to-3d/index.ts
41261
41269
  var import_colors = __toESM(require_colors(), 1);
@@ -42697,7 +42705,7 @@ var BoardGeomBuilder = class {
42697
42705
 
42698
42706
  // src/hooks/useBoardGeomBuilder.ts
42699
42707
  var useBoardGeomBuilder = (circuitJson) => {
42700
- const [boardGeom, setBoardGeom] = useState14(null);
42708
+ const [boardGeom, setBoardGeom] = useState15(null);
42701
42709
  const isProcessingRef = useRef8(false);
42702
42710
  useEffect23(() => {
42703
42711
  let isCancelled = false;
@@ -42745,10 +42753,10 @@ var useBoardGeomBuilder = (circuitJson) => {
42745
42753
  };
42746
42754
 
42747
42755
  // src/three-components/Error3d.tsx
42748
- import { useState as useState15, useCallback as useCallback8, useEffect as useEffect25, useMemo as useMemo20 } from "react";
42756
+ import { useState as useState16, useCallback as useCallback8, useEffect as useEffect25, useMemo as useMemo19 } from "react";
42749
42757
 
42750
42758
  // src/react-three/Text.tsx
42751
- import { useEffect as useEffect24, useMemo as useMemo19 } from "react";
42759
+ import { useEffect as useEffect24, useMemo as useMemo18 } from "react";
42752
42760
  import { Text as TroikaText2 } from "troika-three-text";
42753
42761
  var Text = ({
42754
42762
  children,
@@ -42763,7 +42771,7 @@ var Text = ({
42763
42771
  depthOffset
42764
42772
  }) => {
42765
42773
  const { rootObject } = useThree();
42766
- const mesh = useMemo19(() => {
42774
+ const mesh = useMemo18(() => {
42767
42775
  const textMesh = new TroikaText2();
42768
42776
  textMesh.text = children;
42769
42777
  if (position) textMesh.position.fromArray(position);
@@ -42808,8 +42816,8 @@ var Error3d = ({
42808
42816
  cad_component
42809
42817
  }) => {
42810
42818
  const { rootObject } = useThree();
42811
- const [isHovered, setIsHovered] = useState15(false);
42812
- const [hoverPosition, setHoverPosition] = useState15(null);
42819
+ const [isHovered, setIsHovered] = useState16(false);
42820
+ const [hoverPosition, setHoverPosition] = useState16(null);
42813
42821
  const handleHover = useCallback8((e) => {
42814
42822
  if (e?.mousePosition) {
42815
42823
  setIsHovered(true);
@@ -42823,7 +42831,7 @@ var Error3d = ({
42823
42831
  setIsHovered(false);
42824
42832
  setHoverPosition(null);
42825
42833
  }, []);
42826
- const position = useMemo20(() => {
42834
+ const position = useMemo19(() => {
42827
42835
  if (cad_component?.position) {
42828
42836
  const p = [
42829
42837
  cad_component.position.x,
@@ -42834,7 +42842,7 @@ var Error3d = ({
42834
42842
  }
42835
42843
  return [0, 0, 0];
42836
42844
  }, [cad_component]);
42837
- const group = useMemo20(() => {
42845
+ const group = useMemo19(() => {
42838
42846
  const g = new THREE28.Group();
42839
42847
  g.position.fromArray(position);
42840
42848
  return g;
@@ -42896,7 +42904,7 @@ var Error3d = ({
42896
42904
  ] });
42897
42905
  };
42898
42906
  var ErrorBox = ({ parent }) => {
42899
- const mesh = useMemo20(() => {
42907
+ const mesh = useMemo19(() => {
42900
42908
  const m = new THREE28.Mesh(
42901
42909
  new THREE28.BoxGeometry(0.5, 0.5, 0.5),
42902
42910
  new THREE28.MeshStandardMaterial({
@@ -45032,6 +45040,46 @@ function createTextureMeshes(textures, boardData, pcbThickness, isFaux = false)
45032
45040
  // src/three-components/JscadBoardTextures.tsx
45033
45041
  import * as THREE44 from "three";
45034
45042
 
45043
+ // src/hooks/useBoardTextureVisibility.ts
45044
+ import { useMemo as useMemo20 } from "react";
45045
+ var useBoardTextureVisibility = (visibility) => {
45046
+ const {
45047
+ boardBody,
45048
+ topCopper,
45049
+ bottomCopper,
45050
+ topSilkscreen,
45051
+ bottomSilkscreen,
45052
+ topMask,
45053
+ bottomMask,
45054
+ keepout,
45055
+ pcbNotes
45056
+ } = visibility;
45057
+ return useMemo20(
45058
+ () => ({
45059
+ boardBody,
45060
+ topCopper,
45061
+ bottomCopper,
45062
+ topSilkscreen,
45063
+ bottomSilkscreen,
45064
+ topMask,
45065
+ bottomMask,
45066
+ keepout,
45067
+ pcbNotes
45068
+ }),
45069
+ [
45070
+ boardBody,
45071
+ topCopper,
45072
+ bottomCopper,
45073
+ topSilkscreen,
45074
+ bottomSilkscreen,
45075
+ topMask,
45076
+ bottomMask,
45077
+ keepout,
45078
+ pcbNotes
45079
+ ]
45080
+ );
45081
+ };
45082
+
45035
45083
  // src/utils/layer-texture-resolution.ts
45036
45084
  var DEFAULT_MAX_TEXTURE_PIXELS = 4e6;
45037
45085
  var DEFAULT_MAX_TEXTURE_DIMENSION = 4096;
@@ -45067,6 +45115,7 @@ function JscadBoardTextures({
45067
45115
  }) {
45068
45116
  const { rootObject } = useThree();
45069
45117
  const { visibility } = useLayerVisibility();
45118
+ const textureVisibility = useBoardTextureVisibility(visibility);
45070
45119
  const boardData = useMemo21(() => {
45071
45120
  const panels = circuitJson.filter(
45072
45121
  (e) => e.type === "pcb_panel"
@@ -45104,9 +45153,9 @@ function JscadBoardTextures({
45104
45153
  circuitJson,
45105
45154
  boardData,
45106
45155
  traceTextureResolution,
45107
- visibility
45156
+ visibility: textureVisibility
45108
45157
  });
45109
- }, [circuitJson, boardData, traceTextureResolution, visibility]);
45158
+ }, [circuitJson, boardData, traceTextureResolution, textureVisibility]);
45110
45159
  useEffect26(() => {
45111
45160
  if (!rootObject || !boardData || !textures) return;
45112
45161
  const meshes = [];
@@ -45245,7 +45294,7 @@ function JscadBoardTextures({
45245
45294
  }
45246
45295
 
45247
45296
  // src/three-components/STLModel.tsx
45248
- import { useState as useState16, useEffect as useEffect27, useMemo as useMemo22 } from "react";
45297
+ import { useState as useState17, useEffect as useEffect27, useMemo as useMemo22 } from "react";
45249
45298
  import * as THREE45 from "three";
45250
45299
  import { STLLoader } from "three-stdlib";
45251
45300
  function STLModel({
@@ -45257,7 +45306,7 @@ function STLModel({
45257
45306
  layerType
45258
45307
  }) {
45259
45308
  const { rootObject } = useThree();
45260
- const [geom, setGeom] = useState16(null);
45309
+ const [geom, setGeom] = useState17(null);
45261
45310
  useEffect27(() => {
45262
45311
  const loader = new STLLoader();
45263
45312
  if (stlData) {
@@ -46703,12 +46752,12 @@ function createFlexMeshes(geometryMeshes, textureMeshes, json, foldPcbs) {
46703
46752
 
46704
46753
  // src/CadViewerManifold.tsx
46705
46754
  import { su as su17 } from "@tscircuit/circuit-json-util";
46706
- import { useEffect as useEffect29, useMemo as useMemo25, useState as useState18 } from "react";
46755
+ import { useEffect as useEffect29, useMemo as useMemo25, useState as useState19 } from "react";
46707
46756
  import * as THREE53 from "three";
46708
46757
 
46709
46758
  // src/hooks/useManifoldBoardBuilder.ts
46710
46759
  import { su as su16 } from "@tscircuit/circuit-json-util";
46711
- import { useEffect as useEffect28, useMemo as useMemo24, useRef as useRef9, useState as useState17 } from "react";
46760
+ import { useEffect as useEffect28, useMemo as useMemo24, useRef as useRef9, useState as useState18 } from "react";
46712
46761
  import * as THREE50 from "three";
46713
46762
 
46714
46763
  // src/utils/manifold/create-manifold-board.ts
@@ -47823,10 +47872,11 @@ function processViasForManifold(Manifold, circuitJson, pcbThickness, manifoldIns
47823
47872
 
47824
47873
  // src/hooks/useManifoldBoardBuilder.ts
47825
47874
  var useManifoldBoardBuilder = (manifoldJSModule, circuitJson, visibility) => {
47826
- const [geoms, setGeoms] = useState17(null);
47827
- const [pcbThickness, setPcbThickness] = useState17(null);
47828
- const [error, setError] = useState17(null);
47829
- const [isLoading, setIsLoading] = useState17(true);
47875
+ const textureVisibility = useBoardTextureVisibility(visibility);
47876
+ const [geoms, setGeoms] = useState18(null);
47877
+ const [pcbThickness, setPcbThickness] = useState18(null);
47878
+ const [error, setError] = useState18(null);
47879
+ const [isLoading, setIsLoading] = useState18(true);
47830
47880
  const manifoldInstancesForCleanup = useRef9([]);
47831
47881
  const boardData = useMemo24(() => {
47832
47882
  const panels = circuitJson.filter(
@@ -48046,9 +48096,9 @@ var useManifoldBoardBuilder = (manifoldJSModule, circuitJson, visibility) => {
48046
48096
  circuitJson,
48047
48097
  boardData,
48048
48098
  traceTextureResolution,
48049
- visibility
48099
+ visibility: textureVisibility
48050
48100
  });
48051
- }, [circuitJson, boardData, traceTextureResolution, visibility]);
48101
+ }, [circuitJson, boardData, traceTextureResolution, textureVisibility]);
48052
48102
  return {
48053
48103
  geoms,
48054
48104
  textures,
@@ -48238,8 +48288,8 @@ var CadViewerManifold = ({
48238
48288
  const rawCircuitJson = circuitJsonProp ?? childrenCircuitJson;
48239
48289
  return addFauxBoardIfNeeded(rawCircuitJson);
48240
48290
  }, [circuitJsonProp, childrenCircuitJson]);
48241
- const [manifoldJSModule, setManifoldJSModule] = useState18(null);
48242
- const [manifoldLoadingError, setManifoldLoadingError] = useState18(null);
48291
+ const [manifoldJSModule, setManifoldJSModule] = useState19(null);
48292
+ const [manifoldLoadingError, setManifoldLoadingError] = useState19(null);
48243
48293
  const { visibility } = useLayerVisibility();
48244
48294
  useEffect29(() => {
48245
48295
  if (window.ManifoldModule && typeof window.ManifoldModule === "object" && window.ManifoldModule.setup) {
@@ -53044,9 +53094,9 @@ function assignRef(ref, value) {
53044
53094
  }
53045
53095
 
53046
53096
  // node_modules/use-callback-ref/dist/es2015/useRef.js
53047
- import { useState as useState31 } from "react";
53097
+ import { useState as useState32 } from "react";
53048
53098
  function useCallbackRef2(initialValue, callback) {
53049
- var ref = useState31(function() {
53099
+ var ref = useState32(function() {
53050
53100
  return {
53051
53101
  // value
53052
53102
  value: initialValue,
@@ -54657,11 +54707,11 @@ var SubTrigger2 = DropdownMenuSubTrigger;
54657
54707
  var SubContent2 = DropdownMenuSubContent;
54658
54708
 
54659
54709
  // src/components/ViewportSubContent.tsx
54660
- import { useLayoutEffect as useLayoutEffect5, useState as useState35 } from "react";
54710
+ import { useLayoutEffect as useLayoutEffect5, useState as useState36 } from "react";
54661
54711
  import { jsx as jsx33 } from "react/jsx-runtime";
54662
54712
  var ViewportSubContent = (props) => {
54663
- const [content, setContent] = useState35(null);
54664
- const [overlapWidth, setOverlapWidth] = useState35();
54713
+ const [content, setContent] = useState36(null);
54714
+ const [overlapWidth, setOverlapWidth] = useState36();
54665
54715
  useLayoutEffect5(() => {
54666
54716
  if (!content) return;
54667
54717
  const trigger = document.getElementById(
@@ -54716,10 +54766,10 @@ var menuViewportStyles = {
54716
54766
  };
54717
54767
 
54718
54768
  // src/components/ContextMenu.tsx
54719
- import { useState as useState37 } from "react";
54769
+ import { useState as useState38 } from "react";
54720
54770
 
54721
54771
  // src/components/AppearanceMenu.tsx
54722
- import { useState as useState36 } from "react";
54772
+ import { useState as useState37 } from "react";
54723
54773
 
54724
54774
  // src/components/Icons.tsx
54725
54775
  import { jsx as jsx34 } from "react/jsx-runtime";
@@ -54846,8 +54896,8 @@ var AppearanceMenu = () => {
54846
54896
  lightingEnabled,
54847
54897
  setLightingEnabled
54848
54898
  } = useAppearance();
54849
- const [appearanceSubOpen, setAppearanceSubOpen] = useState36(false);
54850
- const [hoveredItem, setHoveredItem] = useState36(null);
54899
+ const [appearanceSubOpen, setAppearanceSubOpen] = useState37(false);
54900
+ const [hoveredItem, setHoveredItem] = useState37(null);
54851
54901
  return /* @__PURE__ */ jsxs7(Fragment10, { children: [
54852
54902
  /* @__PURE__ */ jsx35(Separator2, { style: separatorStyles }),
54853
54903
  /* @__PURE__ */ jsxs7(Sub2, { onOpenChange: setAppearanceSubOpen, children: [
@@ -55296,9 +55346,9 @@ var ContextMenu = ({
55296
55346
  }) => {
55297
55347
  const { cameraType, setCameraType } = useCameraController();
55298
55348
  const { gridEnabled, setGridEnabled } = useAppearance();
55299
- const [cameraSubOpen, setCameraSubOpen] = useState37(false);
55300
- const [referenceObjectSubOpen, setReferenceObjectSubOpen] = useState37(false);
55301
- const [hoveredItem, setHoveredItem] = useState37(null);
55349
+ const [cameraSubOpen, setCameraSubOpen] = useState38(false);
55350
+ const [referenceObjectSubOpen, setReferenceObjectSubOpen] = useState38(false);
55351
+ const [hoveredItem, setHoveredItem] = useState38(null);
55302
55352
  return /* @__PURE__ */ jsx36(
55303
55353
  "div",
55304
55354
  {
@@ -55706,10 +55756,10 @@ var ContextMenu = ({
55706
55756
  };
55707
55757
 
55708
55758
  // src/components/KeyboardShortcutsDialog.tsx
55709
- import { useEffect as useEffect48, useMemo as useMemo33, useRef as useRef27, useState as useState39 } from "react";
55759
+ import { useEffect as useEffect48, useMemo as useMemo33, useRef as useRef27, useState as useState40 } from "react";
55710
55760
 
55711
55761
  // src/hooks/useRegisteredHotkey.ts
55712
- import { useEffect as useEffect47, useMemo as useMemo32, useRef as useRef26, useState as useState38 } from "react";
55762
+ import { useEffect as useEffect47, useMemo as useMemo32, useRef as useRef26, useState as useState39 } from "react";
55713
55763
  var hotkeyRegistry = /* @__PURE__ */ new Map();
55714
55764
  var subscribers = /* @__PURE__ */ new Set();
55715
55765
  var isListenerAttached = false;
@@ -55853,7 +55903,7 @@ var useRegisteredHotkey = (id, handler, metadata) => {
55853
55903
  }, [id, normalizedMetadata]);
55854
55904
  };
55855
55905
  var useHotkeyRegistry = () => {
55856
- const [entries, setEntries] = useState38(
55906
+ const [entries, setEntries] = useState39(
55857
55907
  () => Array.from(hotkeyRegistry.values())
55858
55908
  );
55859
55909
  useEffect47(() => subscribeToRegistry(setEntries), []);
@@ -55870,7 +55920,7 @@ var KeyboardShortcutsDialog = ({
55870
55920
  open,
55871
55921
  onClose
55872
55922
  }) => {
55873
- const [query, setQuery] = useState39("");
55923
+ const [query, setQuery] = useState40("");
55874
55924
  const inputRef = useRef27(null);
55875
55925
  const hotkeys = useHotkeyRegistry();
55876
55926
  useEffect48(() => {
@@ -56113,10 +56163,10 @@ function useCameraPreset({
56113
56163
  }
56114
56164
 
56115
56165
  // src/hooks/useContextMenu.ts
56116
- import { useState as useState40, useCallback as useCallback22, useRef as useRef28, useEffect as useEffect49 } from "react";
56166
+ import { useState as useState41, useCallback as useCallback22, useRef as useRef28, useEffect as useEffect49 } from "react";
56117
56167
  var useContextMenu = ({ containerRef, onOpen }) => {
56118
- const [menuVisible, setMenuVisible] = useState40(false);
56119
- const [menuPos, setMenuPos] = useState40({
56168
+ const [menuVisible, setMenuVisible] = useState41(false);
56169
+ const [menuPos, setMenuPos] = useState41({
56120
56170
  x: 0,
56121
56171
  y: 0
56122
56172
  });
@@ -56308,7 +56358,7 @@ var CadViewerInner = (props) => {
56308
56358
  const circuitJson = props.circuitJson ?? childrenCircuitJson;
56309
56359
  const hasBends = circuitJson.some((element) => element.type === "pcb_bend");
56310
56360
  const hasFlexGeometry = hasBends || circuitJson.some((element) => element.type === "pcb_stiffener");
56311
- const [foldPcbsOverride, setFoldPcbs] = useState41(
56361
+ const [foldPcbsOverride, setFoldPcbs] = useState42(
56312
56362
  void 0
56313
56363
  );
56314
56364
  const foldPcbs = foldPcbsOverride ?? props.foldPcbs;
@@ -56321,30 +56371,30 @@ var CadViewerInner = (props) => {
56321
56371
  children: void 0,
56322
56372
  hiddenCadComponentIds
56323
56373
  };
56324
- const [engine, setEngine] = useState41(() => {
56374
+ const [engine, setEngine] = useState42(() => {
56325
56375
  const stored = window.localStorage.getItem("cadViewerEngine");
56326
56376
  return stored === "jscad" || stored === "manifold" ? stored : "manifold";
56327
56377
  });
56328
56378
  const containerRef = useRef29(null);
56329
- const [isKeyboardShortcutsDialogOpen, setIsKeyboardShortcutsDialogOpen] = useState41(false);
56330
- const [autoRotate, setAutoRotate] = useState41(() => {
56379
+ const [isKeyboardShortcutsDialogOpen, setIsKeyboardShortcutsDialogOpen] = useState42(false);
56380
+ const [autoRotate, setAutoRotate] = useState42(() => {
56331
56381
  const stored = window.localStorage.getItem("cadViewerAutoRotate");
56332
56382
  return stored !== "false";
56333
56383
  });
56334
- const [autoRotateUserToggled, setAutoRotateUserToggled] = useState41(() => {
56384
+ const [autoRotateUserToggled, setAutoRotateUserToggled] = useState42(() => {
56335
56385
  const stored = window.localStorage.getItem("cadViewerAutoRotateUserToggled");
56336
56386
  return stored === "true";
56337
56387
  });
56338
- const [cameraPreset, setCameraPreset] = useState41("Custom");
56339
- const [referenceObject, setReferenceObject] = useState41(null);
56388
+ const [cameraPreset, setCameraPreset] = useState42("Custom");
56389
+ const [referenceObject, setReferenceObject] = useState42(null);
56340
56390
  const { cameraType } = useCameraController();
56341
56391
  const { visibility, setLayerVisibility } = useLayerVisibility();
56342
56392
  const { showToast } = useToast();
56343
56393
  const cameraControllerRef = useRef29(null);
56344
56394
  const externalCameraControllerReady = props.onCameraControllerReady;
56345
56395
  const sceneRef = useContext10(SchematicNavigationContext);
56346
- const [selectedComponent, setSelectedComponent] = useState41();
56347
- const [selectedCadComponent, setSelectedCadComponent] = useState41();
56396
+ const [selectedComponent, setSelectedComponent] = useState42();
56397
+ const [selectedCadComponent, setSelectedCadComponent] = useState42();
56348
56398
  const handleMenuOpen = useCallback24(
56349
56399
  (position) => {
56350
56400
  setSelectedCadComponent(
@@ -56906,7 +56956,7 @@ async function convertCircuitJsonTo3dSvg(circuitJson, options = {}) {
56906
56956
 
56907
56957
  // src/hooks/exporter/gltf.ts
56908
56958
  import { GLTFExporter as GLTFExporter3 } from "three-stdlib";
56909
- import { useEffect as useEffect51, useState as useState42, useMemo as useMemo34, useCallback as useCallback25 } from "react";
56959
+ import { useEffect as useEffect51, useState as useState43, useMemo as useMemo34, useCallback as useCallback25 } from "react";
56910
56960
  function useSaveGltfAs(options = {}) {
56911
56961
  const parse2 = useParser(options);
56912
56962
  const link = useMemo34(() => document.createElement("a"), []);
@@ -56934,8 +56984,8 @@ function useSaveGltfAs(options = {}) {
56934
56984
  }
56935
56985
  function useExportGltfUrl(options = {}) {
56936
56986
  const parse2 = useParser(options);
56937
- const [url, setUrl] = useState42();
56938
- const [error, setError] = useState42();
56987
+ const [url, setUrl] = useState43();
56988
+ const [error, setError] = useState43();
56939
56989
  const ref = useCallback25(
56940
56990
  (instance) => parse2(instance).then(setUrl).catch(setError),
56941
56991
  []
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tscircuit/3d-viewer",
3
- "version": "0.0.610",
3
+ "version": "0.0.611",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/tscircuit/3d-viewer"