From d45c2b3938fb8c58e3a1f58b907cda96720a6f07 Mon Sep 17 00:00:00 2001 From: Rachelle Date: Tue, 17 Mar 2026 11:27:21 +1100 Subject: [PATCH 1/3] pwa --- app/layout.tsx | 6 + components/PwaMetaTags.tsx | 27 ++ components/ServiceWorkerRegistrar.tsx | 11 + package.json | 5 +- pnpm-lock.yaml | 546 +++++++++++++++++++++++++- public/learn/icon-192x192.png | Bin 0 -> 2198 bytes public/learn/icon-512x512.png | Bin 0 -> 7221 bytes public/learn/site.webmanifest | 15 + public/sw.js | 61 +++ scripts/generate-icons.ts | 42 ++ 10 files changed, 708 insertions(+), 5 deletions(-) create mode 100644 components/PwaMetaTags.tsx create mode 100644 components/ServiceWorkerRegistrar.tsx create mode 100644 public/learn/icon-192x192.png create mode 100644 public/learn/icon-512x512.png create mode 100644 public/learn/site.webmanifest create mode 100644 public/sw.js create mode 100644 scripts/generate-icons.ts diff --git a/app/layout.tsx b/app/layout.tsx index 43bf355..57d4d60 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -2,6 +2,8 @@ import type { Metadata } from 'next' import Script from 'next/script' import { Inter } from 'next/font/google' import { LaunchGate } from '@/components/LaunchGate' +import { ServiceWorkerRegistrar } from '@/components/ServiceWorkerRegistrar' +import { PwaMetaTags } from '@/components/PwaMetaTags' import './globals.css' const inter = Inter({ @@ -20,6 +22,8 @@ export const metadata: Metadata = { { url: '/learn/favicon.ico', sizes: 'any' }, { url: '/learn/favicon.svg', type: 'image/svg+xml' }, { url: '/learn/favicon-96x96.png', sizes: '96x96', type: 'image/png' }, + { url: '/learn/icon-192x192.png', sizes: '192x192', type: 'image/png' }, + { url: '/learn/icon-512x512.png', sizes: '512x512', type: 'image/png' }, ], apple: [{ url: '/learn/apple-touch-icon.png' }], }, @@ -52,6 +56,8 @@ export default function RootLayout({ children }: Readonly<{ children: React.Reac return ( + + {children} {process.env.NODE_ENV === 'production' && ( <> diff --git a/components/PwaMetaTags.tsx b/components/PwaMetaTags.tsx new file mode 100644 index 0000000..5a7ebc7 --- /dev/null +++ b/components/PwaMetaTags.tsx @@ -0,0 +1,27 @@ +'use client' + +import { useEffect } from 'react' + +/** + * Injects iOS PWA meta tags. Next.js Metadata API does not output + * apple-mobile-web-app-capable in a way that enables Safari splash screens, + * so we inject these on the client. + */ +export function PwaMetaTags() { + useEffect(() => { + const tags: [string, Record][] = [ + ['meta', { name: 'apple-mobile-web-app-capable', content: 'yes' }], + ['meta', { name: 'apple-mobile-web-app-status-bar-style', content: 'default' }], + ['meta', { name: 'apple-mobile-web-app-title', content: 'Learn' }], + ] + const elements: HTMLElement[] = [] + tags.forEach(([tagName, attrs]) => { + const el = document.createElement(tagName) + Object.entries(attrs).forEach(([k, v]) => el.setAttribute(k, v)) + document.head.appendChild(el) + elements.push(el) + }) + return () => elements.forEach((el) => el.remove()) + }, []) + return null +} diff --git a/components/ServiceWorkerRegistrar.tsx b/components/ServiceWorkerRegistrar.tsx new file mode 100644 index 0000000..31bc82f --- /dev/null +++ b/components/ServiceWorkerRegistrar.tsx @@ -0,0 +1,11 @@ +'use client' + +import { useEffect } from 'react' + +export function ServiceWorkerRegistrar() { + useEffect(() => { + if (typeof window === 'undefined' || !('serviceWorker' in navigator)) return + navigator.serviceWorker.register('/sw.js').catch(() => {}) + }, []) + return null +} diff --git a/package.json b/package.json index 90ef782..d6aa624 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "format": "prettier --write \"**/*.{ts,tsx,css,json,md,mdx}\"", "format:check": "prettier --check \"**/*.{ts,tsx,css,json,md,mdx}\"", "typecheck": "tsc --noEmit", - "prepare": "husky" + "prepare": "husky", + "generate-icons": "tsx scripts/generate-icons.ts" }, "dependencies": { "@mdx-js/loader": "^3.0.1", @@ -56,7 +57,9 @@ "postcss": "^8.4.49", "prettier": "^3.4.2", "prettier-plugin-tailwindcss": "^0.6.9", + "sharp": "^0.33.5", "tailwindcss": "^3.4.16", + "tsx": "^4.21.0", "typescript": "~5.6.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1bc53b0..9233985 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -90,9 +90,15 @@ importers: prettier-plugin-tailwindcss: specifier: ^0.6.9 version: 0.6.14(prettier@3.8.1) + sharp: + specifier: ^0.33.5 + version: 0.33.5 tailwindcss: specifier: ^3.4.16 - version: 3.4.19(yaml@2.8.2) + version: 3.4.19(tsx@4.21.0)(yaml@2.8.2) + tsx: + specifier: ^4.21.0 + version: 4.21.0 typescript: specifier: ~5.6.3 version: 5.6.3 @@ -120,6 +126,162 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@esbuild/aix-ppc64@0.27.4': + resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.4': + resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.4': + resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.4': + resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.4': + resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.4': + resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.4': + resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.4': + resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.4': + resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.4': + resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.4': + resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.4': + resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.4': + resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.4': + resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.4': + resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.4': + resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.4': + resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.4': + resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.4': + resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.4': + resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.4': + resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.4': + resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.4': + resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.4': + resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.4': + resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.4': + resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -155,34 +317,68 @@ packages: resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + 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} + 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] + 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] + 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] + 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] + os: [linux] + libc: [glibc] + '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] @@ -201,30 +397,61 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + 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] + 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] + 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] + 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} + cpu: [arm64] + 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} @@ -232,6 +459,13 @@ packages: 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} + cpu: [arm] + 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} @@ -253,6 +487,13 @@ packages: 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} + cpu: [s390x] + 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} @@ -260,6 +501,13 @@ packages: 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} + cpu: [x64] + 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} @@ -267,6 +515,13 @@ packages: 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} + cpu: [arm64] + 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} @@ -274,6 +529,13 @@ packages: 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} + cpu: [x64] + 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} @@ -281,6 +543,11 @@ packages: 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} + cpu: [wasm32] + '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -292,12 +559,24 @@ packages: 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} + 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} + 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} @@ -867,6 +1146,13 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -1033,6 +1319,11 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild@0.27.4: + resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1428,6 +1719,9 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -2309,6 +2603,10 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + 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} @@ -2347,6 +2645,9 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + slice-ansi@7.1.2: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} @@ -2520,6 +2821,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -2679,6 +2985,84 @@ snapshots: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.27.4': + optional: true + + '@esbuild/android-arm64@0.27.4': + optional: true + + '@esbuild/android-arm@0.27.4': + optional: true + + '@esbuild/android-x64@0.27.4': + optional: true + + '@esbuild/darwin-arm64@0.27.4': + optional: true + + '@esbuild/darwin-x64@0.27.4': + optional: true + + '@esbuild/freebsd-arm64@0.27.4': + optional: true + + '@esbuild/freebsd-x64@0.27.4': + optional: true + + '@esbuild/linux-arm64@0.27.4': + optional: true + + '@esbuild/linux-arm@0.27.4': + optional: true + + '@esbuild/linux-ia32@0.27.4': + optional: true + + '@esbuild/linux-loong64@0.27.4': + optional: true + + '@esbuild/linux-mips64el@0.27.4': + optional: true + + '@esbuild/linux-ppc64@0.27.4': + optional: true + + '@esbuild/linux-riscv64@0.27.4': + optional: true + + '@esbuild/linux-s390x@0.27.4': + optional: true + + '@esbuild/linux-x64@0.27.4': + optional: true + + '@esbuild/netbsd-arm64@0.27.4': + optional: true + + '@esbuild/netbsd-x64@0.27.4': + optional: true + + '@esbuild/openbsd-arm64@0.27.4': + optional: true + + '@esbuild/openbsd-x64@0.27.4': + optional: true + + '@esbuild/openharmony-arm64@0.27.4': + optional: true + + '@esbuild/sunos-x64@0.27.4': + optional: true + + '@esbuild/win32-arm64@0.27.4': + optional: true + + '@esbuild/win32-ia32@0.27.4': + optional: true + + '@esbuild/win32-x64@0.27.4': + optional: true + '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -2717,25 +3101,47 @@ snapshots: '@img/colour@1.0.0': optional: true + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + 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 + 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.4': optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': + 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.4': optional: true + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + '@img/sharp-libvips-linux-arm@1.2.4': optional: true @@ -2745,23 +3151,45 @@ snapshots: '@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.4': optional: true + '@img/sharp-libvips-linux-x64@1.0.4': + 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.4': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + 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 + 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 + optional: true + '@img/sharp-linux-arm@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.2.4 @@ -2777,26 +3205,51 @@ snapshots: '@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 + 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 + 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 + 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 + 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.8.1 + optional: true + '@img/sharp-wasm32@0.34.5': dependencies: '@emnapi/runtime': 1.8.1 @@ -2805,9 +3258,15 @@ snapshots: '@img/sharp-win32-arm64@0.34.5': optional: true + '@img/sharp-win32-ia32@0.33.5': + 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.5': optional: true @@ -3383,6 +3842,16 @@ snapshots: color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + colorette@2.0.20: {} comma-separated-tokens@2.0.3: {} @@ -3608,6 +4077,35 @@ snapshots: esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 + esbuild@0.27.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.4 + '@esbuild/android-arm': 0.27.4 + '@esbuild/android-arm64': 0.27.4 + '@esbuild/android-x64': 0.27.4 + '@esbuild/darwin-arm64': 0.27.4 + '@esbuild/darwin-x64': 0.27.4 + '@esbuild/freebsd-arm64': 0.27.4 + '@esbuild/freebsd-x64': 0.27.4 + '@esbuild/linux-arm': 0.27.4 + '@esbuild/linux-arm64': 0.27.4 + '@esbuild/linux-ia32': 0.27.4 + '@esbuild/linux-loong64': 0.27.4 + '@esbuild/linux-mips64el': 0.27.4 + '@esbuild/linux-ppc64': 0.27.4 + '@esbuild/linux-riscv64': 0.27.4 + '@esbuild/linux-s390x': 0.27.4 + '@esbuild/linux-x64': 0.27.4 + '@esbuild/netbsd-arm64': 0.27.4 + '@esbuild/netbsd-x64': 0.27.4 + '@esbuild/openbsd-arm64': 0.27.4 + '@esbuild/openbsd-x64': 0.27.4 + '@esbuild/openharmony-arm64': 0.27.4 + '@esbuild/sunos-x64': 0.27.4 + '@esbuild/win32-arm64': 0.27.4 + '@esbuild/win32-ia32': 0.27.4 + '@esbuild/win32-x64': 0.27.4 + escalade@3.2.0: {} escape-string-regexp@4.0.0: {} @@ -4125,6 +4623,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-arrayish@0.3.4: {} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -5000,12 +5500,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.6 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.2): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.2): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 postcss: 8.5.6 + tsx: 4.21.0 yaml: 2.8.2 postcss-nested@6.2.0(postcss@8.5.6): @@ -5287,6 +5788,32 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.1.2 + semver: 7.7.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + sharp@0.34.5: dependencies: '@img/colour': 1.0.0 @@ -5363,6 +5890,10 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 + simple-swizzle@0.2.4: + dependencies: + is-arrayish: 0.3.4 + slice-ansi@7.1.2: dependencies: ansi-styles: 6.2.3 @@ -5500,7 +6031,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - tailwindcss@3.4.19(yaml@2.8.2): + tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.2): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -5519,7 +6050,7 @@ snapshots: postcss: 8.5.6 postcss-import: 15.1.0(postcss@8.5.6) postcss-js: 4.1.0(postcss@8.5.6) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.2) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.2) postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.11 @@ -5581,6 +6112,13 @@ snapshots: tslib@2.8.1: {} + tsx@4.21.0: + dependencies: + esbuild: 0.27.4 + get-tsconfig: 4.13.6 + optionalDependencies: + fsevents: 2.3.3 + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 diff --git a/public/learn/icon-192x192.png b/public/learn/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..fcec66c5536cc5556c27bdd1a55cc0b5b4cba684 GIT binary patch literal 2198 zcmcImX;f3!7Csq-fXEAi&w?1D^huR6XiJGe2v%e$53nLA5+IUADH;t(AW9Mv#3hqB zGALl8v|>R95zuG^^7;@|7D*+P2r)zo8bJm%gdt>T5?uY~ulM@n+_UaE-`?N1zq{Ak zH-C3n;3{)Fa{$1q;2{4!`kilB2owEt&kK^Neltr6icSMyrL|!}KzZe703d>b{dep= zUO6QlZ;Xvx-<7I$?ZyPGvRh3|DIg{w1jMiJvg*%lD}EA?(6bl027ci{UCXqd#`*Ii^qR)^WD z04ox<5j?hq_z4i;SO7Tx6_izJ1;)+*bP^nFcl=+jCSlyAT8--MOleYv{LzvLXQ$w_ z+vE|C#=sdb%!0j&;J}wn$46B(F%MQX%e>S+TA3g>>Ok+|7K|<3l7VKGLOQvN-XS?c z;?Rnlg2QyKv@!tx@_GR9cEF?PDA8T~{SM{Fqtv@?FExrB;VTc_Vp5N&1Hlg{0tubb z)HnA}DLJuq+c;K`3Lzx)l2T(OSi8jkBbI>pRHvhvFzoeSd=2j}3fYW~Bn z(M-i>dgu^DJ$j*J$Lpqa#!{99-2v*dKK_NFQ1@|$g}*mD^? zrxc;bPlB@yeXS2H2-_~WYIb|-8J-r$)$*40mFcag?$jURe4Dk)=|W-0r#3Ax6p10{ z6gt#lWyOR8)u;73Mg2}xm^sn@gTh{4el#>sh*dYk9&z#mi~D_EdyqMz|7b1+cupYw zo^E8>!nmr4m5(?l=pj;Uwq#)1SaqUjGHS9su&+Bdl-5@F+j5>&dz~(}*1&)lbK{lTuE^E|~RX=E{7KVyUaRZXdS-YC2P z(m8mK;zLn1y`628KWH3S3^PVDx^-i`kRm2C zFS4qSXzZ%>Cby?&Ka^D7bnsQ7r94-c_#Fj|lYdG8=KLoNh N!Mnoz8@?r+{1f2v!$SZ7 literal 0 HcmV?d00001 diff --git a/public/learn/icon-512x512.png b/public/learn/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..f3142a4917d3a3687b970fff35880f93f5983438 GIT binary patch literal 7221 zcmeHMX;@R&x?VvPqcSK~1%%Y&QEE{UDIx|ETC7w>sMQt`C2|k~GAd;fNaAUQS_HIK z<^W28DgtU4M21AMU}Xph62g#xC|ENxB|wIK7bOAC-~05r_x$J&p789w*SFsFe(!p} zZ|!~MOJ_&z6^1JS0NMw?*#8v(8t`8YuzVT(nTYJ1fj{VwFWf=_SgAkzhXNT{8vrmG zIk^ARqjf7lHJ-wxxtM}{aUHZ^(Eq@o0JxqE0Oh$O z0QPS-|DQdEM*oF4u3h^pSMa}uW^d(;bQTQ1AF4P$_|!beL~(KSK%u;)p&be27ay)G z+ch)!ub`Kj;MLR<>xw<)S-%OIT8?TllSwU+wT{9Q0q1O(ijk7`()FP?wt`;|96_~Z z7bW-ap0OITY9#qO(8`ML3@-|RaRd}kJ*tUj^N9Svx5TRpvj!> zy)$7$5gw5bZxfKEV2K_$p4R{#P5wJDk6=BVVTrH3b4Q?#WC8Zj%R2Aboss*e_V>F6 z2A{)fP+nT1?5)nNqDZpHzg}lp6h}*AXkp_Qj`gkvKWC%C-J|}%HgY_vz4WwCs&PeI zXQU>`Cu&g6bsB=|b(zEObbHXdQW}MKi4uDB!Yx77@H5u~bdrHFVrrC;pI`7|Gx*3( zAEFxuQ!SgrHLea8Sn?Fs3s-%acXG<~&-j|-zGm^sQZ;5f5JZ3GOxZ-8OrP;Vs@01Z zpzeEtmEy zKBV*#b+n8)4RNo4+zBV}W#S!8`{-GLw3m*oEsknDWhv!rk`(K~egq~o?JFREvjU5n z5hpT(f(kCEA#4K`K_`Q{jQ1+7s2S0vMbQg{I&A|zp?(ka&sZ6sZ;PRM`S&k^a1JGY zM@`5hbZncJv`;dX5y@&4OYO0D!=G*n*SMEbNUEcyzf>_~Q4V~WiNtR7eM4vY^EjWV zePjhUR*k~~cwF>h3ERsblm-e&k(>!-peh+@|ANf&kTa$X<%v+nDcb0?U-P2rmN8uD zwAcxMciK1(PhCie#VgQV=UrtZuN}`La8LG=>yvzbR3)x?^R7{X5r6@VGYe5xh7eLwO08?cZ70BMFYZY3_xOOTf7i9yu6aIEhB{risx7Mrja(xTvp(*u^9O)d|dv<&wc2UHo zj2$Dr==-JwSyAGV6cs<4kAZ-T=kK`rn=*|0NTX#7qCHRmQ*4c}ohc>dqAdS)9@&yb z$kzegzA~=~f861n^4AlKMpXb`$NoAwp064C%AwMUydc4|D=Cr~sU{Y6(vcie$FA!B zWuJ<=-OCuIn1}kgVS?Xn7VXdm2w)r8%hX=xnWlE2=Y|0P*tho`i{umtylqth9xh`% z?fWXUySjm{^qL;699tx+d(h;z~X0B7Zt*#8`+ z%Io}u^tMZC${-OTM{>GYwaZZU2koINxvipnBYRf2iTSdmz($x%Knx4sv}5C`3W7&a z#tr4`No&^?;E)FN_U3aSM*97Z@91$x&Y8o`lsy3{%jyu}ogDh;^(GCj3{gNN*r^O0JXU>f#cbI~q`8+=O~Z{qEw!?C|pDu|~ONfB+UqW0KUmSOuO z6HqD!%fVd>9x7z4agWeso6(s3z0i-Z>B}sOd}qqr`~sUn z7akYg7S}vLLol)9ysh9PG>mi90i25M6Jt?zEuD*asT z)GC55UPgZQX|SE$Ce?(8L0R%m;~6<0|Gp36X&PX?�t-qe@P>CPPRCO!Jm!2ddpz zaZPO_eDXyZJw=t3&NZM|GWrlsoP3cdDkrwA7EyyM=({teht*H4h34iR&q0gd#0JOQ z?cZKK_MA;k(*r+i&h{kRASKYj3VeErE&9@(t^8I^RT_IV2JYs?BihpVk*){&xwUZu zt+9JSN1&Yl9JmAY9HmKyYc??p)~95Y2S4PJQse`DgWRU@ele#GHyckM4D>Oz>G}goqwuRrkCq-QKa5q4dFfH`<(j!p zXv0utKNXvjnWvN8PX%7`uixAw_f;ObqTpTT9AZhbDvOC#@CIj@CN6H3}iS1bsGFZS$0iCHx&rnkW?c_GLyvZa1b5v zB_g_Psr0Z42Xr0QgidTwbx7|!ksHeuzegVa456PPawHmQT@QbKXn zeqz>40;ajanG&qzLN^f2Na~=iq38BeC#-lM_4Lu|mFsH!ANVCH2d1znxK$l3Cv3($ zWP4=XEh?$Oekuq@oXQ!*J74tflop>pRQ4!#fQ=MNMfJz#R_L_?8XMk7xh;|&b+(TR zxHhCI^baEHV{$tzRkJ(9;xh2HBQakOlumcLBvtAUuynPtGJ08&Uy@9$taVf+bqEzA!Ox0l z5TjkKKfpz}Vj2?RQMZqvHZj}o=&BTZ!7fZe zi$kJH@ZM=uKu|JbXrTk1@go>Qt*#Twei?LCryU>(f7XHaiP)L4K6}HkL;h*pClggl z|DyHQ>gBJbbd?HCAY=nFeII!%*-S8YD}&Ba?K{|j!HVN4W|3Jp&B$N0a`wJ0oprvq zfkn~Z<;~eg!`daev8MuM-90BwZd6xa;EY z9lk+EeCY|8nJfw375Q{NlR6Y5<_0CP`j6(~q8ZDLq!L$ z>U5jH1!3jd-wKYQU5Cmmu~YFl-Ts%{`ox6?cpN)!K))^Ya%1<@%*{GI2={hxp;$W> z_CdoOWwB~+I6=#gAXv$rp&0uf5=yJ6PlAb~@wV>6sTuX0S6sT4%79j(LWT?Dkz+IZ z_+B~{K>djcr(q}d9=74CSZ9~dlBH9lf2PXMdFI^TFvcO9h~cnhv$M_W=Pa6Hfje$355MCUYH$4DLdz8e?3C2g zpebE>coQY_{Rk)b*(nU)?Uqv0&&iC3iDz0C_X zxC{73XaunD+v*!hh0{Xl2weGy=YqF9gfldz1{%eVCL!ax>;OdK^gWRqXA%Ty=?l6*HJ6BgZXN z8$Cb|ZOn&l$cC|iDZy7XpYP`rp^Xw_3+0myJ}*YJMv^S&^ScRnjQ8aYk?kkXr=(^M z|B~FwnEU`dn}Dwo;H^-BYdjad>sizoXLNx{O@@Du)+B!;$$}s%JiYf5NqL}3(#t8V z=yxf80?qCRVO2I`u|o^R3*M?0CuC-Bqehn+N6d@V0q{Ld8BHB*bVw`FI+1jQprU&d z;JlM06v7j9edytqjEJjbyT!Ns$yTsOw9c_p&MP1ebkpGOb5rn-b!?fHSbI zOuK6J2S%gUInv|kF5udrA*^qkfP~+K`8C><@quG=!=f;ep}L%!ydE~PStlcLF@wW9 zr#_=%QNk*p@WpIox<|vK^>qGBxJH&Dot-{k_w+!ppkgJj2Q416toAv#Xwfz0H}D=T zXG&%r&V6AkX$%MyGq?7IYiu{SYC)6tRkKuWkprly6=mPgzcXkX&f+g7wKAgf$#~0a z$y=W;rg!{~tE6Jik7}WGV|DvJ>BXX;)UD&`5t7B2IW|Zen}ZIKeocd?;Cap^tr<&( zGZM|4h0c^xq?DbtXf4sAu9ZGRCl$&lzqo}iNRz?APJ0HfmdGJS3;c!X6=fxc89%7ZD_^fNOd-23b>dG_O!{s%iX<;h&jWB?;ryB zn%$41s@$YPcJ?A%GGPsq30tP>k}SodY~6nf+v#N3BwVHE{Kxg(l`)}xJjql2$=GZ2 zy1i-hhj~Lk8lEG0X^Uc;Njnuoe9aR*uRdvveN@MrC+ZvF-MmKj>{)ek!O@pfZem~O zPWv==4brt9y*d0Jw-lk=$zH8m=hA>vf4(we)~=bS3CWUGc}8f+ryd68A { + self.skipWaiting() +}) + +self.addEventListener('activate', (event) => { + event.waitUntil( + caches.keys().then((keys) => { + return Promise.all( + keys + .filter((key) => key.startsWith('learn-') && key !== STATIC_CACHE) + .map((key) => caches.delete(key)) + ) + }) + ) + self.clients.claim() +}) + +self.addEventListener('fetch', (event) => { + if (event.request.mode !== 'navigate' && !isStaticAsset(event.request.url)) { + return + } + + if (event.request.mode === 'navigate') { + event.respondWith( + fetch(event.request) + .then((res) => res) + .catch(() => caches.match('/')) + ) + return + } + + event.respondWith( + caches.open(STATIC_CACHE).then((cache) => { + return cache.match(event.request).then((cached) => { + if (cached) return cached + return fetch(event.request).then((res) => { + if (res.ok) cache.put(event.request, res.clone()) + return res + }) + }) + }) + ) +}) diff --git a/scripts/generate-icons.ts b/scripts/generate-icons.ts new file mode 100644 index 0000000..0ee1987 --- /dev/null +++ b/scripts/generate-icons.ts @@ -0,0 +1,42 @@ +/** + * Generates PWA placeholder icons (192x192, 512x512) from an inline SVG. + * Run: pnpm run generate-icons + * When swapping in the final Mirza logo, replace the SVG below or point to an asset path + * and re-run. For maskable icons with the real logo, you may need a dedicated variant + * with extra padding so the inner 80% safe zone contains the logo. + */ + +import sharp from 'sharp' +import { writeFile, mkdir } from 'node:fs/promises' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dirname = dirname(fileURLToPath(import.meta.url)) +const outDir = join(__dirname, '..', 'public', 'learn') + +const THEME_COLOR = '#7C3AED' + +const svgTemplate = (size: number) => + ` + + + M + +`.trim() + +async function main() { + await mkdir(outDir, { recursive: true }) + + for (const size of [192, 512]) { + const svg = Buffer.from(svgTemplate(size)) + const png = await sharp(svg).png().toBuffer() + const path = join(outDir, `icon-${size}x${size}.png`) + await writeFile(path, png) + console.log(`Wrote ${path}`) + } +} + +main().catch((err) => { + console.error(err) + process.exit(1) +}) From 576a22f7ace5a228cdd4b9f166ebd85e39acbe6a Mon Sep 17 00:00:00 2001 From: Rachelle Date: Tue, 17 Mar 2026 12:26:47 +1100 Subject: [PATCH 2/3] pwa --- app/layout.tsx | 4 ++-- package.json | 5 +--- public/learn/icon-192x192.png | Bin 2198 -> 0 bytes public/learn/icon-512x512.png | Bin 7221 -> 0 bytes public/learn/site.webmanifest | 8 +++---- scripts/generate-icons.ts | 42 ---------------------------------- 6 files changed, 7 insertions(+), 52 deletions(-) delete mode 100644 public/learn/icon-192x192.png delete mode 100644 public/learn/icon-512x512.png delete mode 100644 scripts/generate-icons.ts diff --git a/app/layout.tsx b/app/layout.tsx index 57d4d60..5560ea8 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -22,8 +22,8 @@ export const metadata: Metadata = { { url: '/learn/favicon.ico', sizes: 'any' }, { url: '/learn/favicon.svg', type: 'image/svg+xml' }, { url: '/learn/favicon-96x96.png', sizes: '96x96', type: 'image/png' }, - { url: '/learn/icon-192x192.png', sizes: '192x192', type: 'image/png' }, - { url: '/learn/icon-512x512.png', sizes: '512x512', type: 'image/png' }, + { url: '/learn/favicon-192x192.png', sizes: '192x192', type: 'image/png' }, + { url: '/learn/favicon-512x512.png', sizes: '512x512', type: 'image/png' }, ], apple: [{ url: '/learn/apple-touch-icon.png' }], }, diff --git a/package.json b/package.json index d6aa624..90ef782 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,7 @@ "format": "prettier --write \"**/*.{ts,tsx,css,json,md,mdx}\"", "format:check": "prettier --check \"**/*.{ts,tsx,css,json,md,mdx}\"", "typecheck": "tsc --noEmit", - "prepare": "husky", - "generate-icons": "tsx scripts/generate-icons.ts" + "prepare": "husky" }, "dependencies": { "@mdx-js/loader": "^3.0.1", @@ -57,9 +56,7 @@ "postcss": "^8.4.49", "prettier": "^3.4.2", "prettier-plugin-tailwindcss": "^0.6.9", - "sharp": "^0.33.5", "tailwindcss": "^3.4.16", - "tsx": "^4.21.0", "typescript": "~5.6.3" } } diff --git a/public/learn/icon-192x192.png b/public/learn/icon-192x192.png deleted file mode 100644 index fcec66c5536cc5556c27bdd1a55cc0b5b4cba684..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2198 zcmcImX;f3!7Csq-fXEAi&w?1D^huR6XiJGe2v%e$53nLA5+IUADH;t(AW9Mv#3hqB zGALl8v|>R95zuG^^7;@|7D*+P2r)zo8bJm%gdt>T5?uY~ulM@n+_UaE-`?N1zq{Ak zH-C3n;3{)Fa{$1q;2{4!`kilB2owEt&kK^Neltr6icSMyrL|!}KzZe703d>b{dep= zUO6QlZ;Xvx-<7I$?ZyPGvRh3|DIg{w1jMiJvg*%lD}EA?(6bl027ci{UCXqd#`*Ii^qR)^WD z04ox<5j?hq_z4i;SO7Tx6_izJ1;)+*bP^nFcl=+jCSlyAT8--MOleYv{LzvLXQ$w_ z+vE|C#=sdb%!0j&;J}wn$46B(F%MQX%e>S+TA3g>>Ok+|7K|<3l7VKGLOQvN-XS?c z;?Rnlg2QyKv@!tx@_GR9cEF?PDA8T~{SM{Fqtv@?FExrB;VTc_Vp5N&1Hlg{0tubb z)HnA}DLJuq+c;K`3Lzx)l2T(OSi8jkBbI>pRHvhvFzoeSd=2j}3fYW~Bn z(M-i>dgu^DJ$j*J$Lpqa#!{99-2v*dKK_NFQ1@|$g}*mD^? zrxc;bPlB@yeXS2H2-_~WYIb|-8J-r$)$*40mFcag?$jURe4Dk)=|W-0r#3Ax6p10{ z6gt#lWyOR8)u;73Mg2}xm^sn@gTh{4el#>sh*dYk9&z#mi~D_EdyqMz|7b1+cupYw zo^E8>!nmr4m5(?l=pj;Uwq#)1SaqUjGHS9su&+Bdl-5@F+j5>&dz~(}*1&)lbK{lTuE^E|~RX=E{7KVyUaRZXdS-YC2P z(m8mK;zLn1y`628KWH3S3^PVDx^-i`kRm2C zFS4qSXzZ%>Cby?&Ka^D7bnsQ7r94-c_#Fj|lYdG8=KLoNh N!Mnoz8@?r+{1f2v!$SZ7 diff --git a/public/learn/icon-512x512.png b/public/learn/icon-512x512.png deleted file mode 100644 index f3142a4917d3a3687b970fff35880f93f5983438..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7221 zcmeHMX;@R&x?VvPqcSK~1%%Y&QEE{UDIx|ETC7w>sMQt`C2|k~GAd;fNaAUQS_HIK z<^W28DgtU4M21AMU}Xph62g#xC|ENxB|wIK7bOAC-~05r_x$J&p789w*SFsFe(!p} zZ|!~MOJ_&z6^1JS0NMw?*#8v(8t`8YuzVT(nTYJ1fj{VwFWf=_SgAkzhXNT{8vrmG zIk^ARqjf7lHJ-wxxtM}{aUHZ^(Eq@o0JxqE0Oh$O z0QPS-|DQdEM*oF4u3h^pSMa}uW^d(;bQTQ1AF4P$_|!beL~(KSK%u;)p&be27ay)G z+ch)!ub`Kj;MLR<>xw<)S-%OIT8?TllSwU+wT{9Q0q1O(ijk7`()FP?wt`;|96_~Z z7bW-ap0OITY9#qO(8`ML3@-|RaRd}kJ*tUj^N9Svx5TRpvj!> zy)$7$5gw5bZxfKEV2K_$p4R{#P5wJDk6=BVVTrH3b4Q?#WC8Zj%R2Aboss*e_V>F6 z2A{)fP+nT1?5)nNqDZpHzg}lp6h}*AXkp_Qj`gkvKWC%C-J|}%HgY_vz4WwCs&PeI zXQU>`Cu&g6bsB=|b(zEObbHXdQW}MKi4uDB!Yx77@H5u~bdrHFVrrC;pI`7|Gx*3( zAEFxuQ!SgrHLea8Sn?Fs3s-%acXG<~&-j|-zGm^sQZ;5f5JZ3GOxZ-8OrP;Vs@01Z zpzeEtmEy zKBV*#b+n8)4RNo4+zBV}W#S!8`{-GLw3m*oEsknDWhv!rk`(K~egq~o?JFREvjU5n z5hpT(f(kCEA#4K`K_`Q{jQ1+7s2S0vMbQg{I&A|zp?(ka&sZ6sZ;PRM`S&k^a1JGY zM@`5hbZncJv`;dX5y@&4OYO0D!=G*n*SMEbNUEcyzf>_~Q4V~WiNtR7eM4vY^EjWV zePjhUR*k~~cwF>h3ERsblm-e&k(>!-peh+@|ANf&kTa$X<%v+nDcb0?U-P2rmN8uD zwAcxMciK1(PhCie#VgQV=UrtZuN}`La8LG=>yvzbR3)x?^R7{X5r6@VGYe5xh7eLwO08?cZ70BMFYZY3_xOOTf7i9yu6aIEhB{risx7Mrja(xTvp(*u^9O)d|dv<&wc2UHo zj2$Dr==-JwSyAGV6cs<4kAZ-T=kK`rn=*|0NTX#7qCHRmQ*4c}ohc>dqAdS)9@&yb z$kzegzA~=~f861n^4AlKMpXb`$NoAwp064C%AwMUydc4|D=Cr~sU{Y6(vcie$FA!B zWuJ<=-OCuIn1}kgVS?Xn7VXdm2w)r8%hX=xnWlE2=Y|0P*tho`i{umtylqth9xh`% z?fWXUySjm{^qL;699tx+d(h;z~X0B7Zt*#8`+ z%Io}u^tMZC${-OTM{>GYwaZZU2koINxvipnBYRf2iTSdmz($x%Knx4sv}5C`3W7&a z#tr4`No&^?;E)FN_U3aSM*97Z@91$x&Y8o`lsy3{%jyu}ogDh;^(GCj3{gNN*r^O0JXU>f#cbI~q`8+=O~Z{qEw!?C|pDu|~ONfB+UqW0KUmSOuO z6HqD!%fVd>9x7z4agWeso6(s3z0i-Z>B}sOd}qqr`~sUn z7akYg7S}vLLol)9ysh9PG>mi90i25M6Jt?zEuD*asT z)GC55UPgZQX|SE$Ce?(8L0R%m;~6<0|Gp36X&PX?�t-qe@P>CPPRCO!Jm!2ddpz zaZPO_eDXyZJw=t3&NZM|GWrlsoP3cdDkrwA7EyyM=({teht*H4h34iR&q0gd#0JOQ z?cZKK_MA;k(*r+i&h{kRASKYj3VeErE&9@(t^8I^RT_IV2JYs?BihpVk*){&xwUZu zt+9JSN1&Yl9JmAY9HmKyYc??p)~95Y2S4PJQse`DgWRU@ele#GHyckM4D>Oz>G}goqwuRrkCq-QKa5q4dFfH`<(j!p zXv0utKNXvjnWvN8PX%7`uixAw_f;ObqTpTT9AZhbDvOC#@CIj@CN6H3}iS1bsGFZS$0iCHx&rnkW?c_GLyvZa1b5v zB_g_Psr0Z42Xr0QgidTwbx7|!ksHeuzegVa456PPawHmQT@QbKXn zeqz>40;ajanG&qzLN^f2Na~=iq38BeC#-lM_4Lu|mFsH!ANVCH2d1znxK$l3Cv3($ zWP4=XEh?$Oekuq@oXQ!*J74tflop>pRQ4!#fQ=MNMfJz#R_L_?8XMk7xh;|&b+(TR zxHhCI^baEHV{$tzRkJ(9;xh2HBQakOlumcLBvtAUuynPtGJ08&Uy@9$taVf+bqEzA!Ox0l z5TjkKKfpz}Vj2?RQMZqvHZj}o=&BTZ!7fZe zi$kJH@ZM=uKu|JbXrTk1@go>Qt*#Twei?LCryU>(f7XHaiP)L4K6}HkL;h*pClggl z|DyHQ>gBJbbd?HCAY=nFeII!%*-S8YD}&Ba?K{|j!HVN4W|3Jp&B$N0a`wJ0oprvq zfkn~Z<;~eg!`daev8MuM-90BwZd6xa;EY z9lk+EeCY|8nJfw375Q{NlR6Y5<_0CP`j6(~q8ZDLq!L$ z>U5jH1!3jd-wKYQU5Cmmu~YFl-Ts%{`ox6?cpN)!K))^Ya%1<@%*{GI2={hxp;$W> z_CdoOWwB~+I6=#gAXv$rp&0uf5=yJ6PlAb~@wV>6sTuX0S6sT4%79j(LWT?Dkz+IZ z_+B~{K>djcr(q}d9=74CSZ9~dlBH9lf2PXMdFI^TFvcO9h~cnhv$M_W=Pa6Hfje$355MCUYH$4DLdz8e?3C2g zpebE>coQY_{Rk)b*(nU)?Uqv0&&iC3iDz0C_X zxC{73XaunD+v*!hh0{Xl2weGy=YqF9gfldz1{%eVCL!ax>;OdK^gWRqXA%Ty=?l6*HJ6BgZXN z8$Cb|ZOn&l$cC|iDZy7XpYP`rp^Xw_3+0myJ}*YJMv^S&^ScRnjQ8aYk?kkXr=(^M z|B~FwnEU`dn}Dwo;H^-BYdjad>sizoXLNx{O@@Du)+B!;$$}s%JiYf5NqL}3(#t8V z=yxf80?qCRVO2I`u|o^R3*M?0CuC-Bqehn+N6d@V0q{Ld8BHB*bVw`FI+1jQprU&d z;JlM06v7j9edytqjEJjbyT!Ns$yTsOw9c_p&MP1ebkpGOb5rn-b!?fHSbI zOuK6J2S%gUInv|kF5udrA*^qkfP~+K`8C><@quG=!=f;ep}L%!ydE~PStlcLF@wW9 zr#_=%QNk*p@WpIox<|vK^>qGBxJH&Dot-{k_w+!ppkgJj2Q416toAv#Xwfz0H}D=T zXG&%r&V6AkX$%MyGq?7IYiu{SYC)6tRkKuWkprly6=mPgzcXkX&f+g7wKAgf$#~0a z$y=W;rg!{~tE6Jik7}WGV|DvJ>BXX;)UD&`5t7B2IW|Zen}ZIKeocd?;Cap^tr<&( zGZM|4h0c^xq?DbtXf4sAu9ZGRCl$&lzqo}iNRz?APJ0HfmdGJS3;c!X6=fxc89%7ZD_^fNOd-23b>dG_O!{s%iX<;h&jWB?;ryB zn%$41s@$YPcJ?A%GGPsq30tP>k}SodY~6nf+v#N3BwVHE{Kxg(l`)}xJjql2$=GZ2 zy1i-hhj~Lk8lEG0X^Uc;Njnuoe9aR*uRdvveN@MrC+ZvF-MmKj>{)ek!O@pfZem~O zPWv==4brt9y*d0Jw-lk=$zH8m=hA>vf4(we)~=bS3CWUGc}8f+ryd68A - ` - - - M - -`.trim() - -async function main() { - await mkdir(outDir, { recursive: true }) - - for (const size of [192, 512]) { - const svg = Buffer.from(svgTemplate(size)) - const png = await sharp(svg).png().toBuffer() - const path = join(outDir, `icon-${size}x${size}.png`) - await writeFile(path, png) - console.log(`Wrote ${path}`) - } -} - -main().catch((err) => { - console.error(err) - process.exit(1) -}) From 085e40ad14f46701d2321d4b8cce0e64dfeb41a3 Mon Sep 17 00:00:00 2001 From: Rachelle Date: Tue, 17 Mar 2026 12:28:56 +1100 Subject: [PATCH 3/3] remove --- pnpm-lock.yaml | 259 +------------------------------------------- pnpm-workspace.yaml | 1 - 2 files changed, 2 insertions(+), 258 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9233985..f4f457a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -90,15 +90,9 @@ importers: prettier-plugin-tailwindcss: specifier: ^0.6.9 version: 0.6.14(prettier@3.8.1) - sharp: - specifier: ^0.33.5 - version: 0.33.5 tailwindcss: specifier: ^3.4.16 version: 3.4.19(tsx@4.21.0)(yaml@2.8.2) - tsx: - specifier: ^4.21.0 - version: 4.21.0 typescript: specifier: ~5.6.3 version: 5.6.3 @@ -317,68 +311,34 @@ packages: resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.33.5': - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - 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} - 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] - 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] - 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] - 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] - os: [linux] - libc: [glibc] - '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] @@ -397,61 +357,30 @@ packages: os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} - cpu: [s390x] - 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] - 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] - 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] - 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} - cpu: [arm64] - 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} @@ -459,13 +388,6 @@ packages: 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} - cpu: [arm] - 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} @@ -487,13 +409,6 @@ packages: 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} - cpu: [s390x] - 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} @@ -501,13 +416,6 @@ packages: 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} - cpu: [x64] - 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} @@ -515,13 +423,6 @@ packages: 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} - cpu: [arm64] - 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} @@ -529,13 +430,6 @@ packages: 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} - cpu: [x64] - 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} @@ -543,11 +437,6 @@ packages: 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} - cpu: [wasm32] - '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -559,24 +448,12 @@ packages: 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} - 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} - 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} @@ -1146,13 +1023,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -1719,9 +1589,6 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} - is-arrayish@0.3.4: - resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} - is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -2603,10 +2470,6 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} - 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} @@ -2645,9 +2508,6 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - simple-swizzle@0.2.4: - resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} - slice-ansi@7.1.2: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} @@ -3101,47 +2961,25 @@ snapshots: '@img/colour@1.0.0': optional: true - '@img/sharp-darwin-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 - 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 - 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.4': optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': - 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.4': optional: true - '@img/sharp-libvips-linux-arm@1.0.5': - optional: true - '@img/sharp-libvips-linux-arm@1.2.4': optional: true @@ -3151,45 +2989,23 @@ snapshots: '@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.4': optional: true - '@img/sharp-libvips-linux-x64@1.0.4': - 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.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - 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 - 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 - optional: true - '@img/sharp-linux-arm@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.2.4 @@ -3205,51 +3021,26 @@ snapshots: '@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 - 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 - 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 - 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 - 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.8.1 - optional: true - '@img/sharp-wasm32@0.34.5': dependencies: '@emnapi/runtime': 1.8.1 @@ -3258,15 +3049,9 @@ snapshots: '@img/sharp-win32-arm64@0.34.5': optional: true - '@img/sharp-win32-ia32@0.33.5': - 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.5': optional: true @@ -3842,16 +3627,6 @@ snapshots: color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.4 - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - colorette@2.0.20: {} comma-separated-tokens@2.0.3: {} @@ -4105,6 +3880,7 @@ snapshots: '@esbuild/win32-arm64': 0.27.4 '@esbuild/win32-ia32': 0.27.4 '@esbuild/win32-x64': 0.27.4 + optional: true escalade@3.2.0: {} @@ -4623,8 +4399,6 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-arrayish@0.3.4: {} - is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -5788,32 +5562,6 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 - sharp@0.33.5: - dependencies: - color: 4.2.3 - detect-libc: 2.1.2 - semver: 7.7.4 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-libvips-darwin-arm64': 1.0.4 - '@img/sharp-libvips-darwin-x64': 1.0.4 - '@img/sharp-libvips-linux-arm': 1.0.5 - '@img/sharp-libvips-linux-arm64': 1.0.4 - '@img/sharp-libvips-linux-s390x': 1.0.4 - '@img/sharp-libvips-linux-x64': 1.0.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-s390x': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-wasm32': 0.33.5 - '@img/sharp-win32-ia32': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 - sharp@0.34.5: dependencies: '@img/colour': 1.0.0 @@ -5890,10 +5638,6 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 - simple-swizzle@0.2.4: - dependencies: - is-arrayish: 0.3.4 - slice-ansi@7.1.2: dependencies: ansi-styles: 6.2.3 @@ -6118,6 +5862,7 @@ snapshots: get-tsconfig: 4.13.6 optionalDependencies: fsevents: 2.3.3 + optional: true tunnel-agent@0.6.0: dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f8df534..e313dbd 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,3 @@ onlyBuiltDependencies: - canvas - - sharp - unrs-resolver