@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
@@ -5,10 +5,11 @@
5
5
  :options="splashScreen"
6
6
  v-model="showSplashScreen"
7
7
  ></VcsSplashScreen>
8
- <VcsNavbar v-if="!config.hideHeader" />
8
+ <VcsNavbar v-if="!config.hideHeader && smAndUp && !mobileLandscape" />
9
+ <VcsNavbarMobile v-if="!config.hideHeader && xs && !mobileLandscape" />
9
10
  <VcsContainer :attribution-action="attributionAction" />
10
11
  <v-footer
11
- v-if="showFooter"
12
+ v-if="showFooter && !mobileLandscape"
12
13
  app
13
14
  absolute
14
15
  :height="footerHeight"
@@ -32,6 +33,9 @@
32
33
  :attribution-action="attributionAction"
33
34
  />
34
35
  </v-footer>
36
+ <p v-if="mobileLandscape" class="mobileRotatedWarning">
37
+ {{ $st('footer.mobile.rotationWarning') }}
38
+ </p>
35
39
  </v-container>
36
40
  </template>
37
41
 
@@ -39,6 +43,17 @@
39
43
  :deep(.v-application--wrap) {
40
44
  min-height: fit-content;
41
45
  }
46
+ .mobileRotatedWarning {
47
+ bottom: 0px;
48
+ z-index: 5;
49
+ position: fixed;
50
+ background-color: rgba(var(--v-theme-surface-light), 0.5);
51
+ color: rgb(var(--v-theme-on-surface));
52
+ backdrop-filter: blur(1px);
53
+ -webkit-backdrop-filter: blur(1px);
54
+ padding: 5px;
55
+ border-radius: 4px;
56
+ }
42
57
  </style>
43
58
 
44
59
  <script>
@@ -58,11 +73,13 @@
58
73
  import { ButtonLocation } from '../manager/navbarManager.js';
59
74
  import { vcsAppSymbol } from '../pluginHelper.js';
60
75
  import VcsNavbar from './VcsNavbar.vue';
76
+ import VcsNavbarMobile from './VcsNavbarMobile.vue';
61
77
  import {
62
78
  createLinkAction,
63
79
  createMapButtonAction,
64
80
  createToggleAction,
65
81
  } from '../actions/actionHelper.js';
82
+ import { setupDeepPicking } from '../actions/deepPickingAction.js';
66
83
  import VcsSettings from './VcsSettings.vue';
67
84
  import { WindowSlot } from '../manager/window/windowManager.js';
68
85
  import CollectionManager from '../manager/collectionManager/CollectionManager.vue';
@@ -70,20 +87,21 @@
70
87
  createVcsThemes,
71
88
  setTheme,
72
89
  useFontSize,
90
+ isMobileLandscape,
73
91
  } from '../vuePlugins/vuetify.js';
74
92
  import VcsLegend from '../legend/VcsLegend.vue';
75
93
  import { getLegendEntries } from '../legend/legendHelper.js';
76
94
  import VcsAttributionsFooter from './VcsAttributionsFooter.vue';
77
95
  import VcsObliqueFooter from './VcsObliqueFooter.vue';
78
96
  import VcsTextPageFooter from './VcsTextPageFooter.vue';
79
- import VcsSplashScreen, { getSplashScreenHash } from './VcsSplashScreen.vue';
97
+ import VcsSplashScreen, {
98
+ shouldShowSplashSceen,
99
+ } from './VcsSplashScreen.vue';
80
100
  import VcsTextPage from './VcsTextPage.vue';
81
101
  import VcsAttributions from './VcsAttributions.vue';
82
102
  import { getAttributions } from './attributionsHelper.js';
83
103
  import VcsDefaultLogoMobile from '../logo-mobile.svg';
84
104
  import VcsPositionDisplay from './VcsPositionDisplay.vue';
85
- import { getFromLocalStorage, hideSplashScreenKey } from '../localStorage.js';
86
- import { name as packageName } from '../../package.json';
87
105
 
88
106
  /**
89
107
  * This helper checks the uiConfig and depending on the value will setup/teardown the providedSetupFunction
@@ -188,6 +206,7 @@
188
206
  },
189
207
  vcsAppSymbol,
190
208
  ButtonLocation.MAP,
209
+ { mobile: true, tablet: true, desktop: true },
191
210
  );
192
211
  mapButtonActionDestroy[name] = () => {
193
212
  app.navbarManager.remove(`mapButton-${name}`);
@@ -257,16 +276,18 @@
257
276
  },
258
277
  vcsAppSymbol,
259
278
  ButtonLocation.CONTENT,
279
+ { mobile: true, tablet: true, desktop: true },
260
280
  );
261
281
  }
262
282
  };
263
-
283
+ const { xs } = useDisplay();
264
284
  let currentEntryLength = entries.length;
265
285
  const watchEntries = watch(entries, (newValue) => {
266
286
  if (
267
287
  app.uiConfig.config.openLegendOnAdd &&
268
288
  newValue.length > currentEntryLength &&
269
- !app.windowManager.has(legendComponentId)
289
+ !app.windowManager.has(legendComponentId) &&
290
+ !xs.value
270
291
  ) {
271
292
  app.windowManager.add(
272
293
  {
@@ -373,6 +394,7 @@
373
394
  },
374
395
  vcsAppSymbol,
375
396
  ButtonLocation.MENU,
397
+ { mobile: true, tablet: true, desktop: true },
376
398
  );
377
399
  return () => {
378
400
  customScreenDestroy();
@@ -406,11 +428,11 @@
406
428
  * @returns {WatchStopHandle}
407
429
  */
408
430
  function setupSplashScreen(app) {
431
+ const { config, showSplashScreen } = app.uiConfig;
409
432
  function setupSplashScreenAction(moduleId) {
410
- const { config, showSplashScreen } = app.uiConfig;
411
433
  const { splashScreen } = config;
412
434
  if (splashScreen && moduleId !== app.dynamicModuleId) {
413
- showSplashScreen.value = true;
435
+ showSplashScreen.value = shouldShowSplashSceen(app);
414
436
  }
415
437
  if (splashScreen && splashScreen.menuEntry) {
416
438
  const splashScreenAction = {
@@ -428,6 +450,7 @@
428
450
  },
429
451
  vcsAppSymbol,
430
452
  ButtonLocation.MENU,
453
+ { mobile: true, tablet: true, desktop: true },
431
454
  );
432
455
  }
433
456
  }
@@ -485,6 +508,7 @@
485
508
  },
486
509
  vcsAppSymbol,
487
510
  ButtonLocation.MENU,
511
+ { mobile: true, tablet: true, desktop: true },
488
512
  );
489
513
  return () => {
490
514
  app.navbarManager.remove(settingsComponentId);
@@ -514,6 +538,7 @@
514
538
  },
515
539
  vcsAppSymbol,
516
540
  ButtonLocation.MENU,
541
+ { mobile: true, tablet: true, desktop: true },
517
542
  );
518
543
  }
519
544
 
@@ -747,6 +772,7 @@
747
772
  VcsObliqueFooter,
748
773
  VcsSplashScreen,
749
774
  VcsNavbar,
775
+ VcsNavbarMobile,
750
776
  VContainer,
751
777
  VFooter,
752
778
  VSpacer,
@@ -789,6 +815,7 @@
789
815
  const destroyDisplayQualityListener = setupUiConfigDisplayQuality(app);
790
816
  const { attributionEntries, attributionAction, destroyAttributions } =
791
817
  setupAttributions(app);
818
+ const destroyDeepPicking = setupDeepPicking(app);
792
819
 
793
820
  let pluginMountedListener;
794
821
  onMounted(() => {
@@ -797,21 +824,14 @@
797
824
 
798
825
  function getSplashScreenConfig() {
799
826
  if (app.uiConfig.config.splashScreen) {
800
- const config = app.uiConfig.getByKey('splashScreen');
801
- const hash = getSplashScreenHash(app);
802
- const moduleId = config[moduleIdSymbol];
803
- const storedHash = getFromLocalStorage(
804
- `${packageName}_${moduleId}`,
805
- hideSplashScreenKey,
806
- );
807
- if (hash !== storedHash) {
808
- return {
809
- title: 'components.splashScreen.name',
810
- tooltip: 'components.splashScreen.tooltip',
811
- position: { width: '800px', height: '400px' },
812
- ...app.uiConfig.config.splashScreen,
813
- };
827
+ if (shouldShowSplashSceen(app)) {
828
+ showSplashScreen.value = true;
814
829
  }
830
+ return {
831
+ title: 'components.splashScreen.name',
832
+ tooltip: 'components.splashScreen.tooltip',
833
+ ...app.uiConfig.config.splashScreen,
834
+ };
815
835
  }
816
836
  return undefined;
817
837
  }
@@ -835,9 +855,13 @@
835
855
  destroyThemingListener();
836
856
  destroyDisplayQualityListener();
837
857
  destroyAttributions();
858
+ destroyDeepPicking();
838
859
  });
839
860
 
840
- const { smAndUp } = useDisplay();
861
+ const { smAndUp, xs } = useDisplay();
862
+
863
+ const mobileLandscape = isMobileLandscape();
864
+
841
865
  const fontSize = useFontSize();
842
866
  const footerHeight = computed(() => {
843
867
  return Math.ceil(fontSize.value * 1.65);
@@ -879,6 +903,9 @@
879
903
  splashScreen,
880
904
  attributionEntries,
881
905
  attributionAction,
906
+ smAndUp,
907
+ xs,
908
+ mobileLandscape,
882
909
  };
883
910
  },
884
911
  };
@@ -112,6 +112,10 @@ declare const _default: import("vue").DefineComponent<{
112
112
  * - an optional flag whether to activate feature info on startup (default active)
113
113
  */
114
114
  readonly startingFeatureInfo?: boolean | undefined;
115
+ /**
116
+ * - an optional flag whether to enable deep picking via right click context menu (default active)
117
+ */
118
+ readonly enableDeepPicking?: boolean | undefined;
115
119
  /**
116
120
  * - mouse event, when position display is updated. Either 'click' (default) or 'move'.
117
121
  */
@@ -447,16 +451,19 @@ declare const _default: import("vue").DefineComponent<{
447
451
  * Whether to display a checkbox allowing the user not to see the SplashScreen again. This parameter is relative to moduleId and configuration; the SplashScreen will be shown again in case of any change.
448
452
  */
449
453
  enableDontShowAgain?: boolean | undefined;
450
- position: {
454
+ position?: {
451
455
  readonly width?: string | undefined;
452
456
  readonly height?: string | undefined;
453
457
  readonly maxHeight?: string | undefined;
454
458
  readonly maxWidth?: string | undefined;
455
- };
459
+ } | undefined;
456
460
  tooltip: string;
457
461
  } | undefined>;
458
462
  attributionEntries: import("vue").Ref<import("./attributionsHelper.js", { with: { "resolution-mode": "import" } }).AttributionEntry[]>;
459
463
  attributionAction: import("../actions/actionHelper.js", { with: { "resolution-mode": "import" } }).VcsAction;
464
+ smAndUp: import("vue").Ref<boolean>;
465
+ xs: import("vue").Ref<boolean>;
466
+ mobileLandscape: import("vue").ComputedRef<boolean>;
460
467
  }, any, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
461
468
  appId: {
462
469
  type: StringConstructor;
@@ -15,6 +15,7 @@
15
15
  </div>
16
16
  <VcsButton
17
17
  class="flex-shrink-0"
18
+ :data-action-name="attributionAction.name"
18
19
  :key="attributionAction.name"
19
20
  :tooltip="attributionAction.title"
20
21
  :icon="attributionAction.icon"
@@ -3,9 +3,9 @@
3
3
  class="vcs-container pa-0"
4
4
  :class="{
5
5
  'vcs-container-xs': xs,
6
- 'with-header': !config.hideHeader,
7
- 'without-header': config.hideHeader,
8
- 'without-footer': config.hideFooter,
6
+ 'with-header': !config.hideHeader && !mobileLandscape,
7
+ 'without-header': config.hideHeader || mobileLandscape,
8
+ 'without-footer': config.hideFooter || mobileLandscape,
9
9
  }"
10
10
  fluid
11
11
  absolute
@@ -20,18 +20,19 @@
20
20
  :class="{ 'mobile-logo': sm }"
21
21
  />
22
22
  </template>
23
- <!--VcsButton
24
- v-if="!$vuetify.breakpoint.smAndUp && $vuetify.breakpoint.mobile"
23
+ <VcsButton
24
+ v-if="!smAndUp"
25
+ :data-action-name="attributionAction.name"
25
26
  :key="attributionAction.name"
26
27
  :tooltip="attributionAction.title"
27
- :icon="attributionAction.icon"
28
+ icon="mdi-copyright"
28
29
  :active="attributionAction.active"
29
30
  @click.stop="attributionAction.callback($event)"
30
31
  class="z-index-1 mobile-attribution-btn"
31
- /-->
32
+ />
32
33
  <PanelManagerComponent />
33
- <ToolboxManagerComponent v-if="!config.hideToolbox" />
34
- <WindowManagerComponent />
34
+ <ToolboxManagerComponent v-if="!config.hideToolbox && !mobileLandscape" />
35
+ <WindowManagerComponent v-if="!mobileLandscape" />
35
36
  <NotifierComponent />
36
37
  </v-container>
37
38
  </template>
@@ -55,7 +56,7 @@
55
56
 
56
57
  .vcs-container-xs.with-header {
57
58
  top: 0;
58
- bottom: 56px;
59
+ bottom: calc(var(--v-vcs-font-size) * 3 + 10px);
59
60
  }
60
61
  .vcs-container-xs.without-header {
61
62
  top: 0;
@@ -72,8 +73,23 @@
72
73
  }
73
74
  .mobile-attribution-btn {
74
75
  position: fixed;
75
- right: 2px;
76
- bottom: 36px;
76
+ right: 32px;
77
+ bottom: 67px;
78
+ background-color: rgba(var(--v-theme-surface-light), 0.5);
79
+ color: rgb(var(--v-theme-on-surface));
80
+ backdrop-filter: blur(1px);
81
+ -webkit-backdrop-filter: blur(1px);
82
+ padding: 6px !important;
83
+ padding-bottom: 7px !important;
84
+ border-radius: 4px;
85
+ height: 35px !important;
86
+ width: 35px !important;
87
+ font-size: 20px !important;
88
+ justify-content: center;
89
+ align-items: center;
90
+ }
91
+ ::v-deep(.mobile-attribution-btn span i) {
92
+ font-size: calc(var(--v-vcs-font-size) + 13px) !important;
77
93
  }
78
94
  .z-index-1 {
79
95
  z-index: 1;
@@ -84,11 +100,13 @@
84
100
  import { computed, inject } from 'vue';
85
101
  import { useDisplay } from 'vuetify';
86
102
  import { VContainer } from 'vuetify/components';
103
+ import VcsButton from '../components/buttons/VcsButton.vue';
87
104
  import PanelManagerComponent from '../manager/panel/PanelManagerComponent.vue';
88
105
  import WindowManagerComponent from '../manager/window/WindowManager.vue';
89
106
  import ToolboxManagerComponent from '../manager/toolbox/ToolboxManagerComponent.vue';
90
107
  import NotifierComponent from '../notifier/NotifierComponent.vue';
91
108
  import VcsDefaultLogoMobile from '../logo-mobile.svg';
109
+ import { isMobileLandscape } from '../vuePlugins/vuetify.js';
92
110
 
93
111
  /**
94
112
  * @description The main container with map canvas
@@ -101,6 +119,7 @@
101
119
  ToolboxManagerComponent,
102
120
  VContainer,
103
121
  NotifierComponent,
122
+ VcsButton,
104
123
  },
105
124
  props: {
106
125
  attributionAction: {
@@ -111,12 +130,16 @@
111
130
  setup() {
112
131
  /** @type {import("../vcsUiApp.js").default} */
113
132
  const app = inject('vcsApp');
114
- const { smAndDown, xs, sm } = useDisplay();
133
+ const { smAndDown, xs, sm, smAndUp, mobile } = useDisplay();
134
+ const mobileLandscape = isMobileLandscape();
115
135
  return {
116
136
  config: app.uiConfig.config,
117
137
  smAndDown,
118
138
  xs,
119
139
  sm,
140
+ smAndUp,
141
+ mobile,
142
+ mobileLandscape,
120
143
  mobileLogo: computed(
121
144
  () =>
122
145
  app.uiConfig.config.mobileLogo ??
@@ -26,6 +26,10 @@ declare const _default: import("vue").DefineComponent<{
26
26
  * - an optional flag whether to activate feature info on startup (default active)
27
27
  */
28
28
  readonly startingFeatureInfo?: boolean | undefined;
29
+ /**
30
+ * - an optional flag whether to enable deep picking via right click context menu (default active)
31
+ */
32
+ readonly enableDeepPicking?: boolean | undefined;
29
33
  /**
30
34
  * - mouse event, when position display is updated. Either 'click' (default) or 'move'.
31
35
  */
@@ -294,6 +298,9 @@ declare const _default: import("vue").DefineComponent<{
294
298
  smAndDown: import("vue").Ref<boolean>;
295
299
  xs: import("vue").Ref<boolean>;
296
300
  sm: import("vue").Ref<boolean>;
301
+ smAndUp: import("vue").Ref<boolean>;
302
+ mobile: import("vue").ComputedRef<boolean>;
303
+ mobileLandscape: import("vue").ComputedRef<boolean>;
297
304
  mobileLogo: import("vue").ComputedRef<any>;
298
305
  }, any, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
299
306
  attributionAction: {
@@ -0,0 +1,111 @@
1
+ <script setup>
2
+ import { inject } from 'vue';
3
+ import { VDivider, VList, VListItem } from 'vuetify/components';
4
+ import {
5
+ ButtonLocation,
6
+ deviceSymbol,
7
+ getActionsByLocation,
8
+ } from '../manager/navbarManager.js';
9
+ import VcsTextPageFooter from './VcsTextPageFooter.vue';
10
+ import { getDataProtection, getImprint } from './uiConfigHelper.js';
11
+ import { toolboxComponentId } from '../manager/toolbox/ToolboxManagerComponent.vue';
12
+
13
+ const app = inject('vcsApp');
14
+
15
+ const mobileButtonComponents = app.navbarManager.componentIds
16
+ .map((id) => app.navbarManager.get(id))
17
+ .filter((buttonComponent) => {
18
+ return buttonComponent[deviceSymbol].mobile;
19
+ });
20
+
21
+ // Actions from the content overflow are put in Menu
22
+ const contentOverflowActions = getActionsByLocation(
23
+ mobileButtonComponents,
24
+ ButtonLocation.CONTENT,
25
+ [...app.plugins].map((p) => p.name),
26
+ )?.slice(2);
27
+
28
+ const toolboxToggleAction = app.navbarManager.get(toolboxComponentId).action;
29
+
30
+ const toolboxOverflowActions = getActionsByLocation(
31
+ mobileButtonComponents,
32
+ ButtonLocation.TOOL,
33
+ [...app.plugins].map((p) => p.name),
34
+ )?.filter((action) => action.name !== toolboxToggleAction.name);
35
+
36
+ const mobileMenuActions = [
37
+ ...getActionsByLocation(
38
+ mobileButtonComponents,
39
+ ButtonLocation.MENU,
40
+ [...app.plugins].map((p) => p.name),
41
+ ),
42
+ ...getActionsByLocation(
43
+ mobileButtonComponents,
44
+ ButtonLocation.SHARE,
45
+ [...app.plugins].map((p) => p.name),
46
+ ),
47
+ ...getActionsByLocation(
48
+ mobileButtonComponents,
49
+ ButtonLocation.PROJECT,
50
+ [...app.plugins].map((p) => p.name),
51
+ ),
52
+ ...toolboxOverflowActions,
53
+ ...contentOverflowActions,
54
+ ];
55
+
56
+ const dataProtection = getDataProtection(app.uiConfig?.config);
57
+ const imprint = getImprint(app.uiConfig?.config);
58
+ </script>
59
+
60
+ <template>
61
+ <v-list>
62
+ <div v-for="action in mobileMenuActions" :key="action.name">
63
+ <v-list-item
64
+ @click="action.callback()"
65
+ :data-action-name="action.name"
66
+ :title="$t(action.name)"
67
+ :prepend-icon="action.icon"
68
+ >
69
+ </v-list-item>
70
+ <v-divider></v-divider>
71
+ </div>
72
+ <template v-if="imprint">
73
+ <v-list-item v-if="imprint">
74
+ <VcsTextPageFooter
75
+ class="plainStyle"
76
+ :text-page="imprint"
77
+ :window-id="'imprintWindow'"
78
+ />
79
+ </v-list-item>
80
+ <v-divider></v-divider>
81
+ </template>
82
+ <template v-if="dataProtection">
83
+ <v-list-item v-if="dataProtection">
84
+ <VcsTextPageFooter
85
+ class="plainStyle"
86
+ :text-page="dataProtection"
87
+ :window-id="'dataProtectionWindow'"
88
+ />
89
+ </v-list-item>
90
+ </template>
91
+ </v-list>
92
+ </template>
93
+
94
+ <style scoped lang="scss">
95
+ .plainStyle {
96
+ font-family: var(--v-vcs-font-family), sans-serif !important;
97
+ font-size: var(--v-vcs-font-size) !important;
98
+ }
99
+ ::v-deep(.text-page-footer) {
100
+ font-size: var(--v-vcs-font-size) !important;
101
+ text-decoration: none !important;
102
+
103
+ a {
104
+ color: var(--v-text-color);
105
+ text-decoration: none !important;
106
+ }
107
+ }
108
+ ::v-deep(.v-list-item__prepend) {
109
+ display: block !important;
110
+ }
111
+ </style>
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
2
+ export default _default;
@@ -85,6 +85,7 @@
85
85
  v-bind="props"
86
86
  tooltip="navbar.share.tooltip"
87
87
  icon="$vcsShare"
88
+ id="vcs-navbar-share-menu-activator"
88
89
  />
89
90
  </template>
90
91
  <VcsActionList
@@ -96,6 +97,7 @@
96
97
  <VcsToolButton
97
98
  class="d-flex"
98
99
  v-if="searchAction"
100
+ :data-action-name="searchAction.name"
99
101
  :key="searchAction.name"
100
102
  :tooltip="searchAction.title"
101
103
  :icon="searchAction.icon"
@@ -108,6 +110,7 @@
108
110
  <VcsToolButton
109
111
  v-bind="props"
110
112
  tooltip="navbar.menu.tooltip"
113
+ id="vcs-navbar-burger-menu-activator"
111
114
  icon="$vcsMenu"
112
115
  />
113
116
  </template>
@@ -154,6 +157,7 @@
154
157
  } from 'vuetify/components';
155
158
  import {
156
159
  ButtonLocation,
160
+ deviceSymbol,
157
161
  getActionsByLocation,
158
162
  } from '../manager/navbarManager.js';
159
163
  import VcsActionButtonList from '../components/buttons/VcsActionButtonList.vue';
@@ -185,8 +189,18 @@
185
189
  setup() {
186
190
  const app = inject('vcsApp');
187
191
 
192
+ const { xs, mdAndUp, smAndDown, smAndUp, sm } = useDisplay();
193
+
188
194
  const buttonComponents = computed(() =>
189
- app.navbarManager.componentIds.map((id) => app.navbarManager.get(id)),
195
+ app.navbarManager.componentIds
196
+ .map((id) => app.navbarManager.get(id))
197
+ .filter((buttonComponent) => {
198
+ if (sm.value) {
199
+ return buttonComponent[deviceSymbol].tablet;
200
+ } else {
201
+ return buttonComponent[deviceSymbol].desktop;
202
+ }
203
+ }),
190
204
  );
191
205
  const getActions = (location) =>
192
206
  computed(() =>
@@ -208,8 +222,6 @@
208
222
  destroySearchAction();
209
223
  });
210
224
 
211
- const { xs, mdAndUp, smAndDown, smAndUp } = useDisplay();
212
-
213
225
  const density = computed(() => {
214
226
  return xs.value ? 'comfortable' : 'compact';
215
227
  });