diff --git a/README.md b/README.md
index 4d704125..e9bdea74 100644
--- a/README.md
+++ b/README.md
@@ -52,6 +52,7 @@ All packages are packaged underneath the `@stephansama` scope (for example: `@st
| [catppuccin-rss](core/catppuccin-rss/README.md) |  |  | Catppuccin x Pretty-feed-v3 |
| [catppuccin-typedoc](core/catppuccin-typedoc/README.md) |  |  | Catppuccin css variable theme for typedoc |
| [catppuccin-xsl](core/catppuccin-xsl/README.md) |  |  | Catppuccin styles for various xsl formats |
+| [convert-svg](core/convert-svg/README.md) |  |  | convert svg into multiple formats |
| [create-stephansama-example](core/example/README.md) |  |  | Download an example from the @stephansama/packages examples |
| [find-makefile-targets](core/find-makefile-targets/README.md) |  |  | Find makefile targets used to pipe into fzf |
| [github-env](core/github-env/README.md) |  |  | \[Deprecated] Additional environment variable types for GitHub CI |
diff --git a/core/convert-svg/README.md b/core/convert-svg/README.md
new file mode 100644
index 00000000..1233fd7e
--- /dev/null
+++ b/core/convert-svg/README.md
@@ -0,0 +1,25 @@
+# @stephansama/convert-svg
+
+[](https://github.com/stephansama/packages/tree/main/core/convert-svg)
+[](https://packages.stephansama.info/api/@stephansama/convert-svg)
+[](https://www.npmx.dev/package/@stephansama/convert-svg)
+[](https://www.npmx.dev/package/@stephansama/convert-svg)
+
+convert svg into multiple formats
+
+##### Table of contents
+
+Open Table of contents
+
+- [Installation](#installation)
+- [Usage](#usage)
+
+
+
+## Installation
+
+```sh
+pnpm install @stephansama/convert-svg
+```
+
+## Usage
diff --git a/core/convert-svg/cli.mjs b/core/convert-svg/cli.mjs
new file mode 100644
index 00000000..e69de29b
diff --git a/core/convert-svg/package.json b/core/convert-svg/package.json
new file mode 100644
index 00000000..b5fbbc81
--- /dev/null
+++ b/core/convert-svg/package.json
@@ -0,0 +1,53 @@
+{
+ "name": "@stephansama/convert-svg",
+ "version": "0.0.0",
+ "description": "convert svg into multiple formats",
+ "keywords": [
+ "convert-svg"
+ ],
+ "homepage": "https://packages.stephansama.info/api/@stephansama/convert-svg",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/stephansama/packages",
+ "directory": "core/convert-svg"
+ },
+ "license": "MIT",
+ "author": {
+ "name": "Stephan Randle",
+ "email": "stephanrandle.dev@gmail.com",
+ "url": "https://stephansama.info"
+ },
+ "type": "module",
+ "scripts": {
+ "build": "tsdown",
+ "dev": "tsdown --watch",
+ "lint": "eslint ./ --pass-on-no-patterns --no-error-on-unmatched-pattern",
+ "lint:fix": "eslint ./ --fix"
+ },
+ "dependencies": {
+ "cleye": "catalog:",
+ "ico-endec": "catalog:",
+ "sharp": "catalog:"
+ },
+ "devDependencies": {
+ "tsdown": "catalog:"
+ },
+ "publishConfig": {
+ "access": "public",
+ "provenance": true
+ },
+ "main": "./dist/index.cjs",
+ "module": "./dist/index.js",
+ "types": "./dist/index.d.cts",
+ "exports": {
+ ".": {
+ "import": "./dist/index.js",
+ "require": "./dist/index.cjs"
+ },
+ "./cli": {
+ "import": "./dist/cli.js",
+ "require": "./dist/cli.cjs"
+ },
+ "./package.json": "./package.json"
+ }
+}
diff --git a/core/convert-svg/src/cli.ts b/core/convert-svg/src/cli.ts
new file mode 100644
index 00000000..b86da429
--- /dev/null
+++ b/core/convert-svg/src/cli.ts
@@ -0,0 +1,29 @@
+import { cli } from "cleye";
+
+// Parse argv
+const argv = cli({
+ flags: {
+ input: {
+ description: "input svg filename",
+ type: String,
+ },
+ output: {
+ default: "output ico filename",
+ description: "Time of day to greet (morning or evening)",
+ type: String,
+ },
+ },
+ name: "@stephansama/convert-svg",
+ parameters: [
+ "", // First name is required
+ "[last name]", // Last name is optional
+ ],
+});
+
+const name = [argv._.firstName, argv._.lastName].filter(Boolean).join(" ");
+
+if (argv.flags.time === "morning") {
+ console.log(`Good morning ${name}!`);
+} else {
+ console.log(`Good evening ${name}!`);
+}
diff --git a/core/convert-svg/src/ico.ts b/core/convert-svg/src/ico.ts
new file mode 100644
index 00000000..6f37f481
--- /dev/null
+++ b/core/convert-svg/src/ico.ts
@@ -0,0 +1,46 @@
+import ico from "ico-endec";
+import * as fs from "node:fs";
+import sharp from "sharp";
+
+export const ValidSizes = [16, 32, 48, 64, 128, 256] as const;
+export type ValidSize = (typeof ValidSizes)[number];
+
+export async function svgToIco({
+ compressionLevel = 1,
+ input,
+ output = "favicon.ico",
+ sizes = [16, 32, 48, 64, 128, 256],
+}: {
+ compressionLevel: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
+ input: string;
+ output: string;
+ sizes: ValidSize[];
+}) {
+ if (!Number.isInteger(compressionLevel)) {
+ throw new Error(
+ `compression level must be a number above -1 and below 10 '${compressionLevel}'`,
+ );
+ }
+
+ if (compressionLevel < 0) {
+ throw new Error(`compression level is to low must be above -1`);
+ }
+
+ if (compressionLevel > 9) {
+ throw new Error(`compression level is to high must be below 10`);
+ }
+
+ for (const size of sizes) {
+ const png_buffer = await sharp(input)
+ .resize(size, size, {
+ background: { alpha: 0, b: 0, g: 0, r: 0 },
+ fit: "contain",
+ })
+ .png({ compressionLevel })
+ .toBuffer();
+
+ const ico_buffer = ico.encode(png_buffer);
+
+ await fs.promises.writeFile(output, ico_buffer);
+ }
+}
diff --git a/core/convert-svg/src/index.ts b/core/convert-svg/src/index.ts
new file mode 100644
index 00000000..cee6b381
--- /dev/null
+++ b/core/convert-svg/src/index.ts
@@ -0,0 +1 @@
+export { svgToIco } from "./ico";
diff --git a/core/convert-svg/src/png.ts b/core/convert-svg/src/png.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/core/convert-svg/tsconfig.json b/core/convert-svg/tsconfig.json
new file mode 100644
index 00000000..b095eacd
--- /dev/null
+++ b/core/convert-svg/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": ["../../tsconfig.base.json"],
+ "include": ["./src/**/*", "./types/*.d.ts"],
+ "compilerOptions": {
+ "types": ["./types/ico-endec.d.ts", "node"]
+ }
+}
diff --git a/core/convert-svg/tsdown.config.ts b/core/convert-svg/tsdown.config.ts
new file mode 100644
index 00000000..4cdfc951
--- /dev/null
+++ b/core/convert-svg/tsdown.config.ts
@@ -0,0 +1,11 @@
+import { defineConfig } from "tsdown";
+
+export default defineConfig({
+ attw: true,
+ dts: true,
+ entry: ["./src/index.ts", "./src/cli.ts"],
+ exports: true,
+ format: ["esm", "cjs"],
+ publint: true,
+ target: "esnext",
+});
diff --git a/core/convert-svg/typedoc.json b/core/convert-svg/typedoc.json
new file mode 100644
index 00000000..57eeff2c
--- /dev/null
+++ b/core/convert-svg/typedoc.json
@@ -0,0 +1,12 @@
+{
+ "entryPoints": ["src/*"],
+ "tsconfig": "./tsconfig.json",
+ "exclude": [
+ "**/tests/**",
+ "**/*.test.ts",
+ "**/*.spec.ts",
+ "node_modules",
+ "**/{node_modules,test,book,doc,dist}/**/*",
+ "**/{pages,components}/**"
+ ]
+}
diff --git a/core/convert-svg/types/ico-endec.d.ts b/core/convert-svg/types/ico-endec.d.ts
new file mode 100644
index 00000000..d747d12f
--- /dev/null
+++ b/core/convert-svg/types/ico-endec.d.ts
@@ -0,0 +1,3 @@
+declare module "ico-endec" {
+ export function encode(buf: Buffer): Buffer;
+}
diff --git a/core/types-github-action-env/CHANGELOG.md b/core/types-github-action-env/CHANGELOG.md
index 21d356c0..68eb10ee 100644
--- a/core/types-github-action-env/CHANGELOG.md
+++ b/core/types-github-action-env/CHANGELOG.md
@@ -1,4 +1,4 @@
-# @stephansama/github-env
+# @stephansama/types-github-action-env
## 1.0.0
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 49b71400..f2cbaed6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -70,6 +70,9 @@ catalogs:
astro:
specifier: 5.9.3
version: 5.9.3
+ cleye:
+ specifier: ^2.3.0
+ version: 2.3.0
deepmerge:
specifier: ^4.3.1
version: 4.3.1
@@ -85,6 +88,9 @@ catalogs:
happy-dom:
specifier: ^20.6.1
version: 20.6.1
+ ico-endec:
+ specifier: ^0.1.6
+ version: 0.1.6
json-schema-to-typescript:
specifier: ^15.0.4
version: 15.0.4
@@ -109,6 +115,9 @@ catalogs:
remark:
specifier: ^15.0.1
version: 15.0.1
+ sharp:
+ specifier: ^0.34.5
+ version: 0.34.5
tailwind-scrollbar:
specifier: ^4.0.2
version: 4.0.2
@@ -634,6 +643,22 @@ importers:
specifier: catalog:schema
version: 4.2.1
+ core/convert-svg:
+ dependencies:
+ cleye:
+ specifier: 'catalog:'
+ version: 2.3.0
+ ico-endec:
+ specifier: 'catalog:'
+ version: 0.1.6
+ sharp:
+ specifier: 'catalog:'
+ version: 0.34.5
+ devDependencies:
+ tsdown:
+ specifier: 'catalog:'
+ version: 0.15.12(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.17.1)(publint@0.3.17)(typescript@5.9.3)(vue-tsc@2.2.12(typescript@5.9.3))
+
core/example:
dependencies:
'@bluwy/giget-core':
@@ -2479,6 +2504,12 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@img/sharp-darwin-arm64@0.34.5':
+ resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [darwin]
+
'@img/sharp-darwin-x64@0.33.5':
resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -2491,6 +2522,12 @@ packages:
cpu: [x64]
os: [darwin]
+ '@img/sharp-darwin-x64@0.34.5':
+ resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [darwin]
+
'@img/sharp-libvips-darwin-arm64@1.0.4':
resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==}
cpu: [arm64]
@@ -2501,6 +2538,11 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
+ cpu: [arm64]
+ os: [darwin]
+
'@img/sharp-libvips-darwin-x64@1.0.4':
resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==}
cpu: [x64]
@@ -2511,6 +2553,11 @@ packages:
cpu: [x64]
os: [darwin]
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
+ cpu: [x64]
+ os: [darwin]
+
'@img/sharp-libvips-linux-arm64@1.0.4':
resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==}
cpu: [arm64]
@@ -2523,6 +2570,12 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-libvips-linux-arm@1.0.5':
resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==}
cpu: [arm]
@@ -2535,12 +2588,30 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-libvips-linux-ppc64@1.2.3':
resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-libvips-linux-s390x@1.0.4':
resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==}
cpu: [s390x]
@@ -2553,6 +2624,12 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-libvips-linux-x64@1.0.4':
resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==}
cpu: [x64]
@@ -2565,6 +2642,12 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-libvips-linuxmusl-arm64@1.0.4':
resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==}
cpu: [arm64]
@@ -2577,6 +2660,12 @@ packages:
os: [linux]
libc: [musl]
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
'@img/sharp-libvips-linuxmusl-x64@1.0.4':
resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==}
cpu: [x64]
@@ -2589,6 +2678,12 @@ packages:
os: [linux]
libc: [musl]
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
'@img/sharp-linux-arm64@0.33.5':
resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -2603,6 +2698,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-linux-arm64@0.34.5':
+ resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-linux-arm@0.33.5':
resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -2617,6 +2719,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-linux-arm@0.34.5':
+ resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-linux-ppc64@0.34.4':
resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -2624,6 +2733,20 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-linux-ppc64@0.34.5':
+ resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-linux-s390x@0.33.5':
resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -2638,6 +2761,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-linux-s390x@0.34.5':
+ resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-linux-x64@0.33.5':
resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -2652,6 +2782,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-linux-x64@0.34.5':
+ resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-linuxmusl-arm64@0.33.5':
resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -2666,6 +2803,13 @@ packages:
os: [linux]
libc: [musl]
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
'@img/sharp-linuxmusl-x64@0.33.5':
resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -2680,6 +2824,13 @@ packages:
os: [linux]
libc: [musl]
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
'@img/sharp-wasm32@0.33.5':
resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -2690,12 +2841,23 @@ packages:
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [wasm32]
+ '@img/sharp-wasm32@0.34.5':
+ resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
+
'@img/sharp-win32-arm64@0.34.4':
resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [win32]
+ '@img/sharp-win32-arm64@0.34.5':
+ resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [win32]
+
'@img/sharp-win32-ia32@0.33.5':
resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -2708,6 +2870,12 @@ packages:
cpu: [ia32]
os: [win32]
+ '@img/sharp-win32-ia32@0.34.5':
+ resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
+
'@img/sharp-win32-x64@0.33.5':
resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -2720,6 +2888,12 @@ packages:
cpu: [x64]
os: [win32]
+ '@img/sharp-win32-x64@0.34.5':
+ resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
+
'@inquirer/ansi@1.0.2':
resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==}
engines: {node: '>=18'}
@@ -5348,6 +5522,9 @@ packages:
resolution: {integrity: sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==}
engines: {node: '>=14.16'}
+ cleye@2.3.0:
+ resolution: {integrity: sha512-hnROLVsAA8JQo8W65/khA90gPvZ0ymuZqWwQcBpHrrmpIDD2CLvB7HdqAeA0Odxf7RpJLS5Zor0ujlPOXx4IBQ==}
+
cli-boxes@3.0.0:
resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
engines: {node: '>=10'}
@@ -6855,6 +7032,9 @@ packages:
engines: {node: '>=18'}
hasBin: true
+ ico-endec@0.1.6:
+ resolution: {integrity: sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ==}
+
iconv-lite@0.4.24:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
@@ -9402,6 +9582,10 @@ packages:
resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ sharp@0.34.5:
+ resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
shebang-command@1.2.0:
resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==}
engines: {node: '>=0.10.0'}
@@ -9834,6 +10018,9 @@ packages:
resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==}
engines: {node: '>=8'}
+ terminal-columns@2.0.0:
+ resolution: {integrity: sha512-6IByuUjyNZJXUtwDNm+OIe62zgwwaRbH+WMNTcx05O2G5V9WhvluAAHJY8OvUdwmzMPpqAD/7EUpGdI6ae1aiQ==}
+
terser@5.42.0:
resolution: {integrity: sha512-UYCvU9YQW2f/Vwl+P0GfhxJxbUGLwd+5QrrGgLajzWAtC/23AX0vcise32kkP7Eu0Wu9VlzzHAXkLObgjQfFlQ==}
engines: {node: '>=10'}
@@ -10095,6 +10282,9 @@ packages:
resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==}
engines: {node: '>=16'}
+ type-flag@4.1.0:
+ resolution: {integrity: sha512-I/K5a1jUhdFgzM3L7413akxQRzUYq4sCbef6bMAe6SrIvIdFxGZFJys5M1SiY0d0VrAjZjY4LQzppuTaLHMvSQ==}
+
type-is@1.6.18:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
engines: {node: '>= 0.6'}
@@ -12104,7 +12294,7 @@ snapshots:
'@commitlint/is-ignored@19.8.1':
dependencies:
'@commitlint/types': 19.8.1
- semver: 7.7.3
+ semver: 7.7.4
'@commitlint/lint@19.8.1':
dependencies:
@@ -12722,8 +12912,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@img/colour@1.0.0':
- optional: true
+ '@img/colour@1.0.0': {}
'@img/sharp-darwin-arm64@0.33.5':
optionalDependencies:
@@ -12735,6 +12924,11 @@ snapshots:
'@img/sharp-libvips-darwin-arm64': 1.2.3
optional: true
+ '@img/sharp-darwin-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ optional: true
+
'@img/sharp-darwin-x64@0.33.5':
optionalDependencies:
'@img/sharp-libvips-darwin-x64': 1.0.4
@@ -12745,57 +12939,92 @@ snapshots:
'@img/sharp-libvips-darwin-x64': 1.2.3
optional: true
+ '@img/sharp-darwin-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ optional: true
+
'@img/sharp-libvips-darwin-arm64@1.0.4':
optional: true
'@img/sharp-libvips-darwin-arm64@1.2.3':
optional: true
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ optional: true
+
'@img/sharp-libvips-darwin-x64@1.0.4':
optional: true
'@img/sharp-libvips-darwin-x64@1.2.3':
optional: true
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ optional: true
+
'@img/sharp-libvips-linux-arm64@1.0.4':
optional: true
'@img/sharp-libvips-linux-arm64@1.2.3':
optional: true
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ optional: true
+
'@img/sharp-libvips-linux-arm@1.0.5':
optional: true
'@img/sharp-libvips-linux-arm@1.2.3':
optional: true
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ optional: true
+
'@img/sharp-libvips-linux-ppc64@1.2.3':
optional: true
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ optional: true
+
'@img/sharp-libvips-linux-s390x@1.0.4':
optional: true
'@img/sharp-libvips-linux-s390x@1.2.3':
optional: true
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ optional: true
+
'@img/sharp-libvips-linux-x64@1.0.4':
optional: true
'@img/sharp-libvips-linux-x64@1.2.3':
optional: true
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ optional: true
+
'@img/sharp-libvips-linuxmusl-arm64@1.0.4':
optional: true
'@img/sharp-libvips-linuxmusl-arm64@1.2.3':
optional: true
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ optional: true
+
'@img/sharp-libvips-linuxmusl-x64@1.0.4':
optional: true
'@img/sharp-libvips-linuxmusl-x64@1.2.3':
optional: true
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ optional: true
+
'@img/sharp-linux-arm64@0.33.5':
optionalDependencies:
'@img/sharp-libvips-linux-arm64': 1.0.4
@@ -12806,6 +13035,11 @@ snapshots:
'@img/sharp-libvips-linux-arm64': 1.2.3
optional: true
+ '@img/sharp-linux-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ optional: true
+
'@img/sharp-linux-arm@0.33.5':
optionalDependencies:
'@img/sharp-libvips-linux-arm': 1.0.5
@@ -12816,11 +13050,26 @@ snapshots:
'@img/sharp-libvips-linux-arm': 1.2.3
optional: true
+ '@img/sharp-linux-arm@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ optional: true
+
'@img/sharp-linux-ppc64@0.34.4':
optionalDependencies:
'@img/sharp-libvips-linux-ppc64': 1.2.3
optional: true
+ '@img/sharp-linux-ppc64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ optional: true
+
'@img/sharp-linux-s390x@0.33.5':
optionalDependencies:
'@img/sharp-libvips-linux-s390x': 1.0.4
@@ -12831,6 +13080,11 @@ snapshots:
'@img/sharp-libvips-linux-s390x': 1.2.3
optional: true
+ '@img/sharp-linux-s390x@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ optional: true
+
'@img/sharp-linux-x64@0.33.5':
optionalDependencies:
'@img/sharp-libvips-linux-x64': 1.0.4
@@ -12841,6 +13095,11 @@ snapshots:
'@img/sharp-libvips-linux-x64': 1.2.3
optional: true
+ '@img/sharp-linux-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ optional: true
+
'@img/sharp-linuxmusl-arm64@0.33.5':
optionalDependencies:
'@img/sharp-libvips-linuxmusl-arm64': 1.0.4
@@ -12851,6 +13110,11 @@ snapshots:
'@img/sharp-libvips-linuxmusl-arm64': 1.2.3
optional: true
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ optional: true
+
'@img/sharp-linuxmusl-x64@0.33.5':
optionalDependencies:
'@img/sharp-libvips-linuxmusl-x64': 1.0.4
@@ -12861,6 +13125,11 @@ snapshots:
'@img/sharp-libvips-linuxmusl-x64': 1.2.3
optional: true
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ optional: true
+
'@img/sharp-wasm32@0.33.5':
dependencies:
'@emnapi/runtime': 1.7.1
@@ -12871,21 +13140,35 @@ snapshots:
'@emnapi/runtime': 1.7.1
optional: true
+ '@img/sharp-wasm32@0.34.5':
+ dependencies:
+ '@emnapi/runtime': 1.7.1
+ optional: true
+
'@img/sharp-win32-arm64@0.34.4':
optional: true
+ '@img/sharp-win32-arm64@0.34.5':
+ optional: true
+
'@img/sharp-win32-ia32@0.33.5':
optional: true
'@img/sharp-win32-ia32@0.34.4':
optional: true
+ '@img/sharp-win32-ia32@0.34.5':
+ optional: true
+
'@img/sharp-win32-x64@0.33.5':
optional: true
'@img/sharp-win32-x64@0.34.4':
optional: true
+ '@img/sharp-win32-x64@0.34.5':
+ optional: true
+
'@inquirer/ansi@1.0.2': {}
'@inquirer/checkbox@4.3.2(@types/node@24.10.13)':
@@ -14495,7 +14778,7 @@ snapshots:
fast-glob: 3.3.3
is-glob: 4.0.3
minimatch: 9.0.5
- semver: 7.7.3
+ semver: 7.7.4
ts-api-utils: 2.1.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
@@ -15828,6 +16111,11 @@ snapshots:
dependencies:
escape-string-regexp: 5.0.0
+ cleye@2.3.0:
+ dependencies:
+ terminal-columns: 2.0.0
+ type-flag: 4.1.0
+
cli-boxes@3.0.0: {}
cli-cursor@3.1.0:
@@ -17758,6 +18046,8 @@ snapshots:
husky@9.1.7: {}
+ ico-endec@0.1.6: {}
+
iconv-lite@0.4.24:
dependencies:
safer-buffer: 2.1.2
@@ -20797,6 +21087,37 @@ snapshots:
'@img/sharp-win32-x64': 0.34.4
optional: true
+ sharp@0.34.5:
+ dependencies:
+ '@img/colour': 1.0.0
+ detect-libc: 2.1.2
+ semver: 7.7.4
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.34.5
+ '@img/sharp-darwin-x64': 0.34.5
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ '@img/sharp-linux-arm': 0.34.5
+ '@img/sharp-linux-arm64': 0.34.5
+ '@img/sharp-linux-ppc64': 0.34.5
+ '@img/sharp-linux-riscv64': 0.34.5
+ '@img/sharp-linux-s390x': 0.34.5
+ '@img/sharp-linux-x64': 0.34.5
+ '@img/sharp-linuxmusl-arm64': 0.34.5
+ '@img/sharp-linuxmusl-x64': 0.34.5
+ '@img/sharp-wasm32': 0.34.5
+ '@img/sharp-win32-arm64': 0.34.5
+ '@img/sharp-win32-ia32': 0.34.5
+ '@img/sharp-win32-x64': 0.34.5
+
shebang-command@1.2.0:
dependencies:
shebang-regex: 1.0.0
@@ -21298,6 +21619,8 @@ snapshots:
term-size@2.2.1: {}
+ terminal-columns@2.0.0: {}
+
terser@5.42.0:
dependencies:
'@jridgewell/source-map': 0.3.6
@@ -21506,6 +21829,8 @@ snapshots:
type-fest@4.41.0: {}
+ type-flag@4.1.0: {}
+
type-is@1.6.18:
dependencies:
media-typer: 0.3.0
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index f74a9fe3..8151a7ae 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -24,11 +24,13 @@ catalog:
'@types/vfile': ^4.0.0
'@types/yargs': ^17.0.35
astro: 5.9.3
+ cleye: ^2.3.0
deepmerge: ^4.3.1
es-toolkit: 1.43.0
handlebars: 4.7.8
handlebars-helpers: ^0.10.0
happy-dom: ^20.6.1
+ ico-endec: ^0.1.6
json-schema-to-typescript: ^15.0.4
jsr: ^0.13.5
mdast: ^3.0.0
@@ -38,6 +40,7 @@ catalog:
prettier-plugin-tailwindcss: ^0.7.2
react: 19.2.0
remark: ^15.0.1
+ sharp: ^0.34.5
tailwind-scrollbar: ^4.0.2
tailwindcss: ^4.1.18
tsdown: 0.15.12