ep-lib-ts 1.0.42 → 1.0.44
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/dist/BgAudio-ByQMjvpb.js +4 -0
- package/dist/DisplayBox-5KOzK-T1.js +4 -0
- package/dist/Ep360Image-CQJBPImD.js +241 -0
- package/dist/{Ep360Video-b_stvC2Z.js → Ep360Video-CL_7mOiQ.js} +84 -77
- package/dist/EpAlert-9n3eGOzn.js +4 -0
- package/dist/EpAudio-DN-khrPL.js +4 -0
- package/dist/EpAvatar-CXQP2wql.js +4 -0
- package/dist/EpBadge-4MOToF_Q.js +4 -0
- package/dist/EpBarChart-D7YNa6L1.js +4 -0
- package/dist/EpBranchingScenario-vDe8SVyF.js +160 -0
- package/dist/EpBtn-CodZ5WkT.js +4 -0
- package/dist/EpCard-bxcDoveo.js +4 -0
- package/dist/EpCardLink-BpRg37fb.js +4 -0
- package/dist/EpChip-DyPsThQ7.js +4 -0
- package/dist/EpCodeblock-CTVen6ok.js +4 -0
- package/dist/EpConclusion-CZSpnFN3.js +4 -0
- package/dist/EpContentSlider-0KrwEp3v.js +4 -0
- package/dist/{EpDarkmode-DV9Z9xYJ.js → EpDarkmode-CM5E89Mq.js} +1 -1
- package/dist/EpDescription-BqAK-19p.js +4 -0
- package/dist/EpDivider-Cz2UczzO.js +4 -0
- package/dist/EpDraggable-DihYnwD-.js +1676 -0
- package/dist/EpEdu-Cb0syukg.js +4 -0
- package/dist/EpFlex-C9FQK2SA.js +4 -0
- package/dist/EpFunnelChart-DCiSFsse.js +4 -0
- package/dist/EpHeader-CzSF69pa.js +4 -0
- package/dist/EpHover-RZmDKnaw.js +4 -0
- package/dist/EpHoverCard-D6G0baOv.js +4 -0
- package/dist/EpIcon-Av0-zy17.js +4 -0
- package/dist/EpIframe-DW9zyLQo.js +4 -0
- package/dist/EpImg-CSHuR6qU.js +4 -0
- package/dist/EpImgCarousel-cIC103wg.js +4 -0
- package/dist/{EpInput-CZghcnDC.js → EpInput-DHrHSXzx.js} +29 -29
- package/dist/EpInstructions-K-kkygx5.js +4 -0
- package/dist/EpIntroduction-CQlFolxF.js +4 -0
- package/dist/EpLineChart-mWEJNhfP.js +4 -0
- package/dist/EpLink-ByArsF1O.js +4 -0
- package/dist/EpLinkVersion-D0l0gER1.js +4 -0
- package/dist/{EpList-ukdKbhdd.js → EpList-c0SMP53E.js} +1 -1
- package/dist/EpModal-CnTSNH-6.js +4 -0
- package/dist/{EpNothing-nZWACvB0.js → EpNothing-CT8_zyfI.js} +1 -1
- package/dist/EpObjective-CFUl1myw.js +4 -0
- package/dist/EpPieChart-D4gofeCO.js +4 -0
- package/dist/EpQuestion-DpEP1I3J.js +4 -0
- package/dist/EpQuote-D_a9FXrQ.js +4 -0
- package/dist/EpRadio-BPGeCsln.js +4 -0
- package/dist/EpRadioSummative-2GRkKBZC.js +4 -0
- package/dist/EpReading-b0gkhYIF.js +4 -0
- package/dist/EpResource-B1pFABU5.js +4 -0
- package/dist/EpScope-BQWyrqjD.js +4 -0
- package/dist/EpSection-CkXDsnuU.js +4 -0
- package/dist/EpSectionCols-BwC-XklV.js +4 -0
- package/dist/EpSkeleton-CfhwJtyP.js +4 -0
- package/dist/EpSoftware-c8ntWUO-.js +4 -0
- package/dist/EpSpecificObjective-D3mba6ZZ.js +4 -0
- package/dist/EpSpinner-G3e-rq8T.js +4 -0
- package/dist/EpStackedList-Bo0PTfJP.js +4 -0
- package/dist/EpSummativeTable-BumOFuw9.js +4 -0
- package/dist/EpSvg-D1zVHuRF.js +4 -0
- package/dist/EpSvgShow-CDYlL1_A.js +54 -0
- package/dist/EpTable-gr45PRwp.js +4 -0
- package/dist/EpTerm-CNfRoEdY.js +4 -0
- package/dist/EpText-DKuz6gcn.js +4 -0
- package/dist/EpTimeLine-O-XSTUsa.js +4 -0
- package/dist/EpVideo-DB3Kgada.js +4 -0
- package/dist/EpVideoPanopto-Vta3OP2y.js +4 -0
- package/dist/EpWordDef-CYOQAmor.js +4 -0
- package/dist/components/basics/EpImgCarousel.vue.d.ts +77 -0
- package/dist/components/educationals/EpBranchingScenario.vue.d.ts +1 -0
- package/dist/components/interactions/Ep360Image.vue.d.ts +1 -0
- package/dist/components/interactions/EpDraggable.vue.d.ts +26 -0
- package/dist/components/interactions/EpSvgShow.vue.d.ts +34 -0
- package/dist/components/medias/EpCardLink.vue.d.ts +4 -0
- package/dist/components/medias/EpCarousel.vue.d.ts +5 -0
- package/dist/ep-lib-ts.js +30 -30
- package/dist/ep-lib-ts.umd.cjs +4600 -4766
- package/dist/{index-BABRC_Ij.js → index-DtabYqi-.js} +1 -1
- package/dist/{index-DDAVtT-Z.js → index-hjRiaRG8.js} +3942 -3779
- package/dist/{prism-6uDYLnZo.js → prism-DpfMvZqf.js} +1 -1
- package/dist/style.css +1 -1
- package/dist/three.module-CWLs6nMo.js +33752 -0
- package/dist/types/Draggable.d.ts +15 -0
- package/dist/types/Image.d.ts +5 -0
- package/package.json +4 -2
- package/src/components/basics/EpCard.vue +1 -1
- package/src/components/basics/EpImg.vue +1 -1
- package/src/components/basics/EpImgCarousel.vue +145 -0
- package/src/components/basics/EpText.vue +20 -18
- package/src/components/educationals/EpBranchingScenario.vue +15 -6
- package/src/components/educationals/EpReading.vue +3 -3
- package/src/components/interactions/Ep360Image.vue +32 -11
- package/src/components/interactions/Ep360Video.vue +15 -3
- package/src/components/interactions/EpDraggable.vue +192 -0
- package/src/components/interactions/EpSvgShow.vue +97 -0
- package/src/components/medias/EpCardLink.vue +51 -46
- package/src/components/medias/EpCarousel.vue +74 -11
- package/dist/BgAudio-B8TWhPS4.js +0 -4
- package/dist/DisplayBox-CVjM7CIK.js +0 -4
- package/dist/Ep360Image-Dmwx7NrY.js +0 -228
- package/dist/EpAlert-BL76x1nU.js +0 -4
- package/dist/EpAudio-C1oISf9P.js +0 -4
- package/dist/EpAvatar-BhbxoN3-.js +0 -4
- package/dist/EpBadge-CrFyRMYZ.js +0 -4
- package/dist/EpBarChart-BppGcLMQ.js +0 -4
- package/dist/EpBranchingScenario-B24j3QCB.js +0 -151
- package/dist/EpBtn-fVZ6TDv0.js +0 -4
- package/dist/EpCard-jyubSatC.js +0 -4
- package/dist/EpCardLink-DZSHjJtM.js +0 -4
- package/dist/EpChip-CnIScjK2.js +0 -4
- package/dist/EpCodeblock-C3sfk5vm.js +0 -4
- package/dist/EpConclusion-BMyRU6is.js +0 -4
- package/dist/EpContentSlider-DXuhYYCY.js +0 -4
- package/dist/EpDescription-DbyvVHqd.js +0 -4
- package/dist/EpDivider-DLNUbygt.js +0 -4
- package/dist/EpEdu-D8qKZwo4.js +0 -4
- package/dist/EpFlex-DERxMM1-.js +0 -4
- package/dist/EpFunnelChart-CaGjSoAy.js +0 -4
- package/dist/EpHeader-B0hVPn_n.js +0 -4
- package/dist/EpHover-XSJ4bqps.js +0 -4
- package/dist/EpHoverCard-EjNFyHQH.js +0 -4
- package/dist/EpIcon-D0W1dYE5.js +0 -4
- package/dist/EpIframe-BI4RWK0-.js +0 -4
- package/dist/EpImg-B4t8oZ4_.js +0 -4
- package/dist/EpInstructions-DWBai9-j.js +0 -4
- package/dist/EpIntroduction-C_zkEVjU.js +0 -4
- package/dist/EpLineChart-DHHtVVVK.js +0 -4
- package/dist/EpLink-CtdHaQpr.js +0 -4
- package/dist/EpLinkVersion-3WS3UgxY.js +0 -4
- package/dist/EpModal-DAzgqs2T.js +0 -4
- package/dist/EpObjective-Dwx6_PZV.js +0 -4
- package/dist/EpPieChart-B8Pr5W9-.js +0 -4
- package/dist/EpQuestion-B62CYUVA.js +0 -4
- package/dist/EpQuote-BihyGusM.js +0 -4
- package/dist/EpRadio-CpG6pS3s.js +0 -4
- package/dist/EpRadioSummative-DLXgKZAu.js +0 -4
- package/dist/EpReading-BlSjw_UD.js +0 -4
- package/dist/EpResource-ofzOBR4O.js +0 -4
- package/dist/EpScope-BIYN9eA2.js +0 -4
- package/dist/EpSection-33XioYMg.js +0 -4
- package/dist/EpSectionCols-A97bH9ae.js +0 -4
- package/dist/EpSkeleton-By3TPHqs.js +0 -4
- package/dist/EpSoftware-CUXfVeuT.js +0 -4
- package/dist/EpSpecificObjective-C2RasqCs.js +0 -4
- package/dist/EpSpinner-ZYvRrAHj.js +0 -4
- package/dist/EpStackedList-DHurElck.js +0 -4
- package/dist/EpSummativeTable-etwjX91_.js +0 -4
- package/dist/EpSvg-DmCV9jTP.js +0 -4
- package/dist/EpTable-Biz8ArYF.js +0 -4
- package/dist/EpTerm-Cisb50Au.js +0 -4
- package/dist/EpText-ibFC4JV7.js +0 -4
- package/dist/EpTimeLine-xAkA3Jb1.js +0 -4
- package/dist/EpVideo-CsieKBpx.js +0 -4
- package/dist/EpVideoPanopto-V584YRQc.js +0 -4
- package/dist/EpWordDef-VtpC2ck8.js +0 -4
- package/dist/three.module-laS36oD-.js +0 -48903
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed, ref, onMounted, onUnmounted } from 'vue';
|
|
3
|
+
import { VueDraggableNext as draggable } from 'vue-draggable-next';
|
|
4
|
+
|
|
5
|
+
import { Choice, Answer, Sockets } from '../../types/Draggable';
|
|
6
|
+
|
|
7
|
+
import { mdiCheckBold, mdiCloseThick } from "@mdi/js";
|
|
8
|
+
import EpIcon from '../basics/EpIcon.vue';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
interface Props {
|
|
15
|
+
answers: Answer[],
|
|
16
|
+
src: string,
|
|
17
|
+
sockets: Sockets[]
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const props = withDefaults(defineProps<Props>(), {});
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
// Manage the image and its size
|
|
26
|
+
|
|
27
|
+
const originalWidth = ref(0);
|
|
28
|
+
const originalHeight = ref(0);
|
|
29
|
+
|
|
30
|
+
const actualRect = ref({ width: 0, height: 0 });
|
|
31
|
+
const myImage = ref<HTMLImageElement | null>(null);
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
const updateSize = () => {
|
|
36
|
+
|
|
37
|
+
if (!myImage.value) return;
|
|
38
|
+
|
|
39
|
+
const rect = myImage.value.getBoundingClientRect();
|
|
40
|
+
actualRect.value = { width: rect.width, height: rect.height };
|
|
41
|
+
|
|
42
|
+
console.log('Image size updated. Width:', actualRect.value.width, 'Height:', actualRect.value.height);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
onMounted(() => {
|
|
47
|
+
window.addEventListener('resize', updateSize);
|
|
48
|
+
});
|
|
49
|
+
onUnmounted(() => {
|
|
50
|
+
window.removeEventListener('resize', updateSize);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
const handleImageLoad = (event: any) => {
|
|
56
|
+
originalWidth.value = event.target.naturalWidth;
|
|
57
|
+
originalHeight.value = event.target.naturalHeight;
|
|
58
|
+
|
|
59
|
+
console.log('Image loaded. Width:', originalWidth.value, 'Height:', originalHeight.value);
|
|
60
|
+
|
|
61
|
+
updateSize();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
const xRatio = computed(() => {
|
|
66
|
+
if (actualRect.value.width == 0) return 1;
|
|
67
|
+
return actualRect.value.width / originalWidth.value;
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const yRatio = computed(() => {
|
|
71
|
+
if (actualRect.value.height == 0) return 1;
|
|
72
|
+
return actualRect.value.height / originalHeight.value;
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
// Créer une copie réactive de props.answers
|
|
81
|
+
const availableAnswers = ref([...props.answers]);
|
|
82
|
+
|
|
83
|
+
const choices = ref<Choice[]>( props.sockets.map((s) => {
|
|
84
|
+
return {
|
|
85
|
+
choice: [],
|
|
86
|
+
expected: s.correctAnswer ,
|
|
87
|
+
allowPut: true
|
|
88
|
+
}
|
|
89
|
+
}));
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
// Manage drag and drop
|
|
95
|
+
const onAdd = (event: any, index: number) => {
|
|
96
|
+
console.log(event.clone);
|
|
97
|
+
|
|
98
|
+
// Retirer l'élément de la liste des réponses disponibles
|
|
99
|
+
availableAnswers.value = availableAnswers.value.filter(item => item.name !== event.clone.name);
|
|
100
|
+
choices.value[index].allowPut = false;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const onRemove = (event: any, index: number) => {
|
|
104
|
+
console.log(event.clone);
|
|
105
|
+
|
|
106
|
+
choices.value[index].choice = [];
|
|
107
|
+
choices.value[index].allowPut = true;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
// Manage verification buttons
|
|
114
|
+
const validating = ref(false);
|
|
115
|
+
|
|
116
|
+
const validate = () => {
|
|
117
|
+
validating.value = true;
|
|
118
|
+
choices.value.forEach((choice) => {
|
|
119
|
+
choice.allowPut = false;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const retry = () => {
|
|
124
|
+
validating.value = false;
|
|
125
|
+
availableAnswers.value = [...props.answers];
|
|
126
|
+
choices.value.forEach((choice) => {
|
|
127
|
+
choice.choice = [];
|
|
128
|
+
choice.allowPut = true;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
</script>
|
|
134
|
+
|
|
135
|
+
<template>
|
|
136
|
+
|
|
137
|
+
<div class="flex flex-col">
|
|
138
|
+
<div class="grid grid-cols-3 gap-3 w-full my-8">
|
|
139
|
+
|
|
140
|
+
<!-- Draggable answers block -->
|
|
141
|
+
<div class="col-span-1 m-6">
|
|
142
|
+
<draggable
|
|
143
|
+
class="dragArea bg-gray-700 rounded-md p-4 min-h-5 list-group w-full"
|
|
144
|
+
v-model="availableAnswers"
|
|
145
|
+
:group="{ name: 'answers', pull: !validating, put: !validating }"
|
|
146
|
+
>
|
|
147
|
+
<div
|
|
148
|
+
class="list-group-item bg-gray-300 dark:bg-gray-800 m-1 p-3 rounded-md text-center flex justify-center items-center"
|
|
149
|
+
v-for="element in availableAnswers"
|
|
150
|
+
:key="element.name"
|
|
151
|
+
>
|
|
152
|
+
<img class="cursor-grab active:cursor-grabbing max-w-32 rounded" v-if="element.isImg" :src="element.src" alt="img" />
|
|
153
|
+
<p class="cursor-grab active:cursor-grabbing" v-else>{{ element.name }}</p>
|
|
154
|
+
</div>
|
|
155
|
+
</draggable>
|
|
156
|
+
</div>
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
<!-- Drop area block -->
|
|
160
|
+
<div class="col-span-2 relative">
|
|
161
|
+
<img @load="handleImageLoad" ref="myImage" :src="props.src" alt="img" class="w-full h-full select-none" />
|
|
162
|
+
<draggable
|
|
163
|
+
class="dropArea absolute bg-gray-300 dark:bg-gray-800 p-4 rounded-md min-w-14 max-w-32"
|
|
164
|
+
v-for="(socket, index) in props.sockets"
|
|
165
|
+
:key="index"
|
|
166
|
+
v-model="choices[index].choice"
|
|
167
|
+
:group="{ put: choices[index].allowPut }"
|
|
168
|
+
:style="{ left: (socket.xPos * xRatio) + 'px', top: (socket.yPos * yRatio) + 'px' }"
|
|
169
|
+
@add="onAdd($event, index)"
|
|
170
|
+
@remove="onRemove($event, index)"
|
|
171
|
+
>
|
|
172
|
+
<img class="cursor-grab active:cursor-grabbing rounded" v-if="choices[index].choice[0] && choices[index].choice[0].isImg" :src="choices[index].choice[0].src" alt="img" />
|
|
173
|
+
<p class="cursor-grab active:cursor-grabbing" v-else-if="choices[index].choice[0]">{{ choices[index].choice[0].name }}</p>
|
|
174
|
+
<span v-if="validating && choices[index].choice[0]?.name !== choices[index].expected" class="absolute -top-5 -right-5 bg-red-500 text-white px-2 py-1 rounded-md">
|
|
175
|
+
<EpIcon :iconPath="mdiCloseThick" size="18"></EpIcon>
|
|
176
|
+
</span>
|
|
177
|
+
<span v-if="validating && choices[index].choice[0]?.name === choices[index].expected" class="absolute -top-5 -right-5 bg-green-500 text-white px-2 py-1 rounded-md">
|
|
178
|
+
<EpIcon :iconPath="mdiCheckBold" size="18"></EpIcon>
|
|
179
|
+
</span>
|
|
180
|
+
</draggable>
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
|
|
184
|
+
<!-- Verification buttons -->
|
|
185
|
+
<div class="flex justify-center gap-4 mt-8">
|
|
186
|
+
<button class="bg-blue-500 text-white px-3 py-2 rounded-md text-center" @click="validate">Valider</button>
|
|
187
|
+
<button class="bg-blue-500 text-white px-3 py-2 rounded-md text-center" @click="retry">Recommencer</button>
|
|
188
|
+
</div>
|
|
189
|
+
|
|
190
|
+
</div>
|
|
191
|
+
|
|
192
|
+
</template>
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { onMounted, ref, computed, nextTick } from 'vue';
|
|
3
|
+
import { useRenderText } from '../../composables/useRenderText';
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
svg: string,
|
|
9
|
+
id: string,
|
|
10
|
+
animation?: "" | "translateX" | "scale",
|
|
11
|
+
multiple?: boolean
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
16
|
+
animation: "",
|
|
17
|
+
multiple: false
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const svg = ref<string>("");
|
|
21
|
+
|
|
22
|
+
const animationType = computed(() => {
|
|
23
|
+
switch (props.animation) {
|
|
24
|
+
case "translateX":
|
|
25
|
+
return "animate-slide";
|
|
26
|
+
case "scale":
|
|
27
|
+
return "animate-zoom";
|
|
28
|
+
default:
|
|
29
|
+
return "animate-fade";
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
onMounted(async() => {
|
|
38
|
+
svg.value = useRenderText(props.svg);
|
|
39
|
+
|
|
40
|
+
await nextTick();
|
|
41
|
+
|
|
42
|
+
// manage the scenes
|
|
43
|
+
const scenes = document.getElementById(props.id)?.getElementsByClassName('scene');
|
|
44
|
+
|
|
45
|
+
if(scenes) {
|
|
46
|
+
Array.from(scenes).forEach((s) => {
|
|
47
|
+
if(!s.classList.contains('hidden')) {
|
|
48
|
+
s.classList.add('hidden');
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// manage the buttons
|
|
54
|
+
const btns = document.getElementById(props.id)?.getElementsByClassName('btn');
|
|
55
|
+
|
|
56
|
+
if(btns) {
|
|
57
|
+
Array.from(btns).forEach((b) => {
|
|
58
|
+
b.addEventListener('click', (e) => {
|
|
59
|
+
const scene = b.getAttribute("id");
|
|
60
|
+
showScene(scene?? "");
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
const showScene = (scene: string) => {
|
|
69
|
+
console.log('event', scene);
|
|
70
|
+
if(svg.value) {
|
|
71
|
+
const scenes = document.getElementById(props.id)?.getElementsByClassName('scene');
|
|
72
|
+
if(scenes) {
|
|
73
|
+
Array.from(scenes).forEach((s) => {
|
|
74
|
+
if (s.classList.contains(`scene-${scene}`)) {
|
|
75
|
+
s.classList.remove('hidden', animationType.value);
|
|
76
|
+
s.classList.add(animationType.value);
|
|
77
|
+
} else {
|
|
78
|
+
if(!props.multiple && !s.classList.contains('hidden')) {
|
|
79
|
+
s.classList.add('hidden');
|
|
80
|
+
s.classList.remove(animationType.value);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
</script>
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
<template>
|
|
94
|
+
<!-- The buttons must have class "btn" and an unique id="<scene-name>"
|
|
95
|
+
The scenes elements must have class "scene" and "scene-<scene-name>" -->
|
|
96
|
+
<div :id="id" v-html="svg"></div>
|
|
97
|
+
</template>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { computed } from 'vue'
|
|
3
|
+
import { useRouter } from 'vue-router';
|
|
3
4
|
import EpCard from '../basics/EpCard.vue';
|
|
4
5
|
import type { MaxWidth } from "../../types/Hover";
|
|
5
6
|
import { mdiChevronRight } from "@mdi/js";
|
|
@@ -11,67 +12,71 @@ interface Props {
|
|
|
11
12
|
color?: string | null;
|
|
12
13
|
src?: string | null;
|
|
13
14
|
svg?: string;
|
|
14
|
-
maxWidth?:MaxWidth;
|
|
15
|
-
center?:boolean;
|
|
16
|
-
content?:string;
|
|
17
|
-
iconlink?:string;
|
|
18
|
-
to?:string;
|
|
19
|
-
nuxtLink?:boolean;
|
|
20
|
-
isExternal?:boolean
|
|
15
|
+
maxWidth?: MaxWidth;
|
|
16
|
+
center?: boolean;
|
|
17
|
+
content?: string;
|
|
18
|
+
iconlink?: string;
|
|
19
|
+
to?: string;
|
|
20
|
+
nuxtLink?: boolean;
|
|
21
|
+
isExternal?: boolean;
|
|
22
|
+
disabled?:boolean;
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
|
|
24
|
-
const props = withDefaults(defineProps<Props>(),{
|
|
26
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
25
27
|
//defaults ? ...
|
|
26
|
-
svg:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>dog</title><path d="M18,4C16.29,4 15.25,4.33 14.65,4.61C13.88,4.23 13,4 12,4C11,4 10.12,4.23 9.35,4.61C8.75,4.33 7.71,4 6,4C3,4 1,12 1,14C1,14.83 2.32,15.59 4.14,15.9C4.78,18.14 7.8,19.85 11.5,20V15.72C10.91,15.35 10,14.68 10,14C10,13 12,13 12,13C12,13 14,13 14,14C14,14.68 13.09,15.35 12.5,15.72V20C16.2,19.85 19.22,18.14 19.86,15.9C21.68,15.59 23,14.83 23,14C23,12 21,4 18,4M4.15,13.87C3.65,13.75 3.26,13.61 3,13.5C3.25,10.73 5.2,6.4 6.05,6C6.59,6 7,6.06 7.37,6.11C5.27,8.42 4.44,12.04 4.15,13.87M9,12A1,1 0 0,1 8,11C8,10.46 8.45,10 9,10A1,1 0 0,1 10,11C10,11.56 9.55,12 9,12M15,12A1,1 0 0,1 14,11C14,10.46 14.45,10 15,10A1,1 0 0,1 16,11C16,11.56 15.55,12 15,12M19.85,13.87C19.56,12.04 18.73,8.42 16.63,6.11C17,6.06 17.41,6 17.95,6C18.8,6.4 20.75,10.73 21,13.5C20.75,13.61 20.36,13.75 19.85,13.87Z" /></svg>',
|
|
27
|
-
maxWidth:"max-w-md",
|
|
28
|
-
center:false,
|
|
29
|
-
iconlink:mdiChevronRight,
|
|
30
|
-
nuxtLink:false,
|
|
31
|
-
to:'/',
|
|
32
|
-
isExternal:false
|
|
28
|
+
svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>dog</title><path d="M18,4C16.29,4 15.25,4.33 14.65,4.61C13.88,4.23 13,4 12,4C11,4 10.12,4.23 9.35,4.61C8.75,4.33 7.71,4 6,4C3,4 1,12 1,14C1,14.83 2.32,15.59 4.14,15.9C4.78,18.14 7.8,19.85 11.5,20V15.72C10.91,15.35 10,14.68 10,14C10,13 12,13 12,13C12,13 14,13 14,14C14,14.68 13.09,15.35 12.5,15.72V20C16.2,19.85 19.22,18.14 19.86,15.9C21.68,15.59 23,14.83 23,14C23,12 21,4 18,4M4.15,13.87C3.65,13.75 3.26,13.61 3,13.5C3.25,10.73 5.2,6.4 6.05,6C6.59,6 7,6.06 7.37,6.11C5.27,8.42 4.44,12.04 4.15,13.87M9,12A1,1 0 0,1 8,11C8,10.46 8.45,10 9,10A1,1 0 0,1 10,11C10,11.56 9.55,12 9,12M15,12A1,1 0 0,1 14,11C14,10.46 14.45,10 15,10A1,1 0 0,1 16,11C16,11.56 15.55,12 15,12M19.85,13.87C19.56,12.04 18.73,8.42 16.63,6.11C17,6.06 17.41,6 17.95,6C18.8,6.4 20.75,10.73 21,13.5C20.75,13.61 20.36,13.75 19.85,13.87Z" /></svg>',
|
|
29
|
+
maxWidth: "max-w-md",
|
|
30
|
+
center: false,
|
|
31
|
+
iconlink: mdiChevronRight,
|
|
32
|
+
nuxtLink: false,
|
|
33
|
+
to: '/',
|
|
34
|
+
isExternal: false,
|
|
35
|
+
disabled:false
|
|
33
36
|
})
|
|
34
37
|
|
|
35
|
-
const centerCard = computed(()=> {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
const centerCard = computed(() => {
|
|
39
|
+
if (props.center) {
|
|
40
|
+
return 'mx-auto'
|
|
41
|
+
}
|
|
42
|
+
return ''
|
|
40
43
|
})
|
|
41
44
|
|
|
45
|
+
const router = useRouter();
|
|
46
|
+
|
|
47
|
+
const navigate = (to: string) => {
|
|
48
|
+
if (!props.isExternal && !props.disabled) {
|
|
49
|
+
router.push(to);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
42
53
|
|
|
43
54
|
</script>
|
|
44
55
|
|
|
45
|
-
<template>
|
|
56
|
+
<template>
|
|
46
57
|
<div :class="`${centerCard} ${maxWidth}`">
|
|
47
58
|
<a v-if="isExternal" :href="to" target="_blank" rel="noopener noreferrer">
|
|
48
|
-
<EpCard
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
isLink
|
|
56
|
-
/>
|
|
59
|
+
<EpCard
|
|
60
|
+
:title="title"
|
|
61
|
+
:subtitle="subtitle"
|
|
62
|
+
:src="src"
|
|
63
|
+
:svg="svg"
|
|
64
|
+
:maxWidth="maxWidth"
|
|
65
|
+
:icon="iconlink"
|
|
66
|
+
isLink />
|
|
57
67
|
</a>
|
|
58
|
-
<
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
:maxWidth="maxWidth"
|
|
69
|
-
:icon="iconlink"
|
|
70
|
-
isLink
|
|
71
|
-
/>
|
|
72
|
-
</component>
|
|
68
|
+
<div @click="navigate(to)" v-else>
|
|
69
|
+
<EpCard
|
|
70
|
+
:title="title"
|
|
71
|
+
:subtitle="subtitle"
|
|
72
|
+
:src="src"
|
|
73
|
+
:svg="svg"
|
|
74
|
+
:maxWidth="maxWidth"
|
|
75
|
+
:icon="iconlink"
|
|
76
|
+
isLink />
|
|
77
|
+
</div>
|
|
73
78
|
|
|
74
79
|
|
|
75
80
|
</div>
|
|
76
|
-
|
|
81
|
+
|
|
77
82
|
</template>
|
|
@@ -3,15 +3,18 @@ import { toRefs, ref, computed } from "vue";
|
|
|
3
3
|
import { mdiChevronLeftCircleOutline } from "@mdi/js";
|
|
4
4
|
import { mdiChevronRightCircleOutline } from "@mdi/js";
|
|
5
5
|
import { type MediaCarousel } from "../../types/MediaCarousel";
|
|
6
|
-
import { type SizeThumbnail } from "../../types/Image";
|
|
6
|
+
import { InfoModal, type SizeThumbnail } from "../../types/Image";
|
|
7
7
|
import EpIcon from "../basics/EpIcon.vue";
|
|
8
8
|
import EpBtn from "../basics/EpBtn.vue";
|
|
9
9
|
import EpModal from "../interactions/EpModal.vue";
|
|
10
10
|
import EpImg from "../basics/EpImg.vue";
|
|
11
|
+
import EpImgCarousel from "../basics/EpImgCarousel.vue";
|
|
11
12
|
|
|
12
13
|
interface Props {
|
|
13
14
|
carrouselImg: MediaCarousel[];
|
|
15
|
+
title?: string;
|
|
14
16
|
gallery?: boolean;
|
|
17
|
+
puzzle?: boolean;
|
|
15
18
|
sizeThumbnail?: SizeThumbnail;
|
|
16
19
|
isCenter?:boolean;
|
|
17
20
|
labelClose?:string;
|
|
@@ -22,6 +25,7 @@ interface Props {
|
|
|
22
25
|
const props = withDefaults(defineProps<Props>(), {
|
|
23
26
|
gallery: false,
|
|
24
27
|
isCenter:false,
|
|
28
|
+
puzzle:false,
|
|
25
29
|
sizeThumbnail: "medium",
|
|
26
30
|
labelRef:"Référence",
|
|
27
31
|
labelClose:"Fermer",
|
|
@@ -29,6 +33,7 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
29
33
|
});
|
|
30
34
|
|
|
31
35
|
|
|
36
|
+
// Logique Carousel normal
|
|
32
37
|
const currentIndex = ref<number>(0);
|
|
33
38
|
const dialog = ref<boolean>(false);
|
|
34
39
|
|
|
@@ -48,19 +53,53 @@ const nextSlide = () => {
|
|
|
48
53
|
|
|
49
54
|
const isCenterStyle = computed(()=> {
|
|
50
55
|
return props.isCenter ? 'justify-center':''
|
|
51
|
-
})
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
// Logique Carousel gallery
|
|
61
|
+
const managedIndex = ref(0);
|
|
62
|
+
const managedInfoModal = ref({ src: '', caption: '', bib: ''} as InfoModal);
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
const newFocus = (index: number) => {
|
|
66
|
+
managedIndex.value = index;
|
|
67
|
+
managedInfoModal.value = { src: props.carrouselImg[index].src, caption: props.carrouselImg[index].caption, bib: props.carrouselImg[index].bib };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const managedPrevSlide = () => {
|
|
71
|
+
const isFirstSlide = managedIndex.value === 0;
|
|
72
|
+
const newIndex = isFirstSlide
|
|
73
|
+
? props.carrouselImg.length - 1
|
|
74
|
+
: managedIndex.value - 1;
|
|
75
|
+
managedIndex.value = newIndex;
|
|
76
|
+
managedInfoModal.value = { src: props.carrouselImg[newIndex].src, caption: props.carrouselImg[newIndex].caption, bib: props.carrouselImg[newIndex].bib };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const managedNextSlide = () => {
|
|
80
|
+
const isTheLastSlide = managedIndex.value === props.carrouselImg.length - 1;
|
|
81
|
+
const newIndex = isTheLastSlide ? 0 : managedIndex.value + 1;
|
|
82
|
+
managedIndex.value = newIndex;
|
|
83
|
+
managedInfoModal.value = { src: props.carrouselImg[newIndex].src, caption: props.carrouselImg[newIndex].caption, bib: props.carrouselImg[newIndex].bib };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
|
|
52
87
|
|
|
53
88
|
const { carrouselImg, sizeThumbnail } = toRefs(props);
|
|
54
89
|
</script>
|
|
55
90
|
|
|
56
91
|
<template>
|
|
92
|
+
|
|
93
|
+
<h2 v-if="props.title" class="text-xl font-semibold mt-10 mb-4 text-center">{{ props.title }}</h2>
|
|
94
|
+
|
|
95
|
+
|
|
57
96
|
<div v-if="!gallery">
|
|
58
97
|
<div class="flex items-center justify-center mb-2">
|
|
59
|
-
<button @click="prevSlide">
|
|
98
|
+
<button class="p-2" @click="prevSlide">
|
|
60
99
|
<EpIcon :icon-path="mdiChevronLeftCircleOutline"></EpIcon>
|
|
61
100
|
</button>
|
|
62
101
|
{{ currentIndex + 1 }}/{{ carrouselImg.length }}
|
|
63
|
-
<button @click="nextSlide">
|
|
102
|
+
<button class="p-2" @click="nextSlide">
|
|
64
103
|
<EpIcon :icon-path="mdiChevronRightCircleOutline"></EpIcon>
|
|
65
104
|
</button>
|
|
66
105
|
</div>
|
|
@@ -77,12 +116,12 @@ const { carrouselImg, sizeThumbnail } = toRefs(props);
|
|
|
77
116
|
<img
|
|
78
117
|
:src="carrouselImg[currentIndex].src"
|
|
79
118
|
alt="image"
|
|
80
|
-
class="rounded-sm"
|
|
119
|
+
class="rounded-sm m-auto"
|
|
81
120
|
/>
|
|
82
121
|
|
|
83
122
|
<div
|
|
84
123
|
v-if="carrouselImg[currentIndex]?.caption"
|
|
85
|
-
class="mt-2 text-sm text-base-dark dark:text-white"
|
|
124
|
+
class="mt-2 text-sm text-center text-base-dark dark:text-white"
|
|
86
125
|
>
|
|
87
126
|
{{ carrouselImg[currentIndex].caption }}
|
|
88
127
|
</div>
|
|
@@ -99,19 +138,43 @@ const { carrouselImg, sizeThumbnail } = toRefs(props);
|
|
|
99
138
|
</div>
|
|
100
139
|
</EpModal>
|
|
101
140
|
</div>
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
141
|
+
|
|
142
|
+
<div v-else-if="!puzzle" :class="`flex flex-wrap ${isCenterStyle}`">
|
|
143
|
+
<template v-for="(image, index) in carrouselImg" :key="`image-${image?.uid}`">
|
|
144
|
+
<EpImgCarousel
|
|
105
145
|
:src="image.src"
|
|
106
146
|
:bib="image.bib"
|
|
107
147
|
:caption="image.caption"
|
|
108
148
|
:label-ref="labelRef"
|
|
109
149
|
:label-close="labelClose"
|
|
110
|
-
thumbnail
|
|
111
150
|
:size-thumbnail="sizeThumbnail"
|
|
112
|
-
|
|
151
|
+
managed-modal
|
|
152
|
+
@new-focus="newFocus(index)"
|
|
153
|
+
:info-modal="managedInfoModal"
|
|
154
|
+
@prev-slide="managedPrevSlide"
|
|
155
|
+
@next-slide="managedNextSlide"
|
|
156
|
+
></EpImgCarousel>
|
|
157
|
+
</template>
|
|
158
|
+
</div>
|
|
159
|
+
|
|
160
|
+
<div v-else-if="puzzle" :class="`columns-3xs mx-5 gap-2`">
|
|
161
|
+
<template v-for="(image, index) in carrouselImg" :key="`image-${image?.uid}`">
|
|
162
|
+
<EpImgCarousel
|
|
163
|
+
:src="image.src"
|
|
164
|
+
:bib="image.bib"
|
|
165
|
+
:caption="image.caption"
|
|
166
|
+
:label-ref="labelRef"
|
|
167
|
+
:label-close="labelClose"
|
|
168
|
+
puzzle
|
|
169
|
+
managed-modal
|
|
170
|
+
@new-focus="newFocus(index)"
|
|
171
|
+
:info-modal="managedInfoModal"
|
|
172
|
+
@prev-slide="managedPrevSlide"
|
|
173
|
+
@next-slide="managedNextSlide"
|
|
174
|
+
></EpImgCarousel>
|
|
113
175
|
</template>
|
|
114
176
|
</div>
|
|
177
|
+
|
|
115
178
|
</template>
|
|
116
179
|
|
|
117
180
|
<style scoped>
|
package/dist/BgAudio-B8TWhPS4.js
DELETED