vim-web 0.5.0-dev.9 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/style.css +34 -7
  2. package/dist/types/core-viewers/shared/inputAdapter.d.ts +1 -0
  3. package/dist/types/core-viewers/shared/keyboardHandler.d.ts +1 -1
  4. package/dist/types/core-viewers/shared/mouseHandler.d.ts +3 -0
  5. package/dist/types/core-viewers/ultra/viewer.d.ts +5 -0
  6. package/dist/types/core-viewers/ultra/viewport.d.ts +6 -0
  7. package/dist/types/core-viewers/ultra/vim.d.ts +3 -1
  8. package/dist/types/core-viewers/webgl/loader/mesh.d.ts +3 -1
  9. package/dist/types/core-viewers/webgl/loader/progressive/insertableMesh.d.ts +4 -2
  10. package/dist/types/core-viewers/webgl/loader/progressive/instancedMesh.d.ts +5 -0
  11. package/dist/types/core-viewers/webgl/loader/vim.d.ts +5 -0
  12. package/dist/types/core-viewers/webgl/viewer/gizmos/markers/gizmoMarker.d.ts +1 -0
  13. package/dist/types/core-viewers/webgl/viewer/rendering/renderer.d.ts +7 -0
  14. package/dist/types/core-viewers/webgl/viewer/viewer.d.ts +5 -0
  15. package/dist/types/core-viewers/webgl/viewer/viewport.d.ts +1 -1
  16. package/dist/types/react-viewers/bim/bimPanel.d.ts +3 -3
  17. package/dist/types/react-viewers/controlbar/controlBarIds.d.ts +32 -36
  18. package/dist/types/react-viewers/errors/errorStyle.d.ts +1 -1
  19. package/dist/types/react-viewers/helpers/reactUtils.d.ts +2 -1
  20. package/dist/types/react-viewers/helpers/utils.d.ts +8 -0
  21. package/dist/types/react-viewers/panels/axesPanel.d.ts +2 -1
  22. package/dist/types/react-viewers/panels/index.d.ts +1 -0
  23. package/dist/types/react-viewers/panels/isolationPanel.d.ts +2 -0
  24. package/dist/types/react-viewers/panels/messageBox.d.ts +2 -0
  25. package/dist/types/react-viewers/panels/sidePanel.d.ts +1 -1
  26. package/dist/types/react-viewers/settings/anySettings.d.ts +7 -0
  27. package/dist/types/react-viewers/settings/index.d.ts +1 -1
  28. package/dist/types/react-viewers/settings/settingsInputBox.d.ts +4 -0
  29. package/dist/types/react-viewers/settings/settingsItem.d.ts +30 -0
  30. package/dist/types/react-viewers/settings/settingsKeys.d.ts +46 -0
  31. package/dist/types/react-viewers/settings/settingsPanel.d.ts +5 -4
  32. package/dist/types/react-viewers/settings/settingsPanelContent.d.ts +6 -0
  33. package/dist/types/react-viewers/settings/settingsState.d.ts +11 -11
  34. package/dist/types/react-viewers/settings/settingsStorage.d.ts +3 -3
  35. package/dist/types/react-viewers/settings/settingsSubtitle.d.ts +2 -0
  36. package/dist/types/react-viewers/settings/settingsToggle.d.ts +11 -0
  37. package/dist/types/react-viewers/state/controlBarState.d.ts +41 -7
  38. package/dist/types/react-viewers/state/sharedIsolation.d.ts +2 -0
  39. package/dist/types/react-viewers/ultra/controlBar.d.ts +4 -1
  40. package/dist/types/react-viewers/ultra/index.d.ts +1 -0
  41. package/dist/types/react-viewers/ultra/settings.d.ts +13 -0
  42. package/dist/types/react-viewers/ultra/settingsPanel.d.ts +5 -0
  43. package/dist/types/react-viewers/ultra/viewer.d.ts +3 -1
  44. package/dist/types/react-viewers/ultra/viewerRef.d.ts +3 -0
  45. package/dist/types/react-viewers/urls.d.ts +0 -1
  46. package/dist/types/react-viewers/webgl/index.d.ts +1 -0
  47. package/dist/types/react-viewers/webgl/loading.d.ts +2 -2
  48. package/dist/types/react-viewers/webgl/settings.d.ts +36 -0
  49. package/dist/types/react-viewers/webgl/settingsPanel.d.ts +12 -0
  50. package/dist/types/react-viewers/webgl/viewer.d.ts +3 -3
  51. package/dist/types/react-viewers/webgl/viewerRef.d.ts +12 -5
  52. package/dist/vim-web.iife.js +1384 -728
  53. package/dist/vim-web.iife.js.map +1 -1
  54. package/dist/vim-web.js +1384 -728
  55. package/dist/vim-web.js.map +1 -1
  56. package/package.json +1 -1
  57. package/dist/types/react-viewers/settings/settings.d.ts +0 -61
@@ -46785,6 +46785,11 @@ void main() {
46785
46785
  * @param {boolean} isLegacy - Indicates whether the Vim object uses a legacy loading pipeline.
46786
46786
  */
46787
46787
  constructor(header, document2, g3d2, scene, settings2, map, builder, source, format) {
46788
+ /**
46789
+ * The type of the viewer, indicating it is a WebGL viewer.
46790
+ * Useful for distinguishing between different viewer types in a multi-viewer application.
46791
+ */
46792
+ __publicField(this, "type", "webgl");
46788
46793
  /**
46789
46794
  * Indicates whether the vim was opened from a vim or vimx file.
46790
46795
  */
@@ -48862,19 +48867,38 @@ void main() {
48862
48867
  return new InsertableSubmesh(this, index2);
48863
48868
  }
48864
48869
  /**
48865
- * Overrides mesh material, set to undefine to restore initial material.
48866
- */
48870
+ * Sets the material for this mesh.
48871
+ * Set to undefined to reset to original materials.
48872
+ */
48867
48873
  setMaterial(value) {
48868
- if (this._material === value) return;
48869
48874
  if (this.ignoreSceneMaterial) return;
48870
- this.mesh.material = value ?? this._material;
48875
+ const base = this._material;
48876
+ let mat;
48877
+ if (Array.isArray(value)) {
48878
+ mat = this._mergeMaterials(value, base);
48879
+ } else {
48880
+ mat = value ?? base;
48881
+ }
48882
+ this.mesh.material = mat;
48871
48883
  this.mesh.geometry.clearGroups();
48872
- if (value instanceof Array) {
48873
- value.forEach((m, i2) => {
48884
+ if (Array.isArray(mat)) {
48885
+ mat.forEach((_m, i2) => {
48874
48886
  this.mesh.geometry.addGroup(0, Infinity, i2);
48875
48887
  });
48876
48888
  }
48877
48889
  }
48890
+ _mergeMaterials(value, base) {
48891
+ const baseArr = Array.isArray(base) ? base : [base];
48892
+ const result = [];
48893
+ for (const v of value) {
48894
+ if (v === void 0) {
48895
+ result.push(...baseArr);
48896
+ } else {
48897
+ result.push(v);
48898
+ }
48899
+ }
48900
+ return result;
48901
+ }
48878
48902
  }
48879
48903
  class InstancedSubmesh {
48880
48904
  constructor(mesh, index2) {
@@ -48961,17 +48985,39 @@ void main() {
48961
48985
  }
48962
48986
  return submeshes;
48963
48987
  }
48988
+ /**
48989
+ * Sets the material for this mesh.
48990
+ * Set to undefined to reset to original materials.
48991
+ */
48964
48992
  setMaterial(value) {
48965
- if (this._material === value) return;
48966
48993
  if (this.ignoreSceneMaterial) return;
48967
- this.mesh.material = value ?? this._material;
48994
+ const base = this._material;
48995
+ let mat;
48996
+ if (Array.isArray(value)) {
48997
+ mat = this._mergeMaterials(value, base);
48998
+ } else {
48999
+ mat = value ?? base;
49000
+ }
49001
+ this.mesh.material = mat;
48968
49002
  this.mesh.geometry.clearGroups();
48969
- if (value instanceof Array) {
48970
- value.forEach((m, i2) => {
49003
+ if (Array.isArray(mat)) {
49004
+ mat.forEach((_m, i2) => {
48971
49005
  this.mesh.geometry.addGroup(0, Infinity, i2);
48972
49006
  });
48973
49007
  }
48974
49008
  }
49009
+ _mergeMaterials(value, base) {
49010
+ const baseArr = Array.isArray(base) ? base : [base];
49011
+ const result = [];
49012
+ for (const v of value) {
49013
+ if (v === void 0) {
49014
+ result.push(...baseArr);
49015
+ } else {
49016
+ result.push(v);
49017
+ }
49018
+ }
49019
+ return result;
49020
+ }
48975
49021
  computeBoundingBoxes() {
48976
49022
  this.mesh.geometry.computeBoundingBox();
48977
49023
  const boxes = new Array(this.mesh.count);
@@ -50111,6 +50157,9 @@ void main() {
50111
50157
  get index() {
50112
50158
  return this._submesh.index;
50113
50159
  }
50160
+ get isRoom() {
50161
+ return false;
50162
+ }
50114
50163
  /**
50115
50164
  * Updates the underlying submesh and rebinds all attributes to the new mesh.
50116
50165
  * @param mesh - The new submesh to bind to this marker.
@@ -52597,7 +52646,11 @@ void main() {
52597
52646
  * @param handler Callback invoked on key up.
52598
52647
  */
52599
52648
  registerKeyUp(code, mode, handler) {
52600
- this.registerKey(this.keyUpHandlers, code, mode, handler);
52649
+ if (Array.isArray(code)) {
52650
+ code.forEach((c) => this.registerKey(this.keyUpHandlers, c, mode, handler));
52651
+ } else {
52652
+ this.registerKey(this.keyUpHandlers, code, mode, handler);
52653
+ }
52601
52654
  }
52602
52655
  registerKey(map, code, mode, callback) {
52603
52656
  mode = map.has(code) ? mode : "replace";
@@ -52635,6 +52688,7 @@ void main() {
52635
52688
  __publicField(this, "_capture");
52636
52689
  __publicField(this, "_dragHandler");
52637
52690
  __publicField(this, "_doubleClickHandler", new DoubleClickHandler());
52691
+ __publicField(this, "_clickHandler", new ClickHandler());
52638
52692
  __publicField(this, "onButtonDown");
52639
52693
  __publicField(this, "onButtonUp");
52640
52694
  __publicField(this, "onMouseMove");
@@ -52643,6 +52697,7 @@ void main() {
52643
52697
  __publicField(this, "onClick");
52644
52698
  __publicField(this, "onDoubleClick");
52645
52699
  __publicField(this, "onWheel");
52700
+ __publicField(this, "onContextMenu");
52646
52701
  this._capture = new CaptureHandler(canvas);
52647
52702
  this._dragHandler = new DragHandler((delta, button) => this.onDrag(delta, button));
52648
52703
  }
@@ -52670,22 +52725,28 @@ void main() {
52670
52725
  (_a3 = this.onButtonDown) == null ? void 0 : _a3.call(this, pos, event.button);
52671
52726
  this._lastMouseDownPosition = pos;
52672
52727
  this._dragHandler.onPointerDown(pos, event.button);
52728
+ this._clickHandler.onPointerDown(pos);
52673
52729
  this._capture.onPointerDown(event);
52674
52730
  event.preventDefault();
52675
52731
  }
52676
52732
  handlePointerUp(event) {
52677
52733
  var _a3;
52678
52734
  if (event.pointerType !== "mouse") return;
52735
+ event.preventDefault();
52679
52736
  const pos = this.relativePosition(event);
52680
52737
  (_a3 = this.onButtonUp) == null ? void 0 : _a3.call(this, pos, event.button);
52681
52738
  this._capture.onPointerUp(event);
52682
52739
  this._dragHandler.onPointerUp();
52683
- if (this._doubleClickHandler.checkForDoubleClick(event)) {
52740
+ this._clickHandler.onPointerUp();
52741
+ if (this._doubleClickHandler.isDoubleClick(event)) {
52684
52742
  this.handleDoubleClick(event);
52685
- } else {
52743
+ return;
52744
+ }
52745
+ if (this._clickHandler.isClick(event)) {
52686
52746
  this.handleMouseClick(event);
52747
+ return;
52687
52748
  }
52688
- event.preventDefault();
52749
+ this.handleContextMenu(event);
52689
52750
  }
52690
52751
  async handleMouseClick(event) {
52691
52752
  var _a3;
@@ -52698,12 +52759,23 @@ void main() {
52698
52759
  const modif = event.getModifierState("Shift") || event.getModifierState("Control");
52699
52760
  (_a3 = this.onClick) == null ? void 0 : _a3.call(this, pos, modif);
52700
52761
  }
52762
+ async handleContextMenu(event) {
52763
+ var _a3;
52764
+ if (event.pointerType !== "mouse") return;
52765
+ if (event.button !== 2) return;
52766
+ const pos = this.relativePosition(event);
52767
+ if (!almostEqual(this._lastMouseDownPosition, pos, 0.01)) {
52768
+ return;
52769
+ }
52770
+ (_a3 = this.onContextMenu) == null ? void 0 : _a3.call(this, new Vector2(event.clientX, event.clientY));
52771
+ }
52701
52772
  handlePointerMove(event) {
52702
52773
  var _a3;
52703
52774
  if (event.pointerType !== "mouse") return;
52704
52775
  this._canvas.focus();
52705
52776
  const pos = this.relativePosition(event);
52706
52777
  this._dragHandler.onPointerMove(pos);
52778
+ this._clickHandler.onPointerMove(pos);
52707
52779
  (_a3 = this.onMouseMove) == null ? void 0 : _a3.call(this, pos);
52708
52780
  }
52709
52781
  async handleDoubleClick(event) {
@@ -52747,17 +52819,46 @@ void main() {
52747
52819
  }
52748
52820
  }
52749
52821
  }
52822
+ class ClickHandler {
52823
+ constructor() {
52824
+ __publicField(this, "_moved", false);
52825
+ __publicField(this, "_startPosition", new Vector2());
52826
+ __publicField(this, "_clickThreshold", 3e-3);
52827
+ }
52828
+ onPointerDown(pos) {
52829
+ this._moved = false;
52830
+ this._startPosition.copy(pos);
52831
+ }
52832
+ onPointerMove(pos) {
52833
+ if (pos.distanceTo(this._startPosition) > this._clickThreshold) {
52834
+ this._moved = true;
52835
+ }
52836
+ }
52837
+ onPointerUp() {
52838
+ }
52839
+ isClick(event) {
52840
+ if (event.button !== 0) return false;
52841
+ return !this._moved;
52842
+ }
52843
+ }
52750
52844
  class DoubleClickHandler {
52751
52845
  constructor() {
52752
52846
  __publicField(this, "_lastClickTime", 0);
52753
52847
  __publicField(this, "_clickDelay", 300);
52848
+ // Max time between clicks for double-click
52849
+ __publicField(this, "_lastClickPosition", null);
52850
+ __publicField(this, "_positionThreshold", 5);
52754
52851
  }
52755
- // Delay in milliseconds to consider a double click
52756
- checkForDoubleClick(event) {
52852
+ // Max pixel distance between clicks
52853
+ isDoubleClick(event) {
52757
52854
  const currentTime = Date.now();
52855
+ const currentPosition = new Vector2(event.clientX, event.clientY);
52758
52856
  const timeDiff = currentTime - this._lastClickTime;
52857
+ const isClose = this._lastClickPosition !== null && this._lastClickPosition.distanceTo(currentPosition) < this._positionThreshold;
52858
+ const isWithinTime = timeDiff < this._clickDelay;
52759
52859
  this._lastClickTime = currentTime;
52760
- return timeDiff < this._clickDelay;
52860
+ this._lastClickPosition = currentPosition;
52861
+ return isClose && isWithinTime;
52761
52862
  }
52762
52863
  }
52763
52864
  class DragHandler {
@@ -52997,23 +53098,15 @@ void main() {
52997
53098
  this._moveSpeed = settings2.moveSpeed ?? 1;
52998
53099
  this.rotateSpeed = settings2.rotateSpeed ?? 1;
52999
53100
  this.orbitSpeed = settings2.orbitSpeed ?? 1;
53000
- this.reg(document, "contextmenu", (e) => {
53001
- this._onContextMenu.dispatch(new Vector2(e.clientX, e.clientY));
53002
- e.preventDefault();
53003
- });
53004
53101
  this.keyboard = new KeyboardHandler(canvas);
53005
53102
  this.mouse = new MouseHandler(canvas);
53006
53103
  this.touch = new TouchHandler(canvas);
53007
53104
  this.keyboard.onKeyDown = (key) => adapter.keyDown(key);
53008
53105
  this.keyboard.onKeyUp = (key) => adapter.keyUp(key);
53009
53106
  this.keyboard.registerKeyUp("KeyP", "replace", () => adapter.toggleOrthographic());
53010
- this.keyboard.registerKeyUp("Equal", "replace", () => this.moveSpeed++);
53011
- this.keyboard.registerKeyUp("Minus", "replace", () => this.moveSpeed--);
53012
- this.keyboard.registerKeyUp("Space", "replace", () => {
53013
- this._pointerActive = this._pointerActive === "orbit" ? "look" : "orbit";
53014
- this._pointerFallback = this._pointerActive;
53015
- this._onPointerModeChanged.dispatch();
53016
- });
53107
+ this.keyboard.registerKeyUp(["Equal", "NumpadAdd"], "replace", () => this.moveSpeed++);
53108
+ this.keyboard.registerKeyUp(["Minus", "NumpadSubtract"], "replace", () => this.moveSpeed--);
53109
+ this.keyboard.registerKeyUp("Space", "replace", () => adapter.toggleCameraOrbitMode());
53017
53110
  this.keyboard.registerKeyUp("Home", "replace", () => adapter.resetCamera());
53018
53111
  this.keyboard.registerKeyUp("Escape", "replace", () => adapter.clearSelection());
53019
53112
  this.keyboard.registerKeyUp("KeyF", "replace", () => {
@@ -53023,18 +53116,28 @@ void main() {
53023
53116
  const mul = Math.pow(1.25, this._moveSpeed);
53024
53117
  adapter.moveCamera(value.multiplyScalar(mul));
53025
53118
  };
53119
+ this.mouse.onContextMenu = (pos) => this._onContextMenu.dispatch(pos);
53026
53120
  this.mouse.onButtonDown = adapter.mouseDown;
53027
53121
  this.mouse.onMouseMove = adapter.mouseMove;
53028
- this.mouse.onButtonUp = adapter.mouseUp;
53122
+ this.mouse.onButtonUp = (pos, button) => {
53123
+ this.pointerOverride = void 0;
53124
+ adapter.mouseUp(pos, button);
53125
+ };
53029
53126
  this.mouse.onDrag = (delta, button) => {
53030
53127
  if (button === 0) {
53031
- if (this._pointerActive === "orbit") adapter.orbitCamera(toRotation(delta, this.orbitSpeed));
53032
- if (this._pointerActive === "look") adapter.rotateCamera(toRotation(delta, this.rotateSpeed));
53033
- if (this._pointerActive === "pan") adapter.panCamera(delta);
53034
- if (this._pointerActive === "zoom") adapter.dollyCamera(delta);
53128
+ if (this.pointerActive === "orbit") adapter.orbitCamera(toRotation(delta, this.orbitSpeed));
53129
+ if (this.pointerActive === "look") adapter.rotateCamera(toRotation(delta, this.rotateSpeed));
53130
+ if (this.pointerActive === "pan") adapter.panCamera(delta);
53131
+ if (this.pointerActive === "zoom") adapter.dollyCamera(delta);
53132
+ }
53133
+ if (button === 2) {
53134
+ this.pointerOverride = "look";
53135
+ adapter.rotateCamera(toRotation(delta, 1));
53136
+ }
53137
+ if (button === 1) {
53138
+ this.pointerOverride = "pan";
53139
+ adapter.panCamera(delta);
53035
53140
  }
53036
- if (button === 2) adapter.rotateCamera(toRotation(delta, 1));
53037
- if (button === 1) adapter.panCamera(delta);
53038
53141
  };
53039
53142
  this.mouse.onClick = (pos, modif) => adapter.selectAtPointer(pos, modif);
53040
53143
  this.mouse.onDoubleClick = adapter.frameAtPointer;
@@ -55332,7 +55435,7 @@ void main() {
55332
55435
  }
55333
55436
  unparent2dObjects(target) {
55334
55437
  if (target instanceof Group) {
55335
- for (const child of target.children) {
55438
+ for (const child of [...target.children]) {
55336
55439
  if (child instanceof CSS2DObject) {
55337
55440
  target.remove(child);
55338
55441
  }
@@ -55507,6 +55610,7 @@ void main() {
55507
55610
  }
55508
55611
  add(objectOrObjects) {
55509
55612
  if (!this.enabled) return;
55613
+ if (!objectOrObjects) return;
55510
55614
  const objects = this.toArray(objectOrObjects);
55511
55615
  let changed = false;
55512
55616
  for (const obj of objects) {
@@ -55857,7 +55961,7 @@ void main() {
55857
55961
  /**
55858
55962
  * Resizes the canvas and updates the camera to match new parent dimensions.
55859
55963
  */
55860
- ResizeToParent() {
55964
+ resizeToParent() {
55861
55965
  this._onResize.dispatch();
55862
55966
  }
55863
55967
  /**
@@ -55911,6 +56015,9 @@ void main() {
55911
56015
  toggleOrthographic: () => {
55912
56016
  viewer.camera.orthographic = !viewer.camera.orthographic;
55913
56017
  },
56018
+ toggleCameraOrbitMode: () => {
56019
+ viewer.inputs.pointerActive = viewer.inputs.pointerActive === PointerMode$1.ORBIT ? PointerMode$1.LOOK : PointerMode$1.ORBIT;
56020
+ },
55914
56021
  resetCamera: () => {
55915
56022
  viewer.camera.lerp(0.75).reset();
55916
56023
  },
@@ -55935,7 +56042,7 @@ void main() {
55935
56042
  },
55936
56043
  frameAtPointer: async (pos) => {
55937
56044
  const result = await viewer.raycaster.raycastFromScreen(pos);
55938
- viewer.camera.lerp(0.75).frame(result.object);
56045
+ viewer.camera.lerp(0.75).frame(result.object ?? "all");
55939
56046
  },
55940
56047
  zoom: (value) => {
55941
56048
  viewer.camera.lerp(0.75).zoom(value);
@@ -56946,6 +57053,10 @@ void main() {
56946
57053
  * Indicates whether the scene should be re-rendered on change only.
56947
57054
  */
56948
57055
  __publicField(this, "onDemand");
57056
+ /**
57057
+ * The material that will be used when setting model material to undefined.
57058
+ */
57059
+ __publicField(this, "defaultModelMaterial");
56949
57060
  __publicField(this, "fitViewport", () => {
56950
57061
  const size = this._viewport.getParentSize();
56951
57062
  this.renderer.setPixelRatio(window.devicePixelRatio);
@@ -57017,11 +57128,14 @@ void main() {
57017
57128
  this._scene.threeScene.background = color;
57018
57129
  this.needsUpdate = true;
57019
57130
  }
57131
+ /**
57132
+ * Sets the material used to render models. If set to undefined, the default model or mesh material is used.
57133
+ */
57020
57134
  get modelMaterial() {
57021
57135
  return this._scene.modelMaterial;
57022
57136
  }
57023
57137
  set modelMaterial(material) {
57024
- this._scene.modelMaterial = material;
57138
+ this._scene.modelMaterial = material ?? this.defaultModelMaterial;
57025
57139
  }
57026
57140
  /**
57027
57141
  * Signal dispatched at the end of each frame if the scene was updated, such as visibility changes.
@@ -57157,6 +57271,11 @@ void main() {
57157
57271
  };
57158
57272
  let Viewer$3 = class Viewer {
57159
57273
  constructor(settings2) {
57274
+ /**
57275
+ * The type of the viewer, indicating it is a WebGL viewer.
57276
+ * Useful for distinguishing between different viewer types in a multi-viewer application.
57277
+ */
57278
+ __publicField(this, "type", "webgl");
57160
57279
  /**
57161
57280
  * The settings configuration used by the viewer.
57162
57281
  */
@@ -58834,6 +58953,7 @@ void main() {
58834
58953
  }
58835
58954
  }
58836
58955
  const CODE_TO_KEYCODE = {
58956
+ "Space": 32,
58837
58957
  "ArrowUp": 38,
58838
58958
  "ArrowDown": 40,
58839
58959
  "ArrowLeft": 37,
@@ -58854,7 +58974,6 @@ void main() {
58854
58974
  function createAdapter$1(viewer) {
58855
58975
  return {
58856
58976
  init: () => {
58857
- viewer.rpc.RPCSetCameraSpeed(10);
58858
58977
  },
58859
58978
  orbitCamera: (value) => {
58860
58979
  },
@@ -58867,6 +58986,9 @@ void main() {
58867
58986
  toggleOrthographic: () => {
58868
58987
  console.log("toggleOrthographic. Not supported yet");
58869
58988
  },
58989
+ toggleCameraOrbitMode: () => {
58990
+ viewer.rpc.RPCKeyEvent(CODE_TO_KEYCODE["Space"], true);
58991
+ },
58870
58992
  resetCamera: () => {
58871
58993
  viewer.camera.restoreSavedPosition();
58872
58994
  },
@@ -60835,6 +60957,12 @@ Averrage Date/Second ${avgDataRatePS} kb
60835
60957
  this._rpc.RPCSetCameraAspectRatio(this.canvas.offsetWidth, this.canvas.offsetHeight);
60836
60958
  }
60837
60959
  }
60960
+ /**
60961
+ * Resizes the viewport to match its parent's dimensions
60962
+ */
60963
+ resizeToParent() {
60964
+ this.update();
60965
+ }
60838
60966
  /**
60839
60967
  * Cleans up resources by removing resize observer and clearing timeouts
60840
60968
  */
@@ -60893,11 +61021,12 @@ Averrage Date/Second ${avgDataRatePS} kb
60893
61021
  * @returns A promise resolving to the element's bounding box.
60894
61022
  */
60895
61023
  async getBoundingBox() {
60896
- return this.vim.getBoundingBoxNodes([this.element]);
61024
+ return this.vim.getBoundingBoxForElements([this.element]);
60897
61025
  }
60898
61026
  }
60899
61027
  class Vim {
60900
61028
  constructor(rpc, color, renderer, source, logger) {
61029
+ __publicField(this, "type", "ultra");
60901
61030
  __publicField(this, "source");
60902
61031
  __publicField(this, "_handle", -1);
60903
61032
  __publicField(this, "_request");
@@ -60911,6 +61040,7 @@ Averrage Date/Second ${avgDataRatePS} kb
60911
61040
  // Color tracking remains unchanged.
60912
61041
  __publicField(this, "_elementColors", /* @__PURE__ */ new Map());
60913
61042
  __publicField(this, "_updatedColors", /* @__PURE__ */ new Set());
61043
+ __publicField(this, "_removedColors", /* @__PURE__ */ new Set());
60914
61044
  // Delayed update flag.
60915
61045
  __publicField(this, "_updateScheduled", false);
60916
61046
  __publicField(this, "_elementCount", 0);
@@ -61048,14 +61178,14 @@ Averrage Date/Second ${avgDataRatePS} kb
61048
61178
  }
61049
61179
  return handle;
61050
61180
  }
61051
- async getBoundingBoxNodes(nodes) {
61052
- if (!this.connected || nodes !== "all" && nodes.length === 0) {
61181
+ async getBoundingBoxForElements(elements) {
61182
+ if (!this.connected || elements !== "all" && elements.length === 0) {
61053
61183
  return Promise.resolve(void 0);
61054
61184
  }
61055
- if (nodes === "all") {
61185
+ if (elements === "all") {
61056
61186
  return await this._rpc.RPCGetAABBForVim(this._handle);
61057
61187
  }
61058
- return await this._rpc.RPCGetAABBForElements(this._handle, nodes);
61188
+ return await this._rpc.RPCGetAABBForElements(this._handle, elements);
61059
61189
  }
61060
61190
  async getBoundingBox() {
61061
61191
  if (!this.connected) {
@@ -61076,16 +61206,18 @@ Averrage Date/Second ${avgDataRatePS} kb
61076
61206
  }
61077
61207
  this.applyColor(elements, color);
61078
61208
  }
61079
- applyColor(elements, color) {
61080
- for (let i2 = 0; i2 < color.length; i2++) {
61081
- const c = color[i2];
61209
+ applyColor(elements, colors) {
61210
+ for (let i2 = 0; i2 < colors.length; i2++) {
61211
+ const color = colors[i2];
61082
61212
  const element = elements[i2];
61083
- if (c === void 0) {
61213
+ const existingColor = this._elementColors.get(element);
61214
+ if (color === void 0 && existingColor !== void 0) {
61084
61215
  this._elementColors.delete(element);
61085
- } else {
61086
- this._elementColors.set(element, c);
61216
+ this._removedColors.add(element);
61217
+ } else if (color !== existingColor) {
61218
+ this._elementColors.set(element, color);
61219
+ this._updatedColors.add(element);
61087
61220
  }
61088
- this._updatedColors.add(element);
61089
61221
  }
61090
61222
  this.scheduleColorUpdate();
61091
61223
  }
@@ -61105,6 +61237,7 @@ Averrage Date/Second ${avgDataRatePS} kb
61105
61237
  }
61106
61238
  reapplyColors() {
61107
61239
  this._updatedColors.clear();
61240
+ this._removedColors.clear();
61108
61241
  this._elementColors.forEach((c, n) => this._updatedColors.add(n));
61109
61242
  this.scheduleColorUpdate();
61110
61243
  }
@@ -61121,12 +61254,15 @@ Averrage Date/Second ${avgDataRatePS} kb
61121
61254
  this._renderer.notifySceneUpdated();
61122
61255
  }
61123
61256
  async updateRemoteColors() {
61124
- const elements = Array.from(this._updatedColors);
61125
- const colors = elements.map((n) => this._elementColors.get(n));
61257
+ const updatedElement = Array.from(this._updatedColors);
61258
+ const removedElement = Array.from(this._removedColors);
61259
+ const colors = updatedElement.map((n) => this._elementColors.get(n));
61126
61260
  const remoteColors = await this._colors.getColors(colors);
61127
61261
  const colorIds = remoteColors.map((c) => (c == null ? void 0 : c.id) ?? -1);
61128
- this._rpc.RPCSetMaterialOverridesForElements(this._handle, elements, colorIds);
61262
+ this._rpc.RPCClearMaterialOverridesForElements(this._handle, removedElement);
61263
+ this._rpc.RPCSetMaterialOverridesForElements(this._handle, updatedElement, colorIds);
61129
61264
  this._updatedColors.clear();
61265
+ this._removedColors.clear();
61130
61266
  }
61131
61267
  }
61132
61268
  function wait(ms) {
@@ -61203,6 +61339,11 @@ Averrage Date/Second ${avgDataRatePS} kb
61203
61339
  * @param logger - Optional logger for logging messages.
61204
61340
  */
61205
61341
  constructor(canvas, logger) {
61342
+ /**
61343
+ * The type of the viewer, indicating it is a WebGL viewer.
61344
+ * Useful for distinguishing between different viewer types in a multi-viewer application.
61345
+ */
61346
+ __publicField(this, "type", "ultra");
61206
61347
  __publicField(this, "_decoder");
61207
61348
  __publicField(this, "_socketClient");
61208
61349
  __publicField(this, "_input");
@@ -61463,80 +61604,72 @@ Averrage Date/Second ${avgDataRatePS} kb
61463
61604
  Ultra: index$7,
61464
61605
  Webgl: index$8
61465
61606
  }, Symbol.toStringTag, { value: "Module" }));
61466
- const sectionSelection = "controlBar.sectionSelection";
61467
- const sectionCamera = "controlBar.sectionCamera";
61468
- const sectionInputs = "controlBar.sectionInputs";
61469
- const sectionActions = "controlBar.sectionActions";
61470
- const sectionTools = "controlBar.sectionTools";
61471
- const sectionSettings = "controlBar.sectionSettings";
61472
- const sectionMeasure = "controlBar.sectionMeasure";
61473
- const sectionSectionBox = "controlBar.sectionSectionBox";
61474
- const buttonCameraFrameSelection = "controlBar.camera.frameSelection";
61475
- const buttonCameraFrameScene = "controlBar.camera.frameScene";
61476
- const buttonCameraAuto = "controlBar.camera.auto";
61477
- const buttonCameraOrbit = "controlBar.camera.orbit";
61478
- const buttonCameraLook = "controlBarcamera.look";
61479
- const buttonCameraPan = "controlBar.camera.pan";
61480
- const buttonCameraZoom = "controlBar.camera.zoom";
61481
- const buttonCameraZoomWindow = "controlBar.camera.zoomWindow";
61482
- const buttonProjectInspector = "controlBar.projectInspector";
61483
- const buttonSettings = "controlBar.settings";
61484
- const buttonHelp = "controlBar.help";
61485
- const buttonMaximize = "controlBar.maximize";
61486
- const buttonClearSelection = "controlBar.action.clearSelection";
61487
- const buttonShowAll = "controlBar.selection.showAll";
61488
- const buttonIsolateSelection = "controlBar.selection.isolate";
61489
- const buttonHideSelection = "controlBar.selection.hide";
61490
- const buttonShowSelection = "controlBar.selection.show";
61491
- const buttonAutoIsolate = "controlBar.selection.autoIsolate";
61492
- const buttonIsolationSettings = "controlBar.selection.isolationSettings";
61493
- const buttonRenderSettings = "controlBar.action.renderSettings";
61494
- const buttonSectionBox = "controlBar.sectionBox";
61495
- const buttonMeasure = "controlBar.measure";
61496
- const buttonSectionBoxEnable = "controlBar.sectionBox.enable";
61497
- const buttonSectionBoxVisible = "controlBar.sectionBox.visible";
61498
- const buttonSectionBoxToSelection = "controlBar.sectionBox.sectionSelection";
61499
- const buttonSectionBoxToScene = "controlBar.sectionBox.sectionScene";
61500
- const buttonSectionBoxAuto = "controlBar.sectionBox.auto";
61501
- const buttonSectionBoxSettings = "controlBar.sectionBox.settings";
61607
+ const cameraSpan = "controlBar.cameraSpan";
61608
+ const cameraFrameSelection = "controlBar.cameraFrameSelection";
61609
+ const cameraFrameScene = "controlBar.cameraFrameScene";
61610
+ const cameraAuto = "controlBar.cameraAuto";
61611
+ const cursorSpan = "controlBar.cursorSpan";
61612
+ const cursorOrbit = "controlBar.cursorOrbit";
61613
+ const cursorLook = "controlBar.cursorLook";
61614
+ const cursorPan = "controlBar.cursorPan";
61615
+ const cursorZoom = "controlBar.cursorZoom";
61616
+ const cursorZoomWindow = "controlBar.cursorZoomWindow";
61617
+ const visibilitySpan = "controlBar.visibilitySpan";
61618
+ const visibilityClearSelection = "controlBar.visibilityClearSelection";
61619
+ const visibilityShowAll = "controlBar.visibilityShowAll";
61620
+ const visibilityIsolateSelection = "controlBar.visibilityIsolateSelection";
61621
+ const visibilityHideSelection = "controlBar.visibilityHideSelection";
61622
+ const visibilityShowSelection = "controlBar.visibilityShowSelection";
61623
+ const visibilityAutoIsolate = "controlBar.visibilityAutoIsolate";
61624
+ const visibilitySettings = "controlBar.visibilitySettings";
61625
+ const sectioningSpan = "controlBar.sectioningSpan";
61626
+ const sectioningEnable = "controlBar.sectioningEnable";
61627
+ const sectioningVisible = "controlBar.sectioningVisible";
61628
+ const sectioningFitSelection = "controlBar.sectioningFitSelection";
61629
+ const sectioningFitScene = "controlBar.sectioningFitScene";
61630
+ const sectioningAuto = "controlBar.sectioningAuto";
61631
+ const sectioningSettings = "controlBar.sectioningSettings";
61632
+ const measureSpan = "controlBar.measureSpan";
61633
+ const measureEnable = "controlBar.measureEnable";
61634
+ const miscSpan = "controlBar.miscSpan";
61635
+ const miscInspector = "controlBar.miscInspector";
61636
+ const miscSettings = "controlBar.miscSettings";
61637
+ const miscHelp = "controlBar.miscHelp";
61638
+ const miscMaximize = "controlBar.miscMaximize";
61502
61639
  const controlBarIds = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
61503
61640
  __proto__: null,
61504
- buttonAutoIsolate,
61505
- buttonCameraAuto,
61506
- buttonCameraFrameScene,
61507
- buttonCameraFrameSelection,
61508
- buttonCameraLook,
61509
- buttonCameraOrbit,
61510
- buttonCameraPan,
61511
- buttonCameraZoom,
61512
- buttonCameraZoomWindow,
61513
- buttonClearSelection,
61514
- buttonHelp,
61515
- buttonHideSelection,
61516
- buttonIsolateSelection,
61517
- buttonIsolationSettings,
61518
- buttonMaximize,
61519
- buttonMeasure,
61520
- buttonProjectInspector,
61521
- buttonRenderSettings,
61522
- buttonSectionBox,
61523
- buttonSectionBoxAuto,
61524
- buttonSectionBoxEnable,
61525
- buttonSectionBoxSettings,
61526
- buttonSectionBoxToScene,
61527
- buttonSectionBoxToSelection,
61528
- buttonSectionBoxVisible,
61529
- buttonSettings,
61530
- buttonShowAll,
61531
- buttonShowSelection,
61532
- sectionActions,
61533
- sectionCamera,
61534
- sectionInputs,
61535
- sectionMeasure,
61536
- sectionSectionBox,
61537
- sectionSelection,
61538
- sectionSettings,
61539
- sectionTools
61641
+ cameraAuto,
61642
+ cameraFrameScene,
61643
+ cameraFrameSelection,
61644
+ cameraSpan,
61645
+ cursorLook,
61646
+ cursorOrbit,
61647
+ cursorPan,
61648
+ cursorSpan,
61649
+ cursorZoom,
61650
+ cursorZoomWindow,
61651
+ measureEnable,
61652
+ measureSpan,
61653
+ miscHelp,
61654
+ miscInspector,
61655
+ miscMaximize,
61656
+ miscSettings,
61657
+ miscSpan,
61658
+ sectioningAuto,
61659
+ sectioningEnable,
61660
+ sectioningFitScene,
61661
+ sectioningFitSelection,
61662
+ sectioningSettings,
61663
+ sectioningSpan,
61664
+ sectioningVisible,
61665
+ visibilityAutoIsolate,
61666
+ visibilityClearSelection,
61667
+ visibilityHideSelection,
61668
+ visibilityIsolateSelection,
61669
+ visibilitySettings,
61670
+ visibilityShowAll,
61671
+ visibilityShowSelection,
61672
+ visibilitySpan
61540
61673
  }, Symbol.toStringTag, { value: "Module" }));
61541
61674
  const baseSectionStyle = "vc-flex vc-items-center vc-rounded-full vc-mb-2 vc-shadow-md";
61542
61675
  const sectionDefaultStyle = baseSectionStyle + " vc-bg-white";
@@ -63629,50 +63762,6 @@ Averrage Date/Second ${avgDataRatePS} kb
63629
63762
  visible,
63630
63763
  zoom
63631
63764
  }, Symbol.toStringTag, { value: "Module" }));
63632
- function getDefaultSettings() {
63633
- return {
63634
- capacity: {
63635
- canFollowUrl: true,
63636
- canGoFullScreen: true,
63637
- canDownload: true,
63638
- canReadLocalStorage: true
63639
- },
63640
- ui: {
63641
- logo: true,
63642
- performance: false,
63643
- bimTreePanel: true,
63644
- bimInfoPanel: true,
63645
- // axesPanel
63646
- axesPanel: true,
63647
- orthographic: true,
63648
- resetCamera: true,
63649
- // Control bar
63650
- controlBar: true,
63651
- // Control bar - cursors
63652
- orbit: true,
63653
- lookAround: true,
63654
- pan: true,
63655
- zoom: true,
63656
- zoomWindow: true,
63657
- // Control bar - camera
63658
- autoCamera: true,
63659
- frameScene: true,
63660
- frameSelection: true,
63661
- // Control bar - tools
63662
- sectioningMode: true,
63663
- measuringMode: true,
63664
- toggleIsolation: true,
63665
- // Control bar - settings
63666
- projectInspector: true,
63667
- settings: true,
63668
- help: true,
63669
- maximise: true
63670
- }
63671
- };
63672
- }
63673
- function createSettings(settings2) {
63674
- return settings2 !== void 0 ? deepmerge(getDefaultSettings(), settings2) : getDefaultSettings();
63675
- }
63676
63765
  function getLocalSettings(settings2 = {}) {
63677
63766
  try {
63678
63767
  const json = localStorage.getItem("viewer.settings");
@@ -63727,8 +63816,6 @@ Averrage Date/Second ${avgDataRatePS} kb
63727
63816
  }
63728
63817
  const index$4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
63729
63818
  __proto__: null,
63730
- createSettings,
63731
- getDefaultSettings,
63732
63819
  getLocalSettings,
63733
63820
  isFalse,
63734
63821
  isTrue,
@@ -67264,7 +67351,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67264
67351
  return value.some(isTrue) ? element : null;
67265
67352
  }
67266
67353
  function anyUiAxesButton(settings2) {
67267
- return settings2.ui.orthographic || settings2.ui.resetCamera;
67354
+ return settings2.ui.axesOrthographic || settings2.ui.axesHome;
67268
67355
  }
67269
67356
  const AxesPanelMemo = React2.memo(AxesPanel);
67270
67357
  function AxesPanel(props) {
@@ -67324,15 +67411,15 @@ Averrage Date/Second ${avgDataRatePS} kb
67324
67411
  children: ortho ? /* @__PURE__ */ jsxRuntimeExports.jsx(orthographic, { height: 20, width: 20, fill: "currentColor" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(perspective, { height: 20, width: 20, fill: "currentColor" })
67325
67412
  }
67326
67413
  );
67327
- const hidden2 = isTrue(props.settings.value.ui.axesPanel) ? "" : " vc-hidden";
67414
+ const hidden2 = isTrue(props.settings.value.ui.panelAxes) ? "" : " vc-hidden";
67328
67415
  const empty2 = !anyUiAxesButton(props.settings.value);
67329
67416
  const createBar = () => {
67330
67417
  if (empty2) return null;
67331
67418
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "vim-axes-panel-bar vc-absolute vc-top-[75%] vc-bottom-0 vc-right-0 vc-left-0", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vim-axes-panel-buttons vc-absolute vc-inset-0 vc-pointer-events-auto vc-order-2 vc-flex vc-items-center vc-justify-evenly vc-bg-white", children: [
67332
67419
  whenAllTrue([
67333
- props.settings.value.ui.orthographic
67420
+ props.settings.value.ui.axesOrthographic
67334
67421
  ], btnOrtho),
67335
- whenTrue(props.settings.value.ui.resetCamera, btnHome)
67422
+ whenTrue(props.settings.value.ui.axesHome, btnHome)
67336
67423
  ] }) });
67337
67424
  };
67338
67425
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
@@ -67560,77 +67647,78 @@ Averrage Date/Second ${avgDataRatePS} kb
67560
67647
  }
67561
67648
  const Style = style;
67562
67649
  const Ids$2 = controlBarIds;
67563
- function controlBarSectionBox(section, hasSelection) {
67650
+ function controlBarSectionBox(section, hasSelection, settings2) {
67564
67651
  return {
67565
- id: Ids$2.sectionSectionBox,
67652
+ id: Ids$2.sectioningSpan,
67566
67653
  style: section.enable.get() ? Style.sectionNoPadStyle : Style.sectionDefaultStyle,
67567
67654
  //enable: () => section.getEnable(),
67568
67655
  buttons: [
67569
67656
  {
67570
- id: Ids$2.buttonSectionBoxEnable,
67657
+ id: Ids$2.sectioningEnable,
67658
+ enabled: () => isTrue(settings2.sectioningEnable),
67571
67659
  tip: "Enable Section Box",
67572
67660
  isOn: () => section.enable.get(),
67573
- style: (on) => Style.buttonExpandStyle(on),
67661
+ style: Style.buttonExpandStyle,
67574
67662
  action: () => section.enable.set(!section.enable.get()),
67575
67663
  icon: sectionBox
67576
67664
  },
67577
67665
  {
67578
- id: Ids$2.buttonSectionBoxToSelection,
67666
+ id: Ids$2.sectioningFitSelection,
67579
67667
  tip: "Fit Section",
67580
- enabled: () => section.enable.get(),
67668
+ enabled: () => section.enable.get() && isTrue(settings2.sectioningFitToSelection),
67581
67669
  isOn: () => hasSelection,
67582
- style: (on) => Style.buttonDisableStyle(on),
67670
+ style: Style.buttonDisableStyle,
67583
67671
  action: () => section.sectionSelection.call(),
67584
67672
  icon: sectionBoxShrink
67585
67673
  },
67586
67674
  {
67587
- id: Ids$2.buttonSectionBoxToScene,
67675
+ id: Ids$2.sectioningFitScene,
67588
67676
  tip: "Reset Section",
67589
- enabled: () => section.enable.get(),
67590
- style: (on) => Style.buttonDefaultStyle(on),
67677
+ enabled: () => section.enable.get() && isTrue(settings2.sectioningReset),
67678
+ style: Style.buttonDefaultStyle,
67591
67679
  action: () => section.sectionScene.call(),
67592
67680
  icon: sectionBoxReset
67593
67681
  },
67594
67682
  {
67595
- id: Ids$2.buttonSectionBoxVisible,
67683
+ id: Ids$2.sectioningVisible,
67596
67684
  tip: "Show Section Box",
67597
- enabled: () => section.enable.get(),
67685
+ enabled: () => section.enable.get() && isTrue(settings2.sectioningShow),
67598
67686
  isOn: () => section.visible.get(),
67599
- style: (on) => Style.buttonDefaultStyle(on),
67687
+ style: Style.buttonDefaultStyle,
67600
67688
  action: () => section.visible.set(!section.visible.get()),
67601
67689
  icon: visible
67602
67690
  },
67603
67691
  {
67604
- id: Ids$2.buttonSectionBoxAuto,
67692
+ id: Ids$2.sectioningAuto,
67605
67693
  tip: "Auto Section",
67606
- enabled: () => section.enable.get(),
67694
+ enabled: () => section.enable.get() && isTrue(settings2.sectioningAuto),
67607
67695
  isOn: () => section.auto.get(),
67608
- style: (on) => Style.buttonDefaultStyle(on),
67696
+ style: Style.buttonDefaultStyle,
67609
67697
  action: () => section.auto.set(!section.auto.get()),
67610
67698
  icon: sectionBoxAuto
67611
67699
  },
67612
67700
  {
67613
- id: Ids$2.buttonSectionBoxSettings,
67701
+ id: Ids$2.sectioningSettings,
67614
67702
  tip: "Section Settings",
67615
- enabled: () => section.enable.get(),
67703
+ enabled: () => section.enable.get() && isTrue(settings2.sectioningSettings),
67616
67704
  isOn: () => section.showOffsetPanel.get(),
67617
- style: (on) => Style.buttonDefaultStyle(on),
67705
+ style: Style.buttonDefaultStyle,
67618
67706
  action: () => section.showOffsetPanel.set(!section.showOffsetPanel.get()),
67619
67707
  icon: slidersHoriz
67620
67708
  }
67621
67709
  ]
67622
67710
  };
67623
67711
  }
67624
- function controlBarPointer(viewer, camera2, settings2, section) {
67712
+ function controlBarPointer(viewer, settings2) {
67625
67713
  const pointer2 = getPointerState(viewer);
67626
67714
  return {
67627
- id: Ids$2.sectionInputs,
67715
+ id: Ids$2.cursorSpan,
67628
67716
  enable: () => anyUiCursorButton(settings2),
67629
67717
  style: Style.sectionDefaultStyle,
67630
67718
  buttons: [
67631
67719
  {
67632
- id: Ids$2.buttonCameraOrbit,
67633
- enabled: () => isTrue(settings2.ui.orbit),
67720
+ id: Ids$2.cursorOrbit,
67721
+ enabled: () => isTrue(settings2.cursorOrbit),
67634
67722
  tip: "Orbit",
67635
67723
  action: () => pointer2.onButton(PointerMode$1.ORBIT),
67636
67724
  icon: orbit,
@@ -67638,8 +67726,8 @@ Averrage Date/Second ${avgDataRatePS} kb
67638
67726
  style: Style.buttonDefaultStyle
67639
67727
  },
67640
67728
  {
67641
- id: Ids$2.buttonCameraLook,
67642
- enabled: () => isTrue(settings2.ui.lookAround),
67729
+ id: Ids$2.cursorLook,
67730
+ enabled: () => isTrue(settings2.cursorLookAround),
67643
67731
  tip: "Look Around",
67644
67732
  action: () => pointer2.onButton(PointerMode$1.LOOK),
67645
67733
  icon: look,
@@ -67647,8 +67735,8 @@ Averrage Date/Second ${avgDataRatePS} kb
67647
67735
  style: Style.buttonDefaultStyle
67648
67736
  },
67649
67737
  {
67650
- id: Ids$2.buttonCameraPan,
67651
- enabled: () => isTrue(settings2.ui.pan),
67738
+ id: Ids$2.cursorPan,
67739
+ enabled: () => isTrue(settings2.cursorPan),
67652
67740
  tip: "Pan",
67653
67741
  action: () => pointer2.onButton(PointerMode$1.PAN),
67654
67742
  icon: pan,
@@ -67656,8 +67744,8 @@ Averrage Date/Second ${avgDataRatePS} kb
67656
67744
  style: Style.buttonDefaultStyle
67657
67745
  },
67658
67746
  {
67659
- id: Ids$2.buttonCameraZoom,
67660
- enabled: () => isTrue(settings2.ui.zoom),
67747
+ id: Ids$2.cursorZoom,
67748
+ enabled: () => isTrue(settings2.cursorZoom),
67661
67749
  tip: "Zoom",
67662
67750
  action: () => pointer2.onButton(PointerMode$1.ZOOM),
67663
67751
  icon: zoom,
@@ -67667,15 +67755,15 @@ Averrage Date/Second ${avgDataRatePS} kb
67667
67755
  ]
67668
67756
  };
67669
67757
  }
67670
- function controlBarMeasure(settings2, measure$1) {
67758
+ function controlBarMeasure(measure$1, settings2) {
67671
67759
  return {
67672
- id: Ids$2.sectionActions,
67760
+ id: Ids$2.measureSpan,
67673
67761
  enable: () => true,
67674
67762
  style: Style.sectionDefaultStyle,
67675
67763
  buttons: [
67676
67764
  {
67677
- id: Ids$2.buttonMeasure,
67678
- enabled: () => isTrue(settings2.ui.measuringMode),
67765
+ id: Ids$2.measureEnable,
67766
+ enabled: () => isTrue(settings2.measureEnable),
67679
67767
  isOn: () => measure$1.active,
67680
67768
  tip: "Measuring Mode",
67681
67769
  action: () => measure$1.toggle(),
@@ -67685,40 +67773,57 @@ Averrage Date/Second ${avgDataRatePS} kb
67685
67773
  ]
67686
67774
  };
67687
67775
  }
67688
- function controlBarSettings(modal, side, settings$1) {
67776
+ function createMiscSettingsButton(side, settings$1) {
67777
+ return {
67778
+ id: Ids$2.miscSettings,
67779
+ enabled: () => isTrue(settings$1.ui.miscSettings),
67780
+ tip: "Settings",
67781
+ action: () => side.toggleContent("settings"),
67782
+ icon: settings,
67783
+ style: Style.buttonDefaultStyle
67784
+ };
67785
+ }
67786
+ function createMiscHelpButton(modal, settings2) {
67787
+ return {
67788
+ id: Ids$2.miscHelp,
67789
+ enabled: () => isTrue(settings2.ui.miscHelp),
67790
+ tip: "Help",
67791
+ action: () => modal.help(true),
67792
+ icon: help,
67793
+ style: Style.buttonDefaultStyle
67794
+ };
67795
+ }
67796
+ function controlBarMiscUltra(modal, side, settings2) {
67797
+ return {
67798
+ id: Ids$2.miscSpan,
67799
+ enable: () => anyUltraMiscButton(settings2),
67800
+ style: Style.sectionDefaultStyle,
67801
+ buttons: [
67802
+ createMiscSettingsButton(side, settings2),
67803
+ createMiscHelpButton(modal, settings2)
67804
+ ]
67805
+ };
67806
+ }
67807
+ function controlBarMisc(modal, side, settings2) {
67689
67808
  const fullScreen = getFullScreenState();
67690
67809
  return {
67691
- id: Ids$2.sectionSettings,
67692
- enable: () => anyUiSettingButton(settings$1),
67810
+ id: Ids$2.miscSpan,
67811
+ enable: () => anyWebglMiscButton(settings2),
67693
67812
  style: Style.sectionDefaultStyle,
67694
67813
  buttons: [
67695
67814
  {
67696
- id: Ids$2.buttonProjectInspector,
67697
- enabled: () => isTrue(settings$1.ui.projectInspector) && (isTrue(settings$1.ui.bimTreePanel) || isTrue(settings$1.ui.bimInfoPanel)),
67815
+ id: Ids$2.miscInspector,
67816
+ enabled: () => showBimButton(settings2),
67698
67817
  tip: "Project Inspector",
67699
67818
  action: () => side.toggleContent("bim"),
67700
67819
  icon: treeView,
67701
67820
  style: Style.buttonDefaultStyle
67702
67821
  },
67822
+ createMiscSettingsButton(side, settings2),
67823
+ createMiscHelpButton(modal, settings2),
67703
67824
  {
67704
- id: Ids$2.buttonSettings,
67705
- enabled: () => isTrue(settings$1.ui.settings),
67706
- tip: "Settings",
67707
- action: () => side.toggleContent("settings"),
67708
- icon: settings,
67709
- style: Style.buttonDefaultStyle
67710
- },
67711
- {
67712
- id: Ids$2.buttonHelp,
67713
- enabled: () => isTrue(settings$1.ui.help),
67714
- tip: "Help",
67715
- action: () => modal.help(true),
67716
- icon: help,
67717
- style: Style.buttonDefaultStyle
67718
- },
67719
- {
67720
- id: Ids$2.buttonMaximize,
67721
- enabled: () => isTrue(settings$1.ui.maximise) && settings$1.capacity.canGoFullScreen,
67825
+ id: Ids$2.miscMaximize,
67826
+ enabled: () => isTrue(settings2.ui.miscMaximise) && settings2.capacity.canGoFullScreen,
67722
67827
  tip: fullScreen.get() ? "Minimize" : "Fullscreen",
67723
67828
  action: () => fullScreen.toggle(),
67724
67829
  icon: fullScreen.get() ? minimize : fullsScreen,
@@ -67727,14 +67832,15 @@ Averrage Date/Second ${avgDataRatePS} kb
67727
67832
  ]
67728
67833
  };
67729
67834
  }
67730
- function controlBarCamera(camera2) {
67835
+ function controlBarCamera(camera2, settings2) {
67731
67836
  return {
67732
- id: Ids$2.sectionCamera,
67837
+ id: Ids$2.cameraSpan,
67733
67838
  enable: () => true,
67734
67839
  style: Style.sectionDefaultStyle,
67735
67840
  buttons: [
67736
67841
  {
67737
- id: Ids$2.buttonCameraAuto,
67842
+ id: Ids$2.cameraAuto,
67843
+ enabled: () => isTrue(settings2.cameraAuto),
67738
67844
  tip: "Auto Camera",
67739
67845
  isOn: () => camera2.autoCamera.get(),
67740
67846
  action: () => camera2.autoCamera.set(!camera2.autoCamera.get()),
@@ -67742,8 +67848,8 @@ Averrage Date/Second ${avgDataRatePS} kb
67742
67848
  style: Style.buttonDefaultStyle
67743
67849
  },
67744
67850
  {
67745
- id: Ids$2.buttonCameraFrameSelection,
67746
- // enabled: () => isTrue(settings.ui.zoomToFit), TODO: Implement ui toggles in Ultra
67851
+ id: Ids$2.cameraFrameSelection,
67852
+ enabled: () => isTrue(settings2.cameraFrameSelection),
67747
67853
  tip: "Frame Selection",
67748
67854
  action: () => camera2.frameSelection.call(),
67749
67855
  icon: frameSelection,
@@ -67751,8 +67857,8 @@ Averrage Date/Second ${avgDataRatePS} kb
67751
67857
  style: Style.buttonDefaultStyle
67752
67858
  },
67753
67859
  {
67754
- id: Ids$2.buttonCameraFrameScene,
67755
- // enabled: () => isTrue(settings.ui.zoomToFit), TODO: Implement ui toggles in Ultra
67860
+ id: Ids$2.cameraFrameScene,
67861
+ enabled: () => isTrue(settings2.cameraFrameScene),
67756
67862
  tip: "Frame All",
67757
67863
  action: () => camera2.frameScene.call(),
67758
67864
  icon: frameScene,
@@ -67762,16 +67868,17 @@ Averrage Date/Second ${avgDataRatePS} kb
67762
67868
  ]
67763
67869
  };
67764
67870
  }
67765
- function controlBarSelection(isolation) {
67871
+ function controlBarVisibility(isolation, settings2) {
67766
67872
  const adapter = isolation.adapter.current;
67767
67873
  const someVisible = adapter.hasVisibleSelection() || !adapter.hasHiddenSelection();
67768
67874
  return {
67769
- id: Ids$2.sectionSelection,
67875
+ id: Ids$2.visibilitySpan,
67770
67876
  enable: () => true,
67771
- style: `${Style.sectionDefaultStyle}`,
67877
+ style: Style.sectionDefaultStyle,
67772
67878
  buttons: [
67773
67879
  {
67774
- id: Ids$2.buttonClearSelection,
67880
+ id: Ids$2.visibilityClearSelection,
67881
+ enabled: () => isTrue(settings2.visibilityClearSelection),
67775
67882
  tip: "Clear Selection",
67776
67883
  action: () => adapter.clearSelection(),
67777
67884
  icon: pointer,
@@ -67779,16 +67886,17 @@ Averrage Date/Second ${avgDataRatePS} kb
67779
67886
  style: Style.buttonDisableDefaultStyle
67780
67887
  },
67781
67888
  {
67782
- id: Ids$2.buttonShowAll,
67889
+ id: Ids$2.visibilityShowAll,
67783
67890
  tip: "Show All",
67891
+ enabled: () => isTrue(settings2.visibilityShowAll),
67784
67892
  action: () => adapter.showAll(),
67785
67893
  icon: showAll,
67786
67894
  isOn: () => !isolation.autoIsolate.get() && isolation.visibility.get() !== "all",
67787
67895
  style: Style.buttonDisableStyle
67788
67896
  },
67789
67897
  {
67790
- id: Ids$2.buttonHideSelection,
67791
- enabled: () => someVisible,
67898
+ id: Ids$2.visibilityHideSelection,
67899
+ enabled: () => someVisible && isTrue(settings2.visibilityToggle),
67792
67900
  tip: "Hide Selection",
67793
67901
  action: () => adapter.hideSelection(),
67794
67902
  icon: hideSelection,
@@ -67796,8 +67904,8 @@ Averrage Date/Second ${avgDataRatePS} kb
67796
67904
  style: Style.buttonDisableStyle
67797
67905
  },
67798
67906
  {
67799
- id: Ids$2.buttonShowSelection,
67800
- enabled: () => !someVisible,
67907
+ id: Ids$2.visibilityShowSelection,
67908
+ enabled: () => !someVisible && isTrue(settings2.visibilityToggle),
67801
67909
  tip: "Show Selection",
67802
67910
  action: () => adapter.showSelection(),
67803
67911
  icon: showSelection,
@@ -67805,7 +67913,8 @@ Averrage Date/Second ${avgDataRatePS} kb
67805
67913
  style: Style.buttonDisableStyle
67806
67914
  },
67807
67915
  {
67808
- id: Ids$2.buttonIsolateSelection,
67916
+ id: Ids$2.visibilityIsolateSelection,
67917
+ enabled: () => isTrue(settings2.visibilityIsolate),
67809
67918
  tip: "Isolate Selection",
67810
67919
  action: () => adapter.isolateSelection(),
67811
67920
  icon: isolateSelection,
@@ -67813,14 +67922,16 @@ Averrage Date/Second ${avgDataRatePS} kb
67813
67922
  style: Style.buttonDisableStyle
67814
67923
  },
67815
67924
  {
67816
- id: Ids$2.buttonAutoIsolate,
67925
+ id: Ids$2.visibilityAutoIsolate,
67926
+ enabled: () => isTrue(settings2.visibilityAutoIsolate),
67817
67927
  tip: "Auto Isolate",
67818
67928
  action: () => isolation.autoIsolate.set(!isolation.autoIsolate.get()),
67819
67929
  isOn: () => isolation.autoIsolate.get(),
67820
67930
  icon: autoIsolate
67821
67931
  },
67822
67932
  {
67823
- id: Ids$2.buttonIsolationSettings,
67933
+ id: Ids$2.visibilitySettings,
67934
+ enabled: () => isTrue(settings2.visibilitySettings),
67824
67935
  tip: "Isolation Settings",
67825
67936
  action: () => isolation.showPanel.set(!isolation.showPanel.get()),
67826
67937
  icon: slidersHoriz,
@@ -67831,28 +67942,31 @@ Averrage Date/Second ${avgDataRatePS} kb
67831
67942
  }
67832
67943
  function useControlBar(viewer, camera2, modal, side, cursor, settings2, section, isolationRef, customization) {
67833
67944
  const measure2 = getMeasureState(viewer, cursor);
67834
- const pointerSection = controlBarPointer(viewer, camera2, settings2);
67835
- const actionSection = controlBarMeasure(settings2, measure2);
67836
- const sectionBoxSection = controlBarSectionBox(section, viewer.selection.any());
67837
- const settingsSection = controlBarSettings(modal, side, settings2);
67838
- const cameraSection = controlBarCamera(camera2);
67839
- const selectionSection = controlBarSelection(isolationRef);
67840
67945
  let controlBarSections = [
67841
- pointerSection,
67842
- actionSection,
67843
- cameraSection,
67844
- sectionBoxSection,
67845
- selectionSection,
67846
- settingsSection
67946
+ controlBarPointer(viewer, settings2.ui),
67947
+ controlBarCamera(camera2, settings2.ui),
67948
+ controlBarVisibility(isolationRef, settings2.ui),
67949
+ controlBarMeasure(measure2, settings2.ui),
67950
+ controlBarSectionBox(section, viewer.selection.any(), settings2.ui),
67951
+ controlBarMisc(modal, side, settings2)
67847
67952
  ];
67848
67953
  controlBarSections = (customization == null ? void 0 : customization(controlBarSections)) ?? controlBarSections;
67849
67954
  return controlBarSections;
67850
67955
  }
67956
+ function showBimButton(settings2) {
67957
+ if (isFalse(settings2.ui.miscProjectInspector)) return false;
67958
+ if (isTrue(settings2.ui.panelBimTree)) return true;
67959
+ if (isTrue(settings2.ui.panelBimInfo)) return true;
67960
+ return false;
67961
+ }
67851
67962
  function anyUiCursorButton(settings2) {
67852
- return isTrue(settings2.ui.orbit) || isTrue(settings2.ui.lookAround) || isTrue(settings2.ui.pan) || isTrue(settings2.ui.zoom) || isTrue(settings2.ui.zoomWindow);
67963
+ return isTrue(settings2.cursorOrbit) || isTrue(settings2.cursorLookAround) || isTrue(settings2.cursorPan) || isTrue(settings2.cursorZoom);
67853
67964
  }
67854
- function anyUiSettingButton(settings2) {
67855
- return isTrue(settings2.ui.projectInspector) || isTrue(settings2.ui.settings) || isTrue(settings2.ui.help) || isTrue(settings2.ui.maximise);
67965
+ function anyWebglMiscButton(settings2) {
67966
+ return isTrue(settings2.ui.miscProjectInspector) || isTrue(settings2.ui.miscSettings) || isTrue(settings2.ui.miscHelp) || isTrue(settings2.ui.miscMaximise);
67967
+ }
67968
+ function anyUltraMiscButton(settings2) {
67969
+ return isTrue(settings2.ui.miscSettings) || isTrue(settings2.ui.miscHelp);
67856
67970
  }
67857
67971
  function RestOfScreen(props) {
67858
67972
  const [, setVersion] = React2.useState(0);
@@ -72753,7 +72867,7 @@ Averrage Date/Second ${avgDataRatePS} kb
72753
72867
  return;
72754
72868
  }
72755
72869
  if (rectElem.top < rectContainer.top || rectElem.top < 0) {
72756
- selection.scrollIntoView();
72870
+ selection.scrollIntoView({ block: "nearest", inline: "nearest" });
72757
72871
  }
72758
72872
  }
72759
72873
  const isControlKey = (e) => {
@@ -72958,8 +73072,8 @@ Averrage Date/Second ${avgDataRatePS} kb
72958
73072
  function OptionalBimPanel(props) {
72959
73073
  return whenSomeTrue(
72960
73074
  [
72961
- props.settings.ui.bimTreePanel,
72962
- props.settings.ui.bimInfoPanel
73075
+ props.settings.ui.panelBimTree,
73076
+ props.settings.ui.panelBimInfo
72963
73077
  ],
72964
73078
  React2.createElement(BimPanel, props)
72965
73079
  );
@@ -72972,11 +73086,11 @@ Averrage Date/Second ${avgDataRatePS} kb
72972
73086
  }, [props.viewerState.vim.get(), props.viewerState.elements.get()]);
72973
73087
  const selection = props.viewerState.selection.get();
72974
73088
  const last = selection[selection.length - 1];
72975
- const fullTree = isFalse(props.settings.ui.bimInfoPanel);
72976
- const fullInfo = isFalse(props.settings.ui.bimTreePanel);
73089
+ const fullTree = isFalse(props.settings.ui.panelBimInfo);
73090
+ const fullInfo = isFalse(props.settings.ui.panelBimTree);
72977
73091
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: `vim-bim-panel vc-inset-0 vc-absolute vc-h-full vc-w-full ${fullTree ? "full-tree" : ""} ${props.visible ? "" : "vc-hidden"}`, children: [
72978
73092
  whenTrue(
72979
- props.settings.ui.bimTreePanel,
73093
+ props.settings.ui.panelBimTree,
72980
73094
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: `vim-bim-upper vc-flex vc-flex-col vc-absolute vc-w-full ${fullTree ? "vc-h-full" : "vc-h-[49%]"} `, children: [
72981
73095
  /* @__PURE__ */ jsxRuntimeExports.jsx(
72982
73096
  "h2",
@@ -73010,21 +73124,21 @@ Averrage Date/Second ${avgDataRatePS} kb
73010
73124
  // Divider if needed.
73011
73125
  whenAllTrue(
73012
73126
  [
73013
- props.settings.ui.bimTreePanel,
73014
- props.settings.ui.bimInfoPanel,
73127
+ props.settings.ui.panelBimTree,
73128
+ props.settings.ui.panelBimInfo,
73015
73129
  ((_b2 = props.viewerState.elements.get()) == null ? void 0 : _b2.length) > 0
73016
73130
  ],
73017
73131
  divider$1()
73018
73132
  ),
73019
73133
  whenTrue(
73020
- props.settings.ui.bimInfoPanel,
73134
+ props.settings.ui.panelBimInfo,
73021
73135
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `vim-bim-lower-container vc-absolute ${fullInfo ? "vc-top-0" : "vc-top-[50%]"} vc-bottom-0 vc-bottom vc-left-0 vc-right-0`, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
73022
73136
  BimInfoPanel,
73023
73137
  {
73024
73138
  object: last,
73025
73139
  vim: props.viewerState.vim.get(),
73026
73140
  elements: props.viewerState.elements.get(),
73027
- full: isFalse(props.settings.ui.bimTreePanel),
73141
+ full: isFalse(props.settings.ui.panelBimTree),
73028
73142
  bimInfoRef: props.bimInfoRef
73029
73143
  }
73030
73144
  ) })
@@ -73864,7 +73978,7 @@ Averrage Date/Second ${avgDataRatePS} kb
73864
73978
  } else {
73865
73979
  props.container.gfx.style.left = "0px";
73866
73980
  }
73867
- props.viewer.viewport.ResizeToParent();
73981
+ props.viewer.viewport.resizeToParent();
73868
73982
  };
73869
73983
  const getMaxSize = () => {
73870
73984
  return props.container.root.clientWidth * MAX_WIDTH;
@@ -73923,7 +74037,10 @@ Averrage Date/Second ${avgDataRatePS} kb
73923
74037
  style: {
73924
74038
  position: "absolute"
73925
74039
  },
73926
- className: `vim-side-panel vc-top-0 vc-left-0 vc-z-20 vc-bg-gray-lightest vc-text-gray-darker ${props.side.getContent() !== "none" ? "" : "vc-hidden"}`,
74040
+ className: `vim-side-panel vc-top-0 vc-left-0 vc-z-20
74041
+ vc-bg-gray-lightest vc-text-gray-darker
74042
+ vc-border-r vc-border-gray-light
74043
+ ${props.side.getContent() !== "none" ? "" : "vc-hidden"}`,
73927
74044
  children: [
73928
74045
  /* @__PURE__ */ jsxRuntimeExports.jsx(
73929
74046
  "button",
@@ -74006,180 +74123,6 @@ Averrage Date/Second ${avgDataRatePS} kb
74006
74123
  [side, width]
74007
74124
  );
74008
74125
  }
74009
- function SettingsPanel(props) {
74010
- if (!props.visible) return null;
74011
- const toggleElement = (label, state, action) => {
74012
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "vc-m-1 vc-block vc-select-none vc-items-center vc-py-1 vc-text-gray-warm", children: [
74013
- /* @__PURE__ */ jsxRuntimeExports.jsx(
74014
- "input",
74015
- {
74016
- type: "checkbox",
74017
- checked: state,
74018
- onChange: action,
74019
- className: "vim-settings-checkbox vc-checked:bg-primary-royal vc-mr-2 vc-rounded vc-border vc-border-gray-medium "
74020
- }
74021
- ),
74022
- " ",
74023
- label
74024
- ] });
74025
- };
74026
- const settingsToggle = (label, getter, setter) => {
74027
- const value = getter(props.settings.value);
74028
- if (value === "AlwaysTrue" || value === "AlwaysFalse") {
74029
- return null;
74030
- }
74031
- return toggleElement(label, value, () => {
74032
- const value2 = getter(props.settings.value);
74033
- props.settings.update((s) => setter(s, !value2));
74034
- });
74035
- };
74036
- const settingsBox = (label, info, transform, getter, setter) => {
74037
- const ref = React2.useRef(null);
74038
- React2.useEffect(() => {
74039
- ref.current.value = props.viewer.inputs.scrollSpeed.toFixed(2);
74040
- }, []);
74041
- getter(props.settings.value).toString();
74042
- const update = (event) => {
74043
- const str = event.target.value;
74044
- const n = Number.parseFloat(str);
74045
- if (Number.isNaN(n)) {
74046
- event.target.value = getter(props.settings.value).toString();
74047
- } else {
74048
- const value2 = transform(n);
74049
- event.target.value = value2.toString();
74050
- props.settings.update((s) => setter(s, value2));
74051
- }
74052
- };
74053
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vc-box-input vc-my-1", children: [
74054
- /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { htmlFor: "textbox", className: "vc-w-3 vc-h-2", children: [
74055
- label,
74056
- ":"
74057
- ] }),
74058
- /* @__PURE__ */ jsxRuntimeExports.jsx("input", { ref, type: "text", className: "vim-settings-textbox vc-w-14 vc-ml-1 vc-p-1", onBlur: (e) => update(e) }),
74059
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { htmlFor: "textbox", className: "vc-w-3 vc-h-2 vc-text-gray vc-ml-1", children: info })
74060
- ] });
74061
- };
74062
- function settingsSubtitle(title2) {
74063
- return /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "vc-subtitle", children: title2 });
74064
- }
74065
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
74066
- "div",
74067
- {
74068
- className: "vc-absolute vc-inset-0",
74069
- children: [
74070
- /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "vc-title", children: "Settings " }),
74071
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vim-settings vc-absolute vc-top-6 vc-left-0 vc-bottom-0 vc-right-0 vc-overflow-y-auto", children: [
74072
- settingsSubtitle("Inputs"),
74073
- settingsBox(
74074
- "Scroll Speed",
74075
- "[0.1,10]",
74076
- (n) => MathUtils.clamp(n, 0.1, 10),
74077
- (s) => props.viewer.inputs.scrollSpeed,
74078
- (s, v) => {
74079
- props.viewer.inputs.scrollSpeed = v;
74080
- }
74081
- ),
74082
- settingsSubtitle("Panels"),
74083
- settingsToggle(
74084
- "Show Logo",
74085
- (settings2) => settings2.ui.logo,
74086
- (settings2, value) => settings2.ui.logo = value
74087
- ),
74088
- settingsToggle(
74089
- "Show Bim Tree",
74090
- (settings2) => settings2.ui.bimTreePanel,
74091
- (settings2, value) => settings2.ui.bimTreePanel = value
74092
- ),
74093
- settingsToggle(
74094
- "Show Bim Info",
74095
- (settings2) => settings2.ui.bimInfoPanel,
74096
- (settings2, value) => settings2.ui.bimInfoPanel = value
74097
- ),
74098
- settingsToggle(
74099
- "Show Axes Panel",
74100
- (settings2) => settings2.ui.axesPanel,
74101
- (settings2, value) => settings2.ui.axesPanel = value
74102
- ),
74103
- settingsToggle(
74104
- "Show Performance Panel",
74105
- (settings2) => settings2.ui.performance,
74106
- (settings2, value) => settings2.ui.performance = value
74107
- ),
74108
- settingsSubtitle("Axes"),
74109
- settingsToggle(
74110
- "Show Orthographic Button",
74111
- (settings2) => settings2.ui.orthographic,
74112
- (settings2, value) => settings2.ui.orthographic = value
74113
- ),
74114
- settingsToggle(
74115
- "Show Reset Camera Button",
74116
- (settings2) => settings2.ui.resetCamera,
74117
- (settings2, value) => settings2.ui.resetCamera = value
74118
- ),
74119
- settingsSubtitle("Control Bar"),
74120
- settingsToggle(
74121
- "Show Control Bar",
74122
- (settings2) => settings2.ui.controlBar,
74123
- (settings2, value) => settings2.ui.controlBar = value
74124
- ),
74125
- settingsSubtitle("Control Bar - Cursors"),
74126
- settingsToggle(
74127
- "Show Orbit Button",
74128
- (settings2) => settings2.ui.orbit,
74129
- (settings2, value) => settings2.ui.orbit = value
74130
- ),
74131
- settingsToggle(
74132
- "Show Look Around Button",
74133
- (settings2) => settings2.ui.lookAround,
74134
- (settings2, value) => settings2.ui.lookAround = value
74135
- ),
74136
- settingsToggle(
74137
- "Show Pan Button",
74138
- (settings2) => settings2.ui.pan,
74139
- (settings2, value) => settings2.ui.pan = value
74140
- ),
74141
- settingsToggle(
74142
- "Show Zoom Button",
74143
- (settings2) => settings2.ui.zoom,
74144
- (settings2, value) => settings2.ui.zoom = value
74145
- ),
74146
- settingsToggle(
74147
- "Show Zoom Window Button",
74148
- (settings2) => settings2.ui.zoomWindow,
74149
- (settings2, value) => settings2.ui.zoomWindow = value
74150
- ),
74151
- settingsSubtitle("Control Bar - Tools"),
74152
- settingsToggle(
74153
- "Show Measuring Mode Button",
74154
- (settings2) => settings2.ui.measuringMode,
74155
- (settings2, value) => settings2.ui.measuringMode = value
74156
- ),
74157
- settingsSubtitle("Control Bar - Settings"),
74158
- settingsToggle(
74159
- "Show Project Inspector Button",
74160
- (settings2) => settings2.ui.projectInspector,
74161
- (settings2, value) => settings2.ui.projectInspector = value
74162
- ),
74163
- settingsToggle(
74164
- "Show Settings Button",
74165
- (settings2) => settings2.ui.settings,
74166
- (settings2, value) => settings2.ui.settings = value
74167
- ),
74168
- settingsToggle(
74169
- "Show Help Button",
74170
- (settings2) => settings2.ui.help,
74171
- (settings2, value) => settings2.ui.help = value
74172
- ),
74173
- settingsToggle(
74174
- "Show Maximise Button",
74175
- (settings2) => settings2.ui.maximise,
74176
- (settings2, value) => settings2.ui.maximise = value
74177
- )
74178
- ] })
74179
- ]
74180
- }
74181
- );
74182
- }
74183
74126
  const MenuToastMemo = React2.memo(MenuToast);
74184
74127
  function MenuToast(props) {
74185
74128
  const [visible2, setVisible] = React2.useState();
@@ -74344,118 +74287,6 @@ Averrage Date/Second ${avgDataRatePS} kb
74344
74287
  }
74345
74288
  });
74346
74289
  }
74347
- function useSettings(viewer, value) {
74348
- const merged = createSettings(value);
74349
- const [settings2, setSettings] = React2.useState(merged);
74350
- const onUpdate = React2.useRef();
74351
- const update = function(updater) {
74352
- var _a3;
74353
- const next = { ...settings2 };
74354
- updater(next);
74355
- saveSettingsToLocal(next);
74356
- setSettings(next);
74357
- (_a3 = onUpdate.current) == null ? void 0 : _a3.call(onUpdate, next);
74358
- };
74359
- React2.useEffect(() => {
74360
- applySettings(viewer, settings2);
74361
- }, []);
74362
- React2.useEffect(() => {
74363
- applySettings(viewer, settings2);
74364
- }, [settings2]);
74365
- return React2.useMemo(
74366
- () => ({
74367
- value: settings2,
74368
- update,
74369
- register: (v) => onUpdate.current = v
74370
- }),
74371
- [settings2]
74372
- );
74373
- }
74374
- function applySettings(viewer, settings2) {
74375
- const performance2 = document.getElementsByClassName("vim-performance-div")[0];
74376
- if (performance2) {
74377
- if (isTrue(settings2.ui.performance)) {
74378
- performance2.classList.remove("vc-hidden");
74379
- } else {
74380
- performance2.classList.add("vc-hidden");
74381
- }
74382
- }
74383
- }
74384
- function createContainer(element) {
74385
- let root = element;
74386
- if (root === void 0) {
74387
- root = document.createElement("div");
74388
- document.body.append(root);
74389
- root.classList.add("vc-inset-0");
74390
- }
74391
- root.style.position = "absolute";
74392
- root.classList.add("vim-component");
74393
- const gfx = document.createElement("div");
74394
- gfx.className = "vim-gfx vc-absolute vc-inset-0 vc-pointer-events-none";
74395
- const ui = document.createElement("div");
74396
- ui.className = "vim-ui vc-absolute vc-inset-0";
74397
- root.append(gfx);
74398
- root.append(ui);
74399
- const dispose = () => {
74400
- if (element === void 0) {
74401
- root.remove();
74402
- } else {
74403
- root.classList.remove("vim-component");
74404
- gfx.remove();
74405
- ui.remove();
74406
- }
74407
- };
74408
- return { root, ui, gfx, dispose };
74409
- }
74410
- async function getElements(vim) {
74411
- var _a3, _b2, _c, _d, _e;
74412
- if (!vim.bim) return [];
74413
- const [elements, bimDocument, category, levels, worksets] = await Promise.all(
74414
- [
74415
- (_a3 = vim.bim.element) == null ? void 0 : _a3.getAll(),
74416
- (_b2 = vim.bim.bimDocument) == null ? void 0 : _b2.getAllTitle(),
74417
- (_c = vim.bim.category) == null ? void 0 : _c.getAllName(),
74418
- (_d = vim.bim.level) == null ? void 0 : _d.getAllElementIndex(),
74419
- (_e = vim.bim.workset) == null ? void 0 : _e.getAllName()
74420
- ]
74421
- );
74422
- const familyTypeMap = await getFamilyTypeNameMap(vim.bim);
74423
- if (!elements) return void 0;
74424
- const result = elements.map((e) => {
74425
- var _a4;
74426
- return {
74427
- ...e,
74428
- bimDocumentName: bimDocument ? bimDocument[e.bimDocumentIndex] : void 0,
74429
- categoryName: category ? category[e.categoryIndex] : void 0,
74430
- familyTypeName: familyTypeMap.get(e.index),
74431
- levelName: levels ? (_a4 = elements[levels[(e == null ? void 0 : e.levelIndex) ?? -1]]) == null ? void 0 : _a4.name : void 0,
74432
- worksetName: worksets ? worksets[(e == null ? void 0 : e.worksetIndex) ?? -1] : void 0
74433
- };
74434
- });
74435
- const real = result.filter((e) => vim.getElementFromIndex(e.index).hasMesh);
74436
- return real;
74437
- }
74438
- async function getFamilyTypeNameMap(document2) {
74439
- const [
74440
- familyInstanceElement,
74441
- familyInstanceFamilyType,
74442
- familyTypeElement,
74443
- elementName
74444
- ] = await Promise.all([
74445
- document2.familyInstance.getAllElementIndex(),
74446
- document2.familyInstance.getAllFamilyTypeIndex(),
74447
- document2.familyType.getAllElementIndex(),
74448
- document2.element.getAllName()
74449
- ]);
74450
- return new Map(
74451
- familyInstanceElement.map((e, i2) => {
74452
- const familyType = familyInstanceFamilyType == null ? void 0 : familyInstanceFamilyType[i2];
74453
- const element = Number.isInteger(familyType) ? familyTypeElement[familyType] : void 0;
74454
- const name = Number.isInteger(element) ? elementName == null ? void 0 : elementName[element] : void 0;
74455
- return [e, name];
74456
- })
74457
- );
74458
- }
74459
74290
  class MutableState {
74460
74291
  constructor(initial) {
74461
74292
  __publicField(this, "_value");
@@ -74484,24 +74315,28 @@ Averrage Date/Second ${avgDataRatePS} kb
74484
74315
  }
74485
74316
  };
74486
74317
  }
74487
- function useStateRef(initialValue) {
74488
- const [value, setValue] = React2.useState(initialValue);
74318
+ function useStateRef(initialValue, isLazy = false) {
74319
+ const getInitialValue = () => {
74320
+ if (isLazy && typeof initialValue === "function") {
74321
+ return initialValue();
74322
+ }
74323
+ return initialValue;
74324
+ };
74325
+ const [box, setBox] = React2.useState(() => ({
74326
+ current: getInitialValue()
74327
+ }));
74489
74328
  const ref = React2.useRef(void 0);
74490
74329
  if (ref.current === void 0) {
74491
- if (typeof initialValue === "function") {
74492
- ref.current = initialValue();
74493
- } else {
74494
- ref.current = initialValue;
74495
- }
74330
+ ref.current = getInitialValue();
74496
74331
  }
74497
74332
  const event = React2.useRef(new distExports.SimpleEventDispatcher());
74498
74333
  const validate = React2.useRef((next, current) => next);
74499
- const confirm = React2.useRef((value2) => value2);
74500
- const set2 = (value2) => {
74501
- const finalValue = validate.current(value2, ref.current);
74334
+ const confirm = React2.useRef((value) => value);
74335
+ const set2 = (value) => {
74336
+ const finalValue = validate.current(value, ref.current);
74502
74337
  if (finalValue === ref.current) return;
74503
74338
  ref.current = finalValue;
74504
- setValue(finalValue);
74339
+ setBox({ current: finalValue });
74505
74340
  event.current.dispatch(finalValue);
74506
74341
  };
74507
74342
  return {
@@ -74527,8 +74362,8 @@ Averrage Date/Second ${avgDataRatePS} kb
74527
74362
  */
74528
74363
  useOnChange(on) {
74529
74364
  React2.useEffect(() => {
74530
- return event.current.subscribe((value2) => {
74531
- const result = on(value2);
74365
+ return event.current.subscribe((value) => {
74366
+ const result = on(value);
74532
74367
  if (result instanceof Promise) {
74533
74368
  result.catch(console.error);
74534
74369
  }
@@ -74542,7 +74377,7 @@ Averrage Date/Second ${avgDataRatePS} kb
74542
74377
  * @returns The memoized value.
74543
74378
  */
74544
74379
  useMemo(on, deps) {
74545
- return React2.useMemo(() => on(value), [...deps || [], value]);
74380
+ return React2.useMemo(() => on(box.current), [...deps || [], box.current]);
74546
74381
  },
74547
74382
  /**
74548
74383
  * Sets a validation function to process any new state value before updating.
@@ -74719,8 +74554,116 @@ Averrage Date/Second ${avgDataRatePS} kb
74719
74554
  useRefresher,
74720
74555
  useStateRef
74721
74556
  }, Symbol.toStringTag, { value: "Module" }));
74722
- function useViewerState(viewer) {
74723
- const getVim = () => {
74557
+ function useSettings(value, defaultSettings, applySettings = () => {
74558
+ }) {
74559
+ const merged = createSettings(value, defaultSettings);
74560
+ const [settings2, setSettings] = React2.useState(merged);
74561
+ const onUpdate = React2.useRef();
74562
+ const customizer = useStateRef((settings22) => settings22);
74563
+ const update = function(updater) {
74564
+ var _a3;
74565
+ const next = { ...settings2 };
74566
+ updater(next);
74567
+ saveSettingsToLocal(next);
74568
+ setSettings(next);
74569
+ (_a3 = onUpdate.current) == null ? void 0 : _a3.call(onUpdate, next);
74570
+ };
74571
+ React2.useEffect(() => {
74572
+ applySettings(settings2);
74573
+ }, []);
74574
+ React2.useEffect(() => {
74575
+ applySettings(settings2);
74576
+ }, [settings2]);
74577
+ return React2.useMemo(
74578
+ () => ({
74579
+ value: settings2,
74580
+ update,
74581
+ register: (v) => onUpdate.current = v,
74582
+ customizer
74583
+ }),
74584
+ [settings2]
74585
+ );
74586
+ }
74587
+ function createSettings(settings2, defaultSettings) {
74588
+ return settings2 !== void 0 ? deepmerge(defaultSettings, settings2) : defaultSettings;
74589
+ }
74590
+ function createContainer(element) {
74591
+ let root = element;
74592
+ if (root === void 0) {
74593
+ root = document.createElement("div");
74594
+ document.body.append(root);
74595
+ root.classList.add("vc-inset-0");
74596
+ }
74597
+ root.style.position = "absolute";
74598
+ root.classList.add("vim-component");
74599
+ const gfx = document.createElement("div");
74600
+ gfx.className = "vim-gfx vc-absolute vc-inset-0 vc-pointer-events-none";
74601
+ const ui = document.createElement("div");
74602
+ ui.className = "vim-ui vc-absolute vc-inset-0";
74603
+ root.append(gfx);
74604
+ root.append(ui);
74605
+ const dispose = () => {
74606
+ if (element === void 0) {
74607
+ root.remove();
74608
+ } else {
74609
+ root.classList.remove("vim-component");
74610
+ gfx.remove();
74611
+ ui.remove();
74612
+ }
74613
+ };
74614
+ return { root, ui, gfx, dispose };
74615
+ }
74616
+ async function getElements(vim) {
74617
+ var _a3, _b2, _c, _d, _e;
74618
+ if (!vim.bim) return [];
74619
+ const [elements, bimDocument, category, levels, worksets] = await Promise.all(
74620
+ [
74621
+ (_a3 = vim.bim.element) == null ? void 0 : _a3.getAll(),
74622
+ (_b2 = vim.bim.bimDocument) == null ? void 0 : _b2.getAllTitle(),
74623
+ (_c = vim.bim.category) == null ? void 0 : _c.getAllName(),
74624
+ (_d = vim.bim.level) == null ? void 0 : _d.getAllElementIndex(),
74625
+ (_e = vim.bim.workset) == null ? void 0 : _e.getAllName()
74626
+ ]
74627
+ );
74628
+ const familyTypeMap = await getFamilyTypeNameMap(vim.bim);
74629
+ if (!elements) return void 0;
74630
+ const result = elements.map((e) => {
74631
+ var _a4;
74632
+ return {
74633
+ ...e,
74634
+ bimDocumentName: bimDocument ? bimDocument[e.bimDocumentIndex] : void 0,
74635
+ categoryName: category ? category[e.categoryIndex] : void 0,
74636
+ familyTypeName: familyTypeMap.get(e.index),
74637
+ levelName: levels ? (_a4 = elements[levels[(e == null ? void 0 : e.levelIndex) ?? -1]]) == null ? void 0 : _a4.name : void 0,
74638
+ worksetName: worksets ? worksets[(e == null ? void 0 : e.worksetIndex) ?? -1] : void 0
74639
+ };
74640
+ });
74641
+ const real = result.filter((e) => vim.getElementFromIndex(e.index).hasMesh);
74642
+ return real;
74643
+ }
74644
+ async function getFamilyTypeNameMap(document2) {
74645
+ const [
74646
+ familyInstanceElement,
74647
+ familyInstanceFamilyType,
74648
+ familyTypeElement,
74649
+ elementName
74650
+ ] = await Promise.all([
74651
+ document2.familyInstance.getAllElementIndex(),
74652
+ document2.familyInstance.getAllFamilyTypeIndex(),
74653
+ document2.familyType.getAllElementIndex(),
74654
+ document2.element.getAllName()
74655
+ ]);
74656
+ return new Map(
74657
+ familyInstanceElement.map((e, i2) => {
74658
+ const familyType = familyInstanceFamilyType == null ? void 0 : familyInstanceFamilyType[i2];
74659
+ const element = Number.isInteger(familyType) ? familyTypeElement[familyType] : void 0;
74660
+ const name = Number.isInteger(element) ? elementName == null ? void 0 : elementName[element] : void 0;
74661
+ return [e, name];
74662
+ })
74663
+ );
74664
+ }
74665
+ function useViewerState(viewer) {
74666
+ const getVim = () => {
74724
74667
  var _a3;
74725
74668
  const v = (_a3 = viewer.vims) == null ? void 0 : _a3[0];
74726
74669
  return v;
@@ -74860,12 +74803,8 @@ Averrage Date/Second ${avgDataRatePS} kb
74860
74803
  const vcLink = `${vcColorLink} vc-underline`;
74861
74804
  const vcLabel = "vc-text-[#3F444F]";
74862
74805
  const vcRoboto = "vc-font-['Roboto',sans-serif]";
74863
- function footer$1(url) {
74864
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: `vc-text-xs vc-font-normal ${vcColorSecondary}`, children: [
74865
- "More troubleshooting tips can be found",
74866
- " ",
74867
- link(url, "here")
74868
- ] });
74806
+ function footer$1() {
74807
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, {});
74869
74808
  }
74870
74809
  function mainText(text) {
74871
74810
  return /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: `vim-main-text vc-text-base ${vcColorPrimary} vc-mb-4 vc-font-normal`, children: text });
@@ -74913,31 +74852,18 @@ Averrage Date/Second ${avgDataRatePS} kb
74913
74852
  vcLink,
74914
74853
  vcRoboto
74915
74854
  }, Symbol.toStringTag, { value: "Module" }));
74916
- const support = "https://docs.vimaec.com";
74917
- const supportUltra = "https://docs.vimaec.com/docs/vim-for-windows/configuring-vim-ultra";
74918
- const supportControls = "https://docs.vimaec.com/docs/vim-cloud/webgl-navigation-and-controls-guide";
74919
- const urls = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
74920
- __proto__: null,
74921
- support,
74922
- supportControls,
74923
- supportUltra
74924
- }, Symbol.toStringTag, { value: "Module" }));
74925
74855
  function fileOpeningError(url) {
74926
74856
  return {
74927
- title: "File Opening Error",
74857
+ title: "VIM Ultra File Error",
74928
74858
  body: serverFileOpeningErrorBody(url),
74929
- footer: footer$1(support),
74859
+ footer: footer$1(),
74930
74860
  canClose: false
74931
74861
  };
74932
74862
  }
74933
74863
  function serverFileOpeningErrorBody(url) {
74934
74864
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: vcRoboto, children: [
74935
- mainText(/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
74936
- "Oops, it appears that there's an ",
74937
- bold("error opening the VIM file"),
74938
- ". Please check the file exists at the path noted below."
74939
- ] })),
74940
- subTitle("Error details:"),
74865
+ mainText(/* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "We encountered an error opening the VIM file in VIM Ultra." })),
74866
+ subTitle("Details"),
74941
74867
  dotList([bullet("File path:", url)])
74942
74868
  ] });
74943
74869
  }
@@ -74946,136 +74872,110 @@ Averrage Date/Second ${avgDataRatePS} kb
74946
74872
  return fileOpeningError(url);
74947
74873
  }
74948
74874
  return {
74949
- title: "File Downloading Error",
74875
+ title: "VIM Ultra Download Error",
74950
74876
  body: body$5(url, authToken, server),
74951
- footer: footer$1(support),
74877
+ footer: footer$1(),
74952
74878
  canClose: false
74953
74879
  };
74954
74880
  }
74955
74881
  function body$5(url, authToken, server) {
74956
74882
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: vcRoboto, children: [
74957
- mainText(/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
74958
- "Oops, it appears that there’s an ",
74959
- bold("error downloading the VIM file"),
74960
- ". Please check the following conditions to get back up and running quickly."
74961
- ] })),
74962
- subTitle("Error details:"),
74883
+ mainText(/* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "We encountered an error downloading the VIM file in VIM Ultra." })),
74884
+ subTitle("Details"),
74963
74885
  dotList([
74964
- server ? bullet("VIM ULTRA Server:", server) : null,
74965
- bullet("File URL:", url),
74966
- authToken ? bullet("Auth Token:", authToken) : null
74886
+ server ? bullet("VIM Ultra:", server) : null,
74887
+ bullet("VIM URL:", url),
74888
+ authToken ? bullet("Access Token:", authToken) : null
74967
74889
  ]),
74968
- subTitle("Troubleshooting tips:"),
74890
+ subTitle("Tips"),
74969
74891
  numList([
74970
- "Make sure the VIM exists at the url listed above.",
74971
- "Reprocess the VIM file and refresh the Power BI report dataset.",
74972
- server ? "Check network access policies to allow the VIM Ultra Server access to the VIM File url." : ""
74892
+ "Ensure the VIM URL is valid",
74893
+ "Check your network connection and access policies"
74973
74894
  ])
74974
74895
  ] });
74975
74896
  }
74976
74897
  function serverFileLoadingError(url) {
74977
74898
  return {
74978
- title: "File Loading Error",
74899
+ title: "VIM Ultra Loading Error",
74979
74900
  body: body$4(url),
74980
- footer: footer$1(support),
74901
+ footer: footer$1(),
74981
74902
  canClose: false
74982
74903
  };
74983
74904
  }
74984
74905
  function body$4(url) {
74985
74906
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: vcRoboto, children: [
74986
- mainText(/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
74987
- "Oops, it appears that we ",
74988
- bold("couldn’t load the VIM file"),
74989
- ". This could be due to a couple of reasons, including that the file could be corrupt or not recognizable."
74990
- ] })),
74991
- subTitle("Error details:"),
74907
+ mainText(/* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "We encountered an error loading the VIM file in VIM Ultra." })),
74908
+ subTitle("Details"),
74992
74909
  dotList([bullet("File path:", url)]),
74993
- subTitle("Troubleshooting tips:"),
74910
+ subTitle("Tips"),
74994
74911
  numList([
74995
- "Reload this Power BI report",
74996
- "Reprocess the VIM file and refresh the Power BI report dataset"
74912
+ "Reload the page",
74913
+ "Ensure the VIM URL points to a valid VIM file",
74914
+ "Clear your VIM Ultra download cache"
74997
74915
  ])
74998
74916
  ] });
74999
74917
  }
75000
74918
  function serverConnectionError(url) {
75001
74919
  return {
75002
- title: "Connection Error",
74920
+ title: "VIM Ultra Connection",
75003
74921
  body: body$3(url, isLocalUrl(url)),
75004
- footer: footer$1(support),
74922
+ footer: footer$1(),
75005
74923
  canClose: false
75006
74924
  };
75007
74925
  }
75008
74926
  function body$3(url, local) {
75009
74927
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: vcRoboto, children: [
75010
- mainText(/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
75011
- "Oops, it appears that there’s an ",
75012
- bold("error connecting to the ULTRA server"),
75013
- ". Please check the following conditions to get back up and running quickly."
75014
- ] })),
75015
- subTitle("Troubleshooting tips:"),
74928
+ mainText(/* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "We encountered an error connecting to VIM Ultra." })),
74929
+ subTitle("Tips"),
75016
74930
  numList([
75017
74931
  /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
75018
- "Ensure that VIM Ultra",
75019
- " ",
75020
- link(supportUltra, "process is running"),
75021
- " ",
75022
- "at ",
74932
+ "Ensure that VIM Ultra is running at ",
75023
74933
  detailText(url)
75024
74934
  ] }),
75025
- "Check your internet connection.",
75026
- "Check firewall permissions."
74935
+ "Check your network connection and access policies"
75027
74936
  ])
75028
74937
  ] });
75029
74938
  }
75030
74939
  function serverCompatibilityError(url, localVersion, remoteVersion) {
75031
74940
  return {
75032
- title: "Compatibility Error",
74941
+ title: "VIM Ultra Compatibility",
75033
74942
  body: body$2(url, localVersion, remoteVersion),
75034
- footer: footer$1(support),
74943
+ footer: footer$1(),
75035
74944
  canClose: false
75036
74945
  };
75037
74946
  }
75038
74947
  function body$2(url, localVersion, remoteVersion) {
75039
74948
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: vcRoboto, children: [
75040
- mainText(/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
75041
- "Oops, it appears that you’re running a ",
75042
- " ",
75043
- bold("version of VIM Ultra Server that isn’t compatible with this visual"),
75044
- ". Please check the following conditions to get back up and running quickly."
75045
- ] })),
75046
- subTitle("Error details:"),
74949
+ mainText(/* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "The VIM Ultra version is incompatible with this visual." })),
74950
+ subTitle("Details"),
75047
74951
  dotList([
75048
74952
  bullet("Url:", url),
75049
74953
  bullet("Local Version:", localVersion),
75050
74954
  bullet("Remote Version:", remoteVersion)
75051
74955
  ]),
75052
- subTitle("Troubleshooting tips:"),
74956
+ subTitle("Tips"),
75053
74957
  numList([
75054
- "Update your PowerBI visual with the compatible version.",
75055
- "Or, run the compatible version of VIM Ultra."
74958
+ "Update this visual to a compatible version.",
74959
+ "Start a compatible version of VIM Ultra."
75056
74960
  ])
75057
74961
  ] });
75058
74962
  }
75059
74963
  function serverStreamError(url) {
75060
74964
  return {
75061
- title: "Stream Error",
74965
+ title: "VIM Ultra Stream Error",
75062
74966
  body: body$1(),
75063
- footer: footer$1(support),
74967
+ footer: footer$1(),
75064
74968
  canClose: false
75065
74969
  };
75066
74970
  }
75067
74971
  function body$1(url) {
75068
74972
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: vcRoboto, children: [
75069
- mainText(/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
75070
- "Oops, it appears that there’s an ",
75071
- bold("error starting a stream on the VIM Ultra Server"),
75072
- ". Please check the following conditions to get back up and running quickly."
75073
- ] })),
75074
- subTitle("Troubleshooting tips:"),
74973
+ mainText(/* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "We encountered a streaming error with VIM Ultra." })),
74974
+ subTitle("Tips"),
75075
74975
  numList([
75076
- "Close other applications that may be using the server.",
75077
- "Try reconnecting to the server.",
75078
- "Restart the server."
74976
+ "Reload the page",
74977
+ "Close other applications that may be using VIM Ultra",
74978
+ "Restart VIM Ultra"
75079
74979
  ])
75080
74980
  ] });
75081
74981
  }
@@ -75307,16 +75207,19 @@ Averrage Date/Second ${avgDataRatePS} kb
75307
75207
  }
75308
75208
  }
75309
75209
  function MessageBox(props) {
75210
+ const [minimized, setMinimized] = React2.useState(props.value.minimize ?? false);
75310
75211
  const p = props.value;
75311
75212
  if (!p.title || !p.body) return null;
75312
75213
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vim-message-box vc-p-6 vc-max-h-[80%] vc-max-w-[80%] vc-w-[424px] vc-bg-white vc-rounded-md vc-shadow-message vc-shadow-[0px_4px_16px_rgba(33,39,51,0.5)] vc-font-roboto", children: [
75313
75214
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vc-flex vc-justify-between vc-items-center", children: [
75215
+ props.value.icon,
75314
75216
  title(p.title),
75315
- closeBtn(p.onClose)
75217
+ props.value.canClose && closeBtn(p.onClose),
75218
+ props.value.minimize && minimizeButton(minimized, setMinimized)
75316
75219
  ] }),
75317
- divider(),
75318
- body(p.body),
75319
- footer(p.footer)
75220
+ !minimized && divider(),
75221
+ !minimized && body(p.body),
75222
+ !minimized && footer(p.footer)
75320
75223
  ] });
75321
75224
  }
75322
75225
  function title(title2) {
@@ -75326,6 +75229,9 @@ Averrage Date/Second ${avgDataRatePS} kb
75326
75229
  if (!onClose) return null;
75327
75230
  return /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: onClose, className: "vc-text-[#212733] vc-text-xl", children: "×" });
75328
75231
  }
75232
+ function minimizeButton(minimized, setMinimized) {
75233
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => setMinimized(!minimized), className: "vc-text-[#212733] vc-text-xl", children: minimized ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "▼" }) : /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "▲" }) });
75234
+ }
75329
75235
  function body(content2) {
75330
75236
  if (content2 === void 0) return null;
75331
75237
  if (typeof content2 === "string") {
@@ -75684,7 +75590,7 @@ Averrage Date/Second ${avgDataRatePS} kb
75684
75590
  adapter.setVisible(false);
75685
75591
  adapter.setClip(false);
75686
75592
  return adapter.onSelectionChanged.sub(() => {
75687
- if (auto.get() && enable.get()) sectionSelection2.call();
75593
+ if (auto.get() && enable.get()) sectionSelection.call();
75688
75594
  });
75689
75595
  }, []);
75690
75596
  enable.useOnChange((v) => {
@@ -75692,7 +75598,7 @@ Averrage Date/Second ${avgDataRatePS} kb
75692
75598
  visible2.set(v);
75693
75599
  showOffsetPanel.set(false);
75694
75600
  if (v && auto.get()) {
75695
- sectionSelection2.call();
75601
+ sectionSelection.call();
75696
75602
  } else {
75697
75603
  sectionScene.call();
75698
75604
  }
@@ -75703,7 +75609,7 @@ Averrage Date/Second ${avgDataRatePS} kb
75703
75609
  sideOffset.useOnChange((v) => sectionBox2.call(boxRef.current));
75704
75610
  bottomOffset.useOnChange((v) => sectionBox2.call(boxRef.current));
75705
75611
  auto.useOnChange((v) => {
75706
- if (v) sectionSelection2.call();
75612
+ if (v) sectionSelection.call();
75707
75613
  });
75708
75614
  visible2.useOnChange((v) => adapter.setVisible(v));
75709
75615
  const sectionBox2 = useArgActionRef((box) => {
@@ -75713,7 +75619,7 @@ Averrage Date/Second ${avgDataRatePS} kb
75713
75619
  const newBox = addBox(box, offsetsToBox3_(topOffset.get(), sideOffset.get(), bottomOffset.get()));
75714
75620
  adapter.setBox(newBox);
75715
75621
  });
75716
- const sectionSelection2 = useFuncRef(async () => {
75622
+ const sectionSelection = useFuncRef(async () => {
75717
75623
  const id2 = requestId.current;
75718
75624
  const box = await getSelectionBox.call() ?? await getSceneBox.call();
75719
75625
  if (requestId.current !== id2) return;
@@ -75733,7 +75639,7 @@ Averrage Date/Second ${avgDataRatePS} kb
75733
75639
  topOffset,
75734
75640
  sideOffset,
75735
75641
  bottomOffset,
75736
- sectionSelection: sectionSelection2,
75642
+ sectionSelection,
75737
75643
  sectionScene,
75738
75644
  sectionBox: sectionBox2,
75739
75645
  getBox: () => adapter.getBox(),
@@ -75831,7 +75737,8 @@ Averrage Date/Second ${avgDataRatePS} kb
75831
75737
  }
75832
75738
  const Ids = {
75833
75739
  showGhost: "isolationPanel.showGhost",
75834
- ghostOpacity: "isolationPanel.ghostOpacity"
75740
+ ghostOpacity: "isolationPanel.ghostOpacity",
75741
+ transparency: "isolationPanel.transparency"
75835
75742
  };
75836
75743
  const IsolationPanel$1 = React2.forwardRef(
75837
75744
  (props, ref) => {
@@ -75843,8 +75750,20 @@ Averrage Date/Second ${avgDataRatePS} kb
75843
75750
  anchorElement: document.getElementById("vim-control-bar"),
75844
75751
  showPanel: props.state.showPanel,
75845
75752
  entries: [
75846
- { type: "bool", id: Ids.showGhost, label: "Show Ghost", state: props.state.showGhost },
75847
- // { type: "bool", id: "showRooms", label: "Show Rooms", state: props.state.showRooms },
75753
+ {
75754
+ type: "bool",
75755
+ id: Ids.showGhost,
75756
+ label: "Show Ghost",
75757
+ state: props.state.showGhost
75758
+ },
75759
+ /*
75760
+ {
75761
+ type: "bool",
75762
+ id: "showRooms",
75763
+ label: "Show Rooms",
75764
+ state: props.state.showRooms
75765
+ },
75766
+ */
75848
75767
  {
75849
75768
  type: "number",
75850
75769
  id: Ids.ghostOpacity,
@@ -75854,6 +75773,13 @@ Averrage Date/Second ${avgDataRatePS} kb
75854
75773
  min: 0,
75855
75774
  max: 1,
75856
75775
  step: 0.05
75776
+ },
75777
+ {
75778
+ type: "bool",
75779
+ visible: () => props.transparency,
75780
+ id: Ids.transparency,
75781
+ label: "Transparency",
75782
+ state: props.state.transparency
75857
75783
  }
75858
75784
  ]
75859
75785
  }
@@ -75862,12 +75788,13 @@ Averrage Date/Second ${avgDataRatePS} kb
75862
75788
  );
75863
75789
  function useSharedIsolation(adapter) {
75864
75790
  const _adapter = React2.useRef(adapter);
75865
- const visibility = useStateRef(() => adapter.computeVisibility());
75791
+ const visibility = useStateRef(() => adapter.computeVisibility(), true);
75866
75792
  const autoIsolate2 = useStateRef(false);
75867
75793
  const showPanel = useStateRef(false);
75868
75794
  const showRooms = useStateRef(false);
75869
75795
  const showGhost = useStateRef(false);
75870
- const ghostOpacity = useStateRef(() => adapter.getGhostOpacity());
75796
+ const ghostOpacity = useStateRef(() => adapter.getGhostOpacity(), true);
75797
+ const transparency = useStateRef(true);
75871
75798
  const onAutoIsolate = useFuncRef(() => {
75872
75799
  if (adapter.hasSelection()) {
75873
75800
  adapter.isolateSelection();
@@ -75892,6 +75819,7 @@ Averrage Date/Second ${avgDataRatePS} kb
75892
75819
  });
75893
75820
  showGhost.useOnChange((v) => adapter.showGhost(v));
75894
75821
  showRooms.useOnChange((v) => adapter.setShowRooms(v));
75822
+ transparency.useOnChange((v) => adapter.enableTransparency(v));
75895
75823
  ghostOpacity.useValidate((next, current) => {
75896
75824
  return next <= 0 ? current : next;
75897
75825
  });
@@ -75905,7 +75833,8 @@ Averrage Date/Second ${avgDataRatePS} kb
75905
75833
  showRooms,
75906
75834
  ghostOpacity,
75907
75835
  onAutoIsolate,
75908
- onVisibilityChange
75836
+ onVisibilityChange,
75837
+ transparency
75909
75838
  };
75910
75839
  }
75911
75840
  function useWebglIsolation(viewer) {
@@ -75913,6 +75842,29 @@ Averrage Date/Second ${avgDataRatePS} kb
75913
75842
  return useSharedIsolation(adapter);
75914
75843
  }
75915
75844
  function createWebglIsolationAdapter(viewer) {
75845
+ var transparency = true;
75846
+ var ghost2 = false;
75847
+ var rooms = false;
75848
+ function updateMaterials() {
75849
+ viewer.renderer.modelMaterial = !ghost2 && transparency ? void 0 : ghost2 && transparency ? [void 0, viewer.materials.ghost] : !ghost2 && !transparency ? viewer.materials.simple : ghost2 && !transparency ? [viewer.materials.simple, viewer.materials.ghost] : (() => {
75850
+ throw new Error("Unreachable state in isolation materials");
75851
+ })();
75852
+ }
75853
+ function updateVisibility(elements, predicate) {
75854
+ if (elements === "all") {
75855
+ for (let v of viewer.vims) {
75856
+ for (let o of v.getAllElements()) {
75857
+ if (o.type === "Element3D") {
75858
+ o.visible = o.isRoom ? rooms : predicate(o);
75859
+ }
75860
+ }
75861
+ }
75862
+ } else {
75863
+ for (let o of elements) {
75864
+ o.visible = o.isRoom ? rooms : predicate(o);
75865
+ }
75866
+ }
75867
+ }
75916
75868
  return {
75917
75869
  onVisibilityChange: viewer.renderer.onSceneUpdated,
75918
75870
  onSelectionChanged: viewer.selection.onSelectionChanged,
@@ -75921,28 +75873,28 @@ Averrage Date/Second ${avgDataRatePS} kb
75921
75873
  hasVisibleSelection: () => viewer.selection.any() && viewer.selection.getAll().every((o) => o.visible),
75922
75874
  hasHiddenSelection: () => viewer.selection.any() && viewer.selection.getAll().every((o) => !o.visible),
75923
75875
  clearSelection: () => viewer.selection.clear(),
75924
- isolateSelection: () => updateAllVisibility(viewer, (o) => viewer.selection.has(o)),
75876
+ isolateSelection: () => updateVisibility("all", (o) => viewer.selection.has(o)),
75925
75877
  hideSelection: () => {
75926
- viewer.selection.getAll().forEach((o) => o.visible = false);
75878
+ updateVisibility(viewer.selection.getAll(), (o) => false);
75927
75879
  },
75928
75880
  showSelection: () => {
75929
- viewer.selection.getAll().forEach((o) => o.visible = true);
75881
+ updateVisibility(viewer.selection.getAll(), (o) => true);
75930
75882
  },
75931
75883
  hideAll: () => {
75932
- updateAllVisibility(viewer, (o) => false);
75884
+ updateVisibility("all", (o) => false);
75933
75885
  },
75934
75886
  showAll: () => {
75935
- updateAllVisibility(viewer, (o) => true);
75887
+ updateVisibility("all", (o) => true);
75936
75888
  },
75937
75889
  isolate: (instances) => {
75938
75890
  const set2 = new Set(instances);
75939
- updateAllVisibility(viewer, (o) => o.instances.some((i2) => set2.has(i2)));
75891
+ updateVisibility("all", (o) => o.instances.some((i2) => set2.has(i2)));
75940
75892
  },
75941
75893
  show: (instances) => {
75942
75894
  for (let i2 of instances) {
75943
75895
  for (let v of viewer.vims) {
75944
75896
  const o = v.getElement(i2);
75945
- o.visible = true;
75897
+ o.visible = o.isRoom ? rooms : true;
75946
75898
  }
75947
75899
  }
75948
75900
  },
@@ -75950,29 +75902,30 @@ Averrage Date/Second ${avgDataRatePS} kb
75950
75902
  for (let i2 of instances) {
75951
75903
  for (let v of viewer.vims) {
75952
75904
  const o = v.getElement(i2);
75953
- o.visible = false;
75905
+ o.visible = o.isRoom ? rooms : false;
75954
75906
  }
75955
75907
  }
75956
75908
  },
75909
+ enableTransparency: (enable) => {
75910
+ if (transparency !== enable) {
75911
+ transparency = enable;
75912
+ updateMaterials();
75913
+ }
75914
+ },
75957
75915
  showGhost: (show) => {
75958
- viewer.renderer.modelMaterial = show ? [viewer.materials.simple, viewer.materials.ghost] : void 0;
75916
+ ghost2 = show;
75917
+ updateMaterials();
75959
75918
  },
75960
75919
  getGhostOpacity: () => viewer.materials.ghostOpacity,
75961
75920
  setGhostOpacity: (opacity) => viewer.materials.ghostOpacity = opacity,
75962
- getShowRooms: () => true,
75921
+ getShowRooms: () => rooms,
75963
75922
  setShowRooms: (show) => {
75964
- console.log("setShowRooms not implemented");
75965
- }
75966
- };
75967
- }
75968
- function updateAllVisibility(viewer, predicate) {
75969
- for (let v of viewer.vims) {
75970
- for (let o of v.getAllElements()) {
75971
- if (o.type === "Element3D") {
75972
- o.visible = predicate(o);
75923
+ if (rooms !== show) {
75924
+ rooms = show;
75925
+ updateVisibility("all", (o) => o.visible);
75973
75926
  }
75974
75927
  }
75975
- }
75928
+ };
75976
75929
  }
75977
75930
  function getVisibilityState$1(viewer) {
75978
75931
  let all = true;
@@ -75998,6 +75951,572 @@ Averrage Date/Second ${avgDataRatePS} kb
75998
75951
  if (onlySelectionFlag) return "onlySelection";
75999
75952
  return "some";
76000
75953
  }
75954
+ function getDefaultSettings() {
75955
+ return {
75956
+ capacity: {
75957
+ canFollowUrl: true,
75958
+ canGoFullScreen: true,
75959
+ canDownload: true,
75960
+ canReadLocalStorage: true
75961
+ },
75962
+ ui: {
75963
+ panelLogo: true,
75964
+ panelPerformance: false,
75965
+ panelBimTree: true,
75966
+ panelBimInfo: true,
75967
+ panelAxes: true,
75968
+ panelControlBar: true,
75969
+ axesOrthographic: true,
75970
+ axesHome: true,
75971
+ // Control bar - cursors
75972
+ cursorOrbit: true,
75973
+ cursorLookAround: true,
75974
+ cursorPan: true,
75975
+ cursorZoom: true,
75976
+ // Control bar - camera
75977
+ cameraAuto: true,
75978
+ cameraFrameScene: true,
75979
+ cameraFrameSelection: true,
75980
+ // Control bar - tools
75981
+ sectioningEnable: true,
75982
+ sectioningFitToSelection: true,
75983
+ sectioningReset: true,
75984
+ sectioningShow: true,
75985
+ sectioningAuto: true,
75986
+ sectioningSettings: true,
75987
+ measureEnable: true,
75988
+ // Control bar - Visibility
75989
+ visibilityClearSelection: true,
75990
+ visibilityShowAll: true,
75991
+ visibilityToggle: true,
75992
+ visibilityIsolate: true,
75993
+ visibilityAutoIsolate: true,
75994
+ visibilitySettings: true,
75995
+ // Control bar - settings
75996
+ miscProjectInspector: true,
75997
+ miscSettings: true,
75998
+ miscHelp: true,
75999
+ miscMaximise: true
76000
+ }
76001
+ };
76002
+ }
76003
+ function renderSettingsInputBox(settings2, item) {
76004
+ const ref = React2.useRef(null);
76005
+ React2.useEffect(() => {
76006
+ var _a3;
76007
+ ref.current.value = (_a3 = item.getter(settings2.value)) == null ? void 0 : _a3.toString();
76008
+ }, []);
76009
+ const update = (event) => {
76010
+ const str = event.target.value;
76011
+ const n = Number.parseFloat(str);
76012
+ if (Number.isNaN(n)) {
76013
+ event.target.value = item.getter(settings2.value).toString();
76014
+ } else {
76015
+ const value = item.transform(n);
76016
+ event.target.value = value.toString();
76017
+ settings2.update((s) => item.setter(s, value));
76018
+ }
76019
+ };
76020
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vc-box-input vc-my-1 ", children: [
76021
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { htmlFor: "textbox", className: "vc-w-3 vc-h-2", children: [
76022
+ item.label,
76023
+ ":"
76024
+ ] }),
76025
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76026
+ "input",
76027
+ {
76028
+ ref,
76029
+ type: "text",
76030
+ className: "vim-settings-textbox vc-border vc-rounded-sm vc-border-gray vc-w-14 vc-ml-1 vc-p-1",
76031
+ onBlur: update
76032
+ }
76033
+ ),
76034
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { htmlFor: "textbox", className: "vc-w-3 vc-h-2 vc-text-gray vc-ml-1", children: item.info })
76035
+ ] });
76036
+ }
76037
+ function renderSettingsToggle(settings2, item) {
76038
+ const value = item.getter(settings2.value);
76039
+ if (value === "AlwaysTrue" || value === "AlwaysFalse") return null;
76040
+ const handleChange = () => {
76041
+ const current = item.getter(settings2.value);
76042
+ settings2.update((s) => item.setter(s, !current));
76043
+ };
76044
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "vc-m-1 vc-block vc-select-none vc-items-center vc-py-1 vc-text-gray-warm", children: [
76045
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76046
+ "input",
76047
+ {
76048
+ type: "checkbox",
76049
+ checked: value,
76050
+ onChange: handleChange,
76051
+ className: "vim-settings-checkbox vc-checked:bg-primary-royal vc-mr-2 vc-rounded vc-border vc-border-gray-medium"
76052
+ }
76053
+ ),
76054
+ " ",
76055
+ item.label
76056
+ ] });
76057
+ }
76058
+ function renderSettingsSubtitle(item) {
76059
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "vc-subtitle", children: item.title });
76060
+ }
76061
+ function SettingsPanel(props) {
76062
+ if (!props.visible) return null;
76063
+ function renderItem(settings2, item) {
76064
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(React2.Fragment, { children: (() => {
76065
+ switch (item.type) {
76066
+ case "subtitle":
76067
+ return renderSettingsSubtitle(item);
76068
+ case "toggle":
76069
+ return renderSettingsToggle(settings2, item);
76070
+ case "box":
76071
+ return renderSettingsInputBox(settings2, item);
76072
+ case "element":
76073
+ return item.element;
76074
+ default:
76075
+ return null;
76076
+ }
76077
+ })() }, item.key);
76078
+ }
76079
+ const customizer = props.settings.customizer.get();
76080
+ const content2 = customizer ? customizer(props.content) : props.content;
76081
+ const sections = buildSections(content2);
76082
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vc-absolute vc-inset-0", children: [
76083
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "vc-title vc-mb-2", children: "Settings" }),
76084
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "\r\n vim-settings\r\n vc-absolute vc-top-8 vc-left-0 vc-right-0 vc-bottom-0\r\n vc-overflow-y-auto\r\n vc-pr-2\r\n vc-space-y-2\r\n vc-box-border\r\n ", children: sections.map((section) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
76085
+ "details",
76086
+ {
76087
+ open: true,
76088
+ className: "\r\n vim-settings-section\r\n vc-bg-white\r\n vc-rounded-md\r\n vc-shadow-sm\r\n vc-border\r\n vc-border-slate-200\r\n vc-p-2\r\n vc-space-y-2\r\n ",
76089
+ children: [
76090
+ /* @__PURE__ */ jsxRuntimeExports.jsx("summary", { className: "vim-settings-section-title vc-font-medium vc-text-sm vc-cursor-pointer", children: section.title }),
76091
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "vim-settings-section-content vc-mt-2 vc-space-y-2", children: section.items.map(
76092
+ (item) => renderItem(props.settings, item)
76093
+ ) })
76094
+ ]
76095
+ },
76096
+ section.key
76097
+ )) })
76098
+ ] });
76099
+ }
76100
+ function buildSections(items) {
76101
+ const sections = [];
76102
+ let current = null;
76103
+ for (const item of items) {
76104
+ if (item.type === "subtitle") {
76105
+ current = {
76106
+ key: item.key,
76107
+ title: item.title,
76108
+ items: []
76109
+ };
76110
+ sections.push(current);
76111
+ } else {
76112
+ if (!current) {
76113
+ current = {
76114
+ key: "default",
76115
+ title: "",
76116
+ items: []
76117
+ };
76118
+ sections.push(current);
76119
+ }
76120
+ current.items.push(item);
76121
+ }
76122
+ }
76123
+ return sections;
76124
+ }
76125
+ class SettingsPanelKeys {
76126
+ }
76127
+ // === Inputs ===
76128
+ __publicField(SettingsPanelKeys, "InputsSubtitle", "inputs");
76129
+ __publicField(SettingsPanelKeys, "InputsScrollSpeedBox", "scrollSpeed");
76130
+ // === Panels ===
76131
+ __publicField(SettingsPanelKeys, "PanelsSubtitle", "panels");
76132
+ __publicField(SettingsPanelKeys, "PanelsShowLogoToggle", "logo");
76133
+ __publicField(SettingsPanelKeys, "PanelsShowBimTreeToggle", "bimTree");
76134
+ __publicField(SettingsPanelKeys, "PanelsShowBimInfoToggle", "bimInfo");
76135
+ __publicField(SettingsPanelKeys, "PanelsShowAxesPanelToggle", "axesPanel");
76136
+ __publicField(SettingsPanelKeys, "PanelsShowPerformancePanelToggle", "performance");
76137
+ // === Axes ===
76138
+ __publicField(SettingsPanelKeys, "AxesSubtitle", "axes");
76139
+ __publicField(SettingsPanelKeys, "AxesShowOrthographicButtonToggle", "orthographic");
76140
+ __publicField(SettingsPanelKeys, "AxesShowResetCameraButtonToggle", "resetCamera");
76141
+ // === Control Bar ===
76142
+ __publicField(SettingsPanelKeys, "ControlBarSubtitle", "controlBar");
76143
+ __publicField(SettingsPanelKeys, "ControlBarShowControlBarToggle", "controlBarVisible");
76144
+ // --- Control Bar - Cursors ---
76145
+ __publicField(SettingsPanelKeys, "ControlBarCursorsSubtitle", "controlBarCursors");
76146
+ __publicField(SettingsPanelKeys, "ControlBarCursorsShowOrbitButtonToggle", "orbit");
76147
+ __publicField(SettingsPanelKeys, "ControlBarCursorsShowLookAroundButtonToggle", "lookAround");
76148
+ __publicField(SettingsPanelKeys, "ControlBarCursorsShowPanButtonToggle", "pan");
76149
+ __publicField(SettingsPanelKeys, "ControlBarCursorsShowZoomButtonToggle", "zoom");
76150
+ __publicField(SettingsPanelKeys, "ControlBarCursorsShowZoomWindowButtonToggle", "zoomWindow");
76151
+ // --- Control Bar - Tools ---
76152
+ __publicField(SettingsPanelKeys, "ControlBarToolsSubtitle", "controlBarTools");
76153
+ __publicField(SettingsPanelKeys, "ControlBarToolsShowMeasuringModeButtonToggle", "measuringMode");
76154
+ // --- Control Bar Camera ---
76155
+ __publicField(SettingsPanelKeys, "ControlBarCameraSubtitle", "settingsPanel.controlBar.Camera");
76156
+ __publicField(SettingsPanelKeys, "ControlBarAutoCamera", "settingsPanel.controlBar.autoCamera");
76157
+ __publicField(SettingsPanelKeys, "ControlBarFrameSelection", "settingsPanel.controlBar.frameSelection");
76158
+ __publicField(SettingsPanelKeys, "ControlBarFrameAll", "settingsPanel.controlBar.frameAll");
76159
+ // --- Control Bar - Sectioning ---
76160
+ __publicField(SettingsPanelKeys, "ControlBarSectioningSubtitle", "settingsPanel.controlBar.sectioning");
76161
+ __publicField(SettingsPanelKeys, "ControlBarSectioningEnable", "settingsPanel.controlBar.enableSectioning");
76162
+ __publicField(SettingsPanelKeys, "ControlBarSectioningFitToSelection", "settingsPanel.controlBar.fitToSelection");
76163
+ __publicField(SettingsPanelKeys, "ControlBarSectioningReset", "settingsPanel.controlBar.reset");
76164
+ __publicField(SettingsPanelKeys, "ControlBarSectioningShow", "settingsPanel.controlBar.show");
76165
+ __publicField(SettingsPanelKeys, "ControlBarSectioningAuto", "settingsPanel.controlBar.auto");
76166
+ __publicField(SettingsPanelKeys, "ControlBarSectioningSettings", "settingsPanel.controlBar.settings");
76167
+ // --- Control Bar - Visibility ---
76168
+ __publicField(SettingsPanelKeys, "ControlBarVisibilitySubtitle", "controlBar.visibility.subtitle");
76169
+ __publicField(SettingsPanelKeys, "ControlBarVisibilityClearSelection", "controlBar.visibility.clearSelection");
76170
+ __publicField(SettingsPanelKeys, "ControlBarVisibilityShowAll", "controlBar.visibility.showAll");
76171
+ __publicField(SettingsPanelKeys, "ControlBarVisibilityToggle", "controlBar.visibility.toggle");
76172
+ __publicField(SettingsPanelKeys, "ControlBarVisibilityIsolate", "controlBar.visibility.isolate");
76173
+ __publicField(SettingsPanelKeys, "ControlBarVisibilityAutoIsolate", "controlBar.visibility.autoIsolate");
76174
+ __publicField(SettingsPanelKeys, "ControlBarVisibilitySettings", "controlBar.visibility.settings");
76175
+ // --- Control Bar - Settings ---
76176
+ __publicField(SettingsPanelKeys, "ControlBarMiscSubtitle", "controlBarSettings");
76177
+ __publicField(SettingsPanelKeys, "ControlBarMiscShowProjectInspectorButtonToggle", "projectInspector");
76178
+ __publicField(SettingsPanelKeys, "ControlBarMiscShowSettingsButtonToggle", "settingsButton");
76179
+ __publicField(SettingsPanelKeys, "ControlBarMiscShowHelpButtonToggle", "help");
76180
+ __publicField(SettingsPanelKeys, "ControlBarMiscShowMaximiseButtonToggle", "maximise");
76181
+ function getControlBarCursorSettings() {
76182
+ return [
76183
+ {
76184
+ type: "subtitle",
76185
+ key: SettingsPanelKeys.ControlBarCursorsSubtitle,
76186
+ title: "Control Bar - Cursors"
76187
+ },
76188
+ {
76189
+ type: "toggle",
76190
+ key: SettingsPanelKeys.ControlBarCursorsShowOrbitButtonToggle,
76191
+ label: "Orbit",
76192
+ getter: (s) => s.ui.cursorOrbit,
76193
+ setter: (s, v) => s.ui.cursorOrbit = v
76194
+ },
76195
+ {
76196
+ type: "toggle",
76197
+ key: SettingsPanelKeys.ControlBarCursorsShowLookAroundButtonToggle,
76198
+ label: "Look Around",
76199
+ getter: (s) => s.ui.cursorLookAround,
76200
+ setter: (s, v) => s.ui.cursorLookAround = v
76201
+ },
76202
+ {
76203
+ type: "toggle",
76204
+ key: SettingsPanelKeys.ControlBarCursorsShowPanButtonToggle,
76205
+ label: "Pan",
76206
+ getter: (s) => s.ui.cursorPan,
76207
+ setter: (s, v) => s.ui.cursorPan = v
76208
+ },
76209
+ {
76210
+ type: "toggle",
76211
+ key: SettingsPanelKeys.ControlBarCursorsShowZoomButtonToggle,
76212
+ label: "Zoom",
76213
+ getter: (s) => s.ui.cursorZoom,
76214
+ setter: (s, v) => s.ui.cursorZoom = v
76215
+ }
76216
+ ];
76217
+ }
76218
+ function getControlBarCameraSettings() {
76219
+ return [
76220
+ {
76221
+ type: "subtitle",
76222
+ key: SettingsPanelKeys.ControlBarCameraSubtitle,
76223
+ title: "Control Bar - Camera"
76224
+ },
76225
+ {
76226
+ type: "toggle",
76227
+ key: SettingsPanelKeys.ControlBarAutoCamera,
76228
+ label: "Auto Camera",
76229
+ getter: (s) => s.ui.cameraAuto,
76230
+ setter: (s, v) => s.ui.cameraAuto = v
76231
+ },
76232
+ {
76233
+ type: "toggle",
76234
+ key: SettingsPanelKeys.ControlBarFrameSelection,
76235
+ label: "Frame Selection",
76236
+ getter: (s) => s.ui.cameraFrameSelection,
76237
+ setter: (s, v) => s.ui.cameraFrameSelection = v
76238
+ },
76239
+ {
76240
+ type: "toggle",
76241
+ key: SettingsPanelKeys.ControlBarFrameAll,
76242
+ label: "Frame All",
76243
+ getter: (s) => s.ui.cameraFrameScene,
76244
+ setter: (s, v) => s.ui.cameraFrameScene = v
76245
+ }
76246
+ ];
76247
+ }
76248
+ function getControlBarSectionBoxSettings() {
76249
+ return [
76250
+ {
76251
+ type: "subtitle",
76252
+ key: SettingsPanelKeys.ControlBarSectioningSubtitle,
76253
+ title: "Control Bar - Sectioning"
76254
+ },
76255
+ {
76256
+ type: "toggle",
76257
+ key: SettingsPanelKeys.ControlBarSectioningEnable,
76258
+ label: "Enable Sectioning",
76259
+ getter: (s) => s.ui.sectioningEnable,
76260
+ setter: (s, v) => s.ui.sectioningEnable = v
76261
+ },
76262
+ {
76263
+ type: "toggle",
76264
+ key: SettingsPanelKeys.ControlBarSectioningFitToSelection,
76265
+ label: "Fit To Selection",
76266
+ getter: (s) => s.ui.sectioningFitToSelection,
76267
+ setter: (s, v) => s.ui.sectioningFitToSelection = v
76268
+ },
76269
+ {
76270
+ type: "toggle",
76271
+ key: SettingsPanelKeys.ControlBarSectioningReset,
76272
+ label: "Reset",
76273
+ getter: (s) => s.ui.sectioningReset,
76274
+ setter: (s, v) => s.ui.sectioningReset = v
76275
+ },
76276
+ {
76277
+ type: "toggle",
76278
+ key: SettingsPanelKeys.ControlBarSectioningShow,
76279
+ label: "Show",
76280
+ getter: (s) => s.ui.sectioningShow,
76281
+ setter: (s, v) => s.ui.sectioningShow = v
76282
+ },
76283
+ {
76284
+ type: "toggle",
76285
+ key: SettingsPanelKeys.ControlBarSectioningAuto,
76286
+ label: "Auto",
76287
+ getter: (s) => s.ui.sectioningAuto,
76288
+ setter: (s, v) => s.ui.sectioningAuto = v
76289
+ },
76290
+ {
76291
+ type: "toggle",
76292
+ key: SettingsPanelKeys.ControlBarSectioningSettings,
76293
+ label: "Settings",
76294
+ getter: (s) => s.ui.sectioningSettings,
76295
+ setter: (s, v) => s.ui.sectioningSettings = v
76296
+ }
76297
+ ];
76298
+ }
76299
+ function getControlBarVisibilitySettings() {
76300
+ return [
76301
+ {
76302
+ type: "subtitle",
76303
+ key: SettingsPanelKeys.ControlBarVisibilitySubtitle,
76304
+ title: "Control Bar - Visibility"
76305
+ },
76306
+ {
76307
+ type: "toggle",
76308
+ key: SettingsPanelKeys.ControlBarVisibilityClearSelection,
76309
+ label: "Clear Selection",
76310
+ getter: (s) => s.ui.visibilityClearSelection,
76311
+ setter: (s, v) => s.ui.visibilityClearSelection = v
76312
+ },
76313
+ {
76314
+ type: "toggle",
76315
+ key: SettingsPanelKeys.ControlBarVisibilityShowAll,
76316
+ label: "Show All",
76317
+ getter: (s) => s.ui.visibilityShowAll,
76318
+ setter: (s, v) => s.ui.visibilityShowAll = v
76319
+ },
76320
+ {
76321
+ type: "toggle",
76322
+ key: SettingsPanelKeys.ControlBarVisibilityToggle,
76323
+ label: "Toggle",
76324
+ getter: (s) => s.ui.visibilityToggle,
76325
+ setter: (s, v) => s.ui.visibilityToggle = v
76326
+ },
76327
+ {
76328
+ type: "toggle",
76329
+ key: SettingsPanelKeys.ControlBarVisibilityIsolate,
76330
+ label: "Isolate",
76331
+ getter: (s) => s.ui.visibilityIsolate,
76332
+ setter: (s, v) => s.ui.visibilityIsolate = v
76333
+ },
76334
+ {
76335
+ type: "toggle",
76336
+ key: SettingsPanelKeys.ControlBarVisibilityAutoIsolate,
76337
+ label: "Auto Isolate",
76338
+ getter: (s) => s.ui.visibilityAutoIsolate,
76339
+ setter: (s, v) => s.ui.visibilityAutoIsolate = v
76340
+ },
76341
+ {
76342
+ type: "toggle",
76343
+ key: SettingsPanelKeys.ControlBarVisibilitySettings,
76344
+ label: "Settings",
76345
+ getter: (s) => s.ui.visibilitySettings,
76346
+ setter: (s, v) => s.ui.visibilitySettings = v
76347
+ }
76348
+ ];
76349
+ }
76350
+ function getControlBarVariousSettings() {
76351
+ return [
76352
+ {
76353
+ type: "subtitle",
76354
+ key: SettingsPanelKeys.ControlBarMiscSubtitle,
76355
+ title: "Control Bar - Settings"
76356
+ },
76357
+ {
76358
+ type: "toggle",
76359
+ key: SettingsPanelKeys.ControlBarMiscShowProjectInspectorButtonToggle,
76360
+ label: "Project Inspector",
76361
+ getter: (s) => s.ui.miscProjectInspector,
76362
+ setter: (s, v) => s.ui.miscProjectInspector = v
76363
+ },
76364
+ {
76365
+ type: "toggle",
76366
+ key: SettingsPanelKeys.ControlBarMiscShowSettingsButtonToggle,
76367
+ label: "Settings",
76368
+ getter: (s) => s.ui.miscSettings,
76369
+ setter: (s, v) => s.ui.miscSettings = v
76370
+ },
76371
+ {
76372
+ type: "toggle",
76373
+ key: SettingsPanelKeys.ControlBarMiscShowHelpButtonToggle,
76374
+ label: "Help",
76375
+ getter: (s) => s.ui.miscHelp,
76376
+ setter: (s, v) => s.ui.miscHelp = v
76377
+ },
76378
+ {
76379
+ type: "toggle",
76380
+ key: SettingsPanelKeys.ControlBarMiscShowMaximiseButtonToggle,
76381
+ label: "Maximise",
76382
+ getter: (s) => s.ui.miscMaximise,
76383
+ setter: (s, v) => s.ui.miscMaximise = v
76384
+ }
76385
+ ];
76386
+ }
76387
+ function getPanelsVisibilitySettings() {
76388
+ return [
76389
+ {
76390
+ type: "subtitle",
76391
+ key: SettingsPanelKeys.PanelsSubtitle,
76392
+ title: "Panels Visibility"
76393
+ },
76394
+ {
76395
+ type: "toggle",
76396
+ key: SettingsPanelKeys.PanelsShowLogoToggle,
76397
+ label: "Logo",
76398
+ getter: (s) => s.ui.panelLogo,
76399
+ setter: (s, v) => s.ui.panelLogo = v
76400
+ },
76401
+ {
76402
+ type: "toggle",
76403
+ key: SettingsPanelKeys.PanelsShowBimTreeToggle,
76404
+ label: "Bim Tree",
76405
+ getter: (s) => s.ui.panelBimTree,
76406
+ setter: (s, v) => s.ui.panelBimTree = v
76407
+ },
76408
+ {
76409
+ type: "toggle",
76410
+ key: SettingsPanelKeys.PanelsShowBimInfoToggle,
76411
+ label: "Bim Info",
76412
+ getter: (s) => s.ui.panelBimInfo,
76413
+ setter: (s, v) => s.ui.panelBimInfo = v
76414
+ },
76415
+ {
76416
+ type: "toggle",
76417
+ key: SettingsPanelKeys.PanelsShowAxesPanelToggle,
76418
+ label: "Axes",
76419
+ getter: (s) => s.ui.panelAxes,
76420
+ setter: (s, v) => s.ui.panelAxes = v
76421
+ },
76422
+ {
76423
+ type: "toggle",
76424
+ key: SettingsPanelKeys.PanelsShowPerformancePanelToggle,
76425
+ label: "Performance",
76426
+ getter: (s) => s.ui.panelPerformance,
76427
+ setter: (s, v) => s.ui.panelPerformance = v
76428
+ },
76429
+ {
76430
+ type: "toggle",
76431
+ key: SettingsPanelKeys.ControlBarShowControlBarToggle,
76432
+ label: "Control Bar",
76433
+ getter: (s) => s.ui.panelControlBar,
76434
+ setter: (s, v) => s.ui.panelControlBar = v
76435
+ }
76436
+ ];
76437
+ }
76438
+ function getInputsSettings(viewer) {
76439
+ return [
76440
+ {
76441
+ type: "subtitle",
76442
+ key: SettingsPanelKeys.InputsSubtitle,
76443
+ title: "Inputs"
76444
+ },
76445
+ {
76446
+ type: "box",
76447
+ key: SettingsPanelKeys.InputsScrollSpeedBox,
76448
+ label: "Scroll Speed",
76449
+ info: "[0.1,10]",
76450
+ transform: (n) => MathUtils.clamp(n, 0.1, 10),
76451
+ getter: (_s) => viewer.inputs.scrollSpeed,
76452
+ setter: (_s, v) => {
76453
+ viewer.inputs.scrollSpeed = v;
76454
+ }
76455
+ }
76456
+ ];
76457
+ }
76458
+ function getAxesPanelSettings() {
76459
+ return [
76460
+ {
76461
+ type: "subtitle",
76462
+ key: SettingsPanelKeys.AxesSubtitle,
76463
+ title: "Axes Panel"
76464
+ },
76465
+ {
76466
+ type: "toggle",
76467
+ key: SettingsPanelKeys.AxesShowOrthographicButtonToggle,
76468
+ label: "Orthographic Camera",
76469
+ getter: (s) => s.ui.axesOrthographic,
76470
+ setter: (s, v) => s.ui.axesOrthographic = v
76471
+ },
76472
+ {
76473
+ type: "toggle",
76474
+ key: SettingsPanelKeys.AxesShowResetCameraButtonToggle,
76475
+ label: "Reset Camera",
76476
+ getter: (s) => s.ui.axesHome,
76477
+ setter: (s, v) => s.ui.axesHome = v
76478
+ }
76479
+ ];
76480
+ }
76481
+ function getControlBarMeasureSettings() {
76482
+ return [
76483
+ {
76484
+ type: "subtitle",
76485
+ key: SettingsPanelKeys.ControlBarToolsSubtitle,
76486
+ title: "Control Bar - Measurement"
76487
+ },
76488
+ {
76489
+ type: "toggle",
76490
+ key: SettingsPanelKeys.ControlBarToolsShowMeasuringModeButtonToggle,
76491
+ label: "Enable",
76492
+ getter: (s) => s.ui.measureEnable,
76493
+ setter: (s, v) => s.ui.measureEnable = v
76494
+ }
76495
+ ];
76496
+ }
76497
+ function getWebglSettingsContent(viewer) {
76498
+ return [
76499
+ ...getInputsSettings(viewer),
76500
+ ...getPanelsVisibilitySettings(),
76501
+ ...getAxesPanelSettings(),
76502
+ ...getControlBarCursorSettings(),
76503
+ ...getControlBarCameraSettings(),
76504
+ ...getControlBarVisibilitySettings(),
76505
+ ...getControlBarMeasureSettings(),
76506
+ ...getControlBarSectionBoxSettings(),
76507
+ ...getControlBarVariousSettings()
76508
+ ];
76509
+ }
76510
+ function applyWebglSettings(settings2) {
76511
+ const performance2 = document.getElementsByClassName("vim-performance-div")[0];
76512
+ if (performance2) {
76513
+ if (isTrue(settings2.ui.panelPerformance)) {
76514
+ performance2.classList.remove("vc-hidden");
76515
+ } else {
76516
+ performance2.classList.add("vc-hidden");
76517
+ }
76518
+ }
76519
+ }
76001
76520
  function createViewer$1(container, settings2 = {}, coreSettings = {}) {
76002
76521
  const controllablePromise = new ControllablePromise();
76003
76522
  const cmpContainer = container instanceof HTMLElement ? createContainer(container) : container ?? createContainer();
@@ -76028,7 +76547,7 @@ Averrage Date/Second ${avgDataRatePS} kb
76028
76547
  return controllablePromise.promise;
76029
76548
  }
76030
76549
  function Viewer$1(props) {
76031
- const settings2 = useSettings(props.viewer, props.settings ?? {});
76550
+ const settings2 = useSettings(props.settings ?? {}, getDefaultSettings(), (s) => applyWebglSettings(s));
76032
76551
  const modal = React2.useRef(null);
76033
76552
  const sectionBoxRef = useWebglSectionBox(props.viewer);
76034
76553
  const isolationPanelHandle = React2.useRef(null);
@@ -76038,7 +76557,7 @@ Averrage Date/Second ${avgDataRatePS} kb
76038
76557
  const loader = React2.useRef(new ComponentLoader(props.viewer, modal, settings2.value));
76039
76558
  useViewerInput(props.viewer.inputs, camera2);
76040
76559
  const side = useSideState(
76041
- isTrue(settings2.value.ui.bimTreePanel) || isTrue(settings2.value.ui.bimInfoPanel),
76560
+ isTrue(settings2.value.ui.panelBimTree) || isTrue(settings2.value.ui.panelBimInfo),
76042
76561
  Math.min(props.container.root.clientWidth * 0.25, 340)
76043
76562
  );
76044
76563
  const [contextMenu2, setcontextMenu] = React2.useState();
@@ -76054,6 +76573,16 @@ Averrage Date/Second ${avgDataRatePS} kb
76054
76573
  side.setHasBim(((_a3 = viewerState.vim.get()) == null ? void 0 : _a3.bim) !== void 0);
76055
76574
  });
76056
76575
  React2.useEffect(() => {
76576
+ sectionBoxRef.showOffsetPanel.onChange.subscribe((show) => {
76577
+ if (show) {
76578
+ isolationRef.showPanel.set(false);
76579
+ }
76580
+ });
76581
+ isolationRef.showPanel.onChange.subscribe((show) => {
76582
+ if (show) {
76583
+ sectionBoxRef.showOffsetPanel.set(false);
76584
+ }
76585
+ });
76057
76586
  if (performanceRef.current) {
76058
76587
  addPerformanceCounter(performanceRef.current);
76059
76588
  }
@@ -76067,7 +76596,11 @@ Averrage Date/Second ${avgDataRatePS} kb
76067
76596
  loader: loader.current,
76068
76597
  isolation: isolationRef,
76069
76598
  camera: camera2,
76070
- settings: settings2,
76599
+ settings: {
76600
+ update: settings2.update,
76601
+ register: settings2.register,
76602
+ customize: (c) => settings2.customizer.set(c)
76603
+ },
76071
76604
  get isolationPanel() {
76072
76605
  return isolationPanelHandle.current;
76073
76606
  },
@@ -76113,7 +76646,7 @@ Averrage Date/Second ${avgDataRatePS} kb
76113
76646
  SettingsPanel,
76114
76647
  {
76115
76648
  visible: side.getContent() === "settings",
76116
- viewer: props.viewer,
76649
+ content: getWebglSettingsContent(props.viewer),
76117
76650
  settings: settings2
76118
76651
  }
76119
76652
  )
@@ -76133,16 +76666,16 @@ Averrage Date/Second ${avgDataRatePS} kb
76133
76666
  /* @__PURE__ */ jsxRuntimeExports.jsx(RestOfScreen, { side, content: () => {
76134
76667
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
76135
76668
  /* @__PURE__ */ jsxRuntimeExports.jsx(Overlay, { canvas: props.viewer.viewport.canvas }),
76136
- whenTrue(settings2.value.ui.logo, /* @__PURE__ */ jsxRuntimeExports.jsx(LogoMemo, {})),
76669
+ whenTrue(settings2.value.ui.panelLogo, /* @__PURE__ */ jsxRuntimeExports.jsx(LogoMemo, {})),
76137
76670
  /* @__PURE__ */ jsxRuntimeExports.jsx(
76138
76671
  ControlBar,
76139
76672
  {
76140
76673
  content: controlBar,
76141
- show: isTrue(settings2.value.ui.controlBar)
76674
+ show: isTrue(settings2.value.ui.panelControlBar)
76142
76675
  }
76143
76676
  ),
76144
76677
  /* @__PURE__ */ jsxRuntimeExports.jsx(SectionBoxPanel$1, { ref: sectionBoxPanelHandle, state: sectionBoxRef }),
76145
- /* @__PURE__ */ jsxRuntimeExports.jsx(IsolationPanel$1, { ref: isolationPanelHandle, state: isolationRef }),
76678
+ /* @__PURE__ */ jsxRuntimeExports.jsx(IsolationPanel$1, { ref: isolationPanelHandle, state: isolationRef, transparency: true }),
76146
76679
  /* @__PURE__ */ jsxRuntimeExports.jsx(
76147
76680
  AxesPanelMemo,
76148
76681
  {
@@ -76181,7 +76714,8 @@ Averrage Date/Second ${avgDataRatePS} kb
76181
76714
  const index$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
76182
76715
  __proto__: null,
76183
76716
  Viewer: Viewer$1,
76184
- createViewer: createViewer$1
76717
+ createViewer: createViewer$1,
76718
+ getDefaultSettings
76185
76719
  }, Symbol.toStringTag, { value: "Module" }));
76186
76720
  function getErrorMessage(state) {
76187
76721
  if (state.status !== "error") return void 0;
@@ -76247,11 +76781,13 @@ Averrage Date/Second ${avgDataRatePS} kb
76247
76781
  };
76248
76782
  return useSectionBox(ultraAdapter);
76249
76783
  }
76250
- function useUltraControlBar(viewer, section, isolation, camera2, customization) {
76251
- const sectionSectionBox2 = controlBarSectionBox(section, viewer.selection.any());
76252
- const selection = controlBarSelection(isolation);
76253
- const sectionCamera2 = controlBarCamera(camera2);
76254
- let bar = [selection, sectionCamera2, sectionSectionBox2];
76784
+ function useUltraControlBar(viewer, section, isolation, camera2, settings2, side, modal, customization) {
76785
+ let bar = [
76786
+ controlBarCamera(camera2, settings2.ui),
76787
+ controlBarVisibility(isolation, settings2.ui),
76788
+ controlBarSectionBox(section, viewer.selection.any(), settings2.ui),
76789
+ controlBarMiscUltra(modal, side, settings2)
76790
+ ];
76255
76791
  bar = (customization == null ? void 0 : customization(bar)) ?? bar;
76256
76792
  return bar;
76257
76793
  }
@@ -76355,6 +76891,9 @@ Averrage Date/Second ${avgDataRatePS} kb
76355
76891
  }
76356
76892
  }
76357
76893
  },
76894
+ enableTransparency: (enable) => {
76895
+ console.log("enableTransparency not implemented");
76896
+ },
76358
76897
  getGhostOpacity: () => viewer.renderer.ghostOpacity,
76359
76898
  setGhostOpacity: (opacity) => {
76360
76899
  viewer.renderer.ghostOpacity = opacity;
@@ -76396,7 +76935,73 @@ Averrage Date/Second ${avgDataRatePS} kb
76396
76935
  function allButSelection(viewer, vim) {
76397
76936
  return false;
76398
76937
  }
76399
- function createViewer(container) {
76938
+ function getDefaultUltraSettings() {
76939
+ return {
76940
+ ui: {
76941
+ // panels
76942
+ panelLogo: true,
76943
+ panelControlBar: true,
76944
+ // Control bar - cursors
76945
+ cursorOrbit: true,
76946
+ cursorLookAround: true,
76947
+ cursorPan: true,
76948
+ cursorZoom: true,
76949
+ // Control bar - camera
76950
+ cameraAuto: true,
76951
+ cameraFrameScene: true,
76952
+ cameraFrameSelection: true,
76953
+ // Control bar - tools
76954
+ sectioningEnable: true,
76955
+ sectioningFitToSelection: true,
76956
+ sectioningReset: true,
76957
+ sectioningShow: true,
76958
+ sectioningAuto: true,
76959
+ sectioningSettings: true,
76960
+ // Control bar - Visibility
76961
+ visibilityClearSelection: true,
76962
+ visibilityShowAll: true,
76963
+ visibilityToggle: true,
76964
+ visibilityIsolate: true,
76965
+ visibilityAutoIsolate: true,
76966
+ visibilitySettings: true,
76967
+ // Control bar - misc
76968
+ miscSettings: true,
76969
+ miscHelp: true
76970
+ }
76971
+ };
76972
+ }
76973
+ function getControlBarUltraSettings() {
76974
+ return [
76975
+ {
76976
+ type: "subtitle",
76977
+ key: SettingsPanelKeys.ControlBarMiscSubtitle,
76978
+ title: "Control Bar - Settings"
76979
+ },
76980
+ {
76981
+ type: "toggle",
76982
+ key: SettingsPanelKeys.ControlBarMiscShowSettingsButtonToggle,
76983
+ label: "Settings",
76984
+ getter: (s) => s.ui.miscSettings,
76985
+ setter: (s, v) => s.ui.miscSettings = v
76986
+ },
76987
+ {
76988
+ type: "toggle",
76989
+ key: SettingsPanelKeys.ControlBarMiscShowHelpButtonToggle,
76990
+ label: "Help",
76991
+ getter: (s) => s.ui.miscHelp,
76992
+ setter: (s, v) => s.ui.miscHelp = v
76993
+ }
76994
+ ];
76995
+ }
76996
+ function getUltraSettingsContent(viewer) {
76997
+ return [
76998
+ ...getControlBarCameraSettings(),
76999
+ ...getControlBarVisibilitySettings(),
77000
+ ...getControlBarSectionBoxSettings(),
77001
+ ...getControlBarUltraSettings()
77002
+ ];
77003
+ }
77004
+ function createViewer(container, settings2) {
76400
77005
  const controllablePromise = new ControllablePromise();
76401
77006
  const cmpContainer = container instanceof HTMLElement ? createContainer(container) : container ?? createContainer();
76402
77007
  const core = Viewer$2.createWithCanvas(cmpContainer.gfx);
@@ -76415,6 +77020,7 @@ Averrage Date/Second ${avgDataRatePS} kb
76415
77020
  {
76416
77021
  container: cmpContainer,
76417
77022
  core,
77023
+ settings: settings2,
76418
77024
  onMount: (cmp) => controllablePromise.resolve(attachDispose(cmp))
76419
77025
  }
76420
77026
  )
@@ -76422,18 +77028,38 @@ Averrage Date/Second ${avgDataRatePS} kb
76422
77028
  return controllablePromise.promise;
76423
77029
  }
76424
77030
  function Viewer(props) {
76425
- const sectionBox2 = useUltraSectionBox(props.core);
76426
- const camera2 = useUltraCamera(props.core, sectionBox2);
77031
+ const settings2 = useSettings(props.settings ?? {}, getDefaultUltraSettings());
77032
+ const sectionBoxRef = useUltraSectionBox(props.core);
77033
+ const camera2 = useUltraCamera(props.core, sectionBoxRef);
76427
77034
  const isolationPanelHandle = React2.useRef(null);
76428
77035
  const sectionBoxPanelHandle = React2.useRef(null);
76429
77036
  const modalHandle = React2.useRef(null);
76430
77037
  const side = useSideState(true, 400);
76431
77038
  const [_, setSelectState] = React2.useState(0);
76432
77039
  const [controlBarCustom, setControlBarCustom] = React2.useState(() => (c) => c);
76433
- const isolation = useUltraIsolation(props.core);
76434
- const controlBar = useUltraControlBar(props.core, sectionBox2, isolation, camera2, (_2) => _2);
77040
+ const isolationRef = useUltraIsolation(props.core);
77041
+ const controlBar = useUltraControlBar(
77042
+ props.core,
77043
+ sectionBoxRef,
77044
+ isolationRef,
77045
+ camera2,
77046
+ settings2.value,
77047
+ side,
77048
+ modalHandle.current,
77049
+ (_2) => _2
77050
+ );
76435
77051
  useViewerInput(props.core.inputs, camera2);
76436
77052
  React2.useEffect(() => {
77053
+ sectionBoxRef.showOffsetPanel.onChange.subscribe((show) => {
77054
+ if (show) {
77055
+ isolationRef.showPanel.set(false);
77056
+ }
77057
+ });
77058
+ isolationRef.showPanel.onChange.subscribe((show) => {
77059
+ if (show) {
77060
+ sectionBoxRef.showOffsetPanel.set(false);
77061
+ }
77062
+ });
76437
77063
  props.core.onStateChanged.subscribe((state) => updateModal(modalHandle, state));
76438
77064
  props.core.selection.onSelectionChanged.subscribe(() => {
76439
77065
  setSelectState((i2) => (i2 + 1) % 2);
@@ -76443,9 +77069,14 @@ Averrage Date/Second ${avgDataRatePS} kb
76443
77069
  get modal() {
76444
77070
  return modalHandle.current;
76445
77071
  },
76446
- isolation,
76447
- sectionBox: sectionBox2,
77072
+ isolation: isolationRef,
77073
+ sectionBox: sectionBoxRef,
76448
77074
  camera: camera2,
77075
+ settings: {
77076
+ update: settings2.update,
77077
+ register: settings2.register,
77078
+ customize: (c) => settings2.customizer.set(c)
77079
+ },
76449
77080
  get isolationPanel() {
76450
77081
  return isolationPanelHandle.current;
76451
77082
  },
@@ -76460,20 +77091,37 @@ Averrage Date/Second ${avgDataRatePS} kb
76460
77091
  load: patchLoad(props.core, modalHandle)
76461
77092
  });
76462
77093
  }, []);
77094
+ const sidePanel = () => /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
77095
+ SettingsPanel,
77096
+ {
77097
+ visible: side.getContent() === "settings",
77098
+ content: getUltraSettingsContent(props.core),
77099
+ settings: settings2
77100
+ }
77101
+ ) });
76463
77102
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
77103
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
77104
+ SidePanelMemo,
77105
+ {
77106
+ container: props.container,
77107
+ viewer: props.core,
77108
+ side,
77109
+ content: sidePanel
77110
+ }
77111
+ ),
76464
77112
  /* @__PURE__ */ jsxRuntimeExports.jsx(RestOfScreen, { side, content: () => {
76465
77113
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
76466
- whenTrue(true, /* @__PURE__ */ jsxRuntimeExports.jsx(LogoMemo, {})),
77114
+ whenTrue(settings2.value.ui.panelLogo, /* @__PURE__ */ jsxRuntimeExports.jsx(LogoMemo, {})),
76467
77115
  /* @__PURE__ */ jsxRuntimeExports.jsx(Overlay, { canvas: props.core.viewport.canvas }),
76468
77116
  /* @__PURE__ */ jsxRuntimeExports.jsx(
76469
77117
  ControlBar,
76470
77118
  {
76471
77119
  content: controlBarCustom(controlBar),
76472
- show: true
77120
+ show: isTrue(settings2.value.ui.panelControlBar)
76473
77121
  }
76474
77122
  ),
76475
- /* @__PURE__ */ jsxRuntimeExports.jsx(SectionBoxPanel$1, { ref: sectionBoxPanelHandle, state: sectionBox2 }),
76476
- /* @__PURE__ */ jsxRuntimeExports.jsx(IsolationPanel$1, { ref: isolationPanelHandle, state: isolation })
77123
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SectionBoxPanel$1, { ref: sectionBoxPanelHandle, state: sectionBoxRef }),
77124
+ /* @__PURE__ */ jsxRuntimeExports.jsx(IsolationPanel$1, { ref: isolationPanelHandle, state: isolationRef, transparency: false })
76477
77125
  ] });
76478
77126
  } }),
76479
77127
  /* @__PURE__ */ jsxRuntimeExports.jsx(Modal, { ref: modalHandle, canFollowLinks: true }),
@@ -76511,7 +77159,15 @@ Averrage Date/Second ${avgDataRatePS} kb
76511
77159
  const index$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
76512
77160
  __proto__: null,
76513
77161
  Viewer,
76514
- createViewer
77162
+ createViewer,
77163
+ getDefaultUltraSettings
77164
+ }, Symbol.toStringTag, { value: "Module" }));
77165
+ const supportUltra = "https://docs.vimaec.com/docs/vim-for-windows/configuring-vim-ultra";
77166
+ const supportControls = "https://docs.vimaec.com/docs/vim-cloud/webgl-navigation-and-controls-guide";
77167
+ const urls = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
77168
+ __proto__: null,
77169
+ supportControls,
77170
+ supportUltra
76515
77171
  }, Symbol.toStringTag, { value: "Module" }));
76516
77172
  const SectionBoxPanel = {
76517
77173
  Ids