@vcmap/ui 6.1.0-rc.6 → 6.1.0

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 (149) hide show
  1. package/config/base.config.json +7 -3
  2. package/config/cluster.config.json +5 -14
  3. package/config/dev.config.json +175 -56
  4. package/config/projects.config.json +2 -1
  5. package/config/splashscreen.config.json +6 -10
  6. package/config/vectorTile.config.json +42 -1
  7. package/dist/assets/{cesium-f5e8e354.js → cesium-664ad022.js} +53 -23
  8. package/dist/assets/cesium.js +1 -1
  9. package/dist/assets/{core-c134a524.js → core-841b71a4.js} +8458 -5828
  10. package/dist/assets/core.js +1 -1
  11. package/dist/assets/{ol-2752311f.js → ol-2e095c08.js} +87 -37
  12. package/dist/assets/ol.js +1 -1
  13. package/dist/assets/ui-2fd6f47d.css +1 -0
  14. package/dist/assets/{ui-83514586.js → ui-2fd6f47d.js} +21376 -20063
  15. package/dist/assets/ui.js +1 -1
  16. package/dist/assets/vue.js +1 -1
  17. package/dist/assets/{vuetify-5dbe2644.css → vuetify-4bc77ff7.css} +2 -2
  18. package/dist/assets/{vuetify-5dbe2644.js → vuetify-4bc77ff7.js} +7520 -7373
  19. package/dist/assets/vuetify.js +1 -1
  20. package/dist/index.html +1 -1
  21. package/index.d.ts +15 -5
  22. package/index.html +1 -1
  23. package/index.js +14 -5
  24. package/package.json +12 -8
  25. package/plugins/@vcmap-show-case/theming-example/src/index.js +1 -0
  26. package/plugins/@vcmap-show-case/vector-properties-example/src/LayerSettings.vue +39 -0
  27. package/plugins/@vcmap-show-case/vector-properties-example/src/VectorPropertiesExample.vue +3 -0
  28. package/plugins/@vcmap-show-case/vector-properties-example/src/lib.js +13 -0
  29. package/plugins/@vcmap-show-case/window-tester/src/WindowExample.vue +9 -0
  30. package/plugins/package.json +7 -5
  31. package/src/actions/actionHelper.d.ts +6 -0
  32. package/src/actions/actionHelper.js +22 -0
  33. package/src/actions/deepPickingAction.d.ts +23 -0
  34. package/src/actions/deepPickingAction.js +399 -0
  35. package/src/application/MapsGroupMobileMenu.vue +105 -0
  36. package/src/application/MapsGroupMobileMenu.vue.d.ts +7 -0
  37. package/src/application/VcsApp.vue +51 -24
  38. package/src/application/VcsApp.vue.d.ts +9 -2
  39. package/src/application/VcsAttributionsFooter.vue +1 -0
  40. package/src/application/VcsContainer.vue +36 -13
  41. package/src/application/VcsContainer.vue.d.ts +7 -0
  42. package/src/application/VcsMobileMenuList.vue +111 -0
  43. package/src/application/VcsMobileMenuList.vue.d.ts +2 -0
  44. package/src/application/VcsNavbar.vue +15 -3
  45. package/src/application/VcsNavbarMobile.vue +206 -0
  46. package/src/application/VcsNavbarMobile.vue.d.ts +42 -0
  47. package/src/application/VcsPositionDisplay.vue +1 -0
  48. package/src/application/VcsSplashScreen.vue +39 -7
  49. package/src/application/VcsSplashScreen.vue.d.ts +6 -0
  50. package/src/application/uiConfigHelper.d.ts +12 -0
  51. package/src/application/uiConfigHelper.js +37 -0
  52. package/src/components/buttons/VcsActionButtonList.vue +1 -0
  53. package/src/components/buttons/VcsToolButton.vue +8 -1
  54. package/src/components/buttons/VcsToolButton.vue.d.ts +1 -0
  55. package/src/components/form-inputs-controls/VcsSelect.vue +8 -6
  56. package/src/components/form-output/VcsTemplateMarkdown.vue +43 -0
  57. package/src/components/form-output/VcsTemplateMarkdown.vue.d.ts +9 -0
  58. package/src/components/icons/+all.d.ts +5 -0
  59. package/src/components/icons/+all.js +14 -0
  60. package/src/components/lists/VcsActionList.vue +1 -0
  61. package/src/components/lists/VcsGroupedList.vue +2 -1
  62. package/src/components/lists/VcsListItemComponent.vue +1 -0
  63. package/src/components/lists/VcsTreeNode.vue +11 -2
  64. package/src/components/lists/VcsTreeview.vue +40 -3
  65. package/src/components/lists/VcsTreeview.vue.d.ts +1 -0
  66. package/src/components/lists/VcsTreeviewTitle.vue +8 -1
  67. package/src/components/style/{MenuWrapper.vue → StyleMenuWrapper.vue} +2 -1
  68. package/src/components/style/VcsFillMenu.vue +4 -4
  69. package/src/components/style/VcsImageMenu.vue +4 -4
  70. package/src/components/style/VcsStrokeMenu.vue +4 -4
  71. package/src/components/style/VcsTextMenu.vue +4 -4
  72. package/src/contentTree/LayerTree.vue +8 -46
  73. package/src/contentTree/LayerTree.vue.d.ts +1 -3
  74. package/src/contentTree/contentTreeCollection.d.ts +7 -0
  75. package/src/contentTree/contentTreeCollection.js +31 -10
  76. package/src/contentTree/contentTreeItem.d.ts +4 -4
  77. package/src/contentTree/contentTreeItem.js +2 -2
  78. package/src/contentTree/flightContentTreeItem.d.ts +8 -1
  79. package/src/contentTree/flightContentTreeItem.js +26 -3
  80. package/src/contentTree/groupContentTreeItem.d.ts +21 -0
  81. package/src/contentTree/groupContentTreeItem.js +32 -2
  82. package/src/contentTree/layerContentTreeItem.d.ts +8 -1
  83. package/src/contentTree/layerContentTreeItem.js +26 -4
  84. package/src/contentTree/layerGroupContentTreeItem.d.ts +6 -0
  85. package/src/contentTree/layerGroupContentTreeItem.js +27 -3
  86. package/src/contentTree/nodeContentTreeItem.d.ts +21 -0
  87. package/src/contentTree/nodeContentTreeItem.js +31 -2
  88. package/src/contentTree/obliqueCollectionContentTreeItem.d.ts +6 -0
  89. package/src/contentTree/obliqueCollectionContentTreeItem.js +22 -2
  90. package/src/contentTree/wmsChildContentTreeItem.d.ts +56 -0
  91. package/src/contentTree/wmsChildContentTreeItem.js +159 -0
  92. package/src/contentTree/wmsGroupContentTreeItem.d.ts +171 -0
  93. package/src/contentTree/wmsGroupContentTreeItem.js +619 -0
  94. package/src/featureInfo/BalloonComponent.vue +6 -6
  95. package/src/featureInfo/ClusterFeatureComponent.vue +47 -11
  96. package/src/featureInfo/ClusterFeatureComponent.vue.d.ts +1 -0
  97. package/src/featureInfo/MarkdownBalloonComponent.vue +3 -9
  98. package/src/featureInfo/MarkdownBalloonComponent.vue.d.ts +1 -11
  99. package/src/featureInfo/balloonFeatureInfoView.d.ts +3 -0
  100. package/src/featureInfo/balloonFeatureInfoView.js +78 -11
  101. package/src/featureInfo/balloonHelper.js +9 -13
  102. package/src/featureInfo/featureInfo.d.ts +32 -7
  103. package/src/featureInfo/featureInfo.js +192 -93
  104. package/src/featureInfo/markdownBalloonFeatureInfoView.d.ts +0 -6
  105. package/src/featureInfo/markdownBalloonFeatureInfoView.js +5 -14
  106. package/src/featureInfo/markdownFeatureInfoView.d.ts +2 -8
  107. package/src/featureInfo/markdownFeatureInfoView.js +6 -15
  108. package/src/i18n/de.d.ts +64 -50
  109. package/src/i18n/de.js +9 -0
  110. package/src/i18n/en.d.ts +64 -50
  111. package/src/i18n/en.js +9 -0
  112. package/src/legend/VcsLegend.vue +21 -2
  113. package/src/legend/VcsLegend.vue.d.ts +1 -0
  114. package/src/legend/legendHelper.d.ts +0 -13
  115. package/src/legend/legendHelper.js +3 -27
  116. package/src/manager/navbarManager.d.ts +14 -1
  117. package/src/manager/navbarManager.js +22 -2
  118. package/src/manager/toolbox/GroupToolboxComponent.vue +17 -3
  119. package/src/manager/toolbox/GroupToolboxComponent.vue.d.ts +1 -0
  120. package/src/manager/toolbox/SelectToolboxComponent.vue +17 -3
  121. package/src/manager/toolbox/SelectToolboxComponent.vue.d.ts +1 -0
  122. package/src/manager/toolbox/ToolboxManagerComponent.vue +45 -14
  123. package/src/manager/toolbox/ToolboxManagerComponent.vue.d.ts +9 -0
  124. package/src/manager/toolbox/toolboxManager.d.ts +2 -1
  125. package/src/manager/toolbox/toolboxManager.js +13 -1
  126. package/src/manager/window/WindowComponent.vue +3 -2
  127. package/src/manager/window/WindowComponentHeader.vue +9 -1
  128. package/src/manager/window/WindowComponentHeader.vue.d.ts +1 -0
  129. package/src/manager/window/WindowManager.vue +175 -30
  130. package/src/manager/window/WindowManager.vue.d.ts +5 -0
  131. package/src/manager/window/windowManager.d.ts +2 -2
  132. package/src/manager/window/windowManager.js +12 -10
  133. package/src/navigation/MapNavigation.vue +29 -19
  134. package/src/navigation/MapNavigation.vue.d.ts +1 -0
  135. package/src/notifier/NotifierComponent.vue +1 -0
  136. package/src/search/ResultsComponent.vue +44 -17
  137. package/src/search/ResultsComponent.vue.d.ts +11 -1
  138. package/src/search/SearchComponent.vue +60 -9
  139. package/src/search/SearchComponent.vue.d.ts +2 -0
  140. package/src/search/search.js +3 -16
  141. package/src/state.d.ts +2 -1
  142. package/src/state.js +2 -1
  143. package/src/uiConfig.d.ts +9 -0
  144. package/src/uiConfig.js +1 -0
  145. package/src/vuePlugins/vuetify.d.ts +4 -0
  146. package/src/vuePlugins/vuetify.js +49 -3
  147. package/dist/assets/ui-83514586.css +0 -1
  148. /package/dist/assets/{vue-f8b1b5f8.js → vue-71fd14e8.js} +0 -0
  149. /package/src/components/style/{MenuWrapper.vue.d.ts → StyleMenuWrapper.vue.d.ts} +0 -0
@@ -1,5 +1,6 @@
1
1
  <script setup>
2
- import { ref, shallowRef, inject, onUnmounted } from 'vue';
2
+ import { ref, shallowRef, inject, onUnmounted, watch } from 'vue';
3
+ import { LayerState } from '@vcmap/core';
3
4
  import VcsGroupedList from '../components/lists/VcsGroupedList.vue';
4
5
 
5
6
  const props = defineProps({
@@ -15,25 +16,60 @@
15
16
  },
16
17
  });
17
18
 
19
+ const emit = defineEmits(['close']);
20
+
18
21
  const app = inject('vcsApp');
19
22
  const open = ref(true);
20
23
  const selected = shallowRef([]);
21
24
 
22
- const selectionListener = app.featureInfo.featureChanged.addEventListener(
23
- (f) => {
24
- if (f === null) {
25
- selected.value = [];
26
- } else {
27
- const item = props.items.find((i) => i.name === f.getId());
28
- if (item) {
29
- selected.value = [item];
30
- }
25
+ const selectCurrentFeature = (f) => {
26
+ if (f == null) {
27
+ selected.value = [];
28
+ } else {
29
+ const item = props.items.find((i) => i.name === f.getId());
30
+ if (item) {
31
+ selected.value = [item];
31
32
  }
33
+ }
34
+ };
35
+ selectCurrentFeature(app.featureInfo.selectedFeature);
36
+
37
+ const selectionListener =
38
+ app.featureInfo.featureChanged.addEventListener(selectCurrentFeature);
39
+
40
+ const items = ref(props.items);
41
+ const groups = ref(props.groups);
42
+
43
+ watch(
44
+ () => props.items,
45
+ (newItems) => {
46
+ items.value = newItems;
47
+ selectCurrentFeature(app.featureInfo.selectedFeature);
32
48
  },
33
49
  );
50
+ watch(
51
+ () => props.groups,
52
+ (newGroups) => {
53
+ groups.value = newGroups;
54
+ },
55
+ );
56
+
57
+ const layerListener = app.layers.stateChanged.addEventListener((layer) => {
58
+ if (
59
+ layer.state === LayerState.INACTIVE &&
60
+ items.value.some((item) => item.group === layer.name)
61
+ ) {
62
+ items.value = items.value.filter((item) => item.group !== layer.name);
63
+ groups.value = groups.value.filter((group) => group.name !== layer.name);
64
+ if (items.value.length === 0) {
65
+ emit('close');
66
+ }
67
+ }
68
+ });
34
69
 
35
70
  onUnmounted(() => {
36
71
  selectionListener();
72
+ layerListener();
37
73
  });
38
74
  </script>
39
75
 
@@ -51,7 +87,7 @@
51
87
  open-all
52
88
  />
53
89
  </template>
54
- <p v-else>{{ $t('featureInfo.cluster.empty') }}</p>
90
+ <p v-else class="ma-2">{{ $t('featureInfo.cluster.empty') }}</p>
55
91
  </div>
56
92
  </template>
57
93
 
@@ -1,4 +1,5 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
+ $emit: (event: "close", ...args: any[]) => void;
2
3
  $props: {
3
4
  readonly [x: string]: any;
4
5
  };
@@ -1,25 +1,19 @@
1
1
  <template>
2
2
  <BalloonComponent v-bind="{ ...$attrs }" class="markdown-balloon-component">
3
- <VcsMarkdown :content="content" />
3
+ <vcs-template-markdown v-bind="{ ...$attrs }" />
4
4
  </BalloonComponent>
5
5
  </template>
6
6
  <script>
7
7
  import BalloonComponent from './BalloonComponent.vue';
8
- import VcsMarkdown from '../components/form-output/VcsMarkdown.vue';
8
+ import VcsTemplateMarkdown from '../components/form-output/VcsTemplateMarkdown.vue';
9
9
 
10
10
  /**
11
11
  * @description A balloon showing markdown content
12
12
  */
13
13
  export default {
14
14
  name: 'MarkdownBalloonComponent',
15
- props: {
16
- content: {
17
- type: String,
18
- required: true,
19
- },
20
- },
21
15
  components: {
22
- VcsMarkdown,
16
+ VcsTemplateMarkdown,
23
17
  BalloonComponent,
24
18
  },
25
19
  };
@@ -1,12 +1,2 @@
1
- declare const _default: import("vue").DefineComponent<{
2
- content: {
3
- type: StringConstructor;
4
- required: true;
5
- };
6
- }, any, any, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
7
- content: {
8
- type: StringConstructor;
9
- required: true;
10
- };
11
- }>>, {}, {}>;
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
12
2
  export default _default;
@@ -15,6 +15,8 @@ export type BalloonFeatureInfoViewProps = import("./abstractFeatureInfoView.js")
15
15
  balloonTitle: string;
16
16
  balloonSubtitle: string;
17
17
  position: import("ol/coordinate.js").Coordinate;
18
+ heightReference: HeightReference;
19
+ heightOffset: number;
18
20
  };
19
21
  /**
20
22
  * @class
@@ -46,4 +48,5 @@ declare class BalloonFeatureInfoView extends AbstractFeatureInfoView {
46
48
  */
47
49
  toJSON(): BalloonFeatureInfoViewOptions;
48
50
  }
51
+ import { HeightReference } from '@vcmap-cesium/engine';
49
52
  import AbstractFeatureInfoView from './abstractFeatureInfoView.js';
@@ -1,7 +1,19 @@
1
1
  import { Feature } from 'ol';
2
2
  import { getCenter } from 'ol/extent.js';
3
- import { Cartographic, Entity, Math as CesiumMath } from '@vcmap-cesium/engine';
4
- import { Projection } from '@vcmap/core';
3
+ import Point from 'ol/geom/Point.js';
4
+ import {
5
+ Cartographic,
6
+ Entity,
7
+ HeightReference,
8
+ Math as CesiumMath,
9
+ } from '@vcmap-cesium/engine';
10
+ import {
11
+ getGeometryHeight,
12
+ getHeightInfo,
13
+ isAbsoluteHeightReference,
14
+ isRelativeHeightReference,
15
+ Projection,
16
+ } from '@vcmap/core';
5
17
  import { check } from '@vcsuite/check';
6
18
  import AbstractFeatureInfoView from './abstractFeatureInfoView.js';
7
19
  import { WindowSlot } from '../manager/window/windowManager.js';
@@ -34,6 +46,8 @@ export function extractNestedKey(key, attrs, defaultValue = null) {
34
46
  * balloonTitle: string,
35
47
  * balloonSubtitle: string,
36
48
  * position: import("ol/coordinate.js").Coordinate
49
+ * heightReference: HeightReference,
50
+ * heightOffset: number
37
51
  * }} BalloonFeatureInfoViewProps
38
52
  */
39
53
 
@@ -53,17 +67,64 @@ function cartesian3ToCoordinate(cartesian) {
53
67
 
54
68
  /**
55
69
  * @param {FeatureType} feature
56
- * @returns {import("ol/coordinate.js").Coordinate|null}
70
+ * @param {import("@vcmap/core").Layer} layer
71
+ * @param {import("ol/coordinate.js").Coordinate|undefinded} clickedPosition
72
+ * @returns {{position?: import("ol/coordinate.js").Coordinate, heightReference: HeightReference, heightOffset: number}}
57
73
  */
58
- function getPositionFromFeature(feature) {
59
- if (feature instanceof Feature && feature.getGeometry()) {
60
- return getCenter(feature.getGeometry().getExtent());
74
+ function getPositionFromFeature(feature, layer, clickedPosition) {
75
+ let heightReference = HeightReference.NONE;
76
+ let heightOffset = 0;
77
+ let position = null;
78
+ if (feature instanceof Feature && feature.getGeometry() instanceof Point) {
79
+ const point = feature.getGeometry();
80
+ const renderAs = layer.vectorProperties.renderAs(feature);
81
+ if (renderAs === 'geometry') {
82
+ // special case where we do not want to use the clickedPosition but the exact Position of the Point
83
+ const heightInfo = getHeightInfo(feature, point, layer.vectorProperties);
84
+ ({ heightReference } = heightInfo);
85
+ let height = clickedPosition?.[2] ?? 0;
86
+ position = point.getCoordinates();
87
+ // if clamped, do nothing
88
+ if (isRelativeHeightReference(heightReference)) {
89
+ height = getGeometryHeight(point, heightInfo);
90
+ if (heightInfo.groundLevel != null) {
91
+ // we have a groundLevel, so no need to clamp the point
92
+ heightReference = HeightReference.NONE;
93
+ }
94
+ if (heightInfo.heightAboveGround != null) {
95
+ heightOffset += heightInfo.heightAboveGround;
96
+ }
97
+ const extrudedHeight = heightInfo.storeyHeightsAboveGround.reduce(
98
+ (acc, storeyHeight) => acc + storeyHeight,
99
+ 0,
100
+ );
101
+ heightOffset += extrudedHeight;
102
+ height += extrudedHeight;
103
+ position = [position[0], position[1], height];
104
+ } else if (isAbsoluteHeightReference(heightReference)) {
105
+ const extrudedHeight = heightInfo.storeyHeightsAboveGround.reduce(
106
+ (acc, storeyHeight) => acc + storeyHeight,
107
+ 0,
108
+ );
109
+ position = [
110
+ position[0],
111
+ position[1],
112
+ heightInfo.groundLevelOrMinHeight + extrudedHeight,
113
+ ];
114
+ }
115
+ return { position, heightOffset, heightReference };
116
+ }
117
+ }
118
+ if (clickedPosition) {
119
+ position = clickedPosition.slice();
120
+ } else if (feature instanceof Feature && feature.getGeometry()) {
121
+ position = getCenter(feature.getGeometry().getExtent());
61
122
  } else if (feature instanceof Entity) {
62
- return cartesian3ToCoordinate(feature.position);
123
+ position = cartesian3ToCoordinate(feature.position);
63
124
  } else if (feature?.primitive?.boundingSphere?.center) {
64
- return cartesian3ToCoordinate(feature.primitive.boundingSphere.center);
125
+ position = cartesian3ToCoordinate(feature.primitive.boundingSphere.center);
65
126
  }
66
- return null;
127
+ return { position, heightReference, heightOffset };
67
128
  }
68
129
 
69
130
  /**
@@ -104,10 +165,16 @@ class BalloonFeatureInfoView extends AbstractFeatureInfoView {
104
165
  */
105
166
  getProperties(featureInfo, layer) {
106
167
  const properties = super.getProperties(featureInfo, layer);
168
+ const { position, heightReference, heightOffset } = getPositionFromFeature(
169
+ featureInfo.feature,
170
+ layer,
171
+ featureInfo.position,
172
+ );
107
173
  return {
108
174
  ...properties,
109
- position:
110
- featureInfo.position ?? getPositionFromFeature(featureInfo.feature),
175
+ position,
176
+ heightReference,
177
+ heightOffset,
111
178
  balloonTitle:
112
179
  this.balloonTitle != null
113
180
  ? extractNestedKey(
@@ -24,10 +24,14 @@ export const balloonOffset = { x: 55, y: 25 };
24
24
 
25
25
  /**
26
26
  * @param {import("@vcmap-cesium/engine").Scene} scene
27
- * @param {import("@vcmap-cesium/engine").Cartesian3} cartesian
27
+ * @param {import("ol/coordinate.js").Coordinate} position
28
28
  * @returns {undefined|import("@vcmap-cesium/engine").Cartesian2}
29
29
  */
30
- function getBalloonPositionCesium(scene, cartesian) {
30
+ function getBalloonPositionCesium(scene, position) {
31
+ const wgs84Position = Projection.mercatorToWgs84(position);
32
+ const cartesian = Cartographic.toCartesian(
33
+ Cartographic.fromDegrees(...wgs84Position),
34
+ );
31
35
  return SceneTransforms.worldToWindowCoordinates(scene, cartesian);
32
36
  }
33
37
 
@@ -53,11 +57,7 @@ function getBalloonPositionOL(olMap, position) {
53
57
  export async function getBalloonPosition(app, position) {
54
58
  const map = app.maps.activeMap;
55
59
  if (map instanceof CesiumMap) {
56
- const wgs84Position = Projection.mercatorToWgs84(position);
57
- const cartesian = Cartographic.toCartesian(
58
- Cartographic.fromDegrees(...wgs84Position),
59
- );
60
- return getBalloonPositionCesium(map.getScene(), cartesian);
60
+ return getBalloonPositionCesium(map.getScene(), position);
61
61
  } else if (map instanceof OpenlayersMap) {
62
62
  return getBalloonPositionOL(map.olMap, position);
63
63
  } else if (map instanceof ObliqueMap) {
@@ -75,7 +75,7 @@ export async function getBalloonPosition(app, position) {
75
75
  * @param {HTMLElement} target - the map's target { @link @import("@vcmap/core").MapCollection }
76
76
  */
77
77
  export function setBalloonPosition(windowManager, id, windowPosition, target) {
78
- if (!windowPosition) {
78
+ if (!windowPosition || !windowManager.has(id)) {
79
79
  return;
80
80
  }
81
81
 
@@ -130,16 +130,12 @@ export async function setupBalloonPositionListener(
130
130
  const [position3D] = await map.getHeightFromTerrain([position]);
131
131
  position[2] = position3D[2];
132
132
  }
133
- const wgs84Position = Projection.mercatorToWgs84(position);
134
- const cartesian = Cartographic.toCartesian(
135
- Cartographic.fromDegrees(...wgs84Position),
136
- );
137
133
  listeners.push(
138
134
  map.getScene().postRender.addEventListener((scene) => {
139
135
  setBalloonPosition(
140
136
  app.windowManager,
141
137
  windowId,
142
- getBalloonPositionCesium(scene, cartesian),
138
+ getBalloonPositionCesium(scene, position),
143
139
  app.maps.target,
144
140
  );
145
141
  }),
@@ -20,6 +20,26 @@ export function getHighlightStyle(feature: FeatureType, layer: import("@vcmap/co
20
20
  * @returns {import("ol/style/Style.js").default}
21
21
  */
22
22
  export function getClusterHighlightStyle(clusterFeature: import("ol").Feature, clusterGroup: import("@vcmap/core").VectorClusterGroup, clusterStyle: import("ol/style/Style.js").default, defaultFillColor: string): import("ol/style/Style.js").default;
23
+ /**
24
+ * @param {import("../vcsUiApp.js").default} app
25
+ * @param {import("ol").Feature} feature
26
+ * @returns {import("./abstractFeatureInfoView.js").default|null}
27
+ */
28
+ export function getFeatureInfoViewForFeature(app: import("../vcsUiApp.js").default, feature: import("ol").Feature): import("./abstractFeatureInfoView.js").default | null;
29
+ /**
30
+ * Returns a VcsGroupedListItem for each provided feature and corresponding groups
31
+ * @param {import("../vcsUiApp.js").default} app
32
+ * @param {import("@vcmap/core").EventFeature[]} features
33
+ * @param {import("ol/coordinate.js").Coordinate?} position
34
+ * @returns {{
35
+ * groups: import("../components/lists/VcsGroupedList.vue").VcsListGroup,
36
+ * items: import("../components/lists/VcsGroupedList.vue").VcsGroupedListItem,
37
+ * }}
38
+ */
39
+ export function getGroupedFeatureList(app: import("../vcsUiApp.js").default, features: import("@vcmap/core").EventFeature[], position?: import("ol/coordinate.js").Coordinate | null): {
40
+ groups: import("../components/lists/VcsGroupedList.vue").VcsListGroup;
41
+ items: import("../components/lists/VcsGroupedList.vue").VcsGroupedListItem;
42
+ };
23
43
  /**
24
44
  * @param {import("../vcsUiApp.js").default} app
25
45
  * @returns {FeatureInfoSession}
@@ -89,7 +109,7 @@ declare class FeatureInfo extends Collection<AbstractFeatureInfoView> {
89
109
  */
90
110
  private _clusterWindowId;
91
111
  /**
92
- * @type {VcsEvent<FeatureType|null>}
112
+ * @type {import("@vcmap/core").VcsEvent<FeatureType|null>}
93
113
  * @private
94
114
  */
95
115
  private _featureChanged;
@@ -118,6 +138,11 @@ declare class FeatureInfo extends Collection<AbstractFeatureInfoView> {
118
138
  * @private
119
139
  */
120
140
  private _selectedClusterFeatureId;
141
+ /**
142
+ * @type {Array<function():void>}
143
+ * @private
144
+ */
145
+ private _destroyBalloonClampedListener;
121
146
  /**
122
147
  * @type {Array<function():void>}
123
148
  * @private
@@ -126,14 +151,14 @@ declare class FeatureInfo extends Collection<AbstractFeatureInfoView> {
126
151
  _destroyFeatureInfoTool: () => void;
127
152
  /**
128
153
  * A vector layer to render provided features on
129
- * @type {VectorLayer|null}
154
+ * @type {import("@vcmap/core").VectorLayer|null}
130
155
  * @private
131
156
  */
132
157
  private _scratchLayer;
133
158
  /**
134
159
  * Emitted whenever a feature is selected or cleared.
135
160
  * Does not reflect cluster feature changes!
136
- * @type {VcsEvent<null|FeatureType>}
161
+ * @type {import("@vcmap/core").VcsEvent<null|FeatureType>}
137
162
  */
138
163
  get featureChanged(): VcsEvent<FeatureType | null>;
139
164
  /**
@@ -146,7 +171,7 @@ declare class FeatureInfo extends Collection<AbstractFeatureInfoView> {
146
171
  get selectedFeatureId(): string | null;
147
172
  /**
148
173
  * Emitted whenever a cluster feature is selected or cleared.
149
- * @type {VcsEvent<null|import("ol").Feature>}
174
+ * @type {import("@vcmap/core").VcsEvent<null|import("ol").Feature>}
150
175
  */
151
176
  get clusterFeatureChanged(): VcsEvent<Feature<import("ol/geom.js").Geometry> | null>;
152
177
  /**
@@ -173,7 +198,7 @@ declare class FeatureInfo extends Collection<AbstractFeatureInfoView> {
173
198
  private _ensureScratchLayer;
174
199
  /**
175
200
  * @param {FeatureType} feature
176
- * @returns {null|AbstractFeatureInfoView}
201
+ * @returns {null|import("./abstractFeatureInfoView.js").default}
177
202
  * @private
178
203
  */
179
204
  private _getFeatureInfoViewForFeature;
@@ -187,10 +212,10 @@ declare class FeatureInfo extends Collection<AbstractFeatureInfoView> {
187
212
  * @param {FeatureType} feature
188
213
  * @param {import("ol/coordinate.js").Coordinate=} [position] - optional clicked position. If not given feature's center point is used to place balloons
189
214
  * @param {import("ol/coordinate.js").Coordinate=} [windowPosition] - optional clicked window position. If not given derived from position for balloons
190
- * @param {AbstractFeatureInfoView=} featureInfoView
215
+ * @param {import("./abstractFeatureInfoView.js").default=} featureInfoView
191
216
  * @returns {Promise<void>}
192
217
  */
193
- selectFeature(feature: FeatureType, position?: import("ol/coordinate.js").Coordinate | undefined, windowPosition?: import("ol/coordinate.js").Coordinate | undefined, featureInfoView?: AbstractFeatureInfoView | undefined): Promise<void>;
218
+ selectFeature(feature: FeatureType, position?: import("ol/coordinate.js").Coordinate | undefined, windowPosition?: import("ol/coordinate.js").Coordinate | undefined, featureInfoView?: import("./abstractFeatureInfoView.js").default | undefined): Promise<void>;
194
219
  /**
195
220
  * Selecting a cluster feature opens a window listing the features belonging to the cluster feature.
196
221
  * To be listed the feature must meet the following criteria: a) the feature must be part of a layer, b) said layer must be managed in