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

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 (153) hide show
  1. package/README.md +2 -2
  2. package/app.config.json +5 -0
  3. package/build/buildHelpers.js +1 -0
  4. package/build/buildPreview.js +2 -2
  5. package/build/commonViteConfig.js +1 -0
  6. package/config/aerowest.config.json +2 -0
  7. package/config/base.config.json +1 -0
  8. package/config/codes.config.json +2 -0
  9. package/config/dev.config.json +6 -0
  10. package/config/graphFeatureInfo.config.json +3 -1
  11. package/config/projects.config.json +27 -0
  12. package/config/www.config.json +27 -14
  13. package/dist/assets/cesium.js +1 -1
  14. package/dist/assets/{core.59d4d1.js → core.9342a1.js} +7912 -5474
  15. package/dist/assets/core.js +1 -1
  16. package/dist/assets/favicon.decf54cc.svg +10 -0
  17. package/dist/assets/index.fd041928.js +1 -0
  18. package/dist/assets/{ol.c1c512.js → ol.d2cba3.js} +12406 -12152
  19. package/dist/assets/ol.js +1 -1
  20. package/dist/assets/ui.c27597.css +5 -0
  21. package/dist/assets/{ui.80175f.js → ui.c27597.js} +6508 -5169
  22. package/dist/assets/ui.js +1 -1
  23. package/dist/assets/vue.js +2 -2
  24. package/dist/assets/vuetify.2f1432.css +5 -0
  25. package/dist/assets/{vuetify.efc158.js → vuetify.2f1432.js} +1 -1
  26. package/dist/assets/vuetify.js +2 -2
  27. package/dist/index.html +6 -1
  28. package/index.html +5 -0
  29. package/index.js +7 -3
  30. package/lib/olLib.js +15 -1
  31. package/package.json +5 -4
  32. package/plugins/@vcmap/project-selector/{ContextsListComponent.vue → ModulesListComponent.vue} +10 -10
  33. package/plugins/@vcmap/project-selector/ProjectSelectorComponent.vue +16 -16
  34. package/plugins/@vcmap/project-selector/README.md +15 -21
  35. package/plugins/@vcmap/project-selector/config.json +3 -3
  36. package/plugins/@vcmap/project-selector/de.json +3 -0
  37. package/plugins/@vcmap/project-selector/en.json +3 -0
  38. package/plugins/@vcmap/project-selector/index.js +76 -101
  39. package/plugins/@vcmap/simple-graph/index.js +1 -1
  40. package/plugins/@vcmap/theme-changer/ThemeChangerComponent.vue +10 -4
  41. package/plugins/@vcmap-show-case/category-tester/Categories.vue +2 -2
  42. package/plugins/@vcmap-show-case/category-tester/Category.vue +1 -4
  43. package/plugins/@vcmap-show-case/config-editor/editor.vue +14 -14
  44. package/plugins/@vcmap-show-case/form-inputs-example/FormInputsExample.vue +92 -81
  45. package/plugins/@vcmap-show-case/form-inputs-example/index.js +8 -3
  46. package/plugins/@vcmap-show-case/form-inputs-example/validation.js +1 -1
  47. package/plugins/@vcmap-show-case/list-example/ListExample.vue +5 -2
  48. package/plugins/@vcmap-show-case/table-example/DataTableExample.vue +202 -0
  49. package/plugins/@vcmap-show-case/table-example/README.md +3 -0
  50. package/plugins/@vcmap-show-case/table-example/index.js +47 -0
  51. package/plugins/@vcmap-show-case/table-example/package.json +5 -0
  52. package/plugins/@vcmap-show-case/wizard-example/wizardExample.vue +57 -23
  53. package/plugins/package.json +2 -1
  54. package/src/actions/actionHelper.js +16 -27
  55. package/src/actions/styleSelector.vue +26 -19
  56. package/src/application/VcsApp.vue +13 -5
  57. package/src/application/VcsAttributions.vue +2 -3
  58. package/src/application/VcsAttributionsFooter.vue +10 -16
  59. package/src/application/VcsNavbar.vue +1 -2
  60. package/src/application/VcsSettings.vue +21 -8
  61. package/src/assets/favicon-128.png +0 -0
  62. package/src/assets/favicon-180.png +0 -0
  63. package/src/assets/favicon-192.png +0 -0
  64. package/src/assets/favicon-32.png +0 -0
  65. package/src/assets/favicon.svg +10 -0
  66. package/src/components/buttons/VcsButton.vue +2 -3
  67. package/src/components/form-inputs-controls/VcsCheckbox.vue +46 -26
  68. package/src/components/form-inputs-controls/VcsDatePicker.vue +111 -0
  69. package/src/components/form-inputs-controls/VcsFormSection.vue +15 -13
  70. package/src/components/form-inputs-controls/VcsLabel.vue +10 -1
  71. package/src/components/form-inputs-controls/VcsRadio.vue +38 -18
  72. package/src/components/form-inputs-controls/VcsSelect.vue +117 -59
  73. package/src/components/form-inputs-controls/VcsTextArea.vue +101 -60
  74. package/src/components/form-inputs-controls/VcsTextField.vue +182 -69
  75. package/src/components/form-inputs-controls/VcsWizard.vue +23 -15
  76. package/src/components/form-inputs-controls/VcsWizardStep.vue +18 -16
  77. package/src/components/form-inputs-controls/composables.js +26 -0
  78. package/src/components/form-output/VcsFormattedNumber.vue +1 -1
  79. package/src/components/icons/2DDistanceIcon.vue +0 -3
  80. package/src/components/icons/3DDistanceIcon.vue +0 -3
  81. package/src/components/icons/3DHeightIcon.vue +0 -3
  82. package/src/components/icons/CheckboxCheckedIcon.vue +4 -11
  83. package/src/components/icons/CheckboxIcon.vue +9 -2
  84. package/src/components/icons/CheckboxIndeterminateIcon.vue +4 -21
  85. package/src/components/icons/CommentIcon.vue +1 -5
  86. package/src/components/icons/LegendIcon.vue +10 -60
  87. package/src/components/icons/ObliqueViewIcon.vue +6 -8
  88. package/src/components/icons/SimpleCircleOutlinedIcon.vue +1 -1
  89. package/src/components/icons/SplitViewIcon.vue +0 -4
  90. package/src/components/icons/ToolsIcon.vue +2 -4
  91. package/src/components/lists/VcsActionList.vue +0 -1
  92. package/src/components/lists/VcsList.vue +30 -30
  93. package/src/components/lists/VcsTreeview.vue +2 -2
  94. package/src/components/lists/VcsTreeviewLeaf.vue +3 -9
  95. package/src/components/lists/VcsTreeviewSearchbar.vue +4 -4
  96. package/src/components/notification/VcsBadge.vue +6 -2
  97. package/src/components/notification/VcsHelp.vue +39 -0
  98. package/src/components/tables/VcsDataTable.vue +386 -0
  99. package/src/components/tables/VcsTable.vue +55 -254
  100. package/src/contentTree/contentTreeCollection.js +1 -1
  101. package/src/contentTree/layerContentTreeItem.js +3 -0
  102. package/src/downloadHelper.js +49 -0
  103. package/src/featureInfo/AddressBalloonComponent.vue +1 -1
  104. package/src/featureInfo/BalloonComponent.vue +21 -15
  105. package/src/featureInfo/abstractFeatureInfoView.js +1 -1
  106. package/src/featureInfo/featureInfo.js +27 -9
  107. package/src/featureInfo/tableFeatureInfoView.js +4 -0
  108. package/src/i18n/de.js +13 -1
  109. package/src/i18n/en.js +13 -1
  110. package/src/i18n/i18nCollection.js +22 -22
  111. package/src/init.js +90 -7
  112. package/src/legend/styleLegendItem.vue +24 -2
  113. package/src/legend/vcsLegend.vue +24 -31
  114. package/src/manager/categoryManager/CategoryComponent.vue +56 -47
  115. package/src/manager/categoryManager/CategoryManager.vue +23 -10
  116. package/src/manager/categoryManager/categoryManager.js +11 -11
  117. package/src/manager/navbarManager.js +18 -0
  118. package/src/manager/toolbox/GroupToolboxComponent.vue +2 -3
  119. package/src/manager/toolbox/SelectToolboxComponent.vue +11 -5
  120. package/src/manager/toolbox/ToolboxManager.vue +0 -7
  121. package/src/manager/window/WindowComponent.vue +10 -16
  122. package/src/manager/window/WindowComponentHeader.vue +6 -4
  123. package/src/manager/window/WindowManager.vue +14 -15
  124. package/src/manager/window/windowHelper.js +1 -1
  125. package/src/manager/window/windowManager.js +18 -7
  126. package/src/navigation/mapNavCompass.vue +1 -1
  127. package/src/navigation/mapNavigation.vue +6 -6
  128. package/src/navigation/obliqueRotation.vue +36 -13
  129. package/src/navigation/orientationToolsButton.vue +0 -1
  130. package/src/navigation/overviewMap.js +11 -20
  131. package/src/navigation/tiltSlider.vue +30 -6
  132. package/src/navigation/vcsZoomButton.vue +37 -11
  133. package/src/pluginHelper.js +20 -0
  134. package/src/search/resultsComponent.vue +0 -1
  135. package/src/search/search.js +19 -20
  136. package/src/search/searchComponent.vue +21 -7
  137. package/src/state.js +6 -6
  138. package/src/styles/_theming.scss +72 -3
  139. package/src/styles/_typography.scss +0 -5
  140. package/src/styles/main.scss +1 -0
  141. package/src/styles/shades.scss +2 -0
  142. package/src/styles/variables.scss +40 -4
  143. package/src/uiConfig.js +4 -3
  144. package/src/vcsUiApp.js +49 -40
  145. package/src/vuePlugins/i18n.js +1 -0
  146. package/src/vuePlugins/vuetify.js +59 -13
  147. package/start.js +8 -2
  148. package/dist/assets/index.a3861d4e.js +0 -1
  149. package/dist/assets/ui.80175f.css +0 -1
  150. package/dist/assets/vuetify.efc158.css +0 -5
  151. package/map.config.json +0 -44
  152. /package/dist/assets/{cesium.49585c.js → cesium.166f91.js} +0 -0
  153. /package/dist/assets/{vue.a08ab1.js → vue.5d00e9.js} +0 -0
@@ -0,0 +1,47 @@
1
+ import { ButtonLocation, createToggleAction, WindowSlot } from '@vcmap/ui';
2
+ import packageJSON from './package.json';
3
+ import DataTableExample from './DataTableExample.vue';
4
+
5
+ /**
6
+ * @returns {VcsPlugin}
7
+ */
8
+ export default async function iconsExample() {
9
+ return {
10
+ get name() { return packageJSON.name; },
11
+ get version() { return packageJSON.version; },
12
+ get vcMapVersion() { return packageJSON.vcMapVersion; },
13
+ onVcsAppMounted(app) {
14
+ const { action, destroy } = createToggleAction(
15
+ {
16
+ name: 'Table Example',
17
+ title: 'Table Example Plugin',
18
+ },
19
+ {
20
+ id: 'table-example',
21
+ component: DataTableExample,
22
+ slot: WindowSlot.DYNAMIC_LEFT,
23
+ state: {
24
+ headerTitle: 'Table Example',
25
+ },
26
+ position: {
27
+ width: 500,
28
+ },
29
+ },
30
+ app.windowManager,
31
+ packageJSON.name,
32
+ );
33
+ app.navbarManager.add(
34
+ { action },
35
+ packageJSON.name,
36
+ ButtonLocation.TOOL,
37
+ );
38
+ this._destroyAction = destroy;
39
+ },
40
+ destroy() {
41
+ if (this._destroyAction) {
42
+ this._destroyAction();
43
+ this._destroyAction = null;
44
+ }
45
+ },
46
+ };
47
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "@vcmap-show-case/table-example",
3
+ "version": "1.0.0",
4
+ "vcMapVersion": "~5.0.0"
5
+ }
@@ -10,44 +10,67 @@
10
10
  v-model.number="step"
11
11
  >
12
12
  <template #content>
13
- <div>
14
- This is the content of the first step.
15
- </div>
16
- <VcsButton
17
- @click="increaseStep()"
18
- class="my-2"
19
- >
20
- Next
21
- </VcsButton>
13
+ <!-- px-2 because does not contain input components -->
14
+ <v-container class="px-2 py-0">
15
+ <div>
16
+ This is the content of the first step.
17
+ </div>
18
+ <VcsButton
19
+ @click="increaseStep()"
20
+ class="my-2"
21
+ >
22
+ Next
23
+ </VcsButton>
24
+ </v-container>
22
25
  </template>
23
26
  </VcsWizardStep>
24
27
  <VcsWizardStep
25
- :rules="[() => false]"
26
28
  step="2"
27
29
  editable
28
30
  :header-actions="actions.second"
29
31
  heading="This is the second step"
30
32
  v-model.number="step"
33
+ :rules="[v => !!formValid]"
31
34
  >
32
35
  <template #help>
36
+ Allowed options:
33
37
  <ol>
34
- <li>this</li>
35
38
  <li>is</li>
36
- <li>the help slot</li>
39
+ <li>a</li>
40
+ <li>test</li>
37
41
  </ol>
38
42
  </template>
39
43
  <template #content>
40
- <VcsSelect
41
- :items="['this', 'is', 'a', 'test']"
42
- v-model="selection"
43
- label="Select"
44
- class="my-2"
45
- />
46
- <VcsButton
47
- @click="decreaseStep()"
48
- >
49
- Back
50
- </VcsButton>
44
+ <v-container class="px-1 py-0">
45
+ <v-form ref="form" v-model="formValid" lazy-validation>
46
+ <VcsSelect
47
+ :items="['this', 'is', 'a', 'test']"
48
+ v-model="selection"
49
+ placeholder="Select"
50
+ :rules="[v => (!!v && v !== 'this') || 'Please select a valid option.']"
51
+ />
52
+ <VcsButton
53
+ @click="decreaseStep()"
54
+ >
55
+ Back
56
+ </VcsButton>
57
+ </v-form>
58
+ </v-container>
59
+ </template>
60
+ </VcsWizardStep>
61
+ <VcsWizardStep
62
+ step="3"
63
+ v-model.number="step"
64
+ >
65
+ <template #header>
66
+ <div class="d-flex flex-grow-1 flex-row-reverse">
67
+ <VcsButton
68
+ :disabled="!selection || !formValid"
69
+ @click="finish()"
70
+ >
71
+ Finish
72
+ </VcsButton>
73
+ </div>
51
74
  </template>
52
75
  </VcsWizardStep>
53
76
  </VcsWizard>
@@ -55,6 +78,7 @@
55
78
 
56
79
  <script>
57
80
  import { VcsWizard, VcsWizardStep, VcsButton, VcsSelect } from '@vcmap/ui';
81
+ import { VForm, VContainer } from 'vuetify/lib';
58
82
  import { ref } from 'vue';
59
83
 
60
84
  /** Component to showcase the VcsWizard and VcsWizardStep. */
@@ -65,10 +89,14 @@
65
89
  VcsWizardStep,
66
90
  VcsButton,
67
91
  VcsSelect,
92
+ VForm,
93
+ VContainer,
68
94
  },
69
95
  setup() {
70
96
  const step = ref(1);
71
97
  const selection = ref();
98
+ const form = ref();
99
+ const formValid = ref(false);
72
100
  const actions = {
73
101
  second: [{
74
102
  name: 'resetSecondStep',
@@ -85,6 +113,12 @@
85
113
  decreaseStep() { step.value -= 1; },
86
114
  selection,
87
115
  actions,
116
+ formValid,
117
+ form,
118
+ finish() {
119
+ step.value = 1;
120
+ form.value.reset();
121
+ },
88
122
  };
89
123
  },
90
124
  };
@@ -2,6 +2,7 @@
2
2
  "dependencies": {
3
3
  "@vcmap/hello-world": "^1.0.7",
4
4
  "@vcmap/print": "^1.0.2",
5
- "@vcmap/swipe-tool": "^1.0.3"
5
+ "@vcmap/swipe-tool": "^1.0.3",
6
+ "@vcmap/export": "^1.0.1"
6
7
  }
7
8
  }
@@ -203,29 +203,18 @@ export function createModalAction(actionOptions, modalComponent, app, owner) {
203
203
  check(owner, [String, vcsAppSymbol]);
204
204
 
205
205
  const id = uuid();
206
+ const { position: windowPositionOptions, ...component } = modalComponent;
207
+ let modalActivator = null;
206
208
 
207
- const addModal = (zIndex) => {
208
- const child = document.getElementById(id);
209
- if (!child) {
210
- const elem = document.createElement('div');
211
- elem.id = id;
212
- Object.assign(elem.style, {
213
- position: 'absolute',
214
- zIndex,
215
- top: 0,
216
- bottom: 0,
217
- left: 0,
218
- right: 0,
219
- });
220
- elem.onclick = () => { app.windowManager.remove(id); };
221
- document.body.appendChild(elem);
222
- }
223
- };
224
-
225
- const removeModal = () => {
226
- const child = document.getElementById(id);
227
- if (child) {
228
- child.parentElement.removeChild(child);
209
+ /**
210
+ * Closes the modal at mousedown on an app element
211
+ * Requires mousedown event bubbling on app elements (same behaviour as v-menu).
212
+ * @param {MouseEvent} e
213
+ */
214
+ const handleMouseDown = (e) => {
215
+ const div = document.getElementById(`window-component--${id}`);
216
+ if (!div?.contains(e.target) && !modalActivator?.contains(e.target)) {
217
+ app.windowManager.remove(id);
229
218
  }
230
219
  };
231
220
 
@@ -236,10 +225,11 @@ export function createModalAction(actionOptions, modalComponent, app, owner) {
236
225
  if (!this.active) {
237
226
  this.active = true;
238
227
  const { left, top, width } = event.currentTarget.getBoundingClientRect();
239
- const position = getWindowPositionOptions(left + width, top, app.maps.target);
228
+ modalActivator = event.currentTarget;
229
+ const position = { ...getWindowPositionOptions(left + width, top, app.maps.target), ...windowPositionOptions };
240
230
  const state = { ...modalComponent?.state, hideHeader: true };
241
- app.windowManager.add({ position, ...modalComponent, id, state }, owner);
242
- addModal(app.windowManager.componentIds.length - 2);
231
+ app.windowManager.add({ position, ...component, id, state }, owner);
232
+ document.addEventListener('mousedown', handleMouseDown);
243
233
  } else {
244
234
  this.active = false;
245
235
  app.windowManager.remove(id);
@@ -252,10 +242,9 @@ export function createModalAction(actionOptions, modalComponent, app, owner) {
252
242
  app.windowManager.removed.addEventListener(({ id: windowId }) => {
253
243
  if (windowId === id) {
254
244
  action.active = false;
255
- removeModal();
245
+ document.removeEventListener('mousedown', handleMouseDown);
256
246
  }
257
247
  }),
258
- removeModal,
259
248
  ];
260
249
 
261
250
  const destroy = () => { listeners.forEach((cb) => { cb(); }); };
@@ -1,6 +1,16 @@
1
1
  <template>
2
- <v-sheet v-if="items" class="pa-2">
3
- <VcsSelect :items="items" v-model="currentStyle" />
2
+ <v-sheet v-if="items" class="pt-1 pb-0 px-0">
3
+ <v-list>
4
+ <v-list-item
5
+ v-for="(item, index) in items"
6
+ :key="index"
7
+ @click.stop="select(item.value)"
8
+ >
9
+ <v-list-item-title :class="{ 'primary--text': item.value === currentStyleName }">
10
+ {{ item.text }}
11
+ </v-list-item-title>
12
+ </v-list-item>
13
+ </v-list>
4
14
  <v-list v-if="currentStyleLegend.length > 0">
5
15
  <v-list-item
6
16
  v-for="(entry, index) in currentStyleLegend"
@@ -21,18 +31,17 @@
21
31
  <script>
22
32
  import { computed, inject, onUnmounted, ref } from 'vue';
23
33
  import {
24
- VChip, VList, VListItem, VListItemContent, VListItemIcon, VSheet,
34
+ VChip, VList, VListItem, VListItemContent, VListItemIcon, VListItemTitle, VSheet,
25
35
  } from 'vuetify/lib';
26
- import VcsSelect from '../components/form-inputs-controls/VcsSelect.vue';
27
36
 
28
37
  export default {
29
38
  name: 'StyleSelector',
30
39
  components: {
31
- VcsSelect,
32
40
  VSheet,
33
41
  VList,
34
42
  VListItem,
35
43
  VListItemIcon,
44
+ VListItemTitle,
36
45
  VChip,
37
46
  VListItemContent,
38
47
  },
@@ -46,8 +55,8 @@
46
55
  required: true,
47
56
  },
48
57
  },
49
- setup({ layerName, availableStyles }) {
50
- /** @type {VcsApp} */
58
+ setup({ layerName, availableStyles }, { attrs }) {
59
+ /** @type {VcsUiApp} */
51
60
  const app = inject('vcsApp');
52
61
  /** @type {import("@vcmap/core").FeatureLayer} */
53
62
  const layer = app.layers.getByKey(layerName);
@@ -68,16 +77,6 @@
68
77
  styleChangedListener();
69
78
  });
70
79
 
71
- const currentStyle = computed({
72
- get() { return currentStyleName.value; },
73
- set(styleName) {
74
- const style = styleName === defaultStyle ?
75
- layer.defaultStyle :
76
- app.styles.getByKey(styleName);
77
- layer.setStyle(style);
78
- },
79
- });
80
-
81
80
  const items = computed(() => {
82
81
  return [
83
82
  { text: 'Default', value: defaultStyle },
@@ -85,15 +84,23 @@
85
84
  ];
86
85
  });
87
86
 
87
+ function select(styleName) {
88
+ const style = styleName === defaultStyle ?
89
+ layer.defaultStyle :
90
+ app.styles.getByKey(styleName);
91
+ layer.setStyle(style);
92
+ app.windowManager.remove(attrs['window-state'].id);
93
+ }
94
+
88
95
  return {
89
- currentStyle,
96
+ currentStyleName,
90
97
  currentStyleLegend,
91
98
  items,
99
+ select,
92
100
  };
93
101
  },
94
102
  };
95
103
  </script>
96
104
 
97
105
  <style scoped>
98
-
99
106
  </style>
@@ -69,7 +69,7 @@
69
69
  getCurrentInstance,
70
70
  onMounted,
71
71
  onUnmounted,
72
- provide,
72
+ provide, watch,
73
73
  } from 'vue';
74
74
  import { getVcsAppById } from '@vcmap/core';
75
75
  import { VContainer, VFooter } from 'vuetify/lib';
@@ -350,6 +350,7 @@
350
350
  * This helper sets up a listener to sync the theming relevant keys from the {@see UiConfigObject}
351
351
  * with a given vuetify instance. Use this helper, if you do not use the VcsApp component and wish to evaluate
352
352
  * the theming keys. Returns a function to stop syncing.
353
+ * Also adds a watcher to vuetify theme, which triggers themeChanged event on the VcsUiApp.
353
354
  * @param {VcsUiApp} app
354
355
  * @param {import("vuetify").Framework} vuetify
355
356
  * @returns {function():void} - call to stop syncing
@@ -358,21 +359,28 @@
358
359
  const listeners = [
359
360
  app.uiConfig.added.addEventListener((item) => {
360
361
  if (item.name === 'primaryColor') {
361
- vuetify.theme.themes.dark.primary = item.value;
362
- vuetify.theme.themes.light.primary = item.value;
362
+ vuetify.theme.themes.dark.primary = item.value?.dark || item.value;
363
+ vuetify.theme.themes.light.primary = item.value?.light || item.value;
364
+ app.themeChanged.raiseEvent();
363
365
  }
364
366
  }),
365
367
  app.uiConfig.removed.addEventListener((item) => {
366
368
  if (item.name === 'primaryColor') {
367
- vuetify.theme.themes.dark.primary = defaultPrimaryColor;
368
- vuetify.theme.themes.light.primary = defaultPrimaryColor;
369
+ vuetify.theme.themes.dark.primary = defaultPrimaryColor.dark;
370
+ vuetify.theme.themes.light.primary = defaultPrimaryColor.light;
371
+ app.themeChanged.raiseEvent();
369
372
  }
370
373
  }),
371
374
  ];
375
+ const stopWatching = watch(
376
+ () => vuetify.theme.dark,
377
+ () => app.themeChanged.raiseEvent(),
378
+ );
372
379
 
373
380
  return () => {
374
381
  listeners.forEach((cb) => { cb(); });
375
382
  listeners.splice(0);
383
+ stopWatching();
376
384
  };
377
385
  }
378
386
 
@@ -1,6 +1,6 @@
1
1
  <template>
2
- <v-list>
3
- <v-list-item v-for="({key, title, attributions}) in entries" :key="key">
2
+ <v-list class="px-1">
3
+ <v-list-item v-for="({key, title, attributions}) in entries" :key="key" class="px-1">
4
4
  <v-list-item-content>
5
5
  <v-list-item-title>{{ $t(title) }}</v-list-item-title>
6
6
  <v-list-item-subtitle
@@ -11,7 +11,6 @@
11
11
  <a
12
12
  :href="attribution.url"
13
13
  target="_blank"
14
- class="text--secondary"
15
14
  >
16
15
  {{ $t(attribution.provider) }} {{ attribution.year }}
17
16
  </a>
@@ -1,14 +1,13 @@
1
1
  <template>
2
- <span class="attribution-wrap">
2
+ <span class="d-inline-block text-truncate mr-10 attribution-wrap">
3
3
  <span v-for="attribution in mergedAttributions" class="attribution-span" :key="attribution.provider">
4
4
  <a
5
5
  :href="attribution.url"
6
6
  target="_blank"
7
- class="text--secondary"
8
7
  >{{ $t(attribution.provider) }} <span>{{ attribution.years }}</span></a>
9
8
  </span>
10
9
  <VcsButton
11
- class="d-flex text--secondary"
10
+ class="d-flex"
12
11
  small
13
12
  :key="attributionAction.name"
14
13
  :tooltip="attributionAction.title"
@@ -20,18 +19,13 @@
20
19
  </template>
21
20
 
22
21
  <style lang="scss" scoped>
23
- .attribution-wrap{
24
- white-space: nowrap;
25
- margin-right: 40px;
26
- overflow: hidden;
27
- text-overflow: ellipsis;
28
22
 
29
- .vcs-button-wrap{
30
- position: absolute;
31
- right: 4px;
32
- bottom: 3px;
33
- }
23
+ .attribution-wrap .vcs-button-wrap {
24
+ position: absolute;
25
+ right: 4px;
26
+ bottom: 3px;
34
27
  }
28
+
35
29
  a:before {
36
30
  content: '\00a9\00a0';
37
31
  }
@@ -40,17 +34,17 @@
40
34
  &:before {
41
35
  content: '\00a0\007c\00a0';
42
36
  }
43
- &:first-child::before{
37
+ &:first-child::before {
44
38
  content: '';
45
39
  }
46
- span{
40
+ span {
47
41
  font-size: inherit;
48
42
  }
49
43
  }
50
44
 
51
45
  </style>
52
46
 
53
- <script >
47
+ <script>
54
48
 
55
49
  import { computed } from 'vue';
56
50
  import { mergeAttributions } from './attributionsHelper.js';
@@ -4,7 +4,6 @@
4
4
  dense
5
5
  elevation="0"
6
6
  :height="$vuetify.breakpoint.xs ? '56px' : '48px'"
7
- :color="'var(--v-basic-base)'"
8
7
  :bottom="$vuetify.breakpoint.xs ? 'bottom' : undefined"
9
8
  width="100%"
10
9
  >
@@ -31,7 +30,7 @@
31
30
  />
32
31
  <v-divider
33
32
  v-if="contentActions.length > 0 && toolActions.length > 0"
34
- class="mx-2"
33
+ class="mx-2 base lighten-2"
35
34
  vertical
36
35
  inset
37
36
  />
@@ -1,14 +1,21 @@
1
1
  <template>
2
- <v-container class="pa-2">
2
+ <v-container class="px-1 py-0">
3
3
  <v-row
4
4
  no-gutters
5
5
  align="center"
6
6
  >
7
7
  <v-col>
8
- <VcsLabel>
9
- {{ $t('settings.languageTitle') }}
8
+ <VcsLabel html-for="settingsLanguageSelect">
9
+ {{ $t('settings.languageSelector') }}
10
10
  </VcsLabel>
11
11
  </v-col>
12
+ <v-col>
13
+ <VcsSelect
14
+ id="settingsLanguageSelect"
15
+ :items="languages"
16
+ v-model="language"
17
+ />
18
+ </v-col>
12
19
  </v-row>
13
20
  <v-row
14
21
  no-gutters
@@ -16,14 +23,18 @@
16
23
  >
17
24
  <v-col>
18
25
  <VcsLabel html-for="settingsLanguageSelect">
19
- {{ $t('settings.languageSelector') }}
26
+ {{ $t('settings.theme.title') }}
20
27
  </VcsLabel>
21
28
  </v-col>
22
29
  <v-col>
23
- <VcsSelect
24
- id="settingsLanguageSelect"
25
- :items="languages"
26
- v-model="language"
30
+ <VcsRadio
31
+ dense
32
+ :items="[
33
+ { label: 'settings.theme.light', value: false },
34
+ { label: 'settings.theme.dark', value: true },
35
+ ]"
36
+ v-model="$vuetify.theme.dark"
37
+ row
27
38
  />
28
39
  </v-col>
29
40
  </v-row>
@@ -37,11 +48,13 @@
37
48
  import { VCol, VContainer, VRow } from 'vuetify/lib';
38
49
  import VcsLabel from '../components/form-inputs-controls/VcsLabel.vue';
39
50
  import VcsSelect from '../components/form-inputs-controls/VcsSelect.vue';
51
+ import VcsRadio from '../components/form-inputs-controls/VcsRadio.vue';
40
52
 
41
53
  export default {
42
54
  name: 'VcsSettings',
43
55
  components: {
44
56
  VcsSelect,
57
+ VcsRadio,
45
58
  VcsLabel,
46
59
  VContainer,
47
60
  VRow,
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg id="SvgjsSvg1004" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
3
+ <rect width="128" height="128" style="fill: none;"/>
4
+ <g>
5
+ <path id="SvgjsPath1003" d="m120.44,41.1l-22.64,22.9-30.07-30.44c-.98-1-2.33-1.56-3.73-1.56h52.71c1.4,0,2.73.56,3.73,1.56,2.04,2.05,2.06,5.4.05,7.48,0,0-.05.06-.05.06Z" style="fill: #86b110; isolation: isolate; opacity: .9;"/>
6
+ <path id="SvgjsPath1002" d="m97.8,64l-30.09,30.44c-2.06,2.08-5.39,2.08-7.45,0-.98-1-1.55-2.36-1.55-3.78v-53.32c0-1.41.56-2.77,1.55-3.78,2.06-2.08,5.39-2.08,7.45,0l30.09,30.44Z" style="fill: #005434; isolation: isolate; opacity: .9;"/>
7
+ <path id="SvgjsPath1001" d="m58.71,37.34v53.32c0,1.41.56,2.77,1.55,3.78L7.54,41.1c-2.04-2.05-2.06-5.4-.05-7.48l.05-.06c1-1,2.33-1.56,3.73-1.56h52.71c-1.4,0-2.73.56-3.73,1.56-.98.99-1.55,2.34-1.55,3.78Z" style="fill: #409d76; isolation: isolate; opacity: .9;"/>
8
+ <path id="SvgjsPath1000" d="m120.44,94.44c-.98,1-2.33,1.56-3.73,1.56h-52.71c1.4,0,2.73-.56,3.73-1.56l30.09-30.44,22.64,22.9c2.04,2.05,2.06,5.4.05,7.48l-.05.06h-.02Z" style="fill: #00a0ba; isolation: isolate; opacity: .9;"/>
9
+ </g>
10
+ </svg>
@@ -52,7 +52,7 @@
52
52
  font-size: 12px;
53
53
  border: 1px solid transparent;
54
54
  &:hover{
55
- color: var(--v-accent-lighten5) !important;
55
+ color: var(--v-base-lighten5) !important;
56
56
  border-color: var(--v-primary-base);
57
57
  background-color: var(--v-primary-base);
58
58
  }
@@ -87,8 +87,7 @@
87
87
 
88
88
  &.vcs-button--active-background {
89
89
  border: 2px solid var(--v-primary-base);
90
- color: var(--v-secondary-base);
91
- background-color: var(--v-accent-darken1) !important;
90
+ background-color: var(--v-base-lighten2) !important;
92
91
  }
93
92
 
94
93
  &.v-btn--disabled {