diff --git a/packages/website/package.json b/packages/website/package.json
index 5cdcadfd..b1a901bd 100644
--- a/packages/website/package.json
+++ b/packages/website/package.json
@@ -68,6 +68,7 @@
"@isaacs/ttlcache": "^1.4.1",
"@lezer/highlight": "^1.2.0",
"@octokit/types": "^13.5.0",
+ "@resvg/resvg-js": "^2.6.2",
"@steeze-ui/svelte-icon": "^1.5.0",
"@tusbar/cache-control": "^1.0.2",
"@uiw/codemirror-theme-github": "^4.22.2",
@@ -76,6 +77,7 @@
"codemirror": "^6.0.1",
"magic-string": "^0.30.10",
"octokit": "^3.2.1",
+ "satori": "^0.10.14",
"slugify": "^1.6.6",
"super-sitemap": "^0.14.14",
"svelte-codemirror-editor": "^1.4.0",
diff --git a/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte b/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte
index 738ac6b8..148d9f4c 100644
--- a/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte
+++ b/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte
@@ -12,14 +12,24 @@
// }
$: canonical = SITE_URL + "/blog/" + data.post.canonical;
- $: webShareAPISupported = browser && typeof navigator.share !== 'undefined';
+ function calcOgURL(slug: string, date: string, width?: number): URL {
+ let url = new URL(SITE_URL + "/blog/image");
+ url.searchParams.set("slug", slug);
+ url.searchParams.set("date", date);
+ if (width) {
+ url.searchParams.set("width", width.toString());
+ }
+ return url;
+ }
+
+ $: webShareAPISupported = browser && typeof navigator.share !== "undefined";
// let webShareAPISupported = true;
$: handleWebShare;
const handleWebShare = async () => {
try {
- let url = new URL(canonical)
- url.searchParams.set("utm_medium", "share")
+ let url = new URL(canonical);
+ url.searchParams.set("utm_medium", "share");
navigator.share({
title: data.post.title,
text: data.post.description,
@@ -33,15 +43,25 @@
const defaultAuthor = {
name: "Jade Ellis",
url: "https://jade.ellis.link",
- fediverse: "@JadedBlueEyes@tech.lgbt"
- }
+ fediverse: "@JadedBlueEyes@tech.lgbt",
+ };
-
-
+
+
{#if defaultAuthor?.fediverse}
-
+
{/if}
@@ -59,6 +79,13 @@
openGraph={{
title: data.post.title,
description: data.post.description,
+ images: [
+ {
+ url: calcOgURL(data.post.slug, data.post.date, 1200).toString(),
+ width: 1200,
+ height: 1200 / 2,
+ },
+ ],
}}
/>
@@ -70,11 +97,15 @@
>{new Date(data.post.date).toLocaleDateString()}
- · By {defaultAuthor.name}
+ ·
+ By {defaultAuthor.name}
· {data.post.readingTime.text}
- {#if webShareAPISupported} ·
+ {#if webShareAPISupported}
+ ·
{/if}
diff --git a/packages/website/src/routes/blog/image/+server.ts b/packages/website/src/routes/blog/image/+server.ts
new file mode 100644
index 00000000..9053de9f
--- /dev/null
+++ b/packages/website/src/routes/blog/image/+server.ts
@@ -0,0 +1,144 @@
+import { pages } from '../posts'
+import { error } from '@sveltejs/kit'
+
+import satori from 'satori';
+import { Resvg } from '@resvg/resvg-js';
+import { SITE_DOMAIN } from '$lib/metadata';
+import TTLCache, { } from "@isaacs/ttlcache";
+import { format } from "@tusbar/cache-control";
+const cache = new TTLCache({ max: 10000, ttl: 1000 * 60 * 60 })
+
+// import type { Endpoints } from "@octokit/types";
+
+// let repoRegex = new RegExp("https?://github\.com/(?[a-zA-Z0-9]+/[a-zA-Z0-9]+)/?")
+
+
+
+const fontFile = await fetch('https://og-playground.vercel.app/inter-latin-ext-700-normal.woff');
+const fontData: ArrayBuffer = await fontFile.arrayBuffer();
+
+// const height = 630;
+// const width = 1200;
+const defaultHeight = 400;
+const defaultWidth = 800;
+
+const h = (type: any, props: any) => { return { type, props } }
+
+/** @type {import('./$types').RequestHandler} */
+export async function GET({ url }) {
+ const slug = url.searchParams.get('slug')
+ let dateParts = url.searchParams.get('date')?.split(/[\/-]/)?.map((p: string) => parseInt(p, 10))
+ if (dateParts && dateParts.length > 3) {
+ throw error(404, 'Post not found (bad date)')
+ }
+ const width = Number(url.searchParams.get('width'))
+ if (width > 10000) {
+ throw error(400, 'Image too big')
+ }
+ if (!cache.has(slug + "/" + dateParts?.join("-") + "/" + width)) {
+
+ // let start = new Date(dateParts[0] || 1, dateParts[1] || 0, dateParts[2] || 0);
+ // // @ts-ignore
+ // let end = new Date(...dateParts);
+ // console.log(dateParts)
+
+ // get post with metadata
+ const page = pages
+ .filter((post) => slug === post.slug)
+ .filter((post) => {
+ if (dateParts) {
+ let date = new Date(post.date)
+ return (
+ (!dateParts[0] || date.getFullYear() == dateParts[0]) &&
+ (!dateParts[1] || date.getMonth() + 1 == dateParts[1]) &&
+ (!dateParts[2] || date.getDate() == dateParts[2])
+ )
+ } else { return true }
+ })[0]
+
+ if (!page) {
+ throw error(404, 'Post not found')
+ }
+ let template = h("div", {
+ style: {
+ display: 'flex',
+ height: '100%',
+ width: '100%',
+ padding: '10px 20px',
+ // alignItems: 'center',
+ justifyContent: 'center',
+ flexDirection: 'column',
+ backgroundImage: 'linear-gradient(to bottom, #dbf4ff, #eff3fc)',
+ fontSize: 60,
+ // letterSpacing: -2,
+ fontWeight: 700
+ // textAlign: 'center',
+ },
+ children: [h("div", {
+ style: {
+ fontSize: 15,
+ fontWeight: 600,
+ textTransform: 'uppercase',
+ letterSpacing: 1,
+ margin: '25px 0 10px',
+ color: 'gray'
+ },
+ children: SITE_DOMAIN
+ }), h("div", {
+ style: {
+ backgroundImage: 'linear-gradient(90deg, rgb(22, 61, 120), rgb(30, 42, 85))',
+ backgroundClip: 'text',
+ '-webkit-background-clip': 'text',
+ color: 'transparent'
+ },
+ children: page.title
+ }), h("aside", {
+ style: {
+ fontSize: 20,
+ fontWeight: 500,
+ color: '#202020',
+ margin: '10px 0 10px'
+ },
+ children: `Published on ${new Date(page.date).toLocaleDateString()} \xB7 By Jade Ellis \xB7 ${page.readingTime.text}`
+ })]
+ });
+ const svg = await satori(template, {
+ fonts: [
+ {
+ name: 'Inter Latin',
+ data: fontData,
+ style: 'normal'
+ }
+ ],
+ height: defaultHeight,
+ width: defaultWidth,
+ });
+
+ const resvg = new Resvg(svg, {
+ fitTo: {
+ mode: 'width',
+ value: width || defaultWidth
+ }
+ });
+
+ const image = resvg.render().asPng();
+ cache.set(slug + "/" + dateParts?.join("-") + "/" + width, image)
+ return new Response(image, {
+ headers: {
+ 'content-type': 'image/png'
+ }
+ });
+ ;
+ } else {
+ return new Response(cache.get(slug + "/" + dateParts?.join("-") + "/" + width), {
+ headers: {
+ 'Content-Type': 'image/png',
+ 'Cache-Control': format({
+ public: true,
+ // immutable: true
+ maxAge: 60 * 60 * 24
+ })
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 76ff145a..c3b7612f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -68,6 +68,9 @@ importers:
'@octokit/types':
specifier: ^13.5.0
version: 13.5.0
+ '@resvg/resvg-js':
+ specifier: ^2.6.2
+ version: 2.6.2
'@steeze-ui/svelte-icon':
specifier: ^1.5.0
version: 1.5.0(svelte@4.2.18)
@@ -92,6 +95,9 @@ importers:
octokit:
specifier: ^3.2.1
version: 3.2.1
+ satori:
+ specifier: ^0.10.14
+ version: 0.10.14
slugify:
specifier: ^1.6.6
version: 1.6.6
@@ -1034,6 +1040,11 @@ packages:
cpu: [x64]
os: [win32]
+ '@shuding/opentype.js@1.4.0-beta.0':
+ resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==}
+ engines: {node: '>= 8.0.0'}
+ hasBin: true
+
'@steeze-ui/svelte-icon@1.5.0':
resolution: {integrity: sha512-Y0S7Qk2kO6byzOlD5SQGbOF2ZaKXJgfTkH78QUPcq579wiWMQJ5H14zL4XwtsPJ0DfkoL5qa3WaIdYkWb9A6AA==}
peerDependencies:
@@ -1205,6 +1216,10 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ base64-js@0.0.8:
+ resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==}
+ engines: {node: '>= 0.4'}
+
bcp-47-match@2.0.3:
resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==}
@@ -1255,6 +1270,9 @@ packages:
camel-case@4.1.2:
resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
+ camelize@1.0.1:
+ resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
+
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
@@ -1354,12 +1372,25 @@ packages:
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
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:
+ resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
+ engines: {node: '>=4'}
+
css-select@5.1.0:
resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
css-selector-parser@1.4.1:
resolution: {integrity: sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==}
+ css-to-react-native@3.2.0:
+ resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==}
+
css-tree@2.2.1:
resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
@@ -1452,6 +1483,9 @@ packages:
ecdsa-sig-formatter@1.0.11:
resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
+ emoji-regex@10.3.0:
+ resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==}
+
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -1477,6 +1511,9 @@ packages:
resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
engines: {node: '>=6'}
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
escape-string-regexp@1.0.5:
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
engines: {node: '>=0.8.0'}
@@ -1523,6 +1560,9 @@ packages:
fault@2.0.1:
resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==}
+ fflate@0.7.4:
+ resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==}
+
fill-range@7.1.1:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
@@ -1622,6 +1662,10 @@ packages:
hastscript@7.2.0:
resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==}
+ hex-rgb@4.3.0:
+ resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==}
+ engines: {node: '>=6'}
+
html-minifier-terser@7.2.0:
resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==}
engines: {node: ^14.13.1 || >=16.0.0}
@@ -1748,6 +1792,9 @@ packages:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
engines: {node: '>=6'}
+ linebreak@1.1.0:
+ resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==}
+
locate-character@3.0.0:
resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==}
@@ -2009,6 +2056,9 @@ packages:
resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
engines: {node: '>=12'}
+ pako@0.2.9:
+ resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==}
+
param-case@3.0.4:
resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
@@ -2016,6 +2066,9 @@ packages:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
+ parse-css-color@0.2.1:
+ resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==}
+
parse-numeric-range@1.3.0:
resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==}
@@ -2053,6 +2106,9 @@ packages:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
postcss@8.4.38:
resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
engines: {node: ^10 || ^12 || >=14}
@@ -2194,6 +2250,10 @@ packages:
sander@0.5.1:
resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==}
+ satori@0.10.14:
+ resolution: {integrity: sha512-abovcqmwl97WKioxpkfuMeZmndB1TuDFY/R+FymrZyiGP+pMYomvgSzVPnbNMWHHESOPosVHGL352oFbdAnJcA==}
+ engines: {node: '>=16'}
+
schema-dts@1.1.2:
resolution: {integrity: sha512-MpNwH0dZJHinVxk9bT8XUdjKTxMYrA5bLtrrGmFA6PTLwlOKnhi67XoRd6/ty+Djt6ZC0slR57qFhZDNMI6DhQ==}
peerDependencies:
@@ -2270,6 +2330,9 @@ packages:
resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
engines: {node: '>=12'}
+ string.prototype.codepointat@0.2.1:
+ resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==}
+
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
@@ -2467,6 +2530,9 @@ packages:
tiny-glob@0.2.9:
resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==}
+ tiny-inflate@1.0.3:
+ resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
+
tm-grammars@1.13.11:
resolution: {integrity: sha512-qZysArHMEbWF27pI914n8RpkFj8t1zNwXoEzJfzE6eknxOrPeRea+z6N9rZvhqIO0vrS7qBjoE/u8zibO+gYBA==}
@@ -2512,6 +2578,9 @@ packages:
undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+ unicode-trie@2.0.0:
+ resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==}
+
unified@10.1.2:
resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==}
@@ -2688,6 +2757,9 @@ packages:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
engines: {node: '>=12'}
+ yoga-wasm-web@0.3.3:
+ resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==}
+
zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
@@ -3382,6 +3454,11 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.18.0':
optional: true
+ '@shuding/opentype.js@1.4.0-beta.0':
+ dependencies:
+ fflate: 0.7.4
+ string.prototype.codepointat: 0.2.1
+
'@steeze-ui/svelte-icon@1.5.0(svelte@4.2.18)':
dependencies:
svelte: 4.2.18
@@ -3554,6 +3631,8 @@ snapshots:
balanced-match@1.0.2: {}
+ base64-js@0.0.8: {}
+
bcp-47-match@2.0.3: {}
before-after-hook@2.2.3: {}
@@ -3594,6 +3673,8 @@ snapshots:
pascal-case: 3.1.2
tslib: 2.6.3
+ camelize@1.0.1: {}
+
ccount@2.0.1: {}
chalk@2.4.2:
@@ -3710,6 +3791,12 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
+ css-background-parser@0.1.0: {}
+
+ css-box-shadow@1.0.0-3: {}
+
+ css-color-keywords@1.0.0: {}
+
css-select@5.1.0:
dependencies:
boolbase: 1.0.0
@@ -3720,6 +3807,12 @@ snapshots:
css-selector-parser@1.4.1: {}
+ css-to-react-native@3.2.0:
+ dependencies:
+ camelize: 1.0.1
+ css-color-keywords: 1.0.0
+ postcss-value-parser: 4.2.0
+
css-tree@2.2.1:
dependencies:
mdn-data: 2.0.28
@@ -3800,6 +3893,8 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
+ emoji-regex@10.3.0: {}
+
emoji-regex@8.0.0: {}
emoji-regex@9.2.2: {}
@@ -3838,6 +3933,8 @@ snapshots:
escalade@3.1.2: {}
+ escape-html@1.0.3: {}
+
escape-string-regexp@1.0.5: {}
escape-string-regexp@5.0.0: {}
@@ -3880,6 +3977,8 @@ snapshots:
dependencies:
format: 0.2.2
+ fflate@0.7.4: {}
+
fill-range@7.1.1:
dependencies:
to-regex-range: 5.0.1
@@ -4007,6 +4106,8 @@ snapshots:
property-information: 6.5.0
space-separated-tokens: 2.0.2
+ hex-rgb@4.3.0: {}
+
html-minifier-terser@7.2.0:
dependencies:
camel-case: 4.1.2
@@ -4131,6 +4232,11 @@ snapshots:
kleur@4.1.5: {}
+ linebreak@1.1.0:
+ dependencies:
+ base64-js: 0.0.8
+ unicode-trie: 2.0.0
+
locate-character@3.0.0: {}
lodash.camelcase@4.3.0: {}
@@ -4564,6 +4670,8 @@ snapshots:
is-docker: 2.2.1
is-wsl: 2.2.0
+ pako@0.2.9: {}
+
param-case@3.0.4:
dependencies:
dot-case: 3.0.4
@@ -4573,6 +4681,11 @@ snapshots:
dependencies:
callsites: 3.1.0
+ parse-css-color@0.2.1:
+ dependencies:
+ color-name: 1.1.4
+ hex-rgb: 4.3.0
+
parse-numeric-range@1.3.0: {}
parse5@6.0.1: {}
@@ -4605,6 +4718,8 @@ snapshots:
picomatch@2.3.1: {}
+ postcss-value-parser@4.2.0: {}
+
postcss@8.4.38:
dependencies:
nanoid: 3.3.7
@@ -4798,6 +4913,19 @@ snapshots:
mkdirp: 0.5.6
rimraf: 2.7.1
+ satori@0.10.14:
+ dependencies:
+ '@shuding/opentype.js': 1.4.0-beta.0
+ css-background-parser: 0.1.0
+ css-box-shadow: 1.0.0-3
+ css-to-react-native: 3.2.0
+ emoji-regex: 10.3.0
+ escape-html: 1.0.3
+ linebreak: 1.1.0
+ parse-css-color: 0.2.1
+ postcss-value-parser: 4.2.0
+ yoga-wasm-web: 0.3.3
+
schema-dts@1.1.2(typescript@5.4.5):
dependencies:
typescript: 5.4.5
@@ -4892,6 +5020,8 @@ snapshots:
emoji-regex: 9.2.2
strip-ansi: 7.1.0
+ string.prototype.codepointat@0.2.1: {}
+
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
@@ -5075,6 +5205,8 @@ snapshots:
globalyzer: 0.1.0
globrex: 0.1.2
+ tiny-inflate@1.0.3: {}
+
tm-grammars@1.13.11: {}
to-regex-range@5.0.1:
@@ -5111,6 +5243,11 @@ snapshots:
undici-types@5.26.5: {}
+ unicode-trie@2.0.0:
+ dependencies:
+ pako: 0.2.9
+ tiny-inflate: 1.0.3
+
unified@10.1.2:
dependencies:
'@types/unist': 2.0.10
@@ -5335,4 +5472,6 @@ snapshots:
y18n: 5.0.8
yargs-parser: 21.1.1
+ yoga-wasm-web@0.3.3: {}
+
zwitch@2.0.4: {}