@geode/opengeodeweb-front 10.8.0-rc.2 → 10.8.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.
- package/app/components/Launcher.vue +8 -1
- package/app/components/Loading/EcoMessages.vue +77 -0
- package/app/components/Loading/Footer.vue +13 -0
- package/app/components/Loading/Header.vue +41 -0
- package/app/components/Loading/Progress.vue +26 -0
- package/app/components/Loading.vue +71 -75
- package/app/components/Viewer/Ui.vue +47 -0
- package/package.json +3 -4
- package/app/assets/img/energy_sobriety/chemin.png +0 -0
- package/app/assets/img/energy_sobriety/collegue.png +0 -0
- package/app/assets/img/energy_sobriety/derniere.png +0 -0
- package/app/assets/img/energy_sobriety/etincelle.png +0 -0
- package/app/assets/img/energy_sobriety/geste.png +0 -0
- package/app/assets/img/energy_sobriety/lampadaire.png +0 -0
- package/app/assets/img/energy_sobriety/salon.png +0 -0
- package/app/assets/img/energy_sobriety/sobene.png +0 -0
- package/app/assets/img/energy_sobriety/socle.png +0 -0
- package/app/assets/img/energy_sobriety/vert.png +0 -0
- package/app/assets/img/energy_sobriety/ying_yang.png +0 -0
- package/app/components/Carousel.vue +0 -89
|
@@ -4,6 +4,13 @@ import Recaptcha from "@ogw_front/components/Recaptcha";
|
|
|
4
4
|
import { Status } from "@ogw_front/utils/status";
|
|
5
5
|
import { useInfraStore } from "@ogw_front/stores/infra";
|
|
6
6
|
|
|
7
|
+
const { logo } = defineProps({
|
|
8
|
+
logo: {
|
|
9
|
+
type: String,
|
|
10
|
+
required: true,
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
|
|
7
14
|
const infraStore = useInfraStore();
|
|
8
15
|
|
|
9
16
|
watch(
|
|
@@ -29,7 +36,7 @@ watch(
|
|
|
29
36
|
<Recaptcha :button_color="'secondary'" />
|
|
30
37
|
</v-col>
|
|
31
38
|
<v-col v-else-if="infraStore.status == Status.CREATING">
|
|
32
|
-
<Loading />
|
|
39
|
+
<Loading :logo="logo" />
|
|
33
40
|
</v-col>
|
|
34
41
|
</v-row>
|
|
35
42
|
</v-container>
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
const ecoMessages = [
|
|
3
|
+
{
|
|
4
|
+
icon: "mdi-leaf",
|
|
5
|
+
title: "Why the wait?",
|
|
6
|
+
message: "Your workspace starts on demand, no idle servers running 24/7.",
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
icon: "mdi-lightning-bolt-outline",
|
|
10
|
+
title: "Lower carbon footprint",
|
|
11
|
+
message: "On-demand computing uses up to 70% less energy than always-on servers.",
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
icon: "mdi-earth",
|
|
15
|
+
title: "Your choice matters",
|
|
16
|
+
message: "By using Vease, you're part of a more sustainable way to work with data.",
|
|
17
|
+
},
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
const MESSAGE_INTERVAL_MS = 3000;
|
|
21
|
+
const currentMessage = ref(0);
|
|
22
|
+
let interval = undefined;
|
|
23
|
+
|
|
24
|
+
onMounted(() => {
|
|
25
|
+
interval = setInterval(() => {
|
|
26
|
+
currentMessage.value = (currentMessage.value + 1) % ecoMessages.length;
|
|
27
|
+
}, MESSAGE_INTERVAL_MS);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
onUnmounted(() => {
|
|
31
|
+
clearInterval(interval);
|
|
32
|
+
});
|
|
33
|
+
</script>
|
|
34
|
+
|
|
35
|
+
<template>
|
|
36
|
+
<v-sheet color="transparent" height="160" class="position-relative overflow-visible mb-4">
|
|
37
|
+
<v-scroll-y-reverse-transition mode="out-in">
|
|
38
|
+
<v-card
|
|
39
|
+
:key="currentMessage"
|
|
40
|
+
rounded="lg"
|
|
41
|
+
class="pa-6 border mx-auto"
|
|
42
|
+
color="rgba(255, 255, 255, 0.05)"
|
|
43
|
+
elevation="0"
|
|
44
|
+
style="border-color: rgba(255, 255, 255, 0.1) !important"
|
|
45
|
+
>
|
|
46
|
+
<v-card-title
|
|
47
|
+
class="d-flex align-center ga-3 pa-0 mb-3 text-subtitle-1 font-weight-bold text-white text-wrap"
|
|
48
|
+
>
|
|
49
|
+
<v-icon
|
|
50
|
+
:icon="ecoMessages[currentMessage].icon"
|
|
51
|
+
color="white"
|
|
52
|
+
size="22"
|
|
53
|
+
style="filter: drop-shadow(0 0 6px rgba(var(--v-theme-primary), 0.6))"
|
|
54
|
+
/>
|
|
55
|
+
{{ ecoMessages[currentMessage].title }}
|
|
56
|
+
</v-card-title>
|
|
57
|
+
<v-card-text
|
|
58
|
+
class="pa-0 text-body-2 text-white text-left"
|
|
59
|
+
style="opacity: 0.85; line-height: 1.7"
|
|
60
|
+
>
|
|
61
|
+
{{ ecoMessages[currentMessage].message }}
|
|
62
|
+
</v-card-text>
|
|
63
|
+
</v-card>
|
|
64
|
+
</v-scroll-y-reverse-transition>
|
|
65
|
+
|
|
66
|
+
<v-row justify="center" class="ga-3 mt-6">
|
|
67
|
+
<v-icon
|
|
68
|
+
v-for="(_, index) in ecoMessages"
|
|
69
|
+
:key="index"
|
|
70
|
+
size="10"
|
|
71
|
+
:color="index <= currentMessage ? 'white' : 'white'"
|
|
72
|
+
:icon="index === currentMessage ? 'mdi-circle' : 'mdi-circle-outline'"
|
|
73
|
+
:style="{ opacity: index <= currentMessage ? 1 : 0.25 }"
|
|
74
|
+
/>
|
|
75
|
+
</v-row>
|
|
76
|
+
</v-sheet>
|
|
77
|
+
</template>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<v-card
|
|
3
|
+
color="transparent"
|
|
4
|
+
elevation="0"
|
|
5
|
+
class="mt-8 d-flex align-center justify-center ga-2 text-white"
|
|
6
|
+
style="opacity: 0.6; letter-spacing: 0.08em"
|
|
7
|
+
>
|
|
8
|
+
<v-icon icon="mdi-leaf" size="14" />
|
|
9
|
+
<v-card-text class="pa-0 text-caption font-weight-medium" style="flex: none">
|
|
10
|
+
On-demand infrastructure greener by design
|
|
11
|
+
</v-card-text>
|
|
12
|
+
</v-card>
|
|
13
|
+
</template>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
const { logo } = defineProps({
|
|
3
|
+
logo: {
|
|
4
|
+
type: String,
|
|
5
|
+
default: "",
|
|
6
|
+
},
|
|
7
|
+
});
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<v-row justify="center" class="mb-8">
|
|
12
|
+
<v-img
|
|
13
|
+
:src="logo"
|
|
14
|
+
height="180"
|
|
15
|
+
width="180"
|
|
16
|
+
style="filter: drop-shadow(0 0 20px rgba(var(--v-theme-primary), 0.4))"
|
|
17
|
+
/>
|
|
18
|
+
</v-row>
|
|
19
|
+
|
|
20
|
+
<v-card color="transparent" elevation="0" class="mb-8 overflow-visible">
|
|
21
|
+
<v-card-title
|
|
22
|
+
class="text-h2 font-weight-black text-white text-wrap pa-0 d-block"
|
|
23
|
+
style="text-shadow: 0 0 20px rgba(255, 255, 255, 0.3)"
|
|
24
|
+
>
|
|
25
|
+
STARTING UP
|
|
26
|
+
</v-card-title>
|
|
27
|
+
<v-divider thickness="3" class="border-opacity-100 mx-auto my-4" color="primary" width="60" />
|
|
28
|
+
<v-card-subtitle
|
|
29
|
+
class="text-subtitle-2 font-weight-bold text-white ls-widest pa-0 text-wrap"
|
|
30
|
+
style="opacity: 0.9"
|
|
31
|
+
>
|
|
32
|
+
YOUR WORKSPACE IS WAKING UP...
|
|
33
|
+
</v-card-subtitle>
|
|
34
|
+
</v-card>
|
|
35
|
+
</template>
|
|
36
|
+
|
|
37
|
+
<style scoped>
|
|
38
|
+
.ls-widest {
|
|
39
|
+
letter-spacing: 0.6em !important;
|
|
40
|
+
}
|
|
41
|
+
</style>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
const { progress } = defineProps({
|
|
3
|
+
progress: {
|
|
4
|
+
type: Number,
|
|
5
|
+
required: true,
|
|
6
|
+
},
|
|
7
|
+
});
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<v-progress-linear
|
|
12
|
+
color="white"
|
|
13
|
+
height="10"
|
|
14
|
+
indeterminate
|
|
15
|
+
rounded
|
|
16
|
+
bg-color="white"
|
|
17
|
+
bg-opacity="0.15"
|
|
18
|
+
class="custom-progress-glow mt-8"
|
|
19
|
+
/>
|
|
20
|
+
</template>
|
|
21
|
+
|
|
22
|
+
<style scoped>
|
|
23
|
+
.custom-progress-glow :deep(.v-progress-linear__indeterminate) {
|
|
24
|
+
box-shadow: 0 0 15px rgba(255, 255, 255, 0.4);
|
|
25
|
+
}
|
|
26
|
+
</style>
|
|
@@ -1,82 +1,78 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import salon from "@ogw_front/assets/img/energy_sobriety/salon.png";
|
|
9
|
-
import sobene from "@ogw_front/assets/img/energy_sobriety/sobene.png";
|
|
10
|
-
import socle from "@ogw_front/assets/img/energy_sobriety/socle.png";
|
|
11
|
-
import vert from "@ogw_front/assets/img/energy_sobriety/vert.png";
|
|
12
|
-
import ying_yang from "@ogw_front/assets/img/energy_sobriety/ying_yang.png";
|
|
2
|
+
const { logo } = defineProps({
|
|
3
|
+
logo: {
|
|
4
|
+
type: String,
|
|
5
|
+
default: "",
|
|
6
|
+
},
|
|
7
|
+
});
|
|
13
8
|
|
|
14
|
-
|
|
9
|
+
const show = ref(false);
|
|
10
|
+
const progress = ref(0);
|
|
15
11
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
},
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
name: "ETINCELLE",
|
|
43
|
-
logo: etincelle,
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
name: "GESTE",
|
|
47
|
-
logo: geste,
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
name: "SOCLE",
|
|
51
|
-
logo: socle,
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
name: "DERNIERE",
|
|
55
|
-
logo: derniere,
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
name: "SALON",
|
|
59
|
-
logo: salon,
|
|
60
|
-
},
|
|
61
|
-
];
|
|
12
|
+
let progressInterval = undefined;
|
|
13
|
+
|
|
14
|
+
const PROGRESS_THRESHOLD = 90;
|
|
15
|
+
const MAX_PROGRESS = 99;
|
|
16
|
+
const PROGRESS_INCREMENT_SCALE = 5;
|
|
17
|
+
const UPDATE_INTERVAL_MS = 500;
|
|
18
|
+
const SLOW_INCREMENT = 0.5;
|
|
19
|
+
|
|
20
|
+
onMounted(() => {
|
|
21
|
+
show.value = true;
|
|
22
|
+
progressInterval = setInterval(() => {
|
|
23
|
+
if (progress.value < PROGRESS_THRESHOLD) {
|
|
24
|
+
progress.value += Math.random() * PROGRESS_INCREMENT_SCALE;
|
|
25
|
+
} else if (progress.value < MAX_PROGRESS) {
|
|
26
|
+
progress.value += SLOW_INCREMENT;
|
|
27
|
+
}
|
|
28
|
+
}, UPDATE_INTERVAL_MS);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
onUnmounted(() => {
|
|
32
|
+
if (progressInterval) {
|
|
33
|
+
clearInterval(progressInterval);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
62
36
|
</script>
|
|
63
37
|
|
|
64
38
|
<template>
|
|
65
|
-
<v-
|
|
66
|
-
<
|
|
67
|
-
<
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
39
|
+
<div v-bind="$attrs">
|
|
40
|
+
<Teleport to="body">
|
|
41
|
+
<div
|
|
42
|
+
v-if="show"
|
|
43
|
+
class="d-flex align-center justify-center transition-swing"
|
|
44
|
+
style="
|
|
45
|
+
position: fixed;
|
|
46
|
+
inset: 0;
|
|
47
|
+
width: 100vw;
|
|
48
|
+
height: 100vh;
|
|
49
|
+
background: rgba(0, 0, 0, 0.45);
|
|
50
|
+
backdrop-filter: blur(10px);
|
|
51
|
+
z-index: 2400;
|
|
52
|
+
pointer-events: auto;
|
|
53
|
+
"
|
|
54
|
+
>
|
|
55
|
+
<div
|
|
56
|
+
style="
|
|
57
|
+
position: absolute;
|
|
58
|
+
inset: 0;
|
|
59
|
+
background-image: radial-gradient(rgba(255, 255, 255, 0.08) 1px, transparent 0);
|
|
60
|
+
background-size: 40px 40px;
|
|
61
|
+
background-position: center;
|
|
62
|
+
pointer-events: none;
|
|
63
|
+
"
|
|
64
|
+
/>
|
|
65
|
+
|
|
66
|
+
<div
|
|
67
|
+
class="d-flex flex-column align-center text-center"
|
|
68
|
+
style="max-width: 650px; width: 100%; padding: 0 24px; gap: 1.5rem"
|
|
69
|
+
>
|
|
70
|
+
<LoadingHeader :logo="logo" />
|
|
71
|
+
<LoadingEcoMessages />
|
|
72
|
+
<LoadingProgress :progress="progress" />
|
|
73
|
+
<LoadingFooter />
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</Teleport>
|
|
77
|
+
</div>
|
|
82
78
|
</template>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import ViewerContextMenu from "@ogw_front/components/Viewer/ContextMenu";
|
|
3
|
+
import ViewerTreeObjectTree from "@ogw_front/components/Viewer/Tree/ObjectTree";
|
|
4
|
+
import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
|
|
5
|
+
|
|
6
|
+
const { id, displayMenu, menuStore, containerWidth, containerHeight, dataStyleStore, viewerStore } =
|
|
7
|
+
defineProps({
|
|
8
|
+
id: { type: String, required: true },
|
|
9
|
+
displayMenu: { type: Boolean, required: true },
|
|
10
|
+
menuStore: { type: Object, required: true },
|
|
11
|
+
containerWidth: { type: Number, required: true },
|
|
12
|
+
containerHeight: { type: Number, required: true },
|
|
13
|
+
dataStyleStore: { type: Object, required: true },
|
|
14
|
+
viewerStore: { type: Object, required: true },
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const emit = defineEmits(["show-menu", "set-id"]);
|
|
18
|
+
|
|
19
|
+
async function get_viewer_id(x, y) {
|
|
20
|
+
const ids = Object.keys(dataStyleStore.styles);
|
|
21
|
+
await viewerStore.request(
|
|
22
|
+
viewer_schemas.opengeodeweb_viewer.viewer.picked_ids,
|
|
23
|
+
{ x, y, ids },
|
|
24
|
+
{
|
|
25
|
+
response_function: (response) => {
|
|
26
|
+
const { array_ids } = response;
|
|
27
|
+
const [first_id] = array_ids;
|
|
28
|
+
emit("set-id", first_id);
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
defineExpose({ get_viewer_id });
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
<template>
|
|
38
|
+
<ViewerTreeObjectTree @show-menu="(args) => emit('show-menu', args)" />
|
|
39
|
+
<ViewerContextMenu
|
|
40
|
+
v-if="displayMenu"
|
|
41
|
+
:id="menuStore.current_id || id"
|
|
42
|
+
:x="menuStore.menuX"
|
|
43
|
+
:y="menuStore.menuY"
|
|
44
|
+
:container-width="containerWidth"
|
|
45
|
+
:container-height="containerHeight"
|
|
46
|
+
/>
|
|
47
|
+
</template>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geode/opengeodeweb-front",
|
|
3
|
-
"version": "10.8.0
|
|
3
|
+
"version": "10.8.0",
|
|
4
4
|
"description": "OpenSource Vue/Nuxt/Pinia/Vuetify framework for web applications",
|
|
5
5
|
"homepage": "https://github.com/Geode-solutions/OpenGeodeWeb-Front",
|
|
6
6
|
"bugs": {
|
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
"build": ""
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@geode/opengeodeweb-back": "
|
|
38
|
-
"@geode/opengeodeweb-viewer": "
|
|
37
|
+
"@geode/opengeodeweb-back": "latest",
|
|
38
|
+
"@geode/opengeodeweb-viewer": "latest",
|
|
39
39
|
"@kitware/vtk.js": "33.3.0",
|
|
40
40
|
"@mdi/font": "7.4.47",
|
|
41
41
|
"@pinia/nuxt": "0.11.3",
|
|
@@ -60,7 +60,6 @@
|
|
|
60
60
|
"sass": "1.87.0",
|
|
61
61
|
"semver": "7.7.1",
|
|
62
62
|
"uuid": "11.1.0",
|
|
63
|
-
"vue3-carousel": "0.3.4",
|
|
64
63
|
"vuetify": "3.10.11",
|
|
65
64
|
"vuetify-nuxt-module": "0.18.7",
|
|
66
65
|
"ws": "8.18.3",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
<script setup>
|
|
2
|
-
// oxlint-disable-next-line import/no-unassigned-import
|
|
3
|
-
import "vue3-carousel/dist/carousel.css";
|
|
4
|
-
import { Carousel, Navigation, Pagination, Slide } from "vue3-carousel";
|
|
5
|
-
import { useDisplay } from "vuetify";
|
|
6
|
-
|
|
7
|
-
const NB_ITEMS_TO_DISPLAY = 3;
|
|
8
|
-
|
|
9
|
-
const { items } = defineProps({
|
|
10
|
-
items: { type: Array, required: true },
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
const { name } = useDisplay();
|
|
14
|
-
const nb_items_to_display = ref(NB_ITEMS_TO_DISPLAY);
|
|
15
|
-
watch(
|
|
16
|
-
name,
|
|
17
|
-
(value) => {
|
|
18
|
-
switch (value) {
|
|
19
|
-
case "xs": {
|
|
20
|
-
nb_items_to_display.value = 1;
|
|
21
|
-
break;
|
|
22
|
-
}
|
|
23
|
-
case "sm": {
|
|
24
|
-
nb_items_to_display.value = 2;
|
|
25
|
-
break;
|
|
26
|
-
}
|
|
27
|
-
default: {
|
|
28
|
-
nb_items_to_display.value = 3;
|
|
29
|
-
break;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
immediate: true,
|
|
35
|
-
},
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
const carrousel_settings = reactive({
|
|
39
|
-
autoplay: 2000,
|
|
40
|
-
itemsToShow: nb_items_to_display.value,
|
|
41
|
-
itemsToScroll: 1,
|
|
42
|
-
pauseAutoplayOnHover: true,
|
|
43
|
-
transition: 1000,
|
|
44
|
-
wrapAround: true,
|
|
45
|
-
});
|
|
46
|
-
</script>
|
|
47
|
-
|
|
48
|
-
<template>
|
|
49
|
-
<ClientOnly>
|
|
50
|
-
<Carousel :settings="carrousel_settings">
|
|
51
|
-
<Slide v-for="(item, index) in items" :key="index" class="carousel__slide">
|
|
52
|
-
<a :href="item.url" target="_blank">
|
|
53
|
-
<img :src="item.logo" class="carousel__item" />
|
|
54
|
-
</a>
|
|
55
|
-
</Slide>
|
|
56
|
-
<template #addons>
|
|
57
|
-
<Navigation />
|
|
58
|
-
<Pagination />
|
|
59
|
-
</template>
|
|
60
|
-
</Carousel>
|
|
61
|
-
</ClientOnly>
|
|
62
|
-
</template>
|
|
63
|
-
|
|
64
|
-
<style scoped>
|
|
65
|
-
.carousel__item {
|
|
66
|
-
min-height: 200px;
|
|
67
|
-
width: 100%;
|
|
68
|
-
background-color: var(--vc-clr-white);
|
|
69
|
-
color: var(--vc-clr-white);
|
|
70
|
-
font-size: 20px;
|
|
71
|
-
border-radius: 10px;
|
|
72
|
-
display: flex;
|
|
73
|
-
justify-content: center;
|
|
74
|
-
align-items: center;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
.carousel__slide {
|
|
78
|
-
display: flex;
|
|
79
|
-
padding: 15px;
|
|
80
|
-
align-items: center;
|
|
81
|
-
justify-content: center;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
.carousel__prev,
|
|
85
|
-
.carousel__next {
|
|
86
|
-
box-sizing: content-box;
|
|
87
|
-
border: 5px solid red;
|
|
88
|
-
}
|
|
89
|
-
</style>
|