diff --git a/bun.lock b/bun.lock index 1ce8e7c..83d5a24 100644 --- a/bun.lock +++ b/bun.lock @@ -29,6 +29,7 @@ "babel-plugin-react-compiler": "1.0.0", "oxlint": "^1.76.0", "prettier": "^3.9.6", + "satori": "^0.29.0", "tailwindcss": "^4.3.3", "typescript": "^7.0.2", "vite": "^8.1.5", @@ -176,6 +177,8 @@ "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], + "@shuding/opentype.js": ["@shuding/opentype.js@1.4.0-beta.0", "", { "dependencies": { "fflate": "^0.7.3", "string.prototype.codepointat": "^0.2.1" }, "bin": { "ot": "bin/ot" } }, "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA=="], + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@tabler/icons": ["@tabler/icons@3.46.0", "", {}, "sha512-f2RYFl3fzPwj5WO82x6en0dmkjefxEfOm16D1ByM6cj/McNiwOkL4VaPUoP9VVIrXAD9WnTSVFr70px703b//A=="], @@ -286,10 +289,14 @@ "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + "base64-js": ["base64-js@0.0.8", "", {}, "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.4", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-s4+sLr9mZ/CyqeRritFeYV/Zx73OAtmaHn6kkBS1XRoJn1hrg3xIDUcpicAEX68tkcIN0iBCgti31C8zxtkhsQ=="], "browserslist": ["browserslist@4.28.7", "", { "dependencies": { "baseline-browser-mapping": "^2.10.44", "caniuse-lite": "^1.0.30001806", "electron-to-chromium": "^1.5.393", "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw=="], + "camelize": ["camelize@1.0.1", "", {}, "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001806", "", {}, "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw=="], "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], @@ -302,12 +309,24 @@ "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + "css-background-parser": ["css-background-parser@0.1.0", "", {}, "sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA=="], + + "css-box-shadow": ["css-box-shadow@1.0.0-3", "", {}, "sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg=="], + + "css-color-keywords": ["css-color-keywords@1.0.0", "", {}, "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg=="], + + "css-gradient-parser": ["css-gradient-parser@0.0.17", "", {}, "sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg=="], + + "css-to-react-native": ["css-to-react-native@3.2.0", "", { "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", "postcss-value-parser": "^4.0.2" } }, "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ=="], + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], @@ -322,6 +341,8 @@ "electron-to-chromium": ["electron-to-chromium@1.5.396", "", {}, "sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ=="], + "emoji-regex-xs": ["emoji-regex-xs@2.0.1", "", {}, "sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g=="], + "empathic": ["empathic@2.0.1", "", {}, "sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q=="], "enhanced-resolve": ["enhanced-resolve@5.24.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ=="], @@ -330,6 +351,8 @@ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="], "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], @@ -338,6 +361,8 @@ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + "fflate": ["fflate@0.7.5", "", {}, "sha512-QieYf//cis6ywHNi5qW1+PXPQ4bC+XVJAtS4AXIML8P76GroEiOxm/oQtn1f02UkJY1+KsXMJcC+R2v/Eg4G3g=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], @@ -360,6 +385,8 @@ "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + "hex-rgb": ["hex-rgb@4.3.0", "", {}, "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw=="], + "html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="], "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], @@ -410,6 +437,8 @@ "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.33.0", "", { "os": "win32", "cpu": "x64" }, "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA=="], + "linebreak": ["linebreak@1.1.0", "", { "dependencies": { "base64-js": "0.0.8", "unicode-trie": "^2.0.0" } }, "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ=="], + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], @@ -484,6 +513,10 @@ "oxlint": ["oxlint@1.76.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.76.0", "@oxlint/binding-android-arm64": "1.76.0", "@oxlint/binding-darwin-arm64": "1.76.0", "@oxlint/binding-darwin-x64": "1.76.0", "@oxlint/binding-freebsd-x64": "1.76.0", "@oxlint/binding-linux-arm-gnueabihf": "1.76.0", "@oxlint/binding-linux-arm-musleabihf": "1.76.0", "@oxlint/binding-linux-arm64-gnu": "1.76.0", "@oxlint/binding-linux-arm64-musl": "1.76.0", "@oxlint/binding-linux-ppc64-gnu": "1.76.0", "@oxlint/binding-linux-riscv64-gnu": "1.76.0", "@oxlint/binding-linux-riscv64-musl": "1.76.0", "@oxlint/binding-linux-s390x-gnu": "1.76.0", "@oxlint/binding-linux-x64-gnu": "1.76.0", "@oxlint/binding-linux-x64-musl": "1.76.0", "@oxlint/binding-openharmony-arm64": "1.76.0", "@oxlint/binding-win32-arm64-msvc": "1.76.0", "@oxlint/binding-win32-ia32-msvc": "1.76.0", "@oxlint/binding-win32-x64-msvc": "1.76.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2001", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-6QoFioEU4fNdiUx/2Eo6TRd6NG7H7njnRCz8rhB66cZmMHDTqcm1Rjvl8Wry+ZTQMBAmyb4Mlf62Mk5X+eHSOw=="], + "pako": ["pako@0.2.9", "", {}, "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="], + + "parse-css-color": ["parse-css-color@0.2.1", "", { "dependencies": { "color-name": "^1.1.4", "hex-rgb": "^4.1.0" } }, "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg=="], + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], @@ -494,6 +527,8 @@ "postcss": ["postcss@8.5.22", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-KBDEIpLrvpv16pp3K0Fw+UCoZfopFjjgeB+0tA/aaThfEE74kKDLrgg603YvOWJyg3+WYtyq3xYsQWsIyZlPqQ=="], + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + "prettier": ["prettier@3.9.6", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g=="], "property-information": ["property-information@7.2.0", "", {}, "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg=="], @@ -518,6 +553,8 @@ "rolldown": ["rolldown@1.1.5", "", { "dependencies": { "@oxc-project/types": "=0.139.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.1.5", "@rolldown/binding-darwin-arm64": "1.1.5", "@rolldown/binding-darwin-x64": "1.1.5", "@rolldown/binding-freebsd-x64": "1.1.5", "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", "@rolldown/binding-linux-arm64-gnu": "1.1.5", "@rolldown/binding-linux-arm64-musl": "1.1.5", "@rolldown/binding-linux-ppc64-gnu": "1.1.5", "@rolldown/binding-linux-s390x-gnu": "1.1.5", "@rolldown/binding-linux-x64-gnu": "1.1.5", "@rolldown/binding-linux-x64-musl": "1.1.5", "@rolldown/binding-openharmony-arm64": "1.1.5", "@rolldown/binding-wasm32-wasi": "1.1.5", "@rolldown/binding-win32-arm64-msvc": "1.1.5", "@rolldown/binding-win32-x64-msvc": "1.1.5" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA=="], + "satori": ["satori@0.29.0", "", { "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.0.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" } }, "sha512-fPAfrwNaIQ7EsJLhY382STEqpczN6ZEH9NsKXDQgRcxUXNNPB73iAjSshzFwTaaScT68pxV0pmG6TBzDQ4sEGw=="], + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], @@ -528,6 +565,8 @@ "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + "string.prototype.codepointat": ["string.prototype.codepointat@0.2.1", "", {}, "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg=="], + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], @@ -538,6 +577,8 @@ "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], + "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], @@ -552,6 +593,8 @@ "unicode-segmenter": ["unicode-segmenter@0.17.1", "", {}, "sha512-imwm2Aty0hfnY/3LqBWiyhuxxGso7qwhLXDp0BjOpmtYdjYgWJvT9JXthbu3MmEITwgjbYWaRJ0b2yRfgYnD5Q=="], + "unicode-trie": ["unicode-trie@2.0.0", "", { "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" } }, "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ=="], + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], @@ -578,6 +621,8 @@ "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + "yoga-layout": ["yoga-layout@3.2.1", "", {}, "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ=="], + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], "@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@8.0.4", "", {}, "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg=="], diff --git a/index.html b/index.html index 85c0846..4c7b4b9 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,29 @@ - snrld + + + + + + + + + + + + + + + + + + + + + + + snrld — Tightly-knit social coding for cats
diff --git a/package.json b/package.json index 463a4cb..805623e 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "type": "module", "scripts": { "dev": "vite", - "build": "tsc -b && vite build", + "build": "bun run generate:og && tsc -b && vite build", + "generate:og": "bun run scripts/generate-og-image.ts", "lint": "oxlint", "preview": "vite preview", "format": "prettier --write .", @@ -28,6 +29,7 @@ "devDependencies": { "@catppuccin/tailwindcss": "^1.0.0", "@rolldown/plugin-babel": "0.2.3", + "@resvg/resvg-js": "^2.6.2", "@tailwindcss/vite": "^4.3.3", "@types/node": "^26.1.2", "@types/react": "^19.2.17", @@ -36,6 +38,7 @@ "babel-plugin-react-compiler": "1.0.0", "oxlint": "^1.76.0", "prettier": "^3.9.6", + "satori": "^0.29.0", "tailwindcss": "^4.3.3", "typescript": "^7.0.2", "vite": "^8.1.5" diff --git a/public/og.png b/public/og.png new file mode 100644 index 0000000000000000000000000000000000000000..f109385692e207923d090b589fc5120a5f3b2226 GIT binary patch literal 20302 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 Y#v9-Krc1M5_XOn)Pgg&ebxsLQ06X9eL;wH) literal 0 HcmV?d00001 diff --git a/scripts/generate-og-image.ts b/scripts/generate-og-image.ts new file mode 100644 index 0000000..5de4f22 --- /dev/null +++ b/scripts/generate-og-image.ts @@ -0,0 +1,52 @@ +import { readFile, writeFile } from 'node:fs/promises' +import { Resvg } from '@resvg/resvg-js' +import { createElement } from 'react' +import satori from 'satori' + +const WIDTH = 1200 +const HEIGHT = 630 +const fontData = await readFile('public/fonts/CaskaydiaCoveNerdFont-Regular.ttf') +const logoData = await readFile('public/catppuccin-logo.png') +const logoUrl = `data:image/png;base64,${logoData.toString('base64')}` + +const svg = await satori( + createElement( + 'div', + { + style: { + alignItems: 'center', + backgroundColor: '#303446', + color: '#c6d0f5', + display: 'flex', + height: '100%', + padding: '72px', + position: 'relative', + width: '100%', + }, + }, + createElement('img', { + height: 152, + src: logoUrl, + style: { marginRight: '48px', width: 152 }, + width: 152, + }), + createElement( + 'div', + { style: { display: 'flex', flexDirection: 'column' } }, + createElement('div', { style: { color: '#babbf1', fontSize: 72 } }, 'snrld'), + createElement( + 'div', + { style: { fontSize: 30, lineHeight: 1.4, marginTop: '18px' } }, + 'Tightly-knit social coding for cats.', + ), + ), + ), + { + fonts: [{ data: fontData, name: 'Caskaydia Cove', style: 'normal', weight: 400 }], + height: HEIGHT, + width: WIDTH, + }, +) + +const image = new Resvg(svg, { fitTo: { mode: 'width', value: WIDTH } }).render() +await writeFile('public/og.png', image.asPng()) diff --git a/src/pages/HomePage.tsx b/src/pages/HomePage.tsx index 7e22d31..0e041da 100644 --- a/src/pages/HomePage.tsx +++ b/src/pages/HomePage.tsx @@ -7,7 +7,9 @@ export function HomePage() {
-

An experimental Tangled client.

+

+ Tightly-knit social coding for cats. +

snrld