From 2bf9699285da209decbeaa85623d508ff0220ae2 Mon Sep 17 00:00:00 2001 From: Jade Ellis Date: Tue, 23 Jul 2024 21:20:42 +0100 Subject: [PATCH] Add OG images --- packages/website/package.json | 2 + .../routes/blog/[...date]/[slug]/+page.svelte | 55 +++++-- .../website/src/routes/blog/image/+server.ts | 144 ++++++++++++++++++ pnpm-lock.yaml | 139 +++++++++++++++++ 4 files changed, 328 insertions(+), 12 deletions(-) create mode 100644 packages/website/src/routes/blog/image/+server.ts 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: {}