Update photo grid to use CSS Grid for responsive, randomized sizes based on aspect ratio

This commit is contained in:
Jannik committed 2026-09-24 04:14:40 +02:00
1 parent f53e27d3ae
commit d304beeba1
2 files changed
+50 -21

No files matched your search

+18 -19
View File
@@ -53,8 +53,11 @@ body {
} }
.media-wall { .media-wall {
column-count: 2; display: grid;
column-gap: 10px; grid-template-columns: repeat(2, 1fr);
grid-auto-rows: 150px;
grid-auto-flow: dense;
gap: 10px;
padding: 80px 10px 20px; padding: 80px 10px 20px;
max-width: 1920px; max-width: 1920px;
margin: 0 auto; margin: 0 auto;
@@ -62,49 +65,45 @@ body {
@media (min-width: 480px) { @media (min-width: 480px) {
.media-wall { .media-wall {
column-count: 3; grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 180px;
} }
} }
@media (min-width: 768px) { @media (min-width: 768px) {
.media-wall { .media-wall {
column-count: 4; grid-template-columns: repeat(4, 1fr);
column-gap: 15px; grid-auto-rows: 200px;
gap: 15px;
padding: 80px 15px 20px; padding: 80px 15px 20px;
} }
} }
@media (min-width: 1024px) { @media (min-width: 1024px) {
.media-wall { .media-wall {
column-count: 5; grid-template-columns: repeat(5, 1fr);
column-gap: 20px; grid-auto-rows: 250px;
gap: 20px;
padding: 90px 20px 30px; padding: 90px 20px 30px;
} }
} }
@media (min-width: 1440px) { @media (min-width: 1440px) {
.media-wall { .media-wall {
column-count: 6; grid-template-columns: repeat(6, 1fr);
grid-auto-rows: 250px;
} }
} }
.media-tile { .media-tile {
break-inside: avoid;
margin-bottom: 10px;
position: relative; position: relative;
overflow: hidden; overflow: hidden;
border-radius: var(--radius); border-radius: var(--radius);
background: var(--color-border); background: var(--color-border);
cursor: pointer; cursor: pointer;
transition: transform var(--transition), box-shadow var(--transition); transition: transform var(--transition), box-shadow var(--transition);
} height: 100%;
width: 100%;
@media (min-width: 768px) {
.media-tile { margin-bottom: 15px; }
}
@media (min-width: 1024px) {
.media-tile { margin-bottom: 20px; }
} }
.media-tile:hover { .media-tile:hover {
@@ -117,7 +116,7 @@ body {
.media-tile video { .media-tile video {
display: block; display: block;
width: 100%; width: 100%;
height: 100%; /* Filled by parent aspect-ratio */ height: 100%;
object-fit: cover; object-fit: cover;
} }
+32 -2
View File
@@ -38,10 +38,40 @@ export default function MediaTile({ item, index, onClick, votingOpen }: MediaTil
return () => observer.disconnect(); return () => observer.disconnect();
}, []); }, []);
const aspectRatio = item.width && item.height ? `${item.width} / ${item.height}` : '1 / 1'; let colSpan = 1;
let rowSpan = 1;
if (item.width && item.height) {
const ratio = item.width / item.height;
if (ratio > 1.2) {
// Landscape
colSpan = 2;
rowSpan = 1;
} else if (ratio < 0.8) {
// Portrait
colSpan = 1;
rowSpan = 2;
}
}
// Randomizer for variety based on ID so it stays consistent
const isRandomLarge = item.id % 7 === 0;
if (isRandomLarge) {
if (colSpan === 2 && rowSpan === 1) {
colSpan = 2;
rowSpan = 2;
} else if (colSpan === 1 && rowSpan === 2) {
colSpan = 2;
rowSpan = 2;
} else {
colSpan = 2;
rowSpan = 2;
}
}
const style: React.CSSProperties = { const style: React.CSSProperties = {
aspectRatio, gridColumn: `span ${colSpan}`,
gridRow: `span ${rowSpan}`,
}; };
const isVideo = item.mediaType === 'VIDEO'; const isVideo = item.mediaType === 'VIDEO';