ep-lib-ts 1.1.20 → 1.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/components/basics/EpAvatar.vue.js +1 -55
  2. package/dist/components/basics/EpAvatar.vue.js.map +1 -1
  3. package/dist/components/basics/EpAvatar.vue2.js +55 -1
  4. package/dist/components/basics/EpAvatar.vue2.js.map +1 -1
  5. package/dist/components/basics/EpStackedList.vue.js +1 -1
  6. package/dist/components/educationals/EpBranchingScenario.vue2.js +2 -2
  7. package/dist/components/educationals/EpResource.vue.js +1 -1
  8. package/dist/components/educationals/EpResource.vue.js.map +1 -1
  9. package/dist/components/educationals/EpSegmentedBox.vue.js +1 -1
  10. package/dist/components/interactions/EpAssociation.vue.js +1 -1
  11. package/dist/components/interactions/EpContentSlider.vue.js +2 -1
  12. package/dist/components/interactions/EpContentSlider.vue.js.map +1 -1
  13. package/dist/components/interactions/EpQuestion.vue.js +1 -1
  14. package/dist/components/interactions/EpQuestion.vue.js.map +1 -1
  15. package/dist/components/medias/EpHierarchy.vue2.js +2 -1
  16. package/dist/components/medias/EpHierarchy.vue2.js.map +1 -1
  17. package/dist/components/medias/EpPlaylist.vue.js +80 -0
  18. package/dist/components/medias/EpPlaylist.vue.js.map +1 -0
  19. package/dist/components/medias/EpPlaylist.vue2.js +5 -0
  20. package/dist/components/medias/EpPlaylist.vue2.js.map +1 -0
  21. package/dist/components/tools/AssociationNode.vue.js +1 -82
  22. package/dist/components/tools/AssociationNode.vue.js.map +1 -1
  23. package/dist/components/tools/AssociationNode.vue2.js +82 -1
  24. package/dist/components/tools/AssociationNode.vue2.js.map +1 -1
  25. package/dist/components/tools/Details.vue.js +1 -56
  26. package/dist/components/tools/Details.vue.js.map +1 -1
  27. package/dist/components/tools/Details.vue2.js +56 -1
  28. package/dist/components/tools/Details.vue2.js.map +1 -1
  29. package/dist/components/tools/SegmentedBox.vue.js +1 -55
  30. package/dist/components/tools/SegmentedBox.vue.js.map +1 -1
  31. package/dist/components/tools/SegmentedBox.vue2.js +55 -1
  32. package/dist/components/tools/SegmentedBox.vue2.js.map +1 -1
  33. package/dist/components/tools/TextMedia.vue.js +1 -50
  34. package/dist/components/tools/TextMedia.vue.js.map +1 -1
  35. package/dist/components/tools/TextMedia.vue2.js +50 -1
  36. package/dist/components/tools/TextMedia.vue2.js.map +1 -1
  37. package/dist/components/tools/TwoColsMedia.vue2.js +2 -2
  38. package/dist/components/tools/TwoColsMedia.vue2.js.map +1 -1
  39. package/dist/entry/medias/EpPlaylist.d.ts +6 -0
  40. package/dist/entry/medias/EpPlaylist.js +7 -0
  41. package/dist/entry/medias/EpPlaylist.js.map +1 -0
  42. package/dist/index.d.ts +2 -1
  43. package/dist/index.js +162 -159
  44. package/dist/index.js.map +1 -1
  45. package/dist/style.css +74 -74
  46. package/dist/types/medias/EpPlaylist.d.ts +9 -0
  47. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"EpHierarchy.vue2.js","sources":["../../../src/components/medias/EpHierarchy.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, onMounted, computed, defineAsyncComponent } from \"vue\";\nimport {\n hierarchy,\n tree,\n cluster,\n type HierarchyPointLink,\n type HierarchyPointNode,\n} from \"d3-hierarchy\";\nimport * as d3 from \"d3-selection\";\nimport { linkVertical, linkHorizontal } from \"d3-shape\";\nimport * as d3Zoom from \"d3-zoom\";\nimport type { TreeNode } from \"~/types/Hierarchy\";\nimport type { NestedComponents } from \"~/types/Component\";\nimport { useComponent } from \"~/composables/useComponent\";\nimport EpModal from \"~/components/interactions/EpModal.vue\";\nimport EpBtn from \"~/components/basics/EpBtn.vue\";\nimport { useRenderText } from \"~/composables/useRenderText\";\nimport type { EpHierarchyProps } from \"~/types/medias/EpHierarchy\";\n\nconst props = withDefaults(defineProps<EpHierarchyProps>(), {\n labelClose: \"fermer\",\n maxWidth: 800,\n maxHeight: 600,\n isCluster: false,\n colorRect: \"fill-red-400\",\n colorPath: \"stroke-yellow-400\",\n});\n\nconst treeContainer = ref<HTMLDivElement | null>(null);\nconst treeWrapper = ref<HTMLDivElement | null>(null);\n\n/* control modal */\ntype ShowNode = {\n title: string;\n text?: string;\n component?: NestedComponents;\n};\n\nconst currentNode = ref<ShowNode | null>(null);\nconst showModal = ref(false);\n\nconst handleNodeClick = (node: TreeNode) => {\n currentNode.value = {\n title: node.name,\n text: node.text,\n component: node.component,\n };\n showModal.value = true;\n};\n\nconst closeModal = () => {\n showModal.value = false;\n currentNode.value = null;\n};\n//nested component\n\nconst components = import.meta.glob([\n \"./*.vue\", // all components in medias (same folder)\n \"../basics/*.vue\", // components/charts/\n \"../signages/*.vue\", // components/signages/\n]);\n\nconst currentRenderComponent = computed(() => {\n if (!currentNode.value || !currentNode.value.component) {\n return null;\n }\n\n const { path, name } = useComponent(currentNode.value.component.type);\n //console.log(path, name)\n let fullPath = \"\";\n if (path === \"medias\") {\n fullPath = `./${name}.vue`;\n } else {\n fullPath = `../${path}/${name}.vue`;\n }\n //console.log(fullPath)\n const loader = components[fullPath] as\n | (() => Promise<{ default: NestedComponents }>)\n | undefined;\n\n if (!loader) {\n console.warn(`Component not found: ${fullPath}`);\n return null; // or defineAsyncComponent(() => import('../fallbacks/EpNothing.vue'))\n }\n\n return defineAsyncComponent(loader);\n});\n\nonMounted(() => {\n if (!treeContainer.value) return;\n\n if (props.isCluster) {\n clusterView();\n } else {\n treeView();\n }\n});\n\nconst treeView = () => {\n const rectW = 130;\n const rectH = 40;\n const margin = { top: 40, right: 40, bottom: 40, left: 40 };\n\n const root = hierarchy<TreeNode>(props.nodes);\n //const totalLeafCount = root.leaves().length\n const width = Math.max(props.maxWidth);\n const height = props.maxHeight;\n\n const treeLayout = tree<TreeNode>().nodeSize([200, 100]); // [x spacing, y spacing]\n\n const treeData = treeLayout(root);\n\n const svg = d3\n .select(treeContainer.value)\n .append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n const g = svg\n .append(\"g\")\n .attr(\"transform\", `translate(${margin.left}, ${margin.top})`);\n\n const zoom = d3Zoom\n .zoom<SVGSVGElement, unknown>()\n .scaleExtent([0.1, 2])\n .on(\"zoom\", (event) => {\n g.attr(\"transform\", event.transform);\n });\n\n svg.call(zoom);\n\n const centerX = width / 2 - treeData.x;\n const centerY = 30; //height / 2 - treeData.y\n const identity = (d3Zoom as any).zoomIdentity;\n svg.call(zoom.transform, identity.translate(centerX, centerY));\n\n // Links\n const linkPath = linkVertical<\n HierarchyPointLink<TreeNode>,\n HierarchyPointNode<TreeNode>\n >()\n .x((d) => d.x)\n .y((d) => d.y);\n\n g.selectAll(\"path.link\")\n .data(treeData.links())\n .enter()\n .append(\"path\")\n .attr(\"d\", (d) => linkPath(d))\n .attr(\"class\", (d) => {\n const link = d.target.data.active\n ? `${props.colorPath} stroke-2`\n : \"stroke-black dark:stroke-white\";\n return `${link} link fill-none`;\n });\n\n // Nodes\n const node = g\n .selectAll(\"g.node\")\n .data(treeData.descendants())\n .enter()\n .append(\"g\")\n .attr(\"class\", \"node\")\n .attr(\"transform\", (d) => `translate(${d.x}, ${d.y})`)\n .style(\"cursor\", (d) =>\n d.data.component || d.data.text ? \"pointer\" : \"default\"\n )\n .each(function (d) {\n if (d.data.component || d.data.text) {\n d3.select(this).on(\"click\", (_event) => handleNodeClick(d.data));\n }\n });\n //.style('cursor', 'pointer')\n //.on('click', (_event, d) => handleNodeClick(d.data))\n\n node.each(function (d) {\n const group = d3.select(this);\n\n // Append text temporarily\n const text = group\n .append(\"text\")\n .attr(\"class\", \"text-sm font-semibold fill-black dark:fill-white\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .text((d.data.label) ? d.data.label : d.data.name);\n\n // Get bounding box to determine text size\n const bbox = (text.node() as SVGTextElement).getBBox();\n const paddingX = 10;\n const paddingY = 10;\n\n const width = bbox.width + paddingX * 2;\n const height = bbox.height + paddingY * 2;\n\n // Draw rect using text size\n group\n .insert(\"rect\", \"text\")\n .attr(\"class\", props.colorRect)\n .attr(\"x\", -width / 2)\n .attr(\"y\", -height / 2)\n .attr(\"width\", width)\n .attr(\"height\", height)\n .attr(\"rx\", 4)\n .attr(\"ry\", 4);\n });\n\n node\n .append(\"text\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .attr(\"class\", \"text-sm font-semibold fill-white dark:fill-black\")\n .attr(\"text-anchor\", \"middle\")\n .text((d) => {return (d.data.label) ? d.data.label : d.data.name})\n .style(\"pointer-events\", \"none\");\n};\n\nconst clusterView = () => {\n const rectW = 130;\n const rectH = 40;\n const margin = { top: 40, right: 40, bottom: 40, left: 40 };\n\n const root = hierarchy<TreeNode>(props.nodes);\n //const totalLeafCount = root.leaves().length\n const width = Math.max(props.maxWidth);\n const height = props.maxHeight;\n\n const treeLayout = cluster<TreeNode>().nodeSize([130, 200]); // [x spacing, y spacing]\n\n const treeData = treeLayout(root);\n\n const svg = d3\n .select(treeContainer.value)\n .append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n const g = svg\n .append(\"g\")\n .attr(\"transform\", `translate(${margin.left}, ${margin.top})`);\n\n const zoom = d3Zoom\n .zoom<SVGSVGElement, unknown>()\n .scaleExtent([0.1, 4])\n .on(\"zoom\", (event) => {\n g.attr(\"transform\", event.transform);\n });\n\n svg.call(zoom);\n\n const centerX = 30;\n const centerY = height / 2 - treeData.x;\n const identity = (d3Zoom as any).zoomIdentity;\n svg.call(zoom.transform, identity.translate(centerX, centerY));\n\n // Links\n const linkPath = linkHorizontal<\n HierarchyPointLink<TreeNode>,\n HierarchyPointNode<TreeNode>\n >()\n .x((d) => d.y)\n .y((d) => d.x);\n\n g.selectAll(\"path.link\")\n .data(treeData.links())\n .enter()\n .append(\"path\")\n .attr(\"d\", (d) => linkPath(d))\n .attr(\"class\", (d) => {\n const link = d.target.data.active\n ? `${props.colorPath} stroke-2`\n : \"stroke-black dark:stroke-white\";\n return `${link} link fill-none`;\n });\n\n // Nodes\n const node = g\n .selectAll(\"g.node\")\n .data(treeData.descendants())\n .enter()\n .append(\"g\")\n .attr(\"class\", \"node\")\n .attr(\"transform\", (d) => `translate(${d.y}, ${d.x})`)\n .style(\"cursor\", (d) =>\n d.data.component || d.data.text ? \"pointer\" : \"default\"\n )\n .each(function (d) {\n if (d.data.component || d.data.text) {\n d3.select(this).on(\"click\", (_event) => handleNodeClick(d.data));\n }\n });\n //.style('cursor', 'pointer')\n //.on('click', (_event, d) => handleNodeClick(d.data))\n\n node.each(function (d) {\n const group = d3.select(this);\n\n // Append text temporarily\n const text = group\n .append(\"text\")\n .attr(\"class\", \"text-sm font-semibold fill-black dark:fill-white\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .text((d.data.label) ? d.data.label : d.data.name);\n\n // Get bounding box to determine text size\n const bbox = (text.node() as SVGTextElement).getBBox();\n const paddingX = 10;\n const paddingY = 10;\n\n const width = bbox.width + paddingX * 2;\n const height = bbox.height + paddingY * 2;\n\n // Draw rect using text size\n group\n .insert(\"rect\", \"text\")\n .attr(\"class\", props.colorRect)\n .attr(\"x\", -width / 2)\n .attr(\"y\", -height / 2)\n .attr(\"width\", width)\n .attr(\"height\", height)\n .attr(\"rx\", 4)\n .attr(\"ry\", 4);\n });\n\n node\n .append(\"text\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .attr(\"class\", \"text-sm font-semibold fill-white dark:fill-black\")\n .attr(\"text-anchor\", \"middle\")\n .text((d) => {return (d.data.label) ? d.data.label : d.data.name})\n .style(\"pointer-events\", \"none\");\n};\n\nconst maxW = computed(() => {\n return `${props.maxWidth.toString()}px`;\n});\n\nconst maxH = computed(() => {\n return `${props.maxWidth.toString()}px`;\n});\n</script>\n\n<template>\n <div>\n <div\n ref=\"treeWrapper\"\n class=\"ep-tree-wrapper mx-auto\"\n :style=\"{ maxHeight: maxH, maxWidth: maxW }\"\n >\n <div ref=\"treeContainer\" class=\"ep-tree-container\" />\n </div>\n <EpModal v-model=\"showModal\" :title=\"currentNode.title\" v-if=\"currentNode\">\n <div v-if=\"currentNode.text\" v-html=\"useRenderText(currentNode.text)\" />\n <template v-if=\"currentRenderComponent && currentNode.component\">\n <component\n :is=\"currentRenderComponent\"\n v-bind=\"{ ...currentNode.component.data }\"\n />\n </template>\n <div class=\"flex justify-end\">\n <EpBtn @click=\"closeModal\" type=\"error\" outlined rounded>{{\n labelClose\n }}</EpBtn>\n </div>\n </EpModal>\n </div>\n</template>\n\n<style scoped>\n.ep-tree-wrapper {\n overflow: auto;\n border: 1px solid #ddd;\n}\n\n.ep-tree-container {\n width: 100%;\n overflow-x: auto;\n}\n</style>\n"],"names":["width","height","_createElementBlock","_createElementVNode","_normalizeStyle","_createBlock","EpModal","_unref","_openBlock","_resolveDynamicComponent","_normalizeProps","_mergeProps","_createVNode","EpBtn","labelClose"],"mappings":"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"}
1
+ {"version":3,"file":"EpHierarchy.vue2.js","sources":["../../../src/components/medias/EpHierarchy.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, onMounted, computed, defineAsyncComponent } from \"vue\";\nimport {\n hierarchy,\n tree,\n cluster,\n type HierarchyPointLink,\n type HierarchyPointNode,\n} from \"d3-hierarchy\";\nimport * as d3 from \"d3-selection\";\nimport { linkVertical, linkHorizontal } from \"d3-shape\";\nimport * as d3Zoom from \"d3-zoom\";\nimport type { TreeNode } from \"~/types/Hierarchy\";\nimport type { NestedComponents } from \"~/types/Component\";\nimport { useComponent } from \"~/composables/useComponent\";\nimport EpModal from \"~/components/interactions/EpModal.vue\";\nimport EpBtn from \"~/components/basics/EpBtn.vue\";\nimport { useRenderText } from \"~/composables/useRenderText\";\nimport type { EpHierarchyProps } from \"~/types/medias/EpHierarchy\";\n\nconst props = withDefaults(defineProps<EpHierarchyProps>(), {\n labelClose: \"fermer\",\n maxWidth: 800,\n maxHeight: 600,\n isCluster: false,\n colorRect: \"fill-red-400\",\n colorPath: \"stroke-yellow-400\",\n});\n\nconst treeContainer = ref<HTMLDivElement | null>(null);\nconst treeWrapper = ref<HTMLDivElement | null>(null);\n\n/* control modal */\ntype ShowNode = {\n title: string;\n text?: string;\n component?: NestedComponents;\n};\n\nconst currentNode = ref<ShowNode | null>(null);\nconst showModal = ref(false);\n\nconst handleNodeClick = (node: TreeNode) => {\n currentNode.value = {\n title: node.name,\n text: node.text,\n component: node.component,\n };\n showModal.value = true;\n};\n\nconst closeModal = () => {\n showModal.value = false;\n currentNode.value = null;\n};\n//nested component\n\nconst components = import.meta.glob([\n \"./*.vue\", // all components in medias (same folder)\n \"../basics/*.vue\", // components/charts/\n \"../signages/*.vue\", // components/signages/\n]);\n\nconst currentRenderComponent = computed(() => {\n if (!currentNode.value || !currentNode.value.component) {\n return null;\n }\n\n const { path, name } = useComponent(currentNode.value.component.type);\n //console.log(path, name)\n let fullPath = \"\";\n if (path === \"medias\") {\n fullPath = `./${name}.vue`;\n } else {\n fullPath = `../${path}/${name}.vue`;\n }\n //console.log(fullPath)\n const loader = components[fullPath] as\n | (() => Promise<{ default: NestedComponents }>)\n | undefined;\n\n if (!loader) {\n console.warn(`Component not found: ${fullPath}`);\n return null; // or defineAsyncComponent(() => import('../fallbacks/EpNothing.vue'))\n }\n\n return defineAsyncComponent(loader);\n});\n\nonMounted(() => {\n if (!treeContainer.value) return;\n\n if (props.isCluster) {\n clusterView();\n } else {\n treeView();\n }\n});\n\nconst treeView = () => {\n const rectW = 130;\n const rectH = 40;\n const margin = { top: 40, right: 40, bottom: 40, left: 40 };\n\n const root = hierarchy<TreeNode>(props.nodes);\n //const totalLeafCount = root.leaves().length\n const width = Math.max(props.maxWidth);\n const height = props.maxHeight;\n\n const treeLayout = tree<TreeNode>().nodeSize([200, 100]); // [x spacing, y spacing]\n\n const treeData = treeLayout(root);\n\n const svg = d3\n .select(treeContainer.value)\n .append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n const g = svg\n .append(\"g\")\n .attr(\"transform\", `translate(${margin.left}, ${margin.top})`);\n\n const zoom = d3Zoom\n .zoom<SVGSVGElement, unknown>()\n .scaleExtent([0.1, 2])\n .on(\"zoom\", (event) => {\n g.attr(\"transform\", event.transform);\n });\n\n svg.call(zoom);\n\n const centerX = width / 2 - treeData.x;\n const centerY = 30; //height / 2 - treeData.y\n const identity = (d3Zoom as any).zoomIdentity;\n svg.call(zoom.transform, identity.translate(centerX, centerY));\n\n // Links\n const linkPath = linkVertical<\n HierarchyPointLink<TreeNode>,\n HierarchyPointNode<TreeNode>\n >()\n .x((d) => d.x)\n .y((d) => d.y);\n\n g.selectAll(\"path.link\")\n .data(treeData.links())\n .enter()\n .append(\"path\")\n .attr(\"d\", (d) => linkPath(d))\n .attr(\"class\", (d) => {\n const link = d.target.data.active\n ? `${props.colorPath} stroke-2`\n : \"stroke-black dark:stroke-white\";\n return `${link} link fill-none`;\n });\n\n // Nodes\n const node = g\n .selectAll(\"g.node\")\n .data(treeData.descendants())\n .enter()\n .append(\"g\")\n .attr(\"class\", \"node\")\n .attr(\"transform\", (d) => `translate(${d.x}, ${d.y})`)\n .style(\"cursor\", (d) =>\n d.data.component || d.data.text ? \"pointer\" : \"default\"\n )\n .each(function (d) {\n if (d.data.component || d.data.text) {\n d3.select(this).on(\"click\", (_event) => handleNodeClick(d.data));\n }\n });\n //.style('cursor', 'pointer')\n //.on('click', (_event, d) => handleNodeClick(d.data))\n\n node.each(function (d) {\n const group = d3.select(this);\n\n // Append text temporarily\n const text = group\n .append(\"text\")\n .attr(\"class\", \"text-sm font-semibold fill-black dark:fill-white\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .text((d.data.label) ? d.data.label : d.data.name);\n\n // Get bounding box to determine text size\n const bbox = (text.node() as SVGTextElement).getBBox();\n const paddingX = 10;\n const paddingY = 10;\n\n const width = bbox.width + paddingX * 2;\n const height = bbox.height + paddingY * 2;\n\n // Draw rect using text size\n group\n .insert(\"rect\", \"text\")\n .attr(\"class\", props.colorRect)\n .attr(\"x\", -width / 2)\n .attr(\"y\", -height / 2)\n .attr(\"width\", width)\n .attr(\"height\", height)\n .attr(\"rx\", 4)\n .attr(\"ry\", 4);\n });\n\n node\n .append(\"text\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .attr(\"class\", \"text-sm font-semibold fill-white dark:fill-black\")\n .attr(\"text-anchor\", \"middle\")\n .text((d) => {return (d.data.label) ? d.data.label : d.data.name})\n .style(\"pointer-events\", \"none\");\n};\n\nconst clusterView = () => {\n const rectW = 130;\n const rectH = 40;\n const margin = { top: 40, right: 40, bottom: 40, left: 40 };\n\n const root = hierarchy<TreeNode>(props.nodes);\n //const totalLeafCount = root.leaves().length\n const width = Math.max(props.maxWidth);\n const height = props.maxHeight;\n\n const treeLayout = cluster<TreeNode>().nodeSize([130, 200]); // [x spacing, y spacing]\n\n const treeData = treeLayout(root);\n\n const svg = d3\n .select(treeContainer.value)\n .append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n const g = svg\n .append(\"g\")\n .attr(\"transform\", `translate(${margin.left}, ${margin.top})`);\n\n const zoom = d3Zoom\n .zoom<SVGSVGElement, unknown>()\n .scaleExtent([0.1, 4])\n .on(\"zoom\", (event) => {\n g.attr(\"transform\", event.transform);\n });\n\n svg.call(zoom);\n\n const centerX = 30;\n const centerY = height / 2 - treeData.x;\n const identity = (d3Zoom as any).zoomIdentity;\n svg.call(zoom.transform, identity.translate(centerX, centerY));\n\n // Links\n const linkPath = linkHorizontal<\n HierarchyPointLink<TreeNode>,\n HierarchyPointNode<TreeNode>\n >()\n .x((d) => d.y)\n .y((d) => d.x);\n\n g.selectAll(\"path.link\")\n .data(treeData.links())\n .enter()\n .append(\"path\")\n .attr(\"d\", (d) => linkPath(d))\n .attr(\"class\", (d) => {\n const link = d.target.data.active\n ? `${props.colorPath} stroke-2`\n : \"stroke-black dark:stroke-white\";\n return `${link} link fill-none`;\n });\n\n // Nodes\n const node = g\n .selectAll(\"g.node\")\n .data(treeData.descendants())\n .enter()\n .append(\"g\")\n .attr(\"class\", \"node\")\n .attr(\"transform\", (d) => `translate(${d.y}, ${d.x})`)\n .style(\"cursor\", (d) =>\n d.data.component || d.data.text ? \"pointer\" : \"default\"\n )\n .each(function (d) {\n if (d.data.component || d.data.text) {\n d3.select(this).on(\"click\", (_event) => handleNodeClick(d.data));\n }\n });\n //.style('cursor', 'pointer')\n //.on('click', (_event, d) => handleNodeClick(d.data))\n\n node.each(function (d) {\n const group = d3.select(this);\n\n // Append text temporarily\n const text = group\n .append(\"text\")\n .attr(\"class\", \"text-sm font-semibold fill-black dark:fill-white\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .text((d.data.label) ? d.data.label : d.data.name);\n\n // Get bounding box to determine text size\n const bbox = (text.node() as SVGTextElement).getBBox();\n const paddingX = 10;\n const paddingY = 10;\n\n const width = bbox.width + paddingX * 2;\n const height = bbox.height + paddingY * 2;\n\n // Draw rect using text size\n group\n .insert(\"rect\", \"text\")\n .attr(\"class\", props.colorRect)\n .attr(\"x\", -width / 2)\n .attr(\"y\", -height / 2)\n .attr(\"width\", width)\n .attr(\"height\", height)\n .attr(\"rx\", 4)\n .attr(\"ry\", 4);\n });\n\n node\n .append(\"text\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .attr(\"class\", \"text-sm font-semibold fill-white dark:fill-black\")\n .attr(\"text-anchor\", \"middle\")\n .text((d) => {return (d.data.label) ? d.data.label : d.data.name})\n .style(\"pointer-events\", \"none\");\n};\n\nconst maxW = computed(() => {\n return `${props.maxWidth.toString()}px`;\n});\n\nconst maxH = computed(() => {\n return `${props.maxWidth.toString()}px`;\n});\n</script>\n\n<template>\n <div>\n <div\n ref=\"treeWrapper\"\n class=\"ep-tree-wrapper mx-auto\"\n :style=\"{ maxHeight: maxH, maxWidth: maxW }\"\n >\n <div ref=\"treeContainer\" class=\"ep-tree-container\" />\n </div>\n <EpModal v-model=\"showModal\" :title=\"currentNode.title\" v-if=\"currentNode\">\n <div v-if=\"currentNode.text\" v-html=\"useRenderText(currentNode.text)\" />\n <template v-if=\"currentRenderComponent && currentNode.component\">\n <component\n :is=\"currentRenderComponent\"\n v-bind=\"{ ...currentNode.component.data }\"\n />\n </template>\n <div class=\"flex justify-end\">\n <EpBtn @click=\"closeModal\" type=\"error\" outlined rounded>{{\n labelClose\n }}</EpBtn>\n </div>\n </EpModal>\n </div>\n</template>\n\n<style scoped>\n.ep-tree-wrapper {\n overflow: auto;\n border: 1px solid #ddd;\n}\n\n.ep-tree-container {\n width: 100%;\n overflow-x: auto;\n}\n</style>\n"],"names":["width","height","_createElementBlock","_createElementVNode","_normalizeStyle","_createBlock","EpModal","_unref","_openBlock","_resolveDynamicComponent","_normalizeProps","_mergeProps","_createVNode","EpBtn","labelClose"],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { defineComponent, ref, createElementBlock, openBlock, normalizeClass, createElementVNode, createCommentVNode, toDisplayString, unref, createVNode, Fragment, renderList, createTextVNode } from "vue";
2
+ import { useRenderText } from "../../composables/useRenderText.js";
3
+ import _sfc_main$1 from "./EpVideo.vue.js";
4
+ const _hoisted_1 = { class: "w-2/3" };
5
+ const _hoisted_2 = {
6
+ key: 0,
7
+ class: "my-3"
8
+ };
9
+ const _hoisted_3 = { class: "text-2xl font-bold" };
10
+ const _hoisted_4 = ["innerHTML"];
11
+ const _hoisted_5 = { key: 1 };
12
+ const _hoisted_6 = {
13
+ key: 2,
14
+ class: "p-6 flex justify-center items-center"
15
+ };
16
+ const _hoisted_7 = { class: "w-1/3" };
17
+ const _hoisted_8 = { class: "flex justify-between items-center my-5" };
18
+ const _hoisted_9 = { class: "overflow-y-auto flex flex-col justify-start" };
19
+ const _hoisted_10 = ["onClick"];
20
+ const _hoisted_11 = { class: "mr-2 font-bold" };
21
+ const _hoisted_12 = {
22
+ key: 1,
23
+ class: "m-4 text-center"
24
+ };
25
+ const _sfc_main = /* @__PURE__ */ defineComponent({
26
+ __name: "EpPlaylist",
27
+ props: {
28
+ videos: {}
29
+ },
30
+ setup(__props) {
31
+ const playingVideo = ref(0);
32
+ return (_ctx, _cache) => {
33
+ var _a;
34
+ return openBlock(), createElementBlock("div", {
35
+ class: normalizeClass(`flex gap-3 ${_ctx.videos.length != 0 ? "h-[500px]" : ""}`)
36
+ }, [
37
+ createElementVNode("div", _hoisted_1, [
38
+ _ctx.videos.length != 0 ? (openBlock(), createElementBlock("div", _hoisted_2, [
39
+ createElementVNode("h2", _hoisted_3, toDisplayString(_ctx.videos[playingVideo.value].title), 1),
40
+ _ctx.videos[playingVideo.value].description ? (openBlock(), createElementBlock("p", {
41
+ key: 0,
42
+ innerHTML: unref(useRenderText)((_a = _ctx.videos[playingVideo.value].description) != null ? _a : "")
43
+ }, null, 8, _hoisted_4)) : createCommentVNode("", true)
44
+ ])) : createCommentVNode("", true),
45
+ _ctx.videos.length != 0 ? (openBlock(), createElementBlock("div", _hoisted_5, [
46
+ createVNode(_sfc_main$1, {
47
+ src: _ctx.videos[playingVideo.value].src
48
+ }, null, 8, ["src"])
49
+ ])) : (openBlock(), createElementBlock("div", _hoisted_6, "Aucune vidéo"))
50
+ ]),
51
+ createElementVNode("div", _hoisted_7, [
52
+ createElementVNode("div", _hoisted_8, [
53
+ _cache[0] || (_cache[0] = createElementVNode("span", { class: "font-bold" }, "Liste de vidéos", -1)),
54
+ createElementVNode("span", null, toDisplayString(_ctx.videos.length) + " vidéos", 1)
55
+ ]),
56
+ createElementVNode("div", _hoisted_9, [
57
+ _ctx.videos.length != 0 ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(_ctx.videos, (video, index) => {
58
+ return openBlock(), createElementBlock("p", {
59
+ class: normalizeClass(`p-4 rounded-lg cursor-pointer
60
+ ${index === playingVideo.value ? "bg-surface-2-dark text-white dark:bg-neutral-200 dark:text-surface-2-dark" : "hover:bg-neutral-200 dark:hover:bg-surface-2-dark"}`),
61
+ key: index,
62
+ onClick: () => {
63
+ playingVideo.value = index;
64
+ }
65
+ }, [
66
+ createElementVNode("span", _hoisted_11, toDisplayString(index + 1), 1),
67
+ _cache[1] || (_cache[1] = createTextVNode()),
68
+ createElementVNode("span", null, toDisplayString(video.title), 1)
69
+ ], 10, _hoisted_10);
70
+ }), 128)) : (openBlock(), createElementBlock("p", _hoisted_12, "Aucune vidéo"))
71
+ ])
72
+ ])
73
+ ], 2);
74
+ };
75
+ }
76
+ });
77
+ export {
78
+ _sfc_main as default
79
+ };
80
+ //# sourceMappingURL=EpPlaylist.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EpPlaylist.vue.js","sources":["../../../src/components/medias/EpPlaylist.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { useRenderText } from '~/composables/useRenderText';\nimport type { EpPlaylistProps } from '~/types/medias/EpPlaylist';\nimport EpVideo from './EpVideo.vue';\n\nconst props = withDefaults(defineProps<EpPlaylistProps>(), {\n});\n\nconst playingVideo = ref<number>(0);\n\n</script>\n\n<template>\n <div :class=\"`flex gap-3 ${(videos.length != 0) ? 'h-[500px]' : ''}`\">\n <div class=\"w-2/3\">\n <div class=\"my-3\" v-if=\"videos.length != 0\">\n <h2 class=\"text-2xl font-bold\">{{ videos[playingVideo].title }}</h2>\n <p v-if=\"videos[playingVideo].description\" v-html=\"useRenderText(videos[playingVideo].description ?? '')\"></p>\n </div>\n <div v-if=\"videos.length != 0\">\n <EpVideo\n :src=\"videos[playingVideo].src\"\n />\n </div>\n <div v-else class=\"p-6 flex justify-center items-center\">Aucune vidéo</div>\n </div>\n <div class=\"w-1/3\">\n <div class=\"flex justify-between items-center my-5\">\n <span class=\"font-bold\">Liste de vidéos</span>\n <span>{{ videos.length }} vidéos</span>\n </div>\n <div class=\"overflow-y-auto flex flex-col justify-start\">\n <p\n v-if=\"videos.length != 0\"\n :class=\"`p-4 rounded-lg cursor-pointer \n ${(index === playingVideo)? 'bg-surface-2-dark text-white dark:bg-neutral-200 dark:text-surface-2-dark' : 'hover:bg-neutral-200 dark:hover:bg-surface-2-dark'}`\"\n v-for=\"video, index in videos\" :key=\"index\"\n @click=\"() => {playingVideo = index}\"\n >\n <span class=\"mr-2 font-bold\">{{index + 1}}</span> <span>{{ video.title }}</span>\n </p>\n <p v-else class=\"m-4 text-center\">Aucune vidéo</p>\n </div>\n </div>\n </div>\n</template>\n"],"names":["_createElementBlock","_normalizeClass","videos","_createElementVNode","_openBlock","_toDisplayString","_unref","_createVNode","EpVideo","_Fragment","_renderList"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,UAAM,eAAe,IAAY,CAAC;;;0BAKhCA,mBA+BM,OAAA;AAAA,QA/BA,OAAKC,eAAA,cAAiBC,KAAAA,OAAO,UAAM,IAAA,cAAA,EAAA,EAAA;AAAA,MAAA;QACvCC,mBAWM,OAXN,YAWM;AAAA,UAVsBD,KAAAA,OAAO,UAAM,KAArCE,aAAAJ,mBAGM,OAHN,YAGM;AAAA,YAFFG,mBAAoE,MAApE,YAAoEE,gBAAlCH,YAAO,aAAA,KAAY,EAAE,KAAK,GAAA,CAAA;AAAA,YACnDA,KAAAA,OAAO,aAAA,KAAY,EAAE,4BAA9BF,mBAA8G,KAAA;AAAA;cAAnE,WAAQM,MAAA,aAAA,GAAcJ,iBAAO,aAAA,KAAY,EAAE,gBAArBA,YAAgC,EAAA;AAAA,YAAA;;UAE1FA,KAAAA,OAAO,UAAM,kBAAxBF,mBAIM,OAAA,YAAA;AAAA,YAHFO,YAEEC,aAAA;AAAA,cADG,KAAKN,KAAAA,OAAO,aAAA,KAAY,EAAE;AAAA,YAAA;8BAGnCF,mBAA2E,OAA3E,YAAyD,cAAY;AAAA,QAAA;QAEzEG,mBAiBM,OAjBN,YAiBM;AAAA,UAhBFA,mBAGM,OAHN,YAGM;AAAA,YAFF,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAA,mBAA8C,QAAA,EAAxC,OAAM,YAAA,GAAY,mBAAe,EAAA;AAAA,YACvCA,mBAAuC,QAAA,MAAAE,gBAA9BH,KAAAA,OAAO,MAAM,IAAG,WAAO,CAAA;AAAA,UAAA;UAEpCC,mBAWM,OAXN,YAWM;AAAA,YATQD,KAAAA,OAAO,UAAM,KADvBE,UAAA,IAAA,GAAAJ,mBAQIS,UAAA,EAAA,KAAA,KAAAC,WAJuBR,KAAAA,QAAM,CAAtB,OAAO,UAAK;kCAJvBF,mBAQI,KAAA;AAAA,gBANC,OAAKC,eAAA;AAAA,8BAAiE,UAAU,aAAA,QAAY,8EAAA,mDAAA,EAAA;AAAA,gBAE7D,KAAK;AAAA,gBACpC,SAAK,MAAA;AAAS,+BAAA,QAAe;AAAA,gBAAK;AAAA,cAAA;gBAEnCE,mBAAiD,QAAjD,aAAiDE,gBAAlB,QAAK,CAAA,GAAA,CAAA;AAAA;gBAAcF,mBAA8B,QAAA,MAAAE,gBAArB,MAAM,KAAK,GAAA,CAAA;AAAA,cAAA;sCAE1EL,mBAAkD,KAAlD,aAAkC,cAAY;AAAA,UAAA;;;;;;"}
@@ -0,0 +1,5 @@
1
+ import _sfc_main from "./EpPlaylist.vue.js";
2
+ export {
3
+ _sfc_main as default
4
+ };
5
+ //# sourceMappingURL=EpPlaylist.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EpPlaylist.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,85 +1,4 @@
1
- import { defineComponent, computed, createElementBlock, openBlock, normalizeClass, createElementVNode, createVNode, unref, toDisplayString, normalizeStyle } from "vue";
2
- import { Handle, Position } from "@vue-flow/core";
3
- import _sfc_main$1 from "../basics/EpIcon.vue.js";
4
- import { useRenderText } from "../../composables/useRenderText.js";
5
- const _hoisted_1 = ["innerHTML"];
6
- const plug = "M17,16H21V14H17V10H21V8H17V8C17,7 16,6 15,6H9.5L6,9.5H3V14.5H6L9.5,18H15C16,18 17,17 17,16Z";
7
- const socket = "M7,16C7,17 8,18 9,18H14.5L18,14.5H21V9.5H18L14.5,6H9C8,6 7,7 7,8Z M7 19 L7 5";
8
- const _sfc_main = /* @__PURE__ */ defineComponent({
9
- __name: "AssociationNode",
10
- props: {
11
- id: {},
12
- type: {},
13
- selected: { type: Boolean },
14
- connectable: { type: [Boolean, Number, String, Function] },
15
- position: {},
16
- dimensions: {},
17
- label: {},
18
- isValidTargetPos: {},
19
- isValidSourcePos: {},
20
- parent: {},
21
- parentNodeId: {},
22
- dragging: { type: Boolean },
23
- resizing: { type: Boolean },
24
- zIndex: {},
25
- targetPosition: {},
26
- sourcePosition: {},
27
- dragHandle: {},
28
- data: {},
29
- events: {}
30
- },
31
- setup(__props) {
32
- const props = __props;
33
- const colorStyle = computed(() => {
34
- if (!props.data.mode || props.data.mode == "neutral") {
35
- return "border-2 border-black dark:border-white";
36
- }
37
- if (props.data.mode == "correct") {
38
- return "border-2 border-green-600";
39
- } else if (props.data.mode == "wrong") {
40
- return "border-2 border-red-600";
41
- }
42
- });
43
- return (_ctx, _cache) => {
44
- return openBlock(), createElementBlock("div", {
45
- class: normalizeClass(`shadow-lg rounded w-96 relative bg-surface-2 dark:bg-surface-2-dark ${colorStyle.value}`)
46
- }, [
47
- createElementVNode("div", {
48
- class: "px-4 py-2 break-words",
49
- innerHTML: unref(useRenderText)(_ctx.data.label)
50
- }, null, 8, _hoisted_1),
51
- createElementVNode("span", {
52
- class: normalizeClass(`rounded-full w-6 h-6 flex justify-center bg-white dark:bg-neutral-800 items-center absolute bottom-1/3 ${_ctx.data.left ? "-left-3" : "-right-3"} ${colorStyle.value}`)
53
- }, toDisplayString(_ctx.data.left ? String.fromCharCode(65 + _ctx.data.index) : _ctx.data.index), 3),
54
- createVNode(unref(Handle), {
55
- type: _ctx.data.left ? "source" : "target",
56
- position: _ctx.data.left ? unref(Position).Right : unref(Position).Left,
57
- style: normalizeStyle({
58
- width: "20px",
59
- // handle invisible, pas d’espace
60
- height: "20px",
61
- top: "50%",
62
- zIndex: "100",
63
- transform: "translateY(-50%)",
64
- left: _ctx.data.left ? "96%" : "-10px",
65
- opacity: 0
66
- })
67
- }, null, 8, ["type", "position", "style"]),
68
- createVNode(_sfc_main$1, {
69
- "icon-path": _ctx.data.left ? plug : socket,
70
- style: normalizeStyle({
71
- position: "absolute",
72
- width: "30px",
73
- height: "30px",
74
- top: "50%",
75
- transform: "translateY(-50%)",
76
- left: _ctx.data.left ? "97%" : "-20px"
77
- })
78
- }, null, 8, ["icon-path", "style"])
79
- ], 2);
80
- };
81
- }
82
- });
1
+ import _sfc_main from "./AssociationNode.vue2.js";
83
2
  export {
84
3
  _sfc_main as default
85
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AssociationNode.vue.js","sources":["../../../src/components/tools/AssociationNode.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { Position, Handle } from '@vue-flow/core'\nimport type { NodeProps } from '@vue-flow/core'\nimport EpIcon from '../basics/EpIcon.vue'\nimport { useRenderText } from '~/composables/useRenderText';\n\n\nconst plug = 'M17,16H21V14H17V10H21V8H17V8C17,7 16,6 15,6H9.5L6,9.5H3V14.5H6L9.5,18H15C16,18 17,17 17,16Z';\nconst socket = 'M7,16C7,17 8,18 9,18H14.5L18,14.5H21V9.5H18L14.5,6H9C8,6 7,7 7,8Z M7 19 L7 5';\n\ninterface AssociationData {\n mode?: 'neutral' | 'correct' | 'wrong';\n left: boolean;\n index: number;\n label: string;\n}\n\nconst props = withDefaults(defineProps<NodeProps<AssociationData>>(), {});\n\nconst colorStyle = computed(() => {\n if(!props.data.mode || props.data.mode == 'neutral') {\n return 'border-2 border-black dark:border-white'\n }\n if(props.data.mode == 'correct') {\n return 'border-2 border-green-600'\n } else if(props.data.mode == 'wrong') {\n return 'border-2 border-red-600'\n }\n});\n\n</script>\n\n<template>\n <div :class=\"`shadow-lg rounded w-96 relative bg-surface-2 dark:bg-surface-2-dark ${colorStyle}`\">\n <div class=\"px-4 py-2 break-words\" v-html=\"useRenderText(data.label)\"></div>\n <span :class=\"`rounded-full w-6 h-6 flex justify-center bg-white dark:bg-neutral-800 items-center absolute bottom-1/3 ${(data.left)? '-left-3' : '-right-3'} ${colorStyle}`\">{{ (data.left)? String.fromCharCode(65 + data.index) : data.index }}</span>\n\n <Handle\n :type=\"data.left ? 'source' : 'target'\"\n :position=\"data.left ? Position.Right : Position.Left\"\n :style=\"{\n width: '20px', // handle invisible, pas d’espace\n height: '20px',\n top: '50%',\n zIndex: '100',\n transform: 'translateY(-50%)',\n left: data.left ? '96%' : '-10px',\n opacity: 0\n }\"\n />\n <EpIcon \n :icon-path=\"data.left ? plug : socket\"\n :style=\"{\n position: 'absolute',\n width: '30px',\n height: '30px',\n top: '50%',\n transform: 'translateY(-50%)',\n left: data.left ? '97%' : '-20px'\n }\" \n />\n </div>\n</template>\n"],"names":["_createElementBlock","_createElementVNode","_unref","data","_normalizeClass","_createVNode","_normalizeStyle","EpIcon"],"mappings":";;;;;AAQA,MAAM,OAAO;AACb,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;AASf,UAAM,QAAQ;AAEd,UAAM,aAAa,SAAS,MAAM;AAC9B,UAAG,CAAC,MAAM,KAAK,QAAQ,MAAM,KAAK,QAAQ,WAAW;AACjD,eAAO;AAAA,MACX;AACA,UAAG,MAAM,KAAK,QAAQ,WAAW;AAC7B,eAAO;AAAA,MACX,WAAU,MAAM,KAAK,QAAQ,SAAS;AAClC,eAAO;AAAA,MACX;AAAA,IACJ,CAAC;;0BAKGA,mBA4BM,OAAA;AAAA,QA5BA,6FAA8E,WAAA,KAAU,EAAA;AAAA,MAAA;QAC1FC,mBAA4E,OAAA;AAAA,UAAvE,OAAM;AAAA,UAAwB,WAAQC,MAAA,aAAA,EAAcC,KAAAA,KAAK,KAAK;AAAA,QAAA;QACnEF,mBAAwP,QAAA;AAAA,UAAjP,OAAKG,eAAA,0GAA6GD,KAAAA,KAAK,iCAAiC,WAAA,KAAU,EAAA;AAAA,QAAA,GAAQA,gBAAAA,KAAAA,KAAK,OAAO,OAAO,aAAY,KAAMA,KAAAA,KAAK,KAAK,IAAIA,KAAAA,KAAK,KAAK,GAAA,CAAA;AAAA,QAE9OE,YAYEH,MAAA,MAAA,GAAA;AAAA,UAXG,MAAMC,KAAAA,KAAK,OAAI,WAAA;AAAA,UACf,UAAUA,KAAAA,KAAK,OAAOD,MAAA,QAAA,EAAS,QAAQA,MAAA,QAAA,EAAS;AAAA,UAChD,OAAKI,eAAA;AAAA;;;;;;YAAuOH,MAAAA,KAAAA,KAAK,OAAI,QAAA;AAAA;;;QAU1PE,YAUEE,aAAA;AAAA,UATG,aAAWJ,KAAAA,KAAK,OAAO,OAAO;AAAA,UAC9B,OAAKG,eAAA;AAAA;;;;;YAA0MH,MAAAA,KAAAA,KAAK,OAAI,QAAA;AAAA,UAAA;;;;;;"}
1
+ {"version":3,"file":"AssociationNode.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,4 +1,85 @@
1
- import _sfc_main from "./AssociationNode.vue.js";
1
+ import { defineComponent, computed, createElementBlock, openBlock, normalizeClass, createElementVNode, createVNode, unref, toDisplayString, normalizeStyle } from "vue";
2
+ import { Handle, Position } from "@vue-flow/core";
3
+ import _sfc_main$1 from "../basics/EpIcon.vue.js";
4
+ import { useRenderText } from "../../composables/useRenderText.js";
5
+ const _hoisted_1 = ["innerHTML"];
6
+ const plug = "M17,16H21V14H17V10H21V8H17V8C17,7 16,6 15,6H9.5L6,9.5H3V14.5H6L9.5,18H15C16,18 17,17 17,16Z";
7
+ const socket = "M7,16C7,17 8,18 9,18H14.5L18,14.5H21V9.5H18L14.5,6H9C8,6 7,7 7,8Z M7 19 L7 5";
8
+ const _sfc_main = /* @__PURE__ */ defineComponent({
9
+ __name: "AssociationNode",
10
+ props: {
11
+ id: {},
12
+ type: {},
13
+ selected: { type: Boolean },
14
+ connectable: { type: [Boolean, Number, String, Function] },
15
+ position: {},
16
+ dimensions: {},
17
+ label: {},
18
+ isValidTargetPos: {},
19
+ isValidSourcePos: {},
20
+ parent: {},
21
+ parentNodeId: {},
22
+ dragging: { type: Boolean },
23
+ resizing: { type: Boolean },
24
+ zIndex: {},
25
+ targetPosition: {},
26
+ sourcePosition: {},
27
+ dragHandle: {},
28
+ data: {},
29
+ events: {}
30
+ },
31
+ setup(__props) {
32
+ const props = __props;
33
+ const colorStyle = computed(() => {
34
+ if (!props.data.mode || props.data.mode == "neutral") {
35
+ return "border-2 border-black dark:border-white";
36
+ }
37
+ if (props.data.mode == "correct") {
38
+ return "border-2 border-green-600";
39
+ } else if (props.data.mode == "wrong") {
40
+ return "border-2 border-red-600";
41
+ }
42
+ });
43
+ return (_ctx, _cache) => {
44
+ return openBlock(), createElementBlock("div", {
45
+ class: normalizeClass(`shadow-lg rounded w-96 relative bg-surface-2 dark:bg-surface-2-dark ${colorStyle.value}`)
46
+ }, [
47
+ createElementVNode("div", {
48
+ class: "px-4 py-2 break-words",
49
+ innerHTML: unref(useRenderText)(_ctx.data.label)
50
+ }, null, 8, _hoisted_1),
51
+ createElementVNode("span", {
52
+ class: normalizeClass(`rounded-full w-6 h-6 flex justify-center bg-white dark:bg-neutral-800 items-center absolute bottom-1/3 ${_ctx.data.left ? "-left-3" : "-right-3"} ${colorStyle.value}`)
53
+ }, toDisplayString(_ctx.data.left ? String.fromCharCode(65 + _ctx.data.index) : _ctx.data.index), 3),
54
+ createVNode(unref(Handle), {
55
+ type: _ctx.data.left ? "source" : "target",
56
+ position: _ctx.data.left ? unref(Position).Right : unref(Position).Left,
57
+ style: normalizeStyle({
58
+ width: "20px",
59
+ // handle invisible, pas d’espace
60
+ height: "20px",
61
+ top: "50%",
62
+ zIndex: "100",
63
+ transform: "translateY(-50%)",
64
+ left: _ctx.data.left ? "96%" : "-10px",
65
+ opacity: 0
66
+ })
67
+ }, null, 8, ["type", "position", "style"]),
68
+ createVNode(_sfc_main$1, {
69
+ "icon-path": _ctx.data.left ? plug : socket,
70
+ style: normalizeStyle({
71
+ position: "absolute",
72
+ width: "30px",
73
+ height: "30px",
74
+ top: "50%",
75
+ transform: "translateY(-50%)",
76
+ left: _ctx.data.left ? "97%" : "-20px"
77
+ })
78
+ }, null, 8, ["icon-path", "style"])
79
+ ], 2);
80
+ };
81
+ }
82
+ });
2
83
  export {
3
84
  _sfc_main as default
4
85
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AssociationNode.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"AssociationNode.vue2.js","sources":["../../../src/components/tools/AssociationNode.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { Position, Handle } from '@vue-flow/core'\nimport type { NodeProps } from '@vue-flow/core'\nimport EpIcon from '../basics/EpIcon.vue'\nimport { useRenderText } from '~/composables/useRenderText';\n\n\nconst plug = 'M17,16H21V14H17V10H21V8H17V8C17,7 16,6 15,6H9.5L6,9.5H3V14.5H6L9.5,18H15C16,18 17,17 17,16Z';\nconst socket = 'M7,16C7,17 8,18 9,18H14.5L18,14.5H21V9.5H18L14.5,6H9C8,6 7,7 7,8Z M7 19 L7 5';\n\ninterface AssociationData {\n mode?: 'neutral' | 'correct' | 'wrong';\n left: boolean;\n index: number;\n label: string;\n}\n\nconst props = withDefaults(defineProps<NodeProps<AssociationData>>(), {});\n\nconst colorStyle = computed(() => {\n if(!props.data.mode || props.data.mode == 'neutral') {\n return 'border-2 border-black dark:border-white'\n }\n if(props.data.mode == 'correct') {\n return 'border-2 border-green-600'\n } else if(props.data.mode == 'wrong') {\n return 'border-2 border-red-600'\n }\n});\n\n</script>\n\n<template>\n <div :class=\"`shadow-lg rounded w-96 relative bg-surface-2 dark:bg-surface-2-dark ${colorStyle}`\">\n <div class=\"px-4 py-2 break-words\" v-html=\"useRenderText(data.label)\"></div>\n <span :class=\"`rounded-full w-6 h-6 flex justify-center bg-white dark:bg-neutral-800 items-center absolute bottom-1/3 ${(data.left)? '-left-3' : '-right-3'} ${colorStyle}`\">{{ (data.left)? String.fromCharCode(65 + data.index) : data.index }}</span>\n\n <Handle\n :type=\"data.left ? 'source' : 'target'\"\n :position=\"data.left ? Position.Right : Position.Left\"\n :style=\"{\n width: '20px', // handle invisible, pas d’espace\n height: '20px',\n top: '50%',\n zIndex: '100',\n transform: 'translateY(-50%)',\n left: data.left ? '96%' : '-10px',\n opacity: 0\n }\"\n />\n <EpIcon \n :icon-path=\"data.left ? plug : socket\"\n :style=\"{\n position: 'absolute',\n width: '30px',\n height: '30px',\n top: '50%',\n transform: 'translateY(-50%)',\n left: data.left ? '97%' : '-20px'\n }\" \n />\n </div>\n</template>\n"],"names":["_createElementBlock","_createElementVNode","_unref","data","_normalizeClass","_createVNode","_normalizeStyle","EpIcon"],"mappings":";;;;;AAQA,MAAM,OAAO;AACb,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;AASf,UAAM,QAAQ;AAEd,UAAM,aAAa,SAAS,MAAM;AAC9B,UAAG,CAAC,MAAM,KAAK,QAAQ,MAAM,KAAK,QAAQ,WAAW;AACjD,eAAO;AAAA,MACX;AACA,UAAG,MAAM,KAAK,QAAQ,WAAW;AAC7B,eAAO;AAAA,MACX,WAAU,MAAM,KAAK,QAAQ,SAAS;AAClC,eAAO;AAAA,MACX;AAAA,IACJ,CAAC;;0BAKGA,mBA4BM,OAAA;AAAA,QA5BA,6FAA8E,WAAA,KAAU,EAAA;AAAA,MAAA;QAC1FC,mBAA4E,OAAA;AAAA,UAAvE,OAAM;AAAA,UAAwB,WAAQC,MAAA,aAAA,EAAcC,KAAAA,KAAK,KAAK;AAAA,QAAA;QACnEF,mBAAwP,QAAA;AAAA,UAAjP,OAAKG,eAAA,0GAA6GD,KAAAA,KAAK,iCAAiC,WAAA,KAAU,EAAA;AAAA,QAAA,GAAQA,gBAAAA,KAAAA,KAAK,OAAO,OAAO,aAAY,KAAMA,KAAAA,KAAK,KAAK,IAAIA,KAAAA,KAAK,KAAK,GAAA,CAAA;AAAA,QAE9OE,YAYEH,MAAA,MAAA,GAAA;AAAA,UAXG,MAAMC,KAAAA,KAAK,OAAI,WAAA;AAAA,UACf,UAAUA,KAAAA,KAAK,OAAOD,MAAA,QAAA,EAAS,QAAQA,MAAA,QAAA,EAAS;AAAA,UAChD,OAAKI,eAAA;AAAA;;;;;;YAAuOH,MAAAA,KAAAA,KAAK,OAAI,QAAA;AAAA;;;QAU1PE,YAUEE,aAAA;AAAA,UATG,aAAWJ,KAAAA,KAAK,OAAO,OAAO;AAAA,UAC9B,OAAKG,eAAA;AAAA;;;;;YAA0MH,MAAAA,KAAAA,KAAK,OAAI,QAAA;AAAA,UAAA;;;;;;"}
@@ -1,59 +1,4 @@
1
- import { defineComponent, ref, createElementBlock, openBlock, createVNode, createElementVNode, withCtx, createTextVNode, toDisplayString } from "vue";
2
- import _sfc_main$1 from "../interactions/EpModal.vue.js";
3
- /* empty css */
4
- import _sfc_main$4 from "../basics/EpBtn.vue.js";
5
- import _sfc_main$3 from "../basics/EpDivider.vue.js";
6
- import _sfc_main$2 from "./TextMedia.vue.js";
7
- const _hoisted_1 = { class: "flex justify-end" };
8
- const _hoisted_2 = { class: "text-white dark:text-neutral-900" };
9
- const _sfc_main = /* @__PURE__ */ defineComponent({
10
- __name: "Details",
11
- props: {
12
- title: { default: "Voir détails" },
13
- content: {},
14
- labelClose: { default: "Fermer" },
15
- media: {}
16
- },
17
- setup(__props) {
18
- const showModal = ref(false);
19
- return (_ctx, _cache) => {
20
- return openBlock(), createElementBlock("div", {
21
- class: "cursor-pointer rounded bg-primary py-2 px-4 flex flex-col items-center",
22
- onClick: _cache[2] || (_cache[2] = ($event) => showModal.value = true)
23
- }, [
24
- createVNode(_sfc_main$1, {
25
- modelValue: showModal.value,
26
- "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => showModal.value = $event),
27
- title: _ctx.title
28
- }, {
29
- default: withCtx(() => [
30
- createVNode(_sfc_main$2, {
31
- text: _ctx.content,
32
- media: _ctx.media,
33
- "text-left": ""
34
- }, null, 8, ["text", "media"]),
35
- createVNode(_sfc_main$3),
36
- createElementVNode("div", _hoisted_1, [
37
- createVNode(_sfc_main$4, {
38
- type: "error",
39
- rounded: "",
40
- size: "small",
41
- onClick: _cache[0] || (_cache[0] = ($event) => showModal.value = false)
42
- }, {
43
- default: withCtx(() => [
44
- createTextVNode(toDisplayString(_ctx.labelClose), 1)
45
- ]),
46
- _: 1
47
- })
48
- ])
49
- ]),
50
- _: 1
51
- }, 8, ["modelValue", "title"]),
52
- createElementVNode("p", _hoisted_2, toDisplayString(_ctx.title), 1)
53
- ]);
54
- };
55
- }
56
- });
1
+ import _sfc_main from "./Details.vue2.js";
57
2
  export {
58
3
  _sfc_main as default
59
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Details.vue.js","sources":["../../../src/components/tools/Details.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref } from \"vue\";\nimport EpModal from \"~/components/interactions/EpModal.vue\";\nimport type { NestedComponents } from \"~/types/Component\";\nimport EpBtn from \"~/components/basics/EpBtn.vue\";\nimport EpDivider from \"~/components/basics/EpDivider.vue\";\nimport TextMedia from \"./TextMedia.vue\";\nconst showModal = ref(false);\n\ninterface Props {\n title?: string;\n content: string;\n labelClose?: string;\n media?: NestedComponents;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: \"Voir détails\",\n labelClose: \"Fermer\",\n});\n</script>\n\n<template>\n <div\n class=\"cursor-pointer rounded bg-primary py-2 px-4 flex flex-col items-center\"\n @click=\"showModal = true\"\n >\n <EpModal v-model=\"showModal\" :title=\"title\">\n <TextMedia :text=\"content\" :media=\"media\" text-left />\n <EpDivider />\n <div class=\"flex justify-end\">\n <EpBtn type=\"error\" rounded size=\"small\" @click=\"showModal = false\">\n {{ labelClose }}\n </EpBtn>\n </div>\n </EpModal>\n <p class=\"text-white dark:text-neutral-900\">{{ title }}</p>\n </div>\n</template>\n"],"names":["_createElementBlock","_createVNode","EpModal","title","TextMedia","content","media","EpDivider","_createElementVNode","EpBtn","labelClose","_toDisplayString"],"mappings":";;;;;;;;;;;;;;;;;AAOA,UAAM,YAAY,IAAI,KAAK;;0BAgBzBA,mBAcM,OAAA;AAAA,QAbJ,OAAM;AAAA,QACL,+CAAO,UAAA,QAAS;AAAA,MAAA;QAEjBC,YAQUC,aAAA;AAAA,sBARQ,UAAA;AAAA,uEAAA,UAAS,QAAA;AAAA,UAAG,OAAOC,KAAAA;AAAAA,QAAAA;2BACnC,MAAsD;AAAA,YAAtDF,YAAsDG,aAAA;AAAA,cAA1C,MAAMC,KAAAA;AAAAA,cAAU,OAAOC,KAAAA;AAAAA,cAAO,aAAA;AAAA,YAAA;YAC1CL,YAAaM,WAAA;AAAA,YACbC,mBAIM,OAJN,YAIM;AAAA,cAHJP,YAEQQ,aAAA;AAAA,gBAFD,MAAK;AAAA,gBAAQ,SAAA;AAAA,gBAAQ,MAAK;AAAA,gBAAS,+CAAO,UAAA,QAAS;AAAA,cAAA;iCACxD,MAAgB;AAAA,kDAAbC,KAAAA,UAAU,GAAA,CAAA;AAAA,gBAAA;;;;;;;QAInBF,mBAA2D,KAA3D,YAA2DG,gBAAZR,KAAAA,KAAK,GAAA,CAAA;AAAA,MAAA;;;;"}
1
+ {"version":3,"file":"Details.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,4 +1,59 @@
1
- import _sfc_main from "./Details.vue.js";
1
+ import { defineComponent, ref, createElementBlock, openBlock, createVNode, createElementVNode, withCtx, createTextVNode, toDisplayString } from "vue";
2
+ import _sfc_main$1 from "../interactions/EpModal.vue.js";
3
+ /* empty css */
4
+ import _sfc_main$4 from "../basics/EpBtn.vue.js";
5
+ import _sfc_main$3 from "../basics/EpDivider.vue.js";
6
+ import _sfc_main$2 from "./TextMedia.vue2.js";
7
+ const _hoisted_1 = { class: "flex justify-end" };
8
+ const _hoisted_2 = { class: "text-white dark:text-neutral-900" };
9
+ const _sfc_main = /* @__PURE__ */ defineComponent({
10
+ __name: "Details",
11
+ props: {
12
+ title: { default: "Voir détails" },
13
+ content: {},
14
+ labelClose: { default: "Fermer" },
15
+ media: {}
16
+ },
17
+ setup(__props) {
18
+ const showModal = ref(false);
19
+ return (_ctx, _cache) => {
20
+ return openBlock(), createElementBlock("div", {
21
+ class: "cursor-pointer rounded bg-primary py-2 px-4 flex flex-col items-center",
22
+ onClick: _cache[2] || (_cache[2] = ($event) => showModal.value = true)
23
+ }, [
24
+ createVNode(_sfc_main$1, {
25
+ modelValue: showModal.value,
26
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => showModal.value = $event),
27
+ title: _ctx.title
28
+ }, {
29
+ default: withCtx(() => [
30
+ createVNode(_sfc_main$2, {
31
+ text: _ctx.content,
32
+ media: _ctx.media,
33
+ "text-left": ""
34
+ }, null, 8, ["text", "media"]),
35
+ createVNode(_sfc_main$3),
36
+ createElementVNode("div", _hoisted_1, [
37
+ createVNode(_sfc_main$4, {
38
+ type: "error",
39
+ rounded: "",
40
+ size: "small",
41
+ onClick: _cache[0] || (_cache[0] = ($event) => showModal.value = false)
42
+ }, {
43
+ default: withCtx(() => [
44
+ createTextVNode(toDisplayString(_ctx.labelClose), 1)
45
+ ]),
46
+ _: 1
47
+ })
48
+ ])
49
+ ]),
50
+ _: 1
51
+ }, 8, ["modelValue", "title"]),
52
+ createElementVNode("p", _hoisted_2, toDisplayString(_ctx.title), 1)
53
+ ]);
54
+ };
55
+ }
56
+ });
2
57
  export {
3
58
  _sfc_main as default
4
59
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Details.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"Details.vue2.js","sources":["../../../src/components/tools/Details.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref } from \"vue\";\nimport EpModal from \"~/components/interactions/EpModal.vue\";\nimport type { NestedComponents } from \"~/types/Component\";\nimport EpBtn from \"~/components/basics/EpBtn.vue\";\nimport EpDivider from \"~/components/basics/EpDivider.vue\";\nimport TextMedia from \"./TextMedia.vue\";\nconst showModal = ref(false);\n\ninterface Props {\n title?: string;\n content: string;\n labelClose?: string;\n media?: NestedComponents;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: \"Voir détails\",\n labelClose: \"Fermer\",\n});\n</script>\n\n<template>\n <div\n class=\"cursor-pointer rounded bg-primary py-2 px-4 flex flex-col items-center\"\n @click=\"showModal = true\"\n >\n <EpModal v-model=\"showModal\" :title=\"title\">\n <TextMedia :text=\"content\" :media=\"media\" text-left />\n <EpDivider />\n <div class=\"flex justify-end\">\n <EpBtn type=\"error\" rounded size=\"small\" @click=\"showModal = false\">\n {{ labelClose }}\n </EpBtn>\n </div>\n </EpModal>\n <p class=\"text-white dark:text-neutral-900\">{{ title }}</p>\n </div>\n</template>\n"],"names":["_createElementBlock","_createVNode","EpModal","title","TextMedia","content","media","EpDivider","_createElementVNode","EpBtn","labelClose","_toDisplayString"],"mappings":";;;;;;;;;;;;;;;;;AAOA,UAAM,YAAY,IAAI,KAAK;;0BAgBzBA,mBAcM,OAAA;AAAA,QAbJ,OAAM;AAAA,QACL,+CAAO,UAAA,QAAS;AAAA,MAAA;QAEjBC,YAQUC,aAAA;AAAA,sBARQ,UAAA;AAAA,uEAAA,UAAS,QAAA;AAAA,UAAG,OAAOC,KAAAA;AAAAA,QAAAA;2BACnC,MAAsD;AAAA,YAAtDF,YAAsDG,aAAA;AAAA,cAA1C,MAAMC,KAAAA;AAAAA,cAAU,OAAOC,KAAAA;AAAAA,cAAO,aAAA;AAAA,YAAA;YAC1CL,YAAaM,WAAA;AAAA,YACbC,mBAIM,OAJN,YAIM;AAAA,cAHJP,YAEQQ,aAAA;AAAA,gBAFD,MAAK;AAAA,gBAAQ,SAAA;AAAA,gBAAQ,MAAK;AAAA,gBAAS,+CAAO,UAAA,QAAS;AAAA,cAAA;iCACxD,MAAgB;AAAA,kDAAbC,KAAAA,UAAU,GAAA,CAAA;AAAA,gBAAA;;;;;;;QAInBF,mBAA2D,KAA3D,YAA2DG,gBAAZR,KAAAA,KAAK,GAAA,CAAA;AAAA,MAAA;;;;"}
@@ -1,58 +1,4 @@
1
- import { defineComponent, computed, createElementBlock, openBlock, normalizeClass, createElementVNode, createVNode, toDisplayString } from "vue";
2
- import _sfc_main$1 from "./RenderTextNode.vue.js";
3
- const _hoisted_1 = { class: "text-xl font-semibold mb-1" };
4
- const _sfc_main = /* @__PURE__ */ defineComponent({
5
- __name: "SegmentedBox",
6
- props: {
7
- uid: {},
8
- title: {},
9
- content: {},
10
- bgColor: { default: "bg-transparent" },
11
- widthFull: { type: Boolean, default: false },
12
- opacity: { type: Boolean, default: false },
13
- boxCenter: { type: Boolean, default: true },
14
- textCenter: { type: Boolean, default: true }
15
- },
16
- setup(__props) {
17
- const props = __props;
18
- const containerClasses = computed(() => ({
19
- "w-full": props.widthFull,
20
- "w-3/6": !props.widthFull,
21
- "mx-auto": props.boxCenter,
22
- "opacity-50": props.opacity
23
- }));
24
- const textColorClass = computed(() => {
25
- if (!props.bgColor || props.bgColor === "bg-transparent" || props.bgColor === "") {
26
- return "";
27
- }
28
- if (props.bgColor.includes("-700")) {
29
- return "text-white dark:text-neutral-900";
30
- }
31
- if (props.bgColor === "bg-black") {
32
- return "text-white dark:text-neutral-900";
33
- }
34
- return "";
35
- });
36
- const innerClasses = computed(() => [
37
- "border border-black dark:border-white p-4 rounded-md",
38
- props.textCenter ? "text-center" : "text-left",
39
- props.bgColor,
40
- textColorClass.value
41
- ]);
42
- return (_ctx, _cache) => {
43
- return openBlock(), createElementBlock("div", {
44
- class: normalizeClass([containerClasses.value, "mb-3"])
45
- }, [
46
- createElementVNode("div", {
47
- class: normalizeClass(innerClasses.value)
48
- }, [
49
- createElementVNode("h3", _hoisted_1, toDisplayString(_ctx.title), 1),
50
- createVNode(_sfc_main$1, { content: _ctx.content }, null, 8, ["content"])
51
- ], 2)
52
- ], 2);
53
- };
54
- }
55
- });
1
+ import _sfc_main from "./SegmentedBox.vue2.js";
56
2
  export {
57
3
  _sfc_main as default
58
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentedBox.vue.js","sources":["../../../src/components/tools/SegmentedBox.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {computed} from 'vue'\nimport RenderTextNode from \"~/components/tools/RenderTextNode.vue\";\nimport type { Box } from '~/types/educationals/EpSegmentedBox';\n\n\nconst props = withDefaults(defineProps<Box>(), {\n widthFull: false, \n boxCenter: true,\n opacity:false,\n bgColor:'bg-transparent',\n textCenter:true,\n})\n\nconst containerClasses = computed(() => ({\n 'w-full': props.widthFull,\n 'w-3/6': !props.widthFull,\n 'mx-auto': props.boxCenter,\n 'opacity-50': props.opacity\n}))\n\n\nconst textColorClass = computed(() => {\n if (!props.bgColor || props.bgColor === 'bg-transparent' || props.bgColor === '') {\n return ''\n }\n // Check if it's a dark shade (700, 500, or black)\n if (props.bgColor.includes('-700')) {\n return 'text-white dark:text-neutral-900'\n }\n if (props.bgColor === 'bg-black') {\n return 'text-white dark:text-neutral-900'\n }\n return ''\n})\n\nconst innerClasses = computed(() => [\n 'border border-black dark:border-white p-4 rounded-md',\n props.textCenter ? 'text-center' : 'text-left',\n props.bgColor, textColorClass.value\n])\n</script>\n\n<template>\n <div :class=\"containerClasses\" class=\"mb-3\">\n <div :class=\"innerClasses\">\n <h3 class=\"text-xl font-semibold mb-1\">{{ title }}</h3>\n <RenderTextNode :content=\"content\" />\n </div>\n </div>\n</template>"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","title","_createVNode","RenderTextNode","content"],"mappings":";;;;;;;;;;;;;;;;AAMA,UAAM,QAAQ;AAQd,UAAM,mBAAmB,SAAS,OAAO;AAAA,MACrC,UAAU,MAAM;AAAA,MAChB,SAAS,CAAC,MAAM;AAAA,MAChB,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,IAAA,EACtB;AAGF,UAAM,iBAAiB,SAAS,MAAM;AAClC,UAAI,CAAC,MAAM,WAAW,MAAM,YAAY,oBAAoB,MAAM,YAAY,IAAI;AAC9E,eAAO;AAAA,MACX;AAEA,UAAI,MAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,eAAO;AAAA,MACX;AACA,UAAI,MAAM,YAAY,YAAY;AAC9B,eAAO;AAAA,MACX;AACA,aAAO;AAAA,IACX,CAAC;AAED,UAAM,eAAe,SAAS,MAAM;AAAA,MACjC;AAAA,MACC,MAAM,aAAa,gBAAgB;AAAA,MACnC,MAAM;AAAA,MAAS,eAAe;AAAA,IAAA,CACjC;;0BAIEA,mBAKM,OAAA;AAAA,QALA,OAAKC,eAAA,CAAE,iBAAA,OAAwB,MAAM,CAAA;AAAA,MAAA;QACtCC,mBAGM,OAAA;AAAA,UAHA,sBAAO,aAAA,KAAY;AAAA,QAAA;UACrBA,mBAAuD,MAAvD,YAAuDC,gBAAbC,KAAAA,KAAK,GAAA,CAAA;AAAA,UAC/CC,YAAqCC,aAAA,EAApB,SAASC,KAAAA,QAAAA,GAAO,MAAA,GAAA,CAAA,SAAA,CAAA;AAAA,QAAA;;;;;"}
1
+ {"version":3,"file":"SegmentedBox.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}