npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@shelamkoff/masonry

v1.0.0

Published

Framework-agnostic responsive masonry grid with row and column modes, column spans, media-aware measurement, transitions, and infinite loading

Readme

@shelamkoff/masonry

Адаптивная masonry-сетка без привязки к фреймворку. Поддерживает три режима layout, элементы на несколько колонок, ожидание загрузки медиа, анимированный перерасчёт, события и опциональную бесконечную загрузку.

Демо · English

Возможности

  • Режимы masonry, row и column
  • Адаптивные колонки через ResizeObserver
  • Ручной и автоматический colSpan
  • Последовательная очередь асинхронных append
  • Ожидание изображений, метаданных видео и web fonts
  • Ограничение времени ожидания контента
  • Infinite scroll через IntersectionObserver
  • События клика, layout, загрузки и ошибки загрузки
  • Корректный destroy() с восстановлением DOM и стилей контейнера
  • ESM, CSS entry point и TypeScript declarations

Установка

npm install @shelamkoff/masonry
import { Masonry } from '@shelamkoff/masonry'
import '@shelamkoff/masonry/styles.css'

const grid = new Masonry('.grid', {
  columnWidth: 260,
  gap: 16,
})

const card = document.createElement('article')
card.textContent = 'Элемент сетки'

await grid.append([
  { id: 'article-1', element: card, height: 180 },
])

Если height не передан, Masonry ждёт готовности медиа внутри элемента и измеряет wrapper. Параллельные вызовы append() выполняются строго по порядку.

Настройки

| Параметр | Тип | По умолчанию | Назначение | | --- | --- | --- | --- | | columnWidth | number | обязательный | Целевая минимальная ширина колонки | | layoutMode | masonry \| row \| column | masonry | Алгоритм размещения | | autoColSpan | boolean | true | Определять span по natural width изображения | | gap | number | 16 | Горизонтальный и вертикальный отступ | | transitionDuration | number | 300 | Длительность перемещения, мс | | transitionEasing | string | ease | CSS easing | | fadeInDuration | number | 400 | Появление новых элементов, мс | | contentLoadTimeout | number | 10000 | Максимальное ожидание медиа, мс | | infiniteScrollThreshold | number | 200 | Упреждающий отступ infinite scroll | | loadMore | () => boolean \| void \| Promise<boolean \| void> | — | Включает infinite scroll; false завершает список |

Все числовые значения должны быть конечными. Размеры и длительности не могут быть отрицательными, а columnWidth должен быть больше нуля.

Данные элемента

interface MasonryItemData {
  id: string
  element: HTMLElement
  height?: number
  colSpan?: number
  meta?: Record<string, unknown>
}

ID и DOM-элементы должны быть уникальны. colSpan — положительное целое число. В режиме column каждый элемент занимает одну колонку.

Методы и события

  • append(items) — добавляет batch и возвращает Promise.
  • remove(id) — удаляет элемент и пересчитывает layout.
  • layout() — запускает перерасчёт вручную.
  • getItems() — возвращает snapshots данных.
  • getColumnCount() — возвращает текущее число колонок.
  • destroy() — отключает observers, отменяет ожидания и восстанавливает DOM.
grid.on('item:click', ({ item, index, event }) => {})
grid.on('layout:complete', ({ containerHeight, columnCount }) => {})
grid.on('scroll:loadmore', () => {})
grid.on('scroll:error', error => {})

Верните false из loadMore, когда источник данных закончился. Masonry поставит sentinel на паузу и не будет повторять пустую загрузку.

Разработка

npm install
npm test
npm run build
npm run demo

Лицензия

MIT