Skip to content

Commit 86267fe

Browse files
committed
feat: new view transitions
1 parent 7a8033f commit 86267fe

File tree

2 files changed

+46
-37
lines changed

2 files changed

+46
-37
lines changed

src/app/art/[artist]/[slug]/page.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { Metadata, Route } from "next";
22
import Image from "next/image";
33
import { notFound } from "next/navigation";
4+
import { ViewTransition } from "react";
45
import { FaTwitter } from "react-icons/fa";
56
import { IconLink } from "@/components/interactive/IconLink";
67
import { SiteLink } from "@/components/interactive/Link";
@@ -47,6 +48,7 @@ export default async function CommissionPage({ params }: PageProps<"/art/[artist
4748
<SiteLink type="back" href="/art" className="opacity-50">
4849
Back to all commissions
4950
</SiteLink>
51+
5052
<SiteLink
5153
href={artist.link as Route}
5254
picture={artist.avatar ? { src: artist.avatar } : undefined}
@@ -76,13 +78,15 @@ export default async function CommissionPage({ params }: PageProps<"/art/[artist
7678
{/* Images */}
7779
<div className="grid grid-cols-1 gap-4 md:grid-cols-3">
7880
{commission.images.map((image, idx) => (
79-
<div
81+
<ViewTransition
8082
// biome-ignore lint/suspicious/noArrayIndexKey: Needed
8183
key={idx}
82-
className="flex size-full flex-col items-center justify-center overflow-clip rounded-md bg-primary-700"
84+
name={`${artist.slug}-${commission.slug}-img-${idx}`}
8385
>
84-
<Image src={image} alt={commission.title} className="object-cover object-center" />
85-
</div>
86+
<div className="flex size-full flex-col items-center justify-center overflow-clip rounded-md bg-primary-700">
87+
<Image src={image} alt={commission.title} className="object-cover object-center" />
88+
</div>
89+
</ViewTransition>
8690
))}
8791
</div>
8892
</div>

src/app/art/page.tsx

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { Metadata, Route } from "next";
22
import Image from "next/image";
33
import Link from "next/link";
4+
import { ViewTransition } from "react";
45
import { MdArrowOutward } from "react-icons/md";
56
import { Header } from "@/components/base/Header";
67
import { CallToAction } from "@/components/interactive/CallToAction";
@@ -22,36 +23,38 @@ export default function ArtPage() {
2223
</Header>
2324

2425
{/* Ref sheet card */}
25-
<CallToAction
26-
picture={refSheet.images[0] ? { src: refSheet.images[0] } : undefined}
27-
href={`/art/${refSheetArtist.slug}/${refSheet.slug}` as Route}
28-
picMaxWidth="80vw"
29-
>
30-
<div className="flex min-h-[400px] flex-col justify-end gap-3 p-6 md:p-10">
31-
{/* Artist name */}
32-
<div className="flex flex-row items-center gap-2">
33-
{refSheetArtist.avatar && (
34-
<Image
35-
src={refSheetArtist.avatar}
36-
alt={refSheetArtist.name}
37-
width={24}
38-
height={24}
39-
className="h-6 w-6 rounded-md"
40-
/>
41-
)}
42-
<span className="opacity-75">By {refSheetArtist.name}</span>
43-
</div>
26+
<ViewTransition name={`${refSheetArtist.slug}-${refSheet.slug}-img-0`}>
27+
<CallToAction
28+
picture={refSheet.images[0] ? { src: refSheet.images[0] } : undefined}
29+
href={`/art/${refSheetArtist.slug}/${refSheet.slug}` as Route}
30+
picMaxWidth="80vw"
31+
>
32+
<div className="flex min-h-[400px] flex-col justify-end gap-3 p-6 md:p-10">
33+
{/* Artist name */}
34+
<div className="flex flex-row items-center gap-2">
35+
{refSheetArtist.avatar && (
36+
<Image
37+
src={refSheetArtist.avatar}
38+
alt={refSheetArtist.name}
39+
width={24}
40+
height={24}
41+
className="size-6 rounded-md"
42+
/>
43+
)}
44+
<span className="opacity-75">By {refSheetArtist.name}</span>
45+
</div>
4446

45-
{/* Commission Name */}
46-
<div className="flex flex-row items-center gap-4">
47-
<h1 className="font-bold text-2xl">Reference Sheet</h1>
48-
<MdArrowOutward className="size-6" />
49-
</div>
47+
{/* Commission Name */}
48+
<div className="flex flex-row items-center gap-4">
49+
<h1 className="font-bold text-2xl">Reference Sheet</h1>
50+
<MdArrowOutward className="size-6" />
51+
</div>
5052

51-
{/* Description */}
52-
<span className="opacity-50">{refSheet.description}</span>
53-
</div>
54-
</CallToAction>
53+
{/* Description */}
54+
<span className="opacity-50">{refSheet.description}</span>
55+
</div>
56+
</CallToAction>
57+
</ViewTransition>
5558

5659
<div className="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
5760
{allArtists.map((artist) =>
@@ -63,11 +66,13 @@ export default function ArtPage() {
6366
>
6467
{/* Image */}
6568
{commission.images[0] && (
66-
<Image
67-
src={commission.images[0]}
68-
alt={commission.title}
69-
className="absolute inset-0 z-0 size-full object-cover object-top"
70-
/>
69+
<ViewTransition name={`${artist.slug}-${commission.slug}-img-0`}>
70+
<Image
71+
src={commission.images[0]}
72+
alt={commission.title}
73+
className="absolute inset-0 z-0 size-full object-cover object-top"
74+
/>
75+
</ViewTransition>
7176
)}
7277

7378
{/* Gradient overlay */}

0 commit comments

Comments
 (0)