Add opengraph image generation for projects & blog
This commit is contained in:
		
							parent
							
								
									f98b23e29a
								
							
						
					
					
						commit
						718b3eccae
					
				| 
						 | 
				
			
			@ -22,6 +22,8 @@
 | 
			
		|||
        "@astrojs/tailwind": "^5.1.0",
 | 
			
		||||
        "@tailwindcss/typography": "^0.5.12",
 | 
			
		||||
        "astro": "^4.5.16",
 | 
			
		||||
        "astro-og-canvas": "^0.4.2",
 | 
			
		||||
        "canvaskit-wasm": "^0.39.1",
 | 
			
		||||
        "clsx": "^2.1.0",
 | 
			
		||||
        "fuse.js": "^7.0.0",
 | 
			
		||||
        "sharp": "^0.33.3",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,12 @@ dependencies:
 | 
			
		|||
  astro:
 | 
			
		||||
    specifier: ^4.5.16
 | 
			
		||||
    version: 4.5.16(typescript@5.4.4)
 | 
			
		||||
  astro-og-canvas:
 | 
			
		||||
    specifier: ^0.4.2
 | 
			
		||||
    version: 0.4.2(astro@4.5.16)
 | 
			
		||||
  canvaskit-wasm:
 | 
			
		||||
    specifier: ^0.39.1
 | 
			
		||||
    version: 0.39.1
 | 
			
		||||
  clsx:
 | 
			
		||||
    specifier: ^2.1.0
 | 
			
		||||
    version: 2.1.0
 | 
			
		||||
| 
						 | 
				
			
			@ -1524,6 +1530,10 @@ packages:
 | 
			
		|||
    resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@webgpu/types@0.1.21:
 | 
			
		||||
    resolution: {integrity: sha512-pUrWq3V5PiSGFLeLxoGqReTZmiiXwY3jRkIG5sLLKjyqNxrwm/04b4nw7LSmGWJcKk59XOM/YRTUwOzo4MMlow==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /acorn-jsx@5.3.2(acorn@8.11.3):
 | 
			
		||||
    resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
| 
						 | 
				
			
			@ -1614,6 +1624,18 @@ packages:
 | 
			
		|||
    hasBin: true
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /astro-og-canvas@0.4.2(astro@4.5.16):
 | 
			
		||||
    resolution: {integrity: sha512-OQsH6Gr2HX9ZRHdVy2OcXVBIPI65WvEtLG/60krnphh8d3ldhuAFunymYaNGcrdSZcYgXkHWejbPt//3qaRidA==}
 | 
			
		||||
    engines: {node: '>=18.14.1'}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      astro: ^3.0.0 || ^4.0.0
 | 
			
		||||
    dependencies:
 | 
			
		||||
      astro: 4.5.16(typescript@5.4.4)
 | 
			
		||||
      canvaskit-wasm: 0.37.2
 | 
			
		||||
      deterministic-object-hash: 2.0.2
 | 
			
		||||
      entities: 4.5.0
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /astro@4.5.16(typescript@5.4.4):
 | 
			
		||||
    resolution: {integrity: sha512-1nOVsMq2OJiXnG6gO0Y77vTAboGN9nLQSy/8SGazq4h6x+alzbsMbQbArBgvaLzOSUXD0m91XLs3D8bOSuavrQ==}
 | 
			
		||||
    engines: {node: '>=18.14.1', npm: '>=6.14.0'}
 | 
			
		||||
| 
						 | 
				
			
			@ -1882,6 +1904,16 @@ packages:
 | 
			
		|||
    resolution: {integrity: sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /canvaskit-wasm@0.37.2:
 | 
			
		||||
    resolution: {integrity: sha512-212imazRF98gLOTiU4JAXM7xDvaknI7jaPtAg4ETXGW5rLQs6pomgIvVPUSfoKnQVTdGgzj+B4e+/u0Da20aGg==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /canvaskit-wasm@0.39.1:
 | 
			
		||||
    resolution: {integrity: sha512-Gy3lCmhUdKq+8bvDrs9t8+qf7RvcjuQn+we7vTVVyqgOVO1UVfHpsnBxkTZw+R4ApEJ3D5fKySl9TU11hmjl/A==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@webgpu/types': 0.1.21
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /ccount@2.0.1:
 | 
			
		||||
    resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
 | 
			
		||||
    dev: false
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
---
 | 
			
		||||
import { ViewTransitions } from "astro:transitions";
 | 
			
		||||
 | 
			
		||||
interface Props {
 | 
			
		||||
export interface Props {
 | 
			
		||||
    title: string;
 | 
			
		||||
    description: string;
 | 
			
		||||
    image?: string;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 194 KiB  | 
| 
						 | 
				
			
			@ -4,8 +4,15 @@ import BaseHead from "@components/BaseHead.astro";
 | 
			
		|||
import Header from "@components/Header.astro";
 | 
			
		||||
import Footer from "@components/Footer.astro";
 | 
			
		||||
import Drawer from "@components/Drawer.astro";
 | 
			
		||||
const { title, description } = Astro.props;
 | 
			
		||||
import { SITE } from "@consts";
 | 
			
		||||
 | 
			
		||||
export interface Props {
 | 
			
		||||
    title: string;
 | 
			
		||||
    description: string;
 | 
			
		||||
    image?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const { title, description, image } = Astro.props;
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<!doctype html>
 | 
			
		||||
| 
						 | 
				
			
			@ -14,6 +21,7 @@ import { SITE } from "@consts";
 | 
			
		|||
        <BaseHead
 | 
			
		||||
            title={`${title} | ${SITE.TITLE}`}
 | 
			
		||||
            description={description}
 | 
			
		||||
            {image}
 | 
			
		||||
        />
 | 
			
		||||
    </head>
 | 
			
		||||
    <body>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,11 @@ const post = Astro.props;
 | 
			
		|||
const { title, summary } = post.data;
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<PageLayout title={title} description={summary}>
 | 
			
		||||
<PageLayout
 | 
			
		||||
    title={title}
 | 
			
		||||
    description={summary}
 | 
			
		||||
    image={"/open-graph/blog/" + post.slug + ".png"}
 | 
			
		||||
>
 | 
			
		||||
    <TopLayout>
 | 
			
		||||
        <div class="animate">
 | 
			
		||||
            <ArticleTopLayout entry={post} />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
import { OGImageRoute } from "astro-og-canvas";
 | 
			
		||||
 | 
			
		||||
import { getCollection } from "astro:content";
 | 
			
		||||
 | 
			
		||||
const projects = Object.fromEntries(
 | 
			
		||||
    (await getCollection("projects"))
 | 
			
		||||
        .filter((project) => !project.data.draft)
 | 
			
		||||
        .map((project) => [
 | 
			
		||||
            "projects/" + project.slug,
 | 
			
		||||
            {
 | 
			
		||||
                title: project.data.title,
 | 
			
		||||
                description: project.data.summary,
 | 
			
		||||
            },
 | 
			
		||||
        ])
 | 
			
		||||
);
 | 
			
		||||
const blogs = Object.fromEntries(
 | 
			
		||||
    (await getCollection("blog"))
 | 
			
		||||
        .filter((blog) => !blog.data.draft)
 | 
			
		||||
        .map((blog) => [
 | 
			
		||||
            "blog/" + blog.slug,
 | 
			
		||||
            {
 | 
			
		||||
                title: blog.data.title,
 | 
			
		||||
                description: blog.data.summary,
 | 
			
		||||
            },
 | 
			
		||||
        ])
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
export const { getStaticPaths, GET } = OGImageRoute({
 | 
			
		||||
    param: "route",
 | 
			
		||||
 | 
			
		||||
    // A collection of pages to generate images for.
 | 
			
		||||
    // The keys of this object are used to generate the path for that image.
 | 
			
		||||
    pages: {
 | 
			
		||||
        ...projects,
 | 
			
		||||
        ...blogs,
 | 
			
		||||
    },
 | 
			
		||||
    // For each page, this callback will be used to customize the OpenGraph image.
 | 
			
		||||
    getImageOptions: (_, page) => ({
 | 
			
		||||
        title: page.title,
 | 
			
		||||
        description: page.description,
 | 
			
		||||
        bgImage: {
 | 
			
		||||
            path: "./src/images/open-graph-background.png",
 | 
			
		||||
            fit: "cover",
 | 
			
		||||
        },
 | 
			
		||||
        logo: {
 | 
			
		||||
            path: "./src/images/me.jpg",
 | 
			
		||||
            size: [300],
 | 
			
		||||
        },
 | 
			
		||||
        // There are a bunch more options you can use here!
 | 
			
		||||
    }),
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -23,7 +23,11 @@ const project = Astro.props;
 | 
			
		|||
const { title, summary } = project.data;
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<PageLayout title={title} description={summary}>
 | 
			
		||||
<PageLayout
 | 
			
		||||
    title={title}
 | 
			
		||||
    description={summary}
 | 
			
		||||
    image={"/open-graph/projects/" + project.slug + ".png"}
 | 
			
		||||
>
 | 
			
		||||
    <TopLayout>
 | 
			
		||||
        <div class="animate">
 | 
			
		||||
            <ArticleTopLayout entry={project} />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue