mirror of
https://github.com/immich-app/immich
synced 2025-06-06 18:48:34 +00:00

* Squashed * Change strategy - now pre-measure buckets offscreen, so don't need to worry about sub-bucket scroll preservation * Reduce jank on scroll, delay DOM updates until after scroll * css opt, log measure time * Trickle out queue while scrolling, flush when stopped * yay * Cleanup cleanup... * everybody... * everywhere... * Clean up cleanup! * Everybody do their share * CLEANUP! * package-lock ? * dynamic measure, todo * Fix web test * type lint * fix e2e * e2e test * Better scrollbar * Tuning, and more tunables * Tunable tweaks, more tunables * Scrollbar dots and viewport events * lint * Tweaked tunnables, use requestIdleCallback for garbage tasks, bug fixes * New tunables, and don't update url by default * Bug fixes * Bug fix, with debug * Fix flickr, fix graybox bug, reduced debug * Refactor/cleanup * Fix * naming * Final cleanup * review comment * Forgot to update this after naming change * scrubber works, with debug * cleanup * Rename scrollbar to scrubber * rename to * left over rename and change to previous album bar * bugfix addassets, comments * missing destroy(), cleanup --------- Co-authored-by: Alex <alex.tran1502@gmail.com>
44 lines
1.4 KiB
TypeScript
44 lines
1.4 KiB
TypeScript
type OnResizeCallback = (resizeEvent: { target: HTMLElement; width: number; height: number }) => void;
|
|
|
|
let observer: ResizeObserver;
|
|
let callbacks: WeakMap<HTMLElement, OnResizeCallback>;
|
|
|
|
/**
|
|
* Installs a resizeObserver on the given element - when the element changes
|
|
* size, invokes a callback function with the width/height. Intended as a
|
|
* replacement for bind:clientWidth and bind:clientHeight in svelte4 which use
|
|
* an iframe to measure the size of the element, which can be bad for
|
|
* performance and memory usage. In svelte5, they adapted bind:clientHeight and
|
|
* bind:clientWidth to use an internal resize observer.
|
|
*
|
|
* TODO: When svelte5 is ready, go back to bind:clientWidth and
|
|
* bind:clientHeight.
|
|
*/
|
|
export function resizeObserver(element: HTMLElement, onResize: OnResizeCallback) {
|
|
if (!observer) {
|
|
callbacks = new WeakMap();
|
|
observer = new ResizeObserver((entries) => {
|
|
for (const entry of entries) {
|
|
const onResize = callbacks.get(entry.target as HTMLElement);
|
|
if (onResize) {
|
|
onResize({
|
|
target: entry.target as HTMLElement,
|
|
width: entry.borderBoxSize[0].inlineSize,
|
|
height: entry.borderBoxSize[0].blockSize,
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
callbacks.set(element, onResize);
|
|
observer.observe(element);
|
|
|
|
return {
|
|
destroy: () => {
|
|
callbacks.delete(element);
|
|
observer.unobserve(element);
|
|
},
|
|
};
|
|
}
|