diff --git a/src/App.vue b/src/App.vue index 33211e8..04f5629 100644 --- a/src/App.vue +++ b/src/App.vue @@ -4,4 +4,6 @@ diff --git a/src/assets/css/creation.css b/src/assets/css/creation.css index 6fae9ea..6aef165 100644 --- a/src/assets/css/creation.css +++ b/src/assets/css/creation.css @@ -223,4 +223,4 @@ html { .disabled-button { opacity: 0.2; cursor: auto; -} \ No newline at end of file +} diff --git a/src/assets/css/graph.css b/src/assets/css/graph.css index 4a240b8..6604faf 100644 --- a/src/assets/css/graph.css +++ b/src/assets/css/graph.css @@ -13,7 +13,7 @@ background-color: var(--body-color); } -body>#app { +body > #app { margin: 0; font-family: "Formular"; height: 100%; @@ -308,7 +308,7 @@ header { width: 20px; height: 20px; opacity: 0.6; - transition: .2s; + transition: 0.2s; } .menu-icon:last-child { @@ -394,7 +394,8 @@ p { font-weight: 500; } -.menu-prompt, .prompt { +.menu-prompt, +.prompt { left: 100%; position: absolute; z-index: 6; @@ -410,7 +411,7 @@ p { border-radius: 4px; opacity: 0; box-shadow: 0px 1px 5px 1px 0px 1px 5px 1px rgb(56 58 63 / 35%); - transition: .2s; + transition: 0.2s; display: block; width: -webkit-max-content; width: -moz-max-content; @@ -457,10 +458,11 @@ p { transform: translate(-50%, 0); } -.menu-icon:hover .menu-prompt, .control-button:hover .prompt { +.menu-icon:hover .menu-prompt, +.control-button:hover .prompt { opacity: 1; visibility: visible; - transition-delay: .5s; + transition-delay: 0.5s; } .error { @@ -474,6 +476,7 @@ p { position: absolute; z-index: 5; box-shadow: 0px 1px 5px 1px rgb(56 58 63 / 15%); + cursor: pointer; } .popup-el.popup-button-cont { @@ -504,4 +507,23 @@ p { z-index: 0; color: gray; font-size: 14px; -} \ No newline at end of file +} + +.fade-enter-active { + animation: fade-in 0.5s; +} + +.fade-leave-active { + animation: fade-in 0.5s reverse; +} + +@keyframes fade-in { + from { + transform: translateY(-40px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} diff --git a/src/components/Graph.vue b/src/components/Graph.vue index 63f4a69..1972d51 100644 --- a/src/components/Graph.vue +++ b/src/components/Graph.vue @@ -4,6 +4,7 @@ ref="renderer" @dblclick="createNode" @click.left.stop="unselectAllNodes" + @contextmenu.prevent > { const node = nodes.value[coords]; @@ -117,7 +122,6 @@ export default { },${y}`; }; - // Methods const hasntIntersections = (node) => { return nodes.value.every((current) => { return ( @@ -127,13 +131,13 @@ export default { }); }; + // Nodes const activateNodes = (ids) => ids.forEach((e) => (nodes.value[e].selected = true)); const deactivateNodes = (ids) => ids.forEach((e) => (nodes.value[e].selected = false)); - // Nodes const createNode = ({ offsetX, offsetY }) => { if (nodes.value.length >= 99) return; @@ -167,6 +171,11 @@ export default { }; const selectNode = (id) => { + if (draggableNode) { + draggableNode = false; + return; + } + if (linker.sourceEmpty()) { linker.setSource(id); activateNodes([id]); @@ -207,19 +216,36 @@ export default { const nodeMove = ({ offsetX, offsetY }) => { const d = drag.value; + draggableNode = true; + nodes.value[d.id].x = offsetX - d.offsetX; nodes.value[d.id].y = offsetY - d.offsetY; }; // Links linker.onLink((source, target) => { + let duplicateLink = null; + + links.value.forEach((e, idx) => { + if ( + (e.source === source && e.target === target) || + (e.source === target && e.target === source) + ) + duplicateLink = idx; + }); + + if (duplicateLink !== null) { + links.value.splice(duplicateLink, 1); + return; + } + links.value.push({ selected: false, source, target, }); - euler.loadLinks([...links.value]); + euler.loadLinks(Object.values(links.value)); if (euler.check()) emit("isEuler", euler.find()); else emit("isEuler", []); @@ -254,7 +280,8 @@ svg { } circle, -line { +line, +path { cursor: pointer; } diff --git a/src/components/Guide.vue b/src/components/Guide.vue new file mode 100644 index 0000000..b8ae51a --- /dev/null +++ b/src/components/Guide.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/components/Matrix.vue b/src/components/Matrix.vue index 14a2103..a5e4677 100644 --- a/src/components/Matrix.vue +++ b/src/components/Matrix.vue @@ -1,24 +1,37 @@ diff --git a/src/components/Popup.vue b/src/components/Popup.vue new file mode 100644 index 0000000..4487c6f --- /dev/null +++ b/src/components/Popup.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/main.js b/src/main.js index 7bd294d..8d5c6b7 100644 --- a/src/main.js +++ b/src/main.js @@ -6,15 +6,16 @@ const app = createApp(App).use(router); app.directive("click-outside", { beforeMount(el, binding) { - el.clickOutsideEvent = function (event) { - if (!(el === event.target || el.contains(event.target))) { + const ourClickEventHandler = (event) => { + if (!el.contains(event.target) && el !== event.target) { binding.value(event, el); } }; - document.body.addEventListener("click", el.clickOutsideEvent); + el.__vueClickEventHandler__ = ourClickEventHandler; + document.addEventListener("click", ourClickEventHandler); }, unmounted(el) { - document.body.removeEventListener("click", el.clickOutsideEvent); + document.removeEventListener("click", el.__vueClickEventHandler__); }, }); diff --git a/src/views/Home.vue b/src/views/Home.vue deleted file mode 100644 index 654aa04..0000000 --- a/src/views/Home.vue +++ /dev/null @@ -1,64 +0,0 @@ - - - - - diff --git a/src/views/View.vue b/src/views/View.vue index 3884bc7..f7e8350 100644 --- a/src/views/View.vue +++ b/src/views/View.vue @@ -1,78 +1,38 @@ - -