diff --git a/ROADMAP.md b/ROADMAP.md
index 70859ae..d5c91e6 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -30,7 +30,7 @@ rectangular cards; unsupported directives and assets are omitted with a warning.
The supported syntax and fallback rules are documented in
[Interoperability](/docs/reference/interoperability/) and covered by fixtures.
-## Next: web installation and export workflows
+## Current: web installation and export workflows
### Clipboard interoperability
@@ -43,16 +43,15 @@ unavailable, Inkfinite downloads the PNG instead.
### PWA and offline operation
-Make the existing local-first web editor installable rather than creating a
-separate offline product.
+The web editor is installable and keeps using Inkfinite's normal local document
+repository. Its service worker caches the application shell, WebAssembly
+runtime, and required static assets. Creating, editing, reopening, and exporting
+local documents works without a network connection.
-The PWA should cache the application shell, WebAssembly runtime, and required
-static assets while continuing to use Inkfinite's normal local document
-repository. Creating, editing, reopening, and exporting local documents should
-continue to work without a network connection.
-
-Application updates must be explicit enough that cached application code does
-not become an invisible second deployment state.
+The app requests persistent browser storage when the platform supports it. A
+waiting service worker shows an update prompt and activates only when the user
+chooses to reload, so cached application code does not become an invisible
+second deployment state.
## Distribution
diff --git a/TODO.md b/TODO.md
index 75b3676..4088589 100644
--- a/TODO.md
+++ b/TODO.md
@@ -39,17 +39,17 @@
## PWA and offline web app
-- [ ] Add a web app manifest with name, icons, start URL, display mode, and
+- [x] Add a web app manifest with name, icons, start URL, display mode, and
light/dark theme metadata
-- [ ] Add installable application icons at the required sizes
-- [ ] Add a service worker for the application shell and versioned static assets
-- [ ] Cache the WASM runtime and other editor-critical assets for offline startup
-- [ ] Keep documents in the existing local persistence layer rather than
+- [x] Add installable application icons at the required sizes
+- [x] Add a service worker for the application shell and versioned static assets
+- [x] Cache the WASM runtime and other editor-critical assets for offline startup
+- [x] Keep documents in the existing local persistence layer rather than
introducing a second PWA-specific store
-- [ ] Verify create, edit, save, close, reopen, and export while offline
-- [ ] Define service-worker update behavior so stale application code cannot
+- [x] Verify create, edit, save, close, reopen, and export while offline
+- [x] Define service-worker update behavior so stale application code cannot
silently remain active indefinitely
-- [ ] Add Playwright coverage for first load, installation eligibility, cached
+- [x] Add Playwright coverage for first load, installation eligibility, cached
reload, offline reload, and application updates
## Release and distribution
diff --git a/apps/web/e2e/pwa.spec.ts b/apps/web/e2e/pwa.spec.ts
new file mode 100644
index 0000000..dd03a27
--- /dev/null
+++ b/apps/web/e2e/pwa.spec.ts
@@ -0,0 +1,81 @@
+import { expect, test } from './fixtures/editor';
+
+test.describe.configure({ mode: 'serial' });
+
+test('installs the app shell and requests persistent storage', async ({ page }) => {
+ await page.addInitScript(() => {
+ Object.defineProperty(StorageManager.prototype, 'persist', {
+ configurable: true,
+ value: async () => {
+ Reflect.set(globalThis, '__inkfinitePersistRequested', true);
+ return true;
+ }
+ });
+ });
+
+ await page.goto('/app');
+ await expect(page.getByRole('button', { name: 'Shapes', exact: true })).toBeVisible();
+
+ const manifest = await page.locator('link[rel="manifest"]').getAttribute('href');
+ expect(manifest).toBe('/manifest.webmanifest');
+ const manifestResponse = await page.request.get('/manifest.webmanifest');
+ expect(manifestResponse.ok()).toBe(true);
+ expect((await manifestResponse.json()).icons).toEqual(
+ expect.arrayContaining([
+ expect.objectContaining({ sizes: '192x192' }),
+ expect.objectContaining({ sizes: '512x512' })
+ ])
+ );
+
+ await page.evaluate(() => navigator.serviceWorker.ready);
+ await page.reload();
+ expect(await page.evaluate(() => Boolean(navigator.serviceWorker.controller))).toBe(true);
+ expect(await page.evaluate(() => Reflect.get(globalThis, '__inkfinitePersistRequested'))).toBe(
+ true
+ );
+});
+
+test('creates, reopens, and exports a board while offline', async ({ editor, page, context }) => {
+ await editor.open();
+ await page.evaluate(() => navigator.serviceWorker.ready);
+ await page.reload();
+ await expect(page.getByRole('button', { name: 'Shapes', exact: true })).toBeVisible();
+
+ await editor.createSelectedRectangle();
+ await context.setOffline(true);
+ await page.reload({ waitUntil: 'domcontentloaded' });
+ await expect(page.getByRole('button', { name: 'Shapes', exact: true })).toBeVisible();
+
+ await editor.createSelectedRectangle({ x: 540, y: 520 }, { x: 700, y: 630 });
+ const downloadPromise = page.waitForEvent('download');
+ await page.getByRole('button', { name: 'Export drawing' }).click();
+ await page.getByRole('menuitem', { name: 'Export all shapes as SVG' }).click();
+ const download = await downloadPromise;
+ expect(download.suggestedFilename()).toMatch(/\.svg$/);
+
+ await page.reload({ waitUntil: 'domcontentloaded' });
+ await expect(page.getByRole('button', { name: 'Shapes', exact: true })).toBeVisible();
+ await context.setOffline(false);
+});
+
+test('offers an explicit reload when a service worker update is waiting', async ({ page }) => {
+ await page.goto('/app');
+ await page.evaluate(() => navigator.serviceWorker.ready);
+ await page.reload();
+ await expect(page.getByRole('button', { name: 'Shapes', exact: true })).toBeVisible();
+
+ await page.evaluate(async () => {
+ await navigator.serviceWorker.register(`/service-worker.js?update=${Date.now()}`);
+ });
+ await expect
+ .poll(() =>
+ page.evaluate(async () => Boolean((await navigator.serviceWorker.ready).waiting))
+ )
+ .toBe(true);
+
+ const reloadButton = page.getByRole('button', { name: 'Update and reload' });
+ await expect(reloadButton).toBeVisible();
+ await expect(page).toHaveScreenshot('update-notice.png');
+ await Promise.all([page.waitForEvent('framenavigated'), reloadButton.click()]);
+ await expect(page.getByRole('button', { name: 'Shapes', exact: true })).toBeVisible();
+});
diff --git a/apps/web/package.json b/apps/web/package.json
index 1e910ad..2311f78 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -5,11 +5,13 @@
"type": "module",
"scripts": {
"prebuild": "pnpm --filter @inkfinite/wasm build",
+ "pwa:assets": "pwa-assets-generator --config pwa-assets.config.ts",
"dev": "pnpm pagefind:dev && vite dev",
"dev:plain": "vite dev",
"pagefind:dev": "vite build && pagefind --site build --output-path static/pagefind --quiet",
"build": "vite build && pagefind --site build --output-subdir pagefind",
"preview": "vite preview",
+ "deploy": "wrangler pages deploy",
"prepare": "svelte-kit sync || echo ''",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
@@ -17,6 +19,7 @@
"test:unit": "vitest",
"test": "pnpm run test:unit -- --run",
"test:e2e": "playwright test",
+ "test:pwa": "pnpm build && playwright test --config playwright.pwa.config.ts",
"test:e2e:headed": "playwright test --headed",
"test:e2e:ui": "playwright test --ui",
"test:visual": "playwright test --grep @visual",
@@ -40,6 +43,7 @@
"@sveltejs/kit": "^2.49.1",
"@sveltejs/vite-plugin-svelte": "^6.2.1",
"@types/node": "^24",
+ "@vite-pwa/assets-generator": "^1.0.2",
"@vitest/browser-playwright": "^4.0.15",
"eslint": "^9.39.1",
"eslint-config-prettier": "^10.1.8",
@@ -59,6 +63,7 @@
"vite": "^7.2.6",
"vite-plugin-devtools-json": "^1.0.0",
"vitest": "^4.0.15",
- "vitest-browser-svelte": "^2.0.1"
+ "vitest-browser-svelte": "^2.0.1",
+ "wrangler": "^4.125.0"
}
}
diff --git a/apps/web/playwright.config.ts b/apps/web/playwright.config.ts
index 7a03b91..9413b62 100644
--- a/apps/web/playwright.config.ts
+++ b/apps/web/playwright.config.ts
@@ -2,6 +2,7 @@ import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: './e2e',
+ testIgnore: 'pwa.spec.ts',
fullyParallel: false,
workers: 1,
forbidOnly: Boolean(process.env.CI),
diff --git a/apps/web/playwright.pwa.config.ts b/apps/web/playwright.pwa.config.ts
new file mode 100644
index 0000000..d6e5c0a
--- /dev/null
+++ b/apps/web/playwright.pwa.config.ts
@@ -0,0 +1,23 @@
+import { defineConfig, devices } from '@playwright/test';
+
+export default defineConfig({
+ testDir: './e2e',
+ testMatch: 'pwa.spec.ts',
+ fullyParallel: false,
+ workers: 1,
+ reporter: 'list',
+ snapshotPathTemplate: '{testDir}/{testFilePath}-snapshots/{arg}-{projectName}{ext}',
+ expect: { toHaveScreenshot: { animations: 'disabled', caret: 'hide' } },
+ use: {
+ ...devices['Desktop Chrome'],
+ baseURL: 'http://127.0.0.1:4375',
+ channel: 'chrome',
+ trace: 'retain-on-failure'
+ },
+ projects: [{ name: 'chromium' }],
+ webServer: {
+ command: 'pnpm preview --host 127.0.0.1 --port 4375',
+ port: 4375,
+ reuseExistingServer: false
+ }
+});
diff --git a/apps/web/pwa-assets.config.ts b/apps/web/pwa-assets.config.ts
new file mode 100644
index 0000000..53bcf9d
--- /dev/null
+++ b/apps/web/pwa-assets.config.ts
@@ -0,0 +1,3 @@
+import { defineConfig, minimal2023Preset } from '@vite-pwa/assets-generator/config';
+
+export default defineConfig({ preset: minimal2023Preset, images: ['static/inkfinite-icon.svg'] });
diff --git a/apps/web/src/app.html b/apps/web/src/app.html
index 3621a4c..34be5de 100644
--- a/apps/web/src/app.html
+++ b/apps/web/src/app.html
@@ -3,6 +3,13 @@
+
+
+
+
+
+
+
diff --git a/apps/web/src/lib/PwaStatus.svelte b/apps/web/src/lib/PwaStatus.svelte
new file mode 100644
index 0000000..361c083
--- /dev/null
+++ b/apps/web/src/lib/PwaStatus.svelte
@@ -0,0 +1,127 @@
+
+
+{#if updateAvailable}
+
+ A new version of Inkfinite is ready.
+
+
+{/if}
+
+
diff --git a/apps/web/src/routes/+layout.svelte b/apps/web/src/routes/+layout.svelte
index 70d9479..554efc4 100644
--- a/apps/web/src/routes/+layout.svelte
+++ b/apps/web/src/routes/+layout.svelte
@@ -1,5 +1,5 @@
-
Inkfinite - Infinite Canvas
{@render children()}
+
diff --git a/apps/web/src/service-worker.ts b/apps/web/src/service-worker.ts
new file mode 100644
index 0000000..bc8f5a9
--- /dev/null
+++ b/apps/web/src/service-worker.ts
@@ -0,0 +1,63 @@
+///
+///
+///
+///
+
+import { build, files, prerendered, version } from '$service-worker';
+
+const worker = self as unknown as ServiceWorkerGlobalScope;
+const cacheName = `inkfinite-${version}`;
+const precache = [...new Set([...build, ...files, ...prerendered])];
+
+worker.addEventListener('install', (event) => {
+ event.waitUntil(caches.open(cacheName).then((cache) => cache.addAll(precache)));
+});
+
+worker.addEventListener('activate', (event) => {
+ event.waitUntil(
+ (async () => {
+ const oldCaches = (await caches.keys()).filter(
+ (name) => name.startsWith('inkfinite-') && name !== cacheName
+ );
+ await Promise.all(oldCaches.map((name) => caches.delete(name)));
+ await worker.clients.claim();
+ })()
+ );
+});
+
+worker.addEventListener('message', (event) => {
+ if (event.data?.type === 'SKIP_WAITING') void worker.skipWaiting();
+});
+
+worker.addEventListener('fetch', (event) => {
+ if (event.request.method !== 'GET') return;
+
+ const url = new URL(event.request.url);
+ if (url.origin !== worker.location.origin) return;
+
+ event.respondWith(
+ (async () => {
+ const cache = await caches.open(cacheName);
+ if (precache.includes(url.pathname)) {
+ const cached = await cache.match(url.pathname);
+ if (cached) return cached;
+ }
+
+ try {
+ const response = await fetch(event.request);
+ if (response.ok) await cache.put(event.request, response.clone());
+ return response;
+ } catch (error) {
+ const cached = await cache.match(event.request);
+ if (cached) return cached;
+
+ if (event.request.mode === 'navigate') {
+ const appShell = await cache.match('/app');
+ if (appShell) return appShell;
+ }
+
+ throw error;
+ }
+ })()
+ );
+});
diff --git a/apps/web/static/apple-touch-icon-180x180.png b/apps/web/static/apple-touch-icon-180x180.png
new file mode 100644
index 0000000000000000000000000000000000000000..d3a198d107286e404b21daf6a1518263e967f868
GIT binary patch
literal 1080
zcmeAS@N?(olHy`uVBq!ia0y~yVAuk}9Lx+13|zwB7#J8BgaUj*T)Q&AfB*6O|NsBT
zcKll2|MUKh-|LtY5*Zj6I14-?iy0W0Uw|;<*6N^a1_tIco-U3d6}R5rxgEx=$io`&
zVa}ib`m48QJ#TaN*sOv!5$pU8C7bwhK+E&~rQf_#7
zd~->kQ5FB>gkMIXkp1094c}DlZ`_pXy|VD2$lRH`w#=Se%dNXIT3EZp{j+W9tTQ#<
zbJL9P2mbFox3c>5*^F=Qn?-v~7A)kQdwIgN*%xG*)3~E9El}gl=yMA0KbIMCI?LqP
z!i8?dGP9ye!t8ArKV`_rUr@B0^!CQbpHr$b7ESCH>iu>6^69X*Z9=i%Ez@iFyv^Ud
zV4IWj{S4E)Yh9%$%fI=(|FY!Sn2QFivnH*+b(f_}eb&xhg(gy8pUoD0)GlVeS^n0=
zH?7N--{gLqRp#`2R_%pzY2sVb)~ufO+G>I5_bJZ))1Ui)%a~iaI_>AZjQ%hdlO4f}
zW%QqAtol{4ep*ua?8Q?H8|VId9BOZ}W#ga4|8}uOO0lfH`0Mq1NyQ2_Hm=y*9=F3Y
zKK_XOS-1Ym)nhM~U6fq^-cxZ^?!}DV<@;lLHSXTZy?Dv&{();XmSM9OWoGY_S?zn#
zz%2e~yXLK1HKm$Si!$@}b?|$CQM0luzHs(g_m2%OrxinwtQL7c^XGHFAI~>8s{Wc&
z^6c2p{~gD(cS=jutBMqeh99@TAbs`_d+v=D5}Gf2+zk0Rdw>4%Dsfmmr*zUP>!9>6
z&tKh+WLWr0?^W-#+=>r6zIyF3jcW3b8qUqWE^Vg2?1J!uozlJ=eu{;h-LPxnQv-2F
ztGPFo&o}>*jM=$+LD}Cv8{w#P&uS~`m{+CUzm$2x`U&ek`~TIxKUa6!F~4d4xA%9}
z<%!A{^o!YMN}cVV$rp9ujoJKrwKCFH)?Z!2`A#gpP_*`1T>qu-2g~f=3+#SuLXA4)xU3BZ{@mcl1Pst!s|NWL4$EzpIQxI3@X1;}X`hiLK!Q>t7|MbV`@JE;HIT<3qqZeYUT8vZu`APhWj!JL7zy!tXmB
z&Nr^C_7Cl<*)CSJZqfVMUuRFAdj0oDq_`Lu7EaktG3RcSb$>=9*Y7dm
zRoiC0E{)yVesxdoE3fkYj;l-czjW^V$`jGV@nHUi1B)51Hy0i>l2*AOdN=rd70ZIH
zOO2{{d;FM^+2W0b!kEHu{;@xBOTX^v5gu!`v#%R7_*34+jFK
zHUA%r-Qn^}aT@DHJtp%vFs6L2eD~%0+XKcGW^;Y26GS^^FEQ)Z{-AhaT}8ch?5&Q~
z4z~;VSU^RCw*u^6S&YN#=~5
zZ+355Rb|O&BlyX5hk0Yj+xDjGdr!J@%=ol0m0@kA!R&iV72JE?Elp}#E-`7MIHO$&
z)0*s-L&a(xiXV2J-@G5q`kCNGe2h^OYZG!q#3m
z=-?^*U~wOl`L
z-?{R6%~FYIPyOX**UZ|iBfGjF`S`ngv#N75d;&rk=clW-pR;Oh(B!?Y7`kR+=mWL*
zFA=Th_ZYH;395@Mw!CqR^~5o+1Sa?H+;{D}t-e1lo%@~jxY2j*Wk%n<_Z4wnU-MK%
oZ`bKN^;rRaPmjx`x_xBUd~|w8>v!MH3=9kmp00i_>zopr0C2E9Q~&?~
literal 0
HcmV?d00001
diff --git a/apps/web/static/inkfinite-icon.svg b/apps/web/static/inkfinite-icon.svg
new file mode 100644
index 0000000..463618c
--- /dev/null
+++ b/apps/web/static/inkfinite-icon.svg
@@ -0,0 +1,8 @@
+
diff --git a/apps/web/static/manifest.webmanifest b/apps/web/static/manifest.webmanifest
new file mode 100644
index 0000000..b59f90f
--- /dev/null
+++ b/apps/web/static/manifest.webmanifest
@@ -0,0 +1,28 @@
+{
+ "name": "Inkfinite",
+ "short_name": "Inkfinite",
+ "description": "A local-first infinite canvas for drawing, diagramming, and vector editing.",
+ "start_url": "/app",
+ "scope": "/",
+ "display": "standalone",
+ "background_color": "#f7f8fb",
+ "theme_color": "#8a69f7",
+ "icons": [
+ {
+ "src": "/pwa-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/pwa-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ },
+ {
+ "src": "/maskable-icon-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "maskable"
+ }
+ ]
+}
diff --git a/apps/web/static/maskable-icon-512x512.png b/apps/web/static/maskable-icon-512x512.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3488350e89e094182b1f0356f8015598c1e1dab
GIT binary patch
literal 3565
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
literal 0
HcmV?d00001
diff --git a/apps/web/static/pwa-512x512.png b/apps/web/static/pwa-512x512.png
new file mode 100644
index 0000000000000000000000000000000000000000..00c047975ae7936f88b7bbe42cca4d599154e201
GIT binary patch
literal 4406
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
p-*o?xW_pAxfB)ad&7Kis`amGQ
zDlWQ=LGZ)ppNhG!H@#oBwl@BnuR;8oj%h+0X9cdE`8VmJoR~rwp@?
zJzu!Ne+h%Zq4jFdUj7R!v{}LY=3{aKs^9yys=r
zv~b;)$2}kH+_^UGWtd!Ix6SnGs|TwldnI3Z-LUzzyH>;O^2Qodp6i9uJKZjFVdQ&MBb@0GfXj5dZ)H
literal 0
HcmV?d00001
diff --git a/apps/web/wrangler.jsonc b/apps/web/wrangler.jsonc
new file mode 100644
index 0000000..d24f16e
--- /dev/null
+++ b/apps/web/wrangler.jsonc
@@ -0,0 +1,6 @@
+{
+ "$schema": "./node_modules/wrangler/config-schema.json",
+ "name": "inkfinite-app",
+ "pages_build_output_dir": "./build",
+ "compatibility_date": "2026-08-25"
+}
diff --git a/packages/wasm/src/index.ts b/packages/wasm/src/index.ts
index f14a177..57e67e6 100644
--- a/packages/wasm/src/index.ts
+++ b/packages/wasm/src/index.ts
@@ -271,8 +271,9 @@ export function resetWasmModuleForTests() {
async function loadModule(): Promise {
modulePromise ??= (async () => {
const generatedUrl = new URL('../dist/inkfinite_wasm.js', import.meta.url);
+ const wasmUrl = new URL('../dist/inkfinite_wasm_bg.wasm', import.meta.url);
const generated = (await import(/* @vite-ignore */ generatedUrl.href)) as GeneratedWasmModule;
- await generated.default();
+ await generated.default(wasmUrl);
return generated;
})();
return modulePromise;
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index dd6cec5..15b7fc8 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -115,6 +115,9 @@ importers:
'@types/node':
specifier: ^24
version: 24.10.4
+ '@vite-pwa/assets-generator':
+ specifier: ^1.0.2
+ version: 1.0.2
'@vitest/browser-playwright':
specifier: ^4.0.15
version: 4.0.16(playwright@1.61.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.8.2))(vitest@4.0.16)
@@ -175,6 +178,9 @@ importers:
vitest-browser-svelte:
specifier: ^2.0.1
version: 2.0.1(svelte@5.46.0)(vitest@4.0.16)
+ wrangler:
+ specifier: ^4.125.0
+ version: 4.125.0
packages/bindings: {}
@@ -461,12 +467,62 @@ packages:
'@bomb.sh/args@0.3.1':
resolution: {integrity: sha512-CwxKrfgcorUPP6KfYD59aRdBYWBTsfsxT+GmoLVnKo5Tmyoqbpo0UNcjngRMyU+6tiPbd18RuIYxhgAn44wU/Q==}
+ '@canvas/image-data@1.1.0':
+ resolution: {integrity: sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA==}
+
'@clack/core@0.5.0':
resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==}
'@clack/prompts@0.11.0':
resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==}
+ '@cloudflare/kv-asset-handler@0.5.0':
+ resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==}
+ engines: {node: '>=22.0.0'}
+
+ '@cloudflare/unenv-preset@2.16.1':
+ resolution: {integrity: sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==}
+ peerDependencies:
+ unenv: 2.0.0-rc.24
+ workerd: '>1.20260305.0 <2.0.0-0'
+ peerDependenciesMeta:
+ workerd:
+ optional: true
+
+ '@cloudflare/workerd-darwin-64@1.20260820.1':
+ resolution: {integrity: sha512-5F2/t7SVnugG3rscSe9da1LoHst+GiuVGPaE9BP6j5AonlFpiYi0eoJrl3wof9zDBIIgJZ87NjRj9TKjbbYgHg==}
+ engines: {node: '>=16'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@cloudflare/workerd-darwin-arm64@1.20260820.1':
+ resolution: {integrity: sha512-jFnG7715+r9FXRZPpuWWe5Ayd9v/IJKDODARg56ffFJWWtte6bFNi5VY3GazBM04hEmxny6OjXQBh3j2E/wNZw==}
+ engines: {node: '>=16'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@cloudflare/workerd-linux-64@1.20260820.1':
+ resolution: {integrity: sha512-TbTYaCBht0OaOWmnVpg43hXVYtIti/Kg6lvO819H2DwbxPpK1BH0z2C+Y7ySrVJLlxZQeic5eN7/noqbP80hJg==}
+ engines: {node: '>=16'}
+ cpu: [x64]
+ os: [linux]
+
+ '@cloudflare/workerd-linux-arm64@1.20260820.1':
+ resolution: {integrity: sha512-FQmri1UF7hBnnpeyC5SZJCAnsSRs3+Ykn9wlO5zxmE2qIgKfbJZ+toJ6qrQyugWlxE65juT33HU6aYLtutLJHw==}
+ engines: {node: '>=16'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@cloudflare/workerd-windows-64@1.20260820.1':
+ resolution: {integrity: sha512-BPvCuMxIQfA47wtYsGbBG6Bcar57Qs7yHqU2jWkT1+sRnL/741/ZbQGP9kVRMQ5fwBMuqNFmQRzAu8gSm7ri/w==}
+ engines: {node: '>=16'}
+ cpu: [x64]
+ os: [win32]
+
+ '@cspotcode/source-map-support@0.8.1':
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
+
'@csstools/color-helpers@5.1.0':
resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==}
engines: {node: '>=18'}
@@ -542,6 +598,12 @@ packages:
cpu: [ppc64]
os: [aix]
+ '@esbuild/aix-ppc64@0.28.1':
+ resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
'@esbuild/aix-ppc64@0.28.2':
resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==}
engines: {node: '>=18'}
@@ -554,6 +616,12 @@ packages:
cpu: [arm64]
os: [android]
+ '@esbuild/android-arm64@0.28.1':
+ resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
'@esbuild/android-arm64@0.28.2':
resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==}
engines: {node: '>=18'}
@@ -566,6 +634,12 @@ packages:
cpu: [arm]
os: [android]
+ '@esbuild/android-arm@0.28.1':
+ resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
'@esbuild/android-arm@0.28.2':
resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==}
engines: {node: '>=18'}
@@ -578,6 +652,12 @@ packages:
cpu: [x64]
os: [android]
+ '@esbuild/android-x64@0.28.1':
+ resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
'@esbuild/android-x64@0.28.2':
resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==}
engines: {node: '>=18'}
@@ -590,6 +670,12 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@esbuild/darwin-arm64@0.28.1':
+ resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
'@esbuild/darwin-arm64@0.28.2':
resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==}
engines: {node: '>=18'}
@@ -602,6 +688,12 @@ packages:
cpu: [x64]
os: [darwin]
+ '@esbuild/darwin-x64@0.28.1':
+ resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
'@esbuild/darwin-x64@0.28.2':
resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==}
engines: {node: '>=18'}
@@ -614,6 +706,12 @@ packages:
cpu: [arm64]
os: [freebsd]
+ '@esbuild/freebsd-arm64@0.28.1':
+ resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
'@esbuild/freebsd-arm64@0.28.2':
resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==}
engines: {node: '>=18'}
@@ -626,6 +724,12 @@ packages:
cpu: [x64]
os: [freebsd]
+ '@esbuild/freebsd-x64@0.28.1':
+ resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
'@esbuild/freebsd-x64@0.28.2':
resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==}
engines: {node: '>=18'}
@@ -638,6 +742,12 @@ packages:
cpu: [arm64]
os: [linux]
+ '@esbuild/linux-arm64@0.28.1':
+ resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
'@esbuild/linux-arm64@0.28.2':
resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==}
engines: {node: '>=18'}
@@ -650,6 +760,12 @@ packages:
cpu: [arm]
os: [linux]
+ '@esbuild/linux-arm@0.28.1':
+ resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
'@esbuild/linux-arm@0.28.2':
resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==}
engines: {node: '>=18'}
@@ -662,6 +778,12 @@ packages:
cpu: [ia32]
os: [linux]
+ '@esbuild/linux-ia32@0.28.1':
+ resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
'@esbuild/linux-ia32@0.28.2':
resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==}
engines: {node: '>=18'}
@@ -674,6 +796,12 @@ packages:
cpu: [loong64]
os: [linux]
+ '@esbuild/linux-loong64@0.28.1':
+ resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
'@esbuild/linux-loong64@0.28.2':
resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==}
engines: {node: '>=18'}
@@ -686,6 +814,12 @@ packages:
cpu: [mips64el]
os: [linux]
+ '@esbuild/linux-mips64el@0.28.1':
+ resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
'@esbuild/linux-mips64el@0.28.2':
resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==}
engines: {node: '>=18'}
@@ -698,6 +832,12 @@ packages:
cpu: [ppc64]
os: [linux]
+ '@esbuild/linux-ppc64@0.28.1':
+ resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
'@esbuild/linux-ppc64@0.28.2':
resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==}
engines: {node: '>=18'}
@@ -710,6 +850,12 @@ packages:
cpu: [riscv64]
os: [linux]
+ '@esbuild/linux-riscv64@0.28.1':
+ resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
'@esbuild/linux-riscv64@0.28.2':
resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==}
engines: {node: '>=18'}
@@ -722,6 +868,12 @@ packages:
cpu: [s390x]
os: [linux]
+ '@esbuild/linux-s390x@0.28.1':
+ resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
'@esbuild/linux-s390x@0.28.2':
resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==}
engines: {node: '>=18'}
@@ -734,6 +886,12 @@ packages:
cpu: [x64]
os: [linux]
+ '@esbuild/linux-x64@0.28.1':
+ resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
'@esbuild/linux-x64@0.28.2':
resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==}
engines: {node: '>=18'}
@@ -746,6 +904,12 @@ packages:
cpu: [arm64]
os: [netbsd]
+ '@esbuild/netbsd-arm64@0.28.1':
+ resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
'@esbuild/netbsd-arm64@0.28.2':
resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==}
engines: {node: '>=18'}
@@ -758,6 +922,12 @@ packages:
cpu: [x64]
os: [netbsd]
+ '@esbuild/netbsd-x64@0.28.1':
+ resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
'@esbuild/netbsd-x64@0.28.2':
resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==}
engines: {node: '>=18'}
@@ -770,6 +940,12 @@ packages:
cpu: [arm64]
os: [openbsd]
+ '@esbuild/openbsd-arm64@0.28.1':
+ resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
'@esbuild/openbsd-arm64@0.28.2':
resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==}
engines: {node: '>=18'}
@@ -782,6 +958,12 @@ packages:
cpu: [x64]
os: [openbsd]
+ '@esbuild/openbsd-x64@0.28.1':
+ resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
'@esbuild/openbsd-x64@0.28.2':
resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==}
engines: {node: '>=18'}
@@ -794,6 +976,12 @@ packages:
cpu: [arm64]
os: [openharmony]
+ '@esbuild/openharmony-arm64@0.28.1':
+ resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
'@esbuild/openharmony-arm64@0.28.2':
resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==}
engines: {node: '>=18'}
@@ -806,6 +994,12 @@ packages:
cpu: [x64]
os: [sunos]
+ '@esbuild/sunos-x64@0.28.1':
+ resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
'@esbuild/sunos-x64@0.28.2':
resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==}
engines: {node: '>=18'}
@@ -818,6 +1012,12 @@ packages:
cpu: [arm64]
os: [win32]
+ '@esbuild/win32-arm64@0.28.1':
+ resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
'@esbuild/win32-arm64@0.28.2':
resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==}
engines: {node: '>=18'}
@@ -830,6 +1030,12 @@ packages:
cpu: [ia32]
os: [win32]
+ '@esbuild/win32-ia32@0.28.1':
+ resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
'@esbuild/win32-ia32@0.28.2':
resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==}
engines: {node: '>=18'}
@@ -842,6 +1048,12 @@ packages:
cpu: [x64]
os: [win32]
+ '@esbuild/win32-x64@0.28.1':
+ resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
'@esbuild/win32-x64@0.28.2':
resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==}
engines: {node: '>=18'}
@@ -959,6 +1171,285 @@ packages:
'@iconify/utils@3.1.4':
resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==}
+ '@img/colour@1.1.0':
+ resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
+ 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.35.2':
+ resolution: {integrity: sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==}
+ engines: {node: '>=20.9.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.35.2':
+ resolution: {integrity: sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==}
+ engines: {node: '>=20.9.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-freebsd-wasm32@0.35.2':
+ resolution: {integrity: sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==}
+ engines: {node: '>=20.9.0'}
+ os: [freebsd]
+
+ '@img/sharp-libvips-darwin-arm64@1.0.4':
+ resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-arm64@1.3.1':
+ resolution: {integrity: sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==}
+ 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.3.1':
+ resolution: {integrity: sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==}
+ 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.3.1':
+ resolution: {integrity: sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==}
+ 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.3.1':
+ resolution: {integrity: sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-ppc64@1.3.1':
+ resolution: {integrity: sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-riscv64@1.3.1':
+ resolution: {integrity: sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==}
+ cpu: [riscv64]
+ 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.3.1':
+ resolution: {integrity: sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==}
+ 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.3.1':
+ resolution: {integrity: sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==}
+ 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.3.1':
+ resolution: {integrity: sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==}
+ 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.3.1':
+ resolution: {integrity: sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==}
+ 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.35.2':
+ resolution: {integrity: sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==}
+ engines: {node: '>=20.9.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}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-arm@0.35.2':
+ resolution: {integrity: sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-ppc64@0.35.2':
+ resolution: {integrity: sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==}
+ engines: {node: '>=20.9.0'}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-riscv64@0.35.2':
+ resolution: {integrity: sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==}
+ engines: {node: '>=20.9.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}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-s390x@0.35.2':
+ resolution: {integrity: sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==}
+ engines: {node: '>=20.9.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}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-x64@0.35.2':
+ resolution: {integrity: sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==}
+ engines: {node: '>=20.9.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}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-linuxmusl-arm64@0.35.2':
+ resolution: {integrity: sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==}
+ engines: {node: '>=20.9.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}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-linuxmusl-x64@0.35.2':
+ resolution: {integrity: sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==}
+ engines: {node: '>=20.9.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}
+ cpu: [wasm32]
+
+ '@img/sharp-wasm32@0.35.2':
+ resolution: {integrity: sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==}
+ engines: {node: '>=20.9.0'}
+
+ '@img/sharp-webcontainers-wasm32@0.35.2':
+ resolution: {integrity: sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==}
+ engines: {node: '>=20.9.0'}
+ cpu: [wasm32]
+
+ '@img/sharp-win32-arm64@0.35.2':
+ resolution: {integrity: sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==}
+ engines: {node: '>=20.9.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}
+ cpu: [ia32]
+ os: [win32]
+
+ '@img/sharp-win32-ia32@0.35.2':
+ resolution: {integrity: sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==}
+ engines: {node: ^20.9.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.35.2':
+ resolution: {integrity: sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==}
+ engines: {node: '>=20.9.0'}
+ cpu: [x64]
+ os: [win32]
+
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
@@ -975,6 +1466,9 @@ packages:
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+ '@jridgewell/trace-mapping@0.3.9':
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+
'@mdx-js/react@3.1.1':
resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==}
peerDependencies:
@@ -1399,6 +1893,15 @@ packages:
'@polka/url@1.0.0-next.29':
resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
+ '@poppinss/colors@4.1.6':
+ resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==}
+
+ '@poppinss/dumper@0.6.5':
+ resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==}
+
+ '@poppinss/exception@1.2.3':
+ resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==}
+
'@quansync/fs@1.0.0':
resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==}
@@ -1607,6 +2110,13 @@ packages:
cpu: [x64]
os: [win32]
+ '@sindresorhus/is@7.2.0':
+ resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==}
+ engines: {node: '>=18'}
+
+ '@speed-highlight/core@1.2.24':
+ resolution: {integrity: sha512-qeW2e1l78afw8VhRPfPQ1Gjj+KU5XFQ/OFV5ti6eTa9bruO7mJyZtA4vw0ofqmA3tKCkROE9xLk3VZoeRc98nw==}
+
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
@@ -2075,6 +2585,11 @@ packages:
peerDependencies:
vite: ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0-0
+ '@vite-pwa/assets-generator@1.0.2':
+ resolution: {integrity: sha512-MCbrb508JZHqe7bUibmZj/lyojdhLRnfkmyXnkrCM2zVrjTgL89U8UEfInpKTvPeTnxsw2hmyZxnhsdNR6yhwg==}
+ engines: {node: '>=16.14.0'}
+ hasBin: true
+
'@vitest/browser-playwright@4.0.16':
resolution: {integrity: sha512-I2Fy/ANdphi1yI46d15o0M1M4M0UJrUiVKkH5oKeRZZCdPg0fw/cfTKZzv9Ge9eobtJYp4BGblMzXdXH0vcl5g==}
peerDependencies:
@@ -2217,6 +2732,9 @@ packages:
birpc@4.0.0:
resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==}
+ blake3-wasm@2.1.5:
+ resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==}
+
brace-expansion@1.1.12:
resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
@@ -2294,6 +2812,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==}
@@ -2314,6 +2839,10 @@ packages:
resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
engines: {node: '>= 0.6'}
+ cookie@1.1.1:
+ resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==}
+ engines: {node: '>=18'}
+
cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
@@ -2357,6 +2886,14 @@ packages:
decimal.js@10.6.0:
resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
+ decode-bmp@0.2.1:
+ resolution: {integrity: sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA==}
+ engines: {node: '>=8.6.0'}
+
+ decode-ico@0.4.1:
+ resolution: {integrity: sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA==}
+ engines: {node: '>=8.6'}
+
dedent-js@1.0.1:
resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==}
@@ -2393,6 +2930,10 @@ packages:
destr@2.0.5:
resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
devalue@5.6.1:
resolution: {integrity: sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==}
@@ -2433,6 +2974,9 @@ packages:
resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==}
engines: {node: '>=20.19.0'}
+ error-stack-parser-es@1.0.5:
+ resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==}
+
es-module-lexer@1.7.0:
resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
@@ -2441,6 +2985,11 @@ packages:
engines: {node: '>=18'}
hasBin: true
+ esbuild@0.28.1:
+ resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==}
+ engines: {node: '>=18'}
+ hasBin: true
+
esbuild@0.28.2:
resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==}
engines: {node: '>=18'}
@@ -2626,6 +3175,9 @@ packages:
resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
engines: {node: '>= 14'}
+ ico-endec@0.1.6:
+ resolution: {integrity: sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ==}
+
iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
@@ -2657,6 +3209,9 @@ packages:
resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
engines: {node: '>=8'}
+ is-arrayish@0.3.4:
+ resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==}
+
is-docker@3.0.0:
resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -2808,6 +3363,10 @@ packages:
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
engines: {node: '>=4'}
+ miniflare@5.20260820.0-alpha:
+ resolution: {integrity: sha512-Bv1j2kcKKNwXLWuCx+j0xGt7z318mqQkJmEN6ellM9sCESbPBDTM9ofZMbKqx47jSnoGA3CiaUkAmzGVXUa/wQ==}
+ engines: {node: '>=22.0.0'}
+
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@@ -2911,6 +3470,9 @@ packages:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
+ path-to-regexp@6.3.0:
+ resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
+
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
@@ -3134,9 +3696,25 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ semver@7.8.5:
+ resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
set-cookie-parser@2.7.2:
resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==}
+ sharp-ico@0.1.5:
+ resolution: {integrity: sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q==}
+
+ 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.35.2:
+ resolution: {integrity: sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==}
+ engines: {node: '>=20.9.0'}
+
shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'}
@@ -3148,6 +3726,9 @@ packages:
siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+ simple-swizzle@0.2.4:
+ resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==}
+
sirv@3.0.2:
resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==}
engines: {node: '>=18'}
@@ -3196,6 +3777,10 @@ packages:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
+ supports-color@10.2.2:
+ resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==}
+ engines: {node: '>=18'}
+
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -3271,6 +3856,9 @@ packages:
resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==}
hasBin: true
+ to-data-view@1.1.0:
+ resolution: {integrity: sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==}
+
totalist@3.0.1:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
@@ -3375,6 +3963,13 @@ packages:
undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+ undici@7.29.0:
+ resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==}
+ engines: {node: '>=20.18.1'}
+
+ unenv@2.0.0-rc.24:
+ resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==}
+
unist-util-is@4.1.0:
resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==}
@@ -3572,6 +4167,21 @@ packages:
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'}
+ workerd@1.20260820.1:
+ resolution: {integrity: sha512-/wk4rFNHH6IVMXFe6aPEZsT5YWpWtfKTUMt7+rFkyeGbXcGCy4yxODmJatbqYj0jmqHETdz0+m2mT+vNjXnF7w==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ wrangler@4.125.0:
+ resolution: {integrity: sha512-yFpvggu+xk1Hdm/Uxwaqa19bb7GArME4CrCS3Vov68a2TZq2MPO+wLocKbbnIC9K0oLowcdau7/ycxbbNHKCEg==}
+ engines: {node: '>=22.0.0'}
+ hasBin: true
+ peerDependencies:
+ '@cloudflare/workers-types': ^5.20260820.1
+ peerDependenciesMeta:
+ '@cloudflare/workers-types':
+ optional: true
+
ws@8.18.3:
resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
engines: {node: '>=10.0.0'}
@@ -3584,6 +4194,18 @@ packages:
utf-8-validate:
optional: true
+ ws@8.21.0:
+ resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
wsl-utils@0.1.0:
resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==}
engines: {node: '>=18'}
@@ -3608,6 +4230,12 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
+ youch-core@0.3.3:
+ resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==}
+
+ youch@4.1.0-beta.10:
+ resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==}
+
zimmerframe@1.1.4:
resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==}
@@ -3673,6 +4301,8 @@ snapshots:
'@bomb.sh/args@0.3.1': {}
+ '@canvas/image-data@1.1.0': {}
+
'@clack/core@0.5.0':
dependencies:
picocolors: 1.1.1
@@ -3684,6 +4314,33 @@ snapshots:
picocolors: 1.1.1
sisteransi: 1.0.5
+ '@cloudflare/kv-asset-handler@0.5.0': {}
+
+ '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260820.1)':
+ dependencies:
+ unenv: 2.0.0-rc.24
+ optionalDependencies:
+ workerd: 1.20260820.1
+
+ '@cloudflare/workerd-darwin-64@1.20260820.1':
+ optional: true
+
+ '@cloudflare/workerd-darwin-arm64@1.20260820.1':
+ optional: true
+
+ '@cloudflare/workerd-linux-64@1.20260820.1':
+ optional: true
+
+ '@cloudflare/workerd-linux-arm64@1.20260820.1':
+ optional: true
+
+ '@cloudflare/workerd-windows-64@1.20260820.1':
+ optional: true
+
+ '@cspotcode/source-map-support@0.8.1':
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+
'@csstools/color-helpers@5.1.0': {}
'@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
@@ -3770,156 +4427,234 @@ snapshots:
'@esbuild/aix-ppc64@0.27.2':
optional: true
+ '@esbuild/aix-ppc64@0.28.1':
+ optional: true
+
'@esbuild/aix-ppc64@0.28.2':
optional: true
'@esbuild/android-arm64@0.27.2':
optional: true
+ '@esbuild/android-arm64@0.28.1':
+ optional: true
+
'@esbuild/android-arm64@0.28.2':
optional: true
'@esbuild/android-arm@0.27.2':
optional: true
+ '@esbuild/android-arm@0.28.1':
+ optional: true
+
'@esbuild/android-arm@0.28.2':
optional: true
'@esbuild/android-x64@0.27.2':
optional: true
+ '@esbuild/android-x64@0.28.1':
+ optional: true
+
'@esbuild/android-x64@0.28.2':
optional: true
'@esbuild/darwin-arm64@0.27.2':
optional: true
+ '@esbuild/darwin-arm64@0.28.1':
+ optional: true
+
'@esbuild/darwin-arm64@0.28.2':
optional: true
'@esbuild/darwin-x64@0.27.2':
optional: true
+ '@esbuild/darwin-x64@0.28.1':
+ optional: true
+
'@esbuild/darwin-x64@0.28.2':
optional: true
'@esbuild/freebsd-arm64@0.27.2':
optional: true
+ '@esbuild/freebsd-arm64@0.28.1':
+ optional: true
+
'@esbuild/freebsd-arm64@0.28.2':
optional: true
'@esbuild/freebsd-x64@0.27.2':
optional: true
+ '@esbuild/freebsd-x64@0.28.1':
+ optional: true
+
'@esbuild/freebsd-x64@0.28.2':
optional: true
'@esbuild/linux-arm64@0.27.2':
optional: true
+ '@esbuild/linux-arm64@0.28.1':
+ optional: true
+
'@esbuild/linux-arm64@0.28.2':
optional: true
'@esbuild/linux-arm@0.27.2':
optional: true
+ '@esbuild/linux-arm@0.28.1':
+ optional: true
+
'@esbuild/linux-arm@0.28.2':
optional: true
'@esbuild/linux-ia32@0.27.2':
optional: true
+ '@esbuild/linux-ia32@0.28.1':
+ optional: true
+
'@esbuild/linux-ia32@0.28.2':
optional: true
'@esbuild/linux-loong64@0.27.2':
optional: true
+ '@esbuild/linux-loong64@0.28.1':
+ optional: true
+
'@esbuild/linux-loong64@0.28.2':
optional: true
'@esbuild/linux-mips64el@0.27.2':
optional: true
+ '@esbuild/linux-mips64el@0.28.1':
+ optional: true
+
'@esbuild/linux-mips64el@0.28.2':
optional: true
'@esbuild/linux-ppc64@0.27.2':
optional: true
+ '@esbuild/linux-ppc64@0.28.1':
+ optional: true
+
'@esbuild/linux-ppc64@0.28.2':
optional: true
'@esbuild/linux-riscv64@0.27.2':
optional: true
+ '@esbuild/linux-riscv64@0.28.1':
+ optional: true
+
'@esbuild/linux-riscv64@0.28.2':
optional: true
'@esbuild/linux-s390x@0.27.2':
optional: true
+ '@esbuild/linux-s390x@0.28.1':
+ optional: true
+
'@esbuild/linux-s390x@0.28.2':
optional: true
'@esbuild/linux-x64@0.27.2':
optional: true
+ '@esbuild/linux-x64@0.28.1':
+ optional: true
+
'@esbuild/linux-x64@0.28.2':
optional: true
'@esbuild/netbsd-arm64@0.27.2':
optional: true
+ '@esbuild/netbsd-arm64@0.28.1':
+ optional: true
+
'@esbuild/netbsd-arm64@0.28.2':
optional: true
'@esbuild/netbsd-x64@0.27.2':
optional: true
+ '@esbuild/netbsd-x64@0.28.1':
+ optional: true
+
'@esbuild/netbsd-x64@0.28.2':
optional: true
'@esbuild/openbsd-arm64@0.27.2':
optional: true
+ '@esbuild/openbsd-arm64@0.28.1':
+ optional: true
+
'@esbuild/openbsd-arm64@0.28.2':
optional: true
'@esbuild/openbsd-x64@0.27.2':
optional: true
+ '@esbuild/openbsd-x64@0.28.1':
+ optional: true
+
'@esbuild/openbsd-x64@0.28.2':
optional: true
'@esbuild/openharmony-arm64@0.27.2':
optional: true
+ '@esbuild/openharmony-arm64@0.28.1':
+ optional: true
+
'@esbuild/openharmony-arm64@0.28.2':
optional: true
'@esbuild/sunos-x64@0.27.2':
optional: true
+ '@esbuild/sunos-x64@0.28.1':
+ optional: true
+
'@esbuild/sunos-x64@0.28.2':
optional: true
'@esbuild/win32-arm64@0.27.2':
optional: true
+ '@esbuild/win32-arm64@0.28.1':
+ optional: true
+
'@esbuild/win32-arm64@0.28.2':
optional: true
'@esbuild/win32-ia32@0.27.2':
optional: true
+ '@esbuild/win32-ia32@0.28.1':
+ optional: true
+
'@esbuild/win32-ia32@0.28.2':
optional: true
'@esbuild/win32-x64@0.27.2':
optional: true
+ '@esbuild/win32-x64@0.28.1':
+ optional: true
+
'@esbuild/win32-x64@0.28.2':
optional: true
@@ -4028,6 +4763,187 @@ snapshots:
'@iconify/types': 2.0.0
import-meta-resolve: 4.2.0
+ '@img/colour@1.1.0': {}
+
+ '@img/sharp-darwin-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.0.4
+ optional: true
+
+ '@img/sharp-darwin-arm64@0.35.2':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.3.1
+ 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.35.2':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.3.1
+ optional: true
+
+ '@img/sharp-freebsd-wasm32@0.35.2':
+ dependencies:
+ '@img/sharp-wasm32': 0.35.2
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.3.1':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.3.1':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.3.1':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.0.5':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.3.1':
+ optional: true
+
+ '@img/sharp-libvips-linux-ppc64@1.3.1':
+ optional: true
+
+ '@img/sharp-libvips-linux-riscv64@1.3.1':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.3.1':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.3.1':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.3.1':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.3.1':
+ 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.35.2':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.3.1
+ 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.35.2':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.3.1
+ optional: true
+
+ '@img/sharp-linux-ppc64@0.35.2':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.3.1
+ optional: true
+
+ '@img/sharp-linux-riscv64@0.35.2':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.3.1
+ 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.35.2':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.3.1
+ 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.35.2':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.3.1
+ 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.35.2':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.1
+ 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.35.2':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.3.1
+ optional: true
+
+ '@img/sharp-wasm32@0.33.5':
+ dependencies:
+ '@emnapi/runtime': 1.11.2
+ optional: true
+
+ '@img/sharp-wasm32@0.35.2':
+ dependencies:
+ '@emnapi/runtime': 1.11.2
+ optional: true
+
+ '@img/sharp-webcontainers-wasm32@0.35.2':
+ dependencies:
+ '@img/sharp-wasm32': 0.35.2
+ optional: true
+
+ '@img/sharp-win32-arm64@0.35.2':
+ optional: true
+
+ '@img/sharp-win32-ia32@0.33.5':
+ optional: true
+
+ '@img/sharp-win32-ia32@0.35.2':
+ optional: true
+
+ '@img/sharp-win32-x64@0.33.5':
+ optional: true
+
+ '@img/sharp-win32-x64@0.35.2':
+ optional: true
+
'@jridgewell/gen-mapping@0.3.13':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
@@ -4047,6 +4963,11 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping@0.3.9':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
'@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7)':
dependencies:
'@types/mdx': 2.0.14
@@ -4303,6 +5224,18 @@ snapshots:
'@polka/url@1.0.0-next.29': {}
+ '@poppinss/colors@4.1.6':
+ dependencies:
+ kleur: 4.1.5
+
+ '@poppinss/dumper@0.6.5':
+ dependencies:
+ '@poppinss/colors': 4.1.6
+ '@sindresorhus/is': 7.2.0
+ supports-color: 10.2.2
+
+ '@poppinss/exception@1.2.3': {}
+
'@quansync/fs@1.0.0':
dependencies:
quansync: 1.0.0
@@ -4416,6 +5349,10 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.54.0':
optional: true
+ '@sindresorhus/is@7.2.0': {}
+
+ '@speed-highlight/core@1.2.24': {}
+
'@standard-schema/spec@1.1.0': {}
'@storybook/addon-a11y@10.5.2(storybook@10.5.2(@types/react@19.2.17)(prettier@3.7.4)(react@19.2.7))':
@@ -5073,6 +6010,15 @@ snapshots:
unplugin-utils: 0.3.2
vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.8.2)
+ '@vite-pwa/assets-generator@1.0.2':
+ dependencies:
+ cac: 6.7.14
+ colorette: 2.0.20
+ consola: 3.4.2
+ sharp: 0.33.5
+ sharp-ico: 0.1.5
+ unconfig: 7.5.0
+
'@vitest/browser-playwright@4.0.16(playwright@1.61.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.8.2))(vitest@4.0.16)':
dependencies:
'@vitest/browser': 4.0.16(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.8.2))(vitest@4.0.16)
@@ -5287,6 +6233,8 @@ snapshots:
birpc@4.0.0: {}
+ blake3-wasm@2.1.5: {}
+
brace-expansion@1.1.12:
dependencies:
balanced-match: 1.0.2
@@ -5378,6 +6326,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: {}
concat-map@0.0.1: {}
@@ -5390,6 +6348,8 @@ snapshots:
cookie@0.6.0: {}
+ cookie@1.1.1: {}
+
cross-spawn@7.0.6:
dependencies:
path-key: 3.1.1
@@ -5426,6 +6386,17 @@ snapshots:
decimal.js@10.6.0: {}
+ decode-bmp@0.2.1:
+ dependencies:
+ '@canvas/image-data': 1.1.0
+ to-data-view: 1.1.0
+
+ decode-ico@0.4.1:
+ dependencies:
+ '@canvas/image-data': 1.1.0
+ decode-bmp: 0.2.1
+ to-data-view: 1.1.0
+
dedent-js@1.0.1: {}
deep-eql@5.0.2: {}
@@ -5449,6 +6420,8 @@ snapshots:
destr@2.0.5: {}
+ detect-libc@2.1.2: {}
+
devalue@5.6.1: {}
dexie@4.2.1: {}
@@ -5471,6 +6444,8 @@ snapshots:
entities@8.0.0: {}
+ error-stack-parser-es@1.0.5: {}
+
es-module-lexer@1.7.0: {}
esbuild@0.27.2:
@@ -5502,6 +6477,35 @@ snapshots:
'@esbuild/win32-ia32': 0.27.2
'@esbuild/win32-x64': 0.27.2
+ esbuild@0.28.1:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.28.1
+ '@esbuild/android-arm': 0.28.1
+ '@esbuild/android-arm64': 0.28.1
+ '@esbuild/android-x64': 0.28.1
+ '@esbuild/darwin-arm64': 0.28.1
+ '@esbuild/darwin-x64': 0.28.1
+ '@esbuild/freebsd-arm64': 0.28.1
+ '@esbuild/freebsd-x64': 0.28.1
+ '@esbuild/linux-arm': 0.28.1
+ '@esbuild/linux-arm64': 0.28.1
+ '@esbuild/linux-ia32': 0.28.1
+ '@esbuild/linux-loong64': 0.28.1
+ '@esbuild/linux-mips64el': 0.28.1
+ '@esbuild/linux-ppc64': 0.28.1
+ '@esbuild/linux-riscv64': 0.28.1
+ '@esbuild/linux-s390x': 0.28.1
+ '@esbuild/linux-x64': 0.28.1
+ '@esbuild/netbsd-arm64': 0.28.1
+ '@esbuild/netbsd-x64': 0.28.1
+ '@esbuild/openbsd-arm64': 0.28.1
+ '@esbuild/openbsd-x64': 0.28.1
+ '@esbuild/openharmony-arm64': 0.28.1
+ '@esbuild/sunos-x64': 0.28.1
+ '@esbuild/win32-arm64': 0.28.1
+ '@esbuild/win32-ia32': 0.28.1
+ '@esbuild/win32-x64': 0.28.1
+
esbuild@0.28.2:
optionalDependencies:
'@esbuild/aix-ppc64': 0.28.2
@@ -5724,6 +6728,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ ico-endec@0.1.6: {}
+
iconv-lite@0.6.3:
dependencies:
safer-buffer: 2.1.2
@@ -5745,6 +6751,8 @@ snapshots:
indent-string@4.0.0: {}
+ is-arrayish@0.3.4: {}
+
is-docker@3.0.0: {}
is-extglob@2.1.1: {}
@@ -5904,6 +6912,18 @@ snapshots:
min-indent@1.0.1: {}
+ miniflare@5.20260820.0-alpha:
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ sharp: 0.35.2
+ undici: 7.29.0
+ workerd: 1.20260820.1
+ ws: 8.21.0
+ youch: 4.1.0-beta.10
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
minimatch@3.1.2:
dependencies:
brace-expansion: 1.1.12
@@ -6078,6 +7098,8 @@ snapshots:
path-key@3.1.1: {}
+ path-to-regexp@6.3.0: {}
+
pathe@2.0.3: {}
pathval@2.0.1: {}
@@ -6296,8 +7318,74 @@ snapshots:
semver@7.7.3: {}
+ semver@7.8.5: {}
+
set-cookie-parser@2.7.2: {}
+ sharp-ico@0.1.5:
+ dependencies:
+ decode-ico: 0.4.1
+ ico-endec: 0.1.6
+ sharp: 0.33.5
+
+ sharp@0.33.5:
+ dependencies:
+ color: 4.2.3
+ detect-libc: 2.1.2
+ semver: 7.7.3
+ 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.35.2:
+ dependencies:
+ '@img/colour': 1.1.0
+ detect-libc: 2.1.2
+ semver: 7.8.5
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.35.2
+ '@img/sharp-darwin-x64': 0.35.2
+ '@img/sharp-freebsd-wasm32': 0.35.2
+ '@img/sharp-libvips-darwin-arm64': 1.3.1
+ '@img/sharp-libvips-darwin-x64': 1.3.1
+ '@img/sharp-libvips-linux-arm': 1.3.1
+ '@img/sharp-libvips-linux-arm64': 1.3.1
+ '@img/sharp-libvips-linux-ppc64': 1.3.1
+ '@img/sharp-libvips-linux-riscv64': 1.3.1
+ '@img/sharp-libvips-linux-s390x': 1.3.1
+ '@img/sharp-libvips-linux-x64': 1.3.1
+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.1
+ '@img/sharp-libvips-linuxmusl-x64': 1.3.1
+ '@img/sharp-linux-arm': 0.35.2
+ '@img/sharp-linux-arm64': 0.35.2
+ '@img/sharp-linux-ppc64': 0.35.2
+ '@img/sharp-linux-riscv64': 0.35.2
+ '@img/sharp-linux-s390x': 0.35.2
+ '@img/sharp-linux-x64': 0.35.2
+ '@img/sharp-linuxmusl-arm64': 0.35.2
+ '@img/sharp-linuxmusl-x64': 0.35.2
+ '@img/sharp-webcontainers-wasm32': 0.35.2
+ '@img/sharp-win32-arm64': 0.35.2
+ '@img/sharp-win32-ia32': 0.35.2
+ '@img/sharp-win32-x64': 0.35.2
+
shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
@@ -6306,6 +7394,10 @@ snapshots:
siginfo@2.0.0: {}
+ simple-swizzle@0.2.4:
+ dependencies:
+ is-arrayish: 0.3.4
+
sirv@3.0.2:
dependencies:
'@polka/url': 1.0.0-next.29
@@ -6357,6 +7449,8 @@ snapshots:
strip-json-comments@3.1.1: {}
+ supports-color@10.2.2: {}
+
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -6441,6 +7535,8 @@ snapshots:
dependencies:
tldts-core: 7.0.19
+ to-data-view@1.1.0: {}
+
totalist@3.0.1: {}
tough-cookie@6.0.2:
@@ -6550,6 +7646,12 @@ snapshots:
undici-types@7.16.0: {}
+ undici@7.29.0: {}
+
+ unenv@2.0.0-rc.24:
+ dependencies:
+ pathe: 2.0.3
+
unist-util-is@4.1.0: {}
unist-util-stringify-position@2.0.3:
@@ -6670,7 +7772,7 @@ snapshots:
vitest-browser-svelte@2.0.1(svelte@5.46.0)(vitest@4.0.16):
dependencies:
svelte: 5.46.0
- vitest: 4.0.16(@types/node@25.0.3)(@vitest/browser-playwright@4.0.16)(jiti@2.6.1)(jsdom@27.3.0)(tsx@4.23.12)(yaml@2.8.2)
+ vitest: 4.0.16(@types/node@24.10.4)(@vitest/browser-playwright@4.0.16)(jiti@2.6.1)(jsdom@27.3.0)(tsx@4.23.12)(yaml@2.8.2)
vitest@4.0.16(@types/node@24.10.4)(@vitest/browser-playwright@4.0.16)(jiti@2.6.1)(jsdom@27.3.0)(tsx@4.23.12)(yaml@2.8.2):
dependencies:
@@ -6780,8 +7882,34 @@ snapshots:
word-wrap@1.2.5: {}
+ workerd@1.20260820.1:
+ optionalDependencies:
+ '@cloudflare/workerd-darwin-64': 1.20260820.1
+ '@cloudflare/workerd-darwin-arm64': 1.20260820.1
+ '@cloudflare/workerd-linux-64': 1.20260820.1
+ '@cloudflare/workerd-linux-arm64': 1.20260820.1
+ '@cloudflare/workerd-windows-64': 1.20260820.1
+
+ wrangler@4.125.0:
+ dependencies:
+ '@cloudflare/kv-asset-handler': 0.5.0
+ '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260820.1)
+ blake3-wasm: 2.1.5
+ esbuild: 0.28.1
+ miniflare: 5.20260820.0-alpha
+ path-to-regexp: 6.3.0
+ unenv: 2.0.0-rc.24
+ workerd: 1.20260820.1
+ optionalDependencies:
+ fsevents: 2.3.3
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
ws@8.18.3: {}
+ ws@8.21.0: {}
+
wsl-utils@0.1.0:
dependencies:
is-wsl: 3.1.1
@@ -6796,4 +7924,17 @@ snapshots:
yocto-queue@0.1.0: {}
+ youch-core@0.3.3:
+ dependencies:
+ '@poppinss/exception': 1.2.3
+ error-stack-parser-es: 1.0.5
+
+ youch@4.1.0-beta.10:
+ dependencies:
+ '@poppinss/colors': 4.1.6
+ '@poppinss/dumper': 0.6.5
+ '@speed-highlight/core': 1.2.24
+ cookie: 1.1.1
+ youch-core: 0.3.3
+
zimmerframe@1.1.4: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 747ead8..ffc0201 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,12 +1,14 @@
packages:
- - packages/*
- - apps/*
+ - packages/*
+ - apps/*
overrides:
- jsdom: 27.3.0
+ jsdom: 27.3.0
allowBuilds:
- esbuild: true
+ esbuild: true
+ sharp: true
+ workerd: true
onlyBuiltDependencies:
- - esbuild
+ - esbuild