@zag-js/element-rect
Advanced tools
Comparing version 0.0.0-dev-20230202113057 to 0.0.0-dev-20230326002806
@@ -5,4 +5,8 @@ type Fn = (rect: DOMRect) => void; | ||
}; | ||
declare function trackElementRect(el: Measurable, fn: Fn): () => void; | ||
type TrackScope = "size" | "position" | "rect"; | ||
type TrackRectOptions = { | ||
scope?: TrackScope; | ||
}; | ||
declare function trackElementRect(el: Measurable, fn: Fn, options?: TrackRectOptions): () => void; | ||
export { Measurable, trackElementRect }; |
@@ -26,9 +26,7 @@ "use strict"; | ||
module.exports = __toCommonJS(src_exports); | ||
function getObservedElements() { | ||
; | ||
globalThis.__rectObserverMap__ = globalThis.__rectObserverMap__ || /* @__PURE__ */ new Map(); | ||
return globalThis.__rectObserverMap__; | ||
} | ||
function trackElementRect(el, fn) { | ||
const observedElements = getObservedElements(); | ||
var rafId; | ||
var observedElements = /* @__PURE__ */ new Map(); | ||
function trackElementRect(el, fn, options = {}) { | ||
const { scope = "rect" } = options; | ||
const loop = getLoopFn(scope); | ||
const data = observedElements.get(el); | ||
@@ -63,20 +61,28 @@ if (!data) { | ||
} | ||
var rafId; | ||
function loop() { | ||
const observedElements = getObservedElements(); | ||
const changedRectsData = []; | ||
observedElements.forEach((data, element) => { | ||
const newRect = element.getBoundingClientRect(); | ||
if (!isEqual(data.rect, newRect)) { | ||
data.rect = newRect; | ||
changedRectsData.push(data); | ||
} | ||
}); | ||
changedRectsData.forEach((data) => { | ||
data.callbacks.forEach((callback) => callback(data.rect)); | ||
}); | ||
rafId = requestAnimationFrame(loop); | ||
function getLoopFn(scope) { | ||
const isEqual = getEqualityFn(scope); | ||
return function loop() { | ||
const changedRectsData = []; | ||
observedElements.forEach((data, element) => { | ||
const newRect = element.getBoundingClientRect(); | ||
if (!isEqual(data.rect, newRect)) { | ||
data.rect = newRect; | ||
changedRectsData.push(data); | ||
} | ||
}); | ||
changedRectsData.forEach((data) => { | ||
data.callbacks.forEach((callback) => callback(data.rect)); | ||
}); | ||
rafId = requestAnimationFrame(loop); | ||
}; | ||
} | ||
function isEqual(rect1, rect2) { | ||
return rect1.width === rect2.width && rect1.height === rect2.height && rect1.top === rect2.top && rect1.right === rect2.right && rect1.bottom === rect2.bottom && rect1.left === rect2.left; | ||
var isEqualSize = (a, b) => a.width === b.width && a.height === b.height; | ||
var isEqualPosition = (a, b) => a.top === b.top && a.right === b.right && a.bottom === b.bottom && a.left === b.left; | ||
var isEqualRect = (a, b) => isEqualSize(a, b) && isEqualPosition(a, b); | ||
function getEqualityFn(scope) { | ||
if (scope === "size") | ||
return isEqualSize; | ||
if (scope === "position") | ||
return isEqualPosition; | ||
return isEqualRect; | ||
} | ||
@@ -83,0 +89,0 @@ // Annotate the CommonJS export names for ESM import in node: |
{ | ||
"name": "@zag-js/element-rect", | ||
"version": "0.0.0-dev-20230202113057", | ||
"version": "0.0.0-dev-20230326002806", | ||
"description": "observe element's rect over time", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
Sorry, the diff of this file is not supported yet
7914
164