200 items virtualised
import { html, isSSR, nothing, renderApp } from 'mates';
import { virtualMasonry } from 'mates-virtual';
import { Badge } from 'mates-ui';
const TAGS = ["Nature", "City", "People", "Abstract", "Travel", "Food", "Tech", "Art"];
const ITEMS = Array.from({ length: 200 }, (_, i) => ({
id: String(i),
title: "Photo " + (i + 1),
img: "https://picsum.photos/seed/" + (i + 1) + "/400/" + (220 + (i % 5) * 40),
height: 220 + (i % 5) * 40,
tag: TAGS[i % TAGS.length],
likes: ((i * 7919 + 31337) % 500) + 10,
}));
const App = () => () => html`
${isSSR() ? nothing : html`
<div style="height:32rem;border:1px solid var(--md-color-border);border-radius:var(--md-radius-md);overflow:auto;max-width:52rem;width:100%;">
${virtualMasonry(
ITEMS,
(item) => item.id,
(item) => html`
<div style="background:var(--md-surface-card);border:0.06rem solid var(--md-color-border);border-radius:var(--md-radius-md);overflow:hidden;">
<img src=${item.img} style="width:100%;height:${item.height}px;object-fit:cover;display:block;" loading="lazy" alt=${item.title} />
<div style="padding:var(--md-space-2) var(--md-space-3);display:flex;align-items:center;justify-content:space-between;">
<span style="font-size:var(--md-text-xs);color:var(--md-on-surface-muted);">${item.title}</span>
${Badge(item.tag, { variant: "neutral" })}
</div>
</div>
`,
{ getAspectRatio: (item) => 400 / item.height, itemSize: "220px", gap: "12px" },
)}
</div>
`}
`;