vim-web 0.5.0-dev.17 → 0.5.0-dev.19

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 (48) hide show
  1. package/dist/style.css +37 -7
  2. package/dist/types/core-viewers/ultra/viewport.d.ts +6 -0
  3. package/dist/types/core-viewers/webgl/loader/mesh.d.ts +3 -1
  4. package/dist/types/core-viewers/webgl/loader/progressive/insertableMesh.d.ts +4 -2
  5. package/dist/types/core-viewers/webgl/loader/progressive/instancedMesh.d.ts +5 -0
  6. package/dist/types/core-viewers/webgl/viewer/gizmos/markers/gizmoMarker.d.ts +1 -0
  7. package/dist/types/core-viewers/webgl/viewer/rendering/renderer.d.ts +7 -0
  8. package/dist/types/core-viewers/webgl/viewer/viewport.d.ts +1 -1
  9. package/dist/types/react-viewers/bim/bimPanel.d.ts +3 -3
  10. package/dist/types/react-viewers/errors/errorStyle.d.ts +1 -1
  11. package/dist/types/react-viewers/helpers/reactUtils.d.ts +2 -1
  12. package/dist/types/react-viewers/helpers/utils.d.ts +8 -0
  13. package/dist/types/react-viewers/panels/axesPanel.d.ts +2 -1
  14. package/dist/types/react-viewers/panels/index.d.ts +1 -0
  15. package/dist/types/react-viewers/panels/isolationPanel.d.ts +2 -0
  16. package/dist/types/react-viewers/panels/sidePanel.d.ts +1 -1
  17. package/dist/types/react-viewers/settings/anySettings.d.ts +7 -0
  18. package/dist/types/react-viewers/settings/index.d.ts +1 -1
  19. package/dist/types/react-viewers/settings/settingsInputBox.d.ts +4 -0
  20. package/dist/types/react-viewers/settings/settingsItem.d.ts +30 -0
  21. package/dist/types/react-viewers/settings/settingsKeys.d.ts +46 -0
  22. package/dist/types/react-viewers/settings/settingsPanel.d.ts +5 -4
  23. package/dist/types/react-viewers/settings/settingsPanelContent.d.ts +6 -0
  24. package/dist/types/react-viewers/settings/settingsState.d.ts +11 -11
  25. package/dist/types/react-viewers/settings/settingsStorage.d.ts +3 -3
  26. package/dist/types/react-viewers/settings/settingsSubtitle.d.ts +2 -0
  27. package/dist/types/react-viewers/settings/settingsToggle.d.ts +11 -0
  28. package/dist/types/react-viewers/state/controlBarState.d.ts +40 -7
  29. package/dist/types/react-viewers/state/sharedIsolation.d.ts +2 -0
  30. package/dist/types/react-viewers/ultra/controlBar.d.ts +3 -1
  31. package/dist/types/react-viewers/ultra/index.d.ts +1 -0
  32. package/dist/types/react-viewers/ultra/settings.d.ts +10 -0
  33. package/dist/types/react-viewers/ultra/settingsPanel.d.ts +5 -0
  34. package/dist/types/react-viewers/ultra/viewer.d.ts +3 -1
  35. package/dist/types/react-viewers/ultra/viewerRef.d.ts +3 -0
  36. package/dist/types/react-viewers/urls.d.ts +0 -1
  37. package/dist/types/react-viewers/webgl/index.d.ts +1 -0
  38. package/dist/types/react-viewers/webgl/loading.d.ts +2 -2
  39. package/dist/types/react-viewers/webgl/settings.d.ts +36 -0
  40. package/dist/types/react-viewers/webgl/settingsPanel.d.ts +12 -0
  41. package/dist/types/react-viewers/webgl/viewer.d.ts +3 -3
  42. package/dist/types/react-viewers/webgl/viewerRef.d.ts +12 -5
  43. package/dist/vim-web.iife.js +1045 -481
  44. package/dist/vim-web.iife.js.map +1 -1
  45. package/dist/vim-web.js +1045 -481
  46. package/dist/vim-web.js.map +1 -1
  47. package/package.json +1 -1
  48. package/dist/types/react-viewers/settings/settings.d.ts +0 -61
@@ -48867,19 +48867,38 @@ void main() {
48867
48867
  return new InsertableSubmesh(this, index2);
48868
48868
  }
48869
48869
  /**
48870
- * Overrides mesh material, set to undefine to restore initial material.
48871
- */
48870
+ * Sets the material for this mesh.
48871
+ * Set to undefined to reset to original materials.
48872
+ */
48872
48873
  setMaterial(value) {
48873
- if (this._material === value) return;
48874
48874
  if (this.ignoreSceneMaterial) return;
48875
- 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;
48876
48883
  this.mesh.geometry.clearGroups();
48877
- if (value instanceof Array) {
48878
- value.forEach((m, i2) => {
48884
+ if (Array.isArray(mat)) {
48885
+ mat.forEach((_m, i2) => {
48879
48886
  this.mesh.geometry.addGroup(0, Infinity, i2);
48880
48887
  });
48881
48888
  }
48882
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
+ }
48883
48902
  }
48884
48903
  class InstancedSubmesh {
48885
48904
  constructor(mesh, index2) {
@@ -48966,17 +48985,39 @@ void main() {
48966
48985
  }
48967
48986
  return submeshes;
48968
48987
  }
48988
+ /**
48989
+ * Sets the material for this mesh.
48990
+ * Set to undefined to reset to original materials.
48991
+ */
48969
48992
  setMaterial(value) {
48970
- if (this._material === value) return;
48971
48993
  if (this.ignoreSceneMaterial) return;
48972
- 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;
48973
49002
  this.mesh.geometry.clearGroups();
48974
- if (value instanceof Array) {
48975
- value.forEach((m, i2) => {
49003
+ if (Array.isArray(mat)) {
49004
+ mat.forEach((_m, i2) => {
48976
49005
  this.mesh.geometry.addGroup(0, Infinity, i2);
48977
49006
  });
48978
49007
  }
48979
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
+ }
48980
49021
  computeBoundingBoxes() {
48981
49022
  this.mesh.geometry.computeBoundingBox();
48982
49023
  const boxes = new Array(this.mesh.count);
@@ -50116,6 +50157,9 @@ void main() {
50116
50157
  get index() {
50117
50158
  return this._submesh.index;
50118
50159
  }
50160
+ get isRoom() {
50161
+ return false;
50162
+ }
50119
50163
  /**
50120
50164
  * Updates the underlying submesh and rebinds all attributes to the new mesh.
50121
50165
  * @param mesh - The new submesh to bind to this marker.
@@ -55887,7 +55931,7 @@ void main() {
55887
55931
  /**
55888
55932
  * Resizes the canvas and updates the camera to match new parent dimensions.
55889
55933
  */
55890
- ResizeToParent() {
55934
+ resizeToParent() {
55891
55935
  this._onResize.dispatch();
55892
55936
  }
55893
55937
  /**
@@ -56979,6 +57023,10 @@ void main() {
56979
57023
  * Indicates whether the scene should be re-rendered on change only.
56980
57024
  */
56981
57025
  __publicField(this, "onDemand");
57026
+ /**
57027
+ * The material that will be used when setting model material to undefined.
57028
+ */
57029
+ __publicField(this, "defaultModelMaterial");
56982
57030
  __publicField(this, "fitViewport", () => {
56983
57031
  const size = this._viewport.getParentSize();
56984
57032
  this.renderer.setPixelRatio(window.devicePixelRatio);
@@ -57050,11 +57098,14 @@ void main() {
57050
57098
  this._scene.threeScene.background = color;
57051
57099
  this.needsUpdate = true;
57052
57100
  }
57101
+ /**
57102
+ * Sets the material used to render models. If set to undefined, the default model or mesh material is used.
57103
+ */
57053
57104
  get modelMaterial() {
57054
57105
  return this._scene.modelMaterial;
57055
57106
  }
57056
57107
  set modelMaterial(material) {
57057
- this._scene.modelMaterial = material;
57108
+ this._scene.modelMaterial = material ?? this.defaultModelMaterial;
57058
57109
  }
57059
57110
  /**
57060
57111
  * Signal dispatched at the end of each frame if the scene was updated, such as visibility changes.
@@ -60877,6 +60928,12 @@ Averrage Date/Second ${avgDataRatePS} kb
60877
60928
  this._rpc.RPCSetCameraAspectRatio(this.canvas.offsetWidth, this.canvas.offsetHeight);
60878
60929
  }
60879
60930
  }
60931
+ /**
60932
+ * Resizes the viewport to match its parent's dimensions
60933
+ */
60934
+ resizeToParent() {
60935
+ this.update();
60936
+ }
60880
60937
  /**
60881
60938
  * Cleans up resources by removing resize observer and clearing timeouts
60882
60939
  */
@@ -63684,50 +63741,6 @@ Averrage Date/Second ${avgDataRatePS} kb
63684
63741
  visible,
63685
63742
  zoom
63686
63743
  }, Symbol.toStringTag, { value: "Module" }));
63687
- function getDefaultSettings() {
63688
- return {
63689
- capacity: {
63690
- canFollowUrl: true,
63691
- canGoFullScreen: true,
63692
- canDownload: true,
63693
- canReadLocalStorage: true
63694
- },
63695
- ui: {
63696
- logo: true,
63697
- performance: false,
63698
- bimTreePanel: true,
63699
- bimInfoPanel: true,
63700
- // axesPanel
63701
- axesPanel: true,
63702
- orthographic: true,
63703
- resetCamera: true,
63704
- // Control bar
63705
- controlBar: true,
63706
- // Control bar - cursors
63707
- orbit: true,
63708
- lookAround: true,
63709
- pan: true,
63710
- zoom: true,
63711
- zoomWindow: true,
63712
- // Control bar - camera
63713
- autoCamera: true,
63714
- frameScene: true,
63715
- frameSelection: true,
63716
- // Control bar - tools
63717
- sectioningMode: true,
63718
- measuringMode: true,
63719
- toggleIsolation: true,
63720
- // Control bar - settings
63721
- projectInspector: true,
63722
- settings: true,
63723
- help: true,
63724
- maximise: true
63725
- }
63726
- };
63727
- }
63728
- function createSettings(settings2) {
63729
- return settings2 !== void 0 ? deepmerge(getDefaultSettings(), settings2) : getDefaultSettings();
63730
- }
63731
63744
  function getLocalSettings(settings2 = {}) {
63732
63745
  try {
63733
63746
  const json = localStorage.getItem("viewer.settings");
@@ -63782,8 +63795,6 @@ Averrage Date/Second ${avgDataRatePS} kb
63782
63795
  }
63783
63796
  const index$4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
63784
63797
  __proto__: null,
63785
- createSettings,
63786
- getDefaultSettings,
63787
63798
  getLocalSettings,
63788
63799
  isFalse,
63789
63800
  isTrue,
@@ -67615,7 +67626,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67615
67626
  }
67616
67627
  const Style = style;
67617
67628
  const Ids$2 = controlBarIds;
67618
- function controlBarSectionBox(section, hasSelection) {
67629
+ function controlBarSectionBox(section, hasSelection, settings2) {
67619
67630
  return {
67620
67631
  id: Ids$2.sectionSectionBox,
67621
67632
  style: section.enable.get() ? Style.sectionNoPadStyle : Style.sectionDefaultStyle,
@@ -67623,6 +67634,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67623
67634
  buttons: [
67624
67635
  {
67625
67636
  id: Ids$2.buttonSectionBoxEnable,
67637
+ enabled: () => isTrue(settings2.sectioningEnable),
67626
67638
  tip: "Enable Section Box",
67627
67639
  isOn: () => section.enable.get(),
67628
67640
  style: (on) => Style.buttonExpandStyle(on),
@@ -67632,7 +67644,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67632
67644
  {
67633
67645
  id: Ids$2.buttonSectionBoxToSelection,
67634
67646
  tip: "Fit Section",
67635
- enabled: () => section.enable.get(),
67647
+ enabled: () => section.enable.get() && isTrue(settings2.sectioningFitToSelection),
67636
67648
  isOn: () => hasSelection,
67637
67649
  style: (on) => Style.buttonDisableStyle(on),
67638
67650
  action: () => section.sectionSelection.call(),
@@ -67641,7 +67653,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67641
67653
  {
67642
67654
  id: Ids$2.buttonSectionBoxToScene,
67643
67655
  tip: "Reset Section",
67644
- enabled: () => section.enable.get(),
67656
+ enabled: () => section.enable.get() && isTrue(settings2.sectioningReset),
67645
67657
  style: (on) => Style.buttonDefaultStyle(on),
67646
67658
  action: () => section.sectionScene.call(),
67647
67659
  icon: sectionBoxReset
@@ -67649,7 +67661,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67649
67661
  {
67650
67662
  id: Ids$2.buttonSectionBoxVisible,
67651
67663
  tip: "Show Section Box",
67652
- enabled: () => section.enable.get(),
67664
+ enabled: () => section.enable.get() && isTrue(settings2.sectioningShow),
67653
67665
  isOn: () => section.visible.get(),
67654
67666
  style: (on) => Style.buttonDefaultStyle(on),
67655
67667
  action: () => section.visible.set(!section.visible.get()),
@@ -67658,7 +67670,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67658
67670
  {
67659
67671
  id: Ids$2.buttonSectionBoxAuto,
67660
67672
  tip: "Auto Section",
67661
- enabled: () => section.enable.get(),
67673
+ enabled: () => section.enable.get() && isTrue(settings2.sectioningAuto),
67662
67674
  isOn: () => section.auto.get(),
67663
67675
  style: (on) => Style.buttonDefaultStyle(on),
67664
67676
  action: () => section.auto.set(!section.auto.get()),
@@ -67667,7 +67679,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67667
67679
  {
67668
67680
  id: Ids$2.buttonSectionBoxSettings,
67669
67681
  tip: "Section Settings",
67670
- enabled: () => section.enable.get(),
67682
+ enabled: () => section.enable.get() && isTrue(settings2.sectioningSettings),
67671
67683
  isOn: () => section.showOffsetPanel.get(),
67672
67684
  style: (on) => Style.buttonDefaultStyle(on),
67673
67685
  action: () => section.showOffsetPanel.set(!section.showOffsetPanel.get()),
@@ -67685,7 +67697,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67685
67697
  buttons: [
67686
67698
  {
67687
67699
  id: Ids$2.buttonCameraOrbit,
67688
- enabled: () => isTrue(settings2.ui.orbit),
67700
+ enabled: () => isTrue(settings2.cursorOrbit),
67689
67701
  tip: "Orbit",
67690
67702
  action: () => pointer2.onButton(PointerMode$1.ORBIT),
67691
67703
  icon: orbit,
@@ -67694,7 +67706,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67694
67706
  },
67695
67707
  {
67696
67708
  id: Ids$2.buttonCameraLook,
67697
- enabled: () => isTrue(settings2.ui.lookAround),
67709
+ enabled: () => isTrue(settings2.cursorLookAround),
67698
67710
  tip: "Look Around",
67699
67711
  action: () => pointer2.onButton(PointerMode$1.LOOK),
67700
67712
  icon: look,
@@ -67703,7 +67715,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67703
67715
  },
67704
67716
  {
67705
67717
  id: Ids$2.buttonCameraPan,
67706
- enabled: () => isTrue(settings2.ui.pan),
67718
+ enabled: () => isTrue(settings2.cursorPan),
67707
67719
  tip: "Pan",
67708
67720
  action: () => pointer2.onButton(PointerMode$1.PAN),
67709
67721
  icon: pan,
@@ -67712,7 +67724,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67712
67724
  },
67713
67725
  {
67714
67726
  id: Ids$2.buttonCameraZoom,
67715
- enabled: () => isTrue(settings2.ui.zoom),
67727
+ enabled: () => isTrue(settings2.cursorZoom),
67716
67728
  tip: "Zoom",
67717
67729
  action: () => pointer2.onButton(PointerMode$1.ZOOM),
67718
67730
  icon: zoom,
@@ -67722,7 +67734,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67722
67734
  ]
67723
67735
  };
67724
67736
  }
67725
- function controlBarMeasure(settings2, measure$1) {
67737
+ function controlBarMeasure(measure$1, settings2) {
67726
67738
  return {
67727
67739
  id: Ids$2.sectionActions,
67728
67740
  enable: () => true,
@@ -67730,7 +67742,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67730
67742
  buttons: [
67731
67743
  {
67732
67744
  id: Ids$2.buttonMeasure,
67733
- enabled: () => isTrue(settings2.ui.measuringMode),
67745
+ enabled: () => isTrue(settings2.measuringMode),
67734
67746
  isOn: () => measure$1.active,
67735
67747
  tip: "Measuring Mode",
67736
67748
  action: () => measure$1.toggle(),
@@ -67740,6 +67752,23 @@ Averrage Date/Second ${avgDataRatePS} kb
67740
67752
  ]
67741
67753
  };
67742
67754
  }
67755
+ function controlBarSettingsUltra(side, settings$1) {
67756
+ return {
67757
+ id: Ids$2.sectionSettings,
67758
+ enable: () => isTrue(settings$1.ui.settings),
67759
+ style: Style.sectionDefaultStyle,
67760
+ buttons: [
67761
+ {
67762
+ id: Ids$2.buttonSettings,
67763
+ enabled: () => isTrue(settings$1.ui.settings),
67764
+ tip: "Settings",
67765
+ action: () => side.toggleContent("settings"),
67766
+ icon: settings,
67767
+ style: Style.buttonDefaultStyle
67768
+ }
67769
+ ]
67770
+ };
67771
+ }
67743
67772
  function controlBarSettings(modal, side, settings$1) {
67744
67773
  const fullScreen = getFullScreenState();
67745
67774
  return {
@@ -67782,7 +67811,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67782
67811
  ]
67783
67812
  };
67784
67813
  }
67785
- function controlBarCamera(camera2) {
67814
+ function controlBarCamera(camera2, settings2) {
67786
67815
  return {
67787
67816
  id: Ids$2.sectionCamera,
67788
67817
  enable: () => true,
@@ -67790,6 +67819,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67790
67819
  buttons: [
67791
67820
  {
67792
67821
  id: Ids$2.buttonCameraAuto,
67822
+ enabled: () => isTrue(settings2.cameraAuto),
67793
67823
  tip: "Auto Camera",
67794
67824
  isOn: () => camera2.autoCamera.get(),
67795
67825
  action: () => camera2.autoCamera.set(!camera2.autoCamera.get()),
@@ -67798,7 +67828,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67798
67828
  },
67799
67829
  {
67800
67830
  id: Ids$2.buttonCameraFrameSelection,
67801
- // enabled: () => isTrue(settings.ui.zoomToFit), TODO: Implement ui toggles in Ultra
67831
+ enabled: () => isTrue(settings2.cameraFrameSelection),
67802
67832
  tip: "Frame Selection",
67803
67833
  action: () => camera2.frameSelection.call(),
67804
67834
  icon: frameSelection,
@@ -67807,7 +67837,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67807
67837
  },
67808
67838
  {
67809
67839
  id: Ids$2.buttonCameraFrameScene,
67810
- // enabled: () => isTrue(settings.ui.zoomToFit), TODO: Implement ui toggles in Ultra
67840
+ enabled: () => isTrue(settings2.cameraFrameScene),
67811
67841
  tip: "Frame All",
67812
67842
  action: () => camera2.frameScene.call(),
67813
67843
  icon: frameScene,
@@ -67817,7 +67847,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67817
67847
  ]
67818
67848
  };
67819
67849
  }
67820
- function controlBarSelection(isolation) {
67850
+ function controlBarVisibility(isolation, settings2) {
67821
67851
  const adapter = isolation.adapter.current;
67822
67852
  const someVisible = adapter.hasVisibleSelection() || !adapter.hasHiddenSelection();
67823
67853
  return {
@@ -67827,6 +67857,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67827
67857
  buttons: [
67828
67858
  {
67829
67859
  id: Ids$2.buttonClearSelection,
67860
+ enabled: () => isTrue(settings2.visibilityClearSelection),
67830
67861
  tip: "Clear Selection",
67831
67862
  action: () => adapter.clearSelection(),
67832
67863
  icon: pointer,
@@ -67836,6 +67867,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67836
67867
  {
67837
67868
  id: Ids$2.buttonShowAll,
67838
67869
  tip: "Show All",
67870
+ enabled: () => isTrue(settings2.visibilityShowAll),
67839
67871
  action: () => adapter.showAll(),
67840
67872
  icon: showAll,
67841
67873
  isOn: () => !isolation.autoIsolate.get() && isolation.visibility.get() !== "all",
@@ -67843,7 +67875,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67843
67875
  },
67844
67876
  {
67845
67877
  id: Ids$2.buttonHideSelection,
67846
- enabled: () => someVisible,
67878
+ enabled: () => someVisible && isTrue(settings2.visibilityToggle),
67847
67879
  tip: "Hide Selection",
67848
67880
  action: () => adapter.hideSelection(),
67849
67881
  icon: hideSelection,
@@ -67852,7 +67884,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67852
67884
  },
67853
67885
  {
67854
67886
  id: Ids$2.buttonShowSelection,
67855
- enabled: () => !someVisible,
67887
+ enabled: () => !someVisible && isTrue(settings2.visibilityToggle),
67856
67888
  tip: "Show Selection",
67857
67889
  action: () => adapter.showSelection(),
67858
67890
  icon: showSelection,
@@ -67861,6 +67893,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67861
67893
  },
67862
67894
  {
67863
67895
  id: Ids$2.buttonIsolateSelection,
67896
+ enabled: () => isTrue(settings2.visibilityIsolate),
67864
67897
  tip: "Isolate Selection",
67865
67898
  action: () => adapter.isolateSelection(),
67866
67899
  icon: isolateSelection,
@@ -67869,6 +67902,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67869
67902
  },
67870
67903
  {
67871
67904
  id: Ids$2.buttonAutoIsolate,
67905
+ enabled: () => isTrue(settings2.visibilityAutoIsolate),
67872
67906
  tip: "Auto Isolate",
67873
67907
  action: () => isolation.autoIsolate.set(!isolation.autoIsolate.get()),
67874
67908
  isOn: () => isolation.autoIsolate.get(),
@@ -67876,6 +67910,7 @@ Averrage Date/Second ${avgDataRatePS} kb
67876
67910
  },
67877
67911
  {
67878
67912
  id: Ids$2.buttonIsolationSettings,
67913
+ enabled: () => isTrue(settings2.visibilitySettings),
67879
67914
  tip: "Isolation Settings",
67880
67915
  action: () => isolation.showPanel.set(!isolation.showPanel.get()),
67881
67916
  icon: slidersHoriz,
@@ -67886,25 +67921,19 @@ Averrage Date/Second ${avgDataRatePS} kb
67886
67921
  }
67887
67922
  function useControlBar(viewer, camera2, modal, side, cursor, settings2, section, isolationRef, customization) {
67888
67923
  const measure2 = getMeasureState(viewer, cursor);
67889
- const pointerSection = controlBarPointer(viewer, camera2, settings2);
67890
- const actionSection = controlBarMeasure(settings2, measure2);
67891
- const sectionBoxSection = controlBarSectionBox(section, viewer.selection.any());
67892
- const settingsSection = controlBarSettings(modal, side, settings2);
67893
- const cameraSection = controlBarCamera(camera2);
67894
- const selectionSection = controlBarSelection(isolationRef);
67895
67924
  let controlBarSections = [
67896
- pointerSection,
67897
- actionSection,
67898
- cameraSection,
67899
- sectionBoxSection,
67900
- selectionSection,
67901
- settingsSection
67925
+ controlBarPointer(viewer, camera2, settings2.ui),
67926
+ controlBarCamera(camera2, settings2.ui),
67927
+ controlBarVisibility(isolationRef, settings2.ui),
67928
+ controlBarMeasure(measure2, settings2.ui),
67929
+ controlBarSectionBox(section, viewer.selection.any(), settings2.ui),
67930
+ controlBarSettings(modal, side, settings2)
67902
67931
  ];
67903
67932
  controlBarSections = (customization == null ? void 0 : customization(controlBarSections)) ?? controlBarSections;
67904
67933
  return controlBarSections;
67905
67934
  }
67906
67935
  function anyUiCursorButton(settings2) {
67907
- return isTrue(settings2.ui.orbit) || isTrue(settings2.ui.lookAround) || isTrue(settings2.ui.pan) || isTrue(settings2.ui.zoom) || isTrue(settings2.ui.zoomWindow);
67936
+ return isTrue(settings2.cursorOrbit) || isTrue(settings2.cursorLookAround) || isTrue(settings2.cursorPan) || isTrue(settings2.cursorZoom);
67908
67937
  }
67909
67938
  function anyUiSettingButton(settings2) {
67910
67939
  return isTrue(settings2.ui.projectInspector) || isTrue(settings2.ui.settings) || isTrue(settings2.ui.help) || isTrue(settings2.ui.maximise);
@@ -73919,7 +73948,7 @@ Averrage Date/Second ${avgDataRatePS} kb
73919
73948
  } else {
73920
73949
  props.container.gfx.style.left = "0px";
73921
73950
  }
73922
- props.viewer.viewport.ResizeToParent();
73951
+ props.viewer.viewport.resizeToParent();
73923
73952
  };
73924
73953
  const getMaxSize = () => {
73925
73954
  return props.container.root.clientWidth * MAX_WIDTH;
@@ -73978,7 +74007,10 @@ Averrage Date/Second ${avgDataRatePS} kb
73978
74007
  style: {
73979
74008
  position: "absolute"
73980
74009
  },
73981
- 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"}`,
74010
+ className: `vim-side-panel vc-top-0 vc-left-0 vc-z-20
74011
+ vc-bg-gray-lightest vc-text-gray-darker
74012
+ vc-border-r vc-border-gray-light
74013
+ ${props.side.getContent() !== "none" ? "" : "vc-hidden"}`,
73982
74014
  children: [
73983
74015
  /* @__PURE__ */ jsxRuntimeExports.jsx(
73984
74016
  "button",
@@ -74061,180 +74093,6 @@ Averrage Date/Second ${avgDataRatePS} kb
74061
74093
  [side, width]
74062
74094
  );
74063
74095
  }
74064
- function SettingsPanel(props) {
74065
- if (!props.visible) return null;
74066
- const toggleElement = (label, state, action) => {
74067
- 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: [
74068
- /* @__PURE__ */ jsxRuntimeExports.jsx(
74069
- "input",
74070
- {
74071
- type: "checkbox",
74072
- checked: state,
74073
- onChange: action,
74074
- className: "vim-settings-checkbox vc-checked:bg-primary-royal vc-mr-2 vc-rounded vc-border vc-border-gray-medium "
74075
- }
74076
- ),
74077
- " ",
74078
- label
74079
- ] });
74080
- };
74081
- const settingsToggle = (label, getter, setter) => {
74082
- const value = getter(props.settings.value);
74083
- if (value === "AlwaysTrue" || value === "AlwaysFalse") {
74084
- return null;
74085
- }
74086
- return toggleElement(label, value, () => {
74087
- const value2 = getter(props.settings.value);
74088
- props.settings.update((s) => setter(s, !value2));
74089
- });
74090
- };
74091
- const settingsBox = (label, info, transform, getter, setter) => {
74092
- const ref = React2.useRef(null);
74093
- React2.useEffect(() => {
74094
- ref.current.value = props.viewer.inputs.scrollSpeed.toFixed(2);
74095
- }, []);
74096
- getter(props.settings.value).toString();
74097
- const update = (event) => {
74098
- const str = event.target.value;
74099
- const n = Number.parseFloat(str);
74100
- if (Number.isNaN(n)) {
74101
- event.target.value = getter(props.settings.value).toString();
74102
- } else {
74103
- const value2 = transform(n);
74104
- event.target.value = value2.toString();
74105
- props.settings.update((s) => setter(s, value2));
74106
- }
74107
- };
74108
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vc-box-input vc-my-1", children: [
74109
- /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { htmlFor: "textbox", className: "vc-w-3 vc-h-2", children: [
74110
- label,
74111
- ":"
74112
- ] }),
74113
- /* @__PURE__ */ jsxRuntimeExports.jsx("input", { ref, type: "text", className: "vim-settings-textbox vc-w-14 vc-ml-1 vc-p-1", onBlur: (e) => update(e) }),
74114
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { htmlFor: "textbox", className: "vc-w-3 vc-h-2 vc-text-gray vc-ml-1", children: info })
74115
- ] });
74116
- };
74117
- function settingsSubtitle(title2) {
74118
- return /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "vc-subtitle", children: title2 });
74119
- }
74120
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
74121
- "div",
74122
- {
74123
- className: "vc-absolute vc-inset-0",
74124
- children: [
74125
- /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "vc-title", children: "Settings " }),
74126
- /* @__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: [
74127
- settingsSubtitle("Inputs"),
74128
- settingsBox(
74129
- "Scroll Speed",
74130
- "[0.1,10]",
74131
- (n) => MathUtils.clamp(n, 0.1, 10),
74132
- (s) => props.viewer.inputs.scrollSpeed,
74133
- (s, v) => {
74134
- props.viewer.inputs.scrollSpeed = v;
74135
- }
74136
- ),
74137
- settingsSubtitle("Panels"),
74138
- settingsToggle(
74139
- "Show Logo",
74140
- (settings2) => settings2.ui.logo,
74141
- (settings2, value) => settings2.ui.logo = value
74142
- ),
74143
- settingsToggle(
74144
- "Show Bim Tree",
74145
- (settings2) => settings2.ui.bimTreePanel,
74146
- (settings2, value) => settings2.ui.bimTreePanel = value
74147
- ),
74148
- settingsToggle(
74149
- "Show Bim Info",
74150
- (settings2) => settings2.ui.bimInfoPanel,
74151
- (settings2, value) => settings2.ui.bimInfoPanel = value
74152
- ),
74153
- settingsToggle(
74154
- "Show Axes Panel",
74155
- (settings2) => settings2.ui.axesPanel,
74156
- (settings2, value) => settings2.ui.axesPanel = value
74157
- ),
74158
- settingsToggle(
74159
- "Show Performance Panel",
74160
- (settings2) => settings2.ui.performance,
74161
- (settings2, value) => settings2.ui.performance = value
74162
- ),
74163
- settingsSubtitle("Axes"),
74164
- settingsToggle(
74165
- "Show Orthographic Button",
74166
- (settings2) => settings2.ui.orthographic,
74167
- (settings2, value) => settings2.ui.orthographic = value
74168
- ),
74169
- settingsToggle(
74170
- "Show Reset Camera Button",
74171
- (settings2) => settings2.ui.resetCamera,
74172
- (settings2, value) => settings2.ui.resetCamera = value
74173
- ),
74174
- settingsSubtitle("Control Bar"),
74175
- settingsToggle(
74176
- "Show Control Bar",
74177
- (settings2) => settings2.ui.controlBar,
74178
- (settings2, value) => settings2.ui.controlBar = value
74179
- ),
74180
- settingsSubtitle("Control Bar - Cursors"),
74181
- settingsToggle(
74182
- "Show Orbit Button",
74183
- (settings2) => settings2.ui.orbit,
74184
- (settings2, value) => settings2.ui.orbit = value
74185
- ),
74186
- settingsToggle(
74187
- "Show Look Around Button",
74188
- (settings2) => settings2.ui.lookAround,
74189
- (settings2, value) => settings2.ui.lookAround = value
74190
- ),
74191
- settingsToggle(
74192
- "Show Pan Button",
74193
- (settings2) => settings2.ui.pan,
74194
- (settings2, value) => settings2.ui.pan = value
74195
- ),
74196
- settingsToggle(
74197
- "Show Zoom Button",
74198
- (settings2) => settings2.ui.zoom,
74199
- (settings2, value) => settings2.ui.zoom = value
74200
- ),
74201
- settingsToggle(
74202
- "Show Zoom Window Button",
74203
- (settings2) => settings2.ui.zoomWindow,
74204
- (settings2, value) => settings2.ui.zoomWindow = value
74205
- ),
74206
- settingsSubtitle("Control Bar - Tools"),
74207
- settingsToggle(
74208
- "Show Measuring Mode Button",
74209
- (settings2) => settings2.ui.measuringMode,
74210
- (settings2, value) => settings2.ui.measuringMode = value
74211
- ),
74212
- settingsSubtitle("Control Bar - Settings"),
74213
- settingsToggle(
74214
- "Show Project Inspector Button",
74215
- (settings2) => settings2.ui.projectInspector,
74216
- (settings2, value) => settings2.ui.projectInspector = value
74217
- ),
74218
- settingsToggle(
74219
- "Show Settings Button",
74220
- (settings2) => settings2.ui.settings,
74221
- (settings2, value) => settings2.ui.settings = value
74222
- ),
74223
- settingsToggle(
74224
- "Show Help Button",
74225
- (settings2) => settings2.ui.help,
74226
- (settings2, value) => settings2.ui.help = value
74227
- ),
74228
- settingsToggle(
74229
- "Show Maximise Button",
74230
- (settings2) => settings2.ui.maximise,
74231
- (settings2, value) => settings2.ui.maximise = value
74232
- )
74233
- ] })
74234
- ]
74235
- }
74236
- );
74237
- }
74238
74096
  const MenuToastMemo = React2.memo(MenuToast);
74239
74097
  function MenuToast(props) {
74240
74098
  const [visible2, setVisible] = React2.useState();
@@ -74399,118 +74257,6 @@ Averrage Date/Second ${avgDataRatePS} kb
74399
74257
  }
74400
74258
  });
74401
74259
  }
74402
- function useSettings(viewer, value) {
74403
- const merged = createSettings(value);
74404
- const [settings2, setSettings] = React2.useState(merged);
74405
- const onUpdate = React2.useRef();
74406
- const update = function(updater) {
74407
- var _a3;
74408
- const next = { ...settings2 };
74409
- updater(next);
74410
- saveSettingsToLocal(next);
74411
- setSettings(next);
74412
- (_a3 = onUpdate.current) == null ? void 0 : _a3.call(onUpdate, next);
74413
- };
74414
- React2.useEffect(() => {
74415
- applySettings(viewer, settings2);
74416
- }, []);
74417
- React2.useEffect(() => {
74418
- applySettings(viewer, settings2);
74419
- }, [settings2]);
74420
- return React2.useMemo(
74421
- () => ({
74422
- value: settings2,
74423
- update,
74424
- register: (v) => onUpdate.current = v
74425
- }),
74426
- [settings2]
74427
- );
74428
- }
74429
- function applySettings(viewer, settings2) {
74430
- const performance2 = document.getElementsByClassName("vim-performance-div")[0];
74431
- if (performance2) {
74432
- if (isTrue(settings2.ui.performance)) {
74433
- performance2.classList.remove("vc-hidden");
74434
- } else {
74435
- performance2.classList.add("vc-hidden");
74436
- }
74437
- }
74438
- }
74439
- function createContainer(element) {
74440
- let root = element;
74441
- if (root === void 0) {
74442
- root = document.createElement("div");
74443
- document.body.append(root);
74444
- root.classList.add("vc-inset-0");
74445
- }
74446
- root.style.position = "absolute";
74447
- root.classList.add("vim-component");
74448
- const gfx = document.createElement("div");
74449
- gfx.className = "vim-gfx vc-absolute vc-inset-0 vc-pointer-events-none";
74450
- const ui = document.createElement("div");
74451
- ui.className = "vim-ui vc-absolute vc-inset-0";
74452
- root.append(gfx);
74453
- root.append(ui);
74454
- const dispose = () => {
74455
- if (element === void 0) {
74456
- root.remove();
74457
- } else {
74458
- root.classList.remove("vim-component");
74459
- gfx.remove();
74460
- ui.remove();
74461
- }
74462
- };
74463
- return { root, ui, gfx, dispose };
74464
- }
74465
- async function getElements(vim) {
74466
- var _a3, _b2, _c, _d, _e;
74467
- if (!vim.bim) return [];
74468
- const [elements, bimDocument, category, levels, worksets] = await Promise.all(
74469
- [
74470
- (_a3 = vim.bim.element) == null ? void 0 : _a3.getAll(),
74471
- (_b2 = vim.bim.bimDocument) == null ? void 0 : _b2.getAllTitle(),
74472
- (_c = vim.bim.category) == null ? void 0 : _c.getAllName(),
74473
- (_d = vim.bim.level) == null ? void 0 : _d.getAllElementIndex(),
74474
- (_e = vim.bim.workset) == null ? void 0 : _e.getAllName()
74475
- ]
74476
- );
74477
- const familyTypeMap = await getFamilyTypeNameMap(vim.bim);
74478
- if (!elements) return void 0;
74479
- const result = elements.map((e) => {
74480
- var _a4;
74481
- return {
74482
- ...e,
74483
- bimDocumentName: bimDocument ? bimDocument[e.bimDocumentIndex] : void 0,
74484
- categoryName: category ? category[e.categoryIndex] : void 0,
74485
- familyTypeName: familyTypeMap.get(e.index),
74486
- levelName: levels ? (_a4 = elements[levels[(e == null ? void 0 : e.levelIndex) ?? -1]]) == null ? void 0 : _a4.name : void 0,
74487
- worksetName: worksets ? worksets[(e == null ? void 0 : e.worksetIndex) ?? -1] : void 0
74488
- };
74489
- });
74490
- const real = result.filter((e) => vim.getElementFromIndex(e.index).hasMesh);
74491
- return real;
74492
- }
74493
- async function getFamilyTypeNameMap(document2) {
74494
- const [
74495
- familyInstanceElement,
74496
- familyInstanceFamilyType,
74497
- familyTypeElement,
74498
- elementName
74499
- ] = await Promise.all([
74500
- document2.familyInstance.getAllElementIndex(),
74501
- document2.familyInstance.getAllFamilyTypeIndex(),
74502
- document2.familyType.getAllElementIndex(),
74503
- document2.element.getAllName()
74504
- ]);
74505
- return new Map(
74506
- familyInstanceElement.map((e, i2) => {
74507
- const familyType = familyInstanceFamilyType == null ? void 0 : familyInstanceFamilyType[i2];
74508
- const element = Number.isInteger(familyType) ? familyTypeElement[familyType] : void 0;
74509
- const name = Number.isInteger(element) ? elementName == null ? void 0 : elementName[element] : void 0;
74510
- return [e, name];
74511
- })
74512
- );
74513
- }
74514
74260
  class MutableState {
74515
74261
  constructor(initial) {
74516
74262
  __publicField(this, "_value");
@@ -74539,24 +74285,28 @@ Averrage Date/Second ${avgDataRatePS} kb
74539
74285
  }
74540
74286
  };
74541
74287
  }
74542
- function useStateRef(initialValue) {
74543
- const [value, setValue] = React2.useState(initialValue);
74288
+ function useStateRef(initialValue, isLazy = false) {
74289
+ const getInitialValue = () => {
74290
+ if (isLazy && typeof initialValue === "function") {
74291
+ return initialValue();
74292
+ }
74293
+ return initialValue;
74294
+ };
74295
+ const [box, setBox] = React2.useState(() => ({
74296
+ current: getInitialValue()
74297
+ }));
74544
74298
  const ref = React2.useRef(void 0);
74545
74299
  if (ref.current === void 0) {
74546
- if (typeof initialValue === "function") {
74547
- ref.current = initialValue();
74548
- } else {
74549
- ref.current = initialValue;
74550
- }
74300
+ ref.current = getInitialValue();
74551
74301
  }
74552
74302
  const event = React2.useRef(new distExports.SimpleEventDispatcher());
74553
74303
  const validate = React2.useRef((next, current) => next);
74554
- const confirm = React2.useRef((value2) => value2);
74555
- const set2 = (value2) => {
74556
- const finalValue = validate.current(value2, ref.current);
74304
+ const confirm = React2.useRef((value) => value);
74305
+ const set2 = (value) => {
74306
+ const finalValue = validate.current(value, ref.current);
74557
74307
  if (finalValue === ref.current) return;
74558
74308
  ref.current = finalValue;
74559
- setValue(finalValue);
74309
+ setBox({ current: finalValue });
74560
74310
  event.current.dispatch(finalValue);
74561
74311
  };
74562
74312
  return {
@@ -74582,8 +74332,8 @@ Averrage Date/Second ${avgDataRatePS} kb
74582
74332
  */
74583
74333
  useOnChange(on) {
74584
74334
  React2.useEffect(() => {
74585
- return event.current.subscribe((value2) => {
74586
- const result = on(value2);
74335
+ return event.current.subscribe((value) => {
74336
+ const result = on(value);
74587
74337
  if (result instanceof Promise) {
74588
74338
  result.catch(console.error);
74589
74339
  }
@@ -74597,7 +74347,7 @@ Averrage Date/Second ${avgDataRatePS} kb
74597
74347
  * @returns The memoized value.
74598
74348
  */
74599
74349
  useMemo(on, deps) {
74600
- return React2.useMemo(() => on(value), [...deps || [], value]);
74350
+ return React2.useMemo(() => on(box.current), [...deps || [], box.current]);
74601
74351
  },
74602
74352
  /**
74603
74353
  * Sets a validation function to process any new state value before updating.
@@ -74774,38 +74524,146 @@ Averrage Date/Second ${avgDataRatePS} kb
74774
74524
  useRefresher,
74775
74525
  useStateRef
74776
74526
  }, Symbol.toStringTag, { value: "Module" }));
74777
- function useViewerState(viewer) {
74778
- const getVim = () => {
74527
+ function useSettings(value, defaultSettings, applySettings = () => {
74528
+ }) {
74529
+ const merged = createSettings(value, defaultSettings);
74530
+ const [settings2, setSettings] = React2.useState(merged);
74531
+ const onUpdate = React2.useRef();
74532
+ const customizer = useStateRef((settings22) => settings22);
74533
+ const update = function(updater) {
74779
74534
  var _a3;
74780
- const v = (_a3 = viewer.vims) == null ? void 0 : _a3[0];
74781
- return v;
74782
- };
74783
- const getSelection = () => {
74784
- return [...viewer.selection.getAll()].filter((o) => o.type === "Element3D");
74785
- };
74786
- const vim = useStateRef(getVim());
74787
- const selection = useStateRef(getSelection());
74788
- const allElements = useStateRef([]);
74789
- const filteredElements = useStateRef([]);
74790
- const filter2 = useStateRef("");
74791
- const applyFilter = () => {
74792
- const filtered = filterElements(allElements.get(), filter2.get());
74793
- filteredElements.set(filtered);
74535
+ const next = { ...settings2 };
74536
+ updater(next);
74537
+ saveSettingsToLocal(next);
74538
+ setSettings(next);
74539
+ (_a3 = onUpdate.current) == null ? void 0 : _a3.call(onUpdate, next);
74794
74540
  };
74795
- vim.useOnChange(async (v) => {
74796
- const elements = await getElements(v);
74797
- allElements.set(elements);
74798
- });
74799
- filter2.useOnChange((f) => {
74800
- applyFilter();
74801
- });
74802
- allElements.useOnChange((elements) => {
74803
- applyFilter();
74804
- });
74805
74541
  React2.useEffect(() => {
74806
- const subLoad = viewer.onVimLoaded.subscribe(() => {
74807
- vim.set(getVim());
74808
- });
74542
+ applySettings(settings2);
74543
+ }, []);
74544
+ React2.useEffect(() => {
74545
+ applySettings(settings2);
74546
+ }, [settings2]);
74547
+ return React2.useMemo(
74548
+ () => ({
74549
+ value: settings2,
74550
+ update,
74551
+ register: (v) => onUpdate.current = v,
74552
+ customizer
74553
+ }),
74554
+ [settings2]
74555
+ );
74556
+ }
74557
+ function createSettings(settings2, defaultSettings) {
74558
+ return settings2 !== void 0 ? deepmerge(defaultSettings, settings2) : defaultSettings;
74559
+ }
74560
+ function createContainer(element) {
74561
+ let root = element;
74562
+ if (root === void 0) {
74563
+ root = document.createElement("div");
74564
+ document.body.append(root);
74565
+ root.classList.add("vc-inset-0");
74566
+ }
74567
+ root.style.position = "absolute";
74568
+ root.classList.add("vim-component");
74569
+ const gfx = document.createElement("div");
74570
+ gfx.className = "vim-gfx vc-absolute vc-inset-0 vc-pointer-events-none";
74571
+ const ui = document.createElement("div");
74572
+ ui.className = "vim-ui vc-absolute vc-inset-0";
74573
+ root.append(gfx);
74574
+ root.append(ui);
74575
+ const dispose = () => {
74576
+ if (element === void 0) {
74577
+ root.remove();
74578
+ } else {
74579
+ root.classList.remove("vim-component");
74580
+ gfx.remove();
74581
+ ui.remove();
74582
+ }
74583
+ };
74584
+ return { root, ui, gfx, dispose };
74585
+ }
74586
+ async function getElements(vim) {
74587
+ var _a3, _b2, _c, _d, _e;
74588
+ if (!vim.bim) return [];
74589
+ const [elements, bimDocument, category, levels, worksets] = await Promise.all(
74590
+ [
74591
+ (_a3 = vim.bim.element) == null ? void 0 : _a3.getAll(),
74592
+ (_b2 = vim.bim.bimDocument) == null ? void 0 : _b2.getAllTitle(),
74593
+ (_c = vim.bim.category) == null ? void 0 : _c.getAllName(),
74594
+ (_d = vim.bim.level) == null ? void 0 : _d.getAllElementIndex(),
74595
+ (_e = vim.bim.workset) == null ? void 0 : _e.getAllName()
74596
+ ]
74597
+ );
74598
+ const familyTypeMap = await getFamilyTypeNameMap(vim.bim);
74599
+ if (!elements) return void 0;
74600
+ const result = elements.map((e) => {
74601
+ var _a4;
74602
+ return {
74603
+ ...e,
74604
+ bimDocumentName: bimDocument ? bimDocument[e.bimDocumentIndex] : void 0,
74605
+ categoryName: category ? category[e.categoryIndex] : void 0,
74606
+ familyTypeName: familyTypeMap.get(e.index),
74607
+ levelName: levels ? (_a4 = elements[levels[(e == null ? void 0 : e.levelIndex) ?? -1]]) == null ? void 0 : _a4.name : void 0,
74608
+ worksetName: worksets ? worksets[(e == null ? void 0 : e.worksetIndex) ?? -1] : void 0
74609
+ };
74610
+ });
74611
+ const real = result.filter((e) => vim.getElementFromIndex(e.index).hasMesh);
74612
+ return real;
74613
+ }
74614
+ async function getFamilyTypeNameMap(document2) {
74615
+ const [
74616
+ familyInstanceElement,
74617
+ familyInstanceFamilyType,
74618
+ familyTypeElement,
74619
+ elementName
74620
+ ] = await Promise.all([
74621
+ document2.familyInstance.getAllElementIndex(),
74622
+ document2.familyInstance.getAllFamilyTypeIndex(),
74623
+ document2.familyType.getAllElementIndex(),
74624
+ document2.element.getAllName()
74625
+ ]);
74626
+ return new Map(
74627
+ familyInstanceElement.map((e, i2) => {
74628
+ const familyType = familyInstanceFamilyType == null ? void 0 : familyInstanceFamilyType[i2];
74629
+ const element = Number.isInteger(familyType) ? familyTypeElement[familyType] : void 0;
74630
+ const name = Number.isInteger(element) ? elementName == null ? void 0 : elementName[element] : void 0;
74631
+ return [e, name];
74632
+ })
74633
+ );
74634
+ }
74635
+ function useViewerState(viewer) {
74636
+ const getVim = () => {
74637
+ var _a3;
74638
+ const v = (_a3 = viewer.vims) == null ? void 0 : _a3[0];
74639
+ return v;
74640
+ };
74641
+ const getSelection = () => {
74642
+ return [...viewer.selection.getAll()].filter((o) => o.type === "Element3D");
74643
+ };
74644
+ const vim = useStateRef(getVim());
74645
+ const selection = useStateRef(getSelection());
74646
+ const allElements = useStateRef([]);
74647
+ const filteredElements = useStateRef([]);
74648
+ const filter2 = useStateRef("");
74649
+ const applyFilter = () => {
74650
+ const filtered = filterElements(allElements.get(), filter2.get());
74651
+ filteredElements.set(filtered);
74652
+ };
74653
+ vim.useOnChange(async (v) => {
74654
+ const elements = await getElements(v);
74655
+ allElements.set(elements);
74656
+ });
74657
+ filter2.useOnChange((f) => {
74658
+ applyFilter();
74659
+ });
74660
+ allElements.useOnChange((elements) => {
74661
+ applyFilter();
74662
+ });
74663
+ React2.useEffect(() => {
74664
+ const subLoad = viewer.onVimLoaded.subscribe(() => {
74665
+ vim.set(getVim());
74666
+ });
74809
74667
  const subSelect = viewer.selection.onSelectionChanged.subscribe(() => {
74810
74668
  selection.set(getSelection());
74811
74669
  });
@@ -74915,12 +74773,8 @@ Averrage Date/Second ${avgDataRatePS} kb
74915
74773
  const vcLink = `${vcColorLink} vc-underline`;
74916
74774
  const vcLabel = "vc-text-[#3F444F]";
74917
74775
  const vcRoboto = "vc-font-['Roboto',sans-serif]";
74918
- function footer$1(url) {
74919
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: `vc-text-xs vc-font-normal ${vcColorSecondary}`, children: [
74920
- "More troubleshooting tips can be found",
74921
- " ",
74922
- link(url, "here")
74923
- ] });
74776
+ function footer$1() {
74777
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, {});
74924
74778
  }
74925
74779
  function mainText(text) {
74926
74780
  return /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: `vim-main-text vc-text-base ${vcColorPrimary} vc-mb-4 vc-font-normal`, children: text });
@@ -74968,20 +74822,11 @@ Averrage Date/Second ${avgDataRatePS} kb
74968
74822
  vcLink,
74969
74823
  vcRoboto
74970
74824
  }, Symbol.toStringTag, { value: "Module" }));
74971
- const support = "https://docs.vimaec.com";
74972
- const supportUltra = "https://docs.vimaec.com/docs/vim-for-windows/configuring-vim-ultra";
74973
- const supportControls = "https://docs.vimaec.com/docs/vim-cloud/webgl-navigation-and-controls-guide";
74974
- const urls = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
74975
- __proto__: null,
74976
- support,
74977
- supportControls,
74978
- supportUltra
74979
- }, Symbol.toStringTag, { value: "Module" }));
74980
74825
  function fileOpeningError(url) {
74981
74826
  return {
74982
74827
  title: "File Opening Error",
74983
74828
  body: serverFileOpeningErrorBody(url),
74984
- footer: footer$1(support),
74829
+ footer: footer$1(),
74985
74830
  canClose: false
74986
74831
  };
74987
74832
  }
@@ -75003,7 +74848,7 @@ Averrage Date/Second ${avgDataRatePS} kb
75003
74848
  return {
75004
74849
  title: "File Downloading Error",
75005
74850
  body: body$5(url, authToken, server),
75006
- footer: footer$1(support),
74851
+ footer: footer$1(),
75007
74852
  canClose: false
75008
74853
  };
75009
74854
  }
@@ -75032,7 +74877,7 @@ Averrage Date/Second ${avgDataRatePS} kb
75032
74877
  return {
75033
74878
  title: "File Loading Error",
75034
74879
  body: body$4(url),
75035
- footer: footer$1(support),
74880
+ footer: footer$1(),
75036
74881
  canClose: false
75037
74882
  };
75038
74883
  }
@@ -75052,11 +74897,18 @@ Averrage Date/Second ${avgDataRatePS} kb
75052
74897
  ])
75053
74898
  ] });
75054
74899
  }
74900
+ const supportUltra = "https://docs.vimaec.com/docs/vim-for-windows/configuring-vim-ultra";
74901
+ const supportControls = "https://docs.vimaec.com/docs/vim-cloud/webgl-navigation-and-controls-guide";
74902
+ const urls = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
74903
+ __proto__: null,
74904
+ supportControls,
74905
+ supportUltra
74906
+ }, Symbol.toStringTag, { value: "Module" }));
75055
74907
  function serverConnectionError(url) {
75056
74908
  return {
75057
74909
  title: "Connection Error",
75058
74910
  body: body$3(url, isLocalUrl(url)),
75059
- footer: footer$1(support),
74911
+ footer: footer$1(),
75060
74912
  canClose: false
75061
74913
  };
75062
74914
  }
@@ -75086,7 +74938,7 @@ Averrage Date/Second ${avgDataRatePS} kb
75086
74938
  return {
75087
74939
  title: "Compatibility Error",
75088
74940
  body: body$2(url, localVersion, remoteVersion),
75089
- footer: footer$1(support),
74941
+ footer: footer$1(),
75090
74942
  canClose: false
75091
74943
  };
75092
74944
  }
@@ -75115,7 +74967,7 @@ Averrage Date/Second ${avgDataRatePS} kb
75115
74967
  return {
75116
74968
  title: "Stream Error",
75117
74969
  body: body$1(),
75118
- footer: footer$1(support),
74970
+ footer: footer$1(),
75119
74971
  canClose: false
75120
74972
  };
75121
74973
  }
@@ -75892,7 +75744,8 @@ Averrage Date/Second ${avgDataRatePS} kb
75892
75744
  }
75893
75745
  const Ids = {
75894
75746
  showGhost: "isolationPanel.showGhost",
75895
- ghostOpacity: "isolationPanel.ghostOpacity"
75747
+ ghostOpacity: "isolationPanel.ghostOpacity",
75748
+ transparency: "isolationPanel.transparency"
75896
75749
  };
75897
75750
  const IsolationPanel$1 = React2.forwardRef(
75898
75751
  (props, ref) => {
@@ -75904,8 +75757,20 @@ Averrage Date/Second ${avgDataRatePS} kb
75904
75757
  anchorElement: document.getElementById("vim-control-bar"),
75905
75758
  showPanel: props.state.showPanel,
75906
75759
  entries: [
75907
- { type: "bool", id: Ids.showGhost, label: "Show Ghost", state: props.state.showGhost },
75908
- // { type: "bool", id: "showRooms", label: "Show Rooms", state: props.state.showRooms },
75760
+ {
75761
+ type: "bool",
75762
+ id: Ids.showGhost,
75763
+ label: "Show Ghost",
75764
+ state: props.state.showGhost
75765
+ },
75766
+ /*
75767
+ {
75768
+ type: "bool",
75769
+ id: "showRooms",
75770
+ label: "Show Rooms",
75771
+ state: props.state.showRooms
75772
+ },
75773
+ */
75909
75774
  {
75910
75775
  type: "number",
75911
75776
  id: Ids.ghostOpacity,
@@ -75915,6 +75780,13 @@ Averrage Date/Second ${avgDataRatePS} kb
75915
75780
  min: 0,
75916
75781
  max: 1,
75917
75782
  step: 0.05
75783
+ },
75784
+ {
75785
+ type: "bool",
75786
+ visible: () => props.transparency,
75787
+ id: Ids.transparency,
75788
+ label: "Transparency",
75789
+ state: props.state.transparency
75918
75790
  }
75919
75791
  ]
75920
75792
  }
@@ -75923,12 +75795,13 @@ Averrage Date/Second ${avgDataRatePS} kb
75923
75795
  );
75924
75796
  function useSharedIsolation(adapter) {
75925
75797
  const _adapter = React2.useRef(adapter);
75926
- const visibility = useStateRef(() => adapter.computeVisibility());
75798
+ const visibility = useStateRef(() => adapter.computeVisibility(), true);
75927
75799
  const autoIsolate2 = useStateRef(false);
75928
75800
  const showPanel = useStateRef(false);
75929
75801
  const showRooms = useStateRef(false);
75930
75802
  const showGhost = useStateRef(false);
75931
- const ghostOpacity = useStateRef(() => adapter.getGhostOpacity());
75803
+ const ghostOpacity = useStateRef(() => adapter.getGhostOpacity(), true);
75804
+ const transparency = useStateRef(true);
75932
75805
  const onAutoIsolate = useFuncRef(() => {
75933
75806
  if (adapter.hasSelection()) {
75934
75807
  adapter.isolateSelection();
@@ -75953,6 +75826,7 @@ Averrage Date/Second ${avgDataRatePS} kb
75953
75826
  });
75954
75827
  showGhost.useOnChange((v) => adapter.showGhost(v));
75955
75828
  showRooms.useOnChange((v) => adapter.setShowRooms(v));
75829
+ transparency.useOnChange((v) => adapter.enableTransparency(v));
75956
75830
  ghostOpacity.useValidate((next, current) => {
75957
75831
  return next <= 0 ? current : next;
75958
75832
  });
@@ -75966,7 +75840,8 @@ Averrage Date/Second ${avgDataRatePS} kb
75966
75840
  showRooms,
75967
75841
  ghostOpacity,
75968
75842
  onAutoIsolate,
75969
- onVisibilityChange
75843
+ onVisibilityChange,
75844
+ transparency
75970
75845
  };
75971
75846
  }
75972
75847
  function useWebglIsolation(viewer) {
@@ -75974,6 +75849,29 @@ Averrage Date/Second ${avgDataRatePS} kb
75974
75849
  return useSharedIsolation(adapter);
75975
75850
  }
75976
75851
  function createWebglIsolationAdapter(viewer) {
75852
+ var transparency = true;
75853
+ var ghost2 = false;
75854
+ var rooms = false;
75855
+ function updateMaterials() {
75856
+ 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] : (() => {
75857
+ throw new Error("Unreachable state in isolation materials");
75858
+ })();
75859
+ }
75860
+ function updateVisibility(elements, predicate) {
75861
+ if (elements === "all") {
75862
+ for (let v of viewer.vims) {
75863
+ for (let o of v.getAllElements()) {
75864
+ if (o.type === "Element3D") {
75865
+ o.visible = o.isRoom ? rooms : predicate(o);
75866
+ }
75867
+ }
75868
+ }
75869
+ } else {
75870
+ for (let o of elements) {
75871
+ o.visible = o.isRoom ? rooms : predicate(o);
75872
+ }
75873
+ }
75874
+ }
75977
75875
  return {
75978
75876
  onVisibilityChange: viewer.renderer.onSceneUpdated,
75979
75877
  onSelectionChanged: viewer.selection.onSelectionChanged,
@@ -75982,28 +75880,28 @@ Averrage Date/Second ${avgDataRatePS} kb
75982
75880
  hasVisibleSelection: () => viewer.selection.any() && viewer.selection.getAll().every((o) => o.visible),
75983
75881
  hasHiddenSelection: () => viewer.selection.any() && viewer.selection.getAll().every((o) => !o.visible),
75984
75882
  clearSelection: () => viewer.selection.clear(),
75985
- isolateSelection: () => updateAllVisibility(viewer, (o) => viewer.selection.has(o)),
75883
+ isolateSelection: () => updateVisibility("all", (o) => viewer.selection.has(o)),
75986
75884
  hideSelection: () => {
75987
- viewer.selection.getAll().forEach((o) => o.visible = false);
75885
+ updateVisibility(viewer.selection.getAll(), (o) => false);
75988
75886
  },
75989
75887
  showSelection: () => {
75990
- viewer.selection.getAll().forEach((o) => o.visible = true);
75888
+ updateVisibility(viewer.selection.getAll(), (o) => true);
75991
75889
  },
75992
75890
  hideAll: () => {
75993
- updateAllVisibility(viewer, (o) => false);
75891
+ updateVisibility("all", (o) => false);
75994
75892
  },
75995
75893
  showAll: () => {
75996
- updateAllVisibility(viewer, (o) => true);
75894
+ updateVisibility("all", (o) => true);
75997
75895
  },
75998
75896
  isolate: (instances) => {
75999
75897
  const set2 = new Set(instances);
76000
- updateAllVisibility(viewer, (o) => o.instances.some((i2) => set2.has(i2)));
75898
+ updateVisibility("all", (o) => o.instances.some((i2) => set2.has(i2)));
76001
75899
  },
76002
75900
  show: (instances) => {
76003
75901
  for (let i2 of instances) {
76004
75902
  for (let v of viewer.vims) {
76005
75903
  const o = v.getElement(i2);
76006
- o.visible = true;
75904
+ o.visible = o.isRoom ? rooms : true;
76007
75905
  }
76008
75906
  }
76009
75907
  },
@@ -76011,29 +75909,30 @@ Averrage Date/Second ${avgDataRatePS} kb
76011
75909
  for (let i2 of instances) {
76012
75910
  for (let v of viewer.vims) {
76013
75911
  const o = v.getElement(i2);
76014
- o.visible = false;
75912
+ o.visible = o.isRoom ? rooms : false;
76015
75913
  }
76016
75914
  }
76017
75915
  },
75916
+ enableTransparency: (enable) => {
75917
+ if (transparency !== enable) {
75918
+ transparency = enable;
75919
+ updateMaterials();
75920
+ }
75921
+ },
76018
75922
  showGhost: (show) => {
76019
- viewer.renderer.modelMaterial = show ? [viewer.materials.simple, viewer.materials.ghost] : void 0;
75923
+ ghost2 = show;
75924
+ updateMaterials();
76020
75925
  },
76021
75926
  getGhostOpacity: () => viewer.materials.ghostOpacity,
76022
75927
  setGhostOpacity: (opacity) => viewer.materials.ghostOpacity = opacity,
76023
- getShowRooms: () => true,
75928
+ getShowRooms: () => rooms,
76024
75929
  setShowRooms: (show) => {
76025
- console.log("setShowRooms not implemented");
76026
- }
76027
- };
76028
- }
76029
- function updateAllVisibility(viewer, predicate) {
76030
- for (let v of viewer.vims) {
76031
- for (let o of v.getAllElements()) {
76032
- if (o.type === "Element3D") {
76033
- o.visible = predicate(o);
75930
+ if (rooms !== show) {
75931
+ rooms = show;
75932
+ updateVisibility("all", (o) => o.visible);
76034
75933
  }
76035
75934
  }
76036
- }
75935
+ };
76037
75936
  }
76038
75937
  function getVisibilityState$1(viewer) {
76039
75938
  let all = true;
@@ -76059,6 +75958,574 @@ Averrage Date/Second ${avgDataRatePS} kb
76059
75958
  if (onlySelectionFlag) return "onlySelection";
76060
75959
  return "some";
76061
75960
  }
75961
+ function getDefaultSettings() {
75962
+ return {
75963
+ capacity: {
75964
+ canFollowUrl: true,
75965
+ canGoFullScreen: true,
75966
+ canDownload: true,
75967
+ canReadLocalStorage: true
75968
+ },
75969
+ ui: {
75970
+ logo: true,
75971
+ performance: false,
75972
+ bimTreePanel: true,
75973
+ bimInfoPanel: true,
75974
+ // axesPanel
75975
+ axesPanel: true,
75976
+ orthographic: true,
75977
+ resetCamera: true,
75978
+ // Control bar
75979
+ controlBar: true,
75980
+ // Control bar - cursors
75981
+ cursorOrbit: true,
75982
+ cursorLookAround: true,
75983
+ cursorPan: true,
75984
+ cursorZoom: true,
75985
+ // Control bar - camera
75986
+ cameraAuto: true,
75987
+ cameraFrameScene: true,
75988
+ cameraFrameSelection: true,
75989
+ // Control bar - tools
75990
+ sectioningEnable: true,
75991
+ sectioningFitToSelection: true,
75992
+ sectioningReset: true,
75993
+ sectioningShow: true,
75994
+ sectioningAuto: true,
75995
+ sectioningSettings: true,
75996
+ measuringMode: true,
75997
+ // Control bar - Visibility
75998
+ visibilityClearSelection: true,
75999
+ visibilityShowAll: true,
76000
+ visibilityToggle: true,
76001
+ visibilityIsolate: true,
76002
+ visibilityAutoIsolate: true,
76003
+ visibilitySettings: true,
76004
+ // Control bar - settings
76005
+ projectInspector: true,
76006
+ settings: true,
76007
+ help: true,
76008
+ maximise: true
76009
+ }
76010
+ };
76011
+ }
76012
+ function renderSettingsInputBox(settings2, item) {
76013
+ const ref = React2.useRef(null);
76014
+ React2.useEffect(() => {
76015
+ var _a3;
76016
+ ref.current.value = (_a3 = item.getter(settings2.value)) == null ? void 0 : _a3.toString();
76017
+ }, []);
76018
+ const update = (event) => {
76019
+ const str = event.target.value;
76020
+ const n = Number.parseFloat(str);
76021
+ if (Number.isNaN(n)) {
76022
+ event.target.value = item.getter(settings2.value).toString();
76023
+ } else {
76024
+ const value = item.transform(n);
76025
+ event.target.value = value.toString();
76026
+ settings2.update((s) => item.setter(s, value));
76027
+ }
76028
+ };
76029
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vc-box-input vc-my-1 ", children: [
76030
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { htmlFor: "textbox", className: "vc-w-3 vc-h-2", children: [
76031
+ item.label,
76032
+ ":"
76033
+ ] }),
76034
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76035
+ "input",
76036
+ {
76037
+ ref,
76038
+ type: "text",
76039
+ className: "vim-settings-textbox vc-border vc-rounded-sm vc-border-gray vc-w-14 vc-ml-1 vc-p-1",
76040
+ onBlur: update
76041
+ }
76042
+ ),
76043
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { htmlFor: "textbox", className: "vc-w-3 vc-h-2 vc-text-gray vc-ml-1", children: item.info })
76044
+ ] });
76045
+ }
76046
+ function renderSettingsToggle(settings2, item) {
76047
+ const value = item.getter(settings2.value);
76048
+ if (value === "AlwaysTrue" || value === "AlwaysFalse") return null;
76049
+ const handleChange = () => {
76050
+ const current = item.getter(settings2.value);
76051
+ settings2.update((s) => item.setter(s, !current));
76052
+ };
76053
+ 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: [
76054
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76055
+ "input",
76056
+ {
76057
+ type: "checkbox",
76058
+ checked: value,
76059
+ onChange: handleChange,
76060
+ className: "vim-settings-checkbox vc-checked:bg-primary-royal vc-mr-2 vc-rounded vc-border vc-border-gray-medium"
76061
+ }
76062
+ ),
76063
+ " ",
76064
+ item.label
76065
+ ] });
76066
+ }
76067
+ function renderSettingsSubtitle(item) {
76068
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "vc-subtitle", children: item.title });
76069
+ }
76070
+ function SettingsPanel(props) {
76071
+ if (!props.visible) return null;
76072
+ function renderItem(settings2, item) {
76073
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(React2.Fragment, { children: (() => {
76074
+ switch (item.type) {
76075
+ case "subtitle":
76076
+ return renderSettingsSubtitle(item);
76077
+ case "toggle":
76078
+ return renderSettingsToggle(settings2, item);
76079
+ case "box":
76080
+ return renderSettingsInputBox(settings2, item);
76081
+ case "element":
76082
+ return item.element;
76083
+ default:
76084
+ return null;
76085
+ }
76086
+ })() }, item.key);
76087
+ }
76088
+ const customizer = props.settings.customizer.get();
76089
+ const content2 = customizer ? customizer(props.content) : props.content;
76090
+ const sections = buildSections(content2);
76091
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vc-absolute vc-inset-0", children: [
76092
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "vc-title vc-mb-2", children: "Settings" }),
76093
+ /* @__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(
76094
+ "details",
76095
+ {
76096
+ open: true,
76097
+ 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 ",
76098
+ children: [
76099
+ /* @__PURE__ */ jsxRuntimeExports.jsx("summary", { className: "vim-settings-section-title vc-font-medium vc-text-sm vc-cursor-pointer", children: section.title }),
76100
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "vim-settings-section-content vc-mt-2 vc-space-y-2", children: section.items.map(
76101
+ (item) => renderItem(props.settings, item)
76102
+ ) })
76103
+ ]
76104
+ },
76105
+ section.key
76106
+ )) })
76107
+ ] });
76108
+ }
76109
+ function buildSections(items) {
76110
+ const sections = [];
76111
+ let current = null;
76112
+ for (const item of items) {
76113
+ if (item.type === "subtitle") {
76114
+ current = {
76115
+ key: item.key,
76116
+ title: item.title,
76117
+ items: []
76118
+ };
76119
+ sections.push(current);
76120
+ } else {
76121
+ if (!current) {
76122
+ current = {
76123
+ key: "default",
76124
+ title: "",
76125
+ items: []
76126
+ };
76127
+ sections.push(current);
76128
+ }
76129
+ current.items.push(item);
76130
+ }
76131
+ }
76132
+ return sections;
76133
+ }
76134
+ class SettingsPanelKeys {
76135
+ }
76136
+ // === Inputs ===
76137
+ __publicField(SettingsPanelKeys, "InputsSubtitle", "inputs");
76138
+ __publicField(SettingsPanelKeys, "InputsScrollSpeedBox", "scrollSpeed");
76139
+ // === Panels ===
76140
+ __publicField(SettingsPanelKeys, "PanelsSubtitle", "panels");
76141
+ __publicField(SettingsPanelKeys, "PanelsShowLogoToggle", "logo");
76142
+ __publicField(SettingsPanelKeys, "PanelsShowBimTreeToggle", "bimTree");
76143
+ __publicField(SettingsPanelKeys, "PanelsShowBimInfoToggle", "bimInfo");
76144
+ __publicField(SettingsPanelKeys, "PanelsShowAxesPanelToggle", "axesPanel");
76145
+ __publicField(SettingsPanelKeys, "PanelsShowPerformancePanelToggle", "performance");
76146
+ // === Axes ===
76147
+ __publicField(SettingsPanelKeys, "AxesSubtitle", "axes");
76148
+ __publicField(SettingsPanelKeys, "AxesShowOrthographicButtonToggle", "orthographic");
76149
+ __publicField(SettingsPanelKeys, "AxesShowResetCameraButtonToggle", "resetCamera");
76150
+ // === Control Bar ===
76151
+ __publicField(SettingsPanelKeys, "ControlBarSubtitle", "controlBar");
76152
+ __publicField(SettingsPanelKeys, "ControlBarShowControlBarToggle", "controlBarVisible");
76153
+ // --- Control Bar - Cursors ---
76154
+ __publicField(SettingsPanelKeys, "ControlBarCursorsSubtitle", "controlBarCursors");
76155
+ __publicField(SettingsPanelKeys, "ControlBarCursorsShowOrbitButtonToggle", "orbit");
76156
+ __publicField(SettingsPanelKeys, "ControlBarCursorsShowLookAroundButtonToggle", "lookAround");
76157
+ __publicField(SettingsPanelKeys, "ControlBarCursorsShowPanButtonToggle", "pan");
76158
+ __publicField(SettingsPanelKeys, "ControlBarCursorsShowZoomButtonToggle", "zoom");
76159
+ __publicField(SettingsPanelKeys, "ControlBarCursorsShowZoomWindowButtonToggle", "zoomWindow");
76160
+ // --- Control Bar - Tools ---
76161
+ __publicField(SettingsPanelKeys, "ControlBarToolsSubtitle", "controlBarTools");
76162
+ __publicField(SettingsPanelKeys, "ControlBarToolsShowMeasuringModeButtonToggle", "measuringMode");
76163
+ // --- Control Bar Camera ---
76164
+ __publicField(SettingsPanelKeys, "ControlBarCameraSubtitle", "settingsPanel.controlBar.Camera");
76165
+ __publicField(SettingsPanelKeys, "ControlBarAutoCamera", "settingsPanel.controlBar.autoCamera");
76166
+ __publicField(SettingsPanelKeys, "ControlBarFrameSelection", "settingsPanel.controlBar.frameSelection");
76167
+ __publicField(SettingsPanelKeys, "ControlBarFrameAll", "settingsPanel.controlBar.frameAll");
76168
+ // --- Control Bar - Sectioning ---
76169
+ __publicField(SettingsPanelKeys, "ControlBarSectioningSubtitle", "settingsPanel.controlBar.sectioning");
76170
+ __publicField(SettingsPanelKeys, "ControlBarSectioningEnable", "settingsPanel.controlBar.enableSectioning");
76171
+ __publicField(SettingsPanelKeys, "ControlBarSectioningFitToSelection", "settingsPanel.controlBar.fitToSelection");
76172
+ __publicField(SettingsPanelKeys, "ControlBarSectioningReset", "settingsPanel.controlBar.reset");
76173
+ __publicField(SettingsPanelKeys, "ControlBarSectioningShow", "settingsPanel.controlBar.show");
76174
+ __publicField(SettingsPanelKeys, "ControlBarSectioningAuto", "settingsPanel.controlBar.auto");
76175
+ __publicField(SettingsPanelKeys, "ControlBarSectioningSettings", "settingsPanel.controlBar.settings");
76176
+ // --- Control Bar - Visibility ---
76177
+ __publicField(SettingsPanelKeys, "ControlBarVisibilitySubtitle", "controlBar.visibility.subtitle");
76178
+ __publicField(SettingsPanelKeys, "ControlBarVisibilityClearSelection", "controlBar.visibility.clearSelection");
76179
+ __publicField(SettingsPanelKeys, "ControlBarVisibilityShowAll", "controlBar.visibility.showAll");
76180
+ __publicField(SettingsPanelKeys, "ControlBarVisibilityToggle", "controlBar.visibility.toggle");
76181
+ __publicField(SettingsPanelKeys, "ControlBarVisibilityIsolate", "controlBar.visibility.isolate");
76182
+ __publicField(SettingsPanelKeys, "ControlBarVisibilityAutoIsolate", "controlBar.visibility.autoIsolate");
76183
+ __publicField(SettingsPanelKeys, "ControlBarVisibilitySettings", "controlBar.visibility.settings");
76184
+ // --- Control Bar - Settings ---
76185
+ __publicField(SettingsPanelKeys, "ControlBarSettingsSubtitle", "controlBarSettings");
76186
+ __publicField(SettingsPanelKeys, "ControlBarSettingsShowProjectInspectorButtonToggle", "projectInspector");
76187
+ __publicField(SettingsPanelKeys, "ControlBarSettingsShowSettingsButtonToggle", "settingsButton");
76188
+ __publicField(SettingsPanelKeys, "ControlBarSettingsShowHelpButtonToggle", "help");
76189
+ __publicField(SettingsPanelKeys, "ControlBarSettingsShowMaximiseButtonToggle", "maximise");
76190
+ function getControlBarCursorSettings() {
76191
+ return [
76192
+ {
76193
+ type: "subtitle",
76194
+ key: SettingsPanelKeys.ControlBarCursorsSubtitle,
76195
+ title: "Control Bar - Cursors"
76196
+ },
76197
+ {
76198
+ type: "toggle",
76199
+ key: SettingsPanelKeys.ControlBarCursorsShowOrbitButtonToggle,
76200
+ label: "Orbit",
76201
+ getter: (s) => s.ui.cursorOrbit,
76202
+ setter: (s, v) => s.ui.cursorOrbit = v
76203
+ },
76204
+ {
76205
+ type: "toggle",
76206
+ key: SettingsPanelKeys.ControlBarCursorsShowLookAroundButtonToggle,
76207
+ label: "Look Around",
76208
+ getter: (s) => s.ui.cursorLookAround,
76209
+ setter: (s, v) => s.ui.cursorLookAround = v
76210
+ },
76211
+ {
76212
+ type: "toggle",
76213
+ key: SettingsPanelKeys.ControlBarCursorsShowPanButtonToggle,
76214
+ label: "Pan",
76215
+ getter: (s) => s.ui.cursorPan,
76216
+ setter: (s, v) => s.ui.cursorPan = v
76217
+ },
76218
+ {
76219
+ type: "toggle",
76220
+ key: SettingsPanelKeys.ControlBarCursorsShowZoomButtonToggle,
76221
+ label: "Zoom",
76222
+ getter: (s) => s.ui.cursorZoom,
76223
+ setter: (s, v) => s.ui.cursorZoom = v
76224
+ }
76225
+ ];
76226
+ }
76227
+ function getControlBarCameraSettings() {
76228
+ return [
76229
+ {
76230
+ type: "subtitle",
76231
+ key: SettingsPanelKeys.ControlBarCameraSubtitle,
76232
+ title: "Control Bar - Camera"
76233
+ },
76234
+ {
76235
+ type: "toggle",
76236
+ key: SettingsPanelKeys.ControlBarAutoCamera,
76237
+ label: "Auto Camera",
76238
+ getter: (s) => s.ui.cameraAuto,
76239
+ setter: (s, v) => s.ui.cameraAuto = v
76240
+ },
76241
+ {
76242
+ type: "toggle",
76243
+ key: SettingsPanelKeys.ControlBarFrameSelection,
76244
+ label: "Frame Selection",
76245
+ getter: (s) => s.ui.cameraFrameSelection,
76246
+ setter: (s, v) => s.ui.cameraFrameSelection = v
76247
+ },
76248
+ {
76249
+ type: "toggle",
76250
+ key: SettingsPanelKeys.ControlBarFrameAll,
76251
+ label: "Frame All",
76252
+ getter: (s) => s.ui.cameraFrameScene,
76253
+ setter: (s, v) => s.ui.cameraFrameScene = v
76254
+ }
76255
+ ];
76256
+ }
76257
+ function getControlBarSectionBoxSettings() {
76258
+ return [
76259
+ {
76260
+ type: "subtitle",
76261
+ key: SettingsPanelKeys.ControlBarSectioningSubtitle,
76262
+ title: "Control Bar - Sectioning"
76263
+ },
76264
+ {
76265
+ type: "toggle",
76266
+ key: SettingsPanelKeys.ControlBarSectioningEnable,
76267
+ label: "Enable Sectioning",
76268
+ getter: (s) => s.ui.sectioningEnable,
76269
+ setter: (s, v) => s.ui.sectioningEnable = v
76270
+ },
76271
+ {
76272
+ type: "toggle",
76273
+ key: SettingsPanelKeys.ControlBarSectioningFitToSelection,
76274
+ label: "Fit To Selection",
76275
+ getter: (s) => s.ui.sectioningFitToSelection,
76276
+ setter: (s, v) => s.ui.sectioningFitToSelection = v
76277
+ },
76278
+ {
76279
+ type: "toggle",
76280
+ key: SettingsPanelKeys.ControlBarSectioningReset,
76281
+ label: "Reset",
76282
+ getter: (s) => s.ui.sectioningReset,
76283
+ setter: (s, v) => s.ui.sectioningReset = v
76284
+ },
76285
+ {
76286
+ type: "toggle",
76287
+ key: SettingsPanelKeys.ControlBarSectioningShow,
76288
+ label: "Show",
76289
+ getter: (s) => s.ui.sectioningShow,
76290
+ setter: (s, v) => s.ui.sectioningShow = v
76291
+ },
76292
+ {
76293
+ type: "toggle",
76294
+ key: SettingsPanelKeys.ControlBarSectioningAuto,
76295
+ label: "Auto",
76296
+ getter: (s) => s.ui.sectioningAuto,
76297
+ setter: (s, v) => s.ui.sectioningAuto = v
76298
+ },
76299
+ {
76300
+ type: "toggle",
76301
+ key: SettingsPanelKeys.ControlBarSectioningSettings,
76302
+ label: "Settings",
76303
+ getter: (s) => s.ui.sectioningSettings,
76304
+ setter: (s, v) => s.ui.sectioningSettings = v
76305
+ }
76306
+ ];
76307
+ }
76308
+ function getControlBarVisibilitySettings() {
76309
+ return [
76310
+ {
76311
+ type: "subtitle",
76312
+ key: SettingsPanelKeys.ControlBarVisibilitySubtitle,
76313
+ title: "Control Bar - Visibility"
76314
+ },
76315
+ {
76316
+ type: "toggle",
76317
+ key: SettingsPanelKeys.ControlBarVisibilityClearSelection,
76318
+ label: "Clear Selection",
76319
+ getter: (s) => s.ui.visibilityClearSelection,
76320
+ setter: (s, v) => s.ui.visibilityClearSelection = v
76321
+ },
76322
+ {
76323
+ type: "toggle",
76324
+ key: SettingsPanelKeys.ControlBarVisibilityShowAll,
76325
+ label: "Show All",
76326
+ getter: (s) => s.ui.visibilityShowAll,
76327
+ setter: (s, v) => s.ui.visibilityShowAll = v
76328
+ },
76329
+ {
76330
+ type: "toggle",
76331
+ key: SettingsPanelKeys.ControlBarVisibilityToggle,
76332
+ label: "Toggle",
76333
+ getter: (s) => s.ui.visibilityToggle,
76334
+ setter: (s, v) => s.ui.visibilityToggle = v
76335
+ },
76336
+ {
76337
+ type: "toggle",
76338
+ key: SettingsPanelKeys.ControlBarVisibilityIsolate,
76339
+ label: "Isolate",
76340
+ getter: (s) => s.ui.visibilityIsolate,
76341
+ setter: (s, v) => s.ui.visibilityIsolate = v
76342
+ },
76343
+ {
76344
+ type: "toggle",
76345
+ key: SettingsPanelKeys.ControlBarVisibilityAutoIsolate,
76346
+ label: "Auto Isolate",
76347
+ getter: (s) => s.ui.visibilityAutoIsolate,
76348
+ setter: (s, v) => s.ui.visibilityAutoIsolate = v
76349
+ },
76350
+ {
76351
+ type: "toggle",
76352
+ key: SettingsPanelKeys.ControlBarVisibilitySettings,
76353
+ label: "Settings",
76354
+ getter: (s) => s.ui.visibilitySettings,
76355
+ setter: (s, v) => s.ui.visibilitySettings = v
76356
+ }
76357
+ ];
76358
+ }
76359
+ function getControlBarVariousSettings() {
76360
+ return [
76361
+ {
76362
+ type: "subtitle",
76363
+ key: SettingsPanelKeys.ControlBarSettingsSubtitle,
76364
+ title: "Control Bar - Settings"
76365
+ },
76366
+ {
76367
+ type: "toggle",
76368
+ key: SettingsPanelKeys.ControlBarSettingsShowProjectInspectorButtonToggle,
76369
+ label: "Project Inspector",
76370
+ getter: (s) => s.ui.projectInspector,
76371
+ setter: (s, v) => s.ui.projectInspector = v
76372
+ },
76373
+ {
76374
+ type: "toggle",
76375
+ key: SettingsPanelKeys.ControlBarSettingsShowSettingsButtonToggle,
76376
+ label: "Settings",
76377
+ getter: (s) => s.ui.settings,
76378
+ setter: (s, v) => s.ui.settings = v
76379
+ },
76380
+ {
76381
+ type: "toggle",
76382
+ key: SettingsPanelKeys.ControlBarSettingsShowHelpButtonToggle,
76383
+ label: "Help",
76384
+ getter: (s) => s.ui.help,
76385
+ setter: (s, v) => s.ui.help = v
76386
+ },
76387
+ {
76388
+ type: "toggle",
76389
+ key: SettingsPanelKeys.ControlBarSettingsShowMaximiseButtonToggle,
76390
+ label: "Maximise",
76391
+ getter: (s) => s.ui.maximise,
76392
+ setter: (s, v) => s.ui.maximise = v
76393
+ }
76394
+ ];
76395
+ }
76396
+ function getPanelsVisibilitySettings() {
76397
+ return [
76398
+ {
76399
+ type: "subtitle",
76400
+ key: SettingsPanelKeys.PanelsSubtitle,
76401
+ title: "Panels Visibility"
76402
+ },
76403
+ {
76404
+ type: "toggle",
76405
+ key: SettingsPanelKeys.PanelsShowLogoToggle,
76406
+ label: "Logo",
76407
+ getter: (s) => s.ui.logo,
76408
+ setter: (s, v) => s.ui.logo = v
76409
+ },
76410
+ {
76411
+ type: "toggle",
76412
+ key: SettingsPanelKeys.PanelsShowBimTreeToggle,
76413
+ label: "Bim Tree",
76414
+ getter: (s) => s.ui.bimTreePanel,
76415
+ setter: (s, v) => s.ui.bimTreePanel = v
76416
+ },
76417
+ {
76418
+ type: "toggle",
76419
+ key: SettingsPanelKeys.PanelsShowBimInfoToggle,
76420
+ label: "Bim Info",
76421
+ getter: (s) => s.ui.bimInfoPanel,
76422
+ setter: (s, v) => s.ui.bimInfoPanel = v
76423
+ },
76424
+ {
76425
+ type: "toggle",
76426
+ key: SettingsPanelKeys.PanelsShowAxesPanelToggle,
76427
+ label: "Axes",
76428
+ getter: (s) => s.ui.axesPanel,
76429
+ setter: (s, v) => s.ui.axesPanel = v
76430
+ },
76431
+ {
76432
+ type: "toggle",
76433
+ key: SettingsPanelKeys.PanelsShowPerformancePanelToggle,
76434
+ label: "Performance",
76435
+ getter: (s) => s.ui.performance,
76436
+ setter: (s, v) => s.ui.performance = v
76437
+ },
76438
+ {
76439
+ type: "toggle",
76440
+ key: SettingsPanelKeys.ControlBarShowControlBarToggle,
76441
+ label: "Control Bar",
76442
+ getter: (s) => s.ui.controlBar,
76443
+ setter: (s, v) => s.ui.controlBar = v
76444
+ }
76445
+ ];
76446
+ }
76447
+ function getInputsSettings(viewer) {
76448
+ return [
76449
+ {
76450
+ type: "subtitle",
76451
+ key: SettingsPanelKeys.InputsSubtitle,
76452
+ title: "Inputs"
76453
+ },
76454
+ {
76455
+ type: "box",
76456
+ key: SettingsPanelKeys.InputsScrollSpeedBox,
76457
+ label: "Scroll Speed",
76458
+ info: "[0.1,10]",
76459
+ transform: (n) => MathUtils.clamp(n, 0.1, 10),
76460
+ getter: (_s) => viewer.inputs.scrollSpeed,
76461
+ setter: (_s, v) => {
76462
+ viewer.inputs.scrollSpeed = v;
76463
+ }
76464
+ }
76465
+ ];
76466
+ }
76467
+ function getAxesPanelSettings() {
76468
+ return [
76469
+ {
76470
+ type: "subtitle",
76471
+ key: SettingsPanelKeys.AxesSubtitle,
76472
+ title: "Axes Panel"
76473
+ },
76474
+ {
76475
+ type: "toggle",
76476
+ key: SettingsPanelKeys.AxesShowOrthographicButtonToggle,
76477
+ label: "Orthographic Camera",
76478
+ getter: (s) => s.ui.orthographic,
76479
+ setter: (s, v) => s.ui.orthographic = v
76480
+ },
76481
+ {
76482
+ type: "toggle",
76483
+ key: SettingsPanelKeys.AxesShowResetCameraButtonToggle,
76484
+ label: "Reset Camera",
76485
+ getter: (s) => s.ui.resetCamera,
76486
+ setter: (s, v) => s.ui.resetCamera = v
76487
+ }
76488
+ ];
76489
+ }
76490
+ function getControlBarMeasureSettings() {
76491
+ return [
76492
+ {
76493
+ type: "subtitle",
76494
+ key: SettingsPanelKeys.ControlBarToolsSubtitle,
76495
+ title: "Control Bar - Measurement"
76496
+ },
76497
+ {
76498
+ type: "toggle",
76499
+ key: SettingsPanelKeys.ControlBarToolsShowMeasuringModeButtonToggle,
76500
+ label: "Enable",
76501
+ getter: (s) => s.ui.measuringMode,
76502
+ setter: (s, v) => s.ui.measuringMode = v
76503
+ }
76504
+ ];
76505
+ }
76506
+ function getWebglSettingsContent(viewer) {
76507
+ return [
76508
+ ...getInputsSettings(viewer),
76509
+ ...getPanelsVisibilitySettings(),
76510
+ ...getAxesPanelSettings(),
76511
+ ...getControlBarCursorSettings(),
76512
+ ...getControlBarCameraSettings(),
76513
+ ...getControlBarVisibilitySettings(),
76514
+ ...getControlBarMeasureSettings(),
76515
+ ...getControlBarSectionBoxSettings(),
76516
+ ...getControlBarVariousSettings()
76517
+ ];
76518
+ }
76519
+ function applyWebglSettings(settings2) {
76520
+ const performance2 = document.getElementsByClassName("vim-performance-div")[0];
76521
+ if (performance2) {
76522
+ if (isTrue(settings2.ui.performance)) {
76523
+ performance2.classList.remove("vc-hidden");
76524
+ } else {
76525
+ performance2.classList.add("vc-hidden");
76526
+ }
76527
+ }
76528
+ }
76062
76529
  function createViewer$1(container, settings2 = {}, coreSettings = {}) {
76063
76530
  const controllablePromise = new ControllablePromise();
76064
76531
  const cmpContainer = container instanceof HTMLElement ? createContainer(container) : container ?? createContainer();
@@ -76089,7 +76556,7 @@ Averrage Date/Second ${avgDataRatePS} kb
76089
76556
  return controllablePromise.promise;
76090
76557
  }
76091
76558
  function Viewer$1(props) {
76092
- const settings2 = useSettings(props.viewer, props.settings ?? {});
76559
+ const settings2 = useSettings(props.settings ?? {}, getDefaultSettings(), (s) => applyWebglSettings(s));
76093
76560
  const modal = React2.useRef(null);
76094
76561
  const sectionBoxRef = useWebglSectionBox(props.viewer);
76095
76562
  const isolationPanelHandle = React2.useRef(null);
@@ -76138,7 +76605,11 @@ Averrage Date/Second ${avgDataRatePS} kb
76138
76605
  loader: loader.current,
76139
76606
  isolation: isolationRef,
76140
76607
  camera: camera2,
76141
- settings: settings2,
76608
+ settings: {
76609
+ update: settings2.update,
76610
+ register: settings2.register,
76611
+ customize: (c) => settings2.customizer.set(c)
76612
+ },
76142
76613
  get isolationPanel() {
76143
76614
  return isolationPanelHandle.current;
76144
76615
  },
@@ -76184,7 +76655,7 @@ Averrage Date/Second ${avgDataRatePS} kb
76184
76655
  SettingsPanel,
76185
76656
  {
76186
76657
  visible: side.getContent() === "settings",
76187
- viewer: props.viewer,
76658
+ content: getWebglSettingsContent(props.viewer),
76188
76659
  settings: settings2
76189
76660
  }
76190
76661
  )
@@ -76213,7 +76684,7 @@ Averrage Date/Second ${avgDataRatePS} kb
76213
76684
  }
76214
76685
  ),
76215
76686
  /* @__PURE__ */ jsxRuntimeExports.jsx(SectionBoxPanel$1, { ref: sectionBoxPanelHandle, state: sectionBoxRef }),
76216
- /* @__PURE__ */ jsxRuntimeExports.jsx(IsolationPanel$1, { ref: isolationPanelHandle, state: isolationRef }),
76687
+ /* @__PURE__ */ jsxRuntimeExports.jsx(IsolationPanel$1, { ref: isolationPanelHandle, state: isolationRef, transparency: true }),
76217
76688
  /* @__PURE__ */ jsxRuntimeExports.jsx(
76218
76689
  AxesPanelMemo,
76219
76690
  {
@@ -76252,7 +76723,8 @@ Averrage Date/Second ${avgDataRatePS} kb
76252
76723
  const index$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
76253
76724
  __proto__: null,
76254
76725
  Viewer: Viewer$1,
76255
- createViewer: createViewer$1
76726
+ createViewer: createViewer$1,
76727
+ getDefaultSettings
76256
76728
  }, Symbol.toStringTag, { value: "Module" }));
76257
76729
  function getErrorMessage(state) {
76258
76730
  if (state.status !== "error") return void 0;
@@ -76318,11 +76790,13 @@ Averrage Date/Second ${avgDataRatePS} kb
76318
76790
  };
76319
76791
  return useSectionBox(ultraAdapter);
76320
76792
  }
76321
- function useUltraControlBar(viewer, section, isolation, camera2, customization) {
76322
- const sectionSectionBox2 = controlBarSectionBox(section, viewer.selection.any());
76323
- const selection = controlBarSelection(isolation);
76324
- const sectionCamera2 = controlBarCamera(camera2);
76325
- let bar = [selection, sectionCamera2, sectionSectionBox2];
76793
+ function useUltraControlBar(viewer, section, isolation, camera2, settings2, side, customization) {
76794
+ let bar = [
76795
+ controlBarCamera(camera2, settings2.ui),
76796
+ controlBarVisibility(isolation, settings2.ui),
76797
+ controlBarSectionBox(section, viewer.selection.any(), settings2.ui),
76798
+ controlBarSettingsUltra(side, settings2)
76799
+ ];
76326
76800
  bar = (customization == null ? void 0 : customization(bar)) ?? bar;
76327
76801
  return bar;
76328
76802
  }
@@ -76426,6 +76900,9 @@ Averrage Date/Second ${avgDataRatePS} kb
76426
76900
  }
76427
76901
  }
76428
76902
  },
76903
+ enableTransparency: (enable) => {
76904
+ console.log("enableTransparency not implemented");
76905
+ },
76429
76906
  getGhostOpacity: () => viewer.renderer.ghostOpacity,
76430
76907
  setGhostOpacity: (opacity) => {
76431
76908
  viewer.renderer.ghostOpacity = opacity;
@@ -76467,7 +76944,61 @@ Averrage Date/Second ${avgDataRatePS} kb
76467
76944
  function allButSelection(viewer, vim) {
76468
76945
  return false;
76469
76946
  }
76470
- function createViewer(container) {
76947
+ function getDefaultUltraSettings() {
76948
+ return {
76949
+ ui: {
76950
+ // Control bar - cursors
76951
+ cursorOrbit: true,
76952
+ cursorLookAround: true,
76953
+ cursorPan: true,
76954
+ cursorZoom: true,
76955
+ // Control bar - camera
76956
+ cameraAuto: true,
76957
+ cameraFrameScene: true,
76958
+ cameraFrameSelection: true,
76959
+ // Control bar - tools
76960
+ sectioningEnable: true,
76961
+ sectioningFitToSelection: true,
76962
+ sectioningReset: true,
76963
+ sectioningShow: true,
76964
+ sectioningAuto: true,
76965
+ sectioningSettings: true,
76966
+ // Control bar - Visibility
76967
+ visibilityClearSelection: true,
76968
+ visibilityShowAll: true,
76969
+ visibilityToggle: true,
76970
+ visibilityIsolate: true,
76971
+ visibilityAutoIsolate: true,
76972
+ visibilitySettings: true,
76973
+ settings: true
76974
+ }
76975
+ };
76976
+ }
76977
+ function getControlBarUltraSettings() {
76978
+ return [
76979
+ {
76980
+ type: "subtitle",
76981
+ key: SettingsPanelKeys.ControlBarSettingsSubtitle,
76982
+ title: "Control Bar - Settings"
76983
+ },
76984
+ {
76985
+ type: "toggle",
76986
+ key: SettingsPanelKeys.ControlBarSettingsShowSettingsButtonToggle,
76987
+ label: "Settings",
76988
+ getter: (s) => s.ui.settings,
76989
+ setter: (s, v) => s.ui.settings = v
76990
+ }
76991
+ ];
76992
+ }
76993
+ function getUltraSettingsContent(viewer) {
76994
+ return [
76995
+ ...getControlBarCameraSettings(),
76996
+ ...getControlBarVisibilitySettings(),
76997
+ ...getControlBarSectionBoxSettings(),
76998
+ ...getControlBarUltraSettings()
76999
+ ];
77000
+ }
77001
+ function createViewer(container, settings2) {
76471
77002
  const controllablePromise = new ControllablePromise();
76472
77003
  const cmpContainer = container instanceof HTMLElement ? createContainer(container) : container ?? createContainer();
76473
77004
  const core = Viewer$2.createWithCanvas(cmpContainer.gfx);
@@ -76486,6 +77017,7 @@ Averrage Date/Second ${avgDataRatePS} kb
76486
77017
  {
76487
77018
  container: cmpContainer,
76488
77019
  core,
77020
+ settings: settings2,
76489
77021
  onMount: (cmp) => controllablePromise.resolve(attachDispose(cmp))
76490
77022
  }
76491
77023
  )
@@ -76493,6 +77025,7 @@ Averrage Date/Second ${avgDataRatePS} kb
76493
77025
  return controllablePromise.promise;
76494
77026
  }
76495
77027
  function Viewer(props) {
77028
+ const settings2 = useSettings(props.settings ?? {}, getDefaultUltraSettings());
76496
77029
  const sectionBoxRef = useUltraSectionBox(props.core);
76497
77030
  const camera2 = useUltraCamera(props.core, sectionBoxRef);
76498
77031
  const isolationPanelHandle = React2.useRef(null);
@@ -76502,7 +77035,15 @@ Averrage Date/Second ${avgDataRatePS} kb
76502
77035
  const [_, setSelectState] = React2.useState(0);
76503
77036
  const [controlBarCustom, setControlBarCustom] = React2.useState(() => (c) => c);
76504
77037
  const isolationRef = useUltraIsolation(props.core);
76505
- const controlBar = useUltraControlBar(props.core, sectionBoxRef, isolationRef, camera2, (_2) => _2);
77038
+ const controlBar = useUltraControlBar(
77039
+ props.core,
77040
+ sectionBoxRef,
77041
+ isolationRef,
77042
+ camera2,
77043
+ settings2.value,
77044
+ side,
77045
+ (_2) => _2
77046
+ );
76506
77047
  useViewerInput(props.core.inputs, camera2);
76507
77048
  React2.useEffect(() => {
76508
77049
  sectionBoxRef.showOffsetPanel.onChange.subscribe((show) => {
@@ -76527,6 +77068,11 @@ Averrage Date/Second ${avgDataRatePS} kb
76527
77068
  isolation: isolationRef,
76528
77069
  sectionBox: sectionBoxRef,
76529
77070
  camera: camera2,
77071
+ settings: {
77072
+ update: settings2.update,
77073
+ register: settings2.register,
77074
+ customize: (c) => settings2.customizer.set(c)
77075
+ },
76530
77076
  get isolationPanel() {
76531
77077
  return isolationPanelHandle.current;
76532
77078
  },
@@ -76541,7 +77087,24 @@ Averrage Date/Second ${avgDataRatePS} kb
76541
77087
  load: patchLoad(props.core, modalHandle)
76542
77088
  });
76543
77089
  }, []);
77090
+ const sidePanel = () => /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
77091
+ SettingsPanel,
77092
+ {
77093
+ visible: side.getContent() === "settings",
77094
+ content: getUltraSettingsContent(props.core),
77095
+ settings: settings2
77096
+ }
77097
+ ) });
76544
77098
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
77099
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
77100
+ SidePanelMemo,
77101
+ {
77102
+ container: props.container,
77103
+ viewer: props.core,
77104
+ side,
77105
+ content: sidePanel
77106
+ }
77107
+ ),
76545
77108
  /* @__PURE__ */ jsxRuntimeExports.jsx(RestOfScreen, { side, content: () => {
76546
77109
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
76547
77110
  whenTrue(true, /* @__PURE__ */ jsxRuntimeExports.jsx(LogoMemo, {})),
@@ -76554,7 +77117,7 @@ Averrage Date/Second ${avgDataRatePS} kb
76554
77117
  }
76555
77118
  ),
76556
77119
  /* @__PURE__ */ jsxRuntimeExports.jsx(SectionBoxPanel$1, { ref: sectionBoxPanelHandle, state: sectionBoxRef }),
76557
- /* @__PURE__ */ jsxRuntimeExports.jsx(IsolationPanel$1, { ref: isolationPanelHandle, state: isolationRef })
77120
+ /* @__PURE__ */ jsxRuntimeExports.jsx(IsolationPanel$1, { ref: isolationPanelHandle, state: isolationRef, transparency: false })
76558
77121
  ] });
76559
77122
  } }),
76560
77123
  /* @__PURE__ */ jsxRuntimeExports.jsx(Modal, { ref: modalHandle, canFollowLinks: true }),
@@ -76592,7 +77155,8 @@ Averrage Date/Second ${avgDataRatePS} kb
76592
77155
  const index$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
76593
77156
  __proto__: null,
76594
77157
  Viewer,
76595
- createViewer
77158
+ createViewer,
77159
+ getDefaultUltraSettings
76596
77160
  }, Symbol.toStringTag, { value: "Module" }));
76597
77161
  const SectionBoxPanel = {
76598
77162
  Ids