Skip to content

Commit 117e19a

Browse files
Add View Transitions
1 parent bfdbfae commit 117e19a

File tree

5 files changed

+51
-10
lines changed

5 files changed

+51
-10
lines changed

src/components/BlogPost.astro

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,28 @@ export interface Props {
1313
1414
const { title, date, updatedDate, tags, url } = Astro.props
1515
const siteUrl = Astro.site.href
16+
const transitionId = new URL(url).pathname.replaceAll("/", "_").replace(/_$/, "")
1617
---
1718

1819
<div class="layout">
1920
<article class="content">
2021
<div>
2122
<header>
22-
<h1 class="title">{title}</h1>
23-
<p class={`publish-date ${updatedDate && "old-date"}`}>
23+
<h1 class="title" style={{ 'view-transition-name': `blog-title-${transitionId}` }}>{title}</h1>
24+
<span class={`publish-date ${updatedDate && "old-date"}`} style={{ 'view-transition-name': `blog-publish-date-${transitionId}` }}>
2425
{dateFormatter.format(new Date(date))}
25-
</p>
26+
</span>
27+
<br />
2628
{
2729
updatedDate && (
28-
<p class="publish-date">
30+
<span class="publish-date" style={{ 'view-transition-name': `blog-update-date-${transitionId}` }}>
2931
Updated: {dateFormatter.format(new Date(updatedDate))}
30-
</p>
32+
</span>
3133
)
3234
}
3335
<div style="margin-bottom: 1rem">
3436
<TagBar
37+
transitionId={transitionId}
3538
tags={tags.map(tag => {
3639
return { name: tag }
3740
})}

src/components/BlogPostPreview.jsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import TagBar from "./TagBar.jsx"
22
import dateFormatter from "../utils/dateFormatter.js"
33

44
export default function BlogPostPreview({ post }) {
5+
const transitionId = post.url.replaceAll("/", "_").replace(/_$/, "")
6+
57
return (
68
<article className="blog-preview-wrapper">
79
<header
@@ -14,7 +16,12 @@ export default function BlogPostPreview({ post }) {
1416
textAlign: "left",
1517
}}
1618
>
17-
<h2 className="preview-title">
19+
<h2
20+
className="preview-title"
21+
style={{
22+
viewTransitionName: `blog-title-${transitionId}`,
23+
}}
24+
>
1825
<a className="preview-title" href={post.url}>
1926
{post.title}
2027
</a>
@@ -31,15 +38,23 @@ export default function BlogPostPreview({ post }) {
3138
<span
3239
style={{
3340
textDecoration: post.updatedDate ? "line-through" : "none",
41+
viewTransitionName: `blog-publish-date-${transitionId}`,
3442
}}
3543
>
3644
{dateFormatter.format(post.date)}
3745
</span>
3846
{post.updatedDate && (
39-
<>Updated: {dateFormatter.format(post.updatedDate)}</>
47+
<span
48+
style={{
49+
viewTransitionName: `blog-update-date-${transitionId}`,
50+
}}
51+
>
52+
Updated: {dateFormatter.format(post.updatedDate)}
53+
</span>
4054
)}
4155
</p>
4256
<TagBar
57+
transitionId={transitionId}
4358
marginTop=".25em"
4459
tags={post.tags.map(tag => {
4560
return { name: tag }

src/components/Tag.jsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import "./tag.css"
22

3-
export default function Tag({ tag, onTagSelect, marginTop = ".875em" }) {
3+
export default function Tag({
4+
tag,
5+
onTagSelect,
6+
marginTop = ".875em",
7+
transitionId,
8+
}) {
49
return (
510
<>
611
{onTagSelect && (
@@ -16,7 +21,14 @@ export default function Tag({ tag, onTagSelect, marginTop = ".875em" }) {
1621
<label
1722
className="tag-label"
1823
htmlFor={onTagSelect && `tag-${tag.name}`}
19-
style={{ marginTop }}
24+
style={{
25+
marginTop,
26+
viewTransitionName: transitionId
27+
? `blog-tag-${tag.name
28+
.replace(" ", "_")
29+
.replace(".", "_")}-${transitionId}`
30+
: undefined,
31+
}}
2032
>
2133
<span
2234
className="tag-name"

src/components/TagBar.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ const WRAPPER_STYLES = {
55
flexWrap: "wrap",
66
}
77

8-
export default function TagBar({ tags, onTagSelect, marginTop }) {
8+
export default function TagBar({ tags, onTagSelect, marginTop, transitionId }) {
99
return (
1010
<div style={WRAPPER_STYLES}>
1111
{tags.map(tag => {
1212
return (
1313
<Tag
14+
transitionId={transitionId}
1415
marginTop={marginTop}
1516
key={tag.name}
1617
tag={tag}

src/styles/blog.css

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,3 +418,13 @@ details {
418418
margin-top: 0.5rem;
419419
}
420420
}
421+
422+
@view-transition {
423+
navigation: auto;
424+
}
425+
426+
@media (prefers-reduced-motion: reduce) {
427+
@view-transition {
428+
navigation: none;
429+
}
430+
}

0 commit comments

Comments
 (0)