import { resolveColumnCount } from '../model/columns'; import type { ColumnsOption } from '../model/columns'; /** * Apply native CSS masonry layout using CSS Grid with `grid-template-rows: masonry`. * * This is an experimental CSS feature whose specification is still settling, so * it is only ever applied after an explicit `CSS.supports()` check. * * When `columns` is supplied the track list becomes explicit; a breakpoint map * is resolved against the container's current width, and re-resolved whenever * the caller re-applies on resize. */ export function applyCssMasonry( container: HTMLElement, gutter: number, minColWidth: number, columns?: ColumnsOption ): void { container.style.display = 'grid'; if (columns !== undefined) { const count = resolveColumnCount(container.clientWidth, { columns, minColWidth, gutter, }); container.style.gridTemplateColumns = `repeat(${count}, minmax(0, 1fr))`; } else { container.style.gridTemplateColumns = `repeat(auto-fill, minmax(${minColWidth}px, 1fr))`; } container.style.gridTemplateRows = 'masonry'; container.style.gap = `${gutter}px`; container.style.alignContent = 'start'; } /** * Remove CSS masonry styles from a container. */ export function removeCssMasonry(container: HTMLElement): void { container.style.display = ''; container.style.gridTemplateColumns = ''; container.style.gridTemplateRows = ''; container.style.gap = ''; container.style.alignContent = ''; }