ep-lib-ts 1.1.3 → 1.1.4
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/components/basics/EpAvatar.vue.js +1 -55
- package/dist/components/basics/EpAvatar.vue.js.map +1 -1
- package/dist/components/basics/EpAvatar.vue2.js +55 -1
- package/dist/components/basics/EpAvatar.vue2.js.map +1 -1
- package/dist/components/basics/EpStackedList.vue.js +1 -1
- package/dist/components/educationals/EpBranchingScenario.vue2.js +2 -2
- package/dist/components/educationals/EpResource.vue.js +1 -1
- package/dist/components/educationals/EpResource.vue.js.map +1 -1
- package/dist/components/interactions/EpAssociation.vue.js +235 -0
- package/dist/components/interactions/EpAssociation.vue.js.map +1 -0
- package/dist/components/interactions/EpAssociation.vue2.js +5 -0
- package/dist/components/interactions/EpAssociation.vue2.js.map +1 -0
- package/dist/components/interactions/EpContentSlider.vue.js +2 -1
- package/dist/components/interactions/EpContentSlider.vue.js.map +1 -1
- package/dist/components/interactions/EpQuestion.vue.js +1 -1
- package/dist/components/interactions/EpQuestion.vue.js.map +1 -1
- package/dist/components/medias/EpHierarchy.vue2.js +1 -1
- package/dist/components/medias/EpHierarchy.vue2.js.map +1 -1
- package/dist/components/tools/AssociationNode.vue.js +5 -0
- package/dist/components/tools/AssociationNode.vue.js.map +1 -0
- package/dist/components/tools/AssociationNode.vue2.js +58 -0
- package/dist/components/tools/AssociationNode.vue2.js.map +1 -0
- package/dist/components/tools/Details.vue.js +1 -56
- package/dist/components/tools/Details.vue.js.map +1 -1
- package/dist/components/tools/Details.vue2.js +56 -1
- package/dist/components/tools/Details.vue2.js.map +1 -1
- package/dist/components/tools/TextMedia.vue.js +1 -50
- package/dist/components/tools/TextMedia.vue.js.map +1 -1
- package/dist/components/tools/TextMedia.vue2.js +50 -1
- package/dist/components/tools/TextMedia.vue2.js.map +1 -1
- package/dist/components/tools/TwoColsMedia.vue2.js +2 -2
- package/dist/components/tools/TwoColsMedia.vue2.js.map +1 -1
- package/dist/entry/interactions/EpAssociation.d.ts +6 -0
- package/dist/entry/interactions/EpAssociation.js +7 -0
- package/dist/entry/interactions/EpAssociation.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +154 -151
- package/dist/index.js.map +1 -1
- package/dist/style.css +48 -48
- package/dist/types/Association.d.ts +17 -0
- package/dist/types/interactions/EpAssociation.d.ts +8 -0
- package/package.json +8 -3
|
@@ -1,58 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { typeAvatar } from "../../types/Avatar.js";
|
|
3
|
-
import useColors from "../../composables/useColors.js";
|
|
4
|
-
const _hoisted_1 = { key: 0 };
|
|
5
|
-
const _hoisted_2 = ["src", "alt"];
|
|
6
|
-
const _hoisted_3 = { key: 1 };
|
|
7
|
-
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
8
|
-
__name: "EpAvatar",
|
|
9
|
-
props: {
|
|
10
|
-
src: { default: "" },
|
|
11
|
-
alt: { default: "" },
|
|
12
|
-
color: { default: "primary" },
|
|
13
|
-
size: { default: "small" },
|
|
14
|
-
variant: { default: "circle" },
|
|
15
|
-
name: { default: "" }
|
|
16
|
-
},
|
|
17
|
-
setup(__props) {
|
|
18
|
-
const props = __props;
|
|
19
|
-
const style = computed(() => {
|
|
20
|
-
return props.variant;
|
|
21
|
-
});
|
|
22
|
-
const size = computed(() => {
|
|
23
|
-
return props.size;
|
|
24
|
-
});
|
|
25
|
-
const final_style = computed(() => {
|
|
26
|
-
var _a;
|
|
27
|
-
return `${(_a = typeAvatar[style.value]) == null ? void 0 : _a[size.value]}`;
|
|
28
|
-
});
|
|
29
|
-
const bgcolor = computed(() => {
|
|
30
|
-
return useColors(props.color);
|
|
31
|
-
});
|
|
32
|
-
const final_name = computed(() => {
|
|
33
|
-
if (props.name.length > 2) {
|
|
34
|
-
return props.name.slice(0, 2);
|
|
35
|
-
} else {
|
|
36
|
-
return props.name;
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
return (_ctx, _cache) => {
|
|
40
|
-
return openBlock(), createElementBlock("div", null, [
|
|
41
|
-
props.src != "" ? (openBlock(), createElementBlock("div", _hoisted_1, [
|
|
42
|
-
createElementVNode("img", {
|
|
43
|
-
src: props.src,
|
|
44
|
-
alt: props.alt,
|
|
45
|
-
class: normalizeClass(`${final_style.value} `)
|
|
46
|
-
}, null, 10, _hoisted_2)
|
|
47
|
-
])) : props.src == "" ? (openBlock(), createElementBlock("div", _hoisted_3, [
|
|
48
|
-
createElementVNode("div", {
|
|
49
|
-
class: normalizeClass(`${final_style.value} ${bgcolor.value} justify-center font-bold text-white flex items-center`)
|
|
50
|
-
}, toDisplayString(final_name.value), 3)
|
|
51
|
-
])) : createCommentVNode("", true)
|
|
52
|
-
]);
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
});
|
|
1
|
+
import _sfc_main from "./EpAvatar.vue2.js";
|
|
56
2
|
export {
|
|
57
3
|
_sfc_main as default
|
|
58
4
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EpAvatar.vue.js","sources":[
|
|
1
|
+
{"version":3,"file":"EpAvatar.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,4 +1,58 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { defineComponent, computed, createElementBlock, openBlock, createCommentVNode, createElementVNode, normalizeClass, toDisplayString } from "vue";
|
|
2
|
+
import { typeAvatar } from "../../types/Avatar.js";
|
|
3
|
+
import useColors from "../../composables/useColors.js";
|
|
4
|
+
const _hoisted_1 = { key: 0 };
|
|
5
|
+
const _hoisted_2 = ["src", "alt"];
|
|
6
|
+
const _hoisted_3 = { key: 1 };
|
|
7
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
8
|
+
__name: "EpAvatar",
|
|
9
|
+
props: {
|
|
10
|
+
src: { default: "" },
|
|
11
|
+
alt: { default: "" },
|
|
12
|
+
color: { default: "primary" },
|
|
13
|
+
size: { default: "small" },
|
|
14
|
+
variant: { default: "circle" },
|
|
15
|
+
name: { default: "" }
|
|
16
|
+
},
|
|
17
|
+
setup(__props) {
|
|
18
|
+
const props = __props;
|
|
19
|
+
const style = computed(() => {
|
|
20
|
+
return props.variant;
|
|
21
|
+
});
|
|
22
|
+
const size = computed(() => {
|
|
23
|
+
return props.size;
|
|
24
|
+
});
|
|
25
|
+
const final_style = computed(() => {
|
|
26
|
+
var _a;
|
|
27
|
+
return `${(_a = typeAvatar[style.value]) == null ? void 0 : _a[size.value]}`;
|
|
28
|
+
});
|
|
29
|
+
const bgcolor = computed(() => {
|
|
30
|
+
return useColors(props.color);
|
|
31
|
+
});
|
|
32
|
+
const final_name = computed(() => {
|
|
33
|
+
if (props.name.length > 2) {
|
|
34
|
+
return props.name.slice(0, 2);
|
|
35
|
+
} else {
|
|
36
|
+
return props.name;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
return (_ctx, _cache) => {
|
|
40
|
+
return openBlock(), createElementBlock("div", null, [
|
|
41
|
+
props.src != "" ? (openBlock(), createElementBlock("div", _hoisted_1, [
|
|
42
|
+
createElementVNode("img", {
|
|
43
|
+
src: props.src,
|
|
44
|
+
alt: props.alt,
|
|
45
|
+
class: normalizeClass(`${final_style.value} `)
|
|
46
|
+
}, null, 10, _hoisted_2)
|
|
47
|
+
])) : props.src == "" ? (openBlock(), createElementBlock("div", _hoisted_3, [
|
|
48
|
+
createElementVNode("div", {
|
|
49
|
+
class: normalizeClass(`${final_style.value} ${bgcolor.value} justify-center font-bold text-white flex items-center`)
|
|
50
|
+
}, toDisplayString(final_name.value), 3)
|
|
51
|
+
])) : createCommentVNode("", true)
|
|
52
|
+
]);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
});
|
|
2
56
|
export {
|
|
3
57
|
_sfc_main as default
|
|
4
58
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EpAvatar.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"EpAvatar.vue2.js","sources":["../../../src/components/basics/EpAvatar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { typeAvatar } from \"../../types/Avatar\";\nimport type { EpAvatarProps } from \"../../types/basics/EpAvatar\";\nimport useColors from \"../../composables/useColors\";\n\n// define parameter and default valule\nconst props = withDefaults(defineProps<EpAvatarProps>(), {\n src: \"\",\n alt: \"\",\n color: \"primary\",\n size: \"small\",\n variant: \"circle\",\n name: \"\",\n});\n\nconst style = computed(() => {\n return props.variant;\n});\n\nconst size = computed(() => {\n return props.size;\n});\n\nconst final_style = computed(() => {\n return `${typeAvatar[style.value]?.[size.value]}`;\n});\n\nconst bgcolor = computed(() => {\n return useColors(props.color);\n});\n\nconst final_name = computed(() => {\n if (props.name.length > 2) {\n return props.name.slice(0, 2);\n } else {\n return props.name;\n }\n});\n</script>\n<template>\n <div>\n <div v-if=\"props.src != ''\">\n <img :src=\"props.src\" :alt=\"props.alt\" :class=\"`${final_style} `\" />\n </div>\n <div v-else-if=\"props.src == ''\">\n <div\n :class=\"`${final_style} ${bgcolor} justify-center font-bold text-white flex items-center`\"\n >\n {{ final_name }}\n </div>\n </div>\n </div>\n</template>\n"],"names":["_createElementBlock","_createElementVNode","_normalizeClass"],"mappings":";;;;;;;;;;;;;;;;;AAOA,UAAM,QAAQ;AASd,UAAM,QAAQ,SAAS,MAAM;AACzB,aAAO,MAAM;AAAA,IACjB,CAAC;AAED,UAAM,OAAO,SAAS,MAAM;AACxB,aAAO,MAAM;AAAA,IACjB,CAAC;AAED,UAAM,cAAc,SAAS,MAAM;;AAC/B,aAAO,IAAG,gBAAW,MAAM,KAAK,MAAtB,mBAA0B,KAAK,MAAM;AAAA,IACnD,CAAC;AAED,UAAM,UAAU,SAAS,MAAM;AAC3B,aAAO,UAAU,MAAM,KAAK;AAAA,IAChC,CAAC;AAED,UAAM,aAAa,SAAS,MAAM;AAC9B,UAAI,MAAM,KAAK,SAAS,GAAG;AACvB,eAAO,MAAM,KAAK,MAAM,GAAG,CAAC;AAAA,MAChC,OAAO;AACH,eAAO,MAAM;AAAA,MACjB;AAAA,IACJ,CAAC;;0BAGGA,mBAWM,OAAA,MAAA;AAAA,QAVS,MAAM,OAAG,mBAApBA,mBAEM,OAAA,YAAA;AAAA,UADFC,mBAAoE,OAAA;AAAA,YAA9D,KAAK,MAAM;AAAA,YAAM,KAAK,MAAM;AAAA,YAAM,yBAAU,YAAA,KAAW,GAAA;AAAA,UAAA;cAEjD,MAAM,OAAG,mBAAzBD,mBAMM,OAAA,YAAA;AAAA,UALFC,mBAIM,OAAA;AAAA,YAHD,OAAKC,eAAA,GAAK,YAAA,KAAW,KAAK,QAAA,KAAO,yDAAA;AAAA,UAAA,mBAE/B,WAAA,KAAU,GAAA,CAAA;AAAA,QAAA;;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineComponent, computed, createElementBlock, openBlock, normalizeClass, Fragment, renderList, createElementVNode, createBlock, createCommentVNode, mergeProps, toDisplayString, unref, createVNode } from "vue";
|
|
2
|
-
import _sfc_main$1 from "./EpAvatar.
|
|
2
|
+
import _sfc_main$1 from "./EpAvatar.vue2.js";
|
|
3
3
|
import _sfc_main$2 from "./EpIcon.vue.js";
|
|
4
4
|
import { useRenderText } from "../../composables/useRenderText.js";
|
|
5
5
|
import { roundedType } from "../../types/StackedList.js";
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { defineComponent, ref, computed, createElementBlock, openBlock, createElementVNode, normalizeStyle, createCommentVNode, toDisplayString, createVNode, withCtx, unref, normalizeClass, createTextVNode, createBlock, Fragment, renderList } from "vue";
|
|
2
2
|
import { useRenderText } from "../../composables/useRenderText.js";
|
|
3
3
|
import _sfc_main$2 from "../basics/EpIcon.vue.js";
|
|
4
|
-
import _sfc_main$4 from "../tools/Details.
|
|
4
|
+
import _sfc_main$4 from "../tools/Details.vue2.js";
|
|
5
5
|
import _sfc_main$5 from "../interactions/EpModal.vue.js";
|
|
6
6
|
/* empty css */
|
|
7
7
|
import Comp from "../medias/EpHierarchy.vue.js";
|
|
8
8
|
import _sfc_main$1 from "../basics/EpBtn.vue.js";
|
|
9
9
|
import { mdiArrowLeft } from "@mdi/js";
|
|
10
|
-
import _sfc_main$3 from "../tools/TextMedia.
|
|
10
|
+
import _sfc_main$3 from "../tools/TextMedia.vue2.js";
|
|
11
11
|
const _hoisted_1 = { class: "mb-2" };
|
|
12
12
|
const _hoisted_2 = { class: "font-bold text-3xl text-center" };
|
|
13
13
|
const _hoisted_3 = {
|
|
@@ -43,7 +43,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
43
43
|
return defineAsyncComponent(() => import("./EpReading.vue2.js"));
|
|
44
44
|
}
|
|
45
45
|
return defineAsyncComponent(
|
|
46
|
-
() => __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "../basics/EpAvatar.vue": () => import("../basics/EpAvatar.
|
|
46
|
+
() => __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "../basics/EpAvatar.vue": () => import("../basics/EpAvatar.vue.js"), "../basics/EpBadge.vue": () => import("../basics/EpBadge.vue.js"), "../basics/EpBtn.vue": () => import("../basics/EpBtn.vue2.js"), "../basics/EpCard.vue": () => import("../basics/EpCard.vue2.js"), "../basics/EpChip.vue": () => import("../basics/EpChip.vue2.js"), "../basics/EpDivider.vue": () => import("../basics/EpDivider.vue2.js"), "../basics/EpFlex.vue": () => import("../basics/EpFlex.vue2.js"), "../basics/EpHover.vue": () => import("../basics/EpHover.vue2.js"), "../basics/EpHoverCard.vue": () => import("../basics/EpHoverCard.vue2.js"), "../basics/EpIcon.vue": () => import("../basics/EpIcon.vue2.js"), "../basics/EpImg.vue": () => import("../basics/EpImg.vue2.js"), "../basics/EpImgCarousel.vue": () => import("../basics/EpImgCarousel.vue2.js"), "../basics/EpList.vue": () => import("../basics/EpList.vue.js"), "../basics/EpListItem.vue": () => import("../basics/EpListItem.vue2.js"), "../basics/EpSection.vue": () => import("../basics/EpSection.vue2.js"), "../basics/EpSectionCols.vue": () => import("../basics/EpSectionCols.vue2.js"), "../basics/EpSpinner.vue": () => import("../basics/EpSpinner.vue2.js"), "../basics/EpStackedList.vue": () => import("../basics/EpStackedList.vue2.js"), "../basics/EpTable.vue": () => import("../basics/EpTable.vue2.js"), "../basics/EpText.vue": () => import("../basics/EpText.vue2.js"), "../charts/EpBarChart.vue": () => import("../charts/EpBarChart.vue2.js"), "../charts/EpFunnelChart.vue": () => import("../charts/EpFunnelChart.vue2.js"), "../charts/EpLineChart.vue": () => import("../charts/EpLineChart.vue2.js"), "../charts/EpPieChart.vue": () => import("../charts/EpPieChart.vue2.js"), "./EpBranchingScenario.vue": () => import("./EpBranchingScenario.vue.js"), "./EpCodeblock.vue": () => import("./EpCodeblock.vue3.js"), "./EpConclusion.vue": () => import("./EpConclusion.vue2.js"), "./EpDescription.vue": () => import("./EpDescription.vue2.js"), "./EpDocument.vue": () => import("./EpDocument.vue2.js"), "./EpEdu.vue": () => import("./EpEdu.vue2.js"), "./EpInstructions.vue": () => import("./EpInstructions.vue2.js"), "./EpIntroduction.vue": () => import("./EpIntroduction.vue2.js"), "./EpObjective.vue": () => import("./EpObjective.vue2.js"), "./EpReading.vue": () => import("./EpReading.vue2.js"), "./EpResource.vue": () => import("./EpResource.vue2.js"), "./EpScope.vue": () => import("./EpScope.vue2.js"), "./EpSegmentedBox.vue": () => import("./EpSegmentedBox.vue2.js"), "./EpSpecificObjective.vue": () => import("./EpSpecificObjective.vue2.js"), "../forms/EpCheckbox.vue": () => import("../forms/EpCheckbox.vue.js"), "../forms/EpInput.vue": () => import("../forms/EpInput.vue.js"), "../forms/EpRadio.vue": () => import("../forms/EpRadio.vue.js"), "../forms/EpRadioSummative.vue": () => import("../forms/EpRadioSummative.vue.js"), "../forms/EpSelect.vue": () => import("../forms/EpSelect.vue.js"), "../forms/EpSwitch.vue": () => import("../forms/EpSwitch.vue.js"), "../forms/EpTextarea.vue": () => import("../forms/EpTextarea.vue.js"), "../forms/EpToggle.vue": () => import("../forms/EpToggle.vue.js"), "../interactions/Ep360Image.vue": () => import("../interactions/Ep360Image.vue.js"), "../interactions/Ep360Video.vue": () => import("../interactions/Ep360Video.vue.js"), "../interactions/EpAccordeon.vue": () => import("../interactions/EpAccordeon.vue.js"), "../interactions/EpAssociation.vue": () => import("../interactions/EpAssociation.vue2.js"), "../interactions/EpContentSlider.vue": () => import("../interactions/EpContentSlider.vue2.js"), "../interactions/EpDarkMode.vue": () => import("../interactions/EpDarkMode.vue2.js"), "../interactions/EpDraggable.vue": () => import("../interactions/EpDraggable.vue2.js"), "../interactions/EpFlipCard.vue": () => import("../interactions/EpFlipCard.vue.js"), "../interactions/EpHotSpot.vue": () => import("../interactions/EpHotSpot.vue2.js"), "../interactions/EpModal.vue": () => import("../interactions/EpModal.vue3.js"), "../interactions/EpQuestion.vue": () => import("../interactions/EpQuestion.vue2.js"), "../interactions/EpSummativeTable.vue": () => import("../interactions/EpSummativeTable.vue2.js"), "../interactions/EpSvgShow.vue": () => import("../interactions/EpSvgShow.vue2.js"), "../interactions/EpTabs.vue": () => import("../interactions/EpTabs.vue.js"), "../interactions/EpTooltip.vue": () => import("../interactions/EpTooltip.vue2.js"), "../medias/EpAudio.vue": () => import("../medias/EpAudio.vue2.js"), "../medias/EpCardLink.vue": () => import("../medias/EpCardLink.vue2.js"), "../medias/EpCarousel.vue": () => import("../medias/EpCarousel.vue2.js"), "../medias/EpHierarchy.vue": () => import("../medias/EpHierarchy.vue.js"), "../medias/EpIframe.vue": () => import("../medias/EpIframe.vue2.js"), "../medias/EpKatex.vue": () => import("../medias/EpKatex.vue.js"), "../medias/EpLink.vue": () => import("../medias/EpLink.vue2.js"), "../medias/EpLinkVersion.vue": () => import("../medias/EpLinkVersion.vue2.js"), "../medias/EpLottieSvg.vue": () => import("../medias/EpLottieSvg.vue2.js"), "../medias/EpSensibleImage.vue": () => import("../medias/EpSensibleImage.vue.js"), "../medias/EpSoftware.vue": () => import("../medias/EpSoftware.vue2.js"), "../medias/EpSvg.vue": () => import("../medias/EpSvg.vue2.js"), "../medias/EpTerm.vue": () => import("../medias/EpTerm.vue2.js"), "../medias/EpTimeLine.vue": () => import("../medias/EpTimeLine.vue.js"), "../medias/EpVideo.vue": () => import("../medias/EpVideo.vue2.js"), "../medias/EpVideoPanopto.vue": () => import("../medias/EpVideoPanopto.vue2.js"), "../medias/EpWordDef.vue": () => import("../medias/EpWordDef.vue2.js"), "../signages/EpAlert.vue": () => import("../signages/EpAlert.vue.js"), "../signages/EpBadge.vue": () => import("../signages/EpBadge.vue2.js"), "../signages/EpHeader.vue": () => import("../signages/EpHeader.vue2.js"), "../signages/EpNothing.vue": () => import("../signages/EpNothing.vue.js"), "../signages/EpQuote.vue": () => import("../signages/EpQuote.vue2.js"), "../signages/EpSkeleton.vue": () => import("../signages/EpSkeleton.vue.js"), "../tools/AssociationNode.vue": () => import("../tools/AssociationNode.vue.js"), "../tools/AsyncKatexRender.vue": () => import("../tools/AsyncKatexRender.vue.js"), "../tools/BgAudio.vue": () => import("../tools/BgAudio.vue.js"), "../tools/Details.vue": () => import("../tools/Details.vue.js"), "../tools/DisplayBox.vue": () => import("../tools/DisplayBox.vue.js"), "../tools/RenderTextNode.vue": () => import("../tools/RenderTextNode.vue2.js"), "../tools/SegmentedBox.vue": () => import("../tools/SegmentedBox.vue.js"), "../tools/SvgFilter.vue": () => import("../tools/SvgFilter.vue.js"), "../tools/TextMedia.vue": () => import("../tools/TextMedia.vue.js"), "../tools/TimelineItem.vue": () => import("../tools/TimelineItem.vue.js"), "../tools/TwoColsMedia.vue": () => import("../tools/TwoColsMedia.vue.js") }), `../${componentToLoad.path}/${componentToLoad.name}.vue`, 3)
|
|
47
47
|
);
|
|
48
48
|
};
|
|
49
49
|
const typeRess = computed(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EpResource.vue.js","sources":["../../../src/components/educationals/EpResource.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { defineAsyncComponent, computed, toRefs } from \"vue\";\nimport { useComponent } from \"~/composables/useComponent\";\nimport type { EpResourceProps } from \"~/types/educationals/EpResource\";\n\nconst { type = \"neutral\", resource, pages } = defineProps<EpResourceProps>();\n\nconst resourceInfo = computed(() => {\n if (!resource.hasOwnProperty(\"content\")) {\n return \"EpNothing\";\n }\n //console.log(resource)\n const typeRess = Object.keys(resource.content)[0];\n const ress = Object.assign({}, resource.content[typeRess]);\n\n ress.pages = pages;\n ress.type = typeRess;\n ress.intentions = pages;\n if (typeRess === \"clip\") {\n ress.src = ress.url;\n }\n if (typeRess === \"website\") {\n ress.href = ress.url;\n ress.label = ress.title;\n }\n if (typeRess === \"book\" && pages) {\n //ress.intentions = pages\n ress.pages = null;\n }\n if (ress.version_link) {\n ress.url = ress.version_link.url;\n }\n\n return ress;\n});\n\n//get Component asyncComponent\nconst getCompontent = (name: string | undefined) => {\n const componentToLoad = useComponent(name);\n //console.log(componentToLoad)\n if (componentToLoad.name === \"EpNothing\") {\n return defineAsyncComponent(() => import(\"../signages/EpNothing.vue\"));\n }\n if (componentToLoad.name === \"EpReading\") {\n return defineAsyncComponent(() => import(`./EpReading.vue`));\n }\n return defineAsyncComponent(\n () => import(`../${componentToLoad.path}/${componentToLoad.name}.vue`)\n );\n};\n\nconst typeRess = computed(() => {\n if (resourceInfo.value.type && resourceInfo.value.type === \"website\") {\n if (type === \"base\") {\n return \"primary\";\n }\n }\n return type;\n});\n</script>\n\n<template>\n <component\n :is=\"getCompontent(resourceInfo.type)\"\n v-bind=\"{ ...resourceInfo }\"\n :mandateLevel=\"mandateLevel\"\n :intentions=\"pages\"\n :type=\"typeRess\"\n ></component>\n</template>\n"],"names":["typeRess","_createBlock","_resolveDynamicComponent","_mergeProps","mandateLevel","pages"],"mappings":";;;;;;;;;;;;AAOA,UAAM,eAAe,SAAS,MAAM;AAClC,UAAI,CAAC,QAAA,SAAS,eAAe,SAAS,GAAG;AACvC,eAAO;AAAA,MACT;AAEA,YAAMA,YAAW,OAAO,KAAK,QAAA,SAAS,OAAO,EAAE,CAAC;AAChD,YAAM,OAAO,OAAO,OAAO,CAAA,GAAI,iBAAS,QAAQA,SAAQ,CAAC;AAEzD,WAAK,QAAQ,QAAA;AACb,WAAK,OAAOA;AACZ,WAAK,aAAa,QAAA;AAClB,UAAIA,cAAa,QAAQ;AACvB,aAAK,MAAM,KAAK;AAAA,MAClB;AACA,UAAIA,cAAa,WAAW;AAC1B,aAAK,OAAO,KAAK;AACjB,aAAK,QAAQ,KAAK;AAAA,MACpB;AACA,UAAIA,cAAa,UAAU,QAAA,OAAO;AAEhC,aAAK,QAAQ;AAAA,MACf;AACA,UAAI,KAAK,cAAc;AACrB,aAAK,MAAM,KAAK,aAAa;AAAA,MAC/B;AAEA,aAAO;AAAA,IACT,CAAC;AAGD,UAAM,gBAAgB,CAAC,SAA6B;AAClD,YAAM,kBAAkB,aAAa,IAAI;AAEzC,UAAI,gBAAgB,SAAS,aAAa;AACxC,eAAO,qBAAqB,MAAM,OAAO,8BAA2B,CAAC;AAAA,MACvE;AACA,UAAI,gBAAgB,SAAS,aAAa;AACxC,eAAO,qBAAqB,MAAM,OAAO,qBAAiB,CAAC;AAAA,MAC7D;AACA,aAAO;AAAA,QACL,MAAM,qCAAA,uBAAA,OAAA,EAAA,0BAAA,MAAA,OAAA,
|
|
1
|
+
{"version":3,"file":"EpResource.vue.js","sources":["../../../src/components/educationals/EpResource.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { defineAsyncComponent, computed, toRefs } from \"vue\";\nimport { useComponent } from \"~/composables/useComponent\";\nimport type { EpResourceProps } from \"~/types/educationals/EpResource\";\n\nconst { type = \"neutral\", resource, pages } = defineProps<EpResourceProps>();\n\nconst resourceInfo = computed(() => {\n if (!resource.hasOwnProperty(\"content\")) {\n return \"EpNothing\";\n }\n //console.log(resource)\n const typeRess = Object.keys(resource.content)[0];\n const ress = Object.assign({}, resource.content[typeRess]);\n\n ress.pages = pages;\n ress.type = typeRess;\n ress.intentions = pages;\n if (typeRess === \"clip\") {\n ress.src = ress.url;\n }\n if (typeRess === \"website\") {\n ress.href = ress.url;\n ress.label = ress.title;\n }\n if (typeRess === \"book\" && pages) {\n //ress.intentions = pages\n ress.pages = null;\n }\n if (ress.version_link) {\n ress.url = ress.version_link.url;\n }\n\n return ress;\n});\n\n//get Component asyncComponent\nconst getCompontent = (name: string | undefined) => {\n const componentToLoad = useComponent(name);\n //console.log(componentToLoad)\n if (componentToLoad.name === \"EpNothing\") {\n return defineAsyncComponent(() => import(\"../signages/EpNothing.vue\"));\n }\n if (componentToLoad.name === \"EpReading\") {\n return defineAsyncComponent(() => import(`./EpReading.vue`));\n }\n return defineAsyncComponent(\n () => import(`../${componentToLoad.path}/${componentToLoad.name}.vue`)\n );\n};\n\nconst typeRess = computed(() => {\n if (resourceInfo.value.type && resourceInfo.value.type === \"website\") {\n if (type === \"base\") {\n return \"primary\";\n }\n }\n return type;\n});\n</script>\n\n<template>\n <component\n :is=\"getCompontent(resourceInfo.type)\"\n v-bind=\"{ ...resourceInfo }\"\n :mandateLevel=\"mandateLevel\"\n :intentions=\"pages\"\n :type=\"typeRess\"\n ></component>\n</template>\n"],"names":["typeRess","_createBlock","_resolveDynamicComponent","_mergeProps","mandateLevel","pages"],"mappings":"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"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { defineComponent, computed, ref, createElementBlock, openBlock, Fragment, createElementVNode, createCommentVNode, createVNode, unref, withCtx, normalizeProps, guardReactiveProps, toDisplayString, normalizeClass } from "vue";
|
|
2
|
+
import { useVueFlow, VueFlow } from "@vue-flow/core";
|
|
3
|
+
import { useCreateUid } from "../../composables/useCreateUid.js";
|
|
4
|
+
import _sfc_main$1 from "../tools/AssociationNode.vue2.js";
|
|
5
|
+
const _hoisted_1 = {
|
|
6
|
+
class: "border-2 rounded",
|
|
7
|
+
style: { width: "90%", height: "500px", margin: "auto" }
|
|
8
|
+
};
|
|
9
|
+
const _hoisted_2 = { class: "p-2 text-center text-sm text-neutral-300" };
|
|
10
|
+
const _hoisted_3 = { key: 0 };
|
|
11
|
+
const _hoisted_4 = { key: 1 };
|
|
12
|
+
const _hoisted_5 = {
|
|
13
|
+
key: 0,
|
|
14
|
+
class: "flex items-center justify-around"
|
|
15
|
+
};
|
|
16
|
+
const _hoisted_6 = ["disabled"];
|
|
17
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
18
|
+
__name: "EpAssociation",
|
|
19
|
+
props: {
|
|
20
|
+
leftOptions: {},
|
|
21
|
+
rightOptions: {},
|
|
22
|
+
interactive: { type: Boolean, default: false },
|
|
23
|
+
mustTry: { type: Boolean, default: false }
|
|
24
|
+
},
|
|
25
|
+
setup(__props) {
|
|
26
|
+
const props = __props;
|
|
27
|
+
const id = useCreateUid();
|
|
28
|
+
const { fitView, onEdgeDoubleClick } = useVueFlow({ id });
|
|
29
|
+
const initialNodes = computed(() => {
|
|
30
|
+
let left = props.leftOptions.map((option, idx) => {
|
|
31
|
+
var _a;
|
|
32
|
+
return {
|
|
33
|
+
id: option.uid,
|
|
34
|
+
type: "association",
|
|
35
|
+
position: (_a = option.position) != null ? _a : { x: 70, y: 50 + idx * 120 },
|
|
36
|
+
data: {
|
|
37
|
+
label: option.text,
|
|
38
|
+
index: idx,
|
|
39
|
+
left: true
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
let right = props.rightOptions.map((option, idx) => {
|
|
44
|
+
var _a;
|
|
45
|
+
return {
|
|
46
|
+
id: option.uid,
|
|
47
|
+
type: "association",
|
|
48
|
+
position: (_a = option.position) != null ? _a : { x: 550, y: 50 + idx * 120 },
|
|
49
|
+
data: {
|
|
50
|
+
label: option.text,
|
|
51
|
+
index: idx,
|
|
52
|
+
left: false
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
return [...left, ...right];
|
|
57
|
+
});
|
|
58
|
+
const nodes = ref(initialNodes.value);
|
|
59
|
+
const correctEdges = computed(() => {
|
|
60
|
+
return props.leftOptions.flatMap((option) => {
|
|
61
|
+
return option.answers.map((answer) => {
|
|
62
|
+
return {
|
|
63
|
+
id: "e" + option.uid + "->" + answer,
|
|
64
|
+
type: "straight",
|
|
65
|
+
source: option.uid,
|
|
66
|
+
target: answer,
|
|
67
|
+
animated: false,
|
|
68
|
+
style: {
|
|
69
|
+
strokeWidth: 3
|
|
70
|
+
},
|
|
71
|
+
updatable: false
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
const edges = ref([]);
|
|
77
|
+
const trying = ref(true);
|
|
78
|
+
const solution = ref(false);
|
|
79
|
+
const validating = ref(false);
|
|
80
|
+
const validate = () => {
|
|
81
|
+
trying.value = false;
|
|
82
|
+
solution.value = false;
|
|
83
|
+
validating.value = true;
|
|
84
|
+
let incorrectNodes = /* @__PURE__ */ new Set();
|
|
85
|
+
edges.value = edges.value.map((edge) => {
|
|
86
|
+
let inside = false;
|
|
87
|
+
for (let correctEdge of correctEdges.value) {
|
|
88
|
+
if (edge.id == correctEdge.id)
|
|
89
|
+
inside = true;
|
|
90
|
+
}
|
|
91
|
+
if (!inside) {
|
|
92
|
+
incorrectNodes.add(edge.source);
|
|
93
|
+
incorrectNodes.add(edge.target);
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
...edge,
|
|
97
|
+
style: {
|
|
98
|
+
...edge.style,
|
|
99
|
+
stroke: inside ? "#16a34a" : "#dc2626"
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
for (let correctEdge of correctEdges.value) {
|
|
104
|
+
let inside = false;
|
|
105
|
+
for (let edge of edges.value) {
|
|
106
|
+
if (edge.id == correctEdge.id)
|
|
107
|
+
inside = true;
|
|
108
|
+
}
|
|
109
|
+
if (!inside) {
|
|
110
|
+
incorrectNodes.add(correctEdge.source);
|
|
111
|
+
incorrectNodes.add(correctEdge.target);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
nodes.value = nodes.value.map((node) => {
|
|
115
|
+
console.log("here");
|
|
116
|
+
if (incorrectNodes.has(node.id))
|
|
117
|
+
return {
|
|
118
|
+
...node,
|
|
119
|
+
data: {
|
|
120
|
+
...node.data,
|
|
121
|
+
mode: "wrong"
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
else
|
|
125
|
+
return {
|
|
126
|
+
...node,
|
|
127
|
+
data: {
|
|
128
|
+
...node.data,
|
|
129
|
+
mode: "correct"
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
const retry = () => {
|
|
135
|
+
trying.value = true;
|
|
136
|
+
solution.value = false;
|
|
137
|
+
validating.value = false;
|
|
138
|
+
edges.value = [];
|
|
139
|
+
nodes.value = nodes.value.map((node) => {
|
|
140
|
+
return {
|
|
141
|
+
...node,
|
|
142
|
+
data: {
|
|
143
|
+
...node.data,
|
|
144
|
+
mode: "neutral"
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
});
|
|
148
|
+
};
|
|
149
|
+
const showAnswer = () => {
|
|
150
|
+
fitView();
|
|
151
|
+
solution.value = true;
|
|
152
|
+
trying.value = false;
|
|
153
|
+
validating.value = false;
|
|
154
|
+
edges.value = correctEdges.value;
|
|
155
|
+
nodes.value = nodes.value.map((node) => {
|
|
156
|
+
return {
|
|
157
|
+
...node,
|
|
158
|
+
data: {
|
|
159
|
+
...node.data,
|
|
160
|
+
mode: "neutral"
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
});
|
|
164
|
+
};
|
|
165
|
+
const onConnect = (connection) => {
|
|
166
|
+
let newEdge = {
|
|
167
|
+
id: "e" + connection.source + "->" + connection.target,
|
|
168
|
+
type: "straight",
|
|
169
|
+
source: connection.source,
|
|
170
|
+
target: connection.target,
|
|
171
|
+
animated: false,
|
|
172
|
+
updatable: false,
|
|
173
|
+
style: {
|
|
174
|
+
strokeWidth: 3
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
edges.value = [...edges.value, newEdge];
|
|
178
|
+
};
|
|
179
|
+
onEdgeDoubleClick((event) => {
|
|
180
|
+
if (trying.value) {
|
|
181
|
+
edges.value = edges.value.filter((edge) => {
|
|
182
|
+
return edge.id !== event.edge.id;
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
console.log("edge double clicked", event);
|
|
186
|
+
});
|
|
187
|
+
return (_ctx, _cache) => {
|
|
188
|
+
return openBlock(), createElementBlock(Fragment, null, [
|
|
189
|
+
createElementVNode("div", _hoisted_1, [
|
|
190
|
+
createVNode(unref(VueFlow), {
|
|
191
|
+
onPaneReady: _cache[0] || (_cache[0] = () => {
|
|
192
|
+
unref(fitView)();
|
|
193
|
+
}),
|
|
194
|
+
onConnect,
|
|
195
|
+
id: unref(id),
|
|
196
|
+
"max-zoom": 4,
|
|
197
|
+
"min-zoom": 0.1,
|
|
198
|
+
nodes: nodes.value,
|
|
199
|
+
edges: _ctx.interactive ? edges.value : correctEdges.value,
|
|
200
|
+
"nodes-draggable": false,
|
|
201
|
+
"pan-on-drag": _ctx.interactive && !solution.value,
|
|
202
|
+
"nodes-connectable": _ctx.interactive && trying.value,
|
|
203
|
+
"zoom-on-scroll": _ctx.interactive && !solution.value,
|
|
204
|
+
"zoom-on-pinch": _ctx.interactive && !solution.value,
|
|
205
|
+
"zoom-on-double-click": _ctx.interactive && !solution.value
|
|
206
|
+
}, {
|
|
207
|
+
"node-association": withCtx((AssociationNodeProps) => [
|
|
208
|
+
createVNode(_sfc_main$1, normalizeProps(guardReactiveProps(AssociationNodeProps)), null, 16)
|
|
209
|
+
]),
|
|
210
|
+
_: 1
|
|
211
|
+
}, 8, ["id", "nodes", "edges", "pan-on-drag", "nodes-connectable", "zoom-on-scroll", "zoom-on-pinch", "zoom-on-double-click"])
|
|
212
|
+
]),
|
|
213
|
+
createElementVNode("div", _hoisted_2, [
|
|
214
|
+
trying.value ? (openBlock(), createElementBlock("p", _hoisted_3, "Vous pouvez double-clicker sur une arête pour la supprimer.")) : createCommentVNode("", true),
|
|
215
|
+
validating.value ? (openBlock(), createElementBlock("p", _hoisted_4, "Les éléments en verts sont corrects et ceux en rouge sont incorrects.")) : createCommentVNode("", true)
|
|
216
|
+
]),
|
|
217
|
+
_ctx.interactive ? (openBlock(), createElementBlock("div", _hoisted_5, [
|
|
218
|
+
createElementVNode("button", {
|
|
219
|
+
class: "bg-blue-500 text-white px-3 py-2 m-2 rounded-md text-center",
|
|
220
|
+
onClick: _cache[1] || (_cache[1] = ($event) => trying.value ? validate() : retry())
|
|
221
|
+
}, toDisplayString(trying.value ? "Valider" : "Réessayer"), 1),
|
|
222
|
+
createElementVNode("button", {
|
|
223
|
+
class: normalizeClass(`${_ctx.mustTry && trying.value ? "bg-blue-300" : "bg-blue-500"} text-white px-3 py-2 m-2 rounded-md text-center`),
|
|
224
|
+
onClick: _cache[2] || (_cache[2] = ($event) => showAnswer()),
|
|
225
|
+
disabled: _ctx.mustTry && trying.value
|
|
226
|
+
}, " Voir la réponse ", 10, _hoisted_6)
|
|
227
|
+
])) : createCommentVNode("", true)
|
|
228
|
+
], 64);
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
export {
|
|
233
|
+
_sfc_main as default
|
|
234
|
+
};
|
|
235
|
+
//# sourceMappingURL=EpAssociation.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EpAssociation.vue.js","sources":["../../../src/components/interactions/EpAssociation.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport type { Node, Edge, Connection, EdgeMouseEvent } from '@vue-flow/core' \nimport { VueFlow, useVueFlow } from '@vue-flow/core'\nimport type { EpAssociationProps } from \"~/types/interactions/EpAssociation\";\nimport { useCreateUid } from '~/composables/useCreateUid';\n\nimport AssociationNode from '../tools/AssociationNode.vue';\n\nconst props = withDefaults(defineProps<EpAssociationProps>(), {\n interactive: false,\n mustTry: false,\n});\n\nconst id = useCreateUid();\n\nconst { fitView, onEdgeDoubleClick } = useVueFlow({ id: id })\n\n// these are our nodes\nconst initialNodes = computed<Node[]>(() => {\n let left: Node [] = props.leftOptions.map((option, idx) => {\n return {\n id: option.uid,\n type: 'association',\n position: option.position ?? { x: 70, y: 50 + idx * 120 },\n data: { \n label: option.text,\n index: idx,\n left: true\n }\n } as Node\n });\n\n let right: Node [] = props.rightOptions.map((option, idx) => {\n return {\n id: option.uid,\n type: 'association',\n position: option.position ?? { x: 550, y: 50 + idx * 120 },\n data: { \n label: option.text,\n index: idx,\n left: false\n }\n } as Node\n });\n\n return [...left, ...right];\n})\n\nconst nodes = ref<Node[]>(initialNodes.value)\n\n// The correct edges\nconst correctEdges = computed<Edge[]>(() => {\n return props.leftOptions.flatMap((option) => {\n return option.answers.map((answer) => {\n return {\n id: 'e' + option.uid + '->' + answer,\n type: 'straight',\n source: option.uid,\n target: answer,\n animated: false,\n style: {\n strokeWidth: 3,\n },\n updatable: false\n }\n });\n })\n});\n\nconst edges = ref<Edge[]>([]);\n\nconst trying = ref(true);\nconst solution = ref(false);\nconst validating = ref(false);\n\nconst validate = () => {\n trying.value = false;\n solution.value = false;\n validating.value = true;\n\n // Put the right colors for the validation\n let incorrectNodes = new Set<string>();\n\n // Check edges\n edges.value = edges.value.map((edge: Edge) => {\n let inside = false;\n for(let correctEdge of correctEdges.value) {\n if(edge.id == correctEdge.id)\n inside = true;\n }\n if(!inside) {\n incorrectNodes.add(edge.source);\n incorrectNodes.add(edge.target);\n }\n return {\n ...edge,\n style: {\n ...edge.style,\n stroke: inside ? '#16a34a' : '#dc2626'\n }\n }\n });\n\n for(let correctEdge of correctEdges.value) {\n let inside = false;\n for(let edge of edges.value) {\n if(edge.id == correctEdge.id)\n inside = true;\n }\n if(!inside) {\n incorrectNodes.add(correctEdge.source);\n incorrectNodes.add(correctEdge.target);\n }\n }\n\n // Check Nodes\n nodes.value = nodes.value.map((node: Node) => {\n console.log('here')\n if(incorrectNodes.has(node.id)) \n return {\n ...node,\n data: {\n ...node.data,\n mode: 'wrong'\n }\n }\n else\n return {\n ...node,\n data: {\n ...node.data,\n mode: 'correct'\n }\n }\n })\n}\n\nconst retry = () => {\n trying.value = true;\n solution.value = false;\n validating.value = false;\n\n edges.value = [];\n nodes.value = nodes.value.map((node: Node) => { \n return {\n ...node,\n data: {\n ...node.data,\n mode: 'neutral'\n }\n }\n });\n}\n\nconst showAnswer = () => {\n fitView();\n\n solution.value = true;\n trying.value = false;\n validating.value = false;\n\n edges.value = correctEdges.value;\n nodes.value = nodes.value.map((node: Node) => { \n return {\n ...node,\n data: {\n ...node.data,\n mode: 'neutral'\n }\n }\n });\n}\n\nconst onConnect = (connection: Connection) => {\n let newEdge: Edge = {\n id: 'e' + connection.source + '->' + connection.target,\n type: 'straight',\n source: connection.source,\n target: connection.target,\n animated: false,\n updatable: false,\n style: {\n strokeWidth: 3,\n },\n }\n edges.value = [...edges.value, newEdge]\n}\n\n\nonEdgeDoubleClick((event: EdgeMouseEvent) => {\n if(trying.value) {\n edges.value = edges.value.filter((edge: Edge) => {\n return edge.id !== event.edge.id\n })\n }\n console.log('edge double clicked', event)\n})\n\n</script>\n\n<template>\n <div class=\"border-2 rounded\" :style=\"{ width: '90%', height: '500px', margin: 'auto' }\">\n <VueFlow \n @pane-ready=\"() => { fitView() }\"\n @connect = \"onConnect\"\n\n :id=\"id\"\n :max-zoom=\"4\" \n :min-zoom=\"0.1\"\n :nodes=\"nodes\" \n :edges=\"(interactive)? edges : correctEdges\"\n :nodes-draggable=\"false\"\n :pan-on-drag=\"interactive && !solution\"\n :nodes-connectable=\"interactive && trying\"\n :zoom-on-scroll=\"interactive && !solution\"\n :zoom-on-pinch=\"interactive && !solution\"\n :zoom-on-double-click=\"interactive && !solution\"\n >\n <!-- bind the custom node type to the component -->\n <template #node-association=\"AssociationNodeProps\">\n <AssociationNode v-bind=\"AssociationNodeProps\" />\n </template>\n </VueFlow>\n </div>\n <div class=\"p-2 text-center text-sm text-neutral-300\">\n <p v-if=\"trying\">Vous pouvez double-clicker sur une arête pour la supprimer.</p>\n <p v-if=\"validating\">Les éléments en verts sont corrects et ceux en rouge sont incorrects.</p>\n </div>\n <div class=\"flex items-center justify-around\" v-if=\"interactive\">\n <button\n class=\"bg-blue-500 text-white px-3 py-2 m-2 rounded-md text-center\"\n @click=\"(trying)? validate() : retry()\"\n >\n {{(trying)? 'Valider' : 'Réessayer'}}\n </button>\n\n <button\n :class=\"`${(mustTry && trying)? 'bg-blue-300' : 'bg-blue-500'} text-white px-3 py-2 m-2 rounded-md text-center`\"\n @click=\"showAnswer()\" \n :disabled=\"(mustTry && trying)\"\n >\n Voir la réponse\n </button>\n </div>\n</template>\n\n"],"names":["_createElementVNode","_createVNode","_unref","interactive","_withCtx","AssociationNode","_openBlock","_createElementBlock","_normalizeClass","mustTry"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EpAssociation.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -42,7 +42,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
42
42
|
return props.slides[currentIndex.value];
|
|
43
43
|
});
|
|
44
44
|
const dynamicComponents = /* @__PURE__ */ Object.assign({
|
|
45
|
-
"../basics/EpAvatar.vue": () => import("../basics/EpAvatar.
|
|
45
|
+
"../basics/EpAvatar.vue": () => import("../basics/EpAvatar.vue.js"),
|
|
46
46
|
"../basics/EpBadge.vue": () => import("../basics/EpBadge.vue.js"),
|
|
47
47
|
"../basics/EpBtn.vue": () => import("../basics/EpBtn.vue2.js"),
|
|
48
48
|
"../basics/EpCard.vue": () => import("../basics/EpCard.vue2.js"),
|
|
@@ -91,6 +91,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
91
91
|
"./Ep360Image.vue": () => import("./Ep360Image.vue.js"),
|
|
92
92
|
"./Ep360Video.vue": () => import("./Ep360Video.vue.js"),
|
|
93
93
|
"./EpAccordeon.vue": () => import("./EpAccordeon.vue.js"),
|
|
94
|
+
"./EpAssociation.vue": () => import("./EpAssociation.vue2.js"),
|
|
94
95
|
"./EpContentSlider.vue": () => import("./EpContentSlider.vue2.js"),
|
|
95
96
|
"./EpDarkMode.vue": () => import("./EpDarkMode.vue2.js"),
|
|
96
97
|
"./EpDraggable.vue": () => import("./EpDraggable.vue2.js"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EpContentSlider.vue.js","sources":["../../../src/components/interactions/EpContentSlider.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ref,\n computed,\n defineAsyncComponent,\n} from \"vue\";\nimport { useComponent } from \"~/composables/useComponent\";\nimport { mdiArrowLeft, mdiArrowRight } from \"@mdi/js\";\nimport EpIcon from \"~/components/basics/EpIcon.vue\";\nimport type { EpContentSliderProps } from \"~/types/interactions/EpContentSlider\";\nimport { type SlidesType, type SizeCols } from \"~/types/Slides\";\nimport RenderTextNode from \"~/components/tools/RenderTextNode.vue\";\nconst props = withDefaults(defineProps<EpContentSliderProps>(), {\n loading: \"...loading\",\n noData: \"No data available\",\n mediaPosition: \"left\",\n titleSize: \"md\"\n});\n\nconst isLoading = ref(false);\n\n//slide information\nconst currentSlide = computed<SlidesType>(() => {\n if (!props.slides || props.slides.length === 0) {\n return {\n title: props.noData,\n img: \"\",\n uid: 2,\n content: \"\",\n component: null,\n layoutRatio: \"50/50\"\n };\n }\n return props.slides[currentIndex.value];\n});\n\n//nested components \nconst dynamicComponents = import.meta.glob(\n '../{basics,educationals,charts,forms,interactions,signages,medias}/**/*.vue'\n) as Record<string, () => Promise<{ default: any }>>;\n\nfunction resolveAsyncByName(name: string) {\n for (const [path, loader] of Object.entries(dynamicComponents)) {\n if (path.endsWith(`/${name}.vue`)) {\n // ensure the loader returns the component itself (module.default)\n return defineAsyncComponent(() => loader().then((m) => m.default));\n }\n }\n return null\n}\n\nconst currentSlideMediaContent = computed(() => {\n if (currentSlide.value.img) {\n //EFFACER UNE FOIS TOUS LES COURS ONT ÉTÉ MIGRÉS \n return defineAsyncComponent(() => import(\"../basics/EpImg.vue\"));\n }\n if (currentSlide.value.component) {\n const { name } = useComponent(currentSlide.value.component.type)\n return resolveAsyncByName(name)\n }\n return null\n});\n\n//col system and render slide \nconst layoutMode = computed(() => {\n const slide = currentSlide.value;\n const hasMedia = !!(slide.img || slide.component);\n const hasContent = !!(slide.content && slide.content.trim());\n return {\n type: hasMedia && hasContent ? 'two-cols'\n : hasMedia ? 'media-only'\n : hasContent ? 'content-only'\n : 'empty',\n hasMedia,\n hasContent,\n switchCol: slide.switchCol || false,\n gap: slide.gap || 'gap-6', // default gap\n leftCol: slide.leftCol || 'w-1/2' // default 50/50\n };\n});\n\n\n//rigth col based on left \nconst getRightColWidth = computed(() => {\n const leftCol = layoutMode.value.leftCol as SizeCols;\n\n // Map left width to corresponding right width\n const widthMap: Record<SizeCols, string> = {\n 'w-1/5': 'w-4/5',\n 'w-2/5': 'w-3/5',\n 'w-3/5': 'w-2/5',\n 'w-4/5': 'w-1/5',\n 'w-full': 'w-1/2' // 50/50\n };\n\n return widthMap[leftCol];\n});\n\n// Title size classes\nconst getTitleClasses = computed(() => {\n const base = 'font-bold ep-text-primary mb-3'\n switch (props.titleSize) {\n case 'sm': return `${base} text-xl`\n case 'lg': return `${base} text-4xl`\n case 'md':\n default: return `${base} text-2xl`\n }\n});\n\n\n\n\n\n\n//control navigation \nconst currentIndex = ref(0);\nconst max = computed(() => currentIndex.value < props.slides.length - 1);\n\nconst next = async () => {\n isLoading.value = true;\n if (max.value) {\n currentIndex.value += 1;\n }\n isLoading.value = false;\n};\n\nconst prev = async () => {\n isLoading.value = true;\n if (currentIndex.value > 0) {\n currentIndex.value -= 1;\n }\n isLoading.value = false;\n};\n\nconst goTo = (index: number) => (currentIndex.value = index);\n\n\n</script>\n\n<template>\n <div\n class=\"relative h-[600px] flex flex-col p-6 w-full overflow-hidden rounded-lg shadow-xl bg-surface-2 dark:bg-surface-2-dark\">\n <!-- Header section with navigation -->\n <div class=\"flex justify-between items-center pb-3 mb-3 border-b-2 border-gray-600 dark:border-gray-300\">\n <h5 :class=\"getTitleClasses\">{{ currentSlide.title }}</h5>\n <div class=\"flex items-center space-x-3\" v-if=\"props.slides.length\">\n <!-- Bullets -->\n <div class=\"flex space-x-2\">\n <span v-for=\"(_, i) in props.slides.length\" :key=\"`slide-index-${i}`\" @click=\"goTo(i)\" :class=\"[\n 'w-2 h-2 rounded-full cursor-pointer',\n i === currentIndex ? 'bg-primary' : 'bg-surface-2-dark dark:bg-surface-2',\n ]\" />\n </div>\n\n <!-- Controls -->\n <div class=\"flex space-x-2\">\n <button class=\"nav-btn\" @click=\"prev\" :disabled=\"currentIndex === 0\">\n <EpIcon :icon-path=\"mdiArrowLeft\" size=\"24\" />\n </button>\n <button class=\"nav-btn\" @click=\"next\" :disabled=\"!max\">\n <EpIcon :icon-path=\"mdiArrowRight\" size=\"24\" />\n </button>\n </div>\n <span class=\"text-sm\">{{ currentIndex + 1 }} / {{ props.slides.length }}</span>\n </div>\n </div>\n\n <!-- Slider content -->\n <div class=\"flex flex-1 min-h-0 justify-center overflow-hidden\">\n <transition name=\"slide-fade\" mode=\"out-in\">\n <div class=\"flex w-full h-full\" :class=\"[\n layoutMode.type === 'two-cols' && !layoutMode.switchCol ? `flex-row ${layoutMode.gap}` : '',\n layoutMode.type === 'two-cols' && layoutMode.switchCol ? `flex-row-reverse ${layoutMode.gap}` : '',\n layoutMode.type !== 'two-cols' ? 'justify-center items-center' : ''\n ]\">\n <!-- Media column (left when normal, right when switched) -->\n <div v-if=\"layoutMode.hasMedia\" :class=\"layoutMode.type === 'two-cols'\n ? (layoutMode.switchCol ? getRightColWidth : layoutMode.leftCol)\n : 'w-full'\">\n <template v-if=\"currentSlide.component\">\n <Suspense>\n <component :is=\"currentSlideMediaContent\" v-bind=\"{ ...currentSlide.component.data }\"\n class=\"max-h-full max-w-full object-contain\" />\n <template #fallback>{{ loading }}</template>\n </Suspense>\n </template>\n </div>\n\n <!-- Content column (right when normal, left when switched) -->\n <div v-if=\"layoutMode.hasContent\" :class=\"[\n 'h-full',\n layoutMode.type === 'two-cols'\n ? (layoutMode.switchCol ? layoutMode.leftCol : getRightColWidth)\n : 'w-full'\n ]\">\n <div class=\"h-full overflow-y-auto overflow-x-hidden pr-2\" :key=\"currentSlide.uid\">\n <RenderTextNode :content=\"currentSlide.content\"/>\n </div>\n </div>\n </div>\n </transition>\n </div>\n\n <!-- Progress bar -->\n <div class=\"mt-4 h-2 w-full bg-gray-300 rounded-full flex-shrink-0\">\n <div class=\"bg-primary h-full rounded-full transition-all duration-300\" :style=\"{\n width: ((currentIndex + 1) / props.slides.length) * 100 + '%',\n }\" />\n </div>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_Fragment","_renderList","_normalizeClass","_createVNode","EpIcon","_unref","_Transition","_createBlock","_Suspense","loading","_resolveDynamicComponent","_mergeProps","RenderTextNode","_normalizeStyle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EpContentSlider.vue.js","sources":["../../../src/components/interactions/EpContentSlider.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ref,\n computed,\n defineAsyncComponent,\n} from \"vue\";\nimport { useComponent } from \"~/composables/useComponent\";\nimport { mdiArrowLeft, mdiArrowRight } from \"@mdi/js\";\nimport EpIcon from \"~/components/basics/EpIcon.vue\";\nimport type { EpContentSliderProps } from \"~/types/interactions/EpContentSlider\";\nimport { type SlidesType, type SizeCols } from \"~/types/Slides\";\nimport RenderTextNode from \"~/components/tools/RenderTextNode.vue\";\nconst props = withDefaults(defineProps<EpContentSliderProps>(), {\n loading: \"...loading\",\n noData: \"No data available\",\n mediaPosition: \"left\",\n titleSize: \"md\"\n});\n\nconst isLoading = ref(false);\n\n//slide information\nconst currentSlide = computed<SlidesType>(() => {\n if (!props.slides || props.slides.length === 0) {\n return {\n title: props.noData,\n img: \"\",\n uid: 2,\n content: \"\",\n component: null,\n layoutRatio: \"50/50\"\n };\n }\n return props.slides[currentIndex.value];\n});\n\n//nested components \nconst dynamicComponents = import.meta.glob(\n '../{basics,educationals,charts,forms,interactions,signages,medias}/**/*.vue'\n) as Record<string, () => Promise<{ default: any }>>;\n\nfunction resolveAsyncByName(name: string) {\n for (const [path, loader] of Object.entries(dynamicComponents)) {\n if (path.endsWith(`/${name}.vue`)) {\n // ensure the loader returns the component itself (module.default)\n return defineAsyncComponent(() => loader().then((m) => m.default));\n }\n }\n return null\n}\n\nconst currentSlideMediaContent = computed(() => {\n if (currentSlide.value.img) {\n //EFFACER UNE FOIS TOUS LES COURS ONT ÉTÉ MIGRÉS \n return defineAsyncComponent(() => import(\"../basics/EpImg.vue\"));\n }\n if (currentSlide.value.component) {\n const { name } = useComponent(currentSlide.value.component.type)\n return resolveAsyncByName(name)\n }\n return null\n});\n\n//col system and render slide \nconst layoutMode = computed(() => {\n const slide = currentSlide.value;\n const hasMedia = !!(slide.img || slide.component);\n const hasContent = !!(slide.content && slide.content.trim());\n return {\n type: hasMedia && hasContent ? 'two-cols'\n : hasMedia ? 'media-only'\n : hasContent ? 'content-only'\n : 'empty',\n hasMedia,\n hasContent,\n switchCol: slide.switchCol || false,\n gap: slide.gap || 'gap-6', // default gap\n leftCol: slide.leftCol || 'w-1/2' // default 50/50\n };\n});\n\n\n//rigth col based on left \nconst getRightColWidth = computed(() => {\n const leftCol = layoutMode.value.leftCol as SizeCols;\n\n // Map left width to corresponding right width\n const widthMap: Record<SizeCols, string> = {\n 'w-1/5': 'w-4/5',\n 'w-2/5': 'w-3/5',\n 'w-3/5': 'w-2/5',\n 'w-4/5': 'w-1/5',\n 'w-full': 'w-1/2' // 50/50\n };\n\n return widthMap[leftCol];\n});\n\n// Title size classes\nconst getTitleClasses = computed(() => {\n const base = 'font-bold ep-text-primary mb-3'\n switch (props.titleSize) {\n case 'sm': return `${base} text-xl`\n case 'lg': return `${base} text-4xl`\n case 'md':\n default: return `${base} text-2xl`\n }\n});\n\n\n\n\n\n\n//control navigation \nconst currentIndex = ref(0);\nconst max = computed(() => currentIndex.value < props.slides.length - 1);\n\nconst next = async () => {\n isLoading.value = true;\n if (max.value) {\n currentIndex.value += 1;\n }\n isLoading.value = false;\n};\n\nconst prev = async () => {\n isLoading.value = true;\n if (currentIndex.value > 0) {\n currentIndex.value -= 1;\n }\n isLoading.value = false;\n};\n\nconst goTo = (index: number) => (currentIndex.value = index);\n\n\n</script>\n\n<template>\n <div\n class=\"relative h-[600px] flex flex-col p-6 w-full overflow-hidden rounded-lg shadow-xl bg-surface-2 dark:bg-surface-2-dark\">\n <!-- Header section with navigation -->\n <div class=\"flex justify-between items-center pb-3 mb-3 border-b-2 border-gray-600 dark:border-gray-300\">\n <h5 :class=\"getTitleClasses\">{{ currentSlide.title }}</h5>\n <div class=\"flex items-center space-x-3\" v-if=\"props.slides.length\">\n <!-- Bullets -->\n <div class=\"flex space-x-2\">\n <span v-for=\"(_, i) in props.slides.length\" :key=\"`slide-index-${i}`\" @click=\"goTo(i)\" :class=\"[\n 'w-2 h-2 rounded-full cursor-pointer',\n i === currentIndex ? 'bg-primary' : 'bg-surface-2-dark dark:bg-surface-2',\n ]\" />\n </div>\n\n <!-- Controls -->\n <div class=\"flex space-x-2\">\n <button class=\"nav-btn\" @click=\"prev\" :disabled=\"currentIndex === 0\">\n <EpIcon :icon-path=\"mdiArrowLeft\" size=\"24\" />\n </button>\n <button class=\"nav-btn\" @click=\"next\" :disabled=\"!max\">\n <EpIcon :icon-path=\"mdiArrowRight\" size=\"24\" />\n </button>\n </div>\n <span class=\"text-sm\">{{ currentIndex + 1 }} / {{ props.slides.length }}</span>\n </div>\n </div>\n\n <!-- Slider content -->\n <div class=\"flex flex-1 min-h-0 justify-center overflow-hidden\">\n <transition name=\"slide-fade\" mode=\"out-in\">\n <div class=\"flex w-full h-full\" :class=\"[\n layoutMode.type === 'two-cols' && !layoutMode.switchCol ? `flex-row ${layoutMode.gap}` : '',\n layoutMode.type === 'two-cols' && layoutMode.switchCol ? `flex-row-reverse ${layoutMode.gap}` : '',\n layoutMode.type !== 'two-cols' ? 'justify-center items-center' : ''\n ]\">\n <!-- Media column (left when normal, right when switched) -->\n <div v-if=\"layoutMode.hasMedia\" :class=\"layoutMode.type === 'two-cols'\n ? (layoutMode.switchCol ? getRightColWidth : layoutMode.leftCol)\n : 'w-full'\">\n <template v-if=\"currentSlide.component\">\n <Suspense>\n <component :is=\"currentSlideMediaContent\" v-bind=\"{ ...currentSlide.component.data }\"\n class=\"max-h-full max-w-full object-contain\" />\n <template #fallback>{{ loading }}</template>\n </Suspense>\n </template>\n </div>\n\n <!-- Content column (right when normal, left when switched) -->\n <div v-if=\"layoutMode.hasContent\" :class=\"[\n 'h-full',\n layoutMode.type === 'two-cols'\n ? (layoutMode.switchCol ? layoutMode.leftCol : getRightColWidth)\n : 'w-full'\n ]\">\n <div class=\"h-full overflow-y-auto overflow-x-hidden pr-2\" :key=\"currentSlide.uid\">\n <RenderTextNode :content=\"currentSlide.content\"/>\n </div>\n </div>\n </div>\n </transition>\n </div>\n\n <!-- Progress bar -->\n <div class=\"mt-4 h-2 w-full bg-gray-300 rounded-full flex-shrink-0\">\n <div class=\"bg-primary h-full rounded-full transition-all duration-300\" :style=\"{\n width: ((currentIndex + 1) / props.slides.length) * 100 + '%',\n }\" />\n </div>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_Fragment","_renderList","_normalizeClass","_createVNode","EpIcon","_unref","_Transition","_createBlock","_Suspense","loading","_resolveDynamicComponent","_mergeProps","RenderTextNode","_normalizeStyle"],"mappings":"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"}
|