diff --git a/src/routes/[country]/[location]/[photo].svelte b/src/routes/[country]/[location]/[photo].svelte
index ed4c743..82fb903 100644
--- a/src/routes/[country]/[location]/[photo].svelte
+++ b/src/routes/[country]/[location]/[photo].svelte
@@ -1,6 +1,8 @@
@@ -87,9 +165,9 @@
- {#each photos as photo}
+ {#each visiblePhotos as photo, index (photo.id)}
-
+
-
+
- {currentIndex + 1}
+ {globalOffset + currentIndex + 1}
@@ -120,7 +198,7 @@
{currentPhoto.title}
- {location.name}, {location.country.name} ·
+ {location.name}, {location.country.name} ·
@@ -132,12 +210,45 @@
import { fetchAPI } from '$utils/api'
export async function load ({ page, fetch, session, stuff }) {
+ // Get the first photo ID
+ const firstPhoto = await fetchAPI(`
+ query {
+ photo: photo (search: "${page.params.photo}") {
+ id
+ }
+ }
+ `)
+ const firstPhotoId = firstPhoto?.data?.photo[0]?.id
+ // TODO: use same request for both queries (photo.id)
+ const photosBeforeFirst = await fetchAPI(`
+ query {
+ count: photo_aggregated (
+ filter: {
+ id: { _gt: ${firstPhotoId} },
+ location: { slug: { _eq: "${page.params.location}" }},
+ status: { _eq: "published" },
+ },
+ sort: "-id",
+ ) {
+ count {
+ id
+ }
+ }
+ }
+ `)
+ // Define offset from the current count
+ const offset = Math.max(photosBeforeFirst?.data?.count[0]?.count.id - 5, 0)
+ const limit = 10
const res = await fetchAPI(`
query {
photos: photo (
- filter: { location: { slug: { _eq: "${page.params.location}" }}},
+ filter: {
+ location: { slug: { _eq: "${page.params.location}" }}
+ status: { _eq: "published" },
+ },
sort: "-date_created",
- limit: 5,
+ limit: ${limit},
+ offset: ${offset},
) {
id
title
@@ -162,15 +273,16 @@
const totalPhotos = stuff.countTotalPhotosByLocation.find((total: any) => total.group.location === Number(location.id)).count.id
// Find photo's index
- const currentPhotoIndex = data.photos.findIndex((photo: any) => photo.slug === page.params.photo)
- const currentIndex = (totalPhotos - 1) - currentPhotoIndex
+ const currentIndex = data.photos.findIndex((photo: any) => photo.slug === page.params.photo)
return {
props: {
photos: data.photos,
location: data.location[0],
currentIndex,
- totalPhotos,
+ countPhotos: totalPhotos,
+ limit,
+ offset,
}
}
}
diff --git a/src/style/pages/_viewer-photo.scss b/src/style/pages/_viewer-photo.scss
index e461d61..913dcd4 100644
--- a/src/style/pages/_viewer-photo.scss
+++ b/src/style/pages/_viewer-photo.scss
@@ -50,17 +50,23 @@
display: block;
width: 100%;
height: 100%;
- z-index: 3;
+ z-index: 8;
overflow: hidden;
+ opacity: 0;
transform: translate3d(var(--offset-x), var(--offset-y), 0) scale(var(--scale)) rotate(var(--rotate));
transform-origin: top center;
cursor: default;
will-change: transform;
transition: opacity 1s var(--ease-quart), transform 1s var(--ease-quart);
+ --scale: 0.6;
+ --offset-x: 20%;
+ --offset-y: -64%;
+ opacity: 0;
@include bp (md) {
- --offset-x: 0%;
- --offset-y: -50%;
+ --offset-x: 13%;
+ --offset-y: -65%;
+ --rotate: 5deg;
top: 50%;
left: 0;
transform-origin: bottom right;
@@ -75,36 +81,67 @@
transform: translateZ(0);
}
- &:nth-child(2) {
+ // Hidden photo over
+ &--0 {
+ --scale: 1.1;
+ --rotate: -1deg;
+ z-index: 9;
+ opacity: 0;
+
+ @include bp (md) {
+ --offset-x: -5%;
+ --offset-y: -45%;
+ }
+ }
+ // First visible photo
+ &--1 {
+ --scale: 1;
+ --rotate: 0deg;
+ opacity: 1;
+ box-shadow:
+ 0 12px 12px rgba(#000, 0.15),
+ 0 20px 20px rgba(#000, 0.15),
+ 0 48px 48px rgba(#000, 0.15);
+
+ @include bp (md) {
+ --offset-x: 0%;
+ --offset-y: -50%;
+ }
+ }
+ &--2 {
--scale: 0.9;
--opacity: 0.75;
--offset-y: -34%;
z-index: 7;
+ opacity: 1;
@include bp (md) {
--scale: 0.9;
--rotate: 1deg;
- --offset-x: 4.5%;
+ --offset-x: 3.75%;
--offset-y: -54%;
}
}
- &:nth-child(3) {
+ &--3 {
--scale: 0.83;
--opacity: 0.55;
--offset-y: -22.5%;
z-index: 6;
+ opacity: 1;
@include bp (md) {
--scale: 0.83;
- --offset-x: 7%;
+ --rotate: 2deg;
+ --offset-x: 6.5%;
--offset-y: -56.5%;
}
}
- &:nth-child(4) {
+ &--4 {
--scale: 0.75;
--opacity: 0.45;
--offset-y: -11%;
z-index: 5;
+ opacity: 1;
@include bp (md) {
--scale: 0.75;
@@ -113,11 +150,12 @@
--offset-y: -59%;
}
}
- &:nth-child(5) {
+ &--5 {
--scale: 0.68;
--opacity: 0.3;
--offset-y: -1.5%;
z-index: 4;
+ opacity: 1;
@include bp (md) {
--scale: 0.68;
@@ -126,14 +164,10 @@
--offset-y: -61.5%;
}
}
-
- // Active state
- &.is-active {
- z-index: 8;
- box-shadow:
- 0 12px 12px rgba(#000, 0.15),
- 0 20px 20px rgba(#000, 0.15),
- 0 48px 48px rgba(#000, 0.15);
+ &--6 {
+ --opacity: 0.3;
+ z-index: 3;
+ opacity: 0;
}
}
}
@@ -152,7 +186,7 @@
}
@include bp (lg) {
display: grid;
- grid-template-columns: 55% 45%;
+ grid-template-columns: 60% 40%;
align-items: baseline;
}
@@ -211,6 +245,7 @@
line-height: 1;
color: rgba($color-tertiary, 0.4);
transform: translate3d(-50%, 0, 0);
+ white-space: nowrap;
@include bp (md, max) {
font-size: clamp(#{rem(80px)}, 24vw, #{rem(120px)});