6
6
onWatcherCleanup ,
7
7
type Ref ,
8
8
} from "vue" ;
9
- import { useSlideContext , onSlideEnter } from "@slidev/client" ;
9
+ import { useSlideContext , useIsSlideActive } from "@slidev/client" ;
10
10
11
11
export type SnapPosition =
12
12
| "top"
@@ -25,27 +25,16 @@ export function useElementPosition(
25
25
pos ?: SnapPosition ,
26
26
) : Ref < { x : number ; y : number } | undefined > {
27
27
const { $scale } = useSlideContext ( ) ;
28
+ const isSlideActive = useIsSlideActive ( ) ;
29
+
28
30
const elem = computed ( ( ) => {
29
31
return slideContainer . value ?. querySelector ( selector ) ?? null ;
30
32
} ) ;
31
- watch (
32
- elem ,
33
- ( newVal ) => {
34
- if ( newVal ) {
35
- const observer = new MutationObserver ( update ) ;
36
- observer . observe ( newVal , { attributes : true } ) ;
37
33
38
- onWatcherCleanup ( ( ) => {
39
- observer . disconnect ( ) ;
40
- } ) ;
41
- }
42
- } ,
43
- { immediate : true } ,
44
- ) ;
45
34
const point = ref < { x : number ; y : number } | undefined > ( undefined ) ;
46
35
47
36
const update = ( ) => {
48
- if ( ! rootElement . value || ! elem . value ) {
37
+ if ( ! isSlideActive . value || ! rootElement . value || ! elem . value ) {
49
38
point . value = undefined ;
50
39
return ;
51
40
}
@@ -77,12 +66,28 @@ export function useElementPosition(
77
66
}
78
67
} ;
79
68
80
- onSlideEnter ( ( ) => {
69
+ watch ( isSlideActive , ( ) => {
81
70
setTimeout ( ( ) => {
71
+ // This `setTimeout` is important to ensure `update()` is called after the DOM elements in the slide are updated after `isSlideActive` is changed.
82
72
update ( ) ;
83
73
} ) ;
84
74
} ) ;
85
75
76
+ watch (
77
+ elem ,
78
+ ( newVal ) => {
79
+ if ( newVal ) {
80
+ const observer = new MutationObserver ( update ) ;
81
+ observer . observe ( newVal , { attributes : true } ) ;
82
+
83
+ onWatcherCleanup ( ( ) => {
84
+ observer . disconnect ( ) ;
85
+ } ) ;
86
+ }
87
+ } ,
88
+ { immediate : true } ,
89
+ ) ;
90
+
86
91
onMounted ( ( ) => {
87
92
update ( ) ;
88
93
0 commit comments