mirror of
https://github.com/ChenQihan666/MyBlog-Next.git
synced 2026-08-14 11:29:33 +08:00
feat: add view transitions for card on search page (#118)
* feat: use predictable slug for card transition * feat: enable view transitions in search card * refactor: use Card.tsx instead of Card.astro * refactor: handle card styling in component * refactor: remove unused class name --------- Co-authored-by: Sat Naing <satnaingdev@gmail.com>
This commit is contained in:
committed by
Sat Naing
parent
a060cb5c87
commit
6c7d04fa12
@@ -1,22 +0,0 @@
|
|||||||
---
|
|
||||||
import Datetime from "@components/Datetime";
|
|
||||||
import type { BlogFrontmatter } from "@content/_schemas";
|
|
||||||
|
|
||||||
export interface Props {
|
|
||||||
href?: string;
|
|
||||||
frontmatter: BlogFrontmatter;
|
|
||||||
secHeading?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
const { href, frontmatter, secHeading = true } = Astro.props;
|
|
||||||
|
|
||||||
const { title, pubDatetime, description } = frontmatter;
|
|
||||||
---
|
|
||||||
|
|
||||||
<li class="list-card">
|
|
||||||
<a href={href} transition:name={title}>
|
|
||||||
{secHeading ? <h2>{title}</h2> : <h3>{title}</h3>}
|
|
||||||
</a>
|
|
||||||
<Datetime datetime={pubDatetime} />
|
|
||||||
<p>{description}</p>
|
|
||||||
</li>
|
|
||||||
+18
-2
@@ -1,3 +1,4 @@
|
|||||||
|
import { slugifyStr } from "@utils/slugify";
|
||||||
import Datetime from "./Datetime";
|
import Datetime from "./Datetime";
|
||||||
import type { BlogFrontmatter } from "@content/_schemas";
|
import type { BlogFrontmatter } from "@content/_schemas";
|
||||||
|
|
||||||
@@ -9,9 +10,24 @@ export interface Props {
|
|||||||
|
|
||||||
export default function Card({ href, frontmatter, secHeading = true }: Props) {
|
export default function Card({ href, frontmatter, secHeading = true }: Props) {
|
||||||
const { title, pubDatetime, description } = frontmatter;
|
const { title, pubDatetime, description } = frontmatter;
|
||||||
|
|
||||||
|
const headerProps = {
|
||||||
|
style: { viewTransitionName: slugifyStr(title) },
|
||||||
|
className: "text-lg font-medium decoration-dashed hover:underline",
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li className="list-card">
|
<li className="my-6">
|
||||||
<a href={href}>{secHeading ? <h2>{title}</h2> : <h3>{title}</h3>}</a>
|
<a
|
||||||
|
href={href}
|
||||||
|
className="inline-block text-lg font-medium text-skin-accent decoration-dashed underline-offset-4 focus-visible:no-underline focus-visible:underline-offset-0"
|
||||||
|
>
|
||||||
|
{secHeading ? (
|
||||||
|
<h2 {...headerProps}>{title}</h2>
|
||||||
|
) : (
|
||||||
|
<h3 {...headerProps}>{title}</h3>
|
||||||
|
)}
|
||||||
|
</a>
|
||||||
<Datetime datetime={pubDatetime} />
|
<Datetime datetime={pubDatetime} />
|
||||||
<p>{description}</p>
|
<p>{description}</p>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ const ogUrl = new URL(ogImage ? ogImage : `${post.slug}.png`, Astro.url.origin)
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<main id="main-content">
|
<main id="main-content">
|
||||||
<h1 transition:name={title} class="post-title">{title}</h1>
|
<h1 transition:name={slugifyStr(title)} class="post-title">{title}</h1>
|
||||||
<Datetime datetime={pubDatetime} size="lg" className="my-2" />
|
<Datetime datetime={pubDatetime} size="lg" className="my-2" />
|
||||||
<article id="article" role="article" class="prose mx-auto mt-8 max-w-3xl">
|
<article id="article" role="article" class="prose mx-auto mt-8 max-w-3xl">
|
||||||
<Content />
|
<Content />
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import Layout from "@layouts/Layout.astro";
|
|||||||
import Main from "@layouts/Main.astro";
|
import Main from "@layouts/Main.astro";
|
||||||
import Header from "@components/Header.astro";
|
import Header from "@components/Header.astro";
|
||||||
import Footer from "@components/Footer.astro";
|
import Footer from "@components/Footer.astro";
|
||||||
import Card from "@components/Card.astro";
|
import Card from "@components/Card";
|
||||||
import LinkButton from "@components/LinkButton.astro";
|
import LinkButton from "@components/LinkButton.astro";
|
||||||
import slugify from "@utils/slugify";
|
import slugify from "@utils/slugify";
|
||||||
import type { CollectionEntry } from "astro:content";
|
import type { CollectionEntry } from "astro:content";
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import Header from "@components/Header.astro";
|
|||||||
import Footer from "@components/Footer.astro";
|
import Footer from "@components/Footer.astro";
|
||||||
import LinkButton from "@components/LinkButton.astro";
|
import LinkButton from "@components/LinkButton.astro";
|
||||||
import Hr from "@components/Hr.astro";
|
import Hr from "@components/Hr.astro";
|
||||||
import Card from "@components/Card.astro";
|
import Card from "@components/Card";
|
||||||
import Socials from "@components/Socials.astro";
|
import Socials from "@components/Socials.astro";
|
||||||
import getSortedPosts from "@utils/getSortedPosts";
|
import getSortedPosts from "@utils/getSortedPosts";
|
||||||
import slugify from "@utils/slugify";
|
import slugify from "@utils/slugify";
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import Layout from "@layouts/Layout.astro";
|
|||||||
import Main from "@layouts/Main.astro";
|
import Main from "@layouts/Main.astro";
|
||||||
import Header from "@components/Header.astro";
|
import Header from "@components/Header.astro";
|
||||||
import Footer from "@components/Footer.astro";
|
import Footer from "@components/Footer.astro";
|
||||||
import Card from "@components/Card.astro";
|
import Card from "@components/Card";
|
||||||
import getUniqueTags from "@utils/getUniqueTags";
|
import getUniqueTags from "@utils/getUniqueTags";
|
||||||
import getPostsByTag from "@utils/getPostsByTag";
|
import getPostsByTag from "@utils/getPostsByTag";
|
||||||
import slugify from "@utils/slugify";
|
import slugify from "@utils/slugify";
|
||||||
|
|||||||
@@ -128,16 +128,4 @@
|
|||||||
.focus-outline {
|
.focus-outline {
|
||||||
@apply outline-2 outline-offset-1 outline-skin-fill focus-visible:no-underline focus-visible:outline-dashed;
|
@apply outline-2 outline-offset-1 outline-skin-fill focus-visible:no-underline focus-visible:outline-dashed;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Card */
|
|
||||||
.list-card {
|
|
||||||
@apply my-6;
|
|
||||||
}
|
|
||||||
.list-card > a {
|
|
||||||
@apply inline-block text-lg font-medium text-skin-accent decoration-dashed underline-offset-4 focus-visible:no-underline focus-visible:underline-offset-0;
|
|
||||||
}
|
|
||||||
.list-card h2,
|
|
||||||
.list-card h3 {
|
|
||||||
@apply text-lg font-medium decoration-dashed hover:underline;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user