diff --git a/app/src/components/QuestMap.vue b/app/src/components/QuestMap.vue index bf23cd0..93d203d 100644 --- a/app/src/components/QuestMap.vue +++ b/app/src/components/QuestMap.vue @@ -11,14 +11,12 @@ const { t, locale } = useI18n() const store = useUserProfile() const toast = useToast() -const svgWidth = ref(window.innerWidth) -const svgHeight = ref(window.innerHeight) - const marginX = 120 const marginY = 120 const nodeWidth = 160 const nodeHeight = 50 + const opened = ref(null) type Node = { id: string @@ -46,14 +44,18 @@ const dragStartY = ref(0) const offsetX = ref(0) const offsetY = ref(0) -function startDrag(event: MouseEvent) { +function startDrag(event: PointerEvent) { isDragging.value = true dragStartX.value = event.clientX - offsetX.value dragStartY.value = event.clientY - offsetY.value } -function drag(event: MouseEvent) { +function drag(event: PointerEvent) { if (!isDragging.value) return + // Capture only once dragging starts so plain clicks still reach the node buttons + const el = event.currentTarget as HTMLElement + if (!el.hasPointerCapture(event.pointerId)) + el.setPointerCapture(event.pointerId) offsetX.value = event.clientX - dragStartX.value offsetY.value = event.clientY - dragStartY.value } @@ -75,10 +77,8 @@ async function computeGraphData() { id: node.id, title: node.title, x: marginX * node.layer * 2, - y: - marginY * node.index - - (marginX * dag.getLayer(node.id)) / 2 + - svgHeight.value / 2, + // Centered on 0; the world container is anchored at the viewport's vertical center + y: (node.index - (dag.getLayer(node.id) + 1) / 2) * marginY, completed: store.progress[node.id]?.completed || false, unlocked: node.requirements.every( (req: string) => store.progress[req]?.completed @@ -123,14 +123,10 @@ watch(locale, () => { computeGraphData() }) -const curvedPath = computed(() => { +const edgePath = computed(() => { return (source: Node, target: Node) => { - // const dx = target.x - source.x - // const dy = target.y - source.y - // const dr = Math.sqrt(dx * dx + dy * dy) - const dr = 0 - const sweep = target.index > source.index ? 0 : 1 // Determines if the arc should curve up or down based on node index - return `M${source.x},${source.y}A${dr},${dr} 0 0,${sweep} ${target.x},${target.y}` + const mx = (source.x + target.x) / 2 + return `M${source.x},${source.y}C${mx},${source.y} ${mx},${target.y} ${target.x},${target.y}` } }) @@ -160,52 +156,44 @@ const edgeStyle = computed(() => { > {{ t('quest_map.intro') }} - - - +
+ - - + - - + {{ node.title }} + +
+ {