forgecad 0.9.4 → 0.9.5

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 (82) hide show
  1. package/dist/assets/{AdminPage-jwoEgwE_.js → AdminPage-uTtcSXtn.js} +1 -1
  2. package/dist/assets/{BlogPage-Ck7g3ue2.js → BlogPage-DYJMjWx3.js} +1 -1
  3. package/dist/assets/{DocsPage-9WaRC14b.js → DocsPage-C58f0K5v.js} +1 -6
  4. package/dist/assets/{EditorApp-Dja2jMmW.js → EditorApp-DNH1TEz1.js} +282 -62
  5. package/dist/assets/{EmbedViewer-37_PfMwv.js → EmbedViewer-CMXWA2LX.js} +2 -2
  6. package/dist/assets/{LandingPageProofDriven-CO8WL0CY.js → LandingPageProofDriven-CAu2OZFn.js} +1 -1
  7. package/dist/assets/{PricingPage-DADKGuOa.js → PricingPage-BIgW7m3X.js} +1 -1
  8. package/dist/assets/{SettingsPage-DKKI4W49.js → SettingsPage-N1l1tMXO.js} +1 -1
  9. package/dist/assets/{app-CwI02pTA.js → app-CFy7g5WP.js} +74 -12
  10. package/dist/assets/cli/{render-Kw5hLEcL.js → render-BrVVdj_T.js} +453 -41
  11. package/dist/assets/{evalWorker-D6ub3kfS.js → evalWorker-c_SB9gg3.js} +2057 -446
  12. package/dist/assets/{manifold-lru0jwVw.js → manifold-CRoBhJKH.js} +2 -2
  13. package/dist/assets/{manifold-CwDdMKyc.js → manifold-Cjk7WhRs.js} +1 -1
  14. package/dist/assets/{manifold-DTvmxSDf.js → manifold-Dp6pvFr6.js} +1 -1
  15. package/dist/assets/{renderSceneState-tvtNKNRi.js → renderSceneState-3DfsSASX.js} +1 -1
  16. package/dist/assets/{reportWorker-DeqktDGt.js → reportWorker-BLkuIoS8.js} +2052 -443
  17. package/dist/assets/{sectionPlaneMath-C8N0w8o3.js → sectionPlaneMath-CykEnkvQ.js} +2258 -518
  18. package/dist/cli/render.html +1 -1
  19. package/dist/docs/index.html +2 -2
  20. package/dist/docs-raw/AI/usage.md +0 -1
  21. package/dist/docs-raw/API/core/concepts.md +11 -1
  22. package/dist/docs-raw/CLI.md +64 -13
  23. package/dist/docs-raw/generated/assembly.md +8 -3
  24. package/dist/docs-raw/generated/concepts.md +44 -41
  25. package/dist/docs-raw/generated/core.md +97 -47
  26. package/dist/docs-raw/generated/curves.md +6 -580
  27. package/dist/docs-raw/generated/lib.md +40 -3
  28. package/dist/docs-raw/generated/output.md +6 -1
  29. package/dist/docs-raw/generated/sdf.md +50 -4
  30. package/dist/docs-raw/generated/viewport.md +1 -9
  31. package/dist/docs-raw/guides/inspection-bundles.md +31 -6
  32. package/dist/docs-raw/skills/forgecad-blockout-model.md +1 -0
  33. package/dist/docs-raw/skills/forgecad-image-replicator.md +3 -1
  34. package/dist/docs-raw/skills/forgecad-make-a-model.md +48 -4
  35. package/dist/docs-raw/skills/forgecad-render-inspect.md +3 -1
  36. package/dist/docs-raw/skills/forgecad-visual-spec.md +2 -0
  37. package/dist/docs-raw/skills/forgecad.md +2 -1
  38. package/dist/docs-raw/skills/index.md +0 -1
  39. package/dist/index.html +1 -1
  40. package/dist/sitemap.xml +6 -6
  41. package/dist-cli/blender/render.py +43 -8
  42. package/dist-cli/forgecad.js +4941 -1758
  43. package/dist-cli/forgecad.js.map +1 -1
  44. package/dist-skill/CONTEXT.md +255 -656
  45. package/dist-skill/SKILL-dev.md +2 -1
  46. package/dist-skill/SKILL.md +2 -1
  47. package/dist-skill/docs/API/core/concepts.md +11 -1
  48. package/dist-skill/docs/CLI.md +64 -13
  49. package/dist-skill/docs/generated/assembly.md +8 -3
  50. package/dist-skill/docs/generated/core.md +97 -47
  51. package/dist-skill/docs/generated/curves.md +6 -580
  52. package/dist-skill/docs/generated/lib.md +40 -3
  53. package/dist-skill/docs/generated/output.md +6 -1
  54. package/dist-skill/docs/generated/sdf.md +50 -4
  55. package/dist-skill/docs/generated/viewport.md +1 -9
  56. package/dist-skill/docs/guides/inspection-bundles.md +31 -6
  57. package/dist-skill/docs-dev/API/core/concepts.md +11 -1
  58. package/dist-skill/docs-dev/CLI.md +64 -13
  59. package/dist-skill/docs-dev/generated/assembly.md +8 -3
  60. package/dist-skill/docs-dev/generated/core.md +97 -47
  61. package/dist-skill/docs-dev/generated/curves.md +6 -580
  62. package/dist-skill/docs-dev/generated/lib.md +40 -3
  63. package/dist-skill/docs-dev/generated/output.md +6 -1
  64. package/dist-skill/docs-dev/generated/sdf.md +50 -4
  65. package/dist-skill/docs-dev/generated/viewport.md +1 -9
  66. package/dist-skill/docs-dev/guides/inspection-bundles.md +31 -6
  67. package/dist-skill/library/README.md +0 -1
  68. package/dist-skill/library/forgecad-blockout-model/SKILL.md +1 -0
  69. package/dist-skill/library/forgecad-image-replicator/SKILL.md +3 -1
  70. package/dist-skill/library/forgecad-make-a-model/SKILL.md +48 -4
  71. package/dist-skill/library/forgecad-render-inspect/SKILL.md +3 -1
  72. package/dist-skill/library/forgecad-visual-spec/SKILL.md +2 -0
  73. package/examples/api/drive-wheel-regions.forge.js +43 -0
  74. package/examples/api/sdf-circular-array-knurling.forge.js +19 -0
  75. package/examples/api/sdf-pattern2d-ceramic-ripple-set.forge.js +83 -0
  76. package/examples/api/sdf-pattern2d-grip-tread.forge.js +72 -0
  77. package/examples/api/sdf-pattern2d-orbital-jewelry.forge.js +62 -0
  78. package/examples/api/sdf-surface-basket-weave.forge.js +67 -0
  79. package/examples/api/sector-gear-body.forge.js +34 -0
  80. package/package.json +1 -1
  81. package/dist/docs-raw/skills/forgecad-api-dogfood.md +0 -130
  82. package/dist-skill/library/forgecad-api-dogfood/SKILL.md +0 -125
@@ -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-C8N0w8o3.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-CwI02pTA.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";
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-CwI02pTA.js";
2
+ import { B as BrandMark } from "./app-CFy7g5WP.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-CwI02pTA.js";
2
+ import { u as useAuthStore, b as authFetch, B as BrandMark } from "./app-CFy7g5WP.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-CwI02pTA.js";
2
+ import { u as useAuthStore, b as authFetch, s as storageUsagePercent, f as formatStorageBytes } from "./app-CFy7g5WP.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-C8N0w8o3.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";
8
8
  function getCsrfToken() {
9
9
  const match = document.cookie.match(/(?:^|;\s*)fc-csrf-token=([^;]+)/);
10
10
  return match == null ? void 0 : match[1];
@@ -15231,6 +15231,7 @@ function deserializeSceneObject(s) {
15231
15231
  sketchMeta: s.sketchMeta,
15232
15232
  groupName: s.groupName,
15233
15233
  treePath: s.treePath,
15234
+ tags: s.tags,
15234
15235
  serverShapeRef: s.serverShapeRef,
15235
15236
  exactState: s.exactState
15236
15237
  };
@@ -15787,7 +15788,7 @@ const CRASH_COOLDOWN_MS = 2e3;
15787
15788
  class EvalWorkerClient {
15788
15789
  constructor(workerFactory = () => new Worker(new URL(
15789
15790
  /* @vite-ignore */
15790
- "/assets/evalWorker-D6ub3kfS.js",
15791
+ "/assets/evalWorker-c_SB9gg3.js",
15791
15792
  import.meta.url
15792
15793
  ), { type: "module" })) {
15793
15794
  __publicField(this, "worker", null);
@@ -17198,6 +17199,7 @@ function runMetadataToRunResult(metadata) {
17198
17199
  sketchMeta: obj.sketchMeta,
17199
17200
  groupName: obj.groupName,
17200
17201
  treePath: obj.treePath,
17202
+ tags: obj.tags,
17201
17203
  mock: obj.mock,
17202
17204
  serverShapeRef: obj.serverShapeRef,
17203
17205
  exactState: obj.exactState
@@ -17371,6 +17373,16 @@ const initialObjectSettingsByFile = (() => {
17371
17373
  }
17372
17374
  return {};
17373
17375
  })();
17376
+ function hasSceneObjectTag(object, tag) {
17377
+ return (object.tags ?? []).includes(tag);
17378
+ }
17379
+ function defaultSettingsForObject(object) {
17380
+ return {
17381
+ visible: true,
17382
+ opacity: object.mock ? 0.3 : 1,
17383
+ color: object.color || DEFAULT_OBJECT_COLOR
17384
+ };
17385
+ }
17374
17386
  const initialParamSnapshotsByFile = sanitizeParamSnapshotsByFile(
17375
17387
  initialViewPreferences.paramSnapshotsByFile
17376
17388
  );
@@ -18180,6 +18192,50 @@ Switch to LOCAL mode or wait for the server to recover.`,
18180
18192
  objectSettingsByFile: nextObjectSettingsByFile
18181
18193
  };
18182
18194
  }),
18195
+ hideObjectsWithTag: (tag) => set((s) => {
18196
+ var _a3;
18197
+ const objects = ((_a3 = s.lastValidResult) == null ? void 0 : _a3.objects) ?? [];
18198
+ if (!objects.some((object) => hasSceneObjectTag(object, tag))) return {};
18199
+ let changed = false;
18200
+ const nextObjectSettings = { ...s.objectSettings };
18201
+ objects.forEach((object) => {
18202
+ if (!hasSceneObjectTag(object, tag)) return;
18203
+ const current = nextObjectSettings[object.id] ?? defaultSettingsForObject(object);
18204
+ if (!current.visible) return;
18205
+ nextObjectSettings[object.id] = { ...current, visible: false };
18206
+ changed = true;
18207
+ });
18208
+ if (!changed) return {};
18209
+ const nextObjectSettingsByFile = setObjectSettingsForPreviewFile(s.objectSettingsByFile, s.previewFile, nextObjectSettings);
18210
+ writeViewPreferences({ objectSettingsByFile: nextObjectSettingsByFile });
18211
+ return {
18212
+ objectSettings: nextObjectSettings,
18213
+ objectSettingsByFile: nextObjectSettingsByFile
18214
+ };
18215
+ }),
18216
+ showOnlyObjectsWithTag: (tag) => set((s) => {
18217
+ var _a3;
18218
+ const objects = ((_a3 = s.lastValidResult) == null ? void 0 : _a3.objects) ?? [];
18219
+ if (objects.length === 0) return {};
18220
+ const matchingIds = new Set(objects.filter((object) => hasSceneObjectTag(object, tag)).map((object) => object.id));
18221
+ if (matchingIds.size === 0) return {};
18222
+ let changed = false;
18223
+ const nextObjectSettings = { ...s.objectSettings };
18224
+ objects.forEach((object) => {
18225
+ const visible = matchingIds.has(object.id);
18226
+ const current = nextObjectSettings[object.id] ?? defaultSettingsForObject(object);
18227
+ if (current.visible === visible) return;
18228
+ nextObjectSettings[object.id] = { ...current, visible };
18229
+ changed = true;
18230
+ });
18231
+ if (!changed) return {};
18232
+ const nextObjectSettingsByFile = setObjectSettingsForPreviewFile(s.objectSettingsByFile, s.previewFile, nextObjectSettings);
18233
+ writeViewPreferences({ objectSettingsByFile: nextObjectSettingsByFile });
18234
+ return {
18235
+ objectSettings: nextObjectSettings,
18236
+ objectSettingsByFile: nextObjectSettingsByFile
18237
+ };
18238
+ }),
18183
18239
  setObjectOpacity: (id, opacity) => set((s) => {
18184
18240
  const current = s.objectSettings[id] ?? { visible: true, opacity: 1, color: DEFAULT_OBJECT_COLOR };
18185
18241
  const nextObjectSettings = { ...s.objectSettings, [id]: { ...current, opacity } };
@@ -18385,6 +18441,12 @@ Switch to LOCAL mode or wait for the server to recover.`,
18385
18441
  }
18386
18442
  return { focusedObjectIds: [...state2.focusedObjectIds, id], selectedObjectId: id };
18387
18443
  }),
18444
+ focusObjectsWithTag: (tag) => set((state2) => {
18445
+ var _a3;
18446
+ const ids = (((_a3 = state2.lastValidResult) == null ? void 0 : _a3.objects) ?? []).filter((object) => hasSceneObjectTag(object, tag)).map((object) => object.id);
18447
+ if (ids.length === 0) return {};
18448
+ return { focusedObjectIds: ids, selectedObjectId: ids[0] };
18449
+ }),
18388
18450
  clearFocusedObject: () => set({ focusedObjectIds: [] }),
18389
18451
  hoveredObjectId: null,
18390
18452
  setHoveredObjectId: (id) => set((state2) => state2.hoveredObjectId === id ? state2 : { hoveredObjectId: id }),
@@ -28852,7 +28914,7 @@ function generateReportInWorker(options) {
28852
28914
  return new Promise((resolve2, reject) => {
28853
28915
  const worker = new Worker(new URL(
28854
28916
  /* @vite-ignore */
28855
- "/assets/reportWorker-DeqktDGt.js",
28917
+ "/assets/reportWorker-BLkuIoS8.js",
28856
28918
  import.meta.url
28857
28919
  ), { type: "module" });
28858
28920
  const cleanup = () => {
@@ -40622,7 +40684,7 @@ function Viewport() {
40622
40684
  }
40623
40685
  );
40624
40686
  }
40625
- const EditorApp$1 = reactExports.lazy(() => __vitePreload(() => import("./EditorApp-Dja2jMmW.js"), true ? __vite__mapDeps([0]) : void 0).then((m2) => ({ default: m2.EditorApp })));
40687
+ const EditorApp$1 = reactExports.lazy(() => __vitePreload(() => import("./EditorApp-DNH1TEz1.js"), true ? __vite__mapDeps([0]) : void 0).then((m2) => ({ default: m2.EditorApp })));
40626
40688
  const PENDING_SHARE_COPY_KEY = "fc-pending-share-copy";
40627
40689
  function storePendingShareCopy(shareId) {
40628
40690
  sessionStorage.setItem(PENDING_SHARE_COPY_KEY, shareId);
@@ -40809,15 +40871,15 @@ const PublishedModelPage$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Objec
40809
40871
  consumePendingShareCopy,
40810
40872
  storePendingShareCopy
40811
40873
  }, Symbol.toStringTag, { value: "Module" }));
40812
- reactExports.lazy(() => __vitePreload(() => import("./LandingPageProofDriven-CO8WL0CY.js"), true ? __vite__mapDeps([1]) : void 0).then((m2) => ({ default: m2.LandingPageProofDriven })));
40813
- const DocsPage = reactExports.lazy(() => __vitePreload(() => import("./DocsPage-9WaRC14b.js"), true ? [] : void 0).then((m2) => ({ default: m2.DocsPage })));
40814
- reactExports.lazy(() => __vitePreload(() => import("./BlogPage-Ck7g3ue2.js"), true ? [] : void 0).then((m2) => ({ default: m2.BlogPage })));
40815
- reactExports.lazy(() => __vitePreload(() => import("./AdminPage-jwoEgwE_.js"), true ? [] : void 0).then((m2) => ({ default: m2.AdminPage })));
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 })));
40816
40878
  reactExports.lazy(() => __vitePreload(() => Promise.resolve().then(() => PublishedModelPage$1), true ? void 0 : void 0).then((m2) => ({ default: m2.PublishedModelPage })));
40817
- reactExports.lazy(() => __vitePreload(() => import("./SettingsPage-DKKI4W49.js"), true ? [] : void 0).then((m2) => ({ default: m2.SettingsPage })));
40818
- reactExports.lazy(() => __vitePreload(() => import("./PricingPage-DADKGuOa.js"), true ? __vite__mapDeps([2,1]) : void 0).then((m2) => ({ default: m2.PricingPage })));
40819
- const EditorApp = reactExports.lazy(() => __vitePreload(() => import("./EditorApp-Dja2jMmW.js"), true ? __vite__mapDeps([0]) : void 0).then((m2) => ({ default: m2.EditorApp })));
40820
- const EmbedViewer = reactExports.lazy(() => __vitePreload(() => import("./EmbedViewer-37_PfMwv.js"), true ? [] : void 0).then((m2) => ({ default: m2.EmbedViewer })));
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 })));
40821
40883
  const embedMode = isEmbedMode() && !window.location.pathname.startsWith("/m/");
40822
40884
  const EDITABLE_CRASH_FILE = /\.(?:forge\.js|[cm]?[jt]sx?|json|md|txt|svg)$/i;
40823
40885
  function firstMeaningfulLine(text) {