diff --git a/packages/client/src/components/HoverIndicator.svelte b/packages/client/src/components/HoverIndicator.svelte
index 1dcaa0f422..bb5db38d73 100644
--- a/packages/client/src/components/HoverIndicator.svelte
+++ b/packages/client/src/components/HoverIndicator.svelte
@@ -2,6 +2,7 @@
import { onMount, onDestroy } from "svelte"
import { builderStore } from "../store"
import Indicator from "./Indicator.svelte"
+ import { domDebounce } from "../utils/domDebounce"
let indicators = []
let interval
@@ -34,11 +35,17 @@
indicators = newIndicators
}
+ const debouncedUpdate = domDebounce(updatePosition)
const onMouseOver = e => {
const element = e.target.closest("[data-type='component']")
- componentId = element?.dataset?.id
- componentName = element?.dataset?.name
+ const newId = element?.dataset?.id
+ const newName = element?.dataset?.name
+ if (newId !== componentId) {
+ componentId = newId
+ componentName = newName
+ debouncedUpdate()
+ }
}
const onMouseLeave = () => {
@@ -47,27 +54,33 @@
}
onMount(() => {
- interval = setInterval(updatePosition, 100)
- window.addEventListener("mouseover", onMouseOver)
- document.documentElement.addEventListener("mouseleave", onMouseLeave)
+ debouncedUpdate()
+ interval = setInterval(debouncedUpdate, 100)
+ document.addEventListener("mouseover", onMouseOver)
+ document.addEventListener("mouseleave", onMouseLeave)
+ document.addEventListener("scroll", debouncedUpdate, true)
})
onDestroy(() => {
clearInterval(interval)
- window.removeEventListener("mouseover", onMouseOver)
- document.documentElement.removeEventListener("mouseleave", onMouseLeave)
+ document.removeEventListener("mouseover", onMouseOver)
+ document.removeEventListener("mouseleave", onMouseLeave)
+ document.removeEventListener("scroll", debouncedUpdate, true)
})
-{#if componentId !== $builderStore.selectedComponentId}
- {#each indicators as indicator, idx}
-
- {/each}
-{/if}
+{#key componentId}
+ {#if componentId !== $builderStore.selectedComponentId}
+ {#each indicators as indicator, idx}
+
+ {/each}
+ {/if}
+{/key}
diff --git a/packages/client/src/components/Indicator.svelte b/packages/client/src/components/Indicator.svelte
index 5eb626bf9f..015c66abab 100644
--- a/packages/client/src/components/Indicator.svelte
+++ b/packages/client/src/components/Indicator.svelte
@@ -1,13 +1,17 @@
diff --git a/packages/client/src/components/SelectionIndicator.svelte b/packages/client/src/components/SelectionIndicator.svelte
index a0265822bd..5e9a82e721 100644
--- a/packages/client/src/components/SelectionIndicator.svelte
+++ b/packages/client/src/components/SelectionIndicator.svelte
@@ -2,6 +2,7 @@
import { onMount, onDestroy } from "svelte"
import { builderStore } from "../store"
import Indicator from "./Indicator.svelte"
+ import { domDebounce } from "../utils/domDebounce"
let indicators = []
let interval
@@ -29,13 +30,17 @@
}
indicators = newIndicators
}
+ const debouncedUpdate = domDebounce(updatePosition)
onMount(() => {
- interval = setInterval(updatePosition, 100)
+ debouncedUpdate()
+ interval = setInterval(debouncedUpdate, 100)
+ document.addEventListener("scroll", debouncedUpdate, true)
})
onDestroy(() => {
clearInterval(interval)
+ document.removeEventListener("scroll", debouncedUpdate, true)
})
diff --git a/packages/client/src/components/SettingsBar.svelte b/packages/client/src/components/SettingsBar.svelte
index e8bfa30d93..1c72e2a951 100644
--- a/packages/client/src/components/SettingsBar.svelte
+++ b/packages/client/src/components/SettingsBar.svelte
@@ -2,6 +2,7 @@
import { onMount, onDestroy } from "svelte"
import SettingsButton from "./SettingsButton.svelte"
import { builderStore } from "../store"
+ import { domDebounce } from "../utils/domDebounce"
const verticalOffset = 28
const horizontalOffset = 2
@@ -63,13 +64,17 @@
measured = true
}
}
+ const debouncedUpdate = domDebounce(updatePosition)
onMount(() => {
- interval = setInterval(updatePosition, 100)
+ debouncedUpdate()
+ interval = setInterval(debouncedUpdate, 100)
+ document.addEventListener("scroll", debouncedUpdate, true)
})
onDestroy(() => {
clearInterval(interval)
+ document.removeEventListener("scroll", debouncedUpdate, true)
})
diff --git a/packages/client/src/utils/domDebounce.js b/packages/client/src/utils/domDebounce.js
new file mode 100644
index 0000000000..b7fc017247
--- /dev/null
+++ b/packages/client/src/utils/domDebounce.js
@@ -0,0 +1,12 @@
+export const domDebounce = callback => {
+ let active = false
+ return e => {
+ if (!active) {
+ window.requestAnimationFrame(() => {
+ callback(e)
+ active = false
+ })
+ active = true
+ }
+ }
+}