import {createRectInit, getContentRect} from './utils/geometry.js'; /** * Class that is responsible for computations of the content rectangle of * provided DOM element and for keeping track of it's changes. */ export default class ResizeObservation { /** * Reference to the observed element. * * @type {Element} */ target; /** * Broadcasted width of content rectangle. * * @type {number} */ broadcastWidth = 0; /** * Broadcasted height of content rectangle. * * @type {number} */ broadcastHeight = 0; /** * Reference to the last observed content rectangle. * * @private {DOMRectInit} */ contentRect_ = createRectInit(0, 0, 0, 0); /** * Creates an instance of ResizeObservation. * * @param {Element} target - Element to be observed. */ constructor(target) { this.target = target; } /** * Updates content rectangle and tells whether it's width or height properties * have changed since the last broadcast. * * @returns {boolean} */ isActive() { const rect = getContentRect(this.target); this.contentRect_ = rect; return ( rect.width !== this.broadcastWidth || rect.height !== this.broadcastHeight ); } /** * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data * from the corresponding properties of the last observed content rectangle. * * @returns {DOMRectInit} Last observed content rectangle. */ broadcastRect() { const rect = this.contentRect_; this.broadcastWidth = rect.width; this.broadcastHeight = rect.height; return rect; } }