@dative-gpi/foundation-shared-components 1.0.158-sankey2 → 1.0.159-sankey3

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.
@@ -0,0 +1,165 @@
1
+ <template>
2
+ <FSMenu
3
+ :location="$props.location"
4
+ :closeOnContentClick="true"
5
+ :contained="false"
6
+ minWidth="0"
7
+ v-model="modelValue"
8
+ v-bind="$attrs"
9
+ >
10
+ <template
11
+ #activator="{ props }"
12
+ >
13
+ <slot
14
+ name="activator"
15
+ v-bind="props"
16
+ >
17
+ <FSButton
18
+ v-bind="props"
19
+ :icon="$props.icon"
20
+ :iconSize="$props.iconSize"
21
+ :color="$props.buttonColor"
22
+ :variant="$props.buttonVariant"
23
+ />
24
+ </slot>
25
+ </template>
26
+ <FSCard
27
+ :maxWidth="$props.maxWidth"
28
+ :width="$props.width"
29
+ padding="2px"
30
+ :border="false"
31
+ :elevation="true"
32
+ align="center-center"
33
+ >
34
+ <slot
35
+ name="content"
36
+ >
37
+ <FSCol
38
+ gap="0px"
39
+ >
40
+ <FSFadeOut
41
+ :scrollOutside="false"
42
+ maxHeight="80dvh"
43
+ >
44
+ <FSClickable
45
+ v-for="(item, index) in $props.items"
46
+ width="100%"
47
+ padding="8px"
48
+ height="40px"
49
+ :key="index"
50
+ :border="false"
51
+ @click="onClickItem(item)"
52
+ >
53
+ <slot
54
+ name="item"
55
+ v-bind="{ item, index }"
56
+ >
57
+ <FSRow
58
+ align="center-left"
59
+ >
60
+ <FSIcon
61
+ v-if="item.icon"
62
+ :icon="item.icon"
63
+ />
64
+ <FSText
65
+ font="text-body"
66
+ >
67
+ {{ item.label }}
68
+ </FSText>
69
+ </FSRow>
70
+ </slot>
71
+ </FSClickable>
72
+ </FSFadeOut>
73
+ </FSCol>
74
+ </slot>
75
+ </FSCard>
76
+ </FSMenu>
77
+ </template>
78
+
79
+ <script lang="ts">
80
+ import { defineComponent, ref, type PropType } from "vue";
81
+
82
+ import { useColors } from "@dative-gpi/foundation-shared-components/composables";
83
+
84
+ import { ColorEnum, type ColorBase } from '@dative-gpi/foundation-shared-components/models';
85
+
86
+ import FSRow from '@dative-gpi/foundation-shared-components/components/FSRow.vue';
87
+ import FSCol from '@dative-gpi/foundation-shared-components/components/FSCol.vue';
88
+ import FSIcon from '@dative-gpi/foundation-shared-components/components/FSIcon.vue';
89
+ import FSMenu from '@dative-gpi/foundation-shared-components/components/FSMenu.vue';
90
+ import FSCard from '@dative-gpi/foundation-shared-components/components/FSCard.vue';
91
+ import FSText from '@dative-gpi/foundation-shared-components/components/FSText.vue';
92
+ import FSButton from '@dative-gpi/foundation-shared-components/components/FSButton.vue';
93
+ import FSClickable from '@dative-gpi/foundation-shared-components/components/FSClickable.vue';
94
+
95
+ export default defineComponent({
96
+ name: "FSInformationsMenu",
97
+ components: {
98
+ FSMenu,
99
+ FSCard,
100
+ FSRow,
101
+ FSText,
102
+ FSButton,
103
+ FSCol,
104
+ FSIcon,
105
+ FSClickable
106
+ },
107
+ props: {
108
+ items: {
109
+ type: Array as PropType<{label: string, icon?: string, onClick: () => void, closeOnContentClick?: boolean}[]>,
110
+ default: () => []
111
+ },
112
+ location: {
113
+ type: String,
114
+ default: "bottom"
115
+ },
116
+ width: {
117
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
118
+ default: null
119
+ },
120
+ maxWidth: {
121
+ type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
122
+ default: "90dvw"
123
+ },
124
+ icon: {
125
+ type: String,
126
+ default: "mdi-dots-horizontal"
127
+ },
128
+ iconSize: {
129
+ type: String,
130
+ default: "18px"
131
+ },
132
+ buttonColor: {
133
+ type: String as PropType<ColorBase>,
134
+ default: ColorEnum.Light
135
+ },
136
+ buttonVariant: {
137
+ type: String as PropType<"standard" | "full" | "icon">,
138
+ required: false,
139
+ default: "icon"
140
+ },
141
+ },
142
+ emits: ["update:modelValue"],
143
+ setup() {
144
+ const modelValue = ref(false);
145
+
146
+ const { getColors } = useColors();
147
+
148
+ const lightColors = getColors(ColorEnum.Light);
149
+
150
+ const onClickItem = (item: { onClick: () => void, closeOnContentClick?: boolean }) => {
151
+ item.onClick();
152
+ if (item.closeOnContentClick !== false) {
153
+ modelValue.value = false;
154
+ }
155
+ };
156
+
157
+ return {
158
+ ColorEnum,
159
+ modelValue,
160
+ lightColors,
161
+ onClickItem
162
+ };
163
+ }
164
+ });
165
+ </script>
@@ -5,6 +5,7 @@
5
5
  :required="$props.required"
6
6
  :disabled="$props.disabled"
7
7
  :label="$props.label"
8
+ :maxWidth="$props.maxWidth"
8
9
  >
9
10
  <FSRow
10
11
  align="bottom-center"
@@ -29,7 +30,7 @@
29
30
  <FSRangeSlider
30
31
  minWidth='min(300px, 90vw)'
31
32
  :disabled="$props.disabled"
32
- :color="ColorEnum.Light"
33
+ :color="ColorEnum.Dark"
33
34
  :thumbColor="ColorEnum.Primary"
34
35
  :trackFillColor="ColorEnum.Primary"
35
36
  :trackSize="8"
@@ -39,7 +40,7 @@
39
40
  :max="endTimestamp"
40
41
  :ticks="ticks"
41
42
  showTicks="always"
42
- :tick-size="0"
43
+ :tick-size="4"
43
44
  :modelValue="$props.modelValue"
44
45
  @update:modelValue="$emit('update:modelValue', $event)"
45
46
  >
@@ -60,12 +61,7 @@
60
61
  :color="lightColors.dark"
61
62
  font="text-overline"
62
63
  >
63
- {{ intervalTime <= 3600000
64
- ?
65
- epochToShortTimeOnlyFormat(tick.value)
66
- :
67
- epochToDayMonthShortOnly(tick.value)
68
- }}
64
+ {{ ticksPrecision === TimePrecision.Hours ? epochToShortTimeOnlyFormat(tick.value) : epochToDayMonthShortOnly(tick.value) }}
69
65
  </FSText>
70
66
  </FSRow>
71
67
  </template>
@@ -85,7 +81,7 @@
85
81
  </template>
86
82
 
87
83
  <script lang="ts">
88
- import { computed, defineComponent, ref, watch } from "vue";
84
+ import { computed, defineComponent, ref, watch, type PropType } from "vue";
89
85
 
90
86
  import { useDateFormat, useDateExpression } from "@dative-gpi/foundation-shared-services/composables";
91
87
 
@@ -100,6 +96,12 @@ import FSRangeSlider from '@dative-gpi/foundation-shared-components/components/F
100
96
  import FSBaseField from '@dative-gpi/foundation-shared-components/components/fields/FSBaseField.vue';
101
97
  import FSTermField from '@dative-gpi/foundation-shared-components/components/fields/FSTermField.vue';
102
98
 
99
+ enum TimePrecision {
100
+ Hours = 1,
101
+ Days = 2,
102
+ Months = 3
103
+ }
104
+
103
105
  export default defineComponent({
104
106
  name: "FSRangePicker",
105
107
  components: {
@@ -167,6 +169,11 @@ export default defineComponent({
167
169
  type: Number,
168
170
  required: false,
169
171
  default: 50
172
+ },
173
+ maxWidth: {
174
+ type: String as PropType<string | null>,
175
+ required: false,
176
+ default: null
170
177
  }
171
178
  },
172
179
  emits: ['update:modelValue', 'update:startDate', 'update:endDate'],
@@ -183,56 +190,91 @@ export default defineComponent({
183
190
  const startTimestamp = computed(() => convertTermToEpoch(props.startDate));
184
191
  const endTimestamp = computed(() => convertTermToEpoch(props.endDate));
185
192
 
186
- const intervalTime = computed(() => {
187
- const possibleIntervals = [60000, 3600000, 86400000];
193
+
188
194
 
189
- const interval = possibleIntervals.find(interval => {
190
- return (endTimestamp.value - startTimestamp.value) / interval < 100;
191
- });
195
+ const tickCountToShow = computed(() => {
196
+ if (isExtraSmall.value) {
197
+ return 3;
198
+ }
199
+ if (isMobileSized.value) {
200
+ return 4;
201
+ }
202
+ return 5;
203
+ });
192
204
 
193
- if (interval) {
194
- return interval;
205
+ const ticksPrecision = computed(() => {
206
+ const rangeDuration = endTimestamp.value - startTimestamp.value;
207
+ if (rangeDuration <= 86400000 * tickCountToShow.value) {
208
+ return TimePrecision.Hours;
209
+ }
210
+ if (rangeDuration <= 2592000000 * tickCountToShow.value) {
211
+ return TimePrecision.Days;
195
212
  }
196
- return 86400000;
213
+ return TimePrecision.Months;
197
214
  });
198
215
 
199
216
  const ticks = computed(() => {
200
217
  const ticks: number[] = [];
218
+ const count = tickCountToShow.value;
219
+ const precision = ticksPrecision.value;
201
220
 
202
- const rangeDuration = endTimestamp.value - startTimestamp.value;
203
- const interval = rangeDuration / maximumTickToShow.value;
221
+ const start = startTimestamp.value;
222
+ const end = endTimestamp.value;
223
+ const range = end - start;
224
+
225
+ let step: number;
226
+
227
+ if (precision === TimePrecision.Hours) {
228
+ step = Math.ceil(range / count / 3600000) * 3600000;
229
+ const alignedStart = Math.ceil(start / 3600000) * 3600000;
230
+
231
+ for (let i = 0; i < count; i++) {
232
+ const tick = alignedStart + i * step;
233
+ if (tick < end) {
234
+ ticks.push(tick);
235
+ }
236
+ }
237
+
238
+ } else if (precision === TimePrecision.Days) {
239
+ step = Math.ceil(range / count / 86400000) * 86400000;
240
+
241
+ const date = new Date(start);
242
+ date.setHours(0, 0, 0, 0);
243
+ const alignedStart = date.getTime() + (date.getTime() < start ? step : 0);
244
+
245
+ for (let i = 0; i < count; i++) {
246
+ const tick = alignedStart + i * step;
247
+ if (tick < end) {
248
+ ticks.push(tick);
249
+ }
250
+ }
204
251
 
205
- for (let i = 1; i < maximumTickToShow.value; i++) {
206
- ticks.push(startTimestamp.value + i * interval);
252
+ } else {
253
+ const interval = range / count;
254
+ for (let i = 0; i < count; i++) {
255
+ ticks.push(start + i * interval);
256
+ }
207
257
  }
258
+
208
259
  return ticks;
209
260
  });
210
261
 
211
- const maximumTickToShow = computed(() => {
212
- if (isExtraSmall.value) {
213
- return 4;
214
- }
215
- if (isMobileSized.value) {
216
- return 5;
217
- }
218
- return 6;
219
- });
220
262
 
221
263
  const onPlayingChange = (value: boolean) => {
222
264
  playing.value = value;
223
265
  };
224
266
 
225
267
  const onClickBackward = () => {
226
- const rangeDuration = props.modelValue[1] - props.modelValue[0];
227
- emit('update:modelValue', [startTimestamp.value, startTimestamp.value + rangeDuration]);
268
+ const modelValueDuration = props.modelValue[1] - props.modelValue[0];
269
+ emit('update:modelValue', [startTimestamp.value, startTimestamp.value + modelValueDuration]);
228
270
  };
229
271
 
230
272
  const onClickForward = () => {
231
- const rangeDuration = props.modelValue[1] - props.modelValue[0];
232
- emit('update:modelValue', [endTimestamp.value - rangeDuration, endTimestamp.value]);
273
+ const modelValueDuration = props.modelValue[1] - props.modelValue[0];
274
+ emit('update:modelValue', [endTimestamp.value - modelValueDuration, endTimestamp.value]);
233
275
  };
234
276
 
235
- watch(() => [props.startDate, props.endDate], () => {
277
+ watch([() => props.startDate, () => props.endDate, () => props.modelValue], () => {
236
278
  if((props.modelValue[0] < startTimestamp.value || props.modelValue[1] > endTimestamp.value)) {
237
279
  emit('update:modelValue', [startTimestamp.value, endTimestamp.value]);
238
280
  }
@@ -241,15 +283,16 @@ export default defineComponent({
241
283
  watch(playing, (value) => {
242
284
  if(!value && playingInterval.value) {
243
285
  clearInterval(playingInterval.value);
244
- } else {
245
- playingInterval.value = setInterval(() => {
246
- if(props.modelValue[0] + props.stepTime <= endTimestamp.value && props.modelValue[1] + props.stepTime <= endTimestamp.value) {
247
- emit('update:modelValue', [props.modelValue[0] + props.stepTime, props.modelValue[1] + props.stepTime]);
248
- } else {
249
- playing.value = false;
250
- }
251
- }, props.playingStepDuration);
286
+ return;
252
287
  }
288
+
289
+ playingInterval.value = setInterval(() => {
290
+ if(props.modelValue[0] + props.stepTime <= endTimestamp.value && props.modelValue[1] + props.stepTime <= endTimestamp.value) {
291
+ emit('update:modelValue', [props.modelValue[0] + props.stepTime, props.modelValue[1] + props.stepTime]);
292
+ } else {
293
+ playing.value = false;
294
+ }
295
+ }, props.playingStepDuration);
253
296
  });
254
297
 
255
298
  return {
@@ -257,10 +300,10 @@ export default defineComponent({
257
300
  playing,
258
301
  ColorEnum,
259
302
  lightColors,
260
- intervalTime,
261
303
  endTimestamp,
304
+ TimePrecision,
262
305
  startTimestamp,
263
- maximumTickToShow,
306
+ ticksPrecision,
264
307
  epochToISO,
265
308
  onPlayingChange,
266
309
  onClickForward,
@@ -6,28 +6,32 @@
6
6
  :disabled="$props.disabled"
7
7
  :style="style"
8
8
  >
9
- <v-range-slider
10
- class="fs-range-slider"
11
- hide-details
12
- :disabled="$props.disabled"
13
- :ripple="false"
14
- :style="style"
15
- :elevation="0"
16
- :tickSize="4"
17
- :modelValue="$props.modelValue ?? undefined"
18
- @update:modelValue="$emit('update:modelValue', $event)"
19
- v-bind="$attrs"
20
- >
21
- <template
22
- v-for="(_, name) in $slots"
23
- v-slot:[name]="slotData"
9
+ <FSRow>
10
+ <v-range-slider
11
+ class="fs-range-slider"
12
+ hide-details
13
+ width="100%"
14
+ :disabled="$props.disabled"
15
+ :ripple="false"
16
+ :color="$props.color"
17
+ :style="style"
18
+ :elevation="0"
19
+ :tickSize="4"
20
+ :modelValue="$props.modelValue ?? undefined"
21
+ @update:modelValue="$emit('update:modelValue', $event)"
22
+ v-bind="$attrs"
24
23
  >
25
- <slot
26
- :name="name"
27
- v-bind="slotData"
28
- />
29
- </template>
30
- </v-range-slider>
24
+ <template
25
+ v-for="(_, name) in $slots"
26
+ v-slot:[name]="slotData"
27
+ >
28
+ <slot
29
+ :name="name"
30
+ v-bind="slotData"
31
+ />
32
+ </template>
33
+ </v-range-slider>
34
+ </FSRow>
31
35
  </FSBaseField>
32
36
  </template>
33
37
 
@@ -389,8 +389,6 @@ export default defineComponent({
389
389
  if(!map.value || !props.bounds) {
390
390
  return;
391
391
  }
392
-
393
- //console.log("Bounds changed", props.bounds);
394
392
  fitBounds(props.bounds, { maxZoom: 14 });
395
393
  });
396
394
 
@@ -3,11 +3,13 @@
3
3
  </template>
4
4
 
5
5
  <script lang="ts">
6
- import { inject, type PropType, type Ref, watch, ref, onUnmounted, onMounted } from 'vue';
6
+ import { inject, type PropType, type Ref, watch, ref, onUnmounted, computed } from 'vue';
7
+ import { type RouteLocation } from "vue-router";
7
8
 
8
- import { type Map, divIcon, type LatLng, marker, type Marker, type MarkerClusterGroup, type LeafletMouseEvent } from 'leaflet';
9
+ import { type Map, divIcon, type LatLng, marker, type Marker, type MarkerClusterGroup } from 'leaflet';
9
10
 
10
11
  import { useColors } from "../../composables";
12
+ import { useRouting } from '@dative-gpi/foundation-shared-services/composables';
11
13
 
12
14
  import { gpsMarkerHtml, locationMarkerHtml, pinMarkerHtml } from '../../utils/leafletMarkers';
13
15
  import { MAP, MARKERCLUSTERGROUP } from './keys';
@@ -41,14 +43,28 @@ export default {
41
43
  label: {
42
44
  type: String,
43
45
  required: false
46
+ },
47
+ to: {
48
+ type: Object as PropType<RouteLocation | null>,
49
+ required: false
44
50
  }
45
51
  },
46
- emits: ['click'],
52
+ emits: ['click', 'auxclick'],
47
53
  setup(props, { emit }) {
48
54
  const map = inject<Ref<Map | null>>(MAP);
49
55
  const markerClusterGroup = inject<Ref<MarkerClusterGroup | null>>(MARKERCLUSTERGROUP, ref(null));
50
-
56
+
51
57
  const { getColors } = useColors();
58
+ const { handleRoutingEvent } = useRouting();
59
+
60
+ if(!map) {
61
+ throw new Error('FSMapTileLayer must be used inside a FSMap component');
62
+ }
63
+
64
+ if(!map.value) {
65
+ throw new Error('FSMapTileLayer must be used inside a FSMap component with a map');
66
+ }
67
+
52
68
  const getMarkerIcon = () => {
53
69
  if(props.variant === 'gps') {
54
70
  const size = 16;
@@ -81,12 +97,32 @@ export default {
81
97
 
82
98
  const actualMarker = ref(marker(props.latlng ?? [0, 0], { icon: getMarkerIcon() }));
83
99
 
84
- if(!map) {
85
- throw new Error('FSMapTileLayer must be used inside a FSMap component');
100
+ const markerElement = computed(() => {
101
+ return actualMarker.value.getElement();
102
+ });
103
+
104
+ const onClick = (event: MouseEvent) => {
105
+ if(props.to) {
106
+ handleRoutingEvent(event, props.to, true);
107
+ return;
108
+ }
109
+
110
+ emit('click', {
111
+ ...event,
112
+ latlng: props.latlng
113
+ });
86
114
  }
87
115
 
88
- if(!map.value) {
89
- throw new Error('FSMapTileLayer must be used inside a FSMap component with a map');
116
+ const onAuxClick = (event: MouseEvent) => {
117
+ if(props.to) {
118
+ handleRoutingEvent(event, props.to);
119
+ return;
120
+ }
121
+
122
+ emit('auxclick', {
123
+ ...event,
124
+ latlng: props.latlng
125
+ });
90
126
  }
91
127
 
92
128
  watch(map, () => {
@@ -118,11 +154,14 @@ export default {
118
154
  actualMarker.value.setLatLng(props.latlng);
119
155
  });
120
156
 
121
- onMounted(() => {
122
- actualMarker.value.on('click', (event: LeafletMouseEvent) => {
123
- emit('click', event);
124
- });
125
- });
157
+ watch(markerElement, (newMarkerElement) => {
158
+ if(!newMarkerElement) {
159
+ return;
160
+ }
161
+
162
+ newMarkerElement.addEventListener('click', onClick);
163
+ newMarkerElement.addEventListener('auxclick', onAuxClick);
164
+ }, { immediate: true });
126
165
 
127
166
  onUnmounted(() => {
128
167
  if(actualMarker.value && map.value) {
@@ -13,7 +13,7 @@ export const useMapLayers = () => {
13
13
  {
14
14
  name: MapLayers.Map,
15
15
  label: $tr("ui.map-layer.map", "Map"),
16
- image: new URL("../../assets/images/map/map.png", import.meta.url).href,
16
+ image: new URL("../assets/images/map/map.png", import.meta.url).href,
17
17
  layers: [
18
18
  tileLayer(`https://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}&key=${apiKey}`, {
19
19
  maxZoom: 22,
@@ -26,7 +26,7 @@ export const useMapLayers = () => {
26
26
  {
27
27
  name: MapLayers.Imagery,
28
28
  label: $tr("ui.map-layer.imagery", "Imagery"),
29
- image: new URL("../../assets/images/map/imagery.png", import.meta.url).href,
29
+ image: new URL("../assets/images/map/imagery.png", import.meta.url).href,
30
30
  layers: [
31
31
  tileLayer(`https://{s}.google.com/vt/lyrs=s,h&x={x}&y={y}&z={z}&key=${apiKey}`, {
32
32
  maxZoom: 22,
@@ -39,7 +39,7 @@ export const useMapLayers = () => {
39
39
  {
40
40
  name: MapLayers.Snow,
41
41
  label: $tr("ui.map-layer.snow", "Snow ski map"),
42
- image: new URL("../../assets/images/map/snow.png", import.meta.url).href,
42
+ image: new URL("../assets/images/map/snow.png", import.meta.url).href,
43
43
  layers: [
44
44
  tileLayer(`https://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}&key=${apiKey}`, {
45
45
  maxZoom: 22,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dative-gpi/foundation-shared-components",
3
3
  "sideEffects": false,
4
- "version": "1.0.158-sankey2",
4
+ "version": "1.0.159-sankey3",
5
5
  "description": "",
6
6
  "publishConfig": {
7
7
  "access": "public"
@@ -10,8 +10,8 @@
10
10
  "author": "",
11
11
  "license": "ISC",
12
12
  "dependencies": {
13
- "@dative-gpi/foundation-shared-domain": "1.0.158-sankey2",
14
- "@dative-gpi/foundation-shared-services": "1.0.158-sankey2"
13
+ "@dative-gpi/foundation-shared-domain": "1.0.159-sankey3",
14
+ "@dative-gpi/foundation-shared-services": "1.0.159-sankey3"
15
15
  },
16
16
  "peerDependencies": {
17
17
  "@dative-gpi/bones-ui": "^1.0.0",
@@ -35,5 +35,5 @@
35
35
  "sass": "1.71.1",
36
36
  "sass-loader": "13.3.2"
37
37
  },
38
- "gitHead": "3bdd971b1260dda85c68b5c550521861a513c2f1"
38
+ "gitHead": "2e082499c169cb28d4480d2fb76993f1240d9c87"
39
39
  }
@@ -48,7 +48,6 @@
48
48
  @import "fs_password_field.scss";
49
49
  @import "fs_progress_bar.scss";
50
50
  @import "fs_radio.scss";
51
- @import "fs_range_slider.scss";
52
51
  @import "fs_rich_text_field.scss";
53
52
  @import "fs_row.scss";
54
53
  @import "fs_select_field.scss";
@@ -74,9 +74,10 @@ export const AlertTools = {
74
74
  },
75
75
  criticityLabel(value: Criticity): string {
76
76
  switch (value) {
77
+ case Criticity.Information: return $tr('ui.common.information', 'Information');
77
78
  case Criticity.Warning: return $tr('ui.common.warning', 'Warning');
78
79
  case Criticity.Error: return $tr('ui.common.error', 'Error');
79
- default: return $tr('ui.common.information', 'Information');
80
+ default: return $tr("ui.common.none", "None");
80
81
  }
81
82
  },
82
83
  statusColor(status: AlertStatus): ColorEnum {
@@ -1,51 +0,0 @@
1
- .fs-range-slider {
2
- padding: 0px !important;
3
- width: calc(100% - 16px);
4
-
5
- & .v-slider__container {
6
- cursor: var(--fs-range-slider-cursor);
7
- margin-left: 8px;
8
- margin-right: 8px;
9
- opacity: 1 !important;
10
- }
11
-
12
- & .v-slider-track__background {
13
- background-color: var(--fs-range-slider-track-color);
14
- height: 6px !important;
15
- opacity: 1;
16
- }
17
-
18
- & .v-slider-track__fill {
19
- background-color: var(--fs-range-slider-fill-color);
20
- opacity: 0.7 !important;
21
- }
22
-
23
- & .v-slider-track__tick {
24
- background-color: var(--fs-range-slider-thumb-color);
25
- border-radius: 50%;
26
- }
27
-
28
- & .v-slider-thumb {
29
- color: var(--fs-range-slider-thumb-color);
30
-
31
- &__surface:before {
32
- display: none !important;
33
- }
34
-
35
- &__surface:after {
36
- display: none !important;
37
- }
38
-
39
- &__ripple {
40
- display: none !important;
41
- }
42
- }
43
- }
44
-
45
- .fs-range-slider-label {
46
- color: var(--fs-range-slider-color);
47
- }
48
-
49
- .fs-range-slider-description {
50
- color: var(--fs-range-slider-color);
51
- }