{"version":3,"file":"index.cjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["interface MasonrySimpleOptions {\n  container?: HTMLElement | string;\n}\n\nexport default class MasonrySimple {\n  private readonly containerOption: HTMLElement | string | undefined;\n  private container: HTMLElement | null = null;\n  private gridItems: HTMLElement[] = [];\n  private rowHeight = 1;\n  private rowGap = 0;\n  private resizeScheduled = false;\n  private rafId: number | null = null;\n  private resizeObserver: ResizeObserver | null = null;\n  private mutationObserver: MutationObserver | null = null;\n  private observerAbortController: AbortController | null = null;\n  private imageAbortController: AbortController | null = null;\n  private observedImages = new WeakSet<HTMLImageElement>();\n  private isInitialized = false;\n  private isDestroyed = false;\n  private originalContainerStyles = {\n    gridAutoRows: '',\n    contain: '',\n    alignItems: '',\n  };\n\n  constructor(options: MasonrySimpleOptions = {}) {\n    this.containerOption = options.container;\n  }\n\n  public init(): void {\n    if (this.isInitialized) return;\n\n    this.container = this.resolveContainer();\n\n    if (!this.container) return;\n\n    this.isInitialized = true;\n    this.isDestroyed = false;\n\n    this.setupAbortControllers();\n    this.storeContainerStyles();\n    this.initializeContainerStyles();\n    this.initializeGridItems();\n    this.setupResizeObserver();\n    this.setupMutationObserver();\n    this.scheduleLayout();\n  }\n\n  public refresh(): void {\n    if (!this.isInitialized || this.isDestroyed || !this.container) return;\n\n    this.initializeGridItems();\n    this.scheduleLayout();\n  }\n\n  public destroy(): void {\n    if (!this.isInitialized && !this.container) return;\n\n    this.isDestroyed = true;\n    this.isInitialized = false;\n    this.cancelScheduledLayout();\n    this.observerAbortController?.abort();\n    this.imageAbortController?.abort();\n    this.resizeObserver?.disconnect();\n    this.mutationObserver?.disconnect();\n    this.gridItems.forEach((item) => {\n      item.style.gridRowEnd = '';\n    });\n\n    if (this.container) {\n      this.container.style.gridAutoRows = this.originalContainerStyles.gridAutoRows;\n      this.container.style.contain = this.originalContainerStyles.contain;\n      this.container.style.alignItems = this.originalContainerStyles.alignItems;\n    }\n\n    this.gridItems = [];\n    this.rowHeight = 1;\n    this.rowGap = 0;\n    this.resizeObserver = null;\n    this.mutationObserver = null;\n    this.observerAbortController = null;\n    this.imageAbortController = null;\n    this.observedImages = new WeakSet<HTMLImageElement>();\n    this.resizeScheduled = false;\n    this.container = null;\n    this.originalContainerStyles = {\n      gridAutoRows: '',\n      contain: '',\n      alignItems: '',\n    };\n  }\n\n  private resolveContainer(): HTMLElement | null {\n    if (this.containerOption instanceof HTMLElement) {\n      return this.containerOption;\n    }\n\n    if (typeof document === 'undefined') return null;\n\n    if (typeof this.containerOption === 'string') {\n      return document.querySelector<HTMLElement>(this.containerOption);\n    }\n\n    return document.querySelector<HTMLElement>('.masonry');\n  }\n\n  private scheduleLayout(): void {\n    if (!this.isInitialized || this.isDestroyed || !this.container || this.resizeScheduled) return;\n\n    this.resizeScheduled = true;\n\n    if (typeof requestAnimationFrame === 'function') {\n      this.rafId = requestAnimationFrame(() => {\n        this.rafId = null;\n        this.resizeScheduled = false;\n        this.performLayout();\n      });\n\n      return;\n    }\n\n    this.rafId = null;\n    this.resizeScheduled = false;\n    this.performLayout();\n  }\n\n  private cancelScheduledLayout(): void {\n    if (this.rafId !== null && typeof cancelAnimationFrame === 'function') {\n      cancelAnimationFrame(this.rafId);\n    }\n\n    this.rafId = null;\n    this.resizeScheduled = false;\n  }\n\n  private performLayout(): void {\n    if (!this.isInitialized || this.isDestroyed || !this.container) return;\n\n    this.measureContainerMetrics();\n    this.resizeAllItems();\n  }\n\n  private resizeAllItems(): void {\n    const denominator = this.rowHeight + this.rowGap;\n\n    this.gridItems.forEach((item) => {\n      if (denominator <= 0 || !Number.isFinite(denominator)) {\n        item.style.gridRowEnd = 'span 1';\n\n        return;\n      }\n\n      const rowSpan = Math.max(\n        1,\n        Math.ceil((item.getBoundingClientRect().height + this.rowGap) / denominator),\n      );\n      item.style.gridRowEnd = `span ${rowSpan}`;\n    });\n  }\n\n  private setupAbortControllers(): void {\n    this.observerAbortController = new AbortController();\n    this.imageAbortController = new AbortController();\n\n    this.observerAbortController.signal.addEventListener('abort', () => {\n      this.resizeObserver?.disconnect();\n      this.mutationObserver?.disconnect();\n    });\n  }\n\n  private setupResizeObserver(): void {\n    if (!this.container || typeof ResizeObserver === 'undefined') return;\n\n    this.resizeObserver = new ResizeObserver(() => this.handleResize());\n\n    this.resizeObserver.observe(this.container);\n  }\n\n  private setupMutationObserver(): void {\n    if (!this.container || typeof MutationObserver === 'undefined') return;\n\n    this.mutationObserver = new MutationObserver(() => {\n      this.initializeGridItems();\n      this.scheduleLayout();\n    });\n\n    this.mutationObserver.observe(this.container, {\n      childList: true,\n      subtree: false,\n    });\n  }\n\n  private handleResize(): void {\n    this.scheduleLayout();\n  }\n\n  private initializeContainerStyles(): void {\n    if (!this.container) return;\n\n    this.container.style.gridAutoRows = '1px';\n    this.container.style.contain = 'layout';\n    this.container.style.alignItems = 'start';\n  }\n\n  private measureContainerMetrics(): void {\n    if (!this.container) return;\n\n    const cs = getComputedStyle(this.container);\n\n    this.rowGap = this.parseCssPixelValue(cs.rowGap);\n\n    const parsedRowHeight = this.parseCssPixelValue(cs.gridAutoRows);\n\n    this.rowHeight = parsedRowHeight > 0 ? parsedRowHeight : 1;\n  }\n\n  private initializeGridItems(): void {\n    if (!this.container) return;\n\n    this.gridItems = Array.from(this.container.children).filter(\n      (item): item is HTMLElement => item instanceof HTMLElement,\n    );\n\n    this.gridItems.forEach((item) => {\n      const images = item.querySelectorAll('img');\n\n      images.forEach((image) => {\n        this.observeImage(image);\n      });\n    });\n  }\n\n  private observeImage(image: HTMLImageElement): void {\n    if (image.complete || this.observedImages.has(image)) return;\n\n    this.observedImages.add(image);\n\n    const onLoad = (): void => this.scheduleLayout();\n\n    if (this.imageAbortController) {\n      image.addEventListener('load', onLoad, {\n        once: true,\n        signal: this.imageAbortController.signal,\n      });\n\n      return;\n    }\n\n    image.addEventListener('load', onLoad, { once: true });\n  }\n\n  private parseCssPixelValue(value: string): number {\n    const parsedValue = Number.parseFloat(value);\n\n    return Number.isFinite(parsedValue) ? parsedValue : 0;\n  }\n\n  private storeContainerStyles(): void {\n    if (!this.container) return;\n\n    this.originalContainerStyles = {\n      gridAutoRows: this.container.style.gridAutoRows || '',\n      contain: this.container.style.contain || '',\n      alignItems: this.container.style.alignItems || '',\n    };\n  }\n}\n"],"mappings":"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"}