1
1
<script setup lang="ts">
2
- import { ref } from " vue" ;
2
+ import { ref , computed } from " vue" ;
3
3
import { useElementPosition , type SnapPosition } from " ./use-element-position" ;
4
4
import { useRoughArrow } from " ./use-rough-arrow" ;
5
5
@@ -22,13 +22,18 @@ const props = defineProps<{
22
22
seed? : number | string ;
23
23
}>();
24
24
25
- const container = ref <SVGSVGElement >();
25
+ const root = ref <HTMLElement >();
26
+ const slideContainer = computed (() => {
27
+ return root .value ?.closest (" .slidev-page" ) ?? undefined ;
28
+ });
29
+
30
+ const svgContainer = ref <SVGSVGElement >();
26
31
27
32
const point1 = props .id1
28
- ? useElementPosition (container , props .id1 , props .pos1 )
33
+ ? useElementPosition (slideContainer , svgContainer , props .id1 , props .pos1 )
29
34
: ref ({ x: Number (props .x1 ?? 0 ), y: Number (props .y1 ?? 0 ) });
30
35
const point2 = props .id2
31
- ? useElementPosition (container , props .id2 , props .pos2 )
36
+ ? useElementPosition (slideContainer , svgContainer , props .id2 , props .pos2 )
32
37
: ref ({ x: Number (props .x2 ?? 0 ), y: Number (props .y2 ?? 0 ) });
33
38
34
39
const { arcSvg, textPosition } = useRoughArrow ({
@@ -45,10 +50,10 @@ const { arcSvg, textPosition } = useRoughArrow({
45
50
</script >
46
51
47
52
<template >
48
- <div v-if =" point1 && point2" style =" position : absolute ; top : 0 ; left : 0 " >
49
- <!-- Use <div v-if> as a root element above because <template v-if> doesn't work with v-click on Slidev -->
53
+ <div ref =" root" style =" position : absolute ; top : 0 ; left : 0 " >
50
54
<svg
51
- ref =" container"
55
+ v-if =" point1 && point2"
56
+ ref =" svgContainer"
52
57
:class =" props.color ? `text-${props.color}` : ''"
53
58
style ="
54
59
position : absolute ;
@@ -62,7 +67,7 @@ const { arcSvg, textPosition } = useRoughArrow({
62
67
<g v-html =" arcSvg" />
63
68
</svg >
64
69
<div
65
- v-if =" $slots.default && textPosition"
70
+ v-if =" point1 && point2 && $slots.default && textPosition"
66
71
:style =" {
67
72
position: 'absolute',
68
73
left: `${textPosition.x}px`,
0 commit comments