immich/web/src/lib/components/shared-components/single-grid-row.svelte
Michel Heusschen 5acdc958b6
fix(web): single row of items (#11729)
* fix(web): single row of items

* remove filterBoxWidth

* slight size adjustment

* rewrite action as component
2024-08-13 08:20:08 -04:00

39 lines
1.0 KiB
Svelte

<script lang="ts">
let className = '';
export { className as class };
export let itemCount = 1;
let container: HTMLElement | undefined;
let contentRect: DOMRectReadOnly | undefined;
const getGridGap = (element: Element) => {
const style = getComputedStyle(element);
return {
columnGap: parsePixels(style.columnGap),
};
};
const parsePixels = (style: string) => Number.parseInt(style, 10) || 0;
const getItemCount = (container: HTMLElement, containerWidth: number) => {
if (!container.firstElementChild) {
return 1;
}
const childContentRect = container.firstElementChild.getBoundingClientRect();
const childWidth = Math.floor(childContentRect.width || Infinity);
const { columnGap } = getGridGap(container);
return Math.floor((containerWidth + columnGap) / (childWidth + columnGap)) || 1;
};
$: if (container && contentRect) {
itemCount = getItemCount(container, contentRect.width);
}
</script>
<div class={className} bind:this={container} bind:contentRect>
<slot {itemCount} />
</div>