@vcmap/ui 5.0.0-rc.21 → 5.0.0-rc.22

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 (101) hide show
  1. package/build/buildHelpers.js +1 -0
  2. package/build/commonViteConfig.js +1 -0
  3. package/config/www.config.json +25 -14
  4. package/dist/assets/cesium.js +1 -1
  5. package/dist/assets/{core.59d4d1.js → core.a66593.js} +2443 -2457
  6. package/dist/assets/core.js +1 -1
  7. package/dist/assets/favicon.decf54cc.svg +10 -0
  8. package/dist/assets/{index.a3861d4e.js → index.8b833ead.js} +1 -1
  9. package/dist/assets/{ol.c1c512.js → ol.d4539f.js} +12406 -12152
  10. package/dist/assets/ol.js +1 -1
  11. package/dist/assets/ui.d760e4.css +5 -0
  12. package/dist/assets/{ui.80175f.js → ui.d760e4.js} +5218 -4240
  13. package/dist/assets/ui.js +1 -1
  14. package/dist/assets/vue.js +2 -2
  15. package/dist/assets/vuetify.427322.css +5 -0
  16. package/dist/assets/{vuetify.efc158.js → vuetify.427322.js} +1 -1
  17. package/dist/assets/vuetify.js +2 -2
  18. package/dist/index.html +6 -1
  19. package/index.html +5 -0
  20. package/index.js +2 -1
  21. package/lib/olLib.js +15 -1
  22. package/package.json +4 -3
  23. package/plugins/@vcmap/project-selector/ProjectSelectorComponent.vue +1 -1
  24. package/plugins/@vcmap/theme-changer/ThemeChangerComponent.vue +10 -4
  25. package/plugins/@vcmap-show-case/form-inputs-example/FormInputsExample.vue +75 -81
  26. package/plugins/@vcmap-show-case/form-inputs-example/index.js +7 -3
  27. package/plugins/@vcmap-show-case/form-inputs-example/validation.js +1 -1
  28. package/plugins/@vcmap-show-case/list-example/ListExample.vue +5 -2
  29. package/plugins/@vcmap-show-case/wizard-example/wizardExample.vue +57 -23
  30. package/plugins/package.json +2 -1
  31. package/src/application/VcsApp.vue +13 -5
  32. package/src/application/VcsAttributions.vue +2 -3
  33. package/src/application/VcsAttributionsFooter.vue +10 -16
  34. package/src/application/VcsNavbar.vue +1 -2
  35. package/src/application/VcsSettings.vue +21 -8
  36. package/src/assets/favicon-128.png +0 -0
  37. package/src/assets/favicon-180.png +0 -0
  38. package/src/assets/favicon-192.png +0 -0
  39. package/src/assets/favicon-32.png +0 -0
  40. package/src/assets/favicon.svg +10 -0
  41. package/src/components/buttons/VcsButton.vue +2 -3
  42. package/src/components/form-inputs-controls/VcsCheckbox.vue +46 -26
  43. package/src/components/form-inputs-controls/VcsFormSection.vue +15 -13
  44. package/src/components/form-inputs-controls/VcsLabel.vue +10 -1
  45. package/src/components/form-inputs-controls/VcsRadio.vue +38 -18
  46. package/src/components/form-inputs-controls/VcsSelect.vue +117 -59
  47. package/src/components/form-inputs-controls/VcsTextArea.vue +101 -60
  48. package/src/components/form-inputs-controls/VcsTextField.vue +171 -69
  49. package/src/components/form-inputs-controls/VcsWizard.vue +20 -14
  50. package/src/components/form-inputs-controls/VcsWizardStep.vue +18 -16
  51. package/src/components/form-inputs-controls/composables.js +26 -0
  52. package/src/components/form-output/VcsFormattedNumber.vue +1 -1
  53. package/src/components/icons/2DDistanceIcon.vue +0 -3
  54. package/src/components/icons/3DDistanceIcon.vue +0 -3
  55. package/src/components/icons/3DHeightIcon.vue +0 -3
  56. package/src/components/icons/CheckboxCheckedIcon.vue +4 -11
  57. package/src/components/icons/CheckboxIcon.vue +9 -2
  58. package/src/components/icons/CheckboxIndeterminateIcon.vue +4 -21
  59. package/src/components/icons/CommentIcon.vue +1 -5
  60. package/src/components/icons/ObliqueViewIcon.vue +6 -8
  61. package/src/components/icons/SimpleCircleOutlinedIcon.vue +1 -1
  62. package/src/components/icons/SplitViewIcon.vue +0 -4
  63. package/src/components/icons/ToolsIcon.vue +2 -4
  64. package/src/components/lists/VcsActionList.vue +0 -1
  65. package/src/components/lists/VcsList.vue +6 -25
  66. package/src/components/lists/VcsTreeview.vue +2 -2
  67. package/src/components/lists/VcsTreeviewLeaf.vue +3 -9
  68. package/src/components/lists/VcsTreeviewSearchbar.vue +4 -4
  69. package/src/components/notification/VcsBadge.vue +6 -2
  70. package/src/components/notification/VcsHelp.vue +39 -0
  71. package/src/components/tables/VcsTable.vue +70 -24
  72. package/src/featureInfo/AddressBalloonComponent.vue +1 -1
  73. package/src/featureInfo/BalloonComponent.vue +14 -9
  74. package/src/featureInfo/featureInfo.js +25 -7
  75. package/src/featureInfo/tableFeatureInfoView.js +4 -0
  76. package/src/i18n/de.js +5 -1
  77. package/src/i18n/en.js +5 -1
  78. package/src/legend/styleLegendItem.vue +24 -2
  79. package/src/legend/vcsLegend.vue +24 -31
  80. package/src/manager/toolbox/GroupToolboxComponent.vue +2 -3
  81. package/src/manager/toolbox/SelectToolboxComponent.vue +11 -5
  82. package/src/manager/toolbox/ToolboxManager.vue +0 -7
  83. package/src/manager/window/WindowComponent.vue +0 -1
  84. package/src/manager/window/WindowComponentHeader.vue +2 -2
  85. package/src/navigation/overviewMap.js +6 -15
  86. package/src/navigation/tiltSlider.vue +30 -6
  87. package/src/search/resultsComponent.vue +0 -1
  88. package/src/search/search.js +7 -17
  89. package/src/search/searchComponent.vue +6 -7
  90. package/src/styles/_theming.scss +72 -3
  91. package/src/styles/_typography.scss +0 -5
  92. package/src/styles/main.scss +1 -0
  93. package/src/styles/shades.scss +2 -0
  94. package/src/styles/variables.scss +40 -4
  95. package/src/uiConfig.js +1 -0
  96. package/src/vcsUiApp.js +5 -0
  97. package/src/vuePlugins/vuetify.js +59 -13
  98. package/dist/assets/ui.80175f.css +0 -1
  99. package/dist/assets/vuetify.efc158.css +0 -5
  100. /package/dist/assets/{cesium.49585c.js → cesium.88cffd.js} +0 -0
  101. /package/dist/assets/{vue.a08ab1.js → vue.db5102.js} +0 -0
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <v-card
2
+ <v-sheet
3
3
  class="overflow-y-auto"
4
4
  >
5
5
  <v-expansion-panels
@@ -7,47 +7,48 @@
7
7
  multiple
8
8
  v-if="entries.length > 0"
9
9
  v-model="panels"
10
+ class="rounded-0"
10
11
  >
11
12
  <v-expansion-panel
12
13
  v-for="(entry,i) in entries"
13
14
  :key="i"
14
- class="pa-0 ma-0"
15
+ class="px-2"
15
16
  @change="entry.open = !entry.open"
16
17
  >
17
18
  <v-expansion-panel-header hide-actions>
18
- {{ $t(entry.title) }}
19
19
  <template #default="{ open }">
20
- <div class="d-flex">
21
- <v-icon :class="{ 'v-treeview-node__toggle': !open }">
22
- mdi-chevron-down
23
- </v-icon>
24
- <VcsTreeviewLeaf class="w-full" :item="entry" />
20
+ <div class="d-flex justify-space-between">
21
+ <div class="d-flex align-center">
22
+ <v-icon class="mr-1" :class="{ 'rotate': !open }">
23
+ mdi-chevron-down
24
+ </v-icon>
25
+ {{ $t(entry.title) }}
26
+ </div>
27
+ <VcsActionButtonList small :actions="entry.actions" />
25
28
  </div>
26
29
  </template>
27
30
  </v-expansion-panel-header>
28
- <v-expansion-panel-content>
31
+ <v-expansion-panel-content class="pl-6 pb-2">
29
32
  <v-list dense>
30
33
  <div v-for="(item, idx) in entry.legend" :key="idx">
31
- <div v-if="item.type === LegendType.Image" class="mx-2">
34
+ <div v-if="item.type === LegendType.Image">
32
35
  <img
33
36
  :src="$t(item.src)"
34
- max-width="287"
35
- max-height="auto"
36
- class="mx-2 legend-image"
37
+ class="legend-image"
37
38
  :title="item.tooltip"
38
39
  >
39
40
  </div>
40
- <div v-else-if="item.type === LegendType.Iframe" class="mx-2">
41
+ <div v-else-if="item.type === LegendType.Iframe">
41
42
  <iframe
42
43
  :id="`legendIframe${idx}`"
43
44
  :src="$t(item.src)"
44
45
  scrolling="no"
45
- width="287"
46
+ style="width: 100%; height: 100%;"
46
47
  frameBorder="0"
47
48
  @load="setIframeHeight(`legendIframe${idx}`)"
48
49
  />
49
50
  </div>
50
- <style-legend-item v-else :item="item" class="mx-2" />
51
+ <style-legend-item v-else :item="item" />
51
52
  </div>
52
53
  </v-list>
53
54
  </v-expansion-panel-content>
@@ -56,13 +57,12 @@
56
57
  <v-sheet v-else class="ma-2">
57
58
  {{ $t('legend.empty') }}
58
59
  </v-sheet>
59
- </v-card>
60
+ </v-sheet>
60
61
  </template>
61
62
 
62
63
  <script>
63
64
 
64
65
  import {
65
- VCard,
66
66
  VExpansionPanels,
67
67
  VExpansionPanel,
68
68
  VExpansionPanelHeader,
@@ -74,7 +74,7 @@
74
74
  import { computed } from 'vue';
75
75
  import { LegendType } from './legendHelper.js';
76
76
  import StyleLegendItem from './styleLegendItem.vue';
77
- import VcsTreeviewLeaf from '../components/lists/VcsTreeviewLeaf.vue';
77
+ import VcsActionButtonList from '../components/buttons/VcsActionButtonList.vue';
78
78
 
79
79
  /**
80
80
  * @description A component rendering configured legend information for active layers.
@@ -84,9 +84,8 @@
84
84
  export default {
85
85
  name: 'VcsLegend',
86
86
  components: {
87
- VcsTreeviewLeaf,
87
+ VcsActionButtonList,
88
88
  StyleLegendItem,
89
- VCard,
90
89
  VExpansionPanels,
91
90
  VExpansionPanel,
92
91
  VExpansionPanelHeader,
@@ -130,17 +129,11 @@
130
129
  </script>
131
130
 
132
131
  <style lang="scss" scoped>
133
- .v-list-item--dense {
134
- height: 32px;
135
- }
136
- ::v-deep {
137
- .treeview-label {
138
- max-width: 189px;
139
- }
140
- }
141
132
  .legend-image {
142
- max-width: 287px;
133
+ max-width: 100%;
143
134
  height: auto;
144
- width: auto;
135
+ }
136
+ .rotate {
137
+ transform: rotate(-90deg);
145
138
  }
146
139
  </style>
@@ -14,12 +14,12 @@
14
14
  :icon="group.icon"
15
15
  :tooltip="group.title"
16
16
  :active="open || hasActiveAction"
17
- :color="hasActiveAction ? 'primary' : 'basic'"
17
+ :color="hasActiveAction ? 'primary' : ''"
18
18
  v-bind="attrs"
19
19
  v-on="on"
20
20
  large
21
21
  >
22
- <v-icon v-text="open ? 'mdi-chevron-up' : 'mdi-chevron-down'" color="accent" class="text--darken-3" />
22
+ <v-icon v-text="open ? 'mdi-chevron-up' : 'mdi-chevron-down'" />
23
23
  </VcsButton>
24
24
  </template>
25
25
 
@@ -28,7 +28,6 @@
28
28
  class="vcs-toolbox-2 toolbar__secondary mx-auto v-sheet marginToTop"
29
29
  :height="40"
30
30
  width="fit-content"
31
- color="basic"
32
31
  dense
33
32
  >
34
33
  <v-toolbar-items class="w-full">
@@ -33,7 +33,7 @@
33
33
  :width="16"
34
34
  large
35
35
  >
36
- <v-icon v-text="open ? 'mdi-chevron-up' : 'mdi-chevron-down'" color="accent" class="text--darken-3" />
36
+ <v-icon v-text="open ? 'mdi-chevron-up' : 'mdi-chevron-down'" />
37
37
  </VcsButton>
38
38
  </template>
39
39
 
@@ -41,7 +41,6 @@
41
41
  class="vcs-toolbox-2 toolbar__secondary mx-auto v-sheet marginToTop justify-center"
42
42
  :height="40"
43
43
  width="fit-content"
44
- color="basic"
45
44
  dense
46
45
  >
47
46
  <v-toolbar-items class="w-full">
@@ -62,6 +61,8 @@
62
61
  </div>
63
62
  </template>
64
63
  <style lang="scss">
64
+ @import '../../styles/shades.scss';
65
+
65
66
  .vcs-toolbox-action-selected > .v-btn.vcs-button--large {
66
67
  max-width: 40px;
67
68
  }
@@ -71,9 +72,14 @@
71
72
  }
72
73
 
73
74
  .vcs-toolbox-action-select-button--active {
74
- //border: 2px solid var(--v-basic-base);
75
- border-radius: 5px;
76
- background: var(--v-basic-base);
75
+ //border: 2px solid var(--v-shades-base);
76
+ border-radius: 4px;
77
+ }
78
+ .theme--light .vcs-toolbox-action-select-button--active {
79
+ background: map-get($shades, 'white');
80
+ }
81
+ .theme--dark .vcs-toolbox-action-select-button--active {
82
+ background: map-get($shades, 'black');
77
83
  }
78
84
 
79
85
  .vcs-toolbox-2 {
@@ -50,13 +50,6 @@
50
50
  padding: 0;
51
51
  }
52
52
  }
53
-
54
- &.theme--light.v-toolbar.v-sheet {
55
- background-color: #ffffffda;
56
- }
57
- &.theme--dark.v-toolbar.v-sheet {
58
- background-color: #000000da;
59
- }
60
53
  }
61
54
 
62
55
  .marginToTop {
@@ -20,7 +20,6 @@
20
20
  class="pa-2"
21
21
  :class="{
22
22
  'cursor-grab': isDynamic,
23
- 'grey--text': !isOnTop,
24
23
  }"
25
24
  >
26
25
  <slot name="headerComponent" :props="$attrs" />
@@ -4,11 +4,11 @@
4
4
  <v-icon
5
5
  v-if="windowState.headerIcon"
6
6
  class="mr-2"
7
- :class="{ 'text--primary': isOnTop }"
7
+ :class="{ 'primary--text': isOnTop }"
8
8
  v-text="windowState.headerIcon"
9
9
  />
10
10
  <h3
11
- class="font-size-14 d-inline-block user-select-none font-weight-bold"
11
+ class="d-inline-block user-select-none font-weight-bold"
12
12
  :class="{ 'text--primary': isOnTop }"
13
13
  >
14
14
  {{ $t(windowState.headerTitle) }}
@@ -20,7 +20,7 @@ import VectorSource from 'ol/source/Vector.js';
20
20
  import { Icon } from 'ol/style.js';
21
21
  import { WindowSlot } from '../manager/window/windowManager.js';
22
22
  import OverviewMapClickedInteraction from './overviewMapClickedInteraction.js';
23
- import { defaultPrimaryColor } from '../vuePlugins/vuetify.js';
23
+ import { getDefaultPrimaryColor, getColorByKey } from '../vuePlugins/vuetify.js';
24
24
  import { vcsAppSymbol } from '../pluginHelper.js';
25
25
  import VcsMap from '../application/VcsMap.vue';
26
26
 
@@ -112,7 +112,7 @@ class OverviewMap {
112
112
  */
113
113
  this._obliqueSelectedImageLayer = null;
114
114
 
115
- const primary = app.uiConfig.config.value.primaryColor ?? defaultPrimaryColor;
115
+ const primary = app.uiConfig.config.value.primaryColor ?? getDefaultPrimaryColor();
116
116
  const fillColor = Color.fromCssColorString('#EDEDED');
117
117
 
118
118
  /**
@@ -165,7 +165,7 @@ class OverviewMap {
165
165
  * @type {import("@vcmap/core").VectorStyleItem}
166
166
  */
167
167
  this.cameraIconStyle = new VectorStyleItem({
168
- image: getCameraIcon(defaultPrimaryColor),
168
+ image: getCameraIcon(getDefaultPrimaryColor()),
169
169
  });
170
170
 
171
171
  /**
@@ -229,16 +229,7 @@ class OverviewMap {
229
229
  this._map.layerCollection.remove(clone);
230
230
  }
231
231
  }),
232
- this._app.uiConfig.added.addEventListener((item) => {
233
- if (item?.name === 'primaryColor') {
234
- this._updatePrimaryColor(item.value);
235
- }
236
- }),
237
- this._app.uiConfig.removed.addEventListener((item) => {
238
- if (item?.name === 'primaryColor') {
239
- this._updatePrimaryColor(defaultPrimaryColor);
240
- }
241
- }),
232
+ this._app.themeChanged.addEventListener(this._updatePrimaryColor.bind(this)),
242
233
  ];
243
234
  }
244
235
 
@@ -275,10 +266,10 @@ class OverviewMap {
275
266
  }
276
267
 
277
268
  /**
278
- * @param {string} color
279
269
  * @private
280
270
  */
281
- _updatePrimaryColor(color) {
271
+ _updatePrimaryColor() {
272
+ const color = getColorByKey('primary');
282
273
  this.obliqueUnselectedStyle?.stroke?.setColor(color);
283
274
  this.obliqueSelectedStyle?.stroke?.setColor(color);
284
275
  this._obliqueTileLayer?.forceRedraw?.();
@@ -10,8 +10,7 @@
10
10
  v-bind="attrs"
11
11
  >
12
12
  <v-slider
13
- color="secondary"
14
- track-color="accent"
13
+ track-color="base lighten-3"
15
14
  v-model="tilt"
16
15
  :max="0"
17
16
  :min="-90"
@@ -24,6 +23,7 @@
24
23
  </VcsTooltip>
25
24
  </template>
26
25
  <style lang="scss" scoped>
26
+ @import '../styles/shades.scss';
27
27
  .vcs-slider{
28
28
  ::v-deep {
29
29
  .v-slider {
@@ -44,6 +44,34 @@
44
44
  }
45
45
  }
46
46
  }
47
+ .v-application .theme--light.vcs-slider {
48
+ ::v-deep {
49
+ .v-slider {
50
+ .v-slider__track-container{
51
+ .v-slider__track-fill {
52
+ background-color: map-get($shades, 'black') !important;
53
+ }
54
+ }
55
+ .v-slider__thumb {
56
+ background-color: map-get($shades, 'black') !important;
57
+ }
58
+ }
59
+ }
60
+ }
61
+ .v-application .theme--dark.vcs-slider {
62
+ ::v-deep {
63
+ .v-slider {
64
+ .v-slider__track-container{
65
+ .v-slider__track-fill {
66
+ background-color: map-get($shades, 'white') !important;
67
+ }
68
+ }
69
+ .v-slider__thumb {
70
+ background-color: map-get($shades, 'white') !important;
71
+ }
72
+ }
73
+ }
74
+ }
47
75
  </style>
48
76
  <script>
49
77
  import { clamp } from 'ol/math.js';
@@ -93,7 +121,3 @@
93
121
  },
94
122
  };
95
123
  </script>
96
-
97
- <style scoped>
98
-
99
- </style>
@@ -6,7 +6,6 @@
6
6
  <v-list-item
7
7
  v-for="(item, index) in results"
8
8
  :key="index"
9
- color="secondary"
10
9
  class="px-0"
11
10
  >
12
11
  <v-list-item-content>
@@ -13,7 +13,7 @@ import { check } from '@vcsuite/check';
13
13
  import { Icon } from 'ol/style.js';
14
14
  import { getLogger } from '@vcsuite/logger';
15
15
  import { vcsAppSymbol } from '../pluginHelper.js';
16
- import { defaultPrimaryColor } from '../vuePlugins/vuetify.js';
16
+ import { getDefaultPrimaryColor, getColorByKey } from '../vuePlugins/vuetify.js';
17
17
  import { getViewpointFromFeature } from '../actions/actionHelper.js';
18
18
 
19
19
  /**
@@ -70,39 +70,29 @@ function setupSearchResultLayer(app) {
70
70
  app.layers.add(resultLayer);
71
71
 
72
72
  const style = new VectorStyleItem({
73
- image: getPointResultIcon(defaultPrimaryColor),
73
+ image: getPointResultIcon(getDefaultPrimaryColor()),
74
74
  fill: {
75
75
  color: 'rgba(237, 237, 237, 0.1)',
76
76
  },
77
77
  stroke: {
78
- color: defaultPrimaryColor,
78
+ color: getDefaultPrimaryColor(),
79
79
  width: 5,
80
80
  },
81
81
  });
82
82
  resultLayer.setStyle(style);
83
83
 
84
- function setResultColor(color) {
84
+ function setResultColor() {
85
+ const color = getColorByKey('primary');
85
86
  style.stroke?.setColor(color);
86
87
  style.image = new Icon(getPointResultIcon(color));
87
88
  resultLayer.forceRedraw();
88
89
  }
89
90
 
90
- const listeners = [
91
- app.uiConfig.added.addEventListener((item) => {
92
- if (item.name === 'primaryColor') {
93
- setResultColor(item.value);
94
- }
95
- }),
96
- app.uiConfig.removed.addEventListener((item) => {
97
- if (item.name === 'primaryColor') {
98
- setResultColor(defaultPrimaryColor);
99
- }
100
- }),
101
- ];
91
+ const themChangedListener = app.themeChanged.addEventListener(setResultColor);
102
92
 
103
93
  const destroy = () => {
104
94
  resultLayer.destroy();
105
- listeners.forEach(cb => cb());
95
+ themChangedListener();
106
96
  };
107
97
 
108
98
  return { resultLayer, destroy };
@@ -1,6 +1,6 @@
1
1
  <template>
2
- <v-card>
3
- <span class="d-flex justify-space-between align-center ma-1">
2
+ <v-sheet>
3
+ <span class="d-flex justify-space-between align-center mt-1 mx-1">
4
4
  <v-icon
5
5
  class="mx-2"
6
6
  >
@@ -15,13 +15,12 @@
15
15
  :placeholder="$t('search.placeholder')"
16
16
  v-model.trim="query"
17
17
  @keydown.enter="search"
18
- @keydown.esc="clear"
19
18
  @input="reset"
20
19
  />
21
20
  </span>
22
- <v-divider />
21
+ <v-divider class="mt-1" v-if="!!results.length" />
23
22
  <ResultsComponent :query="query" :results="results" />
24
- </v-card>
23
+ </v-sheet>
25
24
  </template>
26
25
 
27
26
  <style>
@@ -31,7 +30,7 @@
31
30
  <script>
32
31
  import { inject, onUnmounted, ref } from 'vue';
33
32
  import { getLogger } from '@vcsuite/logger';
34
- import { VCard, VDivider, VIcon } from 'vuetify/lib';
33
+ import { VSheet, VDivider, VIcon } from 'vuetify/lib';
35
34
  import VcsTextField from '../components/form-inputs-controls/VcsTextField.vue';
36
35
  import ResultsComponent from './resultsComponent.vue';
37
36
 
@@ -39,7 +38,7 @@
39
38
  components: {
40
39
  ResultsComponent,
41
40
  VcsTextField,
42
- VCard,
41
+ VSheet,
43
42
  VIcon,
44
43
  VDivider,
45
44
  },
@@ -14,7 +14,76 @@
14
14
  width: 70px;
15
15
  }
16
16
 
17
- // Dev-Only!
18
- .bg-dev.theme--light.v-application {
19
- background-color: var(--v-primary-base);
17
+ .v-application .base {
18
+ background-color: var(--v-base-base) !important;
19
+ border-color: var(--v-base-base) !important;
20
+ }
21
+ .v-application .base.lighten-1 {
22
+ background-color: var(--v-base-lighten1) !important;
23
+ border-color: var(--v-base-lighten1) !important;
24
+ }
25
+ .v-application .base.lighten-2 {
26
+ background-color: var(--v-base-lighten2) !important;
27
+ border-color: var(--v-base-lighten2) !important;
28
+ }
29
+ .v-application .base.lighten-3 {
30
+ background-color: var(--v-base-lighten3) !important;
31
+ border-color: var(--v-base-lighten3) !important;
32
+ }
33
+ .v-application .base.lighten-4 {
34
+ background-color: var(--v-base-lighten4) !important;
35
+ border-color: var(--v-base-lighten4) !important;
36
+ }
37
+ .v-application .base.darken-1 {
38
+ background-color: var(--v-base-darken1) !important;
39
+ border-color: var(--v-base-darken1) !important;
40
+ }
41
+ .v-application .base.darken-2 {
42
+ background-color: var(--v-base-darken2) !important;
43
+ border-color: var(--v-base-darken2) !important;
44
+ }
45
+ .v-application .base.darken-3 {
46
+ background-color: var(--v-base-darken3) !important;
47
+ border-color: var(--v-base-darken3) !important;
48
+ }
49
+ .v-application .base.darken-4 {
50
+ background-color: var(--v-base-darken4) !important;
51
+ border-color: var(--v-base-darken4) !important;
52
+ }
53
+
54
+ .v-application .base--text {
55
+ color: var(--v-base-base) !important;
56
+ caret-color: var(--v-base-base) !important;
57
+ }
58
+ .v-application .base--text.text--lighten-1 {
59
+ color: var(--v-base-lighten1) !important;
60
+ caret-color: var(--v-base-lighten1) !important;
61
+ }
62
+ .v-application .base--text.text--lighten-2 {
63
+ color: var(--v-base-lighten2) !important;
64
+ caret-color: var(--v-base-lighten2) !important;
65
+ }
66
+ .v-application .base--text.text--lighten-3 {
67
+ color: var(--v-base-lighten3) !important;
68
+ caret-color: var(--v-base-lighten3) !important;
69
+ }
70
+ .v-application .base--text.text--lighten-4 {
71
+ color: var(--v-base-lighten4) !important;
72
+ caret-color: var(--v-base-lighten4) !important;
73
+ }
74
+ .v-application .base--text.text--darken-1 {
75
+ color: var(--v-base-darken1) !important;
76
+ caret-color: var(--v-base-darken1) !important;
77
+ }
78
+ .v-application .base--text.text--darken-2 {
79
+ color: var(--v-base-darken2) !important;
80
+ caret-color: var(--v-base-darken2) !important;
81
+ }
82
+ .v-application .base--text.text--darken-3 {
83
+ color: var(--v-base-darken3) !important;
84
+ caret-color: var(--v-base-darken3) !important;
85
+ }
86
+ .v-application .base--text.text--darken-4 {
87
+ color: var(--v-base-darken4) !important;
88
+ caret-color: var(--v-base-darken4) !important;
20
89
  }
@@ -29,17 +29,12 @@
29
29
  }
30
30
 
31
31
  h3 {
32
- font-size: 12px;
33
32
  font-weight: normal;
34
33
  }
35
34
 
36
35
  h4 {
37
36
  font-size: 12px;
38
37
  font-weight: normal;
39
- color: rgba(#222222, 0.5);
40
38
  }
41
39
 
42
- .text--disabled {
43
- color: rgba(0, 0, 0, 0.38) !important;
44
- }
45
40
  }
@@ -2,6 +2,7 @@
2
2
 
3
3
  @import './theming';
4
4
  @import './typography';
5
+ @import './shades';
5
6
  @import './variables';
6
7
  @import './vcsFont';
7
8
  @import './vcsGrid';
@@ -0,0 +1,2 @@
1
+
2
+ $shades: ('black': #222222, 'white': #FFFFFF);
@@ -1,7 +1,43 @@
1
+ @import 'shades.scss';
2
+
1
3
  /** Global **/
2
4
  $font-size: 14px;
3
5
  $font-size-root: 14px;
4
6
 
7
+ $material-dark: (
8
+ 'background': map-get($shades, 'black'),
9
+ 'cards': map-get($shades, 'black'),
10
+ 'text-fields': (
11
+ 'outlined': var(--v-base-base),
12
+ 'outlined-hover': var(--v-base-base),
13
+ ),
14
+ 'input-bottom-line': var(--v-base-base),
15
+ 'dividers': var(--v-base-lighten2),
16
+ 'toolbar': rgba(map-get($shades, 'black'), 0.8),
17
+ 'table': (
18
+ 'hover': var(--v-base-lighten4),
19
+ ),
20
+ );
21
+ $material-light: (
22
+ 'text-fields': (
23
+ 'outlined': var(--v-base-base),
24
+ 'outlined-hover': var(--v-base-base),
25
+ ),
26
+ 'input-bottom-line': var(--v-base-base),
27
+ 'text': (
28
+ 'primary': map-get($shades, 'black'),
29
+ 'disabled': rgba(map-get($shades, 'black'), 0.3),
30
+ ),
31
+ 'buttons': (
32
+ 'disabled': rgba(map-get($shades, 'black'), 0.5),
33
+ ),
34
+ 'dividers': var(--v-base-lighten2),
35
+ 'toolbar': rgba(map-get($shades, 'white'), 0.8),
36
+ 'table': (
37
+ 'hover': var(--v-base-lighten4),
38
+ ),
39
+ );
40
+
5
41
  // input font and icon
6
42
  $input-font-size: $font-size;
7
43
  $input-icon-height: 16px; // 24px !default;
@@ -20,14 +56,14 @@ $text-field-solo-dense-control-min-height: 22px; //38px !default;
20
56
  $text-field-outlined-fieldset-border: 1px solid currentColor; // 2px solid currentColor !default;
21
57
 
22
58
  // dense non outlined
23
- $text-field-dense-padding: 2px 0px 1px; //4px 0 2px !default;
59
+ $text-field-dense-padding: 2px 0 1px; //4px 0 2px !default;
24
60
 
25
61
  // clear icon non dense
26
62
  $text-field-enclosed-prepend-append-margin-top: 9px;
27
63
 
28
64
  // tooltip icon in append slot
29
65
  $text-field-outlined-append-prepend-outer-margin-top: 4px; // 18px !default;
30
- $text-field-append-prepend-margin: 0px; // 4px !default;
66
+ $text-field-append-prepend-margin: 0; // 4px !default;
31
67
  $text-field-outlined-prepend-append-margin-top: 4px; // 8px !default;
32
68
 
33
69
  // label position for outlined Label dense and non-dense
@@ -39,8 +75,8 @@ $text-field-label-top: 2px; // 6px !default;
39
75
  $text-field-label-active-transform: translateY(-14px) scale(.75); //translateY(-18px) scale(.75) !default;
40
76
 
41
77
  /** VcsTextarea **/
42
- $textarea-box-enclosed-single-outlined-margin-top: 0px; // 10px !default;
43
- $textarea-dense-box-enclosed-single-outlined-margin-top: 0px; // 6px !default;
78
+ $textarea-box-enclosed-single-outlined-margin-top: 0; // 10px !default;
79
+ $textarea-dense-box-enclosed-single-outlined-margin-top: 0; // 6px !default;
44
80
 
45
81
  /** VcsCheckbox **/
46
82
  $icon-size: 20px; // 24px !default;
package/src/uiConfig.js CHANGED
@@ -13,6 +13,7 @@ import { ref } from 'vue';
13
13
  * @property {string} [mobileLogo] - an alternative logo to display in mobile view
14
14
  * @property {string} [appTitle] - an optional title to display next to the company logo
15
15
  * @property {string} [primaryColor] - an optional primary color to use in all themes
16
+ * @property {boolean} [startingFeatureInfo] - an optional flag whether to activate feature info on startup (default active)
16
17
  */
17
18
 
18
19
  /**
package/src/vcsUiApp.js CHANGED
@@ -106,6 +106,11 @@ class VcsUiApp extends VcsApp {
106
106
 
107
107
  constructor() {
108
108
  super();
109
+ /**
110
+ * An event triggered when the vuetify theme mode changes or the primary color is updated by a new uiConfig entry.
111
+ * @type {VcsEvent<void>}
112
+ */
113
+ this.themeChanged = new VcsEvent();
109
114
  /**
110
115
  * @type {import("@vcmap/core").OverrideCollection<VcsPlugin>}
111
116
  * @private