Home / File/ size.js — svelte Source File

size.js — svelte Source File

Architecture documentation for size.js, a javascript file in the svelte codebase. 5 imports, 0 dependents.

File javascript ClientRuntime Hydration 5 imports 2 functions 1 classes

Entity Profile

Dependency Diagram

graph LR
  fe1dcfc3_17ce_7457_26bc_48c27d79cefc["size.js"]
  1ae6fa4e_16ee_acdf_5e28_17eb0819fddb["effects.js"]
  fe1dcfc3_17ce_7457_26bc_48c27d79cefc --> 1ae6fa4e_16ee_acdf_5e28_17eb0819fddb
  a985ae40_8ef8_7ef2_adad_116fbf97e70c["effect"]
  fe1dcfc3_17ce_7457_26bc_48c27d79cefc --> a985ae40_8ef8_7ef2_adad_116fbf97e70c
  20340432_01a2_6741_abf4_60ccab51cdb3["teardown"]
  fe1dcfc3_17ce_7457_26bc_48c27d79cefc --> 20340432_01a2_6741_abf4_60ccab51cdb3
  bde4209f_8ffc_1594_4024_b1835a44bcf6["runtime.js"]
  fe1dcfc3_17ce_7457_26bc_48c27d79cefc --> bde4209f_8ffc_1594_4024_b1835a44bcf6
  a814b193_e12a_4037_c3c8_dfd45f3bd0bb["untrack"]
  fe1dcfc3_17ce_7457_26bc_48c27d79cefc --> a814b193_e12a_4037_c3c8_dfd45f3bd0bb
  style fe1dcfc3_17ce_7457_26bc_48c27d79cefc fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import { effect, teardown } from '../../../reactivity/effects.js';
import { untrack } from '../../../runtime.js';

/**
 * We create one listener for all elements
 * @see {@link https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ Explanation}
 */
class ResizeObserverSingleton {
	/** */
	#listeners = new WeakMap();

	/** @type {ResizeObserver | undefined} */
	#observer;

	/** @type {ResizeObserverOptions} */
	#options;

	/** @static */
	static entries = new WeakMap();

	/** @param {ResizeObserverOptions} options */
	constructor(options) {
		this.#options = options;
	}

	/**
	 * @param {Element} element
	 * @param {(entry: ResizeObserverEntry) => any} listener
	 */
	observe(element, listener) {
		var listeners = this.#listeners.get(element) || new Set();
		listeners.add(listener);

		this.#listeners.set(element, listeners);
		this.#getObserver().observe(element, this.#options);

		return () => {
			var listeners = this.#listeners.get(element);
			listeners.delete(listener);

			if (listeners.size === 0) {
				this.#listeners.delete(element);
				/** @type {ResizeObserver} */ (this.#observer).unobserve(element);
			}
		};
	}

	#getObserver() {
		return (
			this.#observer ??
			(this.#observer = new ResizeObserver(
				/** @param {any} entries */ (entries) => {
					for (var entry of entries) {
						ResizeObserverSingleton.entries.set(entry.target, entry);
						for (var listener of this.#listeners.get(entry.target) || []) {
							listener(entry);
						}
					}
				}
			))
		);
	}
}

var resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({
	box: 'content-box'
});

var resize_observer_border_box = /* @__PURE__ */ new ResizeObserverSingleton({
	box: 'border-box'
});

var resize_observer_device_pixel_content_box = /* @__PURE__ */ new ResizeObserverSingleton({
	box: 'device-pixel-content-box'
});

/**
 * @param {Element} element
 * @param {'contentRect' | 'contentBoxSize' | 'borderBoxSize' | 'devicePixelContentBoxSize'} type
 * @param {(entry: keyof ResizeObserverEntry) => void} set
 */
export function bind_resize_observer(element, type, set) {
	var observer =
		type === 'contentRect' || type === 'contentBoxSize'
			? resize_observer_content_box
			: type === 'borderBoxSize'
				? resize_observer_border_box
				: resize_observer_device_pixel_content_box;

	var unsub = observer.observe(element, /** @param {any} entry */ (entry) => set(entry[type]));
	teardown(unsub);
}

/**
 * @param {HTMLElement} element
 * @param {'clientWidth' | 'clientHeight' | 'offsetWidth' | 'offsetHeight'} type
 * @param {(size: number) => void} set
 */
export function bind_element_size(element, type, set) {
	var unsub = resize_observer_border_box.observe(element, () => set(element[type]));

	effect(() => {
		// The update could contain reads which should be ignored
		untrack(() => set(element[type]));
		return unsub;
	});
}

Domain

Subdomains

Frequently Asked Questions

What does size.js do?
size.js is a source file in the svelte codebase, written in javascript. It belongs to the ClientRuntime domain, Hydration subdomain.
What functions are defined in size.js?
size.js defines 2 function(s): bind_element_size, bind_resize_observer.
What does size.js depend on?
size.js imports 5 module(s): effect, effects.js, runtime.js, teardown, untrack.
Where is size.js in the architecture?
size.js is located at packages/svelte/src/internal/client/dom/elements/bindings/size.js (domain: ClientRuntime, subdomain: Hydration, directory: packages/svelte/src/internal/client/dom/elements/bindings).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free