@radix-ui/rect
Advanced tools
Comparing version 1.0.1 to 1.1.0-rc.1
@@ -1,2 +0,2 @@ | ||
export type Measurable = { | ||
declare type Measurable = { | ||
getBoundingClientRect(): ClientRect; | ||
@@ -9,3 +9,3 @@ }; | ||
*/ | ||
export function observeElementRect( | ||
declare function observeElementRect( | ||
/** The element whose rect to observe */ | ||
@@ -15,4 +15,4 @@ elementToObserve: Measurable, | ||
callback: CallbackFn): () => void; | ||
type CallbackFn = (rect: ClientRect) => void; | ||
declare type CallbackFn = (rect: ClientRect) => void; | ||
//# sourceMappingURL=index.d.ts.map | ||
export { type Measurable, observeElementRect }; |
@@ -1,70 +0,50 @@ | ||
function $parcel$export(e, n, v, s) { | ||
Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true}); | ||
} | ||
$parcel$export(module.exports, "observeElementRect", () => $f98399f7d3345a24$export$5a50ff2cde8c3802); | ||
/** | ||
* Observes an element's rectangle on screen (getBoundingClientRect) | ||
* This is useful to track elements on the screen and attach other elements | ||
* that might be in different layers, etc. | ||
*/ function $f98399f7d3345a24$export$5a50ff2cde8c3802(/** The element whose rect to observe */ elementToObserve, /** The callback which will be called when the rect changes */ callback) { | ||
const observedData1 = $f98399f7d3345a24$var$observedElements.get(elementToObserve); | ||
if (observedData1 === undefined) { | ||
// add the element to the map of observed elements with its first callback | ||
// because this is the first time this element is observed | ||
$f98399f7d3345a24$var$observedElements.set(elementToObserve, { | ||
rect: {}, | ||
callbacks: [ | ||
callback | ||
] | ||
}); | ||
if ($f98399f7d3345a24$var$observedElements.size === 1) // start the internal loop once at least 1 element is observed | ||
$f98399f7d3345a24$var$rafId = requestAnimationFrame($f98399f7d3345a24$var$runLoop); | ||
"use strict"; | ||
(() => { | ||
// packages/core/rect/src/observeElementRect.ts | ||
function observeElementRect(elementToObserve, callback) { | ||
const observedData = observedElements.get(elementToObserve); | ||
if (observedData === void 0) { | ||
observedElements.set(elementToObserve, { rect: {}, callbacks: [callback] }); | ||
if (observedElements.size === 1) { | ||
rafId = requestAnimationFrame(runLoop); | ||
} | ||
} else { | ||
// only add a callback for this element as it's already observed | ||
observedData1.callbacks.push(callback); | ||
callback(elementToObserve.getBoundingClientRect()); | ||
observedData.callbacks.push(callback); | ||
callback(elementToObserve.getBoundingClientRect()); | ||
} | ||
return ()=>{ | ||
const observedData = $f98399f7d3345a24$var$observedElements.get(elementToObserve); | ||
if (observedData === undefined) return; // start by removing the callback | ||
const index = observedData.callbacks.indexOf(callback); | ||
if (index > -1) observedData.callbacks.splice(index, 1); | ||
if (observedData.callbacks.length === 0) { | ||
// stop observing this element because there are no | ||
// callbacks registered for it anymore | ||
$f98399f7d3345a24$var$observedElements.delete(elementToObserve); | ||
if ($f98399f7d3345a24$var$observedElements.size === 0) // stop the internal loop once no elements are observed anymore | ||
cancelAnimationFrame($f98399f7d3345a24$var$rafId); | ||
return () => { | ||
const observedData2 = observedElements.get(elementToObserve); | ||
if (observedData2 === void 0) return; | ||
const index = observedData2.callbacks.indexOf(callback); | ||
if (index > -1) { | ||
observedData2.callbacks.splice(index, 1); | ||
} | ||
if (observedData2.callbacks.length === 0) { | ||
observedElements.delete(elementToObserve); | ||
if (observedElements.size === 0) { | ||
cancelAnimationFrame(rafId); | ||
} | ||
} | ||
}; | ||
} // ======================================================================== | ||
// module internals | ||
let $f98399f7d3345a24$var$rafId; | ||
const $f98399f7d3345a24$var$observedElements = new Map(); | ||
function $f98399f7d3345a24$var$runLoop() { | ||
const changedRectsData = []; // process all DOM reads first (getBoundingClientRect) | ||
$f98399f7d3345a24$var$observedElements.forEach((data, element)=>{ | ||
const newRect = element.getBoundingClientRect(); // gather all the data for elements whose rects have changed | ||
if (!$f98399f7d3345a24$var$rectEquals(data.rect, newRect)) { | ||
data.rect = newRect; | ||
changedRectsData.push(data); | ||
} | ||
}); // group DOM writes here after the DOM reads (getBoundingClientRect) | ||
// as DOM writes will most likely happen with the callbacks | ||
changedRectsData.forEach((data)=>{ | ||
data.callbacks.forEach((callback)=>callback(data.rect) | ||
); | ||
} | ||
var rafId; | ||
var observedElements = /* @__PURE__ */ new Map(); | ||
function runLoop() { | ||
const changedRectsData = []; | ||
observedElements.forEach((data, element) => { | ||
const newRect = element.getBoundingClientRect(); | ||
if (!rectEquals(data.rect, newRect)) { | ||
data.rect = newRect; | ||
changedRectsData.push(data); | ||
} | ||
}); | ||
$f98399f7d3345a24$var$rafId = requestAnimationFrame($f98399f7d3345a24$var$runLoop); | ||
} // ======================================================================== | ||
/** | ||
* Returns whether 2 rects are equal in values | ||
*/ function $f98399f7d3345a24$var$rectEquals(rect1, rect2) { | ||
changedRectsData.forEach((data) => { | ||
data.callbacks.forEach((callback) => callback(data.rect)); | ||
}); | ||
rafId = requestAnimationFrame(runLoop); | ||
} | ||
function rectEquals(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; | ||
} | ||
} | ||
})(); | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "@radix-ui/rect", | ||
"version": "1.0.1", | ||
"version": "1.1.0-rc.1", | ||
"license": "MIT", | ||
@@ -38,5 +38,3 @@ "exports": { | ||
}, | ||
"dependencies": { | ||
"@babel/runtime": "^7.13.10" | ||
} | ||
"stableVersion": "1.0.1" | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
0
15097
8
115
1
- Removed@babel/runtime@^7.13.10
- Removed@babel/runtime@7.25.6(transitive)
- Removedregenerator-runtime@0.14.1(transitive)