forgecad 0.9.5 → 0.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/assets/{AdminPage-uTtcSXtn.js → AdminPage-Da6hhpJx.js} +1 -1
  2. package/dist/assets/{BlogPage-DYJMjWx3.js → BlogPage-Bl_sKeWb.js} +1 -1
  3. package/dist/assets/{DocsPage-C58f0K5v.js → DocsPage-Blz3Tp4j.js} +1 -1
  4. package/dist/assets/{EditorApp-DNH1TEz1.js → EditorApp-CuiPbtn5.js} +32 -7
  5. package/dist/assets/{EmbedViewer-CMXWA2LX.js → EmbedViewer-BFG6-Ufm.js} +2 -2
  6. package/dist/assets/{LandingPageProofDriven-CAu2OZFn.js → LandingPageProofDriven-DB9fQd5P.js} +1 -1
  7. package/dist/assets/{PricingPage-BIgW7m3X.js → PricingPage-BMxYT_F0.js} +1 -1
  8. package/dist/assets/{SettingsPage-N1l1tMXO.js → SettingsPage-VVQNrCAg.js} +1 -1
  9. package/dist/assets/{app-CFy7g5WP.js → app-Dl9ymBWC.js} +293 -36
  10. package/dist/assets/cli/{render-BrVVdj_T.js → render-CFtwKCCY.js} +10 -1081
  11. package/dist/assets/{sectionPlaneMath-CykEnkvQ.js → distance-BEC2RjJi.js} +1897 -288
  12. package/dist/assets/{evalWorker-c_SB9gg3.js → evalWorker-CRvbzTXm.js} +555 -83
  13. package/dist/assets/{manifold-Cjk7WhRs.js → manifold-B9QSr-qP.js} +1 -1
  14. package/dist/assets/{manifold-Dp6pvFr6.js → manifold-DpBXFS2K.js} +1 -1
  15. package/dist/assets/{manifold-CRoBhJKH.js → manifold-DzZ4VRPs.js} +2 -2
  16. package/dist/assets/{renderSceneState-3DfsSASX.js → renderSceneState-BuAXF2jh.js} +1 -1
  17. package/dist/assets/{reportWorker-BLkuIoS8.js → reportWorker-BNWEnRg1.js} +555 -83
  18. package/dist/cli/render.html +1 -1
  19. package/dist/docs/index.html +1 -1
  20. package/dist/docs-raw/beta-operations.md +4 -0
  21. package/dist/docs-raw/deployment.md +38 -23
  22. package/dist/docs-raw/generated/concepts.md +82 -5
  23. package/dist/docs-raw/generated/curves.md +97 -5
  24. package/dist/docs-raw/generated/sketch.md +9 -1
  25. package/dist/docs-raw/guides/inspection-bundles.md +9 -3
  26. package/dist/docs-raw/runbook.md +3 -3
  27. package/dist/index.html +1 -1
  28. package/dist/sitemap.xml +6 -6
  29. package/dist-cli/forgecad.js +828 -297
  30. package/dist-cli/forgecad.js.map +1 -1
  31. package/dist-skill/CONTEXT.md +115 -9
  32. package/dist-skill/docs/generated/curves.md +97 -5
  33. package/dist-skill/docs/generated/sketch.md +9 -1
  34. package/dist-skill/docs/guides/inspection-bundles.md +9 -3
  35. package/dist-skill/docs-dev/generated/curves.md +97 -5
  36. package/dist-skill/docs-dev/generated/sketch.md +9 -1
  37. package/dist-skill/docs-dev/guides/inspection-bundles.md +9 -3
  38. package/examples/api/guided-loft-olive-oil-bottle.forge.js +135 -0
  39. package/package.json +20 -2
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "./vendor-react-Da3A2QmU.js";
2
- import { bG as initKernel, bH as initSolverWasm } from "./sectionPlaneMath-CykEnkvQ.js";
3
- import { g as useForgeStore, ag as getExternalUrl, ah as getGistId, q as fetchUrlModel, p as fetchGistModel, l as buildShareUrl, B as BrandMark, ai as Viewport } from "./app-CFy7g5WP.js";
2
+ import { bL as initKernel, bM as initSolverWasm } from "./distance-BEC2RjJi.js";
3
+ import { g as useForgeStore, ag as getExternalUrl, ah as getGistId, q as fetchUrlModel, p as fetchGistModel, l as buildShareUrl, B as BrandMark, ai as Viewport } from "./app-Dl9ymBWC.js";
4
4
  function EmbedViewer() {
5
5
  const kernelReady = useForgeStore((s) => s.kernelReady);
6
6
  const setKernelReady = useForgeStore((s) => s.setKernelReady);
@@ -1,5 +1,5 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports, L as Link } from "./vendor-react-Da3A2QmU.js";
2
- import { B as BrandMark } from "./app-CFy7g5WP.js";
2
+ import { B as BrandMark } from "./app-Dl9ymBWC.js";
3
3
  /* empty css */
4
4
  const LINKS = {
5
5
  glasses: {
@@ -1,5 +1,5 @@
1
1
  import { f as useNavigate, r as reactExports, j as jsxRuntimeExports, L as Link } from "./vendor-react-Da3A2QmU.js";
2
- import { u as useAuthStore, b as authFetch, B as BrandMark } from "./app-CFy7g5WP.js";
2
+ import { u as useAuthStore, b as authFetch, B as BrandMark } from "./app-Dl9ymBWC.js";
3
3
  import { C as COMMERCIAL_USE_CASES } from "./copy-CQKQppF-.js";
4
4
  /* empty css */
5
5
  function checkoutIntentPath(interval) {
@@ -1,5 +1,5 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports, L as Link } from "./vendor-react-Da3A2QmU.js";
2
- import { u as useAuthStore, b as authFetch, s as storageUsagePercent, f as formatStorageBytes } from "./app-CFy7g5WP.js";
2
+ import { u as useAuthStore, b as authFetch, s as storageUsagePercent, f as formatStorageBytes } from "./app-Dl9ymBWC.js";
3
3
  import { P as PRO_STORAGE_UPGRADE_COPY } from "./copy-CQKQppF-.js";
4
4
  function timeAgo(dateStr) {
5
5
  const ms = Date.now() - new Date(dateStr).getTime();
@@ -4,7 +4,7 @@ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { en
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  var _a2;
6
6
  import { c as create, r as reactExports, j as jsxRuntimeExports, a as createWithEqualityFn, R as React, T as Tb, s as schedulerExports, b as clientExports, d as reactDomExports, u as useParams, e as useSearchParams, f as useNavigate, L as Link, B as BrowserRouter, g as Routes, h as Route, N as Navigate } from "./vendor-react-Da3A2QmU.js";
7
- import { _ as __vitePreload, z as zipSync, s as strToU8, W as WebGLRenderer, R as Raycaster, O as OrthographicCamera$1, P as PerspectiveCamera$1, S as Scene, a as PCFSoftShadowMap, V as VSMShadowMap, b as PCFShadowMap, B as BasicShadowMap, C as ColorManagement, L as LinearSRGBColorSpace, c as SRGBColorSpace, N as NoToneMapping, A as ACESFilmicToneMapping, d as Layers, e as Color, f as RGBAFormat, U as UnsignedByteType, g as Vector3, h as Vector2, i as Clock, T as THREE, D as DoubleSide, j as REVISION, M as Mesh, I as IcosahedronGeometry, k as ShaderMaterial, l as Spherical, Q as Quaternion, m as MOUSE, n as TOUCH, o as Ray, p as Plane, q as DataTextureLoader, H as HalfFloatType, F as FloatType, r as DataUtils, t as LinearFilter, u as RedFormat, v as InstancedBufferGeometry, w as Float32BufferAttribute, x as InstancedInterleavedBuffer, y as InterleavedBufferAttribute, E as WireframeGeometry, G as Box3, J as Sphere, K as UniformsUtils, X as UniformsLib, Y as Vector4, Z as Line3, $ as Matrix4, a0 as MathUtils, a1 as Uniform, a2 as WebGLRenderTarget, a3 as DepthTexture, a4 as BackSide, a5 as ClampToEdgeWrapping, a6 as PlaneGeometry, a7 as UVMapping, a8 as DataTexture, a9 as Texture, aa as MeshBasicMaterial, ab as IntType, ac as ShortType, ad as ByteType, ae as UnsignedIntType, af as Loader, ag as LoadingManager, ah as LinearMipMapLinearFilter, ai as FileLoader, aj as NoBlending, ak as CubeReflectionMapping, al as EquirectangularReflectionMapping, am as CubeTextureLoader, an as WebGLCubeRenderTarget, ao as ConstraintSketch, ap as setSketchPlacement3D, aq as Sketch, ar as PROFILE_BACKEND_MARKER, as as FrozenShape, at as setShapeCompilePlan, au as hasAnyPorts, av as setShapePortsInternal, aw as markShapePortsUsed, ax as setParamOverrides, ay as DEFAULT_ACTIVE_BACKEND, az as isConstraintSketch, aA as updateConstraintValue, aB as getShapeCompilePlan, aC as resolveForgeRenderStyle, aD as publishSolverWasmRunDebug, aE as resolveForgeQualityPreset, aF as resolveImportPath, aG as BufferGeometry, aH as LineBasicMaterial, aI as Line$1, aJ as LineDashedMaterial, aK as DepthStencilFormat, aL as UnsignedInt248Type, aM as MeshNormalMaterial, aN as NearestFilter, aO as BasicDepthPacking, aP as EventDispatcher$1, aQ as NoColorSpace, aR as FrontSide, aS as Material, aT as AlwaysDepth, aU as BufferAttribute, aV as CanvasTexture, aW as Object3D, aX as FogExp2, aY as Fog, aZ as AmbientLight, a_ as HemisphereLight, a$ as SpotLight, b0 as PointLight, b1 as DirectionalLight, b2 as buildShapeFromCompilePlan, b3 as shapeToGeometry, b4 as sketchToSvg, b5 as sketchToDxf, b6 as runScript, b7 as MeshPhysicalMaterial, b8 as LineSegments, b9 as getRenderStylePreset, ba as AdditiveBlending, bb as CatmullRomCurve3, bc as TubeGeometry, bd as MeshStandardMaterial, be as compileSdfNode3, bf as buildSdfRaymarchFragmentShader, bg as SDF_RAYMARCH_PROXY_VERTEX_SHADER, bh as Shape, bi as ShapeGeometry, bj as ShaderLib, bk as CylinderGeometry, bl as parseViewportCameraState, bm as createResolvedExplodeConfig, bn as explodeBoundsCenter, bo as explodeMergeBounds, bp as resolveExplodeDirective, bq as computeExplodeMotion, br as getSketchWorldMatrix, bs as explodeAdd, bt as hasExplodeOverride, bu as resolveExplodeLocalFanDirection, bv as explodeMul, bw as explodeLeafFanStage, bx as normalizeCutPlane, by as toClippingPlane, bz as findJointAnimationClip, bA as resolveJointAnimation, bB as resolveJointViewValues, bC as getShapePorts, bD as getShapeUsedPorts, bE as DEFAULT_VIEW_CONFIG, bF as getKernelFaceNameForTriangle, bG as initKernel, bH as initSolverWasm } from "./sectionPlaneMath-CykEnkvQ.js";
7
+ import { _ as __vitePreload, z as zipSync, s as strToU8, W as WebGLRenderer, R as Raycaster, O as OrthographicCamera$1, P as PerspectiveCamera$1, S as Scene, a as PCFSoftShadowMap, V as VSMShadowMap, b as PCFShadowMap, B as BasicShadowMap, C as ColorManagement, L as LinearSRGBColorSpace, c as SRGBColorSpace, N as NoToneMapping, A as ACESFilmicToneMapping, d as Layers, e as Color, f as RGBAFormat, U as UnsignedByteType, g as Vector3, h as Vector2, i as Clock, T as THREE, D as DoubleSide, j as REVISION, M as Mesh, I as IcosahedronGeometry, k as ShaderMaterial, l as Spherical, Q as Quaternion, m as MOUSE, n as TOUCH, o as Ray, p as Plane, q as DataTextureLoader, H as HalfFloatType, F as FloatType, r as DataUtils, t as LinearFilter, u as RedFormat, v as InstancedBufferGeometry, w as Float32BufferAttribute, x as InstancedInterleavedBuffer, y as InterleavedBufferAttribute, E as WireframeGeometry, G as Box3, J as Sphere, K as UniformsUtils, X as UniformsLib, Y as Vector4, Z as Line3, $ as Matrix4, a0 as MathUtils, a1 as Uniform, a2 as WebGLRenderTarget, a3 as DepthTexture, a4 as BackSide, a5 as ClampToEdgeWrapping, a6 as PlaneGeometry, a7 as UVMapping, a8 as DataTexture, a9 as Texture, aa as MeshBasicMaterial, ab as IntType, ac as ShortType, ad as ByteType, ae as UnsignedIntType, af as Loader, ag as LoadingManager, ah as LinearMipMapLinearFilter, ai as FileLoader, aj as NoBlending, ak as CubeReflectionMapping, al as EquirectangularReflectionMapping, am as CubeTextureLoader, an as WebGLCubeRenderTarget, ao as ConstraintSketch, ap as setSketchPlacement3D, aq as Sketch, ar as PROFILE_BACKEND_MARKER, as as FrozenShape, at as setShapeCompilePlan, au as hasAnyPorts, av as setShapePortsInternal, aw as markShapePortsUsed, ax as setParamOverrides, ay as DEFAULT_ACTIVE_BACKEND, az as isConstraintSketch, aA as updateConstraintValue, aB as getShapeCompilePlan, aC as resolveForgeRenderStyle, aD as publishSolverWasmRunDebug, aE as resolveForgeQualityPreset, aF as resolveImportPath, aG as BufferGeometry, aH as LineBasicMaterial, aI as Line$1, aJ as LineDashedMaterial, aK as DepthStencilFormat, aL as UnsignedInt248Type, aM as MeshNormalMaterial, aN as NearestFilter, aO as BasicDepthPacking, aP as EventDispatcher$1, aQ as NoColorSpace, aR as FrontSide, aS as Material, aT as AlwaysDepth, aU as BufferAttribute, aV as CanvasTexture, aW as Object3D, aX as FogExp2, aY as Fog, aZ as AmbientLight, a_ as HemisphereLight, a$ as SpotLight, b0 as PointLight, b1 as DirectionalLight, b2 as analyzeCollisionIntersections, b3 as shapeToGeometry, b4 as buildShapeFromCompilePlan, b5 as sketchToSvg, b6 as sketchToDxf, b7 as runScript, b8 as MeshPhysicalMaterial, b9 as LineSegments, ba as analyzeThicknessGeometry, bb as analyzeRoughnessGeometry, bc as getRenderStylePreset, bd as AdditiveBlending, be as CatmullRomCurve3, bf as TubeGeometry, bg as MeshStandardMaterial, bh as compileSdfNode3, bi as buildSdfRaymarchFragmentShader, bj as SDF_RAYMARCH_PROXY_VERTEX_SHADER, bk as Shape, bl as ShapeGeometry, bm as ShaderLib, bn as CylinderGeometry, bo as parseViewportCameraState, bp as createResolvedExplodeConfig, bq as explodeBoundsCenter, br as explodeMergeBounds, bs as resolveExplodeDirective, bt as computeExplodeMotion, bu as getSketchWorldMatrix, bv as explodeAdd, bw as hasExplodeOverride, bx as resolveExplodeLocalFanDirection, by as explodeMul, bz as explodeLeafFanStage, bA as normalizeCutPlane, bB as toClippingPlane, bC as findJointAnimationClip, bD as resolveJointAnimation, bE as resolveJointViewValues, bF as getShapePorts, bG as getShapeUsedPorts, bH as DEFAULT_VIEW_CONFIG, bI as getKernelFaceNameForTriangle, bJ as analyzePhysicalConnectivity, bK as analyzeDistanceInspection, bL as initKernel, bM as initSolverWasm } from "./distance-BEC2RjJi.js";
8
8
  function getCsrfToken() {
9
9
  const match = document.cookie.match(/(?:^|;\s*)fc-csrf-token=([^;]+)/);
10
10
  return match == null ? void 0 : match[1];
@@ -856,7 +856,7 @@ function toRGB555(colorHex) {
856
856
  if (!rgb) return 0;
857
857
  return 32768 | rgb.r >> 3 << 10 | rgb.g >> 3 << 5 | rgb.b >> 3;
858
858
  }
859
- function rgbToHex(r2, g2, b2) {
859
+ function rgbToHex$1(r2, g2, b2) {
860
860
  const toHex = (v) => v.toString(16).padStart(2, "0").toUpperCase();
861
861
  return `#${toHex(r2)}${toHex(g2)}${toHex(b2)}`;
862
862
  }
@@ -871,7 +871,7 @@ function buildPure3mfBuffer(objects, options = {}) {
871
871
  if (obj.color) {
872
872
  const rgb = parseHexColor(obj.color);
873
873
  if (rgb) {
874
- const hex = rgbToHex(rgb.r, rgb.g, rgb.b);
874
+ const hex = rgbToHex$1(rgb.r, rgb.g, rgb.b);
875
875
  if (!colorMap.has(hex)) {
876
876
  colorMap.set(hex, colors.length);
877
877
  colors.push({ hex, objectIndices: [] });
@@ -908,7 +908,7 @@ function buildPure3mfBuffer(objects, options = {}) {
908
908
  if (obj.color && hasColors) {
909
909
  const rgb = parseHexColor(obj.color);
910
910
  if (rgb) {
911
- const hex = rgbToHex(rgb.r, rgb.g, rgb.b);
911
+ const hex = rgbToHex$1(rgb.r, rgb.g, rgb.b);
912
912
  const colorIdx = colorMap.get(hex);
913
913
  if (colorIdx !== void 0) {
914
914
  pidAttr = ` pid="${colorgroupId}" pindex="${colorIdx}"`;
@@ -15788,7 +15788,7 @@ const CRASH_COOLDOWN_MS = 2e3;
15788
15788
  class EvalWorkerClient {
15789
15789
  constructor(workerFactory = () => new Worker(new URL(
15790
15790
  /* @vite-ignore */
15791
- "/assets/evalWorker-c_SB9gg3.js",
15791
+ "/assets/evalWorker-CRvbzTXm.js",
15792
15792
  import.meta.url
15793
15793
  ), { type: "module" })) {
15794
15794
  __publicField(this, "worker", null);
@@ -17361,6 +17361,18 @@ const initialActive = (() => {
17361
17361
  return fallback;
17362
17362
  })();
17363
17363
  const INITIAL_SAVED = {};
17364
+ const VIEW_INSPECT_CHANNELS = /* @__PURE__ */ new Set([
17365
+ "none",
17366
+ "mask",
17367
+ "connectivity",
17368
+ "distance",
17369
+ "collisions",
17370
+ "thickness",
17371
+ "roughness"
17372
+ ]);
17373
+ function resolveViewInspectChannel(value) {
17374
+ return typeof value === "string" && VIEW_INSPECT_CHANNELS.has(value) ? value : "none";
17375
+ }
17364
17376
  const initialViewPreferences = readViewPreferences();
17365
17377
  const initialPreviewFile = resolvePreviewFile(initialActive, INITIAL_FILES);
17366
17378
  const initialObjectSettingsByFile = (() => {
@@ -18119,6 +18131,12 @@ Switch to LOCAL mode or wait for the server to recover.`,
18119
18131
  writeViewPreferences({ renderMode: mode });
18120
18132
  set({ renderMode: mode });
18121
18133
  },
18134
+ inspectChannel: resolveViewInspectChannel(initialViewPreferences.inspectChannel),
18135
+ setInspectChannel: (channel) => {
18136
+ const next = resolveViewInspectChannel(channel);
18137
+ writeViewPreferences({ inspectChannel: next });
18138
+ set({ inspectChannel: next });
18139
+ },
18122
18140
  projectionMode: initialViewPreferences.projectionMode ?? "perspective",
18123
18141
  setProjectionMode: (mode) => {
18124
18142
  writeViewPreferences({ projectionMode: mode });
@@ -26690,6 +26708,140 @@ function ClippingManager({ active }) {
26690
26708
  }, [gl, active]);
26691
26709
  return null;
26692
26710
  }
26711
+ const COLLISION_SOURCE_OPACITY = 0.22;
26712
+ const COLLISION_SOURCE_COLOR = [180, 200, 220];
26713
+ const COLLISION_HIGHLIGHT_COLOR = [255, 68, 16];
26714
+ const COLLISION_PALETTE = [
26715
+ COLLISION_HIGHLIGHT_COLOR,
26716
+ [0, 204, 255],
26717
+ [255, 214, 0],
26718
+ [66, 220, 120],
26719
+ [255, 76, 196],
26720
+ [142, 106, 255],
26721
+ [255, 145, 48],
26722
+ [86, 232, 202],
26723
+ [210, 245, 60],
26724
+ [255, 120, 120],
26725
+ [80, 150, 255],
26726
+ [190, 110, 60]
26727
+ ];
26728
+ const MASK_PALETTE = [
26729
+ [230, 25, 75],
26730
+ [60, 180, 75],
26731
+ [255, 225, 25],
26732
+ [0, 130, 200],
26733
+ [245, 130, 48],
26734
+ [145, 30, 180],
26735
+ [70, 240, 240],
26736
+ [240, 50, 230],
26737
+ [210, 245, 60],
26738
+ [250, 190, 190],
26739
+ [0, 128, 128],
26740
+ [230, 190, 255],
26741
+ [170, 110, 40],
26742
+ [255, 250, 200],
26743
+ [128, 0, 0],
26744
+ [170, 255, 195],
26745
+ [128, 128, 0],
26746
+ [255, 215, 180],
26747
+ [0, 0, 128],
26748
+ [128, 128, 128]
26749
+ ];
26750
+ const DISTANCE_NEAR_COLOR = [66, 220, 120];
26751
+ const DISTANCE_MID_COLOR = [255, 214, 0];
26752
+ const DISTANCE_FAR_COLOR = [255, 68, 16];
26753
+ const DISTANCE_UNKNOWN_COLOR = [128, 128, 128];
26754
+ function rgbToHex(color2) {
26755
+ return `#${color2.map((value) => value.toString(16).padStart(2, "0")).join("")}`;
26756
+ }
26757
+ function maskRgbForIndex(index) {
26758
+ return MASK_PALETTE[index % MASK_PALETTE.length];
26759
+ }
26760
+ function maskColorForIndex(index) {
26761
+ return rgbToHex(maskRgbForIndex(index));
26762
+ }
26763
+ function collisionColorForIndex(index) {
26764
+ return rgbToHex(COLLISION_PALETTE[(index - 1) % COLLISION_PALETTE.length]);
26765
+ }
26766
+ function lerp$1(a2, b2, t2) {
26767
+ return a2 + (b2 - a2) * Math.max(0, Math.min(1, t2));
26768
+ }
26769
+ function lerpRgb(a2, b2, t2) {
26770
+ return [Math.round(lerp$1(a2[0], b2[0], t2)), Math.round(lerp$1(a2[1], b2[1], t2)), Math.round(lerp$1(a2[2], b2[2], t2))];
26771
+ }
26772
+ function distanceColorForRootDistance(distance, maxDistance) {
26773
+ if (!Number.isFinite(distance)) return rgbToHex(DISTANCE_UNKNOWN_COLOR);
26774
+ if (!Number.isFinite(maxDistance) || maxDistance <= 1e-9) return rgbToHex(DISTANCE_NEAR_COLOR);
26775
+ const t2 = Math.max(0, Math.min(1, distance / maxDistance));
26776
+ if (t2 <= 0.5) return rgbToHex(lerpRgb(DISTANCE_NEAR_COLOR, DISTANCE_MID_COLOR, t2 * 2));
26777
+ return rgbToHex(lerpRgb(DISTANCE_MID_COLOR, DISTANCE_FAR_COLOR, (t2 - 0.5) * 2));
26778
+ }
26779
+ function matrixToCollisionMat4(matrix) {
26780
+ if (!matrix) return void 0;
26781
+ const e2 = matrix.elements;
26782
+ return [e2[0], e2[1], e2[2], e2[3], e2[4], e2[5], e2[6], e2[7], e2[8], e2[9], e2[10], e2[11], e2[12], e2[13], e2[14], e2[15]];
26783
+ }
26784
+ function buildCollisionEntries(objects, objectSettings, objectMatrices) {
26785
+ const entries = [];
26786
+ objects.forEach((obj) => {
26787
+ var _a3;
26788
+ if (!obj.shape) return;
26789
+ if (((_a3 = objectSettings[obj.id]) == null ? void 0 : _a3.visible) === false) return;
26790
+ try {
26791
+ const bb = obj.shape.boundingBox();
26792
+ entries.push({
26793
+ id: obj.id,
26794
+ name: obj.name,
26795
+ shape: obj.shape,
26796
+ min: [bb.min[0], bb.min[1], bb.min[2]],
26797
+ max: [bb.max[0], bb.max[1], bb.max[2]],
26798
+ transform: matrixToCollisionMat4(objectMatrices[obj.id]),
26799
+ groupName: obj.groupName,
26800
+ treePath: obj.treePath,
26801
+ mock: obj.mock
26802
+ });
26803
+ } catch {
26804
+ }
26805
+ });
26806
+ return entries;
26807
+ }
26808
+ function CollisionInspectionOverlay({
26809
+ objects,
26810
+ objectSettings,
26811
+ objectMatrices
26812
+ }) {
26813
+ const collisionGeometries = reactExports.useMemo(() => {
26814
+ const report = analyzeCollisionIntersections(buildCollisionEntries(objects, objectSettings, objectMatrices));
26815
+ return report.collisions.flatMap((collision) => {
26816
+ try {
26817
+ const geometry = shapeToGeometry(collision.shape);
26818
+ return [
26819
+ {
26820
+ id: collision.id,
26821
+ color: collisionColorForIndex(collision.index),
26822
+ solid: geometry.solid,
26823
+ edges: geometry.edges
26824
+ }
26825
+ ];
26826
+ } catch {
26827
+ return [];
26828
+ }
26829
+ });
26830
+ }, [objectMatrices, objectSettings, objects]);
26831
+ reactExports.useEffect(() => {
26832
+ return () => {
26833
+ collisionGeometries.forEach((geometry) => {
26834
+ var _a3;
26835
+ geometry.solid.dispose();
26836
+ (_a3 = geometry.edges) == null ? void 0 : _a3.dispose();
26837
+ });
26838
+ };
26839
+ }, [collisionGeometries]);
26840
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("group", { children: collisionGeometries.map((geometry) => /* @__PURE__ */ jsxRuntimeExports.jsxs("group", { children: [
26841
+ /* @__PURE__ */ jsxRuntimeExports.jsx("mesh", { geometry: geometry.solid, renderOrder: 20, raycast: () => null, children: /* @__PURE__ */ jsxRuntimeExports.jsx("meshBasicMaterial", { color: geometry.color, depthTest: true, depthWrite: true, toneMapped: false }) }),
26842
+ geometry.edges && /* @__PURE__ */ jsxRuntimeExports.jsx("lineSegments", { geometry: geometry.edges, renderOrder: 21, raycast: () => null, children: /* @__PURE__ */ jsxRuntimeExports.jsx("lineBasicMaterial", { color: "#ffffff", transparent: true, opacity: 0.65, depthTest: false, toneMapped: false }) })
26843
+ ] }, geometry.id)) });
26844
+ }
26693
26845
  function ConstructionGhostOverlay({ matrix }) {
26694
26846
  const ghost = useForgeStore((s) => s.constructionGhost);
26695
26847
  const { solidGeo, edgesGeo } = reactExports.useMemo(() => {
@@ -28914,7 +29066,7 @@ function generateReportInWorker(options) {
28914
29066
  return new Promise((resolve2, reject) => {
28915
29067
  const worker = new Worker(new URL(
28916
29068
  /* @vite-ignore */
28917
- "/assets/reportWorker-BLkuIoS8.js",
29069
+ "/assets/reportWorker-BNWEnRg1.js",
28918
29070
  import.meta.url
28919
29071
  ), { type: "module" });
28920
29072
  const cleanup = () => {
@@ -32192,6 +32344,8 @@ function ForgeObject({
32192
32344
  settings,
32193
32345
  renderStyle,
32194
32346
  renderMode,
32347
+ inspectChannel = "none",
32348
+ inspectColor,
32195
32349
  isInteracting,
32196
32350
  matrix,
32197
32351
  isHovered,
@@ -32228,14 +32382,30 @@ function ForgeObject({
32228
32382
  };
32229
32383
  }
32230
32384
  }, [obj.shape]);
32385
+ const inspectionGeo = reactExports.useMemo(() => {
32386
+ if (!solidGeo) return null;
32387
+ try {
32388
+ if (inspectChannel === "thickness") return analyzeThicknessGeometry(solidGeo).geometry;
32389
+ if (inspectChannel === "roughness") return analyzeRoughnessGeometry(solidGeo).geometry;
32390
+ return null;
32391
+ } catch {
32392
+ return null;
32393
+ }
32394
+ }, [inspectChannel, solidGeo]);
32231
32395
  reactExports.useEffect(() => {
32232
32396
  return () => {
32233
32397
  solidGeo == null ? void 0 : solidGeo.dispose();
32234
32398
  edgesGeo == null ? void 0 : edgesGeo.dispose();
32235
32399
  };
32236
32400
  }, [edgesGeo, solidGeo]);
32401
+ reactExports.useEffect(() => {
32402
+ return () => {
32403
+ inspectionGeo == null ? void 0 : inspectionGeo.dispose();
32404
+ };
32405
+ }, [inspectionGeo]);
32237
32406
  if (!solidGeo || !settings.visible) return null;
32238
32407
  const effectiveRenderMode = isInteracting && renderMode === "overlay" ? "solid" : renderMode;
32408
+ const isInspecting = inspectChannel !== "none";
32239
32409
  const renderStylePreset = getRenderStylePreset(renderStyle);
32240
32410
  const materialDefaults = renderStylePreset.material;
32241
32411
  const authoredMaterialOpacity = (_a3 = obj.materialProps) == null ? void 0 : _a3.opacity;
@@ -32247,9 +32417,9 @@ function ForgeObject({
32247
32417
  const materialOpacity = Math.min(meshOpacity, styleOpacity);
32248
32418
  const transmission = authoredMaterialTransmission ?? transparentDefaults.transmission;
32249
32419
  const isTransparent = materialOpacity < 1 || transmission > 0;
32250
- const showSolid = effectiveRenderMode !== "wireframe";
32251
- const showEdges = effectiveRenderMode === "overlay";
32252
- const showWire = effectiveRenderMode === "wireframe";
32420
+ const showSolid = isInspecting || effectiveRenderMode !== "wireframe";
32421
+ const showEdges = !isInspecting && effectiveRenderMode === "overlay";
32422
+ const showWire = !isInspecting && effectiveRenderMode === "wireframe";
32253
32423
  const effectiveClippingPlanes = clippingPlanes ?? [];
32254
32424
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
32255
32425
  "group",
@@ -32263,7 +32433,30 @@ function ForgeObject({
32263
32433
  onDoubleClick,
32264
32434
  onContextMenu,
32265
32435
  children: [
32266
- showSolid && /* @__PURE__ */ jsxRuntimeExports.jsx("mesh", { geometry: solidGeo, userData: { forgeMesh: true }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
32436
+ showSolid && (inspectChannel === "mask" || inspectChannel === "connectivity" || inspectChannel === "distance") && /* @__PURE__ */ jsxRuntimeExports.jsx("mesh", { geometry: solidGeo, userData: { forgeMesh: true }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
32437
+ "meshBasicMaterial",
32438
+ {
32439
+ color: inspectColor ?? settings.color,
32440
+ side: DoubleSide,
32441
+ toneMapped: false,
32442
+ clippingPlanes: effectiveClippingPlanes
32443
+ }
32444
+ ) }),
32445
+ showSolid && (inspectChannel === "thickness" || inspectChannel === "roughness") && inspectionGeo && /* @__PURE__ */ jsxRuntimeExports.jsx("mesh", { geometry: inspectionGeo, userData: { forgeMesh: true }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("meshBasicMaterial", { vertexColors: true, side: DoubleSide, toneMapped: false, clippingPlanes: effectiveClippingPlanes }) }),
32446
+ showSolid && inspectChannel === "collisions" && /* @__PURE__ */ jsxRuntimeExports.jsx("mesh", { geometry: solidGeo, userData: { forgeMesh: true }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
32447
+ "meshPhysicalMaterial",
32448
+ {
32449
+ color: rgbToHex(COLLISION_SOURCE_COLOR),
32450
+ roughness: 0.75,
32451
+ metalness: 0,
32452
+ side: DoubleSide,
32453
+ transparent: true,
32454
+ opacity: COLLISION_SOURCE_OPACITY,
32455
+ depthWrite: false,
32456
+ clippingPlanes: effectiveClippingPlanes
32457
+ }
32458
+ ) }),
32459
+ showSolid && inspectChannel === "none" && /* @__PURE__ */ jsxRuntimeExports.jsx("mesh", { geometry: solidGeo, userData: { forgeMesh: true }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
32267
32460
  "meshPhysicalMaterial",
32268
32461
  {
32269
32462
  color: settings.color,
@@ -32288,7 +32481,7 @@ function ForgeObject({
32288
32481
  clippingPlanes: effectiveClippingPlanes
32289
32482
  }
32290
32483
  ) }),
32291
- showSolid && hasAuthoredTransparency && renderStylePreset.glassShell.enabled && /* @__PURE__ */ jsxRuntimeExports.jsx("mesh", { geometry: solidGeo, scale: renderStylePreset.glassShell.scale, raycast: () => null, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
32484
+ showSolid && inspectChannel === "none" && hasAuthoredTransparency && renderStylePreset.glassShell.enabled && /* @__PURE__ */ jsxRuntimeExports.jsx("mesh", { geometry: solidGeo, scale: renderStylePreset.glassShell.scale, raycast: () => null, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
32292
32485
  "meshBasicMaterial",
32293
32486
  {
32294
32487
  color: renderStylePreset.glassShell.color,
@@ -37855,6 +38048,7 @@ function useViewportState() {
37855
38048
  const files = useForgeStore((s) => s.files);
37856
38049
  const renderMode = useForgeStore((s) => s.renderMode);
37857
38050
  const renderStyle = useForgeStore((s) => s.renderStyle);
38051
+ const inspectChannel = useForgeStore((s) => s.inspectChannel);
37858
38052
  const projectionMode = useForgeStore((s) => s.projectionMode);
37859
38053
  const gridEnabled = useForgeStore((s) => s.gridEnabled);
37860
38054
  const gridSize = useForgeStore((s) => s.gridSize);
@@ -38181,6 +38375,7 @@ function useViewportState() {
38181
38375
  files,
38182
38376
  renderMode,
38183
38377
  renderStyle,
38378
+ inspectChannel,
38184
38379
  projectionMode,
38185
38380
  gridEnabled,
38186
38381
  gridSize,
@@ -39510,6 +39705,58 @@ function ModelJourneyBar({
39510
39705
  }
39511
39706
  );
39512
39707
  }
39708
+ function transformedShapeBounds(obj, matrix) {
39709
+ if (!obj.shape) return null;
39710
+ try {
39711
+ const bb = obj.shape.boundingBox();
39712
+ const bounds = new Box3();
39713
+ if (!expandBoundsByTransformedAabb(bounds, bb.min, bb.max, matrix)) return null;
39714
+ return isFiniteBox3(bounds) ? bounds : null;
39715
+ } catch {
39716
+ return null;
39717
+ }
39718
+ }
39719
+ function bodyCountForShape(obj) {
39720
+ var _a3, _b2;
39721
+ try {
39722
+ const bodyCount = (_b2 = (_a3 = obj.shape) == null ? void 0 : _a3.numBodies) == null ? void 0 : _b2.call(_a3);
39723
+ return typeof bodyCount === "number" && Number.isFinite(bodyCount) ? Math.max(0, Math.round(bodyCount)) : 1;
39724
+ } catch {
39725
+ return 1;
39726
+ }
39727
+ }
39728
+ function buildPhysicalConnectivityEntries(objects, objectSettings, objectMatrices) {
39729
+ const entries = [];
39730
+ objects.forEach((obj) => {
39731
+ var _a3;
39732
+ if (!obj.shape) return;
39733
+ if (((_a3 = objectSettings[obj.id]) == null ? void 0 : _a3.visible) === false) return;
39734
+ const bounds = transformedShapeBounds(obj, objectMatrices[obj.id] ?? new Matrix4());
39735
+ if (!bounds) return;
39736
+ entries.push({
39737
+ id: obj.id,
39738
+ name: obj.name,
39739
+ shape: obj.shape,
39740
+ min: [bounds.min.x, bounds.min.y, bounds.min.z],
39741
+ max: [bounds.max.x, bounds.max.y, bounds.max.z],
39742
+ groupName: obj.groupName,
39743
+ treePath: obj.treePath,
39744
+ mock: obj.mock,
39745
+ bodyCount: bodyCountForShape(obj)
39746
+ });
39747
+ });
39748
+ return entries;
39749
+ }
39750
+ function connectivityColorByObjectId(entries) {
39751
+ const report = analyzePhysicalConnectivity(entries);
39752
+ return Object.fromEntries(report.objects.map((object) => [object.id, maskColorForIndex(object.componentIndex - 1)]));
39753
+ }
39754
+ function distanceColorByObjectId(entries) {
39755
+ const report = analyzeDistanceInspection(entries);
39756
+ return Object.fromEntries(
39757
+ report.objects.map((object) => [object.id, distanceColorForRootDistance(object.rootDistance, report.maxRootDistance)])
39758
+ );
39759
+ }
39513
39760
  const anchorTransform = {
39514
39761
  center: "translate(-50%, -50%)",
39515
39762
  top: "translate(-50%, 0)",
@@ -39677,6 +39924,7 @@ function Viewport() {
39677
39924
  evaluationPhase,
39678
39925
  renderMode,
39679
39926
  renderStyle,
39927
+ inspectChannel,
39680
39928
  projectionMode,
39681
39929
  gridEnabled,
39682
39930
  gridSize,
@@ -39760,6 +40008,7 @@ function Viewport() {
39760
40008
  const contextMenuRef = reactExports.useRef(null);
39761
40009
  const t2 = themes[themeName];
39762
40010
  const renderStylePreset = reactExports.useMemo(() => getRenderStylePreset(renderStyle), [renderStyle]);
40011
+ const inspectChannelActive = inspectChannel !== "none";
39763
40012
  const hasVisibleSdfObjects = objects.some((obj) => {
39764
40013
  var _a4;
39765
40014
  return obj.sdf && (((_a4 = objectSettings[obj.id]) == null ? void 0 : _a4.visible) ?? true);
@@ -39776,6 +40025,11 @@ function Viewport() {
39776
40025
  }
39777
40026
  return next;
39778
40027
  }, [constructionGhost, focusedObjectIdSet, objectSettings, objects]);
40028
+ const physicalInspectColorByObjectId = reactExports.useMemo(() => {
40029
+ if (inspectChannel !== "connectivity" && inspectChannel !== "distance") return {};
40030
+ const entries = buildPhysicalConnectivityEntries(objects, objectSettings, objectMatrices);
40031
+ return inspectChannel === "connectivity" ? connectivityColorByObjectId(entries) : distanceColorByObjectId(entries);
40032
+ }, [inspectChannel, objectMatrices, objectSettings, objects]);
39779
40033
  const handlers = useViewportHandlers({
39780
40034
  containerRef,
39781
40035
  contextMenuRef,
@@ -39839,7 +40093,7 @@ function Viewport() {
39839
40093
  Canvas,
39840
40094
  {
39841
40095
  style: {
39842
- background: renderStyle === "classic" ? t2.viewportBg : renderStylePreset.background,
40096
+ background: inspectChannelActive ? "#000000" : renderStyle === "classic" ? t2.viewportBg : renderStylePreset.background,
39843
40097
  cursor: measureMode ? "crosshair" : "default"
39844
40098
  },
39845
40099
  dpr: canvasDpr,
@@ -39907,8 +40161,8 @@ function Viewport() {
39907
40161
  )
39908
40162
  ] }),
39909
40163
  /* @__PURE__ */ jsxRuntimeExports.jsx(ClippingManager, { active: hasAnyObjectCutPlanes }),
39910
- sectionExplorerEnabled && /* @__PURE__ */ jsxRuntimeExports.jsx(SectionExplorerGizmo, { size: sectionGuideSize }),
39911
- sectionPlaneGuidesEnabled && activeCutPlaneDefs.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(
40164
+ !inspectChannelActive && sectionExplorerEnabled && /* @__PURE__ */ jsxRuntimeExports.jsx(SectionExplorerGizmo, { size: sectionGuideSize }),
40165
+ !inspectChannelActive && sectionPlaneGuidesEnabled && activeCutPlaneDefs.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(
39912
40166
  SectionPlaneGuides,
39913
40167
  {
39914
40168
  cutPlanes: scriptCutPlaneDefs,
@@ -39940,6 +40194,8 @@ function Viewport() {
39940
40194
  settings: effectiveSettings,
39941
40195
  renderStyle,
39942
40196
  renderMode,
40197
+ inspectChannel,
40198
+ inspectColor: physicalInspectColorByObjectId[obj.id] ?? maskColorForIndex(objIndex),
39943
40199
  isInteracting: isViewportInteracting,
39944
40200
  matrix,
39945
40201
  isHovered,
@@ -40004,7 +40260,8 @@ function Viewport() {
40004
40260
  }
40005
40261
  return null;
40006
40262
  }),
40007
- /* @__PURE__ */ jsxRuntimeExports.jsx(
40263
+ inspectChannel === "collisions" && /* @__PURE__ */ jsxRuntimeExports.jsx(CollisionInspectionOverlay, { objects, objectSettings, objectMatrices }),
40264
+ !inspectChannelActive && /* @__PURE__ */ jsxRuntimeExports.jsx(
40008
40265
  SectionCaps,
40009
40266
  {
40010
40267
  sceneVersion,
@@ -40016,17 +40273,17 @@ function Viewport() {
40016
40273
  isInteracting: isViewportInteracting
40017
40274
  }
40018
40275
  ),
40019
- constructionGhost && /* @__PURE__ */ jsxRuntimeExports.jsx(ConstructionGhostOverlay, { matrix: constructionGhostMatrix }),
40020
- historyMode && /* @__PURE__ */ jsxRuntimeExports.jsx(ConstructionHistoryOverlay, { objectMatrices, objectSettings }),
40021
- hoveredJointOverlay && /* @__PURE__ */ jsxRuntimeExports.jsx(HoveredJointOverlay, { state: hoveredJointOverlay, config: jointOverlayConfig }),
40022
- dimensionsVisible && dimensions.map((d) => /* @__PURE__ */ jsxRuntimeExports.jsx(DimensionAnnotation, { def: d, lengthUnit }, d.id)),
40023
- /* @__PURE__ */ jsxRuntimeExports.jsx(RenderLabelsOverlay, { labels: renderLabels }),
40024
- attachmentsVisible !== "none" && attachmentPoints.map((ap) => {
40276
+ !inspectChannelActive && constructionGhost && /* @__PURE__ */ jsxRuntimeExports.jsx(ConstructionGhostOverlay, { matrix: constructionGhostMatrix }),
40277
+ !inspectChannelActive && historyMode && /* @__PURE__ */ jsxRuntimeExports.jsx(ConstructionHistoryOverlay, { objectMatrices, objectSettings }),
40278
+ !inspectChannelActive && hoveredJointOverlay && /* @__PURE__ */ jsxRuntimeExports.jsx(HoveredJointOverlay, { state: hoveredJointOverlay, config: jointOverlayConfig }),
40279
+ !inspectChannelActive && dimensionsVisible && dimensions.map((d) => /* @__PURE__ */ jsxRuntimeExports.jsx(DimensionAnnotation, { def: d, lengthUnit }, d.id)),
40280
+ !inspectChannelActive && /* @__PURE__ */ jsxRuntimeExports.jsx(RenderLabelsOverlay, { labels: renderLabels }),
40281
+ !inspectChannelActive && attachmentsVisible !== "none" && attachmentPoints.map((ap) => {
40025
40282
  const matrix = objectMatrices[ap.objectId];
40026
40283
  return matrix ? /* @__PURE__ */ jsxRuntimeExports.jsx("group", { matrixAutoUpdate: false, matrix, children: /* @__PURE__ */ jsxRuntimeExports.jsx(ConnectorAttachmentAnnotation, { def: ap }) }, `${ap.objectId}:${ap.name}`) : /* @__PURE__ */ jsxRuntimeExports.jsx(ConnectorAttachmentAnnotation, { def: ap }, `${ap.objectId}:${ap.name}`);
40027
40284
  }),
40028
40285
  /* @__PURE__ */ jsxRuntimeExports.jsx(MeasureTool, {}),
40029
- debugHighlights3D.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(DebugHighlightsOverlay, { highlights: debugHighlights3D }),
40286
+ !inspectChannelActive && debugHighlights3D.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(DebugHighlightsOverlay, { highlights: debugHighlights3D }),
40030
40287
  drawFlagEnabled && /* @__PURE__ */ jsxRuntimeExports.jsx(DrawCanvas, {}),
40031
40288
  /* @__PURE__ */ jsxRuntimeExports.jsx(
40032
40289
  PerformanceInfoSampler,
@@ -40039,7 +40296,7 @@ function Viewport() {
40039
40296
  }
40040
40297
  ),
40041
40298
  /* @__PURE__ */ jsxRuntimeExports.jsx(ZoomSampler, { onZoomChange: setZoomMmPerPx }),
40042
- gridEnabled && !isSketchOnly && /* @__PURE__ */ jsxRuntimeExports.jsx(
40299
+ !inspectChannelActive && gridEnabled && !isSketchOnly && /* @__PURE__ */ jsxRuntimeExports.jsx(
40043
40300
  Grid,
40044
40301
  {
40045
40302
  args: [500, 500],
@@ -40054,7 +40311,7 @@ function Viewport() {
40054
40311
  infiniteGrid: true
40055
40312
  }
40056
40313
  ),
40057
- !isSketchOnly && /* @__PURE__ */ jsxRuntimeExports.jsx(
40314
+ !inspectChannelActive && !isSketchOnly && /* @__PURE__ */ jsxRuntimeExports.jsx(
40058
40315
  SdfRaymarchLayer,
40059
40316
  {
40060
40317
  objects,
@@ -40069,11 +40326,11 @@ function Viewport() {
40069
40326
  onContextMenu: (obj, event) => handleObjectContextMenu(obj, event)
40070
40327
  }
40071
40328
  ),
40072
- !isSketchOnly && /* @__PURE__ */ jsxRuntimeExports.jsx(LabeledAxes, {}),
40073
- isSketchOnly && /* @__PURE__ */ jsxRuntimeExports.jsx(SketchAxes, {}),
40329
+ !inspectChannelActive && !isSketchOnly && /* @__PURE__ */ jsxRuntimeExports.jsx(LabeledAxes, {}),
40330
+ !inspectChannelActive && isSketchOnly && /* @__PURE__ */ jsxRuntimeExports.jsx(SketchAxes, {}),
40074
40331
  isSketchOnly && /* @__PURE__ */ jsxRuntimeExports.jsx(CursorTracker, { onMove: (x, y) => setCursorPos({ x, y }) }),
40075
40332
  isSketchOnly && /* @__PURE__ */ jsxRuntimeExports.jsx(SketchRulersUpdater, { hCanvasRef: hRulerRef, vCanvasRef: vRulerRef }),
40076
- gridEnabled && isSketchOnly && /* @__PURE__ */ jsxRuntimeExports.jsx(
40333
+ !inspectChannelActive && gridEnabled && isSketchOnly && /* @__PURE__ */ jsxRuntimeExports.jsx(
40077
40334
  Grid,
40078
40335
  {
40079
40336
  args: [500, 500],
@@ -40684,7 +40941,7 @@ function Viewport() {
40684
40941
  }
40685
40942
  );
40686
40943
  }
40687
- const EditorApp$1 = reactExports.lazy(() => __vitePreload(() => import("./EditorApp-DNH1TEz1.js"), true ? __vite__mapDeps([0]) : void 0).then((m2) => ({ default: m2.EditorApp })));
40944
+ const EditorApp$1 = reactExports.lazy(() => __vitePreload(() => import("./EditorApp-CuiPbtn5.js"), true ? __vite__mapDeps([0]) : void 0).then((m2) => ({ default: m2.EditorApp })));
40688
40945
  const PENDING_SHARE_COPY_KEY = "fc-pending-share-copy";
40689
40946
  function storePendingShareCopy(shareId) {
40690
40947
  sessionStorage.setItem(PENDING_SHARE_COPY_KEY, shareId);
@@ -40871,15 +41128,15 @@ const PublishedModelPage$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Objec
40871
41128
  consumePendingShareCopy,
40872
41129
  storePendingShareCopy
40873
41130
  }, Symbol.toStringTag, { value: "Module" }));
40874
- reactExports.lazy(() => __vitePreload(() => import("./LandingPageProofDriven-CAu2OZFn.js"), true ? __vite__mapDeps([1]) : void 0).then((m2) => ({ default: m2.LandingPageProofDriven })));
40875
- const DocsPage = reactExports.lazy(() => __vitePreload(() => import("./DocsPage-C58f0K5v.js"), true ? [] : void 0).then((m2) => ({ default: m2.DocsPage })));
40876
- reactExports.lazy(() => __vitePreload(() => import("./BlogPage-DYJMjWx3.js"), true ? [] : void 0).then((m2) => ({ default: m2.BlogPage })));
40877
- reactExports.lazy(() => __vitePreload(() => import("./AdminPage-uTtcSXtn.js"), true ? [] : void 0).then((m2) => ({ default: m2.AdminPage })));
41131
+ reactExports.lazy(() => __vitePreload(() => import("./LandingPageProofDriven-DB9fQd5P.js"), true ? __vite__mapDeps([1]) : void 0).then((m2) => ({ default: m2.LandingPageProofDriven })));
41132
+ const DocsPage = reactExports.lazy(() => __vitePreload(() => import("./DocsPage-Blz3Tp4j.js"), true ? [] : void 0).then((m2) => ({ default: m2.DocsPage })));
41133
+ reactExports.lazy(() => __vitePreload(() => import("./BlogPage-Bl_sKeWb.js"), true ? [] : void 0).then((m2) => ({ default: m2.BlogPage })));
41134
+ reactExports.lazy(() => __vitePreload(() => import("./AdminPage-Da6hhpJx.js"), true ? [] : void 0).then((m2) => ({ default: m2.AdminPage })));
40878
41135
  reactExports.lazy(() => __vitePreload(() => Promise.resolve().then(() => PublishedModelPage$1), true ? void 0 : void 0).then((m2) => ({ default: m2.PublishedModelPage })));
40879
- reactExports.lazy(() => __vitePreload(() => import("./SettingsPage-N1l1tMXO.js"), true ? [] : void 0).then((m2) => ({ default: m2.SettingsPage })));
40880
- reactExports.lazy(() => __vitePreload(() => import("./PricingPage-BIgW7m3X.js"), true ? __vite__mapDeps([2,1]) : void 0).then((m2) => ({ default: m2.PricingPage })));
40881
- const EditorApp = reactExports.lazy(() => __vitePreload(() => import("./EditorApp-DNH1TEz1.js"), true ? __vite__mapDeps([0]) : void 0).then((m2) => ({ default: m2.EditorApp })));
40882
- const EmbedViewer = reactExports.lazy(() => __vitePreload(() => import("./EmbedViewer-CMXWA2LX.js"), true ? [] : void 0).then((m2) => ({ default: m2.EmbedViewer })));
41136
+ reactExports.lazy(() => __vitePreload(() => import("./SettingsPage-VVQNrCAg.js"), true ? [] : void 0).then((m2) => ({ default: m2.SettingsPage })));
41137
+ reactExports.lazy(() => __vitePreload(() => import("./PricingPage-BMxYT_F0.js"), true ? __vite__mapDeps([2,1]) : void 0).then((m2) => ({ default: m2.PricingPage })));
41138
+ const EditorApp = reactExports.lazy(() => __vitePreload(() => import("./EditorApp-CuiPbtn5.js"), true ? __vite__mapDeps([0]) : void 0).then((m2) => ({ default: m2.EditorApp })));
41139
+ const EmbedViewer = reactExports.lazy(() => __vitePreload(() => import("./EmbedViewer-BFG6-Ufm.js"), true ? [] : void 0).then((m2) => ({ default: m2.EmbedViewer })));
40883
41140
  const embedMode = isEmbedMode() && !window.location.pathname.startsWith("/m/");
40884
41141
  const EDITABLE_CRASH_FILE = /\.(?:forge\.js|[cm]?[jt]sx?|json|md|txt|svg)$/i;
40885
41142
  function firstMeaningfulLine(text) {