feat: OG irudia sortzen du ekintzen datuetatik

This commit is contained in:
2025-10-22 18:17:44 +02:00
parent 59443a5c6d
commit 81d5c69fa0
10 changed files with 236 additions and 17 deletions

View File

@@ -22,7 +22,9 @@
"marked": "^15.0.11", "marked": "^15.0.11",
"react": "^19.1.1", "react": "^19.1.1",
"react-dom": "^19.1.1", "react-dom": "^19.1.1",
"serve": "^14.2.4" "satori": "^0.18.3",
"serve": "^14.2.4",
"sharp": "^0.34.4"
}, },
"devDependencies": { "devDependencies": {
"sass-embedded": "^1.90.0" "sass-embedded": "^1.90.0"

Binary file not shown.

View File

@@ -0,0 +1,7 @@
.wrapper {
display: flex;
flex-direction: column;
background-color: #ff3e3e; // gorria
color: #ffffff;
}

View File

@@ -0,0 +1,59 @@
import { type CollectionEntry } from "astro:content";
import type { Ekintza } from "models/Ekintza";
import dayjs from "dayjs";
import "dayjs/locale/eu";
dayjs.locale("eu");
export function OgImage(props: CollectionEntry<"ekintzak">) {
const ekintza: Ekintza = props as unknown as Ekintza;
return (
<div
style={{
fontFamily: "Sohne",
display: "flex",
background: "#ff3e3e",
color: "#4b2125",
width: "100%",
height: "100%",
padding: "40px",
flexDirection: "column",
justifyContent: "space-between",
}}
>
<div style={{ display: "flex", flexDirection: "column" }}>
<h1 style={{ fontSize: 56 }}>{ekintza.izenburua}</h1>
<p style={{ fontSize: 40 }}>
{dayjs(ekintza.hitzordua).format("MMMM[k] D. H:mm")}
</p>
<p style={{ fontSize: 24 }}>{ekintza.titularra}</p>
</div>
<div style={{ display: "flex", justifyContent: "flex-end" }}>
<svg
id="Layer_2"
data-name="Layer 2"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 1062 344.39"
style={{
width: 271.37,
height: 88,
}}
>
<g id="Layer_1-2" data-name="Layer 1">
<g>
<circle cx="1009.81" cy="292.2" r="52.19" fill="currentColor" />
<path
fill="currentColor"
d="M919.24,281.56c-2.83-2.21-4.25-6.46-4.25-12.76v-95.9c0-28.03-9.13-49.68-27.4-64.96-18.27-15.28-44.25-22.91-77.95-22.91-28.98,0-53.62,7.24-73.93,21.73-20.31,14.49-33.46,33.86-39.45,58.11l72.28,10.87c2.52-10.39,6.77-17.95,12.76-22.68,5.98-4.72,14.33-7.09,25.04-7.09,11.34,0,19.92,2.52,25.75,7.56,5.83,5.04,8.74,12.6,8.74,22.68v4.25l-55.74,9.45c-32.13,4.73-56.14,13.7-72.05,26.93-2.39,1.99-4.61,4.08-6.64,6.28-3.54,3.82-9.89,1.3-9.77-3.91.03-1.41.05-2.83.05-4.26,0-17.32-2.2-33.62-6.61-48.9-4.41-15.27-10.86-28.74-19.37-40.39-9.76-13.23-21.57-23.31-35.43-30.23-13.86-6.93-29.13-10.39-45.83-10.39-13.86,0-26.69,2.6-38.5,7.8-11.81,5.2-21.49,12.68-29.05,22.44V0h-75.59v277.69c0,2.72-1.95,5.02-4.62,5.53-5.3,1.02-10.99.99-14.39-1.66-2.83-2.21-4.25-6.46-4.25-12.76v-95.9c0-28.03-9.13-49.68-27.4-64.96-18.27-15.28-44.25-22.91-77.95-22.91-28.98,0-53.62,7.24-73.93,21.73-20.31,14.49-33.46,33.86-39.45,58.11l72.28,10.87c2.52-10.39,6.77-17.95,12.76-22.68,5.98-4.72,14.33-7.09,25.04-7.09,11.34,0,19.92,2.52,25.75,7.56,5.83,5.04,8.74,12.6,8.74,22.68v4.25l-55.74,9.45c-32.13,4.73-56.14,13.7-72.05,26.93-20.42,16.98-23.57,39.22-23.9,49.36-.1,3.04-2.58,5.44-5.61,5.44h-112.66V0H0v339.2h212.75v-11.59c0-4.81,5.64-7.39,9.29-4.25,3.37,2.9,6.9,5.68,9.42,7.24,14.32,8.88,31.56,13.32,51.73,13.32,15.75,0,29.84-2.28,42.28-6.85,12.44-4.57,22.91-11.26,31.41-20.08,6.3,10.71,16.77,17.95,31.42,21.73,12.99,3.35,28.65,3.86,46.97,1.51,1.03-.13,3.8-.39,6.3-.62,3.08-.28,6.16-.42,9.25-.42h71.04v-24.57c7.56,9.45,17.24,16.77,29.05,21.97,11.81,5.2,24.64,7.79,38.5,7.79,16.69,0,31.97-3.46,45.83-10.39,13.86-6.93,25.51-16.85,34.96-29.76,3.96-5.43,7.49-11.25,10.59-17.46,2.34-4.69,9.28-3.87,10.49,1.23.06.24.12.48.18.72,3.43,13.35,10.69,24.82,21.8,34.4,16.06,13.86,36.69,20.79,61.89,20.79,15.75,0,29.84-2.28,42.28-6.85,12.44-4.57,22.91-11.26,31.41-20.08,6.3,10.71,16.77,17.95,31.42,21.73,14.64,3.78,32.68,3.94,54.09.47v-55.75c-7.24.95-12.28.32-15.12-1.89ZM348.85,249.91c0,11.65-4.56,21.02-13.7,28.11-9.13,7.09-20.63,10.63-34.49,10.63-9.13,0-16.38-2.13-21.73-6.38-5.35-4.25-8.03-10.16-8.03-17.72s2.68-13.54,8.03-17.95c5.35-4.41,14.17-7.56,26.46-9.45l43.46-8.03v20.79ZM607.14,262.67c-8.97,11.65-21.34,17.48-37.08,17.48-14.8,0-26.61-5.28-35.43-15.83-8.82-10.55-13.23-24.8-13.23-42.75v-13.23c0-17.95,4.41-32.2,13.23-42.75,8.82-10.55,20.63-15.83,35.43-15.83,15.75,0,28.11,5.83,37.08,17.48,8.98,11.65,13.46,27.56,13.46,47.72s-4.49,36.06-13.46,47.71ZM840.82,249.91c0,11.65-4.56,21.02-13.7,28.11-9.13,7.09-20.63,10.63-34.49,10.63-9.13,0-16.38-2.13-21.73-6.38-5.35-4.25-8.03-10.16-8.03-17.72s2.68-13.54,8.03-17.95c5.35-4.41,14.17-7.56,26.46-9.45l43.46-8.03v20.79Z"
/>
</g>
</g>
</svg>
</div>
</div>
);
}

View File

@@ -0,0 +1 @@
export { OgImage } from "./OgImage";

View File

@@ -5,9 +5,14 @@ import "../style/vars/index.scss";
interface Props { interface Props {
title: string; title: string;
description?: string; description?: string;
ogImage?: string;
} }
const { title, description = "" } = Astro.props; const {
title,
description = "",
ogImage = "https://laba.eus/og-image.jpg",
} = Astro.props;
--- ---
<!doctype html> <!doctype html>
@@ -31,11 +36,8 @@ const { title, description = "" } = Astro.props;
<meta name="fediverse:creator" content="@labasarea@mastodon.eus" /> <meta name="fediverse:creator" content="@labasarea@mastodon.eus" />
<meta property="og:image" content="https://laba.eus/og-image.jpg" /> <meta property="og:image" content={ogImage} />
<meta <meta property="og:image:secure_url" content={ogImage} />
property="og:image:secure_url"
content="https://laba.eus/og-image.jpg"
/>
<meta property="og:image:type" content="image/jpeg" /> <meta property="og:image:type" content="image/jpeg" />
<meta property="og:image:width" content="1200" /> <meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" /> <meta property="og:image:height" content="630" />

View File

@@ -0,0 +1,53 @@
import fs from "fs/promises";
import satori from "satori";
import sharp from "sharp";
import { getCollection } from "astro:content";
import type { InferGetStaticParamsType } from "astro";
import { OgImage } from "../../../components/OgImage";
const posts = await getCollection("ekintzak");
type Params = InferGetStaticParamsType<typeof getStaticPaths>;
export async function GET({ params }: { params: Params }) {
const postEntry = posts.find((p) => p.data?.slug === params.ekintza);
if (!postEntry) {
return new Response("Post not found", { status: 404 });
}
const element = OgImage(postEntry.data);
const png = await PNG(element);
return new Response(png as any, {
headers: {
"Content-Type": "image/png",
},
});
}
export async function getStaticPaths() {
return posts.map((p) => ({
params: { ekintza: p.data?.slug },
props: p.data,
}));
}
export async function SVG(component: JSX.Element) {
return await satori(component as any, {
width: 1200,
height: 630,
fonts: [
{
name: "Sohne",
data: await fs.readFile(
"./public/fonts/sohne/soehne-dreiviertelfett.otf"
),
weight: 400,
},
],
});
}
export async function PNG(component: JSX.Element) {
return await sharp(Buffer.from(await SVG(component)))
.png()
.toBuffer();
}

View File

@@ -23,7 +23,11 @@ const { ekintza } = Astro.props;
const irudia = ekintza.mainMedia ? getImageData(ekintza.mainMedia) : null; const irudia = ekintza.mainMedia ? getImageData(ekintza.mainMedia) : null;
--- ---
<Layout title={ekintza.izenburua} description={ekintza.titularra}> <Layout
title={ekintza.izenburua}
description={ekintza.titularra}
ogImage=`${Astro.site}ekintzak/${ekintza.slug}/og.png`
>
<Header /> <Header />
<main> <main>

109
pnpm-lock.yaml generated
View File

@@ -115,9 +115,15 @@ importers:
react-dom: react-dom:
specifier: ^19.1.1 specifier: ^19.1.1
version: 19.1.1(react@19.1.1) version: 19.1.1(react@19.1.1)
satori:
specifier: ^0.18.3
version: 0.18.3
serve: serve:
specifier: ^14.2.4 specifier: ^14.2.4
version: 14.2.4 version: 14.2.4
sharp:
specifier: ^0.34.4
version: 0.34.4
devDependencies: devDependencies:
sass-embedded: sass-embedded:
specifier: ^1.90.0 specifier: ^1.90.0
@@ -457,9 +463,6 @@ packages:
peerDependencies: peerDependencies:
react: '>=16.8.0' react: '>=16.8.0'
'@emnapi/runtime@1.5.0':
resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==}
'@emnapi/runtime@1.6.0': '@emnapi/runtime@1.6.0':
resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==}
@@ -2250,6 +2253,11 @@ packages:
'@shikijs/vscode-textmate@10.0.2': '@shikijs/vscode-textmate@10.0.2':
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
'@shuding/opentype.js@1.4.0-beta.0':
resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==}
engines: {node: '>= 8.0.0'}
hasBin: true
'@simov/deep-extend@1.0.0': '@simov/deep-extend@1.0.0':
resolution: {integrity: sha512-Arv8/ZPcdKAMJnNF8cks35mPq1y3JnwH1lWpfWDKlJoj+Vw2xmA4+oL7m9GVHTgdX0mGFR7bCPTBTGbxhnfJJw==} resolution: {integrity: sha512-Arv8/ZPcdKAMJnNF8cks35mPq1y3JnwH1lWpfWDKlJoj+Vw2xmA4+oL7m9GVHTgdX0mGFR7bCPTBTGbxhnfJJw==}
engines: {node: '>=4.0.0'} engines: {node: '>=4.0.0'}
@@ -3197,6 +3205,10 @@ packages:
base-64@1.0.0: base-64@1.0.0:
resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==}
base64-js@0.0.8:
resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==}
engines: {node: '>= 0.4'}
base64-js@1.5.1: base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -3779,10 +3791,20 @@ packages:
resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
engines: {node: '>=8'} engines: {node: '>=8'}
css-background-parser@0.1.0:
resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==}
css-box-shadow@1.0.0-3:
resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==}
css-color-keywords@1.0.0: css-color-keywords@1.0.0:
resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
engines: {node: '>=4'} engines: {node: '>=4'}
css-gradient-parser@0.0.17:
resolution: {integrity: sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg==}
engines: {node: '>=16'}
css-loader@6.11.0: css-loader@6.11.0:
resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==}
engines: {node: '>= 12.13.0'} engines: {node: '>= 12.13.0'}
@@ -4126,6 +4148,10 @@ packages:
resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
emoji-regex-xs@2.0.1:
resolution: {integrity: sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==}
engines: {node: '>=10.0.0'}
emoji-regex@10.4.0: emoji-regex@10.4.0:
resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
@@ -4393,6 +4419,9 @@ packages:
fecha@4.2.3: fecha@4.2.3:
resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
fflate@0.7.4:
resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==}
figures@3.2.0: figures@3.2.0:
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -4833,6 +4862,10 @@ packages:
resolution: {integrity: sha512-DWlwuXLLqbrIOltR6tFQXShj/+7Cyp0gLi6uAb8qMdFh/YBBFbKSgQ6nbXmScYd8emMctuthmgIa7tUfo9Rtyg==} resolution: {integrity: sha512-DWlwuXLLqbrIOltR6tFQXShj/+7Cyp0gLi6uAb8qMdFh/YBBFbKSgQ6nbXmScYd8emMctuthmgIa7tUfo9Rtyg==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
hex-rgb@4.3.0:
resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==}
engines: {node: '>=6'}
highlight.js@10.7.3: highlight.js@10.7.3:
resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
@@ -5525,6 +5558,9 @@ packages:
limiter@1.1.5: limiter@1.1.5:
resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==}
linebreak@1.1.0:
resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==}
lines-and-columns@1.2.4: lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
@@ -6335,6 +6371,9 @@ packages:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'} engines: {node: '>=6'}
parse-css-color@0.2.1:
resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==}
parse-entities@4.0.2: parse-entities@4.0.2:
resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
@@ -7272,6 +7311,10 @@ packages:
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
hasBin: true hasBin: true
satori@0.18.3:
resolution: {integrity: sha512-T3DzWNmnrfVmk2gCIlAxLRLbGkfp3K7TyRva+Byyojqu83BNvnMeqVeYRdmUw4TKCsyH4RiQ/KuF/I4yEzgR5A==}
engines: {node: '>=16'}
sax@1.4.1: sax@1.4.1:
resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
@@ -7608,6 +7651,9 @@ packages:
resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
string.prototype.codepointat@0.2.1:
resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==}
string_decoder@0.10.31: string_decoder@0.10.31:
resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==}
@@ -8583,6 +8629,9 @@ packages:
resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==}
engines: {node: '>=18'} engines: {node: '>=18'}
yoga-layout@3.2.1:
resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==}
yup@0.32.9: yup@0.32.9:
resolution: {integrity: sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg==} resolution: {integrity: sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -9100,11 +9149,6 @@ snapshots:
react: 18.3.1 react: 18.3.1
tslib: 2.8.1 tslib: 2.8.1
'@emnapi/runtime@1.5.0':
dependencies:
tslib: 2.8.1
optional: true
'@emnapi/runtime@1.6.0': '@emnapi/runtime@1.6.0':
dependencies: dependencies:
tslib: 2.8.1 tslib: 2.8.1
@@ -9693,7 +9737,7 @@ snapshots:
'@img/sharp-wasm32@0.34.4': '@img/sharp-wasm32@0.34.4':
dependencies: dependencies:
'@emnapi/runtime': 1.5.0 '@emnapi/runtime': 1.6.0
optional: true optional: true
'@img/sharp-win32-arm64@0.34.4': '@img/sharp-win32-arm64@0.34.4':
@@ -10680,6 +10724,11 @@ snapshots:
'@shikijs/vscode-textmate@10.0.2': {} '@shikijs/vscode-textmate@10.0.2': {}
'@shuding/opentype.js@1.4.0-beta.0':
dependencies:
fflate: 0.7.4
string.prototype.codepointat: 0.2.1
'@simov/deep-extend@1.0.0': {} '@simov/deep-extend@1.0.0': {}
'@sindresorhus/is@4.6.0': {} '@sindresorhus/is@4.6.0': {}
@@ -12673,6 +12722,8 @@ snapshots:
base-64@1.0.0: {} base-64@1.0.0: {}
base64-js@0.0.8: {}
base64-js@1.5.1: {} base64-js@1.5.1: {}
baseline-browser-mapping@2.8.19: {} baseline-browser-mapping@2.8.19: {}
@@ -13266,8 +13317,14 @@ snapshots:
crypto-random-string@2.0.0: {} crypto-random-string@2.0.0: {}
css-background-parser@0.1.0: {}
css-box-shadow@1.0.0-3: {}
css-color-keywords@1.0.0: {} css-color-keywords@1.0.0: {}
css-gradient-parser@0.0.17: {}
css-loader@6.11.0(webpack@5.102.1(esbuild@0.25.11)): css-loader@6.11.0(webpack@5.102.1(esbuild@0.25.11)):
dependencies: dependencies:
icss-utils: 5.1.0(postcss@8.5.6) icss-utils: 5.1.0(postcss@8.5.6)
@@ -13614,6 +13671,8 @@ snapshots:
emittery@0.13.1: {} emittery@0.13.1: {}
emoji-regex-xs@2.0.1: {}
emoji-regex@10.4.0: {} emoji-regex@10.4.0: {}
emoji-regex@8.0.0: {} emoji-regex@8.0.0: {}
@@ -13972,6 +14031,8 @@ snapshots:
fecha@4.2.3: {} fecha@4.2.3: {}
fflate@0.7.4: {}
figures@3.2.0: figures@3.2.0:
dependencies: dependencies:
escape-string-regexp: 1.0.5 escape-string-regexp: 1.0.5
@@ -14589,6 +14650,8 @@ snapshots:
helmet@6.2.0: {} helmet@6.2.0: {}
hex-rgb@4.3.0: {}
highlight.js@10.7.3: {} highlight.js@10.7.3: {}
hls.js@1.5.20: {} hls.js@1.5.20: {}
@@ -15325,6 +15388,11 @@ snapshots:
limiter@1.1.5: {} limiter@1.1.5: {}
linebreak@1.1.0:
dependencies:
base64-js: 0.0.8
unicode-trie: 2.0.0
lines-and-columns@1.2.4: {} lines-and-columns@1.2.4: {}
linkify-it@4.0.1: linkify-it@4.0.1:
@@ -16321,6 +16389,11 @@ snapshots:
dependencies: dependencies:
callsites: 3.1.0 callsites: 3.1.0
parse-css-color@0.2.1:
dependencies:
color-name: 1.1.4
hex-rgb: 4.3.0
parse-entities@4.0.2: parse-entities@4.0.2:
dependencies: dependencies:
'@types/unist': 2.0.11 '@types/unist': 2.0.11
@@ -17348,6 +17421,20 @@ snapshots:
'@parcel/watcher': 2.5.1 '@parcel/watcher': 2.5.1
optional: true optional: true
satori@0.18.3:
dependencies:
'@shuding/opentype.js': 1.4.0-beta.0
css-background-parser: 0.1.0
css-box-shadow: 1.0.0-3
css-gradient-parser: 0.0.17
css-to-react-native: 3.2.0
emoji-regex-xs: 2.0.1
escape-html: 1.0.3
linebreak: 1.1.0
parse-css-color: 0.2.1
postcss-value-parser: 4.2.0
yoga-layout: 3.2.1
sax@1.4.1: {} sax@1.4.1: {}
scheduler@0.23.0: scheduler@0.23.0:
@@ -17822,6 +17909,8 @@ snapshots:
get-east-asian-width: 1.3.0 get-east-asian-width: 1.3.0
strip-ansi: 7.1.2 strip-ansi: 7.1.2
string.prototype.codepointat@0.2.1: {}
string_decoder@0.10.31: {} string_decoder@0.10.31: {}
string_decoder@1.1.1: string_decoder@1.1.1:
@@ -18676,6 +18765,8 @@ snapshots:
yoctocolors@2.1.2: {} yoctocolors@2.1.2: {}
yoga-layout@3.2.1: {}
yup@0.32.9: yup@0.32.9:
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4