@wyxos/vue-infinite-masonry
v1.2.0
Published
[](https://www.npmjs.com/package/@wyxos/vibe) [](https://opensource.org/licenses/MIT) [
const getNextPage = async (page) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
items: fixture[page - 1].items,
nextPage: page + 1
})
}, 1000)
})
}
</script>
<template>
<Vibe v-model:items="items" :get-next-page="getNextPage">
<template #item="{ item, onRemove }">
<img :src="item.src" class="w-full" />
<button
class="absolute bottom-0 right-0 bg-red-500 text-white p-2 rounded cursor-pointer"
@click="onRemove(item)"
>
<i class="fas fa-trash"></i>
</button>
</template>
</Vibe>
</template>⚙️ Props
| Prop | Type | Required | Description |
|--------------|----------|----------|-----------------------------------------------------------------------------|
| items | Array | ✅ | Two-way bound item array (each item must include width, height, id) |
| getNextPage| Function(page: Number) | ✅ | Async function to load the next page — returns { items, nextPage } |
| loadAtPage | Number | ❌ | Starting page number (default: 1) |
| sizes | Object | ❌ | Mobile-first column config (default: Tailwind-style breakpoints) |
| gutterX | Number | ❌ | Horizontal gutter between items (default: 10) |
| gutterY | Number | ❌ | Vertical gutter between items (default: 10) |
sizes example:
{
base: 1,
sm: 2,
md: 3,
lg: 4,
xl: 5,
'2xl': 6
}💡 Slots
| Slot Name | Props | Description |
|-----------|--------------------------------|-----------------------------------|
| item | { item, onRemove } | Custom rendering for each block |
🧪 Run Locally
git clone https://github.com/wyxos/vibe
cd vibe
npm install
npm run devVisit http://localhost:5173
🌐 Live Demo
📄 License
MIT © @wyxos
