Skip to content

Commit 132f0a2

Browse files
committed
Use cross-browser masonry layout solution
Fixes issue with existing fallback in browsers other than Firefox.
1 parent e326321 commit 132f0a2

File tree

4 files changed

+110
-4
lines changed

4 files changed

+110
-4
lines changed

pnpm-lock.yaml

Lines changed: 46 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

www/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"preview": "vite preview"
1515
},
1616
"dependencies": {
17+
"@egjs/svelte-grid": "1.16.0",
1718
"@floating-ui/dom": "1.5.3",
1819
"@sanity/client": "6.10.0",
1920
"@sanity/image-url": "1.0.2",

www/src/routes/photos/item.svelte

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
<script>
2+
import { MasonryGrid } from '@egjs/svelte-grid'
3+
24
import GalleryCarousel from '$lib/components/gallery-carousel.svelte'
35
import GalleryThumbnail from '$lib/components/gallery-thumbnail.svelte'
46
import FadeUp from '$lib/components/helpers/fade-up.svelte'
5-
import MasonryGrid from '$lib/components/masonry-grid.svelte'
67
import PageIntro from '$lib/components/page-intro.svelte'
78
import PageSection from '$lib/components/page-section.svelte'
89
import PortableText from '$lib/components/portable-text.svelte'
910
import TextLede from '$lib/components/text-lede.svelte'
1011
12+
import { media } from '../../stores/media-queries.js'
13+
1114
/** @type {'screen-shots' | undefined} */
1215
export let collection = undefined
1316
@@ -47,6 +50,14 @@ function handleCloseCarousel() {
4750
isCarouselOpen = false
4851
initialIndex = 0
4952
}
53+
54+
let gridGap = 16
55+
56+
$: if ($media.xl) {
57+
gridGap = 64
58+
} else if ($media.md) {
59+
gridGap = 32
60+
}
5061
</script>
5162

5263
<svelte:head>
@@ -111,7 +122,7 @@ function handleCloseCarousel() {
111122
</PageIntro>
112123
<PageSection>
113124
<div class="grid gap-[9vh] md:gap-[11vh]">
114-
<MasonryGrid items={images} gapClass="gap-4 md:gap-8 xl:gap-16">
125+
<MasonryGrid align="stretch" column={2} gap={gridGap}>
115126
{#each images as image, index}
116127
<GalleryThumbnail
117128
{image}

www/src/stores/media-queries.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { writable } from 'svelte/store'
2+
3+
/**
4+
* @param {Record<string, MediaQueryList>} mqls
5+
*/
6+
function calculateMedia(mqls) {
7+
let media = { classNames: '' }
8+
let mediaClasses = []
9+
10+
for (let name of Object.keys(mqls)) {
11+
media[name] = mqls[name].matches
12+
if (media[name]) {
13+
mediaClasses.push(`media-${name}`)
14+
}
15+
}
16+
17+
media.classNames = mediaClasses.join(' ')
18+
19+
return media
20+
}
21+
22+
function watchMedia(mediaqueries) {
23+
return writable({ classNames: '' }, (set) => {
24+
if (typeof window === 'undefined') return
25+
26+
let mqls = {}
27+
let updateMedia = () => set(calculateMedia(mqls))
28+
29+
for (let key of Object.keys(mediaqueries)) {
30+
let foo = window.matchMedia(mediaqueries[key])
31+
mqls[key] = foo
32+
mqls[key].addListener(updateMedia)
33+
}
34+
35+
updateMedia()
36+
37+
return () => {
38+
for (let key of Object.keys(mqls)) {
39+
mqls[key].removeListener(updateMedia)
40+
}
41+
}
42+
})
43+
}
44+
45+
export const media = watchMedia({
46+
sm: '(max-width: 767px)',
47+
md: '(min-width: 768px)',
48+
lg: '(min-width: 1024px)',
49+
xl: '(min-width: 1280px)',
50+
})

0 commit comments

Comments
 (0)